ai-database 2.0.2 → 2.1.3

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 (114) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/LICENSE +21 -0
  3. package/README.md +667 -1
  4. package/dist/actions.d.ts +247 -0
  5. package/dist/actions.d.ts.map +1 -0
  6. package/dist/actions.js +260 -0
  7. package/dist/actions.js.map +1 -0
  8. package/dist/ai-promise-db.d.ts +37 -2
  9. package/dist/ai-promise-db.d.ts.map +1 -1
  10. package/dist/ai-promise-db.js +530 -92
  11. package/dist/ai-promise-db.js.map +1 -1
  12. package/dist/constants.d.ts +16 -0
  13. package/dist/constants.d.ts.map +1 -0
  14. package/dist/constants.js +16 -0
  15. package/dist/constants.js.map +1 -0
  16. package/dist/events.d.ts +153 -0
  17. package/dist/events.d.ts.map +1 -0
  18. package/dist/events.js +154 -0
  19. package/dist/events.js.map +1 -0
  20. package/dist/index.d.ts +11 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +20 -2
  23. package/dist/index.js.map +1 -1
  24. package/dist/memory-provider.d.ts +145 -2
  25. package/dist/memory-provider.d.ts.map +1 -1
  26. package/dist/memory-provider.js +569 -13
  27. package/dist/memory-provider.js.map +1 -1
  28. package/dist/schema/cascade.d.ts +104 -0
  29. package/dist/schema/cascade.d.ts.map +1 -0
  30. package/dist/schema/cascade.js +547 -0
  31. package/dist/schema/cascade.js.map +1 -0
  32. package/dist/schema/dependency-graph.d.ts +133 -0
  33. package/dist/schema/dependency-graph.d.ts.map +1 -0
  34. package/dist/schema/dependency-graph.js +355 -0
  35. package/dist/schema/dependency-graph.js.map +1 -0
  36. package/dist/schema/generation-context.d.ts +202 -0
  37. package/dist/schema/generation-context.d.ts.map +1 -0
  38. package/dist/schema/generation-context.js +393 -0
  39. package/dist/schema/generation-context.js.map +1 -0
  40. package/dist/schema/index.d.ts +201 -0
  41. package/dist/schema/index.d.ts.map +1 -0
  42. package/dist/schema/index.js +1221 -0
  43. package/dist/schema/index.js.map +1 -0
  44. package/dist/schema/parse.d.ts +225 -0
  45. package/dist/schema/parse.d.ts.map +1 -0
  46. package/dist/schema/parse.js +740 -0
  47. package/dist/schema/parse.js.map +1 -0
  48. package/dist/schema/provider.d.ts +177 -0
  49. package/dist/schema/provider.d.ts.map +1 -0
  50. package/dist/schema/provider.js +258 -0
  51. package/dist/schema/provider.js.map +1 -0
  52. package/dist/schema/resolve.d.ts +87 -0
  53. package/dist/schema/resolve.d.ts.map +1 -0
  54. package/dist/schema/resolve.js +549 -0
  55. package/dist/schema/resolve.js.map +1 -0
  56. package/dist/schema/semantic.d.ts +54 -0
  57. package/dist/schema/semantic.d.ts.map +1 -0
  58. package/dist/schema/semantic.js +335 -0
  59. package/dist/schema/semantic.js.map +1 -0
  60. package/dist/schema/types.d.ts +528 -0
  61. package/dist/schema/types.d.ts.map +1 -0
  62. package/dist/schema/types.js +9 -0
  63. package/dist/schema/types.js.map +1 -0
  64. package/dist/schema/union-fallback.d.ts +219 -0
  65. package/dist/schema/union-fallback.d.ts.map +1 -0
  66. package/dist/schema/union-fallback.js +325 -0
  67. package/dist/schema/union-fallback.js.map +1 -0
  68. package/dist/schema/verb-derivation.d.ts +167 -0
  69. package/dist/schema/verb-derivation.d.ts.map +1 -0
  70. package/dist/schema/verb-derivation.js +281 -0
  71. package/dist/schema/verb-derivation.js.map +1 -0
  72. package/dist/schema.d.ts +25 -867
  73. package/dist/schema.d.ts.map +1 -1
  74. package/dist/schema.js +45 -1124
  75. package/dist/schema.js.map +1 -1
  76. package/dist/semantic.d.ts +175 -0
  77. package/dist/semantic.d.ts.map +1 -0
  78. package/dist/semantic.js +338 -0
  79. package/dist/semantic.js.map +1 -0
  80. package/dist/type-guards.d.ts +167 -0
  81. package/dist/type-guards.d.ts.map +1 -0
  82. package/dist/type-guards.js +247 -0
  83. package/dist/type-guards.js.map +1 -0
  84. package/dist/types.d.ts +14 -0
  85. package/dist/types.d.ts.map +1 -1
  86. package/dist/types.js.map +1 -1
  87. package/dist/validation.d.ts +168 -0
  88. package/dist/validation.d.ts.map +1 -0
  89. package/dist/validation.js +667 -0
  90. package/dist/validation.js.map +1 -0
  91. package/package.json +21 -12
  92. package/.turbo/turbo-build.log +0 -5
  93. package/TESTING.md +0 -410
  94. package/TEST_SUMMARY.md +0 -250
  95. package/TODO.md +0 -128
  96. package/src/ai-promise-db.ts +0 -1243
  97. package/src/authorization.ts +0 -1102
  98. package/src/durable-clickhouse.ts +0 -596
  99. package/src/durable-promise.ts +0 -582
  100. package/src/execution-queue.ts +0 -608
  101. package/src/index.test.ts +0 -868
  102. package/src/index.ts +0 -337
  103. package/src/linguistic.ts +0 -404
  104. package/src/memory-provider.test.ts +0 -1036
  105. package/src/memory-provider.ts +0 -1119
  106. package/src/schema.test.ts +0 -1254
  107. package/src/schema.ts +0 -2296
  108. package/src/tests.ts +0 -725
  109. package/src/types.ts +0 -1177
  110. package/test/README.md +0 -153
  111. package/test/edge-cases.test.ts +0 -646
  112. package/test/provider-resolution.test.ts +0 -402
  113. package/tsconfig.json +0 -9
  114. package/vitest.config.ts +0 -19
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Dependency Graph - builds and manages type dependencies for cascade generation
3
+ *
4
+ * This module provides:
5
+ * - Graph construction from parsed schema relationships
6
+ * - Topological sorting for correct generation order
7
+ * - Cycle detection with clear error messages
8
+ * - Parallel group identification for concurrent generation
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import type { ParsedSchema } from '../types.js';
13
+ /**
14
+ * A node in the schema dependency graph representing an entity type
15
+ */
16
+ export interface SchemaDepNode {
17
+ /** Type name */
18
+ name: string;
19
+ /** Types this node depends on (hard dependencies from -> and <-) */
20
+ dependsOn: string[];
21
+ /** Types that depend on this node */
22
+ dependedOnBy: string[];
23
+ /** Types this node softly depends on (from ~> and <~ fuzzy operators) */
24
+ softDependsOn: string[];
25
+ }
26
+ /**
27
+ * An edge in the dependency graph representing a relationship
28
+ */
29
+ export interface SchemaDepEdge {
30
+ /** Source type */
31
+ from: string;
32
+ /** Target type */
33
+ to: string;
34
+ /** Whether this is an array relationship */
35
+ isArray: boolean;
36
+ /** The operator used: ->, ~>, <-, <~ */
37
+ operator: '->' | '~>' | '<-' | '<~';
38
+ /** Field name (may include ? suffix for optional fields) */
39
+ fieldName: string;
40
+ }
41
+ /**
42
+ * The complete dependency graph structure
43
+ */
44
+ export interface SchemaDepGraph {
45
+ /** Map of type name to node */
46
+ nodes: Record<string, SchemaDepNode>;
47
+ /** All edges in the graph */
48
+ edges: SchemaDepEdge[];
49
+ }
50
+ /**
51
+ * Primitive types that don't create dependencies
52
+ */
53
+ export declare const PRIMITIVE_TYPES: Set<string>;
54
+ /**
55
+ * Error thrown when a circular dependency is detected
56
+ */
57
+ export declare class CircularDependencyError extends Error {
58
+ /** The path of types that form the cycle */
59
+ readonly cyclePath: string[];
60
+ constructor(cyclePath: string[]);
61
+ }
62
+ /**
63
+ * Build a dependency graph from a parsed schema
64
+ *
65
+ * @param schema - The parsed schema from parseSchema()
66
+ * @returns The dependency graph with nodes and edges
67
+ */
68
+ export declare function buildDependencyGraph(schema: ParsedSchema): SchemaDepGraph;
69
+ /**
70
+ * Compute topological order for generating types
71
+ *
72
+ * Returns types in order such that dependencies come before dependents.
73
+ * This is essential for cascade generation - we need to create referenced
74
+ * entities before the entities that reference them.
75
+ *
76
+ * @param graph - The dependency graph
77
+ * @param rootType - The root type to start from
78
+ * @param ignoreOptional - If true, optional dependencies don't contribute to ordering
79
+ * @returns Array of type names in generation order (dependencies first, root last)
80
+ * @throws CircularDependencyError if a cycle is detected
81
+ */
82
+ export declare function topologicalSort(graph: SchemaDepGraph, rootType: string, ignoreOptional?: boolean): string[];
83
+ /**
84
+ * Options for cycle detection
85
+ */
86
+ export interface DetectCyclesOptions {
87
+ /** If true, optional dependencies are ignored when detecting cycles */
88
+ ignoreOptional?: boolean;
89
+ }
90
+ /**
91
+ * Detect all cycles in the dependency graph
92
+ *
93
+ * @param graph - The dependency graph to check
94
+ * @param options - Detection options
95
+ * @returns Array of cycles, where each cycle is an array of type names
96
+ * The first and last element of each cycle are the same (showing the loop)
97
+ */
98
+ export declare function detectCycles(graph: SchemaDepGraph, options?: DetectCyclesOptions): string[][];
99
+ /**
100
+ * Get parallel generation groups - types that can be generated concurrently
101
+ *
102
+ * Returns an array of arrays, where each inner array contains types that
103
+ * can be generated in parallel (they have no dependencies on each other).
104
+ * Groups are ordered so that earlier groups must complete before later ones.
105
+ *
106
+ * @param graph - The dependency graph
107
+ * @param rootType - The root type to start from
108
+ * @returns Array of parallel groups, in execution order
109
+ */
110
+ export declare function getParallelGroups(graph: SchemaDepGraph, rootType: string): string[][];
111
+ /**
112
+ * Get all dependencies for a specific type (including transitive)
113
+ *
114
+ * @param graph - The dependency graph
115
+ * @param typeName - The type to get dependencies for
116
+ * @returns Set of all type names this type depends on
117
+ */
118
+ export declare function getAllDependencies(graph: SchemaDepGraph, typeName: string): Set<string>;
119
+ /**
120
+ * Check if the graph has any cycles
121
+ *
122
+ * @param graph - The dependency graph
123
+ * @returns true if cycles exist, false otherwise
124
+ */
125
+ export declare function hasCycles(graph: SchemaDepGraph): boolean;
126
+ /**
127
+ * Get a human-readable visualization of the dependency graph
128
+ *
129
+ * @param graph - The dependency graph
130
+ * @returns Multi-line string showing the graph structure
131
+ */
132
+ export declare function visualizeGraph(graph: SchemaDepGraph): string;
133
+ //# sourceMappingURL=dependency-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../src/schema/dependency-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,aAAa,CAAA;AAM5D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,oEAAoE;IACpE,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,qCAAqC;IACrC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,yEAAyE;IACzE,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAA;IAChB,wCAAwC;IACxC,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IACnC,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACpC,6BAA6B;IAC7B,KAAK,EAAE,aAAa,EAAE,CAAA;CACvB;AAMD;;GAEG;AACH,eAAO,MAAM,eAAe,aAY1B,CAAA;AAMF;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,4CAA4C;IAC5C,SAAgB,SAAS,EAAE,MAAM,EAAE,CAAA;gBAEvB,SAAS,EAAE,MAAM,EAAE;CAMhC;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAyEzE;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,MAAM,EAChB,cAAc,UAAQ,GACrB,MAAM,EAAE,CAyCV;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,mBAAwB,GAChC,MAAM,EAAE,EAAE,CA0CZ;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAgErF;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAiBvF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAqB5D"}
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Dependency Graph - builds and manages type dependencies for cascade generation
3
+ *
4
+ * This module provides:
5
+ * - Graph construction from parsed schema relationships
6
+ * - Topological sorting for correct generation order
7
+ * - Cycle detection with clear error messages
8
+ * - Parallel group identification for concurrent generation
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ // =============================================================================
13
+ // Constants
14
+ // =============================================================================
15
+ /**
16
+ * Primitive types that don't create dependencies
17
+ */
18
+ export const PRIMITIVE_TYPES = new Set([
19
+ 'string',
20
+ 'number',
21
+ 'boolean',
22
+ 'date',
23
+ 'datetime',
24
+ 'json',
25
+ 'markdown',
26
+ 'url',
27
+ 'email',
28
+ 'object',
29
+ 'array',
30
+ ]);
31
+ // =============================================================================
32
+ // Errors
33
+ // =============================================================================
34
+ /**
35
+ * Error thrown when a circular dependency is detected
36
+ */
37
+ export class CircularDependencyError extends Error {
38
+ /** The path of types that form the cycle */
39
+ cyclePath;
40
+ constructor(cyclePath) {
41
+ const cycleStr = cyclePath.join(' -> ');
42
+ super(`Circular dependency detected: ${cycleStr}`);
43
+ this.name = 'CircularDependencyError';
44
+ this.cyclePath = cyclePath;
45
+ }
46
+ }
47
+ // =============================================================================
48
+ // Graph Construction
49
+ // =============================================================================
50
+ /**
51
+ * Build a dependency graph from a parsed schema
52
+ *
53
+ * @param schema - The parsed schema from parseSchema()
54
+ * @returns The dependency graph with nodes and edges
55
+ */
56
+ export function buildDependencyGraph(schema) {
57
+ const nodes = {};
58
+ const edges = [];
59
+ // Initialize nodes for all entity types
60
+ for (const [typeName] of schema.entities) {
61
+ nodes[typeName] = {
62
+ name: typeName,
63
+ dependsOn: [],
64
+ dependedOnBy: [],
65
+ softDependsOn: [],
66
+ };
67
+ }
68
+ // Process fields to build edges
69
+ for (const [typeName, entity] of schema.entities) {
70
+ for (const [fieldName, field] of entity.fields) {
71
+ // Skip non-relation fields
72
+ if (!field.isRelation || !field.relatedType)
73
+ continue;
74
+ // Skip primitive types
75
+ if (PRIMITIVE_TYPES.has(field.relatedType))
76
+ continue;
77
+ const target = field.relatedType;
78
+ const operator = field.operator;
79
+ const isArray = field.isArray ?? false;
80
+ const isSoft = operator === '~>' || operator === '<~';
81
+ const isBackward = operator === '<-' || operator === '<~';
82
+ const isOptionalField = field.isOptional;
83
+ // Add edge (mark optional in fieldName for cycle detection)
84
+ edges.push({
85
+ from: typeName,
86
+ to: target,
87
+ isArray,
88
+ operator: operator ?? '->',
89
+ fieldName: isOptionalField ? `${fieldName}?` : fieldName,
90
+ });
91
+ // Ensure target node exists (might be external/not in schema)
92
+ if (!nodes[target]) {
93
+ nodes[target] = {
94
+ name: target,
95
+ dependsOn: [],
96
+ dependedOnBy: [],
97
+ softDependsOn: [],
98
+ };
99
+ }
100
+ // Determine dependency type based on operator
101
+ const sourceNode = nodes[typeName];
102
+ const targetNode = nodes[target];
103
+ if (isSoft || isOptionalField) {
104
+ // Soft dependency (fuzzy search) or optional field
105
+ if (!sourceNode.softDependsOn.includes(target)) {
106
+ sourceNode.softDependsOn.push(target);
107
+ }
108
+ }
109
+ else if (!isBackward) {
110
+ // Hard dependency for forward exact references (->)
111
+ // Backward references (<-) don't create generation dependencies
112
+ // because the parent creates the child, not vice versa
113
+ if (!sourceNode.dependsOn.includes(target)) {
114
+ sourceNode.dependsOn.push(target);
115
+ }
116
+ if (!targetNode.dependedOnBy.includes(typeName)) {
117
+ targetNode.dependedOnBy.push(typeName);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ return { nodes, edges };
123
+ }
124
+ // =============================================================================
125
+ // Topological Sort
126
+ // =============================================================================
127
+ /**
128
+ * Compute topological order for generating types
129
+ *
130
+ * Returns types in order such that dependencies come before dependents.
131
+ * This is essential for cascade generation - we need to create referenced
132
+ * entities before the entities that reference them.
133
+ *
134
+ * @param graph - The dependency graph
135
+ * @param rootType - The root type to start from
136
+ * @param ignoreOptional - If true, optional dependencies don't contribute to ordering
137
+ * @returns Array of type names in generation order (dependencies first, root last)
138
+ * @throws CircularDependencyError if a cycle is detected
139
+ */
140
+ export function topologicalSort(graph, rootType, ignoreOptional = false) {
141
+ const visited = new Set();
142
+ const visiting = new Set();
143
+ const result = [];
144
+ function visit(typeName, path) {
145
+ if (visited.has(typeName))
146
+ return;
147
+ if (visiting.has(typeName)) {
148
+ // Circular dependency detected
149
+ const cycleStart = path.indexOf(typeName);
150
+ const cyclePath = [...path.slice(cycleStart), typeName];
151
+ throw new CircularDependencyError(cyclePath);
152
+ }
153
+ visiting.add(typeName);
154
+ const node = graph.nodes[typeName];
155
+ if (node) {
156
+ for (const dep of node.dependsOn) {
157
+ // Check if this dependency is optional and should be ignored
158
+ if (ignoreOptional) {
159
+ const edge = graph.edges.find((e) => e.from === typeName && e.to === dep);
160
+ if (edge && graph.nodes[dep]) {
161
+ // Check if field has optional marker
162
+ const fieldIsOptional = edge.fieldName.endsWith('?');
163
+ if (fieldIsOptional)
164
+ continue;
165
+ }
166
+ }
167
+ visit(dep, [...path, typeName]);
168
+ }
169
+ }
170
+ visiting.delete(typeName);
171
+ visited.add(typeName);
172
+ result.push(typeName);
173
+ }
174
+ visit(rootType, []);
175
+ return result;
176
+ }
177
+ /**
178
+ * Detect all cycles in the dependency graph
179
+ *
180
+ * @param graph - The dependency graph to check
181
+ * @param options - Detection options
182
+ * @returns Array of cycles, where each cycle is an array of type names
183
+ * The first and last element of each cycle are the same (showing the loop)
184
+ */
185
+ export function detectCycles(graph, options = {}) {
186
+ const cycles = [];
187
+ const visited = new Set();
188
+ const recStack = new Set();
189
+ function dfs(node, path) {
190
+ if (recStack.has(node)) {
191
+ // Found a cycle
192
+ const cycleStart = path.indexOf(node);
193
+ const cycle = [...path.slice(cycleStart), node];
194
+ cycles.push(cycle);
195
+ return;
196
+ }
197
+ if (visited.has(node))
198
+ return;
199
+ visited.add(node);
200
+ recStack.add(node);
201
+ const nodeInfo = graph.nodes[node];
202
+ if (nodeInfo) {
203
+ for (const dep of nodeInfo.dependsOn) {
204
+ // Skip optional dependencies if configured
205
+ if (options.ignoreOptional) {
206
+ const edge = graph.edges.find((e) => e.from === node && e.to === dep);
207
+ if (edge) {
208
+ // Check if fieldName ends with ?
209
+ if (edge.fieldName.endsWith('?'))
210
+ continue;
211
+ }
212
+ }
213
+ dfs(dep, [...path, node]);
214
+ }
215
+ }
216
+ recStack.delete(node);
217
+ }
218
+ for (const node of Object.keys(graph.nodes)) {
219
+ dfs(node, []);
220
+ }
221
+ return cycles;
222
+ }
223
+ // =============================================================================
224
+ // Parallel Groups
225
+ // =============================================================================
226
+ /**
227
+ * Get parallel generation groups - types that can be generated concurrently
228
+ *
229
+ * Returns an array of arrays, where each inner array contains types that
230
+ * can be generated in parallel (they have no dependencies on each other).
231
+ * Groups are ordered so that earlier groups must complete before later ones.
232
+ *
233
+ * @param graph - The dependency graph
234
+ * @param rootType - The root type to start from
235
+ * @returns Array of parallel groups, in execution order
236
+ */
237
+ export function getParallelGroups(graph, rootType) {
238
+ const inDegree = {};
239
+ const relevantNodes = new Set();
240
+ // First, find all nodes reachable from root
241
+ function findReachable(node) {
242
+ if (relevantNodes.has(node))
243
+ return;
244
+ relevantNodes.add(node);
245
+ const nodeInfo = graph.nodes[node];
246
+ if (nodeInfo) {
247
+ for (const dep of nodeInfo.dependsOn) {
248
+ findReachable(dep);
249
+ }
250
+ }
251
+ }
252
+ findReachable(rootType);
253
+ // Initialize in-degrees for relevant nodes only
254
+ for (const node of relevantNodes) {
255
+ inDegree[node] = 0;
256
+ }
257
+ // Count incoming edges (dependencies)
258
+ for (const node of relevantNodes) {
259
+ const nodeInfo = graph.nodes[node];
260
+ if (nodeInfo) {
261
+ for (const dep of nodeInfo.dependsOn) {
262
+ if (relevantNodes.has(dep)) {
263
+ const currentDegree = inDegree[node] ?? 0;
264
+ inDegree[node] = currentDegree + 1;
265
+ }
266
+ }
267
+ }
268
+ }
269
+ const groups = [];
270
+ while (Object.keys(inDegree).length > 0) {
271
+ // Find all nodes with in-degree 0 (no remaining dependencies)
272
+ const group = Object.entries(inDegree)
273
+ .filter(([, degree]) => degree === 0)
274
+ .map(([node]) => node);
275
+ if (group.length === 0) {
276
+ // Remaining nodes have cycles - break to avoid infinite loop
277
+ break;
278
+ }
279
+ groups.push(group);
280
+ // Remove processed nodes and update in-degrees
281
+ for (const node of group) {
282
+ delete inDegree[node];
283
+ // Reduce in-degree of nodes that depend on this node
284
+ for (const dependent of graph.nodes[node]?.dependedOnBy ?? []) {
285
+ if (dependent in inDegree) {
286
+ const currentDegree = inDegree[dependent] ?? 0;
287
+ inDegree[dependent] = currentDegree - 1;
288
+ }
289
+ }
290
+ }
291
+ }
292
+ return groups;
293
+ }
294
+ // =============================================================================
295
+ // Utility Functions
296
+ // =============================================================================
297
+ /**
298
+ * Get all dependencies for a specific type (including transitive)
299
+ *
300
+ * @param graph - The dependency graph
301
+ * @param typeName - The type to get dependencies for
302
+ * @returns Set of all type names this type depends on
303
+ */
304
+ export function getAllDependencies(graph, typeName) {
305
+ const deps = new Set();
306
+ function collect(node) {
307
+ const nodeInfo = graph.nodes[node];
308
+ if (!nodeInfo)
309
+ return;
310
+ for (const dep of nodeInfo.dependsOn) {
311
+ if (!deps.has(dep)) {
312
+ deps.add(dep);
313
+ collect(dep);
314
+ }
315
+ }
316
+ }
317
+ collect(typeName);
318
+ return deps;
319
+ }
320
+ /**
321
+ * Check if the graph has any cycles
322
+ *
323
+ * @param graph - The dependency graph
324
+ * @returns true if cycles exist, false otherwise
325
+ */
326
+ export function hasCycles(graph) {
327
+ return detectCycles(graph).length > 0;
328
+ }
329
+ /**
330
+ * Get a human-readable visualization of the dependency graph
331
+ *
332
+ * @param graph - The dependency graph
333
+ * @returns Multi-line string showing the graph structure
334
+ */
335
+ export function visualizeGraph(graph) {
336
+ const lines = ['Dependency Graph:', ''];
337
+ for (const [name, node] of Object.entries(graph.nodes)) {
338
+ lines.push(`${name}:`);
339
+ if (node.dependsOn.length > 0) {
340
+ lines.push(` -> ${node.dependsOn.join(', ')} (hard deps)`);
341
+ }
342
+ if (node.softDependsOn.length > 0) {
343
+ lines.push(` ~> ${node.softDependsOn.join(', ')} (soft deps)`);
344
+ }
345
+ if (node.dependedOnBy.length > 0) {
346
+ lines.push(` <- ${node.dependedOnBy.join(', ')} (depended on by)`);
347
+ }
348
+ if (node.dependsOn.length === 0 && node.softDependsOn.length === 0) {
349
+ lines.push(` (no dependencies)`);
350
+ }
351
+ lines.push('');
352
+ }
353
+ return lines.join('\n');
354
+ }
355
+ //# sourceMappingURL=dependency-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.js","sourceRoot":"","sources":["../../src/schema/dependency-graph.ts"],"names":[],"mappings":"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"}