@yandjin-mikro-orm/core 6.1.4-rc-sti-changes-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/EntityManager.d.ts +553 -0
  2. package/EntityManager.js +1736 -0
  3. package/LICENSE +21 -0
  4. package/MikroORM.d.ts +102 -0
  5. package/MikroORM.js +258 -0
  6. package/README.md +383 -0
  7. package/cache/CacheAdapter.d.ts +40 -0
  8. package/cache/CacheAdapter.js +2 -0
  9. package/cache/FileCacheAdapter.d.ts +31 -0
  10. package/cache/FileCacheAdapter.js +90 -0
  11. package/cache/GeneratedCacheAdapter.d.ts +25 -0
  12. package/cache/GeneratedCacheAdapter.js +38 -0
  13. package/cache/MemoryCacheAdapter.d.ts +24 -0
  14. package/cache/MemoryCacheAdapter.js +44 -0
  15. package/cache/NullCacheAdapter.d.ts +19 -0
  16. package/cache/NullCacheAdapter.js +30 -0
  17. package/cache/index.d.ts +5 -0
  18. package/cache/index.js +21 -0
  19. package/connections/Connection.d.ts +85 -0
  20. package/connections/Connection.js +128 -0
  21. package/connections/index.d.ts +1 -0
  22. package/connections/index.js +17 -0
  23. package/decorators/Check.d.ts +3 -0
  24. package/decorators/Check.js +17 -0
  25. package/decorators/CreateRequestContext.d.ts +2 -0
  26. package/decorators/CreateRequestContext.js +31 -0
  27. package/decorators/Embeddable.d.ts +8 -0
  28. package/decorators/Embeddable.js +15 -0
  29. package/decorators/Embedded.d.ts +13 -0
  30. package/decorators/Embedded.js +21 -0
  31. package/decorators/EnsureRequestContext.d.ts +2 -0
  32. package/decorators/EnsureRequestContext.js +26 -0
  33. package/decorators/Entity.d.ts +18 -0
  34. package/decorators/Entity.js +17 -0
  35. package/decorators/Enum.d.ts +9 -0
  36. package/decorators/Enum.js +20 -0
  37. package/decorators/Filter.d.ts +2 -0
  38. package/decorators/Filter.js +12 -0
  39. package/decorators/Formula.d.ts +5 -0
  40. package/decorators/Formula.js +19 -0
  41. package/decorators/Indexed.d.ts +12 -0
  42. package/decorators/Indexed.js +25 -0
  43. package/decorators/ManyToMany.d.ts +21 -0
  44. package/decorators/ManyToMany.js +17 -0
  45. package/decorators/ManyToOne.d.ts +15 -0
  46. package/decorators/ManyToOne.js +17 -0
  47. package/decorators/OneToMany.d.ts +18 -0
  48. package/decorators/OneToMany.js +21 -0
  49. package/decorators/OneToOne.d.ts +12 -0
  50. package/decorators/OneToOne.js +11 -0
  51. package/decorators/PrimaryKey.d.ts +8 -0
  52. package/decorators/PrimaryKey.js +24 -0
  53. package/decorators/Property.d.ts +218 -0
  54. package/decorators/Property.js +35 -0
  55. package/decorators/Subscriber.d.ts +1 -0
  56. package/decorators/Subscriber.js +2 -0
  57. package/decorators/hooks.d.ts +16 -0
  58. package/decorators/hooks.js +60 -0
  59. package/decorators/index.d.ts +17 -0
  60. package/decorators/index.js +36 -0
  61. package/drivers/DatabaseDriver.d.ts +72 -0
  62. package/drivers/DatabaseDriver.js +358 -0
  63. package/drivers/IDatabaseDriver.d.ts +193 -0
  64. package/drivers/IDatabaseDriver.js +4 -0
  65. package/drivers/index.d.ts +2 -0
  66. package/drivers/index.js +18 -0
  67. package/entity/ArrayCollection.d.ts +113 -0
  68. package/entity/ArrayCollection.js +386 -0
  69. package/entity/BaseEntity.d.ts +22 -0
  70. package/entity/BaseEntity.js +47 -0
  71. package/entity/Collection.d.ts +104 -0
  72. package/entity/Collection.js +373 -0
  73. package/entity/EntityAssigner.d.ts +28 -0
  74. package/entity/EntityAssigner.js +226 -0
  75. package/entity/EntityFactory.d.ts +41 -0
  76. package/entity/EntityFactory.js +302 -0
  77. package/entity/EntityHelper.d.ts +29 -0
  78. package/entity/EntityHelper.js +250 -0
  79. package/entity/EntityIdentifier.d.ts +10 -0
  80. package/entity/EntityIdentifier.js +19 -0
  81. package/entity/EntityLoader.d.ts +65 -0
  82. package/entity/EntityLoader.js +579 -0
  83. package/entity/EntityRepository.d.ts +161 -0
  84. package/entity/EntityRepository.js +207 -0
  85. package/entity/EntityValidator.d.ts +19 -0
  86. package/entity/EntityValidator.js +152 -0
  87. package/entity/Reference.d.ts +89 -0
  88. package/entity/Reference.js +242 -0
  89. package/entity/WrappedEntity.d.ts +67 -0
  90. package/entity/WrappedEntity.js +146 -0
  91. package/entity/index.d.ts +13 -0
  92. package/entity/index.js +29 -0
  93. package/entity/wrap.d.ts +15 -0
  94. package/entity/wrap.js +26 -0
  95. package/enums.d.ts +160 -0
  96. package/enums.js +169 -0
  97. package/errors.d.ts +65 -0
  98. package/errors.js +222 -0
  99. package/events/EventManager.d.ts +17 -0
  100. package/events/EventManager.js +77 -0
  101. package/events/EventSubscriber.d.ts +39 -0
  102. package/events/EventSubscriber.js +2 -0
  103. package/events/TransactionEventBroadcaster.d.ts +11 -0
  104. package/events/TransactionEventBroadcaster.js +17 -0
  105. package/events/index.d.ts +3 -0
  106. package/events/index.js +19 -0
  107. package/exceptions.d.ts +104 -0
  108. package/exceptions.js +130 -0
  109. package/hydration/Hydrator.d.ts +23 -0
  110. package/hydration/Hydrator.js +51 -0
  111. package/hydration/ObjectHydrator.d.ts +24 -0
  112. package/hydration/ObjectHydrator.js +332 -0
  113. package/hydration/index.d.ts +2 -0
  114. package/hydration/index.js +18 -0
  115. package/index.d.ts +25 -0
  116. package/index.js +50 -0
  117. package/index.mjs +192 -0
  118. package/logging/DefaultLogger.d.ts +32 -0
  119. package/logging/DefaultLogger.js +90 -0
  120. package/logging/Logger.d.ts +56 -0
  121. package/logging/Logger.js +2 -0
  122. package/logging/SimpleLogger.d.ts +17 -0
  123. package/logging/SimpleLogger.js +31 -0
  124. package/logging/colors.d.ts +9 -0
  125. package/logging/colors.js +20 -0
  126. package/logging/index.d.ts +4 -0
  127. package/logging/index.js +20 -0
  128. package/metadata/EntitySchema.d.ts +74 -0
  129. package/metadata/EntitySchema.js +293 -0
  130. package/metadata/MetadataDiscovery.d.ts +71 -0
  131. package/metadata/MetadataDiscovery.js +1244 -0
  132. package/metadata/MetadataProvider.d.ts +11 -0
  133. package/metadata/MetadataProvider.js +23 -0
  134. package/metadata/MetadataStorage.d.ts +22 -0
  135. package/metadata/MetadataStorage.js +87 -0
  136. package/metadata/MetadataValidator.d.ts +24 -0
  137. package/metadata/MetadataValidator.js +213 -0
  138. package/metadata/ReflectMetadataProvider.d.ts +8 -0
  139. package/metadata/ReflectMetadataProvider.js +48 -0
  140. package/metadata/index.d.ts +6 -0
  141. package/metadata/index.js +22 -0
  142. package/naming-strategy/AbstractNamingStrategy.d.ts +18 -0
  143. package/naming-strategy/AbstractNamingStrategy.js +48 -0
  144. package/naming-strategy/EntityCaseNamingStrategy.d.ts +12 -0
  145. package/naming-strategy/EntityCaseNamingStrategy.js +32 -0
  146. package/naming-strategy/MongoNamingStrategy.d.ts +9 -0
  147. package/naming-strategy/MongoNamingStrategy.js +25 -0
  148. package/naming-strategy/NamingStrategy.d.ts +52 -0
  149. package/naming-strategy/NamingStrategy.js +2 -0
  150. package/naming-strategy/UnderscoreNamingStrategy.d.ts +10 -0
  151. package/naming-strategy/UnderscoreNamingStrategy.js +28 -0
  152. package/naming-strategy/index.d.ts +5 -0
  153. package/naming-strategy/index.js +21 -0
  154. package/package.json +70 -0
  155. package/platforms/ExceptionConverter.d.ts +5 -0
  156. package/platforms/ExceptionConverter.js +11 -0
  157. package/platforms/Platform.d.ts +201 -0
  158. package/platforms/Platform.js +452 -0
  159. package/platforms/index.d.ts +2 -0
  160. package/platforms/index.js +18 -0
  161. package/serialization/EntitySerializer.d.ts +34 -0
  162. package/serialization/EntitySerializer.js +206 -0
  163. package/serialization/EntityTransformer.d.ts +8 -0
  164. package/serialization/EntityTransformer.js +192 -0
  165. package/serialization/SerializationContext.d.ts +30 -0
  166. package/serialization/SerializationContext.js +111 -0
  167. package/serialization/index.d.ts +3 -0
  168. package/serialization/index.js +19 -0
  169. package/types/ArrayType.d.ts +13 -0
  170. package/types/ArrayType.js +47 -0
  171. package/types/BigIntType.d.ts +16 -0
  172. package/types/BigIntType.js +45 -0
  173. package/types/BlobType.d.ts +10 -0
  174. package/types/BlobType.js +27 -0
  175. package/types/BooleanType.d.ts +8 -0
  176. package/types/BooleanType.js +16 -0
  177. package/types/DateTimeType.d.ts +8 -0
  178. package/types/DateTimeType.js +16 -0
  179. package/types/DateType.d.ts +8 -0
  180. package/types/DateType.js +16 -0
  181. package/types/DecimalType.d.ts +11 -0
  182. package/types/DecimalType.js +22 -0
  183. package/types/DoubleType.d.ts +11 -0
  184. package/types/DoubleType.js +22 -0
  185. package/types/EnumArrayType.d.ts +9 -0
  186. package/types/EnumArrayType.js +32 -0
  187. package/types/EnumType.d.ts +8 -0
  188. package/types/EnumType.js +16 -0
  189. package/types/FloatType.d.ts +8 -0
  190. package/types/FloatType.js +16 -0
  191. package/types/IntegerType.d.ts +8 -0
  192. package/types/IntegerType.js +16 -0
  193. package/types/IntervalType.d.ts +8 -0
  194. package/types/IntervalType.js +16 -0
  195. package/types/JsonType.d.ts +13 -0
  196. package/types/JsonType.js +34 -0
  197. package/types/MediumIntType.d.ts +6 -0
  198. package/types/MediumIntType.js +10 -0
  199. package/types/SmallIntType.d.ts +8 -0
  200. package/types/SmallIntType.js +16 -0
  201. package/types/StringType.d.ts +8 -0
  202. package/types/StringType.js +16 -0
  203. package/types/TextType.d.ts +8 -0
  204. package/types/TextType.js +16 -0
  205. package/types/TimeType.d.ts +9 -0
  206. package/types/TimeType.js +23 -0
  207. package/types/TinyIntType.d.ts +8 -0
  208. package/types/TinyIntType.js +16 -0
  209. package/types/Type.d.ts +64 -0
  210. package/types/Type.js +84 -0
  211. package/types/Uint8ArrayType.d.ts +11 -0
  212. package/types/Uint8ArrayType.js +37 -0
  213. package/types/UnknownType.d.ts +7 -0
  214. package/types/UnknownType.js +13 -0
  215. package/types/UuidType.d.ts +7 -0
  216. package/types/UuidType.js +13 -0
  217. package/types/index.d.ts +75 -0
  218. package/types/index.js +77 -0
  219. package/typings.d.ts +767 -0
  220. package/typings.js +198 -0
  221. package/unit-of-work/ChangeSet.d.ts +34 -0
  222. package/unit-of-work/ChangeSet.js +62 -0
  223. package/unit-of-work/ChangeSetComputer.d.ts +26 -0
  224. package/unit-of-work/ChangeSetComputer.js +153 -0
  225. package/unit-of-work/ChangeSetPersister.d.ts +50 -0
  226. package/unit-of-work/ChangeSetPersister.js +361 -0
  227. package/unit-of-work/CommitOrderCalculator.d.ts +62 -0
  228. package/unit-of-work/CommitOrderCalculator.js +113 -0
  229. package/unit-of-work/IdentityMap.d.ts +17 -0
  230. package/unit-of-work/IdentityMap.js +84 -0
  231. package/unit-of-work/UnitOfWork.d.ts +124 -0
  232. package/unit-of-work/UnitOfWork.js +1013 -0
  233. package/unit-of-work/index.d.ts +6 -0
  234. package/unit-of-work/index.js +22 -0
  235. package/utils/AbstractSchemaGenerator.d.ts +38 -0
  236. package/utils/AbstractSchemaGenerator.js +101 -0
  237. package/utils/Configuration.d.ts +390 -0
  238. package/utils/Configuration.js +357 -0
  239. package/utils/ConfigurationLoader.d.ts +29 -0
  240. package/utils/ConfigurationLoader.js +282 -0
  241. package/utils/Cursor.d.ts +77 -0
  242. package/utils/Cursor.js +169 -0
  243. package/utils/DataloaderUtils.d.ts +43 -0
  244. package/utils/DataloaderUtils.js +194 -0
  245. package/utils/EntityComparator.d.ts +73 -0
  246. package/utils/EntityComparator.js +568 -0
  247. package/utils/NullHighlighter.d.ts +4 -0
  248. package/utils/NullHighlighter.js +9 -0
  249. package/utils/QueryHelper.d.ts +28 -0
  250. package/utils/QueryHelper.js +228 -0
  251. package/utils/RawQueryFragment.d.ts +96 -0
  252. package/utils/RawQueryFragment.js +188 -0
  253. package/utils/RequestContext.d.ts +34 -0
  254. package/utils/RequestContext.js +54 -0
  255. package/utils/TransactionContext.d.ts +19 -0
  256. package/utils/TransactionContext.js +34 -0
  257. package/utils/Utils.d.ts +274 -0
  258. package/utils/Utils.js +1073 -0
  259. package/utils/clone.d.ts +6 -0
  260. package/utils/clone.js +127 -0
  261. package/utils/index.d.ts +13 -0
  262. package/utils/index.js +29 -0
  263. package/utils/upsert-utils.d.ts +6 -0
  264. package/utils/upsert-utils.js +33 -0
