Skip to content

Commit 7a5b33d

Browse files
authored
feat(webpack-cli): added mode argument (#1253)
1 parent 3715756 commit 7a5b33d

File tree

13 files changed

+193
-32
lines changed

13 files changed

+193
-32
lines changed

.babelrc

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{
2-
"presets": [[
3-
"@babel/preset-env",
4-
{
5-
"targets": {
6-
"node": "current"
7-
}
8-
}
9-
],
10-
"jest"
11-
]
12-
}
2+
"presets": [
3+
[
4+
"@babel/preset-env",
5+
{
6+
"targets": {
7+
"node": "current"
8+
}
9+
}
10+
]
11+
]
12+
}

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,4 @@ junit.xml
4747

4848
#typescript source maps
4949
packages/**/*.map
50+
*.tsbuildinfo

package.json

+5-5
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,14 @@
133133
"webpack": "5.x.x"
134134
},
135135
"devDependencies": {
136-
"@babel/preset-env": "^7.7.1",
136+
"@babel/core": "^7.8.4",
137+
"@babel/preset-env": "^7.8.4",
137138
"@commitlint/cli": "^8.2.0",
138139
"@commitlint/config-lerna-scopes": "^8.2.0",
139140
"@types/jest": "^24.0.22",
140141
"@typescript-eslint/eslint-plugin": "^2.17.0",
141142
"@typescript-eslint/parser": "^2.17.0",
143+
"chalk": "^3.0.0",
142144
"commitlint": "^8.2.0",
143145
"commitlint-config-cz": "^0.12.1",
144146
"cz-customizable": "^6.2.0",
@@ -149,19 +151,17 @@
149151
"execa": "^3.2.0",
150152
"husky": "^3.0.9",
151153
"jest": "^25.1.0",
152-
"jest-cli": "^25.1.0",
153154
"jest-junit": "^10.0.0",
154155
"jest-serializer-ansi": "^1.0.3",
155156
"lerna": "^3.20.2",
156157
"lint-staged": "^9.4.2",
157158
"nyc": "^14.1.1",
158159
"prettier": "1.18.2",
159160
"readable-stream": "^3.5.0",
160-
"ts-jest": "^24.1.0",
161+
"ts-jest": "^25.2.1",
161162
"typedoc": "^0.15.0",
162163
"typescript": "^3.7.2",
163164
"webpack": "^5.0.0-beta.12",
164-
"yeoman-test": "^2.1.0",
165-
"chalk": "^3.0.0"
165+
"yeoman-test": "^2.1.0"
166166
}
167167
}

