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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy