@vltpkg/graph 1.0.0-rc.9 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) 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 +29 -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} +49 -12
  18. package/dist/{esm/ideal → ideal}/append-nodes.d.ts +14 -3
  19. package/dist/{esm/ideal → ideal}/append-nodes.js +252 -64
  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 +15 -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 +6 -3
  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/path-security-error.d.ts +5 -0
  57. package/dist/path-security-error.js +13 -0
  58. package/dist/{esm/reify → reify}/add-edge.d.ts +0 -1
  59. package/dist/{esm/reify → reify}/add-edge.js +10 -4
  60. package/dist/{esm/reify → reify}/add-edges.d.ts +0 -1
  61. package/dist/{esm/reify → reify}/add-edges.js +0 -1
  62. package/dist/{esm/reify → reify}/add-nodes.d.ts +0 -1
  63. package/dist/{esm/reify → reify}/add-nodes.js +0 -1
  64. package/dist/{esm/reify → reify}/bin-chmod.d.ts +0 -1
  65. package/dist/{esm/reify → reify}/bin-chmod.js +0 -1
  66. package/dist/{esm/reify → reify}/build.d.ts +0 -1
  67. package/dist/{esm/reify → reify}/build.js +12 -4
  68. package/dist/{esm/reify → reify}/calculate-save-value.d.ts +1 -2
  69. package/dist/{esm/reify → reify}/calculate-save-value.js +11 -5
  70. package/dist/{esm/reify → reify}/check-needed-build.d.ts +10 -1
  71. package/dist/reify/check-needed-build.js +71 -0
  72. package/dist/{esm/reify → reify}/delete-edge.d.ts +0 -1
  73. package/dist/{esm/reify → reify}/delete-edge.js +0 -1
  74. package/dist/{esm/reify → reify}/delete-edges.d.ts +0 -1
  75. package/dist/{esm/reify → reify}/delete-edges.js +0 -1
  76. package/dist/{esm/reify → reify}/delete-nodes.d.ts +0 -1
  77. package/dist/{esm/reify → reify}/delete-nodes.js +0 -1
  78. package/dist/{esm/reify → reify}/extract-node.d.ts +0 -1
  79. package/dist/{esm/reify → reify}/extract-node.js +10 -3
  80. package/dist/{esm/reify → reify}/index.d.ts +3 -1
  81. package/dist/{esm/reify → reify}/index.js +25 -5
  82. package/dist/{esm/reify → reify}/internal-hoist.d.ts +0 -1
  83. package/dist/{esm/reify → reify}/internal-hoist.js +0 -1
  84. package/dist/{esm/reify → reify}/optional-fail.d.ts +0 -1
  85. package/dist/{esm/reify → reify}/optional-fail.js +0 -1
  86. package/dist/{esm/reify → reify}/rollback.d.ts +0 -1
  87. package/dist/{esm/reify → reify}/rollback.js +0 -1
  88. package/dist/{esm/reify → reify}/update-importers-package-json.d.ts +11 -2
  89. package/dist/{esm/reify → reify}/update-importers-package-json.js +4 -5
  90. package/dist/{esm/remove-optional-subgraph.d.ts → remove-optional-subgraph.d.ts} +0 -1
  91. package/dist/{esm/remove-optional-subgraph.js → remove-optional-subgraph.js} +0 -1
  92. package/dist/{esm/resolve-save-type.d.ts → resolve-save-type.d.ts} +0 -1
  93. package/dist/{esm/resolve-save-type.js → resolve-save-type.js} +0 -1
  94. package/dist/{esm/stringify-node.d.ts → stringify-node.d.ts} +0 -1
  95. package/dist/{esm/stringify-node.js → stringify-node.js} +0 -1
  96. package/dist/{esm/transfer-data → transfer-data}/load.d.ts +0 -1
  97. package/dist/{esm/transfer-data → transfer-data}/load.js +8 -5
  98. package/dist/{esm/uninstall.d.ts → uninstall.d.ts} +0 -1
  99. package/dist/{esm/uninstall.js → uninstall.js} +17 -7
  100. package/dist/{esm/update.d.ts → update.d.ts} +0 -1
  101. package/dist/{esm/update.js → update.js} +1 -1
  102. package/dist/{esm/virtual-root.d.ts → virtual-root.d.ts} +0 -1
  103. package/dist/{esm/virtual-root.js → virtual-root.js} +0 -1
  104. package/dist/{esm/visualization → visualization}/human-readable-output.d.ts +0 -1
  105. package/dist/{esm/visualization → visualization}/human-readable-output.js +0 -1
  106. package/dist/{esm/visualization → visualization}/json-output.d.ts +0 -1
  107. package/dist/{esm/visualization → visualization}/json-output.js +0 -1
  108. package/dist/{esm/visualization → visualization}/mermaid-output.d.ts +2 -2
  109. package/dist/{esm/visualization → visualization}/mermaid-output.js +27 -21
  110. package/dist/{esm/visualization → visualization}/object-like-output.d.ts +0 -1
  111. package/dist/{esm/visualization → visualization}/object-like-output.js +0 -1
  112. package/package.json +57 -62
  113. package/dist/esm/actual/load.d.ts.map +0 -1
  114. package/dist/esm/actual/load.js.map +0 -1
  115. package/dist/esm/browser.d.ts.map +0 -1
  116. package/dist/esm/browser.js.map +0 -1
  117. package/dist/esm/build.d.ts.map +0 -1
  118. package/dist/esm/build.js.map +0 -1
  119. package/dist/esm/dependencies.d.ts.map +0 -1
  120. package/dist/esm/dependencies.js.map +0 -1
  121. package/dist/esm/diff.d.ts.map +0 -1
  122. package/dist/esm/diff.js.map +0 -1
  123. package/dist/esm/edge.d.ts.map +0 -1
  124. package/dist/esm/edge.js.map +0 -1
  125. package/dist/esm/fixup-added-names.d.ts.map +0 -1
  126. package/dist/esm/fixup-added-names.js.map +0 -1
  127. package/dist/esm/graph.d.ts.map +0 -1
  128. package/dist/esm/graph.js.map +0 -1
  129. package/dist/esm/ideal/append-nodes.d.ts.map +0 -1
  130. package/dist/esm/ideal/append-nodes.js.map +0 -1
  131. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +0 -1
  132. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +0 -1
  133. package/dist/esm/ideal/build.d.ts.map +0 -1
  134. package/dist/esm/ideal/build.js.map +0 -1
  135. package/dist/esm/ideal/get-importer-specs.d.ts.map +0 -1
  136. package/dist/esm/ideal/get-importer-specs.js.map +0 -1
  137. package/dist/esm/ideal/get-ordered-dependencies.d.ts +0 -10
  138. package/dist/esm/ideal/get-ordered-dependencies.d.ts.map +0 -1
  139. package/dist/esm/ideal/get-ordered-dependencies.js +0 -42
  140. package/dist/esm/ideal/get-ordered-dependencies.js.map +0 -1
  141. package/dist/esm/ideal/peers.d.ts +0 -71
  142. package/dist/esm/ideal/peers.d.ts.map +0 -1
  143. package/dist/esm/ideal/peers.js +0 -318
  144. package/dist/esm/ideal/peers.js.map +0 -1
  145. package/dist/esm/ideal/refresh-ideal-graph.d.ts.map +0 -1
  146. package/dist/esm/ideal/refresh-ideal-graph.js.map +0 -1
  147. package/dist/esm/ideal/remove-satisfied-specs.d.ts.map +0 -1
  148. package/dist/esm/ideal/remove-satisfied-specs.js.map +0 -1
  149. package/dist/esm/ideal/types.d.ts.map +0 -1
  150. package/dist/esm/ideal/types.js +0 -2
  151. package/dist/esm/ideal/types.js.map +0 -1
  152. package/dist/esm/index.d.ts.map +0 -1
  153. package/dist/esm/index.js.map +0 -1
  154. package/dist/esm/install.d.ts.map +0 -1
  155. package/dist/esm/install.js.map +0 -1
  156. package/dist/esm/lockfile/load-edges.d.ts.map +0 -1
  157. package/dist/esm/lockfile/load-edges.js.map +0 -1
  158. package/dist/esm/lockfile/load-nodes.d.ts.map +0 -1
  159. package/dist/esm/lockfile/load-nodes.js.map +0 -1
  160. package/dist/esm/lockfile/load.d.ts.map +0 -1
  161. package/dist/esm/lockfile/load.js +0 -64
  162. package/dist/esm/lockfile/load.js.map +0 -1
  163. package/dist/esm/lockfile/save.d.ts.map +0 -1
  164. package/dist/esm/lockfile/save.js.map +0 -1
  165. package/dist/esm/lockfile/types.d.ts.map +0 -1
  166. package/dist/esm/lockfile/types.js.map +0 -1
  167. package/dist/esm/modifiers.d.ts.map +0 -1
  168. package/dist/esm/modifiers.js.map +0 -1
  169. package/dist/esm/node.d.ts.map +0 -1
  170. package/dist/esm/node.js.map +0 -1
  171. package/dist/esm/non-empty-list.d.ts.map +0 -1
  172. package/dist/esm/non-empty-list.js.map +0 -1
  173. package/dist/esm/package.json +0 -3
  174. package/dist/esm/reify/add-edge.d.ts.map +0 -1
  175. package/dist/esm/reify/add-edge.js.map +0 -1
  176. package/dist/esm/reify/add-edges.d.ts.map +0 -1
  177. package/dist/esm/reify/add-edges.js.map +0 -1
  178. package/dist/esm/reify/add-nodes.d.ts.map +0 -1
  179. package/dist/esm/reify/add-nodes.js.map +0 -1
  180. package/dist/esm/reify/bin-chmod.d.ts.map +0 -1
  181. package/dist/esm/reify/bin-chmod.js.map +0 -1
  182. package/dist/esm/reify/build.d.ts.map +0 -1
  183. package/dist/esm/reify/build.js.map +0 -1
  184. package/dist/esm/reify/calculate-save-value.d.ts.map +0 -1
  185. package/dist/esm/reify/calculate-save-value.js.map +0 -1
  186. package/dist/esm/reify/check-needed-build.d.ts.map +0 -1
  187. package/dist/esm/reify/check-needed-build.js +0 -50
  188. package/dist/esm/reify/check-needed-build.js.map +0 -1
  189. package/dist/esm/reify/delete-edge.d.ts.map +0 -1
  190. package/dist/esm/reify/delete-edge.js.map +0 -1
  191. package/dist/esm/reify/delete-edges.d.ts.map +0 -1
  192. package/dist/esm/reify/delete-edges.js.map +0 -1
  193. package/dist/esm/reify/delete-nodes.d.ts.map +0 -1
  194. package/dist/esm/reify/delete-nodes.js.map +0 -1
  195. package/dist/esm/reify/extract-node.d.ts.map +0 -1
  196. package/dist/esm/reify/extract-node.js.map +0 -1
  197. package/dist/esm/reify/index.d.ts.map +0 -1
  198. package/dist/esm/reify/index.js.map +0 -1
  199. package/dist/esm/reify/internal-hoist.d.ts.map +0 -1
  200. package/dist/esm/reify/internal-hoist.js.map +0 -1
  201. package/dist/esm/reify/optional-fail.d.ts.map +0 -1
  202. package/dist/esm/reify/optional-fail.js.map +0 -1
  203. package/dist/esm/reify/rollback.d.ts.map +0 -1
  204. package/dist/esm/reify/rollback.js.map +0 -1
  205. package/dist/esm/reify/update-importers-package-json.d.ts.map +0 -1
  206. package/dist/esm/reify/update-importers-package-json.js.map +0 -1
  207. package/dist/esm/remove-optional-subgraph.d.ts.map +0 -1
  208. package/dist/esm/remove-optional-subgraph.js.map +0 -1
  209. package/dist/esm/resolve-save-type.d.ts.map +0 -1
  210. package/dist/esm/resolve-save-type.js.map +0 -1
  211. package/dist/esm/stringify-node.d.ts.map +0 -1
  212. package/dist/esm/stringify-node.js.map +0 -1
  213. package/dist/esm/transfer-data/load.d.ts.map +0 -1
  214. package/dist/esm/transfer-data/load.js.map +0 -1
  215. package/dist/esm/uninstall.d.ts.map +0 -1
  216. package/dist/esm/uninstall.js.map +0 -1
  217. package/dist/esm/update.d.ts.map +0 -1
  218. package/dist/esm/update.js.map +0 -1
  219. package/dist/esm/virtual-root.d.ts.map +0 -1
  220. package/dist/esm/virtual-root.js.map +0 -1
  221. package/dist/esm/visualization/human-readable-output.d.ts.map +0 -1
  222. package/dist/esm/visualization/human-readable-output.js.map +0 -1
  223. package/dist/esm/visualization/json-output.d.ts.map +0 -1
  224. package/dist/esm/visualization/json-output.js.map +0 -1
  225. package/dist/esm/visualization/mermaid-output.d.ts.map +0 -1
  226. package/dist/esm/visualization/mermaid-output.js.map +0 -1
  227. package/dist/esm/visualization/object-like-output.d.ts.map +0 -1
  228. package/dist/esm/visualization/object-like-output.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { expandNormalizedManifestSymbols, isRecordStringString, } from '@vltpkg/types';
