summaryrefslogtreecommitdiff
path: root/deps/npm/lib/rebuild.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/lib/rebuild.js')
-rw-r--r--deps/npm/lib/rebuild.js98
1 files changed, 54 insertions, 44 deletions
diff --git a/deps/npm/lib/rebuild.js b/deps/npm/lib/rebuild.js
index ab34b7f3df..1091b01589 100644
--- a/deps/npm/lib/rebuild.js
+++ b/deps/npm/lib/rebuild.js
@@ -2,64 +2,74 @@ const { resolve } = require('path')
const Arborist = require('@npmcli/arborist')
const npa = require('npm-package-arg')
const semver = require('semver')
-
-const npm = require('./npm.js')
const usageUtil = require('./utils/usage.js')
const output = require('./utils/output.js')
+const completion = require('./utils/completion/installed-deep.js')
-const cmd = (args, cb) => rebuild(args).then(() => cb()).catch(cb)
+class Rebuild {
+ constructor (npm) {
+ this.npm = npm
+ }
-const usage = usageUtil('rebuild', 'npm rebuild [[<@scope>/]<name>[@<version>] ...]')
+ /* istanbul ignore next - see test/lib/load-all-commands.js */
+ get usage () {
+ return usageUtil('rebuild', 'npm rebuild [[<@scope>/]<name>[@<version>] ...]')
+ }
-const completion = require('./utils/completion/installed-deep.js')
+ /* istanbul ignore next - see test/lib/load-all-commands.js */
+ async completion (opts) {
+ return completion(this.npm, opts)
+ }
-const rebuild = async args => {
- const globalTop = resolve(npm.globalDir, '..')
- const where = npm.flatOptions.global ? globalTop : npm.prefix
- const arb = new Arborist({
- ...npm.flatOptions,
- path: where,
- })
+ exec (args, cb) {
+ this.rebuild(args).then(() => cb()).catch(cb)
+ }
- if (args.length) {
- // get the set of nodes matching the name that we want rebuilt
- const tree = await arb.loadActual()
- const filter = getFilterFn(args)
- await arb.rebuild({
- nodes: tree.inventory.filter(filter),
+ async rebuild (args) {
+ const globalTop = resolve(this.npm.globalDir, '..')
+ const where = this.npm.flatOptions.global ? globalTop : this.npm.prefix
+ const arb = new Arborist({
+ ...this.npm.flatOptions,
+ path: where,
})
- } else
- await arb.rebuild()
- output('rebuilt dependencies successfully')
-}
+ if (args.length) {
+ // get the set of nodes matching the name that we want rebuilt
+ const tree = await arb.loadActual()
+ const specs = args.map(arg => {
+ const spec = npa(arg)
+ if (spec.type === 'tag' && spec.rawSpec === '')
+ return spec
-const getFilterFn = args => {
- const specs = args.map(arg => {
- const spec = npa(arg)
- if (spec.type === 'tag' && spec.rawSpec === '')
- return spec
+ if (spec.type !== 'range' && spec.type !== 'version' && spec.type !== 'directory')
+ throw new Error('`npm rebuild` only supports SemVer version/range specifiers')
- if (spec.type !== 'range' && spec.type !== 'version' && spec.type !== 'directory')
- throw new Error('`npm rebuild` only supports SemVer version/range specifiers')
+ return spec
+ })
+ const nodes = tree.inventory.filter(node => this.isNode(specs, node))
- return spec
- })
+ await arb.rebuild({ nodes })
+ } else
+ await arb.rebuild()
- return node => specs.some(spec => {
- if (spec.type === 'directory')
- return node.path === spec.fetchSpec
+ output('rebuilt dependencies successfully')
+ }
- if (spec.name !== node.name)
- return false
+ isNode (specs, node) {
+ return specs.some(spec => {
+ if (spec.type === 'directory')
+ return node.path === spec.fetchSpec
- if (spec.rawSpec === '' || spec.rawSpec === '*')
- return true
+ if (spec.name !== node.name)
+ return false
- const { version } = node.package
- // TODO: add tests for a package with missing version
- return semver.satisfies(version, spec.fetchSpec)
- })
-}
+ if (spec.rawSpec === '' || spec.rawSpec === '*')
+ return true
-module.exports = Object.assign(cmd, { usage, completion })
+ const { version } = node.package
+ // TODO: add tests for a package with missing version
+ return semver.satisfies(version, spec.fetchSpec)
+ })
+ }
+}
+module.exports = Rebuild