@vltpkg/graph 0.0.0-3 → 0.0.0-30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +148 -12
  2. package/dist/esm/actual/load.d.ts +44 -3
  3. package/dist/esm/actual/load.d.ts.map +1 -1
  4. package/dist/esm/actual/load.js +123 -73
  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/dependencies.d.ts +14 -5
  11. package/dist/esm/dependencies.d.ts.map +1 -1
  12. package/dist/esm/dependencies.js +67 -2
  13. package/dist/esm/dependencies.js.map +1 -1
  14. package/dist/esm/diff.d.ts +5 -0
  15. package/dist/esm/diff.d.ts.map +1 -1
  16. package/dist/esm/diff.js +13 -0
  17. package/dist/esm/diff.js.map +1 -1
  18. package/dist/esm/edge.d.ts +2 -3
  19. package/dist/esm/edge.d.ts.map +1 -1
  20. package/dist/esm/edge.js +1 -1
  21. package/dist/esm/edge.js.map +1 -1
  22. package/dist/esm/graph.d.ts +22 -12
  23. package/dist/esm/graph.d.ts.map +1 -1
  24. package/dist/esm/graph.js +122 -23
  25. package/dist/esm/graph.js.map +1 -1
  26. package/dist/esm/ideal/add-nodes.d.ts +6 -1
  27. package/dist/esm/ideal/add-nodes.d.ts.map +1 -1
  28. package/dist/esm/ideal/add-nodes.js +9 -4
  29. package/dist/esm/ideal/add-nodes.js.map +1 -1
  30. package/dist/esm/ideal/append-nodes.d.ts +9 -1
  31. package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
  32. package/dist/esm/ideal/append-nodes.js +155 -31
  33. package/dist/esm/ideal/append-nodes.js.map +1 -1
  34. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
  35. package/dist/esm/ideal/build-ideal-from-starting-graph.js +9 -5
  36. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
  37. package/dist/esm/ideal/build.d.ts +4 -0
  38. package/dist/esm/ideal/build.d.ts.map +1 -1
  39. package/dist/esm/ideal/build.js +2 -0
  40. package/dist/esm/ideal/build.js.map +1 -1
  41. package/dist/esm/ideal/get-importer-specs.d.ts +3 -2
  42. package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
  43. package/dist/esm/ideal/get-importer-specs.js +7 -5
  44. package/dist/esm/ideal/get-importer-specs.js.map +1 -1
  45. package/dist/esm/index.d.ts +6 -4
  46. package/dist/esm/index.d.ts.map +1 -1
  47. package/dist/esm/index.js +3 -1
  48. package/dist/esm/index.js.map +1 -1
  49. package/dist/esm/install.d.ts +4 -5
  50. package/dist/esm/install.d.ts.map +1 -1
  51. package/dist/esm/install.js +143 -23
  52. package/dist/esm/install.js.map +1 -1
  53. package/dist/esm/lockfile/load-edges.d.ts +8 -1
  54. package/dist/esm/lockfile/load-edges.d.ts.map +1 -1
  55. package/dist/esm/lockfile/load-edges.js +79 -15
  56. package/dist/esm/lockfile/load-edges.js.map +1 -1
  57. package/dist/esm/lockfile/load-nodes.d.ts +3 -2
  58. package/dist/esm/lockfile/load-nodes.d.ts.map +1 -1
  59. package/dist/esm/lockfile/load-nodes.js +64 -11
  60. package/dist/esm/lockfile/load-nodes.js.map +1 -1
  61. package/dist/esm/lockfile/load.d.ts +18 -5
  62. package/dist/esm/lockfile/load.d.ts.map +1 -1
  63. package/dist/esm/lockfile/load.js +51 -22
  64. package/dist/esm/lockfile/load.js.map +1 -1
  65. package/dist/esm/lockfile/save.d.ts +8 -3
  66. package/dist/esm/lockfile/save.d.ts.map +1 -1
  67. package/dist/esm/lockfile/save.js +30 -12
  68. package/dist/esm/lockfile/save.js.map +1 -1
  69. package/dist/esm/lockfile/types.d.ts +17 -4
  70. package/dist/esm/lockfile/types.d.ts.map +1 -1
  71. package/dist/esm/lockfile/types.js.map +1 -1
  72. package/dist/esm/modifiers.d.ts +189 -0
  73. package/dist/esm/modifiers.d.ts.map +1 -0
  74. package/dist/esm/modifiers.js +330 -0
  75. package/dist/esm/modifiers.js.map +1 -0
  76. package/dist/esm/node.d.ts +54 -5
  77. package/dist/esm/node.d.ts.map +1 -1
  78. package/dist/esm/node.js +77 -2
  79. package/dist/esm/node.js.map +1 -1
  80. package/dist/esm/reify/add-edge.d.ts +1 -1
  81. package/dist/esm/reify/add-edge.d.ts.map +1 -1
  82. package/dist/esm/reify/add-edge.js +36 -14
  83. package/dist/esm/reify/add-edge.js.map +1 -1
  84. package/dist/esm/reify/add-nodes.d.ts.map +1 -1
  85. package/dist/esm/reify/add-nodes.js +4 -2
  86. package/dist/esm/reify/add-nodes.js.map +1 -1
  87. package/dist/esm/reify/bin-paths.d.ts +1 -1
  88. package/dist/esm/reify/bin-paths.d.ts.map +1 -1
  89. package/dist/esm/reify/bin-paths.js.map +1 -1
  90. package/dist/esm/reify/build.js +6 -3
  91. package/dist/esm/reify/build.js.map +1 -1
  92. package/dist/esm/reify/calculate-save-value.d.ts +3 -0
  93. package/dist/esm/reify/calculate-save-value.d.ts.map +1 -0
  94. package/dist/esm/reify/calculate-save-value.js +45 -0
  95. package/dist/esm/reify/calculate-save-value.js.map +1 -0
  96. package/dist/esm/reify/delete-edge.js +1 -1
  97. package/dist/esm/reify/delete-edge.js.map +1 -1
  98. package/dist/esm/reify/delete-nodes.d.ts.map +1 -1
  99. package/dist/esm/reify/delete-nodes.js +4 -0
  100. package/dist/esm/reify/delete-nodes.js.map +1 -1
  101. package/dist/esm/reify/index.d.ts +2 -0
  102. package/dist/esm/reify/index.d.ts.map +1 -1
  103. package/dist/esm/reify/index.js +20 -2
  104. package/dist/esm/reify/index.js.map +1 -1
  105. package/dist/esm/reify/internal-hoist.d.ts +9 -0
  106. package/dist/esm/reify/internal-hoist.d.ts.map +1 -0
  107. package/dist/esm/reify/internal-hoist.js +121 -0
  108. package/dist/esm/reify/internal-hoist.js.map +1 -0
  109. package/dist/esm/reify/update-importers-package-json.d.ts +1 -1
  110. package/dist/esm/reify/update-importers-package-json.d.ts.map +1 -1
  111. package/dist/esm/reify/update-importers-package-json.js +35 -12
  112. package/dist/esm/reify/update-importers-package-json.js.map +1 -1
  113. package/dist/esm/remove-optional-subgraph.js +1 -1
  114. package/dist/esm/remove-optional-subgraph.js.map +1 -1
  115. package/dist/esm/resolve-save-type.d.ts +6 -0
  116. package/dist/esm/resolve-save-type.d.ts.map +1 -0
  117. package/dist/esm/resolve-save-type.js +5 -0
  118. package/dist/esm/resolve-save-type.js.map +1 -0
  119. package/dist/esm/stringify-node.d.ts +1 -1
  120. package/dist/esm/stringify-node.d.ts.map +1 -1
  121. package/dist/esm/stringify-node.js.map +1 -1
  122. package/dist/esm/transfer-data/load.d.ts +44 -0
  123. package/dist/esm/transfer-data/load.d.ts.map +1 -0
  124. package/dist/esm/transfer-data/load.js +176 -0
  125. package/dist/esm/transfer-data/load.js.map +1 -0
  126. package/dist/esm/uninstall.d.ts +3 -5
  127. package/dist/esm/uninstall.d.ts.map +1 -1
  128. package/dist/esm/uninstall.js +0 -3
  129. package/dist/esm/uninstall.js.map +1 -1
  130. package/dist/esm/update.d.ts +11 -0
  131. package/dist/esm/update.d.ts.map +1 -0
  132. package/dist/esm/update.js +49 -0
  133. package/dist/esm/update.js.map +1 -0
  134. package/dist/esm/virtual-root.d.ts +16 -0
  135. package/dist/esm/virtual-root.d.ts.map +1 -0
  136. package/dist/esm/virtual-root.js +78 -0
  137. package/dist/esm/virtual-root.js.map +1 -0
  138. package/dist/esm/visualization/human-readable-output.d.ts +4 -5
  139. package/dist/esm/visualization/human-readable-output.d.ts.map +1 -1
  140. package/dist/esm/visualization/human-readable-output.js +51 -24
  141. package/dist/esm/visualization/human-readable-output.js.map +1 -1
  142. package/dist/esm/visualization/json-output.d.ts +7 -3
  143. package/dist/esm/visualization/json-output.d.ts.map +1 -1
  144. package/dist/esm/visualization/json-output.js +35 -12
  145. package/dist/esm/visualization/json-output.js.map +1 -1
  146. package/dist/esm/visualization/mermaid-output.d.ts +7 -1
  147. package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
  148. package/dist/esm/visualization/mermaid-output.js +64 -9
  149. package/dist/esm/visualization/mermaid-output.js.map +1 -1
  150. package/dist/esm/visualization/object-like-output.d.ts +1 -1
  151. package/dist/esm/visualization/object-like-output.d.ts.map +1 -1
  152. package/dist/esm/visualization/object-like-output.js.map +1 -1
  153. package/package.json +29 -25
  154. package/dist/esm/types.d.ts +0 -39
  155. package/dist/esm/types.d.ts.map +0 -1
  156. package/dist/esm/types.js +0 -2
  157. package/dist/esm/types.js.map +0 -1
