@oxog/vld 1.3.1 → 1.5.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 (334) hide show
  1. package/CHANGELOG.md +333 -284
  2. package/README.md +13 -12
  3. package/dist/cli/benchmark.d.ts +15 -0
  4. package/dist/cli/benchmark.d.ts.map +1 -0
  5. package/dist/cli/benchmark.js +248 -0
  6. package/dist/cli/benchmark.js.map +1 -0
  7. package/dist/cli/bin.d.ts +8 -0
  8. package/dist/cli/bin.d.ts.map +1 -0
  9. package/dist/cli/bin.js +35 -0
  10. package/dist/cli/bin.js.map +1 -0
  11. package/dist/cli/commands/benchmark.d.ts +11 -0
  12. package/dist/cli/commands/benchmark.d.ts.map +1 -0
  13. package/dist/cli/commands/benchmark.js +204 -0
  14. package/dist/cli/commands/benchmark.js.map +1 -0
  15. package/dist/cli/commands/validate.d.ts +11 -0
  16. package/dist/cli/commands/validate.d.ts.map +1 -0
  17. package/dist/cli/commands/validate.js +157 -0
  18. package/dist/cli/commands/validate.js.map +1 -0
  19. package/dist/cli/generate.d.ts +14 -0
  20. package/dist/cli/generate.d.ts.map +1 -0
  21. package/dist/cli/generate.js +233 -0
  22. package/dist/cli/generate.js.map +1 -0
  23. package/dist/cli/index.d.ts +59 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +182 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/validate.d.ts +15 -0
  28. package/dist/cli/validate.d.ts.map +1 -0
  29. package/dist/cli/validate.js +162 -0
  30. package/dist/cli/validate.js.map +1 -0
  31. package/dist/codecs/index.d.ts.map +1 -1
  32. package/dist/codecs/index.js +29 -10
  33. package/dist/codecs/index.js.map +1 -1
  34. package/dist/coercion/bigint.js +1 -1
  35. package/dist/coercion/boolean.d.ts.map +1 -1
  36. package/dist/coercion/boolean.js +24 -32
  37. package/dist/coercion/boolean.js.map +1 -1
  38. package/dist/coercion/date.js +2 -2
  39. package/dist/coercion/date.js.map +1 -1
  40. package/dist/coercion/number.d.ts.map +1 -1
  41. package/dist/coercion/number.js +20 -4
  42. package/dist/coercion/number.js.map +1 -1
  43. package/dist/coercion/string.d.ts.map +1 -1
  44. package/dist/coercion/string.js +9 -73
  45. package/dist/coercion/string.js.map +1 -1
  46. package/dist/compat/emitter.d.ts +73 -0
  47. package/dist/compat/emitter.d.ts.map +1 -0
  48. package/dist/compat/emitter.js +179 -0
  49. package/dist/compat/emitter.js.map +1 -0
  50. package/dist/compat/index.d.ts +15 -0
  51. package/dist/compat/index.d.ts.map +1 -0
  52. package/dist/compat/index.js +14 -0
  53. package/dist/compat/index.js.map +1 -0
  54. package/dist/compat/result.d.ts +128 -0
  55. package/dist/compat/result.d.ts.map +1 -0
  56. package/dist/compat/result.js +169 -0
  57. package/dist/compat/result.js.map +1 -0
  58. package/dist/errors.d.ts +58 -1
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +97 -9
  61. package/dist/errors.js.map +1 -1
  62. package/dist/events.d.ts +140 -0
  63. package/dist/events.d.ts.map +1 -0
  64. package/dist/events.js +8 -0
  65. package/dist/events.js.map +1 -0
  66. package/dist/guards.d.ts +143 -0
  67. package/dist/guards.d.ts.map +1 -0
  68. package/dist/guards.js +238 -0
  69. package/dist/guards.js.map +1 -0
  70. package/dist/index.d.ts +606 -4
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +105 -6
  73. package/dist/index.js.map +1 -1
  74. package/dist/kernel.d.ts +29 -0
  75. package/dist/kernel.d.ts.map +1 -0
  76. package/dist/kernel.js +402 -0
  77. package/dist/kernel.js.map +1 -0
  78. package/dist/locales/af.d.ts.map +1 -1
  79. package/dist/locales/af.js +18 -1
  80. package/dist/locales/af.js.map +1 -1
  81. package/dist/locales/ar.d.ts.map +1 -1
  82. package/dist/locales/ar.js +18 -1
  83. package/dist/locales/ar.js.map +1 -1
  84. package/dist/locales/backup-en.d.ts +3 -0
  85. package/dist/locales/backup-en.d.ts.map +1 -0
  86. package/dist/locales/backup-en.js +105 -0
  87. package/dist/locales/backup-en.js.map +1 -0
  88. package/dist/locales/bn.d.ts.map +1 -1
  89. package/dist/locales/bn.js +18 -1
  90. package/dist/locales/bn.js.map +1 -1
  91. package/dist/locales/da.d.ts.map +1 -1
  92. package/dist/locales/da.js +18 -1
  93. package/dist/locales/da.js.map +1 -1
  94. package/dist/locales/de.d.ts.map +1 -1
  95. package/dist/locales/de.js +18 -1
  96. package/dist/locales/de.js.map +1 -1
  97. package/dist/locales/en.d.ts.map +1 -1
  98. package/dist/locales/en.js +18 -1
  99. package/dist/locales/en.js.map +1 -1
  100. package/dist/locales/es-MX.d.ts.map +1 -1
  101. package/dist/locales/es-MX.js +17 -1
  102. package/dist/locales/es-MX.js.map +1 -1
  103. package/dist/locales/es.d.ts.map +1 -1
  104. package/dist/locales/es.js +18 -1
  105. package/dist/locales/es.js.map +1 -1
  106. package/dist/locales/fi.d.ts.map +1 -1
  107. package/dist/locales/fi.js +18 -1
  108. package/dist/locales/fi.js.map +1 -1
  109. package/dist/locales/fr.d.ts.map +1 -1
  110. package/dist/locales/fr.js +18 -1
  111. package/dist/locales/fr.js.map +1 -1
  112. package/dist/locales/hi.d.ts.map +1 -1
  113. package/dist/locales/hi.js +18 -1
  114. package/dist/locales/hi.js.map +1 -1
  115. package/dist/locales/id.d.ts.map +1 -1
  116. package/dist/locales/id.js +18 -1
  117. package/dist/locales/id.js.map +1 -1
  118. package/dist/locales/it.d.ts.map +1 -1
  119. package/dist/locales/it.js +18 -1
  120. package/dist/locales/it.js.map +1 -1
  121. package/dist/locales/ja.d.ts.map +1 -1
  122. package/dist/locales/ja.js +18 -1
  123. package/dist/locales/ja.js.map +1 -1
  124. package/dist/locales/ko.d.ts.map +1 -1
  125. package/dist/locales/ko.js +18 -1
  126. package/dist/locales/ko.js.map +1 -1
  127. package/dist/locales/nl.d.ts.map +1 -1
  128. package/dist/locales/nl.js +18 -1
  129. package/dist/locales/nl.js.map +1 -1
  130. package/dist/locales/no.d.ts.map +1 -1
  131. package/dist/locales/no.js +18 -1
  132. package/dist/locales/no.js.map +1 -1
  133. package/dist/locales/pl.d.ts.map +1 -1
  134. package/dist/locales/pl.js +18 -1
  135. package/dist/locales/pl.js.map +1 -1
  136. package/dist/locales/pt-BR.d.ts.map +1 -1
  137. package/dist/locales/pt-BR.js +18 -1
  138. package/dist/locales/pt-BR.js.map +1 -1
  139. package/dist/locales/pt.d.ts.map +1 -1
  140. package/dist/locales/pt.js +18 -1
  141. package/dist/locales/pt.js.map +1 -1
  142. package/dist/locales/ru.d.ts.map +1 -1
  143. package/dist/locales/ru.js +18 -1
  144. package/dist/locales/ru.js.map +1 -1
  145. package/dist/locales/sv.d.ts.map +1 -1
  146. package/dist/locales/sv.js +18 -1
  147. package/dist/locales/sv.js.map +1 -1
  148. package/dist/locales/sw.d.ts.map +1 -1
  149. package/dist/locales/sw.js +18 -1
  150. package/dist/locales/sw.js.map +1 -1
  151. package/dist/locales/th.d.ts.map +1 -1
  152. package/dist/locales/th.js +18 -1
  153. package/dist/locales/th.js.map +1 -1
  154. package/dist/locales/tr.d.ts.map +1 -1
  155. package/dist/locales/tr.js +18 -1
  156. package/dist/locales/tr.js.map +1 -1
  157. package/dist/locales/types.d.ts +13 -0
  158. package/dist/locales/types.d.ts.map +1 -1
  159. package/dist/locales/types.js.map +1 -1
  160. package/dist/locales/vi.d.ts.map +1 -1
  161. package/dist/locales/vi.js +18 -1
  162. package/dist/locales/vi.js.map +1 -1
  163. package/dist/locales/zh.d.ts.map +1 -1
  164. package/dist/locales/zh.js +18 -1
  165. package/dist/locales/zh.js.map +1 -1
  166. package/dist/logger.d.ts +94 -0
  167. package/dist/logger.d.ts.map +1 -0
  168. package/dist/logger.js +184 -0
  169. package/dist/logger.js.map +1 -0
  170. package/dist/pigment.d.ts +124 -0
  171. package/dist/pigment.d.ts.map +1 -0
  172. package/dist/pigment.js +177 -0
  173. package/dist/pigment.js.map +1 -0
  174. package/dist/plugins/codecs.d.ts +17 -0
  175. package/dist/plugins/codecs.d.ts.map +1 -0
  176. package/dist/plugins/codecs.js +29 -0
  177. package/dist/plugins/codecs.js.map +1 -0
  178. package/dist/plugins/coercion.d.ts +13 -0
  179. package/dist/plugins/coercion.d.ts.map +1 -0
  180. package/dist/plugins/coercion.js +34 -0
  181. package/dist/plugins/coercion.js.map +1 -0
  182. package/dist/plugins/core-validators.d.ts +13 -0
  183. package/dist/plugins/core-validators.d.ts.map +1 -0
  184. package/dist/plugins/core-validators.js +96 -0
  185. package/dist/plugins/core-validators.js.map +1 -0
  186. package/dist/plugins/index.d.ts +8 -0
  187. package/dist/plugins/index.d.ts.map +1 -0
  188. package/dist/plugins/index.js +8 -0
  189. package/dist/plugins/index.js.map +1 -0
  190. package/dist/plugins/kernel.d.ts +29 -0
  191. package/dist/plugins/kernel.d.ts.map +1 -0
  192. package/dist/plugins/kernel.js +486 -0
  193. package/dist/plugins/kernel.js.map +1 -0
  194. package/dist/plugins/types.d.ts +186 -0
  195. package/dist/plugins/types.d.ts.map +1 -0
  196. package/dist/plugins/types.js +8 -0
  197. package/dist/plugins/types.js.map +1 -0
  198. package/dist/style.d.ts +123 -0
  199. package/dist/style.d.ts.map +1 -0
  200. package/dist/style.js +369 -0
  201. package/dist/style.js.map +1 -0
  202. package/dist/utils/codec-utils.d.ts +2 -0
  203. package/dist/utils/codec-utils.d.ts.map +1 -1
  204. package/dist/utils/codec-utils.js +28 -4
  205. package/dist/utils/codec-utils.js.map +1 -1
  206. package/dist/utils/deep-merge.d.ts +2 -0
  207. package/dist/utils/deep-merge.d.ts.map +1 -1
  208. package/dist/utils/deep-merge.js +22 -39
  209. package/dist/utils/deep-merge.js.map +1 -1
  210. package/dist/utils/ip-validation.d.ts +11 -0
  211. package/dist/utils/ip-validation.d.ts.map +1 -0
  212. package/dist/utils/ip-validation.js +98 -0
  213. package/dist/utils/ip-validation.js.map +1 -0
  214. package/dist/utils/security.d.ts +12 -0
  215. package/dist/utils/security.d.ts.map +1 -0
  216. package/dist/utils/security.js +61 -0
  217. package/dist/utils/security.js.map +1 -0
  218. package/dist/validators/array.d.ts +3 -1
  219. package/dist/validators/array.d.ts.map +1 -1
  220. package/dist/validators/array.js +41 -15
  221. package/dist/validators/array.js.map +1 -1
  222. package/dist/validators/base.d.ts +134 -0
  223. package/dist/validators/base.d.ts.map +1 -1
  224. package/dist/validators/base.js +255 -1
  225. package/dist/validators/base.js.map +1 -1
  226. package/dist/validators/base64.js +1 -1
  227. package/dist/validators/bigint.d.ts +20 -0
  228. package/dist/validators/bigint.d.ts.map +1 -1
  229. package/dist/validators/bigint.js +39 -1
  230. package/dist/validators/bigint.js.map +1 -1
  231. package/dist/validators/boolean.js +29 -1
  232. package/dist/validators/boolean.js.map +1 -1
  233. package/dist/validators/codec.js +1 -1
  234. package/dist/validators/custom.d.ts +47 -0
  235. package/dist/validators/custom.d.ts.map +1 -0
  236. package/dist/validators/custom.js +50 -0
  237. package/dist/validators/custom.js.map +1 -0
  238. package/dist/validators/date.d.ts +16 -0
  239. package/dist/validators/date.d.ts.map +1 -1
  240. package/dist/validators/date.js +62 -7
  241. package/dist/validators/date.js.map +1 -1
  242. package/dist/validators/discriminated-union.d.ts +29 -0
  243. package/dist/validators/discriminated-union.d.ts.map +1 -0
  244. package/dist/validators/discriminated-union.js +98 -0
  245. package/dist/validators/discriminated-union.js.map +1 -0
  246. package/dist/validators/enum.d.ts +10 -0
  247. package/dist/validators/enum.d.ts.map +1 -1
  248. package/dist/validators/enum.js +38 -1
  249. package/dist/validators/enum.js.map +1 -1
  250. package/dist/validators/file.d.ts +57 -0
  251. package/dist/validators/file.d.ts.map +1 -0
  252. package/dist/validators/file.js +114 -0
  253. package/dist/validators/file.js.map +1 -0
  254. package/dist/validators/function.d.ts +26 -0
  255. package/dist/validators/function.d.ts.map +1 -0
  256. package/dist/validators/function.js +45 -0
  257. package/dist/validators/function.js.map +1 -0
  258. package/dist/validators/hex.d.ts.map +1 -1
  259. package/dist/validators/hex.js +3 -2
  260. package/dist/validators/hex.js.map +1 -1
  261. package/dist/validators/index.d.ts +18 -1
  262. package/dist/validators/index.d.ts.map +1 -1
  263. package/dist/validators/index.js +16 -1
  264. package/dist/validators/index.js.map +1 -1
  265. package/dist/validators/intersection.d.ts.map +1 -1
  266. package/dist/validators/intersection.js +15 -8
  267. package/dist/validators/intersection.js.map +1 -1
  268. package/dist/validators/json.d.ts +26 -0
  269. package/dist/validators/json.d.ts.map +1 -0
  270. package/dist/validators/json.js +64 -0
  271. package/dist/validators/json.js.map +1 -0
  272. package/dist/validators/lazy.d.ts +28 -0
  273. package/dist/validators/lazy.d.ts.map +1 -0
  274. package/dist/validators/lazy.js +42 -0
  275. package/dist/validators/lazy.js.map +1 -0
  276. package/dist/validators/literal.js +1 -1
  277. package/dist/validators/map.js +1 -1
  278. package/dist/validators/nan.d.ts +17 -0
  279. package/dist/validators/nan.d.ts.map +1 -0
  280. package/dist/validators/nan.js +32 -0
  281. package/dist/validators/nan.js.map +1 -0
  282. package/dist/validators/never.js +1 -1
  283. package/dist/validators/null.d.ts +16 -0
  284. package/dist/validators/null.d.ts.map +1 -0
  285. package/dist/validators/null.js +31 -0
  286. package/dist/validators/null.js.map +1 -0
  287. package/dist/validators/number.d.ts +22 -0
  288. package/dist/validators/number.d.ts.map +1 -1
  289. package/dist/validators/number.js +47 -8
  290. package/dist/validators/number.js.map +1 -1
  291. package/dist/validators/object.d.ts +32 -0
  292. package/dist/validators/object.d.ts.map +1 -1
  293. package/dist/validators/object.js +125 -8
  294. package/dist/validators/object.js.map +1 -1
  295. package/dist/validators/record.d.ts +15 -2
  296. package/dist/validators/record.d.ts.map +1 -1
  297. package/dist/validators/record.js +74 -4
  298. package/dist/validators/record.js.map +1 -1
  299. package/dist/validators/set.js +1 -1
  300. package/dist/validators/string-bool.d.ts +61 -0
  301. package/dist/validators/string-bool.d.ts.map +1 -0
  302. package/dist/validators/string-bool.js +127 -0
  303. package/dist/validators/string-bool.js.map +1 -0
  304. package/dist/validators/string-formats.d.ts +97 -0
  305. package/dist/validators/string-formats.d.ts.map +1 -0
  306. package/dist/validators/string-formats.js +120 -0
  307. package/dist/validators/string-formats.js.map +1 -0
  308. package/dist/validators/string.d.ts.map +1 -1
  309. package/dist/validators/string.js +2 -73
  310. package/dist/validators/string.js.map +1 -1
  311. package/dist/validators/symbol.js +1 -1
  312. package/dist/validators/template-literal.d.ts +32 -0
  313. package/dist/validators/template-literal.d.ts.map +1 -0
  314. package/dist/validators/template-literal.js +102 -0
  315. package/dist/validators/template-literal.js.map +1 -0
  316. package/dist/validators/tuple.js +1 -1
  317. package/dist/validators/uint8array.d.ts +21 -4
  318. package/dist/validators/uint8array.d.ts.map +1 -1
  319. package/dist/validators/uint8array.js +34 -23
  320. package/dist/validators/uint8array.js.map +1 -1
  321. package/dist/validators/undefined.d.ts +16 -0
  322. package/dist/validators/undefined.d.ts.map +1 -0
  323. package/dist/validators/undefined.js +31 -0
  324. package/dist/validators/undefined.js.map +1 -0
  325. package/dist/validators/union.d.ts +2 -0
  326. package/dist/validators/union.d.ts.map +1 -1
  327. package/dist/validators/union.js +15 -21
  328. package/dist/validators/union.js.map +1 -1
  329. package/dist/validators/void.js +1 -1
  330. package/dist/validators/xor.d.ts +23 -0
  331. package/dist/validators/xor.d.ts.map +1 -0
  332. package/dist/validators/xor.js +64 -0
  333. package/dist/validators/xor.js.map +1 -0
  334. package/package.json +95 -79
