From a5754108f395705567dd563896ab414f7eaeccf7 Mon Sep 17 00:00:00 2001 From: githoniel Date: Mon, 21 Dec 2020 17:16:17 +0800 Subject: [PATCH 1/2] feat(cli-service): support plugin to inject process-env before load config file --- .../cli-service/__tests__/Service.spec.js | 20 +++++++++++++++++++ packages/@vue/cli-service/lib/Service.js | 15 +++++++++++++- packages/@vue/cli-service/package.json | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/@vue/cli-service/__tests__/Service.spec.js b/packages/@vue/cli-service/__tests__/Service.spec.js index ff61db0700..ea8963ecbb 100644 --- a/packages/@vue/cli-service/__tests__/Service.spec.js +++ b/packages/@vue/cli-service/__tests__/Service.spec.js @@ -247,6 +247,26 @@ test('api: defaultModes', () => { } createMockService([plugin2], false /* init */).run('test') + + delete process.env.NODE_ENV + delete process.env.BABEL_ENV + + const plugin3 = { + id: 'test-defaultModes', + apply: api => { + expect(process.env.NODE_ENV).toBe('test') + expect(process.env.BABEL_ENV).toBe('test') + expect(process.env.TEST_ENV).toBe('test-env') + api.registerCommand('bar', () => {}) + } + } + plugin3.apply.defaultModes = { + bar: ['test', { + TEST_ENV: 'test-env' + }] + } + + createMockService([plugin3], false /* init */).run('bar') }) test('api: chainWebpack', () => { diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index b07fa77be5..4002ac9822 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -1,6 +1,7 @@ const fs = require('fs') const path = require('path') const debug = require('debug') +const arrify = require('arrify') const { merge } = require('webpack-merge') const Config = require('webpack-chain') const PluginAPI = require('./PluginAPI') @@ -39,7 +40,19 @@ module.exports = class Service { // this is provided by plugins as module.exports.defaultModes // so we can get the information without actually applying the plugin. this.modes = this.plugins.reduce((modes, { apply: { defaultModes }}) => { - return Object.assign(modes, defaultModes) + Object.keys(defaultModes || {}).forEach((cmd) => { + const [mode, extendEnv] = arrify(defaultModes[cmd]) + Object.assign(modes, { + [cmd]: mode + }) + // allow plugin to set addtional process.env + if (extendEnv) { + Object.keys(extendEnv).forEach((envKey) => { + process.env[envKey] = extendEnv[envKey] + }) + } + }) + return modes }, {}) } diff --git a/packages/@vue/cli-service/package.json b/packages/@vue/cli-service/package.json index ac98b931c2..3efb0147b3 100644 --- a/packages/@vue/cli-service/package.json +++ b/packages/@vue/cli-service/package.json @@ -37,6 +37,7 @@ "acorn": "^8.0.1", "acorn-walk": "^8.0.0", "address": "^1.1.2", + "arrify": "^2.0.1", "autoprefixer": "^10.1.0", "browserslist": "^4.16.0", "cache-loader": "^4.1.0", From 561ae123b026c8f43465d851f954c26b38ea874d Mon Sep 17 00:00:00 2001 From: githoniel Date: Mon, 11 Jan 2021 10:19:21 +0800 Subject: [PATCH 2/2] chore(cli-service): fix eslint --- packages/@vue/cli-service/lib/Service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index 4002ac9822..9fb354a2de 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -39,7 +39,7 @@ module.exports = class Service { // resolve the default mode to use for each command // this is provided by plugins as module.exports.defaultModes // so we can get the information without actually applying the plugin. - this.modes = this.plugins.reduce((modes, { apply: { defaultModes }}) => { + this.modes = this.plugins.reduce((modes, { apply: { defaultModes } }) => { Object.keys(defaultModes || {}).forEach((cmd) => { const [mode, extendEnv] = arrify(defaultModes[cmd]) Object.assign(modes, {