@teambit/objects 0.0.708 → 0.0.710
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/dist/models/dependencies-graph.d.ts +15 -1
- package/dist/models/dependencies-graph.js +40 -3
- package/dist/models/dependencies-graph.js.map +1 -1
- package/dist/models/dependencies-graph.spec.js +83 -0
- package/dist/models/dependencies-graph.spec.js.map +1 -1
- package/models/dependencies-graph.spec.ts +77 -0
- package/models/dependencies-graph.ts +38 -0
- package/package.json +22 -22
- /package/dist/{preview-1791297100889.js → preview-1791405980305.js} +0 -0
|
@@ -30,15 +30,29 @@ export declare class DependenciesGraph {
|
|
|
30
30
|
schemaVersion: string;
|
|
31
31
|
packages: PackagesMap;
|
|
32
32
|
edges: DependencyEdge[];
|
|
33
|
-
|
|
33
|
+
/**
|
|
34
|
+
* The `pnpmfileChecksum` of the lockfile the graph was created from: an id of
|
|
35
|
+
* the readPackage hooks the dependencies were resolved with. A lockfile
|
|
36
|
+
* restored from the graph carries it, so pnpm trusts the restored resolution
|
|
37
|
+
* only while Bit's hooks are still the same. Graphs created before this field
|
|
38
|
+
* existed don't have it.
|
|
39
|
+
*/
|
|
40
|
+
pnpmfileChecksum?: string;
|
|
41
|
+
constructor({ packages, edges, schemaVersion, pnpmfileChecksum, }: {
|
|
34
42
|
packages: PackagesMap;
|
|
35
43
|
edges: DependencyEdge[];
|
|
36
44
|
schemaVersion?: string;
|
|
45
|
+
pnpmfileChecksum?: string;
|
|
37
46
|
});
|
|
38
47
|
serialize(): string;
|
|
39
48
|
static deserialize(data: string): DependenciesGraph | undefined;
|
|
40
49
|
merge(graph: DependenciesGraph): void;
|
|
41
50
|
isEmpty(): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Whether the graph holds any resolved dependency. A component without
|
|
53
|
+
* dependencies has only an empty root edge.
|
|
54
|
+
*/
|
|
55
|
+
hasResolutions(): boolean;
|
|
42
56
|
/**
|
|
43
57
|
* Returns the edge related to the root component
|
|
44
58
|
*/
|
|
@@ -22,20 +22,32 @@ class DependenciesGraph {
|
|
|
22
22
|
constructor({
|
|
23
23
|
packages,
|
|
24
24
|
edges,
|
|
25
|
-
schemaVersion
|
|
25
|
+
schemaVersion,
|
|
26
|
+
pnpmfileChecksum
|
|
26
27
|
}) {
|
|
27
28
|
_defineProperty(this, "schemaVersion", void 0);
|
|
28
29
|
_defineProperty(this, "packages", void 0);
|
|
29
30
|
_defineProperty(this, "edges", void 0);
|
|
31
|
+
/**
|
|
32
|
+
* The `pnpmfileChecksum` of the lockfile the graph was created from: an id of
|
|
33
|
+
* the readPackage hooks the dependencies were resolved with. A lockfile
|
|
34
|
+
* restored from the graph carries it, so pnpm trusts the restored resolution
|
|
35
|
+
* only while Bit's hooks are still the same. Graphs created before this field
|
|
36
|
+
* existed don't have it.
|
|
37
|
+
*/
|
|
38
|
+
_defineProperty(this, "pnpmfileChecksum", void 0);
|
|
30
39
|
this.packages = packages;
|
|
31
40
|
this.edges = edges;
|
|
32
41
|
this.schemaVersion = schemaVersion ?? DEPENDENCIES_GRAPH_SCHEMA_VERSION;
|
|
42
|
+
this.pnpmfileChecksum = pnpmfileChecksum;
|
|
33
43
|
}
|
|
34
44
|
serialize() {
|
|
35
45
|
return JSON.stringify({
|
|
36
46
|
schemaVersion: this.schemaVersion,
|
|
37
47
|
packages: Object.fromEntries(this.packages.entries()),
|
|
38
|
-
edges: this.edges
|
|
48
|
+
edges: this.edges,
|
|
49
|
+
// JSON.stringify omits it when undefined.
|
|
50
|
+
pnpmfileChecksum: this.pnpmfileChecksum
|
|
39
51
|
});
|
|
40
52
|
}
|
|
41
53
|
static deserialize(data) {
|
|
@@ -47,10 +59,12 @@ class DependenciesGraph {
|
|
|
47
59
|
return new DependenciesGraph({
|
|
48
60
|
schemaVersion: parsed.schemaVersion,
|
|
49
61
|
edges: parsed.edges,
|
|
50
|
-
packages: new Map(Object.entries(parsed.packages))
|
|
62
|
+
packages: new Map(Object.entries(parsed.packages)),
|
|
63
|
+
pnpmfileChecksum: parsed.pnpmfileChecksum
|
|
51
64
|
});
|
|
52
65
|
}
|
|
53
66
|
merge(graph) {
|
|
67
|
+
this.pnpmfileChecksum = mergePnpmfileChecksums(this, graph);
|
|
54
68
|
const rootEdge = this.findRootEdge();
|
|
55
69
|
const incomingRootEdge = graph.findRootEdge();
|
|
56
70
|
const directDependencies = incomingRootEdge?.neighbours;
|
|
@@ -84,6 +98,17 @@ class DependenciesGraph {
|
|
|
84
98
|
return this.packages.size === 0 && this.edges.length === 0;
|
|
85
99
|
}
|
|
86
100
|
|
|
101
|
+
/**
|
|
102
|
+
* Whether the graph holds any resolved dependency. A component without
|
|
103
|
+
* dependencies has only an empty root edge.
|
|
104
|
+
*/
|
|
105
|
+
hasResolutions() {
|
|
106
|
+
return this.packages.size > 0 || this.edges.some(({
|
|
107
|
+
id,
|
|
108
|
+
neighbours
|
|
109
|
+
}) => id !== DependenciesGraph.ROOT_EDGE_ID || neighbours.length > 0);
|
|
110
|
+
}
|
|
111
|
+
|
|
87
112
|
/**
|
|
88
113
|
* Returns the edge related to the root component
|
|
89
114
|
*/
|
|
@@ -237,8 +262,20 @@ class DependenciesGraph {
|
|
|
237
262
|
return versionsByPackageName;
|
|
238
263
|
}
|
|
239
264
|
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* The merged graph mixes resolutions from both graphs. It can only claim a set
|
|
268
|
+
* of readPackage hooks when both were resolved with the same ones; otherwise
|
|
269
|
+
* it is left unset, so pnpm resolves again instead of trusting it. A graph
|
|
270
|
+
* without resolutions has nothing to vouch for, so it doesn't count.
|
|
271
|
+
*/
|
|
240
272
|
exports.DependenciesGraph = DependenciesGraph;
|
|
241
273
|
_defineProperty(DependenciesGraph, "ROOT_EDGE_ID", '.');
|
|
274
|
+
function mergePnpmfileChecksums(graph1, graph2) {
|
|
275
|
+
if (!graph2.hasResolutions()) return graph1.pnpmfileChecksum;
|
|
276
|
+
if (!graph1.hasResolutions()) return graph2.pnpmfileChecksum;
|
|
277
|
+
return graph1.pnpmfileChecksum === graph2.pnpmfileChecksum ? graph1.pnpmfileChecksum : undefined;
|
|
278
|
+
}
|
|
242
279
|
function isSameDirectDependency(dep1, dep2) {
|
|
243
280
|
if (!dep1.name || !dep2.name) return dep1.id === dep2.id;
|
|
244
281
|
if (dep1.name !== dep2.name) return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_semver","data","_interopRequireDefault","require","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","DEPENDENCIES_GRAPH_SCHEMA_VERSION","DependenciesGraph","constructor","packages","edges","schemaVersion","serialize","JSON","stringify","fromEntries","entries","deserialize","parsed","parse","undefined","Map","merge","graph","rootEdge","findRootEdge","incomingRootEdge","directDependencies","neighbours","directDep","existingDirectDep","find","existingDep","isSameDirectDependency","isWildcardSpecifier","specifier","id","nodeIdLessThan","newPkgId","newPkgAttr","set","ROOT_EDGE_ID","normalizePeerProviderVersions","pruneUnreachableFromRoot","isEmpty","size","edgesById","edge","reachableEdges","Set","reachablePackages","visited","stack","map","neighbour","nodeId","pop","has","add","nodeIdWithoutPeerSuffix","peerId","splitPeerIds","isPatchHashSegment","get","attr","pkgId","Array","from","values","delete","versionsByPackageName","collectVersionsByPackageName","getBestCompatiblePeer","name","range","version","semver","satisfies","includePrerelease","getHighestPeer","rewritePeerId","peerDependencies","parsedPeer","parsePkgId","nestedPeerDependencies","peerIds","nestedPeerId","rewrittenBase","bestPeer","createPeerSuffix","rewritePeerDep","depId","peerIdsByName","parsedDep","rewriteNodeId","changed","rewrittenPeerIds","rewrittenPeerId","rewriteNeighbour","rewrittenId","rewrittenEdge","existingEdge","mergeNeighbours","addVersion","valid","versions","sort","version1","version2","rcompare","exports","dep1","dep2","nodeId1","nodeId2","getVersionFromNodeId","lt","existingNeighbours","newNeighbours","newNeighbour","existingNeighbour","depPathWithoutPeerSuffix","versionStart","lastIndexOf","slice","suffixStart","indexOf","depth","peerStart","index","char","patchSegments","peerSegments","join","segment","startsWith","coerce"],"sources":["dependencies-graph.ts"],"sourcesContent":["import semver from 'semver';\nimport type { LockfilePackageInfo } from '@pnpm/lockfile.types';\n\nexport type PackagesMap = Map<string, PackageAttributes>;\n\nexport type PackageAttributes = LockfilePackageInfo & {\n component?: {\n scope: string;\n name: string;\n };\n requiresBuild?: boolean;\n};\n\nexport type DependencyEdge = {\n id: string;\n neighbours: DependencyNeighbour[];\n attr?: {\n pkgId?: string;\n transitivePeerDependencies?: string[];\n };\n};\n\nexport type DependencyNeighbour = {\n id: string;\n /**\n * This is true when the dependency is from optionalDependencies.\n */\n optional?: boolean;\n name?: string;\n specifier?: string;\n lifecycle?: 'runtime' | 'dev';\n};\n\nconst DEPENDENCIES_GRAPH_SCHEMA_VERSION = '2.0';\n\nexport class DependenciesGraph {\n static ROOT_EDGE_ID = '.';\n\n schemaVersion: string;\n packages: PackagesMap;\n edges: DependencyEdge[];\n\n constructor({\n packages,\n edges,\n schemaVersion,\n }: {\n packages: PackagesMap;\n edges: DependencyEdge[];\n schemaVersion?: string;\n }) {\n this.packages = packages;\n this.edges = edges;\n this.schemaVersion = schemaVersion ?? DEPENDENCIES_GRAPH_SCHEMA_VERSION;\n }\n\n serialize(): string {\n return JSON.stringify({\n schemaVersion: this.schemaVersion,\n packages: Object.fromEntries(this.packages.entries()),\n edges: this.edges,\n });\n }\n\n static deserialize(data: string): DependenciesGraph | undefined {\n const parsed = JSON.parse(data);\n // If the schema version is not supported, then we just ignore the data\n if (parsed.schemaVersion !== DEPENDENCIES_GRAPH_SCHEMA_VERSION) {\n return undefined;\n }\n return new DependenciesGraph({\n schemaVersion: parsed.schemaVersion,\n edges: parsed.edges,\n packages: new Map(Object.entries(parsed.packages)),\n });\n }\n\n merge(graph: DependenciesGraph): void {\n const rootEdge = this.findRootEdge();\n const incomingRootEdge = graph.findRootEdge();\n const directDependencies = incomingRootEdge?.neighbours;\n if (directDependencies && rootEdge) {\n for (const directDep of directDependencies) {\n const existingDirectDep = rootEdge.neighbours.find((existingDep) =>\n isSameDirectDependency(existingDep, directDep)\n );\n if (existingDirectDep == null) {\n rootEdge.neighbours.push(directDep);\n } else {\n if (isWildcardSpecifier(existingDirectDep.specifier) && !isWildcardSpecifier(directDep.specifier)) {\n existingDirectDep.specifier = directDep.specifier;\n }\n if (existingDirectDep.id !== directDep.id && nodeIdLessThan(existingDirectDep.id, directDep.id)) {\n existingDirectDep.id = directDep.id;\n }\n }\n }\n } else if (incomingRootEdge) {\n this.edges.push(incomingRootEdge);\n }\n for (const [newPkgId, newPkgAttr] of graph.packages.entries()) {\n this.packages.set(newPkgId, newPkgAttr);\n }\n this.edges.push(...graph.edges.filter(({ id }) => id !== DependenciesGraph.ROOT_EDGE_ID));\n this.normalizePeerProviderVersions();\n this.pruneUnreachableFromRoot();\n }\n\n isEmpty(): boolean {\n return this.packages.size === 0 && this.edges.length === 0;\n }\n\n /**\n * Returns the edge related to the root component\n */\n findRootEdge(): DependencyEdge | undefined {\n return this.edges.find(({ id }) => id === DependenciesGraph.ROOT_EDGE_ID);\n }\n\n private pruneUnreachableFromRoot(): void {\n const rootEdge = this.findRootEdge();\n if (!rootEdge) return;\n const edgesById = new Map<string, DependencyEdge>();\n for (const edge of this.edges) {\n if (edge.id !== DependenciesGraph.ROOT_EDGE_ID) {\n edgesById.set(edge.id, edge);\n }\n }\n const reachableEdges = new Set<string>();\n const reachablePackages = new Set<string>();\n // An explicit stack: deep dependency chains would overflow the call\n // stack with a recursive walk. Every node id is processed once — the\n // guard must sit before the suffix pushes, or a node referenced by M\n // edges re-pushes its suffix ids M times and nested suffixes multiply\n // that per level.\n const visited = new Set<string>();\n const stack = rootEdge.neighbours.map((neighbour) => neighbour.id);\n while (stack.length > 0) {\n const nodeId = stack.pop()!;\n if (visited.has(nodeId)) continue;\n visited.add(nodeId);\n reachablePackages.add(nodeIdWithoutPeerSuffix(nodeId));\n for (const peerId of splitPeerIds(nodeId)) {\n if (!isPatchHashSegment(peerId)) stack.push(peerId);\n }\n const edge = edgesById.get(nodeId);\n if (!edge) continue;\n reachableEdges.add(nodeId);\n if (edge.attr?.pkgId) reachablePackages.add(edge.attr.pkgId);\n for (const neighbour of edge.neighbours) {\n stack.push(neighbour.id);\n }\n }\n this.edges = [rootEdge, ...Array.from(edgesById.values()).filter((edge) => reachableEdges.has(edge.id))];\n for (const pkgId of this.packages.keys()) {\n if (!reachablePackages.has(pkgId)) {\n this.packages.delete(pkgId);\n }\n }\n }\n\n private normalizePeerProviderVersions(): void {\n const versionsByPackageName = this.collectVersionsByPackageName();\n const getBestCompatiblePeer = (name: string, range: string) =>\n versionsByPackageName\n .get(name)\n ?.find(({ version }) => semver.satisfies(version, range, { includePrerelease: true }));\n const getHighestPeer = (name: string) => versionsByPackageName.get(name)?.[0];\n const rewritePeerId = (peerId: string, peerDependencies?: Record<string, string>): string => {\n const parsedPeer = parsePkgId(peerId);\n const nestedPeerDependencies = this.packages.get(nodeIdWithoutPeerSuffix(peerId))?.peerDependencies;\n const peerIds = splitPeerIds(peerId).map((nestedPeerId) => rewritePeerId(nestedPeerId, nestedPeerDependencies));\n let rewrittenBase = nodeIdWithoutPeerSuffix(peerId);\n if (parsedPeer) {\n const range = peerDependencies?.[parsedPeer.name];\n const bestPeer = range ? getBestCompatiblePeer(parsedPeer.name, range) : getHighestPeer(parsedPeer.name);\n if (bestPeer) rewrittenBase = `${parsedPeer.name}@${bestPeer.version}`;\n }\n return `${rewrittenBase}${createPeerSuffix(peerIds)}`;\n };\n const rewritePeerDep = (\n depId: string,\n peerDependencies?: Record<string, string>,\n peerIdsByName?: Map<string, string>\n ) => {\n const peerId = peerIdsByName?.get(parsePkgId(depId)?.name ?? '');\n if (peerId) return peerId;\n if (!peerDependencies) return depId;\n const parsedDep = parsePkgId(depId);\n if (!parsedDep) return depId;\n const range = peerDependencies[parsedDep.name];\n if (!range) return depId;\n const bestPeer = getBestCompatiblePeer(parsedDep.name, range);\n if (!bestPeer) return depId;\n return `${parsedDep.name}@${bestPeer.version}`;\n };\n const rewriteNodeId = (nodeId: string) => {\n const pkgId = nodeIdWithoutPeerSuffix(nodeId);\n const peerDependencies = this.packages.get(pkgId)?.peerDependencies;\n const peerIds = splitPeerIds(nodeId);\n if (peerIds.length === 0) return nodeId;\n let changed = false;\n const rewrittenPeerIds = peerIds.map((peerId) => {\n const rewrittenPeerId = rewritePeerId(peerId, peerDependencies);\n if (rewrittenPeerId === peerId) return peerId;\n changed = true;\n return rewrittenPeerId;\n });\n if (!changed) return nodeId;\n return `${pkgId}${createPeerSuffix(rewrittenPeerIds)}`;\n };\n const rewriteNeighbour = (\n neighbour: DependencyNeighbour,\n peerDependencies?: Record<string, string>,\n peerIdsByName?: Map<string, string>\n ) => {\n const rewrittenId = rewriteNodeId(rewritePeerDep(neighbour.id, peerDependencies, peerIdsByName));\n return rewrittenId === neighbour.id ? neighbour : { ...neighbour, id: rewrittenId };\n };\n const edgesById = new Map<string, DependencyEdge>();\n for (const edge of this.edges) {\n const peerDependencies =\n edge.id === DependenciesGraph.ROOT_EDGE_ID\n ? undefined\n : this.packages.get(edge.attr?.pkgId ?? nodeIdWithoutPeerSuffix(edge.id))?.peerDependencies;\n const peerIdsByName = new Map<string, string>();\n for (const peerId of splitPeerIds(edge.id)) {\n const rewrittenPeerId = rewritePeerId(peerId, peerDependencies);\n const parsedPeer = parsePkgId(rewrittenPeerId);\n if (parsedPeer) peerIdsByName.set(parsedPeer.name, rewrittenPeerId);\n }\n const rewrittenEdge: DependencyEdge = {\n ...edge,\n id: edge.id === DependenciesGraph.ROOT_EDGE_ID ? edge.id : rewriteNodeId(edge.id),\n neighbours: edge.neighbours.map((neighbour) => rewriteNeighbour(neighbour, peerDependencies, peerIdsByName)),\n };\n const existingEdge = edgesById.get(rewrittenEdge.id);\n if (existingEdge) {\n mergeNeighbours(existingEdge.neighbours, rewrittenEdge.neighbours);\n } else {\n edgesById.set(rewrittenEdge.id, rewrittenEdge);\n }\n }\n this.edges = Array.from(edgesById.values());\n }\n\n private collectVersionsByPackageName(): Map<string, Array<{ version: string }>> {\n const versionsByPackageName = new Map<string, Array<{ version: string }>>();\n const addVersion = (pkgId: string) => {\n const parsed = parsePkgId(pkgId);\n if (!parsed || !semver.valid(parsed.version)) return;\n const versions = versionsByPackageName.get(parsed.name) ?? [];\n versions.push({ version: parsed.version });\n versionsByPackageName.set(parsed.name, versions);\n for (const peerId of splitPeerIds(pkgId)) {\n addVersion(peerId);\n }\n };\n for (const pkgId of this.packages.keys()) {\n addVersion(pkgId);\n }\n for (const edge of this.edges) {\n addVersion(edge.id);\n for (const neighbour of edge.neighbours) {\n addVersion(neighbour.id);\n }\n }\n for (const versions of versionsByPackageName.values()) {\n versions.sort((version1, version2) => semver.rcompare(version1.version, version2.version));\n }\n return versionsByPackageName;\n }\n}\n\nfunction isSameDirectDependency(dep1: DependencyNeighbour, dep2: DependencyNeighbour): boolean {\n if (!dep1.name || !dep2.name) return dep1.id === dep2.id;\n if (dep1.name !== dep2.name) return false;\n return (\n dep1.specifier === dep2.specifier || isWildcardSpecifier(dep1.specifier) || isWildcardSpecifier(dep2.specifier)\n );\n}\n\nfunction isWildcardSpecifier(specifier?: string): boolean {\n return specifier === '*' || specifier == null || specifier === '';\n}\n\nfunction nodeIdLessThan(nodeId1: string, nodeId2: string): boolean {\n const version1 = getVersionFromNodeId(nodeId1);\n if (!version1) return false;\n const version2 = getVersionFromNodeId(nodeId2);\n if (!version2) return false;\n return semver.lt(version1, version2);\n}\n\nfunction mergeNeighbours(existingNeighbours: DependencyNeighbour[], newNeighbours: DependencyNeighbour[]): void {\n for (const newNeighbour of newNeighbours) {\n const existingNeighbour = existingNeighbours.find((neighbour) => neighbour.id === newNeighbour.id);\n if (!existingNeighbour) existingNeighbours.push(newNeighbour);\n }\n}\n\nfunction parsePkgId(pkgId: string): { name: string; version: string } | undefined {\n const depPathWithoutPeerSuffix = nodeIdWithoutPeerSuffix(pkgId);\n const versionStart = depPathWithoutPeerSuffix.lastIndexOf('@');\n if (versionStart <= 0) return undefined;\n const name = depPathWithoutPeerSuffix.slice(0, versionStart);\n const version = depPathWithoutPeerSuffix.slice(versionStart + 1);\n if (!name || !version) return undefined;\n return { name, version };\n}\n\nfunction splitPeerIds(nodeId: string): string[] {\n const suffixStart = nodeId.indexOf('(');\n if (suffixStart === -1) return [];\n const peerIds: string[] = [];\n let depth = 0;\n let peerStart: number | undefined;\n for (let index = suffixStart; index < nodeId.length; index += 1) {\n const char = nodeId[index];\n if (char === '(') {\n if (depth === 0) peerStart = index + 1;\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n if (depth === 0 && peerStart != null) {\n peerIds.push(nodeId.slice(peerStart, index));\n peerStart = undefined;\n }\n }\n }\n return peerIds;\n}\n\nfunction createPeerSuffix(peerIds: string[]): string {\n const patchSegments = peerIds.filter(isPatchHashSegment);\n const peerSegments = peerIds.filter((peerId) => !isPatchHashSegment(peerId)).sort();\n return [...patchSegments, ...peerSegments].map((peerId) => `(${peerId})`).join('');\n}\n\nfunction isPatchHashSegment(segment: string): boolean {\n return segment.startsWith('patch_hash=');\n}\n\nfunction getVersionFromNodeId(nodeId: string): string | undefined {\n const depPathWithoutPeerSuffix = nodeIdWithoutPeerSuffix(nodeId);\n const versionStart = depPathWithoutPeerSuffix.lastIndexOf('@');\n if (versionStart === -1) return undefined;\n const version = depPathWithoutPeerSuffix.slice(versionStart + 1);\n return semver.valid(version) ?? semver.coerce(version)?.version;\n}\n\nfunction nodeIdWithoutPeerSuffix(nodeId: string): string {\n const suffixStart = nodeId.indexOf('(');\n return suffixStart === -1 ? nodeId : nodeId.slice(0, suffixStart);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_semver","data","_interopRequireDefault","require","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","DEPENDENCIES_GRAPH_SCHEMA_VERSION","DependenciesGraph","constructor","packages","edges","schemaVersion","pnpmfileChecksum","serialize","JSON","stringify","fromEntries","entries","deserialize","parsed","parse","undefined","Map","merge","graph","mergePnpmfileChecksums","rootEdge","findRootEdge","incomingRootEdge","directDependencies","neighbours","directDep","existingDirectDep","find","existingDep","isSameDirectDependency","isWildcardSpecifier","specifier","id","nodeIdLessThan","newPkgId","newPkgAttr","set","ROOT_EDGE_ID","normalizePeerProviderVersions","pruneUnreachableFromRoot","isEmpty","size","hasResolutions","some","edgesById","edge","reachableEdges","Set","reachablePackages","visited","stack","map","neighbour","nodeId","pop","has","add","nodeIdWithoutPeerSuffix","peerId","splitPeerIds","isPatchHashSegment","get","attr","pkgId","Array","from","values","delete","versionsByPackageName","collectVersionsByPackageName","getBestCompatiblePeer","name","range","version","semver","satisfies","includePrerelease","getHighestPeer","rewritePeerId","peerDependencies","parsedPeer","parsePkgId","nestedPeerDependencies","peerIds","nestedPeerId","rewrittenBase","bestPeer","createPeerSuffix","rewritePeerDep","depId","peerIdsByName","parsedDep","rewriteNodeId","changed","rewrittenPeerIds","rewrittenPeerId","rewriteNeighbour","rewrittenId","rewrittenEdge","existingEdge","mergeNeighbours","addVersion","valid","versions","sort","version1","version2","rcompare","exports","graph1","graph2","dep1","dep2","nodeId1","nodeId2","getVersionFromNodeId","lt","existingNeighbours","newNeighbours","newNeighbour","existingNeighbour","depPathWithoutPeerSuffix","versionStart","lastIndexOf","slice","suffixStart","indexOf","depth","peerStart","index","char","patchSegments","peerSegments","join","segment","startsWith","coerce"],"sources":["dependencies-graph.ts"],"sourcesContent":["import semver from 'semver';\nimport type { LockfilePackageInfo } from '@pnpm/lockfile.types';\n\nexport type PackagesMap = Map<string, PackageAttributes>;\n\nexport type PackageAttributes = LockfilePackageInfo & {\n component?: {\n scope: string;\n name: string;\n };\n requiresBuild?: boolean;\n};\n\nexport type DependencyEdge = {\n id: string;\n neighbours: DependencyNeighbour[];\n attr?: {\n pkgId?: string;\n transitivePeerDependencies?: string[];\n };\n};\n\nexport type DependencyNeighbour = {\n id: string;\n /**\n * This is true when the dependency is from optionalDependencies.\n */\n optional?: boolean;\n name?: string;\n specifier?: string;\n lifecycle?: 'runtime' | 'dev';\n};\n\nconst DEPENDENCIES_GRAPH_SCHEMA_VERSION = '2.0';\n\nexport class DependenciesGraph {\n static ROOT_EDGE_ID = '.';\n\n schemaVersion: string;\n packages: PackagesMap;\n edges: DependencyEdge[];\n /**\n * The `pnpmfileChecksum` of the lockfile the graph was created from: an id of\n * the readPackage hooks the dependencies were resolved with. A lockfile\n * restored from the graph carries it, so pnpm trusts the restored resolution\n * only while Bit's hooks are still the same. Graphs created before this field\n * existed don't have it.\n */\n pnpmfileChecksum?: string;\n\n constructor({\n packages,\n edges,\n schemaVersion,\n pnpmfileChecksum,\n }: {\n packages: PackagesMap;\n edges: DependencyEdge[];\n schemaVersion?: string;\n pnpmfileChecksum?: string;\n }) {\n this.packages = packages;\n this.edges = edges;\n this.schemaVersion = schemaVersion ?? DEPENDENCIES_GRAPH_SCHEMA_VERSION;\n this.pnpmfileChecksum = pnpmfileChecksum;\n }\n\n serialize(): string {\n return JSON.stringify({\n schemaVersion: this.schemaVersion,\n packages: Object.fromEntries(this.packages.entries()),\n edges: this.edges,\n // JSON.stringify omits it when undefined.\n pnpmfileChecksum: this.pnpmfileChecksum,\n });\n }\n\n static deserialize(data: string): DependenciesGraph | undefined {\n const parsed = JSON.parse(data);\n // If the schema version is not supported, then we just ignore the data\n if (parsed.schemaVersion !== DEPENDENCIES_GRAPH_SCHEMA_VERSION) {\n return undefined;\n }\n return new DependenciesGraph({\n schemaVersion: parsed.schemaVersion,\n edges: parsed.edges,\n packages: new Map(Object.entries(parsed.packages)),\n pnpmfileChecksum: parsed.pnpmfileChecksum,\n });\n }\n\n merge(graph: DependenciesGraph): void {\n this.pnpmfileChecksum = mergePnpmfileChecksums(this, graph);\n const rootEdge = this.findRootEdge();\n const incomingRootEdge = graph.findRootEdge();\n const directDependencies = incomingRootEdge?.neighbours;\n if (directDependencies && rootEdge) {\n for (const directDep of directDependencies) {\n const existingDirectDep = rootEdge.neighbours.find((existingDep) =>\n isSameDirectDependency(existingDep, directDep)\n );\n if (existingDirectDep == null) {\n rootEdge.neighbours.push(directDep);\n } else {\n if (isWildcardSpecifier(existingDirectDep.specifier) && !isWildcardSpecifier(directDep.specifier)) {\n existingDirectDep.specifier = directDep.specifier;\n }\n if (existingDirectDep.id !== directDep.id && nodeIdLessThan(existingDirectDep.id, directDep.id)) {\n existingDirectDep.id = directDep.id;\n }\n }\n }\n } else if (incomingRootEdge) {\n this.edges.push(incomingRootEdge);\n }\n for (const [newPkgId, newPkgAttr] of graph.packages.entries()) {\n this.packages.set(newPkgId, newPkgAttr);\n }\n this.edges.push(...graph.edges.filter(({ id }) => id !== DependenciesGraph.ROOT_EDGE_ID));\n this.normalizePeerProviderVersions();\n this.pruneUnreachableFromRoot();\n }\n\n isEmpty(): boolean {\n return this.packages.size === 0 && this.edges.length === 0;\n }\n\n /**\n * Whether the graph holds any resolved dependency. A component without\n * dependencies has only an empty root edge.\n */\n hasResolutions(): boolean {\n return (\n this.packages.size > 0 ||\n this.edges.some(({ id, neighbours }) => id !== DependenciesGraph.ROOT_EDGE_ID || neighbours.length > 0)\n );\n }\n\n /**\n * Returns the edge related to the root component\n */\n findRootEdge(): DependencyEdge | undefined {\n return this.edges.find(({ id }) => id === DependenciesGraph.ROOT_EDGE_ID);\n }\n\n private pruneUnreachableFromRoot(): void {\n const rootEdge = this.findRootEdge();\n if (!rootEdge) return;\n const edgesById = new Map<string, DependencyEdge>();\n for (const edge of this.edges) {\n if (edge.id !== DependenciesGraph.ROOT_EDGE_ID) {\n edgesById.set(edge.id, edge);\n }\n }\n const reachableEdges = new Set<string>();\n const reachablePackages = new Set<string>();\n // An explicit stack: deep dependency chains would overflow the call\n // stack with a recursive walk. Every node id is processed once — the\n // guard must sit before the suffix pushes, or a node referenced by M\n // edges re-pushes its suffix ids M times and nested suffixes multiply\n // that per level.\n const visited = new Set<string>();\n const stack = rootEdge.neighbours.map((neighbour) => neighbour.id);\n while (stack.length > 0) {\n const nodeId = stack.pop()!;\n if (visited.has(nodeId)) continue;\n visited.add(nodeId);\n reachablePackages.add(nodeIdWithoutPeerSuffix(nodeId));\n for (const peerId of splitPeerIds(nodeId)) {\n if (!isPatchHashSegment(peerId)) stack.push(peerId);\n }\n const edge = edgesById.get(nodeId);\n if (!edge) continue;\n reachableEdges.add(nodeId);\n if (edge.attr?.pkgId) reachablePackages.add(edge.attr.pkgId);\n for (const neighbour of edge.neighbours) {\n stack.push(neighbour.id);\n }\n }\n this.edges = [rootEdge, ...Array.from(edgesById.values()).filter((edge) => reachableEdges.has(edge.id))];\n for (const pkgId of this.packages.keys()) {\n if (!reachablePackages.has(pkgId)) {\n this.packages.delete(pkgId);\n }\n }\n }\n\n private normalizePeerProviderVersions(): void {\n const versionsByPackageName = this.collectVersionsByPackageName();\n const getBestCompatiblePeer = (name: string, range: string) =>\n versionsByPackageName\n .get(name)\n ?.find(({ version }) => semver.satisfies(version, range, { includePrerelease: true }));\n const getHighestPeer = (name: string) => versionsByPackageName.get(name)?.[0];\n const rewritePeerId = (peerId: string, peerDependencies?: Record<string, string>): string => {\n const parsedPeer = parsePkgId(peerId);\n const nestedPeerDependencies = this.packages.get(nodeIdWithoutPeerSuffix(peerId))?.peerDependencies;\n const peerIds = splitPeerIds(peerId).map((nestedPeerId) => rewritePeerId(nestedPeerId, nestedPeerDependencies));\n let rewrittenBase = nodeIdWithoutPeerSuffix(peerId);\n if (parsedPeer) {\n const range = peerDependencies?.[parsedPeer.name];\n const bestPeer = range ? getBestCompatiblePeer(parsedPeer.name, range) : getHighestPeer(parsedPeer.name);\n if (bestPeer) rewrittenBase = `${parsedPeer.name}@${bestPeer.version}`;\n }\n return `${rewrittenBase}${createPeerSuffix(peerIds)}`;\n };\n const rewritePeerDep = (\n depId: string,\n peerDependencies?: Record<string, string>,\n peerIdsByName?: Map<string, string>\n ) => {\n const peerId = peerIdsByName?.get(parsePkgId(depId)?.name ?? '');\n if (peerId) return peerId;\n if (!peerDependencies) return depId;\n const parsedDep = parsePkgId(depId);\n if (!parsedDep) return depId;\n const range = peerDependencies[parsedDep.name];\n if (!range) return depId;\n const bestPeer = getBestCompatiblePeer(parsedDep.name, range);\n if (!bestPeer) return depId;\n return `${parsedDep.name}@${bestPeer.version}`;\n };\n const rewriteNodeId = (nodeId: string) => {\n const pkgId = nodeIdWithoutPeerSuffix(nodeId);\n const peerDependencies = this.packages.get(pkgId)?.peerDependencies;\n const peerIds = splitPeerIds(nodeId);\n if (peerIds.length === 0) return nodeId;\n let changed = false;\n const rewrittenPeerIds = peerIds.map((peerId) => {\n const rewrittenPeerId = rewritePeerId(peerId, peerDependencies);\n if (rewrittenPeerId === peerId) return peerId;\n changed = true;\n return rewrittenPeerId;\n });\n if (!changed) return nodeId;\n return `${pkgId}${createPeerSuffix(rewrittenPeerIds)}`;\n };\n const rewriteNeighbour = (\n neighbour: DependencyNeighbour,\n peerDependencies?: Record<string, string>,\n peerIdsByName?: Map<string, string>\n ) => {\n const rewrittenId = rewriteNodeId(rewritePeerDep(neighbour.id, peerDependencies, peerIdsByName));\n return rewrittenId === neighbour.id ? neighbour : { ...neighbour, id: rewrittenId };\n };\n const edgesById = new Map<string, DependencyEdge>();\n for (const edge of this.edges) {\n const peerDependencies =\n edge.id === DependenciesGraph.ROOT_EDGE_ID\n ? undefined\n : this.packages.get(edge.attr?.pkgId ?? nodeIdWithoutPeerSuffix(edge.id))?.peerDependencies;\n const peerIdsByName = new Map<string, string>();\n for (const peerId of splitPeerIds(edge.id)) {\n const rewrittenPeerId = rewritePeerId(peerId, peerDependencies);\n const parsedPeer = parsePkgId(rewrittenPeerId);\n if (parsedPeer) peerIdsByName.set(parsedPeer.name, rewrittenPeerId);\n }\n const rewrittenEdge: DependencyEdge = {\n ...edge,\n id: edge.id === DependenciesGraph.ROOT_EDGE_ID ? edge.id : rewriteNodeId(edge.id),\n neighbours: edge.neighbours.map((neighbour) => rewriteNeighbour(neighbour, peerDependencies, peerIdsByName)),\n };\n const existingEdge = edgesById.get(rewrittenEdge.id);\n if (existingEdge) {\n mergeNeighbours(existingEdge.neighbours, rewrittenEdge.neighbours);\n } else {\n edgesById.set(rewrittenEdge.id, rewrittenEdge);\n }\n }\n this.edges = Array.from(edgesById.values());\n }\n\n private collectVersionsByPackageName(): Map<string, Array<{ version: string }>> {\n const versionsByPackageName = new Map<string, Array<{ version: string }>>();\n const addVersion = (pkgId: string) => {\n const parsed = parsePkgId(pkgId);\n if (!parsed || !semver.valid(parsed.version)) return;\n const versions = versionsByPackageName.get(parsed.name) ?? [];\n versions.push({ version: parsed.version });\n versionsByPackageName.set(parsed.name, versions);\n for (const peerId of splitPeerIds(pkgId)) {\n addVersion(peerId);\n }\n };\n for (const pkgId of this.packages.keys()) {\n addVersion(pkgId);\n }\n for (const edge of this.edges) {\n addVersion(edge.id);\n for (const neighbour of edge.neighbours) {\n addVersion(neighbour.id);\n }\n }\n for (const versions of versionsByPackageName.values()) {\n versions.sort((version1, version2) => semver.rcompare(version1.version, version2.version));\n }\n return versionsByPackageName;\n }\n}\n\n/**\n * The merged graph mixes resolutions from both graphs. It can only claim a set\n * of readPackage hooks when both were resolved with the same ones; otherwise\n * it is left unset, so pnpm resolves again instead of trusting it. A graph\n * without resolutions has nothing to vouch for, so it doesn't count.\n */\nfunction mergePnpmfileChecksums(graph1: DependenciesGraph, graph2: DependenciesGraph): string | undefined {\n if (!graph2.hasResolutions()) return graph1.pnpmfileChecksum;\n if (!graph1.hasResolutions()) return graph2.pnpmfileChecksum;\n return graph1.pnpmfileChecksum === graph2.pnpmfileChecksum ? graph1.pnpmfileChecksum : undefined;\n}\n\nfunction isSameDirectDependency(dep1: DependencyNeighbour, dep2: DependencyNeighbour): boolean {\n if (!dep1.name || !dep2.name) return dep1.id === dep2.id;\n if (dep1.name !== dep2.name) return false;\n return (\n dep1.specifier === dep2.specifier || isWildcardSpecifier(dep1.specifier) || isWildcardSpecifier(dep2.specifier)\n );\n}\n\nfunction isWildcardSpecifier(specifier?: string): boolean {\n return specifier === '*' || specifier == null || specifier === '';\n}\n\nfunction nodeIdLessThan(nodeId1: string, nodeId2: string): boolean {\n const version1 = getVersionFromNodeId(nodeId1);\n if (!version1) return false;\n const version2 = getVersionFromNodeId(nodeId2);\n if (!version2) return false;\n return semver.lt(version1, version2);\n}\n\nfunction mergeNeighbours(existingNeighbours: DependencyNeighbour[], newNeighbours: DependencyNeighbour[]): void {\n for (const newNeighbour of newNeighbours) {\n const existingNeighbour = existingNeighbours.find((neighbour) => neighbour.id === newNeighbour.id);\n if (!existingNeighbour) existingNeighbours.push(newNeighbour);\n }\n}\n\nfunction parsePkgId(pkgId: string): { name: string; version: string } | undefined {\n const depPathWithoutPeerSuffix = nodeIdWithoutPeerSuffix(pkgId);\n const versionStart = depPathWithoutPeerSuffix.lastIndexOf('@');\n if (versionStart <= 0) return undefined;\n const name = depPathWithoutPeerSuffix.slice(0, versionStart);\n const version = depPathWithoutPeerSuffix.slice(versionStart + 1);\n if (!name || !version) return undefined;\n return { name, version };\n}\n\nfunction splitPeerIds(nodeId: string): string[] {\n const suffixStart = nodeId.indexOf('(');\n if (suffixStart === -1) return [];\n const peerIds: string[] = [];\n let depth = 0;\n let peerStart: number | undefined;\n for (let index = suffixStart; index < nodeId.length; index += 1) {\n const char = nodeId[index];\n if (char === '(') {\n if (depth === 0) peerStart = index + 1;\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n if (depth === 0 && peerStart != null) {\n peerIds.push(nodeId.slice(peerStart, index));\n peerStart = undefined;\n }\n }\n }\n return peerIds;\n}\n\nfunction createPeerSuffix(peerIds: string[]): string {\n const patchSegments = peerIds.filter(isPatchHashSegment);\n const peerSegments = peerIds.filter((peerId) => !isPatchHashSegment(peerId)).sort();\n return [...patchSegments, ...peerSegments].map((peerId) => `(${peerId})`).join('');\n}\n\nfunction isPatchHashSegment(segment: string): boolean {\n return segment.startsWith('patch_hash=');\n}\n\nfunction getVersionFromNodeId(nodeId: string): string | undefined {\n const depPathWithoutPeerSuffix = nodeIdWithoutPeerSuffix(nodeId);\n const versionStart = depPathWithoutPeerSuffix.lastIndexOf('@');\n if (versionStart === -1) return undefined;\n const version = depPathWithoutPeerSuffix.slice(versionStart + 1);\n return semver.valid(version) ?? semver.coerce(version)?.version;\n}\n\nfunction nodeIdWithoutPeerSuffix(nodeId: string): string {\n const suffixStart = nodeId.indexOf('(');\n return suffixStart === -1 ? nodeId : nodeId.slice(0, suffixStart);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -99,6 +99,89 @@ describe('DependenciesGraph.merge', () => {
|
|
|
99
99
|
(0, _chai().expect)(graph.packages.size).to.equal(depth);
|
|
100
100
|
});
|
|
101
101
|
});
|
|
102
|
+
describe('DependenciesGraph pnpmfileChecksum', () => {
|
|
103
|
+
it('survives serialize and deserialize', () => {
|
|
104
|
+
const graph = createGraph([rootEdge([])], []);
|
|
105
|
+
graph.pnpmfileChecksum = 'bit-1';
|
|
106
|
+
const restored = _dependenciesGraph().DependenciesGraph.deserialize(graph.serialize());
|
|
107
|
+
(0, _chai().expect)(restored?.pnpmfileChecksum).to.equal('bit-1');
|
|
108
|
+
});
|
|
109
|
+
it('is omitted from the serialized graph when unset', () => {
|
|
110
|
+
const graph = createGraph([rootEdge([])], []);
|
|
111
|
+
(0, _chai().expect)(JSON.parse(graph.serialize())).not.to.have.property('pnpmfileChecksum');
|
|
112
|
+
});
|
|
113
|
+
it('deserializes a graph serialized before the field existed', () => {
|
|
114
|
+
const restored = _dependenciesGraph().DependenciesGraph.deserialize(JSON.stringify({
|
|
115
|
+
schemaVersion: '2.0',
|
|
116
|
+
packages: {
|
|
117
|
+
'foo@1.0.0': {}
|
|
118
|
+
},
|
|
119
|
+
edges: [rootEdge([])]
|
|
120
|
+
}));
|
|
121
|
+
(0, _chai().expect)(restored).not.to.equal(undefined);
|
|
122
|
+
(0, _chai().expect)(restored?.packages.has('foo@1.0.0')).to.equal(true);
|
|
123
|
+
(0, _chai().expect)(restored?.pnpmfileChecksum).to.equal(undefined);
|
|
124
|
+
});
|
|
125
|
+
it('is kept by merge when both graphs have the same value', () => {
|
|
126
|
+
const base = createGraph([rootEdge([])], []);
|
|
127
|
+
base.pnpmfileChecksum = 'bit-1';
|
|
128
|
+
const incoming = createGraph([rootEdge([])], []);
|
|
129
|
+
incoming.pnpmfileChecksum = 'bit-1';
|
|
130
|
+
base.merge(incoming);
|
|
131
|
+
(0, _chai().expect)(base.pnpmfileChecksum).to.equal('bit-1');
|
|
132
|
+
});
|
|
133
|
+
it('is dropped by merge when the graphs have different values', () => {
|
|
134
|
+
const base = createGraph([rootEdge([{
|
|
135
|
+
id: 'foo@1.0.0',
|
|
136
|
+
name: 'foo',
|
|
137
|
+
specifier: '1.0.0'
|
|
138
|
+
}])], ['foo@1.0.0']);
|
|
139
|
+
base.pnpmfileChecksum = 'bit-1';
|
|
140
|
+
const incoming = createGraph([rootEdge([{
|
|
141
|
+
id: 'bar@1.0.0',
|
|
142
|
+
name: 'bar',
|
|
143
|
+
specifier: '1.0.0'
|
|
144
|
+
}])], ['bar@1.0.0']);
|
|
145
|
+
incoming.pnpmfileChecksum = 'bit-2';
|
|
146
|
+
base.merge(incoming);
|
|
147
|
+
(0, _chai().expect)(base.pnpmfileChecksum).to.equal(undefined);
|
|
148
|
+
});
|
|
149
|
+
it('is dropped by merge when only one graph has it', () => {
|
|
150
|
+
const base = createGraph([rootEdge([{
|
|
151
|
+
id: 'foo@1.0.0',
|
|
152
|
+
name: 'foo',
|
|
153
|
+
specifier: '1.0.0'
|
|
154
|
+
}])], ['foo@1.0.0']);
|
|
155
|
+
base.pnpmfileChecksum = 'bit-1';
|
|
156
|
+
base.merge(createGraph([rootEdge([{
|
|
157
|
+
id: 'bar@1.0.0',
|
|
158
|
+
name: 'bar',
|
|
159
|
+
specifier: '1.0.0'
|
|
160
|
+
}])], ['bar@1.0.0']));
|
|
161
|
+
(0, _chai().expect)(base.pnpmfileChecksum).to.equal(undefined);
|
|
162
|
+
});
|
|
163
|
+
it('is not affected by merging a graph without dependencies', () => {
|
|
164
|
+
const base = createGraph([rootEdge([{
|
|
165
|
+
id: 'foo@1.0.0',
|
|
166
|
+
name: 'foo',
|
|
167
|
+
specifier: '1.0.0'
|
|
168
|
+
}])], ['foo@1.0.0']);
|
|
169
|
+
base.pnpmfileChecksum = 'bit-1';
|
|
170
|
+
base.merge(createGraph([rootEdge([])], []));
|
|
171
|
+
(0, _chai().expect)(base.pnpmfileChecksum).to.equal('bit-1');
|
|
172
|
+
});
|
|
173
|
+
it('is taken from the incoming graph when the base has no dependencies', () => {
|
|
174
|
+
const base = createGraph([rootEdge([])], []);
|
|
175
|
+
const incoming = createGraph([rootEdge([{
|
|
176
|
+
id: 'foo@1.0.0',
|
|
177
|
+
name: 'foo',
|
|
178
|
+
specifier: '1.0.0'
|
|
179
|
+
}])], ['foo@1.0.0']);
|
|
180
|
+
incoming.pnpmfileChecksum = 'bit-1';
|
|
181
|
+
base.merge(incoming);
|
|
182
|
+
(0, _chai().expect)(base.pnpmfileChecksum).to.equal('bit-1');
|
|
183
|
+
});
|
|
184
|
+
});
|
|
102
185
|
function createGraph(edges, packageIds) {
|
|
103
186
|
const packages = new Map(packageIds.map(id => [id, {}]));
|
|
104
187
|
return new (_dependenciesGraph().DependenciesGraph)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_chai","data","require","_dependenciesGraph","describe","it","base","createGraph","rootEdge","id","name","specifier","edge","incoming","merge","foo","findRootEdge","neighbours","find","neighbour","expect","to","equal","packages","set","peerDependencies","typescript","plugin","has","bar","depth","edges","packageIds","i","push","graph","size","Map","map","DependenciesGraph","ROOT_EDGE_ID"],"sources":["dependencies-graph.spec.ts"],"sourcesContent":["import { expect } from 'chai';\nimport type { DependencyEdge, PackagesMap } from './dependencies-graph';\nimport { DependenciesGraph } from './dependencies-graph';\n\ndescribe('DependenciesGraph.merge', () => {\n it('adopts the more specific specifier when a wildcard direct dep merges with a manifest spec', () => {\n const base = createGraph(\n [rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '*' }]), edge('foo@1.0.0')],\n ['foo@1.0.0']\n );\n const incoming = createGraph(\n [rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '^1.0.0' }]), edge('foo@1.0.0')],\n ['foo@1.0.0']\n );\n\n base.merge(incoming);\n\n const foo = base.findRootEdge()?.neighbours.find((neighbour) => neighbour.name === 'foo');\n expect(foo?.specifier).to.equal('^1.0.0');\n });\n\n it('rewrites nested peer providers within their parent provider peer ranges', () => {\n const base = createGraph(\n [\n rootEdge([{ id: 'plugin@1.0.0(parser@1.0.0(typescript@5.0.0))', name: 'plugin', specifier: '1.0.0' }]),\n edge('plugin@1.0.0(parser@1.0.0(typescript@5.0.0))'),\n edge('parser@1.0.0(typescript@5.0.0)'),\n edge('typescript@5.0.0'),\n ],\n ['plugin@1.0.0', 'typescript@5.0.0']\n );\n base.packages.set('parser@1.0.0', { peerDependencies: { typescript: '^5.0.0' } } as any);\n const incoming = createGraph(\n [rootEdge([{ id: 'typescript@6.0.0', name: 'typescript', specifier: '6.0.0' }]), edge('typescript@6.0.0')],\n ['typescript@6.0.0']\n );\n\n base.merge(incoming);\n\n const plugin = base.findRootEdge()?.neighbours.find((neighbour) => neighbour.name === 'plugin');\n expect(plugin?.id).to.equal(\n 'plugin@1.0.0(parser@1.0.0(typescript@5.0.0))',\n 'typescript@6.0.0 does not satisfy parser@1.0.0 peer range ^5.0.0'\n );\n });\n\n it('keeps a peer provider that is referenced only inside a depPath suffix', () => {\n const base = createGraph(\n [\n rootEdge([{ id: 'consumer@1.0.0(peer@2.0.0)', name: 'consumer', specifier: '1.0.0' }]),\n edge('consumer@1.0.0(peer@2.0.0)'),\n ],\n ['consumer@1.0.0', 'peer@2.0.0']\n );\n\n base.merge(createGraph([], []));\n\n expect(base.packages.has('peer@2.0.0')).to.equal(true);\n });\n\n it('keeps the patch_hash segment in front of sorted peer segments', () => {\n const base = createGraph(\n [\n rootEdge([{ id: 'foo@1.0.0(patch_hash=abc)(bar@1.0.0)', name: 'foo', specifier: '1.0.0' }]),\n edge('foo@1.0.0(patch_hash=abc)(bar@1.0.0)'),\n edge('bar@1.0.0'),\n ],\n ['foo@1.0.0', 'bar@1.0.0']\n );\n base.packages.set('foo@1.0.0', { peerDependencies: { bar: '^1.0.0' } } as any);\n const incoming = createGraph(\n [rootEdge([{ id: 'bar@1.0.0', name: 'bar', specifier: '1.0.0' }]), edge('bar@1.0.0')],\n ['bar@1.0.0']\n );\n\n base.merge(incoming);\n\n const foo = base.findRootEdge()?.neighbours.find((neighbour) => neighbour.name === 'foo');\n expect(foo?.id).to.equal('foo@1.0.0(patch_hash=abc)(bar@1.0.0)');\n });\n\n it('does not overflow the stack on a deep dependency chain', () => {\n const depth = 50000;\n const edges: DependencyEdge[] = [rootEdge([{ id: 'pkg0@1.0.0', name: 'pkg0', specifier: '1.0.0' }])];\n const packageIds: string[] = [];\n for (let i = 0; i < depth; i += 1) {\n const id = `pkg${i}@1.0.0`;\n packageIds.push(id);\n edges.push(edge(id, i + 1 < depth ? [{ id: `pkg${i + 1}@1.0.0` }] : []));\n }\n const graph = createGraph(edges, packageIds);\n\n graph.merge(createGraph([], []));\n\n expect(graph.packages.size).to.equal(depth);\n });\n});\n\nfunction createGraph(edges: DependencyEdge[], packageIds: string[]): DependenciesGraph {\n const packages: PackagesMap = new Map(packageIds.map((id) => [id, {} as any]));\n return new DependenciesGraph({ packages, edges });\n}\n\nfunction rootEdge(neighbours: DependencyEdge['neighbours']): DependencyEdge {\n return { id: DependenciesGraph.ROOT_EDGE_ID, neighbours };\n}\n\nfunction edge(id: string, neighbours: DependencyEdge['neighbours'] = []): DependencyEdge {\n return { id, neighbours };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_chai","data","require","_dependenciesGraph","describe","it","base","createGraph","rootEdge","id","name","specifier","edge","incoming","merge","foo","findRootEdge","neighbours","find","neighbour","expect","to","equal","packages","set","peerDependencies","typescript","plugin","has","bar","depth","edges","packageIds","i","push","graph","size","pnpmfileChecksum","restored","DependenciesGraph","deserialize","serialize","JSON","parse","not","have","property","stringify","schemaVersion","undefined","Map","map","ROOT_EDGE_ID"],"sources":["dependencies-graph.spec.ts"],"sourcesContent":["import { expect } from 'chai';\nimport type { DependencyEdge, PackagesMap } from './dependencies-graph';\nimport { DependenciesGraph } from './dependencies-graph';\n\ndescribe('DependenciesGraph.merge', () => {\n it('adopts the more specific specifier when a wildcard direct dep merges with a manifest spec', () => {\n const base = createGraph(\n [rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '*' }]), edge('foo@1.0.0')],\n ['foo@1.0.0']\n );\n const incoming = createGraph(\n [rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '^1.0.0' }]), edge('foo@1.0.0')],\n ['foo@1.0.0']\n );\n\n base.merge(incoming);\n\n const foo = base.findRootEdge()?.neighbours.find((neighbour) => neighbour.name === 'foo');\n expect(foo?.specifier).to.equal('^1.0.0');\n });\n\n it('rewrites nested peer providers within their parent provider peer ranges', () => {\n const base = createGraph(\n [\n rootEdge([{ id: 'plugin@1.0.0(parser@1.0.0(typescript@5.0.0))', name: 'plugin', specifier: '1.0.0' }]),\n edge('plugin@1.0.0(parser@1.0.0(typescript@5.0.0))'),\n edge('parser@1.0.0(typescript@5.0.0)'),\n edge('typescript@5.0.0'),\n ],\n ['plugin@1.0.0', 'typescript@5.0.0']\n );\n base.packages.set('parser@1.0.0', { peerDependencies: { typescript: '^5.0.0' } } as any);\n const incoming = createGraph(\n [rootEdge([{ id: 'typescript@6.0.0', name: 'typescript', specifier: '6.0.0' }]), edge('typescript@6.0.0')],\n ['typescript@6.0.0']\n );\n\n base.merge(incoming);\n\n const plugin = base.findRootEdge()?.neighbours.find((neighbour) => neighbour.name === 'plugin');\n expect(plugin?.id).to.equal(\n 'plugin@1.0.0(parser@1.0.0(typescript@5.0.0))',\n 'typescript@6.0.0 does not satisfy parser@1.0.0 peer range ^5.0.0'\n );\n });\n\n it('keeps a peer provider that is referenced only inside a depPath suffix', () => {\n const base = createGraph(\n [\n rootEdge([{ id: 'consumer@1.0.0(peer@2.0.0)', name: 'consumer', specifier: '1.0.0' }]),\n edge('consumer@1.0.0(peer@2.0.0)'),\n ],\n ['consumer@1.0.0', 'peer@2.0.0']\n );\n\n base.merge(createGraph([], []));\n\n expect(base.packages.has('peer@2.0.0')).to.equal(true);\n });\n\n it('keeps the patch_hash segment in front of sorted peer segments', () => {\n const base = createGraph(\n [\n rootEdge([{ id: 'foo@1.0.0(patch_hash=abc)(bar@1.0.0)', name: 'foo', specifier: '1.0.0' }]),\n edge('foo@1.0.0(patch_hash=abc)(bar@1.0.0)'),\n edge('bar@1.0.0'),\n ],\n ['foo@1.0.0', 'bar@1.0.0']\n );\n base.packages.set('foo@1.0.0', { peerDependencies: { bar: '^1.0.0' } } as any);\n const incoming = createGraph(\n [rootEdge([{ id: 'bar@1.0.0', name: 'bar', specifier: '1.0.0' }]), edge('bar@1.0.0')],\n ['bar@1.0.0']\n );\n\n base.merge(incoming);\n\n const foo = base.findRootEdge()?.neighbours.find((neighbour) => neighbour.name === 'foo');\n expect(foo?.id).to.equal('foo@1.0.0(patch_hash=abc)(bar@1.0.0)');\n });\n\n it('does not overflow the stack on a deep dependency chain', () => {\n const depth = 50000;\n const edges: DependencyEdge[] = [rootEdge([{ id: 'pkg0@1.0.0', name: 'pkg0', specifier: '1.0.0' }])];\n const packageIds: string[] = [];\n for (let i = 0; i < depth; i += 1) {\n const id = `pkg${i}@1.0.0`;\n packageIds.push(id);\n edges.push(edge(id, i + 1 < depth ? [{ id: `pkg${i + 1}@1.0.0` }] : []));\n }\n const graph = createGraph(edges, packageIds);\n\n graph.merge(createGraph([], []));\n\n expect(graph.packages.size).to.equal(depth);\n });\n});\n\ndescribe('DependenciesGraph pnpmfileChecksum', () => {\n it('survives serialize and deserialize', () => {\n const graph = createGraph([rootEdge([])], []);\n graph.pnpmfileChecksum = 'bit-1';\n\n const restored = DependenciesGraph.deserialize(graph.serialize());\n\n expect(restored?.pnpmfileChecksum).to.equal('bit-1');\n });\n\n it('is omitted from the serialized graph when unset', () => {\n const graph = createGraph([rootEdge([])], []);\n\n expect(JSON.parse(graph.serialize())).not.to.have.property('pnpmfileChecksum');\n });\n\n it('deserializes a graph serialized before the field existed', () => {\n const restored = DependenciesGraph.deserialize(\n JSON.stringify({ schemaVersion: '2.0', packages: { 'foo@1.0.0': {} }, edges: [rootEdge([])] })\n );\n\n expect(restored).not.to.equal(undefined);\n expect(restored?.packages.has('foo@1.0.0')).to.equal(true);\n expect(restored?.pnpmfileChecksum).to.equal(undefined);\n });\n\n it('is kept by merge when both graphs have the same value', () => {\n const base = createGraph([rootEdge([])], []);\n base.pnpmfileChecksum = 'bit-1';\n const incoming = createGraph([rootEdge([])], []);\n incoming.pnpmfileChecksum = 'bit-1';\n\n base.merge(incoming);\n\n expect(base.pnpmfileChecksum).to.equal('bit-1');\n });\n\n it('is dropped by merge when the graphs have different values', () => {\n const base = createGraph([rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '1.0.0' }])], ['foo@1.0.0']);\n base.pnpmfileChecksum = 'bit-1';\n const incoming = createGraph([rootEdge([{ id: 'bar@1.0.0', name: 'bar', specifier: '1.0.0' }])], ['bar@1.0.0']);\n incoming.pnpmfileChecksum = 'bit-2';\n\n base.merge(incoming);\n\n expect(base.pnpmfileChecksum).to.equal(undefined);\n });\n\n it('is dropped by merge when only one graph has it', () => {\n const base = createGraph([rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '1.0.0' }])], ['foo@1.0.0']);\n base.pnpmfileChecksum = 'bit-1';\n\n base.merge(createGraph([rootEdge([{ id: 'bar@1.0.0', name: 'bar', specifier: '1.0.0' }])], ['bar@1.0.0']));\n\n expect(base.pnpmfileChecksum).to.equal(undefined);\n });\n\n it('is not affected by merging a graph without dependencies', () => {\n const base = createGraph([rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '1.0.0' }])], ['foo@1.0.0']);\n base.pnpmfileChecksum = 'bit-1';\n\n base.merge(createGraph([rootEdge([])], []));\n\n expect(base.pnpmfileChecksum).to.equal('bit-1');\n });\n\n it('is taken from the incoming graph when the base has no dependencies', () => {\n const base = createGraph([rootEdge([])], []);\n const incoming = createGraph([rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '1.0.0' }])], ['foo@1.0.0']);\n incoming.pnpmfileChecksum = 'bit-1';\n\n base.merge(incoming);\n\n expect(base.pnpmfileChecksum).to.equal('bit-1');\n });\n});\n\nfunction createGraph(edges: DependencyEdge[], packageIds: string[]): DependenciesGraph {\n const packages: PackagesMap = new Map(packageIds.map((id) => [id, {} as any]));\n return new DependenciesGraph({ packages, edges });\n}\n\nfunction rootEdge(neighbours: DependencyEdge['neighbours']): DependencyEdge {\n return { id: DependenciesGraph.ROOT_EDGE_ID, neighbours };\n}\n\nfunction edge(id: string, neighbours: DependencyEdge['neighbours'] = []): DependencyEdge {\n return { id, neighbours };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -96,6 +96,83 @@ describe('DependenciesGraph.merge', () => {
|
|
|
96
96
|
});
|
|
97
97
|
});
|
|
98
98
|
|
|
99
|
+
describe('DependenciesGraph pnpmfileChecksum', () => {
|
|
100
|
+
it('survives serialize and deserialize', () => {
|
|
101
|
+
const graph = createGraph([rootEdge([])], []);
|
|
102
|
+
graph.pnpmfileChecksum = 'bit-1';
|
|
103
|
+
|
|
104
|
+
const restored = DependenciesGraph.deserialize(graph.serialize());
|
|
105
|
+
|
|
106
|
+
expect(restored?.pnpmfileChecksum).to.equal('bit-1');
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('is omitted from the serialized graph when unset', () => {
|
|
110
|
+
const graph = createGraph([rootEdge([])], []);
|
|
111
|
+
|
|
112
|
+
expect(JSON.parse(graph.serialize())).not.to.have.property('pnpmfileChecksum');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('deserializes a graph serialized before the field existed', () => {
|
|
116
|
+
const restored = DependenciesGraph.deserialize(
|
|
117
|
+
JSON.stringify({ schemaVersion: '2.0', packages: { 'foo@1.0.0': {} }, edges: [rootEdge([])] })
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
expect(restored).not.to.equal(undefined);
|
|
121
|
+
expect(restored?.packages.has('foo@1.0.0')).to.equal(true);
|
|
122
|
+
expect(restored?.pnpmfileChecksum).to.equal(undefined);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('is kept by merge when both graphs have the same value', () => {
|
|
126
|
+
const base = createGraph([rootEdge([])], []);
|
|
127
|
+
base.pnpmfileChecksum = 'bit-1';
|
|
128
|
+
const incoming = createGraph([rootEdge([])], []);
|
|
129
|
+
incoming.pnpmfileChecksum = 'bit-1';
|
|
130
|
+
|
|
131
|
+
base.merge(incoming);
|
|
132
|
+
|
|
133
|
+
expect(base.pnpmfileChecksum).to.equal('bit-1');
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('is dropped by merge when the graphs have different values', () => {
|
|
137
|
+
const base = createGraph([rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '1.0.0' }])], ['foo@1.0.0']);
|
|
138
|
+
base.pnpmfileChecksum = 'bit-1';
|
|
139
|
+
const incoming = createGraph([rootEdge([{ id: 'bar@1.0.0', name: 'bar', specifier: '1.0.0' }])], ['bar@1.0.0']);
|
|
140
|
+
incoming.pnpmfileChecksum = 'bit-2';
|
|
141
|
+
|
|
142
|
+
base.merge(incoming);
|
|
143
|
+
|
|
144
|
+
expect(base.pnpmfileChecksum).to.equal(undefined);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('is dropped by merge when only one graph has it', () => {
|
|
148
|
+
const base = createGraph([rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '1.0.0' }])], ['foo@1.0.0']);
|
|
149
|
+
base.pnpmfileChecksum = 'bit-1';
|
|
150
|
+
|
|
151
|
+
base.merge(createGraph([rootEdge([{ id: 'bar@1.0.0', name: 'bar', specifier: '1.0.0' }])], ['bar@1.0.0']));
|
|
152
|
+
|
|
153
|
+
expect(base.pnpmfileChecksum).to.equal(undefined);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('is not affected by merging a graph without dependencies', () => {
|
|
157
|
+
const base = createGraph([rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '1.0.0' }])], ['foo@1.0.0']);
|
|
158
|
+
base.pnpmfileChecksum = 'bit-1';
|
|
159
|
+
|
|
160
|
+
base.merge(createGraph([rootEdge([])], []));
|
|
161
|
+
|
|
162
|
+
expect(base.pnpmfileChecksum).to.equal('bit-1');
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('is taken from the incoming graph when the base has no dependencies', () => {
|
|
166
|
+
const base = createGraph([rootEdge([])], []);
|
|
167
|
+
const incoming = createGraph([rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '1.0.0' }])], ['foo@1.0.0']);
|
|
168
|
+
incoming.pnpmfileChecksum = 'bit-1';
|
|
169
|
+
|
|
170
|
+
base.merge(incoming);
|
|
171
|
+
|
|
172
|
+
expect(base.pnpmfileChecksum).to.equal('bit-1');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
99
176
|
function createGraph(edges: DependencyEdge[], packageIds: string[]): DependenciesGraph {
|
|
100
177
|
const packages: PackagesMap = new Map(packageIds.map((id) => [id, {} as any]));
|
|
101
178
|
return new DependenciesGraph({ packages, edges });
|
|
@@ -39,19 +39,30 @@ export class DependenciesGraph {
|
|
|
39
39
|
schemaVersion: string;
|
|
40
40
|
packages: PackagesMap;
|
|
41
41
|
edges: DependencyEdge[];
|
|
42
|
+
/**
|
|
43
|
+
* The `pnpmfileChecksum` of the lockfile the graph was created from: an id of
|
|
44
|
+
* the readPackage hooks the dependencies were resolved with. A lockfile
|
|
45
|
+
* restored from the graph carries it, so pnpm trusts the restored resolution
|
|
46
|
+
* only while Bit's hooks are still the same. Graphs created before this field
|
|
47
|
+
* existed don't have it.
|
|
48
|
+
*/
|
|
49
|
+
pnpmfileChecksum?: string;
|
|
42
50
|
|
|
43
51
|
constructor({
|
|
44
52
|
packages,
|
|
45
53
|
edges,
|
|
46
54
|
schemaVersion,
|
|
55
|
+
pnpmfileChecksum,
|
|
47
56
|
}: {
|
|
48
57
|
packages: PackagesMap;
|
|
49
58
|
edges: DependencyEdge[];
|
|
50
59
|
schemaVersion?: string;
|
|
60
|
+
pnpmfileChecksum?: string;
|
|
51
61
|
}) {
|
|
52
62
|
this.packages = packages;
|
|
53
63
|
this.edges = edges;
|
|
54
64
|
this.schemaVersion = schemaVersion ?? DEPENDENCIES_GRAPH_SCHEMA_VERSION;
|
|
65
|
+
this.pnpmfileChecksum = pnpmfileChecksum;
|
|
55
66
|
}
|
|
56
67
|
|
|
57
68
|
serialize(): string {
|
|
@@ -59,6 +70,8 @@ export class DependenciesGraph {
|
|
|
59
70
|
schemaVersion: this.schemaVersion,
|
|
60
71
|
packages: Object.fromEntries(this.packages.entries()),
|
|
61
72
|
edges: this.edges,
|
|
73
|
+
// JSON.stringify omits it when undefined.
|
|
74
|
+
pnpmfileChecksum: this.pnpmfileChecksum,
|
|
62
75
|
});
|
|
63
76
|
}
|
|
64
77
|
|
|
@@ -72,10 +85,12 @@ export class DependenciesGraph {
|
|
|
72
85
|
schemaVersion: parsed.schemaVersion,
|
|
73
86
|
edges: parsed.edges,
|
|
74
87
|
packages: new Map(Object.entries(parsed.packages)),
|
|
88
|
+
pnpmfileChecksum: parsed.pnpmfileChecksum,
|
|
75
89
|
});
|
|
76
90
|
}
|
|
77
91
|
|
|
78
92
|
merge(graph: DependenciesGraph): void {
|
|
93
|
+
this.pnpmfileChecksum = mergePnpmfileChecksums(this, graph);
|
|
79
94
|
const rootEdge = this.findRootEdge();
|
|
80
95
|
const incomingRootEdge = graph.findRootEdge();
|
|
81
96
|
const directDependencies = incomingRootEdge?.neighbours;
|
|
@@ -110,6 +125,17 @@ export class DependenciesGraph {
|
|
|
110
125
|
return this.packages.size === 0 && this.edges.length === 0;
|
|
111
126
|
}
|
|
112
127
|
|
|
128
|
+
/**
|
|
129
|
+
* Whether the graph holds any resolved dependency. A component without
|
|
130
|
+
* dependencies has only an empty root edge.
|
|
131
|
+
*/
|
|
132
|
+
hasResolutions(): boolean {
|
|
133
|
+
return (
|
|
134
|
+
this.packages.size > 0 ||
|
|
135
|
+
this.edges.some(({ id, neighbours }) => id !== DependenciesGraph.ROOT_EDGE_ID || neighbours.length > 0)
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
113
139
|
/**
|
|
114
140
|
* Returns the edge related to the root component
|
|
115
141
|
*/
|
|
@@ -272,6 +298,18 @@ export class DependenciesGraph {
|
|
|
272
298
|
}
|
|
273
299
|
}
|
|
274
300
|
|
|
301
|
+
/**
|
|
302
|
+
* The merged graph mixes resolutions from both graphs. It can only claim a set
|
|
303
|
+
* of readPackage hooks when both were resolved with the same ones; otherwise
|
|
304
|
+
* it is left unset, so pnpm resolves again instead of trusting it. A graph
|
|
305
|
+
* without resolutions has nothing to vouch for, so it doesn't count.
|
|
306
|
+
*/
|
|
307
|
+
function mergePnpmfileChecksums(graph1: DependenciesGraph, graph2: DependenciesGraph): string | undefined {
|
|
308
|
+
if (!graph2.hasResolutions()) return graph1.pnpmfileChecksum;
|
|
309
|
+
if (!graph1.hasResolutions()) return graph2.pnpmfileChecksum;
|
|
310
|
+
return graph1.pnpmfileChecksum === graph2.pnpmfileChecksum ? graph1.pnpmfileChecksum : undefined;
|
|
311
|
+
}
|
|
312
|
+
|
|
275
313
|
function isSameDirectDependency(dep1: DependencyNeighbour, dep2: DependencyNeighbour): boolean {
|
|
276
314
|
if (!dep1.name || !dep2.name) return dep1.id === dep2.id;
|
|
277
315
|
if (dep1.name !== dep2.name) return false;
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teambit/objects",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.710",
|
|
4
4
|
"homepage": "https://bit.cloud/teambit/scope/objects",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"componentId": {
|
|
7
7
|
"scope": "teambit.scope",
|
|
8
8
|
"name": "objects",
|
|
9
|
-
"version": "0.0.
|
|
9
|
+
"version": "0.0.710"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@pnpm/lockfile.types": "1100.0.19",
|
|
13
13
|
"semver": "7.7.1",
|
|
14
|
-
"lodash": "4.
|
|
14
|
+
"lodash": "4.18.1",
|
|
15
15
|
"uuid": "8.3.2",
|
|
16
16
|
"async-mutex": "0.3.1",
|
|
17
17
|
"p-map-series": "2.1.0",
|
|
@@ -19,35 +19,35 @@
|
|
|
19
19
|
"fs-extra": "10.0.0",
|
|
20
20
|
"glob": "13.0.0",
|
|
21
21
|
"@teambit/harmony": "0.4.12",
|
|
22
|
-
"@teambit/
|
|
22
|
+
"@teambit/harmony.modules.runtimes": "0.0.4",
|
|
23
|
+
"@teambit/component-id": "1.2.5",
|
|
23
24
|
"@teambit/bit-error": "0.0.404",
|
|
24
25
|
"@teambit/component-version": "1.0.4",
|
|
25
26
|
"@teambit/lane-id": "0.0.312",
|
|
26
|
-
"@teambit/legacy-bit-id": "1.1.3",
|
|
27
|
-
"@teambit/graph.cleargraph": "0.0.11",
|
|
28
|
-
"@teambit/harmony.modules.runtimes": "0.0.4",
|
|
29
|
-
"@teambit/legacy.utils": "0.0.55",
|
|
30
|
-
"@teambit/harmony.modules.get-basic-log": "0.0.179",
|
|
31
|
-
"@teambit/component.snap-distance": "0.0.179",
|
|
32
|
-
"@teambit/config-store": "0.0.290",
|
|
33
|
-
"@teambit/legacy.cli.error": "0.0.66",
|
|
34
27
|
"@teambit/legacy.constants": "0.0.49",
|
|
35
|
-
"@teambit/legacy.logger": "0.0.66",
|
|
36
|
-
"@teambit/legacy.scope": "0.0.178",
|
|
37
28
|
"@teambit/toolbox.crypto.sha1": "0.0.24",
|
|
38
|
-
"@teambit/component.sources": "0.0.230",
|
|
39
29
|
"@teambit/harmony.modules.concurrency": "0.0.50",
|
|
30
|
+
"@teambit/legacy-bit-id": "1.1.4",
|
|
40
31
|
"@teambit/legacy-component-log": "0.0.434",
|
|
41
|
-
"@teambit/legacy.consumer-component": "0.0.179",
|
|
42
|
-
"@teambit/legacy.consumer-config": "0.0.178",
|
|
43
|
-
"@teambit/legacy.extension-data": "0.0.180",
|
|
44
32
|
"@teambit/pkg.modules.semver-helper": "0.0.38",
|
|
45
|
-
"@teambit/
|
|
46
|
-
"@teambit/toolbox.promise.map-pool": "0.0.23",
|
|
33
|
+
"@teambit/graph.cleargraph": "0.0.11",
|
|
47
34
|
"@teambit/bit.get-bit-version": "0.0.31",
|
|
48
|
-
"@teambit/semantics.doc-parser": "0.0.186",
|
|
49
35
|
"@teambit/harmony.modules.in-memory-cache": "0.0.54",
|
|
50
|
-
"@teambit/toolbox.fs.remove-empty-dir": "0.0.22"
|
|
36
|
+
"@teambit/toolbox.fs.remove-empty-dir": "0.0.22",
|
|
37
|
+
"@teambit/legacy.utils": "0.0.56",
|
|
38
|
+
"@teambit/harmony.modules.get-basic-log": "0.0.180",
|
|
39
|
+
"@teambit/component.snap-distance": "0.0.180",
|
|
40
|
+
"@teambit/config-store": "0.0.291",
|
|
41
|
+
"@teambit/legacy.cli.error": "0.0.67",
|
|
42
|
+
"@teambit/legacy.logger": "0.0.67",
|
|
43
|
+
"@teambit/legacy.scope": "0.0.179",
|
|
44
|
+
"@teambit/component.sources": "0.0.231",
|
|
45
|
+
"@teambit/legacy.consumer-component": "0.0.180",
|
|
46
|
+
"@teambit/legacy.consumer-config": "0.0.179",
|
|
47
|
+
"@teambit/legacy.extension-data": "0.0.181",
|
|
48
|
+
"@teambit/toolbox.array.duplications-finder": "0.0.19",
|
|
49
|
+
"@teambit/toolbox.promise.map-pool": "0.0.24",
|
|
50
|
+
"@teambit/semantics.doc-parser": "0.0.187"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/semver": "7.5.8",
|
|
File without changes
|