@vltpkg/graph 0.0.0-9 → 1.0.0-rc.2
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 +130 -73
- 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 +67 -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 +7 -2
- package/dist/esm/edge.d.ts.map +1 -1
- package/dist/esm/edge.js +8 -0
- package/dist/esm/edge.js.map +1 -1
- package/dist/esm/graph.d.ts +20 -10
- package/dist/esm/graph.d.ts.map +1 -1
- package/dist/esm/graph.js +124 -21
- package/dist/esm/graph.js.map +1 -1
- package/dist/esm/ideal/add-nodes.d.ts +17 -2
- package/dist/esm/ideal/add-nodes.d.ts.map +1 -1
- package/dist/esm/ideal/add-nodes.js +9 -2
- package/dist/esm/ideal/add-nodes.js.map +1 -1
- package/dist/esm/ideal/append-nodes.d.ts +11 -1
- package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
- package/dist/esm/ideal/append-nodes.js +177 -31
- package/dist/esm/ideal/append-nodes.js.map +1 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.js +9 -5
- 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 +4 -1
- package/dist/esm/ideal/build.js.map +1 -1
- package/dist/esm/ideal/get-importer-specs.d.ts +3 -2
- package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
- package/dist/esm/ideal/get-importer-specs.js +7 -5
- package/dist/esm/ideal/get-importer-specs.js.map +1 -1
- package/dist/esm/index.d.ts +8 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +4 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/install.d.ts +8 -3
- package/dist/esm/install.d.ts.map +1 -1
- package/dist/esm/install.js +167 -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 +79 -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 +77 -12
- package/dist/esm/lockfile/load-nodes.js.map +1 -1
- package/dist/esm/lockfile/load.d.ts +22 -5
- package/dist/esm/lockfile/load.d.ts.map +1 -1
- package/dist/esm/lockfile/load.js +55 -22
- 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 +61 -16
- 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 +77 -6
- package/dist/esm/node.d.ts.map +1 -1
- package/dist/esm/node.js +98 -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 +2 -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 +76 -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 +84 -14
- 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.map +1 -1
- package/dist/esm/reify/update-importers-package-json.js +15 -9
- 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.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 +51 -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 +63 -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 +41 -18
- package/dist/esm/visualization/human-readable-output.js.map +1 -1
- package/dist/esm/visualization/json-output.d.ts +7 -3
- 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 +64 -9
- 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 +30 -24
- 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
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './build.ts';
|
|
1
2
|
export * from './edge.ts';
|
|
2
3
|
export * from './graph.ts';
|
|
3
4
|
export * from './node.ts';
|
|
@@ -7,10 +8,12 @@ export * from './visualization/json-output.ts';
|
|
|
7
8
|
export * from './visualization/human-readable-output.ts';
|
|
8
9
|
export * from './visualization/mermaid-output.ts';
|
|
9
10
|
export * from './stringify-node.ts';
|
|
10
|
-
export * from './types.ts';
|
|
11
11
|
export * from './install.ts';
|
|
12
12
|
export * from './uninstall.ts';
|
|
13
|
+
export * from './update.ts';
|
|
13
14
|
export * from './diff.ts';
|
|
15
|
+
export * from './modifiers.ts';
|
|
16
|
+
export * from './virtual-root.ts';
|
|
14
17
|
import type { LoadOptions as ActualLoadOptions } from './actual/load.ts';
|
|
15
18
|
export declare const actual: {
|
|
16
19
|
load: (options: ActualLoadOptions) => import("./graph.ts").Graph;
|
|
@@ -18,9 +21,9 @@ export declare const actual: {
|
|
|
18
21
|
import type { LoadOptions as LockfileLoadOptions } from './lockfile/load.ts';
|
|
19
22
|
export declare const lockfile: {
|
|
20
23
|
load: (options: LockfileLoadOptions) => import("./graph.ts").Graph;
|
|
21
|
-
loadEdges: (graph: import("
|
|
22
|
-
loadNodes: (graph: import("
|
|
23
|
-
save: (options: import("./lockfile/save.ts").SaveOptions) => void;
|
|
24
|
+
loadEdges: (graph: import("@vltpkg/types").GraphLike, edges: import("./lockfile/types.ts").LockfileData["edges"], options: import("@vltpkg/spec").SpecOptions) => void;
|
|
25
|
+
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;
|
|
26
|
+
save: (options: Omit<import("./lockfile/save.ts").SaveOptions, "saveManifests">) => void;
|
|
24
27
|
};
|
|
25
28
|
export type { ActualLoadOptions, LockfileLoadOptions };
|
|
26
29
|
export type { SaveOptions } from './lockfile/save.ts';
|
|
@@ -31,4 +34,5 @@ export declare const ideal: {
|
|
|
31
34
|
};
|
|
32
35
|
export { reify } from './reify/index.ts';
|
|
33
36
|
export type { ReifyOptions } from './reify/index.ts';
|
|
37
|
+
export type { BuildResult } from './reify/build.ts';
|
|
34
38
|
//# 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,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,3 +1,4 @@
|
|
|
1
|
+
export * from "./build.js";
|
|
1
2
|
export * from "./edge.js";
|
|
2
3
|
export * from "./graph.js";
|
|
3
4
|
export * from "./node.js";
|
|
@@ -7,10 +8,12 @@ export * from "./visualization/json-output.js";
|
|
|
7
8
|
export * from "./visualization/human-readable-output.js";
|
|
8
9
|
export * from "./visualization/mermaid-output.js";
|
|
9
10
|
export * from "./stringify-node.js";
|
|
10
|
-
export * from "./types.js";
|
|
11
11
|
export * from "./install.js";
|
|
12
12
|
export * from "./uninstall.js";
|
|
13
|
+
export * from "./update.js";
|
|
13
14
|
export * from "./diff.js";
|
|
15
|
+
export * from "./modifiers.js";
|
|
16
|
+
export * from "./virtual-root.js";
|
|
14
17
|
import { load as actualLoad } from "./actual/load.js";
|
|
15
18
|
export const actual = { load: actualLoad };
|
|
16
19
|
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,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 './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,13 +1,18 @@
|
|
|
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
5
|
export type InstallOptions = LoadOptions & {
|
|
6
|
-
projectRoot: string;
|
|
7
|
-
packageJson: PackageJson;
|
|
8
6
|
packageInfo: PackageInfoClient;
|
|
7
|
+
cleanInstall?: boolean;
|
|
8
|
+
allowScripts: string;
|
|
9
9
|
};
|
|
10
10
|
export declare const install: (options: InstallOptions, add?: AddImportersDependenciesMap) => Promise<{
|
|
11
|
+
graph: import("./graph.ts").Graph;
|
|
12
|
+
diff: undefined;
|
|
13
|
+
buildQueue?: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
buildQueue: DepID[] | undefined;
|
|
11
16
|
graph: import("./graph.ts").Graph;
|
|
12
17
|
diff: import("./diff.ts").Diff;
|
|
13
18
|
}>;
|
|
@@ -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,EAE5B,MAAM,mBAAmB,CAAA;AAE1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAQ3C,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;;;;;;;;EAuMlC,CAAA"}
|
package/dist/esm/install.js
CHANGED
|
@@ -1,26 +1,173 @@
|
|
|
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 } 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
|
+
if (add?.modifiedDependencies) {
|
|
46
|
+
const dependencies = [];
|
|
47
|
+
for (const [, deps] of add) {
|
|
48
|
+
for (const [name] of deps) {
|
|
49
|
+
dependencies.push(name);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
throw error('Cannot add dependencies when using --frozen-lockfile', { found: dependencies.join(', ') });
|
|
53
|
+
}
|
|
54
|
+
const lockfileGraph = loadVirtual({
|
|
55
|
+
...options,
|
|
56
|
+
mainManifest,
|
|
57
|
+
skipLoadingNodesOnModifiersChange: false,
|
|
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
|
+
details.push(` ${location}: ${deps.size} dependencies to add (${depNames.join(', ')})`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
for (const [importerId, deps] of importerSpecs.remove) {
|
|
101
|
+
if (deps.size > 0) {
|
|
102
|
+
const node = lockfileGraph.nodes.get(importerId);
|
|
103
|
+
const location = node?.location || importerId;
|
|
104
|
+
const depNames = Array.from(deps);
|
|
105
|
+
details.push(` ${location}: ${deps.size} dependencies to remove (${depNames.join(', ')})`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const lockfilePath = resolve(options.projectRoot, 'vlt-lock.json');
|
|
109
|
+
throw error('Lockfile is out of sync with package.json. Run "vlt install" to update.\n' +
|
|
110
|
+
details.join('\n'), {
|
|
111
|
+
path: lockfilePath,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const remover = new RollbackRemove();
|
|
116
|
+
if (options.cleanInstall) {
|
|
117
|
+
const nodeModulesPath = resolve(options.projectRoot, 'node_modules');
|
|
118
|
+
if (existsSync(nodeModulesPath)) {
|
|
119
|
+
await remover.rm(nodeModulesPath);
|
|
120
|
+
remover.confirm();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const modifiers = GraphModifier.maybeLoad(options);
|
|
125
|
+
const act = actualLoad({
|
|
126
|
+
...options,
|
|
127
|
+
mainManifest,
|
|
128
|
+
loadManifests: true,
|
|
129
|
+
modifiers: undefined, // modifiers should not be used here
|
|
130
|
+
});
|
|
131
|
+
const graph = await idealBuild({
|
|
132
|
+
...options,
|
|
133
|
+
actual: act,
|
|
134
|
+
add,
|
|
135
|
+
mainManifest,
|
|
136
|
+
loadManifests: true,
|
|
137
|
+
modifiers,
|
|
138
|
+
remover,
|
|
139
|
+
});
|
|
140
|
+
// If lockfileOnly is enabled, skip reify and only save the lockfile
|
|
141
|
+
if (options.lockfileOnly) {
|
|
142
|
+
// Save only the main lockfile, skip all filesystem operations
|
|
143
|
+
lockfile.save({ graph, modifiers });
|
|
144
|
+
const saveImportersPackageJson =
|
|
145
|
+
/* c8 ignore next */
|
|
146
|
+
add?.modifiedDependencies ?
|
|
147
|
+
updatePackageJson({
|
|
148
|
+
...options,
|
|
149
|
+
add,
|
|
150
|
+
graph,
|
|
151
|
+
})
|
|
152
|
+
: undefined;
|
|
153
|
+
saveImportersPackageJson?.();
|
|
154
|
+
return { graph, diff: undefined };
|
|
155
|
+
}
|
|
156
|
+
const { diff, buildQueue } = await reify({
|
|
157
|
+
...options,
|
|
158
|
+
add,
|
|
159
|
+
actual: act,
|
|
160
|
+
graph,
|
|
161
|
+
loadManifests: true,
|
|
162
|
+
modifiers,
|
|
163
|
+
remover,
|
|
164
|
+
});
|
|
165
|
+
return { buildQueue, graph, diff };
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
/* c8 ignore next */
|
|
169
|
+
await remover.rollback().catch(() => { });
|
|
170
|
+
throw err;
|
|
171
|
+
}
|
|
25
172
|
};
|
|
26
173
|
//# 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} from './dependencies.ts'\nimport { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { DepID } from '@vltpkg/dep-id'\nimport { existsSync } 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 { 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 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 skipLoadingNodesOnModifiersChange: false,\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 details.push(\n ` ${location}: ${deps.size} dependencies 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 details.push(\n ` ${location}: ${deps.size} dependencies 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 modifiers = GraphModifier.maybeLoad(options)\n\n const act = actualLoad({\n ...options,\n mainManifest,\n loadManifests: true,\n modifiers: undefined, // modifiers should not be used here\n })\n const graph = await idealBuild({\n ...options,\n actual: act,\n add,\n mainManifest,\n loadManifests: true,\n modifiers,\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 ?\n updatePackageJson({\n ...options,\n add,\n graph,\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 remover,\n })\n\n return { buildQueue, graph, diff }\n } catch (err) {\n /* c8 ignore next */\n await remover.rollback().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,SA2GrB,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,67 @@ 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), options);
|
|
83
|
+
// sets a registry for this spec to inherit from
|
|
84
|
+
spec.inheritedRegistry = fromNode.registry;
|
|
85
|
+
if (useOptimizations) {
|
|
86
|
+
edgeProcessingQueue.push({
|
|
87
|
+
fromNode,
|
|
88
|
+
toNode,
|
|
89
|
+
depType,
|
|
90
|
+
spec,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Process immediately for small graphs
|
|
95
|
+
graph.addEdge(depType, spec, fromNode, toNode);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Batch process all edges (only for non-trivial graphs)
|
|
99
|
+
if (useOptimizations) {
|
|
100
|
+
for (const { fromNode, toNode, depType, spec, } of edgeProcessingQueue) {
|
|
101
|
+
graph.addEdge(depType, spec, fromNode, toNode);
|
|
102
|
+
}
|
|
39
103
|
}
|
|
40
104
|
};
|
|
41
105
|
//# sourceMappingURL=load-edges.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-edges.js","sourceRoot":"","sources":["../../../src/lockfile/load-edges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"load-edges.js","sourceRoot":"","sources":["../../../src/lockfile/load-edges.ts"],"names":[],"mappings":"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","sourcesContent":["import { asDepID } from '@vltpkg/dep-id/browser'\nimport { error } from '@vltpkg/error-cause'\nimport { fastSplit } from '@vltpkg/fast-split'\nimport { Spec } from '@vltpkg/spec/browser'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport type {\n DependencyTypeShort,\n GraphLike,\n NodeLike,\n} from '@vltpkg/types'\nimport { isDependencyTypeShort } from '../dependencies.ts'\nimport type {\n LockfileData,\n LockfileEdgeKey,\n LockfileEdgeValue,\n} from './types.ts'\n\nexport type ProcessingEdge = {\n fromNode: NodeLike\n toNode: NodeLike | undefined\n depType: DependencyTypeShort\n spec: Spec\n}\n\nconst retrieveNodeFromGraph = (\n key: string,\n value: string,\n graph: GraphLike,\n fromId: string,\n seenNodes?: Map<string, NodeLike>,\n): NodeLike => {\n const foundNode = graph.nodes.get(asDepID(fromId))\n if (!foundNode) {\n throw error('Edge info missing its `from` node', {\n found: {\n nodes: [...graph.nodes].map(([id]) => id),\n from: foundNode,\n fromId,\n edge: { [key]: value },\n },\n })\n }\n if (seenNodes) {\n seenNodes.set(fromId, foundNode)\n }\n return foundNode\n}\n\nexport const loadEdges = (\n graph: GraphLike,\n edges: LockfileData['edges'],\n options: SpecOptions,\n) => {\n const entries = Object.entries(edges) as [\n LockfileEdgeKey,\n LockfileEdgeValue,\n ][]\n\n const edgeCount = entries.length\n // Only use optimizations for non-trivial graphs\n const useOptimizations = edgeCount > 50\n const edgeProcessingQueue: ProcessingEdge[] = []\n\n // Cache for frequently accessed nodes to avoid repeated Map lookups\n const seenNodes =\n useOptimizations ? new Map<string, NodeLike>() : undefined\n\n for (const [key, value] of entries) {\n const [fromId, specName] = fastSplit(key, ' ', 2)\n const [depType, valRest] = fastSplit(value, ' ', 2)\n const vrSplit = valRest?.lastIndexOf(' ') ?? -1\n\n // not a valid edge record\n /* c8 ignore start */\n if (!valRest || !depType || !fromId || !specName || vrSplit < 1) {\n continue\n }\n /* c8 ignore stop */\n\n // Validate dependency type early\n if (!isDependencyTypeShort(depType)) {\n throw error('Found unsupported dependency type in lockfile', {\n validOptions: [...longDependencyTypes],\n })\n }\n\n // Use cached node lookup for large graphs, direct lookup for small ones\n let fromNode: NodeLike\n if (seenNodes) {\n const seen = seenNodes.get(fromId)\n if (seen) {\n fromNode = seen\n } else {\n fromNode = retrieveNodeFromGraph(\n key,\n value,\n graph,\n fromId,\n seenNodes,\n )\n }\n } else {\n fromNode = retrieveNodeFromGraph(key, value, graph, fromId)\n }\n\n const toId = valRest.substring(vrSplit + 1)\n let toNode: NodeLike | undefined = undefined\n\n if (toId !== 'MISSING') {\n if (seenNodes) {\n const seen = seenNodes.get(toId)\n if (seen) {\n toNode = seen\n } else {\n toNode = graph.nodes.get(asDepID(toId))\n if (toNode) {\n seenNodes.set(toId, toNode)\n }\n }\n } else {\n toNode = graph.nodes.get(asDepID(toId))\n }\n }\n\n // Parse spec once we know the nodes are valid\n const spec = Spec.parse(\n specName,\n valRest.substring(0, vrSplit),\n options,\n )\n\n // sets a registry for this spec to inherit from\n spec.inheritedRegistry = fromNode.registry\n\n if (useOptimizations) {\n edgeProcessingQueue.push({\n fromNode,\n toNode,\n depType,\n spec,\n })\n } else {\n // Process immediately for small graphs\n graph.addEdge(depType, spec, fromNode, toNode)\n }\n }\n\n // Batch process all edges (only for non-trivial graphs)\n if (useOptimizations) {\n for (const {\n fromNode,\n toNode,\n depType,\n spec,\n } of edgeProcessingQueue) {\n graph.addEdge(depType, spec, fromNode, toNode)\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { LockfileData } from './types.ts';
|
|
2
|
-
import type { GraphLike } from '
|
|
3
|
-
|
|
2
|
+
import type { GraphLike } from '@vltpkg/types';
|
|
3
|
+
import type { SpecOptions } from '@vltpkg/spec/browser';
|
|
4
|
+
export declare const loadNodes: (graph: GraphLike, nodes: LockfileData["nodes"], options: SpecOptions, actual?: GraphLike, throwOnMissingManifest?: boolean) => void;
|
|
4
5
|
//# sourceMappingURL=load-nodes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-nodes.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load-nodes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"load-nodes.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load-nodes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,eAAO,MAAM,SAAS,UACb,SAAS,SACT,YAAY,CAAC,OAAO,CAAC,WACnB,WAAW,WACX,SAAS,2BACO,OAAO,SA0HjC,CAAA"}
|
|
@@ -1,30 +1,95 @@
|
|
|
1
|
+
import { error } from '@vltpkg/error-cause';
|
|
1
2
|
import { splitDepID } from '@vltpkg/dep-id/browser';
|
|
2
|
-
import { getBooleanFlagsFromNum } from "./types.js";
|
|
3
|
-
export const loadNodes = (graph, nodes) => {
|
|
3
|
+
import { getBooleanFlagsFromNum, getBuildStateFromNum, } from "./types.js";
|
|
4
|
+
export const loadNodes = (graph, nodes, options, actual, throwOnMissingManifest) => {
|
|
4
5
|
const entries = Object.entries(nodes);
|
|
6
|
+
const nodeCount = entries.length;
|
|
7
|
+
// Batch process registry spec parsing (only for large graphs)
|
|
8
|
+
// Only used for non-trivial graphs
|
|
9
|
+
const registryVersionCache = nodeCount > 50 ? new Map() : null;
|
|
5
10
|
for (const [id, lockfileNode] of entries) {
|
|
11
|
+
const [flags, name, integrity, resolved, location, manifest, rawManifest, platform, bins, buildState,] = lockfileNode;
|
|
6
12
|
// workspace nodes and the project root node are already part of the
|
|
7
13
|
// graph and it should not create new nodes if an existing one is there
|
|
8
14
|
if (graph.nodes.has(id))
|
|
9
15
|
continue;
|
|
10
|
-
const [
|
|
11
|
-
const
|
|
16
|
+
const [type, filepath, maybeExtra, lastExtra] = splitDepID(id);
|
|
17
|
+
const extra = type === 'registry' || type === 'git' ? lastExtra : maybeExtra;
|
|
18
|
+
const registrySpec = maybeExtra;
|
|
19
|
+
// The reference node is a node that matches the same id from the
|
|
20
|
+
// current iterating node in the provided `actual` graph, this allows
|
|
21
|
+
// for hydrating missing manifest, integrity, and resolved values
|
|
22
|
+
// that may be missing from the lockfile
|
|
23
|
+
const referenceNode = actual?.nodes.get(id);
|
|
24
|
+
const mani = manifest ?? referenceNode?.manifest;
|
|
25
|
+
// Throw if manifest is missing and the option is enabled
|
|
26
|
+
if (!mani && throwOnMissingManifest) {
|
|
27
|
+
throw error(`Missing manifest for node ${id} and no reference node found.`);
|
|
28
|
+
}
|
|
29
|
+
// Optimize registry version extraction with caching for large graphs
|
|
30
|
+
let version;
|
|
31
|
+
if (type === 'registry' &&
|
|
32
|
+
registrySpec &&
|
|
33
|
+
registrySpec.indexOf('@') > 0) {
|
|
34
|
+
if (registryVersionCache) {
|
|
35
|
+
const seenVersion = registryVersionCache.get(registrySpec);
|
|
36
|
+
/* c8 ignore start */
|
|
37
|
+
if (seenVersion) {
|
|
38
|
+
version = seenVersion;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
version = registrySpec.split('@').slice(-1)[0] || undefined;
|
|
42
|
+
/* c8 ignore stop */
|
|
43
|
+
if (version) {
|
|
44
|
+
registryVersionCache.set(registrySpec, version);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
version = registrySpec.split('@').slice(-1)[0] || undefined;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
12
52
|
// if the lockfile has manifest data then it should just use that
|
|
13
53
|
// otherwise tries to infer name / version value from the lockfile node
|
|
14
|
-
const node =
|
|
15
|
-
graph.addNode(id,
|
|
16
|
-
: graph.addNode(id, undefined, undefined, name ?? undefined,
|
|
17
|
-
|
|
18
|
-
|
|
54
|
+
const node = mani ?
|
|
55
|
+
graph.addNode(id, mani)
|
|
56
|
+
: graph.addNode(id, undefined, undefined, name ?? undefined, version);
|
|
57
|
+
if (extra) {
|
|
58
|
+
node.modifier = extra;
|
|
59
|
+
}
|
|
19
60
|
const { dev, optional } = getBooleanFlagsFromNum(flags);
|
|
61
|
+
node.options = options;
|
|
20
62
|
node.dev = dev;
|
|
21
63
|
node.optional = optional;
|
|
22
|
-
node.integrity = integrity ??
|
|
23
|
-
node.resolved = resolved ??
|
|
64
|
+
node.integrity = integrity ?? referenceNode?.integrity;
|
|
65
|
+
node.resolved = resolved ?? referenceNode?.resolved;
|
|
66
|
+
node.projectRoot = graph.projectRoot;
|
|
24
67
|
if (!node.resolved)
|
|
25
68
|
node.setResolved();
|
|
26
|
-
if (location)
|
|
69
|
+
if (location) {
|
|
27
70
|
node.location = location;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// set the location to file dependencies based on the id value
|
|
74
|
+
if (type === 'file') {
|
|
75
|
+
node.location = filepath;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (mani && rawManifest) {
|
|
79
|
+
node.setConfusedManifest(mani, rawManifest);
|
|
80
|
+
}
|
|
81
|
+
// Set platform data if provided
|
|
82
|
+
if (platform) {
|
|
83
|
+
node.platform = platform;
|
|
84
|
+
}
|
|
85
|
+
// optionally set bin data if provided
|
|
86
|
+
if (bins) {
|
|
87
|
+
node.bins = bins;
|
|
88
|
+
}
|
|
89
|
+
// Set build state if provided
|
|
90
|
+
if (buildState !== undefined && buildState !== null) {
|
|
91
|
+
node.buildState = getBuildStateFromNum(buildState);
|
|
92
|
+
}
|
|
28
93
|
}
|
|
29
94
|
};
|
|
30
95
|
//# sourceMappingURL=load-nodes.js.map
|