diff --git a/packages/@vue/cli-shared-utils/lib/request.js b/packages/@vue/cli-shared-utils/lib/request.js index b8f38bc067..46a6590752 100644 --- a/packages/@vue/cli-shared-utils/lib/request.js +++ b/packages/@vue/cli-shared-utils/lib/request.js @@ -1,5 +1,5 @@ exports.request = { - get (uri) { + get (uri, opts) { // lazy require const request = require('request-promise-native') const reqOpts = { @@ -7,7 +7,8 @@ exports.request = { timeout: 30000, resolveWithFullResponse: true, json: true, - uri + uri, + ...opts } return request(reqOpts) diff --git a/packages/@vue/cli/lib/util/ProjectPackageManager.js b/packages/@vue/cli/lib/util/ProjectPackageManager.js index 4ffcf82023..4ea1f8c5b7 100644 --- a/packages/@vue/cli/lib/util/ProjectPackageManager.js +++ b/packages/@vue/cli/lib/util/ProjectPackageManager.js @@ -8,6 +8,7 @@ const { chalk, execa, semver, + request, hasYarn, hasProjectYarn, @@ -19,7 +20,8 @@ const { resolvePluginId, log, - warn + warn, + error } = require('@vue/cli-shared-utils') const { loadOptions } = require('../options') @@ -174,7 +176,8 @@ class PackageManager { } } - async getMetadata (packageName, { field = '' } = {}) { + // https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md + async getMetadata (packageName, { full = false } = {}) { const registry = await this.getRegistry() const metadataKey = `${this.bin}-${registry}-${packageName}` @@ -184,17 +187,20 @@ class PackageManager { return metadata } - const args = await this.addRegistryToArgs(['info', packageName, field, '--json']) - const { stdout } = await execa(this.bin, args) - - metadata = JSON.parse(stdout) - if (this.bin === 'yarn') { - // `yarn info` outputs messages in the form of `{"type": "inspect", data: {}}` - metadata = metadata.data + const headers = {} + if (!full) { + headers.Accept = 'application/vnd.npm.install-v1+json' } - metadataCache.set(metadataKey, metadata) - return metadata + const url = `${registry}/${packageName}` + try { + metadata = (await request.get(url, { headers })).body + metadataCache.set(metadataKey, metadata) + return metadata + } catch (e) { + error(`Failed to get response from ${url}`) + throw e + } } async getRemoteVersion (packageName, versionRange = 'latest') {