@@ -1,31 +1,84 @@
1
1
  import { Edge } from "../edge.js";
2
2
  import { Node } from "../node.js";
3
3
  let missingCount = 0;
4
+ /**
5
+ * Generates a short identifier for a given index following the pattern:
6
+ * 0 -> a, 1 -> b, ..., 25 -> z, 26 -> A, ..., 51 -> Z, 52 -> aa, 53 -> ab, etc.
7
+ * This implements a bijective base-52 numbering system where a-z = 0-25, A-Z = 26-51
8
+ */
9
+ export function generateShortId(index) {
10
+ const base = 52;
11
+ // Helper function to convert a digit (0-51) to character
12
+ const digitToChar = (digit) => {
13
+ if (digit < 26) {
14
+ // a-z (0-25)
15
+ return String.fromCharCode(97 + digit);
16
+ }
17
+ else {
18
+ // A-Z (26-51)
19
+ return String.fromCharCode(65 + (digit - 26));
20
+ }
21
+ };
22
+ // Bijective base-52 conversion
23
+ let result = '';
24
+ let num = index + 1; // Convert to 1-based for bijective base
25
+ while (num > 0) {
26
+ num--; // Adjust for 0-based indexing in each position
27
+ const remainder = num % base;
28
+ result = digitToChar(remainder) + result;
29
+ num = Math.floor(num / base);
30
+ }
31
+ return result;
32
+ }
33
+ /**
34
+ * Creates a mapping from DepID to short identifier
35
+ */
36
+ function createDepIdMapping(importers) {
37
+ const mapping = new Map();
38
+ const uniqueDepIds = new Set();
39
+ // Collect all unique DepIDs from nodes & importers
40
+ const [importer] = importers;
41
+ if (importer) {
42
+ for (const node of importer.graph.nodes.values()) {
43
+ uniqueDepIds.add(node.id);
44
+ }
45
+ }
46
+ // Create mapping for each unique DepID
47
+ let index = 0;
48
+ for (const depId of uniqueDepIds) {
49
+ mapping.set(depId, generateShortId(index++));
50
+ }
51
+ return mapping;
52
+ }
4
53
  const nodeLabel = (node) => `"${String(node).replaceAll('@', '#64;')}"`;
