From e5126f10b6622437c0541c25be2a610a82c1df04 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Tue, 2 Feb 2021 20:59:51 +0530 Subject: [PATCH] feat: add the `--node-env` flag (#2388) --- packages/webpack-cli/lib/webpack-cli.js | 16 +++++++- test/node-env/auto-mode.config.js | 5 +++ test/node-env/node-env.test.js | 53 +++++++++++++++++++++++++ test/node-env/src/index.js | 1 + test/node-env/webpack.config.js | 6 +++ 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 test/node-env/auto-mode.config.js create mode 100644 test/node-env/node-env.test.js create mode 100644 test/node-env/src/index.js create mode 100644 test/node-env/webpack.config.js diff --git a/packages/webpack-cli/lib/webpack-cli.js b/packages/webpack-cli/lib/webpack-cli.js index 79f7070534c..15be68263dc 100644 --- a/packages/webpack-cli/lib/webpack-cli.js +++ b/packages/webpack-cli/lib/webpack-cli.js @@ -295,6 +295,12 @@ class WebpackCLI { multiple: true, description: 'Environment passed to the configuration when it is a function.', }, + { + name: 'node-env', + type: String, + multiple: false, + description: 'Sets process.env.NODE_ENV to the specified value', + }, // Adding more plugins { @@ -429,6 +435,12 @@ class WebpackCLI { return options; } + applyNodeEnv(options) { + if (typeof options.nodeEnv === 'string') { + process.env.NODE_ENV = options.nodeEnv; + } + } + async run(args, parseOptions) { // Built-in internal commands const buildCommandOptions = { @@ -1517,7 +1529,7 @@ class WebpackCLI { !configOptions.mode && process.env && process.env.NODE_ENV && - (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'node') + (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'none') ) { configOptions.mode = process.env.NODE_ENV; } @@ -1653,6 +1665,8 @@ class WebpackCLI { } async createCompiler(options, callback) { + this.applyNodeEnv(options); + let config = await this.resolveConfig(options); config = await this.applyOptions(config, options); diff --git a/test/node-env/auto-mode.config.js b/test/node-env/auto-mode.config.js new file mode 100644 index 00000000000..385cb2ac035 --- /dev/null +++ b/test/node-env/auto-mode.config.js @@ -0,0 +1,5 @@ +const WebpackCLITestPlugin = require('../utils/webpack-cli-test-plugin'); + +module.exports = { + plugins: [new WebpackCLITestPlugin()], +}; diff --git a/test/node-env/node-env.test.js b/test/node-env/node-env.test.js new file mode 100644 index 00000000000..4d8bda5d328 --- /dev/null +++ b/test/node-env/node-env.test.js @@ -0,0 +1,53 @@ +'use strict'; + +const { run } = require('../utils/test-utils'); + +describe('--node-env flag', () => { + it('should set "process.env.NODE_ENV" to "development"', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['--node-env', 'development']); + + expect(exitCode).toBe(0); + expect(stderr).toBeFalsy(); + expect(stdout).toContain("mode: 'development'"); + }); + + it('should set "process.env.NODE_ENV" to "production"', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['--node-env', 'production']); + + expect(exitCode).toBe(0); + expect(stderr).toBeFalsy(); + expect(stdout).toContain("mode: 'production'"); + }); + + it('should set "process.env.NODE_ENV" to "none"', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['--node-env', 'none']); + + expect(exitCode).toBe(0); + expect(stderr).toBeFalsy(); + expect(stdout).toContain("mode: 'none'"); + }); + + it('should set "process.env.NODE_ENV" and the "mode" option to "development"', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['--node-env', 'development', '--config', './auto-mode.config.js']); + + expect(exitCode).toBe(0); + expect(stderr).toBeFalsy(); + expect(stdout).toContain("mode: 'development'"); + }); + + it('should set "process.env.NODE_ENV" and the "mode" option to "production"', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['--node-env', 'production', '--config', './auto-mode.config.js']); + + expect(exitCode).toBe(0); + expect(stderr).toBeFalsy(); + expect(stdout).toContain("mode: 'production'"); + }); + + it('should set "process.env.NODE_ENV" and the "mode" option to "none"', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['--node-env', 'none', '--config', './auto-mode.config.js']); + + expect(exitCode).toBe(0); + expect(stderr).toBeFalsy(); + expect(stdout).toContain("mode: 'none'"); + }); +}); diff --git a/test/node-env/src/index.js b/test/node-env/src/index.js new file mode 100644 index 00000000000..c70a2899e94 --- /dev/null +++ b/test/node-env/src/index.js @@ -0,0 +1 @@ +console.log('--node-env test'); \ No newline at end of file diff --git a/test/node-env/webpack.config.js b/test/node-env/webpack.config.js new file mode 100644 index 00000000000..ca74229899d --- /dev/null +++ b/test/node-env/webpack.config.js @@ -0,0 +1,6 @@ +const WebpackCLITestPlugin = require('../utils/webpack-cli-test-plugin'); + +module.exports = { + mode: process.env.NODE_ENV, + plugins: [new WebpackCLITestPlugin()], +};