diff --git a/packages/serve/__tests__/createConfig.test.ts b/packages/serve/__tests__/createConfig.test.ts deleted file mode 100644 index 199df84b4a1..00000000000 --- a/packages/serve/__tests__/createConfig.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -import createConfig from '../src/createConfig'; - -describe('createConfig', () => { - it('creates config with arguments', () => { - const args = { - hot: true, - openPage: 'main', - }; - expect(createConfig(args, false)).toEqual(args); - }); - - it('sets client object using clientLogging argument', () => { - const args = { - clientLogging: 'verbose', - }; - expect(createConfig(args, false)).toEqual({ - client: { - logging: 'verbose', - }, - }); - }); - - it('sets hot using hotOnly argument', () => { - const args = { - hotOnly: true, - }; - expect(createConfig(args, false)).toEqual({ - hotOnly: true, - }); - }); - - it('sets hot using hotOnly argument with devServer 4', () => { - const args = { - hotOnly: true, - }; - expect(createConfig(args, true)).toEqual({ - hot: 'only', - }); - }); - - it('overrides hot with hotOnly', () => { - const args = { - hot: true, - hotOnly: true, - }; - expect(createConfig(args, false)).toEqual({ - hot: true, - hotOnly: true, - }); - }); -}); diff --git a/packages/serve/src/createConfig.ts b/packages/serve/src/createConfig.ts deleted file mode 100644 index 0c60ccf6099..00000000000 --- a/packages/serve/src/createConfig.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { devServerOptionsType } from './types'; - -/** - * - * Creates a devServer config from CLI args - * - * @param {Object} args - devServer args - * @param {boolean} isDevServer4 - is devServer v4 - * - * @returns {Object} valid devServer options object - */ -export default function createConfig(args, isDevServer4): devServerOptionsType { - const options = { ...args }; - - if (options.clientLogging) { - options.client = { - logging: options.clientLogging, - }; - // clientLogging is not a valid devServer option - delete options.clientLogging; - } - if (isDevServer4 && options.hotOnly) { - options.hot = 'only'; - // hotOnly is not a valid devServer option - delete options.hotOnly; - } - - return options; -} diff --git a/packages/serve/src/startDevServer.ts b/packages/serve/src/startDevServer.ts index 945f74a45a1..5c372888435 100644 --- a/packages/serve/src/startDevServer.ts +++ b/packages/serve/src/startDevServer.ts @@ -1,6 +1,5 @@ import { utils } from 'webpack-cli'; -import createConfig from './createConfig'; import getDevServerOptions from './getDevServerOptions'; import mergeOptions from './mergeOptions'; @@ -15,7 +14,7 @@ const { logger } = utils; * * @returns {Object[]} array of resulting servers */ -export default function startDevServer(compiler, devServerArgs): object[] { +export default function startDevServer(compiler, cliOptions): object[] { let isDevServer4 = false, devServerVersion, Server; @@ -30,7 +29,6 @@ export default function startDevServer(compiler, devServerArgs): object[] { } isDevServer4 = devServerVersion.startsWith('4'); - const cliOptions = createConfig(devServerArgs, isDevServer4); const devServerOptions = getDevServerOptions(compiler); const servers = []; diff --git a/packages/webpack-cli/__tests__/arg-parser.test.js b/packages/webpack-cli/__tests__/arg-parser.test.js index f61aab4d3a3..60dc543030d 100644 --- a/packages/webpack-cli/__tests__/arg-parser.test.js +++ b/packages/webpack-cli/__tests__/arg-parser.test.js @@ -96,6 +96,16 @@ const basicOptions = [ multiple: true, description: 'multi flag', }, + { + name: 'processor-flag', + usage: '--processor-flag', + type: Boolean, + description: 'flag with processor', + processor(opts) { + opts.processed = opts.processorFlag; + delete opts.processorFlag; + }, + }, ]; const helpAndVersionOptions = basicOptions.slice(0); @@ -421,4 +431,14 @@ describe('arg-parser', () => { }); expect(warnMock.mock.calls.length).toEqual(0); }); + + it('parses --processor-flag', () => { + const res = argParser(basicOptions, ['--processor-flag'], true); + expect(res.unknownArgs.length).toEqual(0); + expect(res.opts).toEqual({ + processed: true, + stringFlagWithDefault: 'default-value', + }); + expect(warnMock.mock.calls.length).toEqual(0); + }); }); diff --git a/packages/webpack-cli/lib/utils/arg-parser.js b/packages/webpack-cli/lib/utils/arg-parser.js index 7cbab371fa3..708ff698b28 100644 --- a/packages/webpack-cli/lib/utils/arg-parser.js +++ b/packages/webpack-cli/lib/utils/arg-parser.js @@ -28,6 +28,7 @@ const argParser = (options, args, argsOnly = false, name = '') => { } const parser = new commander.Command(); + const processors = {}; // Set parser name parser.name(name); @@ -151,6 +152,15 @@ const argParser = (options, args, argsOnly = false, name = '') => { parserInstance.option(negatedFlag, `negates ${option.name}`).action(() => {}); } + if (option.processor) { + // camel-case + const attributeName = option.name.split('-').reduce((str, word) => { + return str + word[0].toUpperCase() + word.slice(1); + }); + + processors[attributeName] = option.processor; + } + return parserInstance; }, parser); @@ -192,6 +202,8 @@ const argParser = (options, args, argsOnly = false, name = '') => { Object.keys(opts).forEach((key) => { if (opts[key] === undefined) { delete opts[key]; + } else if (processors[key]) { + processors[key](opts); } });