@vltpkg/graph 1.0.0-rc.6 → 1.0.0-rc.8

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 (58) hide show
  1. package/dist/esm/actual/load.js +8 -10
  2. package/dist/esm/actual/load.js.map +1 -1
  3. package/dist/esm/fixup-added-names.d.ts +16 -0
  4. package/dist/esm/fixup-added-names.d.ts.map +1 -0
  5. package/dist/esm/fixup-added-names.js +31 -0
  6. package/dist/esm/fixup-added-names.js.map +1 -0
  7. package/dist/esm/ideal/append-nodes.d.ts +2 -1
  8. package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
  9. package/dist/esm/ideal/append-nodes.js +42 -20
  10. package/dist/esm/ideal/append-nodes.js.map +1 -1
  11. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +4 -1
  12. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
  13. package/dist/esm/ideal/build-ideal-from-starting-graph.js +21 -17
  14. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
  15. package/dist/esm/ideal/build.d.ts.map +1 -1
  16. package/dist/esm/ideal/build.js +29 -0
  17. package/dist/esm/ideal/build.js.map +1 -1
  18. package/dist/esm/ideal/get-importer-specs.d.ts +9 -2
  19. package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
  20. package/dist/esm/ideal/get-importer-specs.js +80 -5
  21. package/dist/esm/ideal/get-importer-specs.js.map +1 -1
  22. package/dist/esm/ideal/refresh-ideal-graph.d.ts +12 -2
  23. package/dist/esm/ideal/refresh-ideal-graph.d.ts.map +1 -1
  24. package/dist/esm/ideal/refresh-ideal-graph.js +2 -2
  25. package/dist/esm/ideal/refresh-ideal-graph.js.map +1 -1
  26. package/dist/esm/ideal/types.d.ts +13 -0
  27. package/dist/esm/ideal/types.d.ts.map +1 -1
  28. package/dist/esm/ideal/types.js.map +1 -1
  29. package/dist/esm/index.d.ts +1 -0
  30. package/dist/esm/index.d.ts.map +1 -1
  31. package/dist/esm/index.js +1 -0
  32. package/dist/esm/index.js.map +1 -1
  33. package/dist/esm/install.d.ts.map +1 -1
  34. package/dist/esm/install.js +9 -1
  35. package/dist/esm/install.js.map +1 -1
  36. package/dist/esm/lockfile/load-edges.d.ts.map +1 -1
  37. package/dist/esm/lockfile/load-edges.js +4 -3
  38. package/dist/esm/lockfile/load-edges.js.map +1 -1
  39. package/dist/esm/reify/add-edges.d.ts +1 -1
  40. package/dist/esm/reify/add-edges.d.ts.map +1 -1
  41. package/dist/esm/reify/add-edges.js +2 -1
  42. package/dist/esm/reify/add-edges.js.map +1 -1
  43. package/dist/esm/reify/index.js +1 -1
  44. package/dist/esm/reify/index.js.map +1 -1
  45. package/dist/esm/reify/update-importers-package-json.d.ts +1 -1
  46. package/dist/esm/reify/update-importers-package-json.d.ts.map +1 -1
  47. package/dist/esm/reify/update-importers-package-json.js +18 -15
  48. package/dist/esm/reify/update-importers-package-json.js.map +1 -1
  49. package/dist/esm/uninstall.d.ts.map +1 -1
  50. package/dist/esm/uninstall.js +10 -0
  51. package/dist/esm/uninstall.js.map +1 -1
  52. package/dist/esm/update.d.ts.map +1 -1
  53. package/dist/esm/update.js +10 -0
  54. package/dist/esm/update.js.map +1 -1
  55. package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
  56. package/dist/esm/visualization/mermaid-output.js +57 -16
  57. package/dist/esm/visualization/mermaid-output.js.map +1 -1
  58. package/package.json +21 -21
@@ -50,35 +50,62 @@ function createDepIdMapping(importers) {
50
50
  }
51
51
  return mapping;
52
52
  }
