Skip to content

Commit

Permalink
refactor: move zero-config from group design (#1820)
Browse files Browse the repository at this point in the history
* refactor: move zero-config group to pure function

* tests: prefer supplied mode over NODE_ENV

* tests: fix

* chore: add tests for config mode
  • Loading branch information
anshumanv authored Sep 23, 2020
1 parent 3a38f99 commit 134c77a
Show file tree
Hide file tree
Showing 9 changed files with 69 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ Object {
"webpackArgs": Object {
"color": true,
"hot": true,
"mode": "production",
},
}
`;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,41 +1,42 @@
const ZeroConfigGroup = require('../lib/groups/ZeroConfigGroup');
const resolveMode = require('../lib/groups/resolveMode');

describe('ZeroConfigGroup', function () {
describe('resolveMode', function () {
it('should handle the mode option [production]', () => {
const group = new ZeroConfigGroup([
{
mode: 'production',
},
]);
const result = group.run();
const result = resolveMode({
mode: 'production',
});
// ensure no other properties are added
expect(result.options).toMatchObject({ mode: 'production' });
expect(result.options.mode).toEqual('production');
});

it('should handle the mode option [development]', () => {
const group = new ZeroConfigGroup([
{
mode: 'development',
},
]);
const result = resolveMode({
mode: 'development',
});

const result = group.run();
// ensure no other properties are added
expect(result.options).toMatchObject({ mode: 'development' });
expect(result.options.mode).toEqual('development');
});

it('should handle the mode option [none]', () => {
const group = new ZeroConfigGroup([
{
mode: 'none',
},
]);
const result = resolveMode({
mode: 'none',
});

const result = group.run();
// ensure no other properties are added
expect(result.options).toMatchObject({ mode: 'none' });
expect(result.options.mode).toEqual('none');
});

it('should prefer supplied move over NODE_ENV', () => {
process.env.NODE_ENV = 'production';
const result = resolveMode({
mode: 'development',
});

// ensure no other properties are added
expect(result.options).toMatchObject({ mode: 'development' });
});
});
33 changes: 0 additions & 33 deletions packages/webpack-cli/lib/groups/ZeroConfigGroup.js

This file was deleted.

26 changes: 26 additions & 0 deletions packages/webpack-cli/lib/groups/resolveMode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const PRODUCTION = 'production';
const DEVELOPMENT = 'development';

const resolveMode = (args) => {
const {
env: { NODE_ENV },
} = process;
const { mode } = args;

let finalMode;
/**
* It determines the mode to pass to webpack compiler
* @returns {string} The mode
*/
if (!mode && NODE_ENV && (NODE_ENV === PRODUCTION || NODE_ENV === DEVELOPMENT)) {
finalMode = NODE_ENV;
} else {
finalMode = mode || PRODUCTION;
}

return {
options: { mode: finalMode },
};
};

module.exports = resolveMode;
2 changes: 0 additions & 2 deletions packages/webpack-cli/lib/utils/cli-flags.js
Original file line number Diff line number Diff line change
Expand Up @@ -195,8 +195,6 @@ const core = [
name: 'mode',
usage: '--mode <development | production | none>',
type: String,
group: ZERO_CONFIG_GROUP,
defaultValue: 'production',
description: 'Defines the mode to pass to webpack',
link: 'https://webpack.js.org/concepts/#mode',
},
Expand Down
14 changes: 8 additions & 6 deletions packages/webpack-cli/lib/webpack-cli.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const { options } = require('colorette');
const GroupHelper = require('./utils/GroupHelper');
const handleConfigResolution = require('./groups/ConfigGroup');
const resolveMode = require('./groups/resolveMode');
const { Compiler } = require('./utils/Compiler');
const { groups, core } = require('./utils/cli-flags');
const webpackMerge = require('webpack-merge');
Expand Down Expand Up @@ -76,6 +77,12 @@ class WebpackCLI extends GroupHelper {
this._mergeOptionsToOutputConfiguration(resolvedConfig.outputOptions);
}

async _baseResolver(cb, parsedArgs) {
const resolvedConfig = cb(parsedArgs);
this._mergeOptionsToConfiguration(resolvedConfig.options);
this._mergeOptionsToOutputConfiguration(resolvedConfig.outputOptions);
}

/**
* Expose commander argParser
* @param {...any} args args for argParser
Expand All @@ -97,11 +104,6 @@ class WebpackCLI extends GroupHelper {
resolveGroups() {
for (const [key, value] of this.groupMap.entries()) {
switch (key) {
case groups.ZERO_CONFIG_GROUP: {
const ZeroConfigGroup = require('./groups/ZeroConfigGroup');
this.zeroConfigGroup = new ZeroConfigGroup(value);
break;
}
case groups.BASIC_GROUP: {
const BasicGroup = require('./groups/BasicGroup');
this.basicGroup = new BasicGroup(value);
Expand Down Expand Up @@ -227,7 +229,7 @@ class WebpackCLI extends GroupHelper {
*/
async runOptionGroups(parsedArgs) {
await Promise.resolve()
.then(() => this._handleGroupHelper(this.zeroConfigGroup))
.then(() => this._baseResolver(resolveMode, parsedArgs))
.then(() => this._handleDefaultEntry())
.then(() => this._handleConfig(parsedArgs))
.then(() => this._handleGroupHelper(this.outputGroup))
Expand Down
File renamed without changes.
7 changes: 7 additions & 0 deletions test/mode/mode-with-config/mode-with-config.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,11 @@ describe('mode flags with config', () => {
done();
});
});

it('should use mode from config over flags', () => {
const { stdout, stderr, exitCode } = run(__dirname, ['--mode', 'production', '-c', 'webpack.config2.js']);
expect(stderr).toBeFalsy();
expect(exitCode).toEqual(0);
expect(stdout).toContain(`mode: 'development'`);
});
});
7 changes: 7 additions & 0 deletions test/mode/mode-with-config/webpack.config2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// eslint-disable-next-line node/no-unpublished-require
const WebpackCLITestPlugin = require('../../utils/webpack-cli-test-plugin');

module.exports = {
mode: 'development',
plugins: [new WebpackCLITestPlugin()],
};

0 comments on commit 134c77a

Please sign in to comment.