@vltpkg/graph 1.0.0-rc.9 → 1.0.1

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.
Files changed (226) hide show
  1. package/README.md +101 -22
  2. package/dist/{esm/actual → actual}/load.d.ts +8 -1
  3. package/dist/{esm/actual → actual}/load.js +26 -6
  4. package/dist/{esm/browser.d.ts → browser.d.ts} +0 -1
  5. package/dist/{esm/browser.js → browser.js} +0 -1
  6. package/dist/{esm/build.d.ts → build.d.ts} +0 -1
  7. package/dist/{esm/build.js → build.js} +0 -1
  8. package/dist/{esm/dependencies.d.ts → dependencies.d.ts} +0 -1
  9. package/dist/{esm/dependencies.js → dependencies.js} +3 -2
  10. package/dist/{esm/diff.d.ts → diff.d.ts} +2 -1
  11. package/dist/{esm/diff.js → diff.js} +5 -2
  12. package/dist/{esm/edge.d.ts → edge.d.ts} +0 -1
  13. package/dist/{esm/edge.js → edge.js} +0 -1
  14. package/dist/{esm/fixup-added-names.d.ts → fixup-added-names.d.ts} +4 -2
  15. package/dist/{esm/fixup-added-names.js → fixup-added-names.js} +16 -1
  16. package/dist/{esm/graph.d.ts → graph.d.ts} +13 -1
  17. package/dist/{esm/graph.js → graph.js} +46 -11
  18. package/dist/{esm/ideal → ideal}/append-nodes.d.ts +14 -3
  19. package/dist/{esm/ideal → ideal}/append-nodes.js +244 -62
  20. package/dist/{esm/ideal → ideal}/build-ideal-from-starting-graph.d.ts +0 -1
  21. package/dist/{esm/ideal → ideal}/build-ideal-from-starting-graph.js +0 -1
  22. package/dist/{esm/ideal → ideal}/build.d.ts +0 -1
  23. package/dist/{esm/ideal → ideal}/build.js +11 -2
  24. package/dist/{esm/ideal → ideal}/get-importer-specs.d.ts +0 -1
  25. package/dist/{esm/ideal → ideal}/get-importer-specs.js +13 -2
  26. package/dist/ideal/peers.d.ts +160 -0
  27. package/dist/ideal/peers.js +696 -0
  28. package/dist/{esm/ideal → ideal}/refresh-ideal-graph.d.ts +0 -5
  29. package/dist/{esm/ideal → ideal}/refresh-ideal-graph.js +11 -26
  30. package/dist/{esm/ideal → ideal}/remove-satisfied-specs.d.ts +0 -1
  31. package/dist/{esm/ideal → ideal}/remove-satisfied-specs.js +8 -1
  32. package/dist/ideal/sorting.d.ts +45 -0
  33. package/dist/ideal/sorting.js +70 -0
  34. package/dist/{esm/ideal → ideal}/types.d.ts +1 -6
  35. package/dist/ideal/types.js +1 -0
  36. package/dist/{esm/index.d.ts → index.d.ts} +0 -1
  37. package/dist/{esm/index.js → index.js} +0 -1
  38. package/dist/{esm/install.d.ts → install.d.ts} +2 -1
  39. package/dist/{esm/install.js → install.js} +24 -4
  40. package/dist/{esm/lockfile → lockfile}/load-edges.d.ts +0 -1
  41. package/dist/{esm/lockfile → lockfile}/load-edges.js +16 -6
  42. package/dist/{esm/lockfile → lockfile}/load-nodes.d.ts +0 -1
  43. package/dist/{esm/lockfile → lockfile}/load-nodes.js +2 -2
  44. package/dist/{esm/lockfile → lockfile}/load.d.ts +0 -1
  45. package/dist/lockfile/load.js +171 -0
  46. package/dist/{esm/lockfile → lockfile}/save.d.ts +1 -2
  47. package/dist/{esm/lockfile → lockfile}/save.js +17 -11
  48. package/dist/{esm/lockfile → lockfile}/types.d.ts +7 -1
  49. package/dist/{esm/lockfile → lockfile}/types.js +6 -1
  50. package/dist/{esm/modifiers.d.ts → modifiers.d.ts} +0 -1
  51. package/dist/{esm/modifiers.js → modifiers.js} +0 -1
  52. package/dist/{esm/node.d.ts → node.d.ts} +2 -1
  53. package/dist/{esm/node.js → node.js} +5 -1
  54. package/dist/{esm/non-empty-list.d.ts → non-empty-list.d.ts} +0 -1
  55. package/dist/{esm/non-empty-list.js → non-empty-list.js} +0 -1
  56. package/dist/{esm/reify → reify}/add-edge.d.ts +0 -1
  57. package/dist/{esm/reify → reify}/add-edge.js +10 -4
  58. package/dist/{esm/reify → reify}/add-edges.d.ts +0 -1
  59. package/dist/{esm/reify → reify}/add-edges.js +0 -1
  60. package/dist/{esm/reify → reify}/add-nodes.d.ts +0 -1
  61. package/dist/{esm/reify → reify}/add-nodes.js +0 -1
  62. package/dist/{esm/reify → reify}/bin-chmod.d.ts +0 -1
  63. package/dist/{esm/reify → reify}/bin-chmod.js +0 -1
  64. package/dist/{esm/reify → reify}/build.d.ts +0 -1
  65. package/dist/{esm/reify → reify}/build.js +12 -4
  66. package/dist/{esm/reify → reify}/calculate-save-value.d.ts +1 -2
  67. package/dist/{esm/reify → reify}/calculate-save-value.js +11 -5
  68. package/dist/{esm/reify → reify}/check-needed-build.d.ts +10 -1
  69. package/dist/reify/check-needed-build.js +71 -0
  70. package/dist/{esm/reify → reify}/delete-edge.d.ts +0 -1
  71. package/dist/{esm/reify → reify}/delete-edge.js +0 -1
  72. package/dist/{esm/reify → reify}/delete-edges.d.ts +0 -1
  73. package/dist/{esm/reify → reify}/delete-edges.js +0 -1
  74. package/dist/{esm/reify → reify}/delete-nodes.d.ts +0 -1
  75. package/dist/{esm/reify → reify}/delete-nodes.js +0 -1
  76. package/dist/{esm/reify → reify}/extract-node.d.ts +0 -1
  77. package/dist/{esm/reify → reify}/extract-node.js +10 -3
  78. package/dist/{esm/reify → reify}/index.d.ts +3 -1
  79. package/dist/{esm/reify → reify}/index.js +25 -5
  80. package/dist/{esm/reify → reify}/internal-hoist.d.ts +0 -1
  81. package/dist/{esm/reify → reify}/internal-hoist.js +0 -1
  82. package/dist/{esm/reify → reify}/optional-fail.d.ts +0 -1
  83. package/dist/{esm/reify → reify}/optional-fail.js +0 -1
  84. package/dist/{esm/reify → reify}/rollback.d.ts +0 -1
  85. package/dist/{esm/reify → reify}/rollback.js +0 -1
  86. package/dist/{esm/reify → reify}/update-importers-package-json.d.ts +11 -2
  87. package/dist/{esm/reify → reify}/update-importers-package-json.js +4 -5
  88. package/dist/{esm/remove-optional-subgraph.d.ts → remove-optional-subgraph.d.ts} +0 -1
  89. package/dist/{esm/remove-optional-subgraph.js → remove-optional-subgraph.js} +0 -1
  90. package/dist/{esm/resolve-save-type.d.ts → resolve-save-type.d.ts} +0 -1
  91. package/dist/{esm/resolve-save-type.js → resolve-save-type.js} +0 -1
  92. package/dist/{esm/stringify-node.d.ts → stringify-node.d.ts} +0 -1
  93. package/dist/{esm/stringify-node.js → stringify-node.js} +0 -1
  94. package/dist/{esm/transfer-data → transfer-data}/load.d.ts +0 -1
  95. package/dist/{esm/transfer-data → transfer-data}/load.js +8 -5
  96. package/dist/{esm/uninstall.d.ts → uninstall.d.ts} +0 -1
  97. package/dist/{esm/uninstall.js → uninstall.js} +17 -7
  98. package/dist/{esm/update.d.ts → update.d.ts} +0 -1
  99. package/dist/{esm/update.js → update.js} +1 -1
  100. package/dist/{esm/virtual-root.d.ts → virtual-root.d.ts} +0 -1
  101. package/dist/{esm/virtual-root.js → virtual-root.js} +0 -1
  102. package/dist/{esm/visualization → visualization}/human-readable-output.d.ts +0 -1
  103. package/dist/{esm/visualization → visualization}/human-readable-output.js +0 -1
  104. package/dist/{esm/visualization → visualization}/json-output.d.ts +0 -1
  105. package/dist/{esm/visualization → visualization}/json-output.js +0 -1
  106. package/dist/{esm/visualization → visualization}/mermaid-output.d.ts +2 -2
  107. package/dist/{esm/visualization → visualization}/mermaid-output.js +27 -21
  108. package/dist/{esm/visualization → visualization}/object-like-output.d.ts +0 -1
  109. package/dist/{esm/visualization → visualization}/object-like-output.js +0 -1
  110. package/package.json +57 -62
  111. package/dist/esm/actual/load.d.ts.map +0 -1
  112. package/dist/esm/actual/load.js.map +0 -1
  113. package/dist/esm/browser.d.ts.map +0 -1
  114. package/dist/esm/browser.js.map +0 -1
  115. package/dist/esm/build.d.ts.map +0 -1
  116. package/dist/esm/build.js.map +0 -1
  117. package/dist/esm/dependencies.d.ts.map +0 -1
  118. package/dist/esm/dependencies.js.map +0 -1
  119. package/dist/esm/diff.d.ts.map +0 -1
  120. package/dist/esm/diff.js.map +0 -1
  121. package/dist/esm/edge.d.ts.map +0 -1
  122. package/dist/esm/edge.js.map +0 -1
  123. package/dist/esm/fixup-added-names.d.ts.map +0 -1
  124. package/dist/esm/fixup-added-names.js.map +0 -1
  125. package/dist/esm/graph.d.ts.map +0 -1
  126. package/dist/esm/graph.js.map +0 -1
  127. package/dist/esm/ideal/append-nodes.d.ts.map +0 -1
  128. package/dist/esm/ideal/append-nodes.js.map +0 -1
  129. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +0 -1
  130. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +0 -1
  131. package/dist/esm/ideal/build.d.ts.map +0 -1
  132. package/dist/esm/ideal/build.js.map +0 -1
  133. package/dist/esm/ideal/get-importer-specs.d.ts.map +0 -1
  134. package/dist/esm/ideal/get-importer-specs.js.map +0 -1
  135. package/dist/esm/ideal/get-ordered-dependencies.d.ts +0 -10
  136. package/dist/esm/ideal/get-ordered-dependencies.d.ts.map +0 -1
  137. package/dist/esm/ideal/get-ordered-dependencies.js +0 -42
  138. package/dist/esm/ideal/get-ordered-dependencies.js.map +0 -1
  139. package/dist/esm/ideal/peers.d.ts +0 -71
  140. package/dist/esm/ideal/peers.d.ts.map +0 -1
  141. package/dist/esm/ideal/peers.js +0 -318
  142. package/dist/esm/ideal/peers.js.map +0 -1
  143. package/dist/esm/ideal/refresh-ideal-graph.d.ts.map +0 -1
  144. package/dist/esm/ideal/refresh-ideal-graph.js.map +0 -1
  145. package/dist/esm/ideal/remove-satisfied-specs.d.ts.map +0 -1
  146. package/dist/esm/ideal/remove-satisfied-specs.js.map +0 -1
  147. package/dist/esm/ideal/types.d.ts.map +0 -1
  148. package/dist/esm/ideal/types.js +0 -2
  149. package/dist/esm/ideal/types.js.map +0 -1
  150. package/dist/esm/index.d.ts.map +0 -1
  151. package/dist/esm/index.js.map +0 -1
  152. package/dist/esm/install.d.ts.map +0 -1
  153. package/dist/esm/install.js.map +0 -1
  154. package/dist/esm/lockfile/load-edges.d.ts.map +0 -1
  155. package/dist/esm/lockfile/load-edges.js.map +0 -1
  156. package/dist/esm/lockfile/load-nodes.d.ts.map +0 -1
  157. package/dist/esm/lockfile/load-nodes.js.map +0 -1
  158. package/dist/esm/lockfile/load.d.ts.map +0 -1
  159. package/dist/esm/lockfile/load.js +0 -64
  160. package/dist/esm/lockfile/load.js.map +0 -1
  161. package/dist/esm/lockfile/save.d.ts.map +0 -1
  162. package/dist/esm/lockfile/save.js.map +0 -1
  163. package/dist/esm/lockfile/types.d.ts.map +0 -1
  164. package/dist/esm/lockfile/types.js.map +0 -1
  165. package/dist/esm/modifiers.d.ts.map +0 -1
  166. package/dist/esm/modifiers.js.map +0 -1
  167. package/dist/esm/node.d.ts.map +0 -1
  168. package/dist/esm/node.js.map +0 -1
  169. package/dist/esm/non-empty-list.d.ts.map +0 -1
  170. package/dist/esm/non-empty-list.js.map +0 -1
  171. package/dist/esm/package.json +0 -3
  172. package/dist/esm/reify/add-edge.d.ts.map +0 -1
  173. package/dist/esm/reify/add-edge.js.map +0 -1
  174. package/dist/esm/reify/add-edges.d.ts.map +0 -1
  175. package/dist/esm/reify/add-edges.js.map +0 -1
  176. package/dist/esm/reify/add-nodes.d.ts.map +0 -1
  177. package/dist/esm/reify/add-nodes.js.map +0 -1
  178. package/dist/esm/reify/bin-chmod.d.ts.map +0 -1
  179. package/dist/esm/reify/bin-chmod.js.map +0 -1
  180. package/dist/esm/reify/build.d.ts.map +0 -1
  181. package/dist/esm/reify/build.js.map +0 -1
  182. package/dist/esm/reify/calculate-save-value.d.ts.map +0 -1
  183. package/dist/esm/reify/calculate-save-value.js.map +0 -1
  184. package/dist/esm/reify/check-needed-build.d.ts.map +0 -1
  185. package/dist/esm/reify/check-needed-build.js +0 -50
  186. package/dist/esm/reify/check-needed-build.js.map +0 -1
  187. package/dist/esm/reify/delete-edge.d.ts.map +0 -1
  188. package/dist/esm/reify/delete-edge.js.map +0 -1
  189. package/dist/esm/reify/delete-edges.d.ts.map +0 -1
  190. package/dist/esm/reify/delete-edges.js.map +0 -1
  191. package/dist/esm/reify/delete-nodes.d.ts.map +0 -1
  192. package/dist/esm/reify/delete-nodes.js.map +0 -1
  193. package/dist/esm/reify/extract-node.d.ts.map +0 -1
  194. package/dist/esm/reify/extract-node.js.map +0 -1
  195. package/dist/esm/reify/index.d.ts.map +0 -1
  196. package/dist/esm/reify/index.js.map +0 -1
  197. package/dist/esm/reify/internal-hoist.d.ts.map +0 -1
  198. package/dist/esm/reify/internal-hoist.js.map +0 -1
  199. package/dist/esm/reify/optional-fail.d.ts.map +0 -1
  200. package/dist/esm/reify/optional-fail.js.map +0 -1
  201. package/dist/esm/reify/rollback.d.ts.map +0 -1
  202. package/dist/esm/reify/rollback.js.map +0 -1
  203. package/dist/esm/reify/update-importers-package-json.d.ts.map +0 -1
  204. package/dist/esm/reify/update-importers-package-json.js.map +0 -1
  205. package/dist/esm/remove-optional-subgraph.d.ts.map +0 -1
  206. package/dist/esm/remove-optional-subgraph.js.map +0 -1
  207. package/dist/esm/resolve-save-type.d.ts.map +0 -1
  208. package/dist/esm/resolve-save-type.js.map +0 -1
  209. package/dist/esm/stringify-node.d.ts.map +0 -1
  210. package/dist/esm/stringify-node.js.map +0 -1
  211. package/dist/esm/transfer-data/load.d.ts.map +0 -1
  212. package/dist/esm/transfer-data/load.js.map +0 -1
  213. package/dist/esm/uninstall.d.ts.map +0 -1
  214. package/dist/esm/uninstall.js.map +0 -1
  215. package/dist/esm/update.d.ts.map +0 -1
  216. package/dist/esm/update.js.map +0 -1
  217. package/dist/esm/virtual-root.d.ts.map +0 -1
  218. package/dist/esm/virtual-root.js.map +0 -1
  219. package/dist/esm/visualization/human-readable-output.d.ts.map +0 -1
  220. package/dist/esm/visualization/human-readable-output.js.map +0 -1
  221. package/dist/esm/visualization/json-output.d.ts.map +0 -1
  222. package/dist/esm/visualization/json-output.js.map +0 -1
  223. package/dist/esm/visualization/mermaid-output.d.ts.map +0 -1
  224. package/dist/esm/visualization/mermaid-output.js.map +0 -1
  225. package/dist/esm/visualization/object-like-output.d.ts.map +0 -1
  226. package/dist/esm/visualization/object-like-output.js.map +0 -1
