@vltpkg/graph 0.0.0-0.1730239248325

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 (168) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +33 -0
  3. package/dist/esm/actual/load.d.ts +54 -0
  4. package/dist/esm/actual/load.d.ts.map +1 -0
  5. package/dist/esm/actual/load.js +243 -0
  6. package/dist/esm/actual/load.js.map +1 -0
  7. package/dist/esm/browser.d.ts +9 -0
  8. package/dist/esm/browser.d.ts.map +1 -0
  9. package/dist/esm/browser.js +11 -0
  10. package/dist/esm/browser.js.map +1 -0
  11. package/dist/esm/dependencies.d.ts +69 -0
  12. package/dist/esm/dependencies.d.ts.map +1 -0
  13. package/dist/esm/dependencies.js +71 -0
  14. package/dist/esm/dependencies.js.map +1 -0
  15. package/dist/esm/diff.d.ts +49 -0
  16. package/dist/esm/diff.d.ts.map +1 -0
  17. package/dist/esm/diff.js +123 -0
  18. package/dist/esm/diff.js.map +1 -0
  19. package/dist/esm/edge.d.ts +41 -0
  20. package/dist/esm/edge.d.ts.map +1 -0
  21. package/dist/esm/edge.js +66 -0
  22. package/dist/esm/edge.js.map +1 -0
  23. package/dist/esm/graph.d.ts +123 -0
  24. package/dist/esm/graph.d.ts.map +1 -0
  25. package/dist/esm/graph.js +301 -0
  26. package/dist/esm/graph.js.map +1 -0
  27. package/dist/esm/ideal/add-nodes.d.ts +19 -0
  28. package/dist/esm/ideal/add-nodes.d.ts.map +1 -0
  29. package/dist/esm/ideal/add-nodes.js +28 -0
  30. package/dist/esm/ideal/add-nodes.js.map +1 -0
  31. package/dist/esm/ideal/append-nodes.d.ts +9 -0
  32. package/dist/esm/ideal/append-nodes.d.ts.map +1 -0
  33. package/dist/esm/ideal/append-nodes.js +121 -0
  34. package/dist/esm/ideal/append-nodes.js.map +1 -0
  35. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +15 -0
  36. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -0
  37. package/dist/esm/ideal/build-ideal-from-starting-graph.js +28 -0
  38. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -0
  39. package/dist/esm/ideal/build.d.ts +32 -0
  40. package/dist/esm/ideal/build.d.ts.map +1 -0
  41. package/dist/esm/ideal/build.js +42 -0
  42. package/dist/esm/ideal/build.js.map +1 -0
  43. package/dist/esm/ideal/get-importer-specs.d.ts +13 -0
  44. package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -0
  45. package/dist/esm/ideal/get-importer-specs.js +76 -0
  46. package/dist/esm/ideal/get-importer-specs.js.map +1 -0
  47. package/dist/esm/ideal/remove-nodes.d.ts +7 -0
  48. package/dist/esm/ideal/remove-nodes.d.ts.map +1 -0
  49. package/dist/esm/ideal/remove-nodes.js +19 -0
  50. package/dist/esm/ideal/remove-nodes.js.map +1 -0
  51. package/dist/esm/ideal/remove-satisfied-specs.d.ts +8 -0
  52. package/dist/esm/ideal/remove-satisfied-specs.d.ts.map +1 -0
  53. package/dist/esm/ideal/remove-satisfied-specs.js +35 -0
  54. package/dist/esm/ideal/remove-satisfied-specs.js.map +1 -0
  55. package/dist/esm/ideal/types.d.ts +35 -0
  56. package/dist/esm/ideal/types.d.ts.map +1 -0
  57. package/dist/esm/ideal/types.js +2 -0
  58. package/dist/esm/ideal/types.js.map +1 -0
  59. package/dist/esm/index.d.ts +31 -0
  60. package/dist/esm/index.d.ts.map +1 -0
  61. package/dist/esm/index.js +26 -0
  62. package/dist/esm/index.js.map +1 -0
  63. package/dist/esm/lockfile/load-edges.d.ts +5 -0
  64. package/dist/esm/lockfile/load-edges.d.ts.map +1 -0
  65. package/dist/esm/lockfile/load-edges.js +40 -0
  66. package/dist/esm/lockfile/load-edges.js.map +1 -0
  67. package/dist/esm/lockfile/load-nodes.d.ts +4 -0
  68. package/dist/esm/lockfile/load-nodes.d.ts.map +1 -0
  69. package/dist/esm/lockfile/load-nodes.js +28 -0
  70. package/dist/esm/lockfile/load-nodes.js.map +1 -0
  71. package/dist/esm/lockfile/load.d.ts +33 -0
  72. package/dist/esm/lockfile/load.d.ts.map +1 -0
  73. package/dist/esm/lockfile/load.js +53 -0
  74. package/dist/esm/lockfile/load.js.map +1 -0
  75. package/dist/esm/lockfile/save.d.ts +18 -0
  76. package/dist/esm/lockfile/save.d.ts.map +1 -0
  77. package/dist/esm/lockfile/save.js +128 -0
  78. package/dist/esm/lockfile/save.js.map +1 -0
  79. package/dist/esm/lockfile/types.d.ts +60 -0
  80. package/dist/esm/lockfile/types.d.ts.map +1 -0
  81. package/dist/esm/lockfile/types.js +13 -0
  82. package/dist/esm/lockfile/types.js.map +1 -0
  83. package/dist/esm/node.d.ts +144 -0
  84. package/dist/esm/node.d.ts.map +1 -0
  85. package/dist/esm/node.js +266 -0
  86. package/dist/esm/node.js.map +1 -0
  87. package/dist/esm/non-empty-list.d.ts +3 -0
  88. package/dist/esm/non-empty-list.d.ts.map +1 -0
  89. package/dist/esm/non-empty-list.js +3 -0
  90. package/dist/esm/non-empty-list.js.map +1 -0
  91. package/dist/esm/package.json +3 -0
  92. package/dist/esm/reify/add-edge.d.ts +11 -0
  93. package/dist/esm/reify/add-edge.d.ts.map +1 -0
  94. package/dist/esm/reify/add-edge.js +43 -0
  95. package/dist/esm/reify/add-edge.js.map +1 -0
  96. package/dist/esm/reify/add-edges.d.ts +6 -0
  97. package/dist/esm/reify/add-edges.d.ts.map +1 -0
  98. package/dist/esm/reify/add-edges.js +13 -0
  99. package/dist/esm/reify/add-edges.js.map +1 -0
  100. package/dist/esm/reify/add-nodes.d.ts +7 -0
  101. package/dist/esm/reify/add-nodes.d.ts.map +1 -0
  102. package/dist/esm/reify/add-nodes.js +37 -0
  103. package/dist/esm/reify/add-nodes.js.map +1 -0
  104. package/dist/esm/reify/bin-paths.d.ts +4 -0
  105. package/dist/esm/reify/bin-paths.d.ts.map +1 -0
  106. package/dist/esm/reify/bin-paths.js +23 -0
  107. package/dist/esm/reify/bin-paths.js.map +1 -0
  108. package/dist/esm/reify/build.d.ts +5 -0
  109. package/dist/esm/reify/build.d.ts.map +1 -0
  110. package/dist/esm/reify/build.js +90 -0
  111. package/dist/esm/reify/build.js.map +1 -0
  112. package/dist/esm/reify/delete-edge.d.ts +5 -0
  113. package/dist/esm/reify/delete-edge.d.ts.map +1 -0
  114. package/dist/esm/reify/delete-edge.js +29 -0
  115. package/dist/esm/reify/delete-edge.js.map +1 -0
  116. package/dist/esm/reify/delete-edges.d.ts +5 -0
  117. package/dist/esm/reify/delete-edges.d.ts.map +1 -0
  118. package/dist/esm/reify/delete-edges.js +14 -0
  119. package/dist/esm/reify/delete-edges.js.map +1 -0
  120. package/dist/esm/reify/delete-nodes.d.ts +5 -0
  121. package/dist/esm/reify/delete-nodes.d.ts.map +1 -0
  122. package/dist/esm/reify/delete-nodes.js +12 -0
  123. package/dist/esm/reify/delete-nodes.js.map +1 -0
  124. package/dist/esm/reify/index.d.ts +16 -0
  125. package/dist/esm/reify/index.d.ts.map +1 -0
  126. package/dist/esm/reify/index.js +85 -0
  127. package/dist/esm/reify/index.js.map +1 -0
  128. package/dist/esm/reify/optional-fail.d.ts +16 -0
  129. package/dist/esm/reify/optional-fail.d.ts.map +1 -0
  130. package/dist/esm/reify/optional-fail.js +16 -0
  131. package/dist/esm/reify/optional-fail.js.map +1 -0
  132. package/dist/esm/reify/rollback.d.ts +5 -0
  133. package/dist/esm/reify/rollback.d.ts.map +1 -0
  134. package/dist/esm/reify/rollback.js +24 -0
  135. package/dist/esm/reify/rollback.js.map +1 -0
  136. package/dist/esm/reify/update-importers-package-json.d.ts +36 -0
  137. package/dist/esm/reify/update-importers-package-json.d.ts.map +1 -0
  138. package/dist/esm/reify/update-importers-package-json.js +95 -0
  139. package/dist/esm/reify/update-importers-package-json.js.map +1 -0
  140. package/dist/esm/remove-optional-subgraph.d.ts +34 -0
  141. package/dist/esm/remove-optional-subgraph.d.ts.map +1 -0
  142. package/dist/esm/remove-optional-subgraph.js +48 -0
  143. package/dist/esm/remove-optional-subgraph.js.map +1 -0
  144. package/dist/esm/stringify-node.d.ts +3 -0
  145. package/dist/esm/stringify-node.d.ts.map +1 -0
  146. package/dist/esm/stringify-node.js +24 -0
  147. package/dist/esm/stringify-node.js.map +1 -0
  148. package/dist/esm/types.d.ts +39 -0
  149. package/dist/esm/types.d.ts.map +1 -0
  150. package/dist/esm/types.js +2 -0
  151. package/dist/esm/types.js.map +1 -0
  152. package/dist/esm/visualization/human-readable-output.d.ts +25 -0
  153. package/dist/esm/visualization/human-readable-output.d.ts.map +1 -0
  154. package/dist/esm/visualization/human-readable-output.js +132 -0
  155. package/dist/esm/visualization/human-readable-output.js.map +1 -0
  156. package/dist/esm/visualization/json-output.d.ts +37 -0
  157. package/dist/esm/visualization/json-output.d.ts.map +1 -0
  158. package/dist/esm/visualization/json-output.js +28 -0
  159. package/dist/esm/visualization/json-output.js.map +1 -0
  160. package/dist/esm/visualization/mermaid-output.d.ts +11 -0
  161. package/dist/esm/visualization/mermaid-output.d.ts.map +1 -0
  162. package/dist/esm/visualization/mermaid-output.js +68 -0
  163. package/dist/esm/visualization/mermaid-output.js.map +1 -0
  164. package/dist/esm/visualization/object-like-output.d.ts +3 -0
  165. package/dist/esm/visualization/object-like-output.d.ts.map +1 -0
  166. package/dist/esm/visualization/object-like-output.js +49 -0
  167. package/dist/esm/visualization/object-like-output.js.map +1 -0
  168. package/package.json +86 -0
