@objectql/core 4.2.0 → 4.2.2
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +34 -0
- package/README.md +5 -2
- package/dist/app.d.ts +61 -52
- package/dist/app.js +100 -435
- package/dist/app.js.map +1 -1
- package/dist/index.d.ts +14 -20
- package/dist/index.js +21 -20
- package/dist/index.js.map +1 -1
- package/dist/kernel-factory.d.ts +38 -0
- package/dist/kernel-factory.js +38 -0
- package/dist/kernel-factory.js.map +1 -0
- package/dist/plugin.d.ts +9 -16
- package/dist/plugin.js +71 -48
- package/dist/plugin.js.map +1 -1
- package/dist/repository.d.ts +4 -31
- package/dist/repository.js +7 -283
- package/dist/repository.js.map +1 -1
- package/dist/util.js +4 -2
- package/dist/util.js.map +1 -1
- package/package.json +14 -12
- package/src/app.ts +156 -539
- package/src/index.ts +18 -42
- package/src/kernel-factory.ts +47 -0
- package/src/plugin.ts +77 -85
- package/src/repository.ts +4 -320
- package/src/util.ts +5 -3
- package/test/__mocks__/@objectstack/core.ts +250 -1
- package/test/__mocks__/@objectstack/objectql.ts +273 -0
- package/test/__mocks__/@objectstack/runtime.ts +14 -5
- package/test/introspection.test.ts +1 -1
- package/test/mock-driver.ts +5 -5
- package/test/optimizations.test.ts +2 -2
- package/test/plugin-integration.test.ts +1 -3
- package/test/utils.ts +6 -6
- package/tsconfig.json +3 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/ai/index.d.ts +0 -8
- package/dist/ai/index.js +0 -25
- package/dist/ai/index.js.map +0 -1
- package/dist/ai/registry.d.ts +0 -23
- package/dist/ai/registry.js +0 -78
- package/dist/ai/registry.js.map +0 -1
- package/dist/gateway.d.ts +0 -37
- package/dist/gateway.js +0 -93
- package/dist/gateway.js.map +0 -1
- package/dist/optimizations/CompiledHookManager.d.ts +0 -56
- package/dist/optimizations/CompiledHookManager.js +0 -170
- package/dist/optimizations/CompiledHookManager.js.map +0 -1
- package/dist/optimizations/DependencyGraph.d.ts +0 -82
- package/dist/optimizations/DependencyGraph.js +0 -211
- package/dist/optimizations/DependencyGraph.js.map +0 -1
- package/dist/optimizations/GlobalConnectionPool.d.ts +0 -89
- package/dist/optimizations/GlobalConnectionPool.js +0 -193
- package/dist/optimizations/GlobalConnectionPool.js.map +0 -1
- package/dist/optimizations/LazyMetadataLoader.d.ts +0 -75
- package/dist/optimizations/LazyMetadataLoader.js +0 -149
- package/dist/optimizations/LazyMetadataLoader.js.map +0 -1
- package/dist/optimizations/OptimizedMetadataRegistry.d.ts +0 -26
- package/dist/optimizations/OptimizedMetadataRegistry.js +0 -117
- package/dist/optimizations/OptimizedMetadataRegistry.js.map +0 -1
- package/dist/optimizations/OptimizedValidationEngine.d.ts +0 -73
- package/dist/optimizations/OptimizedValidationEngine.js +0 -141
- package/dist/optimizations/OptimizedValidationEngine.js.map +0 -1
- package/dist/optimizations/QueryCompiler.d.ts +0 -51
- package/dist/optimizations/QueryCompiler.js +0 -216
- package/dist/optimizations/QueryCompiler.js.map +0 -1
- package/dist/optimizations/SQLQueryOptimizer.d.ts +0 -96
- package/dist/optimizations/SQLQueryOptimizer.js +0 -265
- package/dist/optimizations/SQLQueryOptimizer.js.map +0 -1
- package/dist/optimizations/index.d.ts +0 -32
- package/dist/optimizations/index.js +0 -44
- package/dist/optimizations/index.js.map +0 -1
- package/dist/protocol.d.ts +0 -191
- package/dist/protocol.js +0 -272
- package/dist/protocol.js.map +0 -1
- package/dist/query/filter-translator.d.ts +0 -24
- package/dist/query/filter-translator.js +0 -38
- package/dist/query/filter-translator.js.map +0 -1
- package/dist/query/index.d.ts +0 -22
- package/dist/query/index.js +0 -39
- package/dist/query/index.js.map +0 -1
- package/dist/query/query-analyzer.d.ts +0 -186
- package/dist/query/query-analyzer.js +0 -348
- package/dist/query/query-analyzer.js.map +0 -1
- package/dist/query/query-builder.d.ts +0 -27
- package/dist/query/query-builder.js +0 -69
- package/dist/query/query-builder.js.map +0 -1
- package/dist/query/query-service.d.ts +0 -151
- package/dist/query/query-service.js +0 -272
- package/dist/query/query-service.js.map +0 -1
- package/src/ai/index.ts +0 -9
- package/src/ai/registry.ts +0 -81
- package/src/gateway.ts +0 -105
- package/src/optimizations/CompiledHookManager.ts +0 -193
- package/src/optimizations/DependencyGraph.ts +0 -255
- package/src/optimizations/GlobalConnectionPool.ts +0 -251
- package/src/optimizations/LazyMetadataLoader.ts +0 -180
- package/src/optimizations/OptimizedMetadataRegistry.ts +0 -132
- package/src/optimizations/OptimizedValidationEngine.ts +0 -172
- package/src/optimizations/QueryCompiler.ts +0 -242
- package/src/optimizations/SQLQueryOptimizer.ts +0 -329
- package/src/optimizations/index.ts +0 -34
- package/src/protocol.ts +0 -304
- package/src/query/filter-translator.ts +0 -41
- package/src/query/index.ts +0 -24
- package/src/query/query-analyzer.ts +0 -532
- package/src/query/query-builder.ts +0 -64
- package/src/query/query-service.ts +0 -397
- package/test/ai-registry.test.ts +0 -42
- package/test/app.test.ts +0 -578
- package/test/filter-syntax.test.ts +0 -233
- package/test/gateway.test.ts +0 -88
- package/test/protocol.test.ts +0 -143
- package/test/repository-validation.test.ts +0 -351
- 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
|
package/dist/gateway.js.map
DELETED
|
@@ -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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"}
|