@npmcli/arborist 2.6.3 → 2.8.0
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/build-ideal-tree.js +118 -693
- package/lib/arborist/index.js +1 -1
- package/lib/arborist/load-actual.js +1 -1
- package/lib/arborist/load-virtual.js +1 -1
- package/lib/arborist/rebuild.js +3 -3
- package/lib/arborist/reify.js +149 -43
- package/lib/calc-dep-flags.js +3 -3
- package/lib/can-place-dep.js +405 -0
- package/lib/deepest-nesting-target.js +16 -0
- package/lib/diff.js +5 -7
- package/lib/edge.js +2 -0
- package/lib/node.js +40 -6
- package/lib/peer-entry-sets.js +72 -0
- package/lib/place-dep.js +536 -0
- package/lib/printable.js +10 -0
- package/lib/shrinkwrap.js +9 -6
- package/package.json +8 -4
- package/lib/peer-set.js +0 -25
- package/lib/update-root-package-json.js +0 -95
package/lib/peer-set.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// when we have to dupe a set of peer dependencies deeper into the tree in
|
|
2
|
-
// order to make room for a dep that would otherwise conflict, we use
|
|
3
|
-
// this to get the set of all deps that have to be checked to ensure
|
|
4
|
-
// nothing is locking them into the current location.
|
|
5
|
-
//
|
|
6
|
-
// this is different in its semantics from an "optional set" (ie, the nodes
|
|
7
|
-
// that should be removed if an optional dep fails), because in this case,
|
|
8
|
-
// we specifically intend to include deps in the peer set that have
|
|
9
|
-
// dependants outside the set.
|
|
10
|
-
const peerSet = node => {
|
|
11
|
-
const set = new Set([node])
|
|
12
|
-
for (const node of set) {
|
|
13
|
-
for (const edge of node.edgesOut.values()) {
|
|
14
|
-
if (edge.valid && edge.peer && edge.to)
|
|
15
|
-
set.add(edge.to)
|
|
16
|
-
}
|
|
17
|
-
for (const edge of node.edgesIn) {
|
|
18
|
-
if (edge.valid && edge.peer)
|
|
19
|
-
set.add(edge.from)
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return set
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
module.exports = peerSet
|
|
@@ -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
|