@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
package/README.md CHANGED
@@ -1,10 +1,6 @@
1
1
  # VLD - Fast & Lightweight TypeScript Validation Library
2
2
 
3
- [![NPM Version](https://img.shields.io/npm/v/@oxog/vld.svg)](https://www.npmjs.com/package/@oxog/vld)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org/)
6
- [![Zero Dependencies](https://img.shields.io/badge/Dependencies-0-green.svg)](package.json)
7
- [![Test Coverage](https://img.shields.io/badge/Coverage-96.55%25-brightgreen.svg)](package.json)
3
+ [![NPM Version](https://img.shields.io/npm/v/@oxog/vld.svg)](https://www.npmjs.com/package/@oxog/vld) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org/) [![Zero Dependencies](https://img.shields.io/badge/Dependencies-0-green.svg)](package.json) [![Test Coverage](https://img.shields.io/badge/Coverage-96.55%25-brightgreen.svg)](package.json)
8
4
 
9
5
  VLD is a blazing-fast, type-safe validation library for TypeScript and JavaScript with **full Zod feature parity**. Built with performance in mind, it provides a simple and intuitive API while maintaining excellent type inference and 27+ language internationalization support.
10
6
 
@@ -35,8 +31,8 @@ VLD is a blazing-fast, type-safe validation library for TypeScript and JavaScrip
35
31
  - **🔧 Composable**: Chain validations for complex schemas
36
32
  - **⚠️ Advanced Error Formatting**: Tree, pretty, and flatten error utilities
37
33
  - **🌍 Multi-language**: Built-in support for 27+ languages
38
- - **✅ 96.55% Test Coverage**: Rigorously tested with 695 passing tests
39
- - **🏆 Industry Leading Performance**: 2.07x faster than Zod on average
34
+ - **✅ 96.55% Test Coverage**: Rigorously tested with 1142 passing tests
35
+ - **🏆 Industry Leading Performance**: 2.52x faster than Zod on average
40
36
 
41
37
  ### Advanced Zod-Compatible Features
42
38
  - **🔄 Type Coercion**: `v.coerce.string()`, `v.coerce.number()`, `v.coerce.boolean()`, etc.
@@ -48,7 +44,12 @@ VLD is a blazing-fast, type-safe validation library for TypeScript and JavaScrip
48
44
  - **🛡️ Fallback Handling**: `catch()` for graceful error recovery
49
45
  - **🎯 Object Utilities**: `pick()`, `omit()`, `extend()` for flexible object schemas
50
46
 
51
- ### 🚀 **NEW** Codec System - Beyond Zod
47
+ ### 🚀 **NEW in v1.4.0** - Zod 4 Full API Parity
48
+ - **🌐 `v.cidrv6()`**: IPv6 CIDR block validation
49
+ - **🔗 `.apply()`**: External function chaining for advanced composition
50
+ - **🛡️ `.safeExtend()`**: Type-safe object extension without accidental overrides
51
+
52
+ ### 🚀 Codec System - Beyond Zod
52
53
  - **↔️ Bidirectional Transformations**: Full encode/decode support for data conversion
53
54
  - **📦 19 Built-in Codecs**: String conversions, date parsing, JSON, URL, binary data
54
55
  - **🔗 Zod-Compatible**: All `stringToNumber`, `jsonCodec`, `base64ToBytes`, etc.
@@ -1077,7 +1078,7 @@ const schema = v.string().email();
1077
1078
  - **🌍 Internationalization**: Built-in 27+ language support
1078
1079
  - **📦 Bundle Size**: Smaller with zero dependencies
1079
1080
  - **🔒 Security**: Immutable validators prevent memory leaks
1080
- - **✅ Testing**: 96.55% test coverage with 695 tests
1081
+ - **✅ Testing**: 96.55% test coverage with 1142 tests
1081
1082
 
1082
1083
  ## 📈 Benchmarks
1083
1084
 
@@ -1096,7 +1097,7 @@ Latest benchmark results show VLD consistently outperforming Zod:
1096
1097
  | Optional Values | 32.7M ops/sec | **4.52x faster** |
1097
1098
  | Type Coercion | 18.4M ops/sec | **1.46x faster** |
1098
1099
 
1099
- **Average: 2.07x faster than Zod**
1100
+ **Average: 2.52x faster than Zod**
1100
1101
 
1101
1102
  ### Run Benchmarks
1102
1103
 
@@ -1120,10 +1121,10 @@ Contributions are welcome! Please feel free to submit a Pull Request.
1120
1121
 
1121
1122
  ## 🔗 Links
1122
1123
 
1124
+ - [Documentation](https://vld.oxog.dev)
1123
1125
  - [NPM Package](https://www.npmjs.com/package/@oxog/vld)
1124
1126
  - [GitHub Repository](https://github.com/ersinkoc/vld)
1125
- - [Documentation](https://github.com/ersinkoc/vld#readme)
1126
1127
 
1127
1128
  ---
1128
1129
 
1129
- Made with ❤️ by Ersin KOÇ
1130
+ Made with ❤️ by [Ersin KOÇ](https://github.com/ersinkoc)
@@ -0,0 +1,15 @@
1
+ /**
2
+ * VLD CLI - Benchmark Command
3
+ *
4
+ * VLD performans testlerini çalıştırır.
5
+ *
6
+ * Kullanım:
7
+ * vld benchmark
8
+ * vld benchmark --iterations 10000
9
+ */
10
+ import type { Command } from './index.js';
11
+ /**
12
+ * Benchmark command
13
+ */
14
+ export declare const benchmarkCommand: Command;
15
+ //# sourceMappingURL=benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/cli/benchmark.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,OAoD9B,CAAC"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * VLD CLI - Benchmark Command
3
+ *
4
+ * VLD performans testlerini çalıştırır.
5
+ *
6
+ * Kullanım:
7
+ * vld benchmark
8
+ * vld benchmark --iterations 10000
9
+ */
10
+ import { style, formatTable } from '../style.js';
11
+ import { v } from '../index.js';
12
+ /**
13
+ * Benchmark command
14
+ */
15
+ export const benchmarkCommand = {
16
+ name: 'benchmark',
17
+ description: 'Run VLD performance benchmarks',
18
+ aliases: ['bench', 'b'],
19
+ arguments: [],
20
+ options: [
21
+ {
22
+ name: 'iterations',
23
+ short: 'i',
24
+ description: 'Number of iterations',
25
+ type: 'string',
26
+ default: '10000'
27
+ },
28
+ {
29
+ name: 'warmup',
30
+ short: 'w',
31
+ description: 'Warmup iterations',
32
+ type: 'string',
33
+ default: '1000'
34
+ },
35
+ {
36
+ name: 'format',
37
+ short: 'f',
38
+ description: 'Output format (pretty, json)',
39
+ type: 'string',
40
+ default: 'pretty'
41
+ }
42
+ ],
43
+ async action(_args, opts) {
44
+ const iterations = parseInt(opts.iterations, 10);
45
+ const warmup = parseInt(opts.warmup, 10);
46
+ const format = opts.format;
47
+ console.log(style.cyan('VLD Performance Benchmark'));
48
+ console.log('');
49
+ console.log(`${style.dim('Iterations:')} ${iterations.toLocaleString()}`);
50
+ console.log(`${style.dim('Warmup:')} ${warmup.toLocaleString()}`);
51
+ console.log('');
52
+ // Run benchmarks
53
+ const results = await runBenchmarks(iterations, warmup);
54
+ // Output results
55
+ if (format === 'json') {
56
+ console.log(JSON.stringify(results, null, 2));
57
+ }
58
+ else {
59
+ printResults(results);
60
+ }
61
+ }
62
+ };
63
+ /**
64
+ * Benchmark suite'leri
65
+ */
66
+ function getBenchmarkSuites() {
67
+ // Test data
68
+ const simpleStringData = 'hello world';
69
+ const simpleNumberData = 42;
70
+ const simpleObjectData = { name: 'John', age: 30, email: 'john@example.com' };
71
+ const complexObjectData = {
72
+ user: {
73
+ id: 1,
74
+ name: 'John Doe',
75
+ email: 'john@example.com',
76
+ roles: ['admin', 'user'],
77
+ profile: {
78
+ bio: 'A software developer',
79
+ avatar: 'https://example.com/avatar.jpg',
80
+ settings: {
81
+ theme: 'dark',
82
+ notifications: true
83
+ }
84
+ }
85
+ },
86
+ posts: [
87
+ { id: 1, title: 'Hello', content: 'World' },
88
+ { id: 2, title: 'Foo', content: 'Bar' }
89
+ ]
90
+ };
91
+ const arrayData = Array.from({ length: 100 }, (_, i) => ({
92
+ id: i,
93
+ name: `Item ${i}`,
94
+ value: i * 10
95
+ }));
96
+ // Schemas
97
+ const stringSchema = v.string();
98
+ const numberSchema = v.number();
99
+ const simpleObjectSchema = v.object({
100
+ name: v.string(),
101
+ age: v.number(),
102
+ email: v.string().email()
103
+ });
104
+ const complexObjectSchema = v.object({
105
+ user: v.object({
106
+ id: v.number(),
107
+ name: v.string(),
108
+ email: v.string().email(),
109
+ roles: v.array(v.string()),
110
+ profile: v.object({
111
+ bio: v.string(),
112
+ avatar: v.string().url(),
113
+ settings: v.object({
114
+ theme: v.string(),
115
+ notifications: v.boolean()
116
+ })
117
+ })
118
+ }),
119
+ posts: v.array(v.object({
120
+ id: v.number(),
121
+ title: v.string(),
122
+ content: v.string()
123
+ }))
124
+ });
125
+ const arraySchema = v.array(v.object({
126
+ id: v.number(),
127
+ name: v.string(),
128
+ value: v.number()
129
+ }));
130
+ return [
131
+ {
132
+ name: 'String validation',
133
+ run: (n) => {
134
+ for (let i = 0; i < n; i++) {
135
+ stringSchema.parse(simpleStringData);
136
+ }
137
+ }
138
+ },
139
+ {
140
+ name: 'Number validation',
141
+ run: (n) => {
142
+ for (let i = 0; i < n; i++) {
143
+ numberSchema.parse(simpleNumberData);
144
+ }
145
+ }
146
+ },
147
+ {
148
+ name: 'Simple object',
149
+ run: (n) => {
150
+ for (let i = 0; i < n; i++) {
151
+ simpleObjectSchema.parse(simpleObjectData);
152
+ }
153
+ }
154
+ },
155
+ {
156
+ name: 'Complex object',
157
+ run: (n) => {
158
+ for (let i = 0; i < n; i++) {
159
+ complexObjectSchema.parse(complexObjectData);
160
+ }
161
+ }
162
+ },
163
+ {
164
+ name: 'Array (100 items)',
165
+ run: (n) => {
166
+ for (let i = 0; i < n; i++) {
167
+ arraySchema.parse(arrayData);
168
+ }
169
+ }
170
+ },
171
+ {
172
+ name: 'safeParse (success)',
173
+ run: (n) => {
174
+ for (let i = 0; i < n; i++) {
175
+ simpleObjectSchema.safeParse(simpleObjectData);
176
+ }
177
+ }
178
+ },
179
+ {
180
+ name: 'safeParse (failure)',
181
+ run: (n) => {
182
+ const invalidData = { name: 123, age: 'invalid', email: 'invalid' };
183
+ for (let i = 0; i < n; i++) {
184
+ simpleObjectSchema.safeParse(invalidData);
185
+ }
186
+ }
187
+ }
188
+ ];
189
+ }
190
+ // ============================================================================
191
+ // Benchmark Runner
192
+ // ============================================================================
193
+ /**
194
+ * Benchmark'ları çalıştırır
195
+ */
196
+ async function runBenchmarks(iterations, warmup) {
197
+ const suites = getBenchmarkSuites();
198
+ const results = [];
199
+ for (const suite of suites) {
200
+ // Warmup
201
+ process.stdout.write(`${style.dim('Warming up:')} ${suite.name}...`);
202
+ suite.run(warmup);
203
+ process.stdout.write('\r' + ' '.repeat(60) + '\r');
204
+ // Benchmark
205
+ process.stdout.write(`${style.dim('Running:')} ${suite.name}...`);
206
+ const start = performance.now();
207
+ suite.run(iterations);
208
+ const end = performance.now();
209
+ process.stdout.write('\r' + ' '.repeat(60) + '\r');
210
+ const ms = end - start;
211
+ const opsPerSec = Math.round((iterations / ms) * 1000);
212
+ results.push({
213
+ name: suite.name,
214
+ ops: iterations,
215
+ ms: Math.round(ms * 100) / 100,
216
+ opsPerSec
217
+ });
218
+ console.log(`${style.green('✔')} ${suite.name}: ${style.bold(opsPerSec.toLocaleString())} ops/sec`);
219
+ }
220
+ return results;
221
+ }
222
+ /**
223
+ * Sonuçları yazdırır
224
+ */
225
+ function printResults(results) {
226
+ console.log('');
227
+ console.log(style.bold('Results:'));
228
+ console.log('');
229
+ const table = formatTable(results.map((r) => [
230
+ r.name,
231
+ r.opsPerSec.toLocaleString(),
232
+ `${r.ms.toFixed(2)}ms`
233
+ ]), {
234
+ columns: [
235
+ { header: 'Benchmark', align: 'left' },
236
+ { header: 'ops/sec', align: 'right' },
237
+ { header: 'Time', align: 'right' }
238
+ ],
239
+ headerColor: style.bold
240
+ });
241
+ console.log(table);
242
+ console.log('');
243
+ // Summary
244
+ const totalOps = results.reduce((sum, r) => sum + r.opsPerSec, 0);
245
+ const avgOps = Math.round(totalOps / results.length);
246
+ console.log(style.dim('Average:') + ` ${avgOps.toLocaleString()} ops/sec`);
247
+ }
248
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/cli/benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * VLD CLI - Benchmark Command\n *\n * VLD performans testlerini çalıştırır.\n *\n * Kullanım:\n * vld benchmark\n * vld benchmark --iterations 10000\n */\n\nimport type { Command } from './index.js';\nimport { style, formatTable } from '../style.js';\nimport { v } from '../index.js';\n\n/**\n * Benchmark command\n */\nexport const benchmarkCommand: Command = {\n name: 'benchmark',\n description: 'Run VLD performance benchmarks',\n aliases: ['bench', 'b'],\n\n arguments: [],\n\n options: [\n {\n name: 'iterations',\n short: 'i',\n description: 'Number of iterations',\n type: 'string',\n default: '10000'\n },\n {\n name: 'warmup',\n short: 'w',\n description: 'Warmup iterations',\n type: 'string',\n default: '1000'\n },\n {\n name: 'format',\n short: 'f',\n description: 'Output format (pretty, json)',\n type: 'string',\n default: 'pretty'\n }\n ],\n\n async action(_args, opts) {\n const iterations = parseInt(opts.iterations as string, 10);\n const warmup = parseInt(opts.warmup as string, 10);\n const format = opts.format as string;\n\n console.log(style.cyan('VLD Performance Benchmark'));\n console.log('');\n console.log(`${style.dim('Iterations:')} ${iterations.toLocaleString()}`);\n console.log(`${style.dim('Warmup:')} ${warmup.toLocaleString()}`);\n console.log('');\n\n // Run benchmarks\n const results = await runBenchmarks(iterations, warmup);\n\n // Output results\n if (format === 'json') {\n console.log(JSON.stringify(results, null, 2));\n } else {\n printResults(results);\n }\n }\n};\n\n// ============================================================================\n// Benchmark Definitions\n// ============================================================================\n\ninterface BenchmarkResult {\n name: string;\n ops: number;\n ms: number;\n opsPerSec: number;\n}\n\ninterface BenchmarkSuite {\n name: string;\n run: (iterations: number) => void;\n}\n\n/**\n * Benchmark suite'leri\n */\nfunction getBenchmarkSuites(): BenchmarkSuite[] {\n // Test data\n const simpleStringData = 'hello world';\n const simpleNumberData = 42;\n const simpleObjectData = { name: 'John', age: 30, email: 'john@example.com' };\n const complexObjectData = {\n user: {\n id: 1,\n name: 'John Doe',\n email: 'john@example.com',\n roles: ['admin', 'user'],\n profile: {\n bio: 'A software developer',\n avatar: 'https://example.com/avatar.jpg',\n settings: {\n theme: 'dark',\n notifications: true\n }\n }\n },\n posts: [\n { id: 1, title: 'Hello', content: 'World' },\n { id: 2, title: 'Foo', content: 'Bar' }\n ]\n };\n const arrayData = Array.from({ length: 100 }, (_, i) => ({\n id: i,\n name: `Item ${i}`,\n value: i * 10\n }));\n\n // Schemas\n const stringSchema = v.string();\n const numberSchema = v.number();\n const simpleObjectSchema = v.object({\n name: v.string(),\n age: v.number(),\n email: v.string().email()\n });\n const complexObjectSchema = v.object({\n user: v.object({\n id: v.number(),\n name: v.string(),\n email: v.string().email(),\n roles: v.array(v.string()),\n profile: v.object({\n bio: v.string(),\n avatar: v.string().url(),\n settings: v.object({\n theme: v.string(),\n notifications: v.boolean()\n })\n })\n }),\n posts: v.array(v.object({\n id: v.number(),\n title: v.string(),\n content: v.string()\n }))\n });\n const arraySchema = v.array(v.object({\n id: v.number(),\n name: v.string(),\n value: v.number()\n }));\n\n return [\n {\n name: 'String validation',\n run: (n) => {\n for (let i = 0; i < n; i++) {\n stringSchema.parse(simpleStringData);\n }\n }\n },\n {\n name: 'Number validation',\n run: (n) => {\n for (let i = 0; i < n; i++) {\n numberSchema.parse(simpleNumberData);\n }\n }\n },\n {\n name: 'Simple object',\n run: (n) => {\n for (let i = 0; i < n; i++) {\n simpleObjectSchema.parse(simpleObjectData);\n }\n }\n },\n {\n name: 'Complex object',\n run: (n) => {\n for (let i = 0; i < n; i++) {\n complexObjectSchema.parse(complexObjectData);\n }\n }\n },\n {\n name: 'Array (100 items)',\n run: (n) => {\n for (let i = 0; i < n; i++) {\n arraySchema.parse(arrayData);\n }\n }\n },\n {\n name: 'safeParse (success)',\n run: (n) => {\n for (let i = 0; i < n; i++) {\n simpleObjectSchema.safeParse(simpleObjectData);\n }\n }\n },\n {\n name: 'safeParse (failure)',\n run: (n) => {\n const invalidData = { name: 123, age: 'invalid', email: 'invalid' };\n for (let i = 0; i < n; i++) {\n simpleObjectSchema.safeParse(invalidData);\n }\n }\n }\n ];\n}\n\n// ============================================================================\n// Benchmark Runner\n// ============================================================================\n\n/**\n * Benchmark'ları çalıştırır\n */\nasync function runBenchmarks(iterations: number, warmup: number): Promise<BenchmarkResult[]> {\n const suites = getBenchmarkSuites();\n const results: BenchmarkResult[] = [];\n\n for (const suite of suites) {\n // Warmup\n process.stdout.write(`${style.dim('Warming up:')} ${suite.name}...`);\n suite.run(warmup);\n process.stdout.write('\\r' + ' '.repeat(60) + '\\r');\n\n // Benchmark\n process.stdout.write(`${style.dim('Running:')} ${suite.name}...`);\n\n const start = performance.now();\n suite.run(iterations);\n const end = performance.now();\n\n process.stdout.write('\\r' + ' '.repeat(60) + '\\r');\n\n const ms = end - start;\n const opsPerSec = Math.round((iterations / ms) * 1000);\n\n results.push({\n name: suite.name,\n ops: iterations,\n ms: Math.round(ms * 100) / 100,\n opsPerSec\n });\n\n console.log(`${style.green('✔')} ${suite.name}: ${style.bold(opsPerSec.toLocaleString())} ops/sec`);\n }\n\n return results;\n}\n\n/**\n * Sonuçları yazdırır\n */\nfunction printResults(results: BenchmarkResult[]): void {\n console.log('');\n console.log(style.bold('Results:'));\n console.log('');\n\n const table = formatTable(\n results.map((r) => [\n r.name,\n r.opsPerSec.toLocaleString(),\n `${r.ms.toFixed(2)}ms`\n ]),\n {\n columns: [\n { header: 'Benchmark', align: 'left' },\n { header: 'ops/sec', align: 'right' },\n { header: 'Time', align: 'right' }\n ],\n headerColor: style.bold\n }\n );\n\n console.log(table);\n console.log('');\n\n // Summary\n const totalOps = results.reduce((sum, r) => sum + r.opsPerSec, 0);\n const avgOps = Math.round(totalOps / results.length);\n\n console.log(style.dim('Average:') + ` ${avgOps.toLocaleString()} ops/sec`);\n}\n"]}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * VLD CLI Entry Point
4
+ *
5
+ * This is the main entry point for the `vld` command-line tool.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * VLD CLI Entry Point
4
+ *
5
+ * This is the main entry point for the `vld` command-line tool.
6
+ */
7
+ import { vldCli } from './index.js';
8
+ import { validateCommand } from './commands/validate.js';
9
+ import { benchmarkCommand } from './commands/benchmark.js';
10
+ // Register commands
11
+ vldCli.command(validateCommand);
12
+ vldCli.command(benchmarkCommand);
13
+ // Help command
14
+ vldCli.command({
15
+ name: 'help',
16
+ description: 'Show help information',
17
+ aliases: ['h'],
18
+ action: () => {
19
+ console.log(vldCli.help());
20
+ }
21
+ });
22
+ // Version command
23
+ vldCli.command({
24
+ name: 'version',
25
+ description: 'Show version information',
26
+ action: () => {
27
+ console.log('vld v1.5.0');
28
+ }
29
+ });
30
+ // Run CLI
31
+ vldCli.run(process.argv.slice(2)).catch((error) => {
32
+ console.error('Fatal error:', error);
33
+ process.exitCode = 1;
34
+ });
35
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,oBAAoB;AACpB,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AAChC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEjC,eAAe;AACf,MAAM,CAAC,OAAO,CAAC;IACb,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,uBAAuB;IACpC,OAAO,EAAE,CAAC,GAAG,CAAC;IACd,MAAM,EAAE,GAAG,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC,CAAC;AAEH,kBAAkB;AAClB,MAAM,CAAC,OAAO,CAAC;IACb,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,0BAA0B;IACvC,MAAM,EAAE,GAAG,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC,CAAC;AAEH,UAAU;AACV,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAChD,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * VLD CLI Entry Point\r\n *\r\n * This is the main entry point for the `vld` command-line tool.\r\n */\r\n\r\nimport { vldCli } from './index';\r\nimport { validateCommand } from './commands/validate';\r\nimport { benchmarkCommand } from './commands/benchmark';\r\n\r\n// Register commands\r\nvldCli.command(validateCommand);\r\nvldCli.command(benchmarkCommand);\r\n\r\n// Help command\r\nvldCli.command({\r\n name: 'help',\r\n description: 'Show help information',\r\n aliases: ['h'],\r\n action: () => {\r\n console.log(vldCli.help());\r\n }\r\n});\r\n\r\n// Version command\r\nvldCli.command({\r\n name: 'version',\r\n description: 'Show version information',\r\n action: () => {\r\n console.log('vld v1.5.0');\r\n }\r\n});\r\n\r\n// Run CLI\r\nvldCli.run(process.argv.slice(2)).catch((error) => {\r\n console.error('Fatal error:', error);\r\n process.exitCode = 1;\r\n});\r\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * VLD CLI - Benchmark Command
3
+ *
4
+ * Run performance benchmarks for VLD validation.
5
+ */
6
+ import type { CliCommand } from '../index';
7
+ /**
8
+ * Benchmark command
9
+ */
10
+ export declare const benchmarkCommand: CliCommand;
11
+ //# sourceMappingURL=benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/benchmark.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA8D3C;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,UAmM9B,CAAC"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * VLD CLI - Benchmark Command
3
+ *
4
+ * Run performance benchmarks for VLD validation.
5
+ */
6
+ import { pigment } from '../../pigment.js';
7
+ import { v } from '../../index.js';
8
+ /**
9
+ * Run a single benchmark
10
+ */
11
+ function runBenchmark(name, fn, iterations) {
12
+ // Warm up
13
+ for (let i = 0; i < Math.min(100, iterations / 10); i++) {
14
+ fn();
15
+ }
16
+ // Run benchmark
17
+ const start = performance.now();
18
+ for (let i = 0; i < iterations; i++) {
19
+ fn();
20
+ }
21
+ const end = performance.now();
22
+ const totalMs = end - start;
23
+ const avgMs = totalMs / iterations;
24
+ const opsPerSec = 1000 / avgMs;
25
+ return { name, iterations, totalMs, avgMs, opsPerSec };
26
+ }
27
+ /**
28
+ * Format number with comma separators
29
+ */
30
+ function formatNumber(n) {
31
+ return n.toLocaleString('en-US', { maximumFractionDigits: 2 });
32
+ }
33
+ /**
34
+ * Format benchmark result
35
+ */
36
+ function formatResult(result, colored) {
37
+ const name = colored ? pigment.cyan(result.name.padEnd(30)) : result.name.padEnd(30);
38
+ const ops = colored
39
+ ? pigment.green(formatNumber(result.opsPerSec).padStart(12))
40
+ : formatNumber(result.opsPerSec).padStart(12);
41
+ const avg = colored
42
+ ? pigment.yellow(result.avgMs.toFixed(6).padStart(12))
43
+ : result.avgMs.toFixed(6).padStart(12);
44
+ return `${name} ${ops} ops/sec ${avg} ms/op`;
45
+ }
46
+ /**
47
+ * Benchmark command
48
+ */
49
+ export const benchmarkCommand = {
50
+ name: 'benchmark',
51
+ description: 'Run performance benchmarks',
52
+ aliases: ['bench', 'b'],
53
+ options: [
54
+ {
55
+ name: 'iterations',
56
+ short: 'n',
57
+ description: 'Number of iterations',
58
+ type: 'number',
59
+ default: 10000
60
+ },
61
+ {
62
+ name: 'suite',
63
+ short: 's',
64
+ description: 'Benchmark suite to run (all, primitives, objects, arrays)',
65
+ type: 'string',
66
+ default: 'all'
67
+ },
68
+ {
69
+ name: 'json',
70
+ short: 'j',
71
+ description: 'Output as JSON',
72
+ type: 'boolean',
73
+ default: false
74
+ },
75
+ {
76
+ name: 'no-color',
77
+ description: 'Disable colored output',
78
+ type: 'boolean',
79
+ default: false
80
+ }
81
+ ],
82
+ action: async (_args, options) => {
83
+ const iterations = options.iterations;
84
+ const suite = options.suite;
85
+ const json = options.json;
86
+ const noColor = options['no-color'];
87
+ const colored = !noColor;
88
+ const results = [];
89
+ // Primitive validators
90
+ const stringSchema = v.string();
91
+ const numberSchema = v.number();
92
+ const booleanSchema = v.boolean();
93
+ const dateSchema = v.date();
94
+ // Object validator
95
+ const userSchema = v.object({
96
+ name: v.string(),
97
+ email: v.string(),
98
+ age: v.number(),
99
+ active: v.boolean()
100
+ });
101
+ // Array validator
102
+ const numbersSchema = v.array(v.number());
103
+ // Nested object validator
104
+ const nestedSchema = v.object({
105
+ user: v.object({
106
+ name: v.string(),
107
+ email: v.string()
108
+ }),
109
+ items: v.array(v.object({
110
+ id: v.number(),
111
+ name: v.string(),
112
+ price: v.number()
113
+ }))
114
+ });
115
+ // Test data
116
+ const testString = 'hello world';
117
+ const testNumber = 42;
118
+ const testBoolean = true;
119
+ const testDate = new Date();
120
+ const testUser = { name: 'John', email: 'john@example.com', age: 30, active: true };
121
+ const testNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
122
+ const testNested = {
123
+ user: { name: 'John', email: 'john@example.com' },
124
+ items: [
125
+ { id: 1, name: 'Item 1', price: 10.99 },
126
+ { id: 2, name: 'Item 2', price: 20.99 },
127
+ { id: 3, name: 'Item 3', price: 30.99 }
128
+ ]
129
+ };
130
+ if (!json) {
131
+ console.log(pigment.bold('VLD Performance Benchmark'));
132
+ console.log(pigment.dim(`Running ${formatNumber(iterations)} iterations per test`));
133
+ console.log('');
134
+ }
135
+ // Primitive benchmarks
136
+ if (suite === 'all' || suite === 'primitives') {
137
+ if (!json) {
138
+ console.log(pigment.bold('Primitives:'));
139
+ }
140
+ results.push(runBenchmark('string.parse()', () => stringSchema.parse(testString), iterations));
141
+ results.push(runBenchmark('number.parse()', () => numberSchema.parse(testNumber), iterations));
142
+ results.push(runBenchmark('boolean.parse()', () => booleanSchema.parse(testBoolean), iterations));
143
+ results.push(runBenchmark('date.parse()', () => dateSchema.parse(testDate), iterations));
144
+ results.push(runBenchmark('string.safeParse()', () => stringSchema.safeParse(testString), iterations));
145
+ if (!json) {
146
+ for (const result of results.slice(-5)) {
147
+ console.log(' ' + formatResult(result, colored));
148
+ }
149
+ console.log('');
150
+ }
151
+ }
152
+ // Object benchmarks
153
+ if (suite === 'all' || suite === 'objects') {
154
+ if (!json) {
155
+ console.log(pigment.bold('Objects:'));
156
+ }
157
+ results.push(runBenchmark('object.parse()', () => userSchema.parse(testUser), iterations));
158
+ results.push(runBenchmark('object.safeParse()', () => userSchema.safeParse(testUser), iterations));
159
+ results.push(runBenchmark('nested.parse()', () => nestedSchema.parse(testNested), iterations));
160
+ if (!json) {
161
+ for (const result of results.slice(-3)) {
162
+ console.log(' ' + formatResult(result, colored));
163
+ }
164
+ console.log('');
165
+ }
166
+ }
167
+ // Array benchmarks
168
+ if (suite === 'all' || suite === 'arrays') {
169
+ if (!json) {
170
+ console.log(pigment.bold('Arrays:'));
171
+ }
172
+ results.push(runBenchmark('array.parse()', () => numbersSchema.parse(testNumbers), iterations));
173
+ results.push(runBenchmark('array.safeParse()', () => numbersSchema.safeParse(testNumbers), iterations));
174
+ if (!json) {
175
+ for (const result of results.slice(-2)) {
176
+ console.log(' ' + formatResult(result, colored));
177
+ }
178
+ console.log('');
179
+ }
180
+ }
181
+ // Summary
182
+ if (!json) {
183
+ const totalOps = results.reduce((sum, r) => sum + r.opsPerSec, 0);
184
+ const avgOps = totalOps / results.length;
185
+ console.log(pigment.bold('Summary:'));
186
+ console.log(` Total benchmarks: ${results.length}`);
187
+ console.log(` Average ops/sec: ${formatNumber(avgOps)}`);
188
+ }
189
+ else {
190
+ console.log(JSON.stringify({
191
+ iterations,
192
+ suite,
193
+ results: results.map((r) => ({
194
+ name: r.name,
195
+ iterations: r.iterations,
196
+ totalMs: r.totalMs,
197
+ avgMs: r.avgMs,
198
+ opsPerSec: r.opsPerSec
199
+ }))
200
+ }));
201
+ }
202
+ }
203
+ };
204
+ //# sourceMappingURL=benchmark.js.map