@vltpkg/graph 1.0.0-rc.3 → 1.0.0-rc.30

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 (227) 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 +57 -22
  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} +0 -1
  10. package/dist/{esm/diff.d.ts → diff.d.ts} +4 -1
  11. package/dist/{esm/diff.js → diff.js} +5 -2
  12. package/dist/{esm/edge.d.ts → edge.d.ts} +1 -1
  13. package/dist/{esm/edge.js → edge.js} +4 -1
  14. package/dist/fixup-added-names.d.ts +18 -0
  15. package/dist/fixup-added-names.js +46 -0
  16. package/dist/{esm/graph.d.ts → graph.d.ts} +25 -5
  17. package/dist/{esm/graph.js → graph.js} +92 -43
  18. package/dist/ideal/append-nodes.d.ts +31 -0
  19. package/dist/ideal/append-nodes.js +560 -0
  20. package/dist/{esm/ideal → ideal}/build-ideal-from-starting-graph.d.ts +4 -5
  21. package/dist/ideal/build-ideal-from-starting-graph.js +69 -0
  22. package/dist/{esm/ideal → ideal}/build.d.ts +0 -1
  23. package/dist/ideal/build.js +84 -0
  24. package/dist/{esm/ideal → ideal}/get-importer-specs.d.ts +9 -3
  25. package/dist/{esm/ideal → ideal}/get-importer-specs.js +80 -6
  26. package/dist/ideal/peers.d.ts +160 -0
  27. package/dist/ideal/peers.js +696 -0
  28. package/dist/ideal/refresh-ideal-graph.d.ts +43 -0
  29. package/dist/ideal/refresh-ideal-graph.js +62 -0
  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/ideal/types.d.ts +107 -0
  35. package/dist/ideal/types.js +1 -0
  36. package/dist/{esm/index.d.ts → index.d.ts} +1 -1
  37. package/dist/{esm/index.js → index.js} +1 -1
  38. package/dist/{esm/install.d.ts → install.d.ts} +3 -3
  39. package/dist/{esm/install.js → install.js} +49 -9
  40. package/dist/{esm/lockfile → lockfile}/load-edges.d.ts +0 -1
  41. package/dist/{esm/lockfile → lockfile}/load-edges.js +7 -4
  42. package/dist/{esm/lockfile → lockfile}/load-nodes.d.ts +0 -1
  43. package/dist/{esm/lockfile → lockfile}/load-nodes.js +10 -4
  44. package/dist/{esm/lockfile → lockfile}/load.d.ts +0 -5
  45. package/dist/{esm/lockfile → lockfile}/load.js +31 -33
  46. package/dist/{esm/lockfile → lockfile}/save.d.ts +1 -2
  47. package/dist/{esm/lockfile → lockfile}/save.js +8 -7
  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} +16 -1
  53. package/dist/{esm/node.js → node.js} +21 -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 +1 -2
  59. package/dist/{esm/reify → reify}/add-edges.js +2 -2
  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 +0 -1
  67. package/dist/{esm/reify → reify}/calculate-save-value.js +6 -1
  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 +1 -1
  79. package/dist/{esm/reify → reify}/index.js +4 -4
  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 +1 -2
  87. package/dist/{esm/reify → reify}/update-importers-package-json.js +19 -17
  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} +10 -2
  94. package/dist/{esm/transfer-data → transfer-data}/load.d.ts +0 -1
  95. package/dist/{esm/transfer-data → transfer-data}/load.js +5 -3
  96. package/dist/{esm/uninstall.d.ts → uninstall.d.ts} +0 -1
  97. package/dist/{esm/uninstall.js → uninstall.js} +27 -7
  98. package/dist/{esm/update.d.ts → update.d.ts} +0 -1
  99. package/dist/{esm/update.js → update.js} +11 -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 +7 -3
  104. package/dist/{esm/visualization → visualization}/json-output.d.ts +2 -2
  105. package/dist/{esm/visualization → visualization}/json-output.js +2 -3
  106. package/dist/{esm/visualization → visualization}/mermaid-output.d.ts +2 -2
  107. package/dist/visualization/mermaid-output.js +170 -0
  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 +51 -63
  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/graph.d.ts.map +0 -1
  124. package/dist/esm/graph.js.map +0 -1
  125. package/dist/esm/ideal/add-nodes.d.ts +0 -34
  126. package/dist/esm/ideal/add-nodes.d.ts.map +0 -1
  127. package/dist/esm/ideal/add-nodes.js +0 -39
  128. package/dist/esm/ideal/add-nodes.js.map +0 -1
  129. package/dist/esm/ideal/append-nodes.d.ts +0 -19
  130. package/dist/esm/ideal/append-nodes.d.ts.map +0 -1
  131. package/dist/esm/ideal/append-nodes.js +0 -289
  132. package/dist/esm/ideal/append-nodes.js.map +0 -1
  133. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +0 -1
  134. package/dist/esm/ideal/build-ideal-from-starting-graph.js +0 -55
  135. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +0 -1
  136. package/dist/esm/ideal/build.d.ts.map +0 -1
  137. package/dist/esm/ideal/build.js +0 -48
  138. package/dist/esm/ideal/build.js.map +0 -1
  139. package/dist/esm/ideal/get-importer-specs.d.ts.map +0 -1
  140. package/dist/esm/ideal/get-importer-specs.js.map +0 -1
  141. package/dist/esm/ideal/remove-nodes.d.ts +0 -7
  142. package/dist/esm/ideal/remove-nodes.d.ts.map +0 -1
  143. package/dist/esm/ideal/remove-nodes.js +0 -19
  144. package/dist/esm/ideal/remove-nodes.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 +0 -35
  148. package/dist/esm/ideal/types.d.ts.map +0 -1
  149. package/dist/esm/ideal/types.js +0 -2
  150. package/dist/esm/ideal/types.js.map +0 -1
  151. package/dist/esm/index.d.ts.map +0 -1
  152. package/dist/esm/index.js.map +0 -1
  153. package/dist/esm/install.d.ts.map +0 -1
  154. package/dist/esm/install.js.map +0 -1
  155. package/dist/esm/lockfile/load-edges.d.ts.map +0 -1
  156. package/dist/esm/lockfile/load-edges.js.map +0 -1
  157. package/dist/esm/lockfile/load-nodes.d.ts.map +0 -1
  158. package/dist/esm/lockfile/load-nodes.js.map +0 -1
  159. package/dist/esm/lockfile/load.d.ts.map +0 -1
  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 +0 -123
  225. package/dist/esm/visualization/mermaid-output.js.map +0 -1
  226. package/dist/esm/visualization/object-like-output.d.ts.map +0 -1
  227. package/dist/esm/visualization/object-like-output.js.map +0 -1