53
- const nodeLabel = (node) => `"${String(node).replaceAll('@', '#64;')}"`;
54
- function parseNode(seenNodes, includedItems, depIdMapping, node) {
53
+ /**
54
+ * Returns a node reference: on the first occurrence of a node, returns the full label;
55
+ * on subsequent occurrences, returns just the shortId.
56
+ *
57
+ * Note: Mutates the `labeledNodes` set as a side effect to track which nodes have already
58
+ * been labeled. This tracking is shared across multiple importers to prevent duplicate
59
+ * labels in the output.
60
+ */
61
+ const nodeRef = (node, labeledNodes, depIdMapping) => {
62
+ const shortId = depIdMapping.get(node.id) /* c8 ignore next - should not be possible */ ?? '';
63
+ if (labeledNodes.has(node.id)) {
64
+ return shortId;
65
+ }
66
+ labeledNodes.add(node.id);
67
+ return `${shortId}("${String(node).replaceAll('@', '#64;')}")`;
68
+ };
69
+ function parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, node, isImporter = false) {
55
70
  if (seenNodes.has(node.id) || !includedItems.get(node)) {
56
71
  return '';
57
72
  }
58
73
  seenNodes.add(node.id);
59
- const edges = [...node.edgesOut.values()]
60
- .map(e => parseEdge(seenNodes, includedItems, depIdMapping, e))
74
+ // For importers, render the node label first as a standalone line before processing edges,
75
+ // since they appear at the top of the graph. Non-importer nodes are labeled inline as part of edge definitions.
76
+ const nodeLabel = isImporter ? nodeRef(node, labeledNodes, depIdMapping) : '';
77
+ // Include both regular edges and workspace edges (if any)
78
+ const allEdges = [
79
+ ...node.edgesOut.values(),
80
+ ...(node.workspaces?.values() ?? []),
81
+ ];
82
+ const edges = allEdges
83
+ .map(e => parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, e))
61
84
  .filter(Boolean)
62
85
  .join('\n');
63
- const shortId = depIdMapping.get(node.id);
64
- return `${shortId}(${nodeLabel(node)})${edges.length ? '\n' : ''}${edges}`;
86
+ // Only render node standalone for importers, others are rendered as part of edges
87
+ if (isImporter) {
88
+ /* c8 ignore next */
89
+ return `${nodeLabel}${edges.length ? '\n' : ''}${edges}`;
90
+ }
91
+ return edges;
65
92
  }
66
- function parseEdge(seenNodes, includedItems, depIdMapping, edge) {
93
+ function parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, edge) {
67
94
  if (!includedItems.get(edge)) {
68
95
  return '';
69
96
  }
70
- const fromShortId = depIdMapping.get(edge.from.id);
71
97
  const edgeType = edge.type === 'prod' ? '' : ` (${edge.type})`;
72
- const edgeResult = `${fromShortId}(${nodeLabel(edge.from)})` +
98
+ const edgeResult = nodeRef(edge.from, labeledNodes, depIdMapping) +
73
99
  ` -->|"${String(edge.spec).replaceAll('@', '#64;')}${edgeType}"| `;
74
100
  const missingLabel = edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing';
75
101
  if (!edge.to) {
76
- return edgeResult + `missing-${missingCount++}(${missingLabel})\n`;
102
+ return edgeResult + `missing-${missingCount++}(${missingLabel})`;
77
103
  }
78
- const toShortId = depIdMapping.get(edge.to.id);
79
- return (edgeResult +
80
- `${toShortId}(${nodeLabel(edge.to)})\n` +
81
- parseNode(seenNodes, includedItems, depIdMapping, edge.to));
104
+ // Label the target node first so that if it's referenced again later in the graph,
105
+ // it will use the short identifier instead of repeating the full label.
106
+ const toRef = nodeRef(edge.to, labeledNodes, depIdMapping);
107
+ const childEdges = parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, edge.to);
108
+ return edgeResult + toRef + (childEdges ? '\n' + childEdges : '');
82
109
  }
