@oxog/vld 1.1.0 → 1.2.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.
Files changed (120) hide show
  1. package/CHANGELOG.md +107 -2
  2. package/README.md +274 -3
  3. package/dist/codecs/index.d.ts +89 -0
  4. package/dist/codecs/index.d.ts.map +1 -0
  5. package/dist/codecs/index.js +256 -0
  6. package/dist/codecs/index.js.map +1 -0
  7. package/dist/coercion/string.js +1 -1
  8. package/dist/coercion/string.js.map +1 -1
  9. package/dist/index.d.ts +14 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +27 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/locales/af.d.ts.map +1 -1
  14. package/dist/locales/af.js +18 -4
  15. package/dist/locales/af.js.map +1 -1
  16. package/dist/locales/ar.d.ts.map +1 -1
  17. package/dist/locales/ar.js +15 -1
  18. package/dist/locales/ar.js.map +1 -1
  19. package/dist/locales/bn.d.ts.map +1 -1
  20. package/dist/locales/bn.js +15 -1
  21. package/dist/locales/bn.js.map +1 -1
  22. package/dist/locales/da.d.ts.map +1 -1
  23. package/dist/locales/da.js +15 -1
  24. package/dist/locales/da.js.map +1 -1
  25. package/dist/locales/de.d.ts.map +1 -1
  26. package/dist/locales/de.js +15 -1
  27. package/dist/locales/de.js.map +1 -1
  28. package/dist/locales/en.d.ts.map +1 -1
  29. package/dist/locales/en.js +15 -1
  30. package/dist/locales/en.js.map +1 -1
  31. package/dist/locales/es-MX.d.ts.map +1 -1
  32. package/dist/locales/es-MX.js +15 -1
  33. package/dist/locales/es-MX.js.map +1 -1
  34. package/dist/locales/es.d.ts.map +1 -1
  35. package/dist/locales/es.js +15 -1
  36. package/dist/locales/es.js.map +1 -1
  37. package/dist/locales/fi.d.ts.map +1 -1
  38. package/dist/locales/fi.js +15 -1
  39. package/dist/locales/fi.js.map +1 -1
  40. package/dist/locales/fr.d.ts.map +1 -1
  41. package/dist/locales/fr.js +15 -1
  42. package/dist/locales/fr.js.map +1 -1
  43. package/dist/locales/hi.d.ts.map +1 -1
  44. package/dist/locales/hi.js +15 -1
  45. package/dist/locales/hi.js.map +1 -1
  46. package/dist/locales/id.d.ts.map +1 -1
  47. package/dist/locales/id.js +15 -1
  48. package/dist/locales/id.js.map +1 -1
  49. package/dist/locales/it.d.ts.map +1 -1
  50. package/dist/locales/it.js +15 -1
  51. package/dist/locales/it.js.map +1 -1
  52. package/dist/locales/ja.d.ts.map +1 -1
  53. package/dist/locales/ja.js +15 -1
  54. package/dist/locales/ja.js.map +1 -1
  55. package/dist/locales/ko.d.ts.map +1 -1
  56. package/dist/locales/ko.js +15 -1
  57. package/dist/locales/ko.js.map +1 -1
  58. package/dist/locales/nl.d.ts.map +1 -1
  59. package/dist/locales/nl.js +15 -1
  60. package/dist/locales/nl.js.map +1 -1
  61. package/dist/locales/no.d.ts.map +1 -1
  62. package/dist/locales/no.js +15 -1
  63. package/dist/locales/no.js.map +1 -1
  64. package/dist/locales/pl.d.ts.map +1 -1
  65. package/dist/locales/pl.js +15 -1
  66. package/dist/locales/pl.js.map +1 -1
  67. package/dist/locales/pt-BR.d.ts.map +1 -1
  68. package/dist/locales/pt-BR.js +15 -1
  69. package/dist/locales/pt-BR.js.map +1 -1
  70. package/dist/locales/pt.d.ts.map +1 -1
  71. package/dist/locales/pt.js +15 -1
  72. package/dist/locales/pt.js.map +1 -1
  73. package/dist/locales/ru.d.ts.map +1 -1
  74. package/dist/locales/ru.js +15 -1
  75. package/dist/locales/ru.js.map +1 -1
  76. package/dist/locales/sv.d.ts.map +1 -1
  77. package/dist/locales/sv.js +15 -1
  78. package/dist/locales/sv.js.map +1 -1
  79. package/dist/locales/sw.d.ts.map +1 -1
  80. package/dist/locales/sw.js +15 -1
  81. package/dist/locales/sw.js.map +1 -1
  82. package/dist/locales/th.d.ts.map +1 -1
  83. package/dist/locales/th.js +15 -1
  84. package/dist/locales/th.js.map +1 -1
  85. package/dist/locales/tr.d.ts.map +1 -1
  86. package/dist/locales/tr.js +15 -1
  87. package/dist/locales/tr.js.map +1 -1
  88. package/dist/locales/types.d.ts +10 -0
  89. package/dist/locales/types.d.ts.map +1 -1
  90. package/dist/locales/types.js.map +1 -1
  91. package/dist/locales/vi.d.ts.map +1 -1
  92. package/dist/locales/vi.js +15 -1
  93. package/dist/locales/vi.js.map +1 -1
  94. package/dist/locales/zh.d.ts.map +1 -1
  95. package/dist/locales/zh.js +15 -1
  96. package/dist/locales/zh.js.map +1 -1
  97. package/dist/utils/codec-utils.d.ts +44 -0
  98. package/dist/utils/codec-utils.d.ts.map +1 -0
  99. package/dist/utils/codec-utils.js +118 -0
  100. package/dist/utils/codec-utils.js.map +1 -0
  101. package/dist/validators/base64.d.ts +18 -0
  102. package/dist/validators/base64.d.ts.map +1 -0
  103. package/dist/validators/base64.js +62 -0
  104. package/dist/validators/base64.js.map +1 -0
  105. package/dist/validators/codec.d.ts +55 -0
  106. package/dist/validators/codec.d.ts.map +1 -0
  107. package/dist/validators/codec.js +182 -0
  108. package/dist/validators/codec.js.map +1 -0
  109. package/dist/validators/hex.d.ts +17 -0
  110. package/dist/validators/hex.d.ts.map +1 -0
  111. package/dist/validators/hex.js +61 -0
  112. package/dist/validators/hex.js.map +1 -0
  113. package/dist/validators/object.d.ts.map +1 -1
  114. package/dist/validators/object.js +8 -4
  115. package/dist/validators/object.js.map +1 -1
  116. package/dist/validators/uint8array.d.ts +25 -0
  117. package/dist/validators/uint8array.d.ts.map +1 -0
  118. package/dist/validators/uint8array.js +87 -0
  119. package/dist/validators/uint8array.js.map +1 -0
  120. 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}"]}
