@oxog/vld 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +122 -0
- package/README.md +61 -43
- package/dist/coercion/bigint.js +1 -1
- package/dist/coercion/boolean.d.ts.map +1 -1
- package/dist/coercion/boolean.js +7 -3
- package/dist/coercion/boolean.js.map +1 -1
- package/dist/coercion/date.js +1 -1
- package/dist/coercion/number.d.ts.map +1 -1
- package/dist/coercion/number.js +20 -4
- package/dist/coercion/number.js.map +1 -1
- package/dist/coercion/string.d.ts.map +1 -1
- package/dist/coercion/string.js +84 -12
- package/dist/coercion/string.js.map +1 -1
- package/dist/index.d.ts +593 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +76 -5
- package/dist/index.js.map +1 -1
- package/dist/locales/af.d.ts.map +1 -1
- package/dist/locales/af.js +21 -4
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.d.ts.map +1 -1
- package/dist/locales/ar.js +21 -4
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/backup-en.d.ts +3 -0
- package/dist/locales/backup-en.d.ts.map +1 -0
- package/dist/locales/backup-en.js +105 -0
- package/dist/locales/backup-en.js.map +1 -0
- package/dist/locales/bn.d.ts.map +1 -1
- package/dist/locales/bn.js +21 -4
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.d.ts.map +1 -1
- package/dist/locales/da.js +21 -4
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.d.ts.map +1 -1
- package/dist/locales/de.js +21 -4
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/en.js +21 -4
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.d.ts.map +1 -1
- package/dist/locales/es-MX.js +20 -4
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.d.ts.map +1 -1
- package/dist/locales/es.js +21 -4
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.d.ts.map +1 -1
- package/dist/locales/fi.js +21 -4
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.d.ts.map +1 -1
- package/dist/locales/fr.js +21 -4
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.d.ts.map +1 -1
- package/dist/locales/hi.js +21 -4
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.d.ts.map +1 -1
- package/dist/locales/id.js +21 -4
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/it.d.ts.map +1 -1
- package/dist/locales/it.js +21 -4
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.d.ts.map +1 -1
- package/dist/locales/ja.js +21 -4
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.d.ts.map +1 -1
- package/dist/locales/ko.js +21 -4
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/nl.d.ts.map +1 -1
- package/dist/locales/nl.js +21 -4
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.d.ts.map +1 -1
- package/dist/locales/no.js +21 -4
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.d.ts.map +1 -1
- package/dist/locales/pl.js +21 -4
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/locales/pt-BR.js +21 -4
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.d.ts.map +1 -1
- package/dist/locales/pt.js +21 -4
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.d.ts.map +1 -1
- package/dist/locales/ru.js +21 -4
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.d.ts.map +1 -1
- package/dist/locales/sv.js +21 -4
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.d.ts.map +1 -1
- package/dist/locales/sw.js +21 -4
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.d.ts.map +1 -1
- package/dist/locales/th.js +21 -4
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.d.ts.map +1 -1
- package/dist/locales/tr.js +21 -4
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/types.d.ts +16 -3
- 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 +21 -4
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.d.ts.map +1 -1
- package/dist/locales/zh.js +21 -4
- package/dist/locales/zh.js.map +1 -1
- package/dist/utils/codec-utils.d.ts +3 -1
- package/dist/utils/codec-utils.d.ts.map +1 -1
- package/dist/utils/codec-utils.js +110 -5
- package/dist/utils/codec-utils.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +3 -0
- package/dist/utils/deep-merge.d.ts.map +1 -1
- package/dist/utils/deep-merge.js +30 -22
- package/dist/utils/deep-merge.js.map +1 -1
- package/dist/utils/ip-validation.d.ts +11 -0
- package/dist/utils/ip-validation.d.ts.map +1 -0
- package/dist/utils/ip-validation.js +78 -0
- package/dist/utils/ip-validation.js.map +1 -0
- package/dist/utils/security.d.ts +12 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +61 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/validators/array.d.ts +7 -0
- package/dist/validators/array.d.ts.map +1 -1
- package/dist/validators/array.js +57 -2
- package/dist/validators/array.js.map +1 -1
- package/dist/validators/base.d.ts +131 -0
- package/dist/validators/base.d.ts.map +1 -1
- package/dist/validators/base.js +247 -1
- package/dist/validators/base.js.map +1 -1
- package/dist/validators/base64.d.ts.map +1 -1
- package/dist/validators/base64.js +6 -3
- package/dist/validators/base64.js.map +1 -1
- package/dist/validators/bigint.d.ts +20 -0
- package/dist/validators/bigint.d.ts.map +1 -1
- package/dist/validators/bigint.js +39 -1
- package/dist/validators/bigint.js.map +1 -1
- package/dist/validators/boolean.js +29 -1
- package/dist/validators/boolean.js.map +1 -1
- package/dist/validators/codec.js +1 -1
- package/dist/validators/custom.d.ts +47 -0
- package/dist/validators/custom.d.ts.map +1 -0
- package/dist/validators/custom.js +50 -0
- package/dist/validators/custom.js.map +1 -0
- package/dist/validators/date.d.ts +21 -1
- package/dist/validators/date.d.ts.map +1 -1
- package/dist/validators/date.js +109 -30
- package/dist/validators/date.js.map +1 -1
- package/dist/validators/discriminated-union.d.ts +29 -0
- package/dist/validators/discriminated-union.d.ts.map +1 -0
- package/dist/validators/discriminated-union.js +98 -0
- package/dist/validators/discriminated-union.js.map +1 -0
- package/dist/validators/enum.d.ts +10 -0
- package/dist/validators/enum.d.ts.map +1 -1
- package/dist/validators/enum.js +38 -1
- package/dist/validators/enum.js.map +1 -1
- package/dist/validators/file.d.ts +57 -0
- package/dist/validators/file.d.ts.map +1 -0
- package/dist/validators/file.js +114 -0
- package/dist/validators/file.js.map +1 -0
- package/dist/validators/function.d.ts +26 -0
- package/dist/validators/function.d.ts.map +1 -0
- package/dist/validators/function.js +45 -0
- package/dist/validators/function.js.map +1 -0
- package/dist/validators/hex.d.ts.map +1 -1
- package/dist/validators/hex.js +3 -2
- package/dist/validators/hex.js.map +1 -1
- package/dist/validators/index.d.ts +18 -1
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +16 -1
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/intersection.d.ts.map +1 -1
- package/dist/validators/intersection.js +15 -8
- package/dist/validators/intersection.js.map +1 -1
- package/dist/validators/json.d.ts +26 -0
- package/dist/validators/json.d.ts.map +1 -0
- package/dist/validators/json.js +64 -0
- package/dist/validators/json.js.map +1 -0
- package/dist/validators/lazy.d.ts +28 -0
- package/dist/validators/lazy.d.ts.map +1 -0
- package/dist/validators/lazy.js +42 -0
- package/dist/validators/lazy.js.map +1 -0
- package/dist/validators/literal.js +1 -1
- package/dist/validators/map.js +1 -1
- package/dist/validators/nan.d.ts +17 -0
- package/dist/validators/nan.d.ts.map +1 -0
- package/dist/validators/nan.js +32 -0
- package/dist/validators/nan.js.map +1 -0
- package/dist/validators/never.js +1 -1
- package/dist/validators/null.d.ts +16 -0
- package/dist/validators/null.d.ts.map +1 -0
- package/dist/validators/null.js +31 -0
- package/dist/validators/null.js.map +1 -0
- package/dist/validators/number.d.ts +22 -0
- package/dist/validators/number.d.ts.map +1 -1
- package/dist/validators/number.js +56 -4
- package/dist/validators/number.js.map +1 -1
- package/dist/validators/object.d.ts +37 -0
- package/dist/validators/object.d.ts.map +1 -1
- package/dist/validators/object.js +183 -14
- package/dist/validators/object.js.map +1 -1
- package/dist/validators/record.d.ts +15 -2
- package/dist/validators/record.d.ts.map +1 -1
- package/dist/validators/record.js +77 -1
- package/dist/validators/record.js.map +1 -1
- package/dist/validators/set.js +1 -1
- package/dist/validators/string-bool.d.ts +61 -0
- package/dist/validators/string-bool.d.ts.map +1 -0
- package/dist/validators/string-bool.js +127 -0
- package/dist/validators/string-bool.js.map +1 -0
- package/dist/validators/string-formats.d.ts +97 -0
- package/dist/validators/string-formats.d.ts.map +1 -0
- package/dist/validators/string-formats.js +120 -0
- package/dist/validators/string-formats.js.map +1 -0
- package/dist/validators/string.d.ts.map +1 -1
- package/dist/validators/string.js +16 -5
- package/dist/validators/string.js.map +1 -1
- package/dist/validators/symbol.js +1 -1
- package/dist/validators/template-literal.d.ts +32 -0
- package/dist/validators/template-literal.d.ts.map +1 -0
- package/dist/validators/template-literal.js +101 -0
- package/dist/validators/template-literal.js.map +1 -0
- package/dist/validators/tuple.js +1 -1
- package/dist/validators/uint8array.d.ts +21 -4
- package/dist/validators/uint8array.d.ts.map +1 -1
- package/dist/validators/uint8array.js +34 -23
- package/dist/validators/uint8array.js.map +1 -1
- package/dist/validators/undefined.d.ts +16 -0
- package/dist/validators/undefined.d.ts.map +1 -0
- package/dist/validators/undefined.js +31 -0
- package/dist/validators/undefined.js.map +1 -0
- package/dist/validators/union.d.ts +3 -0
- package/dist/validators/union.d.ts.map +1 -1
- package/dist/validators/union.js +46 -41
- package/dist/validators/union.js.map +1 -1
- package/dist/validators/void.js +1 -1
- package/dist/validators/xor.d.ts +23 -0
- package/dist/validators/xor.d.ts.map +1 -0
- package/dist/validators/xor.js +64 -0
- package/dist/validators/xor.js.map +1 -0
- package/package.json +2 -2
- package/dist/index-new.d.ts.map +0 -1
- package/dist/locales.d.ts +0 -54
- package/dist/locales.d.ts.map +0 -1
- package/dist/locales.js +0 -732
- package/dist/locales.js.map +0 -1
- package/dist/validators/object-optimized.d.ts +0 -23
- package/dist/validators/object-optimized.d.ts.map +0 -1
- package/dist/validators/object-optimized.js +0 -179
- package/dist/validators/object-optimized.js.map +0 -1
- package/dist/validators/object-ultra.d.ts +0 -34
- package/dist/validators/object-ultra.d.ts.map +0 -1
- package/dist/validators/object-ultra.js +0 -175
- package/dist/validators/object-ultra.js.map +0 -1
- package/dist/validators/string-ultra.d.ts +0 -49
- package/dist/validators/string-ultra.d.ts.map +0 -1
- package/dist/validators/string-ultra.js +0 -217
- package/dist/validators/string-ultra.js.map +0 -1
- package/dist/validators/union-optimized.d.ts +0 -15
- package/dist/validators/union-optimized.d.ts.map +0 -1
- package/dist/validators/union-optimized.js +0 -92
- package/dist/validators/union-optimized.js.map +0 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable file validator for file uploads
|
|
5
|
+
* Supports size and MIME type validation
|
|
6
|
+
*/
|
|
7
|
+
export class VldFile extends VldBase {
|
|
8
|
+
constructor(checks = []) {
|
|
9
|
+
super();
|
|
10
|
+
this.checks = checks;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a new file validator
|
|
14
|
+
*/
|
|
15
|
+
static create() {
|
|
16
|
+
return new VldFile();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse and validate a file value
|
|
20
|
+
*/
|
|
21
|
+
parse(value) {
|
|
22
|
+
// Check if File API is supported
|
|
23
|
+
const FileSupported = typeof File !== 'undefined';
|
|
24
|
+
if (!FileSupported) {
|
|
25
|
+
throw new Error(getMessages().fileNotSupported || 'File API not supported in this environment');
|
|
26
|
+
}
|
|
27
|
+
// Check if value is a File object
|
|
28
|
+
if (!(value instanceof File)) {
|
|
29
|
+
// Allow plain object with size and type for Node.js compatibility
|
|
30
|
+
if (typeof value === 'object' &&
|
|
31
|
+
value !== null &&
|
|
32
|
+
'size' in value &&
|
|
33
|
+
'type' in value) {
|
|
34
|
+
const fileObj = value;
|
|
35
|
+
return this.runChecks(fileObj);
|
|
36
|
+
}
|
|
37
|
+
throw new Error(getMessages().invalidFile || 'Expected a File object');
|
|
38
|
+
}
|
|
39
|
+
return this.runChecks(value);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Run all validation checks on the file
|
|
43
|
+
*/
|
|
44
|
+
runChecks(file) {
|
|
45
|
+
const msgs = getMessages();
|
|
46
|
+
for (const check of this.checks) {
|
|
47
|
+
switch (check.type) {
|
|
48
|
+
case 'min':
|
|
49
|
+
if (file.size < check.value) {
|
|
50
|
+
throw new Error(check.message ||
|
|
51
|
+
(msgs.fileMinSize?.(check.value) || `File size must be at least ${check.value} bytes`));
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
case 'max':
|
|
55
|
+
if (file.size > check.value) {
|
|
56
|
+
throw new Error(check.message ||
|
|
57
|
+
(msgs.fileMaxSize?.(check.value) || `File size must not exceed ${check.value} bytes`));
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
case 'mime':
|
|
61
|
+
if (!check.value.includes(file.type)) {
|
|
62
|
+
throw new Error(check.message ||
|
|
63
|
+
(msgs.fileMimeType?.(check.value) || `Invalid file type. Expected: ${check.value.join(', ')}`));
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return file;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Safely parse and validate a file value
|
|
72
|
+
*/
|
|
73
|
+
safeParse(value) {
|
|
74
|
+
try {
|
|
75
|
+
return { success: true, data: this.parse(value) };
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return { success: false, error: error };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Set minimum file size in bytes
|
|
83
|
+
*/
|
|
84
|
+
min(bytes, message) {
|
|
85
|
+
return new VldFile([...this.checks, { type: 'min', value: bytes, message }]);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Set maximum file size in bytes
|
|
89
|
+
*/
|
|
90
|
+
max(bytes, message) {
|
|
91
|
+
return new VldFile([...this.checks, { type: 'max', value: bytes, message }]);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Set allowed MIME types
|
|
95
|
+
*/
|
|
96
|
+
mime(types, message) {
|
|
97
|
+
const typeArray = Array.isArray(types) ? types : [types];
|
|
98
|
+
return new VldFile([...this.checks, { type: 'mime', value: typeArray, message }]);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Set both minimum and maximum file size
|
|
102
|
+
*/
|
|
103
|
+
size(min, max, message) {
|
|
104
|
+
return this.min(min, message).max(max, message);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Helper function to create file validators
|
|
109
|
+
* Usage: v.file().min(1024).max(10485760).mime(['image/jpeg', 'image/png'])
|
|
110
|
+
*/
|
|
111
|
+
export function file() {
|
|
112
|
+
return VldFile.create();
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/validators/file.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * File validation check types\n */\ntype FileCheck =\n | { type: 'min'; value: number; message?: string }\n | { type: 'max'; value: number; message?: string }\n | { type: 'mime'; value: string[]; message?: string };\n\n/**\n * File representation for validation\n * In browsers: File object\n * In Node.js: Object with size and type properties\n */\nexport type VldFileValue = File | { size: number; type: string; name?: string };\n\n/**\n * Immutable file validator for file uploads\n * Supports size and MIME type validation\n */\nexport class VldFile extends VldBase<unknown, VldFileValue> {\n private constructor(\n private readonly checks: readonly FileCheck[] = []\n ) {\n super();\n }\n\n /**\n * Create a new file validator\n */\n static create(): VldFile {\n return new VldFile();\n }\n\n /**\n * Parse and validate a file value\n */\n parse(value: unknown): VldFileValue {\n // Check if File API is supported\n const FileSupported = typeof File !== 'undefined';\n\n if (!FileSupported) {\n throw new Error(getMessages().fileNotSupported || 'File API not supported in this environment');\n }\n\n // Check if value is a File object\n if (!(value instanceof File)) {\n // Allow plain object with size and type for Node.js compatibility\n if (\n typeof value === 'object' &&\n value !== null &&\n 'size' in value &&\n 'type' in value\n ) {\n const fileObj = value as { size: number; type: string; name?: string };\n return this.runChecks(fileObj);\n }\n\n throw new Error(getMessages().invalidFile || 'Expected a File object');\n }\n\n return this.runChecks(value);\n }\n\n /**\n * Run all validation checks on the file\n */\n private runChecks(file: VldFileValue): VldFileValue {\n const msgs = getMessages();\n\n for (const check of this.checks) {\n switch (check.type) {\n case 'min':\n if (file.size < check.value) {\n throw new Error(\n check.message ||\n (msgs.fileMinSize?.(check.value) || `File size must be at least ${check.value} bytes`)\n );\n }\n break;\n\n case 'max':\n if (file.size > check.value) {\n throw new Error(\n check.message ||\n (msgs.fileMaxSize?.(check.value) || `File size must not exceed ${check.value} bytes`)\n );\n }\n break;\n\n case 'mime':\n if (!check.value.includes(file.type)) {\n throw new Error(\n check.message ||\n (msgs.fileMimeType?.(check.value) || `Invalid file type. Expected: ${check.value.join(', ')}`)\n );\n }\n break;\n }\n }\n\n return file;\n }\n\n /**\n * Safely parse and validate a file value\n */\n safeParse(value: unknown): ParseResult<VldFileValue> {\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 * Set minimum file size in bytes\n */\n min(bytes: number, message?: string): VldFile {\n return new VldFile([...this.checks, { type: 'min', value: bytes, message }]);\n }\n\n /**\n * Set maximum file size in bytes\n */\n max(bytes: number, message?: string): VldFile {\n return new VldFile([...this.checks, { type: 'max', value: bytes, message }]);\n }\n\n /**\n * Set allowed MIME types\n */\n mime(types: string | string[], message?: string): VldFile {\n const typeArray = Array.isArray(types) ? types : [types];\n return new VldFile([...this.checks, { type: 'mime', value: typeArray, message }]);\n }\n\n /**\n * Set both minimum and maximum file size\n */\n size(min: number, max: number, message?: string): VldFile {\n return this.min(min, message).max(max, message);\n }\n}\n\n/**\n * Helper function to create file validators\n * Usage: v.file().min(1024).max(10485760).mime(['image/jpeg', 'image/png'])\n */\nexport function file(): VldFile {\n return VldFile.create();\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Immutable function validator
|
|
4
|
+
* Validates that a value is a function
|
|
5
|
+
*/
|
|
6
|
+
export declare class VldFunction extends VldBase<unknown, Function> {
|
|
7
|
+
private constructor();
|
|
8
|
+
/**
|
|
9
|
+
* Create a new function validator
|
|
10
|
+
*/
|
|
11
|
+
static create(): VldFunction;
|
|
12
|
+
/**
|
|
13
|
+
* Parse and validate a function value
|
|
14
|
+
*/
|
|
15
|
+
parse(value: unknown): Function;
|
|
16
|
+
/**
|
|
17
|
+
* Safely parse and validate a function value
|
|
18
|
+
*/
|
|
19
|
+
safeParse(value: unknown): ParseResult<Function>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Helper function to create function validators
|
|
23
|
+
* Usage: v.function()
|
|
24
|
+
*/
|
|
25
|
+
export declare function functionValidator(): VldFunction;
|
|
26
|
+
//# sourceMappingURL=function.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/validators/function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;;GAGG;AACH,qBAAa,WAAY,SAAQ,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;IACzD,OAAO;IAIP;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,WAAW;IAI5B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ;IAU/B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC;CAOjD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable function validator
|
|
5
|
+
* Validates that a value is a function
|
|
6
|
+
*/
|
|
7
|
+
export class VldFunction extends VldBase {
|
|
8
|
+
constructor() {
|
|
9
|
+
super();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a new function validator
|
|
13
|
+
*/
|
|
14
|
+
static create() {
|
|
15
|
+
return new VldFunction();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse and validate a function value
|
|
19
|
+
*/
|
|
20
|
+
parse(value) {
|
|
21
|
+
if (typeof value !== 'function') {
|
|
22
|
+
throw new Error(getMessages().invalidFunction || 'Expected a function');
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Safely parse and validate a function value
|
|
28
|
+
*/
|
|
29
|
+
safeParse(value) {
|
|
30
|
+
try {
|
|
31
|
+
return { success: true, data: this.parse(value) };
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return { success: false, error: error };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Helper function to create function validators
|
|
40
|
+
* Usage: v.function()
|
|
41
|
+
*/
|
|
42
|
+
export function functionValidator() {
|
|
43
|
+
return VldFunction.create();
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/validators/function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,OAA0B;IACzD;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,WAAW,EAAE,CAAC,eAAe,IAAI,qBAAqB,CACvD,CAAC;QACJ,CAAC;QAED,OAAO,KAAiB,CAAC;IAC3B,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;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;AAC9B,CAAC","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Immutable function validator\n * Validates that a value is a function\n */\nexport class VldFunction extends VldBase<unknown, Function> {\n private constructor() {\n super();\n }\n\n /**\n * Create a new function validator\n */\n static create(): VldFunction {\n return new VldFunction();\n }\n\n /**\n * Parse and validate a function value\n */\n parse(value: unknown): Function {\n if (typeof value !== 'function') {\n throw new Error(\n getMessages().invalidFunction || 'Expected a function'\n );\n }\n\n return value as Function;\n }\n\n /**\n * Safely parse and validate a function value\n */\n safeParse(value: unknown): ParseResult<Function> {\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 * Helper function to create function validators\n * Usage: v.function()\n */\nexport function functionValidator(): VldFunction {\n return VldFunction.create();\n}\n"]}
|
|
@@ -1 +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;
|
|
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;IAEjD,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"}
|
package/dist/validators/hex.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { VldBase } from './base.js';
|
|
2
2
|
import { VldError, createIssue } from '../errors.js';
|
|
3
|
-
import { getMessages } from '../locales.js';
|
|
3
|
+
import { getMessages } from '../locales/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Hexadecimal string validator
|
|
6
6
|
*/
|
|
@@ -57,5 +57,6 @@ export class VldHex extends VldBase {
|
|
|
57
57
|
return new VldHex(lowercase);
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
-
|
|
60
|
+
// BUG-008 FIX: Use * instead of + to allow empty hex strings (consistent with base64 validator)
|
|
61
|
+
VldHex.HEX_REGEX = /^[0-9a-fA-F]*$/;
|
|
61
62
|
//# sourceMappingURL=hex.js.map
|
|
@@ -1 +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;
|
|
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;IAMjD,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;;AA/DD,gGAAgG;AACxE,gBAAS,GAAG,gBAAgB,CAAC","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { VldError, createIssue } from '../errors';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Hexadecimal string validator\r\n */\r\nexport class VldHex extends VldBase<string, string> {\r\n // BUG-008 FIX: Use * instead of + to allow empty hex strings (consistent with base64 validator)\r\n private static readonly HEX_REGEX = /^[0-9a-fA-F]*$/;\r\n \r\n private readonly lowercase: boolean;\r\n \r\n constructor(lowercase = false) {\r\n super();\r\n this.lowercase = lowercase;\r\n }\r\n \r\n parse(value: unknown): string {\r\n const result = this.safeParse(value);\r\n if (!result.success) {\r\n throw result.error;\r\n }\r\n return result.data;\r\n }\r\n \r\n safeParse(value: unknown): ParseResult<string> {\r\n if (typeof value !== 'string') {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('invalid_type', [], getMessages().expectedString)\r\n ])\r\n };\r\n }\r\n \r\n // Check if it's a valid hex string\r\n if (!VldHex.HEX_REGEX.test(value)) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('custom', [], getMessages().invalidHex)\r\n ])\r\n };\r\n }\r\n \r\n // Check if even length (full bytes)\r\n if (value.length % 2 !== 0) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('custom', [], getMessages().invalidHex)\r\n ])\r\n };\r\n }\r\n \r\n // Normalize case if required\r\n const normalizedValue = this.lowercase ? value.toLowerCase() : value;\r\n \r\n return { success: true, data: normalizedValue };\r\n }\r\n \r\n /**\r\n * Require lowercase hex characters\r\n */\r\n lowercaseMode(): VldHex {\r\n return new VldHex(true);\r\n }\r\n \r\n static create(lowercase = false): VldHex {\r\n return new VldHex(lowercase);\r\n }\r\n}"]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Main entry point for all validators
|
|
3
3
|
*/
|
|
4
|
-
export { VldBase, ParseResult, VldRefine, VldTransform, VldDefault, VldCatch, VldOptional, VldNullable, VldNullish } from './base';
|
|
4
|
+
export { VldBase, ParseResult, VldRefine, VldTransform, VldDefault, VldCatch, VldOptional, VldNullable, VldNullish, VldPipe, VldReadonly, VldBrand, SuperRefineContext, VldSuperRefine, VldPreprocess } from './base';
|
|
5
5
|
export { VldString } from './string';
|
|
6
6
|
export { VldNumber } from './number';
|
|
7
7
|
export { VldBoolean } from './boolean';
|
|
8
8
|
export { VldDate } from './date';
|
|
9
|
+
export { VldStringBool } from './string-bool';
|
|
9
10
|
export { VldArray } from './array';
|
|
10
11
|
export { VldObject } from './object';
|
|
11
12
|
export { VldUnion } from './union';
|
|
@@ -22,6 +23,22 @@ export { VldAny } from './any';
|
|
|
22
23
|
export { VldUnknown } from './unknown';
|
|
23
24
|
export { VldVoid } from './void';
|
|
24
25
|
export { VldNever } from './never';
|
|
26
|
+
export { VldNull } from './null';
|
|
27
|
+
export { VldUndefined } from './undefined';
|
|
28
|
+
export { VldNan } from './nan';
|
|
29
|
+
export { VldLazy } from './lazy';
|
|
30
|
+
export { VldDiscriminatedUnion } from './discriminated-union';
|
|
31
|
+
export { VldXor } from './xor';
|
|
32
|
+
export { VldJson } from './json';
|
|
33
|
+
export { VldTemplateLiteral, templateLiteral } from './template-literal';
|
|
34
|
+
export { VldCustom, custom } from './custom';
|
|
35
|
+
export type { CustomValidatorOptions } from './custom';
|
|
36
|
+
export { VldFile, file } from './file';
|
|
37
|
+
export type { VldFileValue } from './file';
|
|
38
|
+
export { VldFunction, functionValidator } from './function';
|
|
39
|
+
export { email, uuid, uuidv4, hostname, emoji, base64, base64url, hex, jwt, nanoid, cuid, cuid2, ulid, ipv4, ipv6, mac, cidrv4, e164, hash, iso, stringFormat, regexes } from './string-formats';
|
|
25
40
|
import { VldBase } from './base';
|
|
26
41
|
export type Infer<T extends VldBase<any, any>> = T extends VldBase<any, infer U> ? U : never;
|
|
42
|
+
export type Input<T extends VldBase<any, any>> = T extends VldBase<infer I, any> ? I : never;
|
|
43
|
+
export type Output<T extends VldBase<any, any>> = T extends VldBase<any, infer O> ? O : never;
|
|
27
44
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,OAAO,EACP,WAAW,EACX,SAAS,EACT,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,UAAU,EACX,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"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"}
|
package/dist/validators/index.js
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
* Main entry point for all validators
|
|
3
3
|
*/
|
|
4
4
|
// Export base types and classes
|
|
5
|
-
export { VldBase, VldRefine, VldTransform, VldDefault, VldCatch, VldOptional, VldNullable, VldNullish } from './base.js';
|
|
5
|
+
export { VldBase, VldRefine, VldTransform, VldDefault, VldCatch, VldOptional, VldNullable, VldNullish, VldPipe, VldReadonly, VldBrand, VldSuperRefine, VldPreprocess } from './base.js';
|
|
6
6
|
// Export primitive validators
|
|
7
7
|
export { VldString } from './string.js';
|
|
8
8
|
export { VldNumber } from './number.js';
|
|
9
9
|
export { VldBoolean } from './boolean.js';
|
|
10
10
|
export { VldDate } from './date.js';
|
|
11
|
+
export { VldStringBool } from './string-bool.js';
|
|
11
12
|
// Export complex validators
|
|
12
13
|
export { VldArray } from './array.js';
|
|
13
14
|
export { VldObject } from './object.js';
|
|
@@ -27,4 +28,18 @@ export { VldAny } from './any.js';
|
|
|
27
28
|
export { VldUnknown } from './unknown.js';
|
|
28
29
|
export { VldVoid } from './void.js';
|
|
29
30
|
export { VldNever } from './never.js';
|
|
31
|
+
// Export Zod 4 parity validators
|
|
32
|
+
export { VldNull } from './null.js';
|
|
33
|
+
export { VldUndefined } from './undefined.js';
|
|
34
|
+
export { VldNan } from './nan.js';
|
|
35
|
+
export { VldLazy } from './lazy.js';
|
|
36
|
+
export { VldDiscriminatedUnion } from './discriminated-union.js';
|
|
37
|
+
export { VldXor } from './xor.js';
|
|
38
|
+
export { VldJson } from './json.js';
|
|
39
|
+
export { VldTemplateLiteral, templateLiteral } from './template-literal.js';
|
|
40
|
+
export { VldCustom, custom } from './custom.js';
|
|
41
|
+
export { VldFile, file } from './file.js';
|
|
42
|
+
export { VldFunction, functionValidator } from './function.js';
|
|
43
|
+
// Export string format validators
|
|
44
|
+
export { email, uuid, uuidv4, hostname, emoji, base64, base64url, hex, jwt, nanoid, cuid, cuid2, ulid, ipv4, ipv6, mac, cidrv4, e164, hash, iso, stringFormat, regexes } from './string-formats.js';
|
|
30
45
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gCAAgC;AAChC,OAAO,EACL,OAAO,EAEP,SAAS,EACT,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,UAAU,EACX,MAAM,QAAQ,CAAC;AAEhB,8BAA8B;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gCAAgC;AAChC,OAAO,EACL,OAAO,EAEP,SAAS,EACT,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,UAAU,EACV,OAAO,EACP,WAAW,EACX,QAAQ,EAER,cAAc,EACd,aAAa,EACd,MAAM,QAAQ,CAAC;AAEhB,8BAA8B;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,4BAA4B;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,gDAAgD;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,4BAA4B;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,iCAAiC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5D,kCAAkC;AAClC,OAAO,EACL,KAAK,EACL,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,EACT,GAAG,EACH,GAAG,EACH,MAAM,EACN,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,YAAY,EACZ,OAAO,EACR,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n * Main entry point for all validators\n */\n\n// Export base types and classes\nexport {\n VldBase,\n ParseResult,\n VldRefine,\n VldTransform,\n VldDefault,\n VldCatch,\n VldOptional,\n VldNullable,\n VldNullish,\n VldPipe,\n VldReadonly,\n VldBrand,\n SuperRefineContext,\n VldSuperRefine,\n VldPreprocess\n} from './base';\n\n// Export primitive validators\nexport { VldString } from './string';\nexport { VldNumber } from './number';\nexport { VldBoolean } from './boolean';\nexport { VldDate } from './date';\nexport { VldStringBool } from './string-bool';\n\n// Export complex validators\nexport { VldArray } from './array';\nexport { VldObject } from './object';\n\n// Export utility validators (to be implemented)\nexport { VldUnion } from './union';\nexport { VldIntersection } from './intersection';\nexport { VldLiteral } from './literal';\nexport { VldEnum } from './enum';\nexport { VldTuple } from './tuple';\nexport { VldRecord } from './record';\nexport { VldSet } from './set';\nexport { VldMap } from './map';\nexport { VldBigInt } from './bigint';\nexport { VldSymbol } from './symbol';\n\n// Export special validators\nexport { VldAny } from './any';\nexport { VldUnknown } from './unknown';\nexport { VldVoid } from './void';\nexport { VldNever } from './never';\n\n// Export Zod 4 parity validators\nexport { VldNull } from './null';\nexport { VldUndefined } from './undefined';\nexport { VldNan } from './nan';\nexport { VldLazy } from './lazy';\nexport { VldDiscriminatedUnion } from './discriminated-union';\nexport { VldXor } from './xor';\nexport { VldJson } from './json';\nexport { VldTemplateLiteral, templateLiteral } from './template-literal';\nexport { VldCustom, custom } from './custom';\nexport type { CustomValidatorOptions } from './custom';\nexport { VldFile, file } from './file';\nexport type { VldFileValue } from './file';\nexport { VldFunction, functionValidator } from './function';\n\n// Export string format validators\nexport {\n email,\n uuid,\n uuidv4,\n hostname,\n emoji,\n base64,\n base64url,\n hex,\n jwt,\n nanoid,\n cuid,\n cuid2,\n ulid,\n ipv4,\n ipv6,\n mac,\n cidrv4,\n e164,\n hash,\n iso,\n stringFormat,\n regexes\n} from './string-formats';\n\n// Import base for type inference\nimport { VldBase } from './base';\n\n// Type inference helper\nexport type Infer<T extends VldBase<any, any>> = T extends VldBase<any, infer U> ? U : never;\n\n// Zod 4 API parity - Input and Output type utilities\nexport type Input<T extends VldBase<any, any>> = T extends VldBase<infer I, any> ? I : never;\nexport type Output<T extends VldBase<any, any>> = T extends VldBase<any, infer O> ? O : never;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersection.d.ts","sourceRoot":"","sources":["../../src/validators/intersection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI9C;;GAEG;AACH,qBAAa,eAAe,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAK9D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B;;OAEG;IACH,OAAO;IAOP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAChB,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAC9B,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAIxB;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"intersection.d.ts","sourceRoot":"","sources":["../../src/validators/intersection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI9C;;GAEG;AACH,qBAAa,eAAe,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAK9D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B;;OAEG;IACH,OAAO;IAOP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAChB,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAC9B,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAIxB;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAiC5B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC;CAO9C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { VldBase } from './base.js';
|
|
2
2
|
import { deepMerge, isPlainObject } from '../utils/deep-merge.js';
|
|
3
|
-
import { getMessages } from '../locales.js';
|
|
3
|
+
import { getMessages } from '../locales/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Immutable intersection validator for combining validators
|
|
6
6
|
*/
|
|
@@ -27,16 +27,23 @@ export class VldIntersection extends VldBase {
|
|
|
27
27
|
// Both validators must pass
|
|
28
28
|
const resultA = this.validatorA.parse(value);
|
|
29
29
|
const resultB = this.validatorB.parse(value);
|
|
30
|
-
//
|
|
31
|
-
|
|
30
|
+
// BUG-NEW-015 FIX: Check type consistency before merging
|
|
31
|
+
const aIsObject = isPlainObject(resultA);
|
|
32
|
+
const bIsObject = isPlainObject(resultB);
|
|
33
|
+
// Both are objects - safe to merge
|
|
34
|
+
if (aIsObject && bIsObject) {
|
|
32
35
|
return deepMerge(resultA, resultB);
|
|
33
36
|
}
|
|
34
|
-
//
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
+
// Neither are objects - must be identical primitives
|
|
38
|
+
if (!aIsObject && !bIsObject) {
|
|
39
|
+
if (resultA === resultB) {
|
|
40
|
+
return resultA;
|
|
41
|
+
}
|
|
42
|
+
throw new Error('Values must be identical for intersection of primitive types');
|
|
37
43
|
}
|
|
38
|
-
//
|
|
39
|
-
throw new Error('
|
|
44
|
+
// One is object, one is primitive - invalid intersection
|
|
45
|
+
throw new Error('Cannot create intersection of object and primitive types. ' +
|
|
46
|
+
'Both validators must produce the same type category.');
|
|
40
47
|
}
|
|
41
48
|
catch (error) {
|
|
42
49
|
throw new Error(getMessages().intersectionError(error.message));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersection.js","sourceRoot":"","sources":["../../src/validators/intersection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,eAAsB,SAAQ,OAAuB;IAChE;;OAEG;IACH,YACmB,UAA+B,EAC/B,UAA+B;QAEhD,KAAK,EAAE,CAAC;QAHS,eAAU,GAAV,UAAU,CAAqB;QAC/B,eAAU,GAAV,UAAU,CAAqB;IAGlD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CACX,UAA+B,EAC/B,UAA+B;QAE/B,OAAO,IAAI,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC;YACH,4BAA4B;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE7C,
|
|
1
|
+
{"version":3,"file":"intersection.js","sourceRoot":"","sources":["../../src/validators/intersection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,eAAsB,SAAQ,OAAuB;IAChE;;OAEG;IACH,YACmB,UAA+B,EAC/B,UAA+B;QAEhD,KAAK,EAAE,CAAC;QAHS,eAAU,GAAV,UAAU,CAAqB;QAC/B,eAAU,GAAV,UAAU,CAAqB;IAGlD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CACX,UAA+B,EAC/B,UAA+B;QAE/B,OAAO,IAAI,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC;YACH,4BAA4B;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE7C,yDAAyD;YACzD,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEzC,mCAAmC;YACnC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;gBAC3B,OAAO,SAAS,CAAC,OAAc,EAAE,OAAc,CAAU,CAAC;YAC5D,CAAC;YAED,qDAAqD;YACrD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC7B,IAAK,OAAe,KAAM,OAAe,EAAE,CAAC;oBAC1C,OAAO,OAAgB,CAAC;gBAC1B,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAClF,CAAC;YAED,yDAAyD;YACzD,MAAM,IAAI,KAAK,CACb,4DAA4D;gBAC5D,sDAAsD,CACvD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,iBAAiB,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,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;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { deepMerge, isPlainObject } from '../utils/deep-merge';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Immutable intersection validator for combining validators\r\n */\r\nexport class VldIntersection<A, B> extends VldBase<unknown, A & B> {\r\n /**\r\n * Private constructor to enforce immutability\r\n */\r\n private constructor(\r\n private readonly validatorA: VldBase<unknown, A>,\r\n private readonly validatorB: VldBase<unknown, B>\r\n ) {\r\n super();\r\n }\r\n \r\n /**\r\n * Create a new intersection validator\r\n */\r\n static create<A, B>(\r\n validatorA: VldBase<unknown, A>,\r\n validatorB: VldBase<unknown, B>\r\n ): VldIntersection<A, B> {\r\n return new VldIntersection(validatorA, validatorB);\r\n }\r\n \r\n /**\r\n * Parse and validate a value against both validators\r\n */\r\n parse(value: unknown): A & B {\r\n try {\r\n // Both validators must pass\r\n const resultA = this.validatorA.parse(value);\r\n const resultB = this.validatorB.parse(value);\r\n\r\n // BUG-NEW-015 FIX: Check type consistency before merging\r\n const aIsObject = isPlainObject(resultA);\r\n const bIsObject = isPlainObject(resultB);\r\n\r\n // Both are objects - safe to merge\r\n if (aIsObject && bIsObject) {\r\n return deepMerge(resultA as any, resultB as any) as A & B;\r\n }\r\n\r\n // Neither are objects - must be identical primitives\r\n if (!aIsObject && !bIsObject) {\r\n if ((resultA as any) === (resultB as any)) {\r\n return resultA as A & B;\r\n }\r\n throw new Error('Values must be identical for intersection of primitive types');\r\n }\r\n\r\n // One is object, one is primitive - invalid intersection\r\n throw new Error(\r\n 'Cannot create intersection of object and primitive types. ' +\r\n 'Both validators must produce the same type category.'\r\n );\r\n } catch (error) {\r\n throw new Error(getMessages().intersectionError((error as Error).message));\r\n }\r\n }\r\n \r\n /**\r\n * Safely parse and validate a value against both validators\r\n */\r\n safeParse(value: unknown): ParseResult<A & B> {\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}"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Immutable JSON validator that validates and parses JSON strings
|
|
4
|
+
* Accepts both strings (which are parsed) and already-parsed objects
|
|
5
|
+
*/
|
|
6
|
+
export declare class VldJson<T = unknown> extends VldBase<unknown, T> {
|
|
7
|
+
private readonly schema?;
|
|
8
|
+
private constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Create a new JSON validator
|
|
11
|
+
*/
|
|
12
|
+
static create<T = unknown>(schema?: VldBase<unknown, T>): VldJson<T>;
|
|
13
|
+
/**
|
|
14
|
+
* Parse and validate a JSON value
|
|
15
|
+
*/
|
|
16
|
+
parse(value: unknown): T;
|
|
17
|
+
/**
|
|
18
|
+
* Safely parse and validate a JSON value
|
|
19
|
+
*/
|
|
20
|
+
safeParse(value: unknown): ParseResult<T>;
|
|
21
|
+
/**
|
|
22
|
+
* Create a new JSON validator with a schema for validation
|
|
23
|
+
*/
|
|
24
|
+
withSchema<U>(schema: VldBase<unknown, U>): VldJson<U>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/validators/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;;GAGG;AACH,qBAAa,OAAO,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAD1B,OAAO;IAMP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIpE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IAwBxB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;IAWzC;;OAEG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGvD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable JSON validator that validates and parses JSON strings
|
|
5
|
+
* Accepts both strings (which are parsed) and already-parsed objects
|
|
6
|
+
*/
|
|
7
|
+
export class VldJson extends VldBase {
|
|
8
|
+
constructor(schema) {
|
|
9
|
+
super();
|
|
10
|
+
this.schema = schema;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a new JSON validator
|
|
14
|
+
*/
|
|
15
|
+
static create(schema) {
|
|
16
|
+
return new VldJson(schema);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse and validate a JSON value
|
|
20
|
+
*/
|
|
21
|
+
parse(value) {
|
|
22
|
+
let parsed;
|
|
23
|
+
// If it's a string, try to parse it as JSON first
|
|
24
|
+
if (typeof value === 'string') {
|
|
25
|
+
try {
|
|
26
|
+
parsed = JSON.parse(value);
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
throw new Error(getMessages().invalidJson);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Not a string - assume it's already parsed
|
|
34
|
+
parsed = value;
|
|
35
|
+
}
|
|
36
|
+
// If we have a schema, validate against it
|
|
37
|
+
if (this.schema) {
|
|
38
|
+
return this.schema.parse(parsed);
|
|
39
|
+
}
|
|
40
|
+
// No schema - just return the parsed value
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Safely parse and validate a JSON value
|
|
45
|
+
*/
|
|
46
|
+
safeParse(value) {
|
|
47
|
+
try {
|
|
48
|
+
return { success: true, data: this.parse(value) };
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: error
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create a new JSON validator with a schema for validation
|
|
59
|
+
*/
|
|
60
|
+
withSchema(schema) {
|
|
61
|
+
return new VldJson(schema);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/validators/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;GAGG;AACH,MAAM,OAAO,OAAqB,SAAQ,OAAmB;IAC3D,YACmB,MAA4B;QAE7C,KAAK,EAAE,CAAC;QAFS,WAAM,GAAN,MAAM,CAAsB;IAG/C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAc,MAA4B;QACrD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,MAAe,CAAC;QAEpB,kDAAkD;QAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,4CAA4C;YAC5C,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAED,2CAA2C;QAC3C,OAAO,MAAW,CAAC;IACrB,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;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAc;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAI,MAA2B;QACvC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Immutable JSON validator that validates and parses JSON strings\n * Accepts both strings (which are parsed) and already-parsed objects\n */\nexport class VldJson<T = unknown> extends VldBase<unknown, T> {\n private constructor(\n private readonly schema?: VldBase<unknown, T>\n ) {\n super();\n }\n\n /**\n * Create a new JSON validator\n */\n static create<T = unknown>(schema?: VldBase<unknown, T>): VldJson<T> {\n return new VldJson(schema);\n }\n\n /**\n * Parse and validate a JSON value\n */\n parse(value: unknown): T {\n let parsed: unknown;\n\n // If it's a string, try to parse it as JSON first\n if (typeof value === 'string') {\n try {\n parsed = JSON.parse(value);\n } catch (e) {\n throw new Error(getMessages().invalidJson);\n }\n } else {\n // Not a string - assume it's already parsed\n parsed = value;\n }\n\n // If we have a schema, validate against it\n if (this.schema) {\n return this.schema.parse(parsed);\n }\n\n // No schema - just return the parsed value\n return parsed as T;\n }\n\n /**\n * Safely parse and validate a JSON value\n */\n safeParse(value: unknown): ParseResult<T> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return {\n success: false,\n error: error as Error\n };\n }\n }\n\n /**\n * Create a new JSON validator with a schema for validation\n */\n withSchema<U>(schema: VldBase<unknown, U>): VldJson<U> {\n return new VldJson(schema);\n }\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VldLazy - Lazy evaluation for recursive schemas
|
|
3
|
+
* Part of Zod 4 API parity implementation
|
|
4
|
+
* Allows schemas that reference themselves (e.g., tree structures, nested categories)
|
|
5
|
+
*/
|
|
6
|
+
import { VldBase } from './base';
|
|
7
|
+
import type { ParseResult } from './base';
|
|
8
|
+
/**
|
|
9
|
+
* Lazy validator - defers schema evaluation until runtime
|
|
10
|
+
* Essential for recursive and self-referencing types
|
|
11
|
+
*/
|
|
12
|
+
export declare class VldLazy<TInput, TOutput> extends VldBase<TInput, TOutput> {
|
|
13
|
+
private readonly _schemaGetter;
|
|
14
|
+
private _cachedSchema;
|
|
15
|
+
private constructor();
|
|
16
|
+
static create<TInput, TOutput>(schemaGetter: () => VldBase<TInput, TOutput>): VldLazy<TInput, TOutput>;
|
|
17
|
+
/**
|
|
18
|
+
* Get the actual schema, caching it after first retrieval
|
|
19
|
+
*/
|
|
20
|
+
private _getSchema;
|
|
21
|
+
/**
|
|
22
|
+
* Get the inner schema (unwrap)
|
|
23
|
+
*/
|
|
24
|
+
unwrap(): VldBase<TInput, TOutput>;
|
|
25
|
+
parse(value: unknown): TOutput;
|
|
26
|
+
safeParse(value: unknown): ParseResult<TOutput>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=lazy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/validators/lazy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C;;;GAGG;AACH,qBAAa,OAAO,CAAC,MAAM,EAAE,OAAO,CAAE,SAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAIlE,OAAO,CAAC,QAAQ,CAAC,aAAa;IAHhC,OAAO,CAAC,aAAa,CAAyC;IAE9D,OAAO;IAMP,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAC3B,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3C,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAI3B;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAIlC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAI9B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;CAGhD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VldLazy - Lazy evaluation for recursive schemas
|
|
3
|
+
* Part of Zod 4 API parity implementation
|
|
4
|
+
* Allows schemas that reference themselves (e.g., tree structures, nested categories)
|
|
5
|
+
*/
|
|
6
|
+
import { VldBase } from './base.js';
|
|
7
|
+
/**
|
|
8
|
+
* Lazy validator - defers schema evaluation until runtime
|
|
9
|
+
* Essential for recursive and self-referencing types
|
|
10
|
+
*/
|
|
11
|
+
export class VldLazy extends VldBase {
|
|
12
|
+
constructor(_schemaGetter) {
|
|
13
|
+
super();
|
|
14
|
+
this._schemaGetter = _schemaGetter;
|
|
15
|
+
this._cachedSchema = null;
|
|
16
|
+
}
|
|
17
|
+
static create(schemaGetter) {
|
|
18
|
+
return new VldLazy(schemaGetter);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the actual schema, caching it after first retrieval
|
|
22
|
+
*/
|
|
23
|
+
_getSchema() {
|
|
24
|
+
if (!this._cachedSchema) {
|
|
25
|
+
this._cachedSchema = this._schemaGetter();
|
|
26
|
+
}
|
|
27
|
+
return this._cachedSchema;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the inner schema (unwrap)
|
|
31
|
+
*/
|
|
32
|
+
unwrap() {
|
|
33
|
+
return this._getSchema();
|
|
34
|
+
}
|
|
35
|
+
parse(value) {
|
|
36
|
+
return this._getSchema().parse(value);
|
|
37
|
+
}
|
|
38
|
+
safeParse(value) {
|
|
39
|
+
return this._getSchema().safeParse(value);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=lazy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../src/validators/lazy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC;;;GAGG;AACH,MAAM,OAAO,OAAyB,SAAQ,OAAwB;IAGpE,YACmB,aAA6C;QAE9D,KAAK,EAAE,CAAC;QAFS,kBAAa,GAAb,aAAa,CAAgC;QAHxD,kBAAa,GAAoC,IAAI,CAAC;IAM9D,CAAC;IAED,MAAM,CAAC,MAAM,CACX,YAA4C;QAE5C,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF","sourcesContent":["/**\n * VldLazy - Lazy evaluation for recursive schemas\n * Part of Zod 4 API parity implementation\n * Allows schemas that reference themselves (e.g., tree structures, nested categories)\n */\n\nimport { VldBase } from './base';\nimport type { ParseResult } from './base';\n\n/**\n * Lazy validator - defers schema evaluation until runtime\n * Essential for recursive and self-referencing types\n */\nexport class VldLazy<TInput, TOutput> extends VldBase<TInput, TOutput> {\n private _cachedSchema: VldBase<TInput, TOutput> | null = null;\n\n private constructor(\n private readonly _schemaGetter: () => VldBase<TInput, TOutput>\n ) {\n super();\n }\n\n static create<TInput, TOutput>(\n schemaGetter: () => VldBase<TInput, TOutput>\n ): VldLazy<TInput, TOutput> {\n return new VldLazy(schemaGetter);\n }\n\n /**\n * Get the actual schema, caching it after first retrieval\n */\n private _getSchema(): VldBase<TInput, TOutput> {\n if (!this._cachedSchema) {\n this._cachedSchema = this._schemaGetter();\n }\n return this._cachedSchema;\n }\n\n /**\n * Get the inner schema (unwrap)\n */\n unwrap(): VldBase<TInput, TOutput> {\n return this._getSchema();\n }\n\n parse(value: unknown): TOutput {\n return this._getSchema().parse(value);\n }\n\n safeParse(value: unknown): ParseResult<TOutput> {\n return this._getSchema().safeParse(value);\n }\n}\n"]}
|