@@ -27,10 +27,19 @@ export type UpdatePackageJsonOptions = {
27
27
  * instance used to load these `package.json` files previously.
28
28
  */
29
29
  packageJson: PackageJson;
30
+ /**
31
+ * When true, save dependencies with exact versions (e.g. `1.2.3`)
32
+ * instead of the default semver range operator (e.g. `^1.2.3`).
33
+ */
34
+ saveExact?: boolean;
35
+ /**
36
+ * The prefix to use when saving dependency versions (e.g. `^`, `~`, `>=`, ``).
37
+ * Defaults to `^` if not specified. Ignored when `saveExact` is true.
38
+ */
39
+ savePrefix?: string;
30
40
  };
31
41
  /**
32
42
  * Updates nodes of a provided {@link Graph} accordingly to the
33
43
  * provided add or remove arguments.
34
44
  */
35
- export declare const updatePackageJson: ({ add, graph, packageJson, remove, }: UpdatePackageJsonOptions) => () => void;
36
- //# sourceMappingURL=update-importers-package-json.d.ts.map
45
+ export declare const updatePackageJson: ({ add, graph, packageJson, remove, saveExact, savePrefix, }: UpdatePackageJsonOptions) => () => void;
@@ -10,7 +10,7 @@ const depTypesMap = new Map([
10
10
  ['peerOptional', 'peerDependencies'],
11
11
  ['optional', 'optionalDependencies'],
12
12
  ]);
