diff --git a/bin/convert-argv.js b/bin/convert-argv.js index ab0ba3343c0..f7e8d27d0db 100644 --- a/bin/convert-argv.js +++ b/bin/convert-argv.js @@ -2,6 +2,7 @@ var path = require("path"); var fs = require("fs"); fs.existsSync = fs.existsSync || path.existsSync; var interpret = require("interpret"); +var prepareOptions = require("../lib/prepareOptions"); module.exports = function(yargs, argv, convertOptions) { @@ -94,13 +95,7 @@ module.exports = function(yargs, argv, convertOptions) { var requireConfig = function requireConfig(configPath) { var options = require(configPath); - var isES6DefaultExportedFunc = ( - typeof options === "object" && options !== null && typeof options.default === "function" - ); - if(typeof options === "function" || isES6DefaultExportedFunc) { - options = isES6DefaultExportedFunc ? options.default : options; - options = options(argv.env, argv); - } + options = prepareOptions(options, argv); return options; }; diff --git a/lib/prepareOptions.js b/lib/prepareOptions.js new file mode 100644 index 00000000000..d7cf1ada584 --- /dev/null +++ b/lib/prepareOptions.js @@ -0,0 +1,29 @@ +"use strict"; + +module.exports = function prepareOptions(options, argv) { + argv = argv || {}; + + options = handleExport(options); + + if(Array.isArray(options)) { + options = options.map(_options => handleFunction(_options, argv)); + } else { + options = handleFunction(options, argv); + } + return options; +}; + +function handleExport(options) { + const isES6DefaultExported = ( + typeof options === "object" && options !== null && typeof options.default !== "undefined" + ); + options = isES6DefaultExported ? options.default : options; + return options; +} + +function handleFunction(options, argv) { + if(typeof options === "function") { + options = options(argv.env, argv); + } + return options; +} diff --git a/test/ConfigTestCases.test.js b/test/ConfigTestCases.test.js index 0ecf862be30..ff4534b7707 100644 --- a/test/ConfigTestCases.test.js +++ b/test/ConfigTestCases.test.js @@ -10,6 +10,7 @@ const checkArrayExpectation = require("./checkArrayExpectation"); const Stats = require("../lib/Stats"); const webpack = require("../lib/webpack"); +const prepareOptions = require("../lib/prepareOptions"); describe("ConfigTestCases", () => { const casesPath = path.join(__dirname, "configCases"); @@ -39,7 +40,7 @@ describe("ConfigTestCases", () => { this.timeout(30000); const testDirectory = path.join(casesPath, category.name, testName); const outputDirectory = path.join(__dirname, "js", "config", category.name, testName); - const options = require(path.join(testDirectory, "webpack.config.js")); + const options = prepareOptions(require(path.join(testDirectory, "webpack.config.js"))); const optionsArr = [].concat(options); optionsArr.forEach((options, idx) => { if(!options.context) options.context = testDirectory; diff --git a/test/configCases/simple/multi-compiler-functions-export/index.js b/test/configCases/simple/multi-compiler-functions-export/index.js new file mode 100644 index 00000000000..6983651f6e9 --- /dev/null +++ b/test/configCases/simple/multi-compiler-functions-export/index.js @@ -0,0 +1,3 @@ +it("should run a multi compiler with functions with export default", function() { + +}); diff --git a/test/configCases/simple/multi-compiler-functions-export/webpack.config.js b/test/configCases/simple/multi-compiler-functions-export/webpack.config.js new file mode 100644 index 00000000000..5f250c4ac57 --- /dev/null +++ b/test/configCases/simple/multi-compiler-functions-export/webpack.config.js @@ -0,0 +1,5 @@ +exports.default = [ + function() { + return {}; + } +]; diff --git a/test/configCases/simple/multi-compiler-functions/index.js b/test/configCases/simple/multi-compiler-functions/index.js new file mode 100644 index 00000000000..d1ce8ad3e97 --- /dev/null +++ b/test/configCases/simple/multi-compiler-functions/index.js @@ -0,0 +1,3 @@ +it("should run a multi compiler with functions", function() { + +}); diff --git a/test/configCases/simple/multi-compiler-functions/webpack.config.js b/test/configCases/simple/multi-compiler-functions/webpack.config.js new file mode 100644 index 00000000000..6bd31ab78ca --- /dev/null +++ b/test/configCases/simple/multi-compiler-functions/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = [ + function() { + return {}; + } +];