diff --git a/packages/@vue/cli-service/__tests__/Service.spec.js b/packages/@vue/cli-service/__tests__/Service.spec.js index dfd6cc005..1cc9c72a8 100644 --- a/packages/@vue/cli-service/__tests__/Service.spec.js +++ b/packages/@vue/cli-service/__tests__/Service.spec.js @@ -233,6 +233,28 @@ test('api: configureWebpack returning object', () => { expect(config.output.path).toBe('test-dist-3') }) +test('api: configureWebpack preserve ruleNames', () => { + const service = createMockService([ + { + id: 'babel', + apply: require('@vue/cli-plugin-babel') + }, + { + id: 'test', + apply: api => { + api.configureWebpack({ + module: { + rules: [] + } + }) + } + } + ]) + + const config = service.resolveWebpackConfig() + expect(config.module.rules[0].__ruleNames).toEqual(['js']) +}) + test('api: configureDevServer', () => { const cb = () => {} const service = createMockService([{ diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index 07ebe142c..5dc9df3f5 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -234,8 +234,8 @@ module.exports = class Service { // vue inspect works properly. if (config !== original) { cloneRuleNames( - config.module.rules, - original.module.rules + config.module && config.module.rules, + original.module && original.module.rules ) } @@ -352,14 +352,15 @@ function removeSlash (config, key) { } function cloneRuleNames (to, from) { + if (!to || !from) { + return + } from.forEach((r, i) => { if (to[i]) { Object.defineProperty(to[i], '__ruleNames', { value: r.__ruleNames }) - if (to[i].oneOf && r.oneOf) { - cloneRuleNames(to[i].oneOf, r.oneOf) - } + cloneRuleNames(to[i].oneOf, r.oneOf) } }) }