13
- const addOrRemoveDeps = (nodeId, graph, addOrRemove) => {
13
+ const addOrRemoveDeps = (nodeId, graph, addOrRemove, saveExact, savePrefix) => {
14
14
  const node = graph.nodes.get(nodeId);
15
15
  if (!node) {
16
16
  throw error('Failed to retrieve node', {
@@ -86,7 +86,7 @@ const addOrRemoveDeps = (nodeId, graph, addOrRemove) => {
86
86
  // If the manifest does not contain anything, then update it.
87
87
  // Only for registry dependencies
88
88
  const existing = dependencies[name];
89
- const saveValue = calculateSaveValue(nodeType, dep.spec, existing, n.version);
89
+ const saveValue = calculateSaveValue(nodeType, dep.spec, existing, n.version, saveExact, savePrefix);
90
90
  dependencies[name] = saveValue;
91
91
  manifestChanged = manifestChanged || saveValue !== existing;
92
92
  }
@@ -97,7 +97,7 @@ const addOrRemoveDeps = (nodeId, graph, addOrRemove) => {
97
97
  * Updates nodes of a provided {@link Graph} accordingly to the
98
98
  * provided add or remove arguments.
99
99
  */
100
- export const updatePackageJson = ({ add, graph, packageJson, remove, }) => {
100
+ export const updatePackageJson = ({ add, graph, packageJson, remove, saveExact, savePrefix, }) => {
101
101
  const manifestsToUpdate = new Set();
102
102
  const operations = new Set([add, remove]);
103
103
  for (const operation of operations) {
@@ -106,7 +106,7 @@ export const updatePackageJson = ({ add, graph, packageJson, remove, }) => {
106
106
  // that are nested folders from which the user can also add new
107
107
  // dependencies to
108
108
  for (const nodeId of operation.keys()) {
109
- const manifest = addOrRemoveDeps(nodeId, graph, operation);
109
+ const manifest = addOrRemoveDeps(nodeId, graph, operation, saveExact, savePrefix);
110
110
  if (manifest) {
111
111
  manifestsToUpdate.add(manifest);
112
112
  }
@@ -120,4 +120,3 @@ export const updatePackageJson = ({ add, graph, packageJson, remove, }) => {
120
120
  };
121
121
  return commit;
122
122
  };
123
- //# sourceMappingURL=update-importers-package-json.js.map
@@ -31,4 +31,3 @@ export declare function findOptionalSubgraph(node: Node & {
31
31
  }>): Generator<Node & {
32
32
  optional: true;
33
33
  }, void>;
34
- //# sourceMappingURL=remove-optional-subgraph.d.ts.map
@@ -45,4 +45,3 @@ export function* findOptionalSubgraph(node, seen = new Set()) {
45
45
  }
46
46
  }
47
47
  }
48
- //# sourceMappingURL=remove-optional-subgraph.js.map
@@ -3,4 +3,3 @@ import type { DependencySaveType, DependencyTypeShort, NodeLike } from '@vltpkg/
3
3
  * Resolve a {@link DependencySaveType} to a {@link DependencyTypeShort}
4
4
  */
5
5
  export declare const resolveSaveType: (node: NodeLike, name: string, saveType: DependencySaveType) => DependencyTypeShort;
6
- //# sourceMappingURL=resolve-save-type.d.ts.map
@@ -2,4 +2,3 @@
2
2
  * Resolve a {@link DependencySaveType} to a {@link DependencyTypeShort}
3
3
  */
4
4
  export const resolveSaveType = (node, name, saveType) => saveType !== 'implicit' ? saveType : ((node.edgesOut.get(name)?.type ?? 'prod'));
5
- //# sourceMappingURL=resolve-save-type.js.map
@@ -1,3 +1,2 @@
1
1
  import type { NodeLike } from '@vltpkg/types';
2
2
  export declare const stringifyNode: (node?: NodeLike) => string;
3
- //# sourceMappingURL=stringify-node.d.ts.map
@@ -30,4 +30,3 @@ export const stringifyNode = (node) => {
30
30
  return `${type}(${ref})${nameVersion}`;
31
31
  }
32
32
  };
33
- //# sourceMappingURL=stringify-node.js.map
@@ -41,4 +41,3 @@ export type TransferData = {
41
41
  securityArchive?: any;
42
42
  };
43
43
  export declare const load: (transfered: TransferData) => LoadResult;
44
- //# sourceMappingURL=load.d.ts.map
@@ -1,23 +1,27 @@
1
1
  import { error } from '@vltpkg/error-cause';
2
2
  import { SecurityArchive } from '@vltpkg/security-archive/browser';
3
- import { defaultGitHostArchives, defaultGitHosts, defaultRegistries, defaultRegistry, defaultScopeRegistries, } from '@vltpkg/spec/browser';
3
+ import { defaultGitHostArchives, defaultGitHosts, defaultRegistries, defaultRegistryName, defaultScopeRegistries, } from '@vltpkg/spec/browser';
4
4
  import { stringifyNode } from "../stringify-node.js";
5
5
  import { loadEdges } from "../lockfile/load-edges.js";
6
6
  import { loadNodes } from "../lockfile/load-nodes.js";
7
7
  const loadSpecOptions = (lockfile) => {
8
- const { catalog = {}, catalogs = {}, registries, registry, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, 'scope-registries': scopeRegistries, 'jsr-registries': jsrRegistries, } = lockfile.options;
8
+ const { catalog = {}, catalogs = {}, registries, registry, 'default-registry-alias': defaultRegistryAlias, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, 'scoped-registries': scopedRegistriesOption, 'jsr-registries': jsrRegistries, } = lockfile.options;
9
+ // backwards-compat: legacy lockfiles wrote this field as `scope-registries`
10
+ const scopeRegistries = scopedRegistriesOption ??
11
+ lockfile.options['scope-registries'];
9
12
  return {
10
13
  catalog,
11
14
  catalogs,
12
15
  registries: { ...defaultRegistries, ...registries },
13
- registry: registry || defaultRegistry,
16
+ registry,
17
+ 'default-registry-alias': defaultRegistryAlias ?? defaultRegistryName,
14
18
  'jsr-registries': { ...jsrRegistries },
15
19
  'git-hosts': { ...defaultGitHosts, ...gitHosts },
16
20
  'git-host-archives': {
17
21
  ...defaultGitHostArchives,
18
22
  ...gitHostArchives,
19
23
  },
20
- 'scope-registries': {
24
+ 'scoped-registries': {
21
25
  ...defaultScopeRegistries,
22
26
  ...scopeRegistries,
23
27
  },
@@ -173,4 +177,3 @@ export const load = (transfered) => {
173
177
  securityArchive,
174
178
  };
175
179
  };
176
- //# sourceMappingURL=load.js.map
@@ -12,4 +12,3 @@ export declare const uninstall: (options: UninstallOptions, remove?: RemoveImpor
12
12
  graph: import("./graph.ts").Graph;
13
13
  diff: import("./reify/index.ts").ReifyResult;
14
14
  }>;
15
- //# sourceMappingURL=uninstall.d.ts.map
@@ -12,22 +12,33 @@ export const uninstall = async (options, remove) => {
12
12
  const modifiers = GraphModifier.maybeLoad(options);
13
13
  const remover = new RollbackRemove();
14
14
  try {
15
- const graph = await idealBuild({
15
+ // Load the actual graph before building the ideal graph so that
16
+ // manifest data from installed packages can be used to hydrate
17
+ // nodes loaded from the lockfile. Without this, nodes loaded from
18
+ // vlt-lock.json (which does not store manifests) will be missing
19
+ // manifest data, causing the hidden lockfile save to silently fail
20
+ // due to throwOnMissingManifest and leaving stale entries behind.
21
+ const act = actualLoad({
16
22
  ...options,
17
- remove,
23
+ modifiers: undefined,
18
24
  mainManifest,
19
25
  loadManifests: true,
20
- remover,
21
26
  });
22
- const act = actualLoad({
27
+ const graph = await idealBuild({
23
28
  ...options,
29
+ actual: act,
30
+ remove,
24
31
  mainManifest,
25
32
  loadManifests: true,
33
+ remover,
26
34
  });
27
35
  // If lockfileOnly is enabled, skip reify and only save the lockfile
28
36
  if (options.lockfileOnly) {
29
- // Save only the main lockfile, skip all filesystem operations
30
- lockfile.save({ graph, modifiers });
37
+ // Save only the main lockfile, skip all filesystem operations.
38
+ // Spread `options` so that spec-level config (registry,
39
+ // scoped-registries, git-hosts, catalogs, etc.) round-trips
40
+ // through the lockfile. See vltpkg/vltpkg#1580.
41
+ lockfile.save({ ...options, graph, modifiers });
31
42
  const saveImportersPackageJson =
32
43
  /* c8 ignore next */
33
44
  remove?.modifiedDependencies ?
@@ -65,4 +76,3 @@ export const uninstall = async (options, remove) => {
65
76
  }
66
77
  /* c8 ignore stop */
67
78
  };
68
- //# sourceMappingURL=uninstall.js.map
@@ -10,4 +10,3 @@ export declare const update: (options: UpdateOptions) => Promise<{
10
10
  graph: Graph;
11
11
  diff: import("./diff.ts").Diff;
12
12
  }>;
13
- //# sourceMappingURL=update.d.ts.map
@@ -52,6 +52,7 @@ export const update = async (options) => {
52
52
  loadManifests: true,
53
53
  modifiers,
54
54
  remover,
55
+ update: true,
55
56
  });
56
57
  return { buildQueue, graph, diff };
57
58
  /* c8 ignore start */
@@ -70,4 +71,3 @@ export const update = async (options) => {
70
71
  }
71
72
  /* c8 ignore stop */
72
73
  };
73
- //# sourceMappingURL=update.js.map
@@ -13,4 +13,3 @@ export declare const VIRTUAL_ROOT_ID: import("@vltpkg/dep-id/browser").DepID;
13
13
  * Returns undefined if a virtual root is not needed.
14
14
  */
15
15
  export declare const createVirtualRoot: (name: string | undefined, options: SpecOptions, mainImporters: NodeLike[]) => NodeLike | undefined;
16
- //# sourceMappingURL=virtual-root.d.ts.map
@@ -76,4 +76,3 @@ export const createVirtualRoot = (name = 'virtual-root', options, mainImporters)
76
76
  }
77
77
  return res;
78
78
  };
79
- //# sourceMappingURL=virtual-root.js.map
@@ -24,4 +24,3 @@ export type TreeMap = Map<EdgeLike | undefined, EdgeMap>;
24
24
  export declare function humanReadableOutput(options: HumanReadableOutputGraph, { colors }: {
25
25
  colors?: boolean;
26
26
  }): string;
27
- //# sourceMappingURL=human-readable-output.d.ts.map
@@ -161,4 +161,3 @@ export function humanReadableOutput(options, { colors }) {
161
161
  }
162
162
  return reset(res);
163
163
  }
164
- //# sourceMappingURL=human-readable-output.js.map
@@ -39,4 +39,3 @@ export type JSONOutputGraph = {
39
39
  * Returns a JSON string representation of the graph.
40
40
  */
41
41
  export declare function jsonOutput({ edges, nodes, importers, }: JSONOutputGraph): JSONOutputItem[];
42
- //# sourceMappingURL=json-output.d.ts.map
@@ -48,4 +48,3 @@ export function jsonOutput({ edges, nodes, importers, }) {
48
48
  }
49
49
  return res;
50
50
  }
51
- //# sourceMappingURL=json-output.js.map
@@ -3,6 +3,7 @@ export type MermaidOutputGraph = {
3
3
  edges: EdgeLike[];
4
4
  importers: Set<NodeLike>;
5
5
  nodes: NodeLike[];
6
+ highlightSelection?: boolean;
6
7
  };
7
8
  /**
8
9
  * Generates a short identifier for a given index following the pattern:
@@ -13,5 +14,4 @@ export declare function generateShortId(index: number): string;
13
14
  /**
14
15
  * Returns a mermaid string representation of the graph.
15
16
  */
16
- export declare function mermaidOutput({ edges, importers, nodes, }: MermaidOutputGraph): string;
17
- //# sourceMappingURL=mermaid-output.d.ts.map
17
+ export declare function mermaidOutput(options: MermaidOutputGraph): string;
@@ -1,6 +1,8 @@
1
1
  import { Edge } from "../edge.js";
2
2
  import { Node } from "../node.js";
3
3
  let missingCount = 0;
4
+ const isSelected = (options, edge, node) => (!node || options.nodes.includes(node)) &&
5
+ /* c8 ignore next */ (!edge || options.edges.includes(edge));
4
6
  /**
5
7
  * Generates a short identifier for a given index following the pattern:
6
8
  * 0 -> a, 1 -> b, ..., 25 -> z, 26 -> A, ..., 51 -> Z, 52 -> aa, 53 -> ab, etc.
@@ -58,29 +60,35 @@ function createDepIdMapping(importers) {
58
60
  * been labeled. This tracking is shared across multiple importers to prevent duplicate
59
61
  * labels in the output.
60
62
  */
61
- const nodeRef = (node, labeledNodes, depIdMapping) => {
63
+ const nodeRef = (node, labeledNodes, depIdMapping, options) => {
62
64
  const shortId = depIdMapping.get(node.id) /* c8 ignore next - should not be possible */ ?? '';
65
+ const selectedClass = (options.highlightSelection &&
66
+ isSelected(options, undefined, node)) ?
67
+ ':::a'
68
+ : '';
63
69
  if (labeledNodes.has(node.id)) {
64
- return shortId;
70
+ return shortId + selectedClass;
65
71
  }
66
72
  labeledNodes.add(node.id);
67
- return `${shortId}("${String(node).replaceAll('@', '#64;')}")`;
73
+ return `${shortId}("${String(node).replaceAll('@', '#64;')}")${selectedClass}`;
68
74
  };
69
- function parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, node, isImporter = false) {
75
+ function parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options, node, isImporter = false) {
70
76
  if (seenNodes.has(node.id) || !includedItems.get(node)) {
71
77
  return '';
72
78
  }
73
79
  seenNodes.add(node.id);
74
80
  // For importers, render the node label first as a standalone line before processing edges,
75
81
  // since they appear at the top of the graph. Non-importer nodes are labeled inline as part of edge definitions.
76
- const nodeLabel = isImporter ? nodeRef(node, labeledNodes, depIdMapping) : '';
82
+ const nodeLabel = isImporter ?
83
+ nodeRef(node, labeledNodes, depIdMapping, options)
84
+ : '';
77
85
  // Include both regular edges and workspace edges (if any)
78
86
  const allEdges = [
79
87
  ...node.edgesOut.values(),
80
88
  ...(node.workspaces?.values() ?? []),
81
89
  ];
82
90
  const edges = allEdges
83
- .map(e => parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, e))
91
+ .map(e => parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, options, e))
84
92
  .filter(Boolean)
85
93
  .join('\n');
86
94
  // Only render node standalone for importers, others are rendered as part of edges
@@ -90,12 +98,12 @@ function parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, node, i
90
98
  }
91
99
  return edges;
92
100
  }
93
- function parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, edge) {
101
+ function parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, options, edge) {
94
102
  if (!includedItems.get(edge)) {
95
103
  return '';
96
104
  }
97
105
  const edgeType = edge.type === 'prod' ? '' : ` (${edge.type})`;
98
- const edgeResult = nodeRef(edge.from, labeledNodes, depIdMapping) +
106
+ const edgeResult = nodeRef(edge.from, labeledNodes, depIdMapping, options) +
99
107
  ` -->|"${String(edge.spec).replaceAll('@', '#64;')}${edgeType}"| `;
100
108
  const missingLabel = edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing';
101
109
  if (!edge.to) {
@@ -103,14 +111,15 @@ function parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, edge) {
103
111
  }
104
112
  // Label the target node first so that if it's referenced again later in the graph,
105
113
  // it will use the short identifier instead of repeating the full label.
106
- const toRef = nodeRef(edge.to, labeledNodes, depIdMapping);
107
- const childEdges = parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, edge.to);
114
+ const toRef = nodeRef(edge.to, labeledNodes, depIdMapping, options);
115
+ const childEdges = parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options, edge.to);
108
116
  return edgeResult + toRef + (childEdges ? '\n' + childEdges : '');
109
117
  }
110
118
  /**
111
119
  * Returns a mermaid string representation of the graph.
112
120
  */
113
- export function mermaidOutput({ edges, importers, nodes, }) {
121
+ export function mermaidOutput(options) {
122
+ const { edges, importers, nodes, highlightSelection } = options;
114
123
  const seen = new Set();
115
124
  const includedItems = new Map();
116
125
  const traverse = new Set([...importers].map(i => ({ self: i, parent: undefined })));
@@ -119,10 +128,7 @@ export function mermaidOutput({ edges, importers, nodes, }) {
119
128
  continue;
120
129
  seen.add(item.self);
121
130
  if (item.self instanceof Edge) {
122
- // Workspace edges are stored in mainImporter.workspaces and not in graph.edges,
123
- // so we need to check for workspace spec type to always include them
124
- if (edges.includes(item.self) ||
125
- item.self.spec.type === 'workspace') {
131
+ if (edges.includes(item.self)) {
126
132
  includedItems.set(item.self, true);
127
133
  }
128
134
  if (item.self.to) {
@@ -155,10 +161,10 @@ export function mermaidOutput({ edges, importers, nodes, }) {
155
161
  const labeledNodes = new Set();
156
162
  // Track nodes that have been processed (shared across all importers to avoid duplicates)
157
163
  const seenNodes = new Set();
158
- return ('flowchart TD\n' +
159
- [...importers]
160
- .map(i => parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, i, true))
161
- .filter(Boolean)
162
- .join('\n'));
164
+ const graphOutput = [...importers]
165
+ .map(i => parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options, i, true))
166
+ .filter(Boolean)
167
+ .join('\n');
168
+ const styleDefinition = highlightSelection ? '\nclassDef a fill:gold,color:#242424' : '';
169
+ return 'flowchart TD\n' + graphOutput + styleDefinition;
163
170
  }
164
- //# sourceMappingURL=mermaid-output.js.map
@@ -1,3 +1,2 @@
1
1
  import type { GraphLike } from '@vltpkg/types';
2
2
  export declare function objectLikeOutput(graph: GraphLike): string;
3
- //# sourceMappingURL=object-like-output.d.ts.map
@@ -45,4 +45,3 @@ export function objectLikeOutput(graph) {
45
45
  const importers = [...graph.importers];
46
46
  return inspect(importers.map(i => parseNode(seenNodes, graph, i)), { depth: Infinity });
47
47
  }
48
- //# sourceMappingURL=object-like-output.js.map
package/package.json CHANGED
@@ -1,99 +1,94 @@
1
1
  {
2
2
  "name": "@vltpkg/graph",
3
3
  "description": "A library that helps understanding & expressing what happens on an install",
4
- "version": "1.0.0-rc.9",
4
+ "version": "1.0.1",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/vltpkg/vltpkg.git",
8
8
  "directory": "src/graph"
9
9
  },
10
- "author": "vlt technology inc. <support@vlt.sh> (http://vlt.sh)",
11
- "tshy": {
12
- "selfLink": false,
13
- "liveDev": true,
14
- "dialects": [
15
- "esm"
16
- ],
17
- "exports": {
18
- "./package.json": "./package.json",
19
- ".": "./src/index.ts",
20
- "./browser": "./src/browser.ts"
21
- }
10
+ "author": {
11
+ "name": "vlt technology inc.",
12
+ "email": "support@vlt.sh",
13
+ "url": "http://vlt.sh"
22
14
  },
23
15
  "dependencies": {
24
- "graph-run": "^1.1.0",
25
- "path-scurry": "^2.0.0",
26
- "promise-call-limit": "^3.0.2",
27
- "@vltpkg/cmd-shim": "1.0.0-rc.9",
28
- "@vltpkg/dss-breadcrumb": "1.0.0-rc.9",
29
- "@vltpkg/dep-id": "1.0.0-rc.9",
30
- "@vltpkg/error-cause": "1.0.0-rc.9",
31
- "@vltpkg/fast-split": "1.0.0-rc.9",
32
- "@vltpkg/init": "1.0.0-rc.9",
33
- "@vltpkg/package-info": "1.0.0-rc.9",
34
- "@vltpkg/package-json": "1.0.0-rc.9",
35
- "@vltpkg/output": "1.0.0-rc.9",
36
- "@vltpkg/pick-manifest": "1.0.0-rc.9",
37
- "@vltpkg/query": "1.0.0-rc.9",
38
- "@vltpkg/satisfies": "1.0.0-rc.9",
39
- "@vltpkg/rollback-remove": "1.0.0-rc.9",
40
- "@vltpkg/security-archive": "1.0.0-rc.9",
41
- "@vltpkg/spec": "1.0.0-rc.9",
42
- "@vltpkg/run": "1.0.0-rc.9",
43
- "@vltpkg/types": "1.0.0-rc.9",
44
- "@vltpkg/vlt-json": "1.0.0-rc.9",
45
- "@vltpkg/workspaces": "1.0.0-rc.9"
16
+ "@vltpkg/cmd-shim": "1.0.1",
17
+ "@vltpkg/dep-id": "1.0.1",
18
+ "@vltpkg/dss-breadcrumb": "1.0.1",
19
+ "@vltpkg/error-cause": "1.0.1",
20
+ "@vltpkg/fast-split": "1.0.1",
21
+ "@vltpkg/graph-run": "1.0.1",
22
+ "@vltpkg/init": "1.0.1",
23
+ "@vltpkg/output": "1.0.1",
24
+ "@vltpkg/package-info": "1.0.1",
25
+ "@vltpkg/package-json": "1.0.1",
26
+ "@vltpkg/pick-manifest": "1.0.1",
27
+ "@vltpkg/query": "1.0.1",
28
+ "@vltpkg/rollback-remove": "1.0.1",
29
+ "@vltpkg/run": "1.0.1",
30
+ "@vltpkg/satisfies": "1.0.1",
31
+ "@vltpkg/security-archive": "1.0.1",
32
+ "@vltpkg/spec": "1.0.1",
33
+ "@vltpkg/types": "1.0.1",
34
+ "@vltpkg/vlt-json": "1.0.1",
35
+ "@vltpkg/workspaces": "1.0.1",
36
+ "path-scurry": "^2.0.1",
37
+ "promise-call-limit": "^3.0.2"
46
38
  },
47
39
  "devDependencies": {
48
- "@eslint/js": "^9.34.0",
49
- "@types/node": "^22.17.2",
50
- "eslint": "^9.34.0",
51
- "prettier": "^3.6.2",
52
- "tap": "^21.1.0",
53
- "tar": "^7.4.3",
54
- "tshy": "^3.0.2",
40
+ "@eslint/js": "^9.39.1",
41
+ "@types/node": "^22.19.2",
42
+ "eslint": "^9.39.1",
43
+ "prettier": "^3.7.4",
44
+ "tap": "^21.5.0",
45
+ "tar": "^7.5.2",
55
46
  "typedoc": "~0.27.9",
56
47
  "typescript": "5.7.3",
57
- "typescript-eslint": "^8.40.0",
58
- "@vltpkg/vlt-json": "1.0.0-rc.9"
48
+ "typescript-eslint": "^8.49.0"
59
49
  },
60
50
  "license": "BSD-2-Clause-Patent",
61
51
  "engines": {
62
- "node": ">=22"
52
+ "node": ">=22.22.0"
53
+ },
54
+ "scripts": {
55
+ "format": "prettier --write . --log-level warn --ignore-path ../../.prettierignore --cache",
56
+ "format:check": "prettier --check . --ignore-path ../../.prettierignore --cache",
57
+ "lint": "eslint . --fix",
58
+ "lint:check": "eslint .",
59
+ "prepack": "tsc -p tsconfig.publish.json && ../../scripts/update-dist-exports.ts",
60
+ "snap": "tap",
61
+ "test": "tap",
62
+ "posttest": "tsc --noEmit",
63
+ "typecheck": "tsc --noEmit"
63
64
  },
64
65
  "tap": {
65
66
  "extends": "../../tap-config.yaml"
66
67
  },
67
68
  "prettier": "../../.prettierrc.js",
68
- "module": "./dist/esm/index.js",
69
+ "module": "./dist/index.js",
69
70
  "type": "module",
70
71
  "exports": {
71
72
  "./package.json": "./package.json",
72
73
  ".": {
73
74
  "import": {
74
- "types": "./dist/esm/index.d.ts",
75
- "default": "./dist/esm/index.js"
75
+ "default": "./dist/index.js"
76
76
  }
77
77
  },
78
78
  "./browser": {
79
79
  "import": {
80
- "types": "./dist/esm/browser.d.ts",
81
- "default": "./dist/esm/browser.js"
80
+ "default": "./dist/browser.js"
82
81
  }
83
82
  }
84
83
  },
85
84
  "files": [
86
85
  "dist"
87
86
  ],
88
- "scripts": {
89
- "format": "prettier --write . --log-level warn --ignore-path ../../.prettierignore --cache",
90
- "format:check": "prettier --check . --ignore-path ../../.prettierignore --cache",
91
- "lint": "eslint . --fix",
92
- "lint:check": "eslint .",
93
- "snap": "tap",
94
- "test": "tap",
95
- "posttest": "tsc --noEmit",
96
- "tshy": "tshy",
97
- "typecheck": "tsc --noEmit"
98
- }
99
- }
87
+ "bugs": [
88
+ {
89
+ "type": "link",
90
+ "url": "https://github.com/vltpkg/vltpkg/issues"
91
+ }
92
+ ],
93
+ "homepage": "https://github.com/vltpkg/vltpkg/tree/main/src/graph#readme"
94
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/actual/load.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAQnC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEnD,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,iBAAiB,CAAA;AAGxB,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,WAAW,CAAA;IACxB;;OAEG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;OAEG;IACH,iCAAiC,CAAC,EAAE,OAAO,CAAA;IAE3C;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,IAAI,CAAA;CACf,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;CAC9C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,QACzB,OAAO,KACX,GAAG,IAAI,iBAGe,CAAA;AAEzB;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QACzB,OAAO,KACX,iBAKF,CAAA;AAUD;;;GAGG;AACH,eAAO,MAAM,cAAc,SACnB,IAAI,QACJ,IAAI,KACT,KAAK,GAAG,SAGQ,CAAA;AA2SnB;;;;GAIG;AACH,eAAO,MAAM,IAAI,YAAa,WAAW,KAAG,KAsG3C,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/actual/load.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n asDepID,\n hydrate,\n joinDepIDTuple,\n joinExtra,\n splitDepID,\n splitExtra,\n} from '@vltpkg/dep-id'\nimport { Spec } from '@vltpkg/spec'\nimport { graphStep } from '@vltpkg/output'\nimport { isObject } from '@vltpkg/types'\nimport {\n shorten,\n getRawDependencies,\n getDependencies,\n} from '../dependencies.ts'\nimport { Graph } from '../graph.ts'\nimport { loadHidden } from '../lockfile/load.ts'\nimport { saveHidden } from '../lockfile/save.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { NormalizedManifest } from '@vltpkg/types'\nimport type { Monorepo } from '@vltpkg/workspaces'\nimport type { Path, PathScurry } from 'path-scurry'\nimport type { Node } from '../node.ts'\nimport type {\n GraphModifier,\n ModifierActiveEntry,\n} from '../modifiers.ts'\nimport { readFileSync } from 'node:fs'\n\nexport type LoadOptions = SpecOptions & {\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 * If set to `false`, `actual.load` will not load any `package.json`\n * files while traversing the file system.\n *\n * The resulting {@link Graph} from loading with `loadManifests=false`\n * has no information on dependency types or the specs defined and\n * no information on missing and extraneous dependencies.\n */\n loadManifests?: boolean\n /**\n * If set to `true`, then do not shortcut the process by reading the\n * hidden lockfile at `node_modules/.vlt-lock.json`\n */\n skipHiddenLockfile?: boolean\n /**\n * Load only importers into the graph if the modifiers have changed.\n */\n skipLoadingNodesOnModifiersChange?: boolean\n // TODO: move the lockfile-related options to a separate type file\n /**\n * If set to `true`, fail if lockfile is missing or out of date.\n * Used by ci command to enforce lockfile integrity.\n */\n expectLockfile?: boolean\n /**\n * If set to `true`, fail if lockfile is missing or out of sync with package.json.\n * Prevents any lockfile modifications and is stricter than expectLockfile.\n */\n frozenLockfile?: boolean\n /**\n * If set to `true`, only update the lockfile without performing any node_modules\n * operations. Skips package extraction, filesystem operations, and hidden lockfile saves.\n */\n lockfileOnly?: boolean\n}\n\nexport type ReadEntry = {\n alias: string\n name: string\n realpath: Path\n}\n\n/**\n * The configuration object type as it is saved in the `.vlt/vlt.json`\n */\nexport type StoreConfigObject = {\n modifiers: Record<string, string> | undefined\n}\n\n/**\n * Checks if a given object is a {@link StoreConfigObject}.\n */\nexport const isStoreConfigObject = (\n obj: unknown,\n): obj is StoreConfigObject =>\n isObject(obj) &&\n Object.prototype.hasOwnProperty.call(obj, 'modifiers') &&\n isObject(obj.modifiers)\n\n/**\n * Returns a {@link StoreConfigObject} from a given object.\n * Throws a TypeError if the object can't be converted.\n */\nexport const asStoreConfigObject = (\n obj: unknown,\n): StoreConfigObject => {\n if (!isStoreConfigObject(obj)) {\n throw new TypeError(`Expected a store config object, got ${obj}`)\n }\n return obj\n}\n\n// path-based refer to the types of dependencies that are directly linked to\n// their real location in the file system and thus will not have an entry\n// in the `node_modules/.vlt` store\nconst pathBasedType = new Set(['file', 'workspace'])\nconst isPathBasedType = (\n type: string,\n): type is 'file' | 'workspace' => pathBasedType.has(type)\n\n/**\n * Returns a {@link DepID} for a given spec and path, if the spec is\n * path-based or a registry spec, otherwise returns `undefined`.\n */\nexport const getPathBasedId = (\n spec: Spec,\n path: Path,\n): DepID | undefined =>\n isPathBasedType(spec.type) ?\n joinDepIDTuple([spec.type, path.relativePosix()])\n : findDepID(path)\n\n/**\n * Retrieve the {@link DepID} for a given package from its location.\n */\nconst findDepID = ({ parent, name }: Path): DepID | undefined =>\n parent?.name === '.vlt' ? asDepID(name)\n : parent?.isCWD === false ? findDepID(parent)\n : undefined\n\n/**\n * Retrieves the closest `node_modules` parent {@link Path} found.\n */\nconst findNodeModules = ({\n parent,\n name,\n isCWD,\n}: Path): Path | undefined =>\n parent?.name === 'node_modules' ? parent\n : parent && name !== '.vlt' && !isCWD ? findNodeModules(parent)\n : undefined\n\n/**\n * Retrieves the scoped-normalized package name from its {@link Path}.\n */\nconst findName = ({ parent, name }: Path): string =>\n parent?.name.startsWith('@') ? `${parent.name}/${name}` : name\n\n/**\n * Helper function that gets a modified {@link Spec} when finding a modifier\n * that applies to a given dependency. Otherwise returns the original spec\n * value and no queryModifier.\n */\nconst maybeApplyModifierToSpec = (\n spec: Spec,\n depName: string,\n modifierRefs?: Map<string, ModifierActiveEntry>,\n): { spec: Spec; queryModifier?: string } => {\n const activeModifier = modifierRefs?.get(depName)\n const queryModifier = activeModifier?.modifier.query\n const completeModifier =\n activeModifier &&\n activeModifier.interactiveBreadcrumb.current ===\n activeModifier.modifier.breadcrumb.last\n\n if (\n queryModifier &&\n completeModifier &&\n 'spec' in activeModifier.modifier\n ) {\n const modifiedSpec = activeModifier.modifier.spec\n modifiedSpec.overridden = true\n return { spec: modifiedSpec, queryModifier }\n }\n\n return { spec, queryModifier }\n}\n\n/**\n * Reads the current directory defined at `currDir` and looks for folder\n * names and their realpath resolution, normalizing scoped package names\n * and removing any invalid symlinks from the list of items that should\n * be parsed through in order to build the graph.\n */\nconst readDir = (\n scurry: PathScurry,\n currDir: Path,\n fromNodeName?: string,\n) => {\n const res = new Set<ReadEntry>()\n for (const entry of scurry.readdirSync(currDir)) {\n // ignore any hidden files / folders\n if (entry.name.startsWith('.')) continue\n\n // scope folder found, it will need to be read and iterated over\n // in order to find any scoped packages inside\n if (entry.name.startsWith('@')) {\n const scopedItems = readDir(scurry, entry, fromNodeName)\n for (const scopedItem of scopedItems) {\n res.add(scopedItem)\n }\n continue\n }\n\n // skip anything that isn't a symlink, it's not an edge\n if (!entry.isSymbolicLink()) continue\n\n // we'll need to learn what is the real path for this entry in order\n // to retrieve the `location` and `id` properties for the node, if a\n // realpath is not found just move on to the next element\n const realpath = entry.realpathSync()\n if (!realpath) {\n continue\n }\n\n // infer both the alias and proper package names, including scopes\n const alias = findName(entry)\n const name = findName(realpath)\n res.add({\n alias,\n name,\n realpath,\n })\n }\n return res\n}\n\n/**\n * Parses the files located at `currDir` and place packages found inside\n * as dependencies of `fromNode`, building the instantiated `graph`.\n */\nconst parseDir = (\n options: LoadOptions,\n scurry: PathScurry,\n packageJson: PackageJson,\n depsFound: Map<Node, Path>,\n graph: Graph,\n fromNode: Node,\n currDir: Path,\n) => {\n const { loadManifests, modifiers } = options\n const dependencies = getRawDependencies(fromNode)\n const seenDeps = new Set<string>()\n const readItems: Set<ReadEntry> = readDir(\n scurry,\n currDir,\n fromNode.name,\n )\n\n // Get modifier references for this node's dependencies\n const modifierRefs = modifiers?.tryDependencies(fromNode, [\n ...getDependencies(fromNode, options).values(),\n ])\n\n for (const { alias, name, realpath } of readItems) {\n let node\n\n // tracks what dependencies have been seen\n // so that we can mark missing dependencies\n seenDeps.add(alias)\n\n // places the package in the graph reading\n // its manifest only if necessary\n if (!loadManifests) {\n const depId = findDepID(realpath)\n\n if (depId) {\n let h = hydrate(depId, alias, options)\n // if the parsed registry value is using the default value, then\n // the node should inherit the registry value from its parent node\n if (\n h.type === 'registry' &&\n h.registry === h.options.registry &&\n fromNode.registry\n ) {\n h.registry = fromNode.registry\n }\n\n // Check for active modifiers and replace spec even when not loading manifests\n const { spec: modifiedSpec, queryModifier } =\n maybeApplyModifierToSpec(h, alias, modifierRefs)\n h = modifiedSpec\n\n // graphs build with no manifest have no notion of\n // dependency types and or spec definitions since those\n // would have to be parsed from a manifest\n node = graph.placePackage(\n fromNode,\n 'prod', // defaults to prod deps\n h, // uses spec from hydrated id\n {\n name,\n },\n depId,\n joinExtra({ modifier: queryModifier }),\n )\n\n // Update active entry after placing package\n const activeModifier = modifierRefs?.get(alias)\n if (activeModifier && node) {\n modifiers?.updateActiveEntry(node, activeModifier)\n }\n }\n }\n\n // retrieve references to the current folder name found in `fromNode`\n // manifest listed dependencies, removing it from the map will leave\n // a list of missing dependencies at the end of the iteration\n const deps = dependencies.get(alias)\n\n // in case this graph is skipping manifests, this next block might\n // still need to execute, thus actually loading a manifest file, for\n // edge-cases such as loading a linked node that is not going to have\n // DepID info available in its realpath or extraneous nodes\n if (!node) {\n const mani = packageJson.read(realpath.fullpath())\n // declares fallback default values for both depType and bareSpec\n // in order to support loadManifests=false fallback for link nodes\n const type = deps?.type || 'dependencies'\n const bareSpec = deps?.bareSpec || '*'\n\n const depType = shorten(type, alias, fromNode.manifest)\n let spec = Spec.parse(alias, bareSpec, {\n ...options,\n registry: fromNode.registry,\n })\n\n // Check for active modifiers and replace spec if a modifier is complete\n const { spec: modifiedSpec, queryModifier } =\n maybeApplyModifierToSpec(spec, alias, modifierRefs)\n spec = modifiedSpec\n\n const maybeId = getPathBasedId(spec, realpath)\n let peerSetHash: string | undefined\n if (maybeId) {\n // parses extra info from depID to retrieve peerSetHash\n try {\n const tuple = splitDepID(maybeId)\n const type = tuple[0]\n const extra =\n type === 'registry' || type === 'git' ?\n tuple[3]\n : tuple[2]\n\n peerSetHash =\n extra ? splitExtra(extra).peerSetHash : undefined\n /* c8 ignore next - impossible: getPathBasedId asserts valid dep id */\n } catch {}\n }\n node = graph.placePackage(\n fromNode,\n depType,\n spec,\n mani,\n maybeId,\n joinExtra({ modifier: queryModifier, peerSetHash }),\n )\n\n // Update active entry after placing package\n const activeModifier = modifierRefs?.get(alias)\n if (activeModifier && node) {\n modifiers?.updateActiveEntry(node, activeModifier)\n }\n }\n\n if (node) {\n // If a found dependency is not declared in any of the original\n // node dependencies, then add an edge to the graph pointing to it\n // and mark it as extraneous.\n //\n // This only makes sense if full manifests are being loaded\n // so that we have reference to dependencies info.\n if (loadManifests && !deps) {\n const [edge] = node.edgesIn\n if (edge) {\n graph.extraneousDependencies.add(edge)\n }\n }\n\n // for a succesfully created node, add its location\n // property and queue up to read its dependencies\n node.location = `./${realpath.relativePosix()}`\n const node_modules = findNodeModules(realpath)\n\n // queue items up to continue parsing dirs in case a node was succesfully\n // placed in the graph and its node_modules folder was correctly found\n if (node_modules) {\n depsFound.set(node, node_modules)\n }\n }\n }\n\n // any remaining dependencies that have not been found\n // when reading the directory should be marked as missing\n for (const { name, type, bareSpec } of dependencies.values()) {\n if (!seenDeps.has(name)) {\n const depType = shorten(type, name, fromNode.manifest)\n let spec = Spec.parse(name, bareSpec, {\n ...options,\n registry: fromNode.registry,\n })\n\n // Check for active modifiers and replace spec for missing dependencies\n const { spec: modifiedSpec, queryModifier } =\n maybeApplyModifierToSpec(spec, name, modifierRefs)\n spec = modifiedSpec\n\n graph.placePackage(\n fromNode,\n depType,\n spec,\n undefined,\n undefined,\n joinExtra({ modifier: queryModifier }),\n )\n }\n }\n}\n\n/**\n * Read the file system looking for `node_modules` folders and\n * returns a new {@link Graph} that represents the relationship\n * between the dependencies found.\n */\nexport const load = (options: LoadOptions): Graph => {\n const done = graphStep('actual')\n const {\n modifiers,\n monorepo,\n projectRoot,\n packageJson,\n scurry,\n skipHiddenLockfile = false,\n skipLoadingNodesOnModifiersChange = false,\n } = options\n const mainManifest =\n options.mainManifest ?? packageJson.read(projectRoot)\n\n if (!skipHiddenLockfile) {\n try {\n // if we reach here, the hidden lockfile is valid\n const graph = loadHidden({\n ...options,\n projectRoot,\n mainManifest,\n packageJson,\n monorepo,\n scurry,\n })\n done()\n return graph\n } catch {\n // if validation fails or any other error occurs,\n // fall back to filesystem traversal\n }\n }\n\n const graph = new Graph({ ...options, mainManifest })\n\n // retrieve the configuration object from the store\n let storeConfig: StoreConfigObject = { modifiers: undefined }\n try {\n storeConfig = asStoreConfigObject(\n JSON.parse(\n readFileSync(\n scurry.resolve('node_modules/.vlt/vlt.json'),\n 'utf8',\n ),\n ),\n )\n } catch {}\n const storeModifiers = JSON.stringify(storeConfig.modifiers ?? {})\n const optionsModifiers = JSON.stringify(modifiers?.config)\n const modifiersChanged = storeModifiers !== optionsModifiers\n const shouldLoadDependencies = !(\n skipLoadingNodesOnModifiersChange && modifiersChanged\n )\n\n // will only skip loading dependencies if the\n // skipLoadingNodesOnModifiersChange option is set to true\n // and the current modifiers have not changed when compared\n // to the modifiers stored in the `node_modules/.vlt/vlt.json` store config\n if (shouldLoadDependencies) {\n const depsFound = new Map<Node, Path>()\n\n // starts the list of initial folders to parse using the importer nodes\n for (const importer of graph.importers) {\n modifiers?.tryImporter(importer)\n depsFound.set(\n importer,\n scurry.cwd.resolve(`${importer.location}/node_modules`),\n )\n }\n\n // breadth-first traversal of the file system tree reading deps found\n // starting from the node_modules folder of every importer in order to\n // find the actual installed dependencies at each location\n for (const [node, path] of depsFound.entries()) {\n parseDir(\n options,\n scurry,\n packageJson,\n depsFound,\n graph,\n node,\n path,\n )\n }\n\n // Clean up any pending modifier entries that were never completed\n modifiers?.rollbackActiveEntries()\n\n // caches the load result to the hidden lockfile when enabled\n if (\n scurry.cwd.resolve('node_modules').lstatSync()?.isDirectory()\n ) {\n saveHidden({\n ...options,\n graph,\n })\n }\n }\n\n done()\n\n return graph\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAInD,YAAY,EACV,UAAU,EACV,YAAY,GACb,MAAM,yBAAyB,CAAA;AAEhC,cAAc,mBAAmB,CAAA;AAEjC,QAAA,MAAM,QAAQ;;;CAGb,CAAA;AAED,QAAA,MAAM,QAAQ;;CAEb,CAAA;AAED,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,aAAa,EACb,QAAQ,GACT,CAAA"}