diff options
Diffstat (limited to 'deps/npm/node_modules/pacote/node_modules/npm-pick-manifest/index.js')
-rw-r--r-- | deps/npm/node_modules/pacote/node_modules/npm-pick-manifest/index.js | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/deps/npm/node_modules/pacote/node_modules/npm-pick-manifest/index.js b/deps/npm/node_modules/pacote/node_modules/npm-pick-manifest/index.js new file mode 100644 index 0000000000..87d9a95b2b --- /dev/null +++ b/deps/npm/node_modules/pacote/node_modules/npm-pick-manifest/index.js @@ -0,0 +1,75 @@ +'use strict' + +const npa = require('npm-package-arg') +const semver = require('semver') + +module.exports = pickManifest +function pickManifest (packument, wanted, opts) { + opts = opts || {} + const spec = npa.resolve(packument.name, wanted) + const type = spec.type + if (type === 'version' || type === 'range') { + wanted = semver.clean(wanted) || wanted + } + const distTags = packument['dist-tags'] || {} + const versions = Object.keys(packument.versions || {}).filter(v => semver.valid(v)) + let err + + if (!versions.length) { + err = new Error(`No valid versions available for ${packument.name}`) + err.code = 'ENOVERSIONS' + err.name = packument.name + err.type = type + err.wanted = wanted + throw err + } + + let target + + if (type === 'tag') { + target = distTags[wanted] + } else if (type === 'version') { + target = wanted + } else if (type !== 'range') { + throw new Error('Only tag, version, and range are supported') + } + + const tagVersion = distTags[opts.defaultTag || 'latest'] + + if ( + !target && + tagVersion && + packument.versions[tagVersion] && + semver.satisfies(tagVersion, wanted, true) + ) { + target = tagVersion + } + + if (!target) { + target = semver.maxSatisfying(versions, wanted, true) + } + + if (!target && wanted === '*') { + // This specific corner is meant for the case where + // someone is using `*` as a selector, but all versions + // are pre-releases, which don't match ranges at all. + target = tagVersion + } + + const manifest = target && packument.versions[target] + if (!manifest) { + err = new Error( + `No matching version found for ${packument.name}@${wanted}` + ) + err.code = 'ETARGET' + err.name = packument.name + err.type = type + err.wanted = wanted + err.versions = versions + err.distTags = distTags + err.defaultTag = opts.defaultTag + throw err + } else { + return manifest + } +} |