@objectql/core 4.2.0 → 4.2.1

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 (115) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +23 -0
  3. package/dist/app.d.ts +61 -52
  4. package/dist/app.js +101 -435
  5. package/dist/app.js.map +1 -1
  6. package/dist/index.d.ts +4 -18
  7. package/dist/index.js +11 -18
  8. package/dist/index.js.map +1 -1
  9. package/dist/kernel-factory.d.ts +38 -0
  10. package/dist/kernel-factory.js +38 -0
  11. package/dist/kernel-factory.js.map +1 -0
  12. package/dist/plugin.d.ts +9 -16
  13. package/dist/plugin.js +71 -48
  14. package/dist/plugin.js.map +1 -1
  15. package/dist/repository.d.ts +4 -31
  16. package/dist/repository.js +7 -283
  17. package/dist/repository.js.map +1 -1
  18. package/dist/util.js +4 -2
  19. package/dist/util.js.map +1 -1
  20. package/package.json +12 -11
  21. package/src/app.ts +157 -539
  22. package/src/index.ts +8 -40
  23. package/src/kernel-factory.ts +47 -0
  24. package/src/plugin.ts +77 -85
  25. package/src/repository.ts +4 -320
  26. package/src/util.ts +5 -3
  27. package/test/__mocks__/@objectstack/core.ts +250 -1
  28. package/test/__mocks__/@objectstack/objectql.ts +127 -0
  29. package/test/__mocks__/@objectstack/runtime.ts +14 -5
  30. package/test/introspection.test.ts +1 -1
  31. package/test/mock-driver.ts +5 -5
  32. package/test/optimizations.test.ts +2 -2
  33. package/test/plugin-integration.test.ts +1 -3
  34. package/test/utils.ts +6 -6
  35. package/tsconfig.json +3 -1
  36. package/tsconfig.tsbuildinfo +1 -1
  37. package/dist/ai/index.d.ts +0 -8
  38. package/dist/ai/index.js +0 -25
  39. package/dist/ai/index.js.map +0 -1
  40. package/dist/ai/registry.d.ts +0 -23
  41. package/dist/ai/registry.js +0 -78
  42. package/dist/ai/registry.js.map +0 -1
  43. package/dist/gateway.d.ts +0 -37
  44. package/dist/gateway.js +0 -93
  45. package/dist/gateway.js.map +0 -1
  46. package/dist/optimizations/CompiledHookManager.d.ts +0 -56
  47. package/dist/optimizations/CompiledHookManager.js +0 -170
  48. package/dist/optimizations/CompiledHookManager.js.map +0 -1
  49. package/dist/optimizations/DependencyGraph.d.ts +0 -82
  50. package/dist/optimizations/DependencyGraph.js +0 -211
  51. package/dist/optimizations/DependencyGraph.js.map +0 -1
  52. package/dist/optimizations/GlobalConnectionPool.d.ts +0 -89
  53. package/dist/optimizations/GlobalConnectionPool.js +0 -193
  54. package/dist/optimizations/GlobalConnectionPool.js.map +0 -1
  55. package/dist/optimizations/LazyMetadataLoader.d.ts +0 -75
  56. package/dist/optimizations/LazyMetadataLoader.js +0 -149
  57. package/dist/optimizations/LazyMetadataLoader.js.map +0 -1
  58. package/dist/optimizations/OptimizedMetadataRegistry.d.ts +0 -26
  59. package/dist/optimizations/OptimizedMetadataRegistry.js +0 -117
  60. package/dist/optimizations/OptimizedMetadataRegistry.js.map +0 -1
  61. package/dist/optimizations/OptimizedValidationEngine.d.ts +0 -73
  62. package/dist/optimizations/OptimizedValidationEngine.js +0 -141
  63. package/dist/optimizations/OptimizedValidationEngine.js.map +0 -1
  64. package/dist/optimizations/QueryCompiler.d.ts +0 -51
  65. package/dist/optimizations/QueryCompiler.js +0 -216
  66. package/dist/optimizations/QueryCompiler.js.map +0 -1
  67. package/dist/optimizations/SQLQueryOptimizer.d.ts +0 -96
  68. package/dist/optimizations/SQLQueryOptimizer.js +0 -265
  69. package/dist/optimizations/SQLQueryOptimizer.js.map +0 -1
  70. package/dist/optimizations/index.d.ts +0 -32
  71. package/dist/optimizations/index.js +0 -44
  72. package/dist/optimizations/index.js.map +0 -1
  73. package/dist/protocol.d.ts +0 -191
  74. package/dist/protocol.js +0 -272
  75. package/dist/protocol.js.map +0 -1
  76. package/dist/query/filter-translator.d.ts +0 -24
  77. package/dist/query/filter-translator.js +0 -38
  78. package/dist/query/filter-translator.js.map +0 -1
  79. package/dist/query/index.d.ts +0 -22
  80. package/dist/query/index.js +0 -39
  81. package/dist/query/index.js.map +0 -1
  82. package/dist/query/query-analyzer.d.ts +0 -186
  83. package/dist/query/query-analyzer.js +0 -348
  84. package/dist/query/query-analyzer.js.map +0 -1
  85. package/dist/query/query-builder.d.ts +0 -27
  86. package/dist/query/query-builder.js +0 -69
  87. package/dist/query/query-builder.js.map +0 -1
  88. package/dist/query/query-service.d.ts +0 -151
  89. package/dist/query/query-service.js +0 -272
  90. package/dist/query/query-service.js.map +0 -1
  91. package/src/ai/index.ts +0 -9
  92. package/src/ai/registry.ts +0 -81
  93. package/src/gateway.ts +0 -105
  94. package/src/optimizations/CompiledHookManager.ts +0 -193
  95. package/src/optimizations/DependencyGraph.ts +0 -255
  96. package/src/optimizations/GlobalConnectionPool.ts +0 -251
  97. package/src/optimizations/LazyMetadataLoader.ts +0 -180
  98. package/src/optimizations/OptimizedMetadataRegistry.ts +0 -132
  99. package/src/optimizations/OptimizedValidationEngine.ts +0 -172
  100. package/src/optimizations/QueryCompiler.ts +0 -242
  101. package/src/optimizations/SQLQueryOptimizer.ts +0 -329
  102. package/src/optimizations/index.ts +0 -34
  103. package/src/protocol.ts +0 -304
  104. package/src/query/filter-translator.ts +0 -41
  105. package/src/query/index.ts +0 -24
  106. package/src/query/query-analyzer.ts +0 -532
  107. package/src/query/query-builder.ts +0 -64
  108. package/src/query/query-service.ts +0 -397
  109. package/test/ai-registry.test.ts +0 -42
  110. package/test/app.test.ts +0 -578
  111. package/test/filter-syntax.test.ts +0 -233
  112. package/test/gateway.test.ts +0 -88
  113. package/test/protocol.test.ts +0 -143
  114. package/test/repository-validation.test.ts +0 -351
  115. package/test/repository.test.ts +0 -151
