@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.
Files changed (261) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/README.md +61 -43
  3. package/dist/coercion/bigint.js +1 -1
  4. package/dist/coercion/boolean.d.ts.map +1 -1
  5. package/dist/coercion/boolean.js +7 -3
  6. package/dist/coercion/boolean.js.map +1 -1
  7. package/dist/coercion/date.js +1 -1
  8. package/dist/coercion/number.d.ts.map +1 -1
  9. package/dist/coercion/number.js +20 -4
  10. package/dist/coercion/number.js.map +1 -1
  11. package/dist/coercion/string.d.ts.map +1 -1
  12. package/dist/coercion/string.js +84 -12
  13. package/dist/coercion/string.js.map +1 -1
  14. package/dist/index.d.ts +593 -3
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +76 -5
  17. package/dist/index.js.map +1 -1
  18. package/dist/locales/af.d.ts.map +1 -1
  19. package/dist/locales/af.js +21 -4
  20. package/dist/locales/af.js.map +1 -1
  21. package/dist/locales/ar.d.ts.map +1 -1
  22. package/dist/locales/ar.js +21 -4
  23. package/dist/locales/ar.js.map +1 -1
  24. package/dist/locales/backup-en.d.ts +3 -0
  25. package/dist/locales/backup-en.d.ts.map +1 -0
  26. package/dist/locales/backup-en.js +105 -0
  27. package/dist/locales/backup-en.js.map +1 -0
  28. package/dist/locales/bn.d.ts.map +1 -1
  29. package/dist/locales/bn.js +21 -4
  30. package/dist/locales/bn.js.map +1 -1
  31. package/dist/locales/da.d.ts.map +1 -1
  32. package/dist/locales/da.js +21 -4
  33. package/dist/locales/da.js.map +1 -1
  34. package/dist/locales/de.d.ts.map +1 -1
  35. package/dist/locales/de.js +21 -4
  36. package/dist/locales/de.js.map +1 -1
  37. package/dist/locales/en.d.ts.map +1 -1
  38. package/dist/locales/en.js +21 -4
  39. package/dist/locales/en.js.map +1 -1
  40. package/dist/locales/es-MX.d.ts.map +1 -1
  41. package/dist/locales/es-MX.js +20 -4
  42. package/dist/locales/es-MX.js.map +1 -1
  43. package/dist/locales/es.d.ts.map +1 -1
  44. package/dist/locales/es.js +21 -4
  45. package/dist/locales/es.js.map +1 -1
  46. package/dist/locales/fi.d.ts.map +1 -1
  47. package/dist/locales/fi.js +21 -4
  48. package/dist/locales/fi.js.map +1 -1
  49. package/dist/locales/fr.d.ts.map +1 -1
  50. package/dist/locales/fr.js +21 -4
  51. package/dist/locales/fr.js.map +1 -1
  52. package/dist/locales/hi.d.ts.map +1 -1
  53. package/dist/locales/hi.js +21 -4
  54. package/dist/locales/hi.js.map +1 -1
  55. package/dist/locales/id.d.ts.map +1 -1
  56. package/dist/locales/id.js +21 -4
  57. package/dist/locales/id.js.map +1 -1
  58. package/dist/locales/it.d.ts.map +1 -1
  59. package/dist/locales/it.js +21 -4
  60. package/dist/locales/it.js.map +1 -1
  61. package/dist/locales/ja.d.ts.map +1 -1
  62. package/dist/locales/ja.js +21 -4
  63. package/dist/locales/ja.js.map +1 -1
  64. package/dist/locales/ko.d.ts.map +1 -1
  65. package/dist/locales/ko.js +21 -4
  66. package/dist/locales/ko.js.map +1 -1
  67. package/dist/locales/nl.d.ts.map +1 -1
  68. package/dist/locales/nl.js +21 -4
  69. package/dist/locales/nl.js.map +1 -1
  70. package/dist/locales/no.d.ts.map +1 -1
  71. package/dist/locales/no.js +21 -4
  72. package/dist/locales/no.js.map +1 -1
  73. package/dist/locales/pl.d.ts.map +1 -1
  74. package/dist/locales/pl.js +21 -4
  75. package/dist/locales/pl.js.map +1 -1
  76. package/dist/locales/pt-BR.d.ts.map +1 -1
  77. package/dist/locales/pt-BR.js +21 -4
  78. package/dist/locales/pt-BR.js.map +1 -1
  79. package/dist/locales/pt.d.ts.map +1 -1
  80. package/dist/locales/pt.js +21 -4
  81. package/dist/locales/pt.js.map +1 -1
  82. package/dist/locales/ru.d.ts.map +1 -1
  83. package/dist/locales/ru.js +21 -4
  84. package/dist/locales/ru.js.map +1 -1
  85. package/dist/locales/sv.d.ts.map +1 -1
  86. package/dist/locales/sv.js +21 -4
  87. package/dist/locales/sv.js.map +1 -1
  88. package/dist/locales/sw.d.ts.map +1 -1
  89. package/dist/locales/sw.js +21 -4
  90. package/dist/locales/sw.js.map +1 -1
  91. package/dist/locales/th.d.ts.map +1 -1
  92. package/dist/locales/th.js +21 -4
  93. package/dist/locales/th.js.map +1 -1
  94. package/dist/locales/tr.d.ts.map +1 -1
  95. package/dist/locales/tr.js +21 -4
  96. package/dist/locales/tr.js.map +1 -1
  97. package/dist/locales/types.d.ts +16 -3
  98. package/dist/locales/types.d.ts.map +1 -1
  99. package/dist/locales/types.js.map +1 -1
  100. package/dist/locales/vi.d.ts.map +1 -1
  101. package/dist/locales/vi.js +21 -4
  102. package/dist/locales/vi.js.map +1 -1
  103. package/dist/locales/zh.d.ts.map +1 -1
  104. package/dist/locales/zh.js +21 -4
  105. package/dist/locales/zh.js.map +1 -1
  106. package/dist/utils/codec-utils.d.ts +3 -1
  107. package/dist/utils/codec-utils.d.ts.map +1 -1
  108. package/dist/utils/codec-utils.js +110 -5
  109. package/dist/utils/codec-utils.js.map +1 -1
  110. package/dist/utils/deep-merge.d.ts +3 -0
  111. package/dist/utils/deep-merge.d.ts.map +1 -1
  112. package/dist/utils/deep-merge.js +30 -22
  113. package/dist/utils/deep-merge.js.map +1 -1
  114. package/dist/utils/ip-validation.d.ts +11 -0
  115. package/dist/utils/ip-validation.d.ts.map +1 -0
  116. package/dist/utils/ip-validation.js +78 -0
  117. package/dist/utils/ip-validation.js.map +1 -0
  118. package/dist/utils/security.d.ts +12 -0
  119. package/dist/utils/security.d.ts.map +1 -0
  120. package/dist/utils/security.js +61 -0
  121. package/dist/utils/security.js.map +1 -0
  122. package/dist/validators/array.d.ts +7 -0
  123. package/dist/validators/array.d.ts.map +1 -1
  124. package/dist/validators/array.js +57 -2
  125. package/dist/validators/array.js.map +1 -1
  126. package/dist/validators/base.d.ts +131 -0
  127. package/dist/validators/base.d.ts.map +1 -1
  128. package/dist/validators/base.js +247 -1
  129. package/dist/validators/base.js.map +1 -1
  130. package/dist/validators/base64.d.ts.map +1 -1
  131. package/dist/validators/base64.js +6 -3
  132. package/dist/validators/base64.js.map +1 -1
  133. package/dist/validators/bigint.d.ts +20 -0
  134. package/dist/validators/bigint.d.ts.map +1 -1
  135. package/dist/validators/bigint.js +39 -1
  136. package/dist/validators/bigint.js.map +1 -1
  137. package/dist/validators/boolean.js +29 -1
  138. package/dist/validators/boolean.js.map +1 -1
  139. package/dist/validators/codec.js +1 -1
  140. package/dist/validators/custom.d.ts +47 -0
  141. package/dist/validators/custom.d.ts.map +1 -0
  142. package/dist/validators/custom.js +50 -0
  143. package/dist/validators/custom.js.map +1 -0
  144. package/dist/validators/date.d.ts +21 -1
  145. package/dist/validators/date.d.ts.map +1 -1
  146. package/dist/validators/date.js +109 -30
  147. package/dist/validators/date.js.map +1 -1
  148. package/dist/validators/discriminated-union.d.ts +29 -0
  149. package/dist/validators/discriminated-union.d.ts.map +1 -0
  150. package/dist/validators/discriminated-union.js +98 -0
  151. package/dist/validators/discriminated-union.js.map +1 -0
  152. package/dist/validators/enum.d.ts +10 -0
  153. package/dist/validators/enum.d.ts.map +1 -1
  154. package/dist/validators/enum.js +38 -1
  155. package/dist/validators/enum.js.map +1 -1
  156. package/dist/validators/file.d.ts +57 -0
  157. package/dist/validators/file.d.ts.map +1 -0
  158. package/dist/validators/file.js +114 -0
  159. package/dist/validators/file.js.map +1 -0
  160. package/dist/validators/function.d.ts +26 -0
  161. package/dist/validators/function.d.ts.map +1 -0
  162. package/dist/validators/function.js +45 -0
  163. package/dist/validators/function.js.map +1 -0
  164. package/dist/validators/hex.d.ts.map +1 -1
  165. package/dist/validators/hex.js +3 -2
  166. package/dist/validators/hex.js.map +1 -1
  167. package/dist/validators/index.d.ts +18 -1
  168. package/dist/validators/index.d.ts.map +1 -1
  169. package/dist/validators/index.js +16 -1
  170. package/dist/validators/index.js.map +1 -1
  171. package/dist/validators/intersection.d.ts.map +1 -1
  172. package/dist/validators/intersection.js +15 -8
  173. package/dist/validators/intersection.js.map +1 -1
  174. package/dist/validators/json.d.ts +26 -0
  175. package/dist/validators/json.d.ts.map +1 -0
  176. package/dist/validators/json.js +64 -0
  177. package/dist/validators/json.js.map +1 -0
  178. package/dist/validators/lazy.d.ts +28 -0
  179. package/dist/validators/lazy.d.ts.map +1 -0
  180. package/dist/validators/lazy.js +42 -0
  181. package/dist/validators/lazy.js.map +1 -0
  182. package/dist/validators/literal.js +1 -1
  183. package/dist/validators/map.js +1 -1
  184. package/dist/validators/nan.d.ts +17 -0
  185. package/dist/validators/nan.d.ts.map +1 -0
  186. package/dist/validators/nan.js +32 -0
  187. package/dist/validators/nan.js.map +1 -0
  188. package/dist/validators/never.js +1 -1
  189. package/dist/validators/null.d.ts +16 -0
  190. package/dist/validators/null.d.ts.map +1 -0
  191. package/dist/validators/null.js +31 -0
  192. package/dist/validators/null.js.map +1 -0
  193. package/dist/validators/number.d.ts +22 -0
  194. package/dist/validators/number.d.ts.map +1 -1
  195. package/dist/validators/number.js +56 -4
  196. package/dist/validators/number.js.map +1 -1
  197. package/dist/validators/object.d.ts +37 -0
  198. package/dist/validators/object.d.ts.map +1 -1
  199. package/dist/validators/object.js +183 -14
  200. package/dist/validators/object.js.map +1 -1
  201. package/dist/validators/record.d.ts +15 -2
  202. package/dist/validators/record.d.ts.map +1 -1
  203. package/dist/validators/record.js +77 -1
  204. package/dist/validators/record.js.map +1 -1
  205. package/dist/validators/set.js +1 -1
  206. package/dist/validators/string-bool.d.ts +61 -0
  207. package/dist/validators/string-bool.d.ts.map +1 -0
  208. package/dist/validators/string-bool.js +127 -0
  209. package/dist/validators/string-bool.js.map +1 -0
  210. package/dist/validators/string-formats.d.ts +97 -0
  211. package/dist/validators/string-formats.d.ts.map +1 -0
  212. package/dist/validators/string-formats.js +120 -0
  213. package/dist/validators/string-formats.js.map +1 -0
  214. package/dist/validators/string.d.ts.map +1 -1
  215. package/dist/validators/string.js +16 -5
  216. package/dist/validators/string.js.map +1 -1
  217. package/dist/validators/symbol.js +1 -1
  218. package/dist/validators/template-literal.d.ts +32 -0
  219. package/dist/validators/template-literal.d.ts.map +1 -0
  220. package/dist/validators/template-literal.js +101 -0
  221. package/dist/validators/template-literal.js.map +1 -0
  222. package/dist/validators/tuple.js +1 -1
  223. package/dist/validators/uint8array.d.ts +21 -4
  224. package/dist/validators/uint8array.d.ts.map +1 -1
  225. package/dist/validators/uint8array.js +34 -23
  226. package/dist/validators/uint8array.js.map +1 -1
  227. package/dist/validators/undefined.d.ts +16 -0
  228. package/dist/validators/undefined.d.ts.map +1 -0
  229. package/dist/validators/undefined.js +31 -0
  230. package/dist/validators/undefined.js.map +1 -0
  231. package/dist/validators/union.d.ts +3 -0
  232. package/dist/validators/union.d.ts.map +1 -1
  233. package/dist/validators/union.js +46 -41
  234. package/dist/validators/union.js.map +1 -1
  235. package/dist/validators/void.js +1 -1
  236. package/dist/validators/xor.d.ts +23 -0
  237. package/dist/validators/xor.d.ts.map +1 -0
  238. package/dist/validators/xor.js +64 -0
  239. package/dist/validators/xor.js.map +1 -0
  240. package/package.json +2 -2
  241. package/dist/index-new.d.ts.map +0 -1
  242. package/dist/locales.d.ts +0 -54
  243. package/dist/locales.d.ts.map +0 -1
  244. package/dist/locales.js +0 -732
  245. package/dist/locales.js.map +0 -1
  246. package/dist/validators/object-optimized.d.ts +0 -23
  247. package/dist/validators/object-optimized.d.ts.map +0 -1
  248. package/dist/validators/object-optimized.js +0 -179
  249. package/dist/validators/object-optimized.js.map +0 -1
  250. package/dist/validators/object-ultra.d.ts +0 -34
  251. package/dist/validators/object-ultra.d.ts.map +0 -1
  252. package/dist/validators/object-ultra.js +0 -175
  253. package/dist/validators/object-ultra.js.map +0 -1
  254. package/dist/validators/string-ultra.d.ts +0 -49
  255. package/dist/validators/string-ultra.d.ts.map +0 -1
  256. package/dist/validators/string-ultra.js +0 -217
  257. package/dist/validators/string-ultra.js.map +0 -1
  258. package/dist/validators/union-optimized.d.ts +0 -15
  259. package/dist/validators/union-optimized.d.ts.map +0 -1
  260. package/dist/validators/union-optimized.js +0 -92
  261. package/dist/validators/union-optimized.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { VldBase } from './base.js';