@@ -0,0 +1,39 @@
1
+ import type { DepID } from '@vltpkg/dep-id';
2
+ import type { Manifest } from '@vltpkg/types';
3
+ import type { Spec } from '@vltpkg/spec';
4
+ import type { SpecLikeBase } from '@vltpkg/spec';
5
+ import type { DependencyTypeShort } from './dependencies.js';
6
+ export interface EdgeLike {
7
+ name: string;
8
+ from: NodeLike;
9
+ spec: SpecLikeBase;
10
+ to?: NodeLike;
11
+ type: DependencyTypeShort;
12
+ }
13
+ export interface GraphLike {
14
+ importers: Set<NodeLike>;
15
+ mainImporter: NodeLike;
16
+ projectRoot: string;
17
+ nodes: Map<DepID, NodeLike>;
18
+ edges: Set<EdgeLike>;
19
+ addEdge: (type: DependencyTypeShort, spec: Spec, from: NodeLike, to?: NodeLike) => EdgeLike;
20
+ addNode: (id?: DepID, manifest?: Manifest, spec?: Spec, name?: string, version?: string) => NodeLike;
21
+ }
22
+ export interface NodeLike {
23
+ id: DepID;
24
+ edgesIn: Set<EdgeLike>;
25
+ edgesOut: Map<string, EdgeLike>;
26
+ location?: string;
27
+ manifest?: Manifest | null;
28
+ name?: string | null;
29
+ version?: string | null;
30
+ integrity?: string | null;
31
+ resolved?: string | null;
32
+ importer: boolean;
33
+ graph: GraphLike;
34
+ mainImporter: boolean;
35
+ projectRoot: string;
36
+ dev: boolean;
37
+ optional: boolean;
38
+ }
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
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,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,MAAM,WAAW,QAAQ;IACvB,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;AAED,MAAM,WAAW,SAAS;IACxB,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;AAED,MAAM,WAAW,QAAQ;IACvB,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;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { Manifest } from '@vltpkg/types'\nimport type { Spec } from '@vltpkg/spec'\nimport type { SpecLikeBase } from '@vltpkg/spec'\nimport type { DependencyTypeShort } from './dependencies.js'\n\nexport interface EdgeLike {\n name: string\n from: NodeLike\n spec: SpecLikeBase\n to?: NodeLike\n type: DependencyTypeShort\n}\n\nexport interface 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 interface 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}\n"]}
@@ -0,0 +1,25 @@
1
+ import { EdgeLike, NodeLike } from '../types.js';
2
+ import type { ChalkInstance } from 'chalk';
3
+ export type TreeItem = {
4
+ name?: string | null;
5
+ edge: EdgeLike | undefined;
6
+ node: NodeLike | undefined;
7
+ prefix: string;
8
+ padding: string;
9
+ hasSibling: boolean;
10
+ deduped: boolean;
11
+ include: boolean;
12
+ parent: TreeItem | undefined;
13
+ };
14
+ export type HumanReadableOutputOptions = {
15
+ edges: EdgeLike[];
16
+ importers: Set<NodeLike>;
17
+ nodes: NodeLike[];
18
+ colors?: ChalkInstance;
19
+ highlightSelection: boolean;
20
+ };
21
+ /**
22
+ * Returns a human-readable output of the graph.
23
+ */
24
+ export declare function humanReadableOutput(options: HumanReadableOutputOptions): string | null | undefined;
25
+ //# sourceMappingURL=human-readable-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-readable-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/human-readable-output.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAY1C,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC1B,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,kBAAkB,EAAE,OAAO,CAAA;CAC5B,CAAA;AA6DD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,0BAA0B,6BAsGpC"}
@@ -0,0 +1,132 @@
1
+ import { splitDepID } from '@vltpkg/dep-id';
2
+ const chars = new Map(Object.entries({
3
+ connection: '─',
4
+ down: '│',
5
+ 'last-child': '└',
6
+ 'middle-child': '├',
7
+ t: '┬',
8
+ }));
9
+ const isSelected = (options, edge, node) => !!((!node || options.nodes.includes(node)) &&
10
+ (!edge || options.edges.includes(edge)));
11
+ /**
12
+ * Returns a map of tree items to be printed.
13
+ */
14
+ const getTreeItems = (initialItems, options) => {
15
+ const seenNodes = new Set();
16
+ const treeItems = new Map();
17
+ const traverse = new Set(initialItems);
18
+ for (const item of traverse) {
19
+ if (item.node) {
20
+ if (seenNodes.has(item.node)) {
21
+ item.deduped = true;
22
+ continue;
23
+ }
24
+ seenNodes.add(item.node);
25
+ const edges = [...item.node.edgesOut.values()].sort(i => Number(i.to?.importer));
26
+ for (const edge of edges) {
27
+ const toItems = treeItems.get(edge) ?? new Map();
28
+ const nextItem = {
29
+ edge,
30
+ node: edge.to,
31
+ hasSibling: false,
32
+ padding: '',
33
+ prefix: '',
34
+ deduped: false,
35
+ include: isSelected(options, edge, edge.to),
36
+ parent: item,
37
+ };
38
+ toItems.set(edge.to, nextItem);
39
+ treeItems.set(edge, toItems);
40
+ traverse.add(nextItem);
41
+ }
42
+ }
43
+ }
44
+ for (const item of [...traverse].reverse()) {
45
+ if (item.include && item.parent) {
46
+ item.parent.include = true;
47
+ }
48
+ }
49
+ return treeItems;
50
+ };
51
+ /**
52
+ * Returns a human-readable output of the graph.
53
+ */
54
+ export function humanReadableOutput(options) {
55
+ const { colors, importers } = options;
56
+ const noop = (s) => s;
57
+ const { dim = noop, red = noop, reset = noop, yellow = noop, } = colors ?? {};
58
+ const initialItems = new Set();
59
+ for (const importer of importers) {
60
+ initialItems.add({
61
+ name: importer.name,
62
+ edge: undefined,
63
+ node: importer,
64
+ prefix: '',
65
+ padding: '',
66
+ hasSibling: false,
67
+ deduped: false,
68
+ include: isSelected(options, undefined, importer),
69
+ parent: undefined,
70
+ });
71
+ }
72
+ const treeItems = getTreeItems(initialItems, options);
73
+ let res = '';
74
+ const traverse = (item) => {
75
+ let header = '';
76
+ let content = '';
77
+ const depIdTuple = item.node?.id && splitDepID(item.node.id);
78
+ const hasCustomReg = depIdTuple?.[0] === 'registry' && depIdTuple[1];
79
+ const name = hasCustomReg ? `${depIdTuple[1]}:${item.name}` : item.name;
80
+ const decoratedName = (options.highlightSelection &&
81
+ isSelected(options, item.edge, item.node)) ?
82
+ yellow(name)
83
+ : name;
84
+ if (!item.node && item.include) {
85
+ const missing = item.edge?.type.endsWith('ptional') ?
86
+ dim('(missing optional)')
87
+ : red('(missing)');
88
+ return `${item.padding}${item.prefix}${decoratedName} ${missing}\n`;
89
+ }
90
+ const deduped = item.deduped ? ` ${dim('(deduped)')}` : '';
91
+ header += `${item.padding}${item.prefix}${decoratedName}${deduped}\n`;
92
+ // deduped items need not to be printed or traversed
93
+ if (!item.deduped) {
94
+ const edges = item.node ? [...item.node.edgesOut.values()] : [];
95
+ const nextItems = edges.map(i => treeItems.get(i)?.get(i.to));
96
+ const includedItems = nextItems.filter(i => i?.include);
97
+ for (const nextItem of nextItems) {
98
+ /* c8 ignore next -- impossible but TS doesn't know that */
99
+ if (!nextItem)
100
+ continue;
101
+ const parent = item;
102
+ const isLast = includedItems.indexOf(nextItem) === includedItems.length - 1;
103
+ const toName = nextItem.node?.version ?
104
+ `${nextItem.node.name}@${nextItem.node.version}`
105
+ : nextItem.node?.name;
106
+ const nextChar = isLast ? 'last-child' : 'middle-child';
107
+ nextItem.name =
108
+ (nextItem.node?.name &&
109
+ nextItem.edge?.name !== nextItem.edge?.to?.name) ?
110
+ `${nextItem.edge?.name} (${toName})`
111
+ : `${nextItem.edge?.name}@${nextItem.node?.version || nextItem.edge?.spec.bareSpec}`;
112
+ nextItem.padding =
113
+ parent.prefix.length ?
114
+ `${parent.padding}${parent.hasSibling ? chars.get('down') : ' '} `
115
+ : '';
116
+ nextItem.prefix = `${chars.get(nextChar)}${chars.get('connection')}${chars.get('connection')} `;
117
+ nextItem.hasSibling = !isLast;
118
+ content += traverse(nextItem);
119
+ }
120
+ }
121
+ const regularConnection = `${chars.get('connection')} `;
122
+ const parentConnection = `${chars.get('t')} `;
123
+ return item.include ?
124
+ `${content ? header.replace(regularConnection, parentConnection) : header}${content}`
125
+ : '';
126
+ };
127
+ for (const item of initialItems) {
128
+ res += traverse(item);
129
+ }
130
+ return reset(res);
131
+ }
132
+ //# sourceMappingURL=human-readable-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-readable-output.js","sourceRoot":"","sources":["../../../src/visualization/human-readable-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { splitDepID } from '@vltpkg/dep-id'\nimport { EdgeLike, NodeLike } from '../types.js'\nimport type { ChalkInstance } from 'chalk'\n\nconst chars = new Map(\n Object.entries({\n connection: '─',\n down: '│',\n 'last-child': '└',\n 'middle-child': '├',\n t: '┬',\n }),\n)\n\nexport type TreeItem = {\n name?: string | null\n edge: EdgeLike | undefined\n node: NodeLike | undefined\n prefix: string\n padding: string\n hasSibling: boolean\n deduped: boolean\n include: boolean\n parent: TreeItem | undefined\n}\n\nexport type HumanReadableOutputOptions = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n colors?: ChalkInstance\n highlightSelection: boolean\n}\n\nconst isSelected = (\n options: HumanReadableOutputOptions,\n edge?: EdgeLike,\n node?: NodeLike,\n) =>\n !!(\n (!node || options.nodes.includes(node)) &&\n (!edge || options.edges.includes(edge))\n )\n\n/**\n * Returns a map of tree items to be printed.\n */\nconst getTreeItems = (\n initialItems: Set<TreeItem>,\n options: HumanReadableOutputOptions,\n) => {\n const seenNodes = new Set<NodeLike>()\n const treeItems = new Map<\n EdgeLike | undefined,\n Map<NodeLike | undefined, TreeItem>\n >()\n const traverse = new Set<TreeItem>(initialItems)\n for (const item of traverse) {\n if (item.node) {\n if (seenNodes.has(item.node)) {\n item.deduped = true\n continue\n }\n seenNodes.add(item.node)\n const edges = [...item.node.edgesOut.values()].sort(i =>\n Number(i.to?.importer),\n )\n for (const edge of edges) {\n const toItems = treeItems.get(edge) ?? new Map()\n const nextItem: TreeItem = {\n edge,\n node: edge.to,\n hasSibling: false,\n padding: '',\n prefix: '',\n deduped: false,\n include: isSelected(options, edge, edge.to),\n parent: item,\n }\n toItems.set(edge.to, nextItem)\n treeItems.set(edge, toItems)\n traverse.add(nextItem)\n }\n }\n }\n for (const item of [...traverse].reverse()) {\n if (item.include && item.parent) {\n item.parent.include = true\n }\n }\n return treeItems\n}\n\n/**\n * Returns a human-readable output of the graph.\n */\nexport function humanReadableOutput(\n options: HumanReadableOutputOptions,\n) {\n const { colors, importers } = options\n const noop = (s?: string | null) => s\n const {\n dim = noop,\n red = noop,\n reset = noop,\n yellow = noop,\n } = colors ?? {}\n const initialItems = new Set<TreeItem>()\n for (const importer of importers) {\n initialItems.add({\n name: importer.name,\n edge: undefined,\n node: importer,\n prefix: '',\n padding: '',\n hasSibling: false,\n deduped: false,\n include: isSelected(options, undefined, importer),\n parent: undefined,\n })\n }\n const treeItems = getTreeItems(initialItems, options)\n\n let res = ''\n const traverse = (item: TreeItem) => {\n let header = ''\n let content = ''\n\n const depIdTuple = item.node?.id && splitDepID(item.node.id)\n const hasCustomReg =\n depIdTuple?.[0] === 'registry' && depIdTuple[1]\n const name =\n hasCustomReg ? `${depIdTuple[1]}:${item.name}` : item.name\n const decoratedName =\n (\n options.highlightSelection &&\n isSelected(options, item.edge, item.node)\n ) ?\n yellow(name)\n : name\n if (!item.node && item.include) {\n const missing =\n item.edge?.type.endsWith('ptional') ?\n dim('(missing optional)')\n : red('(missing)')\n return `${item.padding}${item.prefix}${decoratedName} ${missing}\\n`\n }\n\n const deduped = item.deduped ? ` ${dim('(deduped)')}` : ''\n header += `${item.padding}${item.prefix}${decoratedName}${deduped}\\n`\n\n // deduped items need not to be printed or traversed\n if (!item.deduped) {\n const edges = item.node ? [...item.node.edgesOut.values()] : []\n const nextItems = edges.map(i => treeItems.get(i)?.get(i.to))\n const includedItems = nextItems.filter(i => i?.include)\n\n for (const nextItem of nextItems) {\n /* c8 ignore next -- impossible but TS doesn't know that */\n if (!nextItem) continue\n\n const parent = item\n const isLast =\n includedItems.indexOf(nextItem) === includedItems.length - 1\n const toName =\n nextItem.node?.version ?\n `${nextItem.node.name}@${nextItem.node.version}`\n : nextItem.node?.name\n const nextChar = isLast ? 'last-child' : 'middle-child'\n\n nextItem.name =\n (\n nextItem.node?.name &&\n nextItem.edge?.name !== nextItem.edge?.to?.name\n ) ?\n `${nextItem.edge?.name} (${toName})`\n : `${nextItem.edge?.name}@${nextItem.node?.version || nextItem.edge?.spec.bareSpec}`\n nextItem.padding =\n parent.prefix.length ?\n `${parent.padding}${parent.hasSibling ? chars.get('down') : ' '} `\n : ''\n nextItem.prefix = `${chars.get(nextChar)}${chars.get('connection')}${chars.get('connection')} `\n nextItem.hasSibling = !isLast\n\n content += traverse(nextItem)\n }\n }\n\n const regularConnection = `${chars.get('connection')} `\n const parentConnection = `${chars.get('t')} `\n return item.include ?\n `${content ? header.replace(regularConnection, parentConnection) : header}${content}`\n : ''\n }\n\n for (const item of initialItems) {\n res += traverse(item)\n }\n return reset(res)\n}\n"]}
@@ -0,0 +1,37 @@
1
+ import { DepID } from '@vltpkg/dep-id';
2
+ import { EdgeLike, NodeLike } from '../types.js';
3
+ /**
4
+ * A JSON output item describes a package that is present in the install
5
+ * graph. It represents an edge plus it's linking Node.
6
+ */
7
+ export type JSONOutputItem = {
8
+ /**
9
+ * The name of the package.
10
+ */
11
+ name: string;
12
+ /**
13
+ * A reference to the id of the Node that this package is linked from.
14
+ */
15
+ fromID?: DepID;
16
+ /**
17
+ * The dependency spec definition for this package.
18
+ */
19
+ spec?: string;
20
+ /**
21
+ * The package type.
22
+ */
23
+ type?: EdgeLike['type'];
24
+ /**
25
+ * A representation of the package object that fulfills this dependency.
26
+ */
27
+ to?: NodeLike;
28
+ };
29
+ export type JSONOutputOptions = {
30
+ edges: EdgeLike[];
31
+ nodes: NodeLike[];
32
+ };
33
+ /**
34
+ * Returns a JSON string representation of the graph.
35
+ */
36
+ export declare function jsonOutput({ edges, nodes }: JSONOutputOptions): string;
37
+ //# sourceMappingURL=json-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/json-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEhD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAA;IACd;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACvB;;OAEG;IACH,EAAE,CAAC,EAAE,QAAQ,CAAA;CACd,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB,CAAA;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,iBAAiB,UA0B7D"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Returns a JSON string representation of the graph.
3
+ */
4
+ export function jsonOutput({ edges, nodes }) {
5
+ const res = [];
6
+ // Collects importer nodes as edgeless json output items
7
+ for (const node of nodes) {
8
+ if (node.importer) {
9
+ res.push({
10
+ /* c8 ignore next - name can't be missing but ts won't know */
11
+ name: node.name || node.id,
12
+ to: node,
13
+ });
14
+ }
15
+ }
16
+ // Collects edge & it's linked nodes as json output items
17
+ for (const edge of edges) {
18
+ res.push({
19
+ name: edge.name,
20
+ fromID: edge.from.id,
21
+ spec: String(edge.spec),
22
+ type: edge.type,
23
+ to: edge.to,
24
+ });
25
+ }
26
+ return JSON.stringify(res, null, 2);
27
+ }
28
+ //# sourceMappingURL=json-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../../src/visualization/json-output.ts"],"names":[],"mappings":"AAmCA;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAqB;IAC5D,MAAM,GAAG,GAAqB,EAAE,CAAA;IAEhC,wDAAwD;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC;gBACP,8DAA8D;gBAC9D,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;gBAC1B,EAAE,EAAE,IAAI;aACT,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;SACZ,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AACrC,CAAC","sourcesContent":["import { DepID } from '@vltpkg/dep-id'\nimport { EdgeLike, NodeLike } from '../types.js'\n\n/**\n * A JSON output item describes a package that is present in the install\n * graph. It represents an edge plus it's linking Node.\n */\nexport type JSONOutputItem = {\n /**\n * The name of the package.\n */\n name: string\n /**\n * A reference to the id of the Node that this package is linked from.\n */\n fromID?: DepID\n /**\n * The dependency spec definition for this package.\n */\n spec?: string\n /**\n * The package type.\n */\n type?: EdgeLike['type']\n /**\n * A representation of the package object that fulfills this dependency.\n */\n to?: NodeLike\n}\n\nexport type JSONOutputOptions = {\n edges: EdgeLike[]\n nodes: NodeLike[]\n}\n\n/**\n * Returns a JSON string representation of the graph.\n */\nexport function jsonOutput({ edges, nodes }: JSONOutputOptions) {\n const res: JSONOutputItem[] = []\n\n // Collects importer nodes as edgeless json output items\n for (const node of nodes) {\n if (node.importer) {\n res.push({\n /* c8 ignore next - name can't be missing but ts won't know */\n name: node.name || node.id,\n to: node,\n })\n }\n }\n\n // Collects edge & it's linked nodes as json output items\n for (const edge of edges) {\n res.push({\n name: edge.name,\n fromID: edge.from.id,\n spec: String(edge.spec),\n type: edge.type,\n to: edge.to,\n })\n }\n\n return JSON.stringify(res, null, 2)\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { EdgeLike, NodeLike } from '../types.js';
2
+ export type MermaidOutputOptions = {
3
+ edges: EdgeLike[];
4
+ importers: Set<NodeLike>;
5
+ nodes: NodeLike[];
6
+ };
7
+ /**
8
+ * Returns a mermaid string representation of the graph.
9
+ */
10
+ export declare function mermaidOutput({ edges, importers, nodes, }: MermaidOutputOptions): string;
11
+ //# sourceMappingURL=mermaid-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEhD,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB,CAAA;AAsDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,SAAS,EACT,KAAK,GACN,EAAE,oBAAoB,UA0CtB"}
@@ -0,0 +1,68 @@
1
+ import { Edge } from '../edge.js';
2
+ import { Node } from '../node.js';
3
+ let missingCount = 0;
4
+ const nodeLabel = (node) => `"${String(node).replaceAll('@', '#64;')}"`;
5
+ function parseNode(seenNodes, includedItems, node) {
6
+ if (seenNodes.has(node.id) || !includedItems.get(node)) {
7
+ return '';
8
+ }
9
+ seenNodes.add(node.id);
10
+ const edges = [...node.edgesOut.values()]
11
+ .map(e => parseEdge(seenNodes, includedItems, e))
12
+ .filter(Boolean)
13
+ .join('\n');
14
+ return `${encodeURIComponent(node.id)}(${nodeLabel(node)})${edges.length ? '\n' : ''}${edges}`;
15
+ }
16
+ function parseEdge(seenNodes, includedItems, edge) {
17
+ if (!includedItems.get(edge)) {
18
+ return '';
19
+ }
20
+ const edgeResult = `${encodeURIComponent(edge.from.id)}(${nodeLabel(edge.from)})` +
21
+ ` -->|"${String(edge.spec).replaceAll('@', '#64;')} (${edge.type})"| `;
22
+ const missingLabel = edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing';
23
+ if (!edge.to) {
24
+ return edgeResult + `missing-${missingCount++}(${missingLabel})\n`;
25
+ }
26
+ return (edgeResult +
27
+ `${encodeURIComponent(edge.to.id)}(${nodeLabel(edge.to)})\n` +
28
+ parseNode(seenNodes, includedItems, edge.to));
29
+ }
30
+ /**
31
+ * Returns a mermaid string representation of the graph.
32
+ */
33
+ export function mermaidOutput({ edges, importers, nodes, }) {
34
+ const seen = new Set();
35
+ const includedItems = new Map();
36
+ const traverse = new Set([...importers].map(i => ({ self: i, parent: undefined })));
37
+ for (const item of traverse) {
38
+ if (seen.has(item.self))
39
+ continue;
40
+ seen.add(item.self);
41
+ if (item.self instanceof Edge) {
42
+ if (edges.includes(item.self)) {
43
+ includedItems.set(item.self, true);
44
+ }
45
+ if (item.self.to) {
46
+ traverse.add({ self: item.self.to, parent: item.self });
47
+ }
48
+ }
49
+ if (item.self instanceof Node) {
50
+ if (nodes.includes(item.self)) {
51
+ includedItems.set(item.self, true);
52
+ }
53
+ for (const edge of item.self.edgesOut.values()) {
54
+ traverse.add({ self: edge, parent: item.self });
55
+ }
56
+ }
57
+ }
58
+ for (const item of [...traverse].reverse()) {
59
+ if (includedItems.has(item.self) && item.parent) {
60
+ includedItems.set(item.parent, true);
61
+ }
62
+ }
63
+ return ('flowchart TD\n' +
64
+ [...importers]
65
+ .map(i => parseNode(new Set(), includedItems, i))
66
+ .join('\n'));
67
+ }
68
+ //# sourceMappingURL=mermaid-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid-output.js","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { DepID } from '@vltpkg/dep-id'\nimport { Edge } from '../edge.js'\nimport { Node } from '../node.js'\nimport { EdgeLike, NodeLike } from '../types.js'\n\nexport type MermaidOutputOptions = {\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}: MermaidOutputOptions) {\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"]}
@@ -0,0 +1,3 @@
1
+ import { GraphLike } from '../types.js';
2
+ export declare function objectLikeOutput(graph: GraphLike): string;
3
+ //# sourceMappingURL=object-like-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-like-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/object-like-output.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,SAAS,EAAY,MAAM,aAAa,CAAA;AAyD3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,UAOhD"}
@@ -0,0 +1,49 @@
1
+ import { inspect } from 'node:util';
2
+ function parseNode(seenNodes, graph, node) {
3
+ ;
4
+ node[inspect.custom] = () => {
5
+ const res = 'Node ' +
6
+ inspect(seenNodes.has(node) ?
7
+ { ref: node.id }
8
+ : {
9
+ id: node.id,
10
+ location: node.location,
11
+ ...(node.importer ? { importer: true } : null),
12
+ ...(node.dev ? { dev: true } : null),
13
+ ...(node.optional ? { optional: true } : null),
14
+ ...(node.resolved ? { resolved: node.resolved } : null),
15
+ ...(node.integrity ?
16
+ { integrity: node.integrity }
17
+ : null),
18
+ ...(node.edgesOut.size ?
19
+ {
20
+ edgesOut: [...node.edgesOut.values()].map(i => {
21
+ seenNodes.add(node);
22
+ return parseEdge(seenNodes, graph, i);
23
+ }),
24
+ }
25
+ : (seenNodes.add(node), null)),
26
+ }, { depth: Infinity });
27
+ return res;
28
+ };
29
+ return node;
30
+ }
31
+ function parseEdge(seenNodes, graph, edge) {
32
+ ;
33
+ edge[inspect.custom] = () => {
34
+ const missingNode = `[missing package]: <${edge.name}@${edge.spec.bareSpec}>`;
35
+ const toLabel = edge.to ?
36
+ inspect(parseNode(seenNodes, graph, edge.to), {
37
+ depth: Infinity,
38
+ })
39
+ : missingNode;
40
+ return `Edge spec(${String(edge.spec)}) -${edge.type}-> to: ${toLabel}`;
41
+ };
42
+ return edge;
43
+ }
44
+ export function objectLikeOutput(graph) {
45
+ const seenNodes = new Set();
46
+ const importers = [...graph.importers];
47
+ return inspect(importers.map(i => parseNode(seenNodes, graph, i)), { depth: Infinity });
48
+ }
49
+ //# sourceMappingURL=object-like-output.js.map
@@ -0,0 +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 { EdgeLike, GraphLike, NodeLike } from '../types.js'\n\nfunction parseNode(\n seenNodes: Set<NodeLike>,\n graph: GraphLike,\n node: NodeLike,\n) {\n ;(node as any)[inspect.custom] = (): string => {\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 ;(edge as any)[inspect.custom] = () => {\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 ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "@vltpkg/graph",
3
+ "description": "A library that helps understanding & expressing what happens on an install",
4
+ "version": "0.0.0-0.1730239248325",
5
+ "tshy": {
6
+ "selfLink": false,
7
+ "dialects": [
8
+ "esm"
9
+ ],
10
+ "exports": {
11
+ "./package.json": "./package.json",
12
+ ".": "./src/index.ts",
13
+ "./browser": "./src/browser.ts"
14
+ }
15
+ },
16
+ "dependencies": {
17
+ "graph-run": "^1.0.4",
18
+ "path-scurry": "^2.0.0",
19
+ "promise-call-limit": "^3.0.2",
20
+ "@vltpkg/dep-id": "0.0.0-0.1730239248325",
21
+ "@vltpkg/package-json": "0.0.0-0.1730239248325",
22
+ "@vltpkg/error-cause": "0.0.0-0.1730239248325",
23
+ "@vltpkg/pick-manifest": "0.0.0-0.1730239248325",
24
+ "@vltpkg/registry-client": "0.0.0-0.1730239248325",
25
+ "@vltpkg/rollback-remove": "0.0.0-0.1730239248325",
26
+ "@vltpkg/satisfies": "0.0.0-0.1730239248325",
27
+ "@vltpkg/semver": "0.0.0-0.1730239248325",
28
+ "@vltpkg/package-info": "0.0.0-0.1730239248325",
29
+ "@vltpkg/types": "0.0.0-0.1730239248325",
30
+ "@vltpkg/run": "0.0.0-0.1730239248325",
31
+ "@vltpkg/fast-split": "0.0.0-0.1730239248325",
32
+ "@vltpkg/spec": "0.0.0-0.1730239248325",
33
+ "@vltpkg/workspaces": "0.0.0-0.1730239248325"
34
+ },
35
+ "devDependencies": {
36
+ "@eslint/js": "^9.8.0",
37
+ "@types/eslint__js": "^8.42.3",
38
+ "@types/node": "^22.4.1",
39
+ "chalk": "^5.3.0",
40
+ "eslint": "^9.8.0",
41
+ "prettier": "^3.3.2",
42
+ "tap": "^21.0.1",
43
+ "tar": "^7.4.3",
44
+ "tshy": "^3.0.2",
45
+ "typescript": "^5.5.4",
46
+ "typescript-eslint": "^8.0.1"
47
+ },
48
+ "license": "BSD-2-Clause-Patent",
49
+ "engines": {
50
+ "node": "20 || >=22"
51
+ },
52
+ "tap": {
53
+ "extends": "../../tap-config.yaml"
54
+ },
55
+ "prettier": "../../.prettierrc.js",
56
+ "module": "./dist/esm/index.js",
57
+ "type": "module",
58
+ "exports": {
59
+ "./package.json": "./package.json",
60
+ ".": {
61
+ "import": {
62
+ "types": "./dist/esm/index.d.ts",
63
+ "default": "./dist/esm/index.js"
64
+ }
65
+ },
66
+ "./browser": {
67
+ "import": {
68
+ "types": "./dist/esm/browser.d.ts",
69
+ "default": "./dist/esm/browser.js"
70
+ }
71
+ }
72
+ },
73
+ "files": [
74
+ "dist"
75
+ ],
76
+ "scripts": {
77
+ "format": "prettier --write . --log-level warn --ignore-path ../../.prettierignore --cache",
78
+ "format:check": "prettier --check . --ignore-path ../../.prettierignore --cache",
79
+ "lint": "eslint . --fix",
80
+ "lint:check": "eslint .",
81
+ "presnap": "tshy",
82
+ "snap": "tap",
83
+ "pretest": "tshy",
84
+ "test": "tap"
85
+ }
86
+ }