@teambit/objects 0.0.592 → 0.0.594

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/.npmignore ADDED
@@ -0,0 +1,18 @@
1
+ dist/tsconfig.tsbuildinfo
2
+ dist/tsconfig.json
3
+ /tsconfig.json
4
+
5
+ package-tar/
6
+ .bit-capsule-ready
7
+ /*.ts
8
+ artifacts/*
9
+ !artifacts/env-template
10
+ !artifacts/ui-bundle
11
+ !artifacts/preview-bundle
12
+ package-tar/
13
+ .bit-capsule-ready
14
+ /*.ts
15
+ artifacts/*
16
+ !artifacts/env-template
17
+ !artifacts/ui-bundle
18
+ !artifacts/preview-bundle
@@ -43,4 +43,7 @@ export declare class DependenciesGraph {
43
43
  * Returns the edge related to the root component
44
44
  */
45
45
  findRootEdge(): DependencyEdge | undefined;
46
+ private pruneUnreachableFromRoot;
47
+ private normalizePeerProviderVersions;
48
+ private collectVersionsByPackageName;
46
49
  }
@@ -11,15 +11,9 @@ function _semver() {
11
11
  };
12
12
  return data;
13
13
  }
14
- function dp() {
15
- const data = _interopRequireWildcard(require("@pnpm/dependency-path"));
16
- dp = function () {
17
- return data;
18
- };
19
- return data;
20
- }
21
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
22
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
16
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
23
17
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
24
18
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
25
19
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
@@ -57,27 +51,34 @@ class DependenciesGraph {
57
51
  });
58
52
  }