83
110
  /**
84
111
  * Returns a mermaid string representation of the graph.
@@ -92,7 +119,10 @@ export function mermaidOutput({ edges, importers, nodes, }) {
92
119
  continue;
93
120
  seen.add(item.self);
94
121
  if (item.self instanceof Edge) {
95
- if (edges.includes(item.self)) {
122
+ // Workspace edges are stored in mainImporter.workspaces and not in graph.edges,
123
+ // so we need to check for workspace spec type to always include them
124
+ if (edges.includes(item.self) ||
125
+ item.self.spec.type === 'workspace') {
96
126
  includedItems.set(item.self, true);
97
127
  }
98
128
  if (item.self.to) {
@@ -106,6 +136,12 @@ export function mermaidOutput({ edges, importers, nodes, }) {
106
136
  for (const edge of item.self.edgesOut.values()) {
107
137
  traverse.add({ self: edge, parent: item.self });
108
138
  }
139
+ // Also traverse workspace edges (only mainImporter has these)
140
+ if (item.self.workspaces) {
141
+ for (const edge of item.self.workspaces.values()) {
142
+ traverse.add({ self: edge, parent: item.self });
143
+ }
144
+ }
109
145
  }
110
146
  }
111
147
  for (const item of [...traverse].reverse()) {
@@ -115,9 +151,14 @@ export function mermaidOutput({ edges, importers, nodes, }) {
115
151
  }
116
152
  // Create DepID to short identifier mapping
117
153
  const depIdMapping = createDepIdMapping(importers);
154
+ // Track nodes that have had their label printed (shared across all importers)
155
+ const labeledNodes = new Set();
156
+ // Track nodes that have been processed (shared across all importers to avoid duplicates)
157
+ const seenNodes = new Set();
118
158
  return ('flowchart TD\n' +
119
159
  [...importers]
120
- .map(i => parseNode(new Set(), includedItems, depIdMapping, i))
160
+ .map(i => parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, i, true))
161
+ .filter(Boolean)
121
162
  .join('\n'));
122
163
  }
123
164
  //# sourceMappingURL=mermaid-output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid-output.js","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { Edge } from '../edge.ts'\nimport { Node } from '../node.ts'\nimport type { EdgeLike, NodeLike } from '@vltpkg/types'\n\nexport type MermaidOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n}\n\ntype TraverseItem = {\n self: EdgeLike | NodeLike\n parent: EdgeLike | NodeLike | undefined\n}\n\nlet missingCount = 0\n\n/**\n * Generates a short identifier for a given index following the pattern:\n * 0 -> a, 1 -> b, ..., 25 -> z, 26 -> A, ..., 51 -> Z, 52 -> aa, 53 -> ab, etc.\n * This implements a bijective base-52 numbering system where a-z = 0-25, A-Z = 26-51\n */\nexport function generateShortId(index: number): string {\n const base = 52\n\n // Helper function to convert a digit (0-51) to character\n const digitToChar = (digit: number): string => {\n if (digit < 26) {\n // a-z (0-25)\n return String.fromCharCode(97 + digit)\n } else {\n // A-Z (26-51)\n return String.fromCharCode(65 + (digit - 26))\n }\n }\n\n // Bijective base-52 conversion\n let result = ''\n let num = index + 1 // Convert to 1-based for bijective base\n\n while (num > 0) {\n num-- // Adjust for 0-based indexing in each position\n const remainder = num % base\n result = digitToChar(remainder) + result\n num = Math.floor(num / base)\n }\n\n return result\n}\n\n/**\n * Creates a mapping from DepID to short identifier\n */\nfunction createDepIdMapping(\n importers: Set<NodeLike>,\n): Map<DepID, string> {\n const mapping = new Map<DepID, string>()\n const uniqueDepIds = new Set<DepID>()\n\n // Collect all unique DepIDs from nodes & importers\n const [importer] = importers\n if (importer) {\n for (const node of importer.graph.nodes.values()) {\n uniqueDepIds.add(node.id)\n }\n }\n\n // Create mapping for each unique DepID\n let index = 0\n for (const depId of uniqueDepIds) {\n mapping.set(depId, generateShortId(index++))\n }\n\n return mapping\n}\n\nconst nodeLabel = (node: NodeLike) =>\n `\"${String(node).replaceAll('@', '#64;')}\"`\n\nfunction parseNode(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n node: NodeLike,\n) {\n if (seenNodes.has(node.id) || !includedItems.get(node)) {\n return ''\n }\n seenNodes.add(node.id)\n const edges: string = [...node.edgesOut.values()]\n .map(e => parseEdge(seenNodes, includedItems, depIdMapping, e))\n .filter(Boolean)\n .join('\\n')\n const shortId = depIdMapping.get(node.id)\n return `${shortId}(${nodeLabel(node)})${edges.length ? '\\n' : ''}${edges}`\n}\n\nfunction parseEdge(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n edge: EdgeLike,\n) {\n if (!includedItems.get(edge)) {\n return ''\n }\n\n const fromShortId = depIdMapping.get(edge.from.id)\n const edgeType = edge.type === 'prod' ? '' : ` (${edge.type})`\n const edgeResult =\n `${fromShortId}(${nodeLabel(edge.from)})` +\n ` -->|\"${String(edge.spec).replaceAll('@', '#64;')}${edgeType}\"| `\n\n const missingLabel =\n edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing'\n if (!edge.to) {\n return edgeResult + `missing-${missingCount++}(${missingLabel})\\n`\n }\n\n const toShortId = depIdMapping.get(edge.to.id)\n return (\n edgeResult +\n `${toShortId}(${nodeLabel(edge.to)})\\n` +\n parseNode(seenNodes, includedItems, depIdMapping, edge.to)\n )\n}\n\n/**\n * Returns a mermaid string representation of the graph.\n */\nexport function mermaidOutput({\n edges,\n importers,\n nodes,\n}: MermaidOutputGraph) {\n const seen = new Set<EdgeLike | NodeLike>()\n const includedItems = new Map<EdgeLike | NodeLike, boolean>()\n const traverse = new Set<TraverseItem>(\n [...importers].map(i => ({ self: i, parent: undefined })),\n )\n\n for (const item of traverse) {\n if (seen.has(item.self)) continue\n seen.add(item.self)\n\n if (item.self instanceof Edge) {\n if (edges.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n if (item.self.to) {\n traverse.add({ self: item.self.to, parent: item.self })\n }\n }\n\n if (item.self instanceof Node) {\n if (nodes.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n for (const edge of item.self.edgesOut.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n }\n }\n\n for (const item of [...traverse].reverse()) {\n if (includedItems.has(item.self) && item.parent) {\n includedItems.set(item.parent, true)\n }\n }\n\n // Create DepID to short identifier mapping\n const depIdMapping = createDepIdMapping(importers)\n\n return (\n 'flowchart TD\\n' +\n [...importers]\n .map(i =>\n parseNode(new Set<DepID>(), includedItems, depIdMapping, i),\n )\n .join('\\n')\n )\n}\n"]}
1
+ {"version":3,"file":"mermaid-output.js","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { Edge } from '../edge.ts'\nimport { Node } from '../node.ts'\nimport type { EdgeLike, NodeLike } from '@vltpkg/types'\n\nexport type MermaidOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n}\n\ntype TraverseItem = {\n self: EdgeLike | NodeLike\n parent: EdgeLike | NodeLike | undefined\n}\n\nlet missingCount = 0\n\n/**\n * Generates a short identifier for a given index following the pattern:\n * 0 -> a, 1 -> b, ..., 25 -> z, 26 -> A, ..., 51 -> Z, 52 -> aa, 53 -> ab, etc.\n * This implements a bijective base-52 numbering system where a-z = 0-25, A-Z = 26-51\n */\nexport function generateShortId(index: number): string {\n const base = 52\n\n // Helper function to convert a digit (0-51) to character\n const digitToChar = (digit: number): string => {\n if (digit < 26) {\n // a-z (0-25)\n return String.fromCharCode(97 + digit)\n } else {\n // A-Z (26-51)\n return String.fromCharCode(65 + (digit - 26))\n }\n }\n\n // Bijective base-52 conversion\n let result = ''\n let num = index + 1 // Convert to 1-based for bijective base\n\n while (num > 0) {\n num-- // Adjust for 0-based indexing in each position\n const remainder = num % base\n result = digitToChar(remainder) + result\n num = Math.floor(num / base)\n }\n\n return result\n}\n\n/**\n * Creates a mapping from DepID to short identifier\n */\nfunction createDepIdMapping(\n importers: Set<NodeLike>,\n): Map<DepID, string> {\n const mapping = new Map<DepID, string>()\n const uniqueDepIds = new Set<DepID>()\n\n // Collect all unique DepIDs from nodes & importers\n const [importer] = importers\n if (importer) {\n for (const node of importer.graph.nodes.values()) {\n uniqueDepIds.add(node.id)\n }\n }\n\n // Create mapping for each unique DepID\n let index = 0\n for (const depId of uniqueDepIds) {\n mapping.set(depId, generateShortId(index++))\n }\n\n return mapping\n}\n\n/**\n * Returns a node reference: on the first occurrence of a node, returns the full label;\n * on subsequent occurrences, returns just the shortId.\n *\n * Note: Mutates the `labeledNodes` set as a side effect to track which nodes have already\n * been labeled. This tracking is shared across multiple importers to prevent duplicate\n * labels in the output.\n */\nconst nodeRef = (\n node: NodeLike,\n labeledNodes: Set<DepID>,\n depIdMapping: Map<DepID, string>,\n): string => {\n const shortId =\n depIdMapping.get(\n node.id,\n ) /* c8 ignore next - should not be possible */ ?? ''\n if (labeledNodes.has(node.id)) {\n return shortId\n }\n labeledNodes.add(node.id)\n return `${shortId}(\"${String(node).replaceAll('@', '#64;')}\")`\n}\n\nfunction parseNode(\n seenNodes: Set<DepID>,\n labeledNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n node: NodeLike,\n isImporter = false,\n) {\n if (seenNodes.has(node.id) || !includedItems.get(node)) {\n return ''\n }\n seenNodes.add(node.id)\n // For importers, render the node label first as a standalone line before processing edges,\n // since they appear at the top of the graph. Non-importer nodes are labeled inline as part of edge definitions.\n const nodeLabel =\n isImporter ? nodeRef(node, labeledNodes, depIdMapping) : ''\n // Include both regular edges and workspace edges (if any)\n const allEdges = [\n ...node.edgesOut.values(),\n ...(node.workspaces?.values() ?? []),\n ]\n const edges: string = allEdges\n .map(e =>\n parseEdge(\n seenNodes,\n labeledNodes,\n includedItems,\n depIdMapping,\n e,\n ),\n )\n .filter(Boolean)\n .join('\\n')\n // Only render node standalone for importers, others are rendered as part of edges\n if (isImporter) {\n /* c8 ignore next */\n return `${nodeLabel}${edges.length ? '\\n' : ''}${edges}`\n }\n return edges\n}\n\nfunction parseEdge(\n seenNodes: Set<DepID>,\n labeledNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n edge: EdgeLike,\n) {\n if (!includedItems.get(edge)) {\n return ''\n }\n\n const edgeType = edge.type === 'prod' ? '' : ` (${edge.type})`\n const edgeResult =\n nodeRef(edge.from, labeledNodes, depIdMapping) +\n ` -->|\"${String(edge.spec).replaceAll('@', '#64;')}${edgeType}\"| `\n\n const missingLabel =\n edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing'\n if (!edge.to) {\n return edgeResult + `missing-${missingCount++}(${missingLabel})`\n }\n\n // Label the target node first so that if it's referenced again later in the graph,\n // it will use the short identifier instead of repeating the full label.\n const toRef = nodeRef(edge.to, labeledNodes, depIdMapping)\n const childEdges = parseNode(\n seenNodes,\n labeledNodes,\n includedItems,\n depIdMapping,\n edge.to,\n )\n return edgeResult + toRef + (childEdges ? '\\n' + childEdges : '')\n}\n\n/**\n * Returns a mermaid string representation of the graph.\n */\nexport function mermaidOutput({\n edges,\n importers,\n nodes,\n}: MermaidOutputGraph) {\n const seen = new Set<EdgeLike | NodeLike>()\n const includedItems = new Map<EdgeLike | NodeLike, boolean>()\n const traverse = new Set<TraverseItem>(\n [...importers].map(i => ({ self: i, parent: undefined })),\n )\n\n for (const item of traverse) {\n if (seen.has(item.self)) continue\n seen.add(item.self)\n\n if (item.self instanceof Edge) {\n // Workspace edges are stored in mainImporter.workspaces and not in graph.edges,\n // so we need to check for workspace spec type to always include them\n if (\n edges.includes(item.self) ||\n item.self.spec.type === 'workspace'\n ) {\n includedItems.set(item.self, true)\n }\n if (item.self.to) {\n traverse.add({ self: item.self.to, parent: item.self })\n }\n }\n\n if (item.self instanceof Node) {\n if (nodes.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n for (const edge of item.self.edgesOut.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n // Also traverse workspace edges (only mainImporter has these)\n if (item.self.workspaces) {\n for (const edge of item.self.workspaces.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n }\n }\n }\n\n for (const item of [...traverse].reverse()) {\n if (includedItems.has(item.self) && item.parent) {\n includedItems.set(item.parent, true)\n }\n }\n\n // Create DepID to short identifier mapping\n const depIdMapping = createDepIdMapping(importers)\n\n // Track nodes that have had their label printed (shared across all importers)\n const labeledNodes = new Set<DepID>()\n\n // Track nodes that have been processed (shared across all importers to avoid duplicates)\n const seenNodes = new Set<DepID>()\n\n return (\n 'flowchart TD\\n' +\n [...importers]\n .map(i =>\n parseNode(\n seenNodes,\n labeledNodes,\n includedItems,\n depIdMapping,\n i,\n true, // isImporter\n ),\n )\n .filter(Boolean)\n .join('\\n')\n )\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vltpkg/graph",
3
3
  "description": "A library that helps understanding & expressing what happens on an install",
4
- "version": "1.0.0-rc.6",
4
+ "version": "1.0.0-rc.8",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/vltpkg/vltpkg.git",
@@ -24,25 +24,25 @@
24
24
  "graph-run": "^1.1.0",
25
25
  "path-scurry": "^2.0.0",
26
26
  "promise-call-limit": "^3.0.2",
27
- "@vltpkg/cmd-shim": "1.0.0-rc.6",
28
- "@vltpkg/dep-id": "1.0.0-rc.6",
29
- "@vltpkg/dss-breadcrumb": "1.0.0-rc.6",
30
- "@vltpkg/error-cause": "1.0.0-rc.6",
31
- "@vltpkg/fast-split": "1.0.0-rc.6",
32
- "@vltpkg/init": "1.0.0-rc.6",
33
- "@vltpkg/output": "1.0.0-rc.6",
34
- "@vltpkg/package-json": "1.0.0-rc.6",
35
- "@vltpkg/package-info": "1.0.0-rc.6",
36
- "@vltpkg/pick-manifest": "1.0.0-rc.6",
37
- "@vltpkg/query": "1.0.0-rc.6",
38
- "@vltpkg/security-archive": "1.0.0-rc.6",
39
- "@vltpkg/run": "1.0.0-rc.6",
40
- "@vltpkg/rollback-remove": "1.0.0-rc.6",
41
- "@vltpkg/satisfies": "1.0.0-rc.6",
42
- "@vltpkg/spec": "1.0.0-rc.6",
43
- "@vltpkg/types": "1.0.0-rc.6",
44
- "@vltpkg/vlt-json": "1.0.0-rc.6",
45
- "@vltpkg/workspaces": "1.0.0-rc.6"
27
+ "@vltpkg/cmd-shim": "1.0.0-rc.8",
28
+ "@vltpkg/dep-id": "1.0.0-rc.8",
29
+ "@vltpkg/dss-breadcrumb": "1.0.0-rc.8",
30
+ "@vltpkg/error-cause": "1.0.0-rc.8",
31
+ "@vltpkg/init": "1.0.0-rc.8",
32
+ "@vltpkg/fast-split": "1.0.0-rc.8",
33
+ "@vltpkg/output": "1.0.0-rc.8",
34
+ "@vltpkg/package-info": "1.0.0-rc.8",
35
+ "@vltpkg/package-json": "1.0.0-rc.8",
36
+ "@vltpkg/pick-manifest": "1.0.0-rc.8",
37
+ "@vltpkg/query": "1.0.0-rc.8",
38
+ "@vltpkg/rollback-remove": "1.0.0-rc.8",
39
+ "@vltpkg/run": "1.0.0-rc.8",
40
+ "@vltpkg/satisfies": "1.0.0-rc.8",
41
+ "@vltpkg/spec": "1.0.0-rc.8",
42
+ "@vltpkg/security-archive": "1.0.0-rc.8",
43
+ "@vltpkg/types": "1.0.0-rc.8",
44
+ "@vltpkg/vlt-json": "1.0.0-rc.8",
45
+ "@vltpkg/workspaces": "1.0.0-rc.8"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@eslint/js": "^9.34.0",
@@ -55,7 +55,7 @@
55
55
  "typedoc": "~0.27.9",
56
56
  "typescript": "5.7.3",
57
57
  "typescript-eslint": "^8.40.0",
58
- "@vltpkg/vlt-json": "1.0.0-rc.6"
58
+ "@vltpkg/vlt-json": "1.0.0-rc.8"
59
59
  },
60
60
  "license": "BSD-2-Clause-Patent",
61
61
  "engines": {