@npmcli/arborist 2.6.3 → 2.6.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.
- package/bin/lib/timers.js +3 -1
- package/lib/arborist/reify.js +21 -2
- package/lib/diff.js +2 -2
- package/lib/shrinkwrap.js +1 -0
- package/package.json +2 -1
- package/lib/update-root-package-json.js +0 -95
package/bin/lib/timers.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const timers = Object.create(null)
|
|
2
2
|
const { format } = require('util')
|
|
3
|
+
const options = require('./options.js')
|
|
3
4
|
|
|
4
5
|
process.on('time', name => {
|
|
5
6
|
if (timers[name])
|
|
@@ -15,7 +16,8 @@ process.on('timeEnd', name => {
|
|
|
15
16
|
const res = process.hrtime(timers[name])
|
|
16
17
|
delete timers[name]
|
|
17
18
|
const msg = format(`${process.pid} ${name}`, res[0] * 1e3 + res[1] / 1e6)
|
|
18
|
-
|
|
19
|
+
if (options.timers !== false)
|
|
20
|
+
console.error(dim(msg))
|
|
19
21
|
})
|
|
20
22
|
|
|
21
23
|
process.on('exit', () => {
|
package/lib/arborist/reify.js
CHANGED
|
@@ -15,6 +15,7 @@ const mkdirp = require('mkdirp-infer-owner')
|
|
|
15
15
|
const justMkdirp = require('mkdirp')
|
|
16
16
|
const moveFile = require('@npmcli/move-file')
|
|
17
17
|
const rimraf = promisify(require('rimraf'))
|
|
18
|
+
const PackageJson = require('@npmcli/package-json')
|
|
18
19
|
const packageContents = require('@npmcli/installed-package-contents')
|
|
19
20
|
const { checkEngine, checkPlatform } = require('npm-install-checks')
|
|
20
21
|
|
|
@@ -24,7 +25,6 @@ const Diff = require('../diff.js')
|
|
|
24
25
|
const retirePath = require('../retire-path.js')
|
|
25
26
|
const promiseAllRejectLate = require('promise-all-reject-late')
|
|
26
27
|
const optionalSet = require('../optional-set.js')
|
|
27
|
-
const updateRootPackageJson = require('../update-root-package-json.js')
|
|
28
28
|
const calcDepFlags = require('../calc-dep-flags.js')
|
|
29
29
|
const { saveTypeMap, hasSubKey } = require('../add-rm-pkg-deps.js')
|
|
30
30
|
|
|
@@ -1029,6 +1029,25 @@ module.exports = cls => class Reifier extends cls {
|
|
|
1029
1029
|
|
|
1030
1030
|
const promises = [this[_saveLockFile](saveOpt)]
|
|
1031
1031
|
|
|
1032
|
+
const updatePackageJson = async (tree) => {
|
|
1033
|
+
const pkgJson = await PackageJson.load(tree.path)
|
|
1034
|
+
.catch(() => new PackageJson(tree.path))
|
|
1035
|
+
const {
|
|
1036
|
+
dependencies = {},
|
|
1037
|
+
devDependencies = {},
|
|
1038
|
+
optionalDependencies = {},
|
|
1039
|
+
peerDependencies = {},
|
|
1040
|
+
} = tree.package
|
|
1041
|
+
|
|
1042
|
+
pkgJson.update({
|
|
1043
|
+
dependencies,
|
|
1044
|
+
devDependencies,
|
|
1045
|
+
optionalDependencies,
|
|
1046
|
+
peerDependencies,
|
|
1047
|
+
})
|
|
1048
|
+
await pkgJson.save()
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1032
1051
|
// grab any from explicitRequests that had deps removed
|
|
1033
1052
|
for (const { from: tree } of this.explicitRequests)
|
|
1034
1053
|
updatedTrees.add(tree)
|
|
@@ -1036,7 +1055,7 @@ module.exports = cls => class Reifier extends cls {
|
|
|
1036
1055
|
for (const tree of updatedTrees) {
|
|
1037
1056
|
// refresh the edges so they have the correct specs
|
|
1038
1057
|
tree.package = tree.package
|
|
1039
|
-
promises.push(
|
|
1058
|
+
promises.push(updatePackageJson(tree))
|
|
1040
1059
|
}
|
|
1041
1060
|
|
|
1042
1061
|
await Promise.all(promises)
|
package/lib/diff.js
CHANGED
|
@@ -145,9 +145,9 @@ const allChildren = node => {
|
|
|
145
145
|
if (!node)
|
|
146
146
|
return new Map()
|
|
147
147
|
|
|
148
|
-
// if the node is
|
|
148
|
+
// if the node is root, and also a link, then what we really
|
|
149
149
|
// want is to traverse the target's children
|
|
150
|
-
if (node.
|
|
150
|
+
if (node.isRoot && node.isLink)
|
|
151
151
|
return allChildren(node.target)
|
|
152
152
|
|
|
153
153
|
const kids = new Map()
|
package/lib/shrinkwrap.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@npmcli/arborist",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.4",
|
|
4
4
|
"description": "Manage node_modules trees",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@npmcli/installed-package-contents": "^1.0.7",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"@npmcli/move-file": "^1.1.0",
|
|
10
10
|
"@npmcli/name-from-folder": "^1.0.1",
|
|
11
11
|
"@npmcli/node-gyp": "^1.0.1",
|
|
12
|
+
"@npmcli/package-json": "^1.0.1",
|
|
12
13
|
"@npmcli/run-script": "^1.8.2",
|
|
13
14
|
"bin-links": "^2.2.1",
|
|
14
15
|
"cacache": "^15.0.3",
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
const fs = require('fs')
|
|
2
|
-
const promisify = require('util').promisify
|
|
3
|
-
const readFile = promisify(fs.readFile)
|
|
4
|
-
const writeFile = promisify(fs.writeFile)
|
|
5
|
-
const {resolve} = require('path')
|
|
6
|
-
|
|
7
|
-
const parseJSON = require('json-parse-even-better-errors')
|
|
8
|
-
|
|
9
|
-
const depTypes = new Set([
|
|
10
|
-
'dependencies',
|
|
11
|
-
'optionalDependencies',
|
|
12
|
-
'devDependencies',
|
|
13
|
-
'peerDependencies',
|
|
14
|
-
])
|
|
15
|
-
|
|
16
|
-
// sort alphabetically all types of deps for a given package
|
|
17
|
-
const orderDeps = (pkg) => {
|
|
18
|
-
for (const type of depTypes) {
|
|
19
|
-
if (pkg && pkg[type]) {
|
|
20
|
-
pkg[type] = Object.keys(pkg[type])
|
|
21
|
-
.sort((a, b) => a.localeCompare(b, 'en'))
|
|
22
|
-
.reduce((res, key) => {
|
|
23
|
-
res[key] = pkg[type][key]
|
|
24
|
-
return res
|
|
25
|
-
}, {})
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return pkg
|
|
29
|
-
}
|
|
30
|
-
const parseJsonSafe = json => {
|
|
31
|
-
try {
|
|
32
|
-
return parseJSON(json)
|
|
33
|
-
} catch (er) {
|
|
34
|
-
return null
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const updateRootPackageJson = async tree => {
|
|
39
|
-
const filename = resolve(tree.path, 'package.json')
|
|
40
|
-
const originalJson = await readFile(filename, 'utf8').catch(() => null)
|
|
41
|
-
const originalContent = parseJsonSafe(originalJson)
|
|
42
|
-
|
|
43
|
-
const depsData = orderDeps({
|
|
44
|
-
...tree.package,
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
// optionalDependencies don't need to be repeated in two places
|
|
48
|
-
if (depsData.dependencies) {
|
|
49
|
-
if (depsData.optionalDependencies) {
|
|
50
|
-
for (const name of Object.keys(depsData.optionalDependencies))
|
|
51
|
-
delete depsData.dependencies[name]
|
|
52
|
-
}
|
|
53
|
-
if (Object.keys(depsData.dependencies).length === 0)
|
|
54
|
-
delete depsData.dependencies
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// if there's no package.json, just use internal pkg info as source of truth
|
|
58
|
-
// clone the object though, so we can still refer to what it originally was
|
|
59
|
-
const packageJsonContent = !originalContent ? depsData
|
|
60
|
-
: Object.assign({}, originalContent)
|
|
61
|
-
|
|
62
|
-
// loop through all types of dependencies and update package json content
|
|
63
|
-
for (const type of depTypes)
|
|
64
|
-
packageJsonContent[type] = depsData[type]
|
|
65
|
-
|
|
66
|
-
// if original package.json had dep in peerDeps AND deps, preserve that.
|
|
67
|
-
const { dependencies: origProd, peerDependencies: origPeer } =
|
|
68
|
-
originalContent || {}
|
|
69
|
-
const { peerDependencies: newPeer } = packageJsonContent
|
|
70
|
-
if (origProd && origPeer && newPeer) {
|
|
71
|
-
// we have original prod/peer deps, and new peer deps
|
|
72
|
-
// copy over any that were in both in the original
|
|
73
|
-
for (const name of Object.keys(origPeer)) {
|
|
74
|
-
if (origProd[name] !== undefined && newPeer[name] !== undefined) {
|
|
75
|
-
packageJsonContent.dependencies = packageJsonContent.dependencies || {}
|
|
76
|
-
packageJsonContent.dependencies[name] = newPeer[name]
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// format content
|
|
82
|
-
const {
|
|
83
|
-
[Symbol.for('indent')]: indent,
|
|
84
|
-
[Symbol.for('newline')]: newline,
|
|
85
|
-
} = tree.package
|
|
86
|
-
const format = indent === undefined ? ' ' : indent
|
|
87
|
-
const eol = newline === undefined ? '\n' : newline
|
|
88
|
-
const content = (JSON.stringify(packageJsonContent, null, format) + '\n')
|
|
89
|
-
.replace(/\n/g, eol)
|
|
90
|
-
|
|
91
|
-
if (content !== originalJson)
|
|
92
|
-
return writeFile(filename, content)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
module.exports = updateRootPackageJson
|