2
- import { defaultGitHostArchives, defaultGitHosts, defaultJsrRegistries, defaultRegistries, defaultRegistry, defaultScopeRegistries, } from '@vltpkg/spec';
2
+ import { defaultGitHostArchives, defaultGitHosts, defaultJsrRegistries, defaultRegistries, defaultRegistryName, 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
@@ -12,7 +12,10 @@ const formatNodes = (nodes, saveManifests, saveBuildData, registry, throwOnMissi
12
12
  const orderedNodes = arr.sort((a, b) => a.id.localeCompare(b.id, 'en'));
13
13
  const res = {};
14
14
  for (const node of orderedNodes) {
15
- const customRegistry = node.resolved && registry && !node.resolved.startsWith(registry);
15
+ // when no registry is configured, nothing can be reconstructed on
16
+ // load, so every resolved value has to be persisted
17
+ const customRegistry = node.resolved &&
18
+ (!registry || !node.resolved.startsWith(registry));
16
19
  const resolved = customRegistry ? node.resolved : undefined;
17
20
  // if it's in a location other than the default, stash that
18
21
  const location = node.id.startsWith('file') || node.inVltStore() ?
@@ -23,7 +26,9 @@ const formatNodes = (nodes, saveManifests, saveBuildData, registry, throwOnMissi
23
26
  if (node.integrity) {
24
27
  lockfileNode[2] = node.integrity;
25
28
  }
26
- if (resolved) {
29
+ // skip resolved for remote nodes since
30
+ // these are already part of the dep id
31
+ if (resolved && !node.id.startsWith('remote')) {
27
32
  lockfileNode[3] = resolved;
28
33
  }
29
34
  if (location) {
@@ -80,7 +85,7 @@ const removeDefaultItems = (defaultItems, items) => {
80
85
  }
81
86
  return res;
82
87
  };
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, }) => {
88
+ export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, modifiers, registry, registries, 'default-registry-alias': defaultRegistryAlias, saveManifests, saveBuildData, 'scoped-registries': scopeRegistries, 'jsr-registries': jsrRegistries, throwOnMissingManifest, }) => {
84
89
  const cleanGitHosts = isRecordStringString(gitHosts) ?
85
90
  removeDefaultItems(defaultGitHosts, gitHosts)
86
91
  : undefined;
@@ -101,7 +106,7 @@ export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts,
101
106
  : undefined;
102
107
  const hasItems = (clean) => clean && Object.keys(clean).length;
103
108
  return {
104
- lockfileVersion: 0,
109
+ lockfileVersion: LOCKFILE_VERSION,
105
110
  options: {
106
111
  ...(hasItems(cleanModifiers) ?
107
112
  { modifiers: cleanModifiers }
@@ -109,15 +114,17 @@ export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts,
109
114
  ...(hasItems(catalog) ? { catalog } : {}),
110
115
  ...(hasItems(catalogs) ? { catalogs } : {}),
111
116
  ...(hasItems(cleanScopeRegistries) ?
112
- { 'scope-registries': cleanScopeRegistries }
117
+ { 'scoped-registries': cleanScopeRegistries }
113
118
  : undefined),
114
119
  ...(hasItems(cleanJsrRegistries) ?
115
120
  { 'jsr-registries': cleanJsrRegistries }
116
121
  : undefined),
117
- ...(registry !== undefined && registry !== defaultRegistry ?
118
- { registry }
122
+ ...(registry !== undefined ? { registry } : undefined),
123
+ ...((defaultRegistryAlias !== undefined &&
124
+ defaultRegistryAlias !== defaultRegistryName) ?
125
+ { 'default-registry-alias': defaultRegistryAlias }
119
126
  : undefined),
120
- ...(hasItems(registries) ?
127
+ ...(hasItems(cleanRegistries) ?
121
128
  { registries: cleanRegistries }
122
129
  : undefined),
123
130
  ...(hasItems(cleanGitHosts) ?
@@ -170,4 +177,3 @@ export const saveHidden = (options) => {
170
177
  mkdirSync(dirname(fileName), { recursive: true });
171
178
  saveData(data, fileName, true);
172
179
  };
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.
@@ -223,6 +224,7 @@ export declare class Node implements NodeLike {
223
224
  engines?: Record<string, string>;
224
225
  os?: string[] | string;
225
226
  cpu?: string[] | string;
227
+ libc?: string[] | string;
226
228
  } | undefined;
227
229
  buildState: "none" | "needed" | "built" | "failed";
228
230
  };
@@ -230,4 +232,3 @@ export declare class Node implements NodeLike {
230
232
  }
231
233
  export declare const isNode: (value: unknown) => value is Node;
232
234
  export declare const asNode: (value: unknown) => Node;
233
- //# sourceMappingURL=node.d.ts.map
@@ -284,6 +284,11 @@ export class Node {
284
284
  const tuple = splitDepID(this.id);
285
285
  const [type, resolved] = tuple;
286
286
  switch (type) {
287
+ case 'remote': {
288
+ this.resolved = resolved;
289
+ this.integrity ??= this.manifest?.dist?.integrity;
290
+ break;
291
+ }
287
292
  case 'registry':
288
293
  this.#registryNodeResolved(tuple);
289
294
  break;
@@ -381,4 +386,3 @@ export const asNode = (value) => {
381
386
  }
382
387
  return value;
383
388
  };
384
- //# 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
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Is this error a path-safety verdict? Walks the cause chain, because
3
+ * lower layers (eg `PackageJson.read`) re-wrap what they throw.
4
+ */
5
+ export declare const isPathSecurityError: (er: unknown) => boolean;
@@ -0,0 +1,13 @@
1
+ const codes = new Set(['EINVALIDNAME']);
2
+ /**
3
+ * Is this error a path-safety verdict? Walks the cause chain, because
4
+ * lower layers (eg `PackageJson.read`) re-wrap what they throw.
5
+ */
6
+ export const isPathSecurityError = (er) => {
7
+ for (let e = er; e && typeof e === 'object'; e = e.cause) {
8
+ const { code } = e;
9
+ if (typeof code === 'string' && codes.has(code))
10
+ return true;
11
+ }
12
+ return false;
13
+ };
@@ -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
@@ -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 addEdges: (diff: Diff, scurry: PathScurry, remover: RollbackRemove) => (() => Promise<unknown>)[];
5
- //# sourceMappingURL=add-edges.d.ts.map
@@ -10,4 +10,3 @@ export const addEdges = (diff, scurry, remover) => {
10
10
  }
11
11
  return actions;
12
12
  };
13
- //# 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
- export declare const calculateSaveValue: (nodeType: string, spec: Spec, existing: string | undefined, nodeVersion: string | undefined) => string;
3
- //# sourceMappingURL=calculate-save-value.d.ts.map
2
+ export declare const calculateSaveValue: (nodeType: string, spec: Spec, existing: string | undefined, nodeVersion: string | undefined, saveExact?: boolean, savePrefix?: string) => string;
@@ -1,5 +1,11 @@
1
- const SAVE_PREFIX = '^';
2
- export const calculateSaveValue = (nodeType, spec, existing, nodeVersion) => {
1
+ const DEFAULT_SAVE_PREFIX = '^';
2
+ export const calculateSaveValue = (nodeType, spec, existing, nodeVersion, saveExact, savePrefix) => {
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' &&
@@ -19,8 +25,9 @@ export const calculateSaveValue = (nodeType, spec, existing, nodeVersion) => {
19
25
  return existing;
20
26
  }
21
27
  else {
22
- const finalRange = (spec.final.semver && spec.final.bareSpec) ||
23
- `${SAVE_PREFIX}${nodeVersion}`;
28
+ const prefix = saveExact ? '' : (savePrefix ?? DEFAULT_SAVE_PREFIX);
29
+ const finalRange = (spec.final.semver && !saveExact && spec.final.bareSpec) ||
30
+ `${prefix}${nodeVersion}`;
24
31
  // didn't have dep previously, or depended on a different thing
25
32
  // than what was requested. Update with the ^ range based on
26
33
  // the node that landed in the graph, but preserve alias prefix
@@ -42,4 +49,3 @@ export const calculateSaveValue = (nodeType, spec, existing, nodeVersion) => {
42
49
  }
43
50
  return spec.bareSpec;
44
51
  };
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
@@ -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,9 @@ export type ReifyOptions = LoadOptions & {
15
15
  packageInfo: PackageInfoClient;
16
16
  modifiers?: GraphModifier;
17
17
  remover: RollbackRemove;
18
+ update?: boolean;
19
+ saveExact?: boolean;
20
+ savePrefix?: string;
18
21
  };
19
22
  export type ReifyResult = {
20
23
  /**
@@ -31,4 +34,3 @@ export type ReifyResult = {
31
34
  * Make the current project match the supplied graph.
32
35
  */
33
36
  export declare const reify: (options: ReifyOptions) => Promise<ReifyResult>;
34
- //# sourceMappingURL=index.d.ts.map
@@ -67,9 +67,28 @@ 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
- // nothing to do, so just return the diff
72
+ if (!diff.hasChanges() || skippable) {
73
+ // Even when there are no changes to reify, ensure lockfiles
74
+ // exist on disk. This handles the case where a project has no
75
+ // dependencies (or only workspace importers) but still needs
76
+ // lockfiles written on the first install.
77
+ if (!scurry.lstatSync('vlt-lock.json') ||
78
+ !scurry.lstatSync('node_modules/.vlt-lock.json')) {
79
+ saveHidden(options);
80
+ const lfData = lockfileData(options);
81
+ saveData(lfData, scurry.resolve('vlt-lock.json'), false);
82
+ }
83
+ // Even with no reify changes, report nodes that still need building.
84
+ // Build state is persisted in the hidden lockfile and loaded into the
85
+ // actual graph, so check there for pending builds.
86
+ const pending = [...actual.nodes.values()]
87
+ .filter(n => n.buildState === 'needed')
88
+ .map(n => n.id);
89
+ if (pending.length) {
90
+ res.buildQueue = pending;
91
+ }
73
92
  done();
74
93
  return res;
75
94
  }
@@ -92,7 +111,7 @@ export const reify = async (options) => {
92
111
  };
93
112
  const reify_ = async (options, diff, remover) => {
94
113
  const res = {};
95
- const { add, remove, packageInfo, packageJson, scurry, allowScripts, } = options;
114
+ const { add, remove, packageInfo, packageJson, scurry, allowScripts, saveExact, savePrefix, } = options;
96
115
  const saveImportersPackageJson =
97
116
  /* c8 ignore next */
98
117
  add?.modifiedDependencies || remove?.modifiedDependencies ?
@@ -101,6 +120,8 @@ const reify_ = async (options, diff, remover) => {
101
120
  remove,
102
121
  graph: options.graph,
103
122
  packageJson,
123
+ saveExact,
124
+ savePrefix,
104
125
  })
105
126
  : undefined;
106
127
  // before anything else happens, grab the ideal tree as it was resolved
@@ -119,7 +140,7 @@ const reify_ = async (options, diff, remover) => {
119
140
  await internalHoist(diff.to, options, remover);
120
141
  // looks up all nodes setting buildState = 'needed'
121
142
  // on nodes that require building
122
- checkNeededBuild({ diff });
143
+ checkNeededBuild({ diff, scurry, packageJson });
123
144
  // Filter nodes allowed to run scripts if allowScripts query is provided
124
145
  const allowScriptsNodes = await filterNodesByQuery(diff.to, allowScripts);
125
146
  // ensure that all added bins are chmod +x
@@ -158,4 +179,3 @@ const reify_ = async (options, diff, remover) => {
158
179
  // returns the result object
159
180
  return res;
160
181
  };
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