@vltpkg/graph 0.0.0-15 → 0.0.0-16

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 (77) hide show
  1. package/dist/esm/actual/load.d.ts +26 -2
  2. package/dist/esm/actual/load.d.ts.map +1 -1
  3. package/dist/esm/actual/load.js +97 -69
  4. package/dist/esm/actual/load.js.map +1 -1
  5. package/dist/esm/dependencies.d.ts +10 -2
  6. package/dist/esm/dependencies.d.ts.map +1 -1
  7. package/dist/esm/dependencies.js +63 -0
  8. package/dist/esm/dependencies.js.map +1 -1
  9. package/dist/esm/graph.d.ts +5 -1
  10. package/dist/esm/graph.d.ts.map +1 -1
  11. package/dist/esm/graph.js +30 -4
  12. package/dist/esm/graph.js.map +1 -1
  13. package/dist/esm/ideal/add-nodes.d.ts +3 -0
  14. package/dist/esm/ideal/add-nodes.d.ts.map +1 -1
  15. package/dist/esm/ideal/add-nodes.js.map +1 -1
  16. package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
  17. package/dist/esm/ideal/append-nodes.js +2 -2
  18. package/dist/esm/ideal/append-nodes.js.map +1 -1
  19. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +0 -2
  20. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
  21. package/dist/esm/ideal/build-ideal-from-starting-graph.js +0 -3
  22. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
  23. package/dist/esm/ideal/build.d.ts +0 -5
  24. package/dist/esm/ideal/build.d.ts.map +1 -1
  25. package/dist/esm/ideal/build.js +2 -0
  26. package/dist/esm/ideal/build.js.map +1 -1
  27. package/dist/esm/ideal/get-importer-specs.d.ts +1 -6
  28. package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
  29. package/dist/esm/ideal/get-importer-specs.js +1 -9
  30. package/dist/esm/ideal/get-importer-specs.js.map +1 -1
  31. package/dist/esm/install.d.ts.map +1 -1
  32. package/dist/esm/install.js +2 -0
  33. package/dist/esm/install.js.map +1 -1
  34. package/dist/esm/lockfile/load-nodes.d.ts.map +1 -1
  35. package/dist/esm/lockfile/load-nodes.js +10 -3
  36. package/dist/esm/lockfile/load-nodes.js.map +1 -1
  37. package/dist/esm/lockfile/load.d.ts +12 -3
  38. package/dist/esm/lockfile/load.d.ts.map +1 -1
  39. package/dist/esm/lockfile/load.js +14 -4
  40. package/dist/esm/lockfile/load.js.map +1 -1
  41. package/dist/esm/lockfile/save.d.ts +6 -1
  42. package/dist/esm/lockfile/save.d.ts.map +1 -1
  43. package/dist/esm/lockfile/save.js +7 -1
  44. package/dist/esm/lockfile/save.js.map +1 -1
  45. package/dist/esm/lockfile/types.d.ts +3 -1
  46. package/dist/esm/lockfile/types.d.ts.map +1 -1
  47. package/dist/esm/lockfile/types.js.map +1 -1
  48. package/dist/esm/modifiers.d.ts +7 -17
  49. package/dist/esm/modifiers.d.ts.map +1 -1
  50. package/dist/esm/modifiers.js +16 -28
  51. package/dist/esm/modifiers.js.map +1 -1
  52. package/dist/esm/node.d.ts +4 -0
  53. package/dist/esm/node.d.ts.map +1 -1
  54. package/dist/esm/node.js +11 -6
  55. package/dist/esm/node.js.map +1 -1
  56. package/dist/esm/reify/index.d.ts +2 -0
  57. package/dist/esm/reify/index.d.ts.map +1 -1
  58. package/dist/esm/reify/index.js +5 -0
  59. package/dist/esm/reify/index.js.map +1 -1
  60. package/dist/esm/reify/update-importers-package-json.js +1 -1
  61. package/dist/esm/reify/update-importers-package-json.js.map +1 -1
  62. package/dist/esm/types.d.ts +3 -0
  63. package/dist/esm/types.d.ts.map +1 -1
  64. package/dist/esm/types.js.map +1 -1
  65. package/dist/esm/visualization/json-output.d.ts +4 -0
  66. package/dist/esm/visualization/json-output.d.ts.map +1 -1
  67. package/dist/esm/visualization/json-output.js +2 -0
  68. package/dist/esm/visualization/json-output.js.map +1 -1
  69. package/dist/esm/visualization/mermaid-output.d.ts +6 -0
  70. package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
  71. package/dist/esm/visualization/mermaid-output.js +64 -9
  72. package/dist/esm/visualization/mermaid-output.js.map +1 -1
  73. package/package.json +19 -19
  74. package/dist/esm/ideal/check-nodes.d.ts +0 -33
  75. package/dist/esm/ideal/check-nodes.d.ts.map +0 -1
  76. package/dist/esm/ideal/check-nodes.js +0 -42
  77. package/dist/esm/ideal/check-nodes.js.map +0 -1
