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

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
@@ -1,3 +1,4 @@
1
+ import { error } from '@vltpkg/error-cause';
1
2
  import { PackageJson } from '@vltpkg/package-json';
2
3
  import { Monorepo } from '@vltpkg/workspaces';
3
4
  import { readFileSync } from 'node:fs';
@@ -5,6 +6,7 @@ import { resolve } from 'node:path';
5
6
  import { loadEdges } from "./load-edges.js";
6
7
  import { loadNodes } from "./load-nodes.js";
7
8
  import { Graph } from "../graph.js";
9
+ import { LOCKFILE_VERSION } from "./types.js";
8
10
  const loadLockfile = (projectRoot, lockfilePath) => JSON.parse(readFileSync(resolve(projectRoot, lockfilePath), {
9
11
  encoding: 'utf8',
10
12
  }));
@@ -19,21 +21,43 @@ export const loadHidden = (options) => {
19
21
  return loadObject(options, loadLockfile(projectRoot, 'node_modules/.vlt-lock.json'));
20
22
  };
21
23
  export const loadObject = (options, lockfileData) => {
22
- const { mainManifest, modifiers, scurry, skipLoadingNodesOnModifiersChange, } = options;
24
+ const version = lockfileData.lockfileVersion;
25
+ // Lockfile version is required, likely a corrupted lockfile if missing
26
+ if (version == null) {
27
+ throw error('Missing lockfile version', {
28
+ code: 'ELOCKFILEVERSION',
29
+ found: version,
30
+ wanted: LOCKFILE_VERSION,
31
+ });
32
+ }
33
+ // Lockfile version must match current version
34
+ if (version !== LOCKFILE_VERSION) {
35
+ throw error(`Unsupported lockfile version.
36
+
37
+ Run: \`vlt update\` to start a new, supported lockfile.`, {
38
+ code: 'ELOCKFILEVERSION',
39
+ found: version,
40
+ wanted: LOCKFILE_VERSION,
41
+ });
42
+ }
43
+ const { mainManifest, scurry } = options;
23
44
  const packageJson = options.packageJson ?? new PackageJson();
24
45
  const monorepo = options.monorepo ??
25
46
  Monorepo.maybeLoad(options.projectRoot, { packageJson, scurry });
26
- const { catalog = {}, catalogs = {}, modifiers: modifiersLockfileConfig, 'scope-registries': scopeRegistries, registry, registries, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives,
47
+ const { catalog = {}, catalogs = {}, 'scoped-registries': scopedRegistriesOption, registry, registries, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives,
27
48
  /* c8 ignore next */
28
49
  } = lockfileData.options ?? {};
50
+ // backwards-compat: legacy lockfiles wrote this field as `scope-registries`
51
+ const scopeRegistries = scopedRegistriesOption ??
52
+ lockfileData.options['scope-registries'];
29
53
  // Optimize options merging - only create new objects when needed
30
54
  const mergedOptions = {
31
55
  ...options,
32
56
  catalog,
33
57
  catalogs,
34
- 'scope-registries': scopeRegistries ?
35
- { ...options['scope-registries'], ...scopeRegistries }
36
- : options['scope-registries'],
58
+ 'scoped-registries': scopeRegistries ?
59
+ { ...options['scoped-registries'], ...scopeRegistries }
60
+ : options['scoped-registries'],
37
61
  registry: registry ?? options.registry,
38
62
  registries: registries ?
39
63
  { ...options.registries, ...registries }
@@ -50,33 +74,8 @@ export const loadObject = (options, lockfileData) => {
50
74
  mainManifest,
51
75
  monorepo,
52
76
  });
53
- // When using the skipLoadingNodesOnModifiersChange option, we should skip loading
54
- // dependencies in case the modifiers have changed since we'll need to
55
- // recalculate the graph - useful for refreshing an ideal graph when
56
- // modifiers are swapped.
57
- // Optimize modifier comparison - avoid JSON.stringify for simple cases
58
- let modifiersChanged = false;
59
- if (skipLoadingNodesOnModifiersChange) {
60
- const lockfileConfig = modifiersLockfileConfig ?? {};
61
- const optionsConfig = modifiers?.config ?? {};
62
- // Quick check for obvious differences
63
- const lockfileKeys = Object.keys(lockfileConfig);
64
- const optionsKeys = Object.keys(optionsConfig);
65
- if (lockfileKeys.length !== optionsKeys.length) {
66
- modifiersChanged = true;
67
- }
68
- else {
69
- // Only use JSON.stringify if we need deep comparison
70
- const lockfileModifiers = JSON.stringify(lockfileConfig);
71
- const optionsModifiers = JSON.stringify(optionsConfig);
72
- modifiersChanged = lockfileModifiers !== optionsModifiers;
73
- }
74
- }
75
- const shouldLoadDependencies = !(skipLoadingNodesOnModifiersChange && modifiersChanged);
76
- if (shouldLoadDependencies) {
77
- loadNodes(graph, lockfileData.nodes, mergedOptions, options.actual, options.throwOnMissingManifest);
78
- loadEdges(graph, lockfileData.edges, mergedOptions);
79
- }
77
+ loadNodes(graph, lockfileData.nodes, mergedOptions, options.actual, options.throwOnMissingManifest);
78
+ loadEdges(graph, lockfileData.edges, mergedOptions);
80
79
  // hydrate missing node-level registry data
81
80
  for (const node of graph.nodes.values()) {
82
81
  const [firstEdge] = node.edgesIn;
@@ -86,4 +85,3 @@ export const loadObject = (options, lockfileData) => {
86
85
  }
87
86
  return graph;
88
87
  };
89
- //# sourceMappingURL=load.js.map
@@ -24,8 +24,7 @@ export type SaveOptions = SpecOptions & {
24
24
  */
25
25
  throwOnMissingManifest?: boolean;
26
26
  };
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;
27
+ export declare const lockfileData: ({ graph, catalog, catalogs, "git-hosts": gitHosts, "git-host-archives": gitHostArchives, modifiers, registry, registries, saveManifests, saveBuildData, "scoped-registries": scopeRegistries, "jsr-registries": jsrRegistries, throwOnMissingManifest, }: SaveOptions) => LockfileData;
28
28
  export declare const saveData: (data: LockfileData, fileName: string, saveManifests?: boolean) => void;
29
29
  export declare const save: (options: Omit<SaveOptions, "saveManifests">) => void;
30
30
  export declare const saveHidden: (options: Omit<SaveOptions, "saveManifests" | "saveBuildData">) => void;
31
- //# sourceMappingURL=save.d.ts.map
@@ -2,7 +2,7 @@ import { expandNormalizedManifestSymbols, isRecordStringString, } from '@vltpkg/
2
2
  import { defaultGitHostArchives, defaultGitHosts, defaultJsrRegistries, defaultRegistries, defaultRegistry, defaultScopeRegistries, } from '@vltpkg/spec';
3
3
  import { mkdirSync, writeFileSync } from 'node:fs';
4
4
  import { dirname, resolve } from 'node:path';
5
- import { getFlagNumFromNode, getBuildStateFromNode } from "./types.js";
5
+ import { getFlagNumFromNode, getBuildStateFromNode, LOCKFILE_VERSION, } from "./types.js";
6
6
  import { error } from '@vltpkg/error-cause';
7
7
  const formatNodes = (nodes, saveManifests, saveBuildData, registry, throwOnMissingManifest) => {
8
8
  // we do not store importers in the lockfile, though we do store
@@ -23,7 +23,9 @@ const formatNodes = (nodes, saveManifests, saveBuildData, registry, throwOnMissi
23
23
  if (node.integrity) {
24
24
  lockfileNode[2] = node.integrity;
25
25
  }
26
- if (resolved) {
26
+ // skip resolved for remote nodes since
27
+ // these are already part of the dep id
28
+ if (resolved && !node.id.startsWith('remote')) {
27
29
  lockfileNode[3] = resolved;
28
30
  }
29
31
  if (location) {
@@ -80,7 +82,7 @@ const removeDefaultItems = (defaultItems, items) => {
80
82
  }
81
83
  return res;
82
84
  };
83
- export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, modifiers, registry, registries, saveManifests, saveBuildData, 'scope-registries': scopeRegistries, 'jsr-registries': jsrRegistries, throwOnMissingManifest, }) => {
85
+ export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, modifiers, registry, registries, saveManifests, saveBuildData, 'scoped-registries': scopeRegistries, 'jsr-registries': jsrRegistries, throwOnMissingManifest, }) => {
84
86
  const cleanGitHosts = isRecordStringString(gitHosts) ?
85
87
  removeDefaultItems(defaultGitHosts, gitHosts)
86
88
  : undefined;
@@ -101,7 +103,7 @@ export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts,
101
103
  : undefined;
102
104
  const hasItems = (clean) => clean && Object.keys(clean).length;
103
105
  return {
104
- lockfileVersion: 0,
106
+ lockfileVersion: LOCKFILE_VERSION,
105
107
  options: {
106
108
  ...(hasItems(cleanModifiers) ?
107
109
  { modifiers: cleanModifiers }
@@ -109,7 +111,7 @@ export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts,
109
111
  ...(hasItems(catalog) ? { catalog } : {}),
110
112
  ...(hasItems(catalogs) ? { catalogs } : {}),
111
113
  ...(hasItems(cleanScopeRegistries) ?
112
- { 'scope-registries': cleanScopeRegistries }
114
+ { 'scoped-registries': cleanScopeRegistries }
113
115
  : undefined),
114
116
  ...(hasItems(cleanJsrRegistries) ?
115
117
  { 'jsr-registries': cleanJsrRegistries }
@@ -117,7 +119,7 @@ export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts,
117
119
  ...(registry !== undefined && registry !== defaultRegistry ?
118
120
  { registry }
119
121
  : undefined),
120
- ...(hasItems(registries) ?
122
+ ...(hasItems(cleanRegistries) ?
121
123
  { registries: cleanRegistries }
122
124
  : undefined),
123
125
  ...(hasItems(cleanGitHosts) ?
@@ -170,4 +172,3 @@ export const saveHidden = (options) => {
170
172
  mkdirSync(dirname(fileName), { recursive: true });
171
173
  saveData(data, fileName, true);
172
174
  };
173
- //# sourceMappingURL=save.js.map
@@ -8,6 +8,7 @@ export type LockfilePlatform = {
8
8
  engines?: Record<string, string>;
9
9
  os?: string[] | string;
10
10
  cpu?: string[] | string;
11
+ libc?: string[] | string;
11
12
  };
12
13
  /**
13
14
  * This is the main type definition for the contents of the
@@ -24,6 +25,12 @@ export type LockfileData = {
24
25
  nodes: Record<DepID, LockfileNode>;
25
26
  edges: LockfileEdges;
26
27
  };
28
+ /**
29
+ * Current lockfile format version.
30
+ * Only lockfiles with matching version are considered valid.
31
+ * Bump when making breaking format changes.
32
+ */
33
+ export declare const LOCKFILE_VERSION = 1;
27
34
  export declare const getFlagNumFromNode: (node: {
28
35
  optional?: boolean;
29
36
  dev?: boolean;
@@ -86,4 +93,3 @@ export type LockfileEdges = {
86
93
  export type LockfileEdgeKey = `${DepID} ${string}`;
87
94
  /** `${type} ${spec} ${to}` */
88
95
  export type LockfileEdgeValue = `${DependencyTypeShort} ${Spec['bareSpec']} ${DepID | 'MISSING'}`;
89
- //# sourceMappingURL=types.d.ts.map
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Current lockfile format version.
3
+ * Only lockfiles with matching version are considered valid.
4
+ * Bump when making breaking format changes.
5
+ */
6
+ export const LOCKFILE_VERSION = 1;
1
7
  export const getFlagNumFromNode = (node) => node.optional && node.dev ? LockfileNodeFlagDevOptional
2
8
  : node.optional ? LockfileNodeFlagOptional
3
9
  : node.dev ? LockfileNodeFlagDev
@@ -41,4 +47,3 @@ export const getBuildStateFromNum = (state) => {
41
47
  return 'none';
42
48
  }
43
49
  };
44
- //# sourceMappingURL=types.js.map
@@ -186,4 +186,3 @@ export declare class GraphModifier {
186
186
  */
187
187
  static load(options: SpecOptions): GraphModifier;
188
188
  }
189
- //# sourceMappingURL=modifiers.d.ts.map
@@ -327,4 +327,3 @@ export class GraphModifier {
327
327
  return new GraphModifier(options);
328
328
  }
329
329
  }
330
- //# sourceMappingURL=modifiers.js.map
@@ -117,6 +117,7 @@ export declare class Node implements NodeLike {
117
117
  engines?: Record<string, string>;
118
118
  os?: string[] | string;
119
119
  cpu?: string[] | string;
120
+ libc?: string[] | string;
120
121
  };
121
122
  /**
122
123
  * Record of binary names to their paths in the package, if any.
@@ -134,6 +135,19 @@ export declare class Node implements NodeLike {
134
135
  * - 'failed': Node build has failed
135
136
  */
136
137
  buildState: 'none' | 'needed' | 'built' | 'failed';
138
+ /**
139
+ * Deterministic unique string used to identify (and ultimately duplicate)
140
+ * nodes that are affected by a peer context set modified resolution.
141
+ * These are appended to the node {@link DepID} as the `extra` suffix.
142
+ */
143
+ peerSetHash?: string;
144
+ /**
145
+ * True if this node is detached from the graph.
146
+ * This is used to indicate that the node is not part of the graph
147
+ * although the node is still available as part of the resolution process.
148
+ * Allows for skipping fetching manifests for detached nodes.
149
+ */
150
+ detached: boolean;
137
151
  /**
138
152
  * The file system location for this node.
139
153
  */
@@ -192,6 +206,7 @@ export declare class Node implements NodeLike {
192
206
  maybeSetConfusedManifest(spec: Spec, confused?: NormalizedManifest): void;
193
207
  toJSON(): {
194
208
  rawManifest?: import("@vltpkg/types").Override<import("@vltpkg/types").Manifest, import("@vltpkg/types").NormalizedFields> | undefined;
209
+ peerSetHash?: string | undefined;
195
210
  id: DepID;
196
211
  name: string;
197
212
  version: string | undefined;
@@ -209,6 +224,7 @@ export declare class Node implements NodeLike {
209
224
  engines?: Record<string, string>;
210
225
  os?: string[] | string;
211
226
  cpu?: string[] | string;
227
+ libc?: string[] | string;
212
228
  } | undefined;
213
229
  buildState: "none" | "needed" | "built" | "failed";
214
230
  };
@@ -216,4 +232,3 @@ export declare class Node implements NodeLike {
216
232
  }
217
233
  export declare const isNode: (value: unknown) => value is Node;
218
234
  export declare const asNode: (value: unknown) => Node;
219
- //# sourceMappingURL=node.d.ts.map
@@ -167,6 +167,19 @@ export class Node {
167
167
  * - 'failed': Node build has failed
168
168
  */
169
169
  buildState = 'none';
170
+ /**
171
+ * Deterministic unique string used to identify (and ultimately duplicate)
172
+ * nodes that are affected by a peer context set modified resolution.
173
+ * These are appended to the node {@link DepID} as the `extra` suffix.
174
+ */
175
+ peerSetHash;
176
+ /**
177
+ * True if this node is detached from the graph.
178
+ * This is used to indicate that the node is not part of the graph
179
+ * although the node is still available as part of the resolution process.
180
+ * Allows for skipping fetching manifests for detached nodes.
181
+ */
182
+ detached = false;
170
183
  /**
171
184
  * The file system location for this node.
172
185
  */
@@ -271,6 +284,11 @@ export class Node {
271
284
  const tuple = splitDepID(this.id);
272
285
  const [type, resolved] = tuple;
273
286
  switch (type) {
287
+ case 'remote': {
288
+ this.resolved = resolved;
289
+ this.integrity ??= this.manifest?.dist?.integrity;
290
+ break;
291
+ }
274
292
  case 'registry':
275
293
  this.#registryNodeResolved(tuple);
276
294
  break;
@@ -343,6 +361,9 @@ export class Node {
343
361
  modifier: this.modifier,
344
362
  platform: this.platform,
345
363
  buildState: this.buildState,
364
+ ...(this.peerSetHash ?
365
+ { peerSetHash: this.peerSetHash }
366
+ : undefined),
346
367
  ...(this.confused ?
347
368
  { rawManifest: this.#rawManifest }
348
369
  : undefined),
@@ -365,4 +386,3 @@ export const asNode = (value) => {
365
386
  }
366
387
  return value;
367
388
  };
368
- //# sourceMappingURL=node.js.map
@@ -1,3 +1,2 @@
1
1
  export declare const isNonEmptyList: <T>(list: T[]) => list is [first: T, ...rest: T[]];
2
2
  export declare const nonEmptyList: <T>(nodes: T[]) => [first: T, ...rest: T[]] | undefined;
3
- //# sourceMappingURL=non-empty-list.d.ts.map
@@ -1,3 +1,2 @@
1
1
  export const isNonEmptyList = (list) => !!list.length;
2
2
  export const nonEmptyList = (nodes) => isNonEmptyList(nodes) ? nodes : undefined;
3
- //# sourceMappingURL=non-empty-list.js.map
@@ -7,4 +7,3 @@ import type { Edge } from '../edge.ts';
7
7
  * until scripts are run, in the case of non-store deps like workspaces
8
8
  */
9
9
  export declare const addEdge: (edge: Edge, scurry: PathScurry, remover: RollbackRemove, bins?: Record<string, string>) => Promise<void>;
10
- //# sourceMappingURL=add-edge.d.ts.map
@@ -1,10 +1,17 @@
1
1
  import { cmdShimIfExists } from '@vltpkg/cmd-shim';
2
2
  import { mkdir, symlink } from 'node:fs/promises';
3
- import { dirname, relative } from 'node:path';
3
+ import { dirname, relative, resolve } from 'node:path';
4
4
  const clobberSymlink = async (target, link, remover, type = 'file') => {
5
+ // On Windows, directory symlinks require elevated privileges.
6
+ // Use junctions instead, which work without special permissions.
7
+ // Junctions require absolute target paths, so resolve relative targets.
8
+ const symlinkType = type === 'dir' && process.platform === 'win32' ? 'junction' : type;
9
+ const symlinkTarget = symlinkType === 'junction' ?
10
+ resolve(dirname(link), target)
11
+ : target;
5
12
  await mkdir(dirname(link), { recursive: true });
6
13
  try {
7
- await symlink(target, link, type);
14
+ await symlink(symlinkTarget, link, symlinkType);
8
15
  }
9
16
  catch (er) {
10
17
  /* c8 ignore start */
@@ -16,7 +23,7 @@ const clobberSymlink = async (target, link, remover, type = 'file') => {
16
23
  await remover.rm(link);
17
24
  try {
18
25
  // then try to create it again
19
- await symlink(target, link, type);
26
+ await symlink(symlinkTarget, link, symlinkType);
20
27
  /* c8 ignore start */
21
28
  }
22
29
  catch (er) {
@@ -62,4 +69,3 @@ export const addEdge = async (edge, scurry, remover, bins) => {
62
69
  if (promises.length)
63
70
  await Promise.all(promises);
64
71
  };
65
- //# sourceMappingURL=add-edge.js.map
@@ -1,5 +1,4 @@
1
1
  import type { RollbackRemove } from '@vltpkg/rollback-remove';
2
2
  import type { PathScurry } from 'path-scurry';
3
3
  import type { Diff } from '../diff.ts';
4
- export declare const addEdges: (diff: Diff, scurry: PathScurry, remover: RollbackRemove) => Promise<unknown>[];
5
- //# sourceMappingURL=add-edges.d.ts.map
4
+ export declare const addEdges: (diff: Diff, scurry: PathScurry, remover: RollbackRemove) => (() => Promise<unknown>)[];
@@ -5,8 +5,8 @@ export const addEdges = (diff, scurry, remover) => {
5
5
  const { to } = edge;
6
6
  if (!to)
7
7
  continue;
8
- actions.push(addEdge(edge, scurry, remover, to.bins));
8
+ const bins = to.bins;
9
+ actions.push(() => addEdge(edge, scurry, remover, bins));
9
10
  }
10
11
  return actions;
11
12
  };
12
- //# sourceMappingURL=add-edges.js.map
@@ -4,4 +4,3 @@ import type { SpecOptions } from '@vltpkg/spec';
4
4
  import type { PathScurry } from 'path-scurry';
5
5
  import type { Diff } from '../diff.ts';
6
6
  export declare const addNodes: (diff: Diff, scurry: PathScurry, remover: RollbackRemove, options: SpecOptions, packageInfo: PackageInfoClient) => (() => Promise<unknown>)[];
7
- //# sourceMappingURL=add-nodes.d.ts.map
@@ -14,4 +14,3 @@ export const addNodes = (diff, scurry, remover, options, packageInfo) => {
14
14
  }
15
15
  return actions;
16
16
  };
17
- //# sourceMappingURL=add-nodes.js.map
@@ -8,4 +8,3 @@ export declare const binChmodAll: (nodes: Iterable<Node>, scurry: PathScurry) =>
8
8
  * Make all the package's bins executable.
9
9
  */
10
10
  export declare const binChmod: (node: Node, scurry: PathScurry) => Promise<void>;
11
- //# sourceMappingURL=bin-chmod.d.ts.map
@@ -36,4 +36,3 @@ const makeExecutable = async (path) => {
36
36
  }
37
37
  await chmod(path, execMode);
38
38
  };
39
- //# sourceMappingURL=bin-chmod.js.map
@@ -11,4 +11,3 @@ export type BuildResult = {
11
11
  failure: Node[];
12
12
  };
13
13
  export declare const build: (diff: Diff, packageJson: PackageJson, scurry: PathScurry, allowScriptsNodes: Set<DepID>) => Promise<BuildResult>;
14
- //# sourceMappingURL=build.d.ts.map
@@ -1,8 +1,9 @@
1
1
  // walk the graph of added nodes, building and chmoding their bins
2
2
  // at the end, we get back to the importers, and run their prepare
3
3
  // script as well as install script.
4
+ import { join } from 'node:path';
4
5
  import { run } from '@vltpkg/run';
5
- import { graphRun } from 'graph-run';
6
+ import { graphRun } from '@vltpkg/graph-run';
6
7
  import { nonEmptyList } from "../non-empty-list.js";
7
8
  import { optionalFail } from "./optional-fail.js";
8
9
  import { binChmod } from "./bin-chmod.js";
@@ -71,8 +72,16 @@ const visit = async (packageJson, scurry, node, signal, _path) => {
71
72
  const { manifest } = node;
72
73
  const { scripts = {} } = manifest;
73
74
  const { install, preinstall, postinstall, prepare, preprepare, postprepare, } = scripts;
74
- // if it has install script, run it
75
- const runInstall = !!(install || preinstall || postinstall);
75
+ // Check for binding.gyp file (npm's implicit install detection)
76
+ // "If there is a binding.gyp file in the root of your package and you
77
+ // haven't defined your own install or preinstall scripts, npm will default
78
+ // the install command to compile using node-gyp via node-gyp rebuild"
79
+ const hasBindingGyp = scurry
80
+ .lstatSync(join(node.resolvedLocation(scurry), 'binding.gyp'))
81
+ ?.isFile() ?? false;
82
+ const hasImplicitInstall = hasBindingGyp && !install && !preinstall;
83
+ // if it has install script or binding.gyp (implicit install), run it
84
+ const runInstall = !!(install || preinstall || postinstall) || hasImplicitInstall;
76
85
  if (runInstall) {
77
86
  await run({
78
87
  signal,
@@ -100,4 +109,3 @@ const visit = async (packageJson, scurry, node, signal, _path) => {
100
109
  }
101
110
  await binChmod(node, scurry);
102
111
  };
103
- //# sourceMappingURL=build.js.map
@@ -1,3 +1,2 @@
1
1
  import type { Spec } from '@vltpkg/spec';
2
2
  export declare const calculateSaveValue: (nodeType: string, spec: Spec, existing: string | undefined, nodeVersion: string | undefined) => string;
3
- //# sourceMappingURL=calculate-save-value.d.ts.map
@@ -1,5 +1,11 @@
1
1
  const SAVE_PREFIX = '^';
2
2
  export const calculateSaveValue = (nodeType, spec, existing, nodeVersion) => {
3
+ // Catalog specs should always be preserved as-is in package.json.
4
+ // The catalog reference (e.g. "catalog:dev") is the user's intent;
5
+ // the resolved version is tracked in the lockfile.
6
+ if (spec.type === 'catalog') {
7
+ return spec.bareSpec;
8
+ }
3
9
  if (
4
10
  // if not from the registry, save whatever we requested
5
11
  nodeType === 'registry' &&
@@ -42,4 +48,3 @@ export const calculateSaveValue = (nodeType, spec, existing, nodeVersion) => {
42
48
  }
43
49
  return spec.bareSpec;
44
50
  };
45
- //# sourceMappingURL=calculate-save-value.js.map
@@ -1,3 +1,5 @@
1
+ import type { PathScurry } from 'path-scurry';
2
+ import type { PackageJson } from '@vltpkg/package-json';
1
3
  import type { Diff } from '../diff.ts';
2
4
  import type { Node } from '../node.ts';
3
5
  /**
@@ -14,6 +16,14 @@ export type CheckNeededBuildOptions = {
14
16
  * The diff object containing nodes to process
15
17
  */
16
18
  diff: Diff;
19
+ /**
20
+ * PathScurry instance for filesystem access
21
+ */
22
+ scurry: PathScurry;
23
+ /**
24
+ * PackageJson instance for reading manifests from disk
25
+ */
26
+ packageJson: PackageJson;
17
27
  };
18
28
  /**
19
29
  * Check which nodes need to be built and set buildState accordingly
@@ -22,4 +32,3 @@ export type CheckNeededBuildOptions = {
22
32
  * @returns {BuildData} The BuildData object containing Node objects that need building
23
33
  */
24
34
  export declare const checkNeededBuild: (options: CheckNeededBuildOptions) => BuildData;
25
- //# sourceMappingURL=check-needed-build.d.ts.map
@@ -0,0 +1,71 @@
1
+ import { join } from 'node:path';
2
+ /**
3
+ * Checks if a node needs to be built based on the conditions from build.ts:
4
+ * 1. Has install lifecycle scripts (install, preinstall, postinstall)
5
+ * 2. Has binding.gyp file with no install/preinstall scripts (implicit install)
6
+ * 3. Is an importer or git dependency with prepare scripts (prepare, preprepare, postprepare)
7
+ * 4. Has binary files that need to be linked
8
+ */
9
+ const nodeNeedsBuild = (node, scurry, packageJson) => {
10
+ // If the node has already been built during reify, no need to build again
11
+ if (node.built)
12
+ return false;
13
+ // If the manifest is not available on the node, read it from disk.
14
+ // This can happen when the ideal graph is loaded from a lockfile
15
+ // and there's no actual graph available to hydrate the manifest data from.
16
+ let manifest = node.manifest;
17
+ if (!manifest) {
18
+ try {
19
+ manifest = packageJson.read(node.resolvedLocation(scurry));
20
+ node.manifest = manifest;
21
+ }
22
+ catch {
23
+ // If the manifest cannot be read (missing/corrupted), treat as
24
+ // "no build needed" to avoid failing the entire reification.
25
+ return false;
26
+ }
27
+ }
28
+ const { scripts = {} } = manifest;
29
+ // Check for install lifecycle scripts
30
+ const runInstall = !!(scripts.install ||
31
+ scripts.preinstall ||
32
+ scripts.postinstall);
33
+ if (runInstall)
34
+ return true;
35
+ // Check for binding.gyp file (npm's implicit install detection)
36
+ // "If there is a binding.gyp file in the root of your package and you
37
+ // haven't defined your own install or preinstall scripts, npm will default
38
+ // the install command to compile using node-gyp via node-gyp rebuild"
39
+ const hasBindingGyp = scurry
40
+ .lstatSync(join(node.resolvedLocation(scurry), 'binding.gyp'))
41
+ ?.isFile() ?? false;
42
+ if (hasBindingGyp && !scripts.install && !scripts.preinstall)
43
+ return true;
44
+ // Check for prepare scripts on importers or git dependencies
45
+ const prepable = node.id.startsWith('git') || node.importer || !node.inVltStore();
46
+ const runPrepare = !!((scripts.prepare || scripts.preprepare || scripts.postprepare)
47
+ /* c8 ignore next 2 */
48
+ ) && prepable;
49
+ if (runPrepare)
50
+ return true;
51
+ return false;
52
+ };
53
+ /**
54
+ * Check which nodes need to be built and set buildState accordingly
55
+ * Marks nodes with buildState = 'needed' for those that require
56
+ * install lifecycle scripts as part of `vlt build`
57
+ * @returns {BuildData} The BuildData object containing Node objects that need building
58
+ */
59
+ export const checkNeededBuild = (options) => {
60
+ const { diff, scurry, packageJson } = options;
61
+ // Filter nodes to only include those that actually need to be built
62
+ const nodesToBuild = [...diff.nodes.add].filter(node => nodeNeedsBuild(node, scurry, packageJson));
63
+ // Set buildState = 'needed' on all nodes that require building
64
+ for (const node of nodesToBuild) {
65
+ node.buildState = 'needed';
66
+ }
67
+ const buildData = {
68
+ needsBuildNodes: nodesToBuild,
69
+ };
70
+ return buildData;
71
+ };
@@ -2,4 +2,3 @@ import type { RollbackRemove } from '@vltpkg/rollback-remove';
2
2
  import type { PathScurry } from 'path-scurry';
3
3
  import type { Edge } from '../edge.ts';
4
4
  export declare const deleteEdge: (edge: Edge, scurry: PathScurry, remover: RollbackRemove) => Promise<void>;
5
- //# sourceMappingURL=delete-edge.d.ts.map
@@ -25,4 +25,3 @@ export const deleteEdge = async (edge, scurry, remover) => {
25
25
  }
26
26
  await Promise.all(promises);
27
27
  };
28
- //# sourceMappingURL=delete-edge.js.map
@@ -2,4 +2,3 @@ import type { 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 deleteEdges: (diff: Diff, scurry: PathScurry, remover: RollbackRemove) => (() => Promise<unknown>)[];
5
- //# sourceMappingURL=delete-edges.d.ts.map
@@ -11,4 +11,3 @@ export const deleteEdges = (diff, scurry, remover) => {
11
11
  }
12
12
  return promises;
13
13
  };
14
- //# sourceMappingURL=delete-edges.js.map
@@ -2,4 +2,3 @@ import type { 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 deleteNodes: (diff: Diff, remover: RollbackRemove, scurry: PathScurry) => Promise<unknown>[];
5
- //# sourceMappingURL=delete-nodes.d.ts.map
@@ -13,4 +13,3 @@ export const deleteNodes = (diff, remover, scurry) => {
13
13
  }
14
14
  return rmActions;
15
15
  };
16
- //# sourceMappingURL=delete-nodes.js.map
@@ -21,4 +21,3 @@ export type ExtractResult = {
21
21
  * Returns a promise that resolves when the extraction is complete.
22
22
  */
23
23
  export declare const extractNode: (node: Node, scurry: PathScurry, remover: RollbackRemove, options: SpecOptions, packageInfo: PackageInfoClient, diff?: Diff) => Promise<ExtractResult>;
24
- //# sourceMappingURL=extract-node.d.ts.map