@@ -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
@@ -104,6 +182,8 @@ export declare class VldTransform<TInput, TBase, TOutput> extends VldBase<TInput
104
182
  }
105
183
  /**
106
184
  * Default validator - provides default value for undefined
185
+ * Note: Does not validate the default value at construction time.
186
+ * Use .prefault() to validate the default value at parse time.
107
187
  */
108
188
  export declare class VldDefault<TInput, TOutput> extends VldBase<TInput | undefined, TOutput> {
109
189
  private readonly baseValidator;
@@ -111,9 +191,29 @@ export declare class VldDefault<TInput, TOutput> extends VldBase<TInput | undefi
111
191
  constructor(baseValidator: VldBase<TInput, TOutput>, defaultValue: TOutput);
112
192
  parse(value: unknown): TOutput;
113
193
  safeParse(value: unknown): ParseResult<TOutput>;
194
+ /**
195
+ * Pre-parse default - validates the default value instead of returning it directly
196
+ * This is useful when the default value needs to be validated against the schema
197
+ */
198
+ prefault(): VldPrefault<TInput, TOutput>;
199
+ }
200
+ /**
201
+ * Prefault validator - validates the default value instead of returning it directly
202
+ */
203
+ export declare class VldPrefault<TInput, TOutput> extends VldBase<TInput | undefined, TOutput> {
204
+ private readonly baseValidator;
205
+ private readonly defaultValue;
206
+ constructor(baseValidator: VldBase<TInput, TOutput>, defaultValue: TOutput);
207
+ parse(value: unknown): TOutput;
208
+ safeParse(value: unknown): ParseResult<TOutput>;
209
+ /**
210
+ * Calling prefault multiple times should be safe - return self
211
+ */
212
+ prefault(): VldPrefault<TInput, TOutput>;
114
213
  }