59
53
  merge(graph) {
60
- const directDependencies = graph.findRootEdge()?.neighbours;
61
- if (directDependencies) {
54
+ const rootEdge = this.findRootEdge();
55
+ const incomingRootEdge = graph.findRootEdge();
56
+ const directDependencies = incomingRootEdge?.neighbours;
57
+ if (directDependencies && rootEdge) {
62
58
  for (const directDep of directDependencies) {
63
- const existingDirectDeps = this.findRootEdge()?.neighbours;
64
- if (existingDirectDeps) {
65
- const existingDirectDep = existingDirectDeps.find(({
66
- name,
67
- specifier
68
- }) => name === directDep.name && specifier === directDep.specifier);
69
- if (existingDirectDep == null) {
70
- existingDirectDeps.push(directDep);
71
- } else if (existingDirectDep.id !== directDep.id && nodeIdLessThan(existingDirectDep.id, directDep.id)) {
59
+ const existingDirectDep = rootEdge.neighbours.find(existingDep => isSameDirectDependency(existingDep, directDep));
60
+ if (existingDirectDep == null) {
61
+ rootEdge.neighbours.push(directDep);
62
+ } else {
63
+ if (isWildcardSpecifier(existingDirectDep.specifier) && !isWildcardSpecifier(directDep.specifier)) {
64
+ existingDirectDep.specifier = directDep.specifier;
65
+ }
66
+ if (existingDirectDep.id !== directDep.id && nodeIdLessThan(existingDirectDep.id, directDep.id)) {
72
67
  existingDirectDep.id = directDep.id;
73
68
  }
74
69
  }
75
70
  }
71
+ } else if (incomingRootEdge) {
72
+ this.edges.push(incomingRootEdge);
76
73
  }
77
74
  for (const [newPkgId, newPkgAttr] of graph.packages.entries()) {
78
75
  this.packages.set(newPkgId, newPkgAttr);
79
76
  }
80
- this.edges.push(...graph.edges);
77
+ this.edges.push(...graph.edges.filter(({
78
+ id
79
+ }) => id !== DependenciesGraph.ROOT_EDGE_ID));
80
+ this.normalizePeerProviderVersions();
81
+ this.pruneUnreachableFromRoot();
81
82
  }
82
83
  isEmpty() {
83
84
  return this.packages.size === 0 && this.edges.length === 0;
@@ -91,15 +92,225 @@ class DependenciesGraph {
91
92
  id
92
93
  }) => id === DependenciesGraph.ROOT_EDGE_ID);
93
94
  }
95
+ pruneUnreachableFromRoot() {
96
+ const rootEdge = this.findRootEdge();
97
+ if (!rootEdge) return;
98
+ const edgesById = new Map();
99
+ for (const edge of this.edges) {
100
+ if (edge.id !== DependenciesGraph.ROOT_EDGE_ID) {
101
+ edgesById.set(edge.id, edge);
102
+ }
103
+ }
104
+ const reachableEdges = new Set();
105
+ const reachablePackages = new Set();
106
+ // An explicit stack: deep dependency chains would overflow the call
107
+ // stack with a recursive walk. Every node id is processed once — the
108
+ // guard must sit before the suffix pushes, or a node referenced by M
109
+ // edges re-pushes its suffix ids M times and nested suffixes multiply
110
+ // that per level.
111
+ const visited = new Set();
112
+ const stack = rootEdge.neighbours.map(neighbour => neighbour.id);
113
+ while (stack.length > 0) {
114
+ const nodeId = stack.pop();
115
+ if (visited.has(nodeId)) continue;
116
+ visited.add(nodeId);
117
+ reachablePackages.add(nodeIdWithoutPeerSuffix(nodeId));
118
+ for (const peerId of splitPeerIds(nodeId)) {
119
+ if (!isPatchHashSegment(peerId)) stack.push(peerId);
120
+ }
121
+ const edge = edgesById.get(nodeId);
122
+ if (!edge) continue;
123
+ reachableEdges.add(nodeId);
124
+ if (edge.attr?.pkgId) reachablePackages.add(edge.attr.pkgId);
125
+ for (const neighbour of edge.neighbours) {
126
+ stack.push(neighbour.id);
127
+ }
128
+ }
129
+ this.edges = [rootEdge, ...Array.from(edgesById.values()).filter(edge => reachableEdges.has(edge.id))];
130
+ for (const pkgId of this.packages.keys()) {
131
+ if (!reachablePackages.has(pkgId)) {
132
+ this.packages.delete(pkgId);
133
+ }
134
+ }
135
+ }
136
+ normalizePeerProviderVersions() {
137
+ const versionsByPackageName = this.collectVersionsByPackageName();
138
+ const getBestCompatiblePeer = (name, range) => versionsByPackageName.get(name)?.find(({
139
+ version
140
+ }) => _semver().default.satisfies(version, range, {
141
+ includePrerelease: true
142
+ }));
143
+ const getHighestPeer = name => versionsByPackageName.get(name)?.[0];
144
+ const rewritePeerId = (peerId, peerDependencies) => {
145
+ const parsedPeer = parsePkgId(peerId);
146
+ const nestedPeerDependencies = this.packages.get(nodeIdWithoutPeerSuffix(peerId))?.peerDependencies;
147
+ const peerIds = splitPeerIds(peerId).map(nestedPeerId => rewritePeerId(nestedPeerId, nestedPeerDependencies));
148
+ let rewrittenBase = nodeIdWithoutPeerSuffix(peerId);
149
+ if (parsedPeer) {
150
+ const range = peerDependencies?.[parsedPeer.name];
151
+ const bestPeer = range ? getBestCompatiblePeer(parsedPeer.name, range) : getHighestPeer(parsedPeer.name);
152
+ if (bestPeer) rewrittenBase = `${parsedPeer.name}@${bestPeer.version}`;
153
+ }
154
+ return `${rewrittenBase}${createPeerSuffix(peerIds)}`;
155
+ };
156
+ const rewritePeerDep = (depId, peerDependencies, peerIdsByName) => {
157
+ const peerId = peerIdsByName?.get(parsePkgId(depId)?.name ?? '');
158
+ if (peerId) return peerId;
159
+ if (!peerDependencies) return depId;
160
+ const parsedDep = parsePkgId(depId);
161
+ if (!parsedDep) return depId;
162
+ const range = peerDependencies[parsedDep.name];
163
+ if (!range) return depId;
164
+ const bestPeer = getBestCompatiblePeer(parsedDep.name, range);
165
+ if (!bestPeer) return depId;
166
+ return `${parsedDep.name}@${bestPeer.version}`;
167
+ };
168
+ const rewriteNodeId = nodeId => {
169
+ const pkgId = nodeIdWithoutPeerSuffix(nodeId);
170
+ const peerDependencies = this.packages.get(pkgId)?.peerDependencies;
171
+ const peerIds = splitPeerIds(nodeId);
172
+ if (peerIds.length === 0) return nodeId;
173
+ let changed = false;
174
+ const rewrittenPeerIds = peerIds.map(peerId => {
175
+ const rewrittenPeerId = rewritePeerId(peerId, peerDependencies);
176
+ if (rewrittenPeerId === peerId) return peerId;
177
+ changed = true;
178
+ return rewrittenPeerId;
179
+ });
180
+ if (!changed) return nodeId;
181
+ return `${pkgId}${createPeerSuffix(rewrittenPeerIds)}`;
182
+ };
183
+ const rewriteNeighbour = (neighbour, peerDependencies, peerIdsByName) => {
184
+ const rewrittenId = rewriteNodeId(rewritePeerDep(neighbour.id, peerDependencies, peerIdsByName));
185
+ return rewrittenId === neighbour.id ? neighbour : _objectSpread(_objectSpread({}, neighbour), {}, {
186
+ id: rewrittenId
187
+ });
188
+ };
189
+ const edgesById = new Map();
190
+ for (const edge of this.edges) {
191
+ const peerDependencies = edge.id === DependenciesGraph.ROOT_EDGE_ID ? undefined : this.packages.get(edge.attr?.pkgId ?? nodeIdWithoutPeerSuffix(edge.id))?.peerDependencies;
192
+ const peerIdsByName = new Map();
193
+ for (const peerId of splitPeerIds(edge.id)) {
194
+ const rewrittenPeerId = rewritePeerId(peerId, peerDependencies);
195
+ const parsedPeer = parsePkgId(rewrittenPeerId);
196
+ if (parsedPeer) peerIdsByName.set(parsedPeer.name, rewrittenPeerId);
197
+ }
198
+ const rewrittenEdge = _objectSpread(_objectSpread({}, edge), {}, {
199
+ id: edge.id === DependenciesGraph.ROOT_EDGE_ID ? edge.id : rewriteNodeId(edge.id),
200
+ neighbours: edge.neighbours.map(neighbour => rewriteNeighbour(neighbour, peerDependencies, peerIdsByName))
201
+ });
202
+ const existingEdge = edgesById.get(rewrittenEdge.id);
203
+ if (existingEdge) {
204
+ mergeNeighbours(existingEdge.neighbours, rewrittenEdge.neighbours);
205
+ } else {
206
+ edgesById.set(rewrittenEdge.id, rewrittenEdge);
207
+ }
208
+ }
209
+ this.edges = Array.from(edgesById.values());
210
+ }
211
+ collectVersionsByPackageName() {
212
+ const versionsByPackageName = new Map();
213
+ const addVersion = pkgId => {
214
+ const parsed = parsePkgId(pkgId);
215
+ if (!parsed || !_semver().default.valid(parsed.version)) return;
216
+ const versions = versionsByPackageName.get(parsed.name) ?? [];
217
+ versions.push({
218
+ version: parsed.version
219
+ });
220
+ versionsByPackageName.set(parsed.name, versions);
221
+ for (const peerId of splitPeerIds(pkgId)) {
222
+ addVersion(peerId);
223
+ }
224
+ };
225
+ for (const pkgId of this.packages.keys()) {
226
+ addVersion(pkgId);
227
+ }
228
+ for (const edge of this.edges) {
229
+ addVersion(edge.id);
230
+ for (const neighbour of edge.neighbours) {
231
+ addVersion(neighbour.id);
232
+ }
233
+ }
234
+ for (const versions of versionsByPackageName.values()) {
235
+ versions.sort((version1, version2) => _semver().default.rcompare(version1.version, version2.version));
236
+ }
237
+ return versionsByPackageName;
238
+ }
94
239
  }
95
240
  exports.DependenciesGraph = DependenciesGraph;
96
241
  _defineProperty(DependenciesGraph, "ROOT_EDGE_ID", '.');
