@oxog/vld 1.1.1 → 1.3.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 +157 -0
- package/README.md +1128 -840
- package/dist/codecs/index.d.ts +89 -0
- package/dist/codecs/index.d.ts.map +1 -0
- package/dist/codecs/index.js +256 -0
- package/dist/codecs/index.js.map +1 -0
- package/dist/coercion/boolean.d.ts.map +1 -1
- package/dist/coercion/boolean.js +6 -2
- package/dist/coercion/boolean.js.map +1 -1
- package/dist/coercion/string.d.ts.map +1 -1
- package/dist/coercion/string.js +146 -10
- package/dist/coercion/string.js.map +1 -1
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -1
- package/dist/index.js.map +1 -1
- package/dist/locales/af.d.ts.map +1 -1
- package/dist/locales/af.js +15 -1
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.d.ts.map +1 -1
- package/dist/locales/ar.js +15 -1
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/bn.d.ts.map +1 -1
- package/dist/locales/bn.js +15 -1
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.d.ts.map +1 -1
- package/dist/locales/da.js +15 -1
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.d.ts.map +1 -1
- package/dist/locales/de.js +15 -1
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/en.js +15 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.d.ts.map +1 -1
- package/dist/locales/es-MX.js +15 -1
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.d.ts.map +1 -1
- package/dist/locales/es.js +15 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.d.ts.map +1 -1
- package/dist/locales/fi.js +15 -1
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.d.ts.map +1 -1
- package/dist/locales/fr.js +15 -1
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.d.ts.map +1 -1
- package/dist/locales/hi.js +15 -1
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.d.ts.map +1 -1
- package/dist/locales/id.js +15 -1
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/it.d.ts.map +1 -1
- package/dist/locales/it.js +15 -1
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.d.ts.map +1 -1
- package/dist/locales/ja.js +15 -1
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.d.ts.map +1 -1
- package/dist/locales/ko.js +15 -1
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/nl.d.ts.map +1 -1
- package/dist/locales/nl.js +15 -1
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.d.ts.map +1 -1
- package/dist/locales/no.js +15 -1
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.d.ts.map +1 -1
- package/dist/locales/pl.js +15 -1
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/locales/pt-BR.js +15 -1
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.d.ts.map +1 -1
- package/dist/locales/pt.js +15 -1
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.d.ts.map +1 -1
- package/dist/locales/ru.js +15 -1
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.d.ts.map +1 -1
- package/dist/locales/sv.js +15 -1
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.d.ts.map +1 -1
- package/dist/locales/sw.js +15 -1
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.d.ts.map +1 -1
- package/dist/locales/th.js +15 -1
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.d.ts.map +1 -1
- package/dist/locales/tr.js +15 -1
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/types.d.ts +10 -0
- package/dist/locales/types.d.ts.map +1 -1
- package/dist/locales/types.js.map +1 -1
- package/dist/locales/vi.d.ts.map +1 -1
- package/dist/locales/vi.js +15 -1
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.d.ts.map +1 -1
- package/dist/locales/zh.js +15 -1
- package/dist/locales/zh.js.map +1 -1
- package/dist/utils/codec-utils.d.ts +44 -0
- package/dist/utils/codec-utils.d.ts.map +1 -0
- package/dist/utils/codec-utils.js +205 -0
- package/dist/utils/codec-utils.js.map +1 -0
- package/dist/utils/deep-merge.d.ts +1 -0
- package/dist/utils/deep-merge.d.ts.map +1 -1
- package/dist/utils/deep-merge.js +33 -8
- package/dist/utils/deep-merge.js.map +1 -1
- package/dist/validators/array.d.ts +5 -0
- package/dist/validators/array.d.ts.map +1 -1
- package/dist/validators/array.js +30 -1
- package/dist/validators/array.js.map +1 -1
- package/dist/validators/base64.d.ts +18 -0
- package/dist/validators/base64.d.ts.map +1 -0
- package/dist/validators/base64.js +65 -0
- package/dist/validators/base64.js.map +1 -0
- package/dist/validators/codec.d.ts +55 -0
- package/dist/validators/codec.d.ts.map +1 -0
- package/dist/validators/codec.js +182 -0
- package/dist/validators/codec.js.map +1 -0
- package/dist/validators/date.d.ts +5 -1
- package/dist/validators/date.d.ts.map +1 -1
- package/dist/validators/date.js +53 -29
- package/dist/validators/date.js.map +1 -1
- package/dist/validators/hex.d.ts +17 -0
- package/dist/validators/hex.d.ts.map +1 -0
- package/dist/validators/hex.js +61 -0
- package/dist/validators/hex.js.map +1 -0
- package/dist/validators/number.d.ts.map +1 -1
- package/dist/validators/number.js +16 -3
- package/dist/validators/number.js.map +1 -1
- package/dist/validators/object.d.ts +5 -0
- package/dist/validators/object.d.ts.map +1 -1
- package/dist/validators/object.js +58 -6
- package/dist/validators/object.js.map +1 -1
- package/dist/validators/record.d.ts.map +1 -1
- package/dist/validators/record.js +6 -0
- package/dist/validators/record.js.map +1 -1
- package/dist/validators/string.d.ts.map +1 -1
- package/dist/validators/string.js +86 -4
- package/dist/validators/string.js.map +1 -1
- package/dist/validators/uint8array.d.ts +25 -0
- package/dist/validators/uint8array.d.ts.map +1 -0
- package/dist/validators/uint8array.js +87 -0
- package/dist/validators/uint8array.js.map +1 -0
- package/dist/validators/union.d.ts +1 -0
- package/dist/validators/union.d.ts.map +1 -1
- package/dist/validators/union.js +31 -20
- package/dist/validators/union.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { VldError, createIssue } from '../errors.js';
|
|
3
|
+
import { getMessages } from '../locales.js';
|
|
4
|
+
/**
|
|
5
|
+
* Codec validator for bidirectional transformations
|
|
6
|
+
* Enables converting between different data representations
|
|
7
|
+
*/
|
|
8
|
+
export class VldCodec extends VldBase {
|
|
9
|
+
constructor(inputValidator, outputValidator, codecTransform) {
|
|
10
|
+
super();
|
|
11
|
+
this.inputValidator = inputValidator;
|
|
12
|
+
this.outputValidator = outputValidator;
|
|
13
|
+
this.codecTransform = codecTransform;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse (decode) a value from input to output format
|
|
17
|
+
*/
|
|
18
|
+
parse(value) {
|
|
19
|
+
const result = this.safeParse(value);
|
|
20
|
+
if (!result.success) {
|
|
21
|
+
throw result.error;
|
|
22
|
+
}
|
|
23
|
+
return result.data;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Safely parse (decode) a value from input to output format
|
|
27
|
+
*/
|
|
28
|
+
safeParse(value) {
|
|
29
|
+
// First validate the input
|
|
30
|
+
const inputResult = this.inputValidator.safeParse(value);
|
|
31
|
+
if (!inputResult.success) {
|
|
32
|
+
return inputResult;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
// Then decode to output
|
|
36
|
+
const decoded = this.codecTransform.decode(inputResult.data);
|
|
37
|
+
// Handle async decode
|
|
38
|
+
if (decoded instanceof Promise) {
|
|
39
|
+
throw new VldError([
|
|
40
|
+
createIssue('custom', [], getMessages().codecAsyncNotSupported)
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
// Validate the decoded output
|
|
44
|
+
return this.outputValidator.safeParse(decoded);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (error instanceof VldError) {
|
|
48
|
+
return { success: false, error };
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
error: new VldError([
|
|
53
|
+
createIssue('custom', [], getMessages().codecDecodeFailed)
|
|
54
|
+
])
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Encode a value from output back to input format
|
|
60
|
+
*/
|
|
61
|
+
encode(value) {
|
|
62
|
+
const result = this.safeEncode(value);
|
|
63
|
+
if (!result.success) {
|
|
64
|
+
throw result.error;
|
|
65
|
+
}
|
|
66
|
+
return result.data;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Safely encode a value from output back to input format
|
|
70
|
+
*/
|
|
71
|
+
safeEncode(value) {
|
|
72
|
+
// First validate the output
|
|
73
|
+
const outputResult = this.outputValidator.safeParse(value);
|
|
74
|
+
if (!outputResult.success) {
|
|
75
|
+
return outputResult;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
// Then encode to input
|
|
79
|
+
const encoded = this.codecTransform.encode(outputResult.data);
|
|
80
|
+
// Handle async encode
|
|
81
|
+
if (encoded instanceof Promise) {
|
|
82
|
+
throw new VldError([
|
|
83
|
+
createIssue('custom', [], getMessages().codecAsyncNotSupported)
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
// Validate the encoded input
|
|
87
|
+
return this.inputValidator.safeParse(encoded);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (error instanceof VldError) {
|
|
91
|
+
return { success: false, error };
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
error: new VldError([
|
|
96
|
+
createIssue('custom', [], getMessages().codecEncodeFailed)
|
|
97
|
+
])
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Async version of parse (decode)
|
|
103
|
+
*/
|
|
104
|
+
async parseAsync(value) {
|
|
105
|
+
const result = await this.safeParseAsync(value);
|
|
106
|
+
if (!result.success) {
|
|
107
|
+
throw result.error;
|
|
108
|
+
}
|
|
109
|
+
return result.data;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Async version of safeParse (decode)
|
|
113
|
+
*/
|
|
114
|
+
async safeParseAsync(value) {
|
|
115
|
+
// First validate the input
|
|
116
|
+
const inputResult = this.inputValidator.safeParse(value);
|
|
117
|
+
if (!inputResult.success) {
|
|
118
|
+
return inputResult;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
// Then decode to output (supports async)
|
|
122
|
+
const decoded = await this.codecTransform.decode(inputResult.data);
|
|
123
|
+
// Validate the decoded output
|
|
124
|
+
return this.outputValidator.safeParse(decoded);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (error instanceof VldError) {
|
|
128
|
+
return { success: false, error };
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
success: false,
|
|
132
|
+
error: new VldError([
|
|
133
|
+
createIssue('custom', [], getMessages().codecDecodeFailed)
|
|
134
|
+
])
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Async version of encode
|
|
140
|
+
*/
|
|
141
|
+
async encodeAsync(value) {
|
|
142
|
+
const result = await this.safeEncodeAsync(value);
|
|
143
|
+
if (!result.success) {
|
|
144
|
+
throw result.error;
|
|
145
|
+
}
|
|
146
|
+
return result.data;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Async version of safeEncode
|
|
150
|
+
*/
|
|
151
|
+
async safeEncodeAsync(value) {
|
|
152
|
+
// First validate the output
|
|
153
|
+
const outputResult = this.outputValidator.safeParse(value);
|
|
154
|
+
if (!outputResult.success) {
|
|
155
|
+
return outputResult;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
// Then encode to input (supports async)
|
|
159
|
+
const encoded = await this.codecTransform.encode(outputResult.data);
|
|
160
|
+
// Validate the encoded input
|
|
161
|
+
return this.inputValidator.safeParse(encoded);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
if (error instanceof VldError) {
|
|
165
|
+
return { success: false, error };
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
error: new VldError([
|
|
170
|
+
createIssue('custom', [], getMessages().codecEncodeFailed)
|
|
171
|
+
])
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Create a codec validator
|
|
177
|
+
*/
|
|
178
|
+
static create(inputValidator, outputValidator, codecTransform) {
|
|
179
|
+
return new VldCodec(inputValidator, outputValidator, codecTransform);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/validators/codec.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { VldError, createIssue } from '../errors';\nimport { getMessages } from '../locales';\n\n/**\n * Codec transform functions for bidirectional transformations\n */\nexport interface CodecTransform<TInput, TOutput> {\n decode: (value: TInput) => TOutput | Promise<TOutput>;\n encode: (value: TOutput) => TInput | Promise<TInput>;\n}\n\n/**\n * Codec validator for bidirectional transformations\n * Enables converting between different data representations\n */\nexport class VldCodec<TInput, TOutput> extends VldBase<TInput, TOutput> {\n private readonly inputValidator: VldBase<unknown, TInput>;\n private readonly outputValidator: VldBase<unknown, TOutput>;\n private readonly codecTransform: CodecTransform<TInput, TOutput>;\n \n constructor(\n inputValidator: VldBase<unknown, TInput>,\n outputValidator: VldBase<unknown, TOutput>,\n codecTransform: CodecTransform<TInput, TOutput>\n ) {\n super();\n this.inputValidator = inputValidator;\n this.outputValidator = outputValidator;\n this.codecTransform = codecTransform;\n }\n \n /**\n * Parse (decode) a value from input to output format\n */\n parse(value: unknown): TOutput {\n const result = this.safeParse(value);\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n }\n \n /**\n * Safely parse (decode) a value from input to output format\n */\n safeParse(value: unknown): ParseResult<TOutput> {\n // First validate the input\n const inputResult = this.inputValidator.safeParse(value);\n if (!inputResult.success) {\n return inputResult as ParseResult<TOutput>;\n }\n \n try {\n // Then decode to output\n const decoded = this.codecTransform.decode(inputResult.data);\n \n // Handle async decode\n if (decoded instanceof Promise) {\n throw new VldError([\n createIssue('custom', [], getMessages().codecAsyncNotSupported)\n ]);\n }\n \n // Validate the decoded output\n return this.outputValidator.safeParse(decoded);\n } catch (error) {\n if (error instanceof VldError) {\n return { success: false, error };\n }\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().codecDecodeFailed)\n ])\n };\n }\n }\n \n /**\n * Encode a value from output back to input format\n */\n encode(value: unknown): TInput {\n const result = this.safeEncode(value);\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n }\n \n /**\n * Safely encode a value from output back to input format\n */\n safeEncode(value: unknown): ParseResult<TInput> {\n // First validate the output\n const outputResult = this.outputValidator.safeParse(value);\n if (!outputResult.success) {\n return outputResult as ParseResult<TInput>;\n }\n \n try {\n // Then encode to input\n const encoded = this.codecTransform.encode(outputResult.data);\n \n // Handle async encode\n if (encoded instanceof Promise) {\n throw new VldError([\n createIssue('custom', [], getMessages().codecAsyncNotSupported)\n ]);\n }\n \n // Validate the encoded input\n return this.inputValidator.safeParse(encoded);\n } catch (error) {\n if (error instanceof VldError) {\n return { success: false, error };\n }\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().codecEncodeFailed)\n ])\n };\n }\n }\n \n /**\n * Async version of parse (decode)\n */\n async parseAsync(value: unknown): Promise<TOutput> {\n const result = await this.safeParseAsync(value);\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n }\n \n /**\n * Async version of safeParse (decode)\n */\n async safeParseAsync(value: unknown): Promise<ParseResult<TOutput>> {\n // First validate the input\n const inputResult = this.inputValidator.safeParse(value);\n if (!inputResult.success) {\n return inputResult as ParseResult<TOutput>;\n }\n \n try {\n // Then decode to output (supports async)\n const decoded = await this.codecTransform.decode(inputResult.data);\n \n // Validate the decoded output\n return this.outputValidator.safeParse(decoded);\n } catch (error) {\n if (error instanceof VldError) {\n return { success: false, error };\n }\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().codecDecodeFailed)\n ])\n };\n }\n }\n \n /**\n * Async version of encode\n */\n async encodeAsync(value: unknown): Promise<TInput> {\n const result = await this.safeEncodeAsync(value);\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n }\n \n /**\n * Async version of safeEncode\n */\n async safeEncodeAsync(value: unknown): Promise<ParseResult<TInput>> {\n // First validate the output\n const outputResult = this.outputValidator.safeParse(value);\n if (!outputResult.success) {\n return outputResult as ParseResult<TInput>;\n }\n \n try {\n // Then encode to input (supports async)\n const encoded = await this.codecTransform.encode(outputResult.data);\n \n // Validate the encoded input\n return this.inputValidator.safeParse(encoded);\n } catch (error) {\n if (error instanceof VldError) {\n return { success: false, error };\n }\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().codecEncodeFailed)\n ])\n };\n }\n }\n \n /**\n * Create a codec validator\n */\n static create<TInput, TOutput>(\n inputValidator: VldBase<unknown, TInput>,\n outputValidator: VldBase<unknown, TOutput>,\n codecTransform: CodecTransform<TInput, TOutput>\n ): VldCodec<TInput, TOutput> {\n return new VldCodec(inputValidator, outputValidator, codecTransform);\n }\n}"]}
|
|
@@ -2,7 +2,11 @@ import { VldBase, ParseResult } from './base';
|
|
|
2
2
|
/**
|
|
3
3
|
* Type for date validation check functions
|
|
4
4
|
*/
|
|
5
|
-
type
|
|
5
|
+
type DateCheckFn = (value: Date) => boolean;
|
|
6
|
+
interface DateCheck {
|
|
7
|
+
fn: DateCheckFn;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
6
10
|
/**
|
|
7
11
|
* Configuration for date validator
|
|
8
12
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/validators/date.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,KAAK,
|
|
1
|
+
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/validators/date.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC;AAE5C,UAAU,SAAS;IACjB,EAAE,EAAE,WAAW,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,OAAQ,SAAQ,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAE7C;;OAEG;IACH,SAAS,aAAa,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAQ3D;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,OAAO;IAIxB;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IA0B3B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;IAQ5C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAW5D;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAW5D;;OAEG;IACH,OAAO,CACL,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC3B,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC3B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO;IAYV;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAU/B;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAUjC;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAehC;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAalC;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;CAYnC"}
|
package/dist/validators/date.js
CHANGED
|
@@ -40,8 +40,8 @@ export class VldDate extends VldBase {
|
|
|
40
40
|
}
|
|
41
41
|
// Apply all checks
|
|
42
42
|
for (const check of this.config.checks) {
|
|
43
|
-
if (!check(date)) {
|
|
44
|
-
throw new Error(
|
|
43
|
+
if (!check.fn(date)) {
|
|
44
|
+
throw new Error(check.message);
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
return date;
|
|
@@ -63,8 +63,11 @@ export class VldDate extends VldBase {
|
|
|
63
63
|
min(date, message) {
|
|
64
64
|
const minDate = date instanceof Date ? date : new Date(date);
|
|
65
65
|
return new VldDate({
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
...this.config,
|
|
67
|
+
checks: [...this.config.checks, {
|
|
68
|
+
fn: (v) => v >= minDate,
|
|
69
|
+
message: message || getMessages().dateMin(minDate)
|
|
70
|
+
}]
|
|
68
71
|
});
|
|
69
72
|
}
|
|
70
73
|
/**
|
|
@@ -73,8 +76,11 @@ export class VldDate extends VldBase {
|
|
|
73
76
|
max(date, message) {
|
|
74
77
|
const maxDate = date instanceof Date ? date : new Date(date);
|
|
75
78
|
return new VldDate({
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
...this.config,
|
|
80
|
+
checks: [...this.config.checks, {
|
|
81
|
+
fn: (v) => v <= maxDate,
|
|
82
|
+
message: message || getMessages().dateMax(maxDate)
|
|
83
|
+
}]
|
|
78
84
|
});
|
|
79
85
|
}
|
|
80
86
|
/**
|
|
@@ -84,8 +90,11 @@ export class VldDate extends VldBase {
|
|
|
84
90
|
const minDate = min instanceof Date ? min : new Date(min);
|
|
85
91
|
const maxDate = max instanceof Date ? max : new Date(max);
|
|
86
92
|
return new VldDate({
|
|
87
|
-
|
|
88
|
-
|
|
93
|
+
...this.config,
|
|
94
|
+
checks: [...this.config.checks, {
|
|
95
|
+
fn: (v) => v >= minDate && v <= maxDate,
|
|
96
|
+
message: message || `Date must be between ${minDate.toISOString()} and ${maxDate.toISOString()}`
|
|
97
|
+
}]
|
|
89
98
|
});
|
|
90
99
|
}
|
|
91
100
|
/**
|
|
@@ -93,8 +102,11 @@ export class VldDate extends VldBase {
|
|
|
93
102
|
*/
|
|
94
103
|
past(message) {
|
|
95
104
|
return new VldDate({
|
|
96
|
-
|
|
97
|
-
|
|
105
|
+
...this.config,
|
|
106
|
+
checks: [...this.config.checks, {
|
|
107
|
+
fn: (v) => v < new Date(),
|
|
108
|
+
message: message || 'Date must be in the past'
|
|
109
|
+
}]
|
|
98
110
|
});
|
|
99
111
|
}
|
|
100
112
|
/**
|
|
@@ -102,8 +114,11 @@ export class VldDate extends VldBase {
|
|
|
102
114
|
*/
|
|
103
115
|
future(message) {
|
|
104
116
|
return new VldDate({
|
|
105
|
-
|
|
106
|
-
|
|
117
|
+
...this.config,
|
|
118
|
+
checks: [...this.config.checks, {
|
|
119
|
+
fn: (v) => v > new Date(),
|
|
120
|
+
message: message || 'Date must be in the future'
|
|
121
|
+
}]
|
|
107
122
|
});
|
|
108
123
|
}
|
|
109
124
|
/**
|
|
@@ -111,13 +126,16 @@ export class VldDate extends VldBase {
|
|
|
111
126
|
*/
|
|
112
127
|
today(message) {
|
|
113
128
|
return new VldDate({
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
v.
|
|
119
|
-
|
|
120
|
-
|
|
129
|
+
...this.config,
|
|
130
|
+
checks: [...this.config.checks, {
|
|
131
|
+
fn: (v) => {
|
|
132
|
+
const today = new Date();
|
|
133
|
+
return v.getFullYear() === today.getFullYear() &&
|
|
134
|
+
v.getMonth() === today.getMonth() &&
|
|
135
|
+
v.getDate() === today.getDate();
|
|
136
|
+
},
|
|
137
|
+
message: message || 'Date must be today'
|
|
138
|
+
}]
|
|
121
139
|
});
|
|
122
140
|
}
|
|
123
141
|
/**
|
|
@@ -125,11 +143,14 @@ export class VldDate extends VldBase {
|
|
|
125
143
|
*/
|
|
126
144
|
weekday(message) {
|
|
127
145
|
return new VldDate({
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
146
|
+
...this.config,
|
|
147
|
+
checks: [...this.config.checks, {
|
|
148
|
+
fn: (v) => {
|
|
149
|
+
const day = v.getDay();
|
|
150
|
+
return day >= 1 && day <= 5;
|
|
151
|
+
},
|
|
152
|
+
message: message || 'Date must be a weekday'
|
|
153
|
+
}]
|
|
133
154
|
});
|
|
134
155
|
}
|
|
135
156
|
/**
|
|
@@ -137,11 +158,14 @@ export class VldDate extends VldBase {
|
|
|
137
158
|
*/
|
|
138
159
|
weekend(message) {
|
|
139
160
|
return new VldDate({
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
161
|
+
...this.config,
|
|
162
|
+
checks: [...this.config.checks, {
|
|
163
|
+
fn: (v) => {
|
|
164
|
+
const day = v.getDay();
|
|
165
|
+
return day === 0 || day === 6;
|
|
166
|
+
},
|
|
167
|
+
message: message || 'Date must be a weekend'
|
|
168
|
+
}]
|
|
145
169
|
});
|
|
146
170
|
}
|
|
147
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/validators/date.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Type for date validation check functions\n */\ntype DateCheck = (value: Date) => boolean;\n\n/**\n * Configuration for date validator\n */\ninterface DateValidatorConfig {\n readonly checks: ReadonlyArray<DateCheck>;\n readonly errorMessage?: string;\n}\n\n/**\n * Immutable date validator with chainable methods\n */\nexport class VldDate extends VldBase<Date, Date> {\n private readonly config: DateValidatorConfig;\n \n /**\n * Protected constructor to allow extension while maintaining immutability\n */\n protected constructor(config?: Partial<DateValidatorConfig>) {\n super();\n this.config = {\n checks: config?.checks || [],\n errorMessage: config?.errorMessage\n };\n }\n \n /**\n * Create a new date validator\n */\n static create(): VldDate {\n return new VldDate();\n }\n \n /**\n * Parse and validate a date value\n */\n parse(value: unknown): Date {\n let date: Date;\n \n if (value instanceof Date) {\n date = value;\n } else if (typeof value === 'string' || typeof value === 'number') {\n date = new Date(value);\n } else {\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\n }\n \n // Check if the date is valid\n if (isNaN(date.getTime())) {\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\n }\n \n // Apply all checks\n for (const check of this.config.checks) {\n if (!check(date)) {\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\n }\n }\n \n return date;\n }\n \n /**\n * Safely parse and validate a date value\n */\n safeParse(value: unknown): ParseResult<Date> {\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 date constraint\n */\n min(date: Date | string | number, message?: string): VldDate {\n const minDate = date instanceof Date ? date : new Date(date);\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v >= minDate],\n errorMessage: message || getMessages().dateMin(minDate)\n });\n }\n \n /**\n * Create a new validator with maximum date constraint\n */\n max(date: Date | string | number, message?: string): VldDate {\n const maxDate = date instanceof Date ? date : new Date(date);\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v <= maxDate],\n errorMessage: message || getMessages().dateMax(maxDate)\n });\n }\n \n /**\n * Create a new validator with a range constraint\n */\n between(\n min: Date | string | number,\n max: Date | string | number,\n message?: string\n ): VldDate {\n const minDate = min instanceof Date ? min : new Date(min);\n const maxDate = max instanceof Date ? max : new Date(max);\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v >= minDate && v <= maxDate],\n errorMessage: message || `Date must be between ${minDate.toISOString()} and ${maxDate.toISOString()}`\n });\n }\n \n /**\n * Create a new validator that checks if date is in the past\n */\n past(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v < new Date()],\n errorMessage: message || 'Date must be in the past'\n });\n }\n \n /**\n * Create a new validator that checks if date is in the future\n */\n future(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v > new Date()],\n errorMessage: message || 'Date must be in the future'\n });\n }\n \n /**\n * Create a new validator that checks if date is today\n */\n today(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => {\n const today = new Date();\n return v.getFullYear() === today.getFullYear() &&\n v.getMonth() === today.getMonth() &&\n v.getDate() === today.getDate();\n }],\n errorMessage: message || 'Date must be today'\n });\n }\n \n /**\n * Create a new validator that checks if date is a weekday\n */\n weekday(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => {\n const day = v.getDay();\n return day >= 1 && day <= 5;\n }],\n errorMessage: message || 'Date must be a weekday'\n });\n }\n \n /**\n * Create a new validator that checks if date is a weekend\n */\n weekend(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => {\n const day = v.getDay();\n return day === 0 || day === 6;\n }],\n errorMessage: message || 'Date must be a weekend'\n });\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/validators/date.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Type for date validation check functions\r\n */\r\ntype DateCheckFn = (value: Date) => boolean;\r\n\r\ninterface DateCheck {\r\n fn: DateCheckFn;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Configuration for date validator\r\n */\r\ninterface DateValidatorConfig {\r\n readonly checks: ReadonlyArray<DateCheck>;\r\n readonly errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Immutable date validator with chainable methods\r\n */\r\nexport class VldDate extends VldBase<Date, Date> {\r\n private readonly config: DateValidatorConfig;\r\n\r\n /**\r\n * Protected constructor to allow extension while maintaining immutability\r\n */\r\n protected constructor(config?: Partial<DateValidatorConfig>) {\r\n super();\r\n this.config = {\r\n checks: config?.checks || [],\r\n errorMessage: config?.errorMessage\r\n };\r\n }\r\n\r\n /**\r\n * Create a new date validator\r\n */\r\n static create(): VldDate {\r\n return new VldDate();\r\n }\r\n\r\n /**\r\n * Parse and validate a date value\r\n */\r\n parse(value: unknown): Date {\r\n let date: Date;\r\n\r\n if (value instanceof Date) {\r\n date = value;\r\n } else if (typeof value === 'string' || typeof value === 'number') {\r\n date = new Date(value);\r\n } else {\r\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\r\n }\r\n\r\n // Check if the date is valid\r\n if (isNaN(date.getTime())) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\r\n }\r\n\r\n // Apply all checks\r\n for (const check of this.config.checks) {\r\n if (!check.fn(date)) {\r\n throw new Error(check.message);\r\n }\r\n }\r\n\r\n return date;\r\n }\r\n\r\n /**\r\n * Safely parse and validate a date value\r\n */\r\n safeParse(value: unknown): ParseResult<Date> {\r\n try {\r\n return { success: true, data: this.parse(value) };\r\n } catch (error) {\r\n return { success: false, error: error as Error };\r\n }\r\n }\r\n\r\n /**\r\n * Create a new validator with minimum date constraint\r\n */\r\n min(date: Date | string | number, message?: string): VldDate {\r\n const minDate = date instanceof Date ? date : new Date(date);\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v >= minDate,\r\n message: message || getMessages().dateMin(minDate)\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with maximum date constraint\r\n */\r\n max(date: Date | string | number, message?: string): VldDate {\r\n const maxDate = date instanceof Date ? date : new Date(date);\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v <= maxDate,\r\n message: message || getMessages().dateMax(maxDate)\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with a range constraint\r\n */\r\n between(\r\n min: Date | string | number,\r\n max: Date | string | number,\r\n message?: string\r\n ): VldDate {\r\n const minDate = min instanceof Date ? min : new Date(min);\r\n const maxDate = max instanceof Date ? max : new Date(max);\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v >= minDate && v <= maxDate,\r\n message: message || `Date must be between ${minDate.toISOString()} and ${maxDate.toISOString()}`\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is in the past\r\n */\r\n past(message?: string): VldDate {\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v < new Date(),\r\n message: message || 'Date must be in the past'\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is in the future\r\n */\r\n future(message?: string): VldDate {\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v > new Date(),\r\n message: message || 'Date must be in the future'\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is today\r\n */\r\n today(message?: string): VldDate {\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => {\r\n const today = new Date();\r\n return v.getFullYear() === today.getFullYear() &&\r\n v.getMonth() === today.getMonth() &&\r\n v.getDate() === today.getDate();\r\n },\r\n message: message || 'Date must be today'\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is a weekday\r\n */\r\n weekday(message?: string): VldDate {\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => {\r\n const day = v.getDay();\r\n return day >= 1 && day <= 5;\r\n },\r\n message: message || 'Date must be a weekday'\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is a weekend\r\n */\r\n weekend(message?: string): VldDate {\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => {\r\n const day = v.getDay();\r\n return day === 0 || day === 6;\r\n },\r\n message: message || 'Date must be a weekend'\r\n }]\r\n });\r\n }\r\n}"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Hexadecimal string validator
|
|
4
|
+
*/
|
|
5
|
+
export declare class VldHex extends VldBase<string, string> {
|
|
6
|
+
private static readonly HEX_REGEX;
|
|
7
|
+
private readonly lowercase;
|
|
8
|
+
constructor(lowercase?: boolean);
|
|
9
|
+
parse(value: unknown): string;
|
|
10
|
+
safeParse(value: unknown): ParseResult<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Require lowercase hex characters
|
|
13
|
+
*/
|
|
14
|
+
lowercaseMode(): VldHex;
|
|
15
|
+
static create(lowercase?: boolean): VldHex;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=hex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../src/validators/hex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI9C;;GAEG;AACH,qBAAa,MAAO,SAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;IACjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAErD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAExB,SAAS,UAAQ;IAK7B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAQ7B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;IAoC9C;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB,MAAM,CAAC,MAAM,CAAC,SAAS,UAAQ,GAAG,MAAM;CAGzC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { VldError, createIssue } from '../errors.js';
|
|
3
|
+
import { getMessages } from '../locales.js';
|
|
4
|
+
/**
|
|
5
|
+
* Hexadecimal string validator
|
|
6
|
+
*/
|
|
7
|
+
export class VldHex extends VldBase {
|
|
8
|
+
constructor(lowercase = false) {
|
|
9
|
+
super();
|
|
10
|
+
this.lowercase = lowercase;
|
|
11
|
+
}
|
|
12
|
+
parse(value) {
|
|
13
|
+
const result = this.safeParse(value);
|
|
14
|
+
if (!result.success) {
|
|
15
|
+
throw result.error;
|
|
16
|
+
}
|
|
17
|
+
return result.data;
|
|
18
|
+
}
|
|
19
|
+
safeParse(value) {
|
|
20
|
+
if (typeof value !== 'string') {
|
|
21
|
+
return {
|
|
22
|
+
success: false,
|
|
23
|
+
error: new VldError([
|
|
24
|
+
createIssue('invalid_type', [], getMessages().expectedString)
|
|
25
|
+
])
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Check if it's a valid hex string
|
|
29
|
+
if (!VldHex.HEX_REGEX.test(value)) {
|
|
30
|
+
return {
|
|
31
|
+
success: false,
|
|
32
|
+
error: new VldError([
|
|
33
|
+
createIssue('custom', [], getMessages().invalidHex)
|
|
34
|
+
])
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Check if even length (full bytes)
|
|
38
|
+
if (value.length % 2 !== 0) {
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
error: new VldError([
|
|
42
|
+
createIssue('custom', [], getMessages().invalidHex)
|
|
43
|
+
])
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Normalize case if required
|
|
47
|
+
const normalizedValue = this.lowercase ? value.toLowerCase() : value;
|
|
48
|
+
return { success: true, data: normalizedValue };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Require lowercase hex characters
|
|
52
|
+
*/
|
|
53
|
+
lowercaseMode() {
|
|
54
|
+
return new VldHex(true);
|
|
55
|
+
}
|
|
56
|
+
static create(lowercase = false) {
|
|
57
|
+
return new VldHex(lowercase);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
VldHex.HEX_REGEX = /^[0-9a-fA-F]+$/;
|
|
61
|
+
//# sourceMappingURL=hex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.js","sourceRoot":"","sources":["../../src/validators/hex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,MAAO,SAAQ,OAAuB;IAKjD,YAAY,SAAS,GAAG,KAAK;QAC3B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,MAAM,CAAC,KAAK,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,QAAQ,CAAC;oBAClB,WAAW,CAAC,cAAc,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC;iBAC9D,CAAC;aACH,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,QAAQ,CAAC;oBAClB,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC;iBACpD,CAAC;aACH,CAAC;QACJ,CAAC;QAED,oCAAoC;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,QAAQ,CAAC;oBAClB,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC;iBACpD,CAAC;aACH,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAErE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK;QAC7B,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;;AA9DuB,gBAAS,GAAG,gBAAgB,CAAC","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { VldError, createIssue } from '../errors';\nimport { getMessages } from '../locales';\n\n/**\n * Hexadecimal string validator\n */\nexport class VldHex extends VldBase<string, string> {\n private static readonly HEX_REGEX = /^[0-9a-fA-F]+$/;\n \n private readonly lowercase: boolean;\n \n constructor(lowercase = false) {\n super();\n this.lowercase = lowercase;\n }\n \n parse(value: unknown): string {\n const result = this.safeParse(value);\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n }\n \n safeParse(value: unknown): ParseResult<string> {\n if (typeof value !== 'string') {\n return {\n success: false,\n error: new VldError([\n createIssue('invalid_type', [], getMessages().expectedString)\n ])\n };\n }\n \n // Check if it's a valid hex string\n if (!VldHex.HEX_REGEX.test(value)) {\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().invalidHex)\n ])\n };\n }\n \n // Check if even length (full bytes)\n if (value.length % 2 !== 0) {\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().invalidHex)\n ])\n };\n }\n \n // Normalize case if required\n const normalizedValue = this.lowercase ? value.toLowerCase() : value;\n \n return { success: true, data: normalizedValue };\n }\n \n /**\n * Require lowercase hex characters\n */\n lowercaseMode(): VldHex {\n return new VldHex(true);\n }\n \n static create(lowercase = false): VldHex {\n return new VldHex(lowercase);\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/validators/number.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,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOhC;;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;IAOxC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOnC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOjC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/validators/number.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,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOhC;;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;IAOxC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOnC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOjC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAWtD;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAIhD;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO9D;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAWjC;;OAEG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;CAWjC"}
|
|
@@ -132,7 +132,11 @@ export class VldNumber extends VldBase {
|
|
|
132
132
|
*/
|
|
133
133
|
multipleOf(value, message) {
|
|
134
134
|
return new VldNumber({
|
|
135
|
-
checks: [...this.config.checks, (v) =>
|
|
135
|
+
checks: [...this.config.checks, (v) => {
|
|
136
|
+
// Use epsilon comparison for floating point precision
|
|
137
|
+
const remainder = Math.abs(v % value);
|
|
138
|
+
return remainder < Number.EPSILON || Math.abs(remainder - Math.abs(value)) < Number.EPSILON;
|
|
139
|
+
}],
|
|
136
140
|
errorMessage: message || getMessages().numberMultipleOf(value)
|
|
137
141
|
});
|
|
138
142
|
}
|
|
@@ -156,7 +160,11 @@ export class VldNumber extends VldBase {
|
|
|
156
160
|
*/
|
|
157
161
|
even(message) {
|
|
158
162
|
return new VldNumber({
|
|
159
|
-
checks: [...this.config.checks, (v) =>
|
|
163
|
+
checks: [...this.config.checks, (v) => {
|
|
164
|
+
// Use epsilon comparison for floating point precision
|
|
165
|
+
const remainder = Math.abs(v % 2);
|
|
166
|
+
return remainder < Number.EPSILON || Math.abs(remainder - 2) < Number.EPSILON;
|
|
167
|
+
}],
|
|
160
168
|
errorMessage: message || 'Number must be even'
|
|
161
169
|
});
|
|
162
170
|
}
|
|
@@ -165,7 +173,12 @@ export class VldNumber extends VldBase {
|
|
|
165
173
|
*/
|
|
166
174
|
odd(message) {
|
|
167
175
|
return new VldNumber({
|
|
168
|
-
checks: [...this.config.checks, (v) =>
|
|
176
|
+
checks: [...this.config.checks, (v) => {
|
|
177
|
+
// Use epsilon comparison for floating point precision
|
|
178
|
+
const remainder = Math.abs(v % 2);
|
|
179
|
+
const isEven = remainder < Number.EPSILON || Math.abs(remainder - 2) < Number.EPSILON;
|
|
180
|
+
return !isEven;
|
|
181
|
+
}],
|
|
169
182
|
errorMessage: message || 'Number must be odd'
|
|
170
183
|
});
|
|
171
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/validators/number.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Type for number validation check functions\n */\ntype NumberCheck = (value: number) => boolean;\n\n/**\n * Configuration for number validator\n */\ninterface NumberValidatorConfig {\n readonly checks: ReadonlyArray<NumberCheck>;\n readonly errorMessage?: string;\n}\n\n/**\n * Immutable number validator with chainable methods\n */\nexport class VldNumber extends VldBase<number, number> {\n protected readonly config: NumberValidatorConfig;\n \n /**\n * Protected constructor to allow extension while maintaining immutability\n */\n protected constructor(config?: Partial<NumberValidatorConfig>) {\n super();\n this.config = {\n checks: config?.checks || [],\n errorMessage: config?.errorMessage\n };\n }\n \n /**\n * Create a new number validator\n */\n static create(): VldNumber {\n return new VldNumber();\n }\n \n /**\n * Parse and validate a number value\n */\n parse(value: unknown): number {\n if (typeof value !== 'number' || isNaN(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidNumber);\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().invalidNumber);\n }\n }\n \n return value;\n }\n \n /**\n * Safely parse and validate a number value\n */\n safeParse(value: unknown): ParseResult<number> {\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: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v >= value],\n errorMessage: message || getMessages().numberMin(value)\n });\n }\n \n /**\n * Create a new validator with maximum value constraint\n */\n max(value: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v <= value],\n errorMessage: message || getMessages().numberMax(value)\n });\n }\n \n /**\n * Create a new validator that checks for integer values\n */\n int(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => Number.isInteger(v)],\n errorMessage: message || getMessages().numberInt\n });\n }\n \n /**\n * Create a new validator that checks for positive values\n */\n positive(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v > 0],\n errorMessage: message || getMessages().numberPositive\n });\n }\n \n /**\n * Create a new validator that checks for negative values\n */\n negative(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v < 0],\n errorMessage: message || getMessages().numberNegative\n });\n }\n \n /**\n * Create a new validator that checks for non-negative values\n */\n nonnegative(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v >= 0],\n errorMessage: message || getMessages().numberNonnegative\n });\n }\n \n /**\n * Create a new validator that checks for non-positive values\n */\n nonpositive(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v <= 0],\n errorMessage: message || getMessages().numberNonpositive\n });\n }\n \n /**\n * Create a new validator that checks for finite values\n */\n finite(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => Number.isFinite(v)],\n errorMessage: message || getMessages().numberFinite\n });\n }\n \n /**\n * Create a new validator that checks for safe integer values\n */\n safe(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => Number.isSafeInteger(v)],\n errorMessage: message || getMessages().numberSafe\n });\n }\n \n /**\n * Create a new validator that checks if value is multiple of another\n */\n multipleOf(value: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v % value === 0],\n errorMessage: message || getMessages().numberMultipleOf(value)\n });\n }\n \n /**\n * Alias for multipleOf\n */\n step(value: number, message?: string): VldNumber {\n return this.multipleOf(value, message);\n }\n \n /**\n * Create a new validator with a range constraint\n */\n between(min: number, max: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v >= min && v <= max],\n errorMessage: message || `Number must be between ${min} and ${max}`\n });\n }\n \n /**\n * Create a new validator that checks for even numbers\n */\n even(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v % 2 === 0],\n errorMessage: message || 'Number must be even'\n });\n }\n \n /**\n * Create a new validator that checks for odd numbers\n */\n odd(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v % 2 !== 0],\n errorMessage: message || 'Number must be odd'\n });\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/validators/number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,OAAuB;IAGpD;;OAEG;IACH,YAAsB,MAAuC;QAC3D,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE;YAC5B,YAAY,EAAE,MAAM,EAAE,YAAY;SACnC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,SAAS,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;QAC3E,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,KAAa,EAAE,OAAgB;QACjC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;YAC1D,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,KAAa,EAAE,OAAgB;QACjC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;YAC1D,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAgB;QAClB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnE,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,SAAS;SACjD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAgB;QACvB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;YACrD,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,cAAc;SACtD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAgB;QACvB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;YACrD,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,cAAc;SACtD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAgB;QAC1B,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACtD,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,iBAAiB;SACzD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAgB;QAC1B,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACtD,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,iBAAiB;SACzD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAgB;QACrB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAClE,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,YAAY;SACpD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAgB;QACnB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACvE,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,UAAU;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAa,EAAE,OAAgB;QACxC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;oBAC5C,sDAAsD;oBACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;oBACtC,OAAO,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;gBAC9F,CAAC,CAAC;YACF,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,KAAa,EAAE,OAAgB;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,GAAW,EAAE,GAAW,EAAE,OAAgB;QAChD,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;YACpE,YAAY,EAAE,OAAO,IAAI,0BAA0B,GAAG,QAAQ,GAAG,EAAE;SACpE,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAgB;QACnB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;oBAC5C,sDAAsD;oBACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAClC,OAAO,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;gBAChF,CAAC,CAAC;YACF,YAAY,EAAE,OAAO,IAAI,qBAAqB;SAC/C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAgB;QAClB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;oBAC5C,sDAAsD;oBACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAClC,MAAM,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;oBACtF,OAAO,CAAC,MAAM,CAAC;gBACjB,CAAC,CAAC;YACF,YAAY,EAAE,OAAO,IAAI,oBAAoB;SAC9C,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Type for number validation check functions\r\n */\r\ntype NumberCheck = (value: number) => boolean;\r\n\r\n/**\r\n * Configuration for number validator\r\n */\r\ninterface NumberValidatorConfig {\r\n readonly checks: ReadonlyArray<NumberCheck>;\r\n readonly errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Immutable number validator with chainable methods\r\n */\r\nexport class VldNumber extends VldBase<number, number> {\r\n protected readonly config: NumberValidatorConfig;\r\n \r\n /**\r\n * Protected constructor to allow extension while maintaining immutability\r\n */\r\n protected constructor(config?: Partial<NumberValidatorConfig>) {\r\n super();\r\n this.config = {\r\n checks: config?.checks || [],\r\n errorMessage: config?.errorMessage\r\n };\r\n }\r\n \r\n /**\r\n * Create a new number validator\r\n */\r\n static create(): VldNumber {\r\n return new VldNumber();\r\n }\r\n \r\n /**\r\n * Parse and validate a number value\r\n */\r\n parse(value: unknown): number {\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidNumber);\r\n }\r\n \r\n // Apply all checks\r\n for (const check of this.config.checks) {\r\n if (!check(value)) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidNumber);\r\n }\r\n }\r\n \r\n return value;\r\n }\r\n \r\n /**\r\n * Safely parse and validate a number value\r\n */\r\n safeParse(value: unknown): ParseResult<number> {\r\n try {\r\n return { success: true, data: this.parse(value) };\r\n } catch (error) {\r\n return { success: false, error: error as Error };\r\n }\r\n }\r\n \r\n /**\r\n * Create a new validator with minimum value constraint\r\n */\r\n min(value: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v >= value],\r\n errorMessage: message || getMessages().numberMin(value)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with maximum value constraint\r\n */\r\n max(value: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v <= value],\r\n errorMessage: message || getMessages().numberMax(value)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for integer values\r\n */\r\n int(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => Number.isInteger(v)],\r\n errorMessage: message || getMessages().numberInt\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for positive values\r\n */\r\n positive(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v > 0],\r\n errorMessage: message || getMessages().numberPositive\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for negative values\r\n */\r\n negative(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v < 0],\r\n errorMessage: message || getMessages().numberNegative\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for non-negative values\r\n */\r\n nonnegative(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v >= 0],\r\n errorMessage: message || getMessages().numberNonnegative\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for non-positive values\r\n */\r\n nonpositive(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v <= 0],\r\n errorMessage: message || getMessages().numberNonpositive\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for finite values\r\n */\r\n finite(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => Number.isFinite(v)],\r\n errorMessage: message || getMessages().numberFinite\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for safe integer values\r\n */\r\n safe(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => Number.isSafeInteger(v)],\r\n errorMessage: message || getMessages().numberSafe\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks if value is multiple of another\r\n */\r\n multipleOf(value: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => {\r\n // Use epsilon comparison for floating point precision\r\n const remainder = Math.abs(v % value);\r\n return remainder < Number.EPSILON || Math.abs(remainder - Math.abs(value)) < Number.EPSILON;\r\n }],\r\n errorMessage: message || getMessages().numberMultipleOf(value)\r\n });\r\n }\r\n \r\n /**\r\n * Alias for multipleOf\r\n */\r\n step(value: number, message?: string): VldNumber {\r\n return this.multipleOf(value, message);\r\n }\r\n \r\n /**\r\n * Create a new validator with a range constraint\r\n */\r\n between(min: number, max: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v >= min && v <= max],\r\n errorMessage: message || `Number must be between ${min} and ${max}`\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for even numbers\r\n */\r\n even(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => {\r\n // Use epsilon comparison for floating point precision\r\n const remainder = Math.abs(v % 2);\r\n return remainder < Number.EPSILON || Math.abs(remainder - 2) < Number.EPSILON;\r\n }],\r\n errorMessage: message || 'Number must be even'\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for odd numbers\r\n */\r\n odd(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => {\r\n // Use epsilon comparison for floating point precision\r\n const remainder = Math.abs(v % 2);\r\n const isEven = remainder < Number.EPSILON || Math.abs(remainder - 2) < Number.EPSILON;\r\n return !isEven;\r\n }],\r\n errorMessage: message || 'Number must be odd'\r\n });\r\n }\r\n}"]}
|
|
@@ -27,6 +27,11 @@ export declare class VldObject<T extends Record<string, any>> extends VldBase<un
|
|
|
27
27
|
* Optimized version using pre-computed keys
|
|
28
28
|
*/
|
|
29
29
|
safeParse(value: unknown): ParseResult<T>;
|
|
30
|
+
/**
|
|
31
|
+
* Comprehensive prototype pollution protection
|
|
32
|
+
* Checks for dangerous keys that could modify Object.prototype
|
|
33
|
+
*/
|
|
34
|
+
private isDangerousKey;
|
|
30
35
|
/**
|
|
31
36
|
* Create a new validator in strict mode (no extra keys allowed)
|
|
32
37
|
*/
|