packages/webpack-cli/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Options
5454
--standard Prints standard output
5555
-d, --dev Run development build
5656
-p, --prod Run production build
57+
--mode string Defines the mode to pass to webpack
5758
--version Get current version
5859
--node-args string[] NodeJS flags
5960
```

packages/webpack-cli/__tests__/ZeroConfigGroup.test.js

+24-5
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,33 @@ describe('GroupHelper', function() {
1313
});
1414
it('should load the prod zero config', () => {
1515
const group = new ZeroConfigGroup([
16-
[
17-
{
18-
prod: true,
19-
},
20-
],
16+
{
17+
prod: true,
18+
},
19+
]);
20+
21+
const result = group.run();
22+
expect(result.options.mode).toEqual('production');
23+
});
24+
it('should handle the mode option [production]', () => {
25+
const group = new ZeroConfigGroup([
26+
{
27+
mode: 'production',
28+
},
2129
]);
2230

2331
const result = group.run();
2432
expect(result.options.mode).toEqual('production');
2533
});
34+
35+
it('should handle the mode option [development]', () => {
36+
const group = new ZeroConfigGroup([
37+
{
38+
mode: 'development',
39+
},
40+
]);
41+
42+
const result = group.run();
43+
expect(result.options.mode).toEqual('development');
44+
});
2645
});

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

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const GroupHelper = require('../utils/GroupHelper');
2+
const { logger } = require('@webpack-cli/logger');
23

34
const PRODUCTION = 'production';
45
const DEVELOPMENT = 'development';
@@ -17,12 +18,25 @@ class ZeroConfigGroup extends GroupHelper {
1718
getEnvFromOptionsAndMode() {
1819
if (process.env.NODE_ENV && (process.env.NODE_ENV === PRODUCTION || process.env.NODE_ENV === DEVELOPMENT)) {
1920
return process.env.NODE_ENV;
20-
} else if (this.args.prod) {
21+
} else {
22+
if (this.args.mode && (this.args.dev || this.args.prod)) {
23+
logger.warn(
24+
`You provided both mode and ${
25+
this.args.prod ? '--prod' : '--dev'
26+
} arguments. You should provide just one. "mode" will be used`,
27+
);
28+
return this.args.mode;
29+
}
30+
if (this.args.mode) {
31+
return this.args.mode;
32+
}
33+
if (this.args.prod) {
34+
return PRODUCTION;
35+
} else if (this.args.dev) {
36+
return DEVELOPMENT;
37+
}
2138
return PRODUCTION;
22-
} else if (this.args.dev) {
23-
return DEVELOPMENT;
2439
}
25-
return PRODUCTION;
2640
}
2741

2842
resolveZeroConfig() {

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

+9
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,15 @@ module.exports = {
283283
description: 'Run production build',
284284
link: 'https://webpack.js.org/concepts/#mode',
285285
},
286+
{
287+
name: 'mode',
288+
usage: '--mode <development | production>',
289+
type: String,
290+
group: ZERO_CONFIG_GROUP,
291+
description: 'Defines the mode to pass to webpack',
292+
link: 'https://webpack.js.org/concepts/#mode',
293+
acceptedValues: ["development", "production"]
294+
},
286295
{
287296
name: 'version',
288297
usage: '--version',

test/help/__snapshots__/help-single-arg.test.js.snap

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Options
4444
--standard Prints standard output
4545
-d, --dev Run development build
4646
-p, --prod Run production build
47+
--mode string Defines the mode to pass to webpack
4748
--version Get current version
4849
--node-args string[] NodeJS flags
4950

test/mode/dev/dev.test.js

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
'use strict';
2+
const { run } = require('../../utils/test-utils');
3+
const { stat } = require('fs');
4+
const { resolve } = require('path');
5+
describe('mode flags', () => {
6+
it('should load a development config when --dev is passed', done => {
7+
const { stderr, stdout } = run(__dirname, ['--dev']);
8+
expect(stderr).toBeFalsy();
9+
expect(stdout).toBeTruthy();
10+
stat(resolve(__dirname, './bin/main.js'), (err, stats) => {
11+
expect(err).toBe(null);
12+
expect(stats.isFile()).toBe(true);
13+
done();
14+
});
15+
});
16+
17+
it('should load a development config when --mode=development is passed', done => {
18+
const { stderr, stdout } = run(__dirname, ['--mode', 'development']);
19+
expect(stderr).toBeFalsy();
20+
expect(stdout).toBeTruthy();
21+
stat(resolve(__dirname, './bin/main.js'), (err, stats) => {
22+
expect(err).toBe(null);
23+
expect(stats.isFile()).toBe(true);
24+
done();
25+
});
26+
});
27+
28+
it('should load a development config when --mode=development and --dev are passed', done => {
29+
const { stderr, stdout } = run(__dirname, ['--mode', 'development', '--dev']);
30+
expect(stderr).toContain('"mode" will be used');
31+
expect(stdout).toBeTruthy();
32+
33+
stat(resolve(__dirname, './bin/main.js'), (err, stats) => {
34+
expect(err).toBe(null);
35+
expect(stats.isFile()).toBe(true);
36+
done();
37+
});
38+
});
39+
40+
it('should load a development config when --mode=development and --prod are passed', done => {
41+
const { stderr, stdout } = run(__dirname, ['--mode', 'development', '--prod']);
42+
expect(stderr).toContain('"mode" will be used');
43+
expect(stdout).toBeTruthy();
44+
45+
stat(resolve(__dirname, './bin/main.js'), (err, stats) => {
46+
expect(err).toBe(null);
47+
expect(stats.isFile()).toBe(true);
48+
done();
49+
});
50+
});
51+
});

test/mode/dev/src/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('default');

test/mode/prod/prod.test.js

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
'use strict';
2+
const { run } = require('../../utils/test-utils');
3+
const { stat } = require('fs');
4+
const { resolve } = require('path');
5+
describe('mode flags', () => {
6+
it('should load a production config when --prod is passed', done => {
7+
const { stderr, stdout } = run(__dirname, ['--prod']);
8+
expect(stderr).toBeFalsy();
9+
expect(stdout).toBeTruthy();
10+
stat(resolve(__dirname, './bin/main.js'), (err, stats) => {
11+
expect(err).toBe(null);
12+
expect(stats.isFile()).toBe(true);
13+
done();
14+
});
15+
});
16+
17+
it('should load a production config when --mode=production is passed', done => {
18+
const { stderr, stdout } = run(__dirname, ['--mode', 'production']);
19+
expect(stderr).toBeFalsy();
20+
expect(stdout).toBeTruthy();
21+
stat(resolve(__dirname, './bin/main.js'), (err, stats) => {
22+
expect(err).toBe(null);
23+
expect(stats.isFile()).toBe(true);
24+
done();
25+
});
26+
});
27+
28+
it('should load a production config when --mode=production and --prod are passed', done => {
29+
const { stderr, stdout } = run(__dirname, ['--mode', 'production', '--prod']);
30+
expect(stderr).toContain('"mode" will be used');
31+
expect(stdout).toBeTruthy();
32+
33+
stat(resolve(__dirname, './bin/main.js'), (err, stats) => {
34+
expect(err).toBe(null);
35+
expect(stats.isFile()).toBe(true);
36+
done();
37+
});
38+
});
39+
40+
it('should load a production config when --mode=production and --dev are passed', done => {
41+
const { stderr, stdout } = run(__dirname, ['--mode', 'production', '--dev']);
42+
expect(stderr).toContain('"mode" will be used');
43+
expect(stdout).toBeTruthy();
44+
45+
stat(resolve(__dirname, './bin/main.js'), (err, stats) => {
46+
expect(err).toBe(null);
47+
expect(stats.isFile()).toBe(true);
48+
done();
49+
});
50+
});
51+
52+
it('should load a production config when passing --dev and --prod', done => {
53+
const { stderr, stdout } = run(__dirname, ['--prod', '--dev']);
54+
expect(stderr).toBeFalsy();
55+
expect(stdout).toBeTruthy();
56+
57+
stat(resolve(__dirname, './bin/main.js'), (err, stats) => {
58+
expect(err).toBe(null);
59+
expect(stats.isFile()).toBe(true);
60+
done();
61+
});
62+
});
63+
});

test/mode/prod/src/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('default');

yarn.lock

+7-7
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
invariant "^2.2.4"
1919
semver "^5.5.0"
2020

21-
"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.7.5":
21+
"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.7.5", "@babel/core@^7.8.4":
2222
version "7.8.4"
2323
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e"
2424
integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==
@@ -12094,10 +12094,10 @@ trim-off-newlines@^1.0.0:
1209412094
resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
1209512095
integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM=
1209612096

12097-
ts-jest@^24.1.0:
12098-
version "24.3.0"
12099-
resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.3.0.tgz#b97814e3eab359ea840a1ac112deae68aa440869"
12100-
integrity sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==
12097+
ts-jest@^25.2.1:
12098+
version "25.2.1"
12099+
resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.2.1.tgz#49bf05da26a8b7fbfbc36b4ae2fcdc2fef35c85d"
12100+
integrity sha512-TnntkEEjuXq/Gxpw7xToarmHbAafgCaAzOpnajnFC6jI7oo1trMzAHA04eWpc3MhV6+yvhE8uUBAmN+teRJh0A==
1210112101
dependencies:
1210212102
bs-logger "0.x"
1210312103
buffer-from "1.x"
@@ -12108,7 +12108,7 @@ ts-jest@^24.1.0:
1210812108
mkdirp "0.x"
1210912109
resolve "1.x"
1211012110
semver "^5.5"
12111-
yargs-parser "10.x"
12111+
yargs-parser "^16.1.0"
1211212112

1211312113
tslib@^1.8.1, tslib@^1.9.0:
1211412114
version "1.10.0"
@@ -13050,7 +13050,7 @@ yallist@^4.0.0:
1305013050
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
1305113051
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
1305213052

13053-
yargs-parser@10.x, yargs-parser@^10.0.0:
13053+
yargs-parser@^10.0.0:
1305413054
version "10.1.0"
1305513055
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
1305613056
integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==

0 commit comments

Comments
 (0)