From 97cc57f2f1cf21de1899c43887591f262a1568fe Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Tue, 7 Jan 2020 16:35:46 +0800 Subject: [PATCH 1/2] refactor: use a plain http request to get package metadata fixes #4895 fixes #4995 --- packages/@vue/cli-shared-utils/lib/request.js | 5 ++-- .../cli/lib/util/ProjectPackageManager.js | 27 +++++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) 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..c9b6f42851 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,7 @@ class PackageManager { } } - async getMetadata (packageName, { field = '' } = {}) { + async getMetadata (packageName, { full = false } = {}) { const registry = await this.getRegistry() const metadataKey = `${this.bin}-${registry}-${packageName}` @@ -184,17 +186,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') { From 1fe8b1e4c0743adbfdb5f36d39bd0eb23e311233 Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Wed, 8 Jan 2020 10:38:17 +0800 Subject: [PATCH 2/2] chore: add link to the package metadata documentation --- packages/@vue/cli/lib/util/ProjectPackageManager.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@vue/cli/lib/util/ProjectPackageManager.js b/packages/@vue/cli/lib/util/ProjectPackageManager.js index c9b6f42851..4ea1f8c5b7 100644 --- a/packages/@vue/cli/lib/util/ProjectPackageManager.js +++ b/packages/@vue/cli/lib/util/ProjectPackageManager.js @@ -176,6 +176,7 @@ class PackageManager { } } + // https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md async getMetadata (packageName, { full = false } = {}) { const registry = await this.getRegistry()