@npmcli/arborist 5.0.1 → 5.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -355,6 +355,21 @@ Try using the package name instead, e.g:
355
355
  })
356
356
 
357
357
  .then(tree => {
358
+ // search the virtual tree for invalid edges, if any are found add their source to
359
+ // the depsQueue so that we'll fix it later
360
+ depth({
361
+ tree,
362
+ getChildren: (node) => [...node.edgesOut.values()].map(edge => edge.to),
363
+ filter: node => node,
364
+ visit: node => {
365
+ for (const edge of node.edgesOut.values()) {
366
+ if (!edge.valid) {
367
+ this[_depsQueue].push(node)
368
+ break // no need to continue the loop after the first hit
369
+ }
370
+ }
371
+ },
372
+ })
358
373
  // null the virtual tree, because we're about to hack away at it
359
374
  // if you want another one, load another copy.
360
375
  this.idealTree = tree
@@ -743,6 +758,12 @@ This is a one-time fix-up, please be patient...
743
758
  continue
744
759
  }
745
760
 
761
+ // if the node's location isn't within node_modules then this is actually
762
+ // a link target, so skip it. the link node itself will be queued later.
763
+ if (!node.location.startsWith('node_modules')) {
764
+ continue
765
+ }
766
+
746
767
  queue.push(async () => {
747
768
  log.silly('inflate', node.location)
748
769
  const { resolved, version, path, name, location, integrity } = node
@@ -750,8 +771,7 @@ This is a one-time fix-up, please be patient...
750
771
  const useResolved = resolved && (
751
772
  !version || resolved.startsWith('file:')
752
773
  )
753
- const id = useResolved ? resolved
754
- : version || `file:${node.path}`
774
+ const id = useResolved ? resolved : version
755
775
  const spec = npa.resolve(name, id, dirname(path))
756
776
  const t = `idealTree:inflate:${location}`
757
777
  this.addTracker(t)
@@ -435,7 +435,7 @@ module.exports = cls => class ActualLoader extends cls {
435
435
  if (d.dummy) {
436
436
  // it's a placeholder, so likely would not have loaded this dep,
437
437
  // unless another dep in the tree also needs it.
438
- const depPath = `${p}/node_modules/${name}`
438
+ const depPath = normalize(`${p}/node_modules/${name}`)
439
439
  const cached = this[_cache].get(depPath)
440
440
  if (!cached || cached.dummy) {
441
441
  depPromises.push(this[_loadFSNode]({
@@ -79,7 +79,7 @@ module.exports = cls => class VirtualLoader extends cls {
79
79
  async [loadRoot] (s) {
80
80
  const pj = this.path + '/package.json'
81
81
  const pkg = await rpj(pj).catch(() => s.data.packages['']) || {}
82
- return this[loadWorkspaces](this[loadNode]('', pkg))
82
+ return this[loadWorkspaces](this[loadNode]('', pkg, true))
83
83
  }
84
84
 
85
85
  async [loadFromShrinkwrap] (s, root) {
@@ -264,7 +264,7 @@ module.exports = cls => class VirtualLoader extends cls {
264
264
  }
265
265
  }
266
266
 
267
- [loadNode] (location, sw) {
267
+ [loadNode] (location, sw, loadOverrides) {
268
268
  const p = this.virtualTree ? this.virtualTree.realpath : this.path
269
269
  const path = resolve(p, location)
270
270
  // shrinkwrap doesn't include package name unless necessary
@@ -290,6 +290,7 @@ module.exports = cls => class VirtualLoader extends cls {
290
290
  optional,
291
291
  devOptional,
292
292
  peer,
293
+ loadOverrides,
293
294
  })
294
295
  // cast to boolean because they're undefined in the lock file when false
295
296
  node.extraneous = !!sw.extraneous
@@ -136,15 +136,19 @@ module.exports = cls => class Builder extends cls {
136
136
  process.emit('time', `build:${type}`)
137
137
 
138
138
  await this[_buildQueues](nodes)
139
- if (!this[_ignoreScripts]) {
140
- await this[_runScripts]('preinstall')
141
- }
142
- if (this[_binLinks] && type !== 'links') {
143
- await this[_linkAllBins]()
144
- }
145
-
146
- // links should also run prepare scripts and only link bins after that
147
- if (type === 'links') {
139
+ // links should run prepare scripts and only link bins after that
140
+ if (type !== 'links') {
141
+ if (!this[_ignoreScripts]) {
142
+ await this[_runScripts]('preinstall')
143
+ }
144
+ if (this[_binLinks]) {
145
+ await this[_linkAllBins]()
146
+ }
147
+ if (!this[_ignoreScripts]) {
148
+ await this[_runScripts]('install')
149
+ await this[_runScripts]('postinstall')
150
+ }
151
+ } else {
148
152
  await this[_runScripts]('prepare')
149
153
 
150
154
  if (this[_binLinks]) {
@@ -152,11 +156,6 @@ module.exports = cls => class Builder extends cls {
152
156
  }
153
157
  }
154
158
 
155
- if (!this[_ignoreScripts]) {
156
- await this[_runScripts]('install')
157
- await this[_runScripts]('postinstall')
158
- }
159
-
160
159
  process.emit('timeEnd', `build:${type}`)
161
160
  }
162
161
 
@@ -1225,14 +1225,23 @@ module.exports = cls => class Reifier extends cls {
1225
1225
  newSpec = h.shortcut(opt)
1226
1226
  }
1227
1227
  } else if (isLocalDep) {
1228
- // save the relative path in package.json
1229
- // Normally saveSpec is updated with the proper relative
1230
- // path already, but it's possible to specify a full absolute
1231
- // path initially, in which case we can end up with the wrong
1232
- // thing, so just get the ultimate fetchSpec and relativize it.
1233
- const p = req.fetchSpec.replace(/^file:/, '')
1234
- const rel = relpath(addTree.realpath, p)
1235
- newSpec = `file:${rel}`
1228
+ // when finding workspace nodes, make sure that
1229
+ // we save them using their version instead of
1230
+ // using their relative path
1231
+ if (edge.type === 'workspace') {
1232
+ const { version } = edge.to.target
1233
+ const prefixRange = version ? this[_savePrefix] + version : '*'
1234
+ newSpec = prefixRange
1235
+ } else {
1236
+ // save the relative path in package.json
1237
+ // Normally saveSpec is updated with the proper relative
1238
+ // path already, but it's possible to specify a full absolute
1239
+ // path initially, in which case we can end up with the wrong
1240
+ // thing, so just get the ultimate fetchSpec and relativize it.
1241
+ const p = req.fetchSpec.replace(/^file:/, '')
1242
+ const rel = relpath(addTree.realpath, p)
1243
+ newSpec = `file:${rel}`
1244
+ }
1236
1245
  } else {
1237
1246
  newSpec = req.saveSpec
1238
1247
  }
@@ -1299,7 +1308,7 @@ module.exports = cls => class Reifier extends cls {
1299
1308
  // to only names that are found in this list
1300
1309
  const retrieveUpdatedNodes = names => {
1301
1310
  const filterDirectDependencies = node =>
1302
- !node.isRoot && node.resolveParent.isRoot
1311
+ !node.isRoot && node.resolveParent && node.resolveParent.isRoot
1303
1312
  && (!names || names.includes(node.name))
1304
1313
  && exactVersion(node) // skip update for exact ranges
1305
1314
 
package/lib/tracker.js CHANGED
@@ -1,10 +1,12 @@
1
1
  const _progress = Symbol('_progress')
2
2
  const _onError = Symbol('_onError')
3
+ const _setProgress = Symbol('_setProgess')
3
4
  const npmlog = require('npmlog')
4
5
 
5
6
  module.exports = cls => class Tracker extends cls {
6
7
  constructor (options = {}) {
7
8
  super(options)
9
+ this[_setProgress] = !!options.progress
8
10
  this[_progress] = new Map()
9
11
  }
10
12
 
@@ -27,7 +29,7 @@ module.exports = cls => class Tracker extends cls {
27
29
  // 1. no existing tracker, no subsection
28
30
  // Create a new tracker from npmlog
29
31
  // starts progress bar
30
- if (this[_progress].size === 0) {
32
+ if (this[_setProgress] && this[_progress].size === 0) {
31
33
  npmlog.enableProgress()
32
34
  }
33
35
 
@@ -76,7 +78,7 @@ module.exports = cls => class Tracker extends cls {
76
78
 
77
79
  // remove progress bar if all
78
80
  // trackers are finished
79
- if (this[_progress].size === 0) {
81
+ if (this[_setProgress] && this[_progress].size === 0) {
80
82
  npmlog.disableProgress()
81
83
  }
82
84
  } else if (!hasTracker && subsection === null) {
@@ -92,7 +94,9 @@ module.exports = cls => class Tracker extends cls {
92
94
  }
93
95
 
94
96
  [_onError] (msg) {
95
- npmlog.disableProgress()
97
+ if (this[_setProgress]) {
98
+ npmlog.disableProgress()
99
+ }
96
100
  throw new Error(msg)
97
101
  }
98
102
  }
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@npmcli/arborist",
3
- "version": "5.0.1",
3
+ "version": "5.0.4",
4
4
  "description": "Manage node_modules trees",
5
5
  "dependencies": {
6
6
  "@isaacs/string-locale-compare": "^1.1.0",
7
7
  "@npmcli/installed-package-contents": "^1.0.7",
8
8
  "@npmcli/map-workspaces": "^2.0.0",
9
- "@npmcli/metavuln-calculator": "^3.0.0",
9
+ "@npmcli/metavuln-calculator": "^3.0.1",
10
10
  "@npmcli/move-file": "^1.1.0",
11
11
  "@npmcli/name-from-folder": "^1.0.1",
12
12
  "@npmcli/node-gyp": "^1.0.3",
13
13
  "@npmcli/package-json": "^1.0.1",
14
14
  "@npmcli/run-script": "^3.0.0",
15
15
  "bin-links": "^3.0.0",
16
- "cacache": "^15.0.3",
16
+ "cacache": "^16.0.0",
17
17
  "common-ancestor-path": "^1.0.1",
18
18
  "json-parse-even-better-errors": "^2.3.1",
19
19
  "json-stringify-nice": "^1.1.4",
@@ -25,7 +25,7 @@
25
25
  "npm-pick-manifest": "^7.0.0",
26
26
  "npm-registry-fetch": "^13.0.0",
27
27
  "npmlog": "^6.0.1",
28
- "pacote": "^13.0.2",
28
+ "pacote": "^13.0.5",
29
29
  "parse-conflict-json": "^2.0.1",
30
30
  "proc-log": "^2.0.0",
31
31
  "promise-all-reject-late": "^1.0.0",
@@ -39,7 +39,8 @@
39
39
  "walk-up-path": "^1.0.0"
40
40
  },
41
41
  "devDependencies": {
42
- "@npmcli/template-oss": "^2.4.2",
42
+ "@npmcli/eslint-config": "^3.0.1",
43
+ "@npmcli/template-oss": "3.2.2",
43
44
  "benchmark": "^2.1.4",
44
45
  "chalk": "^4.1.0",
45
46
  "minify-registry-metadata": "^2.1.0",
@@ -57,24 +58,24 @@
57
58
  "postversion": "npm publish",
58
59
  "prepublishOnly": "git push origin --follow-tags",
59
60
  "eslint": "eslint",
60
- "lint": "eslint '**/*.js'",
61
+ "lint": "eslint \"**/*.js\"",
61
62
  "lintfix": "npm run lint -- --fix",
62
63
  "benchmark": "node scripts/benchmark.js",
63
64
  "benchclean": "rm -rf scripts/benchmark/*/",
64
65
  "npmclilint": "npmcli-lint",
65
- "postlint": "npm-template-check",
66
- "template-copy": "npm-template-copy --force"
66
+ "postlint": "template-oss-check",
67
+ "template-oss-apply": "template-oss-apply --force"
67
68
  },
68
69
  "repository": {
69
70
  "type": "git",
70
- "url": "https://github.com/npm/cli",
71
+ "url": "https://github.com/npm/cli.git",
71
72
  "directory": "workspaces/arborist"
72
73
  },
73
74
  "author": "GitHub Inc.",
74
75
  "license": "ISC",
75
76
  "files": [
76
- "bin",
77
- "lib"
77
+ "bin/",
78
+ "lib/"
78
79
  ],
79
80
  "main": "lib/index.js",
80
81
  "bin": {
@@ -96,13 +97,10 @@
96
97
  "timeout": "360"
97
98
  },
98
99
  "engines": {
99
- "node": "^12.13.0 || ^14.15.0 || >=16"
100
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
100
101
  },
101
- "eslintIgnore": [
102
- "test/fixtures/",
103
- "!test/fixtures/*.js"
104
- ],
105
102
  "templateOSS": {
106
- "version": "2.9.2"
103
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
104
+ "version": "3.2.2"
107
105
  }
108
106
  }