115
214
  /**
116
215
  * Catch validator - provides fallback value on validation error
216
+ * BUG-NPM-003 FIX: Validate fallback value at construction time
117
217
  */
118
218
  export declare class VldCatch<TInput, TOutput> extends VldBase<TInput, TOutput> {
119
219
  private readonly baseValidator;
@@ -131,6 +231,7 @@ export declare class VldOptional<TInput, TOutput> extends VldBase<TInput | undef
131
231
  static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldOptional<TInput, TOutput>;
132
232
  parse(value: unknown): TOutput | undefined;
133
233
  safeParse(value: unknown): ParseResult<TOutput | undefined>;
234
+ unwrap(): VldBase<TInput, TOutput>;
134
235
  }
135
236
  /**
136
237
  * Nullable validator - allows null
@@ -141,6 +242,7 @@ export declare class VldNullable<TInput, TOutput> extends VldBase<TInput | null,
141
242
  static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullable<TInput, TOutput>;
142
243
  parse(value: unknown): TOutput | null;
143
244
  safeParse(value: unknown): ParseResult<TOutput | null>;
245
+ unwrap(): VldBase<TInput, TOutput>;
144
246
  }
145
247
  /**
146
248
  * Nullish validator - allows null or undefined
@@ -151,5 +253,37 @@ export declare class VldNullish<TInput, TOutput> extends VldBase<TInput | null |
151
253
  static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullish<TInput, TOutput>;
152
254
  parse(value: unknown): TOutput | null | undefined;
153
255
  safeParse(value: unknown): ParseResult<TOutput | null | undefined>;
256
+ unwrap(): VldBase<TInput, TOutput>;
257
+ }
258
+ /**
259
+ * Pipe validator - chains validators, passing output of one to the next
260
+ */
261
+ export declare class VldPipe<TInput, TIntermediate, TOutput> extends VldBase<TInput, TOutput> {
262
+ private readonly first;
263
+ private readonly second;
264
+ constructor(first: VldBase<TInput, TIntermediate>, second: VldBase<TIntermediate, TOutput>);
265
+ parse(value: unknown): TOutput;
266
+ safeParse(value: unknown): ParseResult<TOutput>;
267
+ }
268
+ /**
269
+ * SuperRefine validator - advanced refinement with context
270
+ */
271
+ export declare class VldSuperRefine<TInput, TOutput> extends VldBase<TInput, TOutput> {
272
+ private readonly _inner;
273
+ private readonly _refinement;
274
+ constructor(_inner: VldBase<TInput, TOutput>, _refinement: (value: TOutput, ctx: SuperRefineContext) => void | Promise<void>);
275
+ parse(value: unknown): TOutput;
276
+ safeParse(value: unknown): ParseResult<TOutput>;
277
+ }
278
+ /**
279
+ * Preprocess validator - transforms input before validation
280
+ */
281
+ export declare class VldPreprocess<TInput, TOutput> extends VldBase<unknown, TOutput> {
282
+ private readonly _preprocessor;
283
+ private readonly _schema;
284
+ constructor(_preprocessor: (input: unknown) => unknown, _schema: VldBase<TInput, TOutput>);
285
+ static create<TInput, TOutput>(preprocessor: (input: unknown) => unknown, schema: VldBase<TInput, TOutput>): VldPreprocess<TInput, TOutput>;
286
+ parse(value: unknown): TOutput;
287
+ safeParse(value: unknown): ParseResult<TOutput>;
154
288
  }
