From d7559d22de508f25307e25afe21d6f5c00af1a53 Mon Sep 17 00:00:00 2001 From: Anshuman Verma Date: Wed, 30 Sep 2020 15:58:25 +0530 Subject: [PATCH] migrate output group (#1832) * refactor: migrate output group * refactor: remove unused fn, simplify resolveOutput * chore: only assign filename when ext present --- .../webpack-cli/__tests__/OutputGroup.test.js | 14 ----- .../__tests__/resolveOutput.test.js | 10 ++++ .../webpack-cli/lib/groups/OutputGroup.js | 54 ------------------- .../webpack-cli/lib/groups/resolveOutput.js | 21 ++++++++ packages/webpack-cli/lib/utils/cli-flags.js | 4 -- .../webpack-cli/lib/utils/merge-strategies.js | 8 +++ packages/webpack-cli/lib/webpack-cli.js | 11 ++-- .../output-named-bundles.test.js | 11 ++-- 8 files changed, 46 insertions(+), 87 deletions(-) delete mode 100644 packages/webpack-cli/__tests__/OutputGroup.test.js create mode 100644 packages/webpack-cli/__tests__/resolveOutput.test.js delete mode 100644 packages/webpack-cli/lib/groups/OutputGroup.js create mode 100644 packages/webpack-cli/lib/groups/resolveOutput.js create mode 100644 packages/webpack-cli/lib/utils/merge-strategies.js diff --git a/packages/webpack-cli/__tests__/OutputGroup.test.js b/packages/webpack-cli/__tests__/OutputGroup.test.js deleted file mode 100644 index 6f57b90e939..00000000000 --- a/packages/webpack-cli/__tests__/OutputGroup.test.js +++ /dev/null @@ -1,14 +0,0 @@ -const OutputGroup = require('../lib/groups/OutputGroup'); - -describe('OutputGroup', function () { - it('should handle the output option', () => { - const group = new OutputGroup([ - { - output: './bundle.js', - }, - ]); - - const result = group.run(); - expect(result.options.output.filename).toEqual('bundle.js'); - }); -}); diff --git a/packages/webpack-cli/__tests__/resolveOutput.test.js b/packages/webpack-cli/__tests__/resolveOutput.test.js new file mode 100644 index 00000000000..1031f8d7e8f --- /dev/null +++ b/packages/webpack-cli/__tests__/resolveOutput.test.js @@ -0,0 +1,10 @@ +const resolveOutput = require('../lib/groups/resolveOutput'); + +describe('OutputGroup', function () { + it('should handle the output option', () => { + const result = resolveOutput({ + output: './bundle.js', + }); + expect(result.options.output.filename).toEqual('bundle.js'); + }); +}); diff --git a/packages/webpack-cli/lib/groups/OutputGroup.js b/packages/webpack-cli/lib/groups/OutputGroup.js deleted file mode 100644 index 31de0e6dd66..00000000000 --- a/packages/webpack-cli/lib/groups/OutputGroup.js +++ /dev/null @@ -1,54 +0,0 @@ -const path = require('path'); -const GroupHelper = require('../utils/GroupHelper'); -const logger = require('../utils/logger'); - -class OutputGroup extends GroupHelper { - constructor(options) { - super(options); - this.opts = { - options: { - output: {}, - }, - }; - - this.strategy = { - 'output.filename': 'prepend', - 'output.path': 'prepend', - }; - } - - parseDirectory(metaData) { - return { - // filename: DEFAULT_FILENAME, - path: path.resolve(metaData.dir, metaData.name), - }; - } - - resolveOptions() { - const { args } = this; - if (args) { - const { output } = args; - - if (!output) { - logger.warn( - "You provided an empty output value. Falling back to the output value of your webpack config file, or './dist/' if none was provided", - ); - return; - } - const outputInfo = path.parse(output); - if (!outputInfo.ext.length) { - this.opts.options.output = this.parseDirectory(outputInfo); - } else { - this.opts.options.output.path = path.resolve(outputInfo.dir); - this.opts.options.output.filename = outputInfo.base; - } - } - } - - run() { - this.resolveOptions(); - return this.opts; - } -} - -module.exports = OutputGroup; diff --git a/packages/webpack-cli/lib/groups/resolveOutput.js b/packages/webpack-cli/lib/groups/resolveOutput.js new file mode 100644 index 00000000000..c8fd64aaf35 --- /dev/null +++ b/packages/webpack-cli/lib/groups/resolveOutput.js @@ -0,0 +1,21 @@ +const path = require('path'); + +/** + * Resolves the output flag + * @param {args} args - Parsed arguments passed to the CLI + */ +const resolveOutput = (args) => { + const { output } = args; + const finalOptions = { + options: { output: {} }, + outputOptions: {}, + }; + if (output) { + const { dir, base, ext } = path.parse(output); + finalOptions.options.output.path = ext.length === 0 ? path.resolve(dir, base) : path.resolve(dir); + if (ext.length > 0) finalOptions.options.output.filename = base; + } + return finalOptions; +}; + +module.exports = resolveOutput; diff --git a/packages/webpack-cli/lib/utils/cli-flags.js b/packages/webpack-cli/lib/utils/cli-flags.js index 85f30cab7d8..865ded9326f 100644 --- a/packages/webpack-cli/lib/utils/cli-flags.js +++ b/packages/webpack-cli/lib/utils/cli-flags.js @@ -3,13 +3,11 @@ const cli = packageExists('webpack') ? require('webpack').cli : undefined; const HELP_GROUP = 'help'; const BASIC_GROUP = 'basic'; -const OUTPUT_GROUP = 'output'; const ADVANCED_GROUP = 'advanced'; const groups = { HELP_GROUP, BASIC_GROUP, - OUTPUT_GROUP, ADVANCED_GROUP, }; @@ -55,7 +53,6 @@ const commands = [ { name: 'output', type: String, - group: OUTPUT_GROUP, description: 'To get the output in specified format ( accept json or markdown )', }, ], @@ -123,7 +120,6 @@ const core = [ name: 'output', usage: '--output ', alias: 'o', - group: OUTPUT_GROUP, type: String, description: 'Output location of the file generated by webpack e.g. ./dist/', link: 'https://webpack.js.org/concepts/#output', diff --git a/packages/webpack-cli/lib/utils/merge-strategies.js b/packages/webpack-cli/lib/utils/merge-strategies.js new file mode 100644 index 00000000000..a1f64247c44 --- /dev/null +++ b/packages/webpack-cli/lib/utils/merge-strategies.js @@ -0,0 +1,8 @@ +const outputStrategy = { + 'output.filename': 'prepend', + 'output.path': 'prepend', +}; + +module.exports = { + outputStrategy, +}; diff --git a/packages/webpack-cli/lib/webpack-cli.js b/packages/webpack-cli/lib/webpack-cli.js index 7d27b8a38dc..8f08ae88a9d 100644 --- a/packages/webpack-cli/lib/webpack-cli.js +++ b/packages/webpack-cli/lib/webpack-cli.js @@ -3,17 +3,18 @@ const GroupHelper = require('./utils/GroupHelper'); const handleConfigResolution = require('./groups/ConfigGroup'); const resolveMode = require('./groups/resolveMode'); const resolveStats = require('./groups/resolveStats'); +const resolveOutput = require('./groups/resolveOutput'); const { Compiler } = require('./utils/Compiler'); const { groups, core } = require('./utils/cli-flags'); const webpackMerge = require('webpack-merge'); const { toKebabCase } = require('./utils/helpers'); const argParser = require('./utils/arg-parser'); +const { outputStrategy } = require('./utils/merge-strategies'); class WebpackCLI extends GroupHelper { constructor() { super(); this.groupMap = new Map(); - this.groups = []; this.args = {}; this.compilation = new Compiler(); this.defaultEntry = 'index'; @@ -120,12 +121,6 @@ class WebpackCLI extends GroupHelper { this.helpGroup = new HelpGroup(); break; } - case groups.OUTPUT_GROUP: { - const OutputGroup = require('./groups/OutputGroup'); - this.outputGroup = new OutputGroup(value); - this.groups.push(this.outputGroup); - break; - } } } } @@ -243,7 +238,7 @@ class WebpackCLI extends GroupHelper { .then(() => this._handleDefaultEntry()) .then(() => this._handleConfig(parsedArgs)) .then(() => this._baseResolver(resolveMode, parsedArgs, this.compilerConfiguration)) - .then(() => this._handleGroupHelper(this.outputGroup)) + .then(() => this._baseResolver(resolveOutput, parsedArgs, {}, outputStrategy)) .then(() => this._handleCoreFlags()) .then(() => this._handleGroupHelper(this.basicGroup)) .then(() => this._handleGroupHelper(this.advancedGroup)) diff --git a/test/output/named-bundles/output-named-bundles.test.js b/test/output/named-bundles/output-named-bundles.test.js index 003bcf30c7e..612fb8ae105 100644 --- a/test/output/named-bundles/output-named-bundles.test.js +++ b/test/output/named-bundles/output-named-bundles.test.js @@ -45,12 +45,9 @@ describe('output flag named bundles', () => { }); it('should output file in bin directory using default webpack config with warning for empty output value', () => { - const { stderr } = run(__dirname, ['--output='], false); - expect(stderr).toContain( - "You provided an empty output value. Falling back to the output value of your webpack config file, or './dist/' if none was provided", - ); - - const stats = statSync(resolve(__dirname, './bin/bundle.js')); - expect(stats.isFile()).toBe(true); + const { stdout, stderr, exitCode } = run(__dirname, ['--output'], false); + expect(stderr).toEqual("error: option '-o, --output ' argument missing"); + expect(exitCode).toEqual(1); + expect(stdout).toBeFalsy(); }); });