summaryrefslogtreecommitdiff
path: root/deps/node/deps/npm/lib/outdated.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/node/deps/npm/lib/outdated.js')
-rw-r--r--deps/node/deps/npm/lib/outdated.js433
1 files changed, 0 insertions, 433 deletions
diff --git a/deps/node/deps/npm/lib/outdated.js b/deps/node/deps/npm/lib/outdated.js
deleted file mode 100644
index ebd67fb6..00000000
--- a/deps/node/deps/npm/lib/outdated.js
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
-
-npm outdated [pkg]
-
-Does the following:
-
-1. check for a new version of pkg
-
-If no packages are specified, then run for all installed
-packages.
-
---parseable creates output like this:
-<fullpath>:<name@wanted>:<name@installed>:<name@latest>
-
-*/
-
-module.exports = outdated
-
-outdated.usage = 'npm outdated [[<@scope>/]<pkg> ...]'
-
-outdated.completion = require('./utils/completion/installed-deep.js')
-
-var os = require('os')
-var url = require('url')
-var path = require('path')
-var readPackageTree = require('read-package-tree')
-var asyncMap = require('slide').asyncMap
-var color = require('ansicolors')
-var styles = require('ansistyles')
-var table = require('text-table')
-var semver = require('semver')
-var npa = require('libnpm/parse-arg')
-var pickManifest = require('npm-pick-manifest')
-var fetchPackageMetadata = require('./fetch-package-metadata.js')
-var mutateIntoLogicalTree = require('./install/mutate-into-logical-tree.js')
-var npm = require('./npm.js')
-const npmConfig = require('./config/figgy-config.js')
-const figgyPudding = require('figgy-pudding')
-const packument = require('libnpm/packument')
-var long = npm.config.get('long')
-var isExtraneous = require('./install/is-extraneous.js')
-var computeMetadata = require('./install/deps.js').computeMetadata
-var computeVersionSpec = require('./install/deps.js').computeVersionSpec
-var moduleName = require('./utils/module-name.js')
-var output = require('./utils/output.js')
-var ansiTrim = require('./utils/ansi-trim')
-
-const OutdatedConfig = figgyPudding({
- also: {},
- color: {},
- depth: {},
- dev: 'development',
- development: {},
- global: {},
- json: {},
- only: {},
- parseable: {},
- prod: 'production',
- production: {},
- save: {},
- 'save-dev': {},
- 'save-optional': {}
-})
-
-function uniq (list) {
- // we maintain the array because we need an array, not iterator, return
- // value.
- var uniqed = []
- var seen = new Set()
- list.forEach(function (item) {
- if (seen.has(item)) return
- seen.add(item)
- uniqed.push(item)
- })
- return uniqed
-}
-
-function andComputeMetadata (next) {
- return function (er, tree) {
- if (er) return next(er)
- next(null, computeMetadata(tree))
- }
-}
-
-function outdated (args, silent, cb) {
- if (typeof cb !== 'function') {
- cb = silent
- silent = false
- }
- let opts = OutdatedConfig(npmConfig())
- var dir = path.resolve(npm.dir, '..')
-
- // default depth for `outdated` is 0 (cf. `ls`)
- if (opts.depth) opts = opts.concat({depth: 0})
-
- readPackageTree(dir, andComputeMetadata(function (er, tree) {
- if (!tree) return cb(er)
- mutateIntoLogicalTree(tree)
- outdated_(args, '', tree, {}, 0, opts, function (er, list) {
- list = uniq(list || []).sort(function (aa, bb) {
- return aa[0].path.localeCompare(bb[0].path) ||
- aa[1].localeCompare(bb[1])
- })
- if (er || silent || list.length === 0) return cb(er, list)
- if (opts.json) {
- output(makeJSON(list, opts))
- } else if (opts.parseable) {
- output(makeParseable(list, opts))
- } else {
- var outList = list.map(x => makePretty(x, opts))
- var outHead = [ 'Package',
- 'Current',
- 'Wanted',
- 'Latest',
- 'Location'
- ]
- if (long) outHead.push('Package Type', 'Homepage')
- var outTable = [outHead].concat(outList)
-
- if (opts.color) {
- outTable[0] = outTable[0].map(function (heading) {
- return styles.underline(heading)
- })
- }
-
- var tableOpts = {
- align: ['l', 'r', 'r', 'r', 'l'],
- stringLength: function (s) { return ansiTrim(s).length }
- }
- output(table(outTable, tableOpts))
- }
- process.exitCode = 1
- cb(null, list.map(function (item) { return [item[0].parent.path].concat(item.slice(1, 7)) }))
- })
- }))
-}
-
-// [[ dir, dep, has, want, latest, type ]]
-function makePretty (p, opts) {
- var depname = p[1]
- var has = p[2]
- var want = p[3]
- var latest = p[4]
- var type = p[6]
- var deppath = p[7]
- var homepage = p[0].package.homepage || ''
-
- var columns = [ depname,
- has || 'MISSING',
- want,
- latest,
- deppath
- ]
- if (long) {
- columns[5] = type
- columns[6] = homepage
- }
-
- if (opts.color) {
- columns[0] = color[has === want || want === 'linked' ? 'yellow' : 'red'](columns[0]) // dep
- columns[2] = color.green(columns[2]) // want
- columns[3] = color.magenta(columns[3]) // latest
- }
-
- return columns
-}
-
-function makeParseable (list) {
- return list.map(function (p) {
- var dep = p[0]
- var depname = p[1]
- var dir = dep.path
- var has = p[2]
- var want = p[3]
- var latest = p[4]
- var type = p[6]
-
- var out = [
- dir,
- depname + '@' + want,
- (has ? (depname + '@' + has) : 'MISSING'),
- depname + '@' + latest
- ]
- if (long) out.push(type, dep.package.homepage)
-
- return out.join(':')
- }).join(os.EOL)
-}
-
-function makeJSON (list, opts) {
- var out = {}
- list.forEach(function (p) {
- var dep = p[0]
- var depname = p[1]
- var dir = dep.path
- var has = p[2]
- var want = p[3]
- var latest = p[4]
- var type = p[6]
- if (!opts.global) {
- dir = path.relative(process.cwd(), dir)
- }
- out[depname] = { current: has,
- wanted: want,
- latest: latest,
- location: dir
- }
- if (long) {
- out[depname].type = type
- out[depname].homepage = dep.package.homepage
- }
- })
- return JSON.stringify(out, null, 2)
-}
-
-function outdated_ (args, path, tree, parentHas, depth, opts, cb) {
- if (!tree.package) tree.package = {}
- if (path && tree.package.name) path += ' > ' + tree.package.name
- if (!path && tree.package.name) path = tree.package.name
- if (depth > opts.depth) {
- return cb(null, [])
- }
- var types = {}
- var pkg = tree.package
-
- if (!tree.children) tree.children = []
-
- var deps = tree.error ? tree.children : tree.children.filter((child) => !isExtraneous(child))
-
- deps.forEach(function (dep) {
- types[moduleName(dep)] = 'dependencies'
- })
-
- Object.keys(tree.missingDeps || {}).forEach(function (name) {
- deps.push({
- package: { name: name },
- path: tree.path,
- parent: tree,
- isMissing: true
- })
- types[name] = 'dependencies'
- })
-
- // If we explicitly asked for dev deps OR we didn't ask for production deps
- // AND we asked to save dev-deps OR we didn't ask to save anything that's NOT
- // dev deps then…
- // (All the save checking here is because this gets called from npm-update currently
- // and that requires this logic around dev deps.)
- // FIXME: Refactor npm update to not be in terms of outdated.
- var dev = opts.dev || /^dev(elopment)?$/.test(opts.also)
- var prod = opts.production || /^prod(uction)?$/.test(opts.only)
- if (
- (dev || !prod) &&
- (
- opts['save-dev'] || (!opts.save && !opts['save-optional'])
- )
- ) {
- Object.keys(tree.missingDevDeps).forEach(function (name) {
- deps.push({
- package: { name: name },
- path: tree.path,
- parent: tree,
- isMissing: true
- })
- if (!types[name]) {
- types[name] = 'devDependencies'
- }
- })
- }
-
- if (opts['save-dev']) {
- deps = deps.filter(function (dep) { return pkg.devDependencies[moduleName(dep)] })
- deps.forEach(function (dep) {
- types[moduleName(dep)] = 'devDependencies'
- })
- } else if (opts.save) {
- // remove optional dependencies from dependencies during --save.
- deps = deps.filter(function (dep) { return !pkg.optionalDependencies[moduleName(dep)] })
- } else if (opts['save-optional']) {
- deps = deps.filter(function (dep) { return pkg.optionalDependencies[moduleName(dep)] })
- deps.forEach(function (dep) {
- types[moduleName(dep)] = 'optionalDependencies'
- })
- }
- var doUpdate = dev || (
- !prod &&
- !Object.keys(parentHas).length &&
- !opts.global
- )
- if (doUpdate) {
- Object.keys(pkg.devDependencies || {}).forEach(function (k) {
- if (!(k in parentHas)) {
- deps[k] = pkg.devDependencies[k]
- types[k] = 'devDependencies'
- }
- })
- }
-
- var has = Object.create(parentHas)
- tree.children.forEach(function (child) {
- if (child.package.name && child.package.private) {
- deps = deps.filter(function (dep) { return dep !== child })
- }
- has[child.package.name] = {
- version: child.isLink ? 'linked' : child.package.version,
- from: child.isLink ? 'file:' + child.path : child.package._from
- }
- })
-
- // now get what we should have, based on the dep.
- // if has[dep] !== shouldHave[dep], then cb with the data
- // otherwise dive into the folder
- asyncMap(deps, function (dep, cb) {
- var name = moduleName(dep)
- var required
- if (tree.package.dependencies && name in tree.package.dependencies) {
- required = tree.package.dependencies[name]
- } else if (tree.package.optionalDependencies && name in tree.package.optionalDependencies) {
- required = tree.package.optionalDependencies[name]
- } else if (tree.package.devDependencies && name in tree.package.devDependencies) {
- required = tree.package.devDependencies[name]
- } else if (has[name]) {
- required = computeVersionSpec(tree, dep)
- }
-
- if (!long) return shouldUpdate(args, dep, name, has, required, depth, path, opts, cb)
-
- shouldUpdate(args, dep, name, has, required, depth, path, opts, cb, types[name])
- }, cb)
-}
-
-function shouldUpdate (args, tree, dep, has, req, depth, pkgpath, opts, cb, type) {
- // look up the most recent version.
- // if that's what we already have, or if it's not on the args list,
- // then dive into it. Otherwise, cb() with the data.
-
- // { version: , from: }
- var curr = has[dep]
-
- function skip (er) {
- // show user that no viable version can be found
- if (er) return cb(er)
- outdated_(args,
- pkgpath,
- tree,
- has,
- depth + 1,
- opts,
- cb)
- }
-
- function doIt (wanted, latest) {
- if (!long) {
- return cb(null, [[tree, dep, curr && curr.version, wanted, latest, req, null, pkgpath]])
- }
- cb(null, [[tree, dep, curr && curr.version, wanted, latest, req, type, pkgpath]])
- }
-
- if (args.length && args.indexOf(dep) === -1) return skip()
-
- if (tree.isLink && req == null) return skip()
-
- if (req == null || req === '') req = '*'
-
- var parsed = npa.resolve(dep, req)
- if (parsed.type === 'directory') {
- if (tree.isLink) {
- return skip()
- } else {
- return doIt('linked', 'linked')
- }
- } else if (parsed.type === 'git') {
- return doIt('git', 'git')
- } else if (parsed.type === 'file') {
- return updateLocalDeps()
- } else {
- return packument(dep, opts.concat({
- 'prefer-online': true
- })).nodeify(updateDeps)
- }
-
- function updateLocalDeps (latestRegistryVersion) {
- fetchPackageMetadata('file:' + parsed.fetchSpec, '.', (er, localDependency) => {
- if (er) return cb()
-
- var wanted = localDependency.version
- var latest = localDependency.version
-
- if (latestRegistryVersion) {
- latest = latestRegistryVersion
- if (semver.lt(wanted, latestRegistryVersion)) {
- wanted = latestRegistryVersion
- req = dep + '@' + latest
- }
- }
-
- if (!curr || curr.version !== wanted) {
- doIt(wanted, latest)
- } else {
- skip()
- }
- })
- }
-
- function updateDeps (er, d) {
- if (er) return cb(er)
-
- try {
- var l = pickManifest(d, 'latest')
- var m = pickManifest(d, req)
- } catch (er) {
- if (er.code === 'ETARGET') {
- return skip(er)
- } else {
- return skip()
- }
- }
-
- // check that the url origin hasn't changed (#1727) and that
- // there is no newer version available
- var dFromUrl = m._from && url.parse(m._from).protocol
- var cFromUrl = curr && curr.from && url.parse(curr.from).protocol
-
- if (!curr ||
- (dFromUrl && cFromUrl && m._from !== curr.from) ||
- m.version !== curr.version ||
- m.version !== l.version) {
- doIt(m.version, l.version)
- } else {
- skip()
- }
- }
-}