@@ -17,7 +17,7 @@ const {
17
17
} = require ( '@vue/cli-shared-utils' )
18
18
const confirmIfGitDirty = require ( './util/confirmIfGitDirty' )
19
19
20
- async function add ( pluginName , options = { } , context = process . cwd ( ) ) {
20
+ async function add ( pluginToAdd , options = { } , context = process . cwd ( ) ) {
21
21
if ( ! ( await confirmIfGitDirty ( context ) ) ) {
22
22
return
23
23
}
@@ -26,24 +26,33 @@ async function add (pluginName, options = {}, context = process.cwd()) {
26
26
const servicePkg = loadModule ( '@vue/cli-service/package.json' , context )
27
27
if ( servicePkg && semver . satisfies ( servicePkg . version , '3.x' ) ) {
28
28
// special internal "plugins"
29
- if ( / ^ ( @ v u e \/ ) ? r o u t e r $ / . test ( pluginName ) ) {
29
+ if ( / ^ ( @ v u e \/ ) ? r o u t e r $ / . test ( pluginToAdd ) ) {
30
30
return addRouter ( context )
31
31
}
32
- if ( / ^ ( @ v u e \/ ) ? v u e x $ / . test ( pluginName ) ) {
32
+ if ( / ^ ( @ v u e \/ ) ? v u e x $ / . test ( pluginToAdd ) ) {
33
33
return addVuex ( context )
34
34
}
35
35
}
36
36
37
+ const pluginRe = / ^ ( @ ? [ ^ @ ] + ) (?: @ ( .+ ) ) ? $ /
38
+ const [
39
+ // eslint-disable-next-line
40
+ _skip ,
41
+ pluginName ,
42
+ pluginVersion
43
+ ] = pluginToAdd . match ( pluginRe )
37
44
const packageName = resolvePluginId ( pluginName )
38
45
39
46
log ( )
40
47
log ( `📦 Installing ${ chalk . cyan ( packageName ) } ...` )
41
48
log ( )
42
49
43
50
const pm = new PackageManager ( { context } )
44
- const { latestMinor } = await getVersions ( )
45
51
46
- if ( isOfficialPlugin ( packageName ) ) {
52
+ if ( pluginVersion ) {
53
+ await pm . add ( `${ packageName } @${ pluginVersion } ` )
54
+ } else if ( isOfficialPlugin ( packageName ) ) {
55
+ const { latestMinor } = await getVersions ( )
47
56
await pm . add ( `${ packageName } @~${ latestMinor } ` )
48
57
} else {
49
58
await pm . add ( packageName , { tilde : true } )
0 commit comments