metal-orm 1.1.9 → 1.1.10
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 +769 -764
- package/dist/index.cjs +2147 -239
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +559 -39
- package/dist/index.d.ts +559 -39
- package/dist/index.js +2119 -239
- package/dist/index.js.map +1 -1
- package/package.json +17 -12
- package/src/bulk/bulk-context.ts +83 -0
- package/src/bulk/bulk-delete-executor.ts +89 -0
- package/src/bulk/bulk-executor.base.ts +73 -0
- package/src/bulk/bulk-insert-executor.ts +74 -0
- package/src/bulk/bulk-types.ts +70 -0
- package/src/bulk/bulk-update-executor.ts +192 -0
- package/src/bulk/bulk-upsert-executor.ts +95 -0
- package/src/bulk/bulk-utils.ts +91 -0
- package/src/bulk/index.ts +18 -0
- package/src/codegen/typescript.ts +30 -21
- package/src/core/ast/expression-builders.ts +107 -10
- package/src/core/ast/expression-nodes.ts +52 -22
- package/src/core/ast/expression-visitor.ts +23 -13
- package/src/core/dialect/abstract.ts +30 -17
- package/src/core/dialect/mysql/index.ts +20 -5
- package/src/core/execution/db-executor.ts +96 -64
- package/src/core/execution/executors/better-sqlite3-executor.ts +94 -0
- package/src/core/execution/executors/mssql-executor.ts +66 -34
- package/src/core/execution/executors/mysql-executor.ts +98 -66
- package/src/core/execution/executors/postgres-executor.ts +33 -11
- package/src/core/execution/executors/sqlite-executor.ts +86 -30
- package/src/decorators/bootstrap.ts +482 -398
- package/src/decorators/column-decorator.ts +87 -96
- package/src/decorators/decorator-metadata.ts +100 -24
- package/src/decorators/entity.ts +27 -24
- package/src/decorators/relations.ts +231 -149
- package/src/decorators/transformers/transformer-decorators.ts +26 -29
- package/src/decorators/validators/country-validators-decorators.ts +9 -15
- package/src/dto/apply-filter.ts +568 -551
- package/src/index.ts +16 -9
- package/src/orm/entity-hydration.ts +116 -72
- package/src/orm/entity-metadata.ts +347 -301
- package/src/orm/entity-relations.ts +264 -207
- package/src/orm/entity.ts +199 -199
- package/src/orm/execute.ts +13 -13
- package/src/orm/lazy-batch/morph-many.ts +70 -0
- package/src/orm/lazy-batch/morph-one.ts +69 -0
- package/src/orm/lazy-batch/morph-to.ts +59 -0
- package/src/orm/lazy-batch.ts +4 -1
- package/src/orm/orm-session.ts +170 -104
- package/src/orm/pooled-executor-factory.ts +99 -58
- package/src/orm/query-logger.ts +49 -40
- package/src/orm/relation-change-processor.ts +198 -96
- 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 -0
- package/src/orm/relations/morph-one.ts +151 -0
- package/src/orm/relations/morph-to.ts +162 -0
- package/src/orm/save-graph.ts +116 -1
- package/src/query-builder/expression-table-mapper.ts +5 -0
- package/src/query-builder/hydration-manager.ts +345 -345
- package/src/query-builder/hydration-planner.ts +178 -148
- package/src/query-builder/relation-conditions.ts +171 -151
- package/src/query-builder/relation-cte-builder.ts +5 -1
- package/src/query-builder/relation-filter-utils.ts +9 -6
- package/src/query-builder/relation-include-strategies.ts +44 -2
- package/src/query-builder/relation-join-strategies.ts +8 -1
- package/src/query-builder/relation-service.ts +250 -241
- package/src/query-builder/select/select-operations.ts +110 -105
- package/src/query-builder/update-include.ts +4 -0
- package/src/schema/relation.ts +296 -188
- package/src/schema/types.ts +138 -123
- package/src/tree/tree-decorator.ts +127 -137
|
@@ -1,149 +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 {
|
|
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
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
if (!
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveFieldDecoratorInfo } from '../decorator-metadata.js';
|
|
2
2
|
import type { TransformerMetadata } from './transformer-metadata.js';
|
|
3
3
|
import {
|
|
4
4
|
TrimTransformer,
|
|
@@ -9,19 +9,16 @@ import {
|
|
|
9
9
|
PatternValidator
|
|
10
10
|
} from './built-in/string-transformers.js';
|
|
11
11
|
|
|
12
|
-
const normalizePropertyName = (name: string | symbol): string => {
|
|
13
|
-
if (typeof name === 'symbol') {
|
|
14
|
-
return name.description ?? name.toString();
|
|
15
|
-
}
|
|
16
|
-
return name;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
12
|
const registerTransformerMetadata = (
|
|
20
|
-
|
|
13
|
+
targetOrValue: unknown,
|
|
14
|
+
contextOrProperty: unknown,
|
|
21
15
|
metadata: Partial<TransformerMetadata>
|
|
22
16
|
): void => {
|
|
23
|
-
const propertyName =
|
|
24
|
-
|
|
17
|
+
const { propertyName, bag } = resolveFieldDecoratorInfo(
|
|
18
|
+
targetOrValue,
|
|
19
|
+
contextOrProperty,
|
|
20
|
+
'Transformer'
|
|
21
|
+
);
|
|
25
22
|
|
|
26
23
|
// Find existing transformer metadata for this property
|
|
27
24
|
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|
|
@@ -57,8 +54,8 @@ const registerTransformerMetadata = (
|
|
|
57
54
|
|
|
58
55
|
// Trim decorator
|
|
59
56
|
export function Trim(options?: { trimStart?: boolean; trimEnd?: boolean; trimAll?: boolean }) {
|
|
60
|
-
return function (
|
|
61
|
-
registerTransformerMetadata(
|
|
57
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
58
|
+
registerTransformerMetadata(targetOrValue, contextOrProperty, {
|
|
62
59
|
sanitizers: [new TrimTransformer(options)]
|
|
63
60
|
});
|
|
64
61
|
};
|
|
@@ -66,8 +63,8 @@ export function Trim(options?: { trimStart?: boolean; trimEnd?: boolean; trimAll
|
|
|
66
63
|
|
|
67
64
|
// Lower case decorator
|
|
68
65
|
export function Lower() {
|
|
69
|
-
return function (
|
|
70
|
-
registerTransformerMetadata(
|
|
66
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
67
|
+
registerTransformerMetadata(targetOrValue, contextOrProperty, {
|
|
71
68
|
sanitizers: [new CaseTransformer('lower')]
|
|
72
69
|
});
|
|
73
70
|
};
|
|
@@ -75,8 +72,8 @@ export function Lower() {
|
|
|
75
72
|
|
|
76
73
|
// Upper case decorator
|
|
77
74
|
export function Upper() {
|
|
78
|
-
return function (
|
|
79
|
-
registerTransformerMetadata(
|
|
75
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
76
|
+
registerTransformerMetadata(targetOrValue, contextOrProperty, {
|
|
80
77
|
sanitizers: [new CaseTransformer('upper')]
|
|
81
78
|
});
|
|
82
79
|
};
|
|
@@ -84,8 +81,8 @@ export function Upper() {
|
|
|
84
81
|
|
|
85
82
|
// Capitalize decorator
|
|
86
83
|
export function Capitalize() {
|
|
87
|
-
return function (
|
|
88
|
-
registerTransformerMetadata(
|
|
84
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
85
|
+
registerTransformerMetadata(targetOrValue, contextOrProperty, {
|
|
89
86
|
sanitizers: [new CaseTransformer('capitalize')]
|
|
90
87
|
});
|
|
91
88
|
};
|
|
@@ -93,8 +90,8 @@ export function Capitalize() {
|
|
|
93
90
|
|
|
94
91
|
// Title case decorator
|
|
95
92
|
export function Title() {
|
|
96
|
-
return function (
|
|
97
|
-
registerTransformerMetadata(
|
|
93
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
94
|
+
registerTransformerMetadata(targetOrValue, contextOrProperty, {
|
|
98
95
|
sanitizers: [new CaseTransformer('title')]
|
|
99
96
|
});
|
|
100
97
|
};
|
|
@@ -102,8 +99,8 @@ export function Title() {
|
|
|
102
99
|
|
|
103
100
|
// Alphanumeric decorator
|
|
104
101
|
export function Alphanumeric(options?: { allowSpaces?: boolean; allowUnderscores?: boolean; allowHyphens?: boolean }) {
|
|
105
|
-
return function (
|
|
106
|
-
registerTransformerMetadata(
|
|
102
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
103
|
+
registerTransformerMetadata(targetOrValue, contextOrProperty, {
|
|
107
104
|
validators: [new AlphanumericValidator(options)]
|
|
108
105
|
});
|
|
109
106
|
};
|
|
@@ -111,8 +108,8 @@ export function Alphanumeric(options?: { allowSpaces?: boolean; allowUnderscores
|
|
|
111
108
|
|
|
112
109
|
// Email decorator
|
|
113
110
|
export function Email(options?: { allowPlus?: boolean; requireTLD?: boolean }) {
|
|
114
|
-
return function (
|
|
115
|
-
registerTransformerMetadata(
|
|
111
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
112
|
+
registerTransformerMetadata(targetOrValue, contextOrProperty, {
|
|
116
113
|
validators: [new EmailValidator(options)]
|
|
117
114
|
});
|
|
118
115
|
};
|
|
@@ -120,8 +117,8 @@ export function Email(options?: { allowPlus?: boolean; requireTLD?: boolean }) {
|
|
|
120
117
|
|
|
121
118
|
// Length decorator
|
|
122
119
|
export function Length(options: { min?: number; max?: number; exact?: number }) {
|
|
123
|
-
return function (
|
|
124
|
-
registerTransformerMetadata(
|
|
120
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
121
|
+
registerTransformerMetadata(targetOrValue, contextOrProperty, {
|
|
125
122
|
validators: [new LengthValidator(options)]
|
|
126
123
|
});
|
|
127
124
|
};
|
|
@@ -129,8 +126,8 @@ export function Length(options: { min?: number; max?: number; exact?: number })
|
|
|
129
126
|
|
|
130
127
|
// Pattern decorator
|
|
131
128
|
export function Pattern(options: { pattern: RegExp; flags?: string; errorMessage?: string; replacement?: string }) {
|
|
132
|
-
return function (
|
|
133
|
-
registerTransformerMetadata(
|
|
129
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
130
|
+
registerTransformerMetadata(targetOrValue, contextOrProperty, {
|
|
134
131
|
validators: [new PatternValidator(options)]
|
|
135
132
|
});
|
|
136
133
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveFieldDecoratorInfo } from '../decorator-metadata.js';
|
|
2
2
|
import { registerValidator } from './country-validator-registry.js';
|
|
3
3
|
import { CPFValidator } from './built-in/br-cpf-validator.js';
|
|
4
4
|
import { CNPJValidator } from './built-in/br-cnpj-validator.js';
|
|
@@ -9,11 +9,8 @@ registerValidator('BR', 'cpf', () => new CPFValidator());
|
|
|
9
9
|
registerValidator('BR', 'cnpj', () => new CNPJValidator());
|
|
10
10
|
registerValidator('BR', 'cep', () => new CEPValidator());
|
|
11
11
|
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
return name.description ?? name.toString();
|
|
15
|
-
}
|
|
16
|
-
return name;
|
|
12
|
+
const resolveCountryDecoratorInfo = (targetOrValue: unknown, contextOrProperty: unknown) => {
|
|
13
|
+
return resolveFieldDecoratorInfo(targetOrValue, contextOrProperty, 'Country validator');
|
|
17
14
|
};
|
|
18
15
|
|
|
19
16
|
/**
|
|
@@ -22,9 +19,8 @@ const normalizePropertyName = (name: string | symbol): string => {
|
|
|
22
19
|
* @returns Property decorator for CPF validation
|
|
23
20
|
*/
|
|
24
21
|
export function CPF(options?: { strict?: boolean; errorMessage?: string }) {
|
|
25
|
-
return function (
|
|
26
|
-
const propertyName =
|
|
27
|
-
const bag = getOrCreateMetadataBag(context);
|
|
22
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
23
|
+
const { propertyName, bag } = resolveCountryDecoratorInfo(targetOrValue, contextOrProperty);
|
|
28
24
|
|
|
29
25
|
// Find or create transformer metadata for this property
|
|
30
26
|
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|
|
@@ -86,9 +82,8 @@ export function CPF(options?: { strict?: boolean; errorMessage?: string }) {
|
|
|
86
82
|
* @returns Property decorator for CNPJ validation
|
|
87
83
|
*/
|
|
88
84
|
export function CNPJ(options?: { strict?: boolean; errorMessage?: string }) {
|
|
89
|
-
return function (
|
|
90
|
-
const propertyName =
|
|
91
|
-
const bag = getOrCreateMetadataBag(context);
|
|
85
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
86
|
+
const { propertyName, bag } = resolveCountryDecoratorInfo(targetOrValue, contextOrProperty);
|
|
92
87
|
|
|
93
88
|
// Find or create transformer metadata for this property
|
|
94
89
|
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|
|
@@ -150,9 +145,8 @@ export function CNPJ(options?: { strict?: boolean; errorMessage?: string }) {
|
|
|
150
145
|
* @returns Property decorator for CEP validation
|
|
151
146
|
*/
|
|
152
147
|
export function CEP(options?: { strict?: boolean; errorMessage?: string }) {
|
|
153
|
-
return function (
|
|
154
|
-
const propertyName =
|
|
155
|
-
const bag = getOrCreateMetadataBag(context);
|
|
148
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
149
|
+
const { propertyName, bag } = resolveCountryDecoratorInfo(targetOrValue, contextOrProperty);
|
|
156
150
|
|
|
157
151
|
// Find or create transformer metadata for this property
|
|
158
152
|
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|