diff --git a/packages/@vue/cli-service/__tests__/Service.spec.js b/packages/@vue/cli-service/__tests__/Service.spec.js index e399b9e607..0362e7257f 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 4fb59cd8a5..9fb354a2de 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 5f2e900fc6..6660168147 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",