@zudojs/validation 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/validationComposer/index.d.ts +7 -0
- package/dist/validationComposer/index.d.ts.map +1 -0
- package/dist/validationComposer/index.js +7 -0
- package/dist/validationComposer/index.js.map +1 -0
- package/dist/validationComposer/validationComposer.core.d.ts +51 -0
- package/dist/validationComposer/validationComposer.core.d.ts.map +1 -0
- package/dist/validationComposer/validationComposer.core.js +191 -0
- package/dist/validationComposer/validationComposer.core.js.map +1 -0
- package/dist/validationConstraints/index.d.ts +16 -0
- package/dist/validationConstraints/index.d.ts.map +1 -0
- package/dist/validationConstraints/index.js +24 -0
- package/dist/validationConstraints/index.js.map +1 -0
- package/dist/validationConstraints/validationConstraints.array.d.ts +22 -0
- package/dist/validationConstraints/validationConstraints.array.d.ts.map +1 -0
- package/dist/validationConstraints/validationConstraints.array.js +55 -0
- package/dist/validationConstraints/validationConstraints.array.js.map +1 -0
- package/dist/validationConstraints/validationConstraints.base.d.ts +47 -0
- package/dist/validationConstraints/validationConstraints.base.d.ts.map +1 -0
- package/dist/validationConstraints/validationConstraints.base.js +88 -0
- package/dist/validationConstraints/validationConstraints.base.js.map +1 -0
- package/dist/validationConstraints/validationConstraints.circular.d.ts +25 -0
- package/dist/validationConstraints/validationConstraints.circular.d.ts.map +1 -0
- package/dist/validationConstraints/validationConstraints.circular.js +73 -0
- package/dist/validationConstraints/validationConstraints.circular.js.map +1 -0
- package/dist/validationConstraints/validationConstraints.collection.d.ts +10 -0
- package/dist/validationConstraints/validationConstraints.collection.d.ts.map +1 -0
- package/dist/validationConstraints/validationConstraints.collection.js +22 -0
- package/dist/validationConstraints/validationConstraints.collection.js.map +1 -0
- package/dist/validationConstraints/validationConstraints.date.d.ts +14 -0
- package/dist/validationConstraints/validationConstraints.date.d.ts.map +1 -0
- package/dist/validationConstraints/validationConstraints.date.js +30 -0
- package/dist/validationConstraints/validationConstraints.date.js.map +1 -0
- package/dist/validationConstraints/validationConstraints.depth.d.ts +20 -0
- package/dist/validationConstraints/validationConstraints.depth.d.ts.map +1 -0
- package/dist/validationConstraints/validationConstraints.depth.js +70 -0
- package/dist/validationConstraints/validationConstraints.depth.js.map +1 -0
- package/dist/validationConstraints/validationConstraints.number.d.ts +38 -0
- package/dist/validationConstraints/validationConstraints.number.d.ts.map +1 -0
- package/dist/validationConstraints/validationConstraints.number.js +92 -0
- package/dist/validationConstraints/validationConstraints.number.js.map +1 -0
- package/dist/validationConstraints/validationConstraints.size.d.ts +20 -0
- package/dist/validationConstraints/validationConstraints.size.d.ts.map +1 -0
- package/dist/validationConstraints/validationConstraints.size.js +82 -0
- package/dist/validationConstraints/validationConstraints.size.js.map +1 -0
- package/dist/validationConstraints/validationConstraints.string.d.ts +50 -0
- package/dist/validationConstraints/validationConstraints.string.d.ts.map +1 -0
- package/dist/validationConstraints/validationConstraints.string.js +121 -0
- package/dist/validationConstraints/validationConstraints.string.js.map +1 -0
- package/dist/validationErrors/index.d.ts +8 -0
- package/dist/validationErrors/index.d.ts.map +1 -0
- package/dist/validationErrors/index.js +8 -0
- package/dist/validationErrors/index.js.map +1 -0
- package/dist/validationErrors/validationError.base.d.ts +60 -0
- package/dist/validationErrors/validationError.base.d.ts.map +1 -0
- package/dist/validationErrors/validationError.base.js +83 -0
- package/dist/validationErrors/validationError.base.js.map +1 -0
- package/dist/validationErrors/validationError.types.d.ts +30 -0
- package/dist/validationErrors/validationError.types.d.ts.map +1 -0
- package/dist/validationErrors/validationError.types.js +62 -0
- package/dist/validationErrors/validationError.types.js.map +1 -0
- package/dist/validationFactory/index.d.ts +7 -0
- package/dist/validationFactory/index.d.ts.map +1 -0
- package/dist/validationFactory/index.js +7 -0
- package/dist/validationFactory/index.js.map +1 -0
- package/dist/validationFactory/validationFactory.core.d.ts +40 -0
- package/dist/validationFactory/validationFactory.core.d.ts.map +1 -0
- package/dist/validationFactory/validationFactory.core.js +70 -0
- package/dist/validationFactory/validationFactory.core.js.map +1 -0
- package/dist/validationNormalizer/index.d.ts +8 -0
- package/dist/validationNormalizer/index.d.ts.map +1 -0
- package/dist/validationNormalizer/index.js +8 -0
- package/dist/validationNormalizer/index.js.map +1 -0
- package/dist/validationNormalizer/validationNormalizer.core.d.ts +27 -0
- package/dist/validationNormalizer/validationNormalizer.core.d.ts.map +1 -0
- package/dist/validationNormalizer/validationNormalizer.core.js +63 -0
- package/dist/validationNormalizer/validationNormalizer.core.js.map +1 -0
- package/dist/validationNormalizer/validationNormalizer.helpers.d.ts +38 -0
- package/dist/validationNormalizer/validationNormalizer.helpers.d.ts.map +1 -0
- package/dist/validationNormalizer/validationNormalizer.helpers.js +89 -0
- package/dist/validationNormalizer/validationNormalizer.helpers.js.map +1 -0
- package/dist/validationParser/index.d.ts +7 -0
- package/dist/validationParser/index.d.ts.map +1 -0
- package/dist/validationParser/index.js +7 -0
- package/dist/validationParser/index.js.map +1 -0
- package/dist/validationParser/validationParser.core.d.ts +42 -0
- package/dist/validationParser/validationParser.core.d.ts.map +1 -0
- package/dist/validationParser/validationParser.core.js +118 -0
- package/dist/validationParser/validationParser.core.js.map +1 -0
- package/dist/validationRegistry/index.d.ts +8 -0
- package/dist/validationRegistry/index.d.ts.map +1 -0
- package/dist/validationRegistry/index.js +8 -0
- package/dist/validationRegistry/index.js.map +1 -0
- package/dist/validationRegistry/validationRegistry.core.d.ts +45 -0
- package/dist/validationRegistry/validationRegistry.core.d.ts.map +1 -0
- package/dist/validationRegistry/validationRegistry.core.js +91 -0
- package/dist/validationRegistry/validationRegistry.core.js.map +1 -0
- package/dist/validationRegistry/validationRegistry.readonly.d.ts +18 -0
- package/dist/validationRegistry/validationRegistry.readonly.d.ts.map +1 -0
- package/dist/validationRegistry/validationRegistry.readonly.js +31 -0
- package/dist/validationRegistry/validationRegistry.readonly.js.map +1 -0
- package/dist/validationResult/index.d.ts +7 -0
- package/dist/validationResult/index.d.ts.map +1 -0
- package/dist/validationResult/index.js +7 -0
- package/dist/validationResult/index.js.map +1 -0
- package/dist/validationResult/validationResult.type.d.ts +73 -0
- package/dist/validationResult/validationResult.type.d.ts.map +1 -0
- package/dist/validationResult/validationResult.type.js +108 -0
- package/dist/validationResult/validationResult.type.js.map +1 -0
- package/dist/validationSchema/index.d.ts +7 -0
- package/dist/validationSchema/index.d.ts.map +1 -0
- package/dist/validationSchema/index.js +7 -0
- package/dist/validationSchema/index.js.map +1 -0
- package/dist/validationSchema/validationSchema.core.d.ts +39 -0
- package/dist/validationSchema/validationSchema.core.d.ts.map +1 -0
- package/dist/validationSchema/validationSchema.core.js +77 -0
- package/dist/validationSchema/validationSchema.core.js.map +1 -0
- package/dist/validationTransformer/index.d.ts +7 -0
- package/dist/validationTransformer/index.d.ts.map +1 -0
- package/dist/validationTransformer/index.js +7 -0
- package/dist/validationTransformer/index.js.map +1 -0
- package/dist/validationTransformer/validationTransformer.core.d.ts +44 -0
- package/dist/validationTransformer/validationTransformer.core.d.ts.map +1 -0
- package/dist/validationTransformer/validationTransformer.core.js +115 -0
- package/dist/validationTransformer/validationTransformer.core.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validationComposer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ValidationConstraint } from "../validationConstraints/index.js";
|
|
2
|
+
import type { ValidationResult } from "../validationResult/validationResult.type.js";
|
|
3
|
+
import type { ValidationSchema } from "../validationSchema/validationSchema.core.js";
|
|
4
|
+
/** A validation operation that receives unknown input. */
|
|
5
|
+
export type ValidationStep<T> = (value: T) => ValidationResult<T>;
|
|
6
|
+
/** Options for composing validation operations. */
|
|
7
|
+
export interface ValidationComposerOptions {
|
|
8
|
+
readonly name?: string;
|
|
9
|
+
readonly stopOnFirstError?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Reusable composed validator. */
|
|
12
|
+
export interface ValidationComposer<T> {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
validate(value: T): ValidationResult<T>;
|
|
15
|
+
assert(value: T): T;
|
|
16
|
+
}
|
|
17
|
+
/** Creates a reusable validator from validation steps. */
|
|
18
|
+
export declare function createValidationComposer<T>(steps: readonly ValidationStep<T>[], options?: ValidationComposerOptions): ValidationComposer<T>;
|
|
19
|
+
/** Composes multiple schemas into a sequential validation pipeline. */
|
|
20
|
+
export declare function composeSchemas<T>(...schemas: readonly ValidationSchema<T>[]): ValidationSchema<T>;
|
|
21
|
+
/** Creates a validation step from a schema. */
|
|
22
|
+
export declare function schemaStep<T>(schema: ValidationSchema<T>): ValidationStep<T>;
|
|
23
|
+
/** Creates a validation step from a constraint. */
|
|
24
|
+
export declare function constraintStep<T>(constraint: ValidationConstraint<T>): ValidationStep<T>;
|
|
25
|
+
/** Creates a validation step from multiple constraints. */
|
|
26
|
+
export declare function constraintsStep<T>(constraints: readonly ValidationConstraint<T>[]): ValidationStep<T>;
|
|
27
|
+
/** Combines validators using logical AND semantics. Every validator must succeed. */
|
|
28
|
+
export declare function all<T>(...validators: readonly ValidationStep<T>[]): ValidationStep<T>;
|
|
29
|
+
/** Combines validators using logical OR semantics. Succeeds when at least one validator succeeds. */
|
|
30
|
+
export declare function any<T>(...validators: readonly ValidationStep<T>[]): ValidationStep<T>;
|
|
31
|
+
/** Runs validators sequentially and returns the first successful result. */
|
|
32
|
+
export declare function first<T>(...validators: readonly ValidationStep<T>[]): ValidationStep<T>;
|
|
33
|
+
/** Negates a validation step. */
|
|
34
|
+
export declare function negate<T>(validator: ValidationStep<T>): ValidationStep<T>;
|
|
35
|
+
/** Makes a validation step optional. Undefined values bypass the validator. */
|
|
36
|
+
export declare function optional<T>(validator: ValidationStep<T>): ValidationStep<T | undefined>;
|
|
37
|
+
/** Makes a validation step nullable. Null values bypass the validator. */
|
|
38
|
+
export declare function nullable<T>(validator: ValidationStep<T>): ValidationStep<T | null>;
|
|
39
|
+
/** Makes a validation step optional and nullable. */
|
|
40
|
+
export declare function optionalNullable<T>(validator: ValidationStep<T>): ValidationStep<T | null | undefined>;
|
|
41
|
+
/** Adds a custom validation step to an existing pipeline. */
|
|
42
|
+
export declare function append<T>(composer: ValidationComposer<T>, step: ValidationStep<T>, options?: ValidationComposerOptions): ValidationComposer<T>;
|
|
43
|
+
/** Creates a pipeline that validates a value and returns the original value. */
|
|
44
|
+
export declare function tap<T>(validator: ValidationStep<T>): ValidationStep<T>;
|
|
45
|
+
/** Creates a validation step that only runs when a predicate matches. */
|
|
46
|
+
export declare function when<T>(predicate: (value: T) => boolean, validator: ValidationStep<T>): ValidationStep<T>;
|
|
47
|
+
/** Creates a validation step that runs only when a predicate does not match. */
|
|
48
|
+
export declare function unless<T>(predicate: (value: T) => boolean, validator: ValidationStep<T>): ValidationStep<T>;
|
|
49
|
+
/** Applies a mapping operation after successful validation. */
|
|
50
|
+
export declare function mapValidated<T, U>(validator: ValidationStep<T>, mapper: (value: T) => U): ValidationStep<T>;
|
|
51
|
+
//# sourceMappingURL=validationComposer.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationComposer.core.d.ts","sourceRoot":"","sources":["../../src/validationComposer/validationComposer.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { failure, success } from "../validationResult/validationResult.type.js";
|
|
2
|
+
import { validate } from "../validationSchema/validationSchema.core.js";
|
|
3
|
+
import { checkConstraints } from "../validationConstraints/index.js";
|
|
4
|
+
import { ConstraintValidationError } from "../validationErrors/validationError.types.js";
|
|
5
|
+
/** Creates a reusable validator from validation steps. */
|
|
6
|
+
export function createValidationComposer(steps, options = {}) {
|
|
7
|
+
const name = options.name ?? "ValidationComposer";
|
|
8
|
+
const stopOnFirstError = options.stopOnFirstError ?? false;
|
|
9
|
+
return Object.freeze({
|
|
10
|
+
name,
|
|
11
|
+
validate(value) {
|
|
12
|
+
let current = value;
|
|
13
|
+
const issues = [];
|
|
14
|
+
for (const step of steps) {
|
|
15
|
+
const result = step(current);
|
|
16
|
+
if (result.success) {
|
|
17
|
+
current = result.data;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
issues.push(...result.issues);
|
|
21
|
+
if (stopOnFirstError)
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
return issues.length > 0 ? failure(issues) : success(current);
|
|
25
|
+
},
|
|
26
|
+
assert(value) {
|
|
27
|
+
const result = this.validate(value);
|
|
28
|
+
if (!result.success)
|
|
29
|
+
throw new ConstraintValidationError(`${name} validation failed.`, result.issues);
|
|
30
|
+
return result.data;
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** Composes multiple schemas into a sequential validation pipeline. */
|
|
35
|
+
export function composeSchemas(...schemas) {
|
|
36
|
+
if (schemas.length === 0)
|
|
37
|
+
throw new TypeError("At least one schema is required.");
|
|
38
|
+
const [first, ...rest] = schemas;
|
|
39
|
+
return rest.reduce((current, schema) => current.pipe(schema), first);
|
|
40
|
+
}
|
|
41
|
+
/** Creates a validation step from a schema. */
|
|
42
|
+
export function schemaStep(schema) {
|
|
43
|
+
return (value) => validate(schema, value);
|
|
44
|
+
}
|
|
45
|
+
/** Creates a validation step from a constraint. */
|
|
46
|
+
export function constraintStep(constraint) {
|
|
47
|
+
return (value) => checkConstraints([constraint], value);
|
|
48
|
+
}
|
|
49
|
+
/** Creates a validation step from multiple constraints. */
|
|
50
|
+
export function constraintsStep(constraints) {
|
|
51
|
+
return (value) => checkConstraints(constraints, value);
|
|
52
|
+
}
|
|
53
|
+
/** Combines validators using logical AND semantics. Every validator must succeed. */
|
|
54
|
+
export function all(...validators) {
|
|
55
|
+
return (value) => {
|
|
56
|
+
const issues = [];
|
|
57
|
+
for (const validator of validators) {
|
|
58
|
+
const result = validator(value);
|
|
59
|
+
if (!result.success)
|
|
60
|
+
issues.push(...result.issues);
|
|
61
|
+
}
|
|
62
|
+
return issues.length > 0 ? failure(issues) : success(value);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Combines validators using logical OR semantics. Succeeds when at least one validator succeeds. */
|
|
66
|
+
export function any(...validators) {
|
|
67
|
+
return (value) => {
|
|
68
|
+
const issues = [];
|
|
69
|
+
for (const validator of validators) {
|
|
70
|
+
const result = validator(value);
|
|
71
|
+
if (result.success)
|
|
72
|
+
return result;
|
|
73
|
+
issues.push(...result.issues);
|
|
74
|
+
}
|
|
75
|
+
return failure(issues.length > 0
|
|
76
|
+
? issues
|
|
77
|
+
: [
|
|
78
|
+
{
|
|
79
|
+
path: [],
|
|
80
|
+
code: "no_validator_succeeded",
|
|
81
|
+
message: "No validation rule accepted the value.",
|
|
82
|
+
received: value,
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** Runs validators sequentially and returns the first successful result. */
|
|
88
|
+
export function first(...validators) {
|
|
89
|
+
return (value) => {
|
|
90
|
+
let issues = [];
|
|
91
|
+
for (const validator of validators) {
|
|
92
|
+
const result = validator(value);
|
|
93
|
+
if (result.success)
|
|
94
|
+
return result;
|
|
95
|
+
issues = [...issues, ...result.issues];
|
|
96
|
+
}
|
|
97
|
+
return failure(issues.length > 0
|
|
98
|
+
? issues
|
|
99
|
+
: [
|
|
100
|
+
{
|
|
101
|
+
path: [],
|
|
102
|
+
code: "no_validator_succeeded",
|
|
103
|
+
message: "No validation rule accepted the value.",
|
|
104
|
+
received: value,
|
|
105
|
+
},
|
|
106
|
+
]);
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Negates a validation step. */
|
|
110
|
+
export function negate(validator) {
|
|
111
|
+
return (value) => {
|
|
112
|
+
const result = validator(value);
|
|
113
|
+
if (result.success)
|
|
114
|
+
return failure([
|
|
115
|
+
{
|
|
116
|
+
path: [],
|
|
117
|
+
code: "negated_validation_failed",
|
|
118
|
+
message: "Value must not satisfy the supplied validation rule.",
|
|
119
|
+
received: value,
|
|
120
|
+
},
|
|
121
|
+
]);
|
|
122
|
+
return success(value);
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/** Makes a validation step optional. Undefined values bypass the validator. */
|
|
126
|
+
export function optional(validator) {
|
|
127
|
+
return (value) => {
|
|
128
|
+
if (value === undefined)
|
|
129
|
+
return success(undefined);
|
|
130
|
+
return validator(value);
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/** Makes a validation step nullable. Null values bypass the validator. */
|
|
134
|
+
export function nullable(validator) {
|
|
135
|
+
return (value) => {
|
|
136
|
+
if (value === null)
|
|
137
|
+
return success(null);
|
|
138
|
+
return validator(value);
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** Makes a validation step optional and nullable. */
|
|
142
|
+
export function optionalNullable(validator) {
|
|
143
|
+
return (value) => {
|
|
144
|
+
if (value === null || value === undefined)
|
|
145
|
+
return success(value);
|
|
146
|
+
return validator(value);
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** Adds a custom validation step to an existing pipeline. */
|
|
150
|
+
export function append(composer, step, options = {}) {
|
|
151
|
+
return createValidationComposer([composer.validate, step], {
|
|
152
|
+
...options,
|
|
153
|
+
name: options.name ?? composer.name,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/** Creates a pipeline that validates a value and returns the original value. */
|
|
157
|
+
export function tap(validator) {
|
|
158
|
+
return (value) => {
|
|
159
|
+
const result = validator(value);
|
|
160
|
+
if (!result.success)
|
|
161
|
+
return result;
|
|
162
|
+
return success(value);
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** Creates a validation step that only runs when a predicate matches. */
|
|
166
|
+
export function when(predicate, validator) {
|
|
167
|
+
return (value) => {
|
|
168
|
+
if (!predicate(value))
|
|
169
|
+
return success(value);
|
|
170
|
+
return validator(value);
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/** Creates a validation step that runs only when a predicate does not match. */
|
|
174
|
+
export function unless(predicate, validator) {
|
|
175
|
+
return (value) => {
|
|
176
|
+
if (predicate(value))
|
|
177
|
+
return success(value);
|
|
178
|
+
return validator(value);
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/** Applies a mapping operation after successful validation. */
|
|
182
|
+
export function mapValidated(validator, mapper) {
|
|
183
|
+
return (value) => {
|
|
184
|
+
const result = validator(value);
|
|
185
|
+
if (!result.success)
|
|
186
|
+
return result;
|
|
187
|
+
mapper(result.data);
|
|
188
|
+
return success(result.data);
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=validationComposer.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationComposer.core.js","sourceRoot":"","sources":["../../src/validationComposer/validationComposer.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/validation/validationConstraints
|
|
3
|
+
*
|
|
4
|
+
* Built-in validation constraints and rules.
|
|
5
|
+
*/
|
|
6
|
+
export { createConstraint, checkConstraint, checkConstraints, combineConstraints, not, required, assertNonNegativeInteger, } from "./validationConstraints.base.js";
|
|
7
|
+
export type { ValidationConstraint, ConstraintOptions, } from "./validationConstraints.base.js";
|
|
8
|
+
export { nonEmptyString, minLength, maxLength, lengthBetween, matches, email, uuid, httpUrl, ascii, digits, letters, slug, } from "./validationConstraints.string.js";
|
|
9
|
+
export { min, max, between, finiteNumber, integer, positive, nonNegative, even, odd, } from "./validationConstraints.number.js";
|
|
10
|
+
export { oneOf, noneOf } from "./validationConstraints.collection.js";
|
|
11
|
+
export { isoDate, futureDate, pastDate } from "./validationConstraints.date.js";
|
|
12
|
+
export { minItems, maxItems, exactItems, everyItem, someItem, } from "./validationConstraints.array.js";
|
|
13
|
+
export { assertNoCircularReference, hasCircularReference, } from "./validationConstraints.circular.js";
|
|
14
|
+
export { getSerializationDepth, assertDepthWithinLimit, } from "./validationConstraints.depth.js";
|
|
15
|
+
export { estimateSerializedSize, assertSizeWithinLimit, } from "./validationConstraints.size.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validationConstraints/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,GAAG,EACH,QAAQ,EACR,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EACV,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,OAAO,EACP,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,EACN,OAAO,EACP,IAAI,GACL,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EACL,GAAG,EACH,GAAG,EACH,OAAO,EACP,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,GAAG,GACJ,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAGtE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAGhF,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,SAAS,EACT,QAAQ,GACT,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/validation/validationConstraints
|
|
3
|
+
*
|
|
4
|
+
* Built-in validation constraints and rules.
|
|
5
|
+
*/
|
|
6
|
+
// Base constraints
|
|
7
|
+
export { createConstraint, checkConstraint, checkConstraints, combineConstraints, not, required, assertNonNegativeInteger, } from "./validationConstraints.base.js";
|
|
8
|
+
// String constraints
|
|
9
|
+
export { nonEmptyString, minLength, maxLength, lengthBetween, matches, email, uuid, httpUrl, ascii, digits, letters, slug, } from "./validationConstraints.string.js";
|
|
10
|
+
// Number constraints
|
|
11
|
+
export { min, max, between, finiteNumber, integer, positive, nonNegative, even, odd, } from "./validationConstraints.number.js";
|
|
12
|
+
// Collection constraints
|
|
13
|
+
export { oneOf, noneOf } from "./validationConstraints.collection.js";
|
|
14
|
+
// Date constraints
|
|
15
|
+
export { isoDate, futureDate, pastDate } from "./validationConstraints.date.js";
|
|
16
|
+
// Array constraints
|
|
17
|
+
export { minItems, maxItems, exactItems, everyItem, someItem, } from "./validationConstraints.array.js";
|
|
18
|
+
// Circular reference detection
|
|
19
|
+
export { assertNoCircularReference, hasCircularReference, } from "./validationConstraints.circular.js";
|
|
20
|
+
// Depth checking
|
|
21
|
+
export { getSerializationDepth, assertDepthWithinLimit, } from "./validationConstraints.depth.js";
|
|
22
|
+
// Size estimation
|
|
23
|
+
export { estimateSerializedSize, assertSizeWithinLimit, } from "./validationConstraints.size.js";
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validationConstraints/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,GAAG,EACH,QAAQ,EACR,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAOzC,qBAAqB;AACrB,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,OAAO,EACP,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,EACN,OAAO,EACP,IAAI,GACL,MAAM,mCAAmC,CAAC;AAE3C,qBAAqB;AACrB,OAAO,EACL,GAAG,EACH,GAAG,EACH,OAAO,EACP,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,GAAG,GACJ,MAAM,mCAAmC,CAAC;AAE3C,yBAAyB;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAEtE,mBAAmB;AACnB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAEhF,oBAAoB;AACpB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,SAAS,EACT,QAAQ,GACT,MAAM,kCAAkC,CAAC;AAE1C,+BAA+B;AAC/B,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,qCAAqC,CAAC;AAE7C,iBAAiB;AACjB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAE1C,kBAAkB;AAClB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ValidationConstraint } from "./validationConstraints.base.js";
|
|
2
|
+
/**
|
|
3
|
+
* Requires an array to contain at least a given number of items.
|
|
4
|
+
*/
|
|
5
|
+
export declare function minItems<T>(minimum: number): ValidationConstraint<readonly T[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Requires an array to contain no more than a given number of items.
|
|
8
|
+
*/
|
|
9
|
+
export declare function maxItems<T>(maximum: number): ValidationConstraint<readonly T[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Requires an array to contain a specific number of items.
|
|
12
|
+
*/
|
|
13
|
+
export declare function exactItems<T>(length: number): ValidationConstraint<readonly T[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Requires every array item to satisfy a constraint.
|
|
16
|
+
*/
|
|
17
|
+
export declare function everyItem<T>(constraint: ValidationConstraint<T>): ValidationConstraint<readonly T[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Requires at least one array item to satisfy a constraint.
|
|
20
|
+
*/
|
|
21
|
+
export declare function someItem<T>(constraint: ValidationConstraint<T>): ValidationConstraint<readonly T[]>;
|
|
22
|
+
//# sourceMappingURL=validationConstraints.array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationConstraints.array.d.ts","sourceRoot":"","sources":["../../src/validationConstraints/validationConstraints.array.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAO5E;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,MAAM,GACd,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,CAQpC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,MAAM,GACd,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,CAQpC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,MAAM,EAAE,MAAM,GACb,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,CAQpC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAClC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,CASpC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAClC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,CASpC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createConstraint, assertNonNegativeInteger, } from "./validationConstraints.base.js";
|
|
2
|
+
/**
|
|
3
|
+
* Requires an array to contain at least a given number of items.
|
|
4
|
+
*/
|
|
5
|
+
export function minItems(minimum) {
|
|
6
|
+
assertNonNegativeInteger(minimum, "minimum");
|
|
7
|
+
return createConstraint((value) => value.length >= minimum, {
|
|
8
|
+
name: `min_items_${minimum}`,
|
|
9
|
+
code: "min_items",
|
|
10
|
+
message: `Value must contain at least ${minimum} items.`,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Requires an array to contain no more than a given number of items.
|
|
15
|
+
*/
|
|
16
|
+
export function maxItems(maximum) {
|
|
17
|
+
assertNonNegativeInteger(maximum, "maximum");
|
|
18
|
+
return createConstraint((value) => value.length <= maximum, {
|
|
19
|
+
name: `max_items_${maximum}`,
|
|
20
|
+
code: "max_items",
|
|
21
|
+
message: `Value must contain at most ${maximum} items.`,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Requires an array to contain a specific number of items.
|
|
26
|
+
*/
|
|
27
|
+
export function exactItems(length) {
|
|
28
|
+
assertNonNegativeInteger(length, "length");
|
|
29
|
+
return createConstraint((value) => value.length === length, {
|
|
30
|
+
name: `exact_items_${length}`,
|
|
31
|
+
code: "exact_items",
|
|
32
|
+
message: `Value must contain exactly ${length} items.`,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Requires every array item to satisfy a constraint.
|
|
37
|
+
*/
|
|
38
|
+
export function everyItem(constraint) {
|
|
39
|
+
return createConstraint((values) => values.every((value) => constraint.validate(value)), {
|
|
40
|
+
name: `every_${constraint.name}`,
|
|
41
|
+
code: "item_constraint_failed",
|
|
42
|
+
message: constraint.message,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Requires at least one array item to satisfy a constraint.
|
|
47
|
+
*/
|
|
48
|
+
export function someItem(constraint) {
|
|
49
|
+
return createConstraint((values) => values.some((value) => constraint.validate(value)), {
|
|
50
|
+
name: `some_${constraint.name}`,
|
|
51
|
+
code: "some_item_constraint_failed",
|
|
52
|
+
message: `At least one item must satisfy ${constraint.name}.`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=validationConstraints.array.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationConstraints.array.js","sourceRoot":"","sources":["../../src/validationConstraints/validationConstraints.array.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,OAAe;IAEf,wBAAwB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE7C,OAAO,gBAAgB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,EAAE;QAC1D,IAAI,EAAE,aAAa,OAAO,EAAE;QAC5B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,+BAA+B,OAAO,SAAS;KACzD,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,OAAe;IAEf,wBAAwB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE7C,OAAO,gBAAgB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,EAAE;QAC1D,IAAI,EAAE,aAAa,OAAO,EAAE;QAC5B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,8BAA8B,OAAO,SAAS;KACxD,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,MAAc;IAEd,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE3C,OAAO,gBAAgB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE;QAC1D,IAAI,EAAE,eAAe,MAAM,EAAE;QAC7B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,8BAA8B,MAAM,SAAS;KACvD,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,UAAmC;IAEnC,OAAO,gBAAgB,CACrB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAC/D;QACE,IAAI,EAAE,SAAS,UAAU,CAAC,IAAI,EAAE;QAChC,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,UAAU,CAAC,OAAO;KAC5B,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,UAAmC;IAEnC,OAAO,gBAAgB,CACrB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAC9D;QACE,IAAI,EAAE,QAAQ,UAAU,CAAC,IAAI,EAAE;QAC/B,IAAI,EAAE,6BAA6B;QACnC,OAAO,EAAE,kCAAkC,UAAU,CAAC,IAAI,GAAG;KAC9D,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ValidationResult } from "../validationResult/validationResult.type.js";
|
|
2
|
+
/**
|
|
3
|
+
* A reusable validation constraint.
|
|
4
|
+
*/
|
|
5
|
+
export interface ValidationConstraint<T> {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly validate: (value: T) => boolean;
|
|
8
|
+
readonly message: string;
|
|
9
|
+
readonly code: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Options for creating a validation constraint.
|
|
13
|
+
*/
|
|
14
|
+
export interface ConstraintOptions {
|
|
15
|
+
readonly name?: string;
|
|
16
|
+
readonly code?: string;
|
|
17
|
+
readonly message?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates a reusable validation constraint.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createConstraint<T>(validate: (value: T) => boolean, options?: ConstraintOptions): ValidationConstraint<T>;
|
|
23
|
+
/**
|
|
24
|
+
* Executes a constraint against a value.
|
|
25
|
+
*/
|
|
26
|
+
export declare function checkConstraint<T>(constraint: ValidationConstraint<T>, value: T, path?: readonly (string | number)[]): ValidationResult<T>;
|
|
27
|
+
/**
|
|
28
|
+
* Executes multiple constraints against a value.
|
|
29
|
+
*/
|
|
30
|
+
export declare function checkConstraints<T>(constraints: readonly ValidationConstraint<T>[], value: T, path?: readonly (string | number)[]): ValidationResult<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Combines constraints into a single constraint.
|
|
33
|
+
*/
|
|
34
|
+
export declare function combineConstraints<T>(...constraints: readonly ValidationConstraint<T>[]): ValidationConstraint<T>;
|
|
35
|
+
/**
|
|
36
|
+
* Creates a negated constraint.
|
|
37
|
+
*/
|
|
38
|
+
export declare function not<T>(constraint: ValidationConstraint<T>, options?: ConstraintOptions): ValidationConstraint<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Requires a value to be defined.
|
|
41
|
+
*/
|
|
42
|
+
export declare const required: ValidationConstraint<unknown>;
|
|
43
|
+
/**
|
|
44
|
+
* Asserts that a value is a non-negative integer.
|
|
45
|
+
*/
|
|
46
|
+
export declare function assertNonNegativeInteger(value: number, name: string): void;
|
|
47
|
+
//# sourceMappingURL=validationConstraints.base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationConstraints.base.d.ts","sourceRoot":"","sources":["../../src/validationConstraints/validationConstraints.base.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,8CAA8C,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,EAC/B,OAAO,GAAE,iBAAsB,GAC9B,oBAAoB,CAAC,CAAC,CAAC,CAWzB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,EACnC,KAAK,EAAE,CAAC,EACR,IAAI,GAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAO,GACtC,gBAAgB,CAAC,CAAC,CAAC,CAarB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,WAAW,EAAE,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAAE,EAC/C,KAAK,EAAE,CAAC,EACR,IAAI,GAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAO,GACtC,gBAAgB,CAAC,CAAC,CAAC,CAmBrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,GAAG,WAAW,EAAE,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAAE,GACjD,oBAAoB,CAAC,CAAC,CAAC,CAWzB;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EACnB,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,iBAAsB,GAC9B,oBAAoB,CAAC,CAAC,CAAC,CAMzB;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,+BAOpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI1E"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { failure, success, } from "../validationResult/validationResult.type.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a reusable validation constraint.
|
|
4
|
+
*/
|
|
5
|
+
export function createConstraint(validate, options = {}) {
|
|
6
|
+
const name = options.name ?? "custom";
|
|
7
|
+
const code = options.code ?? "constraint_failed";
|
|
8
|
+
const message = options.message ?? "Validation constraint failed.";
|
|
9
|
+
return Object.freeze({
|
|
10
|
+
name,
|
|
11
|
+
validate,
|
|
12
|
+
message,
|
|
13
|
+
code,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Executes a constraint against a value.
|
|
18
|
+
*/
|
|
19
|
+
export function checkConstraint(constraint, value, path = []) {
|
|
20
|
+
if (constraint.validate(value)) {
|
|
21
|
+
return success(value);
|
|
22
|
+
}
|
|
23
|
+
const validationIssue = {
|
|
24
|
+
path: [...path],
|
|
25
|
+
code: constraint.code,
|
|
26
|
+
message: constraint.message,
|
|
27
|
+
received: value,
|
|
28
|
+
};
|
|
29
|
+
return failure([validationIssue]);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Executes multiple constraints against a value.
|
|
33
|
+
*/
|
|
34
|
+
export function checkConstraints(constraints, value, path = []) {
|
|
35
|
+
const issues = [];
|
|
36
|
+
for (const constraint of constraints) {
|
|
37
|
+
if (!constraint.validate(value)) {
|
|
38
|
+
issues.push({
|
|
39
|
+
path: [...path],
|
|
40
|
+
code: constraint.code,
|
|
41
|
+
message: constraint.message,
|
|
42
|
+
received: value,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (issues.length > 0) {
|
|
47
|
+
return failure(issues);
|
|
48
|
+
}
|
|
49
|
+
return success(value);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Combines constraints into a single constraint.
|
|
53
|
+
*/
|
|
54
|
+
export function combineConstraints(...constraints) {
|
|
55
|
+
return createConstraint((value) => constraints.every((constraint) => constraint.validate(value)), {
|
|
56
|
+
name: constraints.map((constraint) => constraint.name).join("_and_") ||
|
|
57
|
+
"combined",
|
|
58
|
+
code: "combined_constraint_failed",
|
|
59
|
+
message: "One or more validation constraints failed.",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Creates a negated constraint.
|
|
64
|
+
*/
|
|
65
|
+
export function not(constraint, options = {}) {
|
|
66
|
+
return createConstraint((value) => !constraint.validate(value), {
|
|
67
|
+
name: options.name ?? `not_${constraint.name}`,
|
|
68
|
+
code: options.code ?? "negated_constraint_failed",
|
|
69
|
+
message: options.message ?? `Value must not satisfy ${constraint.name}.`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Requires a value to be defined.
|
|
74
|
+
*/
|
|
75
|
+
export const required = createConstraint((value) => value !== undefined && value !== null, {
|
|
76
|
+
name: "required",
|
|
77
|
+
code: "required",
|
|
78
|
+
message: "Value is required.",
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* Asserts that a value is a non-negative integer.
|
|
82
|
+
*/
|
|
83
|
+
export function assertNonNegativeInteger(value, name) {
|
|
84
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
85
|
+
throw new RangeError(`${name} must be a non-negative integer.`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=validationConstraints.base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationConstraints.base.js","sourceRoot":"","sources":["../../src/validationConstraints/validationConstraints.base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/validation — Circular reference detection.
|
|
3
|
+
*
|
|
4
|
+
* Detects circular references in object graphs before serialization
|
|
5
|
+
* or validation to prevent stack overflows and provide clear error messages.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Detect circular references in a value graph.
|
|
9
|
+
*
|
|
10
|
+
* Uses a WeakSet to track visited objects without preventing GC.
|
|
11
|
+
* Throws CircularReferenceError on first cycle detected.
|
|
12
|
+
*
|
|
13
|
+
* @param value - The value to check for circular references.
|
|
14
|
+
* @param path - Current traversal path for error reporting.
|
|
15
|
+
* @param seen - WeakSet tracking visited objects (internal).
|
|
16
|
+
*/
|
|
17
|
+
export declare function assertNoCircularReference(value: unknown, path?: string, seen?: WeakSet<object>): void;
|
|
18
|
+
/**
|
|
19
|
+
* Check whether a value contains circular references.
|
|
20
|
+
*
|
|
21
|
+
* Returns true if a cycle is found, false otherwise.
|
|
22
|
+
* Does not throw — use assertNoCircularReference for throwing behavior.
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasCircularReference(value: unknown): boolean;
|
|
25
|
+
//# sourceMappingURL=validationConstraints.circular.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationConstraints.circular.d.ts","sourceRoot":"","sources":["../../src/validationConstraints/validationConstraints.circular.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,IAAI,SAAS,EACb,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GACrB,IAAI,CA2CN;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQ5D"}
|