@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,10 +1,8 @@
1
- import type { PackageInfoClientOptions } from '@vltpkg/package-info';
2
- import type { PackageJson } from '@vltpkg/package-json';
1
+ import type { PackageInfoClient } from '@vltpkg/package-info';
3
2
  import type { LoadOptions } from './actual/load.ts';
4
3
  import type { RemoveImportersDependenciesMap } from './dependencies.ts';
5
- export type UninstallOptions = PackageInfoClientOptions & LoadOptions & {
6
- projectRoot: string;
7
- packageJson: PackageJson;
4
+ export type UninstallOptions = LoadOptions & {
5
+ packageInfo: PackageInfoClient;
8
6
  };
9
7
  export declare const uninstall: (options: UninstallOptions, remove?: RemoveImportersDependenciesMap) => Promise<{
10
8
  graph: import("./graph.ts").Graph;
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAA;AAIvE,MAAM,MAAM,gBAAgB,GAAG,wBAAwB,GACrD,WAAW,GAAG;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;CACzB,CAAA;AAEH,eAAO,MAAM,SAAS,YACX,gBAAgB,WAChB,8BAA8B;;;EA0BxC,CAAA"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAA;AAIvE,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAC3C,WAAW,EAAE,iBAAiB,CAAA;CAC/B,CAAA;AAED,eAAO,MAAM,SAAS,YACX,gBAAgB,WAChB,8BAA8B;;;EAwBxC,CAAA"}
@@ -1,4 +1,3 @@
1
- import { PackageInfoClient } from '@vltpkg/package-info';
2
1
  import { load as actualLoad } from "./actual/load.js";
3
2
  import { build as idealBuild } from "./ideal/build.js";
4
3
  import { reify } from "./reify/index.js";
@@ -6,7 +5,6 @@ export const uninstall = async (options, remove) => {
6
5
  const mainManifest = options.packageJson.read(options.projectRoot);
7
6
  const graph = await idealBuild({
8
7
  ...options,
9
- packageInfo: new PackageInfoClient(options),
10
8
  remove,
11
9
  mainManifest,
12
10
  loadManifests: true,
@@ -18,7 +16,6 @@ export const uninstall = async (options, remove) => {
18
16
  });
19
17
  const diff = await reify({
20
18
  ...options,
21
- packageInfo: new PackageInfoClient(options),
22
19
  remove,
23
20
  actual: act,
24
21
  graph,
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAGxD,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAQxC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,OAAyB,EACzB,MAAuC,EACvC,EAAE;IACF,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAElE,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC;QAC7B,GAAG,OAAO;QACV,WAAW,EAAE,IAAI,iBAAiB,CAAC,OAAO,CAAC;QAC3C,MAAM;QACN,YAAY;QACZ,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,UAAU,CAAC;QACrB,GAAG,OAAO;QACV,YAAY;QACZ,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;QACvB,GAAG,OAAO;QACV,WAAW,EAAE,IAAI,iBAAiB,CAAC,OAAO,CAAC;QAC3C,MAAM;QACN,MAAM,EAAE,GAAG;QACX,KAAK;QACL,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IAEF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC,CAAA","sourcesContent":["import type { PackageInfoClientOptions } from '@vltpkg/package-info'\nimport { PackageInfoClient } from '@vltpkg/package-info'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport type { LoadOptions } from './actual/load.ts'\nimport { load as actualLoad } from './actual/load.ts'\nimport type { RemoveImportersDependenciesMap } from './dependencies.ts'\nimport { build as idealBuild } from './ideal/build.ts'\nimport { reify } from './reify/index.ts'\n\nexport type UninstallOptions = PackageInfoClientOptions &\n LoadOptions & {\n projectRoot: string\n packageJson: PackageJson\n }\n\nexport const uninstall = async (\n options: UninstallOptions,\n remove?: RemoveImportersDependenciesMap,\n) => {\n const mainManifest = options.packageJson.read(options.projectRoot)\n\n const graph = await idealBuild({\n ...options,\n packageInfo: new PackageInfoClient(options),\n remove,\n mainManifest,\n loadManifests: true,\n })\n const act = actualLoad({\n ...options,\n mainManifest,\n loadManifests: true,\n })\n const diff = await reify({\n ...options,\n packageInfo: new PackageInfoClient(options),\n remove,\n actual: act,\n graph,\n loadManifests: true,\n })\n\n return { graph, diff }\n}\n"]}
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/uninstall.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAMxC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,OAAyB,EACzB,MAAuC,EACvC,EAAE;IACF,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAElE,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC;QAC7B,GAAG,OAAO;QACV,MAAM;QACN,YAAY;QACZ,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,UAAU,CAAC;QACrB,GAAG,OAAO;QACV,YAAY;QACZ,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;QACvB,GAAG,OAAO;QACV,MAAM;QACN,MAAM,EAAE,GAAG;QACX,KAAK;QACL,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IAEF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC,CAAA","sourcesContent":["import type { PackageInfoClient } from '@vltpkg/package-info'\nimport type { LoadOptions } from './actual/load.ts'\nimport { load as actualLoad } from './actual/load.ts'\nimport type { RemoveImportersDependenciesMap } from './dependencies.ts'\nimport { build as idealBuild } from './ideal/build.ts'\nimport { reify } from './reify/index.ts'\n\nexport type UninstallOptions = LoadOptions & {\n packageInfo: PackageInfoClient\n}\n\nexport const uninstall = async (\n options: UninstallOptions,\n remove?: RemoveImportersDependenciesMap,\n) => {\n const mainManifest = options.packageJson.read(options.projectRoot)\n\n const graph = await idealBuild({\n ...options,\n remove,\n mainManifest,\n loadManifests: true,\n })\n const act = actualLoad({\n ...options,\n mainManifest,\n loadManifests: true,\n })\n const diff = await reify({\n ...options,\n remove,\n actual: act,\n graph,\n loadManifests: true,\n })\n\n return { graph, diff }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { PackageInfoClient } from '@vltpkg/package-info';
2
+ import type { LoadOptions } from './actual/load.ts';
3
+ import { Graph } from './graph.ts';
4
+ export type UpdateOptions = LoadOptions & {
5
+ packageInfo: PackageInfoClient;
6
+ };
7
+ export declare const update: (options: UpdateOptions) => Promise<{
8
+ graph: Graph;
9
+ diff: import("./diff.ts").Diff;
10
+ }>;
11
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/update.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGlC,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG;IACxC,WAAW,EAAE,iBAAiB,CAAA;CAC/B,CAAA;AAED,eAAO,MAAM,MAAM,YAAmB,aAAa;;;EA0ClD,CAAA"}
@@ -0,0 +1,49 @@
1
+ import { load as actualLoad } from "./actual/load.js";
2
+ import { buildIdealFromStartingGraph } from "./ideal/build-ideal-from-starting-graph.js";
3
+ import { reify } from "./reify/index.js";
4
+ import { GraphModifier } from "./modifiers.js";
5
+ import { init } from '@vltpkg/init';
6
+ import { asError } from '@vltpkg/types';
7
+ import { Graph } from "./graph.js";
8
+ import { graphStep } from '@vltpkg/output';
9
+ export const update = async (options) => {
10
+ let mainManifest = undefined;
11
+ try {
12
+ mainManifest = options.packageJson.read(options.projectRoot);
13
+ }
14
+ catch (err) {
15
+ if (asError(err).message === 'Could not read package.json file') {
16
+ await init({ cwd: options.projectRoot });
17
+ mainManifest = options.packageJson.read(options.projectRoot, {
18
+ reload: true,
19
+ });
20
+ }
21
+ else {
22
+ throw err;
23
+ }
24
+ }
25
+ const modifiers = GraphModifier.maybeLoad(options);
26
+ const done = graphStep('build');
27
+ const graph = await buildIdealFromStartingGraph({
28
+ ...options,
29
+ add: Object.assign(new Map(), { modifiedDependencies: false }),
30
+ remove: Object.assign(new Map(), { modifiedDependencies: false }),
31
+ graph: new Graph({ ...options, mainManifest }),
32
+ modifiers,
33
+ });
34
+ done();
35
+ const act = actualLoad({
36
+ ...options,
37
+ mainManifest,
38
+ loadManifests: true,
39
+ });
40
+ const diff = await reify({
41
+ ...options,
42
+ actual: act,
43
+ graph,
44
+ loadManifests: true,
45
+ modifiers,
46
+ });
47
+ return { graph, diff };
48
+ };
49
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAA;AACxF,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAIvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAM1C,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,OAAsB,EAAE,EAAE;IACrD,IAAI,YAAY,GAAmC,SAAS,CAAA;IAC5D,IAAI,CAAC;QACH,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,kCAAkC,EAAE,CAAC;YAChE,MAAM,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;YACxC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;gBAC3D,MAAM,EAAE,IAAI;aACb,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAElD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAC/B,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC;QAC9C,GAAG,OAAO;QACV,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;QAC9D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;QACjE,KAAK,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,CAAC;QAC9C,SAAS;KACV,CAAC,CAAA;IACF,IAAI,EAAE,CAAA;IAEN,MAAM,GAAG,GAAG,UAAU,CAAC;QACrB,GAAG,OAAO;QACV,YAAY;QACZ,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;QACvB,GAAG,OAAO;QACV,MAAM,EAAE,GAAG;QACX,KAAK;QACL,aAAa,EAAE,IAAI;QACnB,SAAS;KACV,CAAC,CAAA;IAEF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC,CAAA","sourcesContent":["import { load as actualLoad } from './actual/load.ts'\nimport { buildIdealFromStartingGraph } from './ideal/build-ideal-from-starting-graph.ts'\nimport { reify } from './reify/index.ts'\nimport { GraphModifier } from './modifiers.ts'\nimport { init } from '@vltpkg/init'\nimport { asError } from '@vltpkg/types'\nimport type { NormalizedManifest } from '@vltpkg/types'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\nimport type { LoadOptions } from './actual/load.ts'\nimport { Graph } from './graph.ts'\nimport { graphStep } from '@vltpkg/output'\n\nexport type UpdateOptions = LoadOptions & {\n packageInfo: PackageInfoClient\n}\n\nexport const update = async (options: UpdateOptions) => {\n let mainManifest: NormalizedManifest | undefined = undefined\n try {\n mainManifest = options.packageJson.read(options.projectRoot)\n } catch (err) {\n if (asError(err).message === 'Could not read package.json file') {\n await init({ cwd: options.projectRoot })\n mainManifest = options.packageJson.read(options.projectRoot, {\n reload: true,\n })\n } else {\n throw err\n }\n }\n\n const modifiers = GraphModifier.maybeLoad(options)\n\n const done = graphStep('build')\n const graph = await buildIdealFromStartingGraph({\n ...options,\n add: Object.assign(new Map(), { modifiedDependencies: false }),\n remove: Object.assign(new Map(), { modifiedDependencies: false }),\n graph: new Graph({ ...options, mainManifest }),\n modifiers,\n })\n done()\n\n const act = actualLoad({\n ...options,\n mainManifest,\n loadManifests: true,\n })\n\n const diff = await reify({\n ...options,\n actual: act,\n graph,\n loadManifests: true,\n modifiers,\n })\n\n return { graph, diff }\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { SpecOptions } from '@vltpkg/spec/browser';
2
+ import type { NodeLike } from '@vltpkg/types';
3
+ /**
4
+ * An unique DepID to identify the virtual root node.
5
+ */
6
+ export declare const VIRTUAL_ROOT_ID: import("@vltpkg/dep-id/browser").DepID;
7
+ /**
8
+ * A virtual root used to aggregate multiple importers into a single graph.
9
+ *
10
+ * This is meant to be used with visual tools that want a single root node
11
+ * starting point to represent the graph.
12
+ *
13
+ * Returns undefined if a virtual root is not needed.
14
+ */
15
+ export declare const createVirtualRoot: (name: string | undefined, options: SpecOptions, mainImporters: NodeLike[]) => NodeLike | undefined;
16
+ //# sourceMappingURL=virtual-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-root.d.ts","sourceRoot":"","sources":["../../src/virtual-root.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAY,QAAQ,EAAa,MAAM,eAAe,CAAA;AAElE;;GAEG;AACH,eAAO,MAAM,eAAe,wCAG1B,CAAA;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,sCAEnB,WAAW,iBACL,QAAQ,EAAE,KACxB,QAAQ,GAAG,SA6Db,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { Spec } from '@vltpkg/spec/browser';
2
+ import { joinDepIDTuple } from '@vltpkg/dep-id/browser';
3
+ /**
4
+ * An unique DepID to identify the virtual root node.
5
+ */
6
+ export const VIRTUAL_ROOT_ID = joinDepIDTuple([
7
+ 'file',
8
+ '__virtual%root__',
9
+ ]);
10
+ /**
11
+ * A virtual root used to aggregate multiple importers into a single graph.
12
+ *
13
+ * This is meant to be used with visual tools that want a single root node
14
+ * starting point to represent the graph.
15
+ *
16
+ * Returns undefined if a virtual root is not needed.
17
+ */
18
+ export const createVirtualRoot = (name = 'virtual-root', options, mainImporters) => {
19
+ const res = {
20
+ id: VIRTUAL_ROOT_ID,
21
+ name,
22
+ version: '1.0.0',
23
+ manifest: {
24
+ name,
25
+ version: '1.0.0',
26
+ },
27
+ edgesIn: new Set(),
28
+ edgesOut: new Map([]),
29
+ confused: false,
30
+ importer: true,
31
+ mainImporter: true,
32
+ location: '.',
33
+ graph: { importers: new Set() },
34
+ projectRoot: '',
35
+ dev: false,
36
+ optional: false,
37
+ options,
38
+ setConfusedManifest() { },
39
+ setResolved() { },
40
+ maybeSetConfusedManifest() { },
41
+ workspaces: undefined,
42
+ toJSON() {
43
+ return {
44
+ id: this.id,
45
+ name: this.name,
46
+ version: this.version,
47
+ location: this.location,
48
+ importer: this.importer,
49
+ manifest: this.manifest,
50
+ projectRoot: this.projectRoot,
51
+ integrity: this.integrity,
52
+ resolved: this.resolved,
53
+ dev: this.dev,
54
+ optional: this.optional,
55
+ confused: false,
56
+ };
57
+ },
58
+ };
59
+ // @ts-expect-error
60
+ res[Symbol.toStringTag] = '@vltpkg/graph.Node';
61
+ // link all mainImporters to the virtual root
62
+ for (const importer of mainImporters) {
63
+ const name = importer.name || '(unknown)';
64
+ if (importer.mainImporter) {
65
+ const spec = Spec.parse(name, 'file:.', options);
66
+ const edge = {
67
+ name: spec.name,
68
+ from: res,
69
+ to: importer,
70
+ spec,
71
+ type: 'prod',
72
+ };
73
+ res.edgesOut.set(name, edge);
74
+ }
75
+ }
76
+ return res;
77
+ };
78
+ //# sourceMappingURL=virtual-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-root.js","sourceRoot":"","sources":["../../src/virtual-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAIvD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC;IAC5C,MAAM;IACN,kBAAkB;CACnB,CAAC,CAAA;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAI,GAAG,cAAc,EACrB,OAAoB,EACpB,aAAyB,EACH,EAAE;IACxB,MAAM,GAAG,GAAG;QACV,EAAE,EAAE,eAAe;QACnB,IAAI;QACJ,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE;YACR,IAAI;YACJ,OAAO,EAAE,OAAO;SACjB;QACD,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,QAAQ,EAAE,IAAI,GAAG,CAAmB,EAAE,CAAC;QACvC,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,GAAG;QACb,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAe;QAC5C,WAAW,EAAE,EAAE;QACf,GAAG,EAAE,KAAK;QACV,QAAQ,EAAE,KAAK;QACf,OAAO;QACP,mBAAmB,KAAI,CAAC;QACxB,WAAW,KAAI,CAAC;QAChB,wBAAwB,KAAI,CAAC;QAC7B,UAAU,EAAE,SAAS;QACrB,MAAM;YACJ,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,KAAK;aAChB,CAAA;QACH,CAAC;KACiB,CAAA;IAEpB,mBAAmB;IACnB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,oBAAoB,CAAA;IAE9C,6CAA6C;IAC7C,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAA;QACzC,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;YAChD,MAAM,IAAI,GAAG;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,GAAG;gBACT,EAAE,EAAE,QAAQ;gBACZ,IAAI;gBACJ,IAAI,EAAE,MAAM;aACM,CAAA;YACpB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA","sourcesContent":["import { Spec } from '@vltpkg/spec/browser'\nimport { joinDepIDTuple } from '@vltpkg/dep-id/browser'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport type { EdgeLike, NodeLike, GraphLike } from '@vltpkg/types'\n\n/**\n * An unique DepID to identify the virtual root node.\n */\nexport const VIRTUAL_ROOT_ID = joinDepIDTuple([\n 'file',\n '__virtual%root__',\n])\n\n/**\n * A virtual root used to aggregate multiple importers into a single graph.\n *\n * This is meant to be used with visual tools that want a single root node\n * starting point to represent the graph.\n *\n * Returns undefined if a virtual root is not needed.\n */\nexport const createVirtualRoot = (\n name = 'virtual-root',\n options: SpecOptions,\n mainImporters: NodeLike[],\n): NodeLike | undefined => {\n const res = {\n id: VIRTUAL_ROOT_ID,\n name,\n version: '1.0.0',\n manifest: {\n name,\n version: '1.0.0',\n },\n edgesIn: new Set(),\n edgesOut: new Map<string, EdgeLike>([]),\n confused: false,\n importer: true,\n mainImporter: true,\n location: '.',\n graph: { importers: new Set() } as GraphLike,\n projectRoot: '',\n dev: false,\n optional: false,\n options,\n setConfusedManifest() {},\n setResolved() {},\n maybeSetConfusedManifest() {},\n workspaces: undefined,\n toJSON() {\n return {\n id: this.id,\n name: this.name,\n version: this.version,\n location: this.location,\n importer: this.importer,\n manifest: this.manifest,\n projectRoot: this.projectRoot,\n integrity: this.integrity,\n resolved: this.resolved,\n dev: this.dev,\n optional: this.optional,\n confused: false,\n }\n },\n } satisfies NodeLike\n\n // @ts-expect-error\n res[Symbol.toStringTag] = '@vltpkg/graph.Node'\n\n // link all mainImporters to the virtual root\n for (const importer of mainImporters) {\n const name = importer.name || '(unknown)'\n if (importer.mainImporter) {\n const spec = Spec.parse(name, 'file:.', options)\n const edge = {\n name: spec.name,\n from: res,\n to: importer,\n spec,\n type: 'prod',\n } satisfies EdgeLike\n res.edgesOut.set(name, edge)\n }\n }\n return res\n}\n"]}
@@ -1,5 +1,4 @@
1
- import type { EdgeLike, NodeLike } from '../types.ts';
2
- import type { ChalkInstance } from 'chalk';
1
+ import type { EdgeLike, NodeLike } from '@vltpkg/types';
3
2
  export type TreeItem = {
4
3
  name?: string | null;
5
4
  edge: EdgeLike | undefined;
@@ -7,7 +6,7 @@ export type TreeItem = {
7
6
  prefix: string;
8
7
  padding: string;
9
8
  hasSibling: boolean;
10
- deduped: boolean;
9
+ seen: boolean;
11
10
  include: boolean;
12
11
  parent: TreeItem | undefined;
13
12
  };
@@ -23,6 +22,6 @@ export type TreeMap = Map<EdgeLike | undefined, EdgeMap>;
23
22
  * Returns a human-readable output of the graph.
24
23
  */
25
24
  export declare function humanReadableOutput(options: HumanReadableOutputGraph, { colors }: {
26
- colors?: ChalkInstance;
27
- }): string | null | undefined;
25
+ colors?: boolean;
26
+ }): string;
28
27
  //# sourceMappingURL=human-readable-output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"human-readable-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/human-readable-output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACrD,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,wBAAwB,GAAG;IACrC,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAA;AAEzD,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,OAAO,CAAC,CAAA;AA2DxD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,wBAAwB,EACjC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,6BAsGvC"}
1
+ {"version":3,"file":"human-readable-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/human-readable-output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAkBvD,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,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAA;AAEzD,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,OAAO,CAAC,CAAA;AAoExD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,wBAAwB,EACjC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,UAwHjC"}
@@ -1,4 +1,6 @@
1
1
  import { splitDepID } from '@vltpkg/dep-id';
2
+ import { styleText as utilStyleText } from 'node:util';
3
+ const styleText = (format, s) => utilStyleText(format, s, { validateStream: false });
2
4
  const chars = new Map(Object.entries({
3
5
  connection: '─',
4
6
  down: '│',
@@ -6,8 +8,8 @@ const chars = new Map(Object.entries({
6
8
  'middle-child': '├',
7
9
  t: '┬',
8
10
  }));
9
- const isSelected = (options, edge, node) => !!((!node || options.nodes.includes(node)) &&
10
- (!edge || options.edges.includes(edge)));
11
+ const isSelected = (options, edge, node) => (!node || options.nodes.includes(node)) &&
12
+ (!edge || options.edges.includes(edge));
11
13
  /**
12
14
  * Returns a map of tree items to be printed.
13
15
  */
@@ -18,12 +20,21 @@ const getTreeItems = (initialItems, options) => {
18
20
  for (const item of traverse) {
19
21
  if (item.node) {
20
22
  if (seenNodes.has(item.node)) {
21
- item.deduped = true;
23
+ item.seen = true;
22
24
  continue;
23
25
  }
24
26
  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 edges = [...item.node.edgesOut.values()];
28
+ const workspaces = item.node.workspaces ? [...item.node.workspaces.values()] : [];
29
+ const allEdges = [...edges, ...workspaces].sort((a, b) => a.name.localeCompare(b.name, 'en'));
30
+ // keeps track of seen edge names to avoid duplicating printed
31
+ // items when a workspace is also a regular dependency of the root
32
+ const seenEdgeName = new Set();
33
+ for (const edge of allEdges) {
34
+ if (seenEdgeName.has(edge.name)) {
35
+ continue;
36
+ }
37
+ seenEdgeName.add(edge.name);
27
38
  const toItems = treeItems.get(edge) ?? new Map();
28
39
  const nextItem = {
29
40
  edge,
@@ -31,7 +42,7 @@ const getTreeItems = (initialItems, options) => {
31
42
  hasSibling: false,
32
43
  padding: '',
33
44
  prefix: '',
34
- deduped: false,
45
+ seen: false,
35
46
  include: isSelected(options, edge, edge.to),
36
47
  parent: item,
37
48
  };
@@ -53,8 +64,11 @@ const getTreeItems = (initialItems, options) => {
53
64
  */
54
65
  export function humanReadableOutput(options, { colors }) {
55
66
  const { importers } = options;
56
- const noop = (s) => s;
57
- const { dim = noop, red = noop, reset = noop, yellow = noop, } = colors ?? {};
67
+ const createStyleText = (style) => (s) => colors ? styleText(style, s) : s;
68
+ const dim = createStyleText('dim');
69
+ const red = createStyleText('red');
70
+ const reset = createStyleText('reset');
71
+ const yellow = createStyleText('yellow');
58
72
  const initialItems = new Set();
59
73
  for (const importer of importers) {
60
74
  initialItems.add({
@@ -64,7 +78,7 @@ export function humanReadableOutput(options, { colors }) {
64
78
  prefix: '',
65
79
  padding: '',
66
80
  hasSibling: false,
67
- deduped: false,
81
+ seen: false,
68
82
  include: isSelected(options, undefined, importer),
69
83
  parent: undefined,
70
84
  });
@@ -74,11 +88,10 @@ export function humanReadableOutput(options, { colors }) {
74
88
  const traverse = (item) => {
75
89
  let header = '';
76
90
  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;
91
+ const name = item.name;
80
92
  const decoratedName = (options.highlightSelection &&
81
- isSelected(options, item.edge, item.node)) ?
93
+ isSelected(options, item.edge, item.node) &&
94
+ name) ?
82
95
  yellow(name)
83
96
  : name;
84
97
  if (!item.node && item.include) {
@@ -87,12 +100,15 @@ export function humanReadableOutput(options, { colors }) {
87
100
  : red('(missing)');
88
101
  return `${item.padding}${item.prefix}${decoratedName} ${missing}\n`;
89
102
  }
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) {
103
+ header += `${item.padding}${item.prefix}${decoratedName}\n`;
104
+ // seen items need not to be printed or traversed
105
+ if (!item.seen) {
94
106
  const edges = item.node ? [...item.node.edgesOut.values()] : [];
95
- const nextItems = edges.map(i => treeItems.get(i)?.get(i.to));
107
+ const workspaces = item.node?.workspaces ?
108
+ [...item.node.workspaces.values()]
109
+ : [];
110
+ const allEdges = [...edges, ...workspaces].sort((a, b) => a.name.localeCompare(b.name, 'en'));
111
+ const nextItems = allEdges.map(i => treeItems.get(i)?.get(i.to));
96
112
  const includedItems = nextItems.filter(i => i?.include);
97
113
  for (const nextItem of nextItems) {
98
114
  /* c8 ignore next -- impossible but TS doesn't know that */
@@ -100,15 +116,26 @@ export function humanReadableOutput(options, { colors }) {
100
116
  continue;
101
117
  const parent = item;
102
118
  const isLast = includedItems.indexOf(nextItem) === includedItems.length - 1;
103
- const toName = nextItem.node?.version ?
104
- `${nextItem.node.name}@${nextItem.node.version}`
119
+ // prefixes the node name with the registry name
120
+ // if a custom registry name is found
121
+ const depIdTuple = nextItem.node?.id && splitDepID(nextItem.node.id);
122
+ const hasCustomReg = depIdTuple?.[0] === 'registry' && depIdTuple[1];
123
+ const nodeName = hasCustomReg ?
124
+ `${depIdTuple[1]}:${nextItem.node?.name}`
105
125
  : nextItem.node?.name;
126
+ const toName = nextItem.node?.version ?
127
+ `${nodeName}@${nextItem.node.version}`
128
+ : nodeName;
106
129
  const nextChar = isLast ? 'last-child' : 'middle-child';
130
+ const aliasedPackage = nextItem.node?.name && nextItem.edge?.name !== nodeName;
107
131
  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}`;
132
+ nextItem.node?.confused ?
133
+ `${nextItem.edge?.name} ${red('(confused)')}`
134
+ : nextItem.edge?.spec.overridden ?
135
+ /* c8 ignore next */
136
+ `${nextItem.edge.name}@${nextItem.node?.version || nextItem.edge.spec.bareSpec}${aliasedPackage ? ` (${toName})` : ''} ${yellow('(overridden)')}`
137
+ : aliasedPackage ? `${nextItem.edge?.name} (${toName})`
138
+ : `${nextItem.edge?.name}@${nextItem.node?.version || nextItem.edge?.spec.bareSpec}`;
112
139
  nextItem.padding =
113
140
  parent.prefix.length ?
114
141
  `${parent.padding}${parent.hasSibling ? chars.get('down') : ' '} `
@@ -1 +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 type { EdgeLike, NodeLike } from '../types.ts'\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 HumanReadableOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n highlightSelection?: boolean\n}\n\nexport type EdgeMap = Map<NodeLike | undefined, TreeItem>\n\nexport type TreeMap = Map<EdgeLike | undefined, EdgeMap>\n\nconst isSelected = (\n options: HumanReadableOutputGraph,\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: HumanReadableOutputGraph,\n) => {\n const seenNodes = new Set<NodeLike>()\n const treeItems: TreeMap = new Map()\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: EdgeMap =\n treeItems.get(edge) ?? (new Map() as EdgeMap)\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: HumanReadableOutputGraph,\n { colors }: { colors?: ChalkInstance },\n) {\n const { 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"]}
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 type { EdgeLike, NodeLike } from '@vltpkg/types'\nimport { styleText as utilStyleText } from 'node:util'\n\nconst styleText = (\n format: Parameters<typeof utilStyleText>[0],\n s: string,\n) => utilStyleText(format, s, { validateStream: false })\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 seen: boolean\n include: boolean\n parent: TreeItem | undefined\n}\n\nexport type HumanReadableOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n highlightSelection?: boolean\n}\n\nexport type EdgeMap = Map<NodeLike | undefined, TreeItem>\n\nexport type TreeMap = Map<EdgeLike | undefined, EdgeMap>\n\nconst isSelected = (\n options: HumanReadableOutputGraph,\n edge?: EdgeLike,\n node?: NodeLike,\n) =>\n (!node || options.nodes.includes(node)) &&\n (!edge || options.edges.includes(edge))\n\n/**\n * Returns a map of tree items to be printed.\n */\nconst getTreeItems = (\n initialItems: Set<TreeItem>,\n options: HumanReadableOutputGraph,\n) => {\n const seenNodes = new Set<NodeLike>()\n const treeItems: TreeMap = new Map()\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.seen = true\n continue\n }\n seenNodes.add(item.node)\n const edges = [...item.node.edgesOut.values()]\n const workspaces =\n item.node.workspaces ? [...item.node.workspaces.values()] : []\n const allEdges = [...edges, ...workspaces].sort((a, b) =>\n a.name.localeCompare(b.name, 'en'),\n )\n\n // keeps track of seen edge names to avoid duplicating printed\n // items when a workspace is also a regular dependency of the root\n const seenEdgeName = new Set<string>()\n for (const edge of allEdges) {\n if (seenEdgeName.has(edge.name)) {\n continue\n }\n seenEdgeName.add(edge.name)\n const toItems: EdgeMap =\n treeItems.get(edge) ?? (new Map() as EdgeMap)\n const nextItem: TreeItem = {\n edge,\n node: edge.to,\n hasSibling: false,\n padding: '',\n prefix: '',\n seen: 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: HumanReadableOutputGraph,\n { colors }: { colors?: boolean },\n) {\n const { importers } = options\n const createStyleText =\n (style: Parameters<typeof styleText>[0]) => (s: string) =>\n colors ? styleText(style, s) : s\n const dim = createStyleText('dim')\n const red = createStyleText('red')\n const reset = createStyleText('reset')\n const yellow = createStyleText('yellow')\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 seen: 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 name = item.name\n const decoratedName =\n (\n options.highlightSelection &&\n isSelected(options, item.edge, item.node) &&\n name\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 header += `${item.padding}${item.prefix}${decoratedName}\\n`\n\n // seen items need not to be printed or traversed\n if (!item.seen) {\n const edges = item.node ? [...item.node.edgesOut.values()] : []\n const workspaces =\n item.node?.workspaces ?\n [...item.node.workspaces.values()]\n : []\n const allEdges = [...edges, ...workspaces].sort((a, b) =>\n a.name.localeCompare(b.name, 'en'),\n )\n const nextItems = allEdges.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\n // prefixes the node name with the registry name\n // if a custom registry name is found\n const depIdTuple =\n nextItem.node?.id && splitDepID(nextItem.node.id)\n const hasCustomReg =\n depIdTuple?.[0] === 'registry' && depIdTuple[1]\n const nodeName =\n hasCustomReg ?\n `${depIdTuple[1]}:${nextItem.node?.name}`\n : nextItem.node?.name\n\n const toName =\n nextItem.node?.version ?\n `${nodeName}@${nextItem.node.version}`\n : nodeName\n const nextChar = isLast ? 'last-child' : 'middle-child'\n\n const aliasedPackage =\n nextItem.node?.name && nextItem.edge?.name !== nodeName\n nextItem.name =\n nextItem.node?.confused ?\n `${nextItem.edge?.name} ${red('(confused)')}`\n : nextItem.edge?.spec.overridden ?\n /* c8 ignore next */\n `${nextItem.edge.name}@${nextItem.node?.version || nextItem.edge.spec.bareSpec}${aliasedPackage ? ` (${toName})` : ''} ${yellow('(overridden)')}`\n : aliasedPackage ? `${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"]}
@@ -1,5 +1,5 @@
1
1
  import type { DepID } from '@vltpkg/dep-id';
2
- import type { EdgeLike, NodeLike } from '../types.ts';
2
+ import type { EdgeLike, NodeLike } from '@vltpkg/types';
3
3
  /**
4
4
  * A JSON output item describes a package that is present in the install
5
5
  * graph. It represents an edge plus it's linking Node.
@@ -25,13 +25,17 @@ export type JSONOutputItem = {
25
25
  * A representation of the package object that fulfills this dependency.
26
26
  */
27
27
  to?: NodeLike;
28
+ /**
29
+ * Whether this edge was overridden by a graph modifier.
30
+ */
31
+ overridden: boolean;
28
32
  };
29
33
  export type JSONOutputGraph = {
30
34
  edges: EdgeLike[];
31
- nodes: NodeLike[];
35
+ importers: Set<NodeLike>;
32
36
  };
33
37
  /**
34
38
  * Returns a JSON string representation of the graph.
35
39
  */
36
- export declare function jsonOutput({ edges, nodes }: JSONOutputGraph): JSONOutputItem[];
40
+ export declare function jsonOutput({ edges, importers }: JSONOutputGraph): JSONOutputItem[];
37
41
  //# sourceMappingURL=json-output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/json-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAErD;;;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,eAAe,GAAG;IAC5B,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,eAAe,oBA0B3D"}
1
+ {"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/json-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEvD;;;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;IACb;;OAEG;IACH,UAAU,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;CACzB,CAAA;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,oBA2C/D"}
@@ -1,26 +1,49 @@
1
1
  /**
2
2
  * Returns a JSON string representation of the graph.
3
3
  */
4
- export function jsonOutput({ edges, nodes }) {
4
+ export function jsonOutput({ edges, importers }) {
5
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
- }
6
+ const seenIds = new Set();
16
7
  // Collects edge & it's linked nodes as json output items
17
- for (const edge of edges) {
8
+ const orderedEdges = [...edges].sort((a, b) => {
9
+ const aIsWorkspace = a.spec.type === 'workspace';
10
+ const bIsWorkspace = b.spec.type === 'workspace';
11
+ if (aIsWorkspace && !bIsWorkspace)
12
+ return -1;
13
+ /* c8 ignore next */
14
+ if (!aIsWorkspace && bIsWorkspace)
15
+ return 1;
16
+ return 0; // preserve original order otherwise
17
+ });
18
+ for (const edge of orderedEdges) {
19
+ if (edge.to)
20
+ seenIds.add(edge.to.id);
18
21
  res.push({
19
22
  name: edge.name,
20
23
  fromID: edge.from.id,
21
24
  spec: String(edge.spec),
22
25
  type: edge.type,
23
26
  to: edge.to,
27
+ overridden: edge.spec.overridden,
28
+ });
29
+ }
30
+ // Collects included importer nodes json output items
31
+ /* c8 ignore next 3 */
32
+ const orderedImporters = [...importers].sort((a, b) => {
33
+ if (!a.name)
34
+ return 1;
35
+ if (!b.name)
36
+ return -1;
37
+ return a.name.localeCompare(b.name);
38
+ });
39
+ for (const node of orderedImporters) {
40
+ if (seenIds.has(node.id))
41
+ continue;
42
+ res.unshift({
43
+ /* c8 ignore next - name can't be missing but ts won't know */
44
+ name: node.name || node.id,
45
+ to: node,
46
+ overridden: false,
24
47
  });
25
48
  }
26
49
  return res;
@@ -1 +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,EAAmB;IAC1D,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,GAAG,CAAA;AACZ,CAAC","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { EdgeLike, NodeLike } from '../types.ts'\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 JSONOutputGraph = {\n edges: EdgeLike[]\n nodes: NodeLike[]\n}\n\n/**\n * Returns a JSON string representation of the graph.\n */\nexport function jsonOutput({ edges, nodes }: JSONOutputGraph) {\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 res\n}\n"]}
1
+ {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../../src/visualization/json-output.ts"],"names":[],"mappings":"AAuCA;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAmB;IAC9D,MAAM,GAAG,GAAqB,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAS,CAAA;IAEhC,yDAAyD;IACzD,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC5C,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAA;QAChD,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAA;QAChD,IAAI,YAAY,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,CAAC,CAAA;QAC5C,oBAAoB;QACpB,IAAI,CAAC,YAAY,IAAI,YAAY;YAAE,OAAO,CAAC,CAAA;QAC3C,OAAO,CAAC,CAAA,CAAC,oCAAoC;IAC/C,CAAC,CAAC,CAAA;IACF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACpC,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;YACX,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;SACjC,CAAC,CAAA;IACJ,CAAC;IAED,qDAAqD;IACrD,sBAAsB;IACtB,MAAM,gBAAgB,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpD,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAA;QACrB,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,CAAA;QACtB,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IACF,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,SAAQ;QAClC,GAAG,CAAC,OAAO,CAAC;YACV,8DAA8D;YAC9D,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;YAC1B,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,KAAK;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { EdgeLike, NodeLike } from '@vltpkg/types'\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 * Whether this edge was overridden by a graph modifier.\n */\n overridden: boolean\n}\n\nexport type JSONOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n}\n\n/**\n * Returns a JSON string representation of the graph.\n */\nexport function jsonOutput({ edges, importers }: JSONOutputGraph) {\n const res: JSONOutputItem[] = []\n const seenIds = new Set<DepID>()\n\n // Collects edge & it's linked nodes as json output items\n const orderedEdges = [...edges].sort((a, b) => {\n const aIsWorkspace = a.spec.type === 'workspace'\n const bIsWorkspace = b.spec.type === 'workspace'\n if (aIsWorkspace && !bIsWorkspace) return -1\n /* c8 ignore next */\n if (!aIsWorkspace && bIsWorkspace) return 1\n return 0 // preserve original order otherwise\n })\n for (const edge of orderedEdges) {\n if (edge.to) seenIds.add(edge.to.id)\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 overridden: edge.spec.overridden,\n })\n }\n\n // Collects included importer nodes json output items\n /* c8 ignore next 3 */\n const orderedImporters = [...importers].sort((a, b) => {\n if (!a.name) return 1\n if (!b.name) return -1\n return a.name.localeCompare(b.name)\n })\n for (const node of orderedImporters) {\n if (seenIds.has(node.id)) continue\n res.unshift({\n /* c8 ignore next - name can't be missing but ts won't know */\n name: node.name || node.id,\n to: node,\n overridden: false,\n })\n }\n\n return res\n}\n"]}
@@ -1,9 +1,15 @@
1
- import type { EdgeLike, NodeLike } from '../types.ts';
1
+ import type { EdgeLike, NodeLike } from '@vltpkg/types';
2
2
  export type MermaidOutputGraph = {
3
3
  edges: EdgeLike[];
4
4
  importers: Set<NodeLike>;
5
5
  nodes: NodeLike[];
6
6
  };
7
+ /**
8
+ * Generates a short identifier for a given index following the pattern:
9
+ * 0 -> a, 1 -> b, ..., 25 -> z, 26 -> A, ..., 51 -> Z, 52 -> aa, 53 -> ab, etc.
10
+ * This implements a bijective base-52 numbering system where a-z = 0-25, A-Z = 26-51
11
+ */
12
+ export declare function generateShortId(index: number): string;
7
13
  /**
8
14
  * Returns a mermaid string representation of the graph.
9
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,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,kBAAkB,UA0CpB"}
1
+ {"version":3,"file":"mermaid-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEvD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB,CAAA;AASD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA0BrD;AA+ED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,SAAS,EACT,KAAK,GACN,EAAE,kBAAkB,UA+CpB"}