Skip to content

Commit 6f49e96

Browse files
authored
refactor: migrate basic group (#1837)
* refactor: migrate basic group * chore: rm stale utils, pass entry directly * tests: add test for cjs entry * tests: fix tests
1 parent 55d0bd8 commit 6f49e96

7 files changed

Lines changed: 74 additions & 113 deletions

File tree

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

Lines changed: 0 additions & 57 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const { core, groups } = require('../utils/cli-flags');
2+
3+
const WEBPACK_OPTION_FLAGS = core
4+
.filter((coreFlag) => {
5+
return coreFlag.group === groups.BASIC_GROUP;
6+
})
7+
.reduce((result, flagObject) => {
8+
result.push(flagObject.name);
9+
if (flagObject.alias) {
10+
result.push(flagObject.alias);
11+
}
12+
return result;
13+
}, []);
14+
15+
function resolveArgs(args) {
16+
const finalOptions = {
17+
options: {},
18+
outputOptions: {},
19+
};
20+
Object.keys(args).forEach((arg) => {
21+
if (WEBPACK_OPTION_FLAGS.includes(arg)) {
22+
finalOptions.outputOptions[arg] = args[arg];
23+
}
24+
if (arg === 'devtool') {
25+
finalOptions.options.devtool = args[arg];
26+
}
27+
if (arg === 'name') {
28+
finalOptions.options.name = args[arg];
29+
}
30+
if (arg === 'watch') {
31+
finalOptions.options.watch = true;
32+
}
33+
if (arg === 'entry') {
34+
finalOptions.options[arg] = args[arg];
35+
}
36+
});
37+
return finalOptions;
38+
}
39+
40+
module.exports = resolveArgs;

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

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
const { resolve, join } = require('path');
2-
const { existsSync } = require('fs');
31
const { arrayToObject } = require('../utils/arg-utils');
42

53
class GroupHelper {
@@ -12,36 +10,6 @@ class GroupHelper {
1210
this.strategy = undefined;
1311
}
1412

15-
resolveFilePath(filename = '', defaultValue) {
16-
if (filename && Array.isArray(filename)) {
17-
return filename.map((fp) => this.resolveFilePath(fp, defaultValue)).filter((e) => e);
18-
}
19-
if (filename && !filename.includes('.js')) {
20-
filename = filename + '.js';
21-
}
22-
if (defaultValue && !defaultValue.includes('.js')) {
23-
defaultValue = defaultValue + '.js';
24-
}
25-
let configPath;
26-
const predefinedConfigPath = filename ? resolve(process.cwd(), filename) : undefined;
27-
const configPathExists = predefinedConfigPath ? existsSync(predefinedConfigPath) : undefined;
28-
29-
if (!configPathExists) {
30-
const LOOKUP_PATHS = [`${filename}`, `src/${filename}`, ...(defaultValue ? [defaultValue, `src/${defaultValue}`] : [])];
31-
32-
if (filename) {
33-
LOOKUP_PATHS.unshift(filename);
34-
}
35-
LOOKUP_PATHS.forEach((p) => {
36-
const lookUpPath = join(process.cwd(), ...p.split('/'));
37-
if (existsSync(lookUpPath) && !configPath) {
38-
configPath = lookUpPath;
39-
}
40-
});
41-
}
42-
return configPathExists ? predefinedConfigPath : configPath;
43-
}
44-
4513
run() {
4614
throw new Error('You must implement the "run" function');
4715
}

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

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1+
const path = require('path');
2+
const { existsSync } = require('fs');
13
const { options } = require('colorette');
4+
const webpackMerge = require('webpack-merge');
25
const GroupHelper = require('./utils/GroupHelper');
36
const handleConfigResolution = require('./groups/ConfigGroup');
47
const resolveMode = require('./groups/resolveMode');
58
const resolveStats = require('./groups/resolveStats');
69
const resolveOutput = require('./groups/resolveOutput');
710
const { Compiler } = require('./utils/Compiler');
811
const { groups, core } = require('./utils/cli-flags');
9-
const webpackMerge = require('webpack-merge');
12+
const basicResolver = require('./groups/basicResolver');
1013
const { toKebabCase } = require('./utils/helpers');
1114
const argParser = require('./utils/arg-parser');
1215
const { outputStrategy } = require('./utils/merge-strategies');
@@ -17,16 +20,6 @@ class WebpackCLI extends GroupHelper {
1720
this.groupMap = new Map();
1821
this.args = {};
1922
this.compilation = new Compiler();
20-
this.defaultEntry = 'index';
21-
this.possibleFileNames = [
22-
`./${this.defaultEntry}`,
23-
`./${this.defaultEntry}.js`,
24-
`${this.defaultEntry}.js`,
25-
this.defaultEntry,
26-
`./src/${this.defaultEntry}`,
27-
`./src/${this.defaultEntry}.js`,
28-
`src/${this.defaultEntry}.js`,
29-
];
3023
this.compilerConfiguration = {};
3124
this.outputConfiguration = {};
3225
}
@@ -106,11 +99,6 @@ class WebpackCLI extends GroupHelper {
10699
resolveGroups() {
107100
for (const [key, value] of this.groupMap.entries()) {
108101
switch (key) {
109-
case groups.BASIC_GROUP: {
110-
const BasicGroup = require('./groups/BasicGroup');
111-
this.basicGroup = new BasicGroup(value);
112-
break;
113-
}
114102
case groups.ADVANCED_GROUP: {
115103
const AdvancedGroup = require('./groups/AdvancedGroup');
116104
this.advancedGroup = new AdvancedGroup(value);
@@ -217,11 +205,13 @@ class WebpackCLI extends GroupHelper {
217205
* @returns {void}
218206
*/
219207
_handleDefaultEntry() {
220-
if (!this.basicGroup) {
221-
const BasicGroup = require('./groups/BasicGroup');
222-
this.basicGroup = new BasicGroup();
208+
let defaultEntry;
209+
const rootIndexPath = path.resolve('index.js');
210+
if (existsSync(rootIndexPath)) {
211+
defaultEntry = './index.js';
212+
} else {
213+
defaultEntry = './src/index.js';
223214
}
224-
const defaultEntry = this.basicGroup.resolveFilePath(null, 'index.js');
225215
const options = { entry: defaultEntry };
226216
this._mergeOptionsToConfiguration(options);
227217
}
@@ -240,7 +230,7 @@ class WebpackCLI extends GroupHelper {
240230
.then(() => this._baseResolver(resolveMode, parsedArgs, this.compilerConfiguration))
241231
.then(() => this._baseResolver(resolveOutput, parsedArgs, {}, outputStrategy))
242232
.then(() => this._handleCoreFlags())
243-
.then(() => this._handleGroupHelper(this.basicGroup))
233+
.then(() => this._baseResolver(basicResolver, parsedArgs))
244234
.then(() => this._handleGroupHelper(this.advancedGroup))
245235
.then(() => this._baseResolver(resolveStats, parsedArgs))
246236
.then(() => this._handleGroupHelper(this.helpGroup));

test/entry/flag-entry/entry-with-flag.test.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,23 @@ const { stat, readFile } = require('fs');
55
const { resolve } = require('path');
66

77
describe('entry flag', () => {
8+
it('should resolve the path to src/index.cjs', (done) => {
9+
const { stderr, stdout } = run(__dirname, ['--entry', './src/index.cjs', '-o', './dist/'], false);
10+
expect(stderr).toBeFalsy();
11+
expect(stdout).toBeTruthy();
12+
13+
stat(resolve(__dirname, './dist/main.js'), (err, stats) => {
14+
expect(err).toBe(null);
15+
expect(stats.isFile()).toBe(true);
16+
done();
17+
});
18+
readFile(resolve(__dirname, './dist/main.js'), 'utf-8', (err, data) => {
19+
expect(err).toBe(null);
20+
expect(data).toContain('Kazuya Miyuki');
21+
done();
22+
});
23+
});
24+
825
it('should load ./src/a.js as entry', (done) => {
926
const { stderr, stdout } = run(__dirname, ['--entry', './src/a.js']);
1027
expect(stderr).toBeFalsy();
@@ -40,7 +57,9 @@ describe('entry flag', () => {
4057
});
4158

4259
it('should throw error for invalid entry file', () => {
43-
const { stderr } = run(__dirname, ['--entry', './src/test.js']);
44-
expect(stderr).toContain('Error: you provided an invalid entry point.');
60+
const { stdout, stderr, exitCode } = run(__dirname, ['--entry', './src/test.js']);
61+
expect(stdout).toContain("Module not found: Error: Can't resolve");
62+
expect(exitCode).toEqual(1);
63+
expect(stderr).toBeFalsy();
4564
});
4665
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('Kazuya Miyuki');

test/zero-config/entry-absent/zero-config.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ describe('Zero Config tests', () => {
44
it('runs when config and entry are both absent', () => {
55
const { stdout, stderr } = run(__dirname, [], false);
66
// Entry file is absent, should log the Error from the compiler
7-
expect(stdout).toContain("Error: Can't resolve './src'");
7+
expect(stdout).toContain("Error: Can't resolve './src/index.js'");
88
expect(stderr).toBeFalsy();
99
});
1010
});

0 commit comments

Comments
 (0)