@@ -0,0 +1,11 @@
1
+ import type { EntityMetadata } from '../typings';
2
+ export interface IConfiguration {
3
+ get(key: string, defaultValue?: any): any;
4
+ }
5
+ export declare abstract class MetadataProvider {
6
+ protected readonly config: IConfiguration;
7
+ constructor(config: IConfiguration);
8
+ abstract loadEntityMetadata(meta: EntityMetadata, name: string): void;
9
+ loadFromCache(meta: EntityMetadata, cache: EntityMetadata): void;
10
+ useCache(): boolean;
11
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetadataProvider = void 0;
4
+ const Utils_1 = require("../utils/Utils");
5
+ class MetadataProvider {
6
+ config;
7
+ constructor(config) {
8
+ this.config = config;
9
+ }
10
+ loadFromCache(meta, cache) {
11
+ Object.values(cache.properties).forEach(prop => {
12
+ const metaProp = meta.properties[prop.name];
13
+ if (metaProp?.enum && Array.isArray(metaProp.items)) {
14
+ delete prop.items;
15
+ }
16
+ });
17
+ Utils_1.Utils.mergeConfig(meta, cache);
18
+ }
19
+ useCache() {
20
+ return this.config.get('metadataCache').enabled ?? false;
21
+ }
22
+ }
23
+ exports.MetadataProvider = MetadataProvider;
@@ -0,0 +1,22 @@
1
+ import { EntityMetadata, type Dictionary, type EntityData, type EntityName } from '../typings';
2
+ import type { EntityManager } from '../EntityManager';
3
+ export declare class MetadataStorage {
4
+ private static readonly metadata;
5
+ private readonly metadata;
6
+ constructor(metadata?: Dictionary<EntityMetadata>);
7
+ static getMetadata(): Dictionary<EntityMetadata>;
8
+ static getMetadata<T = any>(entity: string, path: string): EntityMetadata<T>;
9
+ static isKnownEntity(name: string): boolean;
10
+ static getMetadataFromDecorator<T = any>(target: T & Dictionary): EntityMetadata<T>;
11
+ static init(): MetadataStorage;
12
+ static clear(): void;
13
+ getAll(): Dictionary<EntityMetadata>;
14
+ getByDiscriminatorColumn<T>(meta: EntityMetadata<T>, data: EntityData<T>): EntityMetadata<T> | undefined;
15
+ get<T = any>(entityName: EntityName<T>, init?: boolean, validate?: boolean): EntityMetadata<T>;
16
+ find<T = any>(entityName: EntityName<T>): EntityMetadata<T> | undefined;
17
+ has(entity: string): boolean;
18
+ set(entity: string, meta: EntityMetadata): EntityMetadata;
19
+ reset(entity: string): void;
20
+ decorate(em: EntityManager): void;
21
+ [Symbol.iterator](): IterableIterator<EntityMetadata>;
22
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetadataStorage = void 0;
4
+ const typings_1 = require("../typings");
5
+ const Utils_1 = require("../utils/Utils");
6
+ const errors_1 = require("../errors");
7
+ const EntityHelper_1 = require("../entity/EntityHelper");
8
+ class MetadataStorage {
9
+ static metadata = Utils_1.Utils.getGlobalStorage('metadata');
10
+ metadata;
11
+ constructor(metadata = {}) {
12
+ this.metadata = Utils_1.Utils.copy(metadata, false);
13
+ }
14
+ static getMetadata(entity, path) {
15
+ const key = entity && path ? entity + '-' + Utils_1.Utils.hash(path) : null;
16
+ if (key && !MetadataStorage.metadata[key]) {
17
+ MetadataStorage.metadata[key] = new typings_1.EntityMetadata({ className: entity, path });
18
+ }
19
+ if (key) {
20
+ return MetadataStorage.metadata[key];
21
+ }
22
+ return MetadataStorage.metadata;
23
+ }
24
+ static isKnownEntity(name) {
25
+ return !!Object.values(this.metadata).find(meta => meta.className === name);
26
+ }
27
+ static getMetadataFromDecorator(target) {
28
+ const path = Utils_1.Utils.lookupPathFromDecorator(target.name);
29
+ const meta = MetadataStorage.getMetadata(target.name, path);
30
+ Object.defineProperty(target, '__path', { value: path, writable: true });
31
+ return meta;
32
+ }
33
+ static init() {
34
+ return new MetadataStorage(MetadataStorage.metadata);
35
+ }
36
+ static clear() {
37
+ Object.keys(this.metadata).forEach(k => delete this.metadata[k]);
38
+ }
39
+ getAll() {
40
+ return this.metadata;
41
+ }
42
+ getByDiscriminatorColumn(meta, data) {
43
+ const value = data[meta.root.discriminatorColumn];
44
+ if (!value) {
45
+ return undefined;
46
+ }
47
+ const type = meta.root.discriminatorMap[value];
48
+ return this.metadata[type];
49
+ }
50
+ get(entityName, init = false, validate = true) {
51
+ entityName = Utils_1.Utils.className(entityName);
52
+ if (validate && !init && !this.has(entityName)) {
53
+ throw errors_1.MetadataError.missingMetadata(entityName);
54
+ }
55
+ if (init && !this.has(entityName)) {
56
+ this.metadata[entityName] = new typings_1.EntityMetadata();
57
+ }
58
+ return this.metadata[entityName];
59
+ }
60
+ find(entityName) {
61
+ if (!entityName) {
62
+ return;
63
+ }
64
+ entityName = Utils_1.Utils.className(entityName);
65
+ return this.metadata[entityName];
66
+ }
67
+ has(entity) {
68
+ return entity in this.metadata;
69
+ }
70
+ set(entity, meta) {
71
+ return this.metadata[entity] = meta;
72
+ }
73
+ reset(entity) {
74
+ delete this.metadata[entity];
75
+ }
76
+ decorate(em) {
77
+ Object.values(this.metadata)
78
+ .filter(meta => meta.prototype)
79
+ .forEach(meta => EntityHelper_1.EntityHelper.decorate(meta, em));
80
+ }
81
+ *[Symbol.iterator]() {
82
+ for (const meta of Object.values(this.metadata)) {
83
+ yield meta;
84
+ }
85
+ }
86
+ }
87
+ exports.MetadataStorage = MetadataStorage;
@@ -0,0 +1,24 @@
1
+ import type { EntityMetadata } from '../typings';
2
+ import { type MetadataDiscoveryOptions } from '../utils';
3
+ import { ReferenceKind } from '../enums';
4
+ import type { MetadataStorage } from './MetadataStorage';
5
+ /**
6
+ * @internal
7
+ */
8
+ export declare class MetadataValidator {
9
+ /**
10
+ * Validate there is only one property decorator. This disallows using `@Property()` together with e.g. `@ManyToOne()`
11
+ * on the same property. One should use only `@ManyToOne()` in such case.
12
+ * We allow the existence of the property in metadata if the reference type is the same, this should allow things like HMR to work.
13
+ */
14
+ static validateSingleDecorator(meta: EntityMetadata, propertyName: string, reference: ReferenceKind): void;
15
+ validateEntityDefinition<T>(metadata: MetadataStorage, name: string, options: MetadataDiscoveryOptions): void;
16
+ validateDiscovered(discovered: EntityMetadata[], options: MetadataDiscoveryOptions): void;
17
+ private validateReference;
18
+ private validateBidirectional;
19
+ private validateOwningSide;
20
+ private validateInverseSide;
21
+ private validateIndexes;
22
+ private validateDuplicateFieldNames;
23
+ private validateVersionField;
24
+ }
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetadataValidator = void 0;
4
+ const utils_1 = require("../utils");
5
+ const errors_1 = require("../errors");
6
+ const enums_1 = require("../enums");
7
+ /**
8
+ * @internal
9
+ */
10
+ class MetadataValidator {
11
+ /**
12
+ * Validate there is only one property decorator. This disallows using `@Property()` together with e.g. `@ManyToOne()`
13
+ * on the same property. One should use only `@ManyToOne()` in such case.
14
+ * We allow the existence of the property in metadata if the reference type is the same, this should allow things like HMR to work.
15
+ */
16
+ static validateSingleDecorator(meta, propertyName, reference) {
17
+ if (meta.properties[propertyName] && meta.properties[propertyName].kind !== reference) {
18
+ throw errors_1.MetadataError.multipleDecorators(meta.className, propertyName);
19
+ }
20
+ }
21
+ validateEntityDefinition(metadata, name, options) {
22
+ const meta = metadata.get(name);
23
+ if (meta.virtual || meta.expression) {
24
+ for (const prop of utils_1.Utils.values(meta.properties)) {
25
+ if (![enums_1.ReferenceKind.SCALAR, enums_1.ReferenceKind.EMBEDDED, enums_1.ReferenceKind.MANY_TO_ONE, enums_1.ReferenceKind.ONE_TO_ONE].includes(prop.kind)) {
26
+ throw new errors_1.MetadataError(`Only scalars, embedded properties and to-many relations are allowed inside virtual entity. Found '${prop.kind}' in ${meta.className}.${prop.name}`);
27
+ }
28
+ if (prop.primary) {
29
+ throw new errors_1.MetadataError(`Virtual entity ${meta.className} cannot have primary key ${meta.className}.${prop.name}`);
30
+ }
31
+ }
32
+ return;
33
+ }
34
+ // entities have PK
35
+ if (!meta.embeddable && (!meta.primaryKeys || meta.primaryKeys.length === 0)) {
36
+ throw errors_1.MetadataError.fromMissingPrimaryKey(meta);
37
+ }
38
+ this.validateVersionField(meta);
39
+ this.validateDuplicateFieldNames(meta, options);
40
+ this.validateIndexes(meta, meta.indexes ?? [], 'index');
41
+ this.validateIndexes(meta, meta.uniques ?? [], 'unique');
42
+ for (const prop of utils_1.Utils.values(meta.properties)) {
43
+ if (prop.kind !== enums_1.ReferenceKind.SCALAR) {
44
+ this.validateReference(meta, prop, metadata);
45
+ this.validateBidirectional(meta, prop, metadata);
46
+ }
47
+ else if (metadata.has(prop.type)) {
48
+ throw errors_1.MetadataError.propertyTargetsEntityType(meta, prop, metadata.get(prop.type));
49
+ }
50
+ }
51
+ }
52
+ validateDiscovered(discovered, options) {
53
+ if (discovered.length === 0 && options.warnWhenNoEntities) {
54
+ throw errors_1.MetadataError.noEntityDiscovered();
55
+ }
56
+ const duplicates = utils_1.Utils.findDuplicates(discovered.map(meta => meta.className));
57
+ if (duplicates.length > 0 && options.checkDuplicateEntities) {
58
+ throw errors_1.MetadataError.duplicateEntityDiscovered(duplicates);
59
+ }
60
+ const tableNames = discovered.filter(meta => !meta.abstract && meta === meta.root && (meta.tableName || meta.collection) && meta.schema !== '*');
61
+ const duplicateTableNames = utils_1.Utils.findDuplicates(tableNames.map(meta => {
62
+ const tableName = meta.tableName || meta.collection;
63
+ return (meta.schema ? '.' + meta.schema : '') + tableName;
64
+ }));
65
+ if (duplicateTableNames.length > 0 && options.checkDuplicateTableNames && options.checkDuplicateEntities) {
66
+ throw errors_1.MetadataError.duplicateEntityDiscovered(duplicateTableNames, 'table names');
67
+ }
68
+ // validate we found at least one entity (not just abstract/base entities)
69
+ if (discovered.filter(meta => meta.name).length === 0 && options.warnWhenNoEntities) {
70
+ throw errors_1.MetadataError.onlyAbstractEntitiesDiscovered();
71
+ }
72
+ const unwrap = (type) => type
73
+ .replace(/Array<(.*)>/, '$1') // unwrap array
74
+ .replace(/\[]$/, '') // remove array suffix
75
+ .replace(/\((.*)\)/, '$1'); // unwrap union types
76
+ const name = (p) => {
77
+ if (typeof p === 'function') {
78
+ return utils_1.Utils.className(p());
79
+ }
80
+ return utils_1.Utils.className(p);
81
+ };
82
+ const pivotProps = new Map();
83
+ // check for not discovered entities
84
+ discovered.forEach(meta => Object.values(meta.properties).forEach(prop => {
85
+ if (prop.kind !== enums_1.ReferenceKind.SCALAR && !unwrap(prop.type).split(/ ?\| ?/).every(type => discovered.find(m => m.className === type))) {
86
+ throw errors_1.MetadataError.fromUnknownEntity(prop.type, `${meta.className}.${prop.name}`);
87
+ }
88
+ if (prop.pivotEntity) {
89
+ const props = pivotProps.get(name(prop.pivotEntity)) ?? [];
90
+ props.push({ meta, prop });
91
+ pivotProps.set(name(prop.pivotEntity), props);
92
+ }
93
+ }));
94
+ pivotProps.forEach(props => {
95
+ // if the pivot entity is used in more than one property, check if they are linked
96
+ if (props.length > 1 && props.every(p => !p.prop.mappedBy && !p.prop.inversedBy)) {
97
+ throw errors_1.MetadataError.invalidManyToManyWithPivotEntity(props[0].meta, props[0].prop, props[1].meta, props[1].prop);
98
+ }
99
+ });
100
+ }
101
+ validateReference(meta, prop, metadata) {
102
+ // references do have types
103
+ if (!prop.type) {
104
+ throw errors_1.MetadataError.fromWrongTypeDefinition(meta, prop);
105
+ }
106
+ // references do have type of known entity
107
+ if (!metadata.find(prop.type)) {
108
+ throw errors_1.MetadataError.fromWrongTypeDefinition(meta, prop);
109
+ }
110
+ if (metadata.find(prop.type).abstract && !metadata.find(prop.type).discriminatorColumn) {
111
+ throw errors_1.MetadataError.targetIsAbstract(meta, prop);
112
+ }
113
+ }
114
+ validateBidirectional(meta, prop, metadata) {
115
+ if (prop.inversedBy) {
116
+ const inverse = metadata.get(prop.type).properties[prop.inversedBy];
117
+ this.validateOwningSide(meta, prop, inverse, metadata);
118
+ }
119
+ else if (prop.mappedBy) {
120
+ const inverse = metadata.get(prop.type).properties[prop.mappedBy];
121
+ this.validateInverseSide(meta, prop, inverse, metadata);
122
+ }
123
+ else {
124
+ // 1:m property has `mappedBy`
125
+ if (prop.kind === enums_1.ReferenceKind.ONE_TO_MANY && !prop.mappedBy) {
126
+ throw errors_1.MetadataError.fromMissingOption(meta, prop, 'mappedBy');
127
+ }
128
+ }
129
+ }
130
+ validateOwningSide(meta, prop, inverse, metadata) {
131
+ // has correct `inversedBy` on owning side
132
+ if (!inverse) {
133
+ throw errors_1.MetadataError.fromWrongReference(meta, prop, 'inversedBy');
134
+ }
135
+ const targetClassName = metadata.find(inverse.type)?.root.className;
136
+ // has correct `inversedBy` reference type
137
+ if (inverse.type !== meta.className && targetClassName !== meta.root.className) {
138
+ throw errors_1.MetadataError.fromWrongReference(meta, prop, 'inversedBy', inverse);
139
+ }
140
+ // inverse side is not defined as owner
141
+ if (inverse.inversedBy || inverse.owner) {
142
+ throw errors_1.MetadataError.fromWrongOwnership(meta, prop, 'inversedBy');
143
+ }
144
+ }
145
+ validateInverseSide(meta, prop, owner, metadata) {
146
+ // has correct `mappedBy` on inverse side
147
+ if (prop.mappedBy && !owner) {
148
+ throw errors_1.MetadataError.fromWrongReference(meta, prop, 'mappedBy');
149
+ }
150
+ // has correct `mappedBy` reference type
151
+ if (owner.type !== meta.className && metadata.find(owner.type)?.root.className !== meta.root.className) {
152
+ throw errors_1.MetadataError.fromWrongReference(meta, prop, 'mappedBy', owner);
153
+ }
154
+ // owning side is not defined as inverse
155
+ if (owner.mappedBy) {
156
+ throw errors_1.MetadataError.fromWrongOwnership(meta, prop, 'mappedBy');
157
+ }
158
+ // owning side is not defined as inverse
159
+ const valid = [
160
+ { owner: enums_1.ReferenceKind.MANY_TO_ONE, inverse: enums_1.ReferenceKind.ONE_TO_MANY },
161
+ { owner: enums_1.ReferenceKind.MANY_TO_MANY, inverse: enums_1.ReferenceKind.MANY_TO_MANY },
162
+ { owner: enums_1.ReferenceKind.ONE_TO_ONE, inverse: enums_1.ReferenceKind.ONE_TO_ONE },
163
+ ];
164
+ if (!valid.find(spec => spec.owner === owner.kind && spec.inverse === prop.kind)) {
165
+ throw errors_1.MetadataError.fromWrongReferenceKind(meta, owner, prop);
166
+ }
167
+ if (prop.primary) {
168
+ throw errors_1.MetadataError.fromInversideSidePrimary(meta, owner, prop);
169
+ }
170
+ }
171
+ validateIndexes(meta, indexes, type) {
172
+ const root = meta.getStiRoot();
173
+ for (const index of indexes) {
174
+ for (const propName of utils_1.Utils.asArray(index.properties)) {
175
+ const prop = root.properties[propName];
176
+ if (!prop && !Object.values(meta.root.properties).some(p => propName.startsWith(p.name + '.'))) {
177
+ throw errors_1.MetadataError.unknownIndexProperty(meta, propName, type);
178
+ }
179
+ }
180
+ }
181
+ }
182
+ validateDuplicateFieldNames(meta, options) {
183
+ const candidates = Object.values(meta.properties)
184
+ .filter(prop => prop.persist !== false && !prop.inherited && prop.fieldNames?.length === 1 && (prop.kind !== enums_1.ReferenceKind.EMBEDDED || prop.object))
185
+ .map(prop => prop.fieldNames[0]);
186
+ const duplicates = utils_1.Utils.findDuplicates(candidates);
187
+ if (duplicates.length > 0 && options.checkDuplicateFieldNames) {
188
+ const pairs = duplicates.flatMap(name => {
189
+ return Object.values(meta.properties)
190
+ .filter(p => p.fieldNames?.[0] === name)
191
+ .map(prop => {
192
+ return [prop.embedded ? prop.embedded.join('.') : prop.name, prop.fieldNames[0]];
193
+ });
194
+ });
195
+ throw errors_1.MetadataError.duplicateFieldName(meta.className, pairs);
196
+ }
197
+ }
198
+ validateVersionField(meta) {
199
+ if (!meta.versionProperty) {
200
+ return;
201
+ }
202
+ const props = Object.values(meta.properties).filter(p => p.version);
203
+ if (props.length > 1) {
204
+ throw errors_1.MetadataError.multipleVersionFields(meta, props.map(p => p.name));
205
+ }
206
+ const prop = meta.properties[meta.versionProperty];
207
+ const type = prop.runtimeType ?? prop.columnTypes?.[0] ?? prop.type;
208
+ if (type !== 'number' && type !== 'Date' && !type.startsWith('timestamp') && !type.startsWith('datetime')) {
209
+ throw errors_1.MetadataError.invalidVersionFieldType(meta);
210
+ }
211
+ }
212
+ }
213
+ exports.MetadataValidator = MetadataValidator;
@@ -0,0 +1,8 @@
1
+ import 'reflect-metadata';
2
+ import type { EntityMetadata, EntityProperty } from '../typings';
3
+ import { MetadataProvider } from './MetadataProvider';
4
+ export declare class ReflectMetadataProvider extends MetadataProvider {
5
+ loadEntityMetadata(meta: EntityMetadata, name: string): void;
6
+ protected initProperties(meta: EntityMetadata): void;
7
+ protected initPropertyType(meta: EntityMetadata, prop: EntityProperty): void;
8
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReflectMetadataProvider = void 0;
4
+ require("reflect-metadata");
5
+ const MetadataProvider_1 = require("./MetadataProvider");
6
+ const enums_1 = require("../enums");
7
+ const Utils_1 = require("../utils/Utils");
8
+ class ReflectMetadataProvider extends MetadataProvider_1.MetadataProvider {
9
+ loadEntityMetadata(meta, name) {
10
+ this.initProperties(meta);
11
+ }
12
+ initProperties(meta) {
13
+ // load types and column names
14
+ for (const prop of Object.values(meta.properties)) {
15
+ if (Utils_1.Utils.isString(prop.entity)) {
16
+ prop.type = prop.entity;
17
+ }
18
+ else if (prop.entity) {
19
+ const tmp = prop.entity();
20
+ prop.type = Array.isArray(tmp) ? tmp.map(t => Utils_1.Utils.className(t)).sort().join(' | ') : Utils_1.Utils.className(tmp);
21
+ }
22
+ else {
23
+ this.initPropertyType(meta, prop);
24
+ }
25
+ }
26
+ }
27
+ initPropertyType(meta, prop) {
28
+ const type = Reflect.getMetadata('design:type', meta.prototype, prop.name);
29
+ if (!prop.type && (!type || (type === Object && prop.kind !== enums_1.ReferenceKind.SCALAR))) {
30
+ throw new Error(`Please provide either 'type' or 'entity' attribute in ${meta.className}.${prop.name}. If you are using decorators, ensure you have 'emitDecoratorMetadata' enabled in your tsconfig.json.`);
31
+ }
32
+ // Force mapping to UnknownType which is a string when we see just `Object`, as that often means failed inference.
33
+ // This is to prevent defaulting to JSON column type, which can be often hard to revert and cause hard to understand issues with PKs.
34
+ // If there are explicitly provided `columnTypes`, we use those instead for the inference, this way
35
+ // we can have things like `columnType: 'timestamp'` be respected as `type: 'Date'`.
36
+ if (prop.kind === enums_1.ReferenceKind.SCALAR && type === Object && !prop.columnTypes) {
37
+ prop.type ??= 'any';
38
+ return;
39
+ }
40
+ let typeName = type?.name;
41
+ if (typeName && ['string', 'number', 'boolean', 'array', 'object'].includes(typeName.toLowerCase())) {
42
+ typeName = typeName.toLowerCase();
43
+ }
44
+ prop.type ??= typeName;
45
+ prop.runtimeType = typeName;
46
+ }
47
+ }
48
+ exports.ReflectMetadataProvider = ReflectMetadataProvider;
@@ -0,0 +1,6 @@
1
+ export * from './EntitySchema';
2
+ export * from './MetadataDiscovery';
3
+ export * from './MetadataStorage';
4
+ export * from './MetadataProvider';
5
+ export * from './MetadataValidator';
6
+ export * from './ReflectMetadataProvider';
@@ -0,0 +1,22 @@
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
+ __exportStar(require("./EntitySchema"), exports);
18
+ __exportStar(require("./MetadataDiscovery"), exports);
19
+ __exportStar(require("./MetadataStorage"), exports);
20
+ __exportStar(require("./MetadataProvider"), exports);
21
+ __exportStar(require("./MetadataValidator"), exports);
22
+ __exportStar(require("./ReflectMetadataProvider"), exports);
@@ -0,0 +1,18 @@
1
+ import type { NamingStrategy } from './NamingStrategy';
2
+ export declare abstract class AbstractNamingStrategy implements NamingStrategy {
3
+ getClassName(file: string, separator?: string): string;
4
+ classToMigrationName(timestamp: string, customMigrationName?: string): string;
5
+ indexName(tableName: string, columns: string[], type: 'primary' | 'foreign' | 'unique' | 'index' | 'sequence' | 'check'): string;
6
+ /**
7
+ * @inheritDoc
8
+ */
9
+ getEntityName(tableName: string, schemaName?: string): string;
10
+ columnNameToProperty(columnName: string): string;
11
+ aliasName(entityName: string, index: number): string;
12
+ abstract classToTableName(entityName: string): string;
13
+ abstract joinColumnName(propertyName: string): string;
14
+ abstract joinKeyColumnName(entityName: string, referencedColumnName?: string): string;
15
+ abstract joinTableName(sourceEntity: string, targetEntity: string, propertyName?: string): string;
16
+ abstract propertyToColumnName(propertyName: string, object?: boolean): string;
17
+ abstract referenceColumnName(): string;
18
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractNamingStrategy = void 0;
4
+ class AbstractNamingStrategy {
5
+ getClassName(file, separator = '-') {
6
+ const name = file.split('.')[0];
7
+ const ret = name.replace(new RegExp(`${separator}+(\\w)`, 'g'), m => m[1].toUpperCase());
8
+ return ret.charAt(0).toUpperCase() + ret.slice(1);
9
+ }
10
+ classToMigrationName(timestamp, customMigrationName) {
11
+ let migrationName = `Migration${timestamp}`;
12
+ if (customMigrationName) {
13
+ migrationName += `_${customMigrationName}`;
14
+ }
15
+ return migrationName;
16
+ }
17
+ indexName(tableName, columns, type) {
18
+ /* istanbul ignore next */
19
+ if (tableName.includes('.')) {
20
+ tableName = tableName.substring(tableName.indexOf('.') + 1);
21
+ }
22
+ if (type === 'primary') {
23
+ return `${tableName}_pkey`;
24
+ }
25
+ columns = columns.map(col => col.replace(/\./g, '_'));
26
+ if (type === 'sequence') {
27
+ return `${tableName}_${columns.join('_')}_seq`;
28
+ }
29
+ if (columns.length > 0) {
30
+ return `${tableName}_${columns.join('_')}_${type}`;
31
+ }
32
+ return `${tableName}_${type}`;
33
+ }
34
+ /**
35
+ * @inheritDoc
36
+ */
37
+ getEntityName(tableName, schemaName) {
38
+ return this.getClassName(tableName, '_');
39
+ }
40
+ columnNameToProperty(columnName) {
41
+ return columnName.replace(/[_\- ](\w)/g, m => m[1].toUpperCase()).replace(/[_\- ]+/g, '');
42
+ }
43
+ aliasName(entityName, index) {
44
+ // Take only the first letter of the prefix to keep character counts down since some engines have character limits
45
+ return entityName.charAt(0).toLowerCase() + index;
46
+ }
47
+ }
48
+ exports.AbstractNamingStrategy = AbstractNamingStrategy;
@@ -0,0 +1,12 @@
1
+ import { AbstractNamingStrategy } from './AbstractNamingStrategy';
2
+ /**
3
+ * This strategy keeps original entity/property names for table/column.
4
+ */
5
+ export declare class EntityCaseNamingStrategy extends AbstractNamingStrategy {
6
+ classToTableName(entityName: string): string;
7
+ joinColumnName(propertyName: string): string;
8
+ joinKeyColumnName(entityName: string, referencedColumnName?: string, composite?: boolean): string;
9
+ joinTableName(sourceEntity: string, targetEntity: string, propertyName: string): string;
10
+ propertyToColumnName(propertyName: string): string;
11
+ referenceColumnName(): string;
12
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityCaseNamingStrategy = void 0;
4
+ const AbstractNamingStrategy_1 = require("./AbstractNamingStrategy");
5
+ /**
6
+ * This strategy keeps original entity/property names for table/column.
7
+ */
8
+ class EntityCaseNamingStrategy extends AbstractNamingStrategy_1.AbstractNamingStrategy {
9
+ classToTableName(entityName) {
10
+ return entityName;
11
+ }
12
+ joinColumnName(propertyName) {
13
+ return propertyName;
14
+ }
15
+ joinKeyColumnName(entityName, referencedColumnName, composite = false) {
16
+ const name = entityName.substr(0, 1).toLowerCase() + entityName.substr(1);
17
+ if (composite && referencedColumnName) {
18
+ return name + '_' + referencedColumnName;
19
+ }
20
+ return name;
21
+ }
22
+ joinTableName(sourceEntity, targetEntity, propertyName) {
23
+ return this.classToTableName(sourceEntity) + '_' + this.propertyToColumnName(propertyName);
24
+ }
25
+ propertyToColumnName(propertyName) {
26
+ return propertyName;
27
+ }
28
+ referenceColumnName() {
29
+ return 'id';
30
+ }
31
+ }
32
+ exports.EntityCaseNamingStrategy = EntityCaseNamingStrategy;
@@ -0,0 +1,9 @@
1
+ import { AbstractNamingStrategy } from './AbstractNamingStrategy';
2
+ export declare class MongoNamingStrategy extends AbstractNamingStrategy {
3
+ classToTableName(entityName: string): string;
4
+ joinColumnName(propertyName: string): string;
5
+ joinKeyColumnName(entityName: string, referencedColumnName?: string): string;
6
+ joinTableName(sourceEntity: string, targetEntity: string, propertyName: string): string;
7
+ propertyToColumnName(propertyName: string): string;
8
+ referenceColumnName(): string;
9
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoNamingStrategy = void 0;
4
+ const AbstractNamingStrategy_1 = require("./AbstractNamingStrategy");
5
+ class MongoNamingStrategy extends AbstractNamingStrategy_1.AbstractNamingStrategy {
6
+ classToTableName(entityName) {
7
+ return entityName.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
8
+ }
9
+ joinColumnName(propertyName) {
10
+ return propertyName;
11
+ }
12
+ joinKeyColumnName(entityName, referencedColumnName) {
13
+ return entityName;
14
+ }
15
+ joinTableName(sourceEntity, targetEntity, propertyName) {
16
+ return this.classToTableName(sourceEntity) + '_' + this.propertyToColumnName(propertyName);
17
+ }
18
+ propertyToColumnName(propertyName) {
19
+ return propertyName;
20
+ }
21
+ referenceColumnName() {
22
+ return '_id';
23
+ }
24
+ }
25
+ exports.MongoNamingStrategy = MongoNamingStrategy;