diff options
author | claudiahdz <cghr1990@gmail.com> | 2020-04-01 02:49:23 +0300 |
---|---|---|
committer | isaacs <i@izs.me> | 2020-05-08 04:12:58 +0300 |
commit | fb597cabf4cba91fdbceca60a2fa7b077b8fdaba (patch) | |
tree | afb4f7e4506e1e74fa0567c8a17397340abb1214 /lib | |
parent | ca4c3795fe5ed58b5828208c18e785ecea13baf4 (diff) |
feat: npm update with arborist
Diffstat (limited to 'lib')
-rw-r--r-- | lib/update.js | 88 |
1 files changed, 28 insertions, 60 deletions
diff --git a/lib/update.js b/lib/update.js index fdb934fac..aa8318bfd 100644 --- a/lib/update.js +++ b/lib/update.js @@ -1,72 +1,40 @@ 'use strict' -module.exports = update -const url = require('url') -const log = require('npmlog') -const Bluebird = require('bluebird') +const Arborist = require('@npmcli/arborist') + const npm = require('./npm.js') -const Installer = require('./install.js').Installer -const usage = require('./utils/usage') -const outdated = Bluebird.promisify(npm.commands.outdated) +const usage = require('./utils/usage.js') +const output = require('./utils/output.js') -update.usage = usage( +cmd.usage = usage( 'update', 'npm update [-g] [<pkg>...]' ) -update.completion = npm.commands.outdated.completion - -function update (args, cb) { - return update_(args).asCallback(cb) +module.exports = cmd +function cmd(args, cb) { + update(args, cb) + .then(() => cb()) + .catch(cb) } -function update_ (args) { - let dryrun = false - if (npm.config.get('dry-run')) dryrun = true - - log.verbose('update', 'computing outdated modules to update') - return outdated(args, true).then((rawOutdated) => { - const outdated = rawOutdated.map(function (ww) { - return { - dep: ww[0], - depname: ww[1], - current: ww[2], - wanted: ww[3], - latest: ww[4], - req: ww[5], - what: ww[1] + '@' + ww[3] - } - }) - - const wanted = outdated.filter(function (ww) { - if (ww.current === ww.wanted && ww.wanted !== ww.latest) { - log.verbose( - 'outdated', - 'not updating', ww.depname, - "because it's currently at the maximum version that matches its specified semver range" - ) - } - return ww.current !== ww.wanted - }) - if (wanted.length === 0) return - - log.info('outdated', 'updating', wanted) - const toInstall = {} - - wanted.forEach(function (ww) { - // use the initial installation method (repo, tar, git) for updating - if (url.parse(ww.req).protocol) ww.what = ww.req - - const where = (ww.dep.parent && ww.dep.parent.path) || ww.dep.path - const isTransitive = !(ww.dep.requiredBy || []).some((p) => p.isTop) - const key = where + ':' + String(isTransitive) - if (!toInstall[key]) toInstall[key] = {where: where, opts: {saveOnlyLock: isTransitive}, what: []} - if (toInstall[key].what.indexOf(ww.what) === -1) toInstall[key].what.push(ww.what) - }) - return Bluebird.each(Object.keys(toInstall), (key) => { - const deps = toInstall[key] - const inst = new Installer(deps.where, dryrun, deps.what, deps.opts) - return inst.run() - }) +async function update (args) { + const update = args.length === 0 ? true : args + const where = npm.flatOptions.global + ? globalTop + : npm.prefix + + const arb = new Arborist({ + ...npm.flatOptions, + path: where }) + + const start = Date.now() + await arb.reify({ update }) + const stop = Date.now() + + const time = (stop - start) / 1000 + const pkgCount = arb.diff.children.length + const added = `updated ${pkgCount}` + output(`${added} packages in ${time}s`) } |