diff --git a/bin/config-optimist.js b/bin/config-optimist.js index 30dcded38..d91d918c7 100644 --- a/bin/config-optimist.js +++ b/bin/config-optimist.js @@ -1,7 +1,7 @@ module.exports = function(optimist) { optimist .boolean("help").alias("help", "h").alias("help", "?").describe("help") - .string("config").alias("config", "c").describe("config") + .string("config").describe("config") .string("env").describe("env", "Enviroment passed to the config, when it is a function") .string("context").describe("context") .string("entry").describe("entry") @@ -27,7 +27,7 @@ module.exports = function(optimist) { .boolean("watch-stdin").alias("watch-stdin", "stdin").describe("watch which closes when stdin ends") .describe("watch-aggregate-timeout") .describe("watch-poll") - .boolean("hot").alias("hot", "h").describe("hot") + .boolean("hot").describe("hot") .boolean("debug").describe("debug") .string("devtool").describe("devtool") .boolean("progress").describe("progress") diff --git a/bin/convert-argv.js b/bin/convert-argv.js index 255e8bbec..5ea12d547 100644 --- a/bin/convert-argv.js +++ b/bin/convert-argv.js @@ -11,7 +11,7 @@ module.exports = function(optimist, argv, convertOptions) { // Help if(argv.help) { optimist.showHelp(); - process.exit(-1); + process.exit(-1); // eslint-disable-line } // Shortcuts @@ -85,62 +85,78 @@ module.exports = function(optimist, argv, convertOptions) { options = options(argv.env, argv); } - if(typeof options !== "object" || options === null) { - console.log("Config did not export an object or a function returning an object."); - process.exit(-1); - } + return processConfiguredOptions(options); - if(Array.isArray(options)) { - options.forEach(processOptions); - } else { - processOptions(options); - } - - if(argv.context) { - options.context = path.resolve(argv.context); - } - if(!options.context) { - options.context = process.cwd(); - } - - if(argv.watch) { - // TODO remove this in next major version - if(options.watch && typeof options.watch === "object") { - console.warn("options.watch is deprecated: Use 'options.watchOptions' instead"); - options.watchOptions = options.watch; + function processConfiguredOptions(options) { + if(typeof options !== "object" || options === null) { + console.log("Config did not export an object or a function returning an object."); + process.exit(-1); // eslint-disable-line } - // TODO remove this in next major version - if(options.watchDelay) { - console.warn("options.watchDelay is deprecated: Use 'options.watchOptions.aggregateTimeout' instead"); + + // process Promise + if(typeof options.then === "function") { + return options.then(processConfiguredOptions); + } + + // process ES6 default + if(typeof options === "object" && typeof options["default"] === "object") { + return processConfiguredOptions(options["default"]); + } + + if(Array.isArray(options)) { + options.forEach(processOptions); + } else { + processOptions(options); + } + + if(argv.context) { + options.context = path.resolve(argv.context); + } + if(!options.context) { + options.context = process.cwd(); + } + + if(argv.watch) { + // TODO remove this in next major version + if(options.watch && typeof options.watch === "object") { + console.warn("options.watch is deprecated: Use 'options.watchOptions' instead"); + options.watchOptions = options.watch; + } + // TODO remove this in next major version + if(options.watchDelay) { + console.warn("options.watchDelay is deprecated: Use 'options.watchOptions.aggregateTimeout' instead"); + options.watchOptions = options.watchOptions || {}; + options.watchOptions.aggregateTimeout = options.watchDelay; + } + options.watch = true; + } + + if(argv["watch-delay"]) { + console.warn("--watch-delay is deprecated: Use '--watch-aggregate-timeout' instead"); options.watchOptions = options.watchOptions || {}; - options.watchOptions.aggregateTimeout = options.watchDelay; + options.watchOptions.aggregateTimeout = +argv["watch-delay"]; } - options.watch = true; - } - if(argv["watch-delay"]) { - console.warn("--watch-delay is deprecated: Use '--watch-aggregate-timeout' instead"); - options.watchOptions = options.watchOptions || {}; - options.watchOptions.aggregateTimeout = +argv["watch-delay"]; - } + if(argv["watch-aggregate-timeout"]) { + options.watchOptions = options.watchOptions || {}; + options.watchOptions.aggregateTimeout = +argv["watch-aggregate-timeout"]; + } - if(argv["watch-aggregate-timeout"]) { - options.watchOptions = options.watchOptions || {}; - options.watchOptions.aggregateTimeout = +argv["watch-aggregate-timeout"]; - } + if(argv["watch-poll"]) { + options.watchOptions = options.watchOptions || {}; + if(typeof argv["watch-poll"] !== "boolean") + options.watchOptions.poll = +argv["watch-poll"]; + else + options.watchOptions.poll = true; + } - if(argv["watch-poll"]) { - options.watchOptions = options.watchOptions || {}; - if(typeof argv["watch-poll"] !== "boolean") - options.watchOptions.poll = +argv["watch-poll"]; - else - options.watchOptions.poll = true; - } + if(argv["watch-stdin"]) { + options.watchOptions = options.watchOptions || {}; + options.watchOptions.stdin = true; + options.watch = true; + } - if(argv["watch-stdin"]) { - options.watchOptions = options.watchOptions || {}; - options.watchOptions.stdin = true; - options.watch = true; + return options; } function processOptions(options) { @@ -214,7 +230,7 @@ module.exports = function(optimist, argv, convertOptions) { } } catch(e) { console.log("Invalid plugin arguments " + name + " (" + e + ")."); - process.exit(-1); + process.exit(-1); // eslint-disable-line } var path; @@ -222,7 +238,7 @@ module.exports = function(optimist, argv, convertOptions) { path = resolve.sync(process.cwd(), name); } catch(e) { console.log("Cannot resolve plugin " + name + "."); - process.exit(-1); + process.exit(-1); // eslint-disable-line } var Plugin; try { @@ -514,7 +530,7 @@ module.exports = function(optimist, argv, convertOptions) { } else { optimist.showHelp(); console.error("Output filename not configured."); - process.exit(-1); + process.exit(-1); // eslint-disable-line } } @@ -551,8 +567,5 @@ module.exports = function(optimist, argv, convertOptions) { } }); } - } - - return options; }; diff --git a/bin/webpack.js b/bin/webpack.js index 1ef996372..43dbb859d 100644 --- a/bin/webpack.js +++ b/bin/webpack.js @@ -48,136 +48,150 @@ function ifArg(name, fn, init) { } } -var firstOptions = Array.isArray(options) ? options[0] : options; - -var outputOptions = Object.create(options.stats || firstOptions.stats || {}); -if(typeof outputOptions.context === "undefined") - outputOptions.context = firstOptions.context; - -ifArg("json", function(bool) { - if(bool) - outputOptions.json = bool; -}); - -if(typeof outputOptions.colors === "undefined") - outputOptions.colors = require("supports-color"); - -ifArg("sort-modules-by", function(value) { - outputOptions.modulesSort = value; -}); - -ifArg("sort-chunks-by", function(value) { - outputOptions.chunksSort = value; -}); - -ifArg("sort-assets-by", function(value) { - outputOptions.assetsSort = value; -}); - -ifArg("display-exclude", function(value) { - outputOptions.exclude = value; -}); - -if(!outputOptions.json) { - if(typeof outputOptions.cached === "undefined") - outputOptions.cached = false; - if(typeof outputOptions.cachedAssets === "undefined") - outputOptions.cachedAssets = false; - - ifArg("display-chunks", function(bool) { - outputOptions.modules = !bool; - outputOptions.chunks = bool; - }); - - ifArg("display-reasons", function(bool) { - outputOptions.reasons = bool; - }); - - ifArg("display-error-details", function(bool) { - outputOptions.errorDetails = bool; - }); - - ifArg("display-origins", function(bool) { - outputOptions.chunkOrigins = bool; - }); - - ifArg("display-cached", function(bool) { - if(bool) - outputOptions.cached = true; - }); - - ifArg("display-cached-assets", function(bool) { - if(bool) - outputOptions.cachedAssets = true; - }); - - if(!outputOptions.exclude && !argv["display-modules"]) - outputOptions.exclude = ["node_modules", "bower_components", "jam", "components"]; -} else { - if(typeof outputOptions.chunks === "undefined") - outputOptions.chunks = true; - if(typeof outputOptions.modules === "undefined") - outputOptions.modules = true; - if(typeof outputOptions.chunkModules === "undefined") - outputOptions.chunkModules = true; - if(typeof outputOptions.reasons === "undefined") - outputOptions.reasons = true; - if(typeof outputOptions.cached === "undefined") - outputOptions.cached = true; - if(typeof outputOptions.cachedAssets === "undefined") - outputOptions.cachedAssets = true; -} - -ifArg("hide-modules", function(bool) { - if(bool) { - outputOptions.modules = false; - outputOptions.chunkModules = false; - } -}); - -var webpack = require("../lib/webpack.js"); - -Error.stackTraceLimit = 30; -var lastHash = null; -var compiler = webpack(options); - -function compilerCallback(err, stats) { - if(!options.watch) { - // Do not keep cache anymore - compiler.purgeInputFileSystem(); - } - if(err) { - lastHash = null; - console.error(err.stack || err); - if(err.details) console.error(err.details); - if(!options.watch) { - process.on("exit", function() { - process.exit(1); - }); - } +function processOptions(options) { + // process Promise + if(typeof options.then === "function") { + options.then(processOptions).catch(function(err) { + console.error(err.stack || err); + process.exit(); // eslint-disable-line + }); return; } - if(outputOptions.json) { - process.stdout.write(JSON.stringify(stats.toJson(outputOptions), null, 2) + "\n"); - } else if(stats.hash !== lastHash) { - lastHash = stats.hash; - process.stdout.write(stats.toString(outputOptions) + "\n"); - } - if(!options.doWatch && stats.hasErrors()) { - process.on("exit", function() { - process.exit(2); + + var firstOptions = Array.isArray(options) ? options[0] : options; + + var outputOptions = Object.create(options.stats || firstOptions.stats || {}); + if(typeof outputOptions.context === "undefined") + outputOptions.context = firstOptions.context; + + ifArg("json", function(bool) { + if(bool) + outputOptions.json = bool; + }); + + if(typeof outputOptions.colors === "undefined") + outputOptions.colors = require("supports-color"); + + ifArg("sort-modules-by", function(value) { + outputOptions.modulesSort = value; + }); + + ifArg("sort-chunks-by", function(value) { + outputOptions.chunksSort = value; + }); + + ifArg("sort-assets-by", function(value) { + outputOptions.assetsSort = value; + }); + + ifArg("display-exclude", function(value) { + outputOptions.exclude = value; + }); + + if(!outputOptions.json) { + if(typeof outputOptions.cached === "undefined") + outputOptions.cached = false; + if(typeof outputOptions.cachedAssets === "undefined") + outputOptions.cachedAssets = false; + + ifArg("display-chunks", function(bool) { + outputOptions.modules = !bool; + outputOptions.chunks = bool; }); + + ifArg("display-reasons", function(bool) { + outputOptions.reasons = bool; + }); + + ifArg("display-error-details", function(bool) { + outputOptions.errorDetails = bool; + }); + + ifArg("display-origins", function(bool) { + outputOptions.chunkOrigins = bool; + }); + + ifArg("display-cached", function(bool) { + if(bool) + outputOptions.cached = true; + }); + + ifArg("display-cached-assets", function(bool) { + if(bool) + outputOptions.cachedAssets = true; + }); + + if(!outputOptions.exclude && !argv["display-modules"]) + outputOptions.exclude = ["node_modules", "bower_components", "jam", "components"]; + } else { + if(typeof outputOptions.chunks === "undefined") + outputOptions.chunks = true; + if(typeof outputOptions.modules === "undefined") + outputOptions.modules = true; + if(typeof outputOptions.chunkModules === "undefined") + outputOptions.chunkModules = true; + if(typeof outputOptions.reasons === "undefined") + outputOptions.reasons = true; + if(typeof outputOptions.cached === "undefined") + outputOptions.cached = true; + if(typeof outputOptions.cachedAssets === "undefined") + outputOptions.cachedAssets = true; } + + ifArg("hide-modules", function(bool) { + if(bool) { + outputOptions.modules = false; + outputOptions.chunkModules = false; + } + }); + + var webpack = require("../lib/webpack.js"); + + Error.stackTraceLimit = 30; + var lastHash = null; + var compiler = webpack(options); + + function compilerCallback(err, stats) { + if(!options.watch) { + // Do not keep cache anymore + compiler.purgeInputFileSystem(); + } + if(err) { + lastHash = null; + console.error(err.stack || err); + if(err.details) console.error(err.details); + if(!options.watch) { + process.on("exit", function() { + process.exit(1); // eslint-disable-line + }); + } + return; + } + if(outputOptions.json) { + process.stdout.write(JSON.stringify(stats.toJson(outputOptions), null, 2) + "\n"); + } else if(stats.hash !== lastHash) { + lastHash = stats.hash; + process.stdout.write(stats.toString(outputOptions) + "\n"); + } + if(!options.doWatch && stats.hasErrors()) { + process.on("exit", function() { + process.exit(2); // eslint-disable-line + }); + } + } + if(options.watch) { + var primaryOptions = !Array.isArray(options) ? options : options[0]; + var watchOptions = primaryOptions.watchOptions || primaryOptions.watch || {}; + if(watchOptions.stdin) { + process.stdin.on('end', function() { + process.exit(0); // eslint-disable-line + }); + process.stdin.resume(); + } + compiler.watch(watchOptions, compilerCallback); + } else + compiler.run(compilerCallback); + } -if(options.watch) { - var primaryOptions = !Array.isArray(options) ? options : options[0]; - var watchOptions = primaryOptions.watchOptions || primaryOptions.watch || {}; - if(watchOptions.stdin) { - process.stdin.on('end', function() { - process.exit(0) - }); - process.stdin.resume(); - } - compiler.watch(watchOptions, compilerCallback); -} else - compiler.run(compilerCallback); + +processOptions(options); diff --git a/package.json b/package.json index bcfc1771d..28e9c2bbf 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,6 @@ "beautify": "node ./scripts/beautify-rewrite", "precover": "npm run lint && npm run beautify-lint", "cover": "istanbul cover -x *.runtime.js node_modules/mocha/bin/_mocha", - "publish-patch": "mocha && npm version patch && git push && git push --tags && npm publish" + "publish-patch": "npm run lint && npm run beautify-lint && mocha && npm version patch && git push && git push --tags && npm publish" } } diff --git a/test/browsertest/library2config.coffee b/test/browsertest/library2config.coffee index a0e30dcb0..ebd731702 100644 --- a/test/browsertest/library2config.coffee +++ b/test/browsertest/library2config.coffee @@ -1,43 +1,48 @@ webpack = require("../../"); -module.exports = - entry: - common: "library2/lib/common" - output: - hashDigestLength: 5 - module: - postLoaders: [ - { test: /extra2?\.js/, loader: "raw!extra!val?cacheable" } - ] - amd: - fromOptions: true - resolve: - # cannot resolve should outside the outermost node_modules - # so it is injected here - alias: - should: require.resolve "should" - plugins: [ - new webpack.optimize.LimitChunkCountPlugin - maxChunks: 3 - new webpack.optimize.CommonsChunkPlugin "common", "library2.commons.js" - new webpack.DefinePlugin - "typeof CONST_TYPEOF": JSON.stringify("typeof"), - CONST_UNDEFINED: undefined, - CONST_NULL: null, - CONST_TRUE: true, - CONST_FALSE: false, - CONST_FUNCTION: -> return "ok"; - CONST_NUMBER: 123, - CONST_NUMBER_EXPR: "(1*100+23)", - CONST_OBJECT: { - A: 1, - B: JSON.stringify("B"), - C: -> return "C"; - } - new webpack.ProvidePlugin - s3: "submodule3" - -> - this.plugin "normal-module-factory", (nmf) -> - nmf.plugin "after-resolve", (data, callback) -> - data.resource = data.resource.replace /extra\.js/, "extra2.js"; - callback null, data; - ] +exports.default = new Promise (resolve, reject) -> + resolveIt = -> + resolve + entry: + common: "library2/lib/common" + output: + hashDigestLength: 5 + module: + postLoaders: [ + { test: /extra2?\.js/, loader: "raw!extra!val?cacheable" } + ] + amd: + fromOptions: true + resolve: + # cannot resolve should outside the outermost node_modules + # so it is injected here + alias: + should: require.resolve "should" + plugins: [ + new webpack.optimize.LimitChunkCountPlugin + maxChunks: 2 + new webpack.optimize.CommonsChunkPlugin + name: "common" + filename: "library2.commons.js" + new webpack.DefinePlugin + "typeof CONST_TYPEOF": JSON.stringify("typeof"), + CONST_UNDEFINED: undefined, + CONST_NULL: "null", + CONST_TRUE: true, + CONST_FALSE: false, + CONST_FUNCTION: -> return "ok"; + CONST_NUMBER: 123, + CONST_NUMBER_EXPR: "(1*100+23)", + CONST_OBJECT: { + A: 1, + B: JSON.stringify("B"), + C: -> return "C"; + } + new webpack.ProvidePlugin + s3: "submodule3" + -> + this.plugin "normal-module-factory", (nmf) -> + nmf.plugin "after-resolve", (data, callback) -> + data.resource = data.resource.replace /extra\.js/, "extra2.js"; + callback null, data; + ] + setTimeout resolveIt, 300