From 2d1d363b66520820f5734b1df8ac896191b197cd Mon Sep 17 00:00:00 2001 From: Anshuman Verma Date: Tue, 13 Oct 2020 23:11:02 +0530 Subject: [PATCH] feat: allow passing strings in env flag --- packages/webpack-cli/lib/groups/ConfigGroup.js | 10 +--------- packages/webpack-cli/lib/utils/arg-parser.js | 9 +++++++++ packages/webpack-cli/lib/utils/cli-flags.js | 2 +- .../type/function-with-env/function-with-env.test.js | 7 +++++++ .../type/function-with-env/webpack.env.config.js | 12 ++++++++++++ 5 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 test/config/type/function-with-env/webpack.env.config.js diff --git a/packages/webpack-cli/lib/groups/ConfigGroup.js b/packages/webpack-cli/lib/groups/ConfigGroup.js index ae979207d03..80f056101cc 100644 --- a/packages/webpack-cli/lib/groups/ConfigGroup.js +++ b/packages/webpack-cli/lib/groups/ConfigGroup.js @@ -153,15 +153,7 @@ const finalize = async (moduleObj, args) => { const configOptions = moduleObj.content; if (typeof configOptions === 'function') { - // when config is a function, pass the env from args to the config function - let formattedEnv; - if (Array.isArray(env)) { - formattedEnv = env.reduce((envObject, envOption) => { - envObject[envOption] = true; - return envObject; - }, {}); - } - const newOptions = configOptions(formattedEnv, args); + const newOptions = configOptions(env, args); // When config function returns a promise, resolve it, if not it's resolved by default newOptionsObject['options'] = await Promise.resolve(newOptions); } else if (configName) { diff --git a/packages/webpack-cli/lib/utils/arg-parser.js b/packages/webpack-cli/lib/utils/arg-parser.js index c72ad1bd7d4..948dbcd656f 100644 --- a/packages/webpack-cli/lib/utils/arg-parser.js +++ b/packages/webpack-cli/lib/utils/arg-parser.js @@ -90,6 +90,15 @@ const argParser = (options, args, argsOnly = false, name = '') => { // a multiple argument parsing function const multiArg = (value, previous = []) => previous.concat([value]); parserInstance.option(flagsWithType, option.description, multiArg, option.defaultValue).action(() => {}); + } else if (option.multipleType) { + // for options which accept multiple types like env + // so you can do `--env platform=staging --env production` + // { platform: "staging", production: true } + const multiArg = (value, previous = {}) => { + const [key, val] = value.split('='); + return { ...previous, [key]: val || true }; + }; + parserInstance.option(flagsWithType, option.description, multiArg, option.defaultValue).action(() => {}); } else { // Prevent default behavior for standalone options parserInstance.option(flagsWithType, option.description, option.defaultValue).action(() => {}); diff --git a/packages/webpack-cli/lib/utils/cli-flags.js b/packages/webpack-cli/lib/utils/cli-flags.js index 0f5f508169a..807d94c0677 100644 --- a/packages/webpack-cli/lib/utils/cli-flags.js +++ b/packages/webpack-cli/lib/utils/cli-flags.js @@ -205,7 +205,7 @@ const core = [ name: 'env', usage: '--env', type: String, - multiple: true, + multipleType: true, description: 'Environment passed to the configuration when it is a function', }, { diff --git a/test/config/type/function-with-env/function-with-env.test.js b/test/config/type/function-with-env/function-with-env.test.js index fae211de366..618f26a4592 100644 --- a/test/config/type/function-with-env/function-with-env.test.js +++ b/test/config/type/function-with-env/function-with-env.test.js @@ -18,6 +18,13 @@ describe('function configuration', () => { // Should generate the appropriate files expect(existsSync(resolve(__dirname, './bin/dev.js'))).toBeTruthy(); }); + it('Supports passing string in env', () => { + const { stderr, stdout } = run(__dirname, ['--env', 'environment=production', '-c', 'webpack.env.config.js']); + expect(stderr).toBeFalsy(); + expect(stdout).toBeTruthy(); + // Should generate the appropriate files + expect(existsSync(resolve(__dirname, './bin/prod.js'))).toBeTruthy(); + }); it('is able to understand multiple env flags', (done) => { const { stderr, stdout } = run(__dirname, ['--env', 'isDev', '--env', 'verboseStats', '--env', 'envMessage']); expect(stderr).toBeFalsy(); diff --git a/test/config/type/function-with-env/webpack.env.config.js b/test/config/type/function-with-env/webpack.env.config.js new file mode 100644 index 00000000000..d6c0417a42e --- /dev/null +++ b/test/config/type/function-with-env/webpack.env.config.js @@ -0,0 +1,12 @@ +module.exports = (env) => { + const { environment } = env; + if (environment === 'production') { + return { + entry: './a.js', + output: { + filename: 'prod.js', + }, + }; + } + return {}; +};