@carno.js/orm 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/LICENSE +674 -0
  2. package/dist/SqlBuilder.d.ts +103 -0
  3. package/dist/SqlBuilder.js +618 -0
  4. package/dist/cache/cache-key-generator.d.ts +13 -0
  5. package/dist/cache/cache-key-generator.js +66 -0
  6. package/dist/cache/query-cache-manager.d.ts +14 -0
  7. package/dist/cache/query-cache-manager.js +44 -0
  8. package/dist/common/email.vo.d.ts +4 -0
  9. package/dist/common/email.vo.js +11 -0
  10. package/dist/common/uuid.d.ts +4 -0
  11. package/dist/common/uuid.js +10 -0
  12. package/dist/common/value-object.d.ts +95 -0
  13. package/dist/common/value-object.js +99 -0
  14. package/dist/constants.d.ts +6 -0
  15. package/dist/constants.js +9 -0
  16. package/dist/decorators/computed.decorator.d.ts +1 -0
  17. package/dist/decorators/computed.decorator.js +12 -0
  18. package/dist/decorators/entity.decorator.d.ts +3 -0
  19. package/dist/decorators/entity.decorator.js +12 -0
  20. package/dist/decorators/enum.decorator.d.ts +2 -0
  21. package/dist/decorators/enum.decorator.js +16 -0
  22. package/dist/decorators/event-hook.decorator.d.ts +4 -0
  23. package/dist/decorators/event-hook.decorator.js +31 -0
  24. package/dist/decorators/index.decorator.d.ts +17 -0
  25. package/dist/decorators/index.decorator.js +36 -0
  26. package/dist/decorators/one-many.decorator.d.ts +6 -0
  27. package/dist/decorators/one-many.decorator.js +42 -0
  28. package/dist/decorators/primary-key.decorator.d.ts +2 -0
  29. package/dist/decorators/primary-key.decorator.js +8 -0
  30. package/dist/decorators/property.decorator.d.ts +24 -0
  31. package/dist/decorators/property.decorator.js +44 -0
  32. package/dist/decorators/unique.decorator.d.ts +9 -0
  33. package/dist/decorators/unique.decorator.js +44 -0
  34. package/dist/domain/base-entity.d.ts +57 -0
  35. package/dist/domain/base-entity.js +198 -0
  36. package/dist/domain/collection.d.ts +6 -0
  37. package/dist/domain/collection.js +15 -0
  38. package/dist/domain/entities.d.ts +49 -0
  39. package/dist/domain/entities.js +259 -0
  40. package/dist/domain/reference.d.ts +86 -0
  41. package/dist/domain/reference.js +86 -0
  42. package/dist/driver/bun-driver.base.d.ts +72 -0
  43. package/dist/driver/bun-driver.base.js +270 -0
  44. package/dist/driver/bun-mysql.driver.d.ts +53 -0
  45. package/dist/driver/bun-mysql.driver.js +256 -0
  46. package/dist/driver/bun-pg.driver.d.ts +52 -0
  47. package/dist/driver/bun-pg.driver.js +263 -0
  48. package/dist/driver/driver.interface.d.ts +333 -0
  49. package/dist/driver/driver.interface.js +2 -0
  50. package/dist/entry.d.ts +2 -0
  51. package/dist/entry.js +13 -0
  52. package/dist/identity-map/entity-key-generator.d.ts +10 -0
  53. package/dist/identity-map/entity-key-generator.js +45 -0
  54. package/dist/identity-map/entity-registry.d.ts +11 -0
  55. package/dist/identity-map/entity-registry.js +41 -0
  56. package/dist/identity-map/identity-map-context.d.ts +9 -0
  57. package/dist/identity-map/identity-map-context.js +22 -0
  58. package/dist/identity-map/identity-map-integration.d.ts +5 -0
  59. package/dist/identity-map/identity-map-integration.js +37 -0
  60. package/dist/identity-map/identity-map.d.ts +11 -0
  61. package/dist/identity-map/identity-map.js +35 -0
  62. package/dist/identity-map/index.d.ts +5 -0
  63. package/dist/identity-map/index.js +14 -0
  64. package/dist/index.d.ts +28 -0
  65. package/dist/index.js +48 -0
  66. package/dist/middleware/identity-map.middleware.d.ts +4 -0
  67. package/dist/middleware/identity-map.middleware.js +22 -0
  68. package/dist/orm-session-context.d.ts +16 -0
  69. package/dist/orm-session-context.js +22 -0
  70. package/dist/orm.d.ts +20 -0
  71. package/dist/orm.js +69 -0
  72. package/dist/orm.service.d.ts +13 -0
  73. package/dist/orm.service.js +361 -0
  74. package/dist/query/index-condition-builder.d.ts +41 -0
  75. package/dist/query/index-condition-builder.js +235 -0
  76. package/dist/query/model-transformer.d.ts +27 -0
  77. package/dist/query/model-transformer.js +201 -0
  78. package/dist/query/sql-column-manager.d.ts +28 -0
  79. package/dist/query/sql-column-manager.js +157 -0
  80. package/dist/query/sql-condition-builder.d.ts +51 -0
  81. package/dist/query/sql-condition-builder.js +264 -0
  82. package/dist/query/sql-join-manager.d.ts +39 -0
  83. package/dist/query/sql-join-manager.js +242 -0
  84. package/dist/query/sql-subquery-builder.d.ts +20 -0
  85. package/dist/query/sql-subquery-builder.js +119 -0
  86. package/dist/repository/Repository.d.ts +121 -0
  87. package/dist/repository/Repository.js +174 -0
  88. package/dist/testing/index.d.ts +1 -0
  89. package/dist/testing/index.js +17 -0
  90. package/dist/testing/with-database.d.ts +20 -0
  91. package/dist/testing/with-database.js +311 -0
  92. package/dist/transaction/transaction-context.d.ts +10 -0
  93. package/dist/transaction/transaction-context.js +19 -0
  94. package/dist/utils/value-processor.d.ts +14 -0
  95. package/dist/utils/value-processor.js +94 -0
  96. package/dist/utils.d.ts +3 -0
  97. package/dist/utils.js +24 -0
  98. package/package.json +59 -0
