/
usr
/
local
/
lib
/
node_modules
/
npm
/
lib
/
commands
/
/usr/local/lib/node_modules/npm/lib/commands
mkdir
upload
Name
Size
Mode
Actions
trust/
-
0755
rm
access.js
6313
0644
edit
dl
rm
adduser.js
1321
0644
edit
dl
rm
audit.js
3248
0644
edit
dl
rm
bugs.js
847
0644
edit
dl
rm
cache.js
11754
0644
edit
dl
rm
ci.js
4339
0644
edit
dl
rm
completion.js
11085
0644
edit
dl
rm
config.js
11753
0644
edit
dl
rm
dedupe.js
1450
0644
edit
dl
rm
deprecate.js
2488
0644
edit
dl
rm
diff.js
8109
0644
edit
dl
rm
dist-tag.js
5629
0644
edit
dl
rm
docs.js
449
0644
edit
dl
rm
doctor.js
10226
0644
edit
dl
rm
edit.js
1765
0644
edit
dl
rm
exec.js
3475
0644
edit
dl
rm
explain.js
3631
0644
edit
dl
rm
explore.js
2158
0644
edit
dl
rm
find-dupes.js
578
0644
edit
dl
rm
fund.js
6533
0644
edit
dl
rm
get.js
538
0644
edit
dl
rm
help-search.js
5662
0644
edit
dl
rm
help.js
3731
0644
edit
dl
rm
init.js
7186
0644
edit
dl
rm
install-ci-test.js
308
0644
edit
dl
rm
install-test.js
303
0644
edit
dl
rm
install.js
5221
0644
edit
dl
rm
link.js
5364
0644
edit
dl
rm
ll.js
234
0644
edit
dl
rm
login.js
1318
0644
edit
dl
rm
logout.js
1453
0644
edit
dl
rm
ls.js
18464
0644
edit
dl
rm
org.js
4054
0644
edit
dl
rm
outdated.js
8111
0644
edit
dl
rm
owner.js
6094
0644
edit
dl
rm
pack.js
2833
0644
edit
dl
rm
ping.js
873
0644
edit
dl
rm
pkg.js
3667
0644
edit
dl
rm
prefix.js
309
0644
edit
dl
rm
profile.js
10547
0644
edit
dl
rm
prune.js
770
0644
edit
dl
rm
publish.js
9698
0644
edit
dl
rm
query.js
3840
0644
edit
dl
rm
rebuild.js
2202
0644
edit
dl
rm
repo.js
1274
0644
edit
dl
rm
restart.js
303
0644
edit
dl
rm
root.js
295
0644
edit
dl
rm
run.js
6417
0644
edit
dl
rm
sbom.js
4578
0644
edit
dl
rm
search.js
1877
0644
edit
dl
rm
set.js
632
0644
edit
dl
rm
shrinkwrap.js
2691
0644
edit
dl
rm
star.js
1920
0644
edit
dl
rm
stars.js
1058
0644
edit
dl
rm
start.js
293
0644
edit
dl
rm
stop.js
288
0644
edit
dl
rm
team.js
4436
0644
edit
dl
rm
test.js
288
0644
edit
dl
rm
token.js
8153
0644
edit
dl
rm
undeprecate.js
302
0644
edit
dl
rm
uninstall.js
1522
0644
edit
dl
rm
unpublish.js
5368
0644
edit
dl
rm
unstar.js
183
0644
edit
dl
rm
update.js
1733
0644
edit
dl
rm
version.js
3621
0644
edit
dl
rm
view.js
13802
0644
edit
dl
rm
whoami.js
527
0644
edit
dl
rm
Edit:
/usr/local/lib/node_modules/npm/lib/commands/diff.js
(8109B)
const { resolve } = require('node:path') const semver = require('semver') const libnpmdiff = require('libnpmdiff') const npa = require('npm-package-arg') const pacote = require('pacote') const pickManifest = require('npm-pick-manifest') const { log, output } = require('proc-log') const pkgJson = require('@npmcli/package-json') const BaseCommand = require('../base-cmd.js') class Diff extends BaseCommand { static description = 'The registry diff command' static name = 'diff' static usage = [ '[...<paths>]', ] static params = [ 'diff', 'diff-name-only', 'diff-unified', 'diff-ignore-all-space', 'diff-no-prefix', 'diff-src-prefix', 'diff-dst-prefix', 'diff-text', 'global', 'tag', 'workspace', 'workspaces', 'include-workspace-root', ] static workspaces = true static ignoreImplicitWorkspace = false async exec (args) { const specs = this.npm.config.get('diff').filter(d => d) if (specs.length > 2) { throw this.usageError(`Can't use more than two --diff arguments.`) } // execWorkspaces may have set this already if (!this.prefix) { this.prefix = this.npm.prefix } // this is the "top" directory, one up from node_modules in global mode we have to walk one up from globalDir because our node_modules is sometimes under ./lib, and in global mode we're only ever walking through node_modules (because we will have been given a package name already) if (this.npm.global) { this.top = resolve(this.npm.globalDir, '..') } else { this.top = this.prefix } const [a, b] = await this.retrieveSpecs(specs) log.info('diff', { src: a, dst: b }) const res = await libnpmdiff([a, b], { ...this.npm.flatOptions, diffFiles: args, where: this.top, }) return output.standard(res) } async execWorkspaces (args) { await this.setWorkspaces() for (const workspacePath of this.workspacePaths) { this.top = workspacePath this.prefix = workspacePath await this.exec(args) } } // get the package name from the packument at `path` // throws if no packument is present OR if it does not have `name` attribute async packageName () { let name try { const { content: pkg } = await pkgJson.normalize(this.prefix) name = pkg.name } catch { log.verbose('diff', 'could not read project dir package.json') } if (!name) { throw this.usageError('Needs multiple arguments to compare or run from a project dir.') } return name } async retrieveSpecs ([a, b]) { if (a && b) { const specs = await this.convertVersionsToSpecs([a, b]) return this.findVersionsByPackageName(specs) } // no arguments, defaults to comparing cwd to its latest published registry version if (!a) { const pkgName = await this.packageName() return [ `${pkgName}@${this.npm.config.get('tag')}`, `file:${this.prefix}`, ] } // single argument, used to compare wanted versions of an installed dependency or to compare the cwd to a published version let noPackageJson let pkgName try { const { content: pkg } = await pkgJson.normalize(this.prefix) pkgName = pkg.name } catch { log.verbose('diff', 'could not read project dir package.json') noPackageJson = true } const missingPackageJson = this.usageError('Needs multiple arguments to compare or run from a project dir.') // using a valid semver range, that means it should just diff the cwd against a published version to the registry using the same project name and the provided semver range if (semver.validRange(a)) { if (!pkgName) { throw missingPackageJson } return [ `${pkgName}@${a}`, `file:${this.prefix}`, ] } // when using a single package name as arg and it's part of the current install tree, then retrieve the current installed version and compare it against the same value `npm outdated` would suggest you to update to const spec = npa(a) if (spec.registry) { let actualTree let node const Arborist = require('@npmcli/arborist') try { const opts = { ...this.npm.flatOptions, path: this.top, } const arb = new Arborist(opts) actualTree = await arb.loadActual(opts) node = actualTree && actualTree.inventory.query('name', spec.name) .values().next().value } catch { log.verbose('diff', 'failed to load actual install tree') } if (!node || !node.name || !node.package || !node.package.version) { if (noPackageJson) { throw missingPackageJson } return [ `${spec.name}@${spec.fetchSpec}`, `file:${this.prefix}`, ] } const tryRootNodeSpec = () => (actualTree && actualTree.edgesOut.get(spec.name) || {}).spec const tryAnySpec = () => { for (const edge of node.edgesIn) { return edge.spec } } const aSpec = `file:${node.realpath}` // finds what version of the package to compare against // if an exact version or tag was passed than it should use that // otherwise, work from the top of the arborist tree to find the original semver range declared in the package that depends on the package. let bSpec if (spec.rawSpec !== '*') { bSpec = spec.rawSpec } else { const bTargetVersion = tryRootNodeSpec() || tryAnySpec() // figure out what to compare against // follows same logic to npm outdated "Wanted" results const packument = await pacote.packument(spec, { ...this.npm.flatOptions, preferOnline: true, _isRoot: true, }) bSpec = pickManifest( packument, bTargetVersion, { ...this.npm.flatOptions } ).version } return [ `${spec.name}@${aSpec}`, `${spec.name}@${bSpec}`, ] } else if (spec.type === 'directory') { return [ `file:${spec.fetchSpec}`, `file:${this.prefix}`, ] } else { throw this.usageError(`Spec type ${spec.type} not supported.`) } } async convertVersionsToSpecs ([a, b]) { const semverA = semver.validRange(a) const semverB = semver.validRange(b) // both specs are semver versions, assume current project dir name if (semverA && semverB) { let pkgName try { const { content: pkg } = await pkgJson.normalize(this.prefix) pkgName = pkg.name } catch { log.verbose('diff', 'could not read project dir package.json') } if (!pkgName) { throw this.usageError('Needs to be run from a project dir in order to diff two versions.') } return [`${pkgName}@${a}`, `${pkgName}@${b}`] } // otherwise uses the name from the other arg to figure out the spec.name of what to compare if (!semverA && semverB) { return [a, `${npa(a).name}@${b}`] } if (semverA && !semverB) { return [`${npa(b).name}@${a}`, b] } // no valid semver ranges used return [a, b] } async findVersionsByPackageName (specs) { let actualTree const Arborist = require('@npmcli/arborist') try { const opts = { ...this.npm.flatOptions, path: this.top, } const arb = new Arborist(opts) actualTree = await arb.loadActual(opts) } catch { log.verbose('diff', 'failed to load actual install tree') } return specs.map(i => { const spec = npa(i) if (spec.rawSpec !== '*') { return i } const node = actualTree && actualTree.inventory.query('name', spec.name) .values().next().value const res = !node || !node.package || !node.package.version ? spec.fetchSpec : `file:${node.realpath}` return `${spec.name}@${res}` }) } } module.exports = Diff
Save
cmd:
run