Skip to content

Commit 134c77a

Browse files
authored
refactor: move zero-config from group design (#1820)
* refactor: move zero-config group to pure function * tests: prefer supplied mode over NODE_ENV * tests: fix * chore: add tests for config mode
1 parent 3a38f99 commit 134c77a

File tree

9 files changed

+69
-62
lines changed

9 files changed

+69
-62
lines changed

packages/serve/__tests__/__snapshots__/parseArgs.test.ts.snap

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ Object {
1212
"webpackArgs": Object {
1313
"color": true,
1414
"hot": true,
15-
"mode": "production",
1615
},
1716
}
1817
`;
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,42 @@
1-
const ZeroConfigGroup = require('../lib/groups/ZeroConfigGroup');
1+
const resolveMode = require('../lib/groups/resolveMode');
22

3-
describe('ZeroConfigGroup', function () {
3+
describe('resolveMode', function () {
44
it('should handle the mode option [production]', () => {
5-
const group = new ZeroConfigGroup([
6-
{
7-
mode: 'production',
8-
},
9-
]);
10-
const result = group.run();
5+
const result = resolveMode({
6+
mode: 'production',
7+
});
118
// ensure no other properties are added
129
expect(result.options).toMatchObject({ mode: 'production' });
1310
expect(result.options.mode).toEqual('production');
1411
});
1512

1613
it('should handle the mode option [development]', () => {
17-
const group = new ZeroConfigGroup([
18-
{
19-
mode: 'development',
20-
},
21-
]);
14+
const result = resolveMode({
15+
mode: 'development',
16+
});
2217

23-
const result = group.run();
2418
// ensure no other properties are added
2519
expect(result.options).toMatchObject({ mode: 'development' });
2620
expect(result.options.mode).toEqual('development');
2721
});
2822

2923
it('should handle the mode option [none]', () => {
30-
const group = new ZeroConfigGroup([
31-
{
32-
mode: 'none',
33-
},
34-
]);
24+
const result = resolveMode({
25+
mode: 'none',
26+
});
3527

36-
const result = group.run();
3728
// ensure no other properties are added
3829
expect(result.options).toMatchObject({ mode: 'none' });
3930
expect(result.options.mode).toEqual('none');
4031
});
32+
33+
it('should prefer supplied move over NODE_ENV', () => {
34+
process.env.NODE_ENV = 'production';
35+
const result = resolveMode({
36+
mode: 'development',
37+
});
38+
39+
// ensure no other properties are added
40+
expect(result.options).toMatchObject({ mode: 'development' });
41+
});
4142
});

packages/webpack-cli/lib/groups/ZeroConfigGroup.js

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const PRODUCTION = 'production';
2+
const DEVELOPMENT = 'development';
3+
4+
const resolveMode = (args) => {
5+
const {
6+
env: { NODE_ENV },
7+
} = process;
8+
const { mode } = args;
9+
10+
let finalMode;
11+
/**
12+
* It determines the mode to pass to webpack compiler
13+
* @returns {string} The mode
14+
*/
15+
if (!mode && NODE_ENV && (NODE_ENV === PRODUCTION || NODE_ENV === DEVELOPMENT)) {
16+
finalMode = NODE_ENV;
17+
} else {
18+
finalMode = mode || PRODUCTION;
19+
}
20+
21+
return {
22+
options: { mode: finalMode },
23+
};
24+
};
25+
26+
module.exports = resolveMode;

packages/webpack-cli/lib/utils/cli-flags.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,6 @@ const core = [
195195
name: 'mode',
196196
usage: '--mode <development | production | none>',
197197
type: String,
198-
group: ZERO_CONFIG_GROUP,
199-
defaultValue: 'production',
200198
description: 'Defines the mode to pass to webpack',
201199
link: 'https://webpack.js.org/concepts/#mode',
202200
},

packages/webpack-cli/lib/webpack-cli.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const { options } = require('colorette');
22
const GroupHelper = require('./utils/GroupHelper');
33
const handleConfigResolution = require('./groups/ConfigGroup');
4+
const resolveMode = require('./groups/resolveMode');
45
const { Compiler } = require('./utils/Compiler');
56
const { groups, core } = require('./utils/cli-flags');
67
const webpackMerge = require('webpack-merge');
@@ -76,6 +77,12 @@ class WebpackCLI extends GroupHelper {
7677
this._mergeOptionsToOutputConfiguration(resolvedConfig.outputOptions);
7778
}
7879

80+
async _baseResolver(cb, parsedArgs) {
81+
const resolvedConfig = cb(parsedArgs);
82+
this._mergeOptionsToConfiguration(resolvedConfig.options);
83+
this._mergeOptionsToOutputConfiguration(resolvedConfig.outputOptions);
84+
}
85+
7986
/**
8087
* Expose commander argParser
8188
* @param {...any} args args for argParser
@@ -97,11 +104,6 @@ class WebpackCLI extends GroupHelper {
97104
resolveGroups() {
98105
for (const [key, value] of this.groupMap.entries()) {
99106
switch (key) {
100-
case groups.ZERO_CONFIG_GROUP: {
101-
const ZeroConfigGroup = require('./groups/ZeroConfigGroup');
102-
this.zeroConfigGroup = new ZeroConfigGroup(value);
103-
break;
104-
}
105107
case groups.BASIC_GROUP: {
106108
const BasicGroup = require('./groups/BasicGroup');
107109
this.basicGroup = new BasicGroup(value);
@@ -227,7 +229,7 @@ class WebpackCLI extends GroupHelper {
227229
*/
228230
async runOptionGroups(parsedArgs) {
229231
await Promise.resolve()
230-
.then(() => this._handleGroupHelper(this.zeroConfigGroup))
232+
.then(() => this._baseResolver(resolveMode, parsedArgs))
231233
.then(() => this._handleDefaultEntry())
232234
.then(() => this._handleConfig(parsedArgs))
233235
.then(() => this._handleGroupHelper(this.outputGroup))

test/mode/mode-with-config/mode-with-config.test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,11 @@ describe('mode flags with config', () => {
9191
done();
9292
});
9393
});
94+
95+
it('should use mode from config over flags', () => {
96+
const { stdout, stderr, exitCode } = run(__dirname, ['--mode', 'production', '-c', 'webpack.config2.js']);
97+
expect(stderr).toBeFalsy();
98+
expect(exitCode).toEqual(0);
99+
expect(stdout).toContain(`mode: 'development'`);
100+
});
94101
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// eslint-disable-next-line node/no-unpublished-require
2+
const WebpackCLITestPlugin = require('../../utils/webpack-cli-test-plugin');
3+
4+
module.exports = {
5+
mode: 'development',
6+
plugins: [new WebpackCLITestPlugin()],
7+
};

0 commit comments

Comments
 (0)