@oxog/vld 1.0.0 → 1.1.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/CHANGELOG.md +117 -102
- package/README.md +78 -13
- package/dist/coercion/bigint.d.ts +27 -0
- package/dist/coercion/bigint.d.ts.map +1 -0
- package/dist/coercion/bigint.js +108 -0
- package/dist/coercion/bigint.js.map +1 -0
- package/dist/coercion/boolean.d.ts +20 -0
- package/dist/coercion/boolean.d.ts.map +1 -0
- package/dist/coercion/boolean.js +63 -0
- package/dist/coercion/boolean.js.map +1 -0
- package/dist/coercion/date.d.ts +20 -0
- package/dist/coercion/date.d.ts.map +1 -0
- package/dist/coercion/date.js +52 -0
- package/dist/coercion/date.js.map +1 -0
- package/dist/coercion/number.d.ts +35 -0
- package/dist/coercion/number.d.ts.map +1 -0
- package/dist/coercion/number.js +144 -0
- package/dist/coercion/number.js.map +1 -0
- package/dist/coercion/string.d.ts +38 -0
- package/dist/coercion/string.d.ts.map +1 -0
- package/dist/coercion/string.js +168 -0
- package/dist/coercion/string.js.map +1 -0
- package/dist/index-new.d.ts.map +1 -0
- package/dist/index.d.ts +64 -257
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -1164
- package/dist/index.js.map +1 -1
- package/dist/locales/af.js +3 -3
- package/dist/locales/af.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +18 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +68 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/validators/any.d.ts +19 -0
- package/dist/validators/any.d.ts.map +1 -0
- package/dist/validators/any.js +25 -0
- package/dist/validators/any.js.map +1 -0
- package/dist/validators/array.d.ts +48 -0
- package/dist/validators/array.d.ts.map +1 -0
- package/dist/validators/array.js +135 -0
- package/dist/validators/array.js.map +1 -0
- package/dist/validators/base.d.ts +155 -0
- package/dist/validators/base.d.ts.map +1 -0
- package/dist/validators/base.js +245 -0
- package/dist/validators/base.js.map +1 -0
- package/dist/validators/bigint.d.ts +60 -0
- package/dist/validators/bigint.d.ts.map +1 -0
- package/dist/validators/bigint.js +104 -0
- package/dist/validators/bigint.js.map +1 -0
- package/dist/validators/boolean.d.ts +32 -0
- package/dist/validators/boolean.d.ts.map +1 -0
- package/dist/validators/boolean.js +86 -0
- package/dist/validators/boolean.js.map +1 -0
- package/dist/validators/date.d.ts +68 -0
- package/dist/validators/date.d.ts.map +1 -0
- package/dist/validators/date.js +148 -0
- package/dist/validators/date.js.map +1 -0
- package/dist/validators/enum.d.ts +25 -0
- package/dist/validators/enum.d.ts.map +1 -0
- package/dist/validators/enum.js +45 -0
- package/dist/validators/enum.js.map +1 -0
- package/dist/validators/index.d.ts +27 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +30 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/intersection.d.ts +25 -0
- package/dist/validators/intersection.d.ts.map +1 -0
- package/dist/validators/intersection.js +57 -0
- package/dist/validators/intersection.js.map +1 -0
- package/dist/validators/literal.d.ts +25 -0
- package/dist/validators/literal.d.ts.map +1 -0
- package/dist/validators/literal.js +45 -0
- package/dist/validators/literal.js.map +1 -0
- package/dist/validators/map.d.ts +26 -0
- package/dist/validators/map.d.ts.map +1 -0
- package/dist/validators/map.js +54 -0
- package/dist/validators/map.js.map +1 -0
- package/dist/validators/never.d.ts +19 -0
- package/dist/validators/never.d.ts.map +1 -0
- package/dist/validators/never.js +29 -0
- package/dist/validators/never.js.map +1 -0
- package/dist/validators/number.d.ts +92 -0
- package/dist/validators/number.d.ts.map +1 -0
- package/dist/validators/number.js +173 -0
- package/dist/validators/number.js.map +1 -0
- package/dist/validators/object-optimized.d.ts +23 -0
- package/dist/validators/object-optimized.d.ts.map +1 -0
- package/dist/validators/object-optimized.js +179 -0
- package/dist/validators/object-optimized.js.map +1 -0
- package/dist/validators/object-ultra.d.ts +34 -0
- package/dist/validators/object-ultra.d.ts.map +1 -0
- package/dist/validators/object-ultra.js +175 -0
- package/dist/validators/object-ultra.js.map +1 -0
- package/dist/validators/object.d.ts +73 -0
- package/dist/validators/object.d.ts.map +1 -0
- package/dist/validators/object.js +289 -0
- package/dist/validators/object.js.map +1 -0
- package/dist/validators/record.d.ts +25 -0
- package/dist/validators/record.d.ts.map +1 -0
- package/dist/validators/record.js +52 -0
- package/dist/validators/record.js.map +1 -0
- package/dist/validators/set.d.ts +25 -0
- package/dist/validators/set.d.ts.map +1 -0
- package/dist/validators/set.js +51 -0
- package/dist/validators/set.js.map +1 -0
- package/dist/validators/string-ultra.d.ts +49 -0
- package/dist/validators/string-ultra.d.ts.map +1 -0
- package/dist/validators/string-ultra.js +217 -0
- package/dist/validators/string-ultra.js.map +1 -0
- package/dist/validators/string.d.ts +109 -0
- package/dist/validators/string.d.ts.map +1 -0
- package/dist/validators/string.js +242 -0
- package/dist/validators/string.js.map +1 -0
- package/dist/validators/symbol.d.ts +24 -0
- package/dist/validators/symbol.d.ts.map +1 -0
- package/dist/validators/symbol.js +42 -0
- package/dist/validators/symbol.js.map +1 -0
- package/dist/validators/tuple.d.ts +31 -0
- package/dist/validators/tuple.d.ts.map +1 -0
- package/dist/validators/tuple.js +55 -0
- package/dist/validators/tuple.js.map +1 -0
- package/dist/validators/union-optimized.d.ts +15 -0
- package/dist/validators/union-optimized.d.ts.map +1 -0
- package/dist/validators/union-optimized.js +92 -0
- package/dist/validators/union-optimized.js.map +1 -0
- package/dist/validators/union.d.ts +33 -0
- package/dist/validators/union.d.ts.map +1 -0
- package/dist/validators/union.js +121 -0
- package/dist/validators/union.js.map +1 -0
- package/dist/validators/unknown.d.ts +19 -0
- package/dist/validators/unknown.d.ts.map +1 -0
- package/dist/validators/unknown.js +25 -0
- package/dist/validators/unknown.js.map +1 -0
- package/dist/validators/void.d.ts +19 -0
- package/dist/validators/void.d.ts.map +1 -0
- package/dist/validators/void.js +35 -0
- package/dist/validators/void.js.map +1 -0
- package/package.json +12 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/validators/array.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Configuration for array validator\n */\ninterface ArrayValidatorConfig<T> {\n readonly itemValidator: VldBase<unknown, T>;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly exactLength?: number;\n readonly unique?: boolean;\n readonly errorMessage?: string;\n}\n\n/**\n * Immutable array validator with chainable methods\n */\nexport class VldArray<T> extends VldBase<unknown[], T[]> {\n private readonly config: ArrayValidatorConfig<T>;\n \n /**\n * Private constructor to enforce immutability\n */\n private constructor(config: ArrayValidatorConfig<T>) {\n super();\n this.config = config;\n }\n \n /**\n * Create a new array validator\n */\n static create<T>(itemValidator: VldBase<unknown, T>): VldArray<T> {\n return new VldArray({ itemValidator });\n }\n \n /**\n * Parse and validate an array value\n */\n parse(value: unknown): T[] {\n if (!Array.isArray(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidArray);\n }\n \n // Validate length constraints\n if (this.config.exactLength !== undefined && value.length !== this.config.exactLength) {\n throw new Error(this.config.errorMessage || getMessages().arrayLength(this.config.exactLength));\n }\n \n if (this.config.minLength !== undefined && value.length < this.config.minLength) {\n throw new Error(this.config.errorMessage || getMessages().arrayMin(this.config.minLength));\n }\n \n if (this.config.maxLength !== undefined && value.length > this.config.maxLength) {\n throw new Error(this.config.errorMessage || getMessages().arrayMax(this.config.maxLength));\n }\n \n // Validate each item with optimized loop and safeParse\n const result: T[] = [];\n const length = value.length;\n \n for (let i = 0; i < length; i++) {\n const parseResult = this.config.itemValidator.safeParse(value[i]);\n if (!parseResult.success) {\n throw new Error(getMessages().arrayItem(i, parseResult.error.message));\n }\n result[i] = parseResult.data; // Direct assignment is faster than push\n }\n \n // Check uniqueness if required\n if (this.config.unique) {\n const seen = new Set<any>();\n for (const item of result) {\n const key = typeof item === 'object' ? JSON.stringify(item) : item;\n if (seen.has(key)) {\n throw new Error('Array must contain unique items');\n }\n seen.add(key);\n }\n }\n \n return result;\n }\n \n /**\n * Safely parse and validate an array value\n */\n safeParse(value: unknown): ParseResult<T[]> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n \n /**\n * Create a new validator with minimum length constraint\n */\n min(length: number, message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n minLength: length,\n errorMessage: message || getMessages().arrayMin(length)\n });\n }\n \n /**\n * Create a new validator with maximum length constraint\n */\n max(length: number, message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n maxLength: length,\n errorMessage: message || getMessages().arrayMax(length)\n });\n }\n \n /**\n * Create a new validator with exact length constraint\n */\n length(length: number, message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n exactLength: length,\n minLength: undefined,\n maxLength: undefined,\n errorMessage: message || getMessages().arrayLength(length)\n });\n }\n \n /**\n * Create a new validator that ensures array is not empty\n */\n nonempty(message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n minLength: 1,\n errorMessage: message || getMessages().arrayEmpty\n });\n }\n \n /**\n * Create a new validator that ensures array contains unique items\n */\n unique(message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n unique: true,\n errorMessage: message || 'Array must contain unique items'\n });\n }\n \n /**\n * Create a new validator with a range constraint for length\n */\n between(min: number, max: number, message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n minLength: min,\n maxLength: max,\n errorMessage: message || `Array length must be between ${min} and ${max}`\n });\n }\n}"]}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base result type for validation
|
|
3
|
+
*/
|
|
4
|
+
export type ParseResult<T> = {
|
|
5
|
+
readonly success: true;
|
|
6
|
+
readonly data: T;
|
|
7
|
+
} | {
|
|
8
|
+
readonly success: false;
|
|
9
|
+
readonly error: Error;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Abstract base class for all validators
|
|
13
|
+
* Implements immutable pattern to prevent memory leaks and race conditions
|
|
14
|
+
*/
|
|
15
|
+
export declare abstract class VldBase<TInput, TOutput = TInput> {
|
|
16
|
+
/**
|
|
17
|
+
* Parse and validate a value, throwing an error if invalid
|
|
18
|
+
* @param value The value to validate
|
|
19
|
+
* @returns The validated value
|
|
20
|
+
* @throws {Error} If validation fails
|
|
21
|
+
*/
|
|
22
|
+
abstract parse(value: unknown): TOutput;
|
|
23
|
+
/**
|
|
24
|
+
* Safely parse and validate a value, returning a result object
|
|
25
|
+
* @param value The value to validate
|
|
26
|
+
* @returns A result object with either success and data, or failure and error
|
|
27
|
+
*/
|
|
28
|
+
abstract safeParse(value: unknown): ParseResult<TOutput>;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a value is valid according to this validator
|
|
31
|
+
* @param value The value to check
|
|
32
|
+
* @returns True if valid, false otherwise
|
|
33
|
+
*/
|
|
34
|
+
isValid(value: unknown): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Parse a value or return a default if validation fails
|
|
37
|
+
* @param value The value to validate
|
|
38
|
+
* @param defaultValue The default value to return on failure
|
|
39
|
+
* @returns The validated value or default
|
|
40
|
+
*/
|
|
41
|
+
parseOrDefault(value: unknown, defaultValue: TOutput): TOutput;
|
|
42
|
+
/**
|
|
43
|
+
* Create a new validator that refines this one with a custom predicate
|
|
44
|
+
* @param predicate The refinement predicate
|
|
45
|
+
* @param message Optional custom error message
|
|
46
|
+
* @returns A new refined validator
|
|
47
|
+
*/
|
|
48
|
+
refine<TRefined extends TOutput>(predicate: (value: TOutput) => value is TRefined, message?: string): VldRefine<TInput, TOutput, TRefined>;
|
|
49
|
+
refine(predicate: (value: TOutput) => boolean, message?: string): VldRefine<TInput, TOutput, TOutput>;
|
|
50
|
+
/**
|
|
51
|
+
* Create a new validator that transforms the output
|
|
52
|
+
* @param transformer The transformation function
|
|
53
|
+
* @returns A new transformed validator
|
|
54
|
+
*/
|
|
55
|
+
transform<TTransformed>(transformer: (value: TOutput) => TTransformed): VldTransform<TInput, TOutput, TTransformed>;
|
|
56
|
+
/**
|
|
57
|
+
* Create a new validator with a default value for undefined inputs
|
|
58
|
+
* @param defaultValue The default value
|
|
59
|
+
* @returns A new validator with default
|
|
60
|
+
*/
|
|
61
|
+
default(defaultValue: TOutput): VldDefault<TInput, TOutput>;
|
|
62
|
+
/**
|
|
63
|
+
* Create a new validator that catches errors and returns a fallback
|
|
64
|
+
* @param fallbackValue The fallback value
|
|
65
|
+
* @returns A new validator with catch
|
|
66
|
+
*/
|
|
67
|
+
catch(fallbackValue: TOutput): VldCatch<TInput, TOutput>;
|
|
68
|
+
/**
|
|
69
|
+
* Make this validator optional (allows undefined)
|
|
70
|
+
* @returns A new optional validator
|
|
71
|
+
*/
|
|
72
|
+
optional(): VldOptional<TInput, TOutput>;
|
|
73
|
+
/**
|
|
74
|
+
* Make this validator nullable (allows null)
|
|
75
|
+
* @returns A new nullable validator
|
|
76
|
+
*/
|
|
77
|
+
nullable(): VldNullable<TInput, TOutput>;
|
|
78
|
+
/**
|
|
79
|
+
* Make this validator nullish (allows null or undefined)
|
|
80
|
+
* @returns A new nullish validator
|
|
81
|
+
*/
|
|
82
|
+
nullish(): VldNullish<TInput, TOutput>;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Refine validator - adds custom validation
|
|
86
|
+
*/
|
|
87
|
+
export declare class VldRefine<TInput, TBase, TOutput extends TBase = TBase> extends VldBase<TInput, TOutput> {
|
|
88
|
+
private readonly baseValidator;
|
|
89
|
+
private readonly predicate;
|
|
90
|
+
private readonly customMessage?;
|
|
91
|
+
constructor(baseValidator: VldBase<TInput, TBase>, predicate: (value: TBase) => boolean, customMessage?: string | undefined);
|
|
92
|
+
parse(value: unknown): TOutput;
|
|
93
|
+
safeParse(value: unknown): ParseResult<TOutput>;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Transform validator - transforms data after validation
|
|
97
|
+
*/
|
|
98
|
+
export declare class VldTransform<TInput, TBase, TOutput> extends VldBase<TInput, TOutput> {
|
|
99
|
+
private readonly baseValidator;
|
|
100
|
+
private readonly transformer;
|
|
101
|
+
constructor(baseValidator: VldBase<TInput, TBase>, transformer: (value: TBase) => TOutput);
|
|
102
|
+
parse(value: unknown): TOutput;
|
|
103
|
+
safeParse(value: unknown): ParseResult<TOutput>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Default validator - provides default value for undefined
|
|
107
|
+
*/
|
|
108
|
+
export declare class VldDefault<TInput, TOutput> extends VldBase<TInput | undefined, TOutput> {
|
|
109
|
+
private readonly baseValidator;
|
|
110
|
+
private readonly defaultValue;
|
|
111
|
+
constructor(baseValidator: VldBase<TInput, TOutput>, defaultValue: TOutput);
|
|
112
|
+
parse(value: unknown): TOutput;
|
|
113
|
+
safeParse(value: unknown): ParseResult<TOutput>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Catch validator - provides fallback value on validation error
|
|
117
|
+
*/
|
|
118
|
+
export declare class VldCatch<TInput, TOutput> extends VldBase<TInput, TOutput> {
|
|
119
|
+
private readonly baseValidator;
|
|
120
|
+
private readonly fallbackValue;
|
|
121
|
+
constructor(baseValidator: VldBase<TInput, TOutput>, fallbackValue: TOutput);
|
|
122
|
+
parse(value: unknown): TOutput;
|
|
123
|
+
safeParse(value: unknown): ParseResult<TOutput>;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Optional validator - allows undefined
|
|
127
|
+
*/
|
|
128
|
+
export declare class VldOptional<TInput, TOutput> extends VldBase<TInput | undefined, TOutput | undefined> {
|
|
129
|
+
private readonly baseValidator;
|
|
130
|
+
constructor(baseValidator: VldBase<TInput, TOutput>);
|
|
131
|
+
static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldOptional<TInput, TOutput>;
|
|
132
|
+
parse(value: unknown): TOutput | undefined;
|
|
133
|
+
safeParse(value: unknown): ParseResult<TOutput | undefined>;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Nullable validator - allows null
|
|
137
|
+
*/
|
|
138
|
+
export declare class VldNullable<TInput, TOutput> extends VldBase<TInput | null, TOutput | null> {
|
|
139
|
+
private readonly baseValidator;
|
|
140
|
+
constructor(baseValidator: VldBase<TInput, TOutput>);
|
|
141
|
+
static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullable<TInput, TOutput>;
|
|
142
|
+
parse(value: unknown): TOutput | null;
|
|
143
|
+
safeParse(value: unknown): ParseResult<TOutput | null>;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Nullish validator - allows null or undefined
|
|
147
|
+
*/
|
|
148
|
+
export declare class VldNullish<TInput, TOutput> extends VldBase<TInput | null | undefined, TOutput | null | undefined> {
|
|
149
|
+
private readonly baseValidator;
|
|
150
|
+
constructor(baseValidator: VldBase<TInput, TOutput>);
|
|
151
|
+
static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullish<TInput, TOutput>;
|
|
152
|
+
parse(value: unknown): TOutput | null | undefined;
|
|
153
|
+
safeParse(value: unknown): ParseResult<TOutput | null | undefined>;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/validators/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base class for all validators
|
|
3
|
+
* Implements immutable pattern to prevent memory leaks and race conditions
|
|
4
|
+
*/
|
|
5
|
+
export class VldBase {
|
|
6
|
+
/**
|
|
7
|
+
* Check if a value is valid according to this validator
|
|
8
|
+
* @param value The value to check
|
|
9
|
+
* @returns True if valid, false otherwise
|
|
10
|
+
*/
|
|
11
|
+
isValid(value) {
|
|
12
|
+
return this.safeParse(value).success;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parse a value or return a default if validation fails
|
|
16
|
+
* @param value The value to validate
|
|
17
|
+
* @param defaultValue The default value to return on failure
|
|
18
|
+
* @returns The validated value or default
|
|
19
|
+
*/
|
|
20
|
+
parseOrDefault(value, defaultValue) {
|
|
21
|
+
const result = this.safeParse(value);
|
|
22
|
+
return result.success ? result.data : defaultValue;
|
|
23
|
+
}
|
|
24
|
+
refine(predicate, message) {
|
|
25
|
+
return new VldRefine(this, predicate, message);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a new validator that transforms the output
|
|
29
|
+
* @param transformer The transformation function
|
|
30
|
+
* @returns A new transformed validator
|
|
31
|
+
*/
|
|
32
|
+
transform(transformer) {
|
|
33
|
+
return new VldTransform(this, transformer);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a new validator with a default value for undefined inputs
|
|
37
|
+
* @param defaultValue The default value
|
|
38
|
+
* @returns A new validator with default
|
|
39
|
+
*/
|
|
40
|
+
default(defaultValue) {
|
|
41
|
+
return new VldDefault(this, defaultValue);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a new validator that catches errors and returns a fallback
|
|
45
|
+
* @param fallbackValue The fallback value
|
|
46
|
+
* @returns A new validator with catch
|
|
47
|
+
*/
|
|
48
|
+
catch(fallbackValue) {
|
|
49
|
+
return new VldCatch(this, fallbackValue);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Make this validator optional (allows undefined)
|
|
53
|
+
* @returns A new optional validator
|
|
54
|
+
*/
|
|
55
|
+
optional() {
|
|
56
|
+
return new VldOptional(this);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Make this validator nullable (allows null)
|
|
60
|
+
* @returns A new nullable validator
|
|
61
|
+
*/
|
|
62
|
+
nullable() {
|
|
63
|
+
return new VldNullable(this);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Make this validator nullish (allows null or undefined)
|
|
67
|
+
* @returns A new nullish validator
|
|
68
|
+
*/
|
|
69
|
+
nullish() {
|
|
70
|
+
return new VldNullish(this);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Refine validator - adds custom validation
|
|
75
|
+
*/
|
|
76
|
+
export class VldRefine extends VldBase {
|
|
77
|
+
constructor(baseValidator, predicate, customMessage) {
|
|
78
|
+
super();
|
|
79
|
+
this.baseValidator = baseValidator;
|
|
80
|
+
this.predicate = predicate;
|
|
81
|
+
this.customMessage = customMessage;
|
|
82
|
+
}
|
|
83
|
+
parse(value) {
|
|
84
|
+
const baseResult = this.baseValidator.parse(value);
|
|
85
|
+
if (!this.predicate(baseResult)) {
|
|
86
|
+
throw new Error(this.customMessage || 'Refinement check failed');
|
|
87
|
+
}
|
|
88
|
+
return baseResult;
|
|
89
|
+
}
|
|
90
|
+
safeParse(value) {
|
|
91
|
+
try {
|
|
92
|
+
return { success: true, data: this.parse(value) };
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
return { success: false, error: error };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Transform validator - transforms data after validation
|
|
101
|
+
*/
|
|
102
|
+
export class VldTransform extends VldBase {
|
|
103
|
+
constructor(baseValidator, transformer) {
|
|
104
|
+
super();
|
|
105
|
+
this.baseValidator = baseValidator;
|
|
106
|
+
this.transformer = transformer;
|
|
107
|
+
}
|
|
108
|
+
parse(value) {
|
|
109
|
+
const baseResult = this.baseValidator.parse(value);
|
|
110
|
+
try {
|
|
111
|
+
return this.transformer(baseResult);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
throw new Error(`Transform failed: ${error.message}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
safeParse(value) {
|
|
118
|
+
try {
|
|
119
|
+
return { success: true, data: this.parse(value) };
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return { success: false, error: error };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Default validator - provides default value for undefined
|
|
128
|
+
*/
|
|
129
|
+
export class VldDefault extends VldBase {
|
|
130
|
+
constructor(baseValidator, defaultValue) {
|
|
131
|
+
super();
|
|
132
|
+
this.baseValidator = baseValidator;
|
|
133
|
+
this.defaultValue = defaultValue;
|
|
134
|
+
}
|
|
135
|
+
parse(value) {
|
|
136
|
+
if (value === undefined) {
|
|
137
|
+
return this.defaultValue;
|
|
138
|
+
}
|
|
139
|
+
return this.baseValidator.parse(value);
|
|
140
|
+
}
|
|
141
|
+
safeParse(value) {
|
|
142
|
+
if (value === undefined) {
|
|
143
|
+
return { success: true, data: this.defaultValue };
|
|
144
|
+
}
|
|
145
|
+
return this.baseValidator.safeParse(value);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Catch validator - provides fallback value on validation error
|
|
150
|
+
*/
|
|
151
|
+
export class VldCatch extends VldBase {
|
|
152
|
+
constructor(baseValidator, fallbackValue) {
|
|
153
|
+
super();
|
|
154
|
+
this.baseValidator = baseValidator;
|
|
155
|
+
this.fallbackValue = fallbackValue;
|
|
156
|
+
}
|
|
157
|
+
parse(value) {
|
|
158
|
+
try {
|
|
159
|
+
return this.baseValidator.parse(value);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return this.fallbackValue;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
safeParse(value) {
|
|
166
|
+
const result = this.baseValidator.safeParse(value);
|
|
167
|
+
if (result.success) {
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
return { success: true, data: this.fallbackValue };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Optional validator - allows undefined
|
|
175
|
+
*/
|
|
176
|
+
export class VldOptional extends VldBase {
|
|
177
|
+
constructor(baseValidator) {
|
|
178
|
+
super();
|
|
179
|
+
this.baseValidator = baseValidator;
|
|
180
|
+
}
|
|
181
|
+
static create(baseValidator) {
|
|
182
|
+
return new VldOptional(baseValidator);
|
|
183
|
+
}
|
|
184
|
+
parse(value) {
|
|
185
|
+
if (value === undefined) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
return this.baseValidator.parse(value);
|
|
189
|
+
}
|
|
190
|
+
safeParse(value) {
|
|
191
|
+
if (value === undefined) {
|
|
192
|
+
return { success: true, data: undefined };
|
|
193
|
+
}
|
|
194
|
+
return this.baseValidator.safeParse(value);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Nullable validator - allows null
|
|
199
|
+
*/
|
|
200
|
+
export class VldNullable extends VldBase {
|
|
201
|
+
constructor(baseValidator) {
|
|
202
|
+
super();
|
|
203
|
+
this.baseValidator = baseValidator;
|
|
204
|
+
}
|
|
205
|
+
static create(baseValidator) {
|
|
206
|
+
return new VldNullable(baseValidator);
|
|
207
|
+
}
|
|
208
|
+
parse(value) {
|
|
209
|
+
if (value === null) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
return this.baseValidator.parse(value);
|
|
213
|
+
}
|
|
214
|
+
safeParse(value) {
|
|
215
|
+
if (value === null) {
|
|
216
|
+
return { success: true, data: null };
|
|
217
|
+
}
|
|
218
|
+
return this.baseValidator.safeParse(value);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Nullish validator - allows null or undefined
|
|
223
|
+
*/
|
|
224
|
+
export class VldNullish extends VldBase {
|
|
225
|
+
constructor(baseValidator) {
|
|
226
|
+
super();
|
|
227
|
+
this.baseValidator = baseValidator;
|
|
228
|
+
}
|
|
229
|
+
static create(baseValidator) {
|
|
230
|
+
return new VldNullish(baseValidator);
|
|
231
|
+
}
|
|
232
|
+
parse(value) {
|
|
233
|
+
if (value === null || value === undefined) {
|
|
234
|
+
return value;
|
|
235
|
+
}
|
|
236
|
+
return this.baseValidator.parse(value);
|
|
237
|
+
}
|
|
238
|
+
safeParse(value) {
|
|
239
|
+
if (value === null || value === undefined) {
|
|
240
|
+
return { success: true, data: value };
|
|
241
|
+
}
|
|
242
|
+
return this.baseValidator.safeParse(value);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/validators/base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Base result type for validation\n */\nexport type ParseResult<T> = \n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly error: Error };\n\n/**\n * Abstract base class for all validators\n * Implements immutable pattern to prevent memory leaks and race conditions\n */\nexport abstract class VldBase<TInput, TOutput = TInput> {\n /**\n * Parse and validate a value, throwing an error if invalid\n * @param value The value to validate\n * @returns The validated value\n * @throws {Error} If validation fails\n */\n abstract parse(value: unknown): TOutput;\n \n /**\n * Safely parse and validate a value, returning a result object\n * @param value The value to validate\n * @returns A result object with either success and data, or failure and error\n */\n abstract safeParse(value: unknown): ParseResult<TOutput>;\n \n /**\n * Check if a value is valid according to this validator\n * @param value The value to check\n * @returns True if valid, false otherwise\n */\n isValid(value: unknown): boolean {\n return this.safeParse(value).success;\n }\n \n /**\n * Parse a value or return a default if validation fails\n * @param value The value to validate\n * @param defaultValue The default value to return on failure\n * @returns The validated value or default\n */\n parseOrDefault(value: unknown, defaultValue: TOutput): TOutput {\n const result = this.safeParse(value);\n return result.success ? result.data : defaultValue;\n }\n \n /**\n * Create a new validator that refines this one with a custom predicate\n * @param predicate The refinement predicate\n * @param message Optional custom error message\n * @returns A new refined validator\n */\n refine<TRefined extends TOutput>(\n predicate: (value: TOutput) => value is TRefined,\n message?: string\n ): VldRefine<TInput, TOutput, TRefined>;\n refine(\n predicate: (value: TOutput) => boolean,\n message?: string\n ): VldRefine<TInput, TOutput, TOutput>;\n refine(\n predicate: (value: TOutput) => boolean,\n message?: string\n ): VldRefine<TInput, TOutput, TOutput> {\n return new VldRefine(this, predicate, message);\n }\n \n /**\n * Create a new validator that transforms the output\n * @param transformer The transformation function\n * @returns A new transformed validator\n */\n transform<TTransformed>(\n transformer: (value: TOutput) => TTransformed\n ): VldTransform<TInput, TOutput, TTransformed> {\n return new VldTransform(this, transformer);\n }\n \n /**\n * Create a new validator with a default value for undefined inputs\n * @param defaultValue The default value\n * @returns A new validator with default\n */\n default(defaultValue: TOutput): VldDefault<TInput, TOutput> {\n return new VldDefault(this, defaultValue);\n }\n \n /**\n * Create a new validator that catches errors and returns a fallback\n * @param fallbackValue The fallback value\n * @returns A new validator with catch\n */\n catch(fallbackValue: TOutput): VldCatch<TInput, TOutput> {\n return new VldCatch(this, fallbackValue);\n }\n \n /**\n * Make this validator optional (allows undefined)\n * @returns A new optional validator\n */\n optional(): VldOptional<TInput, TOutput> {\n return new VldOptional(this);\n }\n \n /**\n * Make this validator nullable (allows null)\n * @returns A new nullable validator\n */\n nullable(): VldNullable<TInput, TOutput> {\n return new VldNullable(this);\n }\n \n /**\n * Make this validator nullish (allows null or undefined)\n * @returns A new nullish validator\n */\n nullish(): VldNullish<TInput, TOutput> {\n return new VldNullish(this);\n }\n}\n\n/**\n * Refine validator - adds custom validation\n */\nexport class VldRefine<TInput, TBase, TOutput extends TBase = TBase> extends VldBase<TInput, TOutput> {\n constructor(\n private readonly baseValidator: VldBase<TInput, TBase>,\n private readonly predicate: (value: TBase) => boolean,\n private readonly customMessage?: string\n ) {\n super();\n }\n \n parse(value: unknown): TOutput {\n const baseResult = this.baseValidator.parse(value);\n \n if (!this.predicate(baseResult)) {\n throw new Error(this.customMessage || 'Refinement check failed');\n }\n \n return baseResult as TOutput;\n }\n \n safeParse(value: unknown): ParseResult<TOutput> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}\n\n/**\n * Transform validator - transforms data after validation\n */\nexport class VldTransform<TInput, TBase, TOutput> extends VldBase<TInput, TOutput> {\n constructor(\n private readonly baseValidator: VldBase<TInput, TBase>,\n private readonly transformer: (value: TBase) => TOutput\n ) {\n super();\n }\n \n parse(value: unknown): TOutput {\n const baseResult = this.baseValidator.parse(value);\n \n try {\n return this.transformer(baseResult);\n } catch (error) {\n throw new Error(`Transform failed: ${(error as Error).message}`);\n }\n }\n \n safeParse(value: unknown): ParseResult<TOutput> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}\n\n/**\n * Default validator - provides default value for undefined\n */\nexport class VldDefault<TInput, TOutput> extends VldBase<TInput | undefined, TOutput> {\n constructor(\n private readonly baseValidator: VldBase<TInput, TOutput>,\n private readonly defaultValue: TOutput\n ) {\n super();\n }\n \n parse(value: unknown): TOutput {\n if (value === undefined) {\n return this.defaultValue;\n }\n return this.baseValidator.parse(value);\n }\n \n safeParse(value: unknown): ParseResult<TOutput> {\n if (value === undefined) {\n return { success: true, data: this.defaultValue };\n }\n return this.baseValidator.safeParse(value);\n }\n}\n\n/**\n * Catch validator - provides fallback value on validation error\n */\nexport class VldCatch<TInput, TOutput> extends VldBase<TInput, TOutput> {\n constructor(\n private readonly baseValidator: VldBase<TInput, TOutput>,\n private readonly fallbackValue: TOutput\n ) {\n super();\n }\n \n parse(value: unknown): TOutput {\n try {\n return this.baseValidator.parse(value);\n } catch {\n return this.fallbackValue;\n }\n }\n \n safeParse(value: unknown): ParseResult<TOutput> {\n const result = this.baseValidator.safeParse(value);\n if (result.success) {\n return result;\n }\n return { success: true, data: this.fallbackValue };\n }\n}\n\n/**\n * Optional validator - allows undefined\n */\nexport class VldOptional<TInput, TOutput> extends VldBase<TInput | undefined, TOutput | undefined> {\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\n super();\n }\n \n static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldOptional<TInput, TOutput> {\n return new VldOptional(baseValidator);\n }\n \n parse(value: unknown): TOutput | undefined {\n if (value === undefined) {\n return undefined;\n }\n return this.baseValidator.parse(value);\n }\n \n safeParse(value: unknown): ParseResult<TOutput | undefined> {\n if (value === undefined) {\n return { success: true, data: undefined };\n }\n return this.baseValidator.safeParse(value);\n }\n}\n\n/**\n * Nullable validator - allows null\n */\nexport class VldNullable<TInput, TOutput> extends VldBase<TInput | null, TOutput | null> {\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\n super();\n }\n \n static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullable<TInput, TOutput> {\n return new VldNullable(baseValidator);\n }\n \n parse(value: unknown): TOutput | null {\n if (value === null) {\n return null;\n }\n return this.baseValidator.parse(value);\n }\n \n safeParse(value: unknown): ParseResult<TOutput | null> {\n if (value === null) {\n return { success: true, data: null };\n }\n return this.baseValidator.safeParse(value);\n }\n}\n\n/**\n * Nullish validator - allows null or undefined\n */\nexport class VldNullish<TInput, TOutput> extends VldBase<TInput | null | undefined, TOutput | null | undefined> {\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\n super();\n }\n \n static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullish<TInput, TOutput> {\n return new VldNullish(baseValidator);\n }\n \n parse(value: unknown): TOutput | null | undefined {\n if (value === null || value === undefined) {\n return value as null | undefined;\n }\n return this.baseValidator.parse(value);\n }\n \n safeParse(value: unknown): ParseResult<TOutput | null | undefined> {\n if (value === null || value === undefined) {\n return { success: true, data: value as null | undefined };\n }\n return this.baseValidator.safeParse(value);\n }\n}"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Type for bigint validation check functions
|
|
4
|
+
*/
|
|
5
|
+
type BigIntCheck = (value: bigint) => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for bigint validator
|
|
8
|
+
*/
|
|
9
|
+
interface BigIntValidatorConfig {
|
|
10
|
+
readonly checks: ReadonlyArray<BigIntCheck>;
|
|
11
|
+
readonly errorMessage?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Immutable bigint validator
|
|
15
|
+
*/
|
|
16
|
+
export declare class VldBigInt extends VldBase<bigint, bigint> {
|
|
17
|
+
protected readonly config: BigIntValidatorConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Protected constructor to allow extension while maintaining immutability
|
|
20
|
+
*/
|
|
21
|
+
protected constructor(config?: Partial<BigIntValidatorConfig>);
|
|
22
|
+
/**
|
|
23
|
+
* Create a new bigint validator
|
|
24
|
+
*/
|
|
25
|
+
static create(): VldBigInt;
|
|
26
|
+
/**
|
|
27
|
+
* Parse and validate a bigint value
|
|
28
|
+
*/
|
|
29
|
+
parse(value: unknown): bigint;
|
|
30
|
+
/**
|
|
31
|
+
* Safely parse and validate a bigint value
|
|
32
|
+
*/
|
|
33
|
+
safeParse(value: unknown): ParseResult<bigint>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a new validator with minimum value constraint
|
|
36
|
+
*/
|
|
37
|
+
min(value: bigint, message?: string): VldBigInt;
|
|
38
|
+
/**
|
|
39
|
+
* Create a new validator with maximum value constraint
|
|
40
|
+
*/
|
|
41
|
+
max(value: bigint, message?: string): VldBigInt;
|
|
42
|
+
/**
|
|
43
|
+
* Create a new validator that checks for positive values
|
|
44
|
+
*/
|
|
45
|
+
positive(message?: string): VldBigInt;
|
|
46
|
+
/**
|
|
47
|
+
* Create a new validator that checks for negative values
|
|
48
|
+
*/
|
|
49
|
+
negative(message?: string): VldBigInt;
|
|
50
|
+
/**
|
|
51
|
+
* Create a new validator that checks for non-negative values
|
|
52
|
+
*/
|
|
53
|
+
nonnegative(message?: string): VldBigInt;
|
|
54
|
+
/**
|
|
55
|
+
* Create a new validator that checks for non-positive values
|
|
56
|
+
*/
|
|
57
|
+
nonpositive(message?: string): VldBigInt;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=bigint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bigint.d.ts","sourceRoot":"","sources":["../../src/validators/bigint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE9C;;GAEG;AACH,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IAEjD;;OAEG;IACH,SAAS,aAAa,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAQ7D;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,SAAS;IAI1B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAe7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;IAQ9C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO/C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO/C;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOrC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOrC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;CAMzC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable bigint validator
|
|
5
|
+
*/
|
|
6
|
+
export class VldBigInt extends VldBase {
|
|
7
|
+
/**
|
|
8
|
+
* Protected constructor to allow extension while maintaining immutability
|
|
9
|
+
*/
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super();
|
|
12
|
+
this.config = {
|
|
13
|
+
checks: config?.checks || [],
|
|
14
|
+
errorMessage: config?.errorMessage
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a new bigint validator
|
|
19
|
+
*/
|
|
20
|
+
static create() {
|
|
21
|
+
return new VldBigInt();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse and validate a bigint value
|
|
25
|
+
*/
|
|
26
|
+
parse(value) {
|
|
27
|
+
if (typeof value !== 'bigint') {
|
|
28
|
+
throw new Error(this.config.errorMessage || getMessages().invalidBigint);
|
|
29
|
+
}
|
|
30
|
+
// Apply all checks
|
|
31
|
+
for (const check of this.config.checks) {
|
|
32
|
+
if (!check(value)) {
|
|
33
|
+
throw new Error(this.config.errorMessage || getMessages().invalidBigint);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Safely parse and validate a bigint value
|
|
40
|
+
*/
|
|
41
|
+
safeParse(value) {
|
|
42
|
+
try {
|
|
43
|
+
return { success: true, data: this.parse(value) };
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return { success: false, error: error };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a new validator with minimum value constraint
|
|
51
|
+
*/
|
|
52
|
+
min(value, message) {
|
|
53
|
+
return new VldBigInt({
|
|
54
|
+
checks: [...this.config.checks, (v) => v >= value],
|
|
55
|
+
errorMessage: message || `BigInt must be at least ${value}`
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a new validator with maximum value constraint
|
|
60
|
+
*/
|
|
61
|
+
max(value, message) {
|
|
62
|
+
return new VldBigInt({
|
|
63
|
+
checks: [...this.config.checks, (v) => v <= value],
|
|
64
|
+
errorMessage: message || `BigInt must be at most ${value}`
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a new validator that checks for positive values
|
|
69
|
+
*/
|
|
70
|
+
positive(message) {
|
|
71
|
+
return new VldBigInt({
|
|
72
|
+
checks: [...this.config.checks, (v) => v > 0n],
|
|
73
|
+
errorMessage: message || 'BigInt must be positive'
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Create a new validator that checks for negative values
|
|
78
|
+
*/
|
|
79
|
+
negative(message) {
|
|
80
|
+
return new VldBigInt({
|
|
81
|
+
checks: [...this.config.checks, (v) => v < 0n],
|
|
82
|
+
errorMessage: message || 'BigInt must be negative'
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a new validator that checks for non-negative values
|
|
87
|
+
*/
|
|
88
|
+
nonnegative(message) {
|
|
89
|
+
return new VldBigInt({
|
|
90
|
+
checks: [...this.config.checks, (v) => v >= 0n],
|
|
91
|
+
errorMessage: message || 'BigInt must be non-negative'
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create a new validator that checks for non-positive values
|
|
96
|
+
*/
|
|
97
|
+
nonpositive(message) {
|
|
98
|
+
return new VldBigInt({
|
|
99
|
+
checks: [...this.config.checks, (v) => v <= 0n],
|
|
100
|
+
errorMessage: message || 'BigInt must be non-positive'
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=bigint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bigint.js","sourceRoot":"","sources":["../../src/validators/bigint.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Type for bigint validation check functions\n */\ntype BigIntCheck = (value: bigint) => boolean;\n\n/**\n * Configuration for bigint validator\n */\ninterface BigIntValidatorConfig {\n readonly checks: ReadonlyArray<BigIntCheck>;\n readonly errorMessage?: string;\n}\n\n/**\n * Immutable bigint validator\n */\nexport class VldBigInt extends VldBase<bigint, bigint> {\n protected readonly config: BigIntValidatorConfig;\n \n /**\n * Protected constructor to allow extension while maintaining immutability\n */\n protected constructor(config?: Partial<BigIntValidatorConfig>) {\n super();\n this.config = {\n checks: config?.checks || [],\n errorMessage: config?.errorMessage\n };\n }\n \n /**\n * Create a new bigint validator\n */\n static create(): VldBigInt {\n return new VldBigInt();\n }\n \n /**\n * Parse and validate a bigint value\n */\n parse(value: unknown): bigint {\n if (typeof value !== 'bigint') {\n throw new Error(this.config.errorMessage || getMessages().invalidBigint);\n }\n \n // Apply all checks\n for (const check of this.config.checks) {\n if (!check(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidBigint);\n }\n }\n \n return value;\n }\n \n /**\n * Safely parse and validate a bigint value\n */\n safeParse(value: unknown): ParseResult<bigint> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n \n /**\n * Create a new validator with minimum value constraint\n */\n min(value: bigint, message?: string): VldBigInt {\n return new VldBigInt({\n checks: [...this.config.checks, (v: bigint) => v >= value],\n errorMessage: message || `BigInt must be at least ${value}`\n });\n }\n \n /**\n * Create a new validator with maximum value constraint\n */\n max(value: bigint, message?: string): VldBigInt {\n return new VldBigInt({\n checks: [...this.config.checks, (v: bigint) => v <= value],\n errorMessage: message || `BigInt must be at most ${value}`\n });\n }\n \n /**\n * Create a new validator that checks for positive values\n */\n positive(message?: string): VldBigInt {\n return new VldBigInt({\n checks: [...this.config.checks, (v: bigint) => v > 0n],\n errorMessage: message || 'BigInt must be positive'\n });\n }\n \n /**\n * Create a new validator that checks for negative values\n */\n negative(message?: string): VldBigInt {\n return new VldBigInt({\n checks: [...this.config.checks, (v: bigint) => v < 0n],\n errorMessage: message || 'BigInt must be negative'\n });\n }\n \n /**\n * Create a new validator that checks for non-negative values\n */\n nonnegative(message?: string): VldBigInt {\n return new VldBigInt({\n checks: [...this.config.checks, (v: bigint) => v >= 0n],\n errorMessage: message || 'BigInt must be non-negative'\n });\n }\n \n /**\n * Create a new validator that checks for non-positive values\n */\n nonpositive(message?: string): VldBigInt {\n return new VldBigInt({\n checks: [...this.config.checks, (v: bigint) => v <= 0n],\n errorMessage: message || 'BigInt must be non-positive'\n });\n }\n}"]}
|