From 868d0c554a67eca68ebb75e799071df21696a7d3 Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Fri, 28 Jan 2022 17:35:29 +0100 Subject: [PATCH 1/3] feat: remove skip-plugins from arguments --- packages/@vue/cli-service/lib/Service.js | 30 ++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index 65e06d0855..f3b811663d 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -141,13 +141,29 @@ module.exports = class Service { } } - setPluginsToSkip (args) { - const skipPlugins = args['skip-plugins'] - const pluginsToSkip = skipPlugins - ? new Set(skipPlugins.split(',').map(id => resolvePluginId(id))) - : new Set() - + setPluginsToSkip (args, rawArgv) { + let skipPlugins = args['skip-plugins'] + const pluginsToSkip = new Set() + if (skipPlugins) { + // When only one appearence, convert to array to prevent duplicate code + if (!Array.isArray(skipPlugins)) { + skipPlugins = Array.from([skipPlugins]) + } + // Iter over all --skip-plugins appearences + for (const value of skipPlugins.values()) { + for (const plugin of value.split(',').map(id => resolvePluginId(id))) { + pluginsToSkip.add(plugin) + } + } + } this.pluginsToSkip = pluginsToSkip + + delete args['skip-plugins'] + // Delete all --skip-plugin appearences + let index + while ((index = rawArgv.indexOf('--skip-plugins')) > -1) { + rawArgv.splice(index, 2) // Remove the argument and its value + } } resolvePlugins (inlinePlugins, useBuiltIn) { @@ -225,7 +241,7 @@ module.exports = class Service { const mode = args.mode || (name === 'build' && args.watch ? 'development' : this.modes[name]) // --skip-plugins arg may have plugins that should be skipped during init() - this.setPluginsToSkip(args) + this.setPluginsToSkip(args, rawArgv) // load env variables, load user config, apply plugins await this.init(mode) From 7a3617eeb9cee4ddf02b54872d8dda43c9a04760 Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Fri, 28 Jan 2022 17:39:34 +0100 Subject: [PATCH 2/3] docs: update skipping plugins --- docs/guide/cli-service.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/cli-service.md b/docs/guide/cli-service.md index c76a697e78..84e2dc1040 100644 --- a/docs/guide/cli-service.md +++ b/docs/guide/cli-service.md @@ -135,10 +135,10 @@ npx vue-cli-service build --skip-plugins pwa This option is available for _every_ `vue-cli-service` command, including custom ones added by other plugins. ::: -You can skip multiple plugins by passing their names as a comma-separated list: +You can skip multiple plugins by passing their names as a comma-separated list or by repeating the argument: ```bash -npx vue-cli-service build --skip-plugins pwa,apollo +npx vue-cli-service build --skip-plugins pwa,apollo --skip-plugins eslint ``` Plugin names are resolved the same way they are during install, as described [here](./plugins-and-presets.md#installing-plugins-in-an-existing-project) From 6f76898a84695df7ac60449ab68c7b7c01350be4 Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Fri, 28 Jan 2022 18:16:01 +0100 Subject: [PATCH 3/3] test: extra tests for --skip-plugins --- .../cli-service/__tests__/Service.spec.js | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/packages/@vue/cli-service/__tests__/Service.spec.js b/packages/@vue/cli-service/__tests__/Service.spec.js index 1f8e219d84..a8077e13f2 100644 --- a/packages/@vue/cli-service/__tests__/Service.spec.js +++ b/packages/@vue/cli-service/__tests__/Service.spec.js @@ -208,6 +208,62 @@ test('api: --skip-plugins', async () => { expect(untouched).toEqual(true) }) +describe('internal: gather pluginsToSkip and cleanup args', () => { + let resultingArgs, resultingRawArgv + + const testCommand = { + id: 'test-command', + apply: api => { + api.registerCommand('foo', (_args, _rawArgv) => { + resultingArgs = _args + resultingRawArgv = _rawArgv + }) + } + } + const plugin1 = { + id: 'vue-cli-plugin-test-plugin1', + apply: api => { + } + } + + test('Single --skip-plugins', async () => { + const service = await createMockService([ + testCommand, + plugin1 + ], false) + const args = { 'skip-plugins': 'test-plugin1' } + const rawArgv = ['foo', '--skip-plugins', 'test-plugin1'] + await service.run('foo', args, rawArgv) + expect(resultingArgs).toEqual({ '_': [] }) + expect(resultingRawArgv).toEqual([]) + expect(...service.pluginsToSkip).toEqual('vue-cli-plugin-test-plugin1') + }) + + resultingArgs = resultingRawArgv = undefined + test('Multiple --skip-plugins', async () => { + const service = await createMockService([ + testCommand, + plugin1, + { + id: 'vue-cli-plugin-test-plugin2', + apply: api => { + } + }, + { + id: 'vue-cli-plugin-test-plugin3', + apply: api => { + } + } + ], false) + const args = { 'skip-plugins': ['test-plugin1,test-plugin2', 'test-plugin3'] } + const rawArgv = ['foo', '--skip-plugins', 'test-plugin1,test-plugin2', '--skip-plugins', 'test-plugin3'] + await service.run('foo', args, rawArgv) + expect(resultingArgs).toEqual({ '_': [] }) + expect(resultingRawArgv).toEqual([]) + expect([...service.pluginsToSkip].sort()).toEqual(['vue-cli-plugin-test-plugin1', 'vue-cli-plugin-test-plugin2', 'vue-cli-plugin-test-plugin3']) + }) +}) + test('api: defaultModes', async () => { fs.writeFileSync('/.env.foo', `FOO=5\nBAR=6`) fs.writeFileSync('/.env.foo.local', `FOO=7\nBAZ=8`)