@vltpkg/graph 0.0.0-9 → 1.0.0-rc.10

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 (203) hide show
  1. package/README.md +136 -1
  2. package/dist/esm/actual/load.d.ts +49 -3
  3. package/dist/esm/actual/load.d.ts.map +1 -1
  4. package/dist/esm/actual/load.js +146 -74
  5. package/dist/esm/actual/load.js.map +1 -1
  6. package/dist/esm/browser.d.ts +8 -4
  7. package/dist/esm/browser.d.ts.map +1 -1
  8. package/dist/esm/browser.js +6 -2
  9. package/dist/esm/browser.js.map +1 -1
  10. package/dist/esm/build.d.ts +29 -0
  11. package/dist/esm/build.d.ts.map +1 -0
  12. package/dist/esm/build.js +79 -0
  13. package/dist/esm/build.js.map +1 -0
  14. package/dist/esm/dependencies.d.ts +10 -3
  15. package/dist/esm/dependencies.d.ts.map +1 -1
  16. package/dist/esm/dependencies.js +63 -0
  17. package/dist/esm/dependencies.js.map +1 -1
  18. package/dist/esm/diff.d.ts +69 -0
  19. package/dist/esm/diff.d.ts.map +1 -1
  20. package/dist/esm/diff.js +25 -0
  21. package/dist/esm/diff.js.map +1 -1
  22. package/dist/esm/edge.d.ts +8 -2
  23. package/dist/esm/edge.d.ts.map +1 -1
  24. package/dist/esm/edge.js +12 -0
  25. package/dist/esm/edge.js.map +1 -1
  26. package/dist/esm/fixup-added-names.d.ts +16 -0
  27. package/dist/esm/fixup-added-names.d.ts.map +1 -0
  28. package/dist/esm/fixup-added-names.js +31 -0
  29. package/dist/esm/fixup-added-names.js.map +1 -0
  30. package/dist/esm/graph.d.ts +34 -10
  31. package/dist/esm/graph.d.ts.map +1 -1
  32. package/dist/esm/graph.js +150 -24
  33. package/dist/esm/graph.js.map +1 -1
  34. package/dist/esm/ideal/append-nodes.d.ts +12 -1
  35. package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
  36. package/dist/esm/ideal/append-nodes.js +303 -53
  37. package/dist/esm/ideal/append-nodes.js.map +1 -1
  38. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +4 -4
  39. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
  40. package/dist/esm/ideal/build-ideal-from-starting-graph.js +35 -16
  41. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
  42. package/dist/esm/ideal/build.d.ts +9 -0
  43. package/dist/esm/ideal/build.d.ts.map +1 -1
  44. package/dist/esm/ideal/build.js +31 -1
  45. package/dist/esm/ideal/build.js.map +1 -1
  46. package/dist/esm/ideal/get-importer-specs.d.ts +11 -3
  47. package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
  48. package/dist/esm/ideal/get-importer-specs.js +86 -9
  49. package/dist/esm/ideal/get-importer-specs.js.map +1 -1
  50. package/dist/esm/ideal/get-ordered-dependencies.d.ts +10 -0
  51. package/dist/esm/ideal/get-ordered-dependencies.d.ts.map +1 -0
  52. package/dist/esm/ideal/get-ordered-dependencies.js +42 -0
  53. package/dist/esm/ideal/get-ordered-dependencies.js.map +1 -0
  54. package/dist/esm/ideal/peers.d.ts +71 -0
  55. package/dist/esm/ideal/peers.d.ts.map +1 -0
  56. package/dist/esm/ideal/peers.js +318 -0
  57. package/dist/esm/ideal/peers.js.map +1 -0
  58. package/dist/esm/ideal/refresh-ideal-graph.d.ts +48 -0
  59. package/dist/esm/ideal/refresh-ideal-graph.d.ts.map +1 -0
  60. package/dist/esm/ideal/refresh-ideal-graph.js +79 -0
  61. package/dist/esm/ideal/refresh-ideal-graph.js.map +1 -0
  62. package/dist/esm/ideal/types.d.ts +78 -1
  63. package/dist/esm/ideal/types.d.ts.map +1 -1
  64. package/dist/esm/ideal/types.js.map +1 -1
  65. package/dist/esm/index.d.ts +9 -4
  66. package/dist/esm/index.d.ts.map +1 -1
  67. package/dist/esm/index.js +5 -1
  68. package/dist/esm/index.js.map +1 -1
  69. package/dist/esm/install.d.ts +10 -4
  70. package/dist/esm/install.d.ts.map +1 -1
  71. package/dist/esm/install.js +191 -20
  72. package/dist/esm/install.js.map +1 -1
  73. package/dist/esm/lockfile/load-edges.d.ts +8 -1
  74. package/dist/esm/lockfile/load-edges.d.ts.map +1 -1
  75. package/dist/esm/lockfile/load-edges.js +80 -15
  76. package/dist/esm/lockfile/load-edges.js.map +1 -1
  77. package/dist/esm/lockfile/load-nodes.d.ts +3 -2
  78. package/dist/esm/lockfile/load-nodes.d.ts.map +1 -1
  79. package/dist/esm/lockfile/load-nodes.js +85 -13
  80. package/dist/esm/lockfile/load-nodes.js.map +1 -1
  81. package/dist/esm/lockfile/load.d.ts +18 -5
  82. package/dist/esm/lockfile/load.d.ts.map +1 -1
  83. package/dist/esm/lockfile/load.js +28 -20
  84. package/dist/esm/lockfile/load.js.map +1 -1
  85. package/dist/esm/lockfile/save.d.ts +16 -3
  86. package/dist/esm/lockfile/save.d.ts.map +1 -1
  87. package/dist/esm/lockfile/save.js +64 -17
  88. package/dist/esm/lockfile/save.js.map +1 -1
  89. package/dist/esm/lockfile/types.d.ts +34 -4
  90. package/dist/esm/lockfile/types.d.ts.map +1 -1
  91. package/dist/esm/lockfile/types.js +31 -0
  92. package/dist/esm/lockfile/types.js.map +1 -1
  93. package/dist/esm/modifiers.d.ts +189 -0
  94. package/dist/esm/modifiers.d.ts.map +1 -0
  95. package/dist/esm/modifiers.js +330 -0
  96. package/dist/esm/modifiers.js.map +1 -0
  97. package/dist/esm/node.d.ts +91 -6
  98. package/dist/esm/node.d.ts.map +1 -1
  99. package/dist/esm/node.js +119 -5
  100. package/dist/esm/node.js.map +1 -1
  101. package/dist/esm/reify/add-edge.d.ts +1 -2
  102. package/dist/esm/reify/add-edge.d.ts.map +1 -1
  103. package/dist/esm/reify/add-edge.js +29 -18
  104. package/dist/esm/reify/add-edge.js.map +1 -1
  105. package/dist/esm/reify/add-edges.d.ts +1 -2
  106. package/dist/esm/reify/add-edges.d.ts.map +1 -1
  107. package/dist/esm/reify/add-edges.js +3 -3
  108. package/dist/esm/reify/add-edges.js.map +1 -1
  109. package/dist/esm/reify/add-nodes.d.ts.map +1 -1
  110. package/dist/esm/reify/add-nodes.js +4 -27
  111. package/dist/esm/reify/add-nodes.js.map +1 -1
  112. package/dist/esm/reify/bin-chmod.d.ts +11 -0
  113. package/dist/esm/reify/bin-chmod.d.ts.map +1 -0
  114. package/dist/esm/reify/bin-chmod.js +39 -0
  115. package/dist/esm/reify/bin-chmod.js.map +1 -0
  116. package/dist/esm/reify/build.d.ts +10 -1
  117. package/dist/esm/reify/build.d.ts.map +1 -1
  118. package/dist/esm/reify/build.js +36 -23
  119. package/dist/esm/reify/build.js.map +1 -1
  120. package/dist/esm/reify/calculate-save-value.d.ts +3 -0
  121. package/dist/esm/reify/calculate-save-value.d.ts.map +1 -0
  122. package/dist/esm/reify/calculate-save-value.js +45 -0
  123. package/dist/esm/reify/calculate-save-value.js.map +1 -0
  124. package/dist/esm/reify/check-needed-build.d.ts +25 -0
  125. package/dist/esm/reify/check-needed-build.d.ts.map +1 -0
  126. package/dist/esm/reify/check-needed-build.js +50 -0
  127. package/dist/esm/reify/check-needed-build.js.map +1 -0
  128. package/dist/esm/reify/delete-edge.d.ts.map +1 -1
  129. package/dist/esm/reify/delete-edge.js +3 -4
  130. package/dist/esm/reify/delete-edge.js.map +1 -1
  131. package/dist/esm/reify/extract-node.d.ts +24 -0
  132. package/dist/esm/reify/extract-node.d.ts.map +1 -0
  133. package/dist/esm/reify/extract-node.js +84 -0
  134. package/dist/esm/reify/extract-node.js.map +1 -0
  135. package/dist/esm/reify/index.d.ts +18 -1
  136. package/dist/esm/reify/index.d.ts.map +1 -1
  137. package/dist/esm/reify/index.js +85 -15
  138. package/dist/esm/reify/index.js.map +1 -1
  139. package/dist/esm/reify/internal-hoist.d.ts +9 -0
  140. package/dist/esm/reify/internal-hoist.d.ts.map +1 -0
  141. package/dist/esm/reify/internal-hoist.js +134 -0
  142. package/dist/esm/reify/internal-hoist.js.map +1 -0
  143. package/dist/esm/reify/update-importers-package-json.d.ts +1 -1
  144. package/dist/esm/reify/update-importers-package-json.d.ts.map +1 -1
  145. package/dist/esm/reify/update-importers-package-json.js +33 -24
  146. package/dist/esm/reify/update-importers-package-json.js.map +1 -1
  147. package/dist/esm/remove-optional-subgraph.js +1 -1
  148. package/dist/esm/remove-optional-subgraph.js.map +1 -1
  149. package/dist/esm/resolve-save-type.d.ts +1 -2
  150. package/dist/esm/resolve-save-type.d.ts.map +1 -1
  151. package/dist/esm/resolve-save-type.js.map +1 -1
  152. package/dist/esm/stringify-node.d.ts +1 -1
  153. package/dist/esm/stringify-node.d.ts.map +1 -1
  154. package/dist/esm/stringify-node.js +10 -1
  155. package/dist/esm/stringify-node.js.map +1 -1
  156. package/dist/esm/transfer-data/load.d.ts +44 -0
  157. package/dist/esm/transfer-data/load.d.ts.map +1 -0
  158. package/dist/esm/transfer-data/load.js +176 -0
  159. package/dist/esm/transfer-data/load.js.map +1 -0
  160. package/dist/esm/uninstall.d.ts +5 -4
  161. package/dist/esm/uninstall.d.ts.map +1 -1
  162. package/dist/esm/uninstall.js +61 -19
  163. package/dist/esm/uninstall.js.map +1 -1
  164. package/dist/esm/update.d.ts +13 -0
  165. package/dist/esm/update.d.ts.map +1 -0
  166. package/dist/esm/update.js +73 -0
  167. package/dist/esm/update.js.map +1 -0
  168. package/dist/esm/virtual-root.d.ts +16 -0
  169. package/dist/esm/virtual-root.d.ts.map +1 -0
  170. package/dist/esm/virtual-root.js +79 -0
  171. package/dist/esm/virtual-root.js.map +1 -0
  172. package/dist/esm/visualization/human-readable-output.d.ts +4 -5
  173. package/dist/esm/visualization/human-readable-output.d.ts.map +1 -1
  174. package/dist/esm/visualization/human-readable-output.js +47 -19
  175. package/dist/esm/visualization/human-readable-output.js.map +1 -1
  176. package/dist/esm/visualization/json-output.d.ts +7 -2
  177. package/dist/esm/visualization/json-output.d.ts.map +1 -1
  178. package/dist/esm/visualization/json-output.js +35 -12
  179. package/dist/esm/visualization/json-output.js.map +1 -1
  180. package/dist/esm/visualization/mermaid-output.d.ts +7 -1
  181. package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
  182. package/dist/esm/visualization/mermaid-output.js +110 -14
  183. package/dist/esm/visualization/mermaid-output.js.map +1 -1
  184. package/dist/esm/visualization/object-like-output.d.ts +1 -1
  185. package/dist/esm/visualization/object-like-output.d.ts.map +1 -1
  186. package/dist/esm/visualization/object-like-output.js.map +1 -1
  187. package/package.json +35 -29
  188. package/dist/esm/ideal/add-nodes.d.ts +0 -19
  189. package/dist/esm/ideal/add-nodes.d.ts.map +0 -1
  190. package/dist/esm/ideal/add-nodes.js +0 -32
  191. package/dist/esm/ideal/add-nodes.js.map +0 -1
  192. package/dist/esm/ideal/remove-nodes.d.ts +0 -7
  193. package/dist/esm/ideal/remove-nodes.d.ts.map +0 -1
  194. package/dist/esm/ideal/remove-nodes.js +0 -19
  195. package/dist/esm/ideal/remove-nodes.js.map +0 -1
  196. package/dist/esm/reify/bin-paths.d.ts +0 -4
  197. package/dist/esm/reify/bin-paths.d.ts.map +0 -1
  198. package/dist/esm/reify/bin-paths.js +0 -23
  199. package/dist/esm/reify/bin-paths.js.map +0 -1
  200. package/dist/esm/types.d.ts +0 -42
  201. package/dist/esm/types.d.ts.map +0 -1
  202. package/dist/esm/types.js +0 -2
  203. package/dist/esm/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"load-edges.js","sourceRoot":"","sources":["../../../src/lockfile/load-edges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAQ1D,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAAgB,EAChB,KAA4B,EAC5B,OAAoB,EACpB,EAAE;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAGjC,CAAA;IACH,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QACjD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QACnD,MAAM,OAAO,GAAG,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QAC/C,0BAA0B;QAC1B,qBAAqB;QACrB,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChE,SAAQ;QACV,CAAC;QACD,oBAAoB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACrB,QAAQ,EACR,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,EAC7B,OAAO,CACR,CAAA;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,KAAK,CAAC,mCAAmC,EAAE;gBAC/C,KAAK,EAAE;oBACL,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACzC,IAAI;oBACJ,MAAM;oBACN,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE;iBACvB;aACF,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,EAAE,GACN,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACjE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,CAAC,+CAA+C,EAAE;gBAC3D,YAAY,EAAE,CAAC,GAAG,mBAAmB,CAAC;aACvC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IACxC,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { asDepID } from '@vltpkg/dep-id/browser'\nimport { error } from '@vltpkg/error-cause'\nimport { fastSplit } from '@vltpkg/fast-split'\nimport { Spec } from '@vltpkg/spec/browser'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport { isDependencyTypeShort } from '../dependencies.ts'\nimport type { GraphLike } from '../types.ts'\nimport type {\n LockfileData,\n LockfileEdgeKey,\n LockfileEdgeValue,\n} from './types.ts'\n\nexport const loadEdges = (\n graph: GraphLike,\n edges: LockfileData['edges'],\n options: SpecOptions,\n) => {\n const entries = Object.entries(edges) as [\n LockfileEdgeKey,\n LockfileEdgeValue,\n ][]\n for (const [key, value] of entries) {\n const [fromId, specName] = fastSplit(key, ' ', 2)\n const [depType, valRest] = fastSplit(value, ' ', 2)\n const vrSplit = valRest?.lastIndexOf(' ') ?? -1\n // not a valid edge record\n /* c8 ignore start */\n if (!valRest || !depType || !fromId || !specName || vrSplit < 1) {\n continue\n }\n /* c8 ignore stop */\n const spec = Spec.parse(\n specName,\n valRest.substring(0, vrSplit),\n options,\n )\n const toId = valRest.substring(vrSplit + 1)\n const from = graph.nodes.get(asDepID(fromId))\n if (!from) {\n throw error('Edge info missing its `from` node', {\n found: {\n nodes: [...graph.nodes].map(([id]) => id),\n from,\n fromId,\n edge: { [key]: value },\n },\n })\n }\n const to =\n toId === 'MISSING' ? undefined : graph.nodes.get(asDepID(toId))\n if (!isDependencyTypeShort(depType)) {\n throw error('Found unsupported dependency type in lockfile', {\n validOptions: [...longDependencyTypes],\n })\n }\n graph.addEdge(depType, spec, from, to)\n }\n}\n"]}