@@ -42,11 +42,15 @@ export const extractNode = async (node, scurry, remover, options, packageInfo, d
42
42
  await remover.rm(target);
43
43
  if (removeOptionalFailedNode) {
44
44
  try {
45
- await packageInfo.extract(spec, target, {
45
+ const result = await packageInfo.extract(spec, target, {
46
46
  from,
47
47
  integrity,
48
48
  resolved,
49
49
  });
50
+ // Store computed integrity for git/remote deps
51
+ if (result.integrity && !node.integrity) {
52
+ node.integrity = result.integrity;
53
+ }
50
54
  return { success: true, node };
51
55
  }
52
56
  catch (error) {
@@ -55,11 +59,15 @@ export const extractNode = async (node, scurry, remover, options, packageInfo, d
55
59
  }
56
60
  }
57
61
  else {
58
- await packageInfo.extract(spec, target, {
62
+ const result = await packageInfo.extract(spec, target, {
59
63
  from,
60
64
  integrity,
61
65
  resolved,
62
66
  });
67
+ // Store computed integrity for git/remote deps
68
+ if (result.integrity && !node.integrity) {
69
+ node.integrity = result.integrity;
70
+ }
63
71
  return { success: true, node };
64
72
  }
65
73
  }
@@ -73,4 +81,3 @@ export const extractNode = async (node, scurry, remover, options, packageInfo, d
73
81
  throw error;
74
82
  }
75
83
  };
76
- //# sourceMappingURL=extract-node.js.map
@@ -15,6 +15,7 @@ export type ReifyOptions = LoadOptions & {
15
15
  packageInfo: PackageInfoClient;
16
16
  modifiers?: GraphModifier;
17
17
  remover: RollbackRemove;
18
+ update?: boolean;
18
19
  };
19
20
  export type ReifyResult = {
20
21
  /**
@@ -31,4 +32,3 @@ export type ReifyResult = {
31
32
  * Make the current project match the supplied graph.
32
33
  */
33
34
  export declare const reify: (options: ReifyOptions) => Promise<ReifyResult>;
34
- //# sourceMappingURL=index.d.ts.map
@@ -67,8 +67,9 @@ export const reify = async (options) => {
67
67
  const noModifiedDependencies = !options.add?.modifiedDependencies &&
68
68
  !options.remove?.modifiedDependencies;
69
69
  const skipOptionalOnly = noModifiedDependencies && diff.optionalOnly;
70
+ const skippable = skipOptionalOnly && !options.update;
70
71
  const res = { diff };
71
- if (!diff.hasChanges() || skipOptionalOnly) {
72
+ if (!diff.hasChanges() || skippable) {
72
73
  // nothing to do, so just return the diff
73
74
  done();
74
75
  return res;
@@ -115,11 +116,11 @@ const reify_ = async (options, diff, remover) => {
115
116
  // create all node_modules symlinks, and link bins to nm/.bin
116
117
  const edgeActions = addEdges(diff, scurry, remover);
117
118
  if (edgeActions.length)
118
- await Promise.all(edgeActions);
119
+ await callLimit(edgeActions, { limit });
119
120
  await internalHoist(diff.to, options, remover);
120
121
  // looks up all nodes setting buildState = 'needed'
121
122
  // on nodes that require building
122
- checkNeededBuild({ diff });
123
+ checkNeededBuild({ diff, scurry, packageJson });
123
124
  // Filter nodes allowed to run scripts if allowScripts query is provided
124
125
  const allowScriptsNodes = await filterNodesByQuery(diff.to, allowScripts);
125
126
  // ensure that all added bins are chmod +x
@@ -158,4 +159,3 @@ const reify_ = async (options, diff, remover) => {
158
159
  // returns the result object
159
160
  return res;
160
161
  };
161
- //# sourceMappingURL=index.js.map
@@ -6,4 +6,3 @@ type InternalHoistOptions = Pick<ReifyOptions, 'projectRoot' | 'scurry'>;
6
6
  export declare const pickNodeToHoist: (nodes: Set<Node>) => Node | undefined;
7
7
  export declare const internalHoist: (graph: Graph, options: InternalHoistOptions, remover: RollbackRemove) => Promise<void>;
8
8
  export {};
9
- //# sourceMappingURL=internal-hoist.d.ts.map
@@ -131,4 +131,3 @@ const checkExisting = async (name, entry, links, removes, scurry, remover) => {
131
131
  links.delete(name);
132
132
  }
133
133
  };
134
- //# sourceMappingURL=internal-hoist.js.map
@@ -13,4 +13,3 @@ export declare function optionalFail(diff: Diff, node: Node & {
13
13
  optional: false;
14
14
  }): undefined;
15
15
  export declare function optionalFail(diff: Diff, node: Node): (() => void) | undefined;
16
- //# sourceMappingURL=optional-fail.d.ts.map
@@ -13,4 +13,3 @@ const del = (diff, node) => {
13
13
  diff.nodes.add.delete(node);
14
14
  diff.nodes.delete.add(node);
15
15
  };
16
- //# sourceMappingURL=optional-fail.js.map
@@ -2,4 +2,3 @@ import { RollbackRemove } from '@vltpkg/rollback-remove';
2
2
  import type { PathScurry } from 'path-scurry';
3
3
  import type { Diff } from '../diff.ts';
4
4
  export declare const rollback: (remover: RollbackRemove, diff: Diff, scurry: PathScurry) => Promise<void>;
5
- //# sourceMappingURL=rollback.d.ts.map
@@ -21,4 +21,3 @@ export const rollback = async (remover, diff, scurry) => {
21
21
  /* c8 ignore next */
22
22
  await remover.rollback().catch(() => { });
23
23
  };
24
- //# sourceMappingURL=rollback.js.map
@@ -29,8 +29,7 @@ export type UpdatePackageJsonOptions = {
29
29
  packageJson: PackageJson;
30
30
  };
31
31
  /**
32
- * Updates the importers of a provided {@link Graph} accordingly to the
32
+ * Updates nodes of a provided {@link Graph} accordingly to the
33
33
  * provided add or remove arguments.
34
34
  */
35
35
  export declare const updatePackageJson: ({ add, graph, packageJson, remove, }: UpdatePackageJsonOptions) => () => void;
36
- //# sourceMappingURL=update-importers-package-json.d.ts.map
@@ -10,20 +10,20 @@ const depTypesMap = new Map([
10
10
  ['peerOptional', 'peerDependencies'],
11
11
  ['optional', 'optionalDependencies'],
12
12
  ]);
13
- const addOrRemoveDeps = (importerId, graph, addOrRemove) => {
14
- const importer = graph.nodes.get(importerId);
15
- if (!importer) {
16
- throw error('Failed to retrieve importer node', {
17
- found: importerId,
13
+ const addOrRemoveDeps = (nodeId, graph, addOrRemove) => {
14
+ const node = graph.nodes.get(nodeId);
15
+ if (!node) {
16
+ throw error('Failed to retrieve node', {
17
+ found: nodeId,
18
18
  });
19
19
  }
20
- const manifest = importer.manifest;
20
+ const manifest = node.manifest;
21
21
  if (!manifest) {
22
22
  throw error('Could not find manifest data for node', {
23
- found: importerId,
23
+ found: nodeId,
24
24
  });
25
25
  }
26
- const deps = addOrRemove?.get(importerId);
26
+ const deps = addOrRemove?.get(nodeId);
27
27
  /* c8 ignore start -- impossible but TS doesn't know that */
28
28
  if (!deps) {
29
29
  throw error('Failed to retrieve added deps info', {
@@ -49,7 +49,7 @@ const addOrRemoveDeps = (importerId, graph, addOrRemove) => {
49
49
  else {
50
50
  const [name, dep] = deleteNameOrAddItem;
51
51
  // peerOptional also needs to add peerDependenciesMeta entry
52
- const depTypeShort = resolveSaveType(importer, name, dep.type);
52
+ const depTypeShort = resolveSaveType(node, name, dep.type);
53
53
  const depType = depTypesMap.get(depTypeShort);
54
54
  if (!depType) {
55
55
  throw error('Failed to retrieve dependency type', {
@@ -57,11 +57,11 @@ const addOrRemoveDeps = (importerId, graph, addOrRemove) => {
57
57
  found: dep.type,
58
58
  });
59
59
  }
60
- const node = importer.edgesOut.get(name)?.to;
61
- if (!node) {
60
+ const n = node.edgesOut.get(name)?.to;
61
+ if (!n) {
62
62
  throw error('Dependency node could not be found');
63
63
  }
64
- const [nodeType] = splitDepID(node.id);
64
+ const [nodeType] = splitDepID(n.id);
65
65
  for (const dtype of longDependencyTypes) {
66
66
  if (dtype === depType || !manifest[dtype])
67
67
  continue;
@@ -86,7 +86,7 @@ const addOrRemoveDeps = (importerId, 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, node.version);
89
+ const saveValue = calculateSaveValue(nodeType, dep.spec, existing, n.version);
90
90
  dependencies[name] = saveValue;
91
91
  manifestChanged = manifestChanged || saveValue !== existing;
92
92
  }
@@ -94,7 +94,7 @@ const addOrRemoveDeps = (importerId, graph, addOrRemove) => {
94
94
  return manifestChanged ? manifest : undefined;
95
95
  };
96
96
  /**
97
- * Updates the importers of a provided {@link Graph} accordingly to the
97
+ * Updates nodes of a provided {@link Graph} accordingly to the
98
98
  * provided add or remove arguments.
99
99
  */
100
100
  export const updatePackageJson = ({ add, graph, packageJson, remove, }) => {
@@ -102,8 +102,11 @@ export const updatePackageJson = ({ add, graph, packageJson, remove, }) => {
102
102
  const operations = new Set([add, remove]);
103
103
  for (const operation of operations) {
104
104
  if (operation) {
105
- for (const importerId of operation.keys()) {
106
- const manifest = addOrRemoveDeps(importerId, graph, operation);
105
+ // These node ids are from either importer nodes or dependencies
106
+ // that are nested folders from which the user can also add new
107
+ // dependencies to
108
+ for (const nodeId of operation.keys()) {
109
+ const manifest = addOrRemoveDeps(nodeId, graph, operation);
107
110
  if (manifest) {
108
111
  manifestsToUpdate.add(manifest);
109
112
  }
@@ -117,4 +120,3 @@ export const updatePackageJson = ({ add, graph, packageJson, remove, }) => {
117
120
  };
118
121
  return commit;
119
122
  };
120
- //# 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
@@ -1,11 +1,20 @@
1
1
  import { splitDepID } from '@vltpkg/dep-id/browser';
2
+ import { defaultRegistryName } from '@vltpkg/spec/browser';
2
3
  export const stringifyNode = (node) => {
3
4
  if (!node)
4
5
  return '';
5
6
  const version = node.version ? `@${node.version}` : '';
6
7
  const [type, ref, nameVersion] = splitDepID(node.id);
7
8
  if (type === 'registry') {
8
- const prefix = ref ? `${ref}:` : 'npm:';
9
+ let prefix = `${defaultRegistryName}:`;
10
+ if (ref) {
11
+ if (/^https?:\/\//.test(ref)) {
12
+ prefix = `registry:${ref}#`;
13
+ }
14
+ else {
15
+ prefix = `${ref}:`;
16
+ }
17
+ }
9
18
  return `${prefix}${nameVersion}`;
10
19
  }
11
20
  else if (type === 'workspace') {
@@ -21,4 +30,3 @@ export const stringifyNode = (node) => {
21
30
  return `${type}(${ref})${nameVersion}`;
22
31
  }
23
32
  };
24
- //# 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
@@ -5,7 +5,10 @@ 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, '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,
@@ -17,7 +20,7 @@ const loadSpecOptions = (lockfile) => {
17
20
  ...defaultGitHostArchives,
18
21
  ...gitHostArchives,
19
22
  },
20
- 'scope-registries': {
23
+ 'scoped-registries': {
21
24
  ...defaultScopeRegistries,
22
25
  ...scopeRegistries,
23
26
  },
@@ -173,4 +176,3 @@ export const load = (transfered) => {
173
176
  securityArchive,
174
177
  };
175
178
  };
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
@@ -5,27 +5,40 @@ import { reify } from "./reify/index.js";
5
5
  import { lockfile } from "./index.js";
6
6
  import { updatePackageJson } from "./reify/update-importers-package-json.js";
7
7
  import { RollbackRemove } from '@vltpkg/rollback-remove';
8
+ import { existsSync, rmSync } from 'node:fs';
9
+ import { resolve } from 'node:path';
8
10
  export const uninstall = async (options, remove) => {
9
11
  const mainManifest = options.packageJson.read(options.projectRoot);
10
12
  const modifiers = GraphModifier.maybeLoad(options);
11
13
  const remover = new RollbackRemove();
12
14
  try {
13
- 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({
14
22
  ...options,
15
- remove,
23
+ modifiers: undefined,
16
24
  mainManifest,
17
25
  loadManifests: true,
18
- remover,
19
26
  });
20
- const act = actualLoad({
27
+ const graph = await idealBuild({
21
28
  ...options,
29
+ actual: act,
30
+ remove,
22
31
  mainManifest,
23
32
  loadManifests: true,
33
+ remover,
24
34
  });
25
35
  // If lockfileOnly is enabled, skip reify and only save the lockfile
26
36
  if (options.lockfileOnly) {
27
- // Save only the main lockfile, skip all filesystem operations
28
- 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 });
29
42
  const saveImportersPackageJson =
30
43
  /* c8 ignore next */
31
44
  remove?.modifiedDependencies ?
@@ -51,8 +64,15 @@ export const uninstall = async (options, remove) => {
51
64
  }
52
65
  catch (err) {
53
66
  await remover.rollback().catch(() => { });
67
+ // Remove hidden lockfile on failure
68
+ try {
69
+ const hiddenLockfile = resolve(options.projectRoot, 'node_modules/.vlt-lock.json');
70
+ if (existsSync(hiddenLockfile)) {
71
+ rmSync(hiddenLockfile, { force: true });
72
+ }
73
+ }
74
+ catch { }
54
75
  throw err;
55
76
  }
56
77
  /* c8 ignore stop */
57
78
  };
58
- //# 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
@@ -7,6 +7,8 @@ import { asError } from '@vltpkg/types';
7
7
  import { Graph } from "./graph.js";
8
8
  import { graphStep } from '@vltpkg/output';
9
9
  import { RollbackRemove } from '@vltpkg/rollback-remove';
10
+ import { existsSync, rmSync } from 'node:fs';
11
+ import { resolve } from 'node:path';
10
12
  export const update = async (options) => {
11
13
  let mainManifest = undefined;
12
14
  try {
@@ -50,14 +52,22 @@ export const update = async (options) => {
50
52
  loadManifests: true,
51
53
  modifiers,
52
54
  remover,
55
+ update: true,
53
56
  });
54
57
  return { buildQueue, graph, diff };
55
58
  /* c8 ignore start */
56
59
  }
57
60
  catch (err) {
58
61
  await remover.rollback().catch(() => { });
62
+ // Remove hidden lockfile on failure
63
+ try {
64
+ const hiddenLockfile = resolve(options.projectRoot, 'node_modules/.vlt-lock.json');
65
+ if (existsSync(hiddenLockfile)) {
66
+ rmSync(hiddenLockfile, { force: true });
67
+ }
68
+ }
69
+ catch { }
59
70
  throw err;
60
71
  }
61
72
  /* c8 ignore stop */
62
73
  };
63
- //# 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
@@ -1,3 +1,4 @@
1
+ import { defaultRegistryName } from '@vltpkg/spec';
1
2
  import { splitDepID } from '@vltpkg/dep-id';
2
3
  import { styleText as utilStyleText } from 'node:util';
3
4
  const styleText = (format, s) => utilStyleText(format, s, { validateStream: false });
@@ -119,7 +120,9 @@ export function humanReadableOutput(options, { colors }) {
119
120
  // prefixes the node name with the registry name
120
121
  // if a custom registry name is found
121
122
  const depIdTuple = nextItem.node?.id && splitDepID(nextItem.node.id);
122
- const hasCustomReg = depIdTuple?.[0] === 'registry' && depIdTuple[1];
123
+ const hasCustomReg = depIdTuple?.[0] === 'registry' &&
124
+ depIdTuple[1] &&
125
+ depIdTuple[1] !== defaultRegistryName;
123
126
  const nodeName = hasCustomReg ?
124
127
  `${depIdTuple[1]}:${nextItem.node?.name}`
125
128
  : nextItem.node?.name;
@@ -127,7 +130,9 @@ export function humanReadableOutput(options, { colors }) {
127
130
  `${nodeName}@${nextItem.node.version}`
128
131
  : nodeName;
129
132
  const nextChar = isLast ? 'last-child' : 'middle-child';
130
- const aliasedPackage = nextItem.node?.name && nextItem.edge?.name !== nodeName;
133
+ const aliasedPackage = hasCustomReg ||
134
+ (nextItem.node?.name &&
135
+ nextItem.edge?.name !== nextItem.node.name);
131
136
  nextItem.name =
132
137
  nextItem.node?.confused ?
133
138
  `${nextItem.edge?.name} ${red('(confused)')}`
@@ -156,4 +161,3 @@ export function humanReadableOutput(options, { colors }) {
156
161
  }
157
162
  return reset(res);
158
163
  }
159
- //# sourceMappingURL=human-readable-output.js.map
@@ -32,10 +32,10 @@ export type JSONOutputItem = {
32
32
  };
33
33
  export type JSONOutputGraph = {
34
34
  edges: EdgeLike[];
35
+ nodes: NodeLike[];
35
36
  importers: Set<NodeLike>;
36
37
  };
37
38
  /**
38
39
  * Returns a JSON string representation of the graph.
39
40
  */
40
- export declare function jsonOutput({ edges, importers }: JSONOutputGraph): JSONOutputItem[];
41
- //# sourceMappingURL=json-output.d.ts.map
41
+ export declare function jsonOutput({ edges, nodes, importers, }: JSONOutputGraph): JSONOutputItem[];
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Returns a JSON string representation of the graph.
3
3
  */
4
- export function jsonOutput({ edges, importers }) {
4
+ export function jsonOutput({ edges, nodes, importers, }) {
5
5
  const res = [];
6
6
  const seenIds = new Set();
7
7
  // Collects edge & it's linked nodes as json output items
@@ -37,7 +37,7 @@ export function jsonOutput({ edges, importers }) {
37
37
  return a.name.localeCompare(b.name);
38
38
  });
39
39
  for (const node of orderedImporters) {
40
- if (seenIds.has(node.id))
40
+ if (!nodes.includes(node) || seenIds.has(node.id))
41
41
  continue;
42
42
  res.unshift({
43
43
  /* c8 ignore next - name can't be missing but ts won't know */
@@ -48,4 +48,3 @@ export function jsonOutput({ edges, 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;