242
+ function isSameDirectDependency(dep1, dep2) {
243
+ if (!dep1.name || !dep2.name) return dep1.id === dep2.id;
244
+ if (dep1.name !== dep2.name) return false;
245
+ return dep1.specifier === dep2.specifier || isWildcardSpecifier(dep1.specifier) || isWildcardSpecifier(dep2.specifier);
246
+ }
247
+ function isWildcardSpecifier(specifier) {
248
+ return specifier === '*' || specifier == null || specifier === '';
249
+ }
97
250
  function nodeIdLessThan(nodeId1, nodeId2) {
98
- const parsed1 = dp().parse(nodeId1);
99
- if (!parsed1?.version) return false;
100
- const parsed2 = dp().parse(nodeId2);
101
- if (!parsed2?.version) return false;
102
- return _semver().default.lt(parsed1.version, parsed2.version);
251
+ const version1 = getVersionFromNodeId(nodeId1);
252
+ if (!version1) return false;
253
+ const version2 = getVersionFromNodeId(nodeId2);
254
+ if (!version2) return false;
255
+ return _semver().default.lt(version1, version2);
256
+ }
257
+ function mergeNeighbours(existingNeighbours, newNeighbours) {
258
+ for (const newNeighbour of newNeighbours) {
259
+ const existingNeighbour = existingNeighbours.find(neighbour => neighbour.id === newNeighbour.id);
260
+ if (!existingNeighbour) existingNeighbours.push(newNeighbour);
261
+ }
262
+ }
263
+ function parsePkgId(pkgId) {
264
+ const depPathWithoutPeerSuffix = nodeIdWithoutPeerSuffix(pkgId);
265
+ const versionStart = depPathWithoutPeerSuffix.lastIndexOf('@');
266
+ if (versionStart <= 0) return undefined;
267
+ const name = depPathWithoutPeerSuffix.slice(0, versionStart);
268
+ const version = depPathWithoutPeerSuffix.slice(versionStart + 1);
269
+ if (!name || !version) return undefined;
270
+ return {
271
+ name,
272
+ version
273
+ };
274
+ }
275
+ function splitPeerIds(nodeId) {
276
+ const suffixStart = nodeId.indexOf('(');
277
+ if (suffixStart === -1) return [];
278
+ const peerIds = [];
279
+ let depth = 0;
280
+ let peerStart;
281
+ for (let index = suffixStart; index < nodeId.length; index += 1) {
282
+ const char = nodeId[index];
283
+ if (char === '(') {
284
+ if (depth === 0) peerStart = index + 1;
285
+ depth += 1;
286
+ } else if (char === ')') {
287
+ depth -= 1;
288
+ if (depth === 0 && peerStart != null) {
289
+ peerIds.push(nodeId.slice(peerStart, index));
290
+ peerStart = undefined;
291
+ }
292
+ }
293
+ }
294
+ return peerIds;
295
+ }
296
+ function createPeerSuffix(peerIds) {
297
+ const patchSegments = peerIds.filter(isPatchHashSegment);
298
+ const peerSegments = peerIds.filter(peerId => !isPatchHashSegment(peerId)).sort();
299
+ return [...patchSegments, ...peerSegments].map(peerId => `(${peerId})`).join('');
300
+ }
301
+ function isPatchHashSegment(segment) {
302
+ return segment.startsWith('patch_hash=');
303
+ }
304
+ function getVersionFromNodeId(nodeId) {
305
+ const depPathWithoutPeerSuffix = nodeIdWithoutPeerSuffix(nodeId);
306
+ const versionStart = depPathWithoutPeerSuffix.lastIndexOf('@');
307
+ if (versionStart === -1) return undefined;
308
+ const version = depPathWithoutPeerSuffix.slice(versionStart + 1);
309
+ return _semver().default.valid(version) ?? _semver().default.coerce(version)?.version;
310
+ }
311
+ function nodeIdWithoutPeerSuffix(nodeId) {
312
+ const suffixStart = nodeId.indexOf('(');
313
+ return suffixStart === -1 ? nodeId : nodeId.slice(0, suffixStart);
103
314
  }
104
315
 
105
316
  //# sourceMappingURL=dependencies-graph.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_semver","data","_interopRequireDefault","require","dp","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","DEPENDENCIES_GRAPH_SCHEMA_VERSION","DependenciesGraph","constructor","packages","edges","schemaVersion","serialize","JSON","stringify","fromEntries","entries","deserialize","parsed","parse","undefined","Map","merge","graph","directDependencies","findRootEdge","neighbours","directDep","existingDirectDeps","existingDirectDep","find","name","specifier","push","id","nodeIdLessThan","newPkgId","newPkgAttr","isEmpty","size","length","ROOT_EDGE_ID","exports","nodeId1","nodeId2","parsed1","version","parsed2","semver","lt"],"sources":["dependencies-graph.ts"],"sourcesContent":["import semver from 'semver';\nimport type { LockfilePackageInfo } from '@pnpm/lockfile.types';\nimport * as dp from '@pnpm/dependency-path';\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 directDependencies = graph.findRootEdge()?.neighbours;\n if (directDependencies) {\n for (const directDep of directDependencies) {\n const existingDirectDeps = this.findRootEdge()?.neighbours;\n if (existingDirectDeps) {\n const existingDirectDep = existingDirectDeps.find(\n ({ name, specifier }) => name === directDep.name && specifier === directDep.specifier\n );\n if (existingDirectDep == null) {\n existingDirectDeps.push(directDep);\n } else if (existingDirectDep.id !== directDep.id && nodeIdLessThan(existingDirectDep.id, directDep.id)) {\n existingDirectDep.id = directDep.id;\n }\n }\n }\n }\n for (const [newPkgId, newPkgAttr] of graph.packages.entries()) {\n this.packages.set(newPkgId, newPkgAttr);\n }\n this.edges.push(...graph.edges);\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\nfunction nodeIdLessThan(nodeId1: string, nodeId2: string): boolean {\n const parsed1 = dp.parse(nodeId1);\n if (!parsed1?.version) return false;\n const parsed2 = dp.parse(nodeId2);\n if (!parsed2?.version) return false;\n return semver.lt(parsed1.version, parsed2.version);\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","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 dep1.specifier === dep2.specifier || isWildcardSpecifier(dep1.specifier) || isWildcardSpecifier(dep2.specifier);\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":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ function _chai() {
