@vltpkg/graph 1.0.0-rc.1 → 1.0.0-rc.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actual/load.d.ts.map +1 -0
- package/dist/{esm/actual → actual}/load.js +35 -14
- package/dist/actual/load.js.map +1 -0
- package/dist/{esm/browser.d.ts → browser.d.ts} +1 -1
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js.map +1 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js.map +1 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/{esm/diff.d.ts → diff.d.ts} +2 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js.map +1 -0
- package/dist/{esm/edge.d.ts → edge.d.ts} +1 -0
- package/dist/edge.d.ts.map +1 -0
- package/dist/{esm/edge.js → edge.js} +4 -0
- package/dist/edge.js.map +1 -0
- package/dist/fixup-added-names.d.ts +16 -0
- package/dist/fixup-added-names.d.ts.map +1 -0
- package/dist/fixup-added-names.js +31 -0
- package/dist/fixup-added-names.js.map +1 -0
- package/dist/{esm/graph.d.ts → graph.d.ts} +18 -4
- package/dist/graph.d.ts.map +1 -0
- package/dist/{esm/graph.js → graph.js} +63 -40
- package/dist/graph.js.map +1 -0
- package/dist/{esm/ideal → ideal}/append-nodes.d.ts +2 -1
- package/dist/ideal/append-nodes.d.ts.map +1 -0
- package/dist/ideal/append-nodes.js +395 -0
- package/dist/ideal/append-nodes.js.map +1 -0
- package/dist/{esm/ideal → ideal}/build-ideal-from-starting-graph.d.ts +4 -4
- package/dist/ideal/build-ideal-from-starting-graph.d.ts.map +1 -0
- package/dist/ideal/build-ideal-from-starting-graph.js +70 -0
- package/dist/ideal/build-ideal-from-starting-graph.js.map +1 -0
- package/dist/ideal/build.d.ts.map +1 -0
- package/dist/{esm/ideal → ideal}/build.js +29 -2
- package/dist/ideal/build.js.map +1 -0
- package/dist/{esm/ideal → ideal}/get-importer-specs.d.ts +9 -2
- package/dist/ideal/get-importer-specs.d.ts.map +1 -0
- package/dist/{esm/ideal → ideal}/get-importer-specs.js +80 -5
- package/dist/ideal/get-importer-specs.js.map +1 -0
- package/dist/ideal/get-ordered-dependencies.d.ts +10 -0
- package/dist/ideal/get-ordered-dependencies.d.ts.map +1 -0
- package/dist/ideal/get-ordered-dependencies.js +42 -0
- package/dist/ideal/get-ordered-dependencies.js.map +1 -0
- package/dist/ideal/peers.d.ts +76 -0
- package/dist/ideal/peers.d.ts.map +1 -0
- package/dist/ideal/peers.js +340 -0
- package/dist/ideal/peers.js.map +1 -0
- package/dist/ideal/refresh-ideal-graph.d.ts +48 -0
- package/dist/ideal/refresh-ideal-graph.d.ts.map +1 -0
- package/dist/ideal/refresh-ideal-graph.js +79 -0
- package/dist/ideal/refresh-ideal-graph.js.map +1 -0
- package/dist/ideal/remove-satisfied-specs.d.ts.map +1 -0
- package/dist/ideal/remove-satisfied-specs.js.map +1 -0
- package/dist/ideal/types.d.ts +112 -0
- package/dist/ideal/types.d.ts.map +1 -0
- package/dist/ideal/types.js.map +1 -0
- package/dist/{esm/index.d.ts → index.d.ts} +2 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/{esm/index.js → index.js} +1 -0
- package/dist/index.js.map +1 -0
- package/dist/{esm/install.d.ts → install.d.ts} +3 -2
- package/dist/install.d.ts.map +1 -0
- package/dist/{esm/install.js → install.js} +30 -6
- package/dist/install.js.map +1 -0
- package/dist/lockfile/load-edges.d.ts.map +1 -0
- package/dist/{esm/lockfile → lockfile}/load-edges.js +4 -3
- package/dist/lockfile/load-edges.js.map +1 -0
- package/dist/{esm/lockfile → lockfile}/load-nodes.d.ts +1 -1
- package/dist/lockfile/load-nodes.d.ts.map +1 -0
- package/dist/{esm/lockfile → lockfile}/load-nodes.js +16 -4
- package/dist/lockfile/load-nodes.js.map +1 -0
- package/dist/{esm/lockfile → lockfile}/load.d.ts +2 -2
- package/dist/lockfile/load.d.ts.map +1 -0
- package/dist/{esm/lockfile → lockfile}/load.js +6 -29
- package/dist/lockfile/load.js.map +1 -0
- package/dist/{esm/lockfile → lockfile}/save.d.ts +5 -1
- package/dist/lockfile/save.d.ts.map +1 -0
- package/dist/{esm/lockfile → lockfile}/save.js +23 -9
- package/dist/lockfile/save.js.map +1 -0
- package/dist/lockfile/types.d.ts.map +1 -0
- package/dist/lockfile/types.js.map +1 -0
- package/dist/modifiers.d.ts.map +1 -0
- package/dist/modifiers.js.map +1 -0
- package/dist/{esm/node.d.ts → node.d.ts} +14 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/{esm/node.js → node.js} +21 -0
- package/dist/node.js.map +1 -0
- package/dist/non-empty-list.d.ts.map +1 -0
- package/dist/non-empty-list.js.map +1 -0
- package/dist/reify/add-edge.d.ts.map +1 -0
- package/dist/reify/add-edge.js.map +1 -0
- package/dist/{esm/reify → reify}/add-edges.d.ts +1 -1
- package/dist/reify/add-edges.d.ts.map +1 -0
- package/dist/{esm/reify → reify}/add-edges.js +2 -1
- package/dist/reify/add-edges.js.map +1 -0
- package/dist/reify/add-nodes.d.ts.map +1 -0
- package/dist/reify/add-nodes.js.map +1 -0
- package/dist/reify/bin-chmod.d.ts.map +1 -0
- package/dist/reify/bin-chmod.js.map +1 -0
- package/dist/reify/build.d.ts.map +1 -0
- package/dist/{esm/reify → reify}/build.js +1 -1
- package/dist/reify/build.js.map +1 -0
- package/dist/reify/calculate-save-value.d.ts.map +1 -0
- package/dist/reify/calculate-save-value.js.map +1 -0
- package/dist/reify/check-needed-build.d.ts.map +1 -0
- package/dist/reify/check-needed-build.js.map +1 -0
- package/dist/reify/delete-edge.d.ts.map +1 -0
- package/dist/reify/delete-edge.js.map +1 -0
- package/dist/reify/delete-edges.d.ts.map +1 -0
- package/dist/reify/delete-edges.js.map +1 -0
- package/dist/reify/delete-nodes.d.ts.map +1 -0
- package/dist/reify/delete-nodes.js.map +1 -0
- package/dist/reify/extract-node.d.ts.map +1 -0
- package/dist/{esm/reify → reify}/extract-node.js +10 -2
- package/dist/reify/extract-node.js.map +1 -0
- package/dist/reify/index.d.ts.map +1 -0
- package/dist/{esm/reify → reify}/index.js +1 -1
- package/dist/reify/index.js.map +1 -0
- package/dist/reify/internal-hoist.d.ts.map +1 -0
- package/dist/reify/internal-hoist.js.map +1 -0
- package/dist/reify/optional-fail.d.ts.map +1 -0
- package/dist/reify/optional-fail.js.map +1 -0
- package/dist/reify/rollback.d.ts.map +1 -0
- package/dist/reify/rollback.js.map +1 -0
- package/dist/{esm/reify → reify}/update-importers-package-json.d.ts +1 -1
- package/dist/reify/update-importers-package-json.d.ts.map +1 -0
- package/dist/{esm/reify → reify}/update-importers-package-json.js +19 -16
- package/dist/reify/update-importers-package-json.js.map +1 -0
- package/dist/remove-optional-subgraph.d.ts.map +1 -0
- package/dist/remove-optional-subgraph.js.map +1 -0
- package/dist/resolve-save-type.d.ts.map +1 -0
- package/dist/resolve-save-type.js.map +1 -0
- package/dist/stringify-node.d.ts.map +1 -0
- package/dist/{esm/stringify-node.js → stringify-node.js} +10 -1
- package/dist/stringify-node.js.map +1 -0
- package/dist/transfer-data/load.d.ts.map +1 -0
- package/dist/transfer-data/load.js.map +1 -0
- package/dist/uninstall.d.ts.map +1 -0
- package/dist/{esm/uninstall.js → uninstall.js} +10 -0
- package/dist/uninstall.js.map +1 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/{esm/update.js → update.js} +10 -0
- package/dist/update.js.map +1 -0
- package/dist/virtual-root.d.ts.map +1 -0
- package/dist/virtual-root.js.map +1 -0
- package/dist/visualization/human-readable-output.d.ts.map +1 -0
- package/dist/{esm/visualization → visualization}/human-readable-output.js +7 -2
- package/dist/visualization/human-readable-output.js.map +1 -0
- package/dist/{esm/visualization → visualization}/json-output.d.ts +2 -1
- package/dist/visualization/json-output.d.ts.map +1 -0
- package/dist/{esm/visualization → visualization}/json-output.js +2 -2
- package/dist/visualization/json-output.js.map +1 -0
- package/dist/visualization/mermaid-output.d.ts.map +1 -0
- package/dist/{esm/visualization → visualization}/mermaid-output.js +57 -16
- package/dist/visualization/mermaid-output.js.map +1 -0
- package/dist/visualization/object-like-output.d.ts.map +1 -0
- package/dist/visualization/object-like-output.js.map +1 -0
- package/package.json +34 -50
- package/dist/esm/actual/load.d.ts.map +0 -1
- package/dist/esm/actual/load.js.map +0 -1
- package/dist/esm/browser.d.ts.map +0 -1
- package/dist/esm/browser.js.map +0 -1
- package/dist/esm/build.d.ts.map +0 -1
- package/dist/esm/build.js.map +0 -1
- package/dist/esm/dependencies.d.ts.map +0 -1
- package/dist/esm/dependencies.js.map +0 -1
- package/dist/esm/diff.d.ts.map +0 -1
- package/dist/esm/diff.js.map +0 -1
- package/dist/esm/edge.d.ts.map +0 -1
- package/dist/esm/edge.js.map +0 -1
- package/dist/esm/graph.d.ts.map +0 -1
- package/dist/esm/graph.js.map +0 -1
- package/dist/esm/ideal/add-nodes.d.ts +0 -34
- package/dist/esm/ideal/add-nodes.d.ts.map +0 -1
- package/dist/esm/ideal/add-nodes.js +0 -39
- package/dist/esm/ideal/add-nodes.js.map +0 -1
- package/dist/esm/ideal/append-nodes.d.ts.map +0 -1
- package/dist/esm/ideal/append-nodes.js +0 -288
- package/dist/esm/ideal/append-nodes.js.map +0 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +0 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.js +0 -55
- package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +0 -1
- package/dist/esm/ideal/build.d.ts.map +0 -1
- package/dist/esm/ideal/build.js.map +0 -1
- package/dist/esm/ideal/get-importer-specs.d.ts.map +0 -1
- package/dist/esm/ideal/get-importer-specs.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/ideal/remove-satisfied-specs.d.ts.map +0 -1
- package/dist/esm/ideal/remove-satisfied-specs.js.map +0 -1
- package/dist/esm/ideal/types.d.ts +0 -35
- package/dist/esm/ideal/types.d.ts.map +0 -1
- package/dist/esm/ideal/types.js.map +0 -1
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/install.d.ts.map +0 -1
- package/dist/esm/install.js.map +0 -1
- package/dist/esm/lockfile/load-edges.d.ts.map +0 -1
- package/dist/esm/lockfile/load-edges.js.map +0 -1
- package/dist/esm/lockfile/load-nodes.d.ts.map +0 -1
- package/dist/esm/lockfile/load-nodes.js.map +0 -1
- package/dist/esm/lockfile/load.d.ts.map +0 -1
- package/dist/esm/lockfile/load.js.map +0 -1
- package/dist/esm/lockfile/save.d.ts.map +0 -1
- package/dist/esm/lockfile/save.js.map +0 -1
- package/dist/esm/lockfile/types.d.ts.map +0 -1
- package/dist/esm/lockfile/types.js.map +0 -1
- package/dist/esm/modifiers.d.ts.map +0 -1
- package/dist/esm/modifiers.js.map +0 -1
- package/dist/esm/node.d.ts.map +0 -1
- package/dist/esm/node.js.map +0 -1
- package/dist/esm/non-empty-list.d.ts.map +0 -1
- package/dist/esm/non-empty-list.js.map +0 -1
- package/dist/esm/package.json +0 -3
- package/dist/esm/reify/add-edge.d.ts.map +0 -1
- package/dist/esm/reify/add-edge.js.map +0 -1
- package/dist/esm/reify/add-edges.d.ts.map +0 -1
- package/dist/esm/reify/add-edges.js.map +0 -1
- package/dist/esm/reify/add-nodes.d.ts.map +0 -1
- package/dist/esm/reify/add-nodes.js.map +0 -1
- package/dist/esm/reify/bin-chmod.d.ts.map +0 -1
- package/dist/esm/reify/bin-chmod.js.map +0 -1
- package/dist/esm/reify/build.d.ts.map +0 -1
- package/dist/esm/reify/build.js.map +0 -1
- package/dist/esm/reify/calculate-save-value.d.ts.map +0 -1
- package/dist/esm/reify/calculate-save-value.js.map +0 -1
- package/dist/esm/reify/check-needed-build.d.ts.map +0 -1
- package/dist/esm/reify/check-needed-build.js.map +0 -1
- package/dist/esm/reify/delete-edge.d.ts.map +0 -1
- package/dist/esm/reify/delete-edge.js.map +0 -1
- package/dist/esm/reify/delete-edges.d.ts.map +0 -1
- package/dist/esm/reify/delete-edges.js.map +0 -1
- package/dist/esm/reify/delete-nodes.d.ts.map +0 -1
- package/dist/esm/reify/delete-nodes.js.map +0 -1
- package/dist/esm/reify/extract-node.d.ts.map +0 -1
- package/dist/esm/reify/extract-node.js.map +0 -1
- package/dist/esm/reify/index.d.ts.map +0 -1
- package/dist/esm/reify/index.js.map +0 -1
- package/dist/esm/reify/internal-hoist.d.ts.map +0 -1
- package/dist/esm/reify/internal-hoist.js.map +0 -1
- package/dist/esm/reify/optional-fail.d.ts.map +0 -1
- package/dist/esm/reify/optional-fail.js.map +0 -1
- package/dist/esm/reify/rollback.d.ts.map +0 -1
- package/dist/esm/reify/rollback.js.map +0 -1
- package/dist/esm/reify/update-importers-package-json.d.ts.map +0 -1
- package/dist/esm/reify/update-importers-package-json.js.map +0 -1
- package/dist/esm/remove-optional-subgraph.d.ts.map +0 -1
- package/dist/esm/remove-optional-subgraph.js.map +0 -1
- package/dist/esm/resolve-save-type.d.ts.map +0 -1
- package/dist/esm/resolve-save-type.js.map +0 -1
- package/dist/esm/stringify-node.d.ts.map +0 -1
- package/dist/esm/stringify-node.js.map +0 -1
- package/dist/esm/transfer-data/load.d.ts.map +0 -1
- package/dist/esm/transfer-data/load.js.map +0 -1
- package/dist/esm/uninstall.d.ts.map +0 -1
- package/dist/esm/uninstall.js.map +0 -1
- package/dist/esm/update.d.ts.map +0 -1
- package/dist/esm/update.js.map +0 -1
- package/dist/esm/virtual-root.d.ts.map +0 -1
- package/dist/esm/virtual-root.js.map +0 -1
- package/dist/esm/visualization/human-readable-output.d.ts.map +0 -1
- package/dist/esm/visualization/human-readable-output.js.map +0 -1
- package/dist/esm/visualization/json-output.d.ts.map +0 -1
- package/dist/esm/visualization/json-output.js.map +0 -1
- package/dist/esm/visualization/mermaid-output.d.ts.map +0 -1
- package/dist/esm/visualization/mermaid-output.js.map +0 -1
- package/dist/esm/visualization/object-like-output.d.ts.map +0 -1
- package/dist/esm/visualization/object-like-output.js.map +0 -1
- /package/dist/{esm/actual → actual}/load.d.ts +0 -0
- /package/dist/{esm/browser.js → browser.js} +0 -0
- /package/dist/{esm/build.d.ts → build.d.ts} +0 -0
- /package/dist/{esm/build.js → build.js} +0 -0
- /package/dist/{esm/dependencies.d.ts → dependencies.d.ts} +0 -0
- /package/dist/{esm/dependencies.js → dependencies.js} +0 -0
- /package/dist/{esm/diff.js → diff.js} +0 -0
- /package/dist/{esm/ideal → ideal}/build.d.ts +0 -0
- /package/dist/{esm/ideal → ideal}/remove-satisfied-specs.d.ts +0 -0
- /package/dist/{esm/ideal → ideal}/remove-satisfied-specs.js +0 -0
- /package/dist/{esm/ideal → ideal}/types.js +0 -0
- /package/dist/{esm/lockfile → lockfile}/load-edges.d.ts +0 -0
- /package/dist/{esm/lockfile → lockfile}/types.d.ts +0 -0
- /package/dist/{esm/lockfile → lockfile}/types.js +0 -0
- /package/dist/{esm/modifiers.d.ts → modifiers.d.ts} +0 -0
- /package/dist/{esm/modifiers.js → modifiers.js} +0 -0
- /package/dist/{esm/non-empty-list.d.ts → non-empty-list.d.ts} +0 -0
- /package/dist/{esm/non-empty-list.js → non-empty-list.js} +0 -0
- /package/dist/{esm/reify → reify}/add-edge.d.ts +0 -0
- /package/dist/{esm/reify → reify}/add-edge.js +0 -0
- /package/dist/{esm/reify → reify}/add-nodes.d.ts +0 -0
- /package/dist/{esm/reify → reify}/add-nodes.js +0 -0
- /package/dist/{esm/reify → reify}/bin-chmod.d.ts +0 -0
- /package/dist/{esm/reify → reify}/bin-chmod.js +0 -0
- /package/dist/{esm/reify → reify}/build.d.ts +0 -0
- /package/dist/{esm/reify → reify}/calculate-save-value.d.ts +0 -0
- /package/dist/{esm/reify → reify}/calculate-save-value.js +0 -0
- /package/dist/{esm/reify → reify}/check-needed-build.d.ts +0 -0
- /package/dist/{esm/reify → reify}/check-needed-build.js +0 -0
- /package/dist/{esm/reify → reify}/delete-edge.d.ts +0 -0
- /package/dist/{esm/reify → reify}/delete-edge.js +0 -0
- /package/dist/{esm/reify → reify}/delete-edges.d.ts +0 -0
- /package/dist/{esm/reify → reify}/delete-edges.js +0 -0
- /package/dist/{esm/reify → reify}/delete-nodes.d.ts +0 -0
- /package/dist/{esm/reify → reify}/delete-nodes.js +0 -0
- /package/dist/{esm/reify → reify}/extract-node.d.ts +0 -0
- /package/dist/{esm/reify → reify}/index.d.ts +0 -0
- /package/dist/{esm/reify → reify}/internal-hoist.d.ts +0 -0
- /package/dist/{esm/reify → reify}/internal-hoist.js +0 -0
- /package/dist/{esm/reify → reify}/optional-fail.d.ts +0 -0
- /package/dist/{esm/reify → reify}/optional-fail.js +0 -0
- /package/dist/{esm/reify → reify}/rollback.d.ts +0 -0
- /package/dist/{esm/reify → reify}/rollback.js +0 -0
- /package/dist/{esm/remove-optional-subgraph.d.ts → remove-optional-subgraph.d.ts} +0 -0
- /package/dist/{esm/remove-optional-subgraph.js → remove-optional-subgraph.js} +0 -0
- /package/dist/{esm/resolve-save-type.d.ts → resolve-save-type.d.ts} +0 -0
- /package/dist/{esm/resolve-save-type.js → resolve-save-type.js} +0 -0
- /package/dist/{esm/stringify-node.d.ts → stringify-node.d.ts} +0 -0
- /package/dist/{esm/transfer-data → transfer-data}/load.d.ts +0 -0
- /package/dist/{esm/transfer-data → transfer-data}/load.js +0 -0
- /package/dist/{esm/uninstall.d.ts → uninstall.d.ts} +0 -0
- /package/dist/{esm/update.d.ts → update.d.ts} +0 -0
- /package/dist/{esm/virtual-root.d.ts → virtual-root.d.ts} +0 -0
- /package/dist/{esm/virtual-root.js → virtual-root.js} +0 -0
- /package/dist/{esm/visualization → visualization}/human-readable-output.d.ts +0 -0
- /package/dist/{esm/visualization → visualization}/mermaid-output.d.ts +0 -0
- /package/dist/{esm/visualization → visualization}/object-like-output.d.ts +0 -0
- /package/dist/{esm/visualization → visualization}/object-like-output.js +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { PackageInfoClient } from '@vltpkg/package-info';
|
|
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';
|
|
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'>;
|
|
21
|
+
export type BuildIdealAddOptions = {
|
|
22
|
+
/**
|
|
23
|
+
* A {@link AddImportersDependenciesMap} in which keys are {@link DepID}
|
|
24
|
+
* linking to another `Map` in which keys are the dependency names and values
|
|
25
|
+
* are {@link Dependency}. This structure represents dependencies that need
|
|
26
|
+
* to be added to the importer represented by {@link DepID}.
|
|
27
|
+
*/
|
|
28
|
+
add: AddImportersDependenciesMap;
|
|
29
|
+
};
|
|
30
|
+
export type BuildIdealRemoveOptions = {
|
|
31
|
+
/**
|
|
32
|
+
* A {@link RemoveImportersDependenciesMap} object representing nodes to be
|
|
33
|
+
* removed from the ideal graph. Each {@link DepID} key represents an
|
|
34
|
+
* importer node and the `Set` of dependency names to be removed from its
|
|
35
|
+
* dependency list.
|
|
36
|
+
*/
|
|
37
|
+
remove: RemoveImportersDependenciesMap;
|
|
38
|
+
};
|
|
39
|
+
export type BuildIdealFromGraphOptions = {
|
|
40
|
+
/**
|
|
41
|
+
* An initial {@link Graph} to start building from, adding nodes to any
|
|
42
|
+
* missing edges and appending any new specs defined in `addSpecs`.
|
|
43
|
+
*/
|
|
44
|
+
graph: Graph;
|
|
45
|
+
};
|
|
46
|
+
export type BuildIdealPackageInfoOptions = {
|
|
47
|
+
/**
|
|
48
|
+
* A {@link PackageInfoClient} instance to read manifest info from.
|
|
49
|
+
*/
|
|
50
|
+
packageInfo: PackageInfoClient;
|
|
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
|
+
};
|
|
112
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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,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"}
|
|
@@ -0,0 +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 { 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"]}
|
|
@@ -3,6 +3,7 @@ export * from './edge.ts';
|
|
|
3
3
|
export * from './graph.ts';
|
|
4
4
|
export * from './node.ts';
|
|
5
5
|
export * from './dependencies.ts';
|
|
6
|
+
export * from './fixup-added-names.ts';
|
|
6
7
|
export * from './lockfile/types.ts';
|
|
7
8
|
export * from './visualization/json-output.ts';
|
|
8
9
|
export * from './visualization/human-readable-output.ts';
|
|
@@ -22,7 +23,7 @@ import type { LoadOptions as LockfileLoadOptions } from './lockfile/load.ts';
|
|
|
22
23
|
export declare const lockfile: {
|
|
23
24
|
load: (options: LockfileLoadOptions) => import("./graph.ts").Graph;
|
|
24
25
|
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) => 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;
|
|
26
27
|
save: (options: Omit<import("./lockfile/save.ts").SaveOptions, "saveManifests">) => void;
|
|
27
28
|
};
|
|
28
29
|
export type { ActualLoadOptions, LockfileLoadOptions };
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -3,6 +3,7 @@ export * from "./edge.js";
|
|
|
3
3
|
export * from "./graph.js";
|
|
4
4
|
export * from "./node.js";
|
|
5
5
|
export * from "./dependencies.js";
|
|
6
|
+
export * from "./fixup-added-names.js";
|
|
6
7
|
export * from "./lockfile/types.js";
|
|
7
8
|
export * from "./visualization/json-output.js";
|
|
8
9
|
export * from "./visualization/human-readable-output.js";
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -2,18 +2,19 @@ import type { PackageInfoClient } from '@vltpkg/package-info';
|
|
|
2
2
|
import type { LoadOptions } from './actual/load.ts';
|
|
3
3
|
import type { AddImportersDependenciesMap } from './dependencies.ts';
|
|
4
4
|
import type { DepID } from '@vltpkg/dep-id';
|
|
5
|
+
import type { Graph } from './index.ts';
|
|
5
6
|
export type InstallOptions = LoadOptions & {
|
|
6
7
|
packageInfo: PackageInfoClient;
|
|
7
8
|
cleanInstall?: boolean;
|
|
8
9
|
allowScripts: string;
|
|
9
10
|
};
|
|
10
11
|
export declare const install: (options: InstallOptions, add?: AddImportersDependenciesMap) => Promise<{
|
|
11
|
-
graph:
|
|
12
|
+
graph: Graph;
|
|
12
13
|
diff: undefined;
|
|
13
14
|
buildQueue?: undefined;
|
|
14
15
|
} | {
|
|
15
16
|
buildQueue: DepID[] | undefined;
|
|
16
|
-
graph:
|
|
17
|
+
graph: Graph;
|
|
17
18
|
diff: import("./diff.ts").Diff;
|
|
18
19
|
}>;
|
|
19
20
|
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -7,7 +7,7 @@ import { error } from '@vltpkg/error-cause';
|
|
|
7
7
|
import { asError } from '@vltpkg/types';
|
|
8
8
|
import { getDependencies } from "./dependencies.js";
|
|
9
9
|
import { RollbackRemove } from '@vltpkg/rollback-remove';
|
|
10
|
-
import { existsSync } from 'node:fs';
|
|
10
|
+
import { existsSync, rmSync } from 'node:fs';
|
|
11
11
|
import { resolve } from 'node:path';
|
|
12
12
|
import { load as loadVirtual } from "./lockfile/load.js";
|
|
13
13
|
import { getImporterSpecs } from "./ideal/get-importer-specs.js";
|
|
@@ -42,6 +42,7 @@ export const install = async (options, add) => {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
if (options.frozenLockfile) {
|
|
45
|
+
// validates no add/remove operations are requested
|
|
45
46
|
if (add?.modifiedDependencies) {
|
|
46
47
|
const dependencies = [];
|
|
47
48
|
for (const [, deps] of add) {
|
|
@@ -54,7 +55,6 @@ export const install = async (options, add) => {
|
|
|
54
55
|
const lockfileGraph = loadVirtual({
|
|
55
56
|
...options,
|
|
56
57
|
mainManifest,
|
|
57
|
-
skipLoadingNodesOnModifiersChange: false,
|
|
58
58
|
});
|
|
59
59
|
const emptyAdd = Object.assign(new Map(), { modifiedDependencies: false });
|
|
60
60
|
const emptyRemove = Object.assign(new Map(), {
|
|
@@ -94,7 +94,8 @@ export const install = async (options, add) => {
|
|
|
94
94
|
const node = lockfileGraph.nodes.get(importerId);
|
|
95
95
|
const location = node?.location || importerId;
|
|
96
96
|
const depNames = Array.from(deps.keys());
|
|
97
|
-
|
|
97
|
+
const depLabelAdd = deps.size === 1 ? 'dependency' : 'dependencies';
|
|
98
|
+
details.push(` ${location}: ${deps.size} ${depLabelAdd} to add (${depNames.join(', ')})`);
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
for (const [importerId, deps] of importerSpecs.remove) {
|
|
@@ -102,7 +103,10 @@ export const install = async (options, add) => {
|
|
|
102
103
|
const node = lockfileGraph.nodes.get(importerId);
|
|
103
104
|
const location = node?.location || importerId;
|
|
104
105
|
const depNames = Array.from(deps);
|
|
105
|
-
|
|
106
|
+
const depLabelRemove = deps.size === 1 ?
|
|
107
|
+
'dependency'
|
|
108
|
+
: /* c8 ignore next */ 'dependencies';
|
|
109
|
+
details.push(` ${location}: ${deps.size} ${depLabelRemove} to remove (${depNames.join(', ')})`);
|
|
106
110
|
}
|
|
107
111
|
}
|
|
108
112
|
const lockfilePath = resolve(options.projectRoot, 'vlt-lock.json');
|
|
@@ -121,13 +125,22 @@ export const install = async (options, add) => {
|
|
|
121
125
|
}
|
|
122
126
|
}
|
|
123
127
|
try {
|
|
128
|
+
const remove = Object.assign(new Map(), {
|
|
129
|
+
modifiedDependencies: false,
|
|
130
|
+
});
|
|
124
131
|
const modifiers = GraphModifier.maybeLoad(options);
|
|
125
|
-
|
|
132
|
+
let act = actualLoad({
|
|
126
133
|
...options,
|
|
127
134
|
mainManifest,
|
|
128
135
|
loadManifests: true,
|
|
129
136
|
modifiers: undefined, // modifiers should not be used here
|
|
130
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
|
+
}
|
|
131
144
|
const graph = await idealBuild({
|
|
132
145
|
...options,
|
|
133
146
|
actual: act,
|
|
@@ -135,6 +148,7 @@ export const install = async (options, add) => {
|
|
|
135
148
|
mainManifest,
|
|
136
149
|
loadManifests: true,
|
|
137
150
|
modifiers,
|
|
151
|
+
remove,
|
|
138
152
|
remover,
|
|
139
153
|
});
|
|
140
154
|
// If lockfileOnly is enabled, skip reify and only save the lockfile
|
|
@@ -143,11 +157,12 @@ export const install = async (options, add) => {
|
|
|
143
157
|
lockfile.save({ graph, modifiers });
|
|
144
158
|
const saveImportersPackageJson =
|
|
145
159
|
/* c8 ignore next */
|
|
146
|
-
add?.modifiedDependencies ?
|
|
160
|
+
add?.modifiedDependencies || remove.modifiedDependencies ?
|
|
147
161
|
updatePackageJson({
|
|
148
162
|
...options,
|
|
149
163
|
add,
|
|
150
164
|
graph,
|
|
165
|
+
remove,
|
|
151
166
|
})
|
|
152
167
|
: undefined;
|
|
153
168
|
saveImportersPackageJson?.();
|
|
@@ -160,6 +175,7 @@ export const install = async (options, add) => {
|
|
|
160
175
|
graph,
|
|
161
176
|
loadManifests: true,
|
|
162
177
|
modifiers,
|
|
178
|
+
remove,
|
|
163
179
|
remover,
|
|
164
180
|
});
|
|
165
181
|
return { buildQueue, graph, diff };
|
|
@@ -167,6 +183,14 @@ export const install = async (options, add) => {
|
|
|
167
183
|
catch (err) {
|
|
168
184
|
/* c8 ignore next */
|
|
169
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 { }
|
|
170
194
|
throw err;
|
|
171
195
|
}
|
|
172
196
|
};
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -79,9 +79,10 @@ export const loadEdges = (graph, edges, options) => {
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
// Parse spec once we know the nodes are valid
|
|
82
|
-
const spec = Spec.parse(specName, valRest.substring(0, vrSplit),
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
const spec = Spec.parse(specName, valRest.substring(0, vrSplit), {
|
|
83
|
+
...options,
|
|
84
|
+
registry: fromNode.registry,
|
|
85
|
+
});
|
|
85
86
|
if (useOptimizations) {
|
|
86
87
|
edgeProcessingQueue.push({
|
|
87
88
|
fromNode,
|
|
@@ -0,0 +1 @@
|
|
|
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(specName, valRest.substring(0, vrSplit), {\n ...options,\n registry: fromNode.registry,\n })\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,5 +1,5 @@
|
|
|
1
1
|
import type { LockfileData } from './types.ts';
|
|
2
2
|
import type { GraphLike } from '@vltpkg/types';
|
|
3
3
|
import type { SpecOptions } from '@vltpkg/spec/browser';
|
|
4
|
-
export declare const loadNodes: (graph: GraphLike, nodes: LockfileData["nodes"], options: SpecOptions, actual?: GraphLike) => void;
|
|
4
|
+
export declare const loadNodes: (graph: GraphLike, nodes: LockfileData["nodes"], options: SpecOptions, actual?: GraphLike, throwOnMissingManifest?: boolean) => void;
|
|
5
5
|
//# sourceMappingURL=load-nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,SAmIjC,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { error } from '@vltpkg/error-cause';
|
|
2
|
+
import { splitDepID, splitExtra } from '@vltpkg/dep-id/browser';
|
|
2
3
|
import { getBooleanFlagsFromNum, getBuildStateFromNum, } from "./types.js";
|
|
3
|
-
export const loadNodes = (graph, nodes, options, actual) => {
|
|
4
|
+
export const loadNodes = (graph, nodes, options, actual, throwOnMissingManifest) => {
|
|
4
5
|
const entries = Object.entries(nodes);
|
|
5
6
|
const nodeCount = entries.length;
|
|
6
7
|
// Batch process registry spec parsing (only for large graphs)
|
|
@@ -21,6 +22,10 @@ export const loadNodes = (graph, nodes, options, actual) => {
|
|
|
21
22
|
// that may be missing from the lockfile
|
|
22
23
|
const referenceNode = actual?.nodes.get(id);
|
|
23
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
|
+
}
|
|
24
29
|
// Optimize registry version extraction with caching for large graphs
|
|
25
30
|
let version;
|
|
26
31
|
if (type === 'registry' &&
|
|
@@ -50,14 +55,21 @@ export const loadNodes = (graph, nodes, options, actual) => {
|
|
|
50
55
|
graph.addNode(id, mani)
|
|
51
56
|
: graph.addNode(id, undefined, undefined, name ?? undefined, version);
|
|
52
57
|
if (extra) {
|
|
53
|
-
|
|
58
|
+
const { modifier, peerSetHash } = splitExtra(extra);
|
|
59
|
+
if (modifier) {
|
|
60
|
+
node.modifier = modifier;
|
|
61
|
+
}
|
|
62
|
+
if (peerSetHash) {
|
|
63
|
+
node.peerSetHash = peerSetHash;
|
|
64
|
+
}
|
|
54
65
|
}
|
|
55
66
|
const { dev, optional } = getBooleanFlagsFromNum(flags);
|
|
56
67
|
node.options = options;
|
|
57
68
|
node.dev = dev;
|
|
58
69
|
node.optional = optional;
|
|
59
70
|
node.integrity = integrity ?? referenceNode?.integrity;
|
|
60
|
-
node.resolved =
|
|
71
|
+
node.resolved =
|
|
72
|
+
type === 'remote' ? filepath : ((resolved ?? referenceNode?.resolved));
|
|
61
73
|
node.projectRoot = graph.projectRoot;
|
|
62
74
|
if (!node.resolved)
|
|
63
75
|
node.setResolved();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-nodes.js","sourceRoot":"","sources":["../../src/lockfile/load-nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport { splitDepID, splitExtra } from '@vltpkg/dep-id/browser'\nimport {\n getBooleanFlagsFromNum,\n getBuildStateFromNum,\n} from './types.ts'\nimport type { LockfileData, LockfileNode } from './types.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { GraphLike } from '@vltpkg/types'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\n\nexport const loadNodes = (\n graph: GraphLike,\n nodes: LockfileData['nodes'],\n options: SpecOptions,\n actual?: GraphLike,\n throwOnMissingManifest?: boolean,\n) => {\n const entries = Object.entries(nodes) as [DepID, LockfileNode][]\n const nodeCount = entries.length\n\n // Batch process registry spec parsing (only for large graphs)\n // Only used for non-trivial graphs\n const registryVersionCache =\n nodeCount > 50 ? new Map<string, string>() : null\n\n for (const [id, lockfileNode] of entries) {\n const [\n flags,\n name,\n integrity,\n resolved,\n location,\n manifest,\n rawManifest,\n platform,\n bins,\n buildState,\n ] = lockfileNode\n // workspace nodes and the project root node are already part of the\n // graph and it should not create new nodes if an existing one is there\n if (graph.nodes.has(id)) continue\n\n const [type, filepath, maybeExtra, lastExtra] = splitDepID(id)\n const extra =\n type === 'registry' || type === 'git' ? lastExtra : maybeExtra\n const registrySpec = maybeExtra\n\n // The reference node is a node that matches the same id from the\n // current iterating node in the provided `actual` graph, this allows\n // for hydrating missing manifest, integrity, and resolved values\n // that may be missing from the lockfile\n const referenceNode = actual?.nodes.get(id)\n const mani = manifest ?? referenceNode?.manifest\n\n // Throw if manifest is missing and the option is enabled\n if (!mani && throwOnMissingManifest) {\n throw error(\n `Missing manifest for node ${id} and no reference node found.`,\n )\n }\n\n // Optimize registry version extraction with caching for large graphs\n let version: string | undefined\n if (\n type === 'registry' &&\n registrySpec &&\n registrySpec.indexOf('@') > 0\n ) {\n if (registryVersionCache) {\n const seenVersion = registryVersionCache.get(registrySpec)\n /* c8 ignore start */\n if (seenVersion) {\n version = seenVersion\n } else {\n version = registrySpec.split('@').slice(-1)[0] || undefined\n /* c8 ignore stop */\n if (version) {\n registryVersionCache.set(registrySpec, version)\n }\n }\n } else {\n version = registrySpec.split('@').slice(-1)[0] || undefined\n }\n }\n\n // if the lockfile has manifest data then it should just use that\n // otherwise tries to infer name / version value from the lockfile node\n const node =\n mani ?\n graph.addNode(id, mani)\n : graph.addNode(\n id,\n undefined,\n undefined,\n name ?? undefined,\n version,\n )\n\n if (extra) {\n const { modifier, peerSetHash } = splitExtra(extra)\n if (modifier) {\n node.modifier = modifier\n }\n if (peerSetHash) {\n node.peerSetHash = peerSetHash\n }\n }\n\n const { dev, optional } = getBooleanFlagsFromNum(flags)\n node.options = options\n node.dev = dev\n node.optional = optional\n node.integrity = integrity ?? referenceNode?.integrity\n node.resolved =\n type === 'remote' ? filepath : (\n (resolved ?? referenceNode?.resolved)\n )\n node.projectRoot = graph.projectRoot\n if (!node.resolved) node.setResolved()\n if (location) {\n node.location = location\n } else {\n // set the location to file dependencies based on the id value\n if (type === 'file') {\n node.location = filepath\n }\n }\n if (mani && rawManifest) {\n node.setConfusedManifest(mani, rawManifest)\n }\n\n // Set platform data if provided\n if (platform) {\n node.platform = platform\n }\n\n // optionally set bin data if provided\n if (bins) {\n node.bins = bins\n }\n\n // Set build state if provided\n if (buildState !== undefined && buildState !== null) {\n node.buildState = getBuildStateFromNum(buildState)\n }\n }\n}\n"]}
|
|
@@ -36,9 +36,9 @@ export type LoadOptions = SpecOptions & {
|
|
|
36
36
|
*/
|
|
37
37
|
scurry?: PathScurry;
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
39
|
+
* Whether to throw an error if a manifest is missing when loading nodes.
|
|
40
40
|
*/
|
|
41
|
-
|
|
41
|
+
throwOnMissingManifest?: boolean;
|
|
42
42
|
};
|
|
43
43
|
export declare const load: (options: LoadOptions) => Graph;
|
|
44
44
|
export declare const loadHidden: (options: LoadOptions) => Graph;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/lockfile/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAK7C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAA;IACd;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,EAAE,kBAAkB,CAAA;IAChC;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC,CAAA;AASD,eAAO,MAAM,IAAI,YAAa,WAAW,KAAG,KAM3C,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,WAAW,KAAG,KAQjD,CAAA;AAED,eAAO,MAAM,UAAU,YACZ,WAAW,gBACN,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,iBAAiB,CAAC,GAC7D,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC,UAgE7D,CAAA"}
|
|
@@ -14,14 +14,16 @@ export const load = (options) => {
|
|
|
14
14
|
};
|
|
15
15
|
export const loadHidden = (options) => {
|
|
16
16
|
const { projectRoot } = options;
|
|
17
|
+
// Ensure that missing manifests throw an error when loading hidden lockfiles
|
|
18
|
+
options.throwOnMissingManifest = true;
|
|
17
19
|
return loadObject(options, loadLockfile(projectRoot, 'node_modules/.vlt-lock.json'));
|
|
18
20
|
};
|
|
19
21
|
export const loadObject = (options, lockfileData) => {
|
|
20
|
-
const { mainManifest,
|
|
22
|
+
const { mainManifest, scurry } = options;
|
|
21
23
|
const packageJson = options.packageJson ?? new PackageJson();
|
|
22
24
|
const monorepo = options.monorepo ??
|
|
23
25
|
Monorepo.maybeLoad(options.projectRoot, { packageJson, scurry });
|
|
24
|
-
const { catalog = {}, catalogs = {},
|
|
26
|
+
const { catalog = {}, catalogs = {}, 'scope-registries': scopeRegistries, registry, registries, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives,
|
|
25
27
|
/* c8 ignore next */
|
|
26
28
|
} = lockfileData.options ?? {};
|
|
27
29
|
// Optimize options merging - only create new objects when needed
|
|
@@ -48,33 +50,8 @@ export const loadObject = (options, lockfileData) => {
|
|
|
48
50
|
mainManifest,
|
|
49
51
|
monorepo,
|
|
50
52
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
// recalculate the graph - useful for refreshing an ideal graph when
|
|
54
|
-
// modifiers are swapped.
|
|
55
|
-
// Optimize modifier comparison - avoid JSON.stringify for simple cases
|
|
56
|
-
let modifiersChanged = false;
|
|
57
|
-
if (skipLoadingNodesOnModifiersChange) {
|
|
58
|
-
const lockfileConfig = modifiersLockfileConfig ?? {};
|
|
59
|
-
const optionsConfig = modifiers?.config ?? {};
|
|
60
|
-
// Quick check for obvious differences
|
|
61
|
-
const lockfileKeys = Object.keys(lockfileConfig);
|
|
62
|
-
const optionsKeys = Object.keys(optionsConfig);
|
|
63
|
-
if (lockfileKeys.length !== optionsKeys.length) {
|
|
64
|
-
modifiersChanged = true;
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
// Only use JSON.stringify if we need deep comparison
|
|
68
|
-
const lockfileModifiers = JSON.stringify(lockfileConfig);
|
|
69
|
-
const optionsModifiers = JSON.stringify(optionsConfig);
|
|
70
|
-
modifiersChanged = lockfileModifiers !== optionsModifiers;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
const shouldLoadDependencies = !(skipLoadingNodesOnModifiersChange && modifiersChanged);
|
|
74
|
-
if (shouldLoadDependencies) {
|
|
75
|
-
loadNodes(graph, lockfileData.nodes, mergedOptions, options.actual);
|
|
76
|
-
loadEdges(graph, lockfileData.edges, mergedOptions);
|
|
77
|
-
}
|
|
53
|
+
loadNodes(graph, lockfileData.nodes, mergedOptions, options.actual, options.throwOnMissingManifest);
|
|
54
|
+
loadEdges(graph, lockfileData.edges, mergedOptions);
|
|
78
55
|
// hydrate missing node-level registry data
|
|
79
56
|
for (const node of graph.nodes.values()) {
|
|
80
57
|
const [firstEdge] = node.edgesIn;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/lockfile/load.ts"],"names":[],"mappings":"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","sourcesContent":["import { PackageJson } from '@vltpkg/package-json'\nimport { Monorepo } from '@vltpkg/workspaces'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { loadEdges } from './load-edges.ts'\nimport { loadNodes } from './load-nodes.ts'\nimport { Graph } from '../graph.ts'\nimport type { PathScurry } from 'path-scurry'\nimport type { NormalizedManifest } from '@vltpkg/types'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { LockfileData } from './types.ts'\nimport type { GraphModifier } from '../modifiers.ts'\n\nexport type LoadOptions = SpecOptions & {\n /**\n * An optional {@link Graph} object to hydrate extra data from.\n */\n actual?: Graph\n /**\n * The project root dirname.\n */\n projectRoot: string\n /**\n * The project root manifest.\n */\n mainManifest: NormalizedManifest\n /**\n * The graph modifiers helper object.\n */\n modifiers?: GraphModifier\n /**\n * A {@link Monorepo} object, for managing workspaces\n */\n monorepo?: Monorepo\n /**\n * A {@link PackageJson} object, for sharing manifest caches\n */\n packageJson?: PackageJson\n /**\n * A {@link PathScurry} object, for use in globs\n */\n scurry?: PathScurry\n /**\n * Whether to throw an error if a manifest is missing when loading nodes.\n */\n throwOnMissingManifest?: boolean\n}\n\nconst loadLockfile = (projectRoot: string, lockfilePath: string) =>\n JSON.parse(\n readFileSync(resolve(projectRoot, lockfilePath), {\n encoding: 'utf8',\n }),\n ) as LockfileData\n\nexport const load = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n return loadObject(\n options,\n loadLockfile(projectRoot, 'vlt-lock.json'),\n )\n}\n\nexport const loadHidden = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n // Ensure that missing manifests throw an error when loading hidden lockfiles\n options.throwOnMissingManifest = true\n return loadObject(\n options,\n loadLockfile(projectRoot, 'node_modules/.vlt-lock.json'),\n )\n}\n\nexport const loadObject = (\n options: LoadOptions,\n lockfileData: Omit<LockfileData, 'options' | 'lockfileVersion'> &\n Partial<Pick<LockfileData, 'options' | 'lockfileVersion'>>,\n) => {\n const { mainManifest, scurry } = options\n const packageJson = options.packageJson ?? new PackageJson()\n const monorepo =\n options.monorepo ??\n Monorepo.maybeLoad(options.projectRoot, { packageJson, scurry })\n const {\n catalog = {},\n catalogs = {},\n 'scope-registries': scopeRegistries,\n registry,\n registries,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n /* c8 ignore next */\n } = lockfileData.options ?? {}\n\n // Optimize options merging - only create new objects when needed\n const mergedOptions = {\n ...options,\n catalog,\n catalogs,\n 'scope-registries':\n scopeRegistries ?\n { ...options['scope-registries'], ...scopeRegistries }\n : options['scope-registries'],\n registry: registry ?? options.registry,\n registries:\n registries ?\n { ...options.registries, ...registries }\n : options.registries,\n 'git-hosts':\n gitHosts ?\n { ...options['git-hosts'], ...gitHosts }\n : options['git-hosts'],\n 'git-host-archives':\n gitHostArchives ?\n { ...options['git-host-archives'], ...gitHostArchives }\n : options['git-host-archives'],\n }\n const graph = new Graph({\n ...mergedOptions,\n mainManifest,\n monorepo,\n })\n loadNodes(\n graph,\n lockfileData.nodes,\n mergedOptions,\n options.actual,\n options.throwOnMissingManifest,\n )\n loadEdges(graph, lockfileData.edges, mergedOptions)\n\n // hydrate missing node-level registry data\n for (const node of graph.nodes.values()) {\n const [firstEdge] = node.edgesIn\n if (firstEdge?.spec.registry) {\n node.registry = firstEdge.spec.registry\n }\n }\n\n return graph\n}\n"]}
|
|
@@ -19,8 +19,12 @@ export type SaveOptions = SpecOptions & {
|
|
|
19
19
|
* Should it save build state data in the lockfile?
|
|
20
20
|
*/
|
|
21
21
|
saveBuildData?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Should it throw an error if a manifest is missing?
|
|
24
|
+
*/
|
|
25
|
+
throwOnMissingManifest?: boolean;
|
|
22
26
|
};
|
|
23
|
-
export declare const lockfileData: ({ graph, catalog, catalogs, "git-hosts": gitHosts, "git-host-archives": gitHostArchives, modifiers, registry, registries, saveManifests, saveBuildData, "scope-registries": scopeRegistries, "jsr-registries": jsrRegistries, }: SaveOptions) => LockfileData;
|
|
27
|
+
export declare const lockfileData: ({ graph, catalog, catalogs, "git-hosts": gitHosts, "git-host-archives": gitHostArchives, modifiers, registry, registries, saveManifests, saveBuildData, "scope-registries": scopeRegistries, "jsr-registries": jsrRegistries, throwOnMissingManifest, }: SaveOptions) => LockfileData;
|
|
24
28
|
export declare const saveData: (data: LockfileData, fileName: string, saveManifests?: boolean) => void;
|
|
25
29
|
export declare const save: (options: Omit<SaveOptions, "saveManifests">) => void;
|
|
26
30
|
export declare const saveHidden: (options: Omit<SaveOptions, "saveManifests" | "saveBuildData">) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/lockfile/save.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAGpD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC,CAAA;AAoHD,eAAO,MAAM,YAAY,4PActB,WAAW,KAAG,YA+DhB,CAAA;AAeD,eAAO,MAAM,QAAQ,SACb,YAAY,YACR,MAAM,8BAEf,IAIF,CAAA;AAED,eAAO,MAAM,IAAI,YACN,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,KAC1C,IAKF,CAAA;AAED,eAAO,MAAM,UAAU,YACZ,IAAI,CAAC,WAAW,EAAE,eAAe,GAAG,eAAe,CAAC,KAC5D,IAqBF,CAAA"}
|