summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/pacote/lib/fetchers/registry/manifest.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/pacote/lib/fetchers/registry/manifest.js')
-rw-r--r--deps/npm/node_modules/pacote/lib/fetchers/registry/manifest.js117
1 files changed, 25 insertions, 92 deletions
diff --git a/deps/npm/node_modules/pacote/lib/fetchers/registry/manifest.js b/deps/npm/node_modules/pacote/lib/fetchers/registry/manifest.js
index 4e5a8010e2..d29ec71c33 100644
--- a/deps/npm/node_modules/pacote/lib/fetchers/registry/manifest.js
+++ b/deps/npm/node_modules/pacote/lib/fetchers/registry/manifest.js
@@ -1,56 +1,48 @@
'use strict'
-const BB = require('bluebird')
-
-const fetch = require('./fetch')
-const LRU = require('lru-cache')
+const fetch = require('npm-registry-fetch')
+const fetchPackument = require('./packument')
const optCheck = require('../../util/opt-check')
const pickManifest = require('npm-pick-manifest')
-const pickRegistry = require('./pick-registry')
const ssri = require('ssri')
-const url = require('url')
-
-// Corgis are cute. 🐕🐶
-const CORGI_DOC = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'
-const JSON_DOC = 'application/json'
module.exports = manifest
function manifest (spec, opts) {
opts = optCheck(opts)
- const registry = pickRegistry(spec, opts)
- const uri = metadataUrl(registry, spec.escapedName)
-
- return getManifest(uri, registry, spec, opts).then(manifest => {
- return annotateManifest(uri, registry, manifest)
+ return getManifest(spec, opts).then(manifest => {
+ return annotateManifest(spec, manifest, opts)
})
}
-function metadataUrl (registry, name) {
- const normalized = registry.slice(-1) !== '/'
- ? registry + '/'
- : registry
- return url.resolve(normalized, name)
-}
-
-function getManifest (uri, registry, spec, opts) {
- return fetchPackument(uri, spec, registry, opts).then(packument => {
+function getManifest (spec, opts) {
+ opts = opts.concat({
+ fullMetadata: opts.enjoyBy ? true : opts.fullMetadata
+ })
+ return fetchPackument(spec, opts).then(packument => {
try {
return pickManifest(packument, spec.fetchSpec, {
defaultTag: opts.defaultTag,
+ enjoyBy: opts.enjoyBy,
includeDeprecated: opts.includeDeprecated
})
} catch (err) {
if (err.code === 'ETARGET' && packument._cached && !opts.offline) {
opts.log.silly(
'registry:manifest',
- `no matching version for ${spec.name}@${spec.fetchSpec} in the cache. Forcing revalidation`
+ `no matching version for ${spec.name}@${spec.fetchSpec} in the cache. Forcing revalidation.`
)
- opts.preferOffline = false
- opts.preferOnline = true
- return fetchPackument(uri, spec, registry, opts).then(packument => {
+ opts = opts.concat({
+ preferOffline: false,
+ preferOnline: true
+ })
+ return fetchPackument(spec, opts.concat({
+ // Fetch full metadata in case ETARGET was due to corgi delay
+ fullMetadata: true
+ })).then(packument => {
return pickManifest(packument, spec.fetchSpec, {
- defaultTag: opts.defaultTag
+ defaultTag: opts.defaultTag,
+ enjoyBy: opts.enjoyBy
})
})
} else {
@@ -60,69 +52,7 @@ function getManifest (uri, registry, spec, opts) {
})
}
-// TODO - make this an opt
-const MEMO = new LRU({
- length: m => m._contentLength,
- max: 200 * 1024 * 1024, // 200MB
- maxAge: 30 * 1000 // 30s
-})
-
-module.exports.clearMemoized = clearMemoized
-function clearMemoized () {
- MEMO.reset()
-}
-
-function fetchPackument (uri, spec, registry, opts) {
- const mem = pickMem(opts)
- if (mem && !opts.preferOnline && mem.has(uri)) {
- return BB.resolve(mem.get(uri))
- }
-
- return fetch(uri, registry, Object.assign({
- headers: {
- 'pacote-req-type': 'packument',
- 'pacote-pkg-id': `registry:${manifest.name}`,
- accept: opts.fullMetadata ? JSON_DOC : CORGI_DOC
- },
- spec
- }, opts, {
- // Force integrity to null: we never check integrity hashes for manifests
- integrity: null
- })).then(res => res.json().then(packument => {
- packument._cached = decodeURIComponent(res.headers.has('x-local-cache'))
- packument._contentLength = +res.headers.get('content-length')
- // NOTE - we need to call pickMem again because proxy
- // objects get reused!
- const mem = pickMem(opts)
- if (mem) {
- mem.set(uri, packument)
- }
- return packument
- }))
-}
-
-class ObjProxy {
- get (key) { return this.obj[key] }
- set (key, val) { this.obj[key] = val }
-}
-
-// This object is used synchronously and immediately, so
-// we can safely reuse it instead of consing up new ones
-const PROX = new ObjProxy()
-function pickMem (opts) {
- if (!opts || !opts.memoize) {
- return MEMO
- } else if (opts.memoize.get && opts.memoize.set) {
- return opts.memoize
- } else if (typeof opts.memoize === 'object') {
- PROX.obj = opts.memoize
- return PROX
- } else {
- return null
- }
-}
-
-function annotateManifest (uri, registry, manifest) {
+function annotateManifest (spec, manifest, opts) {
const shasum = manifest.dist && manifest.dist.shasum
manifest._integrity = manifest.dist && manifest.dist.integrity
manifest._shasum = shasum
@@ -134,6 +64,9 @@ function annotateManifest (uri, registry, manifest) {
manifest.dist && manifest.dist.tarball
)
if (!manifest._resolved) {
+ const registry = fetch.pickRegistry(spec, opts)
+ const uri = registry.replace(/\/?$/, '/') + spec.escapedName
+
const err = new Error(
`Manifest for ${manifest.name}@${manifest.version} from ${uri} is missing a tarball url (pkg.dist.tarball). Guessing a default.`
)