package/dist/gateway.d.ts DELETED
@@ -1,37 +0,0 @@
1
- /**
2
- * ObjectQL
3
- * Copyright (c) 2026-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
- import { ApiRequest, ApiResponse, GatewayProtocol, Logger } from '@objectql/types';
9
- export type RequestTransformer = (request: ApiRequest) => Promise<ApiRequest>;
10
- export type ResponseTransformer = (response: ApiResponse) => Promise<ApiResponse>;
11
- /**
12
- * Unified API Gateway
13
- * Routtes generic API requests to specific protocol implementations
14
- */
15
- export declare class ObjectGateway {
16
- private protocols;
17
- private requestTransforms;
18
- private responseTransforms;
19
- private logger;
20
- constructor(protocols?: GatewayProtocol[], logger?: Logger);
21
- /**
22
- * Register a new protocol handler
23
- */
24
- registerProtocol(protocol: GatewayProtocol): void;
25
- /**
26
- * Add a request transformer (middleware)
27
- */
28
- addRequestTransform(transformer: RequestTransformer): void;
29
- /**
30
- * Add a response transformer (middleware)
31
- */
32
- addResponseTransform(transformer: ResponseTransformer): void;
33
- /**
34
- * Handle an incoming API request
35
- */
36
- handle(request: ApiRequest): Promise<ApiResponse>;
37
- }
package/dist/gateway.js DELETED
@@ -1,93 +0,0 @@
1
- "use strict";
2
- /**
3
- * ObjectQL
4
- * Copyright (c) 2026-present ObjectStack Inc.
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.ObjectGateway = void 0;
11
- const types_1 = require("@objectql/types");
12
- /**
13
- * Unified API Gateway
14
- * Routtes generic API requests to specific protocol implementations
15
- */
16
- class ObjectGateway {
17
- constructor(protocols = [], logger) {
18
- this.protocols = [];
19
- this.requestTransforms = [];
20
- this.responseTransforms = [];
21
- this.protocols = protocols;
22
- this.logger = logger !== null && logger !== void 0 ? logger : new types_1.ConsoleLogger({ name: '@objectql/gateway', level: 'info' });
23
- }
24
- /**
25
- * Register a new protocol handler
26
- */
27
- registerProtocol(protocol) {
28
- this.protocols.push(protocol);
29
- }
30
- /**
31
- * Add a request transformer (middleware)
32
- */
33
- addRequestTransform(transformer) {
34
- this.requestTransforms.push(transformer);
35
- }
36
- /**
37
- * Add a response transformer (middleware)
38
- */
39
- addResponseTransform(transformer) {
40
- this.responseTransforms.push(transformer);
41
- }
42
- /**
43
- * Handle an incoming API request
44
- */
45
- async handle(request) {
46
- let req = request;
47
- // 1. Apply Request Transforms
48
- for (const transform of this.requestTransforms) {
49
- req = await transform(req);
50
- }
51
- // 2. Find matching protocol
52
- const protocol = this.protocols.find(p => p.route(req));
53
- if (!protocol) {
54
- return {
55
- status: 404,
56
- headers: { 'Content-Type': 'application/json' },
57
- body: {
58
- error: {
59
- code: 'PROTOCOL_NOT_FOUND',
60
- message: `No protocol found to handle path: ${req.path}`
61
- }
62
- }
63
- };
64
- }
65
- let response;
66
- // 3. Delegate to protocol
67
- try {
68
- response = await protocol.handle(req);
69
- }
70
- catch (error) {
71
- this.logger.error(`Error in ${protocol.name}`, error, {
72
- protocol: protocol.name,
73
- });
74
- response = {
75
- status: 500,
76
- headers: { 'Content-Type': 'application/json' },
77
- body: {
78
- error: {
79
- code: 'INTERNAL_ERROR',
80
- message: error.message || 'Internal Gateway Error'
81
- }
82
- }
83
- };
84
- }
85
- // 4. Apply Response Transforms
86
- for (const transform of this.responseTransforms) {
87
- response = await transform(response);
88
- }
89
- return response;
90
- }
91
- }
92
- exports.ObjectGateway = ObjectGateway;
93
- //# sourceMappingURL=gateway.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,2CAAkG;AAKlG;;;GAGG;AACH,MAAa,aAAa;IAMtB,YAAY,YAA+B,EAAE,EAAE,MAAe;QALtD,cAAS,GAAsB,EAAE,CAAC;QAClC,sBAAiB,GAAyB,EAAE,CAAC;QAC7C,uBAAkB,GAA0B,EAAE,CAAC;QAInD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,qBAAa,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAyB;QACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,WAA+B;QAC/C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,WAAgC;QACjD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAmB;QAC5B,IAAI,GAAG,GAAG,OAAO,CAAC;QAElB,8BAA8B;QAC9B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC7C,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAED,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAExD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO;gBACH,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE;oBACF,KAAK,EAAE;wBACH,IAAI,EAAE,oBAAoB;wBAC1B,OAAO,EAAE,qCAAqC,GAAG,CAAC,IAAI,EAAE;qBAC3D;iBACJ;aACJ,CAAC;QACN,CAAC;QAED,IAAI,QAAqB,CAAC;QAE1B,0BAA0B;QAC1B,IAAI,CAAC;YACD,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAc,EAAE;gBAC3D,QAAQ,EAAE,QAAQ,CAAC,IAAI;aAC1B,CAAC,CAAC;YACH,QAAQ,GAAG;gBACP,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE;oBACF,KAAK,EAAE;wBACH,IAAI,EAAE,gBAAgB;wBACtB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,wBAAwB;qBACrD;iBACJ;aACJ,CAAC;QACN,CAAC;QAED,+BAA+B;QAC/B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9C,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AAvFD,sCAuFC"}
@@ -1,56 +0,0 @@
1
- /**
2
- * ObjectQL
3
- * Copyright (c) 2026-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
- /**
9
- * Hook definition
10
- */
11
- export interface Hook {
12
- pattern: string;
13
- handler: (context: any) => Promise<void> | void;
14
- packageName?: string;
15
- priority?: number;
16
- }
17
- /**
18
- * Compiled Hook Manager
19
- *
20
- * Improvement: Pre-compiles hook pipelines by event pattern at registration time.
21
- * No runtime pattern matching required.
22
- *
23
- * Expected: 5x faster hook execution, parallel async support
24
- */
25
- export declare class CompiledHookManager {
26
- private pipelines;
27
- private allHooks;
28
- private logger;
29
- /**
30
- * Expand a pattern like "before*" to all matching events
31
- */
32
- private expandPattern;
33
- /**
34
- * Register a hook - pre-groups by event pattern
35
- */
36
- registerHook(event: string, objectName: string, handler: any, packageName?: string): void;
37
- /**
38
- * Run hooks for an event - direct lookup, no pattern matching
39
- */
40
- runHooks(event: string, objectName: string, context: any): Promise<void>;
41
- /**
42
- * Remove all hooks from a package
43
- */
44
- removePackage(packageName: string): void;
45
- /**
46
- * Clear all hooks
47
- */
48
- clear(): void;
49
- /**
50
- * Get statistics about registered hooks
51
- */
52
- getStats(): {
53
- totalHooks: number;
54
- totalPipelines: number;
55
- };
56
- }
@@ -1,170 +0,0 @@
1
- "use strict";
2
- /**
3
- * ObjectQL
4
- * Copyright (c) 2026-present ObjectStack Inc.
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.CompiledHookManager = void 0;
11
- const types_1 = require("@objectql/types");
12
- /**
13
- * Compiled Hook Manager
14
- *
15
- * Improvement: Pre-compiles hook pipelines by event pattern at registration time.
16
- * No runtime pattern matching required.
17
- *
18
- * Expected: 5x faster hook execution, parallel async support
19
- */
20
- class CompiledHookManager {
21
- constructor() {
22
- // Direct event -> hooks mapping (no pattern matching at runtime)
23
- this.pipelines = new Map();
24
- // Keep track of all registered hooks for management
25
- this.allHooks = new Map();
26
- // Structured logger
27
- this.logger = new types_1.ConsoleLogger({ name: '@objectql/hook-manager', level: 'warn' });
28
- }
29
- /**
30
- * Expand a pattern like "before*" to all matching events
31
- */
32
- expandPattern(pattern) {
33
- // Common event patterns
34
- const eventTypes = [
35
- 'beforeCreate', 'afterCreate',
36
- 'beforeUpdate', 'afterUpdate',
37
- 'beforeDelete', 'afterDelete',
38
- 'beforeFind', 'afterFind',
39
- 'beforeCount', 'afterCount'
40
- ];
41
- // Handle wildcards
42
- if (pattern === '*') {
43
- return eventTypes;
44
- }
45
- if (pattern.includes('*')) {
46
- // Use global replace to handle all occurrences of *
47
- const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
48
- return eventTypes.filter(event => regex.test(event));
49
- }
50
- // Exact match
51
- return [pattern];
52
- }
53
- /**
54
- * Register a hook - pre-groups by event pattern
55
- */
56
- registerHook(event, objectName, handler, packageName) {
57
- const hook = {
58
- pattern: `${event}:${objectName}`,
59
- handler,
60
- packageName,
61
- priority: 0
62
- };
63
- // Store in all hooks registry
64
- const hookId = `${event}:${objectName}:${Date.now()}`;
65
- this.allHooks.set(hookId, hook);
66
- // Expand event patterns
67
- const events = this.expandPattern(event);
68
- // Handle wildcard object names
69
- if (objectName === '*') {
70
- for (const concreteEvent of events) {
71
- // Register for all potential object names
72
- // Since we don't know all object names upfront, we keep a special '*' pipeline
73
- const wildcardKey = `${concreteEvent}:*`;
74
- if (!this.pipelines.has(wildcardKey)) {
75
- this.pipelines.set(wildcardKey, []);
76
- }
77
- this.pipelines.get(wildcardKey).push(hook);
78
- }
79
- }
80
- else {
81
- // Pre-group hooks by concrete event names (only for non-wildcard objects)
82
- for (const concreteEvent of events) {
83
- const key = `${concreteEvent}:${objectName}`;
84
- if (!this.pipelines.has(key)) {
85
- this.pipelines.set(key, []);
86
- }
87
- this.pipelines.get(key).push(hook);
88
- }
89
- }
90
- }
91
- /**
92
- * Run hooks for an event - direct lookup, no pattern matching
93
- */
94
- async runHooks(event, objectName, context) {
95
- const key = `${event}:${objectName}`;
96
- const wildcardKey = `${event}:*`;
97
- // Collect all applicable hooks
98
- const hooks = [];
99
- // Add object-specific hooks
100
- const objectHooks = this.pipelines.get(key);
101
- if (objectHooks) {
102
- hooks.push(...objectHooks);
103
- }
104
- // Add wildcard hooks
105
- const wildcardHooks = this.pipelines.get(wildcardKey);
106
- if (wildcardHooks) {
107
- hooks.push(...wildcardHooks);
108
- }
109
- if (hooks.length === 0) {
110
- return;
111
- }
112
- // Sort by priority (higher priority first)
113
- hooks.sort((a, b) => (b.priority || 0) - (a.priority || 0));
114
- // Execute hooks in parallel for better performance
115
- // Note: If order matters, change to sequential execution
116
- await Promise.all(hooks.map(hook => {
117
- try {
118
- return Promise.resolve(hook.handler(context));
119
- }
120
- catch (error) {
121
- this.logger.error(`Hook execution failed for ${event}:${objectName}`, error, {
122
- event,
123
- objectName,
124
- });
125
- return Promise.resolve();
126
- }
127
- }));
128
- }
129
- /**
130
- * Remove all hooks from a package
131
- */
132
- removePackage(packageName) {
133
- // Remove from all hooks registry
134
- const hooksToRemove = [];
135
- for (const [hookId, hook] of this.allHooks.entries()) {
136
- if (hook.packageName === packageName) {
137
- hooksToRemove.push(hookId);
138
- }
139
- }
140
- hooksToRemove.forEach(id => this.allHooks.delete(id));
141
- // Remove from pipelines
142
- for (const [key, hooks] of this.pipelines.entries()) {
143
- const filtered = hooks.filter(h => h.packageName !== packageName);
144
- if (filtered.length === 0) {
145
- this.pipelines.delete(key);
146
- }
147
- else {
148
- this.pipelines.set(key, filtered);
149
- }
150
- }
151
- }
152
- /**
153
- * Clear all hooks
154
- */
155
- clear() {
156
- this.pipelines.clear();
157
- this.allHooks.clear();
158
- }
159
- /**
160
- * Get statistics about registered hooks
161
- */
162
- getStats() {
163
- return {
164
- totalHooks: this.allHooks.size,
165
- totalPipelines: this.pipelines.size
166
- };
167
- }
168
- }
169
- exports.CompiledHookManager = CompiledHookManager;
170
- //# sourceMappingURL=CompiledHookManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CompiledHookManager.js","sourceRoot":"","sources":["../../src/optimizations/CompiledHookManager.ts"],"names":[],"mappings":"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"}
@@ -1,82 +0,0 @@
1
- /**
2
- * ObjectQL
3
- * Copyright (c) 2026-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
- /**
9
- * Dependency type
10
- */
11
- export type DependencyType = 'lookup' | 'master_detail' | 'foreign_key';
12
- /**
13
- * Edge in the dependency graph
14
- */
15
- export interface DependencyEdge {
16
- from: string;
17
- to: string;
18
- type: DependencyType;
19
- fieldName: string;
20
- }
21
- /**
22
- * Smart Dependency Graph
23
- *
24
- * Improvement: DAG-based dependency resolution for cascading operations.
25
- * Automatically handles cascade deletes and updates in correct order.
26
- *
27
- * Expected: Eliminates manual cascade logic, prevents orphaned data
28
- */
29
- export declare class DependencyGraph {
30
- private graph;
31
- private edges;
32
- /**
33
- * Add an object to the graph
34
- */
35
- addObject(objectName: string): void;
36
- /**
37
- * Add a dependency edge
38
- * from -> to means "to depends on from"
39
- */
40
- addDependency(from: string, to: string, type: DependencyType, fieldName: string): void;
41
- /**
42
- * Get all objects that depend on the given object
43
- */
44
- getDependents(objectName: string): string[];
45
- /**
46
- * Topological sort using DFS
47
- */
48
- topologicalSort(objects: string[]): string[];
49
- /**
50
- * Check for circular dependencies
51
- */
52
- hasCircularDependency(): boolean;
53
- /**
54
- * Get cascade delete order for an object
55
- * Returns objects in the order they should be deleted
56
- */
57
- getCascadeDeleteOrder(objectName: string): string[];
58
- /**
59
- * Automatically cascade delete based on dependency graph
60
- *
61
- * @param objectName The object type being deleted
62
- * @param id The ID of the record being deleted
63
- * @param deleteFunc Function to delete a record: (objectName, id) => Promise<void>
64
- */
65
- cascadeDelete(objectName: string, id: string, deleteFunc: (objName: string, recordId: string) => Promise<void>): Promise<void>;
66
- /**
67
- * Get graph statistics
68
- */
69
- getStats(): {
70
- totalObjects: number;
71
- totalDependencies: number;
72
- hasCircularDependency: boolean;
73
- };
74
- /**
75
- * Clear the graph
76
- */
77
- clear(): void;
78
- /**
79
- * Export graph as DOT format for visualization
80
- */
81
- toDot(): string;
82
- }
@@ -1,211 +0,0 @@
1
- "use strict";
2
- /**
3
- * ObjectQL
4
- * Copyright (c) 2026-present ObjectStack Inc.
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.DependencyGraph = void 0;
11
- /**
12
- * Smart Dependency Graph
13
- *
14
- * Improvement: DAG-based dependency resolution for cascading operations.
15
- * Automatically handles cascade deletes and updates in correct order.
16
- *
17
- * Expected: Eliminates manual cascade logic, prevents orphaned data
18
- */
19
- class DependencyGraph {
20
- constructor() {
21
- // Adjacency list: object -> list of dependent objects
22
- this.graph = new Map();
23
- // Store edge metadata
24
- this.edges = new Map();
25
- }
26
- /**
27
- * Add an object to the graph
28
- */
29
- addObject(objectName) {
30
- if (!this.graph.has(objectName)) {
31
- this.graph.set(objectName, new Set());
32
- }
33
- if (!this.edges.has(objectName)) {
34
- this.edges.set(objectName, []);
35
- }
36
- }
37
- /**
38
- * Add a dependency edge
39
- * from -> to means "to depends on from"
40
- */
41
- addDependency(from, to, type, fieldName) {
42
- this.addObject(from);
43
- this.addObject(to);
44
- // Add edge
45
- this.graph.get(from).add(to);
46
- // Store edge metadata
47
- const edge = { from, to, type, fieldName };
48
- const fromEdges = this.edges.get(from) || [];
49
- fromEdges.push(edge);
50
- this.edges.set(from, fromEdges);
51
- }
52
- /**
53
- * Get all objects that depend on the given object
54
- */
55
- getDependents(objectName) {
56
- return Array.from(this.graph.get(objectName) || []);
57
- }
58
- /**
59
- * Topological sort using DFS
60
- */
61
- topologicalSort(objects) {
62
- const visited = new Set();
63
- const stack = [];
64
- const dfs = (node) => {
65
- if (visited.has(node))
66
- return;
67
- visited.add(node);
68
- const dependents = this.graph.get(node);
69
- if (dependents) {
70
- for (const dependent of dependents) {
71
- if (objects.includes(dependent)) {
72
- dfs(dependent);
73
- }
74
- }
75
- }
76
- stack.push(node);
77
- };
78
- for (const obj of objects) {
79
- dfs(obj);
80
- }
81
- return stack;
82
- }
83
- /**
84
- * Check for circular dependencies
85
- */
86
- hasCircularDependency() {
87
- const visited = new Set();
88
- const recursionStack = new Set();
89
- const hasCycle = (node) => {
90
- visited.add(node);
91
- recursionStack.add(node);
92
- const dependents = this.graph.get(node);
93
- if (dependents) {
94
- for (const dependent of dependents) {
95
- if (!visited.has(dependent)) {
96
- if (hasCycle(dependent)) {
97
- return true;
98
- }
99
- }
100
- else if (recursionStack.has(dependent)) {
101
- return true;
102
- }
103
- }
104
- }
105
- recursionStack.delete(node);
106
- return false;
107
- };
108
- for (const node of this.graph.keys()) {
109
- if (!visited.has(node)) {
110
- if (hasCycle(node)) {
111
- return true;
112
- }
113
- }
114
- }
115
- return false;
116
- }
117
- /**
118
- * Get cascade delete order for an object
119
- * Returns objects in the order they should be deleted
120
- */
121
- getCascadeDeleteOrder(objectName) {
122
- const dependents = this.getDependents(objectName);
123
- if (dependents.length === 0) {
124
- return [objectName];
125
- }
126
- // Recursively get all transitive dependents
127
- const allDependents = new Set();
128
- const collectDependents = (obj) => {
129
- const deps = this.getDependents(obj);
130
- for (const dep of deps) {
131
- if (!allDependents.has(dep)) {
132
- allDependents.add(dep);
133
- collectDependents(dep);
134
- }
135
- }
136
- };
137
- collectDependents(objectName);
138
- // Add the original object
139
- allDependents.add(objectName);
140
- // Sort topologically to get correct deletion order
141
- const sorted = this.topologicalSort(Array.from(allDependents));
142
- return sorted;
143
- }
144
- /**
145
- * Automatically cascade delete based on dependency graph
146
- *
147
- * @param objectName The object type being deleted
148
- * @param id The ID of the record being deleted
149
- * @param deleteFunc Function to delete a record: (objectName, id) => Promise<void>
150
- */
151
- async cascadeDelete(objectName, id, deleteFunc) {
152
- const deleteOrder = this.getCascadeDeleteOrder(objectName);
153
- // Delete in correct order based on DAG
154
- for (const objToDelete of deleteOrder) {
155
- if (objToDelete === objectName) {
156
- // Delete the main record
157
- await deleteFunc(objectName, id);
158
- }
159
- else {
160
- // Find and delete dependent records
161
- // This is a simplified version - in production, you'd need to:
162
- // 1. Query for records that reference the deleted record
163
- // 2. Delete them based on cascade rules (CASCADE vs SET NULL vs RESTRICT)
164
- const edgesFromParent = this.edges.get(objectName) || [];
165
- for (const edge of edgesFromParent) {
166
- if (edge.to === objToDelete && edge.type === 'master_detail') {
167
- // For master-detail, cascade delete dependent records
168
- // await deleteFunc(objToDelete, <dependent_id>);
169
- // Implementation would require querying for dependent records
170
- }
171
- }
172
- }
173
- }
174
- }
175
- /**
176
- * Get graph statistics
177
- */
178
- getStats() {
179
- let totalDeps = 0;
180
- for (const deps of this.graph.values()) {
181
- totalDeps += deps.size;
182
- }
183
- return {
184
- totalObjects: this.graph.size,
185
- totalDependencies: totalDeps,
186
- hasCircularDependency: this.hasCircularDependency()
187
- };
188
- }
189
- /**
190
- * Clear the graph
191
- */
192
- clear() {
193
- this.graph.clear();
194
- this.edges.clear();
195
- }
196
- /**
197
- * Export graph as DOT format for visualization
198
- */
199
- toDot() {
200
- let dot = 'digraph Dependencies {\n';
201
- for (const [from, dependents] of this.graph.entries()) {
202
- for (const to of dependents) {
203
- dot += ` "${from}" -> "${to}";\n`;
204
- }
205
- }
206
- dot += '}';
207
- return dot;
208
- }
209
- }
210
- exports.DependencyGraph = DependencyGraph;
211
- //# sourceMappingURL=DependencyGraph.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DependencyGraph.js","sourceRoot":"","sources":["../../src/optimizations/DependencyGraph.ts"],"names":[],"mappings":"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"}