@@ -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":"object.d.ts","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAe,MAAM,QAAQ,CAAC;AAa3D;;;GAGG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAE3C;;OAEG;IACH,OAAO;IAQP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GAChD,SAAS,CAAC,CAAC,CAAC;IAIf;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IAkFxB;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;IA+DzC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAStC;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC;IAQ3B;;OAEG;IACH,OAAO,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IAW/C;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,GAAG,CAAC;IAgB7B;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAa5D;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAc5D;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GACpD,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAClB,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,QAAQ,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;CAgBlD"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAe,MAAM,QAAQ,CAAC;AAa3D;;;GAGG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAE3C;;OAEG;IACH,OAAO;IAQP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GAChD,SAAS,CAAC,CAAC,CAAC;IAIf;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IAoFxB;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;IAiEzC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAStC;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC;IAQ3B;;OAEG;IACH,OAAO,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IAW/C;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,GAAG,CAAC;IAgB7B;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAa5D;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAc5D;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GACpD,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAClB,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,QAAQ,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;CAgBlD"}
@@ -89,12 +89,14 @@ export class VldObject extends VldBase {
89
89
  throw new Error(getMessages().unexpectedKeys(extraKeys));
90
90
  }
91
91
  }
92
- // Handle passthrough mode - optimized
92
+ // Handle passthrough mode - optimized with prototype pollution protection
93
93
  if (this.config.passthrough) {
94
+ const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];
94
95
  const objKeys = Object.keys(obj);
