metal-orm 1.1.11 → 1.1.18
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 +758 -769
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +100 -96
- package/scripts/generate-entities/schema.mjs +122 -122
- package/scripts/generate-entities/tree-detection.mjs +92 -92
- package/scripts/inflection/pt-br.mjs +468 -468
- package/scripts/run-eslint.mjs +33 -34
- package/scripts/show-sql-seed.sql +102 -0
- package/scripts/show-sql.mjs +321 -325
- package/src/codegen/naming-strategy.ts +54 -54
- package/src/codegen/typescript.ts +482 -482
- package/src/core/ast/adapters.ts +1 -1
- package/src/core/ast/builders.ts +123 -123
- package/src/core/ast/expression-builders.ts +745 -745
- package/src/core/ast/expression-nodes.ts +304 -304
- package/src/core/ast/expression-visitor.ts +212 -212
- package/src/core/ast/expression.ts +20 -20
- package/src/core/ast/helpers.ts +14 -14
- package/src/core/ast/join.ts +18 -18
- package/src/core/ast/query.ts +200 -200
- package/src/core/ddl/dialects/base-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/mssql-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/mysql-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/postgres-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/render-reference.test.ts +70 -70
- package/src/core/ddl/dialects/sqlite-schema-dialect.ts +1 -1
- package/src/core/ddl/introspect/catalogs/index.ts +5 -5
- package/src/core/ddl/introspect/catalogs/postgres.ts +146 -146
- package/src/core/ddl/introspect/context.ts +15 -15
- package/src/core/ddl/introspect/functions/postgres.ts +35 -35
- package/src/core/ddl/introspect/registry.ts +40 -40
- package/src/core/ddl/introspect/run-select.ts +35 -35
- package/src/core/ddl/introspect/utils.ts +56 -56
- package/src/core/ddl/naming-strategy.ts +16 -16
- package/src/core/ddl/schema-dialect.ts +56 -56
- package/src/core/ddl/schema-diff.ts +234 -234
- package/src/core/ddl/schema-generator.ts +1 -1
- package/src/core/ddl/schema-introspect.ts +25 -25
- package/src/core/ddl/sql-writing.ts +171 -171
- package/src/core/dialect/abstract.ts +541 -541
- package/src/core/dialect/base/cte-compiler.ts +33 -33
- package/src/core/dialect/base/function-table-formatter.ts +103 -103
- package/src/core/dialect/base/groupby-compiler.ts +21 -21
- package/src/core/dialect/base/join-compiler.ts +25 -25
- package/src/core/dialect/base/orderby-compiler.ts +35 -35
- package/src/core/dialect/base/pagination-strategy.ts +32 -32
- package/src/core/dialect/base/returning-strategy.ts +57 -57
- package/src/core/dialect/base/sql-dialect.ts +294 -294
- package/src/core/dialect/dialect-factory.ts +91 -91
- package/src/core/dialect/mssql/functions.ts +120 -120
- package/src/core/dialect/mssql/index.ts +317 -317
- package/src/core/dialect/mysql/functions.ts +103 -103
- package/src/core/dialect/mysql/index.ts +105 -105
- package/src/core/dialect/postgres/functions.ts +108 -108
- package/src/core/dialect/postgres/index.ts +91 -91
- package/src/core/dialect/sqlite/functions.ts +129 -129
- package/src/core/dialect/sqlite/index.ts +67 -67
- package/src/core/driver/database-driver.ts +19 -19
- package/src/core/driver/mssql-driver.ts +23 -23
- package/src/core/driver/mysql-driver.ts +23 -23
- package/src/core/driver/postgres-driver.ts +23 -23
- package/src/core/driver/sqlite-driver.ts +23 -23
- package/src/core/execution/db-executor.ts +92 -92
- package/src/core/execution/executors/better-sqlite3-executor.ts +90 -90
- package/src/core/execution/executors/mssql-executor.ts +184 -184
- package/src/core/execution/executors/mysql-executor.ts +88 -88
- package/src/core/execution/executors/postgres-executor.ts +26 -26
- package/src/core/execution/executors/sqlite-executor.ts +42 -42
- package/src/core/execution/pooling/pool-types.ts +30 -30
- package/src/core/execution/pooling/pool.ts +275 -275
- package/src/core/functions/array.ts +35 -35
- package/src/core/functions/control-flow.ts +79 -79
- package/src/core/functions/datetime.ts +237 -237
- package/src/core/functions/json.ts +70 -70
- package/src/core/functions/numeric.ts +297 -297
- package/src/core/functions/text.ts +334 -334
- package/src/core/functions/types.ts +33 -33
- package/src/core/hydration/types.ts +51 -51
- package/src/core/sql/sql-operator-config.ts +39 -39
- package/src/core/sql/sql.ts +152 -152
- package/src/decorators/column-decorator.ts +87 -87
- package/src/decorators/decorator-metadata.ts +143 -143
- package/src/decorators/entity.ts +93 -93
- package/src/decorators/index.ts +39 -39
- package/src/decorators/relations.ts +231 -231
- package/src/decorators/transformers/built-in/string-transformers.ts +231 -231
- package/src/decorators/transformers/transformer-decorators.ts +134 -134
- package/src/decorators/transformers/transformer-executor.ts +171 -171
- package/src/decorators/transformers/transformer-metadata.ts +73 -73
- package/src/decorators/validators/built-in/br-cep-validator.ts +55 -55
- package/src/decorators/validators/built-in/br-cnpj-validator.ts +105 -105
- package/src/decorators/validators/built-in/br-cpf-validator.ts +103 -103
- package/src/decorators/validators/country-validator-registry.ts +64 -64
- package/src/decorators/validators/country-validators-decorators.ts +203 -203
- package/src/decorators/validators/country-validators.ts +105 -105
- package/src/decorators/validators/validator-metadata.ts +59 -59
- package/src/dto/dto-types.ts +226 -226
- package/src/dto/filter-types.ts +141 -141
- package/src/dto/index.ts +95 -95
- package/src/dto/openapi/generators/base.ts +29 -29
- package/src/dto/openapi/generators/column.ts +37 -37
- package/src/dto/openapi/generators/dto.ts +91 -91
- package/src/dto/openapi/generators/filter.ts +75 -75
- package/src/dto/openapi/generators/nested-dto.ts +618 -618
- package/src/dto/openapi/generators/pagination.ts +111 -111
- package/src/dto/openapi/generators/relation-filter.ts +228 -228
- package/src/dto/openapi/index.ts +12 -12
- package/src/dto/openapi/types.ts +101 -101
- package/src/dto/openapi/utilities.ts +95 -95
- package/src/dto/pagination-utils.ts +150 -150
- package/src/dto/transform.ts +197 -197
- package/src/index.ts +86 -86
- package/src/orm/als.ts +58 -58
- package/src/orm/domain-event-bus.ts +119 -119
- package/src/orm/entity-context.ts +86 -86
- package/src/orm/entity-materializer.ts +159 -159
- package/src/orm/entity-meta.ts +97 -97
- package/src/orm/entity-registry.ts +39 -39
- package/src/orm/entity-relation-cache.ts +39 -39
- package/src/orm/execute.ts +194 -194
- package/src/orm/execution-context.ts +18 -18
- package/src/orm/hydration-context.ts +26 -26
- package/src/orm/hydration.ts +112 -112
- package/src/orm/identity-map.ts +61 -61
- package/src/orm/interceptor-pipeline.ts +16 -16
- package/src/orm/lazy-batch/belongs-to-many.ts +119 -119
- package/src/orm/lazy-batch/belongs-to.ts +108 -108
- package/src/orm/lazy-batch/has-many.ts +69 -69
- package/src/orm/lazy-batch/has-one.ts +68 -68
- package/src/orm/lazy-batch/shared.ts +125 -125
- package/src/orm/orm-session.ts +620 -620
- package/src/orm/orm.ts +34 -34
- package/src/orm/pooled-executor-factory.ts +121 -121
- package/src/orm/query-logger.ts +40 -40
- package/src/orm/relation-change-processor.ts +420 -420
- package/src/orm/relations/belongs-to.ts +143 -143
- package/src/orm/relations/has-many.ts +204 -204
- package/src/orm/relations/has-one.ts +174 -174
- package/src/orm/relations/many-to-many.ts +288 -288
- package/src/orm/relations/morph-many.ts +156 -156
- package/src/orm/relations/morph-one.ts +151 -151
- package/src/orm/relations/morph-to.ts +162 -162
- package/src/orm/runtime-types.ts +92 -92
- package/src/orm/save-graph.ts +561 -561
- package/src/orm/transaction-runner.ts +24 -24
- package/src/orm/unit-of-work.ts +426 -426
- package/src/query/index.ts +69 -69
- package/src/query/target.ts +46 -46
- package/src/query-builder/column-selector.ts +81 -81
- package/src/query-builder/delete.ts +141 -141
- package/src/query-builder/insert-query-state.ts +149 -149
- package/src/query-builder/insert.ts +117 -117
- package/src/query-builder/query-ast-service.ts +287 -287
- package/src/query-builder/query-resolution.ts +78 -78
- package/src/query-builder/raw-column-parser.ts +38 -38
- package/src/query-builder/relation-filter-utils.ts +153 -153
- package/src/query-builder/relation-join-planner.ts +10 -10
- package/src/query-builder/relation-manager.ts +87 -87
- package/src/query-builder/relation-projection-helper.ts +102 -102
- package/src/query-builder/relation-types.ts +9 -9
- package/src/query-builder/relation-utils.ts +15 -15
- package/src/query-builder/select/cte-facet.ts +40 -40
- package/src/query-builder/select/from-facet.ts +80 -80
- package/src/query-builder/select/join-facet.ts +62 -62
- package/src/query-builder/select/predicate-facet.ts +104 -104
- package/src/query-builder/select/projection-facet.ts +70 -70
- package/src/query-builder/select/relation-facet.ts +81 -81
- package/src/query-builder/select/setop-facet.ts +36 -36
- package/src/query-builder/select-helpers.ts +1 -1
- package/src/query-builder/select-query-builder-deps.ts +130 -130
- package/src/query-builder/select-query-state.ts +207 -207
- package/src/query-builder/update.ts +151 -151
- package/src/schema/column-types.ts +322 -322
- package/src/schema/table-guards.ts +37 -37
- package/src/schema/table.ts +281 -281
- package/src/tree/index.ts +13 -13
- package/src/tree/nested-set-strategy.ts +545 -545
- package/src/tree/tree-decorator.ts +397 -397
- package/src/tree/tree-manager.ts +754 -754
- package/src/tree/tree-query.ts +427 -427
- package/src/tree/tree-types.ts +299 -299
package/src/decorators/index.ts
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Decorators for defining entities, columns, and relations in Metal ORM.
|
|
3
|
-
*/
|
|
4
|
-
export * from './entity.js';
|
|
5
|
-
export * from './column-decorator.js';
|
|
6
|
-
export * from './relations.js';
|
|
7
|
-
export * from './bootstrap.js';
|
|
8
|
-
export { getDecoratorMetadata } from './decorator-metadata.js';
|
|
9
|
-
|
|
10
|
-
// Transformer Decorators
|
|
11
|
-
export * from './transformers/transformer-decorators.js';
|
|
12
|
-
export type {
|
|
13
|
-
PropertyTransformer,
|
|
14
|
-
PropertyValidator,
|
|
15
|
-
PropertySanitizer,
|
|
16
|
-
CompositeTransformer,
|
|
17
|
-
AutoTransformableValidator,
|
|
18
|
-
TransformContext,
|
|
19
|
-
AutoTransformResult,
|
|
20
|
-
ValidationResult,
|
|
21
|
-
TransformerMetadata,
|
|
22
|
-
TransformerConfig
|
|
23
|
-
} from './transformers/transformer-metadata.js';
|
|
24
|
-
|
|
25
|
-
// Country Identifier Validators
|
|
26
|
-
export * from './validators/country-validators-decorators.js';
|
|
27
|
-
export { registerValidator, resolveValidator, getRegisteredValidators, hasValidator } from './validators/country-validator-registry.js';
|
|
28
|
-
export type {
|
|
29
|
-
CountryValidator,
|
|
30
|
-
CountryValidatorFactory,
|
|
31
|
-
ValidationOptions,
|
|
32
|
-
ValidationResult as CountryValidationResult,
|
|
33
|
-
AutoCorrectionResult,
|
|
34
|
-
ValidatorFactoryOptions
|
|
35
|
-
} from './validators/country-validators.js';
|
|
36
|
-
|
|
37
|
-
// Entity Materialization - convert query results to real class instances
|
|
38
|
-
export { materializeAs, DefaultEntityMaterializer, PrototypeMaterializationStrategy, ConstructorMaterializationStrategy } from '../orm/entity-materializer.js';
|
|
39
|
-
export type { EntityMaterializer, EntityMaterializationStrategy } from '../orm/entity-materializer.js';
|
|
1
|
+
/**
|
|
2
|
+
* Decorators for defining entities, columns, and relations in Metal ORM.
|
|
3
|
+
*/
|
|
4
|
+
export * from './entity.js';
|
|
5
|
+
export * from './column-decorator.js';
|
|
6
|
+
export * from './relations.js';
|
|
7
|
+
export * from './bootstrap.js';
|
|
8
|
+
export { getDecoratorMetadata } from './decorator-metadata.js';
|
|
9
|
+
|
|
10
|
+
// Transformer Decorators
|
|
11
|
+
export * from './transformers/transformer-decorators.js';
|
|
12
|
+
export type {
|
|
13
|
+
PropertyTransformer,
|
|
14
|
+
PropertyValidator,
|
|
15
|
+
PropertySanitizer,
|
|
16
|
+
CompositeTransformer,
|
|
17
|
+
AutoTransformableValidator,
|
|
18
|
+
TransformContext,
|
|
19
|
+
AutoTransformResult,
|
|
20
|
+
ValidationResult,
|
|
21
|
+
TransformerMetadata,
|
|
22
|
+
TransformerConfig
|
|
23
|
+
} from './transformers/transformer-metadata.js';
|
|
24
|
+
|
|
25
|
+
// Country Identifier Validators
|
|
26
|
+
export * from './validators/country-validators-decorators.js';
|
|
27
|
+
export { registerValidator, resolveValidator, getRegisteredValidators, hasValidator } from './validators/country-validator-registry.js';
|
|
28
|
+
export type {
|
|
29
|
+
CountryValidator,
|
|
30
|
+
CountryValidatorFactory,
|
|
31
|
+
ValidationOptions,
|
|
32
|
+
ValidationResult as CountryValidationResult,
|
|
33
|
+
AutoCorrectionResult,
|
|
34
|
+
ValidatorFactoryOptions
|
|
35
|
+
} from './validators/country-validators.js';
|
|
36
|
+
|
|
37
|
+
// Entity Materialization - convert query results to real class instances
|
|
38
|
+
export { materializeAs, DefaultEntityMaterializer, PrototypeMaterializationStrategy, ConstructorMaterializationStrategy } from '../orm/entity-materializer.js';
|
|
39
|
+
export type { EntityMaterializer, EntityMaterializationStrategy } from '../orm/entity-materializer.js';
|
|
@@ -1,231 +1,231 @@
|
|
|
1
|
-
import { CascadeMode, RelationKinds } from '../schema/relation.js';
|
|
2
|
-
import {
|
|
3
|
-
EntityOrTableTarget,
|
|
4
|
-
EntityOrTableTargetResolver,
|
|
5
|
-
RelationMetadata
|
|
6
|
-
} from '../orm/entity-metadata.js';
|
|
7
|
-
import { resolveFieldDecoratorInfo } from './decorator-metadata.js';
|
|
8
|
-
|
|
9
|
-
interface BaseRelationOptions {
|
|
10
|
-
target: EntityOrTableTargetResolver;
|
|
11
|
-
cascade?: CascadeMode;
|
|
12
|
-
localKey?: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Options for HasMany relation.
|
|
17
|
-
*/
|
|
18
|
-
export interface HasManyOptions extends BaseRelationOptions {
|
|
19
|
-
foreignKey?: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Options for HasOne relation.
|
|
24
|
-
*/
|
|
25
|
-
export interface HasOneOptions extends BaseRelationOptions {
|
|
26
|
-
foreignKey?: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Options for BelongsTo relation.
|
|
31
|
-
*/
|
|
32
|
-
export interface BelongsToOptions extends BaseRelationOptions {
|
|
33
|
-
foreignKey?: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Options for BelongsToMany relation.
|
|
38
|
-
*/
|
|
39
|
-
export interface BelongsToManyOptions<
|
|
40
|
-
TTarget extends EntityOrTableTarget = EntityOrTableTarget,
|
|
41
|
-
TPivot extends EntityOrTableTarget = EntityOrTableTarget
|
|
42
|
-
> {
|
|
43
|
-
target: EntityOrTableTargetResolver<TTarget>;
|
|
44
|
-
pivotTable: EntityOrTableTargetResolver<TPivot>;
|
|
45
|
-
pivotForeignKeyToRoot?: string;
|
|
46
|
-
pivotForeignKeyToTarget?: string;
|
|
47
|
-
localKey?: string;
|
|
48
|
-
targetKey?: string;
|
|
49
|
-
pivotPrimaryKey?: string;
|
|
50
|
-
defaultPivotColumns?: string[];
|
|
51
|
-
cascade?: CascadeMode;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const createFieldDecorator = (metadataFactory: (propertyName: string) => RelationMetadata) => {
|
|
55
|
-
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
56
|
-
const { propertyName, bag } = resolveFieldDecoratorInfo(
|
|
57
|
-
targetOrValue,
|
|
58
|
-
contextOrProperty,
|
|
59
|
-
'Relation'
|
|
60
|
-
);
|
|
61
|
-
const relationMetadata = metadataFactory(propertyName);
|
|
62
|
-
|
|
63
|
-
if (!bag.relations.some(entry => entry.propertyName === propertyName)) {
|
|
64
|
-
bag.relations.push({ propertyName, relation: relationMetadata });
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Decorator to define a HasMany relation on an entity property.
|
|
71
|
-
* @param options - The relation options.
|
|
72
|
-
* @returns A property decorator that registers the relation metadata.
|
|
73
|
-
*/
|
|
74
|
-
export function HasMany(options: HasManyOptions) {
|
|
75
|
-
return createFieldDecorator(propertyName => ({
|
|
76
|
-
kind: RelationKinds.HasMany,
|
|
77
|
-
propertyKey: propertyName,
|
|
78
|
-
target: options.target,
|
|
79
|
-
foreignKey: options.foreignKey,
|
|
80
|
-
localKey: options.localKey,
|
|
81
|
-
cascade: options.cascade
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Decorator to define a HasOne relation on an entity property.
|
|
87
|
-
* @param options - The relation options.
|
|
88
|
-
* @returns A property decorator that registers the relation metadata.
|
|
89
|
-
*/
|
|
90
|
-
export function HasOne(options: HasOneOptions) {
|
|
91
|
-
return createFieldDecorator(propertyName => ({
|
|
92
|
-
kind: RelationKinds.HasOne,
|
|
93
|
-
propertyKey: propertyName,
|
|
94
|
-
target: options.target,
|
|
95
|
-
foreignKey: options.foreignKey,
|
|
96
|
-
localKey: options.localKey,
|
|
97
|
-
cascade: options.cascade
|
|
98
|
-
}));
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Decorator to define a BelongsTo relation on an entity property.
|
|
103
|
-
* @param options - The relation options.
|
|
104
|
-
* @returns A property decorator that registers the relation metadata.
|
|
105
|
-
*/
|
|
106
|
-
export function BelongsTo(options: BelongsToOptions) {
|
|
107
|
-
return createFieldDecorator(propertyName => ({
|
|
108
|
-
kind: RelationKinds.BelongsTo,
|
|
109
|
-
propertyKey: propertyName,
|
|
110
|
-
target: options.target,
|
|
111
|
-
foreignKey: options.foreignKey ?? `${propertyName}_id`,
|
|
112
|
-
localKey: options.localKey,
|
|
113
|
-
cascade: options.cascade
|
|
114
|
-
}));
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Decorator to define a BelongsToMany relation on an entity property.
|
|
119
|
-
* @param options - The relation options.
|
|
120
|
-
* @returns A property decorator that registers the relation metadata.
|
|
121
|
-
*/
|
|
122
|
-
export function BelongsToMany<
|
|
123
|
-
TTarget extends EntityOrTableTarget = EntityOrTableTarget,
|
|
124
|
-
TPivot extends EntityOrTableTarget = EntityOrTableTarget
|
|
125
|
-
>(options: BelongsToManyOptions<TTarget, TPivot>) {
|
|
126
|
-
return createFieldDecorator(propertyName => ({
|
|
127
|
-
kind: RelationKinds.BelongsToMany,
|
|
128
|
-
propertyKey: propertyName,
|
|
129
|
-
target: options.target,
|
|
130
|
-
pivotTable: options.pivotTable,
|
|
131
|
-
pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,
|
|
132
|
-
pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,
|
|
133
|
-
localKey: options.localKey,
|
|
134
|
-
targetKey: options.targetKey,
|
|
135
|
-
pivotPrimaryKey: options.pivotPrimaryKey,
|
|
136
|
-
defaultPivotColumns: options.defaultPivotColumns,
|
|
137
|
-
cascade: options.cascade
|
|
138
|
-
}));
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Options for MorphTo relation.
|
|
143
|
-
*/
|
|
144
|
-
export interface MorphToOptions {
|
|
145
|
-
typeField: string;
|
|
146
|
-
idField: string;
|
|
147
|
-
targets: Record<string, EntityOrTableTargetResolver>;
|
|
148
|
-
targetKey?: string;
|
|
149
|
-
cascade?: CascadeMode;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Options for MorphOne relation.
|
|
154
|
-
*/
|
|
155
|
-
export interface MorphOneOptions {
|
|
156
|
-
target: EntityOrTableTargetResolver;
|
|
157
|
-
morphName: string;
|
|
158
|
-
typeValue: string;
|
|
159
|
-
typeField?: string;
|
|
160
|
-
idField?: string;
|
|
161
|
-
localKey?: string;
|
|
162
|
-
cascade?: CascadeMode;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Options for MorphMany relation.
|
|
167
|
-
*/
|
|
168
|
-
export interface MorphManyOptions {
|
|
169
|
-
target: EntityOrTableTargetResolver;
|
|
170
|
-
morphName: string;
|
|
171
|
-
typeValue: string;
|
|
172
|
-
typeField?: string;
|
|
173
|
-
idField?: string;
|
|
174
|
-
localKey?: string;
|
|
175
|
-
cascade?: CascadeMode;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Decorator to define a MorphTo relation on an entity property.
|
|
180
|
-
* @param options - The relation options.
|
|
181
|
-
* @returns A property decorator that registers the relation metadata.
|
|
182
|
-
*/
|
|
183
|
-
export function MorphTo(options: MorphToOptions) {
|
|
184
|
-
return createFieldDecorator(propertyName => ({
|
|
185
|
-
kind: RelationKinds.MorphTo,
|
|
186
|
-
propertyKey: propertyName,
|
|
187
|
-
typeField: options.typeField,
|
|
188
|
-
idField: options.idField,
|
|
189
|
-
targets: options.targets,
|
|
190
|
-
targetKey: options.targetKey,
|
|
191
|
-
cascade: options.cascade
|
|
192
|
-
}));
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Decorator to define a MorphOne relation on an entity property.
|
|
197
|
-
* @param options - The relation options.
|
|
198
|
-
* @returns A property decorator that registers the relation metadata.
|
|
199
|
-
*/
|
|
200
|
-
export function MorphOne(options: MorphOneOptions) {
|
|
201
|
-
return createFieldDecorator(propertyName => ({
|
|
202
|
-
kind: RelationKinds.MorphOne,
|
|
203
|
-
propertyKey: propertyName,
|
|
204
|
-
target: options.target,
|
|
205
|
-
morphName: options.morphName,
|
|
206
|
-
typeValue: options.typeValue,
|
|
207
|
-
typeField: options.typeField,
|
|
208
|
-
idField: options.idField,
|
|
209
|
-
localKey: options.localKey,
|
|
210
|
-
cascade: options.cascade
|
|
211
|
-
}));
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Decorator to define a MorphMany relation on an entity property.
|
|
216
|
-
* @param options - The relation options.
|
|
217
|
-
* @returns A property decorator that registers the relation metadata.
|
|
218
|
-
*/
|
|
219
|
-
export function MorphMany(options: MorphManyOptions) {
|
|
220
|
-
return createFieldDecorator(propertyName => ({
|
|
221
|
-
kind: RelationKinds.MorphMany,
|
|
222
|
-
propertyKey: propertyName,
|
|
223
|
-
target: options.target,
|
|
224
|
-
morphName: options.morphName,
|
|
225
|
-
typeValue: options.typeValue,
|
|
226
|
-
typeField: options.typeField,
|
|
227
|
-
idField: options.idField,
|
|
228
|
-
localKey: options.localKey,
|
|
229
|
-
cascade: options.cascade
|
|
230
|
-
}));
|
|
231
|
-
}
|
|
1
|
+
import { CascadeMode, RelationKinds } from '../schema/relation.js';
|
|
2
|
+
import {
|
|
3
|
+
EntityOrTableTarget,
|
|
4
|
+
EntityOrTableTargetResolver,
|
|
5
|
+
RelationMetadata
|
|
6
|
+
} from '../orm/entity-metadata.js';
|
|
7
|
+
import { resolveFieldDecoratorInfo } from './decorator-metadata.js';
|
|
8
|
+
|
|
9
|
+
interface BaseRelationOptions {
|
|
10
|
+
target: EntityOrTableTargetResolver;
|
|
11
|
+
cascade?: CascadeMode;
|
|
12
|
+
localKey?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Options for HasMany relation.
|
|
17
|
+
*/
|
|
18
|
+
export interface HasManyOptions extends BaseRelationOptions {
|
|
19
|
+
foreignKey?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Options for HasOne relation.
|
|
24
|
+
*/
|
|
25
|
+
export interface HasOneOptions extends BaseRelationOptions {
|
|
26
|
+
foreignKey?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Options for BelongsTo relation.
|
|
31
|
+
*/
|
|
32
|
+
export interface BelongsToOptions extends BaseRelationOptions {
|
|
33
|
+
foreignKey?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Options for BelongsToMany relation.
|
|
38
|
+
*/
|
|
39
|
+
export interface BelongsToManyOptions<
|
|
40
|
+
TTarget extends EntityOrTableTarget = EntityOrTableTarget,
|
|
41
|
+
TPivot extends EntityOrTableTarget = EntityOrTableTarget
|
|
42
|
+
> {
|
|
43
|
+
target: EntityOrTableTargetResolver<TTarget>;
|
|
44
|
+
pivotTable: EntityOrTableTargetResolver<TPivot>;
|
|
45
|
+
pivotForeignKeyToRoot?: string;
|
|
46
|
+
pivotForeignKeyToTarget?: string;
|
|
47
|
+
localKey?: string;
|
|
48
|
+
targetKey?: string;
|
|
49
|
+
pivotPrimaryKey?: string;
|
|
50
|
+
defaultPivotColumns?: string[];
|
|
51
|
+
cascade?: CascadeMode;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const createFieldDecorator = (metadataFactory: (propertyName: string) => RelationMetadata) => {
|
|
55
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
56
|
+
const { propertyName, bag } = resolveFieldDecoratorInfo(
|
|
57
|
+
targetOrValue,
|
|
58
|
+
contextOrProperty,
|
|
59
|
+
'Relation'
|
|
60
|
+
);
|
|
61
|
+
const relationMetadata = metadataFactory(propertyName);
|
|
62
|
+
|
|
63
|
+
if (!bag.relations.some(entry => entry.propertyName === propertyName)) {
|
|
64
|
+
bag.relations.push({ propertyName, relation: relationMetadata });
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Decorator to define a HasMany relation on an entity property.
|
|
71
|
+
* @param options - The relation options.
|
|
72
|
+
* @returns A property decorator that registers the relation metadata.
|
|
73
|
+
*/
|
|
74
|
+
export function HasMany(options: HasManyOptions) {
|
|
75
|
+
return createFieldDecorator(propertyName => ({
|
|
76
|
+
kind: RelationKinds.HasMany,
|
|
77
|
+
propertyKey: propertyName,
|
|
78
|
+
target: options.target,
|
|
79
|
+
foreignKey: options.foreignKey,
|
|
80
|
+
localKey: options.localKey,
|
|
81
|
+
cascade: options.cascade
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Decorator to define a HasOne relation on an entity property.
|
|
87
|
+
* @param options - The relation options.
|
|
88
|
+
* @returns A property decorator that registers the relation metadata.
|
|
89
|
+
*/
|
|
90
|
+
export function HasOne(options: HasOneOptions) {
|
|
91
|
+
return createFieldDecorator(propertyName => ({
|
|
92
|
+
kind: RelationKinds.HasOne,
|
|
93
|
+
propertyKey: propertyName,
|
|
94
|
+
target: options.target,
|
|
95
|
+
foreignKey: options.foreignKey,
|
|
96
|
+
localKey: options.localKey,
|
|
97
|
+
cascade: options.cascade
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Decorator to define a BelongsTo relation on an entity property.
|
|
103
|
+
* @param options - The relation options.
|
|
104
|
+
* @returns A property decorator that registers the relation metadata.
|
|
105
|
+
*/
|
|
106
|
+
export function BelongsTo(options: BelongsToOptions) {
|
|
107
|
+
return createFieldDecorator(propertyName => ({
|
|
108
|
+
kind: RelationKinds.BelongsTo,
|
|
109
|
+
propertyKey: propertyName,
|
|
110
|
+
target: options.target,
|
|
111
|
+
foreignKey: options.foreignKey ?? `${propertyName}_id`,
|
|
112
|
+
localKey: options.localKey,
|
|
113
|
+
cascade: options.cascade
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Decorator to define a BelongsToMany relation on an entity property.
|
|
119
|
+
* @param options - The relation options.
|
|
120
|
+
* @returns A property decorator that registers the relation metadata.
|
|
121
|
+
*/
|
|
122
|
+
export function BelongsToMany<
|
|
123
|
+
TTarget extends EntityOrTableTarget = EntityOrTableTarget,
|
|
124
|
+
TPivot extends EntityOrTableTarget = EntityOrTableTarget
|
|
125
|
+
>(options: BelongsToManyOptions<TTarget, TPivot>) {
|
|
126
|
+
return createFieldDecorator(propertyName => ({
|
|
127
|
+
kind: RelationKinds.BelongsToMany,
|
|
128
|
+
propertyKey: propertyName,
|
|
129
|
+
target: options.target,
|
|
130
|
+
pivotTable: options.pivotTable,
|
|
131
|
+
pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,
|
|
132
|
+
pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,
|
|
133
|
+
localKey: options.localKey,
|
|
134
|
+
targetKey: options.targetKey,
|
|
135
|
+
pivotPrimaryKey: options.pivotPrimaryKey,
|
|
136
|
+
defaultPivotColumns: options.defaultPivotColumns,
|
|
137
|
+
cascade: options.cascade
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Options for MorphTo relation.
|
|
143
|
+
*/
|
|
144
|
+
export interface MorphToOptions {
|
|
145
|
+
typeField: string;
|
|
146
|
+
idField: string;
|
|
147
|
+
targets: Record<string, EntityOrTableTargetResolver>;
|
|
148
|
+
targetKey?: string;
|
|
149
|
+
cascade?: CascadeMode;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Options for MorphOne relation.
|
|
154
|
+
*/
|
|
155
|
+
export interface MorphOneOptions {
|
|
156
|
+
target: EntityOrTableTargetResolver;
|
|
157
|
+
morphName: string;
|
|
158
|
+
typeValue: string;
|
|
159
|
+
typeField?: string;
|
|
160
|
+
idField?: string;
|
|
161
|
+
localKey?: string;
|
|
162
|
+
cascade?: CascadeMode;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Options for MorphMany relation.
|
|
167
|
+
*/
|
|
168
|
+
export interface MorphManyOptions {
|
|
169
|
+
target: EntityOrTableTargetResolver;
|
|
170
|
+
morphName: string;
|
|
171
|
+
typeValue: string;
|
|
172
|
+
typeField?: string;
|
|
173
|
+
idField?: string;
|
|
174
|
+
localKey?: string;
|
|
175
|
+
cascade?: CascadeMode;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Decorator to define a MorphTo relation on an entity property.
|
|
180
|
+
* @param options - The relation options.
|
|
181
|
+
* @returns A property decorator that registers the relation metadata.
|
|
182
|
+
*/
|
|
183
|
+
export function MorphTo(options: MorphToOptions) {
|
|
184
|
+
return createFieldDecorator(propertyName => ({
|
|
185
|
+
kind: RelationKinds.MorphTo,
|
|
186
|
+
propertyKey: propertyName,
|
|
187
|
+
typeField: options.typeField,
|
|
188
|
+
idField: options.idField,
|
|
189
|
+
targets: options.targets,
|
|
190
|
+
targetKey: options.targetKey,
|
|
191
|
+
cascade: options.cascade
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Decorator to define a MorphOne relation on an entity property.
|
|
197
|
+
* @param options - The relation options.
|
|
198
|
+
* @returns A property decorator that registers the relation metadata.
|
|
199
|
+
*/
|
|
200
|
+
export function MorphOne(options: MorphOneOptions) {
|
|
201
|
+
return createFieldDecorator(propertyName => ({
|
|
202
|
+
kind: RelationKinds.MorphOne,
|
|
203
|
+
propertyKey: propertyName,
|
|
204
|
+
target: options.target,
|
|
205
|
+
morphName: options.morphName,
|
|
206
|
+
typeValue: options.typeValue,
|
|
207
|
+
typeField: options.typeField,
|
|
208
|
+
idField: options.idField,
|
|
209
|
+
localKey: options.localKey,
|
|
210
|
+
cascade: options.cascade
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Decorator to define a MorphMany relation on an entity property.
|
|
216
|
+
* @param options - The relation options.
|
|
217
|
+
* @returns A property decorator that registers the relation metadata.
|
|
218
|
+
*/
|
|
219
|
+
export function MorphMany(options: MorphManyOptions) {
|
|
220
|
+
return createFieldDecorator(propertyName => ({
|
|
221
|
+
kind: RelationKinds.MorphMany,
|
|
222
|
+
propertyKey: propertyName,
|
|
223
|
+
target: options.target,
|
|
224
|
+
morphName: options.morphName,
|
|
225
|
+
typeValue: options.typeValue,
|
|
226
|
+
typeField: options.typeField,
|
|
227
|
+
idField: options.idField,
|
|
228
|
+
localKey: options.localKey,
|
|
229
|
+
cascade: options.cascade
|
|
230
|
+
}));
|
|
231
|
+
}
|