@@ -2,6 +2,7 @@ const fs = require('fs')
2
2
const path = require ( 'path' )
3
3
const LRU = require ( 'lru-cache' )
4
4
const semver = require ( 'semver' )
5
+ const execa = require ( 'execa' )
5
6
// Connectors
6
7
const cwd = require ( './cwd' )
7
8
const folders = require ( './folders' )
@@ -10,7 +11,7 @@ const logs = require('./logs')
10
11
// Context
11
12
const getContext = require ( '../context' )
12
13
// Utils
13
- const { isPlugin } = require ( '@vue/cli-shared-utils' )
14
+ const { isPlugin, hasYarn } = require ( '@vue/cli-shared-utils' )
14
15
const { resolveModule } = require ( '@vue/cli/lib/util/module' )
15
16
const getPackageVersion = require ( '@vue/cli/lib/util/getPackageVersion' )
16
17
const {
@@ -84,6 +85,37 @@ function invalidatePackage (id, context) {
84
85
return folders . invalidatePackage ( getPath ( id ) , context )
85
86
}
86
87
88
+ async function getMetadata ( id , context ) {
89
+ let metadata = metadataCache . get ( id )
90
+ if ( metadata ) {
91
+ return metadata
92
+ }
93
+
94
+ if ( hasYarn ( ) ) {
95
+ try {
96
+ const { stdout } = await execa ( 'yarn' , [ 'info' , id , '--json' ] , {
97
+ cwd : cwd . get ( )
98
+ } )
99
+ metadata = JSON . parse ( stdout ) . data
100
+ } catch ( e ) {
101
+ // yarn info failed
102
+ console . log ( e )
103
+ }
104
+ }
105
+
106
+ if ( ! metadata ) {
107
+ const res = await getPackageVersion ( id )
108
+ if ( res . statusCode === 200 ) {
109
+ metadata = res . body
110
+ }
111
+ }
112
+
113
+ if ( metadata ) {
114
+ metadataCache . set ( id , metadata )
115
+ return metadata
116
+ }
117
+ }
118
+
87
119
async function getVersion ( { id, installed, versionRange } , context ) {
88
120
let current
89
121
if ( installed ) {
@@ -97,7 +129,7 @@ async function getVersion ({ id, installed, versionRange }, context) {
97
129
if ( metadata ) {
98
130
latest = metadata [ 'dist-tags' ] . latest
99
131
100
- const versions = Object . keys ( metadata . versions )
132
+ const versions = Array . isArray ( metadata . versions ) ? metadata . versions : Object . keys ( metadata . versions )
101
133
wanted = semver . maxSatisfying ( versions , versionRange )
102
134
}
103
135
@@ -120,23 +152,6 @@ async function getDescription ({ id }, context) {
120
152
return null
121
153
}
122
154
123
- async function getMetadata ( id , context ) {
124
- let metadata = metadataCache . get ( id )
125
- if ( metadata ) {
126
- return metadata
127
- }
128
-
129
- const res = await getPackageVersion ( id )
130
- if ( res . statusCode === 200 ) {
131
- metadata = res . body
132
- }
133
-
134
- if ( metadata ) {
135
- metadataCache . set ( id , metadata )
136
- return metadata
137
- }
138
- }
139
-
140
155
function getLink ( id , context ) {
141
156
const pkg = readPackage ( id , context )
142
157
return pkg . homepage ||
0 commit comments