95
96
  for (let i = 0; i < objKeys.length; i++) {
96
97
  const key = objKeys[i];
97
- if (!this.shapeKeysSet.has(key)) {
98
+ // Skip dangerous keys to prevent prototype pollution
99
+ if (!this.shapeKeysSet.has(key) && !DANGEROUS_KEYS.includes(key)) {
98
100
  result[key] = obj[key];
99
101
  }
100
102
  }
@@ -147,12 +149,14 @@ export class VldObject extends VldBase {
147
149
  };
148
150
  }
149
151
  }
150
- // Handle passthrough mode
152
+ // Handle passthrough mode with prototype pollution protection
151
153
  if (this.config.passthrough) {
154
+ const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];
152
155
  const objKeys = Object.keys(obj);
153
156
  for (let i = 0; i < objKeys.length; i++) {
154
157
  const key = objKeys[i];
155
- if (!this.shapeKeysSet.has(key)) {
158
+ // Skip dangerous keys to prevent prototype pollution
159
+ if (!this.shapeKeysSet.has(key) && !DANGEROUS_KEYS.includes(key)) {
156
160
  result[key] = obj[key];
157
161
  }
158
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult, VldOptional } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Configuration for object validator\n */\ninterface ObjectValidatorConfig<T extends Record<string, any>> {\n readonly shape: { readonly [K in keyof T]: VldBase<unknown, T[K]> };\n readonly strict?: boolean;\n readonly passthrough?: boolean;\n readonly errorMessage?: string;\n}\n\n/**\n * Optimized immutable object validator with chainable methods\n * Features pre-computed keys and Set-based lookups for better performance\n */\nexport class VldObject<T extends Record<string, any>> extends VldBase<unknown, T> {\n private readonly config: ObjectValidatorConfig<T>;\n private readonly shapeKeys: string[];\n private readonly shapeKeysSet: Set<string>;\n \n /**\n * Private constructor to enforce immutability\n */\n private constructor(config: ObjectValidatorConfig<T>) {\n super();\n this.config = config;\n // Pre-compute shape keys for faster access\n this.shapeKeys = Object.keys(config.shape);\n this.shapeKeysSet = new Set(this.shapeKeys);\n }\n \n /**\n * Create a new object validator\n */\n static create<T extends Record<string, any>>(\n shape: { [K in keyof T]: VldBase<unknown, T[K]> }\n ): VldObject<T> {\n return new VldObject({ shape });\n }\n \n /**\n * Parse and validate an object value\n * Ultra-optimized with inline type checks and minimal overhead\n */\n parse(value: unknown): T {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidObject);\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Ultra-optimized field validation with inline fast paths\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n // Inline fast-path validation for common types\n const validatorType = validator.constructor.name;\n \n if (validatorType === 'VldString') {\n // For string with validations, use safeParse to handle email, regex etc.\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else if (validatorType === 'VldNumber') {\n if (typeof fieldValue !== 'number' || isNaN(fieldValue)) {\n throw new Error(getMessages().objectField(key, getMessages().invalidNumber));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldBoolean') {\n if (typeof fieldValue !== 'boolean') {\n throw new Error(getMessages().objectField(key, getMessages().invalidBoolean));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldDate') {\n // Use the actual validator for Date parsing (handles string conversion)\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else {\n // Fallback to safeParse for complex validators\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n }\n }\n \n // Handle strict mode - optimized with Set\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n throw new Error(getMessages().unexpectedKeys(extraKeys));\n }\n }\n \n // Handle passthrough mode - optimized\n if (this.config.passthrough) {\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n if (!this.shapeKeysSet.has(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return result as T;\n }\n \n /**\n * Safely parse and validate an object value\n * Optimized version using pre-computed keys\n */\n safeParse(value: unknown): ParseResult<T> {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n success: false,\n error: new Error(this.config.errorMessage || getMessages().invalidObject)\n };\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Validate all fields\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n const parseResult = validator.safeParse(fieldValue);\n \n if (parseResult.success) {\n result[key] = parseResult.data;\n } else {\n return {\n success: false,\n error: new Error(getMessages().objectField(key, parseResult.error.message))\n };\n }\n }\n \n // Handle strict mode\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n return {\n success: false,\n error: new Error(getMessages().unexpectedKeys(extraKeys))\n };\n }\n }\n \n // Handle passthrough mode\n if (this.config.passthrough) {\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n if (!this.shapeKeysSet.has(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return { success: true, data: result as T };\n }\n \n /**\n * Create a new validator in strict mode (no extra keys allowed)\n */\n strict(message?: string): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: true,\n passthrough: false,\n errorMessage: message\n });\n }\n \n /**\n * Create a new validator in passthrough mode (extra keys are preserved)\n */\n passthrough(): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: false,\n passthrough: true\n });\n }\n \n /**\n * Create a new validator with all fields optional\n */\n partial(): VldObject<{ [K in keyof T]?: T[K] }> {\n const partialShape: any = {};\n for (const key in this.config.shape) {\n partialShape[key] = new VldOptional(this.config.shape[key]);\n }\n return new VldObject({ \n ...this.config, \n shape: partialShape \n }) as any;\n }\n \n /**\n * Create a new validator with deep partial (nested objects also partial)\n */\n deepPartial(): VldObject<any> {\n const deepPartialShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n if (validator instanceof VldObject) {\n deepPartialShape[key] = new VldOptional(validator.deepPartial());\n } else {\n deepPartialShape[key] = new VldOptional(validator);\n }\n }\n return new VldObject({ \n ...this.config, \n shape: deepPartialShape \n });\n }\n \n /**\n * Create a new validator with only specified keys\n */\n pick<K extends keyof T>(...keys: K[]): VldObject<Pick<T, K>> {\n const pickedShape: any = {};\n for (const key of keys) {\n if (key in this.config.shape) {\n pickedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: pickedShape \n });\n }\n \n /**\n * Create a new validator without specified keys\n */\n omit<K extends keyof T>(...keys: K[]): VldObject<Omit<T, K>> {\n const omittedShape: any = {};\n const keysToOmit = new Set(keys);\n for (const key in this.config.shape) {\n if (!keysToOmit.has(key as any)) {\n omittedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: omittedShape \n });\n }\n \n /**\n * Create a new validator with additional fields\n */\n extend<U extends Record<string, any>>(\n extension: { [K in keyof U]: VldBase<unknown, U[K]> }\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...extension } as any\n });\n }\n \n /**\n * Create a new validator by merging with another object validator\n */\n merge<U extends Record<string, any>>(\n other: VldObject<U>\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...other.config.shape } as any\n });\n }\n \n /**\n * Create a new validator with all fields required (removes optional)\n */\n required(): VldObject<{ [K in keyof T]-?: T[K] }> {\n const requiredShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n // If it's optional, unwrap it\n if (validator instanceof VldOptional) {\n requiredShape[key] = (validator as any).baseValidator;\n } else {\n requiredShape[key] = validator;\n }\n }\n return new VldObject({ \n ...this.config, \n shape: requiredShape \n }) as any;\n }\n}"]}
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAYzC;;;GAGG;AACH,MAAM,OAAO,SAAyC,SAAQ,OAAmB;IAK/E;;OAEG;IACH,YAAoB,MAAgC;QAClD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,2CAA2C;QAC3C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CACX,KAAiD;QAEjD,OAAO,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAc;QAClB,kBAAkB;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,MAAM,MAAM,GAAQ,EAAE,CAAC;QAEvB,0DAA0D;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAE5B,+CAA+C;YAC/C,MAAM,aAAa,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;YAEjD,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC;gBAClC,yEAAyE;gBACzE,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACpD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;YACjC,CAAC;iBAAM,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC;gBACzC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;oBACxD,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC/E,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;YAC3B,CAAC;iBAAM,IAAI,aAAa,KAAK,YAAY,EAAE,CAAC;gBAC1C,IAAI,OAAO,UAAU,KAAK,SAAS,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;gBAChF,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;YAC3B,CAAC;iBAAM,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBACvC,wEAAwE;gBACxE,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACpD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,+CAA+C;gBAC/C,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACpD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;YACjC,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACvB,qDAAqD;gBACrD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,KAAc;QACtB,kBAAkB;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,aAAa,CAAC;aAC1E,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,MAAM,MAAM,GAAQ,EAAE,CAAC;QAEvB,sBAAsB;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAE5B,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAEpD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;iBAC5E,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;iBAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACvB,qDAAqD;gBACrD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAW,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAgB;QACrB,OAAO,IAAI,SAAS,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,SAAS,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,OAAO;QACL,MAAM,YAAY,GAAQ,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,SAAS,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,KAAK,EAAE,YAAY;SACpB,CAAQ,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,WAAW;QACT,MAAM,gBAAgB,GAAQ,EAAE,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,SAAS,YAAY,SAAS,EAAE,CAAC;gBACnC,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,SAAS,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,KAAK,EAAE,gBAAgB;SACxB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAoB,GAAG,IAAS;QAClC,MAAM,WAAW,GAAQ,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC7B,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,SAAS,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAoB,GAAG,IAAS;QAClC,MAAM,YAAY,GAAQ,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAU,CAAC,EAAE,CAAC;gBAChC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,SAAS,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,KAAK,EAAE,YAAY;SACpB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CACJ,SAAqD;QAErD,OAAO,IAAI,SAAS,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,SAAS,EAAS;SACrD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CACH,KAAmB;QAEnB,OAAO,IAAI,SAAS,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAS;SAC9D,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,aAAa,GAAQ,EAAE,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,8BAA8B;YAC9B,IAAI,SAAS,YAAY,WAAW,EAAE,CAAC;gBACrC,aAAa,CAAC,GAAG,CAAC,GAAI,SAAiB,CAAC,aAAa,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,SAAS,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,KAAK,EAAE,aAAa;SACrB,CAAQ,CAAC;IACZ,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult, VldOptional } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Configuration for object validator\n */\ninterface ObjectValidatorConfig<T extends Record<string, any>> {\n readonly shape: { readonly [K in keyof T]: VldBase<unknown, T[K]> };\n readonly strict?: boolean;\n readonly passthrough?: boolean;\n readonly errorMessage?: string;\n}\n\n/**\n * Optimized immutable object validator with chainable methods\n * Features pre-computed keys and Set-based lookups for better performance\n */\nexport class VldObject<T extends Record<string, any>> extends VldBase<unknown, T> {\n private readonly config: ObjectValidatorConfig<T>;\n private readonly shapeKeys: string[];\n private readonly shapeKeysSet: Set<string>;\n \n /**\n * Private constructor to enforce immutability\n */\n private constructor(config: ObjectValidatorConfig<T>) {\n super();\n this.config = config;\n // Pre-compute shape keys for faster access\n this.shapeKeys = Object.keys(config.shape);\n this.shapeKeysSet = new Set(this.shapeKeys);\n }\n \n /**\n * Create a new object validator\n */\n static create<T extends Record<string, any>>(\n shape: { [K in keyof T]: VldBase<unknown, T[K]> }\n ): VldObject<T> {\n return new VldObject({ shape });\n }\n \n /**\n * Parse and validate an object value\n * Ultra-optimized with inline type checks and minimal overhead\n */\n parse(value: unknown): T {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidObject);\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Ultra-optimized field validation with inline fast paths\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n // Inline fast-path validation for common types\n const validatorType = validator.constructor.name;\n \n if (validatorType === 'VldString') {\n // For string with validations, use safeParse to handle email, regex etc.\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else if (validatorType === 'VldNumber') {\n if (typeof fieldValue !== 'number' || isNaN(fieldValue)) {\n throw new Error(getMessages().objectField(key, getMessages().invalidNumber));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldBoolean') {\n if (typeof fieldValue !== 'boolean') {\n throw new Error(getMessages().objectField(key, getMessages().invalidBoolean));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldDate') {\n // Use the actual validator for Date parsing (handles string conversion)\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else {\n // Fallback to safeParse for complex validators\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n }\n }\n \n // Handle strict mode - optimized with Set\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n throw new Error(getMessages().unexpectedKeys(extraKeys));\n }\n }\n \n // Handle passthrough mode - optimized with prototype pollution protection\n if (this.config.passthrough) {\n const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n // Skip dangerous keys to prevent prototype pollution\n if (!this.shapeKeysSet.has(key) && !DANGEROUS_KEYS.includes(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return result as T;\n }\n \n /**\n * Safely parse and validate an object value\n * Optimized version using pre-computed keys\n */\n safeParse(value: unknown): ParseResult<T> {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n success: false,\n error: new Error(this.config.errorMessage || getMessages().invalidObject)\n };\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Validate all fields\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n const parseResult = validator.safeParse(fieldValue);\n \n if (parseResult.success) {\n result[key] = parseResult.data;\n } else {\n return {\n success: false,\n error: new Error(getMessages().objectField(key, parseResult.error.message))\n };\n }\n }\n \n // Handle strict mode\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n return {\n success: false,\n error: new Error(getMessages().unexpectedKeys(extraKeys))\n };\n }\n }\n \n // Handle passthrough mode with prototype pollution protection\n if (this.config.passthrough) {\n const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n // Skip dangerous keys to prevent prototype pollution\n if (!this.shapeKeysSet.has(key) && !DANGEROUS_KEYS.includes(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return { success: true, data: result as T };\n }\n \n /**\n * Create a new validator in strict mode (no extra keys allowed)\n */\n strict(message?: string): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: true,\n passthrough: false,\n errorMessage: message\n });\n }\n \n /**\n * Create a new validator in passthrough mode (extra keys are preserved)\n */\n passthrough(): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: false,\n passthrough: true\n });\n }\n \n /**\n * Create a new validator with all fields optional\n */\n partial(): VldObject<{ [K in keyof T]?: T[K] }> {\n const partialShape: any = {};\n for (const key in this.config.shape) {\n partialShape[key] = new VldOptional(this.config.shape[key]);\n }\n return new VldObject({ \n ...this.config, \n shape: partialShape \n }) as any;\n }\n \n /**\n * Create a new validator with deep partial (nested objects also partial)\n */\n deepPartial(): VldObject<any> {\n const deepPartialShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n if (validator instanceof VldObject) {\n deepPartialShape[key] = new VldOptional(validator.deepPartial());\n } else {\n deepPartialShape[key] = new VldOptional(validator);\n }\n }\n return new VldObject({ \n ...this.config, \n shape: deepPartialShape \n });\n }\n \n /**\n * Create a new validator with only specified keys\n */\n pick<K extends keyof T>(...keys: K[]): VldObject<Pick<T, K>> {\n const pickedShape: any = {};\n for (const key of keys) {\n if (key in this.config.shape) {\n pickedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: pickedShape \n });\n }\n \n /**\n * Create a new validator without specified keys\n */\n omit<K extends keyof T>(...keys: K[]): VldObject<Omit<T, K>> {\n const omittedShape: any = {};\n const keysToOmit = new Set(keys);\n for (const key in this.config.shape) {\n if (!keysToOmit.has(key as any)) {\n omittedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: omittedShape \n });\n }\n \n /**\n * Create a new validator with additional fields\n */\n extend<U extends Record<string, any>>(\n extension: { [K in keyof U]: VldBase<unknown, U[K]> }\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...extension } as any\n });\n }\n \n /**\n * Create a new validator by merging with another object validator\n */\n merge<U extends Record<string, any>>(\n other: VldObject<U>\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...other.config.shape } as any\n });\n }\n \n /**\n * Create a new validator with all fields required (removes optional)\n */\n required(): VldObject<{ [K in keyof T]-?: T[K] }> {\n const requiredShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n // If it's optional, unwrap it\n if (validator instanceof VldOptional) {\n requiredShape[key] = (validator as any).baseValidator;\n } else {\n requiredShape[key] = validator;\n }\n }\n return new VldObject({ \n ...this.config, \n shape: requiredShape \n }) as any;\n }\n}"]}
@@ -0,0 +1,25 @@
1
+ import { VldBase, ParseResult } from './base';
2
+ /**
3
+ * Uint8Array validator
4
+ */
5
+ export declare class VldUint8Array extends VldBase<Uint8Array, Uint8Array> {
6
+ private minLength?;
7
+ private maxLength?;
8
+ private exactLength?;
9
+ parse(value: unknown): Uint8Array;
10
+ safeParse(value: unknown): ParseResult<Uint8Array>;
11
+ /**
12
+ * Set minimum byte length
13
+ */
14
+ min(length: number): VldUint8Array;
15
+ /**
16
+ * Set maximum byte length
17
+ */
18
+ max(length: number): VldUint8Array;
19
+ /**
20
+ * Set exact byte length
21
+ */
22
+ length(length: number): VldUint8Array;
23
+ static create(): VldUint8Array;
24
+ }
25
+ //# sourceMappingURL=uint8array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uint8array.d.ts","sourceRoot":"","sources":["../../src/validators/uint8array.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI9C;;GAEG;AACH,qBAAa,aAAc,SAAQ,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;IAChE,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAC,CAAS;IAE7B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU;IAQjC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC;IA2ClD;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAQlC;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAQlC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAQrC,MAAM,CAAC,MAAM,IAAI,aAAa;CAG/B"}
@@ -0,0 +1,87 @@
1
+ import { VldBase } from './base.js';
2
+ import { VldError, createIssue } from '../errors.js';
3
+ import { getMessages } from '../locales.js';
4
+ /**
5
+ * Uint8Array validator
6
+ */
7
+ export class VldUint8Array extends VldBase {
8
+ parse(value) {
9
+ const result = this.safeParse(value);
10
+ if (!result.success) {
11
+ throw result.error;
12
+ }
13
+ return result.data;
14
+ }
15
+ safeParse(value) {
16
+ if (!(value instanceof Uint8Array)) {
17
+ return {
18
+ success: false,
19
+ error: new VldError([
20
+ createIssue('invalid_type', [], getMessages().expectedUint8Array)
21
+ ])
22
+ };
23
+ }
24
+ // Check exact length if specified
25
+ if (this.exactLength !== undefined && value.length !== this.exactLength) {
26
+ return {
27
+ success: false,
28
+ error: new VldError([
29
+ createIssue('custom', [], getMessages().uint8ArrayExactLength.replace('{length}', this.exactLength.toString()))
30
+ ])
31
+ };
32
+ }
33
+ // Check minimum length
34
+ if (this.minLength !== undefined && value.length < this.minLength) {
35
+ return {
36
+ success: false,
37
+ error: new VldError([
38
+ createIssue('custom', [], getMessages().uint8ArrayMinLength.replace('{min}', this.minLength.toString()))
39
+ ])
40
+ };
41
+ }
42
+ // Check maximum length
43
+ if (this.maxLength !== undefined && value.length > this.maxLength) {
44
+ return {
45
+ success: false,
46
+ error: new VldError([
47
+ createIssue('custom', [], getMessages().uint8ArrayMaxLength.replace('{max}', this.maxLength.toString()))
48
+ ])
49
+ };
50
+ }
51
+ return { success: true, data: value };
52
+ }
53
+ /**
54
+ * Set minimum byte length
55
+ */
56
+ min(length) {
57
+ const validator = new VldUint8Array();
58
+ validator.minLength = length;
59
+ validator.maxLength = this.maxLength;
60
+ validator.exactLength = this.exactLength;
61
+ return validator;
62
+ }
63
+ /**
64
+ * Set maximum byte length
65
+ */
66
+ max(length) {
67
+ const validator = new VldUint8Array();
68
+ validator.minLength = this.minLength;
69
+ validator.maxLength = length;
70
+ validator.exactLength = this.exactLength;
71
+ return validator;
72
+ }
73
+ /**
74
+ * Set exact byte length
75
+ */
76
+ length(length) {
77
+ const validator = new VldUint8Array();
78
+ validator.minLength = this.minLength;
79
+ validator.maxLength = this.maxLength;
80
+ validator.exactLength = length;
81
+ return validator;
82
+ }
83
+ static create() {
84
+ return new VldUint8Array();
85
+ }
86
+ }
87
+ //# sourceMappingURL=uint8array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uint8array.js","sourceRoot":"","sources":["../../src/validators/uint8array.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 * Uint8Array validator\n */\nexport class VldUint8Array extends VldBase<Uint8Array, Uint8Array> {\n private minLength?: number;\n private maxLength?: number;\n private exactLength?: number;\n \n parse(value: unknown): Uint8Array {\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<Uint8Array> {\n if (!(value instanceof Uint8Array)) {\n return {\n success: false,\n error: new VldError([\n createIssue('invalid_type', [], getMessages().expectedUint8Array)\n ])\n };\n }\n \n // Check exact length if specified\n if (this.exactLength !== undefined && value.length !== this.exactLength) {\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().uint8ArrayExactLength.replace('{length}', this.exactLength.toString()))\n ])\n };\n }\n \n // Check minimum length\n if (this.minLength !== undefined && value.length < this.minLength) {\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().uint8ArrayMinLength.replace('{min}', this.minLength.toString()))\n ])\n };\n }\n \n // Check maximum length\n if (this.maxLength !== undefined && value.length > this.maxLength) {\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().uint8ArrayMaxLength.replace('{max}', this.maxLength.toString()))\n ])\n };\n }\n \n return { success: true, data: value };\n }\n \n /**\n * Set minimum byte length\n */\n min(length: number): VldUint8Array {\n const validator = new VldUint8Array();\n validator.minLength = length;\n validator.maxLength = this.maxLength;\n validator.exactLength = this.exactLength;\n return validator;\n }\n \n /**\n * Set maximum byte length\n */\n max(length: number): VldUint8Array {\n const validator = new VldUint8Array();\n validator.minLength = this.minLength;\n validator.maxLength = length;\n validator.exactLength = this.exactLength;\n return validator;\n }\n \n /**\n * Set exact byte length\n */\n length(length: number): VldUint8Array {\n const validator = new VldUint8Array();\n validator.minLength = this.minLength;\n validator.maxLength = this.maxLength;\n validator.exactLength = length;\n return validator;\n }\n \n static create(): VldUint8Array {\n return new VldUint8Array();\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxog/vld",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Ultra-fast TypeScript-first schema validation with zero dependencies and 27+ language support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",