Skip to content

Commit 49e9cf2

Browse files
committed
refactor: use pluginResolution utils in more places, add tests
1 parent 983db9e commit 49e9cf2

File tree

5 files changed

+79
-12
lines changed

5 files changed

+79
-12
lines changed

packages/@vue/cli-service/lib/PluginAPI.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const path = require('path')
2+
const { matchesPluginId } = require('@vue/cli-shared-utils')
23

34
class PluginAPI {
45
/**
@@ -27,10 +28,7 @@ class PluginAPI {
2728
* @return {boolean}
2829
*/
2930
hasPlugin (id) {
30-
const prefixRE = /^(@vue\/|vue-)cli-plugin-/
31-
return this.service.plugins.some(p => {
32-
return p.id === id || p.id.replace(prefixRE, '') === id
33-
})
31+
return this.service.plugins.some(p => matchesPluginId(id, p.id))
3432
}
3533

3634
/**
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
const {
2+
isPlugin,
3+
isOfficialPlugin,
4+
toShortPluginId,
5+
resolvePluginId,
6+
matchesPluginId
7+
} = require('../lib/pluginResolution')
8+
9+
test('isPlugin', () => {
10+
expect(isPlugin('foobar')).toBe(false)
11+
expect(isPlugin('@vue/cli-plugin-foo')).toBe(true)
12+
expect(isPlugin('vue-cli-plugin-foo')).toBe(true)
13+
expect(isPlugin('@foo/vue-cli-plugin-foo')).toBe(true)
14+
})
15+
16+
test('isOfficialPlugin', () => {
17+
expect(isOfficialPlugin('@vue/foo')).toBe(false)
18+
expect(isOfficialPlugin('@vue/cli-plugin-foo')).toBe(true)
19+
expect(isOfficialPlugin('vue-cli-plugin-foo')).toBe(false)
20+
expect(isOfficialPlugin('@foo/vue-cli-plugin-foo')).toBe(false)
21+
})
22+
23+
test('toShortPluginId', () => {
24+
expect(toShortPluginId('@vue/cli-plugin-foo')).toBe('foo')
25+
expect(toShortPluginId('vue-cli-plugin-foo')).toBe('foo')
26+
expect(toShortPluginId('@foo/vue-cli-plugin-foo')).toBe('foo')
27+
})
28+
29+
test('resolvePluginId', () => {
30+
// already full
31+
expect(resolvePluginId('@vue/cli-plugin-foo')).toBe('@vue/cli-plugin-foo')
32+
expect(resolvePluginId('vue-cli-plugin-foo')).toBe('vue-cli-plugin-foo')
33+
expect(resolvePluginId('@foo/vue-cli-plugin-foo')).toBe('@foo/vue-cli-plugin-foo')
34+
35+
// scoped short
36+
expect(resolvePluginId('@vue/foo')).toBe('@vue/cli-plugin-foo')
37+
expect(resolvePluginId('@foo/foo')).toBe('@foo/vue-cli-plugin-foo')
38+
39+
// default short
40+
expect(resolvePluginId('foo')).toBe('vue-cli-plugin-foo')
41+
})
42+
43+
test('matchesPluginId', () => {
44+
// full
45+
expect(matchesPluginId('@vue/cli-plugin-foo', '@vue/cli-plugin-foo')).toBe(true)
46+
expect(matchesPluginId('vue-cli-plugin-foo', 'vue-cli-plugin-foo')).toBe(true)
47+
expect(matchesPluginId('@foo/vue-cli-plugin-foo', '@foo/vue-cli-plugin-foo')).toBe(true)
48+
49+
// short without scope
50+
expect(matchesPluginId('foo', '@vue/cli-plugin-foo')).toBe(true)
51+
expect(matchesPluginId('foo', 'vue-cli-plugin-foo')).toBe(true)
52+
expect(matchesPluginId('foo', '@foo/vue-cli-plugin-foo')).toBe(true)
53+
54+
// short with scope
55+
expect(matchesPluginId('@vue/foo', '@vue/cli-plugin-foo')).toBe(true)
56+
expect(matchesPluginId('@foo/foo', '@foo/vue-cli-plugin-foo')).toBe(true)
57+
})

packages/@vue/cli-shared-utils/lib/pluginResolution.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
const pluginRE = /^(@vue\/|vue-|@[\w-]+\/vue-)cli-plugin-/
22
const scopeRE = /^@[\w-]+\//
3+
const officialRE = /^@vue\//
34

45
exports.isPlugin = id => pluginRE.test(id)
56

6-
exports.isOfficialPlugin = id => /^@vue\//.test(id)
7+
exports.isOfficialPlugin = id => exports.isPlugin(id) && officialRE.test(id)
78

89
exports.toShortPluginId = id => id.replace(pluginRE, '')
910

@@ -18,11 +19,24 @@ exports.resolvePluginId = id => {
1819
if (id.charAt(0) === '@') {
1920
const scopeMatch = id.match(scopeRE)
2021
if (scopeMatch) {
22+
const scope = scopeMatch[0]
2123
const shortId = id.replace(scopeRE, '')
22-
return `${scopeMatch[0]}vue-cli-plugin-${shortId}`
24+
return `${scope}${scope === '@vue/' ? `` : `vue-`}cli-plugin-${shortId}`
2325
}
2426
}
2527
// default short
2628
// e.g. foo
2729
return `vue-cli-plugin-${id}`
2830
}
31+
32+
exports.matchesPluginId = (input, full) => {
33+
const short = full.replace(pluginRE, '')
34+
return (
35+
// input is full
36+
full === input ||
37+
// input is short without scope
38+
short === input ||
39+
// input is short with scope
40+
short === input.replace(scopeRE, '')
41+
)
42+
}

packages/@vue/cli/lib/Generator.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const GeneratorAPI = require('./GeneratorAPI')
55
const sortObject = require('./util/sortObject')
66
const writeFileTree = require('./util/writeFileTree')
77
const configTransforms = require('./util/configTransforms')
8-
const { toShortPluginId } = require('@vue/cli-shared-utils')
8+
const { toShortPluginId, matchesPluginId } = require('@vue/cli-shared-utils')
99

1010
const logger = require('@vue/cli-shared-utils/lib/logger')
1111
const logTypes = {
@@ -138,14 +138,11 @@ module.exports = class Generator {
138138
}
139139

140140
hasPlugin (_id) {
141-
const prefixRE = /^(@vue\/|vue-)cli-plugin-/
142141
return [
143142
...this.plugins.map(p => p.id),
144143
...Object.keys(this.pkg.devDependencies || {}),
145144
...Object.keys(this.pkg.dependencies || {})
146-
].some(id => {
147-
return id === _id || id.replace(prefixRE, '') === _id
148-
})
145+
].some(id => matchesPluginId(_id, id))
149146
}
150147

151148
printExitLogs () {

packages/@vue/cli/lib/util/formatFeatures.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const chalk = require('chalk')
2+
const { toShortPluginId } = require('@vue/cli-shared-utils')
23

34
module.exports = function formatFeatures (preset, lead, joiner) {
45
const features = []
@@ -16,7 +17,7 @@ module.exports = function formatFeatures (preset, lead, joiner) {
1617
})
1718
features.push.apply(features, plugins)
1819
return features.map(dep => {
19-
dep = dep.replace(/^(@vue\/|vue-)cli-plugin-/, '')
20+
dep = toShortPluginId(dep)
2021
return `${lead || ''}${chalk.yellow(dep)}`
2122
}).join(joiner || ', ')
2223
}

0 commit comments

Comments
 (0)