1
+ {"version":3,"file":"load-edges.js","sourceRoot":"","sources":["../../../src/lockfile/load-edges.ts"],"names":[],"mappings":"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","sourcesContent":["import { asDepID } from '@vltpkg/dep-id/browser'\nimport { error } from '@vltpkg/error-cause'\nimport { fastSplit } from '@vltpkg/fast-split'\nimport { Spec } from '@vltpkg/spec/browser'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport type {\n DependencyTypeShort,\n GraphLike,\n NodeLike,\n} from '@vltpkg/types'\nimport { isDependencyTypeShort } from '../dependencies.ts'\nimport type {\n LockfileData,\n LockfileEdgeKey,\n LockfileEdgeValue,\n} from './types.ts'\n\nexport type ProcessingEdge = {\n fromNode: NodeLike\n toNode: NodeLike | undefined\n depType: DependencyTypeShort\n spec: Spec\n}\n\nconst retrieveNodeFromGraph = (\n key: string,\n value: string,\n graph: GraphLike,\n fromId: string,\n seenNodes?: Map<string, NodeLike>,\n): NodeLike => {\n const foundNode = graph.nodes.get(asDepID(fromId))\n if (!foundNode) {\n throw error('Edge info missing its `from` node', {\n found: {\n nodes: [...graph.nodes].map(([id]) => id),\n from: foundNode,\n fromId,\n edge: { [key]: value },\n },\n })\n }\n if (seenNodes) {\n seenNodes.set(fromId, foundNode)\n }\n return foundNode\n}\n\nexport const loadEdges = (\n graph: GraphLike,\n edges: LockfileData['edges'],\n options: SpecOptions,\n) => {\n const entries = Object.entries(edges) as [\n LockfileEdgeKey,\n LockfileEdgeValue,\n ][]\n\n const edgeCount = entries.length\n // Only use optimizations for non-trivial graphs\n const useOptimizations = edgeCount > 50\n const edgeProcessingQueue: ProcessingEdge[] = []\n\n // Cache for frequently accessed nodes to avoid repeated Map lookups\n const seenNodes =\n useOptimizations ? new Map<string, NodeLike>() : undefined\n\n for (const [key, value] of entries) {\n const [fromId, specName] = fastSplit(key, ' ', 2)\n const [depType, valRest] = fastSplit(value, ' ', 2)\n const vrSplit = valRest?.lastIndexOf(' ') ?? -1\n\n // not a valid edge record\n /* c8 ignore start */\n if (!valRest || !depType || !fromId || !specName || vrSplit < 1) {\n continue\n }\n /* c8 ignore stop */\n\n // Validate dependency type early\n if (!isDependencyTypeShort(depType)) {\n throw error('Found unsupported dependency type in lockfile', {\n validOptions: [...longDependencyTypes],\n })\n }\n\n // Use cached node lookup for large graphs, direct lookup for small ones\n let fromNode: NodeLike\n if (seenNodes) {\n const seen = seenNodes.get(fromId)\n if (seen) {\n fromNode = seen\n } else {\n fromNode = retrieveNodeFromGraph(\n key,\n value,\n graph,\n fromId,\n seenNodes,\n )\n }\n } else {\n fromNode = retrieveNodeFromGraph(key, value, graph, fromId)\n }\n\n const toId = valRest.substring(vrSplit + 1)\n let toNode: NodeLike | undefined = undefined\n\n if (toId !== 'MISSING') {\n if (seenNodes) {\n const seen = seenNodes.get(toId)\n if (seen) {\n toNode = seen\n } else {\n toNode = graph.nodes.get(asDepID(toId))\n if (toNode) {\n seenNodes.set(toId, toNode)\n }\n }\n } else {\n toNode = graph.nodes.get(asDepID(toId))\n }\n }\n\n // Parse spec once we know the nodes are valid\n const spec = Spec.parse(specName, valRest.substring(0, vrSplit), {\n ...options,\n registry: fromNode.registry,\n })\n\n if (useOptimizations) {\n edgeProcessingQueue.push({\n fromNode,\n toNode,\n depType,\n spec,\n })\n } else {\n // Process immediately for small graphs\n graph.addEdge(depType, spec, fromNode, toNode)\n }\n }\n\n // Batch process all edges (only for non-trivial graphs)\n if (useOptimizations) {\n for (const {\n fromNode,\n toNode,\n depType,\n spec,\n } of edgeProcessingQueue) {\n graph.addEdge(depType, spec, fromNode, toNode)\n }\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { LockfileData } from './types.ts';
2
- import type { GraphLike } from '../types.ts';
3
- export declare const loadNodes: (graph: GraphLike, nodes: LockfileData["nodes"]) => void;
2
+ import type { GraphLike } from '@vltpkg/types';
3
+ import type { SpecOptions } from '@vltpkg/spec/browser';
4
+ export declare const loadNodes: (graph: GraphLike, nodes: LockfileData["nodes"], options: SpecOptions, actual?: GraphLike, throwOnMissingManifest?: boolean) => void;
4
5
  //# sourceMappingURL=load-nodes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-nodes.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load-nodes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,eAAO,MAAM,SAAS,UACb,SAAS,SACT,YAAY,CAAC,OAAO,CAAC,SAmC7B,CAAA"}
1
+ {"version":3,"file":"load-nodes.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load-nodes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,eAAO,MAAM,SAAS,UACb,SAAS,SACT,YAAY,CAAC,OAAO,CAAC,WACnB,WAAW,WACX,SAAS,2BACO,OAAO,SAmIjC,CAAA"}
@@ -1,30 +1,102 @@
1
- import { splitDepID } from '@vltpkg/dep-id/browser';
2
- import { getBooleanFlagsFromNum } from "./types.js";
3
- export const loadNodes = (graph, nodes) => {
1
+ import { error } from '@vltpkg/error-cause';
2
+ import { splitDepID, splitExtra } from '@vltpkg/dep-id/browser';
3
+ import { getBooleanFlagsFromNum, getBuildStateFromNum, } from "./types.js";
4
+ export const loadNodes = (graph, nodes, options, actual, throwOnMissingManifest) => {
4
5
  const entries = Object.entries(nodes);
6
+ const nodeCount = entries.length;
7
+ // Batch process registry spec parsing (only for large graphs)
8
+ // Only used for non-trivial graphs
9
+ const registryVersionCache = nodeCount > 50 ? new Map() : null;
5
10
  for (const [id, lockfileNode] of entries) {
11
+ const [flags, name, integrity, resolved, location, manifest, rawManifest, platform, bins, buildState,] = lockfileNode;
6
12
  // workspace nodes and the project root node are already part of the
7
13
  // graph and it should not create new nodes if an existing one is there
8
14
  if (graph.nodes.has(id))
9
15
  continue;
10
- const [flags, name, integrity, resolved, location, manifest] = lockfileNode;
11
- const [type, , spec] = splitDepID(id);
16
+ const [type, filepath, maybeExtra, lastExtra] = splitDepID(id);
17
+ const extra = type === 'registry' || type === 'git' ? lastExtra : maybeExtra;
18
+ const registrySpec = maybeExtra;
19
+ // The reference node is a node that matches the same id from the
20
+ // current iterating node in the provided `actual` graph, this allows
21
+ // for hydrating missing manifest, integrity, and resolved values
22
+ // that may be missing from the lockfile
23
+ const referenceNode = actual?.nodes.get(id);
24
+ const mani = manifest ?? referenceNode?.manifest;
25
+ // Throw if manifest is missing and the option is enabled
26
+ if (!mani && throwOnMissingManifest) {
27
+ throw error(`Missing manifest for node ${id} and no reference node found.`);
28
+ }
29
+ // Optimize registry version extraction with caching for large graphs
30
+ let version;
31
+ if (type === 'registry' &&
32
+ registrySpec &&
33
+ registrySpec.indexOf('@') > 0) {
34
+ if (registryVersionCache) {
35
+ const seenVersion = registryVersionCache.get(registrySpec);
36
+ /* c8 ignore start */
37
+ if (seenVersion) {
38
+ version = seenVersion;
39
+ }
40
+ else {
41
+ version = registrySpec.split('@').slice(-1)[0] || undefined;
42
+ /* c8 ignore stop */
43
+ if (version) {
44
+ registryVersionCache.set(registrySpec, version);
45
+ }
46
+ }
47
+ }
48
+ else {
49
+ version = registrySpec.split('@').slice(-1)[0] || undefined;
50
+ }
51
+ }
12
52
  // if the lockfile has manifest data then it should just use that
13
53
  // otherwise tries to infer name / version value from the lockfile node
14
- const node = manifest ?
15
- graph.addNode(id, manifest)
16
- : graph.addNode(id, undefined, undefined, name ?? undefined, type === 'registry' && spec.indexOf('@') > 0 ?
17
- spec.split('@').slice(-1)[0]
18
- : undefined);
54
+ const node = mani ?
55
+ graph.addNode(id, mani)
56
+ : graph.addNode(id, undefined, undefined, name ?? undefined, version);
57
+ if (extra) {
58
+ const { modifier, peerSetHash } = splitExtra(extra);
59
+ if (modifier) {
60
+ node.modifier = modifier;
61
+ }
62
+ if (peerSetHash) {
63
+ node.peerSetHash = peerSetHash;
64
+ }
65
+ }
19
66
  const { dev, optional } = getBooleanFlagsFromNum(flags);
67
+ node.options = options;
20
68
  node.dev = dev;
21
69
  node.optional = optional;
22
- node.integrity = integrity ?? undefined;
23
- node.resolved = resolved ?? undefined;
70
+ node.integrity = integrity ?? referenceNode?.integrity;
71
+ node.resolved =
72
+ type === 'remote' ? filepath : ((resolved ?? referenceNode?.resolved));
73
+ node.projectRoot = graph.projectRoot;
24
74
  if (!node.resolved)
25
75
  node.setResolved();
26
- if (location)
76
+ if (location) {
27
77
  node.location = location;
78
+ }
79
+ else {
80
+ // set the location to file dependencies based on the id value
81
+ if (type === 'file') {
82
+ node.location = filepath;
83
+ }
84
+ }
85
+ if (mani && rawManifest) {
86
+ node.setConfusedManifest(mani, rawManifest);
87
+ }
88
+ // Set platform data if provided
89
+ if (platform) {
90
+ node.platform = platform;
91
+ }
92
+ // optionally set bin data if provided
93
+ if (bins) {
94
+ node.bins = bins;
95
+ }
96
+ // Set build state if provided
97
+ if (buildState !== undefined && buildState !== null) {
98
+ node.buildState = getBuildStateFromNum(buildState);
99
+ }
28
100
  }
29
101
  };
30
102
  //# sourceMappingURL=load-nodes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-nodes.js","sourceRoot":"","sources":["../../../src/lockfile/load-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAKnD,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAAgB,EAChB,KAA4B,EAC5B,EAAE;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAA4B,CAAA;IAChE,KAAK,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,oEAAoE;QACpE,uEAAuE;QACvE,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAQ;QAEjC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAC1D,YAAY,CAAA;QACd,MAAM,CAAC,IAAI,EAAE,AAAD,EAAG,IAAI,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAA;QAErC,iEAAiE;QACjE,uEAAuE;QACvE,MAAM,IAAI,GACR,QAAQ,CAAC,CAAC;YACR,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC;YAC7B,CAAC,CAAC,KAAK,CAAC,OAAO,CACX,EAAE,EACF,SAAS,EACT,SAAS,EACT,IAAI,IAAI,SAAS,EACjB,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC,CAAC,SAAS,CACZ,CAAA;QAEL,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAA;QACvD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,SAAS,CAAA;QACvC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,SAAS,CAAA;QACrC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,WAAW,EAAE,CAAA;QACtC,IAAI,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACxC,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { splitDepID } from '@vltpkg/dep-id/browser'\nimport { getBooleanFlagsFromNum } from './types.ts'\nimport type { LockfileData, LockfileNode } from './types.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { GraphLike } from '../types.ts'\n\nexport const loadNodes = (\n graph: GraphLike,\n nodes: LockfileData['nodes'],\n) => {\n const entries = Object.entries(nodes) as [DepID, LockfileNode][]\n for (const [id, lockfileNode] of entries) {\n // workspace nodes and the project root node are already part of the\n // graph and it should not create new nodes if an existing one is there\n if (graph.nodes.has(id)) continue\n\n const [flags, name, integrity, resolved, location, manifest] =\n lockfileNode\n const [type, , spec] = splitDepID(id)\n\n // if the lockfile has manifest data then it should just use that\n // otherwise tries to infer name / version value from the lockfile node\n const node =\n manifest ?\n graph.addNode(id, manifest)\n : graph.addNode(\n id,\n undefined,\n undefined,\n name ?? undefined,\n type === 'registry' && spec.indexOf('@') > 0 ?\n spec.split('@').slice(-1)[0]\n : undefined,\n )\n\n const { dev, optional } = getBooleanFlagsFromNum(flags)\n node.dev = dev\n node.optional = optional\n node.integrity = integrity ?? undefined\n node.resolved = resolved ?? undefined\n if (!node.resolved) node.setResolved()\n if (location) node.location = location\n }\n}\n"]}
1
+ {"version":3,"file":"load-nodes.js","sourceRoot":"","sources":["../../../src/lockfile/load-nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport { splitDepID, splitExtra } from '@vltpkg/dep-id/browser'\nimport {\n getBooleanFlagsFromNum,\n getBuildStateFromNum,\n} from './types.ts'\nimport type { LockfileData, LockfileNode } from './types.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { GraphLike } from '@vltpkg/types'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\n\nexport const loadNodes = (\n graph: GraphLike,\n nodes: LockfileData['nodes'],\n options: SpecOptions,\n actual?: GraphLike,\n throwOnMissingManifest?: boolean,\n) => {\n const entries = Object.entries(nodes) as [DepID, LockfileNode][]\n const nodeCount = entries.length\n\n // Batch process registry spec parsing (only for large graphs)\n // Only used for non-trivial graphs\n const registryVersionCache =\n nodeCount > 50 ? new Map<string, string>() : null\n\n for (const [id, lockfileNode] of entries) {\n const [\n flags,\n name,\n integrity,\n resolved,\n location,\n manifest,\n rawManifest,\n platform,\n bins,\n buildState,\n ] = lockfileNode\n // workspace nodes and the project root node are already part of the\n // graph and it should not create new nodes if an existing one is there\n if (graph.nodes.has(id)) continue\n\n const [type, filepath, maybeExtra, lastExtra] = splitDepID(id)\n const extra =\n type === 'registry' || type === 'git' ? lastExtra : maybeExtra\n const registrySpec = maybeExtra\n\n // The reference node is a node that matches the same id from the\n // current iterating node in the provided `actual` graph, this allows\n // for hydrating missing manifest, integrity, and resolved values\n // that may be missing from the lockfile\n const referenceNode = actual?.nodes.get(id)\n const mani = manifest ?? referenceNode?.manifest\n\n // Throw if manifest is missing and the option is enabled\n if (!mani && throwOnMissingManifest) {\n throw error(\n `Missing manifest for node ${id} and no reference node found.`,\n )\n }\n\n // Optimize registry version extraction with caching for large graphs\n let version: string | undefined\n if (\n type === 'registry' &&\n registrySpec &&\n registrySpec.indexOf('@') > 0\n ) {\n if (registryVersionCache) {\n const seenVersion = registryVersionCache.get(registrySpec)\n /* c8 ignore start */\n if (seenVersion) {\n version = seenVersion\n } else {\n version = registrySpec.split('@').slice(-1)[0] || undefined\n /* c8 ignore stop */\n if (version) {\n registryVersionCache.set(registrySpec, version)\n }\n }\n } else {\n version = registrySpec.split('@').slice(-1)[0] || undefined\n }\n }\n\n // if the lockfile has manifest data then it should just use that\n // otherwise tries to infer name / version value from the lockfile node\n const node =\n mani ?\n graph.addNode(id, mani)\n : graph.addNode(\n id,\n undefined,\n undefined,\n name ?? undefined,\n version,\n )\n\n if (extra) {\n const { modifier, peerSetHash } = splitExtra(extra)\n if (modifier) {\n node.modifier = modifier\n }\n if (peerSetHash) {\n node.peerSetHash = peerSetHash\n }\n }\n\n const { dev, optional } = getBooleanFlagsFromNum(flags)\n node.options = options\n node.dev = dev\n node.optional = optional\n node.integrity = integrity ?? referenceNode?.integrity\n node.resolved =\n type === 'remote' ? filepath : (\n (resolved ?? referenceNode?.resolved)\n )\n node.projectRoot = graph.projectRoot\n if (!node.resolved) node.setResolved()\n if (location) {\n node.location = location\n } else {\n // set the location to file dependencies based on the id value\n if (type === 'file') {\n node.location = filepath\n }\n }\n if (mani && rawManifest) {\n node.setConfusedManifest(mani, rawManifest)\n }\n\n // Set platform data if provided\n if (platform) {\n node.platform = platform\n }\n\n // optionally set bin data if provided\n if (bins) {\n node.bins = bins\n }\n\n // Set build state if provided\n if (buildState !== undefined && buildState !== null) {\n node.buildState = getBuildStateFromNum(buildState)\n }\n }\n}\n"]}
@@ -1,11 +1,16 @@
1
1
  import { PackageJson } from '@vltpkg/package-json';
2
- import type { Manifest } from '@vltpkg/types';
3
2
  import { Monorepo } from '@vltpkg/workspaces';
4
- import type { SpecOptions } from '@vltpkg/spec';
5
- import type { PathScurry } from 'path-scurry';
6
3
  import { Graph } from '../graph.ts';
4
+ import type { PathScurry } from 'path-scurry';
5
+ import type { NormalizedManifest } from '@vltpkg/types';
6
+ import type { SpecOptions } from '@vltpkg/spec';
7
7
  import type { LockfileData } from './types.ts';
8
+ import type { GraphModifier } from '../modifiers.ts';
8
9
  export type LoadOptions = SpecOptions & {
10
+ /**
11
+ * An optional {@link Graph} object to hydrate extra data from.
12
+ */
13
+ actual?: Graph;
9
14
  /**
10
15
  * The project root dirname.
11
16
  */
@@ -13,7 +18,11 @@ export type LoadOptions = SpecOptions & {
13
18
  /**
14
19
  * The project root manifest.
15
20
  */
16
- mainManifest: Manifest;
21
+ mainManifest: NormalizedManifest;
22
+ /**
23
+ * The graph modifiers helper object.
24
+ */
25
+ modifiers?: GraphModifier;
17
26
  /**
18
27
  * A {@link Monorepo} object, for managing workspaces
19
28
  */
@@ -26,8 +35,12 @@ export type LoadOptions = SpecOptions & {
26
35
  * A {@link PathScurry} object, for use in globs
27
36
  */
28
37
  scurry?: PathScurry;
38
+ /**
39
+ * Whether to throw an error if a manifest is missing when loading nodes.
40
+ */
41
+ throwOnMissingManifest?: boolean;
29
42
  };
30
43
  export declare const load: (options: LoadOptions) => Graph;
31
44
  export declare const loadHidden: (options: LoadOptions) => Graph;
32
- export declare const loadObject: (options: LoadOptions, lockfileData: LockfileData) => Graph;
45
+ export declare const loadObject: (options: LoadOptions, lockfileData: Omit<LockfileData, "options" | "lockfileVersion"> & Partial<Pick<LockfileData, "options" | "lockfileVersion">>) => Graph;
33
46
  //# sourceMappingURL=load.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,EAAE,QAAQ,CAAA;IACtB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB,CAAA;AASD,eAAO,MAAM,IAAI,YAAa,WAAW,KAAG,KAM3C,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,WAAW,KAAG,KAMjD,CAAA;AAED,eAAO,MAAM,UAAU,YACZ,WAAW,gBACN,YAAY,UA6C3B,CAAA"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAK7C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAA;IACd;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,EAAE,kBAAkB,CAAA;IAChC;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC,CAAA;AASD,eAAO,MAAM,IAAI,YAAa,WAAW,KAAG,KAM3C,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,WAAW,KAAG,KAQjD,CAAA;AAED,eAAO,MAAM,UAAU,YACZ,WAAW,gBACN,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,iBAAiB,CAAC,GAC7D,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC,UAgE7D,CAAA"}
@@ -14,6 +14,8 @@ export const load = (options) => {
14
14
  };
15
15
  export const loadHidden = (options) => {
16
16
  const { projectRoot } = options;
17
+ // Ensure that missing manifests throw an error when loading hidden lockfiles
18
+ options.throwOnMissingManifest = true;
17
19
  return loadObject(options, loadLockfile(projectRoot, 'node_modules/.vlt-lock.json'));
18
20
  };
19
21
  export const loadObject = (options, lockfileData) => {
@@ -21,36 +23,42 @@ export const loadObject = (options, lockfileData) => {
21
23
  const packageJson = options.packageJson ?? new PackageJson();
22
24
  const monorepo = options.monorepo ??
23
25
  Monorepo.maybeLoad(options.projectRoot, { packageJson, scurry });
24
- const { 'scope-registries': scopeRegistries, registry, registries, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives,
25
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
26
- } = lockfileData.options || {};
26
+ const { catalog = {}, catalogs = {}, 'scope-registries': scopeRegistries, registry, registries, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives,
27
+ /* c8 ignore next */
28
+ } = lockfileData.options ?? {};
29
+ // Optimize options merging - only create new objects when needed
27
30
  const mergedOptions = {
28
31
  ...options,
29
- 'scope-registries': {
30
- ...options['scope-registries'],
31
- ...scopeRegistries,
32
- },
32
+ catalog,
33
+ catalogs,
34
+ 'scope-registries': scopeRegistries ?
35
+ { ...options['scope-registries'], ...scopeRegistries }
36
+ : options['scope-registries'],
33
37
  registry: registry ?? options.registry,
34
- registries: {
35
- ...options.registries,
36
- ...registries,
37
- },
38
- 'git-hosts': {
39
- ...options['git-hosts'],
40
- ...gitHosts,
41
- },
42
- 'git-host-archives': {
43
- ...options['git-host-archives'],
44
- ...gitHostArchives,
45
- },
38
+ registries: registries ?
39
+ { ...options.registries, ...registries }
40
+ : options.registries,
41
+ 'git-hosts': gitHosts ?
42
+ { ...options['git-hosts'], ...gitHosts }
43
+ : options['git-hosts'],
44
+ 'git-host-archives': gitHostArchives ?
45
+ { ...options['git-host-archives'], ...gitHostArchives }
46
+ : options['git-host-archives'],
46
47
  };
47
48
  const graph = new Graph({
48
49
  ...mergedOptions,
49
50
  mainManifest,
50
51
  monorepo,
51
52
  });
52
- loadNodes(graph, lockfileData.nodes);
53
+ loadNodes(graph, lockfileData.nodes, mergedOptions, options.actual, options.throwOnMissingManifest);
53
54
  loadEdges(graph, lockfileData.edges, mergedOptions);
55
+ // hydrate missing node-level registry data
56
+ for (const node of graph.nodes.values()) {
57
+ const [firstEdge] = node.edgesIn;
58
+ if (firstEdge?.spec.registry) {
59
+ node.registry = firstEdge.spec.registry;
60
+ }
61
+ }
54
62
  return graph;
55
63
  };
56
64
  //# sourceMappingURL=load.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/lockfile/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AA0BnC,MAAM,YAAY,GAAG,CAAC,WAAmB,EAAE,YAAoB,EAAE,EAAE,CACjE,IAAI,CAAC,KAAK,CACR,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE;IAC/C,QAAQ,EAAE,MAAM;CACjB,CAAC,CACa,CAAA;AAEnB,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAAoB,EAAS,EAAE;IAClD,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;IAC/B,OAAO,UAAU,CACf,OAAO,EACP,YAAY,CAAC,WAAW,EAAE,eAAe,CAAC,CAC3C,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAS,EAAE;IACxD,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;IAC/B,OAAO,UAAU,CACf,OAAO,EACP,YAAY,CAAC,WAAW,EAAE,6BAA6B,CAAC,CACzD,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,OAAoB,EACpB,YAA0B,EAC1B,EAAE;IACF,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,WAAW,EAAE,CAAA;IAC5D,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ;QAChB,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAA;IAClE,MAAM,EACJ,kBAAkB,EAAE,eAAe,EACnC,QAAQ,EACR,UAAU,EACV,WAAW,EAAE,QAAQ,EACrB,mBAAmB,EAAE,eAAe;IACpC,uEAAuE;MACxE,GAAG,YAAY,CAAC,OAAO,IAAI,EAAE,CAAA;IAC9B,MAAM,aAAa,GAAG;QACpB,GAAG,OAAO;QACV,kBAAkB,EAAE;YAClB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAC9B,GAAG,eAAe;SACnB;QACD,QAAQ,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ;QACtC,UAAU,EAAE;YACV,GAAG,OAAO,CAAC,UAAU;YACrB,GAAG,UAAU;SACd;QACD,WAAW,EAAE;YACX,GAAG,OAAO,CAAC,WAAW,CAAC;YACvB,GAAG,QAAQ;SACZ;QACD,mBAAmB,EAAE;YACnB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAC/B,GAAG,eAAe;SACnB;KACF,CAAA;IACD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,GAAG,aAAa;QAChB,YAAY;QACZ,QAAQ;KACT,CAAC,CAAA;IAEF,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IACpC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;IAEnD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { PackageJson } from '@vltpkg/package-json'\nimport type { Manifest } from '@vltpkg/types'\nimport { Monorepo } from '@vltpkg/workspaces'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { PathScurry } from 'path-scurry'\nimport { loadEdges } from './load-edges.ts'\nimport { loadNodes } from './load-nodes.ts'\nimport { Graph } from '../graph.ts'\nimport type { LockfileData } from './types.ts'\n\nexport type LoadOptions = SpecOptions & {\n /**\n * The project root dirname.\n */\n projectRoot: string\n /**\n * The project root manifest.\n */\n mainManifest: Manifest\n /**\n * A {@link Monorepo} object, for managing workspaces\n */\n monorepo?: Monorepo\n /**\n * A {@link PackageJson} object, for sharing manifest caches\n */\n packageJson?: PackageJson\n /**\n * A {@link PathScurry} object, for use in globs\n */\n scurry?: PathScurry\n}\n\nconst loadLockfile = (projectRoot: string, lockfilePath: string) =>\n JSON.parse(\n readFileSync(resolve(projectRoot, lockfilePath), {\n encoding: 'utf8',\n }),\n ) as LockfileData\n\nexport const load = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n return loadObject(\n options,\n loadLockfile(projectRoot, 'vlt-lock.json'),\n )\n}\n\nexport const loadHidden = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n return loadObject(\n options,\n loadLockfile(projectRoot, 'node_modules/.vlt-lock.json'),\n )\n}\n\nexport const loadObject = (\n options: LoadOptions,\n lockfileData: LockfileData,\n) => {\n const { mainManifest, scurry } = options\n const packageJson = options.packageJson ?? new PackageJson()\n const monorepo =\n options.monorepo ??\n Monorepo.maybeLoad(options.projectRoot, { packageJson, scurry })\n const {\n 'scope-registries': scopeRegistries,\n registry,\n registries,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } = lockfileData.options || {}\n const mergedOptions = {\n ...options,\n 'scope-registries': {\n ...options['scope-registries'],\n ...scopeRegistries,\n },\n registry: registry ?? options.registry,\n registries: {\n ...options.registries,\n ...registries,\n },\n 'git-hosts': {\n ...options['git-hosts'],\n ...gitHosts,\n },\n 'git-host-archives': {\n ...options['git-host-archives'],\n ...gitHostArchives,\n },\n }\n const graph = new Graph({\n ...mergedOptions,\n mainManifest,\n monorepo,\n })\n\n loadNodes(graph, lockfileData.nodes)\n loadEdges(graph, lockfileData.edges, mergedOptions)\n\n return graph\n}\n"]}
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/lockfile/load.ts"],"names":[],"mappings":"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","sourcesContent":["import { PackageJson } from '@vltpkg/package-json'\nimport { Monorepo } from '@vltpkg/workspaces'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { loadEdges } from './load-edges.ts'\nimport { loadNodes } from './load-nodes.ts'\nimport { Graph } from '../graph.ts'\nimport type { PathScurry } from 'path-scurry'\nimport type { NormalizedManifest } from '@vltpkg/types'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { LockfileData } from './types.ts'\nimport type { GraphModifier } from '../modifiers.ts'\n\nexport type LoadOptions = SpecOptions & {\n /**\n * An optional {@link Graph} object to hydrate extra data from.\n */\n actual?: Graph\n /**\n * The project root dirname.\n */\n projectRoot: string\n /**\n * The project root manifest.\n */\n mainManifest: NormalizedManifest\n /**\n * The graph modifiers helper object.\n */\n modifiers?: GraphModifier\n /**\n * A {@link Monorepo} object, for managing workspaces\n */\n monorepo?: Monorepo\n /**\n * A {@link PackageJson} object, for sharing manifest caches\n */\n packageJson?: PackageJson\n /**\n * A {@link PathScurry} object, for use in globs\n */\n scurry?: PathScurry\n /**\n * Whether to throw an error if a manifest is missing when loading nodes.\n */\n throwOnMissingManifest?: boolean\n}\n\nconst loadLockfile = (projectRoot: string, lockfilePath: string) =>\n JSON.parse(\n readFileSync(resolve(projectRoot, lockfilePath), {\n encoding: 'utf8',\n }),\n ) as LockfileData\n\nexport const load = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n return loadObject(\n options,\n loadLockfile(projectRoot, 'vlt-lock.json'),\n )\n}\n\nexport const loadHidden = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n // Ensure that missing manifests throw an error when loading hidden lockfiles\n options.throwOnMissingManifest = true\n return loadObject(\n options,\n loadLockfile(projectRoot, 'node_modules/.vlt-lock.json'),\n )\n}\n\nexport const loadObject = (\n options: LoadOptions,\n lockfileData: Omit<LockfileData, 'options' | 'lockfileVersion'> &\n Partial<Pick<LockfileData, 'options' | 'lockfileVersion'>>,\n) => {\n const { mainManifest, scurry } = options\n const packageJson = options.packageJson ?? new PackageJson()\n const monorepo =\n options.monorepo ??\n Monorepo.maybeLoad(options.projectRoot, { packageJson, scurry })\n const {\n catalog = {},\n catalogs = {},\n 'scope-registries': scopeRegistries,\n registry,\n registries,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n /* c8 ignore next */\n } = lockfileData.options ?? {}\n\n // Optimize options merging - only create new objects when needed\n const mergedOptions = {\n ...options,\n catalog,\n catalogs,\n 'scope-registries':\n scopeRegistries ?\n { ...options['scope-registries'], ...scopeRegistries }\n : options['scope-registries'],\n registry: registry ?? options.registry,\n registries:\n registries ?\n { ...options.registries, ...registries }\n : options.registries,\n 'git-hosts':\n gitHosts ?\n { ...options['git-hosts'], ...gitHosts }\n : options['git-hosts'],\n 'git-host-archives':\n gitHostArchives ?\n { ...options['git-host-archives'], ...gitHostArchives }\n : options['git-host-archives'],\n }\n const graph = new Graph({\n ...mergedOptions,\n mainManifest,\n monorepo,\n })\n loadNodes(\n graph,\n lockfileData.nodes,\n mergedOptions,\n options.actual,\n options.throwOnMissingManifest,\n )\n loadEdges(graph, lockfileData.edges, mergedOptions)\n\n // hydrate missing node-level registry data\n for (const node of graph.nodes.values()) {\n const [firstEdge] = node.edgesIn\n if (firstEdge?.spec.registry) {\n node.registry = firstEdge.spec.registry\n }\n }\n\n return graph\n}\n"]}
@@ -1,18 +1,31 @@
1
1
  import type { SpecOptions } from '@vltpkg/spec';
2
2
  import type { Graph } from '../graph.ts';
3
3
  import type { LockfileData } from './types.ts';
4
+ import type { GraphModifier } from '../modifiers.ts';
4
5
  export type SaveOptions = SpecOptions & {
5
6
  /**
6
7
  * The graph to be stored in the lockfile.
7
8
  */
8
9
  graph: Graph;
10
+ /**
11
+ * The graph modifiers helper object.
12
+ */
13
+ modifiers?: GraphModifier;
9
14
  /**
10
15
  * Should it save manifest data in the lockfile?
11
16
  */
12
17
  saveManifests?: boolean;
18
+ /**
19
+ * Should it save build state data in the lockfile?
20
+ */
21
+ saveBuildData?: boolean;
22
+ /**
23
+ * Should it throw an error if a manifest is missing?
24
+ */
25
+ throwOnMissingManifest?: boolean;
13
26
  };
14
- export declare const lockfileData: ({ graph, "git-hosts": gitHosts, "git-host-archives": gitHostArchives, registry, registries, saveManifests, "scope-registries": scopeRegistries, }: SaveOptions) => LockfileData;
27
+ export declare const lockfileData: ({ graph, catalog, catalogs, "git-hosts": gitHosts, "git-host-archives": gitHostArchives, modifiers, registry, registries, saveManifests, saveBuildData, "scope-registries": scopeRegistries, "jsr-registries": jsrRegistries, throwOnMissingManifest, }: SaveOptions) => LockfileData;
15
28
  export declare const saveData: (data: LockfileData, fileName: string, saveManifests?: boolean) => void;
16
- export declare const save: (options: SaveOptions) => void;
17
- export declare const saveHidden: (options: SaveOptions) => void;
29
+ export declare const save: (options: Omit<SaveOptions, "saveManifests">) => void;
30
+ export declare const saveHidden: (options: Omit<SaveOptions, "saveManifests" | "saveBuildData">) => void;
18
31
  //# sourceMappingURL=save.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAI/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGxC,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAgGD,eAAO,MAAM,YAAY,sJAQtB,WAAW,KAAG,YAwChB,CAAA;AAeD,eAAO,MAAM,QAAQ,SACb,YAAY,YACR,MAAM,kCAMjB,CAAA;AAED,eAAO,MAAM,IAAI,YAAa,WAAW,SAKxC,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,WAAW,SAS9C,CAAA"}
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAGpD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC,CAAA;AAoHD,eAAO,MAAM,YAAY,4PActB,WAAW,KAAG,YA+DhB,CAAA;AAeD,eAAO,MAAM,QAAQ,SACb,YAAY,YACR,MAAM,8BAEf,IAIF,CAAA;AAED,eAAO,MAAM,IAAI,YACN,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,KAC1C,IAKF,CAAA;AAED,eAAO,MAAM,UAAU,YACZ,IAAI,CAAC,WAAW,EAAE,eAAe,GAAG,eAAe,CAAC,KAC5D,IAqBF,CAAA"}
@@ -1,8 +1,10 @@
1
- import { defaultRegistry, defaultRegistries, defaultGitHosts, defaultGitHostArchives, defaultScopeRegistries, } from '@vltpkg/spec';
1
+ import { expandNormalizedManifestSymbols, isRecordStringString, } from '@vltpkg/types';
2
+ import { defaultGitHostArchives, defaultGitHosts, defaultJsrRegistries, defaultRegistries, defaultRegistry, defaultScopeRegistries, } from '@vltpkg/spec';
2
3
  import { mkdirSync, writeFileSync } from 'node:fs';
3
4
  import { dirname, resolve } from 'node:path';
4
- import { getFlagNumFromNode } from "./types.js";
5
- const formatNodes = (nodes, saveManifests, registry) => {
5
+ import { getFlagNumFromNode, getBuildStateFromNode } from "./types.js";
6
+ import { error } from '@vltpkg/error-cause';
7
+ const formatNodes = (nodes, saveManifests, saveBuildData, registry, throwOnMissingManifest) => {
6
8
  // we do not store importers in the lockfile, though we do store
7
9
  // their edges. when we load, we always read workspaces/main fresh.
8
10
  const arr = [...nodes].filter(node => !node.importer);
@@ -13,11 +15,7 @@ const formatNodes = (nodes, saveManifests, registry) => {
13
15
  const customRegistry = node.resolved && registry && !node.resolved.startsWith(registry);
14
16
  const resolved = customRegistry ? node.resolved : undefined;
15
17
  // if it's in a location other than the default, stash that
16
- const location = (node.id.startsWith('file') ||
17
- node.location.endsWith('/node_modules/.vlt/' +
18
- node.id +
19
- '/node_modules/' +
20
- node.name)) ?
18
+ const location = node.id.startsWith('file') || node.inVltStore() ?
21
19
  undefined
22
20
  : node.location;
23
21
  const flags = getFlagNumFromNode(node);
@@ -25,14 +23,38 @@ const formatNodes = (nodes, saveManifests, registry) => {
25
23
  if (node.integrity) {
26
24
  lockfileNode[2] = node.integrity;
27
25
  }
28
- 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')) {
29
29
  lockfileNode[3] = resolved;
30
30
  }
31
31
  if (location) {
32
32
  lockfileNode[4] = location;
33
33
  }
34
- if (saveManifests) {
35
- lockfileNode[5] = node.manifest;
34
+ if (saveManifests && node.manifest) {
35
+ lockfileNode[5] = expandNormalizedManifestSymbols(node.manifest);
36
+ if (node.confused && node.rawManifest) {
37
+ lockfileNode[6] = expandNormalizedManifestSymbols(node.rawManifest);
38
+ }
39
+ }
40
+ // Throw an error if a manifest is missing and the option is enabled
41
+ if (throwOnMissingManifest && !node.manifest) {
42
+ throw error(`Missing manifest for node ${node.id}.`);
43
+ }
44
+ // Always save platform data for optional dependencies if available
45
+ if (node.optional && node.platform) {
46
+ lockfileNode[7] = node.platform;
47
+ }
48
+ // Save bin data if available
49
+ if (node.bins && Object.keys(node.bins).length) {
50
+ lockfileNode[8] = node.bins;
51
+ }
52
+ // Save build state data if requested
53
+ if (saveBuildData) {
54
+ const buildState = getBuildStateFromNode(node);
55
+ if (buildState !== undefined) {
56
+ lockfileNode[9] = buildState;
57
+ }
36
58
  }
37
59
  res[node.id] = lockfileNode;
38
60
  }
@@ -51,7 +73,6 @@ Number(b.from.importer) - Number(a.from.importer) ||
51
73
  `${edge.from.id} ${edge.spec.name}`,
52
74
  `${edge.type} ${edge.spec.bareSpec || '*'} ${edge.to?.id ?? 'MISSING'}`,
53
75
  ]));
54
- const isRecordStringString = (registries) => !(!registries || typeof registries === 'string');
55
76
  const removeDefaultItems = (defaultItems, items) => {
56
77
  const res = {};
57
78
  for (const [key, value] of Object.entries(items)) {
@@ -61,25 +82,40 @@ const removeDefaultItems = (defaultItems, items) => {
61
82
  }
62
83
  return res;
63
84
  };
64
- export const lockfileData = ({ graph, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, registry, registries, saveManifests, 'scope-registries': scopeRegistries, }) => {
85
+ 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, }) => {
65
86
  const cleanGitHosts = isRecordStringString(gitHosts) ?
66
87
  removeDefaultItems(defaultGitHosts, gitHosts)
67
88
  : undefined;
68
89
  const cleanGitHostArchives = isRecordStringString(gitHostArchives) ?
69
90
  removeDefaultItems(defaultGitHostArchives, gitHostArchives)
70
91
  : undefined;
92
+ const cleanModifiers = modifiers && isRecordStringString(modifiers.config) ?
93
+ modifiers.config
94
+ : undefined;
71
95
  const cleanRegistries = isRecordStringString(registries) ?
72
96
  removeDefaultItems(defaultRegistries, registries)
73
97
  : undefined;
74
98
  const cleanScopeRegistries = isRecordStringString(scopeRegistries) ?
75
99
  removeDefaultItems(defaultScopeRegistries, scopeRegistries)
76
100
  : undefined;
101
+ const cleanJsrRegistries = isRecordStringString(jsrRegistries) ?
102
+ removeDefaultItems(defaultJsrRegistries, jsrRegistries)
103
+ : undefined;
77
104
  const hasItems = (clean) => clean && Object.keys(clean).length;
78
105
  return {
106
+ lockfileVersion: 0,
79
107
  options: {
108
+ ...(hasItems(cleanModifiers) ?
109
+ { modifiers: cleanModifiers }
110
+ : {}),
111
+ ...(hasItems(catalog) ? { catalog } : {}),
112
+ ...(hasItems(catalogs) ? { catalogs } : {}),
80
113
  ...(hasItems(cleanScopeRegistries) ?
81
114
  { 'scope-registries': cleanScopeRegistries }
82
115
  : undefined),
116
+ ...(hasItems(cleanJsrRegistries) ?
117
+ { 'jsr-registries': cleanJsrRegistries }
118
+ : undefined),
83
119
  ...(registry !== undefined && registry !== defaultRegistry ?
84
120
  { registry }
85
121
  : undefined),
@@ -93,7 +129,7 @@ export const lockfileData = ({ graph, 'git-hosts': gitHosts, 'git-host-archives'
93
129
  { 'git-host-archives': cleanGitHostArchives }
94
130
  : undefined),
95
131
  },
96
- nodes: formatNodes(graph.nodes.values(), saveManifests, registry),
132
+ nodes: formatNodes(graph.nodes.values(), saveManifests, saveBuildData, registry, throwOnMissingManifest),
97
133
  edges: formatEdges(graph.edges),
98
134
  };
99
135
  };
@@ -116,13 +152,24 @@ export const save = (options) => {
116
152
  const { graph } = options;
117
153
  const data = lockfileData({ ...options, saveManifests: false });
118
154
  const fileName = resolve(graph.projectRoot, 'vlt-lock.json');
119
- return saveData(data, fileName, false);
155
+ saveData(data, fileName, false);
120
156
  };
121
157
  export const saveHidden = (options) => {
122
158
  const { graph } = options;
123
- const data = lockfileData({ ...options, saveManifests: true });
159
+ let data;
160
+ try {
161
+ data = lockfileData({
162
+ ...options,
163
+ saveManifests: true,
164
+ saveBuildData: true,
165
+ throwOnMissingManifest: true,
166
+ });
167
+ }
168
+ catch { }
169
+ if (!data)
170
+ return;
124
171
  const fileName = resolve(graph.projectRoot, 'node_modules/.vlt-lock.json');
125
172
  mkdirSync(dirname(fileName), { recursive: true });
126
- return saveData(data, fileName, true);
173
+ saveData(data, fileName, true);
127
174
  };
128
175
  //# sourceMappingURL=save.js.map