diff --git a/README.md b/README.md index cc235d7..2c75d25 100644 --- a/README.md +++ b/README.md @@ -147,12 +147,15 @@ var a = (function () { return 'a'; }).call(global), ##### Опция `-i, --istanbul` -Опция позволяет указать имя модуля, для которого предполагается запуск [istanbul](https://github.com/gotwarlost/istanbul). -В результирующем файле у каждого модуля, который необходим для указанного модуля -будет добавлен комментарий, исключающий его из оценки покрытия тестами. +Опция позволяет перечислить имена модулей, для которых предполагается запуск [istanbul](https://github.com/gotwarlost/istanbul). +Для всех остальных модулей будет добавлен комментарий, исключающий их из оценки покрытия тестами. ./node_modules/.bin/definer -i b all.js +Возможно указание нескольких модулей через запятую. + + ./node_modules/.bin/definer -i b,c all.js + По умолчанию комментарии не добавляются, поскольку запуск оценки покрытия тестами не предполагается. ##### Опция `-v, --verbose` diff --git a/cli.js b/cli.js index 6107111..1f1ad49 100644 --- a/cli.js +++ b/cli.js @@ -12,11 +12,13 @@ const path = require('path'), commander .version('0.0.4') .usage('[options] ') - .option('-d, --directory ', 'directory of modules, comma delimited', '.') + .option('-d, --directory ', 'directory of modules, comma delimited', '.') .option('-m, --module ', 'target module name') - .option('-i, --istanbul ', 'target module name to coverage by istanbul') + .option('-i, --istanbul ', 'names of modules to coverage by istanbul, comma delimited', + function(modules) { return modules.split(','); }) .option('-p, --postfix ', 'postfix to find files') - .option('-v, --verbose ', 'l - log, i - info, w - warn, e - error', function(modes) { return modes.split(''); }) + .option('-v, --verbose ', 'l - log, i - info, w - warn, e - error', + function(modes) { return modes.split(''); }) .option('-c, --config ', 'json format config', defaultConfigFile) .parse(process.argv); diff --git a/maker.js b/maker.js index 63f3b83..3e91707 100644 --- a/maker.js +++ b/maker.js @@ -77,7 +77,7 @@ function Maker(options) { * @type {{ * directory: String|String[], * module: String|boolean, - * istanbul: String|boolean, + * istanbul: String|String[]|boolean, * postfix: String, * verbose: Array, * clean: Object, @@ -109,6 +109,14 @@ function Maker(options) { */ Maker.cacheFiles = {}; +/** + * Комментарий для указания istanbul игнорировать блоки кода + * @private + * @constant + * @type {String} + */ +Maker.ISTANBUL_COMMENT = '/* istanbul ignore next */'; + Maker.prototype = { /** @@ -591,6 +599,7 @@ Maker.prototype = { if(!this.clean.length) return ''; this.clean.unshift( + (this.options.istanbul !== false ? Maker.ISTANBUL_COMMENT : '') + '(function(undefined) {', 'var exports = undefined, modules = undefined, define = undefined;' ); @@ -641,7 +650,7 @@ Maker.prototype = { var closure = [ module.name, ' = ', - module.istanbul === false ? '/* istanbul ignore next */' : '', + module.istanbul === false ? Maker.ISTANBUL_COMMENT : '', '(', module.body, ').call(global' @@ -883,15 +892,16 @@ Maker.prototype = { * @returns {Object} */ markIstanbul: function(modules) { - var moduleToCoverage = this.options.istanbul; - if(!moduleToCoverage) return modules; + var modulesToCoverage = this.options.istanbul; + if(!modulesToCoverage) return modules; + + if(typeof modulesToCoverage === 'string') { + modulesToCoverage = [modulesToCoverage]; + } for(var i = 0; i < modules.length; i++) { - if(modules[i].name !== moduleToCoverage) { + if(!~modulesToCoverage.indexOf(modules[i].name)) { modules[i].istanbul = false; - } else { - modules[i].istanbul = true; - break; } } diff --git a/package.json b/package.json index d861a04..b4111b2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "definer", "description": "Easiest module system", - "version": "0.2.4", + "version": "0.2.5", "repository": { "type": "git", "url": "https://github.com/tenorok/definer.git" @@ -24,7 +24,7 @@ "devDependencies": { "mocha": "~1.15.1", "chai": "~1.8.1", - "jsdoc": "~3.3.0" + "jsdoc": "3.3.0-alpha8" }, "main": "main.js", "bin": { diff --git a/test/maker/helper.js b/test/maker/helper.js index 1093acf..2d0d41a 100644 --- a/test/maker/helper.js +++ b/test/maker/helper.js @@ -281,7 +281,7 @@ var closure = { ' ){\n' + ' return a + b + \'c\';\n' + ' }).call(global, a, b, c),\n' + - 'e = (function (d) { return d + \'e\'; }).call(global, d),\n' + + 'e = /* istanbul ignore next */(function (d) { return d + \'e\'; }).call(global, d),\n' + 'f = (function () { return \'f\'; }).call(global);\n' + '})(this);'; }, @@ -290,7 +290,7 @@ var closure = { return '(function(global, undefined) {\n' + 'var a = /* istanbul ignore next */(function () { return \'a\'; }).call(global),\n' + 'b = (function (a){return a + \'b\';}).call(global, a),\n' + - 'c = (function (a, b) {\n' + + 'c = /* istanbul ignore next */(function (a, b) {\n' + ' return a + b + \'c\';\n' + '}).call(global, a, b);\n' + '})(this);'; @@ -304,7 +304,21 @@ var closure = { 'var z = /* istanbul ignore next */definer.export("z", (function () { return { nameZ: \'valueZ\' }; }).call(global)),\n' + 'y = (function (z) { return \'z\'; }).call(global, z);\n' + '})(this);'; - } + }, + + getClosureStringMakeCleanFilesModuleCIstanbul: function() { + return '/* istanbul ignore next */(function(undefined) {\n' + + 'var exports = undefined, modules = undefined, define = undefined;\n' + + '(function(global) { global.$ = \'jquery\'; })(this);\n' + + '(function(global) { (global.$ || {}).ui = \'jquery.ui\'; })(this);\n' + + '(function(global) { (global.$ || {}).plugin = \'jquery.plugin\'; })(this);\n' + + '}).call(this);\n' + + '(function(global, undefined) {\n' + + 'var $ = global.$,\n' + + 'c = (function ($) { return \'c\'; }).call(global, $);\n' + + '["$"].forEach(function(g) { delete global[g]; });\n' + + '})(this);'; + }, }; diff --git a/test/maker/make-istanbul.js b/test/maker/make-istanbul.js index 91ab1e9..ec9901a 100644 --- a/test/maker/make-istanbul.js +++ b/test/maker/make-istanbul.js @@ -12,11 +12,11 @@ describe('Сборка модулей для тестирования покры var savePromise = vow.promise(), saveFilePath = path.join(__dirname, 'modules/all.js'); - it('Все обычные модули', function(done) { + it('Все обычные модули и несколько целевых модулей для istanbul', function(done) { new Maker({ directory: path.join(__dirname, 'modules'), - istanbul: 'd', + istanbul: ['d', 'f'], verbose: ['error'] }).make(saveFilePath).then(function() { @@ -29,7 +29,7 @@ describe('Сборка модулей для тестирования покры }).done(); }); - it('Заданный модуль', function(done) { + it('Заданный модуль для сборки с одним целевым модулем для istanbul', function(done) { new Maker({ directory: path.join(__dirname, 'modules'), @@ -47,7 +47,7 @@ describe('Сборка модулей для тестирования покры }).done(); }); - it('Заданные модуль с присутствием экспортируемых модулей', function(done) { + it('Заданный модуль с присутствием экспортируемых модулей', function(done) { new Maker({ directory: path.join(__dirname, 'modules2'), @@ -75,10 +75,15 @@ describe('Сборка модулей для тестирования покры describe('CLI.', function() { - var cli = new helper.testCLI('./bin/definer -v e -d test/maker/modules/').setTarget('test/maker/modules/all.js'); + var cli = new helper.testCLI('./bin/definer -v e').setTarget('test/maker/modules/all.js'); - it('Все обычные модули', function(done) { - cli.exec('-i d', helper.getClosureStringIstanbul(), done); + it('Все обычные модули и несколько целевых модулей для istanbul', function(done) { + cli.exec('-d test/maker/modules/ -i d,f', helper.getClosureStringIstanbul(), done); + }); + + it('Clean-скрипты так же должны предваряться istanbul-комментарием', function(done) { + cli.exec('-d test/maker/clean/ -c test/maker/clean/clean.json -i c -m c', + helper.getClosureStringMakeCleanFilesModuleCIstanbul(), done); }); after(function(done) {