@@ -1,31 +1,84 @@
1
1
  import { Edge } from "../edge.js";
2
2
  import { Node } from "../node.js";
3
3
  let missingCount = 0;
4
+ /**
5
+ * Generates a short identifier for a given index following the pattern:
6
+ * 0 -> a, 1 -> b, ..., 25 -> z, 26 -> A, ..., 51 -> Z, 52 -> aa, 53 -> ab, etc.
7
+ * This implements a bijective base-52 numbering system where a-z = 0-25, A-Z = 26-51
8
+ */
9
+ export function generateShortId(index) {
10
+ const base = 52;
11
+ // Helper function to convert a digit (0-51) to character
12
+ const digitToChar = (digit) => {
13
+ if (digit < 26) {
14
+ // a-z (0-25)
15
+ return String.fromCharCode(97 + digit);
16
+ }
17
+ else {
18
+ // A-Z (26-51)
19
+ return String.fromCharCode(65 + (digit - 26));
20
+ }
21
+ };
22
+ // Bijective base-52 conversion
23
+ let result = '';
24
+ let num = index + 1; // Convert to 1-based for bijective base
25
+ while (num > 0) {
26
+ num--; // Adjust for 0-based indexing in each position
27
+ const remainder = num % base;
28
+ result = digitToChar(remainder) + result;
29
+ num = Math.floor(num / base);
30
+ }
31
+ return result;
32
+ }
33
+ /**
34
+ * Creates a mapping from DepID to short identifier
35
+ */
36
+ function createDepIdMapping(importers) {
37
+ const mapping = new Map();
38
+ const uniqueDepIds = new Set();
39
+ // Collect all unique DepIDs from nodes & importers
40
+ const [importer] = importers;
41
+ if (importer) {
42
+ for (const node of importer.graph.nodes.values()) {
43
+ uniqueDepIds.add(node.id);
44
+ }
45
+ }
46
+ // Create mapping for each unique DepID
47
+ let index = 0;
48
+ for (const depId of uniqueDepIds) {
49
+ mapping.set(depId, generateShortId(index++));
50
+ }
51
+ return mapping;
52
+ }
4
53
  const nodeLabel = (node) => `"${String(node).replaceAll('@', '#64;')}"`;