4
+ const data = require("chai");
5
+ _chai = function () {
6
+ return data;
7
+ };
8
+ return data;
9
+ }
10
+ function _dependenciesGraph() {
11
+ const data = require("./dependencies-graph");
12
+ _dependenciesGraph = function () {
13
+ return data;
14
+ };
15
+ return data;
16
+ }
17
+ describe('DependenciesGraph.merge', () => {
18
+ it('adopts the more specific specifier when a wildcard direct dep merges with a manifest spec', () => {
19
+ const base = createGraph([rootEdge([{
20
+ id: 'foo@1.0.0',
21
+ name: 'foo',
22
+ specifier: '*'
23
+ }]), edge('foo@1.0.0')], ['foo@1.0.0']);
24
+ const incoming = createGraph([rootEdge([{
25
+ id: 'foo@1.0.0',
26
+ name: 'foo',
27
+ specifier: '^1.0.0'
28
+ }]), edge('foo@1.0.0')], ['foo@1.0.0']);
29
+ base.merge(incoming);
30
+ const foo = base.findRootEdge()?.neighbours.find(neighbour => neighbour.name === 'foo');
31
+ (0, _chai().expect)(foo?.specifier).to.equal('^1.0.0');
32
+ });
33
+ it('rewrites nested peer providers within their parent provider peer ranges', () => {
34
+ const base = createGraph([rootEdge([{
35
+ id: 'plugin@1.0.0(parser@1.0.0(typescript@5.0.0))',
36
+ name: 'plugin',
37
+ specifier: '1.0.0'
38
+ }]), edge('plugin@1.0.0(parser@1.0.0(typescript@5.0.0))'), edge('parser@1.0.0(typescript@5.0.0)'), edge('typescript@5.0.0')], ['plugin@1.0.0', 'typescript@5.0.0']);
39
+ base.packages.set('parser@1.0.0', {
40
+ peerDependencies: {
41
+ typescript: '^5.0.0'
42
+ }
43
+ });
44
+ const incoming = createGraph([rootEdge([{
45
+ id: 'typescript@6.0.0',
46
+ name: 'typescript',
47
+ specifier: '6.0.0'
48
+ }]), edge('typescript@6.0.0')], ['typescript@6.0.0']);
49
+ base.merge(incoming);
50
+ const plugin = base.findRootEdge()?.neighbours.find(neighbour => neighbour.name === 'plugin');
51
+ (0, _chai().expect)(plugin?.id).to.equal('plugin@1.0.0(parser@1.0.0(typescript@5.0.0))', 'typescript@6.0.0 does not satisfy parser@1.0.0 peer range ^5.0.0');
52
+ });
53
+ it('keeps a peer provider that is referenced only inside a depPath suffix', () => {
54
+ const base = createGraph([rootEdge([{
55
+ id: 'consumer@1.0.0(peer@2.0.0)',
56
+ name: 'consumer',
57
+ specifier: '1.0.0'
58
+ }]), edge('consumer@1.0.0(peer@2.0.0)')], ['consumer@1.0.0', 'peer@2.0.0']);
59
+ base.merge(createGraph([], []));
60
+ (0, _chai().expect)(base.packages.has('peer@2.0.0')).to.equal(true);
61
+ });
62
+ it('keeps the patch_hash segment in front of sorted peer segments', () => {
63
+ const base = createGraph([rootEdge([{
64
+ id: 'foo@1.0.0(patch_hash=abc)(bar@1.0.0)',
65
+ name: 'foo',
66
+ specifier: '1.0.0'
67
+ }]), edge('foo@1.0.0(patch_hash=abc)(bar@1.0.0)'), edge('bar@1.0.0')], ['foo@1.0.0', 'bar@1.0.0']);
68
+ base.packages.set('foo@1.0.0', {
69
+ peerDependencies: {
70
+ bar: '^1.0.0'
71
+ }
72
+ });
73
+ const incoming = createGraph([rootEdge([{
74
+ id: 'bar@1.0.0',
75
+ name: 'bar',
76
+ specifier: '1.0.0'
77
+ }]), edge('bar@1.0.0')], ['bar@1.0.0']);
78
+ base.merge(incoming);
79
+ const foo = base.findRootEdge()?.neighbours.find(neighbour => neighbour.name === 'foo');
80
+ (0, _chai().expect)(foo?.id).to.equal('foo@1.0.0(patch_hash=abc)(bar@1.0.0)');
81
+ });
82
+ it('does not overflow the stack on a deep dependency chain', () => {
83
+ const depth = 50000;
84
+ const edges = [rootEdge([{
85
+ id: 'pkg0@1.0.0',
86
+ name: 'pkg0',
87
+ specifier: '1.0.0'
88
+ }])];
89
+ const packageIds = [];
90
+ for (let i = 0; i < depth; i += 1) {
91
+ const id = `pkg${i}@1.0.0`;
92
+ packageIds.push(id);
93
+ edges.push(edge(id, i + 1 < depth ? [{
94
+ id: `pkg${i + 1}@1.0.0`
95
+ }] : []));
96
+ }
97
+ const graph = createGraph(edges, packageIds);
98
+ graph.merge(createGraph([], []));
99
+ (0, _chai().expect)(graph.packages.size).to.equal(depth);
100
+ });
101
+ });
102
+ function createGraph(edges, packageIds) {
103
+ const packages = new Map(packageIds.map(id => [id, {}]));
104
+ return new (_dependenciesGraph().DependenciesGraph)({
105
+ packages,
106
+ edges
107
+ });
108
+ }
109
+ function rootEdge(neighbours) {
110
+ return {
111
+ id: _dependenciesGraph().DependenciesGraph.ROOT_EDGE_ID,
112
+ neighbours
113
+ };
114
+ }
115
+ function edge(id, neighbours = []) {
116
+ return {
117
+ id,
118
+ neighbours
119
+ };
120
+ }
121
+
122
+ //# sourceMappingURL=dependencies-graph.spec.js.map
@@ -0,0 +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([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([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([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":[]}
@@ -0,0 +1,107 @@
1
+ import { expect } from 'chai';
2
+ import type { DependencyEdge, PackagesMap } from './dependencies-graph';
3
+ import { DependenciesGraph } from './dependencies-graph';
4
+
5
+ describe('DependenciesGraph.merge', () => {
6
+ it('adopts the more specific specifier when a wildcard direct dep merges with a manifest spec', () => {
7
+ const base = createGraph([rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '*' }]), edge('foo@1.0.0')], [
8
+ 'foo@1.0.0',
9
+ ]);
10
+ const incoming = createGraph(
11
+ [rootEdge([{ id: 'foo@1.0.0', name: 'foo', specifier: '^1.0.0' }]), edge('foo@1.0.0')],
12
+ ['foo@1.0.0']
13
+ );
14
+
15
+ base.merge(incoming);
16
+
17
+ const foo = base.findRootEdge()?.neighbours.find((neighbour) => neighbour.name === 'foo');
18
+ expect(foo?.specifier).to.equal('^1.0.0');
19
+ });
20
+
21
+ it('rewrites nested peer providers within their parent provider peer ranges', () => {
22
+ const base = createGraph(
23
+ [
24
+ rootEdge([{ id: 'plugin@1.0.0(parser@1.0.0(typescript@5.0.0))', name: 'plugin', specifier: '1.0.0' }]),
25
+ edge('plugin@1.0.0(parser@1.0.0(typescript@5.0.0))'),
26
+ edge('parser@1.0.0(typescript@5.0.0)'),
27
+ edge('typescript@5.0.0'),
28
+ ],
29
+ ['plugin@1.0.0', 'typescript@5.0.0']
30
+ );
31
+ base.packages.set('parser@1.0.0', { peerDependencies: { typescript: '^5.0.0' } } as any);
32
+ const incoming = createGraph([rootEdge([{ id: 'typescript@6.0.0', name: 'typescript', specifier: '6.0.0' }]), edge('typescript@6.0.0')], [
33
+ 'typescript@6.0.0',
34
+ ]);
35
+
36
+ base.merge(incoming);
37
+
38
+ const plugin = base.findRootEdge()?.neighbours.find((neighbour) => neighbour.name === 'plugin');
39
+ expect(plugin?.id).to.equal(
40
+ 'plugin@1.0.0(parser@1.0.0(typescript@5.0.0))',
41
+ 'typescript@6.0.0 does not satisfy parser@1.0.0 peer range ^5.0.0'
42
+ );
43
+ });
44
+
45
+ it('keeps a peer provider that is referenced only inside a depPath suffix', () => {
46
+ const base = createGraph(
47
+ [
48
+ rootEdge([{ id: 'consumer@1.0.0(peer@2.0.0)', name: 'consumer', specifier: '1.0.0' }]),
49
+ edge('consumer@1.0.0(peer@2.0.0)'),
50
+ ],
51
+ ['consumer@1.0.0', 'peer@2.0.0']
52
+ );
53
+
54
+ base.merge(createGraph([], []));
55
+
56
+ expect(base.packages.has('peer@2.0.0')).to.equal(true);
57
+ });
58
+
59
+ it('keeps the patch_hash segment in front of sorted peer segments', () => {
60
+ const base = createGraph(
61
+ [
62
+ rootEdge([{ id: 'foo@1.0.0(patch_hash=abc)(bar@1.0.0)', name: 'foo', specifier: '1.0.0' }]),
63
+ edge('foo@1.0.0(patch_hash=abc)(bar@1.0.0)'),
64
+ edge('bar@1.0.0'),
65
+ ],
66
+ ['foo@1.0.0', 'bar@1.0.0']
67
+ );
68
+ base.packages.set('foo@1.0.0', { peerDependencies: { bar: '^1.0.0' } } as any);
69
+ const incoming = createGraph([rootEdge([{ id: 'bar@1.0.0', name: 'bar', specifier: '1.0.0' }]), edge('bar@1.0.0')], [
70
+ 'bar@1.0.0',
71
+ ]);
72
+
73
+ base.merge(incoming);
74
+
75
+ const foo = base.findRootEdge()?.neighbours.find((neighbour) => neighbour.name === 'foo');
76
+ expect(foo?.id).to.equal('foo@1.0.0(patch_hash=abc)(bar@1.0.0)');
77
+ });
78
+
79
+ it('does not overflow the stack on a deep dependency chain', () => {
80
+ const depth = 50000;
81
+ const edges: DependencyEdge[] = [rootEdge([{ id: 'pkg0@1.0.0', name: 'pkg0', specifier: '1.0.0' }])];
82
+ const packageIds: string[] = [];
83
+ for (let i = 0; i < depth; i += 1) {
84
+ const id = `pkg${i}@1.0.0`;
85
+ packageIds.push(id);
86
+ edges.push(edge(id, i + 1 < depth ? [{ id: `pkg${i + 1}@1.0.0` }] : []));
87
+ }
88
+ const graph = createGraph(edges, packageIds);
89
+
90
+ graph.merge(createGraph([], []));
91
+
92
+ expect(graph.packages.size).to.equal(depth);
93
+ });
94
+ });
95
+
96
+ function createGraph(edges: DependencyEdge[], packageIds: string[]): DependenciesGraph {
97
+ const packages: PackagesMap = new Map(packageIds.map((id) => [id, {} as any]));
98
+ return new DependenciesGraph({ packages, edges });
99
+ }
100
+
101
+ function rootEdge(neighbours: DependencyEdge['neighbours']): DependencyEdge {
102
+ return { id: DependenciesGraph.ROOT_EDGE_ID, neighbours };
103
+ }
104
+
105
+ function edge(id: string, neighbours: DependencyEdge['neighbours'] = []): DependencyEdge {
106
+ return { id, neighbours };
107
+ }
@@ -1,6 +1,5 @@
1
1
  import semver from 'semver';
2
2
  import type { LockfilePackageInfo } from '@pnpm/lockfile.types';
3
- import * as dp from '@pnpm/dependency-path';
4
3
 
5
4
  export type PackagesMap = Map<string, PackageAttributes>;
6
5
 
@@ -77,26 +76,34 @@ export class DependenciesGraph {
77
76
  }
78
77
 
79
78
  merge(graph: DependenciesGraph): void {
80
- const directDependencies = graph.findRootEdge()?.neighbours;
81
- if (directDependencies) {
79
+ const rootEdge = this.findRootEdge();
80
+ const incomingRootEdge = graph.findRootEdge();
81
+ const directDependencies = incomingRootEdge?.neighbours;
82
+ if (directDependencies && rootEdge) {
82
83
  for (const directDep of directDependencies) {
83
- const existingDirectDeps = this.findRootEdge()?.neighbours;
84
- if (existingDirectDeps) {
85
- const existingDirectDep = existingDirectDeps.find(
86
- ({ name, specifier }) => name === directDep.name && specifier === directDep.specifier
87
- );
88
- if (existingDirectDep == null) {
89
- existingDirectDeps.push(directDep);
90
- } else if (existingDirectDep.id !== directDep.id && nodeIdLessThan(existingDirectDep.id, directDep.id)) {
84
+ const existingDirectDep = rootEdge.neighbours.find((existingDep) =>
85
+ isSameDirectDependency(existingDep, directDep)
86
+ );
87
+ if (existingDirectDep == null) {
88
+ rootEdge.neighbours.push(directDep);
89
+ } else {
90
+ if (isWildcardSpecifier(existingDirectDep.specifier) && !isWildcardSpecifier(directDep.specifier)) {
91
+ existingDirectDep.specifier = directDep.specifier;
92
+ }
93
+ if (existingDirectDep.id !== directDep.id && nodeIdLessThan(existingDirectDep.id, directDep.id)) {
91
94
  existingDirectDep.id = directDep.id;
92
95
  }
93
96
  }
94
97
  }
98
+ } else if (incomingRootEdge) {
99
+ this.edges.push(incomingRootEdge);
95
100
  }
96
101
  for (const [newPkgId, newPkgAttr] of graph.packages.entries()) {
97
102
  this.packages.set(newPkgId, newPkgAttr);
98
103
  }
99
- this.edges.push(...graph.edges);
104
+ this.edges.push(...graph.edges.filter(({ id }) => id !== DependenciesGraph.ROOT_EDGE_ID));
105
+ this.normalizePeerProviderVersions();
106
+ this.pruneUnreachableFromRoot();
100
107
  }
101
108
 
102
109
  isEmpty(): boolean {
@@ -109,12 +116,238 @@ export class DependenciesGraph {
109
116
  findRootEdge(): DependencyEdge | undefined {
110
117
  return this.edges.find(({ id }) => id === DependenciesGraph.ROOT_EDGE_ID);
111
118
  }
119
+
120
+ private pruneUnreachableFromRoot(): void {
121
+ const rootEdge = this.findRootEdge();
122
+ if (!rootEdge) return;
123
+ const edgesById = new Map<string, DependencyEdge>();
124
+ for (const edge of this.edges) {
125
+ if (edge.id !== DependenciesGraph.ROOT_EDGE_ID) {
126
+ edgesById.set(edge.id, edge);
127
+ }
128
+ }
129
+ const reachableEdges = new Set<string>();
130
+ const reachablePackages = new Set<string>();
131
+ // An explicit stack: deep dependency chains would overflow the call
132
+ // stack with a recursive walk. Every node id is processed once — the
133
+ // guard must sit before the suffix pushes, or a node referenced by M
134
+ // edges re-pushes its suffix ids M times and nested suffixes multiply
135
+ // that per level.
136
+ const visited = new Set<string>();
137
+ const stack = rootEdge.neighbours.map((neighbour) => neighbour.id);
138
+ while (stack.length > 0) {
139
+ const nodeId = stack.pop()!;
140
+ if (visited.has(nodeId)) continue;
141
+ visited.add(nodeId);
142
+ reachablePackages.add(nodeIdWithoutPeerSuffix(nodeId));
143
+ for (const peerId of splitPeerIds(nodeId)) {
144
+ if (!isPatchHashSegment(peerId)) stack.push(peerId);
145
+ }
146
+ const edge = edgesById.get(nodeId);
147
+ if (!edge) continue;
148
+ reachableEdges.add(nodeId);
149
+ if (edge.attr?.pkgId) reachablePackages.add(edge.attr.pkgId);
150
+ for (const neighbour of edge.neighbours) {
151
+ stack.push(neighbour.id);
152
+ }
153
+ }
154
+ this.edges = [rootEdge, ...Array.from(edgesById.values()).filter((edge) => reachableEdges.has(edge.id))];
155
+ for (const pkgId of this.packages.keys()) {
156
+ if (!reachablePackages.has(pkgId)) {
157
+ this.packages.delete(pkgId);
158
+ }
159
+ }
160
+ }
161
+
162
+ private normalizePeerProviderVersions(): void {
163
+ const versionsByPackageName = this.collectVersionsByPackageName();
164
+ const getBestCompatiblePeer = (name: string, range: string) =>
165
+ versionsByPackageName
166
+ .get(name)
167
+ ?.find(({ version }) => semver.satisfies(version, range, { includePrerelease: true }));
168
+ const getHighestPeer = (name: string) => versionsByPackageName.get(name)?.[0];
169
+ const rewritePeerId = (peerId: string, peerDependencies?: Record<string, string>): string => {
170
+ const parsedPeer = parsePkgId(peerId);
171
+ const nestedPeerDependencies = this.packages.get(nodeIdWithoutPeerSuffix(peerId))?.peerDependencies;
172
+ const peerIds = splitPeerIds(peerId).map((nestedPeerId) => rewritePeerId(nestedPeerId, nestedPeerDependencies));
173
+ let rewrittenBase = nodeIdWithoutPeerSuffix(peerId);
174
+ if (parsedPeer) {
175
+ const range = peerDependencies?.[parsedPeer.name];
176
+ const bestPeer = range ? getBestCompatiblePeer(parsedPeer.name, range) : getHighestPeer(parsedPeer.name);
177
+ if (bestPeer) rewrittenBase = `${parsedPeer.name}@${bestPeer.version}`;
178
+ }
179
+ return `${rewrittenBase}${createPeerSuffix(peerIds)}`;
180
+ };
181
+ const rewritePeerDep = (
182
+ depId: string,
183
+ peerDependencies?: Record<string, string>,
184
+ peerIdsByName?: Map<string, string>
185
+ ) => {
186
+ const peerId = peerIdsByName?.get(parsePkgId(depId)?.name ?? '');
187
+ if (peerId) return peerId;
188
+ if (!peerDependencies) return depId;
189
+ const parsedDep = parsePkgId(depId);
190
+ if (!parsedDep) return depId;
191
+ const range = peerDependencies[parsedDep.name];
192
+ if (!range) return depId;
193
+ const bestPeer = getBestCompatiblePeer(parsedDep.name, range);
194
+ if (!bestPeer) return depId;
195
+ return `${parsedDep.name}@${bestPeer.version}`;
196
+ };
197
+ const rewriteNodeId = (nodeId: string) => {
198
+ const pkgId = nodeIdWithoutPeerSuffix(nodeId);
199
+ const peerDependencies = this.packages.get(pkgId)?.peerDependencies;
200
+ const peerIds = splitPeerIds(nodeId);
201
+ if (peerIds.length === 0) return nodeId;
202
+ let changed = false;
203
+ const rewrittenPeerIds = peerIds.map((peerId) => {
204
+ const rewrittenPeerId = rewritePeerId(peerId, peerDependencies);
205
+ if (rewrittenPeerId === peerId) return peerId;
206
+ changed = true;
207
+ return rewrittenPeerId;
208
+ });
209
+ if (!changed) return nodeId;
210
+ return `${pkgId}${createPeerSuffix(rewrittenPeerIds)}`;
211
+ };
212
+ const rewriteNeighbour = (
213
+ neighbour: DependencyNeighbour,
214
+ peerDependencies?: Record<string, string>,
215
+ peerIdsByName?: Map<string, string>
216
+ ) => {
217
+ const rewrittenId = rewriteNodeId(rewritePeerDep(neighbour.id, peerDependencies, peerIdsByName));
218
+ return rewrittenId === neighbour.id ? neighbour : { ...neighbour, id: rewrittenId };
219
+ };
220
+ const edgesById = new Map<string, DependencyEdge>();
221
+ for (const edge of this.edges) {
222
+ const peerDependencies =
223
+ edge.id === DependenciesGraph.ROOT_EDGE_ID
224
+ ? undefined
225
+ : this.packages.get(edge.attr?.pkgId ?? nodeIdWithoutPeerSuffix(edge.id))?.peerDependencies;
226
+ const peerIdsByName = new Map<string, string>();
227
+ for (const peerId of splitPeerIds(edge.id)) {
228
+ const rewrittenPeerId = rewritePeerId(peerId, peerDependencies);
229
+ const parsedPeer = parsePkgId(rewrittenPeerId);
230
+ if (parsedPeer) peerIdsByName.set(parsedPeer.name, rewrittenPeerId);
231
+ }
232
+ const rewrittenEdge: DependencyEdge = {
233
+ ...edge,
234
+ id: edge.id === DependenciesGraph.ROOT_EDGE_ID ? edge.id : rewriteNodeId(edge.id),
235
+ neighbours: edge.neighbours.map((neighbour) => rewriteNeighbour(neighbour, peerDependencies, peerIdsByName)),
236
+ };
237
+ const existingEdge = edgesById.get(rewrittenEdge.id);
238
+ if (existingEdge) {
239
+ mergeNeighbours(existingEdge.neighbours, rewrittenEdge.neighbours);
240
+ } else {
241
+ edgesById.set(rewrittenEdge.id, rewrittenEdge);
242
+ }
243
+ }
244
+ this.edges = Array.from(edgesById.values());
245
+ }
246
+
247
+ private collectVersionsByPackageName(): Map<string, Array<{ version: string }>> {
248
+ const versionsByPackageName = new Map<string, Array<{ version: string }>>();
249
+ const addVersion = (pkgId: string) => {
250
+ const parsed = parsePkgId(pkgId);
251
+ if (!parsed || !semver.valid(parsed.version)) return;
252
+ const versions = versionsByPackageName.get(parsed.name) ?? [];
253
+ versions.push({ version: parsed.version });
254
+ versionsByPackageName.set(parsed.name, versions);
255
+ for (const peerId of splitPeerIds(pkgId)) {
256
+ addVersion(peerId);
257
+ }
258
+ };
259
+ for (const pkgId of this.packages.keys()) {
260
+ addVersion(pkgId);
261
+ }
262
+ for (const edge of this.edges) {
263
+ addVersion(edge.id);
264
+ for (const neighbour of edge.neighbours) {
265
+ addVersion(neighbour.id);
266
+ }
267
+ }
268
+ for (const versions of versionsByPackageName.values()) {
269
+ versions.sort((version1, version2) => semver.rcompare(version1.version, version2.version));
270
+ }
271
+ return versionsByPackageName;
272
+ }
273
+ }
274
+
275
+ function isSameDirectDependency(dep1: DependencyNeighbour, dep2: DependencyNeighbour): boolean {
276
+ if (!dep1.name || !dep2.name) return dep1.id === dep2.id;
277
+ if (dep1.name !== dep2.name) return false;
278
+ return dep1.specifier === dep2.specifier || isWildcardSpecifier(dep1.specifier) || isWildcardSpecifier(dep2.specifier);
279
+ }
280
+
281
+ function isWildcardSpecifier(specifier?: string): boolean {
282
+ return specifier === '*' || specifier == null || specifier === '';
112
283
  }
113
284
 
114
285
  function nodeIdLessThan(nodeId1: string, nodeId2: string): boolean {
115
- const parsed1 = dp.parse(nodeId1);
116
- if (!parsed1?.version) return false;
117
- const parsed2 = dp.parse(nodeId2);
118
- if (!parsed2?.version) return false;
119
- return semver.lt(parsed1.version, parsed2.version);
286
+ const version1 = getVersionFromNodeId(nodeId1);
287
+ if (!version1) return false;
288
+ const version2 = getVersionFromNodeId(nodeId2);
289
+ if (!version2) return false;
290
+ return semver.lt(version1, version2);
291
+ }
292
+
293
+ function mergeNeighbours(existingNeighbours: DependencyNeighbour[], newNeighbours: DependencyNeighbour[]): void {
294
+ for (const newNeighbour of newNeighbours) {
295
+ const existingNeighbour = existingNeighbours.find((neighbour) => neighbour.id === newNeighbour.id);
296
+ if (!existingNeighbour) existingNeighbours.push(newNeighbour);
297
+ }
298
+ }
299
+
300
+ function parsePkgId(pkgId: string): { name: string; version: string } | undefined {
301
+ const depPathWithoutPeerSuffix = nodeIdWithoutPeerSuffix(pkgId);
302
+ const versionStart = depPathWithoutPeerSuffix.lastIndexOf('@');
303
+ if (versionStart <= 0) return undefined;
304
+ const name = depPathWithoutPeerSuffix.slice(0, versionStart);
305
+ const version = depPathWithoutPeerSuffix.slice(versionStart + 1);
306
+ if (!name || !version) return undefined;
307
+ return { name, version };
308
+ }
309
+
310
+ function splitPeerIds(nodeId: string): string[] {
311
+ const suffixStart = nodeId.indexOf('(');
312
+ if (suffixStart === -1) return [];
313
+ const peerIds: string[] = [];
314
+ let depth = 0;
315
+ let peerStart: number | undefined;
316
+ for (let index = suffixStart; index < nodeId.length; index += 1) {
317
+ const char = nodeId[index];
318
+ if (char === '(') {
319
+ if (depth === 0) peerStart = index + 1;
320
+ depth += 1;
321
+ } else if (char === ')') {
322
+ depth -= 1;
323
+ if (depth === 0 && peerStart != null) {
324
+ peerIds.push(nodeId.slice(peerStart, index));
325
+ peerStart = undefined;
326
+ }
327
+ }
328
+ }
329
+ return peerIds;
330
+ }
331
+
332
+ function createPeerSuffix(peerIds: string[]): string {
333
+ const patchSegments = peerIds.filter(isPatchHashSegment);
334
+ const peerSegments = peerIds.filter((peerId) => !isPatchHashSegment(peerId)).sort();
335
+ return [...patchSegments, ...peerSegments].map((peerId) => `(${peerId})`).join('');
336
+ }
337
+
338
+ function isPatchHashSegment(segment: string): boolean {
339
+ return segment.startsWith('patch_hash=');
340
+ }
341
+
342
+ function getVersionFromNodeId(nodeId: string): string | undefined {
343
+ const depPathWithoutPeerSuffix = nodeIdWithoutPeerSuffix(nodeId);
344
+ const versionStart = depPathWithoutPeerSuffix.lastIndexOf('@');
345
+ if (versionStart === -1) return undefined;
346
+ const version = depPathWithoutPeerSuffix.slice(versionStart + 1);
347
+ return semver.valid(version) ?? semver.coerce(version)?.version;
348
+ }
349
+
350
+ function nodeIdWithoutPeerSuffix(nodeId: string): string {
351
+ const suffixStart = nodeId.indexOf('(');
352
+ return suffixStart === -1 ? nodeId : nodeId.slice(0, suffixStart);
120
353
  }
package/package.json CHANGED
@@ -1,16 +1,15 @@
1
1
  {
2
2
  "name": "@teambit/objects",
3
- "version": "0.0.592",
3
+ "version": "0.0.594",
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.592"
9
+ "version": "0.0.594"
10
10
  },
11
11
  "dependencies": {
12
- "@pnpm/dependency-path": "1001.1.10",
13
- "@pnpm/lockfile.types": "^1002.1.0",
12
+ "@pnpm/lockfile.types": "1100.0.12",
14
13
  "semver": "7.7.1",
15
14
  "lodash": "4.17.21",
16
15
  "uuid": "8.3.2",
@@ -21,36 +20,36 @@
21
20
  "glob": "13.0.0",
22
21
  "uid-number": "0.0.6",
23
22
  "@teambit/harmony": "0.4.12",
24
- "@teambit/cli": "0.0.1359",
25
23
  "@teambit/component-id": "1.2.4",
26
24
  "@teambit/legacy.utils": "0.0.47",
27
- "@teambit/harmony.modules.get-basic-log": "0.0.143",
28
25
  "@teambit/bit-error": "0.0.404",
29
26
  "@teambit/component-version": "1.0.4",
30
- "@teambit/component.snap-distance": "0.0.143",
31
- "@teambit/config-store": "0.0.240",
32
27
  "@teambit/lane-id": "0.0.312",
33
28
  "@teambit/legacy.cli.error": "0.0.54",
34
29
  "@teambit/legacy.constants": "0.0.39",
35
30
  "@teambit/legacy.logger": "0.0.54",
36
- "@teambit/legacy.scope": "0.0.142",
37
31
  "@teambit/toolbox.crypto.sha1": "0.0.20",
38
- "@teambit/component.sources": "0.0.194",
39
32
  "@teambit/harmony.modules.concurrency": "0.0.40",
40
33
  "@teambit/legacy-bit-id": "1.1.3",
41
34
  "@teambit/legacy-component-log": "0.0.427",
42
- "@teambit/legacy.consumer-component": "0.0.143",
43
- "@teambit/legacy.consumer-config": "0.0.142",
44
- "@teambit/legacy.extension-data": "0.0.144",
45
35
  "@teambit/pkg.modules.semver-helper": "0.0.32",
46
36
  "@teambit/toolbox.array.duplications-finder": "0.0.12",
47
37
  "@teambit/toolbox.promise.map-pool": "0.0.19",
48
38
  "@teambit/graph.cleargraph": "0.0.11",
49
39
  "@teambit/bit.get-bit-version": "0.0.25",
50
- "@teambit/semantics.doc-parser": "0.0.150",
51
40
  "@teambit/harmony.modules.in-memory-cache": "0.0.43",
52
41
  "@teambit/toolbox.fs.remove-empty-dir": "0.0.18",
53
- "@teambit/graph": "1.0.1085"
42
+ "@teambit/cli": "0.0.1360",
43
+ "@teambit/harmony.modules.get-basic-log": "0.0.144",
44
+ "@teambit/component.snap-distance": "0.0.144",
45
+ "@teambit/config-store": "0.0.241",
46
+ "@teambit/legacy.scope": "0.0.143",
47
+ "@teambit/component.sources": "0.0.195",
48
+ "@teambit/legacy.consumer-component": "0.0.144",
49
+ "@teambit/legacy.consumer-config": "0.0.143",
50
+ "@teambit/legacy.extension-data": "0.0.145",
51
+ "@teambit/semantics.doc-parser": "0.0.151",
52
+ "@teambit/graph": "1.0.1087"
54
53
  },
55
54
  "devDependencies": {
56
55
  "@types/semver": "7.5.8",