@warlock.js/seal 5.30.0 → 5.32.0
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/CHANGELOG.md +46 -7
- package/README.md +57 -9
- package/cjs/index.cjs +41 -29
- package/cjs/index.cjs.map +1 -1
- package/cjs/{object--LXRt5RF.cjs → object-BoVGJ68E.cjs} +43 -24
- package/cjs/object-BoVGJ68E.cjs.map +1 -0
- package/cjs/object.cjs +2 -2
- package/cjs/{required-methods-DYsRO9aZ.cjs → required-methods-BJlnLnwa.cjs} +343 -258
- package/cjs/required-methods-BJlnLnwa.cjs.map +1 -0
- package/cjs/{string-DsqnKoSB.cjs → string-CM8x0u2w.cjs} +46 -44
- package/cjs/string-CM8x0u2w.cjs.map +1 -0
- package/cjs/string.cjs +2 -2
- package/esm/config.d.mts +7 -8
- package/esm/config.d.mts.map +1 -1
- package/esm/config.mjs.map +1 -1
- package/esm/factory/index.d.mts +2 -1
- package/esm/factory/index.mjs +1 -1
- package/esm/factory/validate.d.mts +3 -6
- package/esm/factory/validate.d.mts.map +1 -1
- package/esm/factory/validators.d.mts +16 -13
- package/esm/factory/validators.d.mts.map +1 -1
- package/esm/factory/validators.mjs +7 -1
- package/esm/factory/validators.mjs.map +1 -1
- package/esm/helpers/date-helpers.d.mts +1 -2
- package/esm/helpers/date-helpers.d.mts.map +1 -1
- package/esm/helpers/file.utils.d.mts +2 -4
- package/esm/helpers/file.utils.d.mts.map +1 -1
- package/esm/helpers/get-field-value.d.mts +2 -3
- package/esm/helpers/get-field-value.d.mts.map +1 -1
- package/esm/helpers/get-field-value.mjs +2 -1
- package/esm/helpers/get-field-value.mjs.map +1 -1
- package/esm/helpers/index.d.mts +6 -0
- package/esm/helpers/index.mjs +1 -1
- package/esm/helpers/path-helpers.d.mts +1 -2
- package/esm/helpers/path-helpers.d.mts.map +1 -1
- package/esm/helpers/validation-helpers.d.mts +4 -10
- package/esm/helpers/validation-helpers.d.mts.map +1 -1
- package/esm/index.d.mts +7 -0
- package/esm/mutators/array-mutators.d.mts +6 -7
- package/esm/mutators/array-mutators.d.mts.map +1 -1
- package/esm/mutators/boolean-mutators.d.mts +3 -4
- package/esm/mutators/boolean-mutators.d.mts.map +1 -1
- package/esm/mutators/date-mutators.d.mts +18 -19
- package/esm/mutators/date-mutators.d.mts.map +1 -1
- package/esm/mutators/index.d.mts +8 -0
- package/esm/mutators/index.mjs +1 -1
- package/esm/mutators/number-mutators.d.mts +10 -11
- package/esm/mutators/number-mutators.d.mts.map +1 -1
- package/esm/mutators/object-mutators.d.mts +4 -5
- package/esm/mutators/object-mutators.d.mts.map +1 -1
- package/esm/mutators/object-mutators.mjs +5 -4
- package/esm/mutators/object-mutators.mjs.map +1 -1
- package/esm/mutators/scalar-mutators.d.mts +2 -3
- package/esm/mutators/scalar-mutators.d.mts.map +1 -1
- package/esm/mutators/string-mutators.d.mts +37 -38
- package/esm/mutators/string-mutators.d.mts.map +1 -1
- package/esm/mutators/string-mutators.mjs +5 -3
- package/esm/mutators/string-mutators.mjs.map +1 -1
- package/esm/object.d.mts +3 -5
- package/esm/object.d.mts.map +1 -1
- package/esm/object.mjs.map +1 -1
- package/esm/plugins/plugin-system.d.mts +11 -9
- package/esm/plugins/plugin-system.d.mts.map +1 -1
- package/esm/rules/array/array-rules.d.mts +3 -4
- package/esm/rules/array/array-rules.d.mts.map +1 -1
- package/esm/rules/array/index.d.mts +2 -0
- package/esm/rules/array/index.mjs +1 -1
- package/esm/rules/color/color-rules.d.mts +8 -9
- package/esm/rules/color/color-rules.d.mts.map +1 -1
- package/esm/rules/color/index.d.mts +2 -0
- package/esm/rules/color/index.mjs +1 -1
- package/esm/rules/common/enum.d.mts +5 -6
- package/esm/rules/common/enum.d.mts.map +1 -1
- package/esm/rules/common/equals-field-rules.d.mts +3 -4
- package/esm/rules/common/equals-field-rules.d.mts.map +1 -1
- package/esm/rules/common/index.d.mts +7 -0
- package/esm/rules/common/index.mjs +1 -1
- package/esm/rules/common/instanceof.d.mts +2 -3
- package/esm/rules/common/instanceof.d.mts.map +1 -1
- package/esm/rules/common/literal.d.mts +2 -3
- package/esm/rules/common/literal.d.mts.map +1 -1
- package/esm/rules/common/literal.mjs.map +1 -1
- package/esm/rules/common/type-rules.d.mts +10 -11
- package/esm/rules/common/type-rules.d.mts.map +1 -1
- package/esm/rules/common/unknown-key.d.mts +2 -3
- package/esm/rules/common/unknown-key.d.mts.map +1 -1
- package/esm/rules/conditional/forbidden-if-rules.d.mts +7 -8
- package/esm/rules/conditional/forbidden-if-rules.d.mts.map +1 -1
- package/esm/rules/conditional/index.d.mts +11 -0
- package/esm/rules/conditional/index.mjs +1 -1
- package/esm/rules/conditional/present-if-rules.d.mts +6 -7
- package/esm/rules/conditional/present-if-rules.d.mts.map +1 -1
- package/esm/rules/conditional/present-unless-rules.d.mts +2 -3
- package/esm/rules/conditional/present-unless-rules.d.mts.map +1 -1
- package/esm/rules/conditional/present-with-rules.d.mts +4 -5
- package/esm/rules/conditional/present-with-rules.d.mts.map +1 -1
- package/esm/rules/conditional/present-without-rules.d.mts +4 -5
- package/esm/rules/conditional/present-without-rules.d.mts.map +1 -1
- package/esm/rules/conditional/required-if-rules.d.mts +10 -11
- package/esm/rules/conditional/required-if-rules.d.mts.map +1 -1
- package/esm/rules/conditional/required-unless-rules.d.mts +2 -3
- package/esm/rules/conditional/required-unless-rules.d.mts.map +1 -1
- package/esm/rules/conditional/required-when-rule.d.mts +2 -3
- package/esm/rules/conditional/required-when-rule.d.mts.map +1 -1
- package/esm/rules/conditional/required-with-rules.d.mts +4 -5
- package/esm/rules/conditional/required-with-rules.d.mts.map +1 -1
- package/esm/rules/conditional/required-without-rules.d.mts +4 -5
- package/esm/rules/conditional/required-without-rules.d.mts.map +1 -1
- package/esm/rules/core/equal.d.mts +2 -3
- package/esm/rules/core/equal.d.mts.map +1 -1
- package/esm/rules/core/forbidden.d.mts +2 -3
- package/esm/rules/core/forbidden.d.mts.map +1 -1
- package/esm/rules/core/index.d.mts +6 -0
- package/esm/rules/core/index.mjs +1 -1
- package/esm/rules/core/required.d.mts +3 -4
- package/esm/rules/core/required.d.mts.map +1 -1
- package/esm/rules/core/union.d.mts +10 -4
- package/esm/rules/core/union.d.mts.map +1 -1
- package/esm/rules/core/union.mjs +56 -10
- package/esm/rules/core/union.mjs.map +1 -1
- package/esm/rules/core/when.d.mts +2 -3
- package/esm/rules/core/when.d.mts.map +1 -1
- package/esm/rules/core/when.mjs.map +1 -1
- package/esm/rules/date/date-comparison-rules.d.mts +6 -7
- package/esm/rules/date/date-comparison-rules.d.mts.map +1 -1
- package/esm/rules/date/date-day-rules.d.mts +5 -6
- package/esm/rules/date/date-day-rules.d.mts.map +1 -1
- package/esm/rules/date/date-field-comparison-rules.d.mts +4 -5
- package/esm/rules/date/date-field-comparison-rules.d.mts.map +1 -1
- package/esm/rules/date/date-field-comparison-rules.mjs +6 -3
- package/esm/rules/date/date-field-comparison-rules.mjs.map +1 -1
- package/esm/rules/date/date-period-rules.d.mts +16 -16
- package/esm/rules/date/date-period-rules.d.mts.map +1 -1
- package/esm/rules/date/date-period-rules.mjs +24 -12
- package/esm/rules/date/date-period-rules.mjs.map +1 -1
- package/esm/rules/date/date-relative-rules.d.mts +4 -5
- package/esm/rules/date/date-relative-rules.d.mts.map +1 -1
- package/esm/rules/date/date-relative-rules.mjs +3 -3
- package/esm/rules/date/date-relative-rules.mjs.map +1 -1
- package/esm/rules/date/date-special-rules.d.mts +4 -5
- package/esm/rules/date/date-special-rules.d.mts.map +1 -1
- package/esm/rules/date/date.d.mts +16 -17
- package/esm/rules/date/date.d.mts.map +1 -1
- package/esm/rules/date/date.mjs +4 -2
- package/esm/rules/date/date.mjs.map +1 -1
- package/esm/rules/date/index.d.mts +8 -0
- package/esm/rules/date/index.mjs +1 -1
- package/esm/rules/file/dimensions.d.mts +5 -6
- package/esm/rules/file/dimensions.d.mts.map +1 -1
- package/esm/rules/file/file-size.d.mts +3 -4
- package/esm/rules/file/file-size.d.mts.map +1 -1
- package/esm/rules/file/index.d.mts +3 -0
- package/esm/rules/file/index.mjs +1 -1
- package/esm/rules/index.d.mts +56 -0
- package/esm/rules/index.mjs +1 -1
- package/esm/rules/length/index.d.mts +2 -0
- package/esm/rules/length/index.mjs +1 -1
- package/esm/rules/length/length-rules.d.mts +8 -9
- package/esm/rules/length/length-rules.d.mts.map +1 -1
- package/esm/rules/number/index.d.mts +2 -0
- package/esm/rules/number/index.mjs +1 -1
- package/esm/rules/number/number-rules.d.mts +11 -12
- package/esm/rules/number/number-rules.d.mts.map +1 -1
- package/esm/rules/number/number-rules.mjs +12 -6
- package/esm/rules/number/number-rules.mjs.map +1 -1
- package/esm/rules/scalar/index.mjs +1 -1
- package/esm/rules/string/alpha.d.mts +4 -5
- package/esm/rules/string/alpha.d.mts.map +1 -1
- package/esm/rules/string/credit-card.d.mts +2 -3
- package/esm/rules/string/credit-card.d.mts.map +1 -1
- package/esm/rules/string/email.d.mts +2 -3
- package/esm/rules/string/email.d.mts.map +1 -1
- package/esm/rules/string/id-formats.d.mts +6 -7
- package/esm/rules/string/id-formats.d.mts.map +1 -1
- package/esm/rules/string/index.d.mts +12 -0
- package/esm/rules/string/index.mjs +1 -1
- package/esm/rules/string/ip.d.mts +7 -8
- package/esm/rules/string/ip.d.mts.map +1 -1
- package/esm/rules/string/matches.d.mts +2 -3
- package/esm/rules/string/matches.d.mts.map +1 -1
- package/esm/rules/string/pattern.d.mts +2 -3
- package/esm/rules/string/pattern.d.mts.map +1 -1
- package/esm/rules/string/string-comparison.d.mts +5 -6
- package/esm/rules/string/string-comparison.d.mts.map +1 -1
- package/esm/rules/string/strong-password-rule.d.mts +2 -3
- package/esm/rules/string/strong-password-rule.d.mts.map +1 -1
- package/esm/rules/string/url.d.mts +2 -3
- package/esm/rules/string/url.d.mts.map +1 -1
- package/esm/rules/string/without-whitespace.d.mts +2 -3
- package/esm/rules/string/without-whitespace.d.mts.map +1 -1
- package/esm/standard-schema/index.d.mts +4 -0
- package/esm/standard-schema/json-schema.d.mts +5 -7
- package/esm/standard-schema/json-schema.d.mts.map +1 -1
- package/esm/standard-schema/json-schema.mjs.map +1 -1
- package/esm/standard-schema/map-result.d.mts +2 -3
- package/esm/standard-schema/map-result.d.mts.map +1 -1
- package/esm/standard-schema/map-result.mjs.map +1 -1
- package/esm/standard-schema/types.d.mts +4 -5
- package/esm/standard-schema/types.d.mts.map +1 -1
- package/esm/string.d.mts +2 -3
- package/esm/string.d.mts.map +1 -1
- package/esm/types/conditional-types.d.mts +8 -6
- package/esm/types/conditional-types.d.mts.map +1 -1
- package/esm/types/context-types.d.mts +24 -15
- package/esm/types/context-types.d.mts.map +1 -1
- package/esm/types/data-transformer-types.d.mts +3 -5
- package/esm/types/data-transformer-types.d.mts.map +1 -1
- package/esm/types/date-types.d.mts +2 -3
- package/esm/types/date-types.d.mts.map +1 -1
- package/esm/types/file.types.d.mts +1 -2
- package/esm/types/file.types.d.mts.map +1 -1
- package/esm/types/index.d.mts +11 -0
- package/esm/types/inference-types.d.mts +15 -14
- package/esm/types/inference-types.d.mts.map +1 -1
- package/esm/types/mutator-types.d.mts +9 -7
- package/esm/types/mutator-types.d.mts.map +1 -1
- package/esm/types/result-types.d.mts +12 -7
- package/esm/types/result-types.d.mts.map +1 -1
- package/esm/types/rule-types.d.mts +33 -15
- package/esm/types/rule-types.d.mts.map +1 -1
- package/esm/types/schema-types.d.mts +1 -3
- package/esm/types/schema-types.d.mts.map +1 -1
- package/esm/validators/any-validator.d.mts +1 -3
- package/esm/validators/any-validator.d.mts.map +1 -1
- package/esm/validators/array-validator.d.mts +2 -3
- package/esm/validators/array-validator.d.mts.map +1 -1
- package/esm/validators/array-validator.mjs +3 -3
- package/esm/validators/array-validator.mjs.map +1 -1
- package/esm/validators/base-validator.d.mts +10 -11
- package/esm/validators/base-validator.d.mts.map +1 -1
- package/esm/validators/base-validator.mjs +52 -21
- package/esm/validators/base-validator.mjs.map +1 -1
- package/esm/validators/boolean-validator.d.mts +1 -3
- package/esm/validators/boolean-validator.d.mts.map +1 -1
- package/esm/validators/computed-validator.d.mts +3 -4
- package/esm/validators/computed-validator.d.mts.map +1 -1
- package/esm/validators/computed-validator.mjs +4 -4
- package/esm/validators/computed-validator.mjs.map +1 -1
- package/esm/validators/date-validator.d.mts +2 -3
- package/esm/validators/date-validator.d.mts.map +1 -1
- package/esm/validators/discriminated-union-validator.d.mts +3 -3
- package/esm/validators/discriminated-union-validator.d.mts.map +1 -1
- package/esm/validators/discriminated-union-validator.mjs +1 -1
- package/esm/validators/discriminated-union-validator.mjs.map +1 -1
- package/esm/validators/float-validator.d.mts +1 -3
- package/esm/validators/float-validator.d.mts.map +1 -1
- package/esm/validators/index.d.mts +2 -1
- package/esm/validators/index.mjs +1 -1
- package/esm/validators/instanceof-validator.d.mts +1 -3
- package/esm/validators/instanceof-validator.d.mts.map +1 -1
- package/esm/validators/int-validator.d.mts +1 -3
- package/esm/validators/int-validator.d.mts.map +1 -1
- package/esm/validators/lazy-validator.d.mts +2 -3
- package/esm/validators/lazy-validator.d.mts.map +1 -1
- package/esm/validators/lazy-validator.mjs +1 -1
- package/esm/validators/lazy-validator.mjs.map +1 -1
- package/esm/validators/literal-validator.d.mts +1 -3
- package/esm/validators/literal-validator.d.mts.map +1 -1
- package/esm/validators/managed-validator.d.mts +3 -4
- package/esm/validators/managed-validator.d.mts.map +1 -1
- package/esm/validators/methods/equality-conditional-methods.d.mts +3 -4
- package/esm/validators/methods/equality-conditional-methods.d.mts.map +1 -1
- package/esm/validators/methods/forbidden-methods.d.mts +2 -3
- package/esm/validators/methods/forbidden-methods.d.mts.map +1 -1
- package/esm/validators/methods/present-methods.d.mts +2 -3
- package/esm/validators/methods/present-methods.d.mts.map +1 -1
- package/esm/validators/methods/required-methods.d.mts +3 -4
- package/esm/validators/methods/required-methods.d.mts.map +1 -1
- package/esm/validators/number-validator.d.mts +1 -3
- package/esm/validators/number-validator.d.mts.map +1 -1
- package/esm/validators/number-validator.mjs +12 -8
- package/esm/validators/number-validator.mjs.map +1 -1
- package/esm/validators/numeric-validator.d.mts +1 -3
- package/esm/validators/numeric-validator.d.mts.map +1 -1
- package/esm/validators/object-validator.d.mts +2 -3
- package/esm/validators/object-validator.d.mts.map +1 -1
- package/esm/validators/object-validator.mjs +9 -7
- package/esm/validators/object-validator.mjs.map +1 -1
- package/esm/validators/primitive-validator.d.mts +1 -3
- package/esm/validators/primitive-validator.d.mts.map +1 -1
- package/esm/validators/record-validator.d.mts +2 -3
- package/esm/validators/record-validator.d.mts.map +1 -1
- package/esm/validators/record-validator.mjs +3 -3
- package/esm/validators/record-validator.mjs.map +1 -1
- package/esm/validators/scalar-validator.d.mts +1 -3
- package/esm/validators/scalar-validator.d.mts.map +1 -1
- package/esm/validators/scalar-validator.mjs.map +1 -1
- package/esm/validators/string-validator.d.mts +1 -3
- package/esm/validators/string-validator.d.mts.map +1 -1
- package/esm/validators/tuple-validator.d.mts +2 -3
- package/esm/validators/tuple-validator.d.mts.map +1 -1
- package/esm/validators/tuple-validator.mjs +3 -3
- package/esm/validators/tuple-validator.mjs.map +1 -1
- package/esm/validators/union-validator.d.mts +4 -4
- package/esm/validators/union-validator.d.mts.map +1 -1
- package/esm/validators/union-validator.mjs +3 -1
- package/esm/validators/union-validator.mjs.map +1 -1
- package/llms-full.txt +656 -527
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/skills/bridge-standard-schema/SKILL.md +60 -36
- package/skills/compose-seal-modifiers/SKILL.md +89 -53
- package/skills/define-structural-shape/SKILL.md +41 -27
- package/skills/define-structural-shape/array-methods.md +27 -27
- package/skills/define-structural-shape/object-methods.md +38 -30
- package/skills/extend-seal-with-plugins/SKILL.md +39 -5
- package/skills/generate-json-schema/SKILL.md +13 -13
- package/skills/handle-seal-errors/SKILL.md +23 -23
- package/skills/index.md +4 -1
- package/skills/overview/SKILL.md +10 -2
- package/skills/pick-seal-primitive/SKILL.md +45 -45
- package/skills/pick-seal-primitive/date-methods.md +96 -96
- package/skills/pick-seal-primitive/number-methods.md +55 -55
- package/skills/pick-seal-primitive/string-methods.md +107 -102
- package/skills/seal-basics/SKILL.md +14 -14
- package/cjs/object--LXRt5RF.cjs.map +0 -1
- package/cjs/required-methods-DYsRO9aZ.cjs.map +0 -1
- package/cjs/string-DsqnKoSB.cjs.map +0 -1
|
@@ -1,27 +1,29 @@
|
|
|
1
1
|
import { SchemaContext } from "./context-types.mjs";
|
|
2
|
-
|
|
3
2
|
//#region ../../packages/seal/src/types/mutator-types.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Mutator context
|
|
6
5
|
*/
|
|
7
|
-
type MutatorContext<Options = any> = {
|
|
8
|
-
/** Mutator options */
|
|
6
|
+
export type MutatorContext<Options = any> = {
|
|
7
|
+
/** Mutator options */
|
|
8
|
+
options: Options;
|
|
9
|
+
/** Global validation context */
|
|
9
10
|
ctx: SchemaContext;
|
|
10
11
|
};
|
|
11
12
|
/**
|
|
12
13
|
* Mutator function - transforms data before validation
|
|
13
14
|
*/
|
|
14
|
-
type Mutator<Options = any> = (data: any, context?: MutatorContext<Options>) => Promise<any>;
|
|
15
|
+
export type Mutator<Options = any> = (data: any, context?: MutatorContext<Options>) => Promise<any>;
|
|
15
16
|
/**
|
|
16
17
|
* Contextualized mutator - mutator with runtime context
|
|
17
18
|
*/
|
|
18
|
-
type ContextualizedMutator<Options = any> = {
|
|
19
|
-
/** Mutation function */
|
|
19
|
+
export type ContextualizedMutator<Options = any> = {
|
|
20
|
+
/** Mutation function */
|
|
21
|
+
mutate: Mutator<Options>;
|
|
22
|
+
/** Mutator context */
|
|
20
23
|
context: {
|
|
21
24
|
options: Options;
|
|
22
25
|
ctx: SchemaContext;
|
|
23
26
|
};
|
|
24
27
|
};
|
|
25
28
|
//#endregion
|
|
26
|
-
export { ContextualizedMutator, Mutator, MutatorContext };
|
|
27
29
|
//# sourceMappingURL=mutator-types.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutator-types.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/types/mutator-types.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"mutator-types.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/types/mutator-types.ts"],"mappings":";;;;;YAKY,eAAe;;EAEzB,SAAS;;EAET,KAAK;;;;;YAMK,QAAQ,kBAAkB,WAAW,UAAU,eAAe,aAAa;;;;YAK3E,sBAAsB;;EAEhC,QAAQ,QAAQ;;EAEhB;IACE,SAAS;IACT,KAAK"}
|
|
@@ -2,12 +2,18 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Validation result
|
|
4
4
|
*/
|
|
5
|
-
type ValidationResult = {
|
|
6
|
-
/** Whether validation passed */
|
|
7
|
-
|
|
5
|
+
export type ValidationResult = {
|
|
6
|
+
/** Whether validation passed */
|
|
7
|
+
isValid: boolean;
|
|
8
|
+
/** Validated and potentially mutated data */
|
|
9
|
+
data: any;
|
|
10
|
+
/** List of validation errors */
|
|
8
11
|
errors: {
|
|
9
|
-
/** Rule type that failed */
|
|
10
|
-
|
|
12
|
+
/** Rule type that failed */
|
|
13
|
+
type: string;
|
|
14
|
+
/** Error message */
|
|
15
|
+
error: string;
|
|
16
|
+
/** Input field name */
|
|
11
17
|
input: string;
|
|
12
18
|
}[];
|
|
13
19
|
};
|
|
@@ -26,7 +32,7 @@ type ValidationResult = {
|
|
|
26
32
|
* result.data; // Infer.Output<typeof schema>
|
|
27
33
|
* ```
|
|
28
34
|
*/
|
|
29
|
-
type TypedValidationResult<TData> = {
|
|
35
|
+
export type TypedValidationResult<TData> = {
|
|
30
36
|
isValid: true;
|
|
31
37
|
data: TData;
|
|
32
38
|
errors: ValidationResult["errors"];
|
|
@@ -36,5 +42,4 @@ type TypedValidationResult<TData> = {
|
|
|
36
42
|
errors: ValidationResult["errors"];
|
|
37
43
|
};
|
|
38
44
|
//#endregion
|
|
39
|
-
export { TypedValidationResult, ValidationResult };
|
|
40
45
|
//# sourceMappingURL=result-types.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-types.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/types/result-types.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"result-types.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/types/result-types.ts"],"mappings":";;;;YAGY;;EAEV;;EAEA;;EAEA;;IAEE;;IAEA;;IAEA;;;;;;;;;;;;;;;;;;YAmBQ,sBAAsB;EAC5B;EAAe,MAAM;EAAO,QAAQ;;EACpC;EAAgB;EAAiB,QAAQ"}
|
|
@@ -1,39 +1,55 @@
|
|
|
1
1
|
import { SchemaContext } from "./context-types.mjs";
|
|
2
|
-
|
|
3
2
|
//#region ../../packages/seal/src/types/rule-types.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Rule validation result
|
|
6
5
|
*/
|
|
7
|
-
type RuleResult = {
|
|
6
|
+
export type RuleResult = {
|
|
8
7
|
isValid: false;
|
|
9
8
|
error: string;
|
|
10
9
|
input: string;
|
|
11
10
|
path: string;
|
|
11
|
+
/**
|
|
12
|
+
* Report several errors for this rule, each at its own path. When set,
|
|
13
|
+
* it replaces `error`/`path` in the validation result.
|
|
14
|
+
*/
|
|
15
|
+
errors?: Array<{
|
|
16
|
+
error: string;
|
|
17
|
+
path: string;
|
|
18
|
+
}>;
|
|
12
19
|
} | {
|
|
13
20
|
isValid: true;
|
|
21
|
+
/** Replace the validated value, including an explicit undefined output. */
|
|
22
|
+
data?: unknown;
|
|
14
23
|
};
|
|
15
24
|
type AttributeValue = string | number;
|
|
16
|
-
type ValidationAttributesList = Record<string, AttributeValue | Record<string, AttributeValue>>;
|
|
25
|
+
export type ValidationAttributesList = Record<string, AttributeValue | Record<string, AttributeValue>>;
|
|
17
26
|
/**
|
|
18
27
|
* Rule options - generic options passed to rules
|
|
19
28
|
*/
|
|
20
|
-
type SchemaRuleOptions<T = any> = Record<string, T>;
|
|
29
|
+
export type SchemaRuleOptions<T = any> = Record<string, T>;
|
|
21
30
|
/**
|
|
22
31
|
* Schema rule definition
|
|
23
32
|
*/
|
|
24
|
-
type SchemaRule<Options extends SchemaRuleOptions = SchemaRuleOptions> = {
|
|
25
|
-
/** Rule name */
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
export type SchemaRule<Options extends SchemaRuleOptions = SchemaRuleOptions> = {
|
|
34
|
+
/** Rule name */
|
|
35
|
+
name: string;
|
|
36
|
+
/** Rule description */
|
|
37
|
+
description?: string;
|
|
38
|
+
/** Whether the rule requires a non-undefined value */
|
|
39
|
+
requiresValue?: boolean;
|
|
40
|
+
/** Validation function */
|
|
41
|
+
validate: (this: ContextualSchemaRule<Options>, value: any, context: SchemaContext) => Promise<RuleResult>;
|
|
42
|
+
/** Default error message */
|
|
43
|
+
defaultErrorMessage?: string;
|
|
44
|
+
/** Error message */
|
|
45
|
+
errorMessage?: string;
|
|
46
|
+
/** Sort order for rule execution */
|
|
31
47
|
sortOrder?: number;
|
|
32
48
|
};
|
|
33
49
|
/**
|
|
34
50
|
* Contextualized schema rule - rule with runtime context
|
|
35
51
|
*/
|
|
36
|
-
type ContextualSchemaRule<Options extends SchemaRuleOptions = SchemaRuleOptions> = SchemaRule & {
|
|
52
|
+
export type ContextualSchemaRule<Options extends SchemaRuleOptions = SchemaRuleOptions> = SchemaRule & {
|
|
37
53
|
/**
|
|
38
54
|
* The context object is used to pass additional information to the rule
|
|
39
55
|
* This will be always overridden when the rule is injected into a validator
|
|
@@ -42,11 +58,13 @@ type ContextualSchemaRule<Options extends SchemaRuleOptions = SchemaRuleOptions>
|
|
|
42
58
|
errorMessage?: string;
|
|
43
59
|
options: Options;
|
|
44
60
|
attributesList: ValidationAttributesList;
|
|
45
|
-
translatedAttributes: Record<string, string>;
|
|
46
|
-
|
|
61
|
+
translatedAttributes: Record<string, string>;
|
|
62
|
+
/** Raw placeholder values — substituted as-is (enums, numbers, computed strings) */
|
|
63
|
+
translationParams: Record<string, any>;
|
|
64
|
+
/** Field-key placeholder values — passed through the attribute translator before substitution */
|
|
47
65
|
translatableParams: Record<string, string>;
|
|
48
66
|
};
|
|
49
67
|
};
|
|
50
68
|
//#endregion
|
|
51
|
-
export {
|
|
69
|
+
export {};
|
|
52
70
|
//# sourceMappingURL=rule-types.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-types.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/types/rule-types.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"rule-types.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/types/rule-types.ts"],"mappings":";;;;;YAKY;EAEN;EACA;EACA;EACA;;;;;EAKA,SAAS;IAAQ;IAAe;;;EAGhC;;EAEA;;KAGD;YAEO,2BAA2B,eAErC,iBAAiB,eAAe;;;;YAMtB,kBAAkB,WAAW,eAAe;;;;YAK5C,WAAW,gBAAgB,oBAAoB;;EAEzD;;EAEA;;EAEA;;EAEA,WACE,MAAM,qBAAqB,UAC3B,YACA,SAAS,kBACN,QAAQ;;EAEb;;EAEA;;EAEA;;;;;YAMU,qBAAqB,gBAAgB,oBAAoB,qBACnE;;;;;EAKE;IACE;IACA,SAAS;IACT,gBAAgB;IAChB,sBAAsB;;IAEtB,mBAAmB;;IAEnB,oBAAoB"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { BaseValidator } from "../validators/base-validator.mjs";
|
|
2
|
-
|
|
3
2
|
//#region ../../packages/seal/src/types/schema-types.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Schema definition - a record of validators
|
|
6
5
|
*/
|
|
7
|
-
type Schema = Record<string, BaseValidator>;
|
|
6
|
+
export type Schema = Record<string, BaseValidator>;
|
|
8
7
|
//#endregion
|
|
9
|
-
export { Schema };
|
|
10
8
|
//# sourceMappingURL=schema-types.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-types.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/types/schema-types.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"schema-types.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/types/schema-types.ts"],"mappings":";;;;;YAKY,SAAS,eAAe"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { JsonSchemaResult, JsonSchemaTarget } from "../standard-schema/json-schema.mjs";
|
|
2
2
|
import { BaseValidator } from "./base-validator.mjs";
|
|
3
|
-
|
|
4
3
|
//#region ../../packages/seal/src/validators/any-validator.d.ts
|
|
5
4
|
/**
|
|
6
5
|
* Any validator - accepts any value
|
|
7
6
|
*/
|
|
8
|
-
declare class AnyValidator extends BaseValidator {
|
|
7
|
+
export declare class AnyValidator extends BaseValidator {
|
|
9
8
|
/**
|
|
10
9
|
* Any validator means any value, so we disable the default required requirement.
|
|
11
10
|
*/
|
|
@@ -29,5 +28,4 @@ declare class AnyValidator extends BaseValidator {
|
|
|
29
28
|
toJsonSchema(target?: JsonSchemaTarget): JsonSchemaResult;
|
|
30
29
|
}
|
|
31
30
|
//#endregion
|
|
32
|
-
export { AnyValidator };
|
|
33
31
|
//# sourceMappingURL=any-validator.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"any-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/any-validator.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"any-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/any-validator.ts"],"mappings":";;;;;;qBAOa,qBAAqB;;;;EAIhB;;;;EAKA;;;;;;;;;;;;;EAcA,aAAa,SAAQ,mBAAqC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { JsonSchemaResult, JsonSchemaTarget } from "../standard-schema/json-schema.mjs";
|
|
2
2
|
import { SchemaContext } from "../types/context-types.mjs";
|
|
3
3
|
import { ValidationResult } from "../types/result-types.mjs";
|
|
4
|
+
import "../types/index.mjs";
|
|
4
5
|
import { BaseValidator } from "./base-validator.mjs";
|
|
5
|
-
|
|
6
6
|
//#region ../../packages/seal/src/validators/array-validator.d.ts
|
|
7
7
|
/**
|
|
8
8
|
* Array validator class
|
|
9
9
|
*/
|
|
10
|
-
declare class ArrayValidator extends BaseValidator {
|
|
10
|
+
export declare class ArrayValidator extends BaseValidator {
|
|
11
11
|
validator: BaseValidator;
|
|
12
12
|
constructor(validator: BaseValidator, errorMessage?: string);
|
|
13
13
|
/**
|
|
@@ -82,5 +82,4 @@ declare class ArrayValidator extends BaseValidator {
|
|
|
82
82
|
toJsonSchema(target?: JsonSchemaTarget): JsonSchemaResult;
|
|
83
83
|
}
|
|
84
84
|
//#endregion
|
|
85
|
-
export { ArrayValidator };
|
|
86
85
|
//# sourceMappingURL=array-validator.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/array-validator.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"array-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/array-validator.ts"],"mappings":";;;;;;;;;qBAmBa,uBAAuB;EAEzB,WAAW;EADpB,YACS,WAAW,eAClB;;;;EAUK,YAAY;;;;EAOH;;EAST;;EAKA;;EAKA;;EAKA,KAAK,4BAAmC;;EAKxC,IAAI,aAAa;;EAKjB,UAAU,gBAAgB;;EAK1B,IAAI,aAAa;;EAKjB,UAAU,gBAAgB;;EAK1B,OAAO,gBAAgB;;;;;;;;;;;;;;;EAkBvB,QAAQ,aAAa,aAAa;;;;EAUlC,cAAc,aAAa,aAAa;;EAKxC,OAAO;;EAKP,OAAO,4BAAmC;;EAK1C,OAAO,WAAW,SAAS;;;;;;;EAWrB,SAAS,WAAW,SAAS,gBAAgB,QAAQ;;;;;;;;;;;;EAgElD,aAAa,SAAQ,mBAAqC"}
|
|
@@ -121,7 +121,7 @@ var ArrayValidator = class extends BaseValidator {
|
|
|
121
121
|
async validate(data, context) {
|
|
122
122
|
const valueForRules = data ?? this.getDefaultValue();
|
|
123
123
|
const mutatedData = await this.mutate(valueForRules, context);
|
|
124
|
-
const result = await
|
|
124
|
+
const result = await this.validateRules(data, context);
|
|
125
125
|
if (result.isValid === false) return result;
|
|
126
126
|
if (mutatedData === void 0 || mutatedData === null) return result;
|
|
127
127
|
if (!Array.isArray(mutatedData)) return result;
|
|
@@ -139,11 +139,11 @@ var ArrayValidator = class extends BaseValidator {
|
|
|
139
139
|
if (childResult.isValid === false) errors.push(...childResult.errors);
|
|
140
140
|
});
|
|
141
141
|
await Promise.all(validationPromises);
|
|
142
|
-
return {
|
|
142
|
+
return this.refineResult({
|
|
143
143
|
isValid: errors.length === 0,
|
|
144
144
|
errors,
|
|
145
145
|
data: await this.startTransformationPipeline(mutatedData, context)
|
|
146
|
-
};
|
|
146
|
+
}, context);
|
|
147
147
|
}
|
|
148
148
|
/**
|
|
149
149
|
* @inheritdoc
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/array-validator.ts"],"sourcesContent":["import { setKeyPath } from \"../helpers\";\nimport { flipArrayMutator, sortArrayMutator, uniqueArrayMutator } from \"../mutators\";\nimport {\n arrayRule,\n betweenLengthRule,\n lengthRule,\n maxLengthRule,\n minLengthRule,\n sortedArrayRule,\n uniqueArrayRule,\n} from \"../rules\";\nimport type { SchemaContext, ValidationResult } from \"../types\";\nimport { BaseValidator } from \"./base-validator\";\nimport { applyNullable, getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Array validator class\n */\nexport class ArrayValidator extends BaseValidator {\n public constructor(\n public validator: BaseValidator,\n errorMessage?: string,\n ) {\n super();\n this.blankIsMissing = true;\n this.addMutableRule(arrayRule, errorMessage);\n }\n\n /**\n * Check if value is an array type\n */\n public matchesType(value: any): boolean {\n return Array.isArray(value);\n }\n\n /**\n * Clone the validator\n */\n public override clone(): this {\n const cloned = super.clone();\n\n cloned.validator = this.validator.clone();\n\n return cloned;\n }\n\n /** Reverse array order */\n public flip() {\n return this.addMutator(flipArrayMutator);\n }\n\n /** Reverse array order (alias) */\n public reverse() {\n return this.addMutator(flipArrayMutator);\n }\n\n /** Make it has only unique values */\n public onlyUnique() {\n return this.addMutator(uniqueArrayMutator);\n }\n\n /** Sort array */\n public sort(direction: \"asc\" | \"desc\" = \"asc\", key?: string) {\n return this.addMutator(sortArrayMutator, { direction, key });\n }\n\n /** Array length must be greater than the given length */\n public min(min: number, errorMessage?: string) {\n return this.addRule(minLengthRule, errorMessage, { minLength: min });\n }\n\n /** @alias min */\n public minLength(length: number, errorMessage?: string) {\n return this.min(length, errorMessage);\n }\n\n /** Array length must be less than the given length */\n public max(max: number, errorMessage?: string) {\n return this.addRule(maxLengthRule, errorMessage, { maxLength: max });\n }\n\n /** @alias max */\n public maxLength(length: number, errorMessage?: string) {\n return this.max(length, errorMessage);\n }\n\n /** Array length must be of the given length */\n public length(length: number, errorMessage?: string) {\n return this.addRule(lengthRule, errorMessage, { length });\n }\n\n /**\n * Array length must be between min and max (inclusive)\n *\n * @param min - Minimum length (inclusive)\n * @param max - Maximum length (inclusive)\n *\n * @example\n * ```ts\n * v.array(v.string()).between(1, 10) // Array must have 1 to 10 items\n * v.array(v.number()).lengthBetween(5, 20) // Same using alias\n * ```\n *\n * @category Validation Rule\n */\n public between(min: number, max: number, errorMessage?: string) {\n return this.addRule(betweenLengthRule, errorMessage, {\n minLength: min,\n maxLength: max,\n });\n }\n\n /**\n * Alias for between() - array length between min and max\n */\n public lengthBetween(min: number, max: number, errorMessage?: string) {\n return this.between(min, max, errorMessage);\n }\n\n /** Array must have unique values */\n public unique(errorMessage?: string) {\n return this.addRule(uniqueArrayRule, errorMessage);\n }\n\n /** Array must be sorted */\n public sorted(direction: \"asc\" | \"desc\" = \"asc\", errorMessage?: string) {\n return this.addRule(sortedArrayRule, errorMessage, { direction });\n }\n\n /** Mutate the data */\n public mutate(data: any, context: SchemaContext) {\n if (!Array.isArray(data)) return data;\n return super.mutate([...data], context);\n }\n\n /** Validate array\n *\n * Absent input (and absent without `.default()`) propagates as `data: undefined`\n * so the parent ObjectValidator can omit the key. Without this, optional array\n * fields would silently materialise as `[]` in the validated output.\n */\n public async validate(data: any, context: SchemaContext): Promise<ValidationResult> {\n // Apply default when absent, then mutate. Mirrors BaseValidator's\n // `valueForRules = data ?? this.getDefaultValue()` so `.default([...])`\n // works on arrays too.\n const valueForRules = data ?? this.getDefaultValue();\n const mutatedData = await this.mutate(valueForRules, context);\n\n const result = await super.validate(data, context);\n\n if (result.isValid === false) return result;\n\n // Nothing to iterate for absent (no default) or null (nullable) inputs —\n // propagate so the parent ObjectValidator can omit the key.\n if (mutatedData === undefined || mutatedData === null) return result;\n\n // Defensive: type rule (arrayRule) should have failed for non-arrays.\n if (!Array.isArray(mutatedData)) return result;\n\n const errors: ValidationResult[\"errors\"] = [];\n\n // Validate all items in parallel (consistent with ObjectValidator)\n const validationPromises = mutatedData.map(async (value: any, index: number) => {\n const childContext: SchemaContext = {\n ...context,\n parent: mutatedData,\n value,\n key: index.toString(),\n path: setKeyPath(context.path, index.toString()),\n };\n\n const childResult = await this.validator.validate(value, childContext);\n\n // Update mutated data with validated result\n mutatedData[index] = childResult.data;\n\n // Collect errors from this element\n if (childResult.isValid === false) {\n errors.push(...childResult.errors);\n }\n });\n\n await Promise.all(validationPromises);\n\n return {\n isValid: errors.length === 0,\n errors,\n data: await this.startTransformationPipeline(mutatedData, context),\n };\n }\n\n /**\n * @inheritdoc\n *\n * Recursively generates JSON Schema for the array items.\n *\n * @example\n * ```ts\n * v.array(v.string().min(1)).minLength(1).toJsonSchema(\"draft-2020-12\")\n * // → { type: \"array\", items: { type: \"string\", minLength: 1 }, minItems: 1 }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = {\n type: \"array\",\n items: this.validator.toJsonSchema(target),\n };\n\n const minOpts = getRuleOptions(this.rules, \"minLength\");\n if (minOpts?.minLength !== undefined) schema.minItems = minOpts.minLength;\n\n const maxOpts = getRuleOptions(this.rules, \"maxLength\");\n if (maxOpts?.maxLength !== undefined) schema.maxItems = maxOpts.maxLength;\n\n const betweenOpts = getRuleOptions(this.rules, \"betweenLength\");\n if (betweenOpts) {\n if (betweenOpts.minLength !== undefined) schema.minItems = betweenOpts.minLength;\n if (betweenOpts.maxLength !== undefined) schema.maxItems = betweenOpts.maxLength;\n }\n\n const lengthOpts = getRuleOptions(this.rules, \"length\");\n if (lengthOpts?.length !== undefined) {\n schema.minItems = lengthOpts.length;\n schema.maxItems = lengthOpts.length;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"array-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/array-validator.ts"],"sourcesContent":["import { setKeyPath } from \"../helpers\";\nimport { flipArrayMutator, sortArrayMutator, uniqueArrayMutator } from \"../mutators\";\nimport {\n arrayRule,\n betweenLengthRule,\n lengthRule,\n maxLengthRule,\n minLengthRule,\n sortedArrayRule,\n uniqueArrayRule,\n} from \"../rules\";\nimport type { SchemaContext, ValidationResult } from \"../types\";\nimport { BaseValidator } from \"./base-validator\";\nimport { applyNullable, getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Array validator class\n */\nexport class ArrayValidator extends BaseValidator {\n public constructor(\n public validator: BaseValidator,\n errorMessage?: string,\n ) {\n super();\n this.blankIsMissing = true;\n this.addMutableRule(arrayRule, errorMessage);\n }\n\n /**\n * Check if value is an array type\n */\n public matchesType(value: any): boolean {\n return Array.isArray(value);\n }\n\n /**\n * Clone the validator\n */\n public override clone(): this {\n const cloned = super.clone();\n\n cloned.validator = this.validator.clone();\n\n return cloned;\n }\n\n /** Reverse array order */\n public flip() {\n return this.addMutator(flipArrayMutator);\n }\n\n /** Reverse array order (alias) */\n public reverse() {\n return this.addMutator(flipArrayMutator);\n }\n\n /** Make it has only unique values */\n public onlyUnique() {\n return this.addMutator(uniqueArrayMutator);\n }\n\n /** Sort array */\n public sort(direction: \"asc\" | \"desc\" = \"asc\", key?: string) {\n return this.addMutator(sortArrayMutator, { direction, key });\n }\n\n /** Array length must be greater than the given length */\n public min(min: number, errorMessage?: string) {\n return this.addRule(minLengthRule, errorMessage, { minLength: min });\n }\n\n /** @alias min */\n public minLength(length: number, errorMessage?: string) {\n return this.min(length, errorMessage);\n }\n\n /** Array length must be less than the given length */\n public max(max: number, errorMessage?: string) {\n return this.addRule(maxLengthRule, errorMessage, { maxLength: max });\n }\n\n /** @alias max */\n public maxLength(length: number, errorMessage?: string) {\n return this.max(length, errorMessage);\n }\n\n /** Array length must be of the given length */\n public length(length: number, errorMessage?: string) {\n return this.addRule(lengthRule, errorMessage, { length });\n }\n\n /**\n * Array length must be between min and max (inclusive)\n *\n * @param min - Minimum length (inclusive)\n * @param max - Maximum length (inclusive)\n *\n * @example\n * ```ts\n * v.array(v.string()).between(1, 10) // Array must have 1 to 10 items\n * v.array(v.number()).lengthBetween(5, 20) // Same using alias\n * ```\n *\n * @category Validation Rule\n */\n public between(min: number, max: number, errorMessage?: string) {\n return this.addRule(betweenLengthRule, errorMessage, {\n minLength: min,\n maxLength: max,\n });\n }\n\n /**\n * Alias for between() - array length between min and max\n */\n public lengthBetween(min: number, max: number, errorMessage?: string) {\n return this.between(min, max, errorMessage);\n }\n\n /** Array must have unique values */\n public unique(errorMessage?: string) {\n return this.addRule(uniqueArrayRule, errorMessage);\n }\n\n /** Array must be sorted */\n public sorted(direction: \"asc\" | \"desc\" = \"asc\", errorMessage?: string) {\n return this.addRule(sortedArrayRule, errorMessage, { direction });\n }\n\n /** Mutate the data */\n public mutate(data: any, context: SchemaContext) {\n if (!Array.isArray(data)) return data;\n return super.mutate([...data], context);\n }\n\n /** Validate array\n *\n * Absent input (and absent without `.default()`) propagates as `data: undefined`\n * so the parent ObjectValidator can omit the key. Without this, optional array\n * fields would silently materialise as `[]` in the validated output.\n */\n public async validate(data: any, context: SchemaContext): Promise<ValidationResult> {\n // Apply default when absent, then mutate. Mirrors BaseValidator's\n // `valueForRules = data ?? this.getDefaultValue()` so `.default([...])`\n // works on arrays too.\n const valueForRules = data ?? this.getDefaultValue();\n const mutatedData = await this.mutate(valueForRules, context);\n\n const result = await this.validateRules(data, context);\n\n if (result.isValid === false) return result;\n\n // Nothing to iterate for absent (no default) or null (nullable) inputs —\n // propagate so the parent ObjectValidator can omit the key.\n if (mutatedData === undefined || mutatedData === null) return result;\n\n // Defensive: type rule (arrayRule) should have failed for non-arrays.\n if (!Array.isArray(mutatedData)) return result;\n\n const errors: ValidationResult[\"errors\"] = [];\n\n // Validate all items in parallel (consistent with ObjectValidator)\n const validationPromises = mutatedData.map(async (value: any, index: number) => {\n const childContext: SchemaContext = {\n ...context,\n parent: mutatedData,\n value,\n key: index.toString(),\n path: setKeyPath(context.path, index.toString()),\n };\n\n const childResult = await this.validator.validate(value, childContext);\n\n // Update mutated data with validated result\n mutatedData[index] = childResult.data;\n\n // Collect errors from this element\n if (childResult.isValid === false) {\n errors.push(...childResult.errors);\n }\n });\n\n await Promise.all(validationPromises);\n\n return this.refineResult(\n {\n isValid: errors.length === 0,\n errors,\n data: await this.startTransformationPipeline(mutatedData, context),\n },\n context,\n );\n }\n\n /**\n * @inheritdoc\n *\n * Recursively generates JSON Schema for the array items.\n *\n * @example\n * ```ts\n * v.array(v.string().min(1)).minLength(1).toJsonSchema(\"draft-2020-12\")\n * // → { type: \"array\", items: { type: \"string\", minLength: 1 }, minItems: 1 }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = {\n type: \"array\",\n items: this.validator.toJsonSchema(target),\n };\n\n const minOpts = getRuleOptions(this.rules, \"minLength\");\n if (minOpts?.minLength !== undefined) schema.minItems = minOpts.minLength;\n\n const maxOpts = getRuleOptions(this.rules, \"maxLength\");\n if (maxOpts?.maxLength !== undefined) schema.maxItems = maxOpts.maxLength;\n\n const betweenOpts = getRuleOptions(this.rules, \"betweenLength\");\n if (betweenOpts) {\n if (betweenOpts.minLength !== undefined) schema.minItems = betweenOpts.minLength;\n if (betweenOpts.maxLength !== undefined) schema.maxItems = betweenOpts.maxLength;\n }\n\n const lengthOpts = getRuleOptions(this.rules, \"length\");\n if (lengthOpts?.length !== undefined) {\n schema.minItems = lengthOpts.length;\n schema.maxItems = lengthOpts.length;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":"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"}
|
|
@@ -5,13 +5,14 @@ import { SchemaContext } from "../types/context-types.mjs";
|
|
|
5
5
|
import { ValidationResult } from "../types/result-types.mjs";
|
|
6
6
|
import { ContextualizedMutator, Mutator } from "../types/mutator-types.mjs";
|
|
7
7
|
import { ContextualizedTransformer, SimpleTransformerCallback, TransformerCallback } from "../types/data-transformer-types.mjs";
|
|
8
|
-
|
|
8
|
+
import "../types/index.mjs";
|
|
9
9
|
//#region ../../packages/seal/src/validators/base-validator.d.ts
|
|
10
10
|
/**
|
|
11
11
|
* Base validator class - foundation for all validators
|
|
12
12
|
*/
|
|
13
|
-
declare class BaseValidator<TInput = unknown, TOutput = TInput> {
|
|
13
|
+
export declare class BaseValidator<TInput = unknown, TOutput = TInput> {
|
|
14
14
|
rules: ContextualSchemaRule[];
|
|
15
|
+
protected refinements: ContextualSchemaRule[];
|
|
15
16
|
mutators: ContextualizedMutator[];
|
|
16
17
|
protected defaultValue: any | (() => any);
|
|
17
18
|
protected description?: string;
|
|
@@ -346,15 +347,12 @@ declare class BaseValidator<TInput = unknown, TOutput = TInput> {
|
|
|
346
347
|
errorMessage?: string;
|
|
347
348
|
}): this;
|
|
348
349
|
/**
|
|
349
|
-
*
|
|
350
|
-
*
|
|
351
|
-
* `value` is deliberately untyped: custom rules run in the rule pipeline,
|
|
352
|
-
* before a container validates its children (an object's fields are not yet
|
|
353
|
-
* validated or defaulted) and, when `firstErrorOnly` is `false` (the default
|
|
354
|
-
* is `true`), even after the type rule has failed. Typing it as the schema
|
|
355
|
-
* output would promise a shape the callback does not always receive.
|
|
350
|
+
* Validate the successful output after type rules, children and transformers.
|
|
351
|
+
* Refinements are skipped for absent/null values and failed validation.
|
|
356
352
|
*/
|
|
357
|
-
refine(callback: (value:
|
|
353
|
+
refine(callback: (value: NonNullable<this["~standard"]["types"]>["output"], context: SchemaContext) => Promise<string | undefined> | string | undefined): this;
|
|
354
|
+
/** Complete validation only after the entire output is available. */
|
|
355
|
+
protected refineResult(result: ValidationResult, context: SchemaContext): Promise<ValidationResult>;
|
|
358
356
|
/**
|
|
359
357
|
* Add mutator to the validator
|
|
360
358
|
*/
|
|
@@ -418,6 +416,8 @@ declare class BaseValidator<TInput = unknown, TOutput = TInput> {
|
|
|
418
416
|
* Validate the data
|
|
419
417
|
*/
|
|
420
418
|
validate(data: any, context: SchemaContext): Promise<ValidationResult>;
|
|
419
|
+
/** Validate presence and value rules before containers descend into children. */
|
|
420
|
+
protected validateRules(data: any, context: SchemaContext): Promise<ValidationResult>;
|
|
421
421
|
/**
|
|
422
422
|
* Set rule attributes list
|
|
423
423
|
*/
|
|
@@ -495,5 +495,4 @@ declare class BaseValidator<TInput = unknown, TOutput = TInput> {
|
|
|
495
495
|
toJsonSchema(_target?: JsonSchemaTarget): JsonSchemaResult;
|
|
496
496
|
}
|
|
497
497
|
//#endregion
|
|
498
|
-
export { BaseValidator };
|
|
499
498
|
//# sourceMappingURL=base-validator.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/base-validator.ts"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"base-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/base-validator.ts"],"mappings":";;;;;;;;;;;;qBAyBa,cAAc,kBAAkB,UAAU;EAC9C,OAAO;YACJ,aAAa;EAChB,UAAU;YACP;YACA;YACA;YACA;YACA;;YAEA;;;;;;;;YASA,oBAEJ,QAAQ,4BAA4B,6BAA6B;YAC7D;;;;;;;;EASH;;;;;;;;EASA,cAAc;;;;YAKX,kBAAkB;;;;;;YAOlB,gBAAgB;;;;YAKhB,sBAAsB;;;;MAKrB;;;;MAQA;;;;;;gBAUG;;;;;EAQP;;;;;;;EAUA;IAAqB;;;;;;;;EAYrB;IAAwB;;;;;;;;;;;;;;;;;;;;EAwBxB,eAAe,WAAW,qBAAqB;;;;;;;;;;;;;;;;;;;EAyB/C,sBAAsB,WAAW,qBAAqB;;;;;;;;;;;;;;;;;;EAwBtD,SAAS,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCnB,OAAO;;;;;EAUD,4BAA4B,WAAW,SAAS,gBAAa;;;;;;;;;;;;;;;;;;EA4BnE,WAAW,YAAY,wBAAwB;;;;EAY/C,gBAAgB,YAAY;;;;EAY5B,SAAS;;;;;;;;;;;;;;;;;;;;;;;EA4BT,YAAY;;;;;;;;;;;;;;;;;;;EAsBZ;;;;;;;EA+BA,iBAAiB;;;;;;;;;;;;;;;;;;EAsBjB;;;;EASA;;;;EAOA;;;;EAOA,QAAQ,UAAU,oBAAoB,mBAC3C,MAAM,WAAW,IACjB,uBACA,UAAS;;;;;;;;;;;;;;;;;;;EAyBJ,gBAAgB,UAAU,oBAAoB,mBACnD,MAAM,WAAW,IACjB,uBACA,UAAS;;;;EAWJ,eAAe,UAAU,oBAAoB,mBAClD,MAAM,WAAW,IACjB,uBACA,UAAS,IACR,qBAAqB;;;;YAWd,WAAW,UAAU,oBAAoB,mBACjD,MAAM,WAAW,IACjB,uBACA,UAAS,IACR,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;EA8CjB,QAAQ,UAAU,oBAAoB,mBAC3C,MAAM,WAAW,IACjB,UAAU;IAAM;;;;;;EAUX,OACL,WACE,OAAO,mDACP,SAAS,kBACN;;YAoBS,aACd,QAAQ,kBACR,SAAS,gBACR,QAAQ;;;;EAkBJ,WAAW,SAAS,SAAS;;;;EAS7B,kBAAkB,SAAS,SAAS;;;;;;;;EAiBpC,QAAQ;IAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoC9B,MACL,kBAEM,QAAQ,4BAA4B,6BAA6B;IAC7D;;;;;EAYC,OAAO,WAAW,SAAS,gBAAa;;;;EAc9C,MAAM;;;;EASA,SAAS,WAAW,SAAS,gBAAgB,QAAQ;;YAclD,cAAc,WAAW,SAAS,gBAAgB,QAAQ;;;;YA8HhE,sBAAsB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAoDjB,qBAAqB,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCjD,aAAa,UAAS,mBAAqC"}
|
|
@@ -12,6 +12,7 @@ import { clone } from "@mongez/reinforcements";
|
|
|
12
12
|
var BaseValidator = class {
|
|
13
13
|
constructor() {
|
|
14
14
|
this.rules = [];
|
|
15
|
+
this.refinements = [];
|
|
15
16
|
this.mutators = [];
|
|
16
17
|
this.shouldOmit = false;
|
|
17
18
|
this.isNullable = false;
|
|
@@ -271,6 +272,7 @@ var BaseValidator = class {
|
|
|
271
272
|
const Constructor = this.constructor;
|
|
272
273
|
const cloned = Object.create(Constructor.prototype);
|
|
273
274
|
cloned.rules = [...this.rules];
|
|
275
|
+
cloned.refinements = [...this.refinements];
|
|
274
276
|
cloned.mutators = [...this.mutators];
|
|
275
277
|
cloned.dataTransformers = [...this.dataTransformers];
|
|
276
278
|
cloned.defaultValue = this.defaultValue;
|
|
@@ -415,16 +417,12 @@ var BaseValidator = class {
|
|
|
415
417
|
return this.addRule(rule, errorMessage, ruleOptions);
|
|
416
418
|
}
|
|
417
419
|
/**
|
|
418
|
-
*
|
|
419
|
-
*
|
|
420
|
-
* `value` is deliberately untyped: custom rules run in the rule pipeline,
|
|
421
|
-
* before a container validates its children (an object's fields are not yet
|
|
422
|
-
* validated or defaulted) and, when `firstErrorOnly` is `false` (the default
|
|
423
|
-
* is `true`), even after the type rule has failed. Typing it as the schema
|
|
424
|
-
* output would promise a shape the callback does not always receive.
|
|
420
|
+
* Validate the successful output after type rules, children and transformers.
|
|
421
|
+
* Refinements are skipped for absent/null values and failed validation.
|
|
425
422
|
*/
|
|
426
423
|
refine(callback) {
|
|
427
|
-
|
|
424
|
+
const instance = this.instance;
|
|
425
|
+
instance.refinements.push(instance.createRule({
|
|
428
426
|
name: "custom",
|
|
429
427
|
async validate(value, context) {
|
|
430
428
|
const result = await callback(value, context);
|
|
@@ -434,7 +432,30 @@ var BaseValidator = class {
|
|
|
434
432
|
}
|
|
435
433
|
return VALID_RULE;
|
|
436
434
|
}
|
|
437
|
-
});
|
|
435
|
+
}));
|
|
436
|
+
return instance;
|
|
437
|
+
}
|
|
438
|
+
/** Complete validation only after the entire output is available. */
|
|
439
|
+
async refineResult(result, context) {
|
|
440
|
+
if (!result.isValid || result.data == null) return result;
|
|
441
|
+
const errors = [];
|
|
442
|
+
for (const rule of this.refinements) {
|
|
443
|
+
this.setRuleAttributesList(rule);
|
|
444
|
+
const refined = await rule.validate(result.data, context);
|
|
445
|
+
if (!refined.isValid) {
|
|
446
|
+
errors.push({
|
|
447
|
+
type: rule.name,
|
|
448
|
+
error: refined.error,
|
|
449
|
+
input: refined.path ?? context.path
|
|
450
|
+
});
|
|
451
|
+
if (context.configurations?.firstErrorOnly ?? true) break;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return errors.length ? {
|
|
455
|
+
isValid: false,
|
|
456
|
+
errors,
|
|
457
|
+
data: void 0
|
|
458
|
+
} : result;
|
|
438
459
|
}
|
|
439
460
|
/**
|
|
440
461
|
* Add mutator to the validator
|
|
@@ -527,6 +548,16 @@ var BaseValidator = class {
|
|
|
527
548
|
* Validate the data
|
|
528
549
|
*/
|
|
529
550
|
async validate(data, context) {
|
|
551
|
+
const result = await this.refineResult(await this.validateRules(data, context), context);
|
|
552
|
+
if (!result.isValid && this.hasCatch) return {
|
|
553
|
+
isValid: true,
|
|
554
|
+
errors: [],
|
|
555
|
+
data: typeof this.catchValue === "function" ? await this.catchValue(result.errors, data) : this.catchValue
|
|
556
|
+
};
|
|
557
|
+
return result;
|
|
558
|
+
}
|
|
559
|
+
/** Validate presence and value rules before containers descend into children. */
|
|
560
|
+
async validateRules(data, context) {
|
|
530
561
|
if (data === null && this.isNullable) return {
|
|
531
562
|
isValid: true,
|
|
532
563
|
errors: [],
|
|
@@ -552,7 +583,7 @@ var BaseValidator = class {
|
|
|
552
583
|
}
|
|
553
584
|
}
|
|
554
585
|
const usedDefault = blankMatchesDefault || input == null && isUsableDefault(valueForRules) || parentFilledDefault && isUsableDefault(input);
|
|
555
|
-
|
|
586
|
+
let mutatedData = this.isOptional && valueForRules === void 0 ? void 0 : await this.mutate(valueForRules, context);
|
|
556
587
|
const errors = [];
|
|
557
588
|
let isValid = true;
|
|
558
589
|
const isFirstErrorOnly = context.configurations?.firstErrorOnly ?? true;
|
|
@@ -563,27 +594,26 @@ var BaseValidator = class {
|
|
|
563
594
|
if ((rule.requiresValue ?? true) && skipEmptyRules) continue;
|
|
564
595
|
this.setRuleAttributesList(rule);
|
|
565
596
|
const result = await rule.validate(mutatedData, context);
|
|
597
|
+
if (result.isValid && "data" in result) mutatedData = result.data;
|
|
566
598
|
if (result.isValid === false) {
|
|
567
599
|
isValid = false;
|
|
568
|
-
errors.
|
|
569
|
-
type: rule.name,
|
|
600
|
+
const reported = result.errors?.length ? result.errors : [{
|
|
570
601
|
error: result.error,
|
|
571
|
-
|
|
602
|
+
path: result.path
|
|
603
|
+
}];
|
|
604
|
+
for (const { error, path } of reported) errors.push({
|
|
605
|
+
type: rule.name,
|
|
606
|
+
error,
|
|
607
|
+
input: path ?? context.path
|
|
572
608
|
});
|
|
573
609
|
if (isFirstErrorOnly) break;
|
|
574
610
|
}
|
|
575
611
|
}
|
|
576
|
-
|
|
612
|
+
return {
|
|
577
613
|
isValid,
|
|
578
614
|
errors,
|
|
579
615
|
data: mutatedData !== void 0 ? await this.startTransformationPipeline(mutatedData, context) : void 0
|
|
580
616
|
};
|
|
581
|
-
if (result.isValid === false && this.hasCatch) return {
|
|
582
|
-
isValid: true,
|
|
583
|
-
errors: [],
|
|
584
|
-
data: typeof this.catchValue === "function" ? await this.catchValue(result.errors, data) : this.catchValue
|
|
585
|
-
};
|
|
586
|
-
return result;
|
|
587
617
|
}
|
|
588
618
|
/**
|
|
589
619
|
* Set rule attributes list
|
|
@@ -642,7 +672,8 @@ var BaseValidator = class {
|
|
|
642
672
|
vendor: "seal",
|
|
643
673
|
types: void 0,
|
|
644
674
|
validate: async (value) => {
|
|
645
|
-
|
|
675
|
+
const result = await validate(this, value);
|
|
676
|
+
return mapToStandardResult(result);
|
|
646
677
|
},
|
|
647
678
|
jsonSchema: {
|
|
648
679
|
input: (options) => this.toJsonSchema(options.target),
|