metal-orm 1.1.10 → 1.1.16
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 +106 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +106 -43
- package/dist/index.js.map +1 -1
- package/package.json +100 -96
- package/scripts/generate-entities/render.mjs +21 -12
- package/scripts/generate-entities/schema.mjs +209 -195
- package/scripts/generate-entities/tree-detection.mjs +159 -153
- 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/bulk/bulk-delete-executor.ts +3 -5
- package/src/bulk/bulk-insert-executor.ts +7 -7
- package/src/bulk/bulk-update-executor.ts +2 -2
- package/src/bulk/bulk-upsert-executor.ts +5 -7
- 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/mysql.ts +113 -36
- 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 +94 -94
- 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
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
import type { CountryValidator, CountryValidatorFactory } from './country-validators.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Registry for country-specific identifier validators
|
|
5
|
-
* Mirrors the INFLECTOR_FACTORIES pattern from scripts/inflection/index.mjs
|
|
6
|
-
*/
|
|
7
|
-
const VALIDATOR_FACTORIES = new Map<string, CountryValidatorFactory>();
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Registers a country validator factory
|
|
11
|
-
* @param countryCode - ISO 3166-1 alpha-2 country code (e.g., 'BR', 'US')
|
|
12
|
-
* @param identifierType - Identifier type (e.g., 'cpf', 'ssn')
|
|
13
|
-
* @param factory - Factory function that creates a validator instance
|
|
14
|
-
*/
|
|
15
|
-
export const registerValidator = (
|
|
16
|
-
countryCode: string,
|
|
17
|
-
identifierType: string,
|
|
18
|
-
factory: CountryValidatorFactory
|
|
19
|
-
): void => {
|
|
20
|
-
const key = `${countryCode.toLowerCase()}-${identifierType.toLowerCase()}`;
|
|
21
|
-
if (!countryCode) throw new Error('countryCode is required');
|
|
22
|
-
if (!identifierType) throw new Error('identifierType is required');
|
|
23
|
-
if (typeof factory !== 'function') {
|
|
24
|
-
throw new Error('factory must be a function that returns a validator');
|
|
25
|
-
}
|
|
26
|
-
VALIDATOR_FACTORIES.set(key, factory);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Resolves a validator for a given country and identifier type
|
|
31
|
-
* @param countryCode - ISO 3166-1 alpha-2 country code
|
|
32
|
-
* @param identifierType - Identifier type
|
|
33
|
-
* @returns Validator instance or undefined if not found
|
|
34
|
-
*/
|
|
35
|
-
export const resolveValidator = (
|
|
36
|
-
countryCode: string,
|
|
37
|
-
identifierType: string
|
|
38
|
-
): CountryValidator | undefined => {
|
|
39
|
-
const key = `${countryCode.toLowerCase()}-${identifierType.toLowerCase()}`;
|
|
40
|
-
const factory = VALIDATOR_FACTORIES.get(key);
|
|
41
|
-
return factory ? factory() : undefined;
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Gets all registered validator keys
|
|
46
|
-
* @returns Array of validator keys (e.g., ['br-cpf', 'us-ssn'])
|
|
47
|
-
*/
|
|
48
|
-
export const getRegisteredValidators = (): string[] => {
|
|
49
|
-
return Array.from(VALIDATOR_FACTORIES.keys());
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Checks if a validator is registered
|
|
54
|
-
* @param countryCode - ISO 3166-1 alpha-2 country code
|
|
55
|
-
* @param identifierType - Identifier type
|
|
56
|
-
* @returns True if validator is registered
|
|
57
|
-
*/
|
|
58
|
-
export const hasValidator = (
|
|
59
|
-
countryCode: string,
|
|
60
|
-
identifierType: string
|
|
61
|
-
): boolean => {
|
|
62
|
-
const key = `${countryCode.toLowerCase()}-${identifierType.toLowerCase()}`;
|
|
63
|
-
return VALIDATOR_FACTORIES.has(key);
|
|
64
|
-
};
|
|
1
|
+
import type { CountryValidator, CountryValidatorFactory } from './country-validators.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Registry for country-specific identifier validators
|
|
5
|
+
* Mirrors the INFLECTOR_FACTORIES pattern from scripts/inflection/index.mjs
|
|
6
|
+
*/
|
|
7
|
+
const VALIDATOR_FACTORIES = new Map<string, CountryValidatorFactory>();
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Registers a country validator factory
|
|
11
|
+
* @param countryCode - ISO 3166-1 alpha-2 country code (e.g., 'BR', 'US')
|
|
12
|
+
* @param identifierType - Identifier type (e.g., 'cpf', 'ssn')
|
|
13
|
+
* @param factory - Factory function that creates a validator instance
|
|
14
|
+
*/
|
|
15
|
+
export const registerValidator = (
|
|
16
|
+
countryCode: string,
|
|
17
|
+
identifierType: string,
|
|
18
|
+
factory: CountryValidatorFactory
|
|
19
|
+
): void => {
|
|
20
|
+
const key = `${countryCode.toLowerCase()}-${identifierType.toLowerCase()}`;
|
|
21
|
+
if (!countryCode) throw new Error('countryCode is required');
|
|
22
|
+
if (!identifierType) throw new Error('identifierType is required');
|
|
23
|
+
if (typeof factory !== 'function') {
|
|
24
|
+
throw new Error('factory must be a function that returns a validator');
|
|
25
|
+
}
|
|
26
|
+
VALIDATOR_FACTORIES.set(key, factory);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Resolves a validator for a given country and identifier type
|
|
31
|
+
* @param countryCode - ISO 3166-1 alpha-2 country code
|
|
32
|
+
* @param identifierType - Identifier type
|
|
33
|
+
* @returns Validator instance or undefined if not found
|
|
34
|
+
*/
|
|
35
|
+
export const resolveValidator = (
|
|
36
|
+
countryCode: string,
|
|
37
|
+
identifierType: string
|
|
38
|
+
): CountryValidator | undefined => {
|
|
39
|
+
const key = `${countryCode.toLowerCase()}-${identifierType.toLowerCase()}`;
|
|
40
|
+
const factory = VALIDATOR_FACTORIES.get(key);
|
|
41
|
+
return factory ? factory() : undefined;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Gets all registered validator keys
|
|
46
|
+
* @returns Array of validator keys (e.g., ['br-cpf', 'us-ssn'])
|
|
47
|
+
*/
|
|
48
|
+
export const getRegisteredValidators = (): string[] => {
|
|
49
|
+
return Array.from(VALIDATOR_FACTORIES.keys());
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Checks if a validator is registered
|
|
54
|
+
* @param countryCode - ISO 3166-1 alpha-2 country code
|
|
55
|
+
* @param identifierType - Identifier type
|
|
56
|
+
* @returns True if validator is registered
|
|
57
|
+
*/
|
|
58
|
+
export const hasValidator = (
|
|
59
|
+
countryCode: string,
|
|
60
|
+
identifierType: string
|
|
61
|
+
): boolean => {
|
|
62
|
+
const key = `${countryCode.toLowerCase()}-${identifierType.toLowerCase()}`;
|
|
63
|
+
return VALIDATOR_FACTORIES.has(key);
|
|
64
|
+
};
|
|
@@ -1,203 +1,203 @@
|
|
|
1
|
-
import { resolveFieldDecoratorInfo } from '../decorator-metadata.js';
|
|
2
|
-
import { registerValidator } from './country-validator-registry.js';
|
|
3
|
-
import { CPFValidator } from './built-in/br-cpf-validator.js';
|
|
4
|
-
import { CNPJValidator } from './built-in/br-cnpj-validator.js';
|
|
5
|
-
import { CEPValidator } from './built-in/br-cep-validator.js';
|
|
6
|
-
|
|
7
|
-
// Register built-in validators
|
|
8
|
-
registerValidator('BR', 'cpf', () => new CPFValidator());
|
|
9
|
-
registerValidator('BR', 'cnpj', () => new CNPJValidator());
|
|
10
|
-
registerValidator('BR', 'cep', () => new CEPValidator());
|
|
11
|
-
|
|
12
|
-
const resolveCountryDecoratorInfo = (targetOrValue: unknown, contextOrProperty: unknown) => {
|
|
13
|
-
return resolveFieldDecoratorInfo(targetOrValue, contextOrProperty, 'Country validator');
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Decorator to validate a Brazilian CPF number
|
|
18
|
-
* @param options - Validation options
|
|
19
|
-
* @returns Property decorator for CPF validation
|
|
20
|
-
*/
|
|
21
|
-
export function CPF(options?: { strict?: boolean; errorMessage?: string }) {
|
|
22
|
-
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
23
|
-
const { propertyName, bag } = resolveCountryDecoratorInfo(targetOrValue, contextOrProperty);
|
|
24
|
-
|
|
25
|
-
// Find or create transformer metadata for this property
|
|
26
|
-
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|
|
27
|
-
if (!existing) {
|
|
28
|
-
existing = {
|
|
29
|
-
propertyName,
|
|
30
|
-
metadata: {
|
|
31
|
-
propertyName,
|
|
32
|
-
transformers: [],
|
|
33
|
-
validators: [],
|
|
34
|
-
sanitizers: [],
|
|
35
|
-
executionOrder: 'both'
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
bag.transformers.push(existing);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Create validator instance
|
|
42
|
-
const validator = new CPFValidator();
|
|
43
|
-
|
|
44
|
-
// Add validator to metadata
|
|
45
|
-
existing.metadata.validators.push({
|
|
46
|
-
name: validator.name,
|
|
47
|
-
validate: (value: string) => {
|
|
48
|
-
const result = validator.validate(value, {
|
|
49
|
-
strict: options?.strict ?? true,
|
|
50
|
-
errorMessage: options?.errorMessage
|
|
51
|
-
});
|
|
52
|
-
return {
|
|
53
|
-
isValid: result.isValid,
|
|
54
|
-
error: result.error,
|
|
55
|
-
message: result.error
|
|
56
|
-
};
|
|
57
|
-
},
|
|
58
|
-
autoTransform: (value: string) => {
|
|
59
|
-
const correction = validator.autoCorrect(value);
|
|
60
|
-
if (correction?.success) {
|
|
61
|
-
return {
|
|
62
|
-
success: true,
|
|
63
|
-
correctedValue: correction.correctedValue,
|
|
64
|
-
message: correction.message
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
return { success: false };
|
|
68
|
-
}
|
|
69
|
-
} as unknown as never);
|
|
70
|
-
|
|
71
|
-
// Add sanitizer to normalize and format
|
|
72
|
-
existing.metadata.sanitizers.push({
|
|
73
|
-
name: 'cpf-formatter',
|
|
74
|
-
sanitize: (value: string) => validator.format(value)
|
|
75
|
-
});
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Decorator to validate a Brazilian CNPJ number
|
|
81
|
-
* @param options - Validation options
|
|
82
|
-
* @returns Property decorator for CNPJ validation
|
|
83
|
-
*/
|
|
84
|
-
export function CNPJ(options?: { strict?: boolean; errorMessage?: string }) {
|
|
85
|
-
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
86
|
-
const { propertyName, bag } = resolveCountryDecoratorInfo(targetOrValue, contextOrProperty);
|
|
87
|
-
|
|
88
|
-
// Find or create transformer metadata for this property
|
|
89
|
-
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|
|
90
|
-
if (!existing) {
|
|
91
|
-
existing = {
|
|
92
|
-
propertyName,
|
|
93
|
-
metadata: {
|
|
94
|
-
propertyName,
|
|
95
|
-
transformers: [],
|
|
96
|
-
validators: [],
|
|
97
|
-
sanitizers: [],
|
|
98
|
-
executionOrder: 'both'
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
bag.transformers.push(existing);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Create validator instance
|
|
105
|
-
const validator = new CNPJValidator();
|
|
106
|
-
|
|
107
|
-
// Add validator to metadata
|
|
108
|
-
existing.metadata.validators.push({
|
|
109
|
-
name: validator.name,
|
|
110
|
-
validate: (value: string) => {
|
|
111
|
-
const result = validator.validate(value, {
|
|
112
|
-
strict: options?.strict ?? true,
|
|
113
|
-
errorMessage: options?.errorMessage
|
|
114
|
-
});
|
|
115
|
-
return {
|
|
116
|
-
isValid: result.isValid,
|
|
117
|
-
error: result.error,
|
|
118
|
-
message: result.error
|
|
119
|
-
};
|
|
120
|
-
},
|
|
121
|
-
autoTransform: (value: string) => {
|
|
122
|
-
const correction = validator.autoCorrect(value);
|
|
123
|
-
if (correction?.success) {
|
|
124
|
-
return {
|
|
125
|
-
success: true,
|
|
126
|
-
correctedValue: correction.correctedValue,
|
|
127
|
-
message: correction.message
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
return { success: false };
|
|
131
|
-
}
|
|
132
|
-
} as unknown as never);
|
|
133
|
-
|
|
134
|
-
// Add sanitizer to normalize and format
|
|
135
|
-
existing.metadata.sanitizers.push({
|
|
136
|
-
name: 'cnpj-formatter',
|
|
137
|
-
sanitize: (value: string) => validator.format(value)
|
|
138
|
-
});
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Decorator to validate a Brazilian CEP number
|
|
144
|
-
* @param options - Validation options
|
|
145
|
-
* @returns Property decorator for CEP validation
|
|
146
|
-
*/
|
|
147
|
-
export function CEP(options?: { strict?: boolean; errorMessage?: string }) {
|
|
148
|
-
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
149
|
-
const { propertyName, bag } = resolveCountryDecoratorInfo(targetOrValue, contextOrProperty);
|
|
150
|
-
|
|
151
|
-
// Find or create transformer metadata for this property
|
|
152
|
-
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|
|
153
|
-
if (!existing) {
|
|
154
|
-
existing = {
|
|
155
|
-
propertyName,
|
|
156
|
-
metadata: {
|
|
157
|
-
propertyName,
|
|
158
|
-
transformers: [],
|
|
159
|
-
validators: [],
|
|
160
|
-
sanitizers: [],
|
|
161
|
-
executionOrder: 'both'
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
bag.transformers.push(existing);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Create validator instance
|
|
168
|
-
const validator = new CEPValidator();
|
|
169
|
-
|
|
170
|
-
// Add validator to metadata
|
|
171
|
-
existing.metadata.validators.push({
|
|
172
|
-
name: validator.name,
|
|
173
|
-
validate: (value: string) => {
|
|
174
|
-
const result = validator.validate(value, {
|
|
175
|
-
strict: options?.strict ?? true,
|
|
176
|
-
errorMessage: options?.errorMessage
|
|
177
|
-
});
|
|
178
|
-
return {
|
|
179
|
-
isValid: result.isValid,
|
|
180
|
-
error: result.error,
|
|
181
|
-
message: result.error
|
|
182
|
-
};
|
|
183
|
-
},
|
|
184
|
-
autoTransform: (value: string) => {
|
|
185
|
-
const correction = validator.autoCorrect(value);
|
|
186
|
-
if (correction?.success) {
|
|
187
|
-
return {
|
|
188
|
-
success: true,
|
|
189
|
-
correctedValue: correction.correctedValue,
|
|
190
|
-
message: correction.message
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
return { success: false };
|
|
194
|
-
}
|
|
195
|
-
} as unknown as never);
|
|
196
|
-
|
|
197
|
-
// Add sanitizer to normalize and format
|
|
198
|
-
existing.metadata.sanitizers.push({
|
|
199
|
-
name: 'cep-formatter',
|
|
200
|
-
sanitize: (value: string) => validator.format(value)
|
|
201
|
-
});
|
|
202
|
-
};
|
|
203
|
-
}
|
|
1
|
+
import { resolveFieldDecoratorInfo } from '../decorator-metadata.js';
|
|
2
|
+
import { registerValidator } from './country-validator-registry.js';
|
|
3
|
+
import { CPFValidator } from './built-in/br-cpf-validator.js';
|
|
4
|
+
import { CNPJValidator } from './built-in/br-cnpj-validator.js';
|
|
5
|
+
import { CEPValidator } from './built-in/br-cep-validator.js';
|
|
6
|
+
|
|
7
|
+
// Register built-in validators
|
|
8
|
+
registerValidator('BR', 'cpf', () => new CPFValidator());
|
|
9
|
+
registerValidator('BR', 'cnpj', () => new CNPJValidator());
|
|
10
|
+
registerValidator('BR', 'cep', () => new CEPValidator());
|
|
11
|
+
|
|
12
|
+
const resolveCountryDecoratorInfo = (targetOrValue: unknown, contextOrProperty: unknown) => {
|
|
13
|
+
return resolveFieldDecoratorInfo(targetOrValue, contextOrProperty, 'Country validator');
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Decorator to validate a Brazilian CPF number
|
|
18
|
+
* @param options - Validation options
|
|
19
|
+
* @returns Property decorator for CPF validation
|
|
20
|
+
*/
|
|
21
|
+
export function CPF(options?: { strict?: boolean; errorMessage?: string }) {
|
|
22
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
23
|
+
const { propertyName, bag } = resolveCountryDecoratorInfo(targetOrValue, contextOrProperty);
|
|
24
|
+
|
|
25
|
+
// Find or create transformer metadata for this property
|
|
26
|
+
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|
|
27
|
+
if (!existing) {
|
|
28
|
+
existing = {
|
|
29
|
+
propertyName,
|
|
30
|
+
metadata: {
|
|
31
|
+
propertyName,
|
|
32
|
+
transformers: [],
|
|
33
|
+
validators: [],
|
|
34
|
+
sanitizers: [],
|
|
35
|
+
executionOrder: 'both'
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
bag.transformers.push(existing);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Create validator instance
|
|
42
|
+
const validator = new CPFValidator();
|
|
43
|
+
|
|
44
|
+
// Add validator to metadata
|
|
45
|
+
existing.metadata.validators.push({
|
|
46
|
+
name: validator.name,
|
|
47
|
+
validate: (value: string) => {
|
|
48
|
+
const result = validator.validate(value, {
|
|
49
|
+
strict: options?.strict ?? true,
|
|
50
|
+
errorMessage: options?.errorMessage
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
isValid: result.isValid,
|
|
54
|
+
error: result.error,
|
|
55
|
+
message: result.error
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
autoTransform: (value: string) => {
|
|
59
|
+
const correction = validator.autoCorrect(value);
|
|
60
|
+
if (correction?.success) {
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
correctedValue: correction.correctedValue,
|
|
64
|
+
message: correction.message
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return { success: false };
|
|
68
|
+
}
|
|
69
|
+
} as unknown as never);
|
|
70
|
+
|
|
71
|
+
// Add sanitizer to normalize and format
|
|
72
|
+
existing.metadata.sanitizers.push({
|
|
73
|
+
name: 'cpf-formatter',
|
|
74
|
+
sanitize: (value: string) => validator.format(value)
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Decorator to validate a Brazilian CNPJ number
|
|
81
|
+
* @param options - Validation options
|
|
82
|
+
* @returns Property decorator for CNPJ validation
|
|
83
|
+
*/
|
|
84
|
+
export function CNPJ(options?: { strict?: boolean; errorMessage?: string }) {
|
|
85
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
86
|
+
const { propertyName, bag } = resolveCountryDecoratorInfo(targetOrValue, contextOrProperty);
|
|
87
|
+
|
|
88
|
+
// Find or create transformer metadata for this property
|
|
89
|
+
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|
|
90
|
+
if (!existing) {
|
|
91
|
+
existing = {
|
|
92
|
+
propertyName,
|
|
93
|
+
metadata: {
|
|
94
|
+
propertyName,
|
|
95
|
+
transformers: [],
|
|
96
|
+
validators: [],
|
|
97
|
+
sanitizers: [],
|
|
98
|
+
executionOrder: 'both'
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
bag.transformers.push(existing);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Create validator instance
|
|
105
|
+
const validator = new CNPJValidator();
|
|
106
|
+
|
|
107
|
+
// Add validator to metadata
|
|
108
|
+
existing.metadata.validators.push({
|
|
109
|
+
name: validator.name,
|
|
110
|
+
validate: (value: string) => {
|
|
111
|
+
const result = validator.validate(value, {
|
|
112
|
+
strict: options?.strict ?? true,
|
|
113
|
+
errorMessage: options?.errorMessage
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
isValid: result.isValid,
|
|
117
|
+
error: result.error,
|
|
118
|
+
message: result.error
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
autoTransform: (value: string) => {
|
|
122
|
+
const correction = validator.autoCorrect(value);
|
|
123
|
+
if (correction?.success) {
|
|
124
|
+
return {
|
|
125
|
+
success: true,
|
|
126
|
+
correctedValue: correction.correctedValue,
|
|
127
|
+
message: correction.message
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return { success: false };
|
|
131
|
+
}
|
|
132
|
+
} as unknown as never);
|
|
133
|
+
|
|
134
|
+
// Add sanitizer to normalize and format
|
|
135
|
+
existing.metadata.sanitizers.push({
|
|
136
|
+
name: 'cnpj-formatter',
|
|
137
|
+
sanitize: (value: string) => validator.format(value)
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Decorator to validate a Brazilian CEP number
|
|
144
|
+
* @param options - Validation options
|
|
145
|
+
* @returns Property decorator for CEP validation
|
|
146
|
+
*/
|
|
147
|
+
export function CEP(options?: { strict?: boolean; errorMessage?: string }) {
|
|
148
|
+
return function (targetOrValue: unknown, contextOrProperty: unknown) {
|
|
149
|
+
const { propertyName, bag } = resolveCountryDecoratorInfo(targetOrValue, contextOrProperty);
|
|
150
|
+
|
|
151
|
+
// Find or create transformer metadata for this property
|
|
152
|
+
let existing = bag.transformers.find(t => t.propertyName === propertyName);
|
|
153
|
+
if (!existing) {
|
|
154
|
+
existing = {
|
|
155
|
+
propertyName,
|
|
156
|
+
metadata: {
|
|
157
|
+
propertyName,
|
|
158
|
+
transformers: [],
|
|
159
|
+
validators: [],
|
|
160
|
+
sanitizers: [],
|
|
161
|
+
executionOrder: 'both'
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
bag.transformers.push(existing);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Create validator instance
|
|
168
|
+
const validator = new CEPValidator();
|
|
169
|
+
|
|
170
|
+
// Add validator to metadata
|
|
171
|
+
existing.metadata.validators.push({
|
|
172
|
+
name: validator.name,
|
|
173
|
+
validate: (value: string) => {
|
|
174
|
+
const result = validator.validate(value, {
|
|
175
|
+
strict: options?.strict ?? true,
|
|
176
|
+
errorMessage: options?.errorMessage
|
|
177
|
+
});
|
|
178
|
+
return {
|
|
179
|
+
isValid: result.isValid,
|
|
180
|
+
error: result.error,
|
|
181
|
+
message: result.error
|
|
182
|
+
};
|
|
183
|
+
},
|
|
184
|
+
autoTransform: (value: string) => {
|
|
185
|
+
const correction = validator.autoCorrect(value);
|
|
186
|
+
if (correction?.success) {
|
|
187
|
+
return {
|
|
188
|
+
success: true,
|
|
189
|
+
correctedValue: correction.correctedValue,
|
|
190
|
+
message: correction.message
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return { success: false };
|
|
194
|
+
}
|
|
195
|
+
} as unknown as never);
|
|
196
|
+
|
|
197
|
+
// Add sanitizer to normalize and format
|
|
198
|
+
existing.metadata.sanitizers.push({
|
|
199
|
+
name: 'cep-formatter',
|
|
200
|
+
sanitize: (value: string) => validator.format(value)
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
}
|