155
289
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/validators/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACrB;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEvD;;;GAGG;AACH,8BAAsB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM;IACpD;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAEvC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IAExD;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIhC;;;;;OAKG;IACH,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO;IAK9D;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,SAAS,OAAO,EAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,QAAQ,EAChD,OAAO,CAAC,EAAE,MAAM,GACf,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IACvC,MAAM,CACJ,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,EACtC,OAAO,CAAC,EAAE,MAAM,GACf,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IAQtC;;;;OAIG;IACH,SAAS,CAAC,YAAY,EACpB,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,YAAY,GAC5C,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC;IAI9C;;;;OAIG;IACH,OAAO,CAAC,YAAY,EAAE,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;IAI3D;;;;OAIG;IACH,KAAK,CAAC,aAAa,EAAE,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAIxD;;;OAGG;IACH,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC;IAIxC;;;OAGG;IACH,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC;IAIxC;;;OAGG;IACH,OAAO,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;CAGvC;AAED;;GAEG;AACH,qBAAa,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,SAAS,KAAK,GAAG,KAAK,CAAE,SAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAEjG,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAFd,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EACrC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,EACpC,aAAa,CAAC,EAAE,MAAM,YAAA;IAKzC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAU9B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;CAOhD;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAE,SAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAE9E,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EACrC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO;IAKzD,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAU9B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;CAOhD;AAED;;GAEG;AACH,qBAAa,UAAU,CAAC,MAAM,EAAE,OAAO,CAAE,SAAQ,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC;IAEjF,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,YAAY,EAAE,OAAO;IAKxC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAO9B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;CAMhD;AAED;;GAEG;AACH,qBAAa,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAE,SAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnE,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBADb,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,aAAa,EAAE,OAAO;IAKzC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAQ9B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;CAOhD;AAED;;GAEG;AACH,qBAAa,WAAW,CAAC,MAAM,EAAE,OAAO,CAAE,SAAQ,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC;IACpF,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAIpE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC;IAIrG,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;IAO1C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,SAAS,CAAC;CAM5D;AAED;;GAEG;AACH,qBAAa,WAAW,CAAC,MAAM,EAAE,OAAO,CAAE,SAAQ,OAAO,CAAC,MAAM,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1E,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAIpE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC;IAIrG,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI;IAOrC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;CAMvD;AAED;;GAEG;AACH,qBAAa,UAAU,CAAC,MAAM,EAAE,OAAO,CAAE,SAAQ,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACjG,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAIpE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;IAIpG,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS;IAOjD,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;CAMnE"}
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
@@ -125,6 +228,8 @@ export class VldTransform extends VldBase {
125
228
  }
126
229
  /**
127
230
  * Default validator - provides default value for undefined
231
+ * Note: Does not validate the default value at construction time.
232
+ * Use .prefault() to validate the default value at parse time.
128
233
  */
129
234
  export class VldDefault extends VldBase {
130
235
  constructor(baseValidator, defaultValue) {
@@ -144,15 +249,58 @@ export class VldDefault extends VldBase {
144
249
  }
145
250
  return this.baseValidator.safeParse(value);
146
251
  }
252
+ /**
253
+ * Pre-parse default - validates the default value instead of returning it directly
254
+ * This is useful when the default value needs to be validated against the schema
255
+ */
256
+ prefault() {
257
+ // Return a new validator that validates the default value when parse(undefined) is called
258
+ return new VldPrefault(this.baseValidator, this.defaultValue);
259
+ }
260
+ }
261
+ /**
262
+ * Prefault validator - validates the default value instead of returning it directly
263
+ */
264
+ export class VldPrefault extends VldBase {
265
+ constructor(baseValidator, defaultValue) {
266
+ super();
267
+ this.baseValidator = baseValidator;
268
+ this.defaultValue = defaultValue;
269
+ }
270
+ parse(value) {
271
+ if (value === undefined) {
272
+ // Validate the default value through the base validator
273
+ return this.baseValidator.parse(this.defaultValue);
274
+ }
275
+ return this.baseValidator.parse(value);
276
+ }
277
+ safeParse(value) {
278
+ if (value === undefined) {
279
+ return this.baseValidator.safeParse(this.defaultValue);
280
+ }
281
+ return this.baseValidator.safeParse(value);
282
+ }
283
+ /**
284
+ * Calling prefault multiple times should be safe - return self
285
+ */
286
+ prefault() {
287
+ return this;
288
+ }
147
289
  }
148
290
  /**
149
291
  * Catch validator - provides fallback value on validation error
292
+ * BUG-NPM-003 FIX: Validate fallback value at construction time
150
293
  */