2
- import { getMessages } from '../locales.js';
2
+ import { getMessages } from '../locales/index.js';
3
3
  /**
4
4
  * Immutable array validator with chainable methods
5
5
  */
@@ -48,7 +48,7 @@ export class VldArray extends VldBase {
48
48
  if (this.config.unique) {
49
49
  const seen = new Set();
50
50
  for (const item of result) {
51
- const key = typeof item === 'object' ? JSON.stringify(item) : item;
51
+ const key = typeof item === 'object' ? this.stableStringify(item) : item;
52
52
  if (seen.has(key)) {
53
53
  throw new Error('Array must contain unique items');
54
54
  }
@@ -68,6 +68,61 @@ export class VldArray extends VldBase {
68
68
  return { success: false, error: error };
69
69
  }
70
70
  }
71
+ /**
72
+ * Create a stable string representation of an object for hashing
73
+ * Handles circular references and deep nesting gracefully
74
+ * BUG-006 FIX: Added depth limit to prevent stack overflow
75
+ * BUG-NEW-003 FIX: Fixed depth tracking to properly track recursion depth
76
+ */
77
+ stableStringify(obj) {
78
+ const seen = new WeakSet();
79
+ const MAX_DEPTH = 100; // Reasonable depth limit to prevent stack overflow
80
+ // Helper function to sort keys and create stable representation
81
+ const sortedStringify = (value, depth = 0) => {
82
+ // Check depth limit
83
+ if (depth > MAX_DEPTH) {
84
+ return '"[Max Depth Exceeded]"';
85
+ }
86
+ // Handle primitives
87
+ if (value === null)
88
+ return 'null';
89
+ if (value === undefined)
90
+ return 'undefined';
91
+ if (typeof value !== 'object')
92
+ return JSON.stringify(value);
93
+ // Handle circular references
94
+ if (seen.has(value)) {
95
+ return '"[Circular]"';
96
+ }
97
+ seen.add(value);
98
+ try {
99
+ // Handle arrays
100
+ if (Array.isArray(value)) {
101
+ const items = value.map(item => sortedStringify(item, depth + 1));
102
+ return `[${items.join(',')}]`;
103
+ }
104
+ // Handle objects - sort keys for stability
105
+ const keys = Object.keys(value).sort();
106
+ const pairs = keys.map(key => {
107
+ const serializedKey = JSON.stringify(key);
108
+ const serializedValue = sortedStringify(value[key], depth + 1);
109
+ return `${serializedKey}:${serializedValue}`;
110
+ });
111
+ return `{${pairs.join(',')}}`;
112
+ }
113
+ finally {
114
+ // Clean up seen set for this branch
115
+ seen.delete(value);
116
+ }
117
+ };
118
+ try {
119
+ return sortedStringify(obj);
120
+ }
121
+ catch (error) {
122
+ // Fallback to safe representation if stringify fails
123
+ return String(obj);
124
+ }
125
+ }
71
126
  /**
72
127
  * Create a new validator with minimum length constraint
73
128
  */
@@ -1 +1 @@
1
- {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/validators/array.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Configuration for array validator\n */\ninterface ArrayValidatorConfig<T> {\n readonly itemValidator: VldBase<unknown, T>;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly exactLength?: number;\n readonly unique?: boolean;\n readonly errorMessage?: string;\n}\n\n/**\n * Immutable array validator with chainable methods\n */\nexport class VldArray<T> extends VldBase<unknown[], T[]> {\n private readonly config: ArrayValidatorConfig<T>;\n \n /**\n * Private constructor to enforce immutability\n */\n private constructor(config: ArrayValidatorConfig<T>) {\n super();\n this.config = config;\n }\n \n /**\n * Create a new array validator\n */\n static create<T>(itemValidator: VldBase<unknown, T>): VldArray<T> {\n return new VldArray({ itemValidator });\n }\n \n /**\n * Parse and validate an array value\n */\n parse(value: unknown): T[] {\n if (!Array.isArray(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidArray);\n }\n \n // Validate length constraints\n if (this.config.exactLength !== undefined && value.length !== this.config.exactLength) {\n throw new Error(this.config.errorMessage || getMessages().arrayLength(this.config.exactLength));\n }\n \n if (this.config.minLength !== undefined && value.length < this.config.minLength) {\n throw new Error(this.config.errorMessage || getMessages().arrayMin(this.config.minLength));\n }\n \n if (this.config.maxLength !== undefined && value.length > this.config.maxLength) {\n throw new Error(this.config.errorMessage || getMessages().arrayMax(this.config.maxLength));\n }\n \n // Validate each item with optimized loop and safeParse\n const result: T[] = [];\n const length = value.length;\n \n for (let i = 0; i < length; i++) {\n const parseResult = this.config.itemValidator.safeParse(value[i]);\n if (!parseResult.success) {\n throw new Error(getMessages().arrayItem(i, parseResult.error.message));\n }\n result[i] = parseResult.data; // Direct assignment is faster than push\n }\n \n // Check uniqueness if required\n if (this.config.unique) {\n const seen = new Set<any>();\n for (const item of result) {\n const key = typeof item === 'object' ? JSON.stringify(item) : item;\n if (seen.has(key)) {\n throw new Error('Array must contain unique items');\n }\n seen.add(key);\n }\n }\n \n return result;\n }\n \n /**\n * Safely parse and validate an array value\n */\n safeParse(value: unknown): ParseResult<T[]> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n \n /**\n * Create a new validator with minimum length constraint\n */\n min(length: number, message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n minLength: length,\n errorMessage: message || getMessages().arrayMin(length)\n });\n }\n \n /**\n * Create a new validator with maximum length constraint\n */\n max(length: number, message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n maxLength: length,\n errorMessage: message || getMessages().arrayMax(length)\n });\n }\n \n /**\n * Create a new validator with exact length constraint\n */\n length(length: number, message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n exactLength: length,\n minLength: undefined,\n maxLength: undefined,\n errorMessage: message || getMessages().arrayLength(length)\n });\n }\n \n /**\n * Create a new validator that ensures array is not empty\n */\n nonempty(message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n minLength: 1,\n errorMessage: message || getMessages().arrayEmpty\n });\n }\n \n /**\n * Create a new validator that ensures array contains unique items\n */\n unique(message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n unique: true,\n errorMessage: message || 'Array must contain unique items'\n });\n }\n \n /**\n * Create a new validator with a range constraint for length\n */\n between(min: number, max: number, message?: string): VldArray<T> {\n return new VldArray({\n ...this.config,\n minLength: min,\n maxLength: max,\n errorMessage: message || `Array length must be between ${min} and ${max}`\n });\n }\n}"]}
1
+ {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/validators/array.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Configuration for array validator\r\n */\r\ninterface ArrayValidatorConfig<T> {\r\n readonly itemValidator: VldBase<unknown, T>;\r\n readonly minLength?: number;\r\n readonly maxLength?: number;\r\n readonly exactLength?: number;\r\n readonly unique?: boolean;\r\n readonly errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Immutable array validator with chainable methods\r\n */\r\nexport class VldArray<T> extends VldBase<unknown[], T[]> {\r\n private readonly config: ArrayValidatorConfig<T>;\r\n \r\n /**\r\n * Private constructor to enforce immutability\r\n */\r\n private constructor(config: ArrayValidatorConfig<T>) {\r\n super();\r\n this.config = config;\r\n }\r\n \r\n /**\r\n * Create a new array validator\r\n */\r\n static create<T>(itemValidator: VldBase<unknown, T>): VldArray<T> {\r\n return new VldArray({ itemValidator });\r\n }\r\n \r\n /**\r\n * Parse and validate an array value\r\n */\r\n parse(value: unknown): T[] {\r\n if (!Array.isArray(value)) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidArray);\r\n }\r\n \r\n // Validate length constraints\r\n if (this.config.exactLength !== undefined && value.length !== this.config.exactLength) {\r\n throw new Error(this.config.errorMessage || getMessages().arrayLength(this.config.exactLength));\r\n }\r\n \r\n if (this.config.minLength !== undefined && value.length < this.config.minLength) {\r\n throw new Error(this.config.errorMessage || getMessages().arrayMin(this.config.minLength));\r\n }\r\n \r\n if (this.config.maxLength !== undefined && value.length > this.config.maxLength) {\r\n throw new Error(this.config.errorMessage || getMessages().arrayMax(this.config.maxLength));\r\n }\r\n \r\n // Validate each item with optimized loop and safeParse\r\n const result: T[] = [];\r\n const length = value.length;\r\n \r\n for (let i = 0; i < length; i++) {\r\n const parseResult = this.config.itemValidator.safeParse(value[i]);\r\n if (!parseResult.success) {\r\n throw new Error(getMessages().arrayItem(i, parseResult.error.message));\r\n }\r\n result[i] = parseResult.data; // Direct assignment is faster than push\r\n }\r\n \r\n // Check uniqueness if required\r\n if (this.config.unique) {\r\n const seen = new Set<any>();\r\n for (const item of result) {\r\n const key = typeof item === 'object' ? this.stableStringify(item) : item;\r\n if (seen.has(key)) {\r\n throw new Error('Array must contain unique items');\r\n }\r\n seen.add(key);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n \r\n /**\r\n * Safely parse and validate an array value\r\n */\r\n safeParse(value: unknown): ParseResult<T[]> {\r\n try {\r\n return { success: true, data: this.parse(value) };\r\n } catch (error) {\r\n return { success: false, error: error as Error };\r\n }\r\n }\r\n\r\n /**\r\n * Create a stable string representation of an object for hashing\r\n * Handles circular references and deep nesting gracefully\r\n * BUG-006 FIX: Added depth limit to prevent stack overflow\r\n * BUG-NEW-003 FIX: Fixed depth tracking to properly track recursion depth\r\n */\r\n private stableStringify(obj: any): string {\r\n const seen = new WeakSet();\r\n const MAX_DEPTH = 100; // Reasonable depth limit to prevent stack overflow\r\n\r\n // Helper function to sort keys and create stable representation\r\n const sortedStringify = (value: any, depth: number = 0): string => {\r\n // Check depth limit\r\n if (depth > MAX_DEPTH) {\r\n return '\"[Max Depth Exceeded]\"';\r\n }\r\n\r\n // Handle primitives\r\n if (value === null) return 'null';\r\n if (value === undefined) return 'undefined';\r\n if (typeof value !== 'object') return JSON.stringify(value);\r\n\r\n // Handle circular references\r\n if (seen.has(value)) {\r\n return '\"[Circular]\"';\r\n }\r\n\r\n seen.add(value);\r\n\r\n try {\r\n // Handle arrays\r\n if (Array.isArray(value)) {\r\n const items = value.map(item => sortedStringify(item, depth + 1));\r\n return `[${items.join(',')}]`;\r\n }\r\n\r\n // Handle objects - sort keys for stability\r\n const keys = Object.keys(value).sort();\r\n const pairs = keys.map(key => {\r\n const serializedKey = JSON.stringify(key);\r\n const serializedValue = sortedStringify(value[key], depth + 1);\r\n return `${serializedKey}:${serializedValue}`;\r\n });\r\n\r\n return `{${pairs.join(',')}}`;\r\n } finally {\r\n // Clean up seen set for this branch\r\n seen.delete(value);\r\n }\r\n };\r\n\r\n try {\r\n return sortedStringify(obj);\r\n } catch (error) {\r\n // Fallback to safe representation if stringify fails\r\n return String(obj);\r\n }\r\n }\r\n \r\n /**\r\n * Create a new validator with minimum length constraint\r\n */\r\n min(length: number, message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n minLength: length,\r\n errorMessage: message || getMessages().arrayMin(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with maximum length constraint\r\n */\r\n max(length: number, message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n maxLength: length,\r\n errorMessage: message || getMessages().arrayMax(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with exact length constraint\r\n */\r\n length(length: number, message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n exactLength: length,\r\n minLength: undefined,\r\n maxLength: undefined,\r\n errorMessage: message || getMessages().arrayLength(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that ensures array is not empty\r\n */\r\n nonempty(message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n minLength: 1,\r\n errorMessage: message || getMessages().arrayEmpty\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that ensures array contains unique items\r\n */\r\n unique(message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n unique: true,\r\n errorMessage: message || 'Array must contain unique items'\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with a range constraint for length\r\n */\r\n between(min: number, max: number, message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n minLength: min,\r\n maxLength: max,\r\n errorMessage: message || `Array length must be between ${min} and ${max}`\r\n });\r\n }\r\n}"]}
@@ -8,6 +8,16 @@ export type ParseResult<T> = {
8
8
  readonly success: false;
9
9
  readonly error: Error;
10
10
  };
11
+ /**
12
+ * Context for superRefine - allows adding multiple issues
13
+ */
14
+ export interface SuperRefineContext {
15
+ addIssue(issue: {
16
+ message: string;
17
+ code?: string;
18
+ }): void;
19
+ path: (string | number)[];
20
+ }
11
21
  /**
12
22
  * Abstract base class for all validators
13
23
  * Implements immutable pattern to prevent memory leaks and race conditions
@@ -34,6 +44,7 @@ export declare abstract class VldBase<TInput, TOutput = TInput> {
34
44
  isValid(value: unknown): boolean;
35
45
  /**
36
46
  * Parse a value or return a default if validation fails
47
+ * BUG-NEW-017 FIX: Validate default value to ensure type safety
37
48
  * @param value The value to validate
38
49
  * @param defaultValue The default value to return on failure
39
50
  * @returns The validated value or default
@@ -47,6 +58,12 @@ export declare abstract class VldBase<TInput, TOutput = TInput> {
47
58
  */
48
59
  refine<TRefined extends TOutput>(predicate: (value: TOutput) => value is TRefined, message?: string): VldRefine<TInput, TOutput, TRefined>;
49
60
  refine(predicate: (value: TOutput) => boolean, message?: string): VldRefine<TInput, TOutput, TOutput>;
61
+ /**
62
+ * Advanced refinement with context for adding multiple issues
63
+ * @param refinement The refinement function with context
64
+ * @returns A new super refined validator
65
+ */
66
+ superRefine(refinement: (value: TOutput, ctx: SuperRefineContext) => void | Promise<void>): VldSuperRefine<TInput, TOutput>;
50
67
  /**
51
68
  * Create a new validator that transforms the output
52
69
  * @param transformer The transformation function
@@ -80,6 +97,67 @@ export declare abstract class VldBase<TInput, TOutput = TInput> {
80
97
  * @returns A new nullish validator
81
98
  */
82
99
  nullish(): VldNullish<TInput, TOutput>;
100
+ /**
101
+ * Pipe the output of this validator into another validator
102
+ * @param next The next validator to pipe into
103
+ * @returns A new piped validator
104
+ */
105
+ pipe<TNextOutput>(next: VldBase<TOutput, TNextOutput>): VldPipe<TInput, TOutput, TNextOutput>;
106
+ /**
107
+ * Create a new validator that returns readonly output
108
+ * Zod 4 API parity - marks output as readonly for TypeScript
109
+ * @returns A new readonly validator
110
+ */
111
+ readonly(): VldReadonly<TInput, TOutput>;
112
+ /**
113
+ * Brand the output type with a unique brand for nominal typing
114
+ * Zod 4 API parity - prevents accidental assignment of similarly typed values
115
+ * @returns A new branded validator
116
+ * @example
117
+ * const userIdSchema = v.string().brand<'UserId'>();
118
+ * const productIdSchema = v.string().brand<'ProductId'>();
119
+ *
120
+ * let userId: UserId = userIdSchema.parse('abc');
121
+ * let productId: ProductId = productIdSchema.parse('xyz');
122
+ *
123
+ * userId = productId; // TypeScript error: types are incompatible
124
+ */
125
+ brand<TBrand extends string>(): VldBrand<TInput, TOutput, TBrand>;
126
+ /**
127
+ * Apply an external function to transform this validator
128
+ * Zod 4 API parity - allows external function chaining
129
+ * @param fn External function that takes this validator and returns a new validator
130
+ * @returns The result of applying the function to this validator
131
+ * @example
132
+ * const withLength = (schema: VldBase<unknown, string>) => schema.transform(s => s.length);
133
+ * const lengthSchema = v.string().apply(withLength); // validates string, returns number
134
+ */
135
+ apply<TNewOutput>(fn: (schema: this) => VldBase<TInput, TNewOutput>): VldBase<TInput, TNewOutput>;
136
+ }
137
+ /**
138
+ * Readonly validator - marks output as readonly
139
+ */
140
+ export declare class VldReadonly<TInput, TOutput> extends VldBase<TInput, Readonly<TOutput>> {
141
+ private readonly baseValidator;
142
+ constructor(baseValidator: VldBase<TInput, TOutput>);
143
+ parse(value: unknown): Readonly<TOutput>;
144
+ safeParse(value: unknown): ParseResult<Readonly<TOutput>>;
145
+ }
146
+ /**
147
+ * Brand validator - adds a unique brand to the output type for nominal typing
148
+ * Uses TypeScript's branded types pattern to prevent accidental assignment
149
+ */
150
+ export declare class VldBrand<TInput, TOutput, TBrand extends string> extends VldBase<TInput, TOutput & {
151
+ readonly __brand: TBrand;
152
+ }> {
153
+ private readonly baseValidator;
154
+ constructor(baseValidator: VldBase<TInput, TOutput>);
155
+ parse(value: unknown): TOutput & {
156
+ readonly __brand: TBrand;
157
+ };
158
+ safeParse(value: unknown): ParseResult<TOutput & {
159
+ readonly __brand: TBrand;
160
+ }>;
83
161
  }
84
162
  /**
85
163
  * Refine validator - adds custom validation
@@ -111,6 +189,25 @@ export declare class VldDefault<TInput, TOutput> extends VldBase<TInput | undefi
111
189
  constructor(baseValidator: VldBase<TInput, TOutput>, defaultValue: TOutput);
112
190
  parse(value: unknown): TOutput;
113
191
  safeParse(value: unknown): ParseResult<TOutput>;
192
+ /**
193
+ * Pre-parse default - validates the default value instead of returning it directly
194
+ * This is useful when the default value needs to be validated against the schema
195
+ */
196
+ prefault(): VldPrefault<TInput, TOutput>;
197
+ }
198
+ /**
199
+ * Prefault validator - validates the default value instead of returning it directly
200
+ */
201
+ export declare class VldPrefault<TInput, TOutput> extends VldBase<TInput | undefined, TOutput> {
202
+ private readonly baseValidator;
203
+ private readonly defaultValue;
204
+ constructor(baseValidator: VldBase<TInput, TOutput>, defaultValue: TOutput);
205
+ parse(value: unknown): TOutput;
206
+ safeParse(value: unknown): ParseResult<TOutput>;
207
+ /**
208
+ * Calling prefault multiple times should be safe - return self
209
+ */
210
+ prefault(): VldPrefault<TInput, TOutput>;
114
211
  }
115
212
  /**
116
213
  * Catch validator - provides fallback value on validation error
@@ -131,6 +228,7 @@ export declare class VldOptional<TInput, TOutput> extends VldBase<TInput | undef
131
228
  static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldOptional<TInput, TOutput>;
132
229
  parse(value: unknown): TOutput | undefined;
133
230
  safeParse(value: unknown): ParseResult<TOutput | undefined>;
231
+ unwrap(): VldBase<TInput, TOutput>;
134
232
  }
135
233
  /**
136
234
  * Nullable validator - allows null
@@ -141,6 +239,7 @@ export declare class VldNullable<TInput, TOutput> extends VldBase<TInput | null,
141
239
  static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullable<TInput, TOutput>;
142
240
  parse(value: unknown): TOutput | null;
143
241
  safeParse(value: unknown): ParseResult<TOutput | null>;
242
+ unwrap(): VldBase<TInput, TOutput>;
144
243
  }
145
244
  /**
146
245
  * Nullish validator - allows null or undefined
@@ -151,5 +250,37 @@ export declare class VldNullish<TInput, TOutput> extends VldBase<TInput | null |
151
250
  static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullish<TInput, TOutput>;
152
251
  parse(value: unknown): TOutput | null | undefined;
153
252
  safeParse(value: unknown): ParseResult<TOutput | null | undefined>;
253
+ unwrap(): VldBase<TInput, TOutput>;
254
+ }
255
+ /**
256
+ * Pipe validator - chains validators, passing output of one to the next
257
+ */
258
+ export declare class VldPipe<TInput, TIntermediate, TOutput> extends VldBase<TInput, TOutput> {
259
+ private readonly first;
260
+ private readonly second;
261
+ constructor(first: VldBase<TInput, TIntermediate>, second: VldBase<TIntermediate, TOutput>);
262
+ parse(value: unknown): TOutput;
263
+ safeParse(value: unknown): ParseResult<TOutput>;
264
+ }
265
+ /**
266
+ * SuperRefine validator - advanced refinement with context
267
+ */
268
+ export declare class VldSuperRefine<TInput, TOutput> extends VldBase<TInput, TOutput> {
269
+ private readonly _inner;
270
+ private readonly _refinement;
271
+ constructor(_inner: VldBase<TInput, TOutput>, _refinement: (value: TOutput, ctx: SuperRefineContext) => void | Promise<void>);
272
+ parse(value: unknown): TOutput;
273
+ safeParse(value: unknown): ParseResult<TOutput>;
274
+ }
275
+ /**
276
+ * Preprocess validator - transforms input before validation
277
+ */
278
+ export declare class VldPreprocess<TInput, TOutput> extends VldBase<unknown, TOutput> {
279
+ private readonly _preprocessor;
280
+ private readonly _schema;
281
+ constructor(_preprocessor: (input: unknown) => unknown, _schema: VldBase<TInput, TOutput>);
282
+ static create<TInput, TOutput>(preprocessor: (input: unknown) => unknown, schema: VldBase<TInput, TOutput>): VldPreprocess<TInput, TOutput>;
283
+ parse(value: unknown): TOutput;
284
+ safeParse(value: unknown): ParseResult<TOutput>;
154
285
  }
155
286
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/validators/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/validators/base.ts"],"names":[],"mappings":"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"}
@@ -13,17 +13,34 @@ export class VldBase {
13
13
  }
14
14
  /**
15
15
  * Parse a value or return a default if validation fails
16
+ * BUG-NEW-017 FIX: Validate default value to ensure type safety
16
17
  * @param value The value to validate
17
18
  * @param defaultValue The default value to return on failure
18
19
  * @returns The validated value or default
19
20
  */
20
21
  parseOrDefault(value, defaultValue) {
21
22
  const result = this.safeParse(value);
22
- return result.success ? result.data : defaultValue;
23
+ if (result.success) {
24
+ return result.data;
25
+ }
26
+ // Validate the default value to ensure it's actually valid
27
+ const defaultResult = this.safeParse(defaultValue);
28
+ if (!defaultResult.success) {
29
+ throw new Error(`Invalid default value provided: ${defaultResult.error.message}`);
30
+ }
31
+ return defaultResult.data;
23
32
  }
24
33
  refine(predicate, message) {
25
34
  return new VldRefine(this, predicate, message);
26
35
  }
36
+ /**
37
+ * Advanced refinement with context for adding multiple issues
38
+ * @param refinement The refinement function with context
39
+ * @returns A new super refined validator
40
+ */
41
+ superRefine(refinement) {
42
+ return new VldSuperRefine(this, refinement);
43
+ }
27
44
  /**
28
45
  * Create a new validator that transforms the output
29
46
  * @param transformer The transformation function
@@ -69,6 +86,92 @@ export class VldBase {
69
86
  nullish() {
70
87
  return new VldNullish(this);
71
88
  }
89
+ /**
90
+ * Pipe the output of this validator into another validator
91
+ * @param next The next validator to pipe into
92
+ * @returns A new piped validator
93
+ */
94
+ pipe(next) {
95
+ return new VldPipe(this, next);
96
+ }
97
+ /**
98
+ * Create a new validator that returns readonly output
99
+ * Zod 4 API parity - marks output as readonly for TypeScript
100
+ * @returns A new readonly validator
101
+ */
102
+ readonly() {
103
+ return new VldReadonly(this);
104
+ }
105
+ /**
106
+ * Brand the output type with a unique brand for nominal typing
107
+ * Zod 4 API parity - prevents accidental assignment of similarly typed values
108
+ * @returns A new branded validator
109
+ * @example
110
+ * const userIdSchema = v.string().brand<'UserId'>();
111
+ * const productIdSchema = v.string().brand<'ProductId'>();
112
+ *
113
+ * let userId: UserId = userIdSchema.parse('abc');
114
+ * let productId: ProductId = productIdSchema.parse('xyz');
115
+ *
116
+ * userId = productId; // TypeScript error: types are incompatible
117
+ */
118
+ brand() {
119
+ return new VldBrand(this);
120
+ }
121
+ /**
122
+ * Apply an external function to transform this validator
123
+ * Zod 4 API parity - allows external function chaining
124
+ * @param fn External function that takes this validator and returns a new validator
125
+ * @returns The result of applying the function to this validator
126
+ * @example
127
+ * const withLength = (schema: VldBase<unknown, string>) => schema.transform(s => s.length);
128
+ * const lengthSchema = v.string().apply(withLength); // validates string, returns number
129
+ */
130
+ apply(fn) {
131
+ return fn(this);
132
+ }
133
+ }
134
+ /**
135
+ * Readonly validator - marks output as readonly
136
+ */
137
+ export class VldReadonly extends VldBase {
138
+ constructor(baseValidator) {
139
+ super();
140
+ this.baseValidator = baseValidator;
141
+ }
142
+ parse(value) {
143
+ return this.baseValidator.parse(value);
144
+ }
145
+ safeParse(value) {
146
+ const result = this.baseValidator.safeParse(value);
147
+ if (result.success) {
148
+ return { success: true, data: result.data };
149
+ }
150
+ return result;
151
+ }
152
+ }
153
+ /**
154
+ * Brand validator - adds a unique brand to the output type for nominal typing
155
+ * Uses TypeScript's branded types pattern to prevent accidental assignment
156
+ */
157
+ export class VldBrand extends VldBase {
158
+ constructor(baseValidator) {
159
+ super();
160
+ this.baseValidator = baseValidator;
161
+ }
162
+ parse(value) {
163
+ return this.baseValidator.parse(value);
164
+ }
165
+ safeParse(value) {
166
+ const result = this.baseValidator.safeParse(value);
167
+ if (result.success) {
168
+ return {
169
+ success: true,
170
+ data: result.data
171
+ };
172
+ }
173
+ return result;
174
+ }
72
175
  }
73
176
  /**
74
177
  * Refine validator - adds custom validation
@@ -144,6 +247,43 @@ export class VldDefault extends VldBase {
144
247
  }
145
248
  return this.baseValidator.safeParse(value);
146
249
  }
250
+ /**
251
+ * Pre-parse default - validates the default value instead of returning it directly
252
+ * This is useful when the default value needs to be validated against the schema
253
+ */
254
+ prefault() {
255
+ // Return a new validator that validates the default value when parse(undefined) is called
256
+ return new VldPrefault(this.baseValidator, this.defaultValue);
257
+ }
258
+ }
259
+ /**
260
+ * Prefault validator - validates the default value instead of returning it directly
261
+ */
262
+ export class VldPrefault extends VldBase {
263
+ constructor(baseValidator, defaultValue) {
264
+ super();
265
+ this.baseValidator = baseValidator;
266
+ this.defaultValue = defaultValue;
267
+ }
268
+ parse(value) {
269
+ if (value === undefined) {
270
+ // Validate the default value through the base validator
271
+ return this.baseValidator.parse(this.defaultValue);
272
+ }
273
+ return this.baseValidator.parse(value);
274
+ }
275
+ safeParse(value) {
276
+ if (value === undefined) {
277
+ return this.baseValidator.safeParse(this.defaultValue);
278
+ }
279
+ return this.baseValidator.safeParse(value);
280
+ }
281
+ /**
282
+ * Calling prefault multiple times should be safe - return self
283
+ */
284
+ prefault() {
285
+ return this;
286
+ }
147
287
  }
148
288
  /**
149
289
  * Catch validator - provides fallback value on validation error
@@ -193,6 +333,9 @@ export class VldOptional extends VldBase {
193
333
  }
194
334
  return this.baseValidator.safeParse(value);
195
335
  }
336
+ unwrap() {
337
+ return this.baseValidator;
338
+ }
196
339
  }
197
340
  /**
198
341
  * Nullable validator - allows null
@@ -217,6 +360,9 @@ export class VldNullable extends VldBase {
217
360
  }
218
361
  return this.baseValidator.safeParse(value);
219
362
  }
363
+ unwrap() {
364
+ return this.baseValidator;
365
+ }
220
366
  }
221
367
  /**
222
368
  * Nullish validator - allows null or undefined
@@ -241,5 +387,105 @@ export class VldNullish extends VldBase {
241
387
  }
242
388
  return this.baseValidator.safeParse(value);
243
389
  }
390
+ unwrap() {
391
+ return this.baseValidator;
392
+ }
393
+ }
394
+ /**
395
+ * Pipe validator - chains validators, passing output of one to the next
396
+ */
397
+ export class VldPipe extends VldBase {
398
+ constructor(first, second) {
399
+ super();
400
+ this.first = first;
401
+ this.second = second;
402
+ }
403
+ parse(value) {
404
+ const intermediateResult = this.first.parse(value);
405
+ return this.second.parse(intermediateResult);
406
+ }
407
+ safeParse(value) {
408
+ const firstResult = this.first.safeParse(value);
409
+ if (!firstResult.success) {
410
+ return firstResult;
411
+ }
412
+ return this.second.safeParse(firstResult.data);
413
+ }
414
+ }
415
+ /**
416
+ * SuperRefine validator - advanced refinement with context
417
+ */
418
+ export class VldSuperRefine extends VldBase {
419
+ constructor(_inner, _refinement) {
420
+ super();
421
+ this._inner = _inner;
422
+ this._refinement = _refinement;
423
+ }
424
+ parse(value) {
425
+ const result = this._inner.parse(value);
426
+ const issues = [];
427
+ const ctx = {
428
+ addIssue: (issue) => issues.push(issue),
429
+ path: []
430
+ };
431
+ const maybePromise = this._refinement(result, ctx);
432
+ if (maybePromise instanceof Promise) {
433
+ throw new Error('Use parseAsync for async refinements');
434
+ }
435
+ if (issues.length > 0) {
436
+ throw new Error(issues.map(i => i.message).join('; '));
437
+ }
438
+ return result;
439
+ }
440
+ safeParse(value) {
441
+ const result = this._inner.safeParse(value);
442
+ if (!result.success)
443
+ return result;
444
+ const issues = [];
445
+ const ctx = {
446
+ addIssue: (issue) => issues.push(issue),
447
+ path: []
448
+ };
449
+ const maybePromise = this._refinement(result.data, ctx);
450
+ if (maybePromise instanceof Promise) {
451
+ throw new Error('Use safeParseAsync for async refinements');
452
+ }
453
+ if (issues.length > 0) {
454
+ return {
455
+ success: false,
456
+ error: new Error(issues.map(i => i.message).join('; '))
457
+ };
458
+ }
459
+ return result;
460
+ }
461
+ }
462
+ /**
463
+ * Preprocess validator - transforms input before validation
464
+ */
465
+ export class VldPreprocess extends VldBase {
466
+ constructor(_preprocessor, _schema) {
467
+ super();
468
+ this._preprocessor = _preprocessor;
469
+ this._schema = _schema;
470
+ }
471
+ static create(preprocessor, schema) {
472
+ return new VldPreprocess(preprocessor, schema);
473
+ }
474
+ parse(value) {
475
+ const preprocessed = this._preprocessor(value);
476
+ return this._schema.parse(preprocessed);
477
+ }
478
+ safeParse(value) {
479
+ try {
480
+ const preprocessed = this._preprocessor(value);
481
+ return this._schema.safeParse(preprocessed);
482
+ }
483
+ catch (error) {
484
+ return {
485
+ success: false,
486
+ error: error
487
+ };
488
+ }
489
+ }
244
490
  }
245
491
  //# sourceMappingURL=base.js.map