@onroad/core 4.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +670 -0
- package/dist/OnRoadExpress.d.ts +59 -0
- package/dist/OnRoadExpress.d.ts.map +1 -0
- package/dist/OnRoadExpress.js +320 -0
- package/dist/OnRoadExpress.js.map +1 -0
- package/dist/container/Container.d.ts +53 -0
- package/dist/container/Container.d.ts.map +1 -0
- package/dist/container/Container.js +175 -0
- package/dist/container/Container.js.map +1 -0
- package/dist/container/index.d.ts +3 -0
- package/dist/container/index.d.ts.map +1 -0
- package/dist/container/index.js +2 -0
- package/dist/container/index.js.map +1 -0
- package/dist/context/RequestContext.d.ts +10 -0
- package/dist/context/RequestContext.d.ts.map +1 -0
- package/dist/context/RequestContext.js +11 -0
- package/dist/context/RequestContext.js.map +1 -0
- package/dist/core/AbstractController.d.ts +20 -0
- package/dist/core/AbstractController.d.ts.map +1 -0
- package/dist/core/AbstractController.js +17 -0
- package/dist/core/AbstractController.js.map +1 -0
- package/dist/core/AbstractRepository.d.ts +8 -0
- package/dist/core/AbstractRepository.d.ts.map +1 -0
- package/dist/core/AbstractRepository.js +3 -0
- package/dist/core/AbstractRepository.js.map +1 -0
- package/dist/core/AbstractService.d.ts +12 -0
- package/dist/core/AbstractService.d.ts.map +1 -0
- package/dist/core/AbstractService.js +14 -0
- package/dist/core/AbstractService.js.map +1 -0
- package/dist/core/MongooseRepository.d.ts +19 -0
- package/dist/core/MongooseRepository.d.ts.map +1 -0
- package/dist/core/MongooseRepository.js +48 -0
- package/dist/core/MongooseRepository.js.map +1 -0
- package/dist/core/RequestEventBus.d.ts +18 -0
- package/dist/core/RequestEventBus.d.ts.map +1 -0
- package/dist/core/RequestEventBus.js +43 -0
- package/dist/core/RequestEventBus.js.map +1 -0
- package/dist/core/Sentinel.d.ts +19 -0
- package/dist/core/Sentinel.d.ts.map +1 -0
- package/dist/core/Sentinel.js +56 -0
- package/dist/core/Sentinel.js.map +1 -0
- package/dist/core/SequelizeRepository.d.ts +19 -0
- package/dist/core/SequelizeRepository.d.ts.map +1 -0
- package/dist/core/SequelizeRepository.js +48 -0
- package/dist/core/SequelizeRepository.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/database/ConnectionManager.d.ts +26 -0
- package/dist/database/ConnectionManager.d.ts.map +1 -0
- package/dist/database/ConnectionManager.js +17 -0
- package/dist/database/ConnectionManager.js.map +1 -0
- package/dist/database/MongoConnectionManager.d.ts +8 -0
- package/dist/database/MongoConnectionManager.d.ts.map +1 -0
- package/dist/database/MongoConnectionManager.js +47 -0
- package/dist/database/MongoConnectionManager.js.map +1 -0
- package/dist/database/SequelizeConnectionManager.d.ts +13 -0
- package/dist/database/SequelizeConnectionManager.d.ts.map +1 -0
- package/dist/database/SequelizeConnectionManager.js +58 -0
- package/dist/database/SequelizeConnectionManager.js.map +1 -0
- package/dist/database/index.d.ts +6 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +4 -0
- package/dist/database/index.js.map +1 -0
- package/dist/entity/EntityRegistry.d.ts +9 -0
- package/dist/entity/EntityRegistry.d.ts.map +1 -0
- package/dist/entity/EntityRegistry.js +114 -0
- package/dist/entity/EntityRegistry.js.map +1 -0
- package/dist/entity/decorators.d.ts +62 -0
- package/dist/entity/decorators.d.ts.map +1 -0
- package/dist/entity/decorators.js +103 -0
- package/dist/entity/decorators.js.map +1 -0
- package/dist/entity/index.d.ts +4 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +3 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/filters/FilterChain.d.ts +34 -0
- package/dist/filters/FilterChain.d.ts.map +1 -0
- package/dist/filters/FilterChain.js +42 -0
- package/dist/filters/FilterChain.js.map +1 -0
- package/dist/filters/builtins/CorsFilter.d.ts +22 -0
- package/dist/filters/builtins/CorsFilter.d.ts.map +1 -0
- package/dist/filters/builtins/CorsFilter.js +41 -0
- package/dist/filters/builtins/CorsFilter.js.map +1 -0
- package/dist/filters/builtins/JwtFilter.d.ts +27 -0
- package/dist/filters/builtins/JwtFilter.d.ts.map +1 -0
- package/dist/filters/builtins/JwtFilter.js +35 -0
- package/dist/filters/builtins/JwtFilter.js.map +1 -0
- package/dist/filters/builtins/RequestContextFilter.d.ts +12 -0
- package/dist/filters/builtins/RequestContextFilter.d.ts.map +1 -0
- package/dist/filters/builtins/RequestContextFilter.js +32 -0
- package/dist/filters/builtins/RequestContextFilter.js.map +1 -0
- package/dist/filters/builtins/RoleFilter.d.ts +27 -0
- package/dist/filters/builtins/RoleFilter.d.ts.map +1 -0
- package/dist/filters/builtins/RoleFilter.js +36 -0
- package/dist/filters/builtins/RoleFilter.js.map +1 -0
- package/dist/filters/builtins/TenantFilter.d.ts +26 -0
- package/dist/filters/builtins/TenantFilter.d.ts.map +1 -0
- package/dist/filters/builtins/TenantFilter.js +29 -0
- package/dist/filters/builtins/TenantFilter.js.map +1 -0
- package/dist/filters/builtins/index.d.ts +11 -0
- package/dist/filters/builtins/index.d.ts.map +1 -0
- package/dist/filters/builtins/index.js +6 -0
- package/dist/filters/builtins/index.js.map +1 -0
- package/dist/filters/index.d.ts +5 -0
- package/dist/filters/index.d.ts.map +1 -0
- package/dist/filters/index.js +4 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/OnRoadLogger.d.ts +8 -0
- package/dist/logging/OnRoadLogger.d.ts.map +1 -0
- package/dist/logging/OnRoadLogger.js +2 -0
- package/dist/logging/OnRoadLogger.js.map +1 -0
- package/dist/logging/PinoLogger.d.ts +16 -0
- package/dist/logging/PinoLogger.d.ts.map +1 -0
- package/dist/logging/PinoLogger.js +33 -0
- package/dist/logging/PinoLogger.js.map +1 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +2 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/messaging/MatchingObject.d.ts +9 -0
- package/dist/messaging/MatchingObject.d.ts.map +1 -0
- package/dist/messaging/MatchingObject.js +21 -0
- package/dist/messaging/MatchingObject.js.map +1 -0
- package/dist/messaging/index.d.ts +2 -0
- package/dist/messaging/index.d.ts.map +1 -0
- package/dist/messaging/index.js +2 -0
- package/dist/messaging/index.js.map +1 -0
- package/dist/plugins/OnRoadPlugin.d.ts +6 -0
- package/dist/plugins/OnRoadPlugin.d.ts.map +1 -0
- package/dist/plugins/OnRoadPlugin.js +2 -0
- package/dist/plugins/OnRoadPlugin.js.map +1 -0
- package/dist/plugins/index.d.ts +2 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +2 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/providers/MessagingProvider.d.ts +17 -0
- package/dist/providers/MessagingProvider.d.ts.map +1 -0
- package/dist/providers/MessagingProvider.js +3 -0
- package/dist/providers/MessagingProvider.js.map +1 -0
- package/dist/providers/RealtimeProvider.d.ts +13 -0
- package/dist/providers/RealtimeProvider.d.ts.map +1 -0
- package/dist/providers/RealtimeProvider.js +3 -0
- package/dist/providers/RealtimeProvider.js.map +1 -0
- package/dist/providers/SocketProvider.d.ts +7 -0
- package/dist/providers/SocketProvider.d.ts.map +1 -0
- package/dist/providers/SocketProvider.js +3 -0
- package/dist/providers/SocketProvider.js.map +1 -0
- package/dist/providers/TaskSchedulerProvider.d.ts +19 -0
- package/dist/providers/TaskSchedulerProvider.d.ts.map +1 -0
- package/dist/providers/TaskSchedulerProvider.js +3 -0
- package/dist/providers/TaskSchedulerProvider.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/security/decorators.d.ts +5 -0
- package/dist/security/decorators.d.ts.map +1 -0
- package/dist/security/decorators.js +26 -0
- package/dist/security/decorators.js.map +1 -0
- package/dist/security/index.d.ts +2 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +2 -0
- package/dist/security/index.js.map +1 -0
- package/dist/storage/StorageProvider.d.ts +7 -0
- package/dist/storage/StorageProvider.d.ts.map +1 -0
- package/dist/storage/StorageProvider.js +3 -0
- package/dist/storage/StorageProvider.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/transport/HttpTransport.d.ts +8 -0
- package/dist/transport/HttpTransport.d.ts.map +1 -0
- package/dist/transport/HttpTransport.js +26 -0
- package/dist/transport/HttpTransport.js.map +1 -0
- package/dist/transport/InterServiceTransport.d.ts +15 -0
- package/dist/transport/InterServiceTransport.d.ts.map +1 -0
- package/dist/transport/InterServiceTransport.js +20 -0
- package/dist/transport/InterServiceTransport.js.map +1 -0
- package/dist/transport/MessagingTransport.d.ts +9 -0
- package/dist/transport/MessagingTransport.d.ts.map +1 -0
- package/dist/transport/MessagingTransport.js +21 -0
- package/dist/transport/MessagingTransport.js.map +1 -0
- package/dist/transport/TransportFactory.d.ts +13 -0
- package/dist/transport/TransportFactory.d.ts.map +1 -0
- package/dist/transport/TransportFactory.js +35 -0
- package/dist/transport/TransportFactory.js.map +1 -0
- package/dist/transport/index.d.ts +6 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +5 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/types/express-augment.d.ts +27 -0
- package/dist/types/express-augment.d.ts.map +1 -0
- package/dist/types/express-augment.js +4 -0
- package/dist/types/express-augment.js.map +1 -0
- package/package.json +134 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoConnectionManager.js","sourceRoot":"","sources":["../../src/database/MongoConnectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,MAAM,OAAO,sBAAuB,SAAQ,iBAA0B;IACpE,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,UAAmB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QAE7C,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;QACnC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QAEzC,IAAI,GAAW,CAAA;QACf,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACpB,wDAAwD;YACxD,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,MAAM,IAAI,CAAC,CAAA;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,WAAW,CAAA;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,CAAA;YACtC,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;gBACtC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG;gBAChD,CAAC,CAAC,EAAE,CAAA;YACR,GAAG,GAAG,aAAa,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,EAAE,CAAA;QACpD,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAA;QACnE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QACrC,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;YACxE,8DAA8D;YAC9D,MAAO,IAAY,CAAC,KAAK,EAAE,CAAA;YAC3B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAA;QAEvB,8DAA8D;QAC9D,OAAQ,IAAY,CAAC,UAAU,KAAK,CAAC,CAAA;IACvC,CAAC;IAED,IAAa,MAAM;QACjB,OAAO,UAAU,CAAA;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ConnectionManager, type DatabaseConfig } from "./ConnectionManager.js";
|
|
2
|
+
export interface SequelizeConfig extends DatabaseConfig {
|
|
3
|
+
dialect: "postgres" | "mysql" | "sqlite" | "mariadb" | "mssql";
|
|
4
|
+
}
|
|
5
|
+
export declare class SequelizeConnectionManager extends ConnectionManager<unknown> {
|
|
6
|
+
protected config: SequelizeConfig;
|
|
7
|
+
constructor(config: SequelizeConfig);
|
|
8
|
+
getConnection(tenant: string, dataSource?: string): Promise<unknown>;
|
|
9
|
+
closeAll(): Promise<void>;
|
|
10
|
+
isHealthy(tenant: string): Promise<boolean>;
|
|
11
|
+
get engine(): string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=SequelizeConnectionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SequelizeConnectionManager.d.ts","sourceRoot":"","sources":["../../src/database/SequelizeConnectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE/E,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,OAAO,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;CAC/D;AAED,qBAAa,0BAA2B,SAAQ,iBAAiB,CAAC,OAAO,CAAC;IACxE,UAAmB,MAAM,EAAE,eAAe,CAAA;gBAE9B,MAAM,EAAE,eAAe;IAK7B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6BpE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IASzB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAcjD,IAAa,MAAM,IAAI,MAAM,CAE5B;CACF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ConnectionManager } from "./ConnectionManager.js";
|
|
2
|
+
export class SequelizeConnectionManager extends ConnectionManager {
|
|
3
|
+
config;
|
|
4
|
+
constructor(config) {
|
|
5
|
+
super(config);
|
|
6
|
+
this.config = config;
|
|
7
|
+
}
|
|
8
|
+
async getConnection(tenant, dataSource) {
|
|
9
|
+
const key = this.buildKey(tenant, dataSource);
|
|
10
|
+
if (this.connections.has(key)) {
|
|
11
|
+
return this.connections.get(key);
|
|
12
|
+
}
|
|
13
|
+
const dbName = this.resolveDatabaseName(tenant, dataSource);
|
|
14
|
+
const { Sequelize } = await import("sequelize");
|
|
15
|
+
const connection = new Sequelize(dbName, this.config.user, this.config.password, {
|
|
16
|
+
host: this.config.host,
|
|
17
|
+
port: this.config.port,
|
|
18
|
+
dialect: this.config.dialect,
|
|
19
|
+
pool: this.config.pool
|
|
20
|
+
? {
|
|
21
|
+
max: this.config.pool.max ?? 10,
|
|
22
|
+
min: this.config.pool.min ?? 0,
|
|
23
|
+
acquire: this.config.pool.acquire ?? 30000,
|
|
24
|
+
idle: this.config.pool.idle ?? 10000,
|
|
25
|
+
}
|
|
26
|
+
: undefined,
|
|
27
|
+
logging: false,
|
|
28
|
+
});
|
|
29
|
+
this.connections.set(key, connection);
|
|
30
|
+
return connection;
|
|
31
|
+
}
|
|
32
|
+
async closeAll() {
|
|
33
|
+
const closing = [...this.connections.entries()].map(async ([key, conn]) => {
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
+
await conn.close();
|
|
36
|
+
this.connections.delete(key);
|
|
37
|
+
});
|
|
38
|
+
await Promise.all(closing);
|
|
39
|
+
}
|
|
40
|
+
async isHealthy(tenant) {
|
|
41
|
+
const key = this.buildKey(tenant);
|
|
42
|
+
const conn = this.connections.get(key);
|
|
43
|
+
if (!conn)
|
|
44
|
+
return false;
|
|
45
|
+
try {
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
await conn.authenticate();
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
get engine() {
|
|
55
|
+
return "sequelize";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=SequelizeConnectionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SequelizeConnectionManager.js","sourceRoot":"","sources":["../../src/database/SequelizeConnectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAuB,MAAM,wBAAwB,CAAA;AAM/E,MAAM,OAAO,0BAA2B,SAAQ,iBAA0B;IACrD,MAAM,CAAiB;IAE1C,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,CAAC,CAAA;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,UAAmB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QAE7C,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;QACnC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAA;QAE/C,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS,EAAE;YACjF,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACpB,CAAC,CAAC;oBACE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE;oBAC/B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;oBAC9B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK;oBAC1C,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK;iBACrC;gBACH,CAAC,CAAC,SAAS;YACb,OAAO,EAAE,KAAK;SACf,CAAC,CAAA;QAEF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QACrC,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;YACxE,8DAA8D;YAC9D,MAAO,IAAY,CAAC,KAAK,EAAE,CAAA;YAC3B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAA;QAEvB,IAAI,CAAC;YACH,8DAA8D;YAC9D,MAAO,IAAY,CAAC,YAAY,EAAE,CAAA;YAClC,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAa,MAAM;QACjB,OAAO,WAAW,CAAA;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ConnectionManager } from "./ConnectionManager.js";
|
|
2
|
+
export type { DatabaseConfig } from "./ConnectionManager.js";
|
|
3
|
+
export { SequelizeConnectionManager } from "./SequelizeConnectionManager.js";
|
|
4
|
+
export type { SequelizeConfig } from "./SequelizeConnectionManager.js";
|
|
5
|
+
export { MongoConnectionManager } from "./MongoConnectionManager.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAC5E,YAAY,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAG5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Constructor } from "../container/Container.js";
|
|
2
|
+
export declare class EntityRegistry {
|
|
3
|
+
private static sequelizeModels;
|
|
4
|
+
private static mongooseModels;
|
|
5
|
+
static getSequelizeModel(entityClass: Constructor, connection: unknown): Promise<unknown>;
|
|
6
|
+
static getMongooseModel(entityClass: Constructor, connection: unknown): Promise<unknown>;
|
|
7
|
+
static clearCache(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=EntityRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityRegistry.d.ts","sourceRoot":"","sources":["../../src/entity/EntityRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5D,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,eAAe,CAA6B;IAC3D,OAAO,CAAC,MAAM,CAAC,cAAc,CAA6B;WAE7C,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;WAiDlF,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAgD9F,MAAM,CAAC,UAAU,IAAI,IAAI;CAI1B"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { getEntityColumns, getEntityFields, getEntityOptions, DataType } from "./decorators.js";
|
|
2
|
+
export class EntityRegistry {
|
|
3
|
+
static sequelizeModels = new Map();
|
|
4
|
+
static mongooseModels = new Map();
|
|
5
|
+
static async getSequelizeModel(entityClass, connection) {
|
|
6
|
+
const options = getEntityOptions(entityClass);
|
|
7
|
+
if (!options) {
|
|
8
|
+
throw new Error(`[TypeRoad] Class "${entityClass.name}" is not decorated with @Entity`);
|
|
9
|
+
}
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
+
const seq = connection;
|
|
12
|
+
const connId = seq.config?.database ?? seq.options?.database ?? "default";
|
|
13
|
+
const cacheKey = `${entityClass.name}:${connId}`;
|
|
14
|
+
if (this.sequelizeModels.has(cacheKey)) {
|
|
15
|
+
return this.sequelizeModels.get(cacheKey);
|
|
16
|
+
}
|
|
17
|
+
// If already defined on this Sequelize instance, reuse it
|
|
18
|
+
if (seq.isDefined?.(options.name)) {
|
|
19
|
+
const model = seq.models[options.name];
|
|
20
|
+
this.sequelizeModels.set(cacheKey, model);
|
|
21
|
+
return model;
|
|
22
|
+
}
|
|
23
|
+
const columns = getEntityColumns(entityClass);
|
|
24
|
+
const { DataTypes } = await import("sequelize");
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
|
+
const attributes = {};
|
|
27
|
+
for (const [name, col] of columns) {
|
|
28
|
+
attributes[name] = {
|
|
29
|
+
type: mapSequelizeDataType(col.type, DataTypes, col.values),
|
|
30
|
+
primaryKey: col.primaryKey ?? false,
|
|
31
|
+
autoIncrement: col.autoIncrement ?? false,
|
|
32
|
+
allowNull: col.allowNull ?? true,
|
|
33
|
+
defaultValue: col.defaultValue,
|
|
34
|
+
unique: col.unique ?? false,
|
|
35
|
+
...(col.field ? { field: col.field } : {}),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const model = seq.define(options.name, attributes, {
|
|
39
|
+
tableName: options.tableName ?? options.name,
|
|
40
|
+
timestamps: options.timestamps ?? true,
|
|
41
|
+
paranoid: options.paranoid ?? false,
|
|
42
|
+
});
|
|
43
|
+
this.sequelizeModels.set(cacheKey, model);
|
|
44
|
+
return model;
|
|
45
|
+
}
|
|
46
|
+
static async getMongooseModel(entityClass, connection) {
|
|
47
|
+
const options = getEntityOptions(entityClass);
|
|
48
|
+
if (!options) {
|
|
49
|
+
throw new Error(`[TypeRoad] Class "${entityClass.name}" is not decorated with @Entity`);
|
|
50
|
+
}
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
const conn = connection;
|
|
53
|
+
const connId = conn.name ?? conn.db?.databaseName ?? "default";
|
|
54
|
+
const cacheKey = `${entityClass.name}:${connId}`;
|
|
55
|
+
if (this.mongooseModels.has(cacheKey)) {
|
|
56
|
+
return this.mongooseModels.get(cacheKey);
|
|
57
|
+
}
|
|
58
|
+
// If already defined on this connection, reuse it
|
|
59
|
+
if (conn.models?.[options.name]) {
|
|
60
|
+
const model = conn.models[options.name];
|
|
61
|
+
this.mongooseModels.set(cacheKey, model);
|
|
62
|
+
return model;
|
|
63
|
+
}
|
|
64
|
+
const fields = getEntityFields(entityClass);
|
|
65
|
+
const mongoose = await import("mongoose");
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
const schemaDefinition = {};
|
|
68
|
+
for (const [name, field] of fields) {
|
|
69
|
+
schemaDefinition[name] = {
|
|
70
|
+
type: field.type,
|
|
71
|
+
required: field.required ?? false,
|
|
72
|
+
default: field.default,
|
|
73
|
+
unique: field.unique ?? false,
|
|
74
|
+
...(field.ref ? { ref: field.ref } : {}),
|
|
75
|
+
...(field.index ? { index: true } : {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const schema = new mongoose.Schema(schemaDefinition, {
|
|
79
|
+
timestamps: options.timestamps ?? true,
|
|
80
|
+
collection: options.tableName ?? options.name,
|
|
81
|
+
});
|
|
82
|
+
const model = conn.model(options.name, schema);
|
|
83
|
+
this.mongooseModels.set(cacheKey, model);
|
|
84
|
+
return model;
|
|
85
|
+
}
|
|
86
|
+
static clearCache() {
|
|
87
|
+
this.sequelizeModels.clear();
|
|
88
|
+
this.mongooseModels.clear();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
function mapSequelizeDataType(dataType, DataTypes, enumValues) {
|
|
93
|
+
if (dataType === DataType.ENUM) {
|
|
94
|
+
return DataTypes.ENUM(...(enumValues ?? []));
|
|
95
|
+
}
|
|
96
|
+
const map = {
|
|
97
|
+
[DataType.STRING]: DataTypes.STRING,
|
|
98
|
+
[DataType.TEXT]: DataTypes.TEXT,
|
|
99
|
+
[DataType.INTEGER]: DataTypes.INTEGER,
|
|
100
|
+
[DataType.BIGINT]: DataTypes.BIGINT,
|
|
101
|
+
[DataType.FLOAT]: DataTypes.FLOAT,
|
|
102
|
+
[DataType.DOUBLE]: DataTypes.DOUBLE,
|
|
103
|
+
[DataType.DECIMAL]: DataTypes.DECIMAL,
|
|
104
|
+
[DataType.BOOLEAN]: DataTypes.BOOLEAN,
|
|
105
|
+
[DataType.DATE]: DataTypes.DATE,
|
|
106
|
+
[DataType.DATEONLY]: DataTypes.DATEONLY,
|
|
107
|
+
[DataType.UUID]: DataTypes.UUID,
|
|
108
|
+
[DataType.JSON]: DataTypes.JSON,
|
|
109
|
+
[DataType.JSONB]: DataTypes.JSONB,
|
|
110
|
+
[DataType.ARRAY]: DataTypes.ARRAY,
|
|
111
|
+
};
|
|
112
|
+
return map[dataType] ?? DataTypes.STRING;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=EntityRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityRegistry.js","sourceRoot":"","sources":["../../src/entity/EntityRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
export declare enum DataType {
|
|
3
|
+
STRING = "STRING",
|
|
4
|
+
TEXT = "TEXT",
|
|
5
|
+
INTEGER = "INTEGER",
|
|
6
|
+
BIGINT = "BIGINT",
|
|
7
|
+
FLOAT = "FLOAT",
|
|
8
|
+
DOUBLE = "DOUBLE",
|
|
9
|
+
DECIMAL = "DECIMAL",
|
|
10
|
+
BOOLEAN = "BOOLEAN",
|
|
11
|
+
DATE = "DATE",
|
|
12
|
+
DATEONLY = "DATEONLY",
|
|
13
|
+
UUID = "UUID",
|
|
14
|
+
ENUM = "ENUM",
|
|
15
|
+
JSON = "JSON",
|
|
16
|
+
JSONB = "JSONB",
|
|
17
|
+
ARRAY = "ARRAY"
|
|
18
|
+
}
|
|
19
|
+
export interface ColumnOptions {
|
|
20
|
+
type: DataType;
|
|
21
|
+
primaryKey?: boolean;
|
|
22
|
+
autoIncrement?: boolean;
|
|
23
|
+
allowNull?: boolean;
|
|
24
|
+
defaultValue?: unknown;
|
|
25
|
+
unique?: boolean;
|
|
26
|
+
field?: string;
|
|
27
|
+
values?: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface FieldOptions {
|
|
30
|
+
type: unknown;
|
|
31
|
+
required?: boolean;
|
|
32
|
+
default?: unknown;
|
|
33
|
+
unique?: boolean;
|
|
34
|
+
ref?: string;
|
|
35
|
+
index?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface EntityOptions {
|
|
38
|
+
engine: "sequelize" | "mongoose";
|
|
39
|
+
tableName?: string;
|
|
40
|
+
timestamps?: boolean;
|
|
41
|
+
paranoid?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface AssociationMetadata {
|
|
44
|
+
type: "hasMany" | "belongsTo" | "hasOne" | "belongsToMany";
|
|
45
|
+
target: () => unknown;
|
|
46
|
+
foreignKey: string;
|
|
47
|
+
through?: string;
|
|
48
|
+
}
|
|
49
|
+
export declare function Entity(name: string, options: EntityOptions): ClassDecorator;
|
|
50
|
+
export declare function Column(options: ColumnOptions): PropertyDecorator;
|
|
51
|
+
export declare function Field(options: FieldOptions): PropertyDecorator;
|
|
52
|
+
export declare function HasMany(target: () => unknown, foreignKey: string): PropertyDecorator;
|
|
53
|
+
export declare function BelongsTo(target: () => unknown, foreignKey: string): PropertyDecorator;
|
|
54
|
+
export declare function HasOne(target: () => unknown, foreignKey: string): PropertyDecorator;
|
|
55
|
+
export declare function BelongsToMany(target: () => unknown, foreignKey: string, through: string): PropertyDecorator;
|
|
56
|
+
export declare function getEntityColumns(target: object): Map<string, ColumnOptions>;
|
|
57
|
+
export declare function getEntityFields(target: object): Map<string, FieldOptions>;
|
|
58
|
+
export declare function getEntityAssociations(target: object): Map<string, AssociationMetadata>;
|
|
59
|
+
export declare function getEntityOptions(target: object): (EntityOptions & {
|
|
60
|
+
name: string;
|
|
61
|
+
}) | undefined;
|
|
62
|
+
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/entity/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA;AAKzB,oBAAY,QAAQ;IAClB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAID,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,GAAG,UAAU,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,eAAe,CAAA;IAC1D,MAAM,EAAE,MAAM,OAAO,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAUD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,cAAc,CAK3E;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,iBAAiB,CAOhE;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,iBAAiB,CAO9D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAQpF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAQtF;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAQnF;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,OAAO,EACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,iBAAiB,CASnB;AAiBD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAE3E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAEzE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAEtF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,CAE/F"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { METADATA_KEY } from "../container/Container.js";
|
|
3
|
+
// --- Column Types (Sequelize-compatible) ---
|
|
4
|
+
export var DataType;
|
|
5
|
+
(function (DataType) {
|
|
6
|
+
DataType["STRING"] = "STRING";
|
|
7
|
+
DataType["TEXT"] = "TEXT";
|
|
8
|
+
DataType["INTEGER"] = "INTEGER";
|
|
9
|
+
DataType["BIGINT"] = "BIGINT";
|
|
10
|
+
DataType["FLOAT"] = "FLOAT";
|
|
11
|
+
DataType["DOUBLE"] = "DOUBLE";
|
|
12
|
+
DataType["DECIMAL"] = "DECIMAL";
|
|
13
|
+
DataType["BOOLEAN"] = "BOOLEAN";
|
|
14
|
+
DataType["DATE"] = "DATE";
|
|
15
|
+
DataType["DATEONLY"] = "DATEONLY";
|
|
16
|
+
DataType["UUID"] = "UUID";
|
|
17
|
+
DataType["ENUM"] = "ENUM";
|
|
18
|
+
DataType["JSON"] = "JSON";
|
|
19
|
+
DataType["JSONB"] = "JSONB";
|
|
20
|
+
DataType["ARRAY"] = "ARRAY";
|
|
21
|
+
})(DataType || (DataType = {}));
|
|
22
|
+
// --- Metadata Storage Keys ---
|
|
23
|
+
const ENTITY_COLUMNS = Symbol("typeroad:entity:columns");
|
|
24
|
+
const ENTITY_FIELDS = Symbol("typeroad:entity:fields");
|
|
25
|
+
const ENTITY_ASSOCIATIONS = Symbol("typeroad:entity:associations");
|
|
26
|
+
// --- Decorators ---
|
|
27
|
+
export function Entity(name, options) {
|
|
28
|
+
return (target) => {
|
|
29
|
+
Reflect.defineMetadata(METADATA_KEY.INJECTABLE, true, target);
|
|
30
|
+
Reflect.defineMetadata(METADATA_KEY.ENTITY, { name, ...options }, target);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function Column(options) {
|
|
34
|
+
return (target, propertyKey) => {
|
|
35
|
+
const columns = Reflect.getMetadata(ENTITY_COLUMNS, target.constructor) ?? new Map();
|
|
36
|
+
columns.set(String(propertyKey), options);
|
|
37
|
+
Reflect.defineMetadata(ENTITY_COLUMNS, columns, target.constructor);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function Field(options) {
|
|
41
|
+
return (target, propertyKey) => {
|
|
42
|
+
const fields = Reflect.getMetadata(ENTITY_FIELDS, target.constructor) ?? new Map();
|
|
43
|
+
fields.set(String(propertyKey), options);
|
|
44
|
+
Reflect.defineMetadata(ENTITY_FIELDS, fields, target.constructor);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function HasMany(target, foreignKey) {
|
|
48
|
+
return (proto, propertyKey) => {
|
|
49
|
+
addAssociation(proto.constructor, String(propertyKey), {
|
|
50
|
+
type: "hasMany",
|
|
51
|
+
target,
|
|
52
|
+
foreignKey,
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function BelongsTo(target, foreignKey) {
|
|
57
|
+
return (proto, propertyKey) => {
|
|
58
|
+
addAssociation(proto.constructor, String(propertyKey), {
|
|
59
|
+
type: "belongsTo",
|
|
60
|
+
target,
|
|
61
|
+
foreignKey,
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function HasOne(target, foreignKey) {
|
|
66
|
+
return (proto, propertyKey) => {
|
|
67
|
+
addAssociation(proto.constructor, String(propertyKey), {
|
|
68
|
+
type: "hasOne",
|
|
69
|
+
target,
|
|
70
|
+
foreignKey,
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function BelongsToMany(target, foreignKey, through) {
|
|
75
|
+
return (proto, propertyKey) => {
|
|
76
|
+
addAssociation(proto.constructor, String(propertyKey), {
|
|
77
|
+
type: "belongsToMany",
|
|
78
|
+
target,
|
|
79
|
+
foreignKey,
|
|
80
|
+
through,
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// --- Helpers ---
|
|
85
|
+
function addAssociation(constructor, propertyKey, association) {
|
|
86
|
+
const associations = Reflect.getMetadata(ENTITY_ASSOCIATIONS, constructor) ?? new Map();
|
|
87
|
+
associations.set(propertyKey, association);
|
|
88
|
+
Reflect.defineMetadata(ENTITY_ASSOCIATIONS, associations, constructor);
|
|
89
|
+
}
|
|
90
|
+
// --- Registry Reader ---
|
|
91
|
+
export function getEntityColumns(target) {
|
|
92
|
+
return Reflect.getMetadata(ENTITY_COLUMNS, target) ?? new Map();
|
|
93
|
+
}
|
|
94
|
+
export function getEntityFields(target) {
|
|
95
|
+
return Reflect.getMetadata(ENTITY_FIELDS, target) ?? new Map();
|
|
96
|
+
}
|
|
97
|
+
export function getEntityAssociations(target) {
|
|
98
|
+
return Reflect.getMetadata(ENTITY_ASSOCIATIONS, target) ?? new Map();
|
|
99
|
+
}
|
|
100
|
+
export function getEntityOptions(target) {
|
|
101
|
+
return Reflect.getMetadata(METADATA_KEY.ENTITY, target);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/entity/decorators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Entity, Column, Field, HasMany, BelongsTo, HasOne, BelongsToMany, DataType, getEntityColumns, getEntityFields, getEntityAssociations, getEntityOptions, } from "./decorators.js";
|
|
2
|
+
export type { ColumnOptions, FieldOptions, EntityOptions, AssociationMetadata, } from "./decorators.js";
|
|
3
|
+
export { EntityRegistry } from "./EntityRegistry.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,MAAM,EACN,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AAExB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { Entity, Column, Field, HasMany, BelongsTo, HasOne, BelongsToMany, DataType, getEntityColumns, getEntityFields, getEntityAssociations, getEntityOptions, } from "./decorators.js";
|
|
2
|
+
export { EntityRegistry } from "./EntityRegistry.js";
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,MAAM,EACN,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AASxB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Request, Response } from "express";
|
|
2
|
+
export interface FilterConfig {
|
|
3
|
+
order: number;
|
|
4
|
+
exclude?: string[];
|
|
5
|
+
condition?: () => boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare abstract class OnRoadFilter {
|
|
8
|
+
abstract execute(req: Request, res: Response, chain: FilterChain): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare class FilterChain {
|
|
11
|
+
private filters;
|
|
12
|
+
private index;
|
|
13
|
+
constructor(filters: Array<{
|
|
14
|
+
filter: OnRoadFilter;
|
|
15
|
+
config: FilterConfig;
|
|
16
|
+
}>);
|
|
17
|
+
next(req: Request, res: Response): Promise<void>;
|
|
18
|
+
static create(filters: Array<{
|
|
19
|
+
filter: OnRoadFilter;
|
|
20
|
+
config: FilterConfig;
|
|
21
|
+
}>): FilterChain;
|
|
22
|
+
}
|
|
23
|
+
import "reflect-metadata";
|
|
24
|
+
export declare function Filter(config: FilterConfig): ClassDecorator;
|
|
25
|
+
export declare function getFilterConfig(target: object): FilterConfig | undefined;
|
|
26
|
+
export type FilterInput = (new () => OnRoadFilter) | OnRoadFilter | {
|
|
27
|
+
filter: (new () => OnRoadFilter) | OnRoadFilter;
|
|
28
|
+
order?: number;
|
|
29
|
+
exclude?: string[];
|
|
30
|
+
condition?: () => boolean;
|
|
31
|
+
};
|
|
32
|
+
export declare function isFilterInstance(f: unknown): f is OnRoadFilter;
|
|
33
|
+
export declare function getFilterConstructor(f: (new () => OnRoadFilter) | OnRoadFilter): Function;
|
|
34
|
+
//# sourceMappingURL=FilterChain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterChain.d.ts","sourceRoot":"","sources":["../../src/filters/FilterChain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIhD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;CAC1B;AAED,8BAAsB,YAAY;IAChC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CACjF;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAuD;IACtE,OAAO,CAAC,KAAK,CAAQ;gBAET,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC;IAKpE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD,MAAM,CAAC,MAAM,CACX,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC,GAC7D,WAAW;CAGf;AAID,OAAO,kBAAkB,CAAA;AAGzB,wBAAgB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAK3D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAExE;AAID,MAAM,MAAM,WAAW,GACnB,CAAC,UAAU,YAAY,CAAC,GACxB,YAAY,GACZ;IAAE,MAAM,EAAE,CAAC,UAAU,YAAY,CAAC,GAAG,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;CAAE,CAAA;AAEtH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,YAAY,CAE9D;AAED,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,CAAC,UAAU,YAAY,CAAC,GAAG,YAAY,GACzC,QAAQ,CAEV"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export class OnRoadFilter {
|
|
2
|
+
}
|
|
3
|
+
export class FilterChain {
|
|
4
|
+
filters;
|
|
5
|
+
index;
|
|
6
|
+
constructor(filters) {
|
|
7
|
+
this.filters = filters.sort((a, b) => a.config.order - b.config.order);
|
|
8
|
+
this.index = 0;
|
|
9
|
+
}
|
|
10
|
+
async next(req, res) {
|
|
11
|
+
while (this.index < this.filters.length) {
|
|
12
|
+
const { filter, config } = this.filters[this.index++];
|
|
13
|
+
if (config.exclude?.some((p) => req.path === p || req.path.startsWith(p)))
|
|
14
|
+
continue;
|
|
15
|
+
if (config.condition && !config.condition())
|
|
16
|
+
continue;
|
|
17
|
+
return filter.execute(req, res, this);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
static create(filters) {
|
|
21
|
+
return new FilterChain([...filters]);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// --- @Filter Decorator ---
|
|
25
|
+
import "reflect-metadata";
|
|
26
|
+
import { METADATA_KEY } from "../container/Container.js";
|
|
27
|
+
export function Filter(config) {
|
|
28
|
+
return (target) => {
|
|
29
|
+
Reflect.defineMetadata(METADATA_KEY.INJECTABLE, true, target);
|
|
30
|
+
Reflect.defineMetadata(METADATA_KEY.FILTER, config, target);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function getFilterConfig(target) {
|
|
34
|
+
return Reflect.getMetadata(METADATA_KEY.FILTER, target);
|
|
35
|
+
}
|
|
36
|
+
export function isFilterInstance(f) {
|
|
37
|
+
return typeof f === "object" && f !== null && typeof f.execute === "function";
|
|
38
|
+
}
|
|
39
|
+
export function getFilterConstructor(f) {
|
|
40
|
+
return typeof f === "function" ? f : f.constructor;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=FilterChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterChain.js","sourceRoot":"","sources":["../../src/filters/FilterChain.ts"],"names":[],"mappings":"AAUA,MAAM,OAAgB,YAAY;CAEjC;AAED,MAAM,OAAO,WAAW;IACd,OAAO,CAAuD;IAC9D,KAAK,CAAQ;IAErB,YAAY,OAA8D;QACxE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAY,EAAE,GAAa;QACpC,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;YAErD,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAQ;YACnF,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBAAE,SAAQ;YAErD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,MAAM,CACX,OAA8D;QAE9D,OAAO,IAAI,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAA;IACtC,CAAC;CACF;AAED,4BAA4B;AAE5B,OAAO,kBAAkB,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,MAAM,UAAU,MAAM,CAAC,MAAoB;IACzC,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAC7D,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7D,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AACzD,CAAC;AASD,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAQ,CAAkB,CAAC,OAAO,KAAK,UAAU,CAAA;AACjG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,CAA0C;IAE1C,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAA;AACpD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Request, Response } from "express";
|
|
2
|
+
import "../../types/express-augment.js";
|
|
3
|
+
import { OnRoadFilter } from "../FilterChain.js";
|
|
4
|
+
import type { FilterChain } from "../FilterChain.js";
|
|
5
|
+
export interface CorsFilterOptions {
|
|
6
|
+
/** Allowed origin(s). Use "*" for all. Default: "*" */
|
|
7
|
+
origin?: string | string[];
|
|
8
|
+
/** Allowed request headers. Default: Content-Type, Authorization */
|
|
9
|
+
allowedHeaders?: string[];
|
|
10
|
+
/** Allowed HTTP methods. Default: GET, POST, PUT, DELETE, PATCH, OPTIONS */
|
|
11
|
+
allowedMethods?: string[];
|
|
12
|
+
/** Whether to allow credentials (cookies, auth headers). Default: false */
|
|
13
|
+
allowCredentials?: boolean;
|
|
14
|
+
/** Preflight cache duration in seconds (Access-Control-Max-Age). Default: 86400 */
|
|
15
|
+
maxAge?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class CorsFilter extends OnRoadFilter {
|
|
18
|
+
private readonly options;
|
|
19
|
+
constructor(options?: CorsFilterOptions);
|
|
20
|
+
execute(req: Request, res: Response, chain: FilterChain): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=CorsFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CorsFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/builtins/CorsFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,gCAAgC,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC1B,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;gBAEzC,OAAO,GAAE,iBAAsB;IAWrC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CA6B9E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import "../../types/express-augment.js";
|
|
2
|
+
import { OnRoadFilter } from "../FilterChain.js";
|
|
3
|
+
export class CorsFilter extends OnRoadFilter {
|
|
4
|
+
options;
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
super();
|
|
7
|
+
this.options = {
|
|
8
|
+
origin: options.origin ?? "*",
|
|
9
|
+
allowedHeaders: options.allowedHeaders ?? ["Content-Type", "Authorization"],
|
|
10
|
+
allowedMethods: options.allowedMethods ?? ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
|
|
11
|
+
allowCredentials: options.allowCredentials ?? false,
|
|
12
|
+
maxAge: options.maxAge ?? 86400,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
async execute(req, res, chain) {
|
|
16
|
+
const { origin, allowedHeaders, allowedMethods, allowCredentials, maxAge } = this.options;
|
|
17
|
+
// Resolve origin — if array, match against request origin
|
|
18
|
+
let allowedOrigin;
|
|
19
|
+
if (Array.isArray(origin)) {
|
|
20
|
+
const requestOrigin = req.headers["origin"] ?? "";
|
|
21
|
+
allowedOrigin = origin.includes(requestOrigin) ? requestOrigin : origin[0] ?? "*";
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
allowedOrigin = origin;
|
|
25
|
+
}
|
|
26
|
+
res.setHeader("Access-Control-Allow-Origin", allowedOrigin);
|
|
27
|
+
res.setHeader("Access-Control-Allow-Headers", allowedHeaders.join(", "));
|
|
28
|
+
res.setHeader("Access-Control-Allow-Methods", allowedMethods.join(", "));
|
|
29
|
+
if (allowCredentials) {
|
|
30
|
+
res.setHeader("Access-Control-Allow-Credentials", "true");
|
|
31
|
+
}
|
|
32
|
+
// Preflight
|
|
33
|
+
if (req.method === "OPTIONS") {
|
|
34
|
+
res.setHeader("Access-Control-Max-Age", String(maxAge));
|
|
35
|
+
res.status(204).end();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
await chain.next(req, res);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=CorsFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CorsFilter.js","sourceRoot":"","sources":["../../../src/filters/builtins/CorsFilter.ts"],"names":[],"mappings":"AACA,OAAO,gCAAgC,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAgBhD,MAAM,OAAO,UAAW,SAAQ,YAAY;IACzB,OAAO,CAA6B;IAErD,YAAY,UAA6B,EAAE;QACzC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,OAAO,GAAG;YACb,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG;YAC7B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC;YAC3E,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;YAC9F,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,KAAK;YACnD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;SAChC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,KAAkB;QAC3D,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAEzF,0DAA0D;QAC1D,IAAI,aAAqB,CAAA;QACzB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;YACjD,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAA;QACnF,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,MAAM,CAAA;QACxB,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,aAAa,CAAC,CAAA;QAC3D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACxE,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAExE,IAAI,gBAAgB,EAAE,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAA;QAC3D,CAAC;QAED,YAAY;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;YACvD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;YACrB,OAAM;QACR,CAAC;QAED,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC5B,CAAC;CACF"}
|