151
294
  export class VldCatch extends VldBase {
152
295
  constructor(baseValidator, fallbackValue) {
153
296
  super();
154
297
  this.baseValidator = baseValidator;
155
298
  this.fallbackValue = fallbackValue;
299
+ // BUG-NPM-003 FIX: Validate the fallback value to ensure type safety
300
+ const validation = baseValidator.safeParse(fallbackValue);
301
+ if (!validation.success) {
302
+ throw new Error(`Invalid fallback value: ${validation.error.message}`);
303
+ }
156
304
  }
157
305
  parse(value) {
158
306
  try {
@@ -193,6 +341,9 @@ export class VldOptional extends VldBase {
193
341
  }
194
342
  return this.baseValidator.safeParse(value);
195
343
  }
344
+ unwrap() {
345
+ return this.baseValidator;
346
+ }
196
347
  }
197
348
  /**
198
349
  * Nullable validator - allows null
@@ -217,6 +368,9 @@ export class VldNullable extends VldBase {
217
368
  }
218
369
  return this.baseValidator.safeParse(value);
219
370
  }
371
+ unwrap() {
372
+ return this.baseValidator;
373
+ }
220
374
  }
221
375
  /**
222
376
  * Nullish validator - allows null or undefined
@@ -241,5 +395,105 @@ export class VldNullish extends VldBase {
241
395
  }
242
396
  return this.baseValidator.safeParse(value);
243
397
  }
398
+ unwrap() {
399
+ return this.baseValidator;
400
+ }
401
+ }
402
+ /**
403
+ * Pipe validator - chains validators, passing output of one to the next
404
+ */
405
+ export class VldPipe extends VldBase {
406
+ constructor(first, second) {
407
+ super();
408
+ this.first = first;
409
+ this.second = second;
410
+ }
411
+ parse(value) {
412
+ const intermediateResult = this.first.parse(value);
413
+ return this.second.parse(intermediateResult);
414
+ }
415
+ safeParse(value) {
416
+ const firstResult = this.first.safeParse(value);
417
+ if (!firstResult.success) {
418
+ return firstResult;
419
+ }
420
+ return this.second.safeParse(firstResult.data);
421
+ }
422
+ }
423
+ /**
424
+ * SuperRefine validator - advanced refinement with context
425
+ */
426
+ export class VldSuperRefine extends VldBase {
427
+ constructor(_inner, _refinement) {
428
+ super();
429
+ this._inner = _inner;
430
+ this._refinement = _refinement;
431
+ }
432
+ parse(value) {
433
+ const result = this._inner.parse(value);
434
+ const issues = [];
435
+ const ctx = {
436
+ addIssue: (issue) => issues.push(issue),
437
+ path: []
438
+ };
439
+ const maybePromise = this._refinement(result, ctx);
440
+ if (maybePromise instanceof Promise) {
441
+ throw new Error('Use parseAsync for async refinements');
442
+ }
443
+ if (issues.length > 0) {
444
+ throw new Error(issues.map(i => i.message).join('; '));
445
+ }
446
+ return result;
447
+ }
448
+ safeParse(value) {
449
+ const result = this._inner.safeParse(value);
450
+ if (!result.success)
451
+ return result;
452
+ const issues = [];
453
+ const ctx = {
454
+ addIssue: (issue) => issues.push(issue),
455
+ path: []
456
+ };
457
+ const maybePromise = this._refinement(result.data, ctx);
458
+ if (maybePromise instanceof Promise) {
459
+ throw new Error('Use safeParseAsync for async refinements');
460
+ }
461
+ if (issues.length > 0) {
462
+ return {
463
+ success: false,
464
+ error: new Error(issues.map(i => i.message).join('; '))
465
+ };
466
+ }
467
+ return result;
468
+ }
469
+ }
470
+ /**
471
+ * Preprocess validator - transforms input before validation
472
+ */
473
+ export class VldPreprocess extends VldBase {
474
+ constructor(_preprocessor, _schema) {
475
+ super();
476
+ this._preprocessor = _preprocessor;
477
+ this._schema = _schema;
478
+ }
479
+ static create(preprocessor, schema) {
480
+ return new VldPreprocess(preprocessor, schema);
481
+ }
482
+ parse(value) {
483
+ const preprocessed = this._preprocessor(value);
484
+ return this._schema.parse(preprocessed);
485
+ }
486
+ safeParse(value) {
487
+ try {
488
+ const preprocessed = this._preprocessor(value);
489
+ return this._schema.safeParse(preprocessed);
490
+ }
491
+ catch (error) {
492
+ return {
493
+ success: false,
494
+ error: error
495
+ };
496
+ }
497
+ }
244
498
  }
245
499
  //# sourceMappingURL=base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/validators/base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Base result type for validation\n */\nexport type ParseResult<T> = \n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly error: Error };\n\n/**\n * Abstract base class for all validators\n * Implements immutable pattern to prevent memory leaks and race conditions\n */\nexport abstract class VldBase<TInput, TOutput = TInput> {\n /**\n * Parse and validate a value, throwing an error if invalid\n * @param value The value to validate\n * @returns The validated value\n * @throws {Error} If validation fails\n */\n abstract parse(value: unknown): TOutput;\n \n /**\n * Safely parse and validate a value, returning a result object\n * @param value The value to validate\n * @returns A result object with either success and data, or failure and error\n */\n abstract safeParse(value: unknown): ParseResult<TOutput>;\n \n /**\n * Check if a value is valid according to this validator\n * @param value The value to check\n * @returns True if valid, false otherwise\n */\n isValid(value: unknown): boolean {\n return this.safeParse(value).success;\n }\n \n /**\n * Parse a value or return a default if validation fails\n * @param value The value to validate\n * @param defaultValue The default value to return on failure\n * @returns The validated value or default\n */\n parseOrDefault(value: unknown, defaultValue: TOutput): TOutput {\n const result = this.safeParse(value);\n return result.success ? result.data : defaultValue;\n }\n \n /**\n * Create a new validator that refines this one with a custom predicate\n * @param predicate The refinement predicate\n * @param message Optional custom error message\n * @returns A new refined validator\n */\n refine<TRefined extends TOutput>(\n predicate: (value: TOutput) => value is TRefined,\n message?: string\n ): VldRefine<TInput, TOutput, TRefined>;\n refine(\n predicate: (value: TOutput) => boolean,\n message?: string\n ): VldRefine<TInput, TOutput, TOutput>;\n refine(\n predicate: (value: TOutput) => boolean,\n message?: string\n ): VldRefine<TInput, TOutput, TOutput> {\n return new VldRefine(this, predicate, message);\n }\n \n /**\n * Create a new validator that transforms the output\n * @param transformer The transformation function\n * @returns A new transformed validator\n */\n transform<TTransformed>(\n transformer: (value: TOutput) => TTransformed\n ): VldTransform<TInput, TOutput, TTransformed> {\n return new VldTransform(this, transformer);\n }\n \n /**\n * Create a new validator with a default value for undefined inputs\n * @param defaultValue The default value\n * @returns A new validator with default\n */\n default(defaultValue: TOutput): VldDefault<TInput, TOutput> {\n return new VldDefault(this, defaultValue);\n }\n \n /**\n * Create a new validator that catches errors and returns a fallback\n * @param fallbackValue The fallback value\n * @returns A new validator with catch\n */\n catch(fallbackValue: TOutput): VldCatch<TInput, TOutput> {\n return new VldCatch(this, fallbackValue);\n }\n \n /**\n * Make this validator optional (allows undefined)\n * @returns A new optional validator\n */\n optional(): VldOptional<TInput, TOutput> {\n return new VldOptional(this);\n }\n \n /**\n * Make this validator nullable (allows null)\n * @returns A new nullable validator\n */\n nullable(): VldNullable<TInput, TOutput> {\n return new VldNullable(this);\n }\n \n /**\n * Make this validator nullish (allows null or undefined)\n * @returns A new nullish validator\n */\n nullish(): VldNullish<TInput, TOutput> {\n return new VldNullish(this);\n }\n}\n\n/**\n * Refine validator - adds custom validation\n */\nexport class VldRefine<TInput, TBase, TOutput extends TBase = TBase> extends VldBase<TInput, TOutput> {\n constructor(\n private readonly baseValidator: VldBase<TInput, TBase>,\n private readonly predicate: (value: TBase) => boolean,\n private readonly customMessage?: string\n ) {\n super();\n }\n \n parse(value: unknown): TOutput {\n const baseResult = this.baseValidator.parse(value);\n \n if (!this.predicate(baseResult)) {\n throw new Error(this.customMessage || 'Refinement check failed');\n }\n \n return baseResult as TOutput;\n }\n \n safeParse(value: unknown): ParseResult<TOutput> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}\n\n/**\n * Transform validator - transforms data after validation\n */\nexport class VldTransform<TInput, TBase, TOutput> extends VldBase<TInput, TOutput> {\n constructor(\n private readonly baseValidator: VldBase<TInput, TBase>,\n private readonly transformer: (value: TBase) => TOutput\n ) {\n super();\n }\n \n parse(value: unknown): TOutput {\n const baseResult = this.baseValidator.parse(value);\n \n try {\n return this.transformer(baseResult);\n } catch (error) {\n throw new Error(`Transform failed: ${(error as Error).message}`);\n }\n }\n \n safeParse(value: unknown): ParseResult<TOutput> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}\n\n/**\n * Default validator - provides default value for undefined\n */\nexport class VldDefault<TInput, TOutput> extends VldBase<TInput | undefined, TOutput> {\n constructor(\n private readonly baseValidator: VldBase<TInput, TOutput>,\n private readonly defaultValue: TOutput\n ) {\n super();\n }\n \n parse(value: unknown): TOutput {\n if (value === undefined) {\n return this.defaultValue;\n }\n return this.baseValidator.parse(value);\n }\n \n safeParse(value: unknown): ParseResult<TOutput> {\n if (value === undefined) {\n return { success: true, data: this.defaultValue };\n }\n return this.baseValidator.safeParse(value);\n }\n}\n\n/**\n * Catch validator - provides fallback value on validation error\n */\nexport class VldCatch<TInput, TOutput> extends VldBase<TInput, TOutput> {\n constructor(\n private readonly baseValidator: VldBase<TInput, TOutput>,\n private readonly fallbackValue: TOutput\n ) {\n super();\n }\n \n parse(value: unknown): TOutput {\n try {\n return this.baseValidator.parse(value);\n } catch {\n return this.fallbackValue;\n }\n }\n \n safeParse(value: unknown): ParseResult<TOutput> {\n const result = this.baseValidator.safeParse(value);\n if (result.success) {\n return result;\n }\n return { success: true, data: this.fallbackValue };\n }\n}\n\n/**\n * Optional validator - allows undefined\n */\nexport class VldOptional<TInput, TOutput> extends VldBase<TInput | undefined, TOutput | undefined> {\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\n super();\n }\n \n static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldOptional<TInput, TOutput> {\n return new VldOptional(baseValidator);\n }\n \n parse(value: unknown): TOutput | undefined {\n if (value === undefined) {\n return undefined;\n }\n return this.baseValidator.parse(value);\n }\n \n safeParse(value: unknown): ParseResult<TOutput | undefined> {\n if (value === undefined) {\n return { success: true, data: undefined };\n }\n return this.baseValidator.safeParse(value);\n }\n}\n\n/**\n * Nullable validator - allows null\n */\nexport class VldNullable<TInput, TOutput> extends VldBase<TInput | null, TOutput | null> {\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\n super();\n }\n \n static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullable<TInput, TOutput> {\n return new VldNullable(baseValidator);\n }\n \n parse(value: unknown): TOutput | null {\n if (value === null) {\n return null;\n }\n return this.baseValidator.parse(value);\n }\n \n safeParse(value: unknown): ParseResult<TOutput | null> {\n if (value === null) {\n return { success: true, data: null };\n }\n return this.baseValidator.safeParse(value);\n }\n}\n\n/**\n * Nullish validator - allows null or undefined\n */\nexport class VldNullish<TInput, TOutput> extends VldBase<TInput | null | undefined, TOutput | null | undefined> {\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\n super();\n }\n \n static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullish<TInput, TOutput> {\n return new VldNullish(baseValidator);\n }\n \n parse(value: unknown): TOutput | null | undefined {\n if (value === null || value === undefined) {\n return value as null | undefined;\n }\n return this.baseValidator.parse(value);\n }\n \n safeParse(value: unknown): ParseResult<TOutput | null | undefined> {\n if (value === null || value === undefined) {\n return { success: true, data: value as null | undefined };\n }\n return this.baseValidator.safeParse(value);\n }\n}"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/validators/base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Base result type for validation\r\n */\r\nexport type ParseResult<T> =\r\n | { readonly success: true; readonly data: T }\r\n | { readonly success: false; readonly error: Error };\r\n\r\n/**\r\n * Context for superRefine - allows adding multiple issues\r\n */\r\nexport interface SuperRefineContext {\r\n addIssue(issue: { message: string; code?: string }): void;\r\n path: (string | number)[];\r\n}\r\n\r\n/**\r\n * Abstract base class for all validators\r\n * Implements immutable pattern to prevent memory leaks and race conditions\r\n */\r\nexport abstract class VldBase<TInput, TOutput = TInput> {\r\n /**\r\n * Parse and validate a value, throwing an error if invalid\r\n * @param value The value to validate\r\n * @returns The validated value\r\n * @throws {Error} If validation fails\r\n */\r\n abstract parse(value: unknown): TOutput;\r\n \r\n /**\r\n * Safely parse and validate a value, returning a result object\r\n * @param value The value to validate\r\n * @returns A result object with either success and data, or failure and error\r\n */\r\n abstract safeParse(value: unknown): ParseResult<TOutput>;\r\n \r\n /**\r\n * Check if a value is valid according to this validator\r\n * @param value The value to check\r\n * @returns True if valid, false otherwise\r\n */\r\n isValid(value: unknown): boolean {\r\n return this.safeParse(value).success;\r\n }\r\n \r\n /**\r\n * Parse a value or return a default if validation fails\r\n * BUG-NEW-017 FIX: Validate default value to ensure type safety\r\n * @param value The value to validate\r\n * @param defaultValue The default value to return on failure\r\n * @returns The validated value or default\r\n */\r\n parseOrDefault(value: unknown, defaultValue: TOutput): TOutput {\r\n const result = this.safeParse(value);\r\n if (result.success) {\r\n return result.data;\r\n }\r\n\r\n // Validate the default value to ensure it's actually valid\r\n const defaultResult = this.safeParse(defaultValue);\r\n if (!defaultResult.success) {\r\n throw new Error(`Invalid default value provided: ${defaultResult.error.message}`);\r\n }\r\n\r\n return defaultResult.data;\r\n }\r\n \r\n /**\r\n * Create a new validator that refines this one with a custom predicate\r\n * @param predicate The refinement predicate\r\n * @param message Optional custom error message\r\n * @returns A new refined validator\r\n */\r\n refine<TRefined extends TOutput>(\r\n predicate: (value: TOutput) => value is TRefined,\r\n message?: string\r\n ): VldRefine<TInput, TOutput, TRefined>;\r\n refine(\r\n predicate: (value: TOutput) => boolean,\r\n message?: string\r\n ): VldRefine<TInput, TOutput, TOutput>;\r\n refine(\r\n predicate: (value: TOutput) => boolean,\r\n message?: string\r\n ): VldRefine<TInput, TOutput, TOutput> {\r\n return new VldRefine(this, predicate, message);\r\n }\r\n\r\n /**\r\n * Advanced refinement with context for adding multiple issues\r\n * @param refinement The refinement function with context\r\n * @returns A new super refined validator\r\n */\r\n superRefine(\r\n refinement: (value: TOutput, ctx: SuperRefineContext) => void | Promise<void>\r\n ): VldSuperRefine<TInput, TOutput> {\r\n return new VldSuperRefine(this, refinement);\r\n }\r\n\r\n /**\r\n * Create a new validator that transforms the output\r\n * @param transformer The transformation function\r\n * @returns A new transformed validator\r\n */\r\n transform<TTransformed>(\r\n transformer: (value: TOutput) => TTransformed\r\n ): VldTransform<TInput, TOutput, TTransformed> {\r\n return new VldTransform(this, transformer);\r\n }\r\n \r\n /**\r\n * Create a new validator with a default value for undefined inputs\r\n * @param defaultValue The default value\r\n * @returns A new validator with default\r\n */\r\n default(defaultValue: TOutput): VldDefault<TInput, TOutput> {\r\n return new VldDefault(this, defaultValue);\r\n }\r\n \r\n /**\r\n * Create a new validator that catches errors and returns a fallback\r\n * @param fallbackValue The fallback value\r\n * @returns A new validator with catch\r\n */\r\n catch(fallbackValue: TOutput): VldCatch<TInput, TOutput> {\r\n return new VldCatch(this, fallbackValue);\r\n }\r\n \r\n /**\r\n * Make this validator optional (allows undefined)\r\n * @returns A new optional validator\r\n */\r\n optional(): VldOptional<TInput, TOutput> {\r\n return new VldOptional(this);\r\n }\r\n \r\n /**\r\n * Make this validator nullable (allows null)\r\n * @returns A new nullable validator\r\n */\r\n nullable(): VldNullable<TInput, TOutput> {\r\n return new VldNullable(this);\r\n }\r\n \r\n /**\r\n * Make this validator nullish (allows null or undefined)\r\n * @returns A new nullish validator\r\n */\r\n nullish(): VldNullish<TInput, TOutput> {\r\n return new VldNullish(this);\r\n }\r\n\r\n /**\r\n * Pipe the output of this validator into another validator\r\n * @param next The next validator to pipe into\r\n * @returns A new piped validator\r\n */\r\n pipe<TNextOutput>(next: VldBase<TOutput, TNextOutput>): VldPipe<TInput, TOutput, TNextOutput> {\r\n return new VldPipe(this, next);\r\n }\r\n\r\n /**\r\n * Create a new validator that returns readonly output\r\n * Zod 4 API parity - marks output as readonly for TypeScript\r\n * @returns A new readonly validator\r\n */\r\n readonly(): VldReadonly<TInput, TOutput> {\r\n return new VldReadonly(this);\r\n }\r\n\r\n /**\r\n * Brand the output type with a unique brand for nominal typing\r\n * Zod 4 API parity - prevents accidental assignment of similarly typed values\r\n * @returns A new branded validator\r\n * @example\r\n * const userIdSchema = v.string().brand<'UserId'>();\r\n * const productIdSchema = v.string().brand<'ProductId'>();\r\n *\r\n * let userId: UserId = userIdSchema.parse('abc');\r\n * let productId: ProductId = productIdSchema.parse('xyz');\r\n *\r\n * userId = productId; // TypeScript error: types are incompatible\r\n */\r\n brand<TBrand extends string>(): VldBrand<TInput, TOutput, TBrand> {\r\n return new VldBrand(this);\r\n }\r\n\r\n /**\r\n * Apply an external function to transform this validator\r\n * Zod 4 API parity - allows external function chaining\r\n * @param fn External function that takes this validator and returns a new validator\r\n * @returns The result of applying the function to this validator\r\n * @example\r\n * const withLength = (schema: VldBase<unknown, string>) => schema.transform(s => s.length);\r\n * const lengthSchema = v.string().apply(withLength); // validates string, returns number\r\n */\r\n apply<TNewOutput>(fn: (schema: this) => VldBase<TInput, TNewOutput>): VldBase<TInput, TNewOutput> {\r\n return fn(this);\r\n }\r\n}\r\n\r\n/**\r\n * Readonly validator - marks output as readonly\r\n */\r\nexport class VldReadonly<TInput, TOutput> extends VldBase<TInput, Readonly<TOutput>> {\r\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): Readonly<TOutput> {\r\n return this.baseValidator.parse(value);\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<Readonly<TOutput>> {\r\n const result = this.baseValidator.safeParse(value);\r\n if (result.success) {\r\n return { success: true, data: result.data as Readonly<TOutput> };\r\n }\r\n return result as ParseResult<Readonly<TOutput>>;\r\n }\r\n}\r\n\r\n/**\r\n * Brand validator - adds a unique brand to the output type for nominal typing\r\n * Uses TypeScript's branded types pattern to prevent accidental assignment\r\n */\r\nexport class VldBrand<TInput, TOutput, TBrand extends string> extends VldBase<\r\n TInput,\r\n TOutput & { readonly __brand: TBrand }\r\n> {\r\n constructor(\r\n private readonly baseValidator: VldBase<TInput, TOutput>\r\n ) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): TOutput & { readonly __brand: TBrand } {\r\n return this.baseValidator.parse(value) as TOutput & {\r\n readonly __brand: TBrand;\r\n };\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<TOutput & { readonly __brand: TBrand }> {\r\n const result = this.baseValidator.safeParse(value);\r\n if (result.success) {\r\n return {\r\n success: true,\r\n data: result.data as TOutput & { readonly __brand: TBrand }\r\n };\r\n }\r\n return result as ParseResult<TOutput & { readonly __brand: TBrand }>;\r\n }\r\n}\r\n\r\n/**\r\n * Refine validator - adds custom validation\r\n */\r\nexport class VldRefine<TInput, TBase, TOutput extends TBase = TBase> extends VldBase<TInput, TOutput> {\r\n constructor(\r\n private readonly baseValidator: VldBase<TInput, TBase>,\r\n private readonly predicate: (value: TBase) => boolean,\r\n private readonly customMessage?: string\r\n ) {\r\n super();\r\n }\r\n \r\n parse(value: unknown): TOutput {\r\n const baseResult = this.baseValidator.parse(value);\r\n \r\n if (!this.predicate(baseResult)) {\r\n throw new Error(this.customMessage || 'Refinement check failed');\r\n }\r\n \r\n return baseResult as TOutput;\r\n }\r\n \r\n safeParse(value: unknown): ParseResult<TOutput> {\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/**\r\n * Transform validator - transforms data after validation\r\n */\r\nexport class VldTransform<TInput, TBase, TOutput> extends VldBase<TInput, TOutput> {\r\n constructor(\r\n private readonly baseValidator: VldBase<TInput, TBase>,\r\n private readonly transformer: (value: TBase) => TOutput\r\n ) {\r\n super();\r\n }\r\n \r\n parse(value: unknown): TOutput {\r\n const baseResult = this.baseValidator.parse(value);\r\n \r\n try {\r\n return this.transformer(baseResult);\r\n } catch (error) {\r\n throw new Error(`Transform failed: ${(error as Error).message}`);\r\n }\r\n }\r\n \r\n safeParse(value: unknown): ParseResult<TOutput> {\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/**\r\n * Default validator - provides default value for undefined\r\n * Note: Does not validate the default value at construction time.\r\n * Use .prefault() to validate the default value at parse time.\r\n */\r\nexport class VldDefault<TInput, TOutput> extends VldBase<TInput | undefined, TOutput> {\r\n constructor(\r\n private readonly baseValidator: VldBase<TInput, TOutput>,\r\n private readonly defaultValue: TOutput\r\n ) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): TOutput {\r\n if (value === undefined) {\r\n return this.defaultValue;\r\n }\r\n return this.baseValidator.parse(value);\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<TOutput> {\r\n if (value === undefined) {\r\n return { success: true, data: this.defaultValue };\r\n }\r\n return this.baseValidator.safeParse(value);\r\n }\r\n\r\n /**\r\n * Pre-parse default - validates the default value instead of returning it directly\r\n * This is useful when the default value needs to be validated against the schema\r\n */\r\n prefault(): VldPrefault<TInput, TOutput> {\r\n // Return a new validator that validates the default value when parse(undefined) is called\r\n return new VldPrefault(this.baseValidator, this.defaultValue);\r\n }\r\n}\r\n\r\n/**\r\n * Prefault validator - validates the default value instead of returning it directly\r\n */\r\nexport class VldPrefault<TInput, TOutput> extends VldBase<TInput | undefined, TOutput> {\r\n constructor(\r\n private readonly baseValidator: VldBase<TInput, TOutput>,\r\n private readonly defaultValue: TOutput\r\n ) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): TOutput {\r\n if (value === undefined) {\r\n // Validate the default value through the base validator\r\n return this.baseValidator.parse(this.defaultValue as unknown);\r\n }\r\n return this.baseValidator.parse(value);\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<TOutput> {\r\n if (value === undefined) {\r\n return this.baseValidator.safeParse(this.defaultValue as unknown);\r\n }\r\n return this.baseValidator.safeParse(value);\r\n }\r\n\r\n /**\r\n * Calling prefault multiple times should be safe - return self\r\n */\r\n prefault(): VldPrefault<TInput, TOutput> {\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * Catch validator - provides fallback value on validation error\r\n * BUG-NPM-003 FIX: Validate fallback value at construction time\r\n */\r\nexport class VldCatch<TInput, TOutput> extends VldBase<TInput, TOutput> {\r\n constructor(\r\n private readonly baseValidator: VldBase<TInput, TOutput>,\r\n private readonly fallbackValue: TOutput\r\n ) {\r\n super();\r\n // BUG-NPM-003 FIX: Validate the fallback value to ensure type safety\r\n const validation = baseValidator.safeParse(fallbackValue);\r\n if (!validation.success) {\r\n throw new Error(`Invalid fallback value: ${validation.error.message}`);\r\n }\r\n }\r\n \r\n parse(value: unknown): TOutput {\r\n try {\r\n return this.baseValidator.parse(value);\r\n } catch {\r\n return this.fallbackValue;\r\n }\r\n }\r\n \r\n safeParse(value: unknown): ParseResult<TOutput> {\r\n const result = this.baseValidator.safeParse(value);\r\n if (result.success) {\r\n return result;\r\n }\r\n return { success: true, data: this.fallbackValue };\r\n }\r\n}\r\n\r\n/**\r\n * Optional validator - allows undefined\r\n */\r\nexport class VldOptional<TInput, TOutput> extends VldBase<TInput | undefined, TOutput | undefined> {\r\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\r\n super();\r\n }\r\n\r\n static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldOptional<TInput, TOutput> {\r\n return new VldOptional(baseValidator);\r\n }\r\n\r\n parse(value: unknown): TOutput | undefined {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n return this.baseValidator.parse(value);\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<TOutput | undefined> {\r\n if (value === undefined) {\r\n return { success: true, data: undefined };\r\n }\r\n return this.baseValidator.safeParse(value);\r\n }\r\n\r\n unwrap(): VldBase<TInput, TOutput> {\r\n return this.baseValidator;\r\n }\r\n}\r\n\r\n/**\r\n * Nullable validator - allows null\r\n */\r\nexport class VldNullable<TInput, TOutput> extends VldBase<TInput | null, TOutput | null> {\r\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\r\n super();\r\n }\r\n\r\n static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullable<TInput, TOutput> {\r\n return new VldNullable(baseValidator);\r\n }\r\n\r\n parse(value: unknown): TOutput | null {\r\n if (value === null) {\r\n return null;\r\n }\r\n return this.baseValidator.parse(value);\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<TOutput | null> {\r\n if (value === null) {\r\n return { success: true, data: null };\r\n }\r\n return this.baseValidator.safeParse(value);\r\n }\r\n\r\n unwrap(): VldBase<TInput, TOutput> {\r\n return this.baseValidator;\r\n }\r\n}\r\n\r\n/**\r\n * Nullish validator - allows null or undefined\r\n */\r\nexport class VldNullish<TInput, TOutput> extends VldBase<TInput | null | undefined, TOutput | null | undefined> {\r\n constructor(private readonly baseValidator: VldBase<TInput, TOutput>) {\r\n super();\r\n }\r\n\r\n static create<TInput, TOutput>(baseValidator: VldBase<TInput, TOutput>): VldNullish<TInput, TOutput> {\r\n return new VldNullish(baseValidator);\r\n }\r\n\r\n parse(value: unknown): TOutput | null | undefined {\r\n if (value === null || value === undefined) {\r\n return value as null | undefined;\r\n }\r\n return this.baseValidator.parse(value);\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<TOutput | null | undefined> {\r\n if (value === null || value === undefined) {\r\n return { success: true, data: value as null | undefined };\r\n }\r\n return this.baseValidator.safeParse(value);\r\n }\r\n\r\n unwrap(): VldBase<TInput, TOutput> {\r\n return this.baseValidator;\r\n }\r\n}\r\n\r\n/**\r\n * Pipe validator - chains validators, passing output of one to the next\r\n */\r\nexport class VldPipe<TInput, TIntermediate, TOutput> extends VldBase<TInput, TOutput> {\r\n constructor(\r\n private readonly first: VldBase<TInput, TIntermediate>,\r\n private readonly second: VldBase<TIntermediate, TOutput>\r\n ) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): TOutput {\r\n const intermediateResult = this.first.parse(value);\r\n return this.second.parse(intermediateResult);\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<TOutput> {\r\n const firstResult = this.first.safeParse(value);\r\n if (!firstResult.success) {\r\n return firstResult as ParseResult<TOutput>;\r\n }\r\n return this.second.safeParse(firstResult.data);\r\n }\r\n}\r\n\r\n/**\r\n * SuperRefine validator - advanced refinement with context\r\n */\r\nexport class VldSuperRefine<TInput, TOutput> extends VldBase<TInput, TOutput> {\r\n constructor(\r\n private readonly _inner: VldBase<TInput, TOutput>,\r\n private readonly _refinement: (value: TOutput, ctx: SuperRefineContext) => void | Promise<void>\r\n ) {\r\n super();\r\n }\r\n\r\n parse(value: unknown): TOutput {\r\n const result = this._inner.parse(value);\r\n\r\n const issues: { message: string; code?: string }[] = [];\r\n const ctx: SuperRefineContext = {\r\n addIssue: (issue) => issues.push(issue),\r\n path: []\r\n };\r\n\r\n const maybePromise = this._refinement(result, ctx);\r\n if (maybePromise instanceof Promise) {\r\n throw new Error('Use parseAsync for async refinements');\r\n }\r\n\r\n if (issues.length > 0) {\r\n throw new Error(issues.map(i => i.message).join('; '));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<TOutput> {\r\n const result = this._inner.safeParse(value);\r\n if (!result.success) return result as ParseResult<TOutput>;\r\n\r\n const issues: { message: string; code?: string }[] = [];\r\n const ctx: SuperRefineContext = {\r\n addIssue: (issue) => issues.push(issue),\r\n path: []\r\n };\r\n\r\n const maybePromise = this._refinement(result.data, ctx);\r\n if (maybePromise instanceof Promise) {\r\n throw new Error('Use safeParseAsync for async refinements');\r\n }\r\n\r\n if (issues.length > 0) {\r\n return {\r\n success: false,\r\n error: new Error(issues.map(i => i.message).join('; '))\r\n };\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Preprocess validator - transforms input before validation\r\n */\r\nexport class VldPreprocess<TInput, TOutput> extends VldBase<unknown, TOutput> {\r\n constructor(\r\n private readonly _preprocessor: (input: unknown) => unknown,\r\n private readonly _schema: VldBase<TInput, TOutput>\r\n ) {\r\n super();\r\n }\r\n\r\n static create<TInput, TOutput>(\r\n preprocessor: (input: unknown) => unknown,\r\n schema: VldBase<TInput, TOutput>\r\n ): VldPreprocess<TInput, TOutput> {\r\n return new VldPreprocess(preprocessor, schema);\r\n }\r\n\r\n parse(value: unknown): TOutput {\r\n const preprocessed = this._preprocessor(value);\r\n return this._schema.parse(preprocessed);\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<TOutput> {\r\n try {\r\n const preprocessed = this._preprocessor(value);\r\n return this._schema.safeParse(preprocessed);\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error as Error\r\n };\r\n }\r\n }\r\n}"]}
@@ -1,6 +1,6 @@
1
1
  import { VldBase } from './base.js';
2
2
  import { VldError, createIssue } from '../errors.js';
3
- import { getMessages } from '../locales.js';
3
+ import { getMessages } from '../locales/index.js';
4
4
  /**
5
5
  * Base64 string validator
6
6
  */