5
- function parseNode(seenNodes, includedItems, node) {
54
+ function parseNode(seenNodes, includedItems, depIdMapping, node) {
6
55
  if (seenNodes.has(node.id) || !includedItems.get(node)) {
7
56
  return '';
8
57
  }
9
58
  seenNodes.add(node.id);
10
59
  const edges = [...node.edgesOut.values()]
11
- .map(e => parseEdge(seenNodes, includedItems, e))
60
+ .map(e => parseEdge(seenNodes, includedItems, depIdMapping, e))
12
61
  .filter(Boolean)
13
62
  .join('\n');
14
- return `${encodeURIComponent(node.id)}(${nodeLabel(node)})${edges.length ? '\n' : ''}${edges}`;
63
+ const shortId = depIdMapping.get(node.id);
64
+ return `${shortId}(${nodeLabel(node)})${edges.length ? '\n' : ''}${edges}`;
15
65
  }
16
- function parseEdge(seenNodes, includedItems, edge) {
66
+ function parseEdge(seenNodes, includedItems, depIdMapping, edge) {
17
67
  if (!includedItems.get(edge)) {
18
68
  return '';
19
69
  }
20
- const edgeResult = `${encodeURIComponent(edge.from.id)}(${nodeLabel(edge.from)})` +
21
- ` -->|"${String(edge.spec).replaceAll('@', '#64;')} (${edge.type})"| `;
70
+ const fromShortId = depIdMapping.get(edge.from.id);
71
+ const edgeType = edge.type === 'prod' ? '' : ` (${edge.type})`;
72
+ const edgeResult = `${fromShortId}(${nodeLabel(edge.from)})` +
73
+ ` -->|"${String(edge.spec).replaceAll('@', '#64;')}${edgeType}"| `;
22
74
  const missingLabel = edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing';
23
75
  if (!edge.to) {
24
76
  return edgeResult + `missing-${missingCount++}(${missingLabel})\n`;
25
77
  }
78
+ const toShortId = depIdMapping.get(edge.to.id);
26
79
  return (edgeResult +
27
- `${encodeURIComponent(edge.to.id)}(${nodeLabel(edge.to)})\n` +
28
- parseNode(seenNodes, includedItems, edge.to));
80
+ `${toShortId}(${nodeLabel(edge.to)})\n` +
81
+ parseNode(seenNodes, includedItems, depIdMapping, edge.to));
29
82
  }
30
83
  /**
31
84
  * Returns a mermaid string representation of the graph.
@@ -60,9 +113,11 @@ export function mermaidOutput({ edges, importers, nodes, }) {
60
113
  includedItems.set(item.parent, true);
61
114
  }
62
115
  }
116
+ // Create DepID to short identifier mapping
117
+ const depIdMapping = createDepIdMapping(importers);
63
118
  return ('flowchart TD\n' +
64
119
  [...importers]
65
- .map(i => parseNode(new Set(), includedItems, i))
120
+ .map(i => parseNode(new Set(), includedItems, depIdMapping, i))
66
121
  .join('\n'));
67
122
  }
68
123
  //# 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 '../types.ts'\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\nconst nodeLabel = (node: NodeLike) =>\n `\"${String(node).replaceAll('@', '#64;')}\"`\n\nfunction parseNode(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\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, e))\n .filter(Boolean)\n .join('\\n')\n return `${encodeURIComponent(node.id)}(${nodeLabel(node)})${edges.length ? '\\n' : ''}${edges}`\n}\n\nfunction parseEdge(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n edge: EdgeLike,\n) {\n if (!includedItems.get(edge)) {\n return ''\n }\n\n const edgeResult =\n `${encodeURIComponent(edge.from.id)}(${nodeLabel(edge.from)})` +\n ` -->|\"${String(edge.spec).replaceAll('@', '#64;')} (${edge.type})\"| `\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 return (\n edgeResult +\n `${encodeURIComponent(edge.to.id)}(${nodeLabel(edge.to)})\\n` +\n parseNode(seenNodes, includedItems, 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 return (\n 'flowchart TD\\n' +\n [...importers]\n .map(i => parseNode(new Set<DepID>(), includedItems, i))\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\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,3 +1,3 @@
1
- import type { GraphLike } from '../types.ts';
1
+ import type { GraphLike } from '@vltpkg/types';
2
2
  export declare function objectLikeOutput(graph: GraphLike): string;
3
3
  //# sourceMappingURL=object-like-output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"object-like-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/object-like-output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,SAAS,EAAY,MAAM,aAAa,CAAA;AA8DhE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,UAOhD"}
1
+ {"version":3,"file":"object-like-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/object-like-output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,SAAS,EAAY,MAAM,eAAe,CAAA;AA8DlE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,UAOhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"object-like-output.js","sourceRoot":"","sources":["../../../src/visualization/object-like-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { inspect } from 'node:util'\nimport type { EdgeLike, GraphLike, NodeLike } from '../types.ts'\n\nconst addInspect = (o: unknown, fn: () => string) =>\n ((o as { [K in typeof inspect.custom]: () => string })[\n inspect.custom\n ] = fn)\n\nfunction parseNode(\n seenNodes: Set<NodeLike>,\n graph: GraphLike,\n node: NodeLike,\n) {\n addInspect(node, () => {\n const res =\n 'Node ' +\n inspect(\n seenNodes.has(node) ?\n { ref: node.id }\n : {\n id: node.id,\n location: node.location,\n ...(node.importer ? { importer: true } : null),\n ...(node.dev ? { dev: true } : null),\n ...(node.optional ? { optional: true } : null),\n ...(node.resolved ? { resolved: node.resolved } : null),\n ...(node.integrity ?\n { integrity: node.integrity }\n : null),\n ...(node.edgesOut.size ?\n {\n edgesOut: [...node.edgesOut.values()].map(i => {\n seenNodes.add(node)\n return parseEdge(seenNodes, graph, i)\n }),\n }\n : (seenNodes.add(node), null)),\n },\n { depth: Infinity },\n )\n return res\n })\n return node\n}\n\nfunction parseEdge(\n seenNodes: Set<NodeLike>,\n graph: GraphLike,\n edge: EdgeLike,\n) {\n addInspect(edge, () => {\n const missingNode = `[missing package]: <${edge.name}@${edge.spec.bareSpec}>`\n const toLabel: string =\n edge.to ?\n inspect(parseNode(seenNodes, graph, edge.to), {\n depth: Infinity,\n })\n : missingNode\n return `Edge spec(${String(edge.spec)}) -${edge.type}-> to: ${toLabel}`\n })\n return edge\n}\n\nexport function objectLikeOutput(graph: GraphLike) {\n const seenNodes = new Set<NodeLike>()\n const importers = [...graph.importers]\n return inspect(\n importers.map(i => parseNode(seenNodes, graph, i)),\n { depth: Infinity },\n )\n}\n"]}
1
+ {"version":3,"file":"object-like-output.js","sourceRoot":"","sources":["../../../src/visualization/object-like-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { inspect } from 'node:util'\nimport type { EdgeLike, GraphLike, NodeLike } from '@vltpkg/types'\n\nconst addInspect = (o: unknown, fn: () => string) =>\n ((o as { [K in typeof inspect.custom]: () => string })[\n inspect.custom\n ] = fn)\n\nfunction parseNode(\n seenNodes: Set<NodeLike>,\n graph: GraphLike,\n node: NodeLike,\n) {\n addInspect(node, () => {\n const res =\n 'Node ' +\n inspect(\n seenNodes.has(node) ?\n { ref: node.id }\n : {\n id: node.id,\n location: node.location,\n ...(node.importer ? { importer: true } : null),\n ...(node.dev ? { dev: true } : null),\n ...(node.optional ? { optional: true } : null),\n ...(node.resolved ? { resolved: node.resolved } : null),\n ...(node.integrity ?\n { integrity: node.integrity }\n : null),\n ...(node.edgesOut.size ?\n {\n edgesOut: [...node.edgesOut.values()].map(i => {\n seenNodes.add(node)\n return parseEdge(seenNodes, graph, i)\n }),\n }\n : (seenNodes.add(node), null)),\n },\n { depth: Infinity },\n )\n return res\n })\n return node\n}\n\nfunction parseEdge(\n seenNodes: Set<NodeLike>,\n graph: GraphLike,\n edge: EdgeLike,\n) {\n addInspect(edge, () => {\n const missingNode = `[missing package]: <${edge.name}@${edge.spec.bareSpec}>`\n const toLabel: string =\n edge.to ?\n inspect(parseNode(seenNodes, graph, edge.to), {\n depth: Infinity,\n })\n : missingNode\n return `Edge spec(${String(edge.spec)}) -${edge.type}-> to: ${toLabel}`\n })\n return edge\n}\n\nexport function objectLikeOutput(graph: GraphLike) {\n const seenNodes = new Set<NodeLike>()\n const importers = [...graph.importers]\n return inspect(\n importers.map(i => parseNode(seenNodes, graph, i)),\n { depth: Infinity },\n )\n}\n"]}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@vltpkg/graph",
3
3
  "description": "A library that helps understanding & expressing what happens on an install",
4
- "version": "0.0.0-3",
4
+ "version": "0.0.0-30",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/vltpkg/vltpkg.git",
8
8
  "directory": "src/graph"
9
9
  },
10
+ "author": "vlt technology inc. <support@vlt.sh> (http://vlt.sh)",
10
11
  "tshy": {
11
12
  "selfLink": false,
12
13
  "liveDev": true,
@@ -20,38 +21,40 @@
20
21
  }
21
22
  },
22
23
  "dependencies": {
23
- "graph-run": "^1.0.4",
24
+ "graph-run": "^1.1.0",
24
25
  "path-scurry": "^2.0.0",
25
26
  "promise-call-limit": "^3.0.2",
26
- "@vltpkg/dep-id": "0.0.0-3",
27
- "@vltpkg/error-cause": "0.0.0-3",
28
- "@vltpkg/package-info": "0.0.0-3",
29
- "@vltpkg/output": "0.0.0-3",
30
- "@vltpkg/fast-split": "0.0.0-3",
31
- "@vltpkg/pick-manifest": "0.0.0-3",
32
- "@vltpkg/package-json": "0.0.0-3",
33
- "@vltpkg/registry-client": "0.0.0-3",
34
- "@vltpkg/rollback-remove": "0.0.0-3",
35
- "@vltpkg/run": "0.0.0-3",
36
- "@vltpkg/satisfies": "0.0.0-3",
37
- "@vltpkg/semver": "0.0.0-3",
38
- "@vltpkg/types": "0.0.0-3",
39
- "@vltpkg/workspaces": "0.0.0-3",
40
- "@vltpkg/spec": "0.0.0-3"
27
+ "@vltpkg/cmd-shim": "0.0.0-30",
28
+ "@vltpkg/dep-id": "0.0.0-30",
29
+ "@vltpkg/dss-breadcrumb": "0.0.0-30",
30
+ "@vltpkg/error-cause": "0.0.0-30",
31
+ "@vltpkg/init": "0.0.0-30",
32
+ "@vltpkg/output": "0.0.0-30",
33
+ "@vltpkg/fast-split": "0.0.0-30",
34
+ "@vltpkg/package-info": "0.0.0-30",
35
+ "@vltpkg/package-json": "0.0.0-30",
36
+ "@vltpkg/pick-manifest": "0.0.0-30",
37
+ "@vltpkg/rollback-remove": "0.0.0-30",
38
+ "@vltpkg/run": "0.0.0-30",
39
+ "@vltpkg/satisfies": "0.0.0-30",
40
+ "@vltpkg/security-archive": "0.0.0-30",
41
+ "@vltpkg/spec": "0.0.0-30",
42
+ "@vltpkg/types": "0.0.0-30",
43
+ "@vltpkg/vlt-json": "0.0.0-30",
44
+ "@vltpkg/workspaces": "0.0.0-30"
41
45
  },
42
46
  "devDependencies": {
43
- "@eslint/js": "^9.20.0",
44
- "@types/eslint__js": "^8.42.3",
45
- "@types/node": "^22.13.1",
46
- "chalk": "^5.3.0",
47
- "eslint": "^9.20.0",
48
- "prettier": "^3.4.2",
47
+ "@eslint/js": "^9.34.0",
48
+ "@types/node": "^22.17.2",
49
+ "eslint": "^9.34.0",
50
+ "prettier": "^3.6.2",
49
51
  "tap": "^21.1.0",
50
52
  "tar": "^7.4.3",
51
53
  "tshy": "^3.0.2",
52
- "typedoc": "0.27.6",
54
+ "typedoc": "~0.27.9",
53
55
  "typescript": "5.7.3",
54
- "typescript-eslint": "^8.23.0"
56
+ "typescript-eslint": "^8.40.0",
57
+ "@vltpkg/vlt-json": "0.0.0-30"
55
58
  },
56
59
  "license": "BSD-2-Clause-Patent",
57
60
  "engines": {
@@ -89,6 +92,7 @@
89
92
  "snap": "tap",
90
93
  "test": "tap",
91
94
  "posttest": "tsc --noEmit",
95
+ "tshy": "tshy",
92
96
  "typecheck": "tsc --noEmit"
93
97
  }
94
98
  }
@@ -1,39 +0,0 @@
1
- import type { DepID } from '@vltpkg/dep-id';
2
- import type { Manifest, DependencyTypeShort } from '@vltpkg/types';
3
- import type { Spec, SpecLikeBase } from '@vltpkg/spec';
4
- export type EdgeLike = {
5
- name: string;
6
- from: NodeLike;
7
- spec: SpecLikeBase;
8
- to?: NodeLike;
9
- type: DependencyTypeShort;
10
- };
11
- export type GraphLike = {
12
- importers: Set<NodeLike>;
13
- mainImporter: NodeLike;
14
- projectRoot: string;
15
- nodes: Map<DepID, NodeLike>;
16
- edges: Set<EdgeLike>;
17
- addEdge: (type: DependencyTypeShort, spec: Spec, from: NodeLike, to?: NodeLike) => EdgeLike;
18
- addNode: (id?: DepID, manifest?: Manifest, spec?: Spec, name?: string, version?: string) => NodeLike;
19
- };
20
- export type NodeLike = {
21
- id: DepID;
22
- edgesIn: Set<EdgeLike>;
23
- edgesOut: Map<string, EdgeLike>;
24
- location?: string;
25
- manifest?: Manifest | null;
26
- name?: string | null;
27
- version?: string | null;
28
- integrity?: string | null;
29
- resolved?: string | null;
30
- importer: boolean;
31
- graph: GraphLike;
32
- mainImporter: boolean;
33
- projectRoot: string;
34
- dev: boolean;
35
- optional: boolean;
36
- toString(): string;
37
- setResolved(): void;
38
- };
39
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEtD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,YAAY,CAAA;IAClB,EAAE,CAAC,EAAE,QAAQ,CAAA;IACb,IAAI,EAAE,mBAAmB,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,YAAY,EAAE,QAAQ,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC3B,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACpB,OAAO,EAAE,CACP,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,EACd,EAAE,CAAC,EAAE,QAAQ,KACV,QAAQ,CAAA;IACb,OAAO,EAAE,CACP,EAAE,CAAC,EAAE,KAAK,EACV,QAAQ,CAAC,EAAE,QAAQ,EACnB,IAAI,CAAC,EAAE,IAAI,EACX,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,KACb,QAAQ,CAAA;CACd,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,KAAK,CAAA;IACT,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,SAAS,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,OAAO,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,IAAI,MAAM,CAAA;IAClB,WAAW,IAAI,IAAI,CAAA;CACpB,CAAA"}
package/dist/esm/types.js DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { Manifest, DependencyTypeShort } from '@vltpkg/types'\nimport type { Spec, SpecLikeBase } from '@vltpkg/spec'\n\nexport type EdgeLike = {\n name: string\n from: NodeLike\n spec: SpecLikeBase\n to?: NodeLike\n type: DependencyTypeShort\n}\n\nexport type GraphLike = {\n importers: Set<NodeLike>\n mainImporter: NodeLike\n projectRoot: string\n nodes: Map<DepID, NodeLike>\n edges: Set<EdgeLike>\n addEdge: (\n type: DependencyTypeShort,\n spec: Spec,\n from: NodeLike,\n to?: NodeLike,\n ) => EdgeLike\n addNode: (\n id?: DepID,\n manifest?: Manifest,\n spec?: Spec,\n name?: string,\n version?: string,\n ) => NodeLike\n}\n\nexport type NodeLike = {\n id: DepID\n edgesIn: Set<EdgeLike>\n edgesOut: Map<string, EdgeLike>\n location?: string\n manifest?: Manifest | null\n name?: string | null\n version?: string | null\n integrity?: string | null\n resolved?: string | null\n importer: boolean\n graph: GraphLike\n mainImporter: boolean\n projectRoot: string\n dev: boolean\n optional: boolean\n toString(): string\n setResolved(): void\n}\n"]}