@vltpkg/graph 0.0.0-9 → 1.0.0-rc.10
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/README.md +136 -1
- package/dist/esm/actual/load.d.ts +49 -3
- package/dist/esm/actual/load.d.ts.map +1 -1
- package/dist/esm/actual/load.js +146 -74
- package/dist/esm/actual/load.js.map +1 -1
- package/dist/esm/browser.d.ts +8 -4
- package/dist/esm/browser.d.ts.map +1 -1
- package/dist/esm/browser.js +6 -2
- package/dist/esm/browser.js.map +1 -1
- package/dist/esm/build.d.ts +29 -0
- package/dist/esm/build.d.ts.map +1 -0
- package/dist/esm/build.js +79 -0
- package/dist/esm/build.js.map +1 -0
- package/dist/esm/dependencies.d.ts +10 -3
- package/dist/esm/dependencies.d.ts.map +1 -1
- package/dist/esm/dependencies.js +63 -0
- package/dist/esm/dependencies.js.map +1 -1
- package/dist/esm/diff.d.ts +69 -0
- package/dist/esm/diff.d.ts.map +1 -1
- package/dist/esm/diff.js +25 -0
- package/dist/esm/diff.js.map +1 -1
- package/dist/esm/edge.d.ts +8 -2
- package/dist/esm/edge.d.ts.map +1 -1
- package/dist/esm/edge.js +12 -0
- package/dist/esm/edge.js.map +1 -1
- package/dist/esm/fixup-added-names.d.ts +16 -0
- package/dist/esm/fixup-added-names.d.ts.map +1 -0
- package/dist/esm/fixup-added-names.js +31 -0
- package/dist/esm/fixup-added-names.js.map +1 -0
- package/dist/esm/graph.d.ts +34 -10
- package/dist/esm/graph.d.ts.map +1 -1
- package/dist/esm/graph.js +150 -24
- package/dist/esm/graph.js.map +1 -1
- package/dist/esm/ideal/append-nodes.d.ts +12 -1
- package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
- package/dist/esm/ideal/append-nodes.js +303 -53
- package/dist/esm/ideal/append-nodes.js.map +1 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +4 -4
- package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.js +35 -16
- package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
- package/dist/esm/ideal/build.d.ts +9 -0
- package/dist/esm/ideal/build.d.ts.map +1 -1
- package/dist/esm/ideal/build.js +31 -1
- package/dist/esm/ideal/build.js.map +1 -1
- package/dist/esm/ideal/get-importer-specs.d.ts +11 -3
- package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
- package/dist/esm/ideal/get-importer-specs.js +86 -9
- package/dist/esm/ideal/get-importer-specs.js.map +1 -1
- package/dist/esm/ideal/get-ordered-dependencies.d.ts +10 -0
- package/dist/esm/ideal/get-ordered-dependencies.d.ts.map +1 -0
- package/dist/esm/ideal/get-ordered-dependencies.js +42 -0
- package/dist/esm/ideal/get-ordered-dependencies.js.map +1 -0
- package/dist/esm/ideal/peers.d.ts +71 -0
- package/dist/esm/ideal/peers.d.ts.map +1 -0
- package/dist/esm/ideal/peers.js +318 -0
- package/dist/esm/ideal/peers.js.map +1 -0
- package/dist/esm/ideal/refresh-ideal-graph.d.ts +48 -0
- package/dist/esm/ideal/refresh-ideal-graph.d.ts.map +1 -0
- package/dist/esm/ideal/refresh-ideal-graph.js +79 -0
- package/dist/esm/ideal/refresh-ideal-graph.js.map +1 -0
- package/dist/esm/ideal/types.d.ts +78 -1
- package/dist/esm/ideal/types.d.ts.map +1 -1
- package/dist/esm/ideal/types.js.map +1 -1
- package/dist/esm/index.d.ts +9 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/install.d.ts +10 -4
- package/dist/esm/install.d.ts.map +1 -1
- package/dist/esm/install.js +191 -20
- package/dist/esm/install.js.map +1 -1
- package/dist/esm/lockfile/load-edges.d.ts +8 -1
- package/dist/esm/lockfile/load-edges.d.ts.map +1 -1
- package/dist/esm/lockfile/load-edges.js +80 -15
- package/dist/esm/lockfile/load-edges.js.map +1 -1
- package/dist/esm/lockfile/load-nodes.d.ts +3 -2
- package/dist/esm/lockfile/load-nodes.d.ts.map +1 -1
- package/dist/esm/lockfile/load-nodes.js +85 -13
- package/dist/esm/lockfile/load-nodes.js.map +1 -1
- package/dist/esm/lockfile/load.d.ts +18 -5
- package/dist/esm/lockfile/load.d.ts.map +1 -1
- package/dist/esm/lockfile/load.js +28 -20
- package/dist/esm/lockfile/load.js.map +1 -1
- package/dist/esm/lockfile/save.d.ts +16 -3
- package/dist/esm/lockfile/save.d.ts.map +1 -1
- package/dist/esm/lockfile/save.js +64 -17
- package/dist/esm/lockfile/save.js.map +1 -1
- package/dist/esm/lockfile/types.d.ts +34 -4
- package/dist/esm/lockfile/types.d.ts.map +1 -1
- package/dist/esm/lockfile/types.js +31 -0
- package/dist/esm/lockfile/types.js.map +1 -1
- package/dist/esm/modifiers.d.ts +189 -0
- package/dist/esm/modifiers.d.ts.map +1 -0
- package/dist/esm/modifiers.js +330 -0
- package/dist/esm/modifiers.js.map +1 -0
- package/dist/esm/node.d.ts +91 -6
- package/dist/esm/node.d.ts.map +1 -1
- package/dist/esm/node.js +119 -5
- package/dist/esm/node.js.map +1 -1
- package/dist/esm/reify/add-edge.d.ts +1 -2
- package/dist/esm/reify/add-edge.d.ts.map +1 -1
- package/dist/esm/reify/add-edge.js +29 -18
- package/dist/esm/reify/add-edge.js.map +1 -1
- package/dist/esm/reify/add-edges.d.ts +1 -2
- package/dist/esm/reify/add-edges.d.ts.map +1 -1
- package/dist/esm/reify/add-edges.js +3 -3
- package/dist/esm/reify/add-edges.js.map +1 -1
- package/dist/esm/reify/add-nodes.d.ts.map +1 -1
- package/dist/esm/reify/add-nodes.js +4 -27
- package/dist/esm/reify/add-nodes.js.map +1 -1
- package/dist/esm/reify/bin-chmod.d.ts +11 -0
- package/dist/esm/reify/bin-chmod.d.ts.map +1 -0
- package/dist/esm/reify/bin-chmod.js +39 -0
- package/dist/esm/reify/bin-chmod.js.map +1 -0
- package/dist/esm/reify/build.d.ts +10 -1
- package/dist/esm/reify/build.d.ts.map +1 -1
- package/dist/esm/reify/build.js +36 -23
- package/dist/esm/reify/build.js.map +1 -1
- package/dist/esm/reify/calculate-save-value.d.ts +3 -0
- package/dist/esm/reify/calculate-save-value.d.ts.map +1 -0
- package/dist/esm/reify/calculate-save-value.js +45 -0
- package/dist/esm/reify/calculate-save-value.js.map +1 -0
- package/dist/esm/reify/check-needed-build.d.ts +25 -0
- package/dist/esm/reify/check-needed-build.d.ts.map +1 -0
- package/dist/esm/reify/check-needed-build.js +50 -0
- package/dist/esm/reify/check-needed-build.js.map +1 -0
- package/dist/esm/reify/delete-edge.d.ts.map +1 -1
- package/dist/esm/reify/delete-edge.js +3 -4
- package/dist/esm/reify/delete-edge.js.map +1 -1
- package/dist/esm/reify/extract-node.d.ts +24 -0
- package/dist/esm/reify/extract-node.d.ts.map +1 -0
- package/dist/esm/reify/extract-node.js +84 -0
- package/dist/esm/reify/extract-node.js.map +1 -0
- package/dist/esm/reify/index.d.ts +18 -1
- package/dist/esm/reify/index.d.ts.map +1 -1
- package/dist/esm/reify/index.js +85 -15
- package/dist/esm/reify/index.js.map +1 -1
- package/dist/esm/reify/internal-hoist.d.ts +9 -0
- package/dist/esm/reify/internal-hoist.d.ts.map +1 -0
- package/dist/esm/reify/internal-hoist.js +134 -0
- package/dist/esm/reify/internal-hoist.js.map +1 -0
- package/dist/esm/reify/update-importers-package-json.d.ts +1 -1
- package/dist/esm/reify/update-importers-package-json.d.ts.map +1 -1
- package/dist/esm/reify/update-importers-package-json.js +33 -24
- package/dist/esm/reify/update-importers-package-json.js.map +1 -1
- package/dist/esm/remove-optional-subgraph.js +1 -1
- package/dist/esm/remove-optional-subgraph.js.map +1 -1
- package/dist/esm/resolve-save-type.d.ts +1 -2
- package/dist/esm/resolve-save-type.d.ts.map +1 -1
- package/dist/esm/resolve-save-type.js.map +1 -1
- package/dist/esm/stringify-node.d.ts +1 -1
- package/dist/esm/stringify-node.d.ts.map +1 -1
- package/dist/esm/stringify-node.js +10 -1
- package/dist/esm/stringify-node.js.map +1 -1
- package/dist/esm/transfer-data/load.d.ts +44 -0
- package/dist/esm/transfer-data/load.d.ts.map +1 -0
- package/dist/esm/transfer-data/load.js +176 -0
- package/dist/esm/transfer-data/load.js.map +1 -0
- package/dist/esm/uninstall.d.ts +5 -4
- package/dist/esm/uninstall.d.ts.map +1 -1
- package/dist/esm/uninstall.js +61 -19
- package/dist/esm/uninstall.js.map +1 -1
- package/dist/esm/update.d.ts +13 -0
- package/dist/esm/update.d.ts.map +1 -0
- package/dist/esm/update.js +73 -0
- package/dist/esm/update.js.map +1 -0
- package/dist/esm/virtual-root.d.ts +16 -0
- package/dist/esm/virtual-root.d.ts.map +1 -0
- package/dist/esm/virtual-root.js +79 -0
- package/dist/esm/virtual-root.js.map +1 -0
- package/dist/esm/visualization/human-readable-output.d.ts +4 -5
- package/dist/esm/visualization/human-readable-output.d.ts.map +1 -1
- package/dist/esm/visualization/human-readable-output.js +47 -19
- package/dist/esm/visualization/human-readable-output.js.map +1 -1
- package/dist/esm/visualization/json-output.d.ts +7 -2
- package/dist/esm/visualization/json-output.d.ts.map +1 -1
- package/dist/esm/visualization/json-output.js +35 -12
- package/dist/esm/visualization/json-output.js.map +1 -1
- package/dist/esm/visualization/mermaid-output.d.ts +7 -1
- package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
- package/dist/esm/visualization/mermaid-output.js +110 -14
- package/dist/esm/visualization/mermaid-output.js.map +1 -1
- package/dist/esm/visualization/object-like-output.d.ts +1 -1
- package/dist/esm/visualization/object-like-output.d.ts.map +1 -1
- package/dist/esm/visualization/object-like-output.js.map +1 -1
- package/package.json +35 -29
- package/dist/esm/ideal/add-nodes.d.ts +0 -19
- package/dist/esm/ideal/add-nodes.d.ts.map +0 -1
- package/dist/esm/ideal/add-nodes.js +0 -32
- package/dist/esm/ideal/add-nodes.js.map +0 -1
- package/dist/esm/ideal/remove-nodes.d.ts +0 -7
- package/dist/esm/ideal/remove-nodes.d.ts.map +0 -1
- package/dist/esm/ideal/remove-nodes.js +0 -19
- package/dist/esm/ideal/remove-nodes.js.map +0 -1
- package/dist/esm/reify/bin-paths.d.ts +0 -4
- package/dist/esm/reify/bin-paths.d.ts.map +0 -1
- package/dist/esm/reify/bin-paths.js +0 -23
- package/dist/esm/reify/bin-paths.js.map +0 -1
- package/dist/esm/types.d.ts +0 -42
- package/dist/esm/types.d.ts.map +0 -1
- package/dist/esm/types.js +0 -2
- package/dist/esm/types.js.map +0 -1
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
import type { PackageInfoClient } from '@vltpkg/package-info';
|
|
2
|
-
import type {
|
|
2
|
+
import type { Spec } from '@vltpkg/spec';
|
|
3
|
+
import type { DependencySaveType } from '@vltpkg/types';
|
|
4
|
+
import type { AddImportersDependenciesMap, Dependency, RemoveImportersDependenciesMap } from '../dependencies.ts';
|
|
5
|
+
import type { ModifierActiveEntry } from '../modifiers.ts';
|
|
3
6
|
import type { Graph } from '../graph.ts';
|
|
7
|
+
import type { Node } from '../node.ts';
|
|
8
|
+
/**
|
|
9
|
+
* A map of dependencies to be added to non-importer nodes.
|
|
10
|
+
* Keys are {@link DepID} of nodes that are not importers (e.g., nested folders).
|
|
11
|
+
* When these nodes are resolved and placed in the graph, their dependencies
|
|
12
|
+
* from this map are injected into the processing queue.
|
|
13
|
+
*/
|
|
14
|
+
export type TransientAddMap = Omit<AddImportersDependenciesMap, 'modifiedDependencies'>;
|
|
15
|
+
/**
|
|
16
|
+
* A map of dependency names to be removed from non-importer nodes.
|
|
17
|
+
* Keys are {@link DepID} of nodes that are not importers (e.g., nested folders).
|
|
18
|
+
* When these nodes are processed, their dependencies in this map are excluded.
|
|
19
|
+
*/
|
|
20
|
+
export type TransientRemoveMap = Omit<RemoveImportersDependenciesMap, 'modifiedDependencies'>;
|
|
4
21
|
export type BuildIdealAddOptions = {
|
|
5
22
|
/**
|
|
6
23
|
* A {@link AddImportersDependenciesMap} in which keys are {@link DepID}
|
|
@@ -32,4 +49,64 @@ export type BuildIdealPackageInfoOptions = {
|
|
|
32
49
|
*/
|
|
33
50
|
packageInfo: PackageInfoClient;
|
|
34
51
|
};
|
|
52
|
+
/**
|
|
53
|
+
* Represents an ongoing append operation for a node and its dependencies.
|
|
54
|
+
*/
|
|
55
|
+
export type AppendNodeEntry = {
|
|
56
|
+
node: Node;
|
|
57
|
+
deps: Dependency[];
|
|
58
|
+
modifierRefs?: Map<string, ModifierActiveEntry>;
|
|
59
|
+
depth: number;
|
|
60
|
+
peerContext: PeerContext;
|
|
61
|
+
updateContext: {
|
|
62
|
+
putEntries: () => {
|
|
63
|
+
dependent: Node;
|
|
64
|
+
spec: Spec;
|
|
65
|
+
type: DependencySaveType;
|
|
66
|
+
}[] | undefined;
|
|
67
|
+
resolvePeerDeps: () => void;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* The result of processing a given placed node in the graph.
|
|
72
|
+
*/
|
|
73
|
+
export type ProcessPlacementResultEntry = Omit<AppendNodeEntry, 'depth'>;
|
|
74
|
+
/**
|
|
75
|
+
* The result of processing placement for nodes to be added to the graph.
|
|
76
|
+
*/
|
|
77
|
+
export type ProcessPlacementResult = ProcessPlacementResultEntry[];
|
|
78
|
+
/**
|
|
79
|
+
* Entry in a peer context representing a resolved peer dependency.
|
|
80
|
+
*/
|
|
81
|
+
export type PeerContextEntry = {
|
|
82
|
+
/**
|
|
83
|
+
* True if this entry is currently being resolved and track by this
|
|
84
|
+
* peer context set, false in case this entry was inherit from a previous
|
|
85
|
+
* peer context set and should not be considered for resolution.
|
|
86
|
+
*/
|
|
87
|
+
active: boolean;
|
|
88
|
+
/** List of full Spec objects that are part of this peer context entry */
|
|
89
|
+
specs: Set<Spec>;
|
|
90
|
+
/** The target Node that satisfies all specs for this peer context entry */
|
|
91
|
+
target: Node | undefined;
|
|
92
|
+
/** The type of dependency this entry represents */
|
|
93
|
+
type: DependencySaveType;
|
|
94
|
+
/** Context dependent nodes that had dependencies resolved to this entry */
|
|
95
|
+
contextDependents: Set<Node>;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Input for adding an entry to peer contexts.
|
|
99
|
+
*/
|
|
100
|
+
export type PeerContextEntryInput = {
|
|
101
|
+
/** Node that depends on this resolved peer context set entry */
|
|
102
|
+
dependent?: Node;
|
|
103
|
+
/** Node this peer context entry resolves to */
|
|
104
|
+
target?: Node;
|
|
105
|
+
} & Dependency;
|
|
106
|
+
/**
|
|
107
|
+
* Represents resolved peer dependencies in a given append-nodes context.
|
|
108
|
+
*/
|
|
109
|
+
export type PeerContext = Map<string, PeerContextEntry> & {
|
|
110
|
+
index?: number;
|
|
111
|
+
};
|
|
35
112
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ideal/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EACV,2BAA2B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ideal/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EACV,2BAA2B,EAC3B,UAAU,EACV,8BAA8B,EAC/B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,2BAA2B,EAC3B,sBAAsB,CACvB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,8BAA8B,EAC9B,sBAAsB,CACvB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;;;OAKG;IACH,GAAG,EAAE,2BAA2B,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;;OAKG;IACH,MAAM,EAAE,8BAA8B,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC;;;OAGG;IACH,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC;;OAEG;IACH,WAAW,EAAE,iBAAiB,CAAA;CAC/B,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,UAAU,EAAE,CAAA;IAClB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,WAAW,CAAA;IACxB,aAAa,EAAE;QACb,UAAU,EAAE,MACR;YACE,SAAS,EAAE,IAAI,CAAA;YACf,IAAI,EAAE,IAAI,CAAA;YACV,IAAI,EAAE,kBAAkB,CAAA;SACzB,EAAE,GACH,SAAS,CAAA;QACb,eAAe,EAAE,MAAM,IAAI,CAAA;KAC5B,CAAA;CACF,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,eAAe,EACf,OAAO,CACR,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,2BAA2B,EAAE,CAAA;AAElE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAA;IACf,yEAAyE;IACzE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IAChB,2EAA2E;IAC3E,MAAM,EAAE,IAAI,GAAG,SAAS,CAAA;IACxB,mDAAmD;IACnD,IAAI,EAAE,kBAAkB,CAAA;IACxB,2EAA2E;IAC3E,iBAAiB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;CAC7B,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,gEAAgE;IAChE,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,IAAI,CAAA;CACd,GAAG,UAAU,CAAA;AAEd;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ideal/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\nimport type {\n AddImportersDependenciesMap,\n Dependency,\n RemoveImportersDependenciesMap,\n} from '../dependencies.ts'\nimport type { Graph } from '../graph.ts'\n\nexport type BuildIdealAddOptions = {\n /**\n * A {@link AddImportersDependenciesMap} in which keys are {@link DepID}\n * linking to another `Map` in which keys are the dependency names and values\n * are {@link Dependency}. This structure represents dependencies that need\n * to be added to the importer represented by {@link DepID}.\n */\n add: AddImportersDependenciesMap\n}\n\nexport type BuildIdealRemoveOptions = {\n /**\n * A {@link RemoveImportersDependenciesMap} object representing nodes to be\n * removed from the ideal graph. Each {@link DepID} key represents an\n * importer node and the `Set` of dependency names to be removed from its\n * dependency list.\n */\n remove: RemoveImportersDependenciesMap\n}\n\nexport type BuildIdealFromGraphOptions = {\n /**\n * An initial {@link Graph} to start building from, adding nodes to any\n * missing edges and appending any new specs defined in `addSpecs`.\n */\n graph: Graph\n}\n\nexport type BuildIdealPackageInfoOptions = {\n /**\n * A {@link PackageInfoClient} instance to read manifest info from.\n */\n packageInfo: PackageInfoClient\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ideal/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\nimport type { Spec } from '@vltpkg/spec'\nimport type { DependencySaveType } from '@vltpkg/types'\nimport type {\n AddImportersDependenciesMap,\n Dependency,\n RemoveImportersDependenciesMap,\n} from '../dependencies.ts'\nimport type { ModifierActiveEntry } from '../modifiers.ts'\nimport type { Graph } from '../graph.ts'\nimport type { Node } from '../node.ts'\n\n/**\n * A map of dependencies to be added to non-importer nodes.\n * Keys are {@link DepID} of nodes that are not importers (e.g., nested folders).\n * When these nodes are resolved and placed in the graph, their dependencies\n * from this map are injected into the processing queue.\n */\nexport type TransientAddMap = Omit<\n AddImportersDependenciesMap,\n 'modifiedDependencies'\n>\n\n/**\n * A map of dependency names to be removed from non-importer nodes.\n * Keys are {@link DepID} of nodes that are not importers (e.g., nested folders).\n * When these nodes are processed, their dependencies in this map are excluded.\n */\nexport type TransientRemoveMap = Omit<\n RemoveImportersDependenciesMap,\n 'modifiedDependencies'\n>\n\nexport type BuildIdealAddOptions = {\n /**\n * A {@link AddImportersDependenciesMap} in which keys are {@link DepID}\n * linking to another `Map` in which keys are the dependency names and values\n * are {@link Dependency}. This structure represents dependencies that need\n * to be added to the importer represented by {@link DepID}.\n */\n add: AddImportersDependenciesMap\n}\n\nexport type BuildIdealRemoveOptions = {\n /**\n * A {@link RemoveImportersDependenciesMap} object representing nodes to be\n * removed from the ideal graph. Each {@link DepID} key represents an\n * importer node and the `Set` of dependency names to be removed from its\n * dependency list.\n */\n remove: RemoveImportersDependenciesMap\n}\n\nexport type BuildIdealFromGraphOptions = {\n /**\n * An initial {@link Graph} to start building from, adding nodes to any\n * missing edges and appending any new specs defined in `addSpecs`.\n */\n graph: Graph\n}\n\nexport type BuildIdealPackageInfoOptions = {\n /**\n * A {@link PackageInfoClient} instance to read manifest info from.\n */\n packageInfo: PackageInfoClient\n}\n\n/**\n * Represents an ongoing append operation for a node and its dependencies.\n */\nexport type AppendNodeEntry = {\n node: Node\n deps: Dependency[]\n modifierRefs?: Map<string, ModifierActiveEntry>\n depth: number\n peerContext: PeerContext\n updateContext: {\n putEntries: () =>\n | {\n dependent: Node\n spec: Spec\n type: DependencySaveType\n }[]\n | undefined\n resolvePeerDeps: () => void\n }\n}\n\n/**\n * The result of processing a given placed node in the graph.\n */\nexport type ProcessPlacementResultEntry = Omit<\n AppendNodeEntry,\n 'depth'\n>\n\n/**\n * The result of processing placement for nodes to be added to the graph.\n */\nexport type ProcessPlacementResult = ProcessPlacementResultEntry[]\n\n/**\n * Entry in a peer context representing a resolved peer dependency.\n */\nexport type PeerContextEntry = {\n /**\n * True if this entry is currently being resolved and track by this\n * peer context set, false in case this entry was inherit from a previous\n * peer context set and should not be considered for resolution.\n */\n active: boolean\n /** List of full Spec objects that are part of this peer context entry */\n specs: Set<Spec>\n /** The target Node that satisfies all specs for this peer context entry */\n target: Node | undefined\n /** The type of dependency this entry represents */\n type: DependencySaveType\n /** Context dependent nodes that had dependencies resolved to this entry */\n contextDependents: Set<Node>\n}\n\n/**\n * Input for adding an entry to peer contexts.\n */\nexport type PeerContextEntryInput = {\n /** Node that depends on this resolved peer context set entry */\n dependent?: Node\n /** Node this peer context entry resolves to */\n target?: Node\n} & Dependency\n\n/**\n * Represents resolved peer dependencies in a given append-nodes context.\n */\nexport type PeerContext = Map<string, PeerContextEntry> & {\n index?: number\n}\n"]}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
+
export * from './build.ts';
|
|
1
2
|
export * from './edge.ts';
|
|
2
3
|
export * from './graph.ts';
|
|
3
4
|
export * from './node.ts';
|
|
4
5
|
export * from './dependencies.ts';
|
|
6
|
+
export * from './fixup-added-names.ts';
|
|
5
7
|
export * from './lockfile/types.ts';
|
|
6
8
|
export * from './visualization/json-output.ts';
|
|
7
9
|
export * from './visualization/human-readable-output.ts';
|
|
8
10
|
export * from './visualization/mermaid-output.ts';
|
|
9
11
|
export * from './stringify-node.ts';
|
|
10
|
-
export * from './types.ts';
|
|
11
12
|
export * from './install.ts';
|
|
12
13
|
export * from './uninstall.ts';
|
|
14
|
+
export * from './update.ts';
|
|
13
15
|
export * from './diff.ts';
|
|
16
|
+
export * from './modifiers.ts';
|
|
17
|
+
export * from './virtual-root.ts';
|
|
14
18
|
import type { LoadOptions as ActualLoadOptions } from './actual/load.ts';
|
|
15
19
|
export declare const actual: {
|
|
16
20
|
load: (options: ActualLoadOptions) => import("./graph.ts").Graph;
|
|
@@ -18,9 +22,9 @@ export declare const actual: {
|
|
|
18
22
|
import type { LoadOptions as LockfileLoadOptions } from './lockfile/load.ts';
|
|
19
23
|
export declare const lockfile: {
|
|
20
24
|
load: (options: LockfileLoadOptions) => import("./graph.ts").Graph;
|
|
21
|
-
loadEdges: (graph: import("
|
|
22
|
-
loadNodes: (graph: import("
|
|
23
|
-
save: (options: import("./lockfile/save.ts").SaveOptions) => void;
|
|
25
|
+
loadEdges: (graph: import("@vltpkg/types").GraphLike, edges: import("./lockfile/types.ts").LockfileData["edges"], options: import("@vltpkg/spec").SpecOptions) => void;
|
|
26
|
+
loadNodes: (graph: import("@vltpkg/types").GraphLike, nodes: import("./lockfile/types.ts").LockfileData["nodes"], options: import("@vltpkg/spec").SpecOptions, actual?: import("@vltpkg/types").GraphLike, throwOnMissingManifest?: boolean) => void;
|
|
27
|
+
save: (options: Omit<import("./lockfile/save.ts").SaveOptions, "saveManifests">) => void;
|
|
24
28
|
};
|
|
25
29
|
export type { ActualLoadOptions, LockfileLoadOptions };
|
|
26
30
|
export type { SaveOptions } from './lockfile/save.ts';
|
|
@@ -31,4 +35,5 @@ export declare const ideal: {
|
|
|
31
35
|
};
|
|
32
36
|
export { reify } from './reify/index.ts';
|
|
33
37
|
export type { ReifyOptions } from './reify/index.ts';
|
|
38
|
+
export type { BuildResult } from './reify/build.ts';
|
|
34
39
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0CAA0C,CAAA;AACxD,cAAc,mCAAmC,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0CAA0C,CAAA;AACxD,cAAc,mCAAmC,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AAGjC,OAAO,KAAK,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACxE,eAAO,MAAM,MAAM;;CAAuB,CAAA;AAG1C,OAAO,KAAK,EAAE,WAAW,IAAI,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAI5E,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAA;AAED,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACzD,YAAY,EAAE,iBAAiB,EAAE,CAAA;AACjC,eAAO,MAAM,KAAK;;CAAY,CAAA;AAE9B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
+
export * from "./build.js";
|
|
1
2
|
export * from "./edge.js";
|
|
2
3
|
export * from "./graph.js";
|
|
3
4
|
export * from "./node.js";
|
|
4
5
|
export * from "./dependencies.js";
|
|
6
|
+
export * from "./fixup-added-names.js";
|
|
5
7
|
export * from "./lockfile/types.js";
|
|
6
8
|
export * from "./visualization/json-output.js";
|
|
7
9
|
export * from "./visualization/human-readable-output.js";
|
|
8
10
|
export * from "./visualization/mermaid-output.js";
|
|
9
11
|
export * from "./stringify-node.js";
|
|
10
|
-
export * from "./types.js";
|
|
11
12
|
export * from "./install.js";
|
|
12
13
|
export * from "./uninstall.js";
|
|
14
|
+
export * from "./update.js";
|
|
13
15
|
export * from "./diff.js";
|
|
16
|
+
export * from "./modifiers.js";
|
|
17
|
+
export * from "./virtual-root.js";
|
|
14
18
|
import { load as actualLoad } from "./actual/load.js";
|
|
15
19
|
export const actual = { load: actualLoad };
|
|
16
20
|
import { load as lockfileLoad } from "./lockfile/load.js";
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0CAA0C,CAAA;AACxD,cAAc,mCAAmC,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0CAA0C,CAAA;AACxD,cAAc,mCAAmC,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AAEjC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAErD,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAE1C,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,YAAY;IAClB,SAAS;IACT,SAAS;IACT,IAAI;CACL,CAAA;AAKD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGxC,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAA;AAE9B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA","sourcesContent":["export * from './build.ts'\nexport * from './edge.ts'\nexport * from './graph.ts'\nexport * from './node.ts'\nexport * from './dependencies.ts'\nexport * from './fixup-added-names.ts'\nexport * from './lockfile/types.ts'\nexport * from './visualization/json-output.ts'\nexport * from './visualization/human-readable-output.ts'\nexport * from './visualization/mermaid-output.ts'\nexport * from './stringify-node.ts'\nexport * from './install.ts'\nexport * from './uninstall.ts'\nexport * from './update.ts'\nexport * from './diff.ts'\nexport * from './modifiers.ts'\nexport * from './virtual-root.ts'\n\nimport { load as actualLoad } from './actual/load.ts'\nimport type { LoadOptions as ActualLoadOptions } from './actual/load.ts'\nexport const actual = { load: actualLoad }\n\nimport { load as lockfileLoad } from './lockfile/load.ts'\nimport type { LoadOptions as LockfileLoadOptions } from './lockfile/load.ts'\nimport { loadEdges } from './lockfile/load-edges.ts'\nimport { loadNodes } from './lockfile/load-nodes.ts'\nimport { save } from './lockfile/save.ts'\nexport const lockfile = {\n load: lockfileLoad,\n loadEdges,\n loadNodes,\n save,\n}\n\nexport type { ActualLoadOptions, LockfileLoadOptions }\nexport type { SaveOptions } from './lockfile/save.ts'\n\nimport { build } from './ideal/build.ts'\nimport type { BuildIdealOptions } from './ideal/build.ts'\nexport type { BuildIdealOptions }\nexport const ideal = { build }\n\nexport { reify } from './reify/index.ts'\nexport type { ReifyOptions } from './reify/index.ts'\nexport type { BuildResult } from './reify/build.ts'\n"]}
|
package/dist/esm/install.d.ts
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import type { PackageInfoClient } from '@vltpkg/package-info';
|
|
2
|
-
import type { PackageJson } from '@vltpkg/package-json';
|
|
3
2
|
import type { LoadOptions } from './actual/load.ts';
|
|
4
3
|
import type { AddImportersDependenciesMap } from './dependencies.ts';
|
|
4
|
+
import type { DepID } from '@vltpkg/dep-id';
|
|
5
|
+
import type { Graph } from './index.ts';
|
|
5
6
|
export type InstallOptions = LoadOptions & {
|
|
6
|
-
projectRoot: string;
|
|
7
|
-
packageJson: PackageJson;
|
|
8
7
|
packageInfo: PackageInfoClient;
|
|
8
|
+
cleanInstall?: boolean;
|
|
9
|
+
allowScripts: string;
|
|
9
10
|
};
|
|
10
11
|
export declare const install: (options: InstallOptions, add?: AddImportersDependenciesMap) => Promise<{
|
|
11
|
-
graph:
|
|
12
|
+
graph: Graph;
|
|
13
|
+
diff: undefined;
|
|
14
|
+
buildQueue?: undefined;
|
|
15
|
+
} | {
|
|
16
|
+
buildQueue: DepID[] | undefined;
|
|
17
|
+
graph: Graph;
|
|
12
18
|
diff: import("./diff.ts").Diff;
|
|
13
19
|
}>;
|
|
14
20
|
//# sourceMappingURL=install.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/install.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,KAAK,EACV,2BAA2B,EAG5B,MAAM,mBAAmB,CAAA;AAE1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAM3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGvC,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,WAAW,EAAE,iBAAiB,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,OAAO,YACT,cAAc,QACjB,2BAA2B;;;;;;;;EAmOlC,CAAA"}
|
package/dist/esm/install.js
CHANGED
|
@@ -1,26 +1,197 @@
|
|
|
1
1
|
import { load as actualLoad } from "./actual/load.js";
|
|
2
2
|
import { build as idealBuild } from "./ideal/build.js";
|
|
3
3
|
import { reify } from "./reify/index.js";
|
|
4
|
+
import { GraphModifier } from "./modifiers.js";
|
|
5
|
+
import { init } from '@vltpkg/init';
|
|
6
|
+
import { error } from '@vltpkg/error-cause';
|
|
7
|
+
import { asError } from '@vltpkg/types';
|
|
8
|
+
import { getDependencies } from "./dependencies.js";
|
|
9
|
+
import { RollbackRemove } from '@vltpkg/rollback-remove';
|
|
10
|
+
import { existsSync, rmSync } from 'node:fs';
|
|
11
|
+
import { resolve } from 'node:path';
|
|
12
|
+
import { load as loadVirtual } from "./lockfile/load.js";
|
|
13
|
+
import { getImporterSpecs } from "./ideal/get-importer-specs.js";
|
|
14
|
+
import { lockfile } from "./index.js";
|
|
15
|
+
import { updatePackageJson } from "./reify/update-importers-package-json.js";
|
|
4
16
|
export const install = async (options, add) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
// Validate incompatible options
|
|
18
|
+
if (options.lockfileOnly && options.cleanInstall) {
|
|
19
|
+
throw error('Cannot use --lockfile-only with --clean-install (ci command). Clean install requires filesystem operations.');
|
|
20
|
+
}
|
|
21
|
+
if (options.expectLockfile || options.frozenLockfile) {
|
|
22
|
+
const lockfilePath = resolve(options.projectRoot, 'vlt-lock.json');
|
|
23
|
+
if (!existsSync(lockfilePath)) {
|
|
24
|
+
throw error('vlt-lock.json file is required when using --expect-lockfile, --frozen-lockfile, or ci command', {
|
|
25
|
+
path: lockfilePath,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
let mainManifest = undefined;
|
|
30
|
+
try {
|
|
31
|
+
mainManifest = options.packageJson.read(options.projectRoot);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
if (asError(err).message === 'Could not read package.json file') {
|
|
35
|
+
await init({ cwd: options.projectRoot });
|
|
36
|
+
mainManifest = options.packageJson.read(options.projectRoot, {
|
|
37
|
+
reload: true,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (options.frozenLockfile) {
|
|
45
|
+
// validates no add/remove operations are requested
|
|
46
|
+
if (add?.modifiedDependencies) {
|
|
47
|
+
const dependencies = [];
|
|
48
|
+
for (const [, deps] of add) {
|
|
49
|
+
for (const [name] of deps) {
|
|
50
|
+
dependencies.push(name);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw error('Cannot add dependencies when using --frozen-lockfile', { found: dependencies.join(', ') });
|
|
54
|
+
}
|
|
55
|
+
const lockfileGraph = loadVirtual({
|
|
56
|
+
...options,
|
|
57
|
+
mainManifest,
|
|
58
|
+
});
|
|
59
|
+
const emptyAdd = Object.assign(new Map(), { modifiedDependencies: false });
|
|
60
|
+
const emptyRemove = Object.assign(new Map(), {
|
|
61
|
+
modifiedDependencies: false,
|
|
62
|
+
});
|
|
63
|
+
const importerSpecs = getImporterSpecs({
|
|
64
|
+
graph: lockfileGraph,
|
|
65
|
+
add: emptyAdd,
|
|
66
|
+
remove: emptyRemove,
|
|
67
|
+
...options,
|
|
68
|
+
});
|
|
69
|
+
// Check for spec changes by comparing package.json specs with lockfile edges
|
|
70
|
+
const specChanges = [];
|
|
71
|
+
for (const importer of lockfileGraph.importers) {
|
|
72
|
+
const deps = getDependencies(importer, options);
|
|
73
|
+
for (const [depName, dep] of deps) {
|
|
74
|
+
const edge = importer.edgesOut.get(depName);
|
|
75
|
+
if (edge?.spec) {
|
|
76
|
+
if (edge.spec.toString() !== dep.spec.toString()) {
|
|
77
|
+
const node = lockfileGraph.nodes.get(importer.id);
|
|
78
|
+
/* c8 ignore next */
|
|
79
|
+
const location = node?.location || importer.id;
|
|
80
|
+
specChanges.push(` ${location}: ${depName} spec changed from "${edge.spec}" to "${dep.spec}"`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (importerSpecs.add.modifiedDependencies ||
|
|
86
|
+
importerSpecs.remove.modifiedDependencies ||
|
|
87
|
+
specChanges.length > 0) {
|
|
88
|
+
const details = [];
|
|
89
|
+
if (specChanges.length > 0) {
|
|
90
|
+
details.push(...specChanges);
|
|
91
|
+
}
|
|
92
|
+
for (const [importerId, deps] of importerSpecs.add) {
|
|
93
|
+
if (deps.size > 0) {
|
|
94
|
+
const node = lockfileGraph.nodes.get(importerId);
|
|
95
|
+
const location = node?.location || importerId;
|
|
96
|
+
const depNames = Array.from(deps.keys());
|
|
97
|
+
const depLabelAdd = deps.size === 1 ? 'dependency' : 'dependencies';
|
|
98
|
+
details.push(` ${location}: ${deps.size} ${depLabelAdd} to add (${depNames.join(', ')})`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const [importerId, deps] of importerSpecs.remove) {
|
|
102
|
+
if (deps.size > 0) {
|
|
103
|
+
const node = lockfileGraph.nodes.get(importerId);
|
|
104
|
+
const location = node?.location || importerId;
|
|
105
|
+
const depNames = Array.from(deps);
|
|
106
|
+
const depLabelRemove = deps.size === 1 ?
|
|
107
|
+
'dependency'
|
|
108
|
+
: /* c8 ignore next */ 'dependencies';
|
|
109
|
+
details.push(` ${location}: ${deps.size} ${depLabelRemove} to remove (${depNames.join(', ')})`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const lockfilePath = resolve(options.projectRoot, 'vlt-lock.json');
|
|
113
|
+
throw error('Lockfile is out of sync with package.json. Run "vlt install" to update.\n' +
|
|
114
|
+
details.join('\n'), {
|
|
115
|
+
path: lockfilePath,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const remover = new RollbackRemove();
|
|
120
|
+
if (options.cleanInstall) {
|
|
121
|
+
const nodeModulesPath = resolve(options.projectRoot, 'node_modules');
|
|
122
|
+
if (existsSync(nodeModulesPath)) {
|
|
123
|
+
await remover.rm(nodeModulesPath);
|
|
124
|
+
remover.confirm();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const remove = Object.assign(new Map(), {
|
|
129
|
+
modifiedDependencies: false,
|
|
130
|
+
});
|
|
131
|
+
const modifiers = GraphModifier.maybeLoad(options);
|
|
132
|
+
let act = actualLoad({
|
|
133
|
+
...options,
|
|
134
|
+
mainManifest,
|
|
135
|
+
loadManifests: true,
|
|
136
|
+
modifiers: undefined, // modifiers should not be used here
|
|
137
|
+
});
|
|
138
|
+
// if the actual graph has no dependencies, it's simpler to ignore it
|
|
139
|
+
// this allows us to check for its availability later on for properly
|
|
140
|
+
// handling situations like resetting edges for refreshing the ideal graph
|
|
141
|
+
if (act.importers.size === act.nodes.size) {
|
|
142
|
+
act = undefined;
|
|
143
|
+
}
|
|
144
|
+
const graph = await idealBuild({
|
|
145
|
+
...options,
|
|
146
|
+
actual: act,
|
|
147
|
+
add,
|
|
148
|
+
mainManifest,
|
|
149
|
+
loadManifests: true,
|
|
150
|
+
modifiers,
|
|
151
|
+
remove,
|
|
152
|
+
remover,
|
|
153
|
+
});
|
|
154
|
+
// If lockfileOnly is enabled, skip reify and only save the lockfile
|
|
155
|
+
if (options.lockfileOnly) {
|
|
156
|
+
// Save only the main lockfile, skip all filesystem operations
|
|
157
|
+
lockfile.save({ graph, modifiers });
|
|
158
|
+
const saveImportersPackageJson =
|
|
159
|
+
/* c8 ignore next */
|
|
160
|
+
add?.modifiedDependencies || remove.modifiedDependencies ?
|
|
161
|
+
updatePackageJson({
|
|
162
|
+
...options,
|
|
163
|
+
add,
|
|
164
|
+
graph,
|
|
165
|
+
remove,
|
|
166
|
+
})
|
|
167
|
+
: undefined;
|
|
168
|
+
saveImportersPackageJson?.();
|
|
169
|
+
return { graph, diff: undefined };
|
|
170
|
+
}
|
|
171
|
+
const { diff, buildQueue } = await reify({
|
|
172
|
+
...options,
|
|
173
|
+
add,
|
|
174
|
+
actual: act,
|
|
175
|
+
graph,
|
|
176
|
+
loadManifests: true,
|
|
177
|
+
modifiers,
|
|
178
|
+
remove,
|
|
179
|
+
remover,
|
|
180
|
+
});
|
|
181
|
+
return { buildQueue, graph, diff };
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
/* c8 ignore next */
|
|
185
|
+
await remover.rollback().catch(() => { });
|
|
186
|
+
// Remove hidden lockfile on failure
|
|
187
|
+
try {
|
|
188
|
+
const hiddenLockfile = resolve(options.projectRoot, 'node_modules/.vlt-lock.json');
|
|
189
|
+
if (existsSync(hiddenLockfile)) {
|
|
190
|
+
rmSync(hiddenLockfile, { force: true });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch { }
|
|
194
|
+
throw err;
|
|
195
|
+
}
|
|
25
196
|
};
|
|
26
197
|
//# sourceMappingURL=install.js.map
|
package/dist/esm/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/install.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAQxC,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,OAAuB,EACvB,GAAiC,EACjC,EAAE;IACF,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAElE,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC;QAC7B,GAAG,OAAO;QACV,GAAG;QACH,YAAY;QACZ,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,UAAU,CAAC;QACrB,GAAG,OAAO;QACV,YAAY;QACZ,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;QACvB,GAAG,OAAO;QACV,GAAG;QACH,MAAM,EAAE,GAAG;QACX,KAAK;QACL,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IAEF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC,CAAA","sourcesContent":["import type { PackageInfoClient } from '@vltpkg/package-info'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport type { LoadOptions } from './actual/load.ts'\nimport { load as actualLoad } from './actual/load.ts'\nimport type { AddImportersDependenciesMap } from './dependencies.ts'\nimport { build as idealBuild } from './ideal/build.ts'\nimport { reify } from './reify/index.ts'\n\nexport type InstallOptions = LoadOptions & {\n projectRoot: string\n packageJson: PackageJson\n packageInfo: PackageInfoClient\n}\n\nexport const install = async (\n options: InstallOptions,\n add?: AddImportersDependenciesMap,\n) => {\n const mainManifest = options.packageJson.read(options.projectRoot)\n\n const graph = await idealBuild({\n ...options,\n add,\n mainManifest,\n loadManifests: true,\n })\n const act = actualLoad({\n ...options,\n mainManifest,\n loadManifests: true,\n })\n const diff = await reify({\n ...options,\n add,\n actual: act,\n graph,\n loadManifests: true,\n })\n\n return { graph, diff }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/install.ts"],"names":[],"mappings":"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","sourcesContent":["import { load as actualLoad } from './actual/load.ts'\nimport { build as idealBuild } from './ideal/build.ts'\nimport { reify } from './reify/index.ts'\nimport { GraphModifier } from './modifiers.ts'\nimport { init } from '@vltpkg/init'\nimport { error } from '@vltpkg/error-cause'\nimport type { NormalizedManifest } from '@vltpkg/types'\nimport { asError } from '@vltpkg/types'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\nimport type { LoadOptions } from './actual/load.ts'\nimport { getDependencies } from './dependencies.ts'\nimport type {\n AddImportersDependenciesMap,\n Dependency,\n RemoveImportersDependenciesMap,\n} from './dependencies.ts'\nimport { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { DepID } from '@vltpkg/dep-id'\nimport { existsSync, rmSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { load as loadVirtual } from './lockfile/load.ts'\nimport { getImporterSpecs } from './ideal/get-importer-specs.ts'\nimport { lockfile } from './index.ts'\nimport type { Graph } from './index.ts'\nimport { updatePackageJson } from './reify/update-importers-package-json.ts'\n\nexport type InstallOptions = LoadOptions & {\n packageInfo: PackageInfoClient\n cleanInstall?: boolean // Only set by ci command for clean install\n allowScripts: string\n}\n\nexport const install = async (\n options: InstallOptions,\n add?: AddImportersDependenciesMap,\n) => {\n // Validate incompatible options\n if (options.lockfileOnly && options.cleanInstall) {\n throw error(\n 'Cannot use --lockfile-only with --clean-install (ci command). Clean install requires filesystem operations.',\n )\n }\n\n if (options.expectLockfile || options.frozenLockfile) {\n const lockfilePath = resolve(options.projectRoot, 'vlt-lock.json')\n if (!existsSync(lockfilePath)) {\n throw error(\n 'vlt-lock.json file is required when using --expect-lockfile, --frozen-lockfile, or ci command',\n {\n path: lockfilePath,\n },\n )\n }\n }\n\n let mainManifest: NormalizedManifest | undefined = undefined\n try {\n mainManifest = options.packageJson.read(options.projectRoot)\n } catch (err) {\n if (asError(err).message === 'Could not read package.json file') {\n await init({ cwd: options.projectRoot })\n mainManifest = options.packageJson.read(options.projectRoot, {\n reload: true,\n })\n } else {\n throw err\n }\n }\n\n if (options.frozenLockfile) {\n // validates no add/remove operations are requested\n if (add?.modifiedDependencies) {\n const dependencies: string[] = []\n for (const [, deps] of add) {\n for (const [name] of deps) {\n dependencies.push(name)\n }\n }\n throw error(\n 'Cannot add dependencies when using --frozen-lockfile',\n { found: dependencies.join(', ') },\n )\n }\n\n const lockfileGraph = loadVirtual({\n ...options,\n mainManifest,\n })\n\n const emptyAdd = Object.assign(\n new Map<DepID, Map<string, Dependency>>(),\n { modifiedDependencies: false },\n )\n const emptyRemove = Object.assign(new Map<DepID, Set<string>>(), {\n modifiedDependencies: false,\n })\n const importerSpecs = getImporterSpecs({\n graph: lockfileGraph,\n add: emptyAdd,\n remove: emptyRemove,\n ...options,\n })\n\n // Check for spec changes by comparing package.json specs with lockfile edges\n const specChanges: string[] = []\n for (const importer of lockfileGraph.importers) {\n const deps = getDependencies(importer, options)\n for (const [depName, dep] of deps) {\n const edge = importer.edgesOut.get(depName)\n if (edge?.spec) {\n if (edge.spec.toString() !== dep.spec.toString()) {\n const node = lockfileGraph.nodes.get(importer.id)\n /* c8 ignore next */\n const location = node?.location || importer.id\n specChanges.push(\n ` ${location}: ${depName} spec changed from \"${edge.spec}\" to \"${dep.spec}\"`,\n )\n }\n }\n }\n }\n\n if (\n importerSpecs.add.modifiedDependencies ||\n importerSpecs.remove.modifiedDependencies ||\n specChanges.length > 0\n ) {\n const details: string[] = []\n\n if (specChanges.length > 0) {\n details.push(...specChanges)\n }\n\n for (const [importerId, deps] of importerSpecs.add) {\n if (deps.size > 0) {\n const node = lockfileGraph.nodes.get(importerId)\n const location = node?.location || importerId\n const depNames = Array.from(deps.keys())\n const depLabelAdd =\n deps.size === 1 ? 'dependency' : 'dependencies'\n details.push(\n ` ${location}: ${deps.size} ${depLabelAdd} to add (${depNames.join(', ')})`,\n )\n }\n }\n\n for (const [importerId, deps] of importerSpecs.remove) {\n if (deps.size > 0) {\n const node = lockfileGraph.nodes.get(importerId)\n const location = node?.location || importerId\n const depNames = Array.from(deps)\n const depLabelRemove =\n deps.size === 1 ?\n 'dependency'\n : /* c8 ignore next */ 'dependencies'\n details.push(\n ` ${location}: ${deps.size} ${depLabelRemove} to remove (${depNames.join(', ')})`,\n )\n }\n }\n\n const lockfilePath = resolve(\n options.projectRoot,\n 'vlt-lock.json',\n )\n throw error(\n 'Lockfile is out of sync with package.json. Run \"vlt install\" to update.\\n' +\n details.join('\\n'),\n {\n path: lockfilePath,\n },\n )\n }\n }\n\n const remover = new RollbackRemove()\n if (options.cleanInstall) {\n const nodeModulesPath = resolve(\n options.projectRoot,\n 'node_modules',\n )\n if (existsSync(nodeModulesPath)) {\n await remover.rm(nodeModulesPath)\n remover.confirm()\n }\n }\n\n try {\n const remove = Object.assign(new Map<DepID, Set<string>>(), {\n modifiedDependencies: false,\n }) as RemoveImportersDependenciesMap\n const modifiers = GraphModifier.maybeLoad(options)\n\n let act: Graph | undefined = actualLoad({\n ...options,\n mainManifest,\n loadManifests: true,\n modifiers: undefined, // modifiers should not be used here\n })\n // if the actual graph has no dependencies, it's simpler to ignore it\n // this allows us to check for its availability later on for properly\n // handling situations like resetting edges for refreshing the ideal graph\n if (act.importers.size === act.nodes.size) {\n act = undefined\n }\n const graph = await idealBuild({\n ...options,\n actual: act,\n add,\n mainManifest,\n loadManifests: true,\n modifiers,\n remove,\n remover,\n })\n\n // If lockfileOnly is enabled, skip reify and only save the lockfile\n if (options.lockfileOnly) {\n // Save only the main lockfile, skip all filesystem operations\n lockfile.save({ graph, modifiers })\n const saveImportersPackageJson =\n /* c8 ignore next */\n add?.modifiedDependencies || remove.modifiedDependencies ?\n updatePackageJson({\n ...options,\n add,\n graph,\n remove,\n })\n : undefined\n saveImportersPackageJson?.()\n return { graph, diff: undefined }\n }\n\n const { diff, buildQueue } = await reify({\n ...options,\n add,\n actual: act,\n graph,\n loadManifests: true,\n modifiers,\n remove,\n remover,\n })\n\n return { buildQueue, graph, diff }\n } catch (err) {\n /* c8 ignore next */\n await remover.rollback().catch(() => {})\n // Remove hidden lockfile on failure\n try {\n const hiddenLockfile = resolve(\n options.projectRoot,\n 'node_modules/.vlt-lock.json',\n )\n if (existsSync(hiddenLockfile)) {\n rmSync(hiddenLockfile, { force: true })\n }\n } catch {}\n throw err\n }\n}\n"]}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
import { Spec } from '@vltpkg/spec/browser';
|
|
1
2
|
import type { SpecOptions } from '@vltpkg/spec/browser';
|
|
2
|
-
import type { GraphLike } from '
|
|
3
|
+
import type { DependencyTypeShort, GraphLike, NodeLike } from '@vltpkg/types';
|
|
3
4
|
import type { LockfileData } from './types.ts';
|
|
5
|
+
export type ProcessingEdge = {
|
|
6
|
+
fromNode: NodeLike;
|
|
7
|
+
toNode: NodeLike | undefined;
|
|
8
|
+
depType: DependencyTypeShort;
|
|
9
|
+
spec: Spec;
|
|
10
|
+
};
|
|
4
11
|
export declare const loadEdges: (graph: GraphLike, edges: LockfileData["edges"], options: SpecOptions) => void;
|
|
5
12
|
//# sourceMappingURL=load-edges.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-edges.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load-edges.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"load-edges.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load-edges.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EACT,QAAQ,EACT,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC5B,OAAO,EAAE,mBAAmB,CAAA;IAC5B,IAAI,EAAE,IAAI,CAAA;CACX,CAAA;AA0BD,eAAO,MAAM,SAAS,UACb,SAAS,SACT,YAAY,CAAC,OAAO,CAAC,WACnB,WAAW,SAuGrB,CAAA"}
|
|
@@ -4,8 +4,31 @@ import { fastSplit } from '@vltpkg/fast-split';
|
|
|
4
4
|
import { Spec } from '@vltpkg/spec/browser';
|
|
5
5
|
import { longDependencyTypes } from '@vltpkg/types';
|
|
6
6
|
import { isDependencyTypeShort } from "../dependencies.js";
|
|
7
|
+
const retrieveNodeFromGraph = (key, value, graph, fromId, seenNodes) => {
|
|
8
|
+
const foundNode = graph.nodes.get(asDepID(fromId));
|
|
9
|
+
if (!foundNode) {
|
|
10
|
+
throw error('Edge info missing its `from` node', {
|
|
11
|
+
found: {
|
|
12
|
+
nodes: [...graph.nodes].map(([id]) => id),
|
|
13
|
+
from: foundNode,
|
|
14
|
+
fromId,
|
|
15
|
+
edge: { [key]: value },
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
if (seenNodes) {
|
|
20
|
+
seenNodes.set(fromId, foundNode);
|
|
21
|
+
}
|
|
22
|
+
return foundNode;
|
|
23
|
+
};
|
|
7
24
|
export const loadEdges = (graph, edges, options) => {
|
|
8
25
|
const entries = Object.entries(edges);
|
|
26
|
+
const edgeCount = entries.length;
|
|
27
|
+
// Only use optimizations for non-trivial graphs
|
|
28
|
+
const useOptimizations = edgeCount > 50;
|
|
29
|
+
const edgeProcessingQueue = [];
|
|
30
|
+
// Cache for frequently accessed nodes to avoid repeated Map lookups
|
|
31
|
+
const seenNodes = useOptimizations ? new Map() : undefined;
|
|
9
32
|
for (const [key, value] of entries) {
|
|
10
33
|
const [fromId, specName] = fastSplit(key, ' ', 2);
|
|
11
34
|
const [depType, valRest] = fastSplit(value, ' ', 2);
|
|
@@ -16,26 +39,68 @@ export const loadEdges = (graph, edges, options) => {
|
|
|
16
39
|
continue;
|
|
17
40
|
}
|
|
18
41
|
/* c8 ignore stop */
|
|
19
|
-
|
|
20
|
-
const toId = valRest.substring(vrSplit + 1);
|
|
21
|
-
const from = graph.nodes.get(asDepID(fromId));
|
|
22
|
-
if (!from) {
|
|
23
|
-
throw error('Edge info missing its `from` node', {
|
|
24
|
-
found: {
|
|
25
|
-
nodes: [...graph.nodes].map(([id]) => id),
|
|
26
|
-
from,
|
|
27
|
-
fromId,
|
|
28
|
-
edge: { [key]: value },
|
|
29
|
-
},
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
const to = toId === 'MISSING' ? undefined : graph.nodes.get(asDepID(toId));
|
|
42
|
+
// Validate dependency type early
|
|
33
43
|
if (!isDependencyTypeShort(depType)) {
|
|
34
44
|
throw error('Found unsupported dependency type in lockfile', {
|
|
35
45
|
validOptions: [...longDependencyTypes],
|
|
36
46
|
});
|
|
37
47
|
}
|
|
38
|
-
|
|
48
|
+
// Use cached node lookup for large graphs, direct lookup for small ones
|
|
49
|
+
let fromNode;
|
|
50
|
+
if (seenNodes) {
|
|
51
|
+
const seen = seenNodes.get(fromId);
|
|
52
|
+
if (seen) {
|
|
53
|
+
fromNode = seen;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
fromNode = retrieveNodeFromGraph(key, value, graph, fromId, seenNodes);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
fromNode = retrieveNodeFromGraph(key, value, graph, fromId);
|
|
61
|
+
}
|
|
62
|
+
const toId = valRest.substring(vrSplit + 1);
|
|
63
|
+
let toNode = undefined;
|
|
64
|
+
if (toId !== 'MISSING') {
|
|
65
|
+
if (seenNodes) {
|
|
66
|
+
const seen = seenNodes.get(toId);
|
|
67
|
+
if (seen) {
|
|
68
|
+
toNode = seen;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
toNode = graph.nodes.get(asDepID(toId));
|
|
72
|
+
if (toNode) {
|
|
73
|
+
seenNodes.set(toId, toNode);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
toNode = graph.nodes.get(asDepID(toId));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Parse spec once we know the nodes are valid
|
|
82
|
+
const spec = Spec.parse(specName, valRest.substring(0, vrSplit), {
|
|
83
|
+
...options,
|
|
84
|
+
registry: fromNode.registry,
|
|
85
|
+
});
|
|
86
|
+
if (useOptimizations) {
|
|
87
|
+
edgeProcessingQueue.push({
|
|
88
|
+
fromNode,
|
|
89
|
+
toNode,
|
|
90
|
+
depType,
|
|
91
|
+
spec,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Process immediately for small graphs
|
|
96
|
+
graph.addEdge(depType, spec, fromNode, toNode);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Batch process all edges (only for non-trivial graphs)
|
|
100
|
+
if (useOptimizations) {
|
|
101
|
+
for (const { fromNode, toNode, depType, spec, } of edgeProcessingQueue) {
|
|
102
|
+
graph.addEdge(depType, spec, fromNode, toNode);
|
|
103
|
+
}
|
|
39
104
|
}
|
|
40
105
|
};
|
|
41
106
|
//# sourceMappingURL=load-edges.js.map
|