summaryrefslogtreecommitdiff
path: root/deps/node/deps/npm/lib/install/inflate-shrinkwrap.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/node/deps/npm/lib/install/inflate-shrinkwrap.js')
-rw-r--r--deps/node/deps/npm/lib/install/inflate-shrinkwrap.js233
1 files changed, 0 insertions, 233 deletions
diff --git a/deps/node/deps/npm/lib/install/inflate-shrinkwrap.js b/deps/node/deps/npm/lib/install/inflate-shrinkwrap.js
deleted file mode 100644
index bf1ab706..00000000
--- a/deps/node/deps/npm/lib/install/inflate-shrinkwrap.js
+++ /dev/null
@@ -1,233 +0,0 @@
-'use strict'
-
-const BB = require('bluebird')
-
-let addBundled
-const childPath = require('../utils/child-path.js')
-const createChild = require('./node.js').create
-let fetchPackageMetadata
-const inflateBundled = require('./inflate-bundled.js')
-const moduleName = require('../utils/module-name.js')
-const normalizePackageData = require('normalize-package-data')
-const npm = require('../npm.js')
-const realizeShrinkwrapSpecifier = require('./realize-shrinkwrap-specifier.js')
-const validate = require('aproba')
-const path = require('path')
-const isRegistry = require('../utils/is-registry.js')
-const hasModernMeta = require('./has-modern-meta.js')
-const ssri = require('ssri')
-const npa = require('npm-package-arg')
-
-module.exports = function (tree, sw, opts, finishInflating) {
- if (!fetchPackageMetadata) {
- fetchPackageMetadata = BB.promisify(require('../fetch-package-metadata.js'))
- addBundled = BB.promisify(fetchPackageMetadata.addBundled)
- }
- if (arguments.length === 3) {
- finishInflating = opts
- opts = {}
- }
- if (!npm.config.get('shrinkwrap') || !npm.config.get('package-lock')) {
- return finishInflating()
- }
- tree.loaded = false
- tree.hasRequiresFromLock = sw.requires
- return inflateShrinkwrap(tree.path, tree, sw.dependencies, opts).then(
- () => finishInflating(),
- finishInflating
- )
-}
-
-function inflateShrinkwrap (topPath, tree, swdeps, opts) {
- if (!swdeps) return Promise.resolve()
- if (!opts) opts = {}
- const onDisk = {}
- tree.children.forEach((child) => {
- onDisk[moduleName(child)] = child
- })
-
- tree.children = []
-
- return BB.each(Object.keys(swdeps), (name) => {
- const sw = swdeps[name]
- const dependencies = sw.dependencies || {}
- const requested = realizeShrinkwrapSpecifier(name, sw, topPath)
- return inflatableChild(
- onDisk[name], name, topPath, tree, sw, requested, opts
- ).then((child) => {
- child.hasRequiresFromLock = tree.hasRequiresFromLock
- return inflateShrinkwrap(topPath, child, dependencies)
- })
- })
-}
-
-function normalizePackageDataNoErrors (pkg) {
- try {
- normalizePackageData(pkg)
- } catch (ex) {
- // don't care
- }
-}
-
-function quotemeta (str) {
- return str.replace(/([^A-Za-z_0-9/])/g, '\\$1')
-}
-
-function tarballToVersion (name, tb) {
- const registry = quotemeta(npm.config.get('registry'))
- .replace(/https?:/, 'https?:')
- .replace(/([^/])$/, '$1/')
- let matchRegTarball
- if (name) {
- const nameMatch = quotemeta(name)
- matchRegTarball = new RegExp(`^${registry}${nameMatch}/-/${nameMatch}-(.*)[.]tgz$`)
- } else {
- matchRegTarball = new RegExp(`^${registry}(.*)?/-/\\1-(.*)[.]tgz$`)
- }
- const match = tb.match(matchRegTarball)
- if (!match) return
- return match[2] || match[1]
-}
-
-function inflatableChild (onDiskChild, name, topPath, tree, sw, requested, opts) {
- validate('OSSOOOO|ZSSOOOO', arguments)
- const usesIntegrity = (
- requested.registry ||
- requested.type === 'remote' ||
- requested.type === 'file'
- )
- const regTarball = tarballToVersion(name, sw.version)
- if (regTarball) {
- sw.resolved = sw.version
- sw.version = regTarball
- }
- if (sw.requires) Object.keys(sw.requires).map(_ => { sw.requires[_] = tarballToVersion(_, sw.requires[_]) || sw.requires[_] })
- const modernLink = requested.type === 'directory' && !sw.from
- if (hasModernMeta(onDiskChild) && childIsEquivalent(sw, requested, onDiskChild)) {
- // The version on disk matches the shrinkwrap entry.
- if (!onDiskChild.fromShrinkwrap) onDiskChild.fromShrinkwrap = requested
- onDiskChild.package._requested = requested
- onDiskChild.package._spec = requested.rawSpec
- onDiskChild.package._where = topPath
- onDiskChild.package._optional = sw.optional
- onDiskChild.package._development = sw.dev
- onDiskChild.package._inBundle = sw.bundled
- onDiskChild.fromBundle = (sw.bundled || onDiskChild.package._inBundle) ? tree.fromBundle || tree : null
- if (!onDiskChild.package._args) onDiskChild.package._args = []
- onDiskChild.package._args.push([String(requested), topPath])
- // non-npm registries can and will return unnormalized data, plus
- // even the npm registry may have package data normalized with older
- // normalization rules. This ensures we get package data in a consistent,
- // stable format.
- normalizePackageDataNoErrors(onDiskChild.package)
- onDiskChild.swRequires = sw.requires
- tree.children.push(onDiskChild)
- return BB.resolve(onDiskChild)
- } else if ((sw.version && (sw.integrity || !usesIntegrity) && (requested.type !== 'directory' || modernLink)) || sw.bundled) {
- // The shrinkwrap entry has an integrity field. We can fake a pkg to get
- // the installer to do a content-address fetch from the cache, if possible.
- return BB.resolve(makeFakeChild(name, topPath, tree, sw, requested))
- } else {
- // It's not on disk, and we can't just look it up by address -- do a full
- // fpm/inflate bundle pass. For registry deps, this will go straight to the
- // tarball URL, as if it were a remote tarball dep.
- return fetchChild(topPath, tree, sw, requested)
- }
-}
-
-function isGit (sw) {
- const version = npa.resolve(sw.name, sw.version)
- return (version && version.type === 'git')
-}
-
-function makeFakeChild (name, topPath, tree, sw, requested) {
- const from = sw.from || requested.raw
- const pkg = {
- name: name,
- version: sw.version,
- _id: name + '@' + sw.version,
- _resolved: sw.resolved || (isGit(sw) && sw.version),
- _requested: requested,
- _optional: sw.optional,
- _development: sw.dev,
- _inBundle: sw.bundled,
- _integrity: sw.integrity,
- _from: from,
- _spec: requested.rawSpec,
- _where: topPath,
- _args: [[requested.toString(), topPath]],
- dependencies: sw.requires
- }
-
- if (!sw.bundled) {
- const bundleDependencies = Object.keys(sw.dependencies || {}).filter((d) => sw.dependencies[d].bundled)
- if (bundleDependencies.length === 0) {
- pkg.bundleDependencies = bundleDependencies
- }
- }
- const child = createChild({
- package: pkg,
- loaded: false,
- parent: tree,
- children: [],
- fromShrinkwrap: requested,
- fakeChild: sw,
- fromBundle: sw.bundled ? tree.fromBundle || tree : null,
- path: childPath(tree.path, pkg),
- realpath: requested.type === 'directory' ? requested.fetchSpec : childPath(tree.realpath, pkg),
- location: (tree.location === '/' ? '' : tree.location + '/') + pkg.name,
- isLink: requested.type === 'directory',
- isInLink: tree.isLink,
- swRequires: sw.requires
- })
- tree.children.push(child)
- return child
-}
-
-function fetchChild (topPath, tree, sw, requested) {
- return fetchPackageMetadata(requested, topPath).then((pkg) => {
- pkg._from = sw.from || requested.raw
- pkg._optional = sw.optional
- pkg._development = sw.dev
- pkg._inBundle = false
- return addBundled(pkg).then(() => pkg)
- }).then((pkg) => {
- var isLink = pkg._requested.type === 'directory'
- const child = createChild({
- package: pkg,
- loaded: false,
- parent: tree,
- fromShrinkwrap: requested,
- path: childPath(tree.path, pkg),
- realpath: isLink ? requested.fetchSpec : childPath(tree.realpath, pkg),
- children: pkg._bundled || [],
- location: (tree.location === '/' ? '' : tree.location + '/') + pkg.name,
- fromBundle: null,
- isLink: isLink,
- isInLink: tree.isLink,
- swRequires: sw.requires
- })
- tree.children.push(child)
- if (pkg._bundled) {
- delete pkg._bundled
- inflateBundled(child, child, child.children)
- }
- return child
- })
-}
-
-function childIsEquivalent (sw, requested, child) {
- if (!child) return false
- if (child.fromShrinkwrap) return true
- if (
- sw.integrity &&
- child.package._integrity &&
- ssri.parse(sw.integrity).match(child.package._integrity)
- ) return true
- if (child.isLink && requested.type === 'directory') return path.relative(child.realpath, requested.fetchSpec) === ''
-
- if (sw.resolved) return child.package._resolved === sw.resolved
- if (!isRegistry(requested) && sw.from) return child.package._from === sw.from
- if (!isRegistry(requested) && child.package._resolved) return sw.version === child.package._resolved
- return child.package.version === sw.version
-}