From 95478f85c3b1ce09f677c8945b7cbeca567254e1 Mon Sep 17 00:00:00 2001 From: Willem Date: Sat, 14 Mar 2015 19:01:46 +0100 Subject: [PATCH] added test and updated readme prep next release --- README.md | 264 +++++++++++++++++++--------------- example/example-assets.json | 27 ++++ example/example.js | 84 +++-------- lib/asset-assembler-config.js | 14 +- lib/asset-assembler.js | 20 ++- lib/assets-builder-config.js | 12 +- lib/factory.js | 25 +++- test/test-asset-assembler.js | 68 ++++++++- 8 files changed, 304 insertions(+), 210 deletions(-) create mode 100644 example/example-assets.json diff --git a/README.md b/README.md index dbed0b5..8246a88 100644 --- a/README.md +++ b/README.md @@ -13,68 +13,52 @@ A Node.js library providing automatic site assets aggregation. ## Usage - // note1: www_static/[js/css]/lib is version ignored. - // note2: server routes; - // app.use('/static', express.static(path.join(__dirname,'www_static'))); - // app.use('/static/module/flot', express.static(path.join(__dirname,'node_modules/flot/dist'))); - // app.use('/static/module/bootstrap', express.static(path.join(__dirname,'node_modules/bootstrap/dist'))); - - var assets = require('node-ff-assets'); - - var assetsConfig = { - // Map from uri paths to file systems paths. - linkMapping : { - '/static/module/bootstrap/': 'node_modules/bootstrap/dist/', - '/static/module/flot/': 'node_modules/flot/', - '/static/': 'www_static/', + note: www_static/[js/css]/lib are version ignored. + +### example-assets.json + + { + "linkMapping" : { + "/static/module/bootstrap/": "node_modules/bootstrap/dist/", + "/static/module/flot/": "node_modules/flot/", + "/static/": "www_static/" }, - // Site sources in html page. - linkSourcesCss : [ - '/static/module/bootstrap/css/bootstrap.css', - ], - linkSourcesJs : [ - '/static/js/lib/jquery-2.1.3/jquery.js@http://code.jquery.com/jquery-2.1.3.js', - '/static/module/bootstrap/js/bootstrap.js', - '/static/module/flot/jquery.flot.js', - '/static/module/flot/jquery.flot.resize.js', - '/static/module/flot/jquery.flot.pie.js', - '/static/js/lib/angularjs-1.4.0-b4/angular.js@https://code.angularjs.org/1.4.0-beta.4/angular.js', - '/static/js/lib/angularjs-1.4.0-b4/angular-route.js@https://code.angularjs.org/1.4.0-beta.4/angular-route.js', - '/static/js/lib/angularjs-1.4.0-b4/angular-resource.js@https://code.angularjs.org/1.4.0-beta.4/angular-resource.js', - '/static/js/lib/angularjs-1.4.0-b4/angular-touch.js@https://code.angularjs.org/1.4.0-beta.4/angular-touch.js', - ], - }; - - // callback helper to return an assembler config per asset type - function createBuildConfig(type) { - return function(callback) { - // Override rendered result from command line - var singleResult = 'false' != process.env.DEV_ASSETS_SINGLE_RESULT; - if (type == 'css') { - callback(null,{ - linkMapping: assetsConfig.linkMapping, - linkTargetSingleResult: singleResult, - linkTarget: '/static/css/lib/assets.css', - linkSources: assetsConfig.linkSourcesCss, - assetType: type, - }); - } else { - callback(null, { - linkTargetSingleResult: singleResult, - linkMapping: assetsConfig.linkMapping, - linkTarget: '/static/js/lib/assets.js', - linkSources: assetsConfig.linkSourcesJs, - assetType: type, - }); - } + "css": { + "linkTarget": "/static/css/lib/assets.css", + "linkSources": [ + "/static/module/bootstrap/css/bootstrap.css" + ] + }, + "js": { + "linkTarget": "/static/js/lib/assets.js", + "linkSources": [ + "/static/js/lib/jquery-2.1.3/jquery.js@http://code.jquery.com/jquery-2.1.3.js", + "/static/module/bootstrap/js/bootstrap.js", + "/static/module/flot/jquery.flot.js", + "/static/module/flot/jquery.flot.resize.js", + "/static/module/flot/jquery.flot.pie.js", + "/static/js/lib/angularjs-1.4.0-b4/angular.js@https://code.angularjs.org/1.4.0-beta.4/angular.js", + "/static/js/lib/angularjs-1.4.0-b4/angular-route.js@https://code.angularjs.org/1.4.0-beta.4/angular-route.js", + "/static/js/lib/angularjs-1.4.0-b4/angular-resource.js@https://code.angularjs.org/1.4.0-beta.4/angular-resource.js", + "/static/js/lib/angularjs-1.4.0-b4/angular-touch.js@https://code.angularjs.org/1.4.0-beta.4/angular-touch.js" + ] } } + +### example.js + + var express = require('express'); + var async = require('async'); + var path = require('path'); + var assets = require('../lib/node-ff-assets'); function buildAssets(server,callbackDone) { + var singleResult = 'false' !== process.env.DEV_ASSETS_SINGLE_RESULT; + var assetsConfig = require('./example-assets.json'); assets.build({ assets: { js: { - configCreate: createBuildConfig('js'), + configCreate: assets.factory.builder.configCreate.fromJSON(assetsConfig,'js'), configFill: function (config, callback) { async.series([ assets.factory.lib.async.pushLinkSources(config, '/static/js/', 'www_static/js/'), @@ -83,37 +67,107 @@ A Node.js library providing automatic site assets aggregation. }, }, css: { - configCreate: createBuildConfig('css'), + configCreate: assets.factory.builder.configCreate.fromJSON(assetsConfig,'css'), configFill: function (config, callback) { async.series([ - assets.factory.lib.async.pushLinkSources(config, '/static/css/', 'www_static/css/'), + assets.factory.lib.async.pushLinkSources(config, '/static/css/', 'www_static/css/'), ],callback); - - }, - assemblerCreate: function (assemblerConfig, callback) { - callback(null,new assets.AssetAssembler(assemblerConfig,assets.factory.assembler.constructor.readFileMinify())); }, }, }, + assemblerCreate: assets.factory.builder.assemblerCreate.readFileRegex(), assemblerFill: function (assembler, callback) { var serverResultKey = 'ff_assets_'+assembler.config.assetType; assembler.on ('log', assets.factory.assembler.event.log.console(assembler.config.assetType)); assembler.on ('result', assets.factory.assembler.event.result.objectSet(server,serverResultKey)); + assembler.config.linkTargetSingleResult = singleResult; callback(); }, },callbackDone); } - exports.build = function(server) { - buildAssets(server,function(err) { - if (err) { - throw err; + function renderTemplatePath(viewPath) { + return function (req, res) { + res.locals.query = req.query; + var qi = req.url.indexOf('?'); + if (qi === -1) { + qi = req.url.length; } - console.log('Server init done.'); - // init other stuff... - }); + res.render(viewPath + req.url.substring(req.route.path.length-1, qi)); + }; } + function renderPage(server) { + return function (req, res) { + res.render('index', { + pageTitle: 'node-ff-assets example', + pageKeywords: 'node,ff,assets,example,ui', + pageCssFiles: server.get('ff_assets_css'), + pageJsFiles: server.get('ff_assets_js'), + }); + }; + } + + function sendRedirect() { + return function (req, res) { + res.redirect('/example-ui'); + }; + } + + + var server = express(); + buildAssets(server,function(err) { + if (err) { + throw err; + } + console.info('Server assets done.'); + + server.set('view engine', 'ejs'); + server.set('views', path.join(__dirname,'www_views')); + server.use('/static', express.static(path.join(__dirname,'www_static'))); + server.use('/static/module/bootstrap', express.static(path.join(__dirname,'node_modules/bootstrap/dist'))); + server.use('/static/module/flot', express.static(path.join(__dirname,'node_modules/flot'))); + + server.get('/', sendRedirect()); + server.get('/example-ui/thtml/*', renderTemplatePath('thtml/')); + server.get('/example-ui', renderPage(server)); + server.get('/example-ui/*', renderPage(server)); // must be last; for HTML5 history + console.info('Server config done.'); + + server.listen(8080); + console.info('Server started on port 8080'); + }); + + module.exports = { + version: 'example' + }; + +### index.ejs + + + + + <%= pageTitle %> + + + + + <% if (pageCssFiles.length) { %><% pageCssFiles.forEach(function (cssFile) { %><% }) %><% } %> + + +
+
+
+
+
+
+
+
+
+ <% if (pageJsFiles.length) { %><% pageJsFiles.forEach(function (jsFile) { %><% }) %><% } %> + + + ## Config options @@ -133,16 +187,16 @@ A Node.js library providing automatic site assets aggregation. assets: { js: { - configCreate: null, - configFill: null, + configCreate: null, + configFill: null, assemblerCreate: null, - assemblerFill: null, + assemblerFill: null, }, css: { - configCreate: null, - configFill: null, + configCreate: null, + configFill: null, assemblerCreate: null, - assemblerFill: null, + assemblerFill: null, }, }, }; @@ -165,14 +219,14 @@ A Node.js library providing automatic site assets aggregation. }, linkTargetSingleResult: true, - linkTarget: null, - linkSources: [], - linkMapping: [], + linkTarget: null, + linkSources: [], + linkMapping: [], - assetType: null, - assetHeader: '\n/* '+name+': begin */\n\n', - assetFooter: '\n/* '+name+': end */\n\n', - assetSeperator: '\n/* '+name+': next */\n', + assetType: null, + assetHeader: '/* '+name+': Auto generated. */\n', + assetFooter: '/* '+name+': end */\n', + assetSeperator: '\n/* '+name+': <%= file %> */\n\n', }; ### Assembler Download Force @@ -182,7 +236,7 @@ A Node.js library providing automatic site assets aggregation. linkSources: ['/static/js/lib/dynamic-generated.js@@http://localhost:8080/example-ui/include-js/generateModels']; - note: if using localhost to download use the downloadStartDelay option so server is really up. + note: if using localhost to download use the downloadStartDelay option and start server before building. The downloadForce option will redownload all resources of asset group. @@ -255,6 +309,10 @@ A Node.js library providing automatic site assets aggregation. // Same as default, plain inclusion of content. var assetAssemblerB = new assets.AssetAssembler(assemblerConfig,assets.factory.assembler.constructor.readFile()); + // Filter content based on regexes + var assetAssemblerF = new assets.AssetAssembler(assemblerConfig,assets.factory.assembler.constructor.readFileRegex()); + var assetAssemblerH = new assets.AssetAssembler(assemblerConfig,assets.factory.assembler.constructor.readFileRegex(regexData)); + // Minify content, with optional Minify config options. var assetAssemblerC = new assets.AssetAssembler(assemblerConfig,assets.factory.assembler.constructor.readFileMinify()); var assetAssemblerD = new assets.AssetAssembler(assemblerConfig,assets.factory.assembler.constructor.readFileMinify(minifyOptions)); @@ -285,44 +343,6 @@ A Node.js library providing automatic site assets aggregation. //done }); -## Rendering - - In these examples I use the server (app/express) object to store the results in for displaying. - Which the index page renderer will get and inject in page context. - - function renderIndex(app) { - return function (req, res, next) { - res.render('index', { - includeCssFiles: server.get('ff_assets_css'), - includeJsFiles: server.get('ff_assets_js'), - }); - } - }; - app.get('/',renderIndex(app)); - - // Template - index.jade - doctype html - html(lang='en',ng-app='ffUI') - head - base(href='/ui') - title='Index' - meta(charset='UTF-8') - meta(http-equiv='X-UA-Compatible' content='IE=edge') - meta(name='viewport' content='width=device-width, initial-scale=1') - meta(name='keywords' content='keywords') - each cssFile in includeCssFiles - link(rel='stylesheet' href='#{cssFile}') - body - div(id='wrapper') - div(ng-include='\'/ui/include/html/layout/header\'') - div(id='page-wrapper') - div(id='container-fluid') - div(ng-view) - div(ng-include='\'/ui/include/html/layout/footer\'') - each jsFile in includeJsFiles - script(src='#{jsFile}') - ## Example log output // Result First run @@ -425,6 +445,12 @@ Add unit tests for any new or changed functionality. Lint and test your code. ## Release History +### 0.2.3 +* Added json config reader. +* Added readFileRegex data filter. +* Added filename template to seperator. +* Converted example to ejs. + ### 0.2.2 * Fixed error to callback * Fixed 404 error diff --git a/example/example-assets.json b/example/example-assets.json new file mode 100644 index 0000000..e4d3138 --- /dev/null +++ b/example/example-assets.json @@ -0,0 +1,27 @@ +{ + "linkMapping" : { + "/static/module/bootstrap/": "node_modules/bootstrap/dist/", + "/static/module/flot/": "node_modules/flot/", + "/static/": "www_static/" + }, + "css": { + "linkTarget": "/static/css/lib/assets.css", + "linkSources": [ + "/static/module/bootstrap/css/bootstrap.css" + ] + }, + "js": { + "linkTarget": "/static/js/lib/assets.js", + "linkSources": [ + "/static/js/lib/jquery-2.1.3/jquery.js@http://code.jquery.com/jquery-2.1.3.js", + "/static/module/bootstrap/js/bootstrap.js", + "/static/module/flot/jquery.flot.js", + "/static/module/flot/jquery.flot.resize.js", + "/static/module/flot/jquery.flot.pie.js", + "/static/js/lib/angularjs-1.4.0-b4/angular.js@https://code.angularjs.org/1.4.0-beta.4/angular.js", + "/static/js/lib/angularjs-1.4.0-b4/angular-route.js@https://code.angularjs.org/1.4.0-beta.4/angular-route.js", + "/static/js/lib/angularjs-1.4.0-b4/angular-resource.js@https://code.angularjs.org/1.4.0-beta.4/angular-resource.js", + "/static/js/lib/angularjs-1.4.0-b4/angular-touch.js@https://code.angularjs.org/1.4.0-beta.4/angular-touch.js" + ] + } +} diff --git a/example/example.js b/example/example.js index f0b4053..aa6564f 100644 --- a/example/example.js +++ b/example/example.js @@ -5,59 +5,13 @@ var async = require('async'); var path = require('path'); var assets = require('../lib/node-ff-assets'); -var assetsConfig = { - // Map from uri paths to file systems paths. - linkMapping : { - '/static/module/bootstrap/': 'node_modules/bootstrap/dist/', - '/static/module/flot/': 'node_modules/flot/', - '/static/': 'www_static/', - }, - linkSourcesCss : [ - '/static/module/bootstrap/css/bootstrap.css', - ], - linkSourcesJs : [ - '/static/js/lib/jquery-2.1.3/jquery.js@http://code.jquery.com/jquery-2.1.3.js', - '/static/module/bootstrap/js/bootstrap.js', - '/static/module/flot/jquery.flot.js', - '/static/module/flot/jquery.flot.resize.js', - '/static/module/flot/jquery.flot.pie.js', - '/static/js/lib/angularjs-1.4.0-b4/angular.js@https://code.angularjs.org/1.4.0-beta.4/angular.js', - '/static/js/lib/angularjs-1.4.0-b4/angular-route.js@https://code.angularjs.org/1.4.0-beta.4/angular-route.js', - '/static/js/lib/angularjs-1.4.0-b4/angular-resource.js@https://code.angularjs.org/1.4.0-beta.4/angular-resource.js', - '/static/js/lib/angularjs-1.4.0-b4/angular-touch.js@https://code.angularjs.org/1.4.0-beta.4/angular-touch.js', - ], -}; - -//callback helper to return an assembler config per asset type -function createBuildConfig(type) { - return function(callback) { - var singleResult = 'false' !== process.env.DEV_ASSETS_SINGLE_RESULT; - console.info('Asset single page result: '+singleResult+' for: '+type); - if (type === 'css') { - callback(null,{ - linkMapping: assetsConfig.linkMapping, - linkTargetSingleResult: singleResult, - linkTarget: '/static/css/lib/assets.css', - linkSources: assetsConfig.linkSourcesCss, - assetType: type, - }); - } else { - callback(null, { - linkTargetSingleResult: singleResult, - linkMapping: assetsConfig.linkMapping, - linkTarget: '/static/js/lib/assets.js', - linkSources: assetsConfig.linkSourcesJs, - assetType: type, - }); - } - }; -} - function buildAssets(server,callbackDone) { + var singleResult = 'false' !== process.env.DEV_ASSETS_SINGLE_RESULT; + var assetsConfig = require('./example-assets.json'); assets.build({ assets: { js: { - configCreate: createBuildConfig('js'), + configCreate: assets.factory.builder.configCreate.fromJSON(assetsConfig,'js'), configFill: function (config, callback) { async.series([ assets.factory.lib.async.pushLinkSources(config, '/static/js/', 'www_static/js/'), @@ -66,34 +20,33 @@ function buildAssets(server,callbackDone) { }, }, css: { - configCreate: createBuildConfig('css'), + configCreate: assets.factory.builder.configCreate.fromJSON(assetsConfig,'css'), configFill: function (config, callback) { async.series([ - assets.factory.lib.async.pushLinkSources(config, '/static/css/', 'www_static/css/'), + assets.factory.lib.async.pushLinkSources(config, '/static/css/', 'www_static/css/'), ],callback); - - }, - assemblerCreate: function (assemblerConfig, callback) { - callback(null,new assets.AssetAssembler(assemblerConfig,assets.factory.assembler.constructor.readFileMinify())); }, }, }, + assemblerCreate: assets.factory.builder.assemblerCreate.readFileRegex(), assemblerFill: function (assembler, callback) { var serverResultKey = 'ff_assets_'+assembler.config.assetType; assembler.on ('log', assets.factory.assembler.event.log.console(assembler.config.assetType)); assembler.on ('result', assets.factory.assembler.event.result.objectSet(server,serverResultKey)); + assembler.config.linkTargetSingleResult = singleResult; callback(); }, },callbackDone); } -function renderTemplate() { +function renderTemplatePath(viewPath) { return function (req, res) { - if (req.params.sub) { - res.render('thtml/' + req.params.page + '/' + req.params.sub); - } else { - res.render('thtml/' + req.params.page); + res.locals.query = req.query; + var qi = req.url.indexOf('?'); + if (qi === -1) { + qi = req.url.length; } + res.render(viewPath + req.url.substring(req.route.path.length-1, qi)); }; } @@ -123,14 +76,13 @@ buildAssets(server,function(err) { console.info('Server assets done.'); server.set('view engine', 'ejs'); - server.set('views', path.join(__dirname, 'www_views')); - server.use('/static',express.static(path.join(__dirname,'www_static'))); - server.use('/static/module/bootstrap',express.static(path.join(__dirname,'node_modules/bootstrap/dist'))); - server.use('/static/module/flot',express.static(path.join(__dirname,'node_modules/flot'))); + server.set('views', path.join(__dirname,'www_views')); + server.use('/static', express.static(path.join(__dirname,'www_static'))); + server.use('/static/module/bootstrap', express.static(path.join(__dirname,'node_modules/bootstrap/dist'))); + server.use('/static/module/flot', express.static(path.join(__dirname,'node_modules/flot'))); - server.get('/example-ui/thtml/:page', renderTemplate()); - server.get('/example-ui/thtml/:page/:sub', renderTemplate()); server.get('/', sendRedirect()); + server.get('/example-ui/thtml/*', renderTemplatePath('thtml/')); server.get('/example-ui', renderPage(server)); server.get('/example-ui/*', renderPage(server)); // must be last; for HTML5 history console.info('Server config done.'); diff --git a/lib/asset-assembler-config.js b/lib/asset-assembler-config.js index 159010b..c853a38 100644 --- a/lib/asset-assembler-config.js +++ b/lib/asset-assembler-config.js @@ -14,14 +14,14 @@ var template = { }, linkTargetSingleResult: true, - linkTarget: null, - linkSources: [], - linkMapping: [], + linkTarget: null, + linkSources: [], + linkMapping: [], - assetType: null, - assetHeader: '\n/* '+name+': begin */\n\n', - assetFooter: '\n/* '+name+': end */\n\n', - assetSeperator: '\n/* '+name+': next */\n', + assetType: null, + assetHeader: '/* '+name+': Auto generated. */\n', + assetFooter: '/* '+name+': end */\n', + assetSeperator: '\n/* '+name+': <%= file %> */\n\n', }; function checkConfig(config,callback) { diff --git a/lib/asset-assembler.js b/lib/asset-assembler.js index 1f1f9b3..118729c 100644 --- a/lib/asset-assembler.js +++ b/lib/asset-assembler.js @@ -1,5 +1,6 @@ 'use strict'; +var u = require('underscore'); var events = require('events'); var fetch = require('fetch'); var fs = require('fs-extra'); @@ -8,7 +9,11 @@ var config = require('./asset-assembler-config'); function buildEnd(assembler, targetFile, resultUriList, callback) { - fs.appendFile(targetFile, assembler.config.assetFooter, function (err) { + var footer = ''; + if (assembler.config.assetFooter !== null) { + footer = assembler.config.assetFooter; + } + fs.appendFile(targetFile, footer, function (err) { if (err) { callback(err); } else { @@ -97,10 +102,11 @@ function aggregateFileList(assembler, targetFile, aggregateList, readFile, callb } else { assembler.emit('file-read-post',aggregateFile); assembler.emit('log','debug','readFile: '+aggregateFile+' size: '+data.length); - if (aggregateList.length > 0) { - data = data + assembler.config.assetSeperator; + if (assembler.config.assetSeperator !== null && assembler.config.assetSeperator.length > 0) { + var seperatorTemplate = u.template(assembler.config.assetSeperator); + data = seperatorTemplate({file: aggregateFile}) + data; } - fs.appendFile(targetFile, data, function (err) { + fs.appendFile(targetFile, data + '\n', function (err) { if (err) { callback(err); } else { @@ -205,7 +211,11 @@ function buildStart(assembler, readFile, callback) { callback(err); } else { assembler.emit('file-write-pre',targetFile); - fs.writeFile(targetFile, assembler.config.assetHeader, function(err) { + var header = ''; + if (assembler.config.assetHeader !== null) { + header = assembler.config.assetHeader; + } + fs.writeFile(targetFile, header, function(err) { if (err) { callback(err); } else { diff --git a/lib/assets-builder-config.js b/lib/assets-builder-config.js index d156f87..f305e74 100644 --- a/lib/assets-builder-config.js +++ b/lib/assets-builder-config.js @@ -12,16 +12,16 @@ var template = { assets: { js: { - configCreate: null, - configFill: null, + configCreate: null, + configFill: null, assemblerCreate: null, - assemblerFill: null, + assemblerFill: null, }, css: { - configCreate: null, - configFill: null, + configCreate: null, + configFill: null, assemblerCreate: null, - assemblerFill: null, + assemblerFill: null, }, }, }; diff --git a/lib/factory.js b/lib/factory.js index 0a3d369..e3564c6 100644 --- a/lib/factory.js +++ b/lib/factory.js @@ -55,7 +55,7 @@ var assemblerConstructors = { for (var i = 0; i < regexList.length; i++) { var regex = new RegExp(regexList[i],'gm'); var regexReplace = regexData[regexList[i]]; - //console.log('regex: \''+regex+'\' replace: \''+regexReplace+'\''); + console.log('regex: \''+regex+'\' replace: \''+regexReplace+'\''); data = data.replace(regex,regexReplace); } callback(null, data); @@ -149,6 +149,12 @@ var builderAssemblerCreate = { callback(null,new AS(assemblerConfig,assemblerConstructors.readFileMinify(options))); }; }, + readFileRegex: function(options) { + return function (assemblerConfig, callback) { + var AS = require('./asset-assembler'); + callback(null,new AS(assemblerConfig,assemblerConstructors.readFileRegex(options))); + }; + }, }; var builderEmptyCallback = function () { @@ -159,6 +165,21 @@ var builderEmptyCallback = function () { }; }; +var builderConfigCreate = { + nop: builderEmptyCallback, + fromJSON: function (configJSON,type) { + return function(callback) { + callback(null,{ + // TODO: add merging + linkMapping: configJSON.linkMapping, + linkTarget: configJSON[type].linkTarget, + linkSources: configJSON[type].linkSources, + assetType: type, + }); + }; + }, +}; + module.exports = { assembler: { constructor : assemblerConstructors, @@ -168,7 +189,7 @@ module.exports = { }, }, builder: { - configCreate: { nop: builderEmptyCallback }, + configCreate: builderConfigCreate, configFill: { nop: builderEmptyCallback }, assemblerCreate: builderAssemblerCreate, assemblerFill: { nop: builderEmptyCallback }, diff --git a/test/test-asset-assembler.js b/test/test-asset-assembler.js index 9db29a5..6d4063e 100644 --- a/test/test-asset-assembler.js +++ b/test/test-asset-assembler.js @@ -5,7 +5,7 @@ var fs = require('fs-extra'); var assert = require("assert"); var assets = require("../lib/node-ff-assets"); -function createTestAssembler(suite) { +function createTestAssembler(suite, readFile) { var assetAssembler = new assets.AssetAssembler({ linkMapping: {'/static-test/': 'test/data/'+suite.title+'/'}, linkTarget: '/static-test/output.css', @@ -13,7 +13,7 @@ function createTestAssembler(suite) { '/static-test/input0.css', '/static-test/input1.css', ], - }); + },readFile); assetAssembler.on ('log',function (logLevel, logMessage) { var level = (logLevel+' ').substring(0,6); console.log(' '+ level + ' ' + suite.title + ' ' +logMessage); @@ -21,15 +21,18 @@ function createTestAssembler(suite) { return assetAssembler; } -function createTestData(suite) { +function createTestData(suite,extraData0) { var testName = suite.title; var outputFile = 'test/data/'+testName+'/output.css'; var dataCss0 = 'test/data/'+testName+'/input0.css'; var dataCss1 = 'test/data/'+testName+'/input1.css'; fs.ensureFileSync(dataCss0); - fs.appendFile(dataCss0,'input__0'); + fs.appendFileSync(dataCss0,'input__0'); + if (extraData0 !== undefined) { + fs.appendFileSync(dataCss0,extraData0); + } fs.ensureFileSync(dataCss1); - fs.appendFile(dataCss1,'input__1'); + fs.appendFileSync(dataCss1,'input__1'); return outputFile; } @@ -158,5 +161,60 @@ describe('lib/asset-assembler.js', function() { }); }); + describe('aggregate-regex', function() { + this.timeout(10000); + var outputFile = createTestData(this,'\n// RM_THIS_COMMENT_LINE\n/* RM_THIS_COMMENT_BLOCK */\n'); + var assetAssembler = createTestAssembler(this,assets.factory.assembler.constructor.readFileRegex()); + it('run builder and check output', function (done) { + assetAssembler.run(function (err) { + try { + assert.ok(true); + assert.equal(true, fs.existsSync(outputFile)); + + var outputData = ''+fs.readFileSync(outputFile); + assert.equal(true, outputData.indexOf('input__0') > 0); + assert.equal(true, outputData.indexOf('input__1') > 0); + + assert.equal(false, outputData.indexOf('RM_THIS_COMMENT_LINE') > 0); + assert.equal(false, outputData.indexOf('RM_THIS_COMMENT_BLOCK') > 0); + + done(); + } catch (err) { + done(err); + } + }); + }); + }); + + describe('aggregate-no-comments', function() { + this.timeout(10000); + var outputFile = createTestData(this); + var assetAssembler = createTestAssembler(this); + assetAssembler.config.assetHeader = null; + assetAssembler.config.assetFooter = null; + assetAssembler.config.assetSeperator = null; + it('run builder and check output', function (done) { + assetAssembler.run(function (err) { + try { + assert.ok(true); + assert.equal(true, fs.existsSync(outputFile)); + + var outputData = ''+fs.readFileSync(outputFile); + assert.equal(true, outputData.indexOf('input__0') >= 0); + assert.equal(true, outputData.indexOf('input__1') >= 0); + + assert.equal(false, outputData.indexOf('node-ff-assets') > 0); + assert.equal(false, outputData.indexOf('begin') > 0); + assert.equal(false, outputData.indexOf('end') > 0); + assert.equal(false, outputData.indexOf('input0.css') > 0); + assert.equal(false, outputData.indexOf('input1.css') > 0); + + done(); + } catch (err) { + done(err); + } + }); + }); + }); });