package/dist/index.js ADDED
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.identityMapContext = exports.IdentityMapMiddleware = exports.transactionContext = exports.EntityStorage = void 0;
18
+ __exportStar(require("./decorators/entity.decorator"), exports);
19
+ __exportStar(require("./decorators/property.decorator"), exports);
20
+ __exportStar(require("./decorators/primary-key.decorator"), exports);
21
+ __exportStar(require("./decorators/one-many.decorator"), exports);
22
+ __exportStar(require("./decorators/index.decorator"), exports);
23
+ __exportStar(require("./decorators/unique.decorator"), exports);
24
+ __exportStar(require("./decorators/event-hook.decorator"), exports);
25
+ __exportStar(require("./decorators/enum.decorator"), exports);
26
+ __exportStar(require("./decorators/computed.decorator"), exports);
27
+ __exportStar(require("./orm"), exports);
28
+ __exportStar(require("./orm.service"), exports);
29
+ __exportStar(require("./domain/base-entity"), exports);
30
+ __exportStar(require("./domain/reference"), exports);
31
+ var entities_1 = require("./domain/entities");
32
+ Object.defineProperty(exports, "EntityStorage", { enumerable: true, get: function () { return entities_1.EntityStorage; } });
33
+ __exportStar(require("./driver/bun-pg.driver"), exports);
34
+ __exportStar(require("./driver/bun-mysql.driver"), exports);
35
+ __exportStar(require("./driver/bun-driver.base"), exports);
36
+ __exportStar(require("./utils"), exports);
37
+ __exportStar(require("./driver/driver.interface"), exports);
38
+ __exportStar(require("./entry"), exports);
39
+ __exportStar(require("./common/value-object"), exports);
40
+ __exportStar(require("./common/email.vo"), exports);
41
+ __exportStar(require("./common/uuid"), exports);
42
+ __exportStar(require("./repository/Repository"), exports);
43
+ var transaction_context_1 = require("./transaction/transaction-context");
44
+ Object.defineProperty(exports, "transactionContext", { enumerable: true, get: function () { return transaction_context_1.transactionContext; } });
45
+ var identity_map_middleware_1 = require("./middleware/identity-map.middleware");
46
+ Object.defineProperty(exports, "IdentityMapMiddleware", { enumerable: true, get: function () { return identity_map_middleware_1.IdentityMapMiddleware; } });
47
+ var identity_map_1 = require("./identity-map");
48
+ Object.defineProperty(exports, "identityMapContext", { enumerable: true, get: function () { return identity_map_1.identityMapContext; } });
@@ -0,0 +1,4 @@
1
+ import { CarnoMiddleware, Context } from '@carno.js/core';
2
+ export declare class IdentityMapMiddleware implements CarnoMiddleware {
3
+ handle(ctx: Context, next: () => void): Promise<void>;
4
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.IdentityMapMiddleware = void 0;
10
+ const core_1 = require("@carno.js/core");
11
+ const identity_map_1 = require("../identity-map");
12
+ let IdentityMapMiddleware = class IdentityMapMiddleware {
13
+ async handle(ctx, next) {
14
+ await identity_map_1.identityMapContext.run(async () => {
15
+ await next();
16
+ });
17
+ }
18
+ };
19
+ exports.IdentityMapMiddleware = IdentityMapMiddleware;
20
+ exports.IdentityMapMiddleware = IdentityMapMiddleware = __decorate([
21
+ (0, core_1.Injectable)()
22
+ ], IdentityMapMiddleware);
@@ -0,0 +1,16 @@
1
+ import type { Orm } from './orm';
2
+ import type { EntityStorage } from './domain/entities';
3
+ type OrmSession = {
4
+ orm: Orm<any>;
5
+ storage: EntityStorage;
6
+ };
7
+ declare class OrmSessionContext {
8
+ private storage;
9
+ constructor();
10
+ run<T>(session: OrmSession, routine: () => Promise<T>): Promise<T>;
11
+ getOrm(): Orm<any> | undefined;
12
+ getStorage(): EntityStorage | undefined;
13
+ hasContext(): boolean;
14
+ }
15
+ export declare const ormSessionContext: OrmSessionContext;
16
+ export type { OrmSession };
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ormSessionContext = void 0;
4
+ const async_hooks_1 = require("async_hooks");
5
+ class OrmSessionContext {
6
+ constructor() {
7
+ this.storage = new async_hooks_1.AsyncLocalStorage();
8
+ }
9
+ run(session, routine) {
10
+ return this.storage.run(session, routine);
11
+ }
12
+ getOrm() {
13
+ return this.storage.getStore()?.orm;
14
+ }
15
+ getStorage() {
16
+ return this.storage.getStore()?.storage;
17
+ }
18
+ hasContext() {
19
+ return this.storage.getStore() !== undefined;
20
+ }
21
+ }
22
+ exports.ormSessionContext = new OrmSessionContext();
package/dist/orm.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { ConnectionSettings, DriverInterface } from './driver/driver.interface';
2
+ import { LoggerService, CacheService } from '@carno.js/core';
3
+ import { SqlBuilder } from './SqlBuilder';
4
+ import { QueryCacheManager } from './cache/query-cache-manager';
5
+ export declare class Orm<T extends DriverInterface = DriverInterface> {
6
+ logger: LoggerService;
7
+ cacheService?: CacheService;
8
+ driverInstance: T;
9
+ static instance: Orm<any>;
10
+ connection: ConnectionSettings<T>;
11
+ queryCacheManager?: QueryCacheManager;
12
+ constructor(logger: LoggerService, cacheService?: CacheService);
13
+ private initializeQueryCacheManager;
14
+ static getInstance(): Orm<any>;
15
+ setConnection(connection: ConnectionSettings<T>): void;
16
+ createQueryBuilder<Model>(model: new () => Model): SqlBuilder<Model>;
17
+ connect(): Promise<void>;
18
+ disconnect(): Promise<void>;
19
+ transaction<ResultType>(operation: (tx: unknown) => Promise<ResultType>): Promise<ResultType>;
20
+ }
package/dist/orm.js ADDED
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var Orm_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.Orm = void 0;
14
+ const core_1 = require("@carno.js/core");
15
+ const SqlBuilder_1 = require("./SqlBuilder");
16
+ const query_cache_manager_1 = require("./cache/query-cache-manager");
17
+ const transaction_context_1 = require("./transaction/transaction-context");
18
+ const orm_session_context_1 = require("./orm-session-context");
19
+ let Orm = Orm_1 = class Orm {
20
+ constructor(logger, cacheService) {
21
+ this.logger = logger;
22
+ this.cacheService = cacheService;
23
+ Orm_1.instance = this;
24
+ this.initializeQueryCacheManager();
25
+ }
26
+ initializeQueryCacheManager() {
27
+ if (this.cacheService) {
28
+ this.queryCacheManager = new query_cache_manager_1.QueryCacheManager(this.cacheService);
29
+ }
30
+ }
31
+ static getInstance() {
32
+ const scoped = orm_session_context_1.ormSessionContext.getOrm();
33
+ if (scoped) {
34
+ return scoped;
35
+ }
36
+ return Orm_1.instance;
37
+ }
38
+ setConnection(connection) {
39
+ this.connection = connection;
40
+ // @ts-ignore
41
+ this.driverInstance = new this.connection.driver(connection);
42
+ }
43
+ createQueryBuilder(model) {
44
+ return new SqlBuilder_1.SqlBuilder(model);
45
+ }
46
+ connect() {
47
+ return this.driverInstance.connect();
48
+ }
49
+ disconnect() {
50
+ return this.driverInstance.disconnect();
51
+ }
52
+ async transaction(operation) {
53
+ if (!this.driverInstance) {
54
+ throw new Error('Driver instance not initialized');
55
+ }
56
+ if (transaction_context_1.transactionContext.hasContext()) {
57
+ return operation(transaction_context_1.transactionContext.getContext());
58
+ }
59
+ return this.driverInstance.transaction(async (tx) => {
60
+ return transaction_context_1.transactionContext.run(tx, () => operation(tx));
61
+ });
62
+ }
63
+ };
64
+ exports.Orm = Orm;
65
+ exports.Orm = Orm = Orm_1 = __decorate([
66
+ (0, core_1.Service)(),
67
+ __metadata("design:paramtypes", [core_1.LoggerService,
68
+ core_1.CacheService])
69
+ ], Orm);
@@ -0,0 +1,13 @@
1
+ import { EntityStorage } from './domain/entities';
2
+ import { Orm } from './orm';
3
+ export declare class OrmService {
4
+ private orm;
5
+ private storage;
6
+ private allEntities;
7
+ private project;
8
+ constructor(orm: Orm, storage: EntityStorage, entityFile?: string);
9
+ private discoverRelationshipTypes;
10
+ private discoverEnumTypes;
11
+ onInit(customConfig?: any): Promise<void>;
12
+ private getSourceFilePaths;
13
+ }
@@ -0,0 +1,361 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.OrmService = void 0;
49
+ const core_1 = require("@carno.js/core");
50
+ const entities_1 = require("./domain/entities");
51
+ const constants_1 = require("./constants");
52
+ const ts_morph_1 = require("ts-morph");
53
+ const orm_1 = require("./orm");
54
+ const globby = __importStar(require("globby"));
55
+ const path_1 = __importDefault(require("path"));
56
+ let OrmService = class OrmService {
57
+ constructor(orm, storage, entityFile) {
58
+ this.orm = orm;
59
+ this.storage = storage;
60
+ this.allEntities = new Map();
61
+ this.project = new ts_morph_1.Project({ skipLoadingLibFiles: true });
62
+ const files = this.project.addSourceFilesAtPaths(entityFile ?? this.getSourceFilePaths());
63
+ files.forEach(file => {
64
+ file.getClasses().forEach(classDeclaration => {
65
+ if (classDeclaration.getDecorator('Entity')) {
66
+ const properties = classDeclaration.getProperties();
67
+ const nullables = [];
68
+ const defaults = {};
69
+ const extendsClass = classDeclaration.getBaseClass();
70
+ if (extendsClass) {
71
+ const extendsProperties = extendsClass.getProperties();
72
+ properties.push(...extendsProperties);
73
+ }
74
+ properties.forEach(property => {
75
+ const propertyName = property.getName();
76
+ const isNullable = property.hasQuestionToken();
77
+ const initializer = property.getInitializer();
78
+ if (isNullable) {
79
+ nullables.push(propertyName);
80
+ }
81
+ if (initializer) {
82
+ const initializerKind = initializer.getKind();
83
+ switch (initializerKind) {
84
+ case ts_morph_1.SyntaxKind.StringLiteral:
85
+ defaults[propertyName] = initializer.getText();
86
+ break;
87
+ case ts_morph_1.SyntaxKind.NumericLiteral:
88
+ defaults[propertyName] = parseFloat(initializer.getText());
89
+ break;
90
+ case ts_morph_1.SyntaxKind.NewExpression:
91
+ case ts_morph_1.SyntaxKind.CallExpression:
92
+ break;
93
+ default:
94
+ break;
95
+ }
96
+ }
97
+ this.allEntities.set(classDeclaration.getName(), { nullables, defaults });
98
+ });
99
+ }
100
+ });
101
+ });
102
+ }
103
+ discoverRelationshipTypes(files) {
104
+ const entityNameToClass = new Map();
105
+ const processedClasses = new Set();
106
+ const entities = core_1.Metadata.get(constants_1.ENTITIES, Reflect) || [];
107
+ for (const entity of entities) {
108
+ entityNameToClass.set(entity.target.name, entity.target);
109
+ }
110
+ files.forEach(file => {
111
+ file.getClasses().forEach(classDeclaration => {
112
+ if (!classDeclaration.getDecorator('Entity'))
113
+ return;
114
+ const className = classDeclaration.getName();
115
+ const targetClass = entityNameToClass.get(className);
116
+ if (!targetClass)
117
+ return;
118
+ processedClasses.add(className);
119
+ const relationships = core_1.Metadata.get(constants_1.PROPERTIES_RELATIONS, targetClass) || [];
120
+ classDeclaration.getProperties().forEach(property => {
121
+ const propertyName = property.getName();
122
+ const relationship = relationships.find(r => r.propertyKey === propertyName);
123
+ if (relationship && relationship.entity === '__AUTO_DETECT__' && relationship.relation === 'many-to-one') {
124
+ const typeNode = property.getTypeNode();
125
+ if (!typeNode)
126
+ return;
127
+ const entityTypeName = typeNode.getText().trim();
128
+ if (entityTypeName) {
129
+ const entityClass = entityNameToClass.get(entityTypeName);
130
+ if (entityClass) {
131
+ relationship.entity = () => entityClass;
132
+ }
133
+ else {
134
+ console.warn(`Warning: Could not find entity "${entityTypeName}" for relationship ` +
135
+ `"${className}.${propertyName}". Please define it explicitly.`);
136
+ }
137
+ }
138
+ }
139
+ });
140
+ core_1.Metadata.set(constants_1.PROPERTIES_RELATIONS, relationships, targetClass);
141
+ });
142
+ });
143
+ for (const entity of entities) {
144
+ if (processedClasses.has(entity.target.name))
145
+ continue;
146
+ const relationships = core_1.Metadata.get(constants_1.PROPERTIES_RELATIONS, entity.target) || [];
147
+ let updated = false;
148
+ for (const relationship of relationships) {
149
+ if (relationship.entity === '__AUTO_DETECT__' && relationship.relation === 'many-to-one') {
150
+ const propertyKey = relationship.propertyKey;
151
+ const capitalizedName = propertyKey.charAt(0).toUpperCase() + propertyKey.slice(1);
152
+ let entityClass = entityNameToClass.get(capitalizedName);
153
+ if (!entityClass) {
154
+ for (const [name, cls] of entityNameToClass) {
155
+ if (name.toLowerCase() === propertyKey.toLowerCase()) {
156
+ entityClass = cls;
157
+ break;
158
+ }
159
+ }
160
+ }
161
+ if (entityClass) {
162
+ relationship.entity = () => entityClass;
163
+ updated = true;
164
+ }
165
+ else {
166
+ console.warn(`Warning: Could not auto-detect entity for "${entity.target.name}.${propertyKey}". ` +
167
+ `Please define it explicitly.`);
168
+ }
169
+ }
170
+ }
171
+ if (updated) {
172
+ core_1.Metadata.set(constants_1.PROPERTIES_RELATIONS, relationships, entity.target);
173
+ }
174
+ }
175
+ }
176
+ discoverEnumTypes(files, entities) {
177
+ const entityNameToClass = new Map();
178
+ for (const entity of entities) {
179
+ entityNameToClass.set(entity.target.name, entity.target);
180
+ }
181
+ files.forEach(file => {
182
+ file.getClasses().forEach(classDeclaration => {
183
+ if (!classDeclaration.getDecorator('Entity'))
184
+ return;
185
+ const className = classDeclaration.getName();
186
+ const targetClass = entityNameToClass.get(className);
187
+ if (!targetClass)
188
+ return;
189
+ const properties = core_1.Metadata.get(constants_1.PROPERTIES_METADATA, targetClass) || {};
190
+ classDeclaration.getProperties().forEach(property => {
191
+ const propertyName = property.getName();
192
+ const propertyMetadata = properties[propertyName];
193
+ if (propertyMetadata?.options?.enumItems === '__AUTO_DETECT__') {
194
+ const typeNode = property.getTypeNode();
195
+ if (!typeNode)
196
+ return;
197
+ const enumTypeName = typeNode.getText().trim();
198
+ const enumArrayMatch = enumTypeName.match(/^(.+)\[\]$/);
199
+ const actualEnumName = enumArrayMatch ? enumArrayMatch[1] : enumTypeName;
200
+ const sourceFile = file;
201
+ const enumDeclaration = sourceFile.getEnum(actualEnumName);
202
+ if (enumDeclaration) {
203
+ const enumMembers = enumDeclaration.getMembers();
204
+ const enumValues = enumMembers.map(member => {
205
+ const value = member.getValue();
206
+ return value !== undefined ? value : member.getName();
207
+ });
208
+ propertyMetadata.options.enumItems = enumValues;
209
+ if (enumArrayMatch) {
210
+ propertyMetadata.options.array = true;
211
+ }
212
+ }
213
+ else {
214
+ const allSourceFiles = sourceFile.getProject().getSourceFiles();
215
+ let foundEnum = false;
216
+ for (const sf of allSourceFiles) {
217
+ const importedEnum = sf.getEnum(actualEnumName);
218
+ if (importedEnum) {
219
+ const enumMembers = importedEnum.getMembers();
220
+ const enumValues = enumMembers.map(member => {
221
+ const value = member.getValue();
222
+ return value !== undefined ? value : member.getName();
223
+ });
224
+ propertyMetadata.options.enumItems = enumValues;
225
+ if (enumArrayMatch) {
226
+ propertyMetadata.options.array = true;
227
+ }
228
+ foundEnum = true;
229
+ break;
230
+ }
231
+ }
232
+ if (!foundEnum) {
233
+ console.warn(`Warning: Could not find enum "${actualEnumName}" for property ` +
234
+ `"${className}.${propertyName}". Please define it explicitly.`);
235
+ }
236
+ }
237
+ }
238
+ });
239
+ core_1.Metadata.set(constants_1.PROPERTIES_METADATA, properties, targetClass);
240
+ });
241
+ });
242
+ }
243
+ async onInit(customConfig = {}) {
244
+ const hasCustomConfig = Object.keys(customConfig).length > 0;
245
+ let config = null;
246
+ let setConfig;
247
+ if (!hasCustomConfig) {
248
+ const configFile = globby.sync('carno.config.ts', { absolute: true });
249
+ if (configFile.length === 0) {
250
+ console.log('No config file found!');
251
+ return;
252
+ }
253
+ config = await Promise.resolve(`${configFile[0]}`).then(s => __importStar(require(s)));
254
+ setConfig = config.default;
255
+ }
256
+ else {
257
+ setConfig = customConfig;
258
+ }
259
+ this.orm.setConnection(setConfig);
260
+ await this.orm.connect();
261
+ if (config && typeof config.default.entities === 'string') {
262
+ const files = globby.sync([config.default.entities, '!node_modules'], { gitignore: true, absolute: true });
263
+ for (const file of files) {
264
+ await Promise.resolve(`${file}`).then(s => __importStar(require(s)));
265
+ }
266
+ }
267
+ let entities = core_1.Metadata.get(constants_1.ENTITIES, Reflect);
268
+ if (!entities) {
269
+ const entityPaths = this.getSourceFilePaths();
270
+ const entityFiles = globby.sync(entityPaths.filter(path => path.includes('.entity.') || path.includes('entities/')));
271
+ for (const file of entityFiles) {
272
+ try {
273
+ await Promise.resolve(`${file}`).then(s => __importStar(require(s)));
274
+ }
275
+ catch (error) {
276
+ console.warn(`Failed to import entity file ${file}:`, error);
277
+ }
278
+ }
279
+ entities = core_1.Metadata.get(constants_1.ENTITIES, Reflect);
280
+ }
281
+ if (!entities) {
282
+ console.log('No entities found!');
283
+ return;
284
+ }
285
+ const files = this.project.getSourceFiles();
286
+ this.discoverRelationshipTypes(files);
287
+ this.discoverEnumTypes(files, entities);
288
+ for (const entity of entities) {
289
+ const nullableDefaultEntity = this.allEntities.get(entity.target.name);
290
+ const propertiesFromMetadata = core_1.Metadata.get(constants_1.PROPERTIES_METADATA, entity.target);
291
+ const relationshipsFromMetadata = core_1.Metadata.get(constants_1.PROPERTIES_RELATIONS, entity.target) || [];
292
+ const hooks = core_1.Metadata.get(constants_1.EVENTS_METADATA, entity.target);
293
+ // Cria uma cópia profunda das propriedades para evitar mutação compartilhada
294
+ const properties = {};
295
+ if (propertiesFromMetadata) {
296
+ for (const [key, value] of Object.entries(propertiesFromMetadata)) {
297
+ properties[key] = {
298
+ type: value.type,
299
+ options: { ...value.options }
300
+ };
301
+ }
302
+ }
303
+ for (const property in properties) {
304
+ if (nullableDefaultEntity?.nullables.includes(property)) {
305
+ properties[property].options.nullable = true;
306
+ }
307
+ if (nullableDefaultEntity?.defaults[property]) {
308
+ properties[property].options.default = nullableDefaultEntity?.defaults[property];
309
+ }
310
+ }
311
+ const relationships = relationshipsFromMetadata.map((relation) => ({ ...relation }));
312
+ for (const relation of relationships) {
313
+ const relationKey = String(relation.propertyKey);
314
+ if (nullableDefaultEntity?.nullables.includes(relationKey)) {
315
+ relation.nullable = true;
316
+ }
317
+ }
318
+ this.storage.add(entity, properties, relationships, hooks);
319
+ }
320
+ }
321
+ getSourceFilePaths() {
322
+ const projectRoot = process.cwd();
323
+ const patterns = [
324
+ '**/*.entity.ts',
325
+ '**/entities/**/*.ts',
326
+ '**/entity/**/*.ts',
327
+ '**/*.entity.js',
328
+ '**/entities/**/*.js',
329
+ '**/entity/**/*.js',
330
+ '!**/node_modules/**',
331
+ '!**/test/**',
332
+ '!**/tests/**',
333
+ '!**/*.spec.ts',
334
+ '!**/*.test.ts',
335
+ '!**/*.spec.js',
336
+ '!**/*.test.js',
337
+ '!**/dist/**',
338
+ '!**/build/**'
339
+ ];
340
+ try {
341
+ return globby
342
+ .sync(patterns, { cwd: projectRoot, gitignore: true, absolute: false })
343
+ .map((filePath) => path_1.default.resolve(projectRoot, filePath));
344
+ }
345
+ catch (error) {
346
+ console.error('Erro ao obter arquivos:', error);
347
+ return [];
348
+ }
349
+ }
350
+ };
351
+ exports.OrmService = OrmService;
352
+ __decorate([
353
+ (0, core_1.OnApplicationInit)(),
354
+ __metadata("design:type", Function),
355
+ __metadata("design:paramtypes", [Object]),
356
+ __metadata("design:returntype", Promise)
357
+ ], OrmService.prototype, "onInit", null);
358
+ exports.OrmService = OrmService = __decorate([
359
+ (0, core_1.Service)(),
360
+ __metadata("design:paramtypes", [orm_1.Orm, entities_1.EntityStorage, String])
361
+ ], OrmService);
@@ -0,0 +1,41 @@
1
+ import { FilterQuery } from '../driver/driver.interface';
2
+ export declare class IndexConditionBuilder<T> {
3
+ private columnMap;
4
+ private readonly OPERATORS;
5
+ private lastKeyNotOperator;
6
+ constructor(columnMap: Record<string, string>);
7
+ build(condition: FilterQuery<T>): string;
8
+ private processConditions;
9
+ private getEntries;
10
+ private processEntries;
11
+ private processEntry;
12
+ private handleScalarValue;
13
+ private handleObjectValue;
14
+ private buildLogicalOperatorCondition;
15
+ private buildOperatorConditions;
16
+ private buildOperatorCondition;
17
+ private buildSimpleCondition;
18
+ private buildInCondition;
19
+ private buildNotInCondition;
20
+ private buildLikeCondition;
21
+ private buildComparisonCondition;
22
+ private buildNestedLogicalCondition;
23
+ private buildNorCondition;
24
+ private wrapWithLogicalOperator;
25
+ private extractValueFromValueObject;
26
+ private formatValue;
27
+ private formatDate;
28
+ private isNullish;
29
+ private isPrimitive;
30
+ private formatPrimitive;
31
+ private formatJson;
32
+ private escapeString;
33
+ private isScalarValue;
34
+ private isArrayValue;
35
+ private isLogicalOperator;
36
+ private isNorOperator;
37
+ private extractLogicalOperator;
38
+ private trackLastNonOperatorKey;
39
+ private resolveColumnName;
40
+ private buildNullCondition;
41
+ }