@vltpkg/graph 0.0.0-0.1730239248325 → 0.0.0-10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -10
- package/dist/esm/actual/load.d.ts +6 -6
- package/dist/esm/actual/load.d.ts.map +1 -1
- package/dist/esm/actual/load.js +8 -4
- package/dist/esm/actual/load.js.map +1 -1
- package/dist/esm/browser.d.ts +8 -6
- package/dist/esm/browser.d.ts.map +1 -1
- package/dist/esm/browser.js +8 -6
- package/dist/esm/browser.js.map +1 -1
- package/dist/esm/dependencies.d.ts +22 -32
- package/dist/esm/dependencies.d.ts.map +1 -1
- package/dist/esm/dependencies.js +10 -32
- package/dist/esm/dependencies.js.map +1 -1
- package/dist/esm/diff.d.ts +4 -4
- package/dist/esm/diff.d.ts.map +1 -1
- package/dist/esm/diff.js.map +1 -1
- package/dist/esm/edge.d.ts +5 -5
- package/dist/esm/edge.d.ts.map +1 -1
- package/dist/esm/edge.js +1 -1
- package/dist/esm/edge.js.map +1 -1
- package/dist/esm/graph.d.ts +12 -12
- package/dist/esm/graph.d.ts.map +1 -1
- package/dist/esm/graph.js +11 -8
- package/dist/esm/graph.js.map +1 -1
- package/dist/esm/ideal/add-nodes.d.ts +4 -4
- package/dist/esm/ideal/add-nodes.d.ts.map +1 -1
- package/dist/esm/ideal/add-nodes.js +8 -4
- package/dist/esm/ideal/add-nodes.js.map +1 -1
- package/dist/esm/ideal/append-nodes.d.ts +8 -8
- package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
- package/dist/esm/ideal/append-nodes.js +37 -15
- package/dist/esm/ideal/append-nodes.js.map +1 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +3 -3
- package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.js +28 -5
- package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
- package/dist/esm/ideal/build.d.ts +4 -4
- package/dist/esm/ideal/build.d.ts.map +1 -1
- package/dist/esm/ideal/build.js +11 -8
- package/dist/esm/ideal/build.js.map +1 -1
- package/dist/esm/ideal/get-importer-specs.d.ts +2 -2
- package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
- package/dist/esm/ideal/get-importer-specs.js +39 -11
- package/dist/esm/ideal/get-importer-specs.js.map +1 -1
- package/dist/esm/ideal/remove-nodes.d.ts +1 -1
- package/dist/esm/ideal/remove-nodes.d.ts.map +1 -1
- package/dist/esm/ideal/remove-nodes.js.map +1 -1
- package/dist/esm/ideal/remove-satisfied-specs.d.ts +1 -1
- package/dist/esm/ideal/remove-satisfied-specs.d.ts.map +1 -1
- package/dist/esm/ideal/remove-satisfied-specs.js.map +1 -1
- package/dist/esm/ideal/types.d.ts +3 -3
- package/dist/esm/ideal/types.d.ts.map +1 -1
- package/dist/esm/ideal/types.js.map +1 -1
- package/dist/esm/index.d.ts +25 -22
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +20 -17
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/install.d.ts +11 -0
- package/dist/esm/install.d.ts.map +1 -0
- package/dist/esm/install.js +26 -0
- package/dist/esm/install.js.map +1 -0
- package/dist/esm/lockfile/load-edges.d.ts +3 -3
- package/dist/esm/lockfile/load-edges.d.ts.map +1 -1
- package/dist/esm/lockfile/load-edges.js +2 -1
- package/dist/esm/lockfile/load-edges.js.map +1 -1
- package/dist/esm/lockfile/load-nodes.d.ts +2 -2
- package/dist/esm/lockfile/load-nodes.d.ts.map +1 -1
- package/dist/esm/lockfile/load-nodes.js +3 -1
- package/dist/esm/lockfile/load-nodes.js.map +1 -1
- package/dist/esm/lockfile/load.d.ts +4 -4
- package/dist/esm/lockfile/load.d.ts.map +1 -1
- package/dist/esm/lockfile/load.js +11 -8
- package/dist/esm/lockfile/load.js.map +1 -1
- package/dist/esm/lockfile/save.d.ts +3 -3
- package/dist/esm/lockfile/save.d.ts.map +1 -1
- package/dist/esm/lockfile/save.js +1 -1
- package/dist/esm/lockfile/save.js.map +1 -1
- package/dist/esm/lockfile/types.d.ts +2 -3
- package/dist/esm/lockfile/types.d.ts.map +1 -1
- package/dist/esm/lockfile/types.js.map +1 -1
- package/dist/esm/node.d.ts +19 -15
- package/dist/esm/node.d.ts.map +1 -1
- package/dist/esm/node.js +26 -17
- package/dist/esm/node.js.map +1 -1
- package/dist/esm/reify/add-edge.d.ts +4 -4
- package/dist/esm/reify/add-edge.d.ts.map +1 -1
- package/dist/esm/reify/add-edge.js +22 -11
- package/dist/esm/reify/add-edge.js.map +1 -1
- package/dist/esm/reify/add-edges.d.ts +2 -2
- package/dist/esm/reify/add-edges.d.ts.map +1 -1
- package/dist/esm/reify/add-edges.js +2 -2
- package/dist/esm/reify/add-edges.js.map +1 -1
- package/dist/esm/reify/add-nodes.d.ts +5 -5
- package/dist/esm/reify/add-nodes.d.ts.map +1 -1
- package/dist/esm/reify/add-nodes.js +10 -7
- package/dist/esm/reify/add-nodes.js.map +1 -1
- package/dist/esm/reify/bin-paths.d.ts +1 -1
- package/dist/esm/reify/bin-paths.d.ts.map +1 -1
- package/dist/esm/reify/bin-paths.js.map +1 -1
- package/dist/esm/reify/build.d.ts +3 -3
- package/dist/esm/reify/build.d.ts.map +1 -1
- package/dist/esm/reify/build.js +9 -9
- package/dist/esm/reify/build.js.map +1 -1
- package/dist/esm/reify/delete-edge.d.ts +3 -3
- package/dist/esm/reify/delete-edge.d.ts.map +1 -1
- package/dist/esm/reify/delete-edge.js +3 -3
- package/dist/esm/reify/delete-edge.js.map +1 -1
- package/dist/esm/reify/delete-edges.d.ts +3 -3
- package/dist/esm/reify/delete-edges.d.ts.map +1 -1
- package/dist/esm/reify/delete-edges.js +1 -1
- package/dist/esm/reify/delete-edges.js.map +1 -1
- package/dist/esm/reify/delete-nodes.d.ts +3 -3
- package/dist/esm/reify/delete-nodes.d.ts.map +1 -1
- package/dist/esm/reify/delete-nodes.js +4 -0
- package/dist/esm/reify/delete-nodes.js.map +1 -1
- package/dist/esm/reify/index.d.ts +6 -5
- package/dist/esm/reify/index.d.ts.map +1 -1
- package/dist/esm/reify/index.js +25 -19
- package/dist/esm/reify/index.js.map +1 -1
- package/dist/esm/reify/optional-fail.d.ts +2 -2
- package/dist/esm/reify/optional-fail.d.ts.map +1 -1
- package/dist/esm/reify/optional-fail.js +1 -1
- package/dist/esm/reify/optional-fail.js.map +1 -1
- package/dist/esm/reify/rollback.d.ts +2 -2
- package/dist/esm/reify/rollback.d.ts.map +1 -1
- package/dist/esm/reify/rollback.js +1 -1
- package/dist/esm/reify/rollback.js.map +1 -1
- package/dist/esm/reify/update-importers-package-json.d.ts +2 -2
- package/dist/esm/reify/update-importers-package-json.d.ts.map +1 -1
- package/dist/esm/reify/update-importers-package-json.js +25 -6
- package/dist/esm/reify/update-importers-package-json.js.map +1 -1
- package/dist/esm/remove-optional-subgraph.d.ts +2 -2
- package/dist/esm/remove-optional-subgraph.d.ts.map +1 -1
- package/dist/esm/remove-optional-subgraph.js.map +1 -1
- package/dist/esm/resolve-save-type.d.ts +7 -0
- package/dist/esm/resolve-save-type.d.ts.map +1 -0
- package/dist/esm/resolve-save-type.js +5 -0
- package/dist/esm/resolve-save-type.js.map +1 -0
- package/dist/esm/stringify-node.d.ts +1 -1
- package/dist/esm/stringify-node.d.ts.map +1 -1
- package/dist/esm/stringify-node.js.map +1 -1
- package/dist/esm/types.d.ts +13 -10
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/uninstall.d.ts +11 -0
- package/dist/esm/uninstall.d.ts.map +1 -0
- package/dist/esm/uninstall.js +26 -0
- package/dist/esm/uninstall.js.map +1 -0
- package/dist/esm/visualization/human-readable-output.d.ts +9 -7
- package/dist/esm/visualization/human-readable-output.d.ts.map +1 -1
- package/dist/esm/visualization/human-readable-output.js +31 -19
- package/dist/esm/visualization/human-readable-output.js.map +1 -1
- package/dist/esm/visualization/json-output.d.ts +4 -4
- package/dist/esm/visualization/json-output.d.ts.map +1 -1
- package/dist/esm/visualization/json-output.js +1 -1
- package/dist/esm/visualization/json-output.js.map +1 -1
- package/dist/esm/visualization/mermaid-output.d.ts +3 -3
- package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
- package/dist/esm/visualization/mermaid-output.js +2 -2
- package/dist/esm/visualization/mermaid-output.js.map +1 -1
- package/dist/esm/visualization/object-like-output.d.ts +1 -1
- package/dist/esm/visualization/object-like-output.d.ts.map +1 -1
- package/dist/esm/visualization/object-like-output.js +5 -6
- package/dist/esm/visualization/object-like-output.js.map +1 -1
- package/package.json +33 -28
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Graph } from './graph.
|
|
2
|
-
import { Node } from './node.
|
|
1
|
+
import type { Graph } from './graph.ts';
|
|
2
|
+
import type { Node } from './node.ts';
|
|
3
3
|
/**
|
|
4
4
|
* Remove the affected optional nodes starting from a given optional node
|
|
5
5
|
* that failed to resolve/install.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-optional-subgraph.d.ts","sourceRoot":"","sources":["../../src/remove-optional-subgraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"remove-optional-subgraph.d.ts","sourceRoot":"","sources":["../../src/remove-optional-subgraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,UAC1B,KAAK,gBACE,IAAI,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,cAQxC,CAAA;AAED;;;;;;;GAOG;AACH,wBAAiB,oBAAoB,CACnC,IAAI,EAAE,IAAI,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,EAC/B,IAAI;cAA8B,IAAI;EAAK,GAC1C,SAAS,CAAC,IAAI,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,EAAE,IAAI,CAAC,CAiB5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-optional-subgraph.js","sourceRoot":"","sources":["../../src/remove-optional-subgraph.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,KAAY,EACZ,YAAuC,EACvC,EAAE;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAA;IAC/B,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,SAAS,CAAC,CAAC,oBAAoB,CACnC,IAA+B,EAC/B,OAAO,IAAI,GAAG,EAA6B;IAE3C,mCAAmC;IACnC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAM;IAE1B,qDAAqD;IACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACd,MAAM,IAAI,CAAA;IAEV,mDAAmD;IACnD,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9C,qEAAqE;QACrE,oEAAoE;QACpE,2CAA2C;QAC3C,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,KAAK,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC;gBAAE,MAAM,GAAG,CAAA;QAC/D,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { Graph } from './graph.
|
|
1
|
+
{"version":3,"file":"remove-optional-subgraph.js","sourceRoot":"","sources":["../../src/remove-optional-subgraph.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,KAAY,EACZ,YAAuC,EACvC,EAAE;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAA;IAC/B,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,SAAS,CAAC,CAAC,oBAAoB,CACnC,IAA+B,EAC/B,OAAO,IAAI,GAAG,EAA6B;IAE3C,mCAAmC;IACnC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAM;IAE1B,qDAAqD;IACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACd,MAAM,IAAI,CAAA;IAEV,mDAAmD;IACnD,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9C,qEAAqE;QACrE,oEAAoE;QACpE,2CAA2C;QAC3C,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,KAAK,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC;gBAAE,MAAM,GAAG,CAAA;QAC/D,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import type { Graph } from './graph.ts'\nimport type { Node } from './node.ts'\n\n/**\n * Remove the affected optional nodes starting from a given optional node\n * that failed to resolve/install.\n *\n * Removing these dependents will frequently leave optional *dependencies*\n * behind that are made unreachable from any project importer. For performance\n * reasons, `graph.gc()` is not called automatically by this method, since\n * multiple optional subgraphs may need to be removed in a single operation,\n * and the mark-and-sweep garbage collection (a) can be excessively expensive,\n * and (b) may need to communicate the set of garbage-collected nodes\n * for cleanup (as in the case of optional node build failures during\n * reification).\n */\nexport const removeOptionalSubgraph = (\n graph: Graph,\n startingNode: Node & { optional: true },\n) => {\n const removed = new Set<Node>()\n for (const node of findOptionalSubgraph(startingNode)) {\n graph.removeNode(node)\n removed.add(node)\n }\n return removed\n}\n\n/**\n * Given a starting node, this generator will walk back from the optional node\n * to all of its optional dependents, emitting each one, and skipping any\n * cycles.\n *\n * Note that when these are removed, it may create unreachable nodes in the\n * graph! Be sure to call `graph.gc()` if these are removed.\n */\nexport function* findOptionalSubgraph(\n node: Node & { optional: true },\n seen = new Set<Node & { optional: true }>(),\n): Generator<Node & { optional: true }, void> {\n // already visited, prevent looping\n if (seen.has(node)) return\n\n // the node itself is part of the subgraph, of course\n seen.add(node)\n yield node\n\n // and any of its dependents that are also optional\n for (const { from, optional } of node.edgesIn) {\n // if it's an optional *edge*, we don't need to remove it, because it\n // doesn't need the node anyway. But if the node is optional and the\n // dep isn't, then we do need to remove it.\n if (from.isOptional() && !optional) {\n for (const dep of findOptionalSubgraph(from, seen)) yield dep\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DependencySaveType, DependencyTypeShort } from '@vltpkg/types';
|
|
2
|
+
import type { NodeLike } from './types.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a {@link DependencySaveType} to a {@link DependencyTypeShort}
|
|
5
|
+
*/
|
|
6
|
+
export declare const resolveSaveType: (node: NodeLike, name: string, saveType: DependencySaveType) => DependencyTypeShort;
|
|
7
|
+
//# sourceMappingURL=resolve-save-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-save-type.d.ts","sourceRoot":"","sources":["../../src/resolve-save-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C;;GAEG;AACH,eAAO,MAAM,eAAe,SACpB,QAAQ,QACR,MAAM,YACF,kBAAkB,KAC3B,mBAGA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-save-type.js","sourceRoot":"","sources":["../../src/resolve-save-type.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,IAAc,EACd,IAAY,EACZ,QAA4B,EACP,EAAE,CACvB,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC,CAC1C,CAAA","sourcesContent":["import type {\n DependencySaveType,\n DependencyTypeShort,\n} from '@vltpkg/types'\nimport type { NodeLike } from './types.ts'\n\n/**\n * Resolve a {@link DependencySaveType} to a {@link DependencyTypeShort}\n */\nexport const resolveSaveType = (\n node: NodeLike,\n name: string,\n saveType: DependencySaveType,\n): DependencyTypeShort =>\n saveType !== 'implicit' ? saveType : (\n (node.edgesOut.get(name)?.type ?? 'prod')\n )\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringify-node.d.ts","sourceRoot":"","sources":["../../src/stringify-node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"stringify-node.d.ts","sourceRoot":"","sources":["../../src/stringify-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,eAAO,MAAM,aAAa,UAAW,QAAQ,WAmB5C,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringify-node.js","sourceRoot":"","sources":["../../src/stringify-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAe,EAAE,EAAE;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEpD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAA;QACvC,OAAO,GAAG,MAAM,GAAG,WAAW,EAAE,CAAA;IAClC,CAAC;SAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,aAAa,IAAI,CAAC,IAAI,EAAE,CAAA;IACjC,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAChD,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC;SAAM,CAAC;QACN,iEAAiE;QACjE,yEAAyE;QACzE,MAAM,WAAW,GACf,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACxD,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,WAAW,EAAE,CAAA;IACxC,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { splitDepID } from '@vltpkg/dep-id/browser'\nimport { NodeLike } from './types.
|
|
1
|
+
{"version":3,"file":"stringify-node.js","sourceRoot":"","sources":["../../src/stringify-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAe,EAAE,EAAE;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEpD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAA;QACvC,OAAO,GAAG,MAAM,GAAG,WAAW,EAAE,CAAA;IAClC,CAAC;SAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,aAAa,IAAI,CAAC,IAAI,EAAE,CAAA;IACjC,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAChD,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC;SAAM,CAAC;QACN,iEAAiE;QACjE,yEAAyE;QACzE,MAAM,WAAW,GACf,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACxD,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,WAAW,EAAE,CAAA;IACxC,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { splitDepID } from '@vltpkg/dep-id/browser'\nimport type { NodeLike } from './types.ts'\n\nexport const stringifyNode = (node?: NodeLike) => {\n if (!node) return ''\n const version = node.version ? `@${node.version}` : ''\n const [type, ref, nameVersion] = splitDepID(node.id)\n\n if (type === 'registry') {\n const prefix = ref ? `${ref}:` : 'npm:'\n return `${prefix}${nameVersion}`\n } else if (type === 'workspace') {\n return `workspace:${node.name}`\n } else if (type === 'file' && node.mainImporter) {\n return `root:${node.name}`\n } else {\n // node.name getter will return the id if the package has no name\n // property so here we check for that in order to return `type(ref)` only\n const nameVersion =\n node.name !== node.id ? `:${node.name}${version}` : ''\n return `${type}(${ref})${nameVersion}`\n }\n}\n"]}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import type { DepID } from '@vltpkg/dep-id';
|
|
2
|
-
import type { Manifest } from '@vltpkg/types';
|
|
3
|
-
import type { Spec } from '@vltpkg/spec';
|
|
4
|
-
|
|
5
|
-
import type { DependencyTypeShort } from './dependencies.js';
|
|
6
|
-
export interface EdgeLike {
|
|
2
|
+
import type { Manifest, DependencyTypeShort } from '@vltpkg/types';
|
|
3
|
+
import type { Spec, SpecLikeBase } from '@vltpkg/spec';
|
|
4
|
+
export type EdgeLike = {
|
|
7
5
|
name: string;
|
|
8
6
|
from: NodeLike;
|
|
9
7
|
spec: SpecLikeBase;
|
|
10
8
|
to?: NodeLike;
|
|
11
9
|
type: DependencyTypeShort;
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
optional?: boolean;
|
|
11
|
+
peer?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type GraphLike = {
|
|
14
14
|
importers: Set<NodeLike>;
|
|
15
15
|
mainImporter: NodeLike;
|
|
16
16
|
projectRoot: string;
|
|
@@ -18,8 +18,8 @@ export interface GraphLike {
|
|
|
18
18
|
edges: Set<EdgeLike>;
|
|
19
19
|
addEdge: (type: DependencyTypeShort, spec: Spec, from: NodeLike, to?: NodeLike) => EdgeLike;
|
|
20
20
|
addNode: (id?: DepID, manifest?: Manifest, spec?: Spec, name?: string, version?: string) => NodeLike;
|
|
21
|
-
}
|
|
22
|
-
export
|
|
21
|
+
};
|
|
22
|
+
export type NodeLike = {
|
|
23
23
|
id: DepID;
|
|
24
24
|
edgesIn: Set<EdgeLike>;
|
|
25
25
|
edgesOut: Map<string, EdgeLike>;
|
|
@@ -35,5 +35,8 @@ export interface NodeLike {
|
|
|
35
35
|
projectRoot: string;
|
|
36
36
|
dev: boolean;
|
|
37
37
|
optional: boolean;
|
|
38
|
-
|
|
38
|
+
toJSON: () => Pick<NodeLike, 'id' | 'name' | 'version' | 'location' | 'importer' | 'manifest' | 'projectRoot' | 'integrity' | 'resolved' | 'dev' | 'optional'>;
|
|
39
|
+
toString(): string;
|
|
40
|
+
setResolved(): void;
|
|
41
|
+
};
|
|
39
42
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/esm/types.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEtD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,YAAY,CAAA;IAClB,EAAE,CAAC,EAAE,QAAQ,CAAA;IACb,IAAI,EAAE,mBAAmB,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,YAAY,EAAE,QAAQ,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC3B,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACpB,OAAO,EAAE,CACP,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,EACd,EAAE,CAAC,EAAE,QAAQ,KACV,QAAQ,CAAA;IACb,OAAO,EAAE,CACP,EAAE,CAAC,EAAE,KAAK,EACV,QAAQ,CAAC,EAAE,QAAQ,EACnB,IAAI,CAAC,EAAE,IAAI,EACX,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,KACb,QAAQ,CAAA;CACd,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,KAAK,CAAA;IACT,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,SAAS,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,OAAO,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,IAAI,CAChB,QAAQ,EACN,IAAI,GACJ,MAAM,GACN,SAAS,GACT,UAAU,GACV,UAAU,GACV,UAAU,GACV,aAAa,GACb,WAAW,GACX,UAAU,GACV,KAAK,GACL,UAAU,CACb,CAAA;IACD,QAAQ,IAAI,MAAM,CAAA;IAClB,WAAW,IAAI,IAAI,CAAA;CACpB,CAAA"}
|
package/dist/esm/types.js.map
CHANGED
|
@@ -1 +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
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { Manifest, DependencyTypeShort } from '@vltpkg/types'\nimport type { Spec, SpecLikeBase } from '@vltpkg/spec'\n\nexport type EdgeLike = {\n name: string\n from: NodeLike\n spec: SpecLikeBase\n to?: NodeLike\n type: DependencyTypeShort\n optional?: boolean\n peer?: boolean\n}\n\nexport type GraphLike = {\n importers: Set<NodeLike>\n mainImporter: NodeLike\n projectRoot: string\n nodes: Map<DepID, NodeLike>\n edges: Set<EdgeLike>\n addEdge: (\n type: DependencyTypeShort,\n spec: Spec,\n from: NodeLike,\n to?: NodeLike,\n ) => EdgeLike\n addNode: (\n id?: DepID,\n manifest?: Manifest,\n spec?: Spec,\n name?: string,\n version?: string,\n ) => NodeLike\n}\n\nexport type NodeLike = {\n id: DepID\n edgesIn: Set<EdgeLike>\n edgesOut: Map<string, EdgeLike>\n location?: string\n manifest?: Manifest | null\n name?: string | null\n version?: string | null\n integrity?: string | null\n resolved?: string | null\n importer: boolean\n graph: GraphLike\n mainImporter: boolean\n projectRoot: string\n dev: boolean\n optional: boolean\n toJSON: () => Pick<\n NodeLike,\n | 'id'\n | 'name'\n | 'version'\n | 'location'\n | 'importer'\n | 'manifest'\n | 'projectRoot'\n | 'integrity'\n | 'resolved'\n | 'dev'\n | 'optional'\n >\n toString(): string\n setResolved(): void\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PackageInfoClient } from '@vltpkg/package-info';
|
|
2
|
+
import type { LoadOptions } from './actual/load.ts';
|
|
3
|
+
import type { RemoveImportersDependenciesMap } from './dependencies.ts';
|
|
4
|
+
export type UninstallOptions = LoadOptions & {
|
|
5
|
+
packageInfo: PackageInfoClient;
|
|
6
|
+
};
|
|
7
|
+
export declare const uninstall: (options: UninstallOptions, remove?: RemoveImportersDependenciesMap) => Promise<{
|
|
8
|
+
graph: import("./graph.ts").Graph;
|
|
9
|
+
diff: import("./diff.ts").Diff;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { load as actualLoad } from "./actual/load.js";
|
|
2
|
+
import { build as idealBuild } from "./ideal/build.js";
|
|
3
|
+
import { reify } from "./reify/index.js";
|
|
4
|
+
export const uninstall = async (options, remove) => {
|
|
5
|
+
const mainManifest = options.packageJson.read(options.projectRoot);
|
|
6
|
+
const graph = await idealBuild({
|
|
7
|
+
...options,
|
|
8
|
+
remove,
|
|
9
|
+
mainManifest,
|
|
10
|
+
loadManifests: true,
|
|
11
|
+
});
|
|
12
|
+
const act = actualLoad({
|
|
13
|
+
...options,
|
|
14
|
+
mainManifest,
|
|
15
|
+
loadManifests: true,
|
|
16
|
+
});
|
|
17
|
+
const diff = await reify({
|
|
18
|
+
...options,
|
|
19
|
+
remove,
|
|
20
|
+
actual: act,
|
|
21
|
+
graph,
|
|
22
|
+
loadManifests: true,
|
|
23
|
+
});
|
|
24
|
+
return { graph, diff };
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { EdgeLike, NodeLike } from '../types.
|
|
2
|
-
import type { ChalkInstance } from 'chalk';
|
|
1
|
+
import type { EdgeLike, NodeLike } from '../types.ts';
|
|
3
2
|
export type TreeItem = {
|
|
4
3
|
name?: string | null;
|
|
5
4
|
edge: EdgeLike | undefined;
|
|
@@ -7,19 +6,22 @@ export type TreeItem = {
|
|
|
7
6
|
prefix: string;
|
|
8
7
|
padding: string;
|
|
9
8
|
hasSibling: boolean;
|
|
10
|
-
|
|
9
|
+
seen: boolean;
|
|
11
10
|
include: boolean;
|
|
12
11
|
parent: TreeItem | undefined;
|
|
13
12
|
};
|
|
14
|
-
export type
|
|
13
|
+
export type HumanReadableOutputGraph = {
|
|
15
14
|
edges: EdgeLike[];
|
|
16
15
|
importers: Set<NodeLike>;
|
|
17
16
|
nodes: NodeLike[];
|
|
18
|
-
|
|
19
|
-
highlightSelection: boolean;
|
|
17
|
+
highlightSelection?: boolean;
|
|
20
18
|
};
|
|
19
|
+
export type EdgeMap = Map<NodeLike | undefined, TreeItem>;
|
|
20
|
+
export type TreeMap = Map<EdgeLike | undefined, EdgeMap>;
|
|
21
21
|
/**
|
|
22
22
|
* Returns a human-readable output of the graph.
|
|
23
23
|
*/
|
|
24
|
-
export declare function humanReadableOutput(options:
|
|
24
|
+
export declare function humanReadableOutput(options: HumanReadableOutputGraph, { colors }: {
|
|
25
|
+
colors?: boolean;
|
|
26
|
+
}): string;
|
|
25
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,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;
|
|
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;AAqBrD,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;AA2DxD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,wBAAwB,EACjC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,UA2GjC"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { splitDepID } from '@vltpkg/dep-id';
|
|
2
|
+
import { styleText as utilStyleText } from 'node:util';
|
|
3
|
+
const styleText = (format, s) => {
|
|
4
|
+
// @ts-expect-error -- styleText 3rd argument is not in types/node
|
|
5
|
+
return utilStyleText(format, s, { validateStream: false });
|
|
6
|
+
};
|
|
2
7
|
const chars = new Map(Object.entries({
|
|
3
8
|
connection: '─',
|
|
4
9
|
down: '│',
|
|
@@ -18,7 +23,7 @@ const getTreeItems = (initialItems, options) => {
|
|
|
18
23
|
for (const item of traverse) {
|
|
19
24
|
if (item.node) {
|
|
20
25
|
if (seenNodes.has(item.node)) {
|
|
21
|
-
item.
|
|
26
|
+
item.seen = true;
|
|
22
27
|
continue;
|
|
23
28
|
}
|
|
24
29
|
seenNodes.add(item.node);
|
|
@@ -31,7 +36,7 @@ const getTreeItems = (initialItems, options) => {
|
|
|
31
36
|
hasSibling: false,
|
|
32
37
|
padding: '',
|
|
33
38
|
prefix: '',
|
|
34
|
-
|
|
39
|
+
seen: false,
|
|
35
40
|
include: isSelected(options, edge, edge.to),
|
|
36
41
|
parent: item,
|
|
37
42
|
};
|
|
@@ -51,10 +56,13 @@ const getTreeItems = (initialItems, options) => {
|
|
|
51
56
|
/**
|
|
52
57
|
* Returns a human-readable output of the graph.
|
|
53
58
|
*/
|
|
54
|
-
export function humanReadableOutput(options) {
|
|
55
|
-
const {
|
|
56
|
-
const
|
|
57
|
-
const
|
|
59
|
+
export function humanReadableOutput(options, { colors }) {
|
|
60
|
+
const { importers } = options;
|
|
61
|
+
const createStyleText = (style) => (s) => colors ? styleText(style, s) : s;
|
|
62
|
+
const dim = createStyleText('dim');
|
|
63
|
+
const red = createStyleText('red');
|
|
64
|
+
const reset = createStyleText('reset');
|
|
65
|
+
const yellow = createStyleText('yellow');
|
|
58
66
|
const initialItems = new Set();
|
|
59
67
|
for (const importer of importers) {
|
|
60
68
|
initialItems.add({
|
|
@@ -64,7 +72,7 @@ export function humanReadableOutput(options) {
|
|
|
64
72
|
prefix: '',
|
|
65
73
|
padding: '',
|
|
66
74
|
hasSibling: false,
|
|
67
|
-
|
|
75
|
+
seen: false,
|
|
68
76
|
include: isSelected(options, undefined, importer),
|
|
69
77
|
parent: undefined,
|
|
70
78
|
});
|
|
@@ -74,11 +82,10 @@ export function humanReadableOutput(options) {
|
|
|
74
82
|
const traverse = (item) => {
|
|
75
83
|
let header = '';
|
|
76
84
|
let content = '';
|
|
77
|
-
const
|
|
78
|
-
const hasCustomReg = depIdTuple?.[0] === 'registry' && depIdTuple[1];
|
|
79
|
-
const name = hasCustomReg ? `${depIdTuple[1]}:${item.name}` : item.name;
|
|
85
|
+
const name = item.name;
|
|
80
86
|
const decoratedName = (options.highlightSelection &&
|
|
81
|
-
isSelected(options, item.edge, item.node)
|
|
87
|
+
isSelected(options, item.edge, item.node) &&
|
|
88
|
+
name) ?
|
|
82
89
|
yellow(name)
|
|
83
90
|
: name;
|
|
84
91
|
if (!item.node && item.include) {
|
|
@@ -87,10 +94,9 @@ export function humanReadableOutput(options) {
|
|
|
87
94
|
: red('(missing)');
|
|
88
95
|
return `${item.padding}${item.prefix}${decoratedName} ${missing}\n`;
|
|
89
96
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (!item.deduped) {
|
|
97
|
+
header += `${item.padding}${item.prefix}${decoratedName}\n`;
|
|
98
|
+
// seen items need not to be printed or traversed
|
|
99
|
+
if (!item.seen) {
|
|
94
100
|
const edges = item.node ? [...item.node.edgesOut.values()] : [];
|
|
95
101
|
const nextItems = edges.map(i => treeItems.get(i)?.get(i.to));
|
|
96
102
|
const includedItems = nextItems.filter(i => i?.include);
|
|
@@ -100,13 +106,19 @@ export function humanReadableOutput(options) {
|
|
|
100
106
|
continue;
|
|
101
107
|
const parent = item;
|
|
102
108
|
const isLast = includedItems.indexOf(nextItem) === includedItems.length - 1;
|
|
103
|
-
|
|
104
|
-
|
|
109
|
+
// prefixes the node name with the registry name
|
|
110
|
+
// if a custom registry name is found
|
|
111
|
+
const depIdTuple = nextItem.node?.id && splitDepID(nextItem.node.id);
|
|
112
|
+
const hasCustomReg = depIdTuple?.[0] === 'registry' && depIdTuple[1];
|
|
113
|
+
const nodeName = hasCustomReg ?
|
|
114
|
+
`${depIdTuple[1]}:${nextItem.node?.name}`
|
|
105
115
|
: nextItem.node?.name;
|
|
116
|
+
const toName = nextItem.node?.version ?
|
|
117
|
+
`${nodeName}@${nextItem.node.version}`
|
|
118
|
+
: nodeName;
|
|
106
119
|
const nextChar = isLast ? 'last-child' : 'middle-child';
|
|
107
120
|
nextItem.name =
|
|
108
|
-
|
|
109
|
-
nextItem.edge?.name !== nextItem.edge?.to?.name) ?
|
|
121
|
+
nextItem.node?.name && nextItem.edge?.name !== nodeName ?
|
|
110
122
|
`${nextItem.edge?.name} (${toName})`
|
|
111
123
|
: `${nextItem.edge?.name}@${nextItem.node?.version || nextItem.edge?.spec.bareSpec}`;
|
|
112
124
|
nextItem.padding =
|
|
@@ -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 { 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"]}
|
|
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 { styleText as utilStyleText } from 'node:util'\n\nconst styleText = (\n format: Parameters<typeof utilStyleText>[0],\n s: string,\n) => {\n // @ts-expect-error -- styleText 3rd argument is not in types/node\n return utilStyleText(format, s, { validateStream: false })\n}\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 !!(\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.seen = 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 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 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\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 nextItem.name =\n nextItem.node?.name && nextItem.edge?.name !== nodeName ?\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,5 +1,5 @@
|
|
|
1
|
-
import { DepID } from '@vltpkg/dep-id';
|
|
2
|
-
import { EdgeLike, NodeLike } from '../types.
|
|
1
|
+
import type { DepID } from '@vltpkg/dep-id';
|
|
2
|
+
import type { EdgeLike, NodeLike } from '../types.ts';
|
|
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.
|
|
@@ -26,12 +26,12 @@ export type JSONOutputItem = {
|
|
|
26
26
|
*/
|
|
27
27
|
to?: NodeLike;
|
|
28
28
|
};
|
|
29
|
-
export type
|
|
29
|
+
export type JSONOutputGraph = {
|
|
30
30
|
edges: EdgeLike[];
|
|
31
31
|
nodes: NodeLike[];
|
|
32
32
|
};
|
|
33
33
|
/**
|
|
34
34
|
* Returns a JSON string representation of the graph.
|
|
35
35
|
*/
|
|
36
|
-
export declare function jsonOutput({ edges, nodes }:
|
|
36
|
+
export declare function jsonOutput({ edges, nodes }: JSONOutputGraph): JSONOutputItem[];
|
|
37
37
|
//# 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,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;
|
|
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 +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,
|
|
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,5 +1,5 @@
|
|
|
1
|
-
import { EdgeLike, NodeLike } from '../types.
|
|
2
|
-
export type
|
|
1
|
+
import type { EdgeLike, NodeLike } from '../types.ts';
|
|
2
|
+
export type MermaidOutputGraph = {
|
|
3
3
|
edges: EdgeLike[];
|
|
4
4
|
importers: Set<NodeLike>;
|
|
5
5
|
nodes: NodeLike[];
|
|
@@ -7,5 +7,5 @@ export type MermaidOutputOptions = {
|
|
|
7
7
|
/**
|
|
8
8
|
* Returns a mermaid string representation of the graph.
|
|
9
9
|
*/
|
|
10
|
-
export declare function mermaidOutput({ edges, importers, nodes, }:
|
|
10
|
+
export declare function mermaidOutput({ edges, importers, nodes, }: MermaidOutputGraph): string;
|
|
11
11
|
//# sourceMappingURL=mermaid-output.d.ts.map
|
|
@@ -1 +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;
|
|
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,5 +1,5 @@
|
|
|
1
|
-
import { Edge } from
|
|
2
|
-
import { Node } from
|
|
1
|
+
import { Edge } from "../edge.js";
|
|
2
|
+
import { Node } from "../node.js";
|
|
3
3
|
let missingCount = 0;
|
|
4
4
|
const nodeLabel = (node) => `"${String(node).replaceAll('@', '#64;')}"`;
|
|
5
5
|
function parseNode(seenNodes, includedItems, node) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mermaid-output.js","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAcjC,IAAI,YAAY,GAAG,CAAC,CAAA;AAEpB,MAAM,SAAS,GAAG,CAAC,IAAc,EAAE,EAAE,CACnC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA;AAE7C,SAAS,SAAS,CAChB,SAAqB,EACrB,aAAgD,EAChD,IAAc;IAEd,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,CAAA;IACX,CAAC;IACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACtB,MAAM,KAAK,GAAW,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;SAChD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAA;AAChG,CAAC;AAED,SAAS,SAAS,CAChB,SAAqB,EACrB,aAAgD,EAChD,IAAc;IAEd,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,UAAU,GACd,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAC9D,SAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAA;IAExE,MAAM,YAAY,GAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAA;IAChE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,UAAU,GAAG,WAAW,YAAY,EAAE,IAAI,YAAY,KAAK,CAAA;IACpE,CAAC;IAED,OAAO,CACL,UAAU;QACV,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK;QAC5D,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,CAC7C,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,SAAS,EACT,KAAK,
|
|
1
|
+
{"version":3,"file":"mermaid-output.js","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { Edge } from '../edge.ts'\nimport { Node } from '../node.ts'\nimport type { EdgeLike, NodeLike } from '../types.ts'\n\nexport type MermaidOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n}\n\ntype TraverseItem = {\n self: EdgeLike | NodeLike\n parent: EdgeLike | NodeLike | undefined\n}\n\nlet missingCount = 0\n\nconst nodeLabel = (node: NodeLike) =>\n `\"${String(node).replaceAll('@', '#64;')}\"`\n\nfunction parseNode(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n node: NodeLike,\n) {\n if (seenNodes.has(node.id) || !includedItems.get(node)) {\n return ''\n }\n seenNodes.add(node.id)\n const edges: string = [...node.edgesOut.values()]\n .map(e => parseEdge(seenNodes, includedItems, e))\n .filter(Boolean)\n .join('\\n')\n return `${encodeURIComponent(node.id)}(${nodeLabel(node)})${edges.length ? '\\n' : ''}${edges}`\n}\n\nfunction parseEdge(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n edge: EdgeLike,\n) {\n if (!includedItems.get(edge)) {\n return ''\n }\n\n const edgeResult =\n `${encodeURIComponent(edge.from.id)}(${nodeLabel(edge.from)})` +\n ` -->|\"${String(edge.spec).replaceAll('@', '#64;')} (${edge.type})\"| `\n\n const missingLabel =\n edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing'\n if (!edge.to) {\n return edgeResult + `missing-${missingCount++}(${missingLabel})\\n`\n }\n\n return (\n edgeResult +\n `${encodeURIComponent(edge.to.id)}(${nodeLabel(edge.to)})\\n` +\n parseNode(seenNodes, includedItems, edge.to)\n )\n}\n\n/**\n * Returns a mermaid string representation of the graph.\n */\nexport function mermaidOutput({\n edges,\n importers,\n nodes,\n}: MermaidOutputGraph) {\n const seen = new Set<EdgeLike | NodeLike>()\n const includedItems = new Map<EdgeLike | NodeLike, boolean>()\n const traverse = new Set<TraverseItem>(\n [...importers].map(i => ({ self: i, parent: undefined })),\n )\n\n for (const item of traverse) {\n if (seen.has(item.self)) continue\n seen.add(item.self)\n\n if (item.self instanceof Edge) {\n if (edges.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n if (item.self.to) {\n traverse.add({ self: item.self.to, parent: item.self })\n }\n }\n\n if (item.self instanceof Node) {\n if (nodes.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n for (const edge of item.self.edgesOut.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n }\n }\n\n for (const item of [...traverse].reverse()) {\n if (includedItems.has(item.self) && item.parent) {\n includedItems.set(item.parent, true)\n }\n }\n\n return (\n 'flowchart TD\\n' +\n [...importers]\n .map(i => parseNode(new Set<DepID>(), includedItems, i))\n .join('\\n')\n )\n}\n"]}
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"object-like-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/object-like-output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,SAAS,EAAY,MAAM,aAAa,CAAA;AA8DhE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,UAOhD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { inspect } from 'node:util';
|
|
2
|
+
const addInspect = (o, fn) => (o[inspect.custom] = fn);
|
|
2
3
|
function parseNode(seenNodes, graph, node) {
|
|
3
|
-
|
|
4
|
-
node[inspect.custom] = () => {
|
|
4
|
+
addInspect(node, () => {
|
|
5
5
|
const res = 'Node ' +
|
|
6
6
|
inspect(seenNodes.has(node) ?
|
|
7
7
|
{ ref: node.id }
|
|
@@ -25,12 +25,11 @@ function parseNode(seenNodes, graph, node) {
|
|
|
25
25
|
: (seenNodes.add(node), null)),
|
|
26
26
|
}, { depth: Infinity });
|
|
27
27
|
return res;
|
|
28
|
-
};
|
|
28
|
+
});
|
|
29
29
|
return node;
|
|
30
30
|
}
|
|
31
31
|
function parseEdge(seenNodes, graph, edge) {
|
|
32
|
-
|
|
33
|
-
edge[inspect.custom] = () => {
|
|
32
|
+
addInspect(edge, () => {
|
|
34
33
|
const missingNode = `[missing package]: <${edge.name}@${edge.spec.bareSpec}>`;
|
|
35
34
|
const toLabel = edge.to ?
|
|
36
35
|
inspect(parseNode(seenNodes, graph, edge.to), {
|
|
@@ -38,7 +37,7 @@ function parseEdge(seenNodes, graph, edge) {
|
|
|
38
37
|
})
|
|
39
38
|
: missingNode;
|
|
40
39
|
return `Edge spec(${String(edge.spec)}) -${edge.type}-> to: ${toLabel}`;
|
|
41
|
-
};
|
|
40
|
+
});
|
|
42
41
|
return edge;
|
|
43
42
|
}
|
|
44
43
|
export function objectLikeOutput(graph) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-like-output.js","sourceRoot":"","sources":["../../../src/visualization/object-like-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,SAAS,SAAS,CAChB,SAAwB,EACxB,KAAgB,EAChB,IAAc;IAEd,
|
|
1
|
+
{"version":3,"file":"object-like-output.js","sourceRoot":"","sources":["../../../src/visualization/object-like-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,MAAM,UAAU,GAAG,CAAC,CAAU,EAAE,EAAgB,EAAE,EAAE,CAClD,CAAE,CAAoD,CACpD,OAAO,CAAC,MAAM,CACf,GAAG,EAAE,CAAC,CAAA;AAET,SAAS,SAAS,CAChB,SAAwB,EACxB,KAAgB,EAChB,IAAc;IAEd,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;QACpB,MAAM,GAAG,GACP,OAAO;YACP,OAAO,CACL,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBACnB,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;gBAClB,CAAC,CAAC;oBACE,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC9C,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;oBACpC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC9C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;oBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAClB,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;wBAC/B,CAAC,CAAC,IAAI,CAAC;oBACP,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACtB;4BACE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gCAC5C,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gCACnB,OAAO,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;4BACvC,CAAC,CAAC;yBACH;wBACH,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;iBAC/B,EACH,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAA;QACH,OAAO,GAAG,CAAA;IACZ,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,SAAS,CAChB,SAAwB,EACxB,KAAgB,EAChB,IAAc;IAEd,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;QACpB,MAAM,WAAW,GAAG,uBAAuB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAA;QAC7E,MAAM,OAAO,GACX,IAAI,CAAC,EAAE,CAAC,CAAC;YACP,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE;gBAC5C,KAAK,EAAE,QAAQ;aAChB,CAAC;YACJ,CAAC,CAAC,WAAW,CAAA;QACf,OAAO,aAAa,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,UAAU,OAAO,EAAE,CAAA;IACzE,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAgB;IAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY,CAAA;IACrC,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAA;IACtC,OAAO,OAAO,CACZ,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAClD,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAA;AACH,CAAC","sourcesContent":["import { inspect } from 'node:util'\nimport type { EdgeLike, GraphLike, NodeLike } from '../types.ts'\n\nconst addInspect = (o: unknown, fn: () => string) =>\n ((o as { [K in typeof inspect.custom]: () => string })[\n inspect.custom\n ] = fn)\n\nfunction parseNode(\n seenNodes: Set<NodeLike>,\n graph: GraphLike,\n node: NodeLike,\n) {\n addInspect(node, () => {\n const res =\n 'Node ' +\n inspect(\n seenNodes.has(node) ?\n { ref: node.id }\n : {\n id: node.id,\n location: node.location,\n ...(node.importer ? { importer: true } : null),\n ...(node.dev ? { dev: true } : null),\n ...(node.optional ? { optional: true } : null),\n ...(node.resolved ? { resolved: node.resolved } : null),\n ...(node.integrity ?\n { integrity: node.integrity }\n : null),\n ...(node.edgesOut.size ?\n {\n edgesOut: [...node.edgesOut.values()].map(i => {\n seenNodes.add(node)\n return parseEdge(seenNodes, graph, i)\n }),\n }\n : (seenNodes.add(node), null)),\n },\n { depth: Infinity },\n )\n return res\n })\n return node\n}\n\nfunction parseEdge(\n seenNodes: Set<NodeLike>,\n graph: GraphLike,\n edge: EdgeLike,\n) {\n addInspect(edge, () => {\n const missingNode = `[missing package]: <${edge.name}@${edge.spec.bareSpec}>`\n const toLabel: string =\n edge.to ?\n inspect(parseNode(seenNodes, graph, edge.to), {\n depth: Infinity,\n })\n : missingNode\n return `Edge spec(${String(edge.spec)}) -${edge.type}-> to: ${toLabel}`\n })\n return edge\n}\n\nexport function objectLikeOutput(graph: GraphLike) {\n const seenNodes = new Set<NodeLike>()\n const importers = [...graph.importers]\n return inspect(\n importers.map(i => parseNode(seenNodes, graph, i)),\n { depth: Infinity },\n )\n}\n"]}
|