5
- function parseNode(seenNodes, includedItems, node) {
54
+ function parseNode(seenNodes, includedItems, depIdMapping, node) {
6
55
  if (seenNodes.has(node.id) || !includedItems.get(node)) {
7
56
  return '';
8
57
  }
9
58
  seenNodes.add(node.id);
10
59
  const edges = [...node.edgesOut.values()]
11
- .map(e => parseEdge(seenNodes, includedItems, e))
60
+ .map(e => parseEdge(seenNodes, includedItems, depIdMapping, e))
12
61
  .filter(Boolean)
13
62
  .join('\n');
14
- return `${encodeURIComponent(node.id)}(${nodeLabel(node)})${edges.length ? '\n' : ''}${edges}`;
63
+ const shortId = depIdMapping.get(node.id);
64
+ return `${shortId}(${nodeLabel(node)})${edges.length ? '\n' : ''}${edges}`;
15
65
  }
16
- function parseEdge(seenNodes, includedItems, edge) {
66
+ function parseEdge(seenNodes, includedItems, depIdMapping, edge) {
17
67
  if (!includedItems.get(edge)) {
18
68
  return '';
19
69
  }
20
- const edgeResult = `${encodeURIComponent(edge.from.id)}(${nodeLabel(edge.from)})` +
21
- ` -->|"${String(edge.spec).replaceAll('@', '#64;')} (${edge.type})"| `;
70
+ const fromShortId = depIdMapping.get(edge.from.id);
71
+ const edgeType = edge.type === 'prod' ? '' : ` (${edge.type})`;
72
+ const edgeResult = `${fromShortId}(${nodeLabel(edge.from)})` +
73
+ ` -->|"${String(edge.spec).replaceAll('@', '#64;')}${edgeType}"| `;
22
74
  const missingLabel = edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing';
23
75
  if (!edge.to) {
24
76
  return edgeResult + `missing-${missingCount++}(${missingLabel})\n`;
25
77
  }
78
+ const toShortId = depIdMapping.get(edge.to.id);
26
79
  return (edgeResult +
27
- `${encodeURIComponent(edge.to.id)}(${nodeLabel(edge.to)})\n` +
28
- parseNode(seenNodes, includedItems, edge.to));
80
+ `${toShortId}(${nodeLabel(edge.to)})\n` +
81
+ parseNode(seenNodes, includedItems, depIdMapping, edge.to));
29
82
  }
30
83
  /**
31
84
  * Returns a mermaid string representation of the graph.
@@ -60,9 +113,11 @@ export function mermaidOutput({ edges, importers, nodes, }) {
60
113
  includedItems.set(item.parent, true);
61
114
  }
62
115
  }
116
+ // Create DepID to short identifier mapping
117
+ const depIdMapping = createDepIdMapping(importers);
63
118
  return ('flowchart TD\n' +
64
119
  [...importers]
65
- .map(i => parseNode(new Set(), includedItems, i))
120
+ .map(i => parseNode(new Set(), includedItems, depIdMapping, i))
66
121
  .join('\n'));
67
122
  }
68
123
  //# sourceMappingURL=mermaid-output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid-output.js","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { Edge } from '../edge.ts'\nimport { Node } from '../node.ts'\nimport type { EdgeLike, NodeLike } from '../types.ts'\n\nexport type MermaidOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n}\n\ntype TraverseItem = {\n self: EdgeLike | NodeLike\n parent: EdgeLike | NodeLike | undefined\n}\n\nlet missingCount = 0\n\nconst nodeLabel = (node: NodeLike) =>\n `\"${String(node).replaceAll('@', '#64;')}\"`\n\nfunction parseNode(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n node: NodeLike,\n) {\n if (seenNodes.has(node.id) || !includedItems.get(node)) {\n return ''\n }\n seenNodes.add(node.id)\n const edges: string = [...node.edgesOut.values()]\n .map(e => parseEdge(seenNodes, includedItems, e))\n .filter(Boolean)\n .join('\\n')\n return `${encodeURIComponent(node.id)}(${nodeLabel(node)})${edges.length ? '\\n' : ''}${edges}`\n}\n\nfunction parseEdge(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n edge: EdgeLike,\n) {\n if (!includedItems.get(edge)) {\n return ''\n }\n\n const edgeResult =\n `${encodeURIComponent(edge.from.id)}(${nodeLabel(edge.from)})` +\n ` -->|\"${String(edge.spec).replaceAll('@', '#64;')} (${edge.type})\"| `\n\n const missingLabel =\n edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing'\n if (!edge.to) {\n return edgeResult + `missing-${missingCount++}(${missingLabel})\\n`\n }\n\n return (\n edgeResult +\n `${encodeURIComponent(edge.to.id)}(${nodeLabel(edge.to)})\\n` +\n parseNode(seenNodes, includedItems, edge.to)\n )\n}\n\n/**\n * Returns a mermaid string representation of the graph.\n */\nexport function mermaidOutput({\n edges,\n importers,\n nodes,\n}: MermaidOutputGraph) {\n const seen = new Set<EdgeLike | NodeLike>()\n const includedItems = new Map<EdgeLike | NodeLike, boolean>()\n const traverse = new Set<TraverseItem>(\n [...importers].map(i => ({ self: i, parent: undefined })),\n )\n\n for (const item of traverse) {\n if (seen.has(item.self)) continue\n seen.add(item.self)\n\n if (item.self instanceof Edge) {\n if (edges.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n if (item.self.to) {\n traverse.add({ self: item.self.to, parent: item.self })\n }\n }\n\n if (item.self instanceof Node) {\n if (nodes.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n for (const edge of item.self.edgesOut.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n }\n }\n\n for (const item of [...traverse].reverse()) {\n if (includedItems.has(item.self) && item.parent) {\n includedItems.set(item.parent, true)\n }\n }\n\n return (\n 'flowchart TD\\n' +\n [...importers]\n .map(i => parseNode(new Set<DepID>(), includedItems, i))\n .join('\\n')\n )\n}\n"]}
1
+ {"version":3,"file":"mermaid-output.js","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { Edge } from '../edge.ts'\nimport { Node } from '../node.ts'\nimport type { EdgeLike, NodeLike } from '../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\n/**\n * Generates a short identifier for a given index following the pattern:\n * 0 -> a, 1 -> b, ..., 25 -> z, 26 -> A, ..., 51 -> Z, 52 -> aa, 53 -> ab, etc.\n * This implements a bijective base-52 numbering system where a-z = 0-25, A-Z = 26-51\n */\nexport function generateShortId(index: number): string {\n const base = 52\n\n // Helper function to convert a digit (0-51) to character\n const digitToChar = (digit: number): string => {\n if (digit < 26) {\n // a-z (0-25)\n return String.fromCharCode(97 + digit)\n } else {\n // A-Z (26-51)\n return String.fromCharCode(65 + (digit - 26))\n }\n }\n\n // Bijective base-52 conversion\n let result = ''\n let num = index + 1 // Convert to 1-based for bijective base\n\n while (num > 0) {\n num-- // Adjust for 0-based indexing in each position\n const remainder = num % base\n result = digitToChar(remainder) + result\n num = Math.floor(num / base)\n }\n\n return result\n}\n\n/**\n * Creates a mapping from DepID to short identifier\n */\nfunction createDepIdMapping(\n importers: Set<NodeLike>,\n): Map<DepID, string> {\n const mapping = new Map<DepID, string>()\n const uniqueDepIds = new Set<DepID>()\n\n // Collect all unique DepIDs from nodes & importers\n const [importer] = importers\n if (importer) {\n for (const node of importer.graph.nodes.values()) {\n uniqueDepIds.add(node.id)\n }\n }\n\n // Create mapping for each unique DepID\n let index = 0\n for (const depId of uniqueDepIds) {\n mapping.set(depId, generateShortId(index++))\n }\n\n return mapping\n}\n\nconst nodeLabel = (node: NodeLike) =>\n `\"${String(node).replaceAll('@', '#64;')}\"`\n\nfunction parseNode(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n node: NodeLike,\n) {\n if (seenNodes.has(node.id) || !includedItems.get(node)) {\n return ''\n }\n seenNodes.add(node.id)\n const edges: string = [...node.edgesOut.values()]\n .map(e => parseEdge(seenNodes, includedItems, depIdMapping, e))\n .filter(Boolean)\n .join('\\n')\n const shortId = depIdMapping.get(node.id)\n return `${shortId}(${nodeLabel(node)})${edges.length ? '\\n' : ''}${edges}`\n}\n\nfunction parseEdge(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n edge: EdgeLike,\n) {\n if (!includedItems.get(edge)) {\n return ''\n }\n\n const fromShortId = depIdMapping.get(edge.from.id)\n const edgeType = edge.type === 'prod' ? '' : ` (${edge.type})`\n const edgeResult =\n `${fromShortId}(${nodeLabel(edge.from)})` +\n ` -->|\"${String(edge.spec).replaceAll('@', '#64;')}${edgeType}\"| `\n\n const missingLabel =\n edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing'\n if (!edge.to) {\n return edgeResult + `missing-${missingCount++}(${missingLabel})\\n`\n }\n\n const toShortId = depIdMapping.get(edge.to.id)\n return (\n edgeResult +\n `${toShortId}(${nodeLabel(edge.to)})\\n` +\n parseNode(seenNodes, includedItems, depIdMapping, edge.to)\n )\n}\n\n/**\n * Returns a mermaid string representation of the graph.\n */\nexport function mermaidOutput({\n edges,\n importers,\n nodes,\n}: MermaidOutputGraph) {\n const seen = new Set<EdgeLike | NodeLike>()\n const includedItems = new Map<EdgeLike | NodeLike, boolean>()\n const traverse = new Set<TraverseItem>(\n [...importers].map(i => ({ self: i, parent: undefined })),\n )\n\n for (const item of traverse) {\n if (seen.has(item.self)) continue\n seen.add(item.self)\n\n if (item.self instanceof Edge) {\n if (edges.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n if (item.self.to) {\n traverse.add({ self: item.self.to, parent: item.self })\n }\n }\n\n if (item.self instanceof Node) {\n if (nodes.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n for (const edge of item.self.edgesOut.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n }\n }\n\n for (const item of [...traverse].reverse()) {\n if (includedItems.has(item.self) && item.parent) {\n includedItems.set(item.parent, true)\n }\n }\n\n // Create DepID to short identifier mapping\n const depIdMapping = createDepIdMapping(importers)\n\n return (\n 'flowchart TD\\n' +\n [...importers]\n .map(i =>\n parseNode(new Set<DepID>(), includedItems, depIdMapping, i),\n )\n .join('\\n')\n )\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vltpkg/graph",
3
3
  "description": "A library that helps understanding & expressing what happens on an install",
4
- "version": "0.0.0-15",
4
+ "version": "0.0.0-16",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/vltpkg/vltpkg.git",
@@ -23,35 +23,35 @@
23
23
  "graph-run": "^1.1.0",
24
24
  "path-scurry": "^2.0.0",
25
25
  "promise-call-limit": "^3.0.2",
26
- "@vltpkg/cmd-shim": "0.0.0-15",
27
- "@vltpkg/dep-id": "0.0.0-15",
28
- "@vltpkg/dss-breadcrumb": "0.0.0-15",
29
- "@vltpkg/fast-split": "0.0.0-15",
30
- "@vltpkg/output": "0.0.0-15",
31
- "@vltpkg/error-cause": "0.0.0-15",
32
- "@vltpkg/package-info": "0.0.0-15",
33
- "@vltpkg/package-json": "0.0.0-15",
34
- "@vltpkg/rollback-remove": "0.0.0-15",
35
- "@vltpkg/run": "0.0.0-15",
36
- "@vltpkg/pick-manifest": "0.0.0-15",
37
- "@vltpkg/spec": "0.0.0-15",
38
- "@vltpkg/types": "0.0.0-15",
39
- "@vltpkg/satisfies": "0.0.0-15",
40
- "@vltpkg/vlt-json": "0.0.0-15",
41
- "@vltpkg/workspaces": "0.0.0-15"
26
+ "@vltpkg/cmd-shim": "0.0.0-16",
27
+ "@vltpkg/dss-breadcrumb": "0.0.0-16",
28
+ "@vltpkg/error-cause": "0.0.0-16",
29
+ "@vltpkg/fast-split": "0.0.0-16",
30
+ "@vltpkg/output": "0.0.0-16",
31
+ "@vltpkg/package-info": "0.0.0-16",
32
+ "@vltpkg/pick-manifest": "0.0.0-16",
33
+ "@vltpkg/rollback-remove": "0.0.0-16",
34
+ "@vltpkg/package-json": "0.0.0-16",
35
+ "@vltpkg/run": "0.0.0-16",
36
+ "@vltpkg/satisfies": "0.0.0-16",
37
+ "@vltpkg/types": "0.0.0-16",
38
+ "@vltpkg/vlt-json": "0.0.0-16",
39
+ "@vltpkg/dep-id": "0.0.0-16",
40
+ "@vltpkg/spec": "0.0.0-16",
41
+ "@vltpkg/workspaces": "0.0.0-16"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@eslint/js": "^9.28.0",
45
45
  "@types/node": "^22.15.29",
46
46
  "eslint": "^9.28.0",
47
- "prettier": "^3.5.3",
47
+ "prettier": "^3.6.0",
48
48
  "tap": "^21.1.0",
49
49
  "tar": "^7.4.3",
50
50
  "tshy": "^3.0.2",
51
51
  "typedoc": "~0.27.9",
52
52
  "typescript": "5.7.3",
53
53
  "typescript-eslint": "^8.33.1",
54
- "@vltpkg/vlt-json": "0.0.0-15"
54
+ "@vltpkg/vlt-json": "0.0.0-16"
55
55
  },
56
56
  "license": "BSD-2-Clause-Patent",
57
57
  "engines": {
@@ -1,33 +0,0 @@
1
- import type { DepID } from '@vltpkg/dep-id';
2
- import type { GraphModifier } from '../modifiers.ts';
3
- import type { PackageInfoClient } from '@vltpkg/package-info';
4
- import type { SpecOptions } from '@vltpkg/spec';
5
- import type { PathScurry } from 'path-scurry';
6
- import type { Dependency } from '../dependencies.ts';
7
- import type { BuildIdealFromGraphOptions } from './types.ts';
8
- export type CheckNodesOptions = BuildIdealFromGraphOptions & SpecOptions & {
9
- /**
10
- * The dependencies to check.
11
- */
12
- check: Map<DepID, Map<string, Dependency>>;
13
- /**
14
- * A {@link GraphModifier} instance that holds information on how to
15
- * modify the graph, replacing nodes and edges as defined in the
16
- * project configuration.
17
- */
18
- modifiers?: GraphModifier;
19
- /**
20
- * The package info client to use.
21
- */
22
- packageInfo: PackageInfoClient;
23
- /**
24
- * The path scurry instance to use.
25
- */
26
- scurry: PathScurry;
27
- };
28
- /**
29
- * Runs an extra check and apply modifiers in all nodes that are not part
30
- * of the the list of nodes to add.
31
- */
32
- export declare const checkNodes: ({ check, graph, modifiers, packageInfo, scurry, ...specOptions }: CheckNodesOptions) => Promise<void>;
33
- //# sourceMappingURL=check-nodes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"check-nodes.d.ts","sourceRoot":"","sources":["../../../src/ideal/check-nodes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAE5D,MAAM,MAAM,iBAAiB,GAAG,0BAA0B,GACxD,WAAW,GAAG;IACZ;;OAEG;IACH,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;IAC1C;;;;OAIG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,WAAW,EAAE,iBAAiB,CAAA;IAC9B;;OAEG;IACH,MAAM,EAAE,UAAU,CAAA;CACnB,CAAA;AAEH;;;GAGG;AACH,eAAO,MAAM,UAAU,qEAOpB,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAiDlC,CAAA"}
@@ -1,42 +0,0 @@
1
- import { appendNodes } from "./append-nodes.js";
2
- import { asDependency } from "../dependencies.js";
3
- /**
4
- * Runs an extra check and apply modifiers in all nodes that are not part
5
- * of the the list of nodes to add.
6
- */
7
- export const checkNodes = async ({ check, graph, modifiers, packageInfo, scurry, ...specOptions }) => {
8
- const seen = new Set();
9
- const importers = new Set(graph.importers);
10
- // initializes the map of modifiers with any importers marked to check
11
- for (const node of importers) {
12
- const deps = check.get(node.id);
13
- if (deps?.size) {
14
- modifiers?.tryImporter(node);
15
- }
16
- else {
17
- // otherwise we remove the importer from the list
18
- importers.delete(node);
19
- }
20
- }
21
- for (const node of importers) {
22
- const modifiedDeps = new Map();
23
- const modifierRefs = new Map();
24
- for (const [name, edge] of node.edgesOut) {
25
- // when we find a modifier that applies to a direct dependency, mark
26
- // that dependency as a dependency to be added by append-nodes
27
- const modifierRef = modifiers?.tryNewDependency(node, name);
28
- if (modifierRef && 'spec' in modifierRef.modifier) {
29
- modifiedDeps.set(name, asDependency({
30
- type: edge.type,
31
- spec: edge.spec,
32
- }));
33
- modifierRefs.set(name, modifierRef);
34
- }
35
- }
36
- const deps = [...modifiedDeps.values()];
37
- if (modifiedDeps.size) {
38
- await appendNodes(modifiedDeps, packageInfo, graph, node, deps, scurry, specOptions, seen, modifiers, modifierRefs);
39
- }
40
- }
41
- };
42
- //# sourceMappingURL=check-nodes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"check-nodes.js","sourceRoot":"","sources":["../../../src/ideal/check-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAmCjD;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,EAC/B,KAAK,EACL,KAAK,EACL,SAAS,EACT,WAAW,EACX,MAAM,EACN,GAAG,WAAW,EACI,EAAiB,EAAE;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAS,CAAA;IAC7B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAO,KAAK,CAAC,SAAS,CAAC,CAAA;IAEhD,sEAAsE;IACtE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACf,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAA;QAClD,MAAM,YAAY,GAAG,IAAI,GAAG,EAA+B,CAAA;QAC3D,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,oEAAoE;YACpE,8DAA8D;YAC9D,MAAM,WAAW,GAAG,SAAS,EAAE,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAC3D,IAAI,WAAW,IAAI,MAAM,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAClD,YAAY,CAAC,GAAG,CACd,IAAI,EACJ,YAAY,CAAC;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CACH,CAAA;gBACD,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;QACvC,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;YACtB,MAAM,WAAW,CACf,YAAY,EACZ,WAAW,EACX,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,WAAW,EACX,IAAI,EACJ,SAAS,EACT,YAAY,CACb,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { appendNodes } from './append-nodes.ts'\nimport { asDependency } from '../dependencies.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type {\n GraphModifier,\n ModifierActiveEntry,\n} from '../modifiers.ts'\nimport type { Node } from '../node.ts'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { PathScurry } from 'path-scurry'\nimport type { Dependency } from '../dependencies.ts'\nimport type { BuildIdealFromGraphOptions } from './types.ts'\n\nexport type CheckNodesOptions = BuildIdealFromGraphOptions &\n SpecOptions & {\n /**\n * The dependencies to check.\n */\n check: Map<DepID, Map<string, Dependency>>\n /**\n * A {@link GraphModifier} instance that holds information on how to\n * modify the graph, replacing nodes and edges as defined in the\n * project configuration.\n */\n modifiers?: GraphModifier\n /**\n * The package info client to use.\n */\n packageInfo: PackageInfoClient\n /**\n * The path scurry instance to use.\n */\n scurry: PathScurry\n }\n\n/**\n * Runs an extra check and apply modifiers in all nodes that are not part\n * of the the list of nodes to add.\n */\nexport const checkNodes = async ({\n check,\n graph,\n modifiers,\n packageInfo,\n scurry,\n ...specOptions\n}: CheckNodesOptions): Promise<void> => {\n const seen = new Set<DepID>()\n const importers = new Set<Node>(graph.importers)\n\n // initializes the map of modifiers with any importers marked to check\n for (const node of importers) {\n const deps = check.get(node.id)\n if (deps?.size) {\n modifiers?.tryImporter(node)\n } else {\n // otherwise we remove the importer from the list\n importers.delete(node)\n }\n }\n\n for (const node of importers) {\n const modifiedDeps = new Map<string, Dependency>()\n const modifierRefs = new Map<string, ModifierActiveEntry>()\n for (const [name, edge] of node.edgesOut) {\n // when we find a modifier that applies to a direct dependency, mark\n // that dependency as a dependency to be added by append-nodes\n const modifierRef = modifiers?.tryNewDependency(node, name)\n if (modifierRef && 'spec' in modifierRef.modifier) {\n modifiedDeps.set(\n name,\n asDependency({\n type: edge.type,\n spec: edge.spec,\n }),\n )\n modifierRefs.set(name, modifierRef)\n }\n }\n const deps = [...modifiedDeps.values()]\n if (modifiedDeps.size) {\n await appendNodes(\n modifiedDeps,\n packageInfo,\n graph,\n node,\n deps,\n scurry,\n specOptions,\n seen,\n modifiers,\n modifierRefs,\n )\n }\n }\n}\n"]}