@oxog/vld 1.5.0 → 2.0.2

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 (293) hide show
  1. package/CHANGELOG.md +168 -0
  2. package/LICENSE +20 -20
  3. package/README.md +558 -517
  4. package/dist/chunks/bigint-DgsCr2dC.js +1709 -0
  5. package/dist/chunks/bigint-DgsCr2dC.js.map +1 -0
  6. package/dist/{coercion/string.js → chunks/date-ODue_rtq.js} +271 -5
  7. package/dist/chunks/date-ODue_rtq.js.map +1 -0
  8. package/dist/chunks/index-BZqWZvVe.js +426 -0
  9. package/dist/chunks/index-BZqWZvVe.js.map +1 -0
  10. package/dist/chunks/index-CETyGkrv.js +894 -0
  11. package/dist/chunks/index-CETyGkrv.js.map +1 -0
  12. package/dist/chunks/json-o20GFhTh.js +2021 -0
  13. package/dist/chunks/json-o20GFhTh.js.map +1 -0
  14. package/dist/{validators/unknown.js → chunks/unknown-SLIH1VCf.js} +6 -3
  15. package/dist/chunks/unknown-SLIH1VCf.js.map +1 -0
  16. package/dist/cjs/errors.cjs +387 -0
  17. package/dist/cjs/errors.cjs.map +1 -0
  18. package/dist/cjs/index.cjs +9983 -0
  19. package/dist/cjs/index.cjs.map +1 -0
  20. package/dist/cjs/locales/index.cjs +2877 -0
  21. package/dist/cjs/locales/index.cjs.map +1 -0
  22. package/dist/cjs/locales/lazy.cjs +3169 -0
  23. package/dist/cjs/locales/lazy.cjs.map +1 -0
  24. package/dist/cjs/mini.cjs +7329 -0
  25. package/dist/cjs/mini.cjs.map +1 -0
  26. package/dist/codecs/index.js +4 -275
  27. package/dist/codecs/index.js.map +1 -1
  28. package/dist/coercion/index.d.ts +11 -0
  29. package/dist/coercion/index.d.ts.map +1 -0
  30. package/dist/coercion/{bigint.js → index.js} +7 -4
  31. package/dist/coercion/index.js.map +1 -0
  32. package/dist/compat/emitter.js +6 -4
  33. package/dist/compat/emitter.js.map +1 -1
  34. package/dist/compat/result.js +21 -19
  35. package/dist/compat/result.js.map +1 -1
  36. package/dist/errors.js +13 -10
  37. package/dist/errors.js.map +1 -1
  38. package/dist/index.js +225 -126
  39. package/dist/index.js.map +1 -1
  40. package/dist/kernel.js +10 -7
  41. package/dist/kernel.js.map +1 -1
  42. package/dist/locales/af.js +4 -2
  43. package/dist/locales/af.js.map +1 -1
  44. package/dist/locales/ar.js +4 -2
  45. package/dist/locales/ar.js.map +1 -1
  46. package/dist/locales/bn.js +4 -2
  47. package/dist/locales/bn.js.map +1 -1
  48. package/dist/locales/da.js +4 -2
  49. package/dist/locales/da.js.map +1 -1
  50. package/dist/locales/de.js +4 -2
  51. package/dist/locales/de.js.map +1 -1
  52. package/dist/locales/en.js +4 -2
  53. package/dist/locales/en.js.map +1 -1
  54. package/dist/locales/es-MX.js +4 -2
  55. package/dist/locales/es-MX.js.map +1 -1
  56. package/dist/locales/es.js +4 -2
  57. package/dist/locales/es.js.map +1 -1
  58. package/dist/locales/fi.js +4 -2
  59. package/dist/locales/fi.js.map +1 -1
  60. package/dist/locales/fr.js +4 -2
  61. package/dist/locales/fr.js.map +1 -1
  62. package/dist/locales/hi.js +4 -2
  63. package/dist/locales/hi.js.map +1 -1
  64. package/dist/locales/id.js +4 -2
  65. package/dist/locales/id.js.map +1 -1
  66. package/dist/locales/index.js +3 -91
  67. package/dist/locales/index.js.map +1 -1
  68. package/dist/locales/it.js +4 -2
  69. package/dist/locales/it.js.map +1 -1
  70. package/dist/locales/ja.js +4 -2
  71. package/dist/locales/ja.js.map +1 -1
  72. package/dist/locales/ko.js +4 -2
  73. package/dist/locales/ko.js.map +1 -1
  74. package/dist/locales/lazy.d.ts +111 -0
  75. package/dist/locales/lazy.d.ts.map +1 -0
  76. package/dist/locales/lazy.js +220 -0
  77. package/dist/locales/lazy.js.map +1 -0
  78. package/dist/locales/nl.js +4 -2
  79. package/dist/locales/nl.js.map +1 -1
  80. package/dist/locales/no.js +4 -2
  81. package/dist/locales/no.js.map +1 -1
  82. package/dist/locales/pl.js +4 -2
  83. package/dist/locales/pl.js.map +1 -1
  84. package/dist/locales/pt-BR.js +4 -2
  85. package/dist/locales/pt-BR.js.map +1 -1
  86. package/dist/locales/pt.js +4 -2
  87. package/dist/locales/pt.js.map +1 -1
  88. package/dist/locales/ru.js +4 -2
  89. package/dist/locales/ru.js.map +1 -1
  90. package/dist/locales/sv.js +4 -2
  91. package/dist/locales/sv.js.map +1 -1
  92. package/dist/locales/sw.js +4 -2
  93. package/dist/locales/sw.js.map +1 -1
  94. package/dist/locales/th.js +4 -2
  95. package/dist/locales/th.js.map +1 -1
  96. package/dist/locales/tr.js +4 -2
  97. package/dist/locales/tr.js.map +1 -1
  98. package/dist/locales/vi.js +4 -2
  99. package/dist/locales/vi.js.map +1 -1
  100. package/dist/locales/zh.js +4 -2
  101. package/dist/locales/zh.js.map +1 -1
  102. package/dist/mini.d.ts +182 -0
  103. package/dist/mini.d.ts.map +1 -0
  104. package/dist/mini.js +132 -0
  105. package/dist/mini.js.map +1 -0
  106. package/dist/pigment.js +8 -7
  107. package/dist/pigment.js.map +1 -1
  108. package/dist/validators/array.d.ts +5 -0
  109. package/dist/validators/array.d.ts.map +1 -1
  110. package/dist/validators/discriminated-union.d.ts.map +1 -1
  111. package/dist/validators/enum.d.ts +5 -1
  112. package/dist/validators/enum.d.ts.map +1 -1
  113. package/dist/validators/index.js +5 -45
  114. package/dist/validators/index.js.map +1 -1
  115. package/dist/validators/lazy.d.ts +8 -1
  116. package/dist/validators/lazy.d.ts.map +1 -1
  117. package/dist/validators/literal.d.ts +5 -1
  118. package/dist/validators/literal.d.ts.map +1 -1
  119. package/dist/validators/object.d.ts +30 -3
  120. package/dist/validators/object.d.ts.map +1 -1
  121. package/dist/validators/string.d.ts +12 -1
  122. package/dist/validators/string.d.ts.map +1 -1
  123. package/package.json +69 -11
  124. package/dist/cli/benchmark.d.ts +0 -15
  125. package/dist/cli/benchmark.d.ts.map +0 -1
  126. package/dist/cli/benchmark.js +0 -248
  127. package/dist/cli/benchmark.js.map +0 -1
  128. package/dist/cli/bin.js +0 -35
  129. package/dist/cli/bin.js.map +0 -1
  130. package/dist/cli/commands/benchmark.js +0 -204
  131. package/dist/cli/commands/benchmark.js.map +0 -1
  132. package/dist/cli/commands/validate.js +0 -157
  133. package/dist/cli/commands/validate.js.map +0 -1
  134. package/dist/cli/generate.d.ts +0 -14
  135. package/dist/cli/generate.d.ts.map +0 -1
  136. package/dist/cli/generate.js +0 -233
  137. package/dist/cli/generate.js.map +0 -1
  138. package/dist/cli/index.js +0 -182
  139. package/dist/cli/index.js.map +0 -1
  140. package/dist/cli/validate.d.ts +0 -15
  141. package/dist/cli/validate.d.ts.map +0 -1
  142. package/dist/cli/validate.js +0 -162
  143. package/dist/cli/validate.js.map +0 -1
  144. package/dist/coercion/bigint.js.map +0 -1
  145. package/dist/coercion/boolean.js +0 -59
  146. package/dist/coercion/boolean.js.map +0 -1
  147. package/dist/coercion/date.js +0 -52
  148. package/dist/coercion/date.js.map +0 -1
  149. package/dist/coercion/number.js +0 -160
  150. package/dist/coercion/number.js.map +0 -1
  151. package/dist/coercion/string.js.map +0 -1
  152. package/dist/compat/index.js +0 -14
  153. package/dist/compat/index.js.map +0 -1
  154. package/dist/events.js +0 -8
  155. package/dist/events.js.map +0 -1
  156. package/dist/guards.d.ts +0 -143
  157. package/dist/guards.d.ts.map +0 -1
  158. package/dist/guards.js +0 -238
  159. package/dist/guards.js.map +0 -1
  160. package/dist/index-new.d.ts.map +0 -1
  161. package/dist/locales/backup-en.js +0 -105
  162. package/dist/locales/backup-en.js.map +0 -1
  163. package/dist/locales/types.js +0 -2
  164. package/dist/locales/types.js.map +0 -1
  165. package/dist/locales.d.ts +0 -54
  166. package/dist/locales.d.ts.map +0 -1
  167. package/dist/locales.js +0 -732
  168. package/dist/locales.js.map +0 -1
  169. package/dist/logger.js +0 -184
  170. package/dist/logger.js.map +0 -1
  171. package/dist/plugins/codecs.d.ts +0 -17
  172. package/dist/plugins/codecs.d.ts.map +0 -1
  173. package/dist/plugins/codecs.js +0 -29
  174. package/dist/plugins/codecs.js.map +0 -1
  175. package/dist/plugins/coercion.d.ts +0 -13
  176. package/dist/plugins/coercion.d.ts.map +0 -1
  177. package/dist/plugins/coercion.js +0 -34
  178. package/dist/plugins/coercion.js.map +0 -1
  179. package/dist/plugins/core-validators.d.ts +0 -13
  180. package/dist/plugins/core-validators.d.ts.map +0 -1
  181. package/dist/plugins/core-validators.js +0 -96
  182. package/dist/plugins/core-validators.js.map +0 -1
  183. package/dist/plugins/index.js +0 -8
  184. package/dist/plugins/index.js.map +0 -1
  185. package/dist/plugins/kernel.d.ts +0 -29
  186. package/dist/plugins/kernel.d.ts.map +0 -1
  187. package/dist/plugins/kernel.js +0 -486
  188. package/dist/plugins/kernel.js.map +0 -1
  189. package/dist/plugins/types.js +0 -8
  190. package/dist/plugins/types.js.map +0 -1
  191. package/dist/style.d.ts +0 -123
  192. package/dist/style.d.ts.map +0 -1
  193. package/dist/style.js +0 -369
  194. package/dist/style.js.map +0 -1
  195. package/dist/utils/codec-utils.js +0 -229
  196. package/dist/utils/codec-utils.js.map +0 -1
  197. package/dist/utils/deep-merge.js +0 -76
  198. package/dist/utils/deep-merge.js.map +0 -1
  199. package/dist/utils/ip-validation.js +0 -98
  200. package/dist/utils/ip-validation.js.map +0 -1
  201. package/dist/utils/security.js +0 -61
  202. package/dist/utils/security.js.map +0 -1
  203. package/dist/validators/any.js +0 -25
  204. package/dist/validators/any.js.map +0 -1
  205. package/dist/validators/array.js +0 -190
  206. package/dist/validators/array.js.map +0 -1
  207. package/dist/validators/base.js +0 -499
  208. package/dist/validators/base.js.map +0 -1
  209. package/dist/validators/base64.js +0 -65
  210. package/dist/validators/base64.js.map +0 -1
  211. package/dist/validators/bigint.js +0 -142
  212. package/dist/validators/bigint.js.map +0 -1
  213. package/dist/validators/boolean.js +0 -114
  214. package/dist/validators/boolean.js.map +0 -1
  215. package/dist/validators/codec.js +0 -182
  216. package/dist/validators/codec.js.map +0 -1
  217. package/dist/validators/custom.js +0 -50
  218. package/dist/validators/custom.js.map +0 -1
  219. package/dist/validators/date.js +0 -227
  220. package/dist/validators/date.js.map +0 -1
  221. package/dist/validators/discriminated-union.js +0 -98
  222. package/dist/validators/discriminated-union.js.map +0 -1
  223. package/dist/validators/enum.js +0 -82
  224. package/dist/validators/enum.js.map +0 -1
  225. package/dist/validators/file.js +0 -114
  226. package/dist/validators/file.js.map +0 -1
  227. package/dist/validators/function.js +0 -45
  228. package/dist/validators/function.js.map +0 -1
  229. package/dist/validators/hex.js +0 -62
  230. package/dist/validators/hex.js.map +0 -1
  231. package/dist/validators/intersection.js +0 -64
  232. package/dist/validators/intersection.js.map +0 -1
  233. package/dist/validators/json.js +0 -64
  234. package/dist/validators/json.js.map +0 -1
  235. package/dist/validators/lazy.js +0 -42
  236. package/dist/validators/lazy.js.map +0 -1
  237. package/dist/validators/literal.js +0 -45
  238. package/dist/validators/literal.js.map +0 -1
  239. package/dist/validators/map.js +0 -54
  240. package/dist/validators/map.js.map +0 -1
  241. package/dist/validators/nan.js +0 -32
  242. package/dist/validators/nan.js.map +0 -1
  243. package/dist/validators/never.js +0 -29
  244. package/dist/validators/never.js.map +0 -1
  245. package/dist/validators/null.js +0 -31
  246. package/dist/validators/null.js.map +0 -1
  247. package/dist/validators/number.js +0 -225
  248. package/dist/validators/number.js.map +0 -1
  249. package/dist/validators/object-optimized.d.ts +0 -23
  250. package/dist/validators/object-optimized.d.ts.map +0 -1
  251. package/dist/validators/object-optimized.js +0 -179
  252. package/dist/validators/object-optimized.js.map +0 -1
  253. package/dist/validators/object-ultra.d.ts +0 -34
  254. package/dist/validators/object-ultra.d.ts.map +0 -1
  255. package/dist/validators/object-ultra.js +0 -175
  256. package/dist/validators/object-ultra.js.map +0 -1
  257. package/dist/validators/object.js +0 -458
  258. package/dist/validators/object.js.map +0 -1
  259. package/dist/validators/record.js +0 -128
  260. package/dist/validators/record.js.map +0 -1
  261. package/dist/validators/set.js +0 -51
  262. package/dist/validators/set.js.map +0 -1
  263. package/dist/validators/string-bool.js +0 -127
  264. package/dist/validators/string-bool.js.map +0 -1
  265. package/dist/validators/string-formats.js +0 -120
  266. package/dist/validators/string-formats.js.map +0 -1
  267. package/dist/validators/string-ultra.d.ts +0 -49
  268. package/dist/validators/string-ultra.d.ts.map +0 -1
  269. package/dist/validators/string-ultra.js +0 -217
  270. package/dist/validators/string-ultra.js.map +0 -1
  271. package/dist/validators/string.js +0 -253
  272. package/dist/validators/string.js.map +0 -1
  273. package/dist/validators/symbol.js +0 -42
  274. package/dist/validators/symbol.js.map +0 -1
  275. package/dist/validators/template-literal.js +0 -102
  276. package/dist/validators/template-literal.js.map +0 -1
  277. package/dist/validators/tuple.js +0 -55
  278. package/dist/validators/tuple.js.map +0 -1
  279. package/dist/validators/uint8array.js +0 -98
  280. package/dist/validators/uint8array.js.map +0 -1
  281. package/dist/validators/undefined.js +0 -31
  282. package/dist/validators/undefined.js.map +0 -1
  283. package/dist/validators/union-optimized.d.ts +0 -15
  284. package/dist/validators/union-optimized.d.ts.map +0 -1
  285. package/dist/validators/union-optimized.js +0 -92
  286. package/dist/validators/union-optimized.js.map +0 -1
  287. package/dist/validators/union.js +0 -126
  288. package/dist/validators/union.js.map +0 -1
  289. package/dist/validators/unknown.js.map +0 -1
  290. package/dist/validators/void.js +0 -35
  291. package/dist/validators/void.js.map +0 -1
  292. package/dist/validators/xor.js +0 -64
  293. package/dist/validators/xor.js.map +0 -1
@@ -1,204 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../../src/cli/commands/benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * VLD CLI - Benchmark Command\r\n *\r\n * Run performance benchmarks for VLD validation.\r\n */\r\n\r\nimport { pigment } from '../../pigment';\r\nimport { v } from '../../index';\r\nimport type { CliCommand } from '../index';\r\n\r\n/**\r\n * Benchmark result\r\n */\r\ninterface BenchmarkResult {\r\n name: string;\r\n iterations: number;\r\n totalMs: number;\r\n avgMs: number;\r\n opsPerSec: number;\r\n}\r\n\r\n/**\r\n * Run a single benchmark\r\n */\r\nfunction runBenchmark(\r\n name: string,\r\n fn: () => void,\r\n iterations: number\r\n): BenchmarkResult {\r\n // Warm up\r\n for (let i = 0; i < Math.min(100, iterations / 10); i++) {\r\n fn();\r\n }\r\n\r\n // Run benchmark\r\n const start = performance.now();\r\n for (let i = 0; i < iterations; i++) {\r\n fn();\r\n }\r\n const end = performance.now();\r\n\r\n const totalMs = end - start;\r\n const avgMs = totalMs / iterations;\r\n const opsPerSec = 1000 / avgMs;\r\n\r\n return { name, iterations, totalMs, avgMs, opsPerSec };\r\n}\r\n\r\n/**\r\n * Format number with comma separators\r\n */\r\nfunction formatNumber(n: number): string {\r\n return n.toLocaleString('en-US', { maximumFractionDigits: 2 });\r\n}\r\n\r\n/**\r\n * Format benchmark result\r\n */\r\nfunction formatResult(result: BenchmarkResult, colored: boolean): string {\r\n const name = colored ? pigment.cyan(result.name.padEnd(30)) : result.name.padEnd(30);\r\n const ops = colored\r\n ? pigment.green(formatNumber(result.opsPerSec).padStart(12))\r\n : formatNumber(result.opsPerSec).padStart(12);\r\n const avg = colored\r\n ? pigment.yellow(result.avgMs.toFixed(6).padStart(12))\r\n : result.avgMs.toFixed(6).padStart(12);\r\n\r\n return `${name} ${ops} ops/sec ${avg} ms/op`;\r\n}\r\n\r\n/**\r\n * Benchmark command\r\n */\r\nexport const benchmarkCommand: CliCommand = {\r\n name: 'benchmark',\r\n description: 'Run performance benchmarks',\r\n aliases: ['bench', 'b'],\r\n options: [\r\n {\r\n name: 'iterations',\r\n short: 'n',\r\n description: 'Number of iterations',\r\n type: 'number',\r\n default: 10000\r\n },\r\n {\r\n name: 'suite',\r\n short: 's',\r\n description: 'Benchmark suite to run (all, primitives, objects, arrays)',\r\n type: 'string',\r\n default: 'all'\r\n },\r\n {\r\n name: 'json',\r\n short: 'j',\r\n description: 'Output as JSON',\r\n type: 'boolean',\r\n default: false\r\n },\r\n {\r\n name: 'no-color',\r\n description: 'Disable colored output',\r\n type: 'boolean',\r\n default: false\r\n }\r\n ],\r\n action: async (_args, options) => {\r\n const iterations = options.iterations as number;\r\n const suite = options.suite as string;\r\n const json = options.json as boolean;\r\n const noColor = options['no-color'] as boolean;\r\n const colored = !noColor;\r\n\r\n const results: BenchmarkResult[] = [];\r\n\r\n // Primitive validators\r\n const stringSchema = v.string();\r\n const numberSchema = v.number();\r\n const booleanSchema = v.boolean();\r\n const dateSchema = v.date();\r\n\r\n // Object validator\r\n const userSchema = v.object({\r\n name: v.string(),\r\n email: v.string(),\r\n age: v.number(),\r\n active: v.boolean()\r\n });\r\n\r\n // Array validator\r\n const numbersSchema = v.array(v.number());\r\n\r\n // Nested object validator\r\n const nestedSchema = v.object({\r\n user: v.object({\r\n name: v.string(),\r\n email: v.string()\r\n }),\r\n items: v.array(\r\n v.object({\r\n id: v.number(),\r\n name: v.string(),\r\n price: v.number()\r\n })\r\n )\r\n });\r\n\r\n // Test data\r\n const testString = 'hello world';\r\n const testNumber = 42;\r\n const testBoolean = true;\r\n const testDate = new Date();\r\n const testUser = { name: 'John', email: 'john@example.com', age: 30, active: true };\r\n const testNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\r\n const testNested = {\r\n user: { name: 'John', email: 'john@example.com' },\r\n items: [\r\n { id: 1, name: 'Item 1', price: 10.99 },\r\n { id: 2, name: 'Item 2', price: 20.99 },\r\n { id: 3, name: 'Item 3', price: 30.99 }\r\n ]\r\n };\r\n\r\n if (!json) {\r\n console.log(pigment.bold('VLD Performance Benchmark'));\r\n console.log(pigment.dim(`Running ${formatNumber(iterations)} iterations per test`));\r\n console.log('');\r\n }\r\n\r\n // Primitive benchmarks\r\n if (suite === 'all' || suite === 'primitives') {\r\n if (!json) {\r\n console.log(pigment.bold('Primitives:'));\r\n }\r\n\r\n results.push(\r\n runBenchmark('string.parse()', () => stringSchema.parse(testString), iterations)\r\n );\r\n results.push(\r\n runBenchmark('number.parse()', () => numberSchema.parse(testNumber), iterations)\r\n );\r\n results.push(\r\n runBenchmark('boolean.parse()', () => booleanSchema.parse(testBoolean), iterations)\r\n );\r\n results.push(\r\n runBenchmark('date.parse()', () => dateSchema.parse(testDate), iterations)\r\n );\r\n results.push(\r\n runBenchmark('string.safeParse()', () => stringSchema.safeParse(testString), iterations)\r\n );\r\n\r\n if (!json) {\r\n for (const result of results.slice(-5)) {\r\n console.log(' ' + formatResult(result, colored));\r\n }\r\n console.log('');\r\n }\r\n }\r\n\r\n // Object benchmarks\r\n if (suite === 'all' || suite === 'objects') {\r\n if (!json) {\r\n console.log(pigment.bold('Objects:'));\r\n }\r\n\r\n results.push(\r\n runBenchmark('object.parse()', () => userSchema.parse(testUser), iterations)\r\n );\r\n results.push(\r\n runBenchmark('object.safeParse()', () => userSchema.safeParse(testUser), iterations)\r\n );\r\n results.push(\r\n runBenchmark('nested.parse()', () => nestedSchema.parse(testNested), iterations)\r\n );\r\n\r\n if (!json) {\r\n for (const result of results.slice(-3)) {\r\n console.log(' ' + formatResult(result, colored));\r\n }\r\n console.log('');\r\n }\r\n }\r\n\r\n // Array benchmarks\r\n if (suite === 'all' || suite === 'arrays') {\r\n if (!json) {\r\n console.log(pigment.bold('Arrays:'));\r\n }\r\n\r\n results.push(\r\n runBenchmark('array.parse()', () => numbersSchema.parse(testNumbers), iterations)\r\n );\r\n results.push(\r\n runBenchmark('array.safeParse()', () => numbersSchema.safeParse(testNumbers), iterations)\r\n );\r\n\r\n if (!json) {\r\n for (const result of results.slice(-2)) {\r\n console.log(' ' + formatResult(result, colored));\r\n }\r\n console.log('');\r\n }\r\n }\r\n\r\n // Summary\r\n if (!json) {\r\n const totalOps = results.reduce((sum, r) => sum + r.opsPerSec, 0);\r\n const avgOps = totalOps / results.length;\r\n\r\n console.log(pigment.bold('Summary:'));\r\n console.log(` Total benchmarks: ${results.length}`);\r\n console.log(` Average ops/sec: ${formatNumber(avgOps)}`);\r\n } else {\r\n console.log(\r\n JSON.stringify({\r\n iterations,\r\n suite,\r\n results: results.map((r) => ({\r\n name: r.name,\r\n iterations: r.iterations,\r\n totalMs: r.totalMs,\r\n avgMs: r.avgMs,\r\n opsPerSec: r.opsPerSec\r\n }))\r\n })\r\n );\r\n }\r\n }\r\n};\r\n"]}
@@ -1,157 +0,0 @@
1
- /**
2
- * VLD CLI - Validate Command
3
- *
4
- * Validate JSON data against a VLD schema file.
5
- */
6
- import * as fs from 'fs';
7
- import * as path from 'path';
8
- import { pigment } from '../../pigment.js';
9
- import { prettifyError, prettifyErrorColored } from '../../errors.js';
10
- /**
11
- * Validate command
12
- */
13
- export const validateCommand = {
14
- name: 'validate',
15
- description: 'Validate JSON data against a VLD schema',
16
- aliases: ['v'],
17
- arguments: [
18
- {
19
- name: 'schema',
20
- description: 'Path to schema file (.ts or .js)',
21
- required: true
22
- },
23
- {
24
- name: 'data',
25
- description: 'Path to JSON data file or JSON string',
26
- required: true
27
- }
28
- ],
29
- options: [
30
- {
31
- name: 'strict',
32
- short: 's',
33
- description: 'Enable strict mode (no extra keys)',
34
- type: 'boolean',
35
- default: false
36
- },
37
- {
38
- name: 'quiet',
39
- short: 'q',
40
- description: 'Only output errors',
41
- type: 'boolean',
42
- default: false
43
- },
44
- {
45
- name: 'json',
46
- short: 'j',
47
- description: 'Output as JSON',
48
- type: 'boolean',
49
- default: false
50
- },
51
- {
52
- name: 'no-color',
53
- description: 'Disable colored output',
54
- type: 'boolean',
55
- default: false
56
- }
57
- ],
58
- action: async (args, options) => {
59
- const schemaPath = args.schema;
60
- const dataArg = args.data;
61
- const quiet = options.quiet;
62
- const json = options.json;
63
- const noColor = options['no-color'];
64
- // Load schema
65
- let schema;
66
- try {
67
- const absoluteSchemaPath = path.resolve(process.cwd(), schemaPath);
68
- if (!fs.existsSync(absoluteSchemaPath)) {
69
- throw new Error(`Schema file not found: ${schemaPath}`);
70
- }
71
- // Dynamic import for ESM/CJS compatibility
72
- const schemaModule = await import(absoluteSchemaPath);
73
- schema = schemaModule.default || schemaModule.schema || schemaModule;
74
- if (!schema || typeof schema.parse !== 'function') {
75
- throw new Error('Schema must export a VLD validator with parse() method');
76
- }
77
- }
78
- catch (error) {
79
- if (json) {
80
- console.log(JSON.stringify({ success: false, error: error.message }));
81
- }
82
- else {
83
- console.error(pigment.red('Schema Error:'), error.message);
84
- }
85
- process.exitCode = 1;
86
- return;
87
- }
88
- // Load data
89
- let data;
90
- try {
91
- // Check if it's a file path or JSON string
92
- if (dataArg.startsWith('{') || dataArg.startsWith('[')) {
93
- data = JSON.parse(dataArg);
94
- }
95
- else {
96
- const absoluteDataPath = path.resolve(process.cwd(), dataArg);
97
- if (!fs.existsSync(absoluteDataPath)) {
98
- throw new Error(`Data file not found: ${dataArg}`);
99
- }
100
- const content = fs.readFileSync(absoluteDataPath, 'utf-8');
101
- data = JSON.parse(content);
102
- }
103
- }
104
- catch (error) {
105
- if (json) {
106
- console.log(JSON.stringify({ success: false, error: error.message }));
107
- }
108
- else {
109
- console.error(pigment.red('Data Error:'), error.message);
110
- }
111
- process.exitCode = 1;
112
- return;
113
- }
114
- // Validate
115
- const result = schema.safeParse(data);
116
- if (json) {
117
- if (result.success) {
118
- console.log(JSON.stringify({ success: true, data: result.data }));
119
- }
120
- else {
121
- const err = result.error;
122
- const errorJson = {
123
- success: false,
124
- error: err?.message,
125
- issues: err?.issues
126
- };
127
- console.log(JSON.stringify(errorJson));
128
- }
129
- }
130
- else {
131
- if (result.success) {
132
- if (!quiet) {
133
- console.log(pigment.green('✓ Validation passed'));
134
- console.log('');
135
- console.log(pigment.dim('Data:'));
136
- console.log(JSON.stringify(result.data, null, 2));
137
- }
138
- }
139
- else {
140
- console.error(pigment.red('✗ Validation failed'));
141
- console.error('');
142
- // Check if it's a VldError with issues
143
- if (result.error && 'issues' in result.error) {
144
- const formatted = noColor
145
- ? prettifyError(result.error, { colored: false })
146
- : prettifyErrorColored(result.error);
147
- console.error(formatted);
148
- }
149
- else {
150
- console.error(result.error?.message || 'Unknown error');
151
- }
152
- process.exitCode = 1;
153
- }
154
- }
155
- }
156
- };
157
- //# sourceMappingURL=validate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * VLD CLI - Validate Command\r\n *\r\n * Validate JSON data against a VLD schema file.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { pigment } from '../../pigment';\r\nimport { prettifyError, prettifyErrorColored } from '../../errors';\r\nimport type { CliCommand } from '../index';\r\n\r\n/**\r\n * Validate command\r\n */\r\nexport const validateCommand: CliCommand = {\r\n name: 'validate',\r\n description: 'Validate JSON data against a VLD schema',\r\n aliases: ['v'],\r\n arguments: [\r\n {\r\n name: 'schema',\r\n description: 'Path to schema file (.ts or .js)',\r\n required: true\r\n },\r\n {\r\n name: 'data',\r\n description: 'Path to JSON data file or JSON string',\r\n required: true\r\n }\r\n ],\r\n options: [\r\n {\r\n name: 'strict',\r\n short: 's',\r\n description: 'Enable strict mode (no extra keys)',\r\n type: 'boolean',\r\n default: false\r\n },\r\n {\r\n name: 'quiet',\r\n short: 'q',\r\n description: 'Only output errors',\r\n type: 'boolean',\r\n default: false\r\n },\r\n {\r\n name: 'json',\r\n short: 'j',\r\n description: 'Output as JSON',\r\n type: 'boolean',\r\n default: false\r\n },\r\n {\r\n name: 'no-color',\r\n description: 'Disable colored output',\r\n type: 'boolean',\r\n default: false\r\n }\r\n ],\r\n action: async (args, options) => {\r\n const schemaPath = args.schema as string;\r\n const dataArg = args.data as string;\r\n const quiet = options.quiet as boolean;\r\n const json = options.json as boolean;\r\n const noColor = options['no-color'] as boolean;\r\n\r\n // Load schema\r\n let schema: { parse: (value: unknown) => unknown; safeParse: (value: unknown) => { success: boolean; data?: unknown; error?: Error } };\r\n\r\n try {\r\n const absoluteSchemaPath = path.resolve(process.cwd(), schemaPath);\r\n\r\n if (!fs.existsSync(absoluteSchemaPath)) {\r\n throw new Error(`Schema file not found: ${schemaPath}`);\r\n }\r\n\r\n // Dynamic import for ESM/CJS compatibility\r\n const schemaModule = await import(absoluteSchemaPath);\r\n schema = schemaModule.default || schemaModule.schema || schemaModule;\r\n\r\n if (!schema || typeof schema.parse !== 'function') {\r\n throw new Error('Schema must export a VLD validator with parse() method');\r\n }\r\n } catch (error) {\r\n if (json) {\r\n console.log(JSON.stringify({ success: false, error: (error as Error).message }));\r\n } else {\r\n console.error(pigment.red('Schema Error:'), (error as Error).message);\r\n }\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // Load data\r\n let data: unknown;\r\n\r\n try {\r\n // Check if it's a file path or JSON string\r\n if (dataArg.startsWith('{') || dataArg.startsWith('[')) {\r\n data = JSON.parse(dataArg);\r\n } else {\r\n const absoluteDataPath = path.resolve(process.cwd(), dataArg);\r\n\r\n if (!fs.existsSync(absoluteDataPath)) {\r\n throw new Error(`Data file not found: ${dataArg}`);\r\n }\r\n\r\n const content = fs.readFileSync(absoluteDataPath, 'utf-8');\r\n data = JSON.parse(content);\r\n }\r\n } catch (error) {\r\n if (json) {\r\n console.log(JSON.stringify({ success: false, error: (error as Error).message }));\r\n } else {\r\n console.error(pigment.red('Data Error:'), (error as Error).message);\r\n }\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // Validate\r\n const result = schema.safeParse(data);\r\n\r\n if (json) {\r\n if (result.success) {\r\n console.log(JSON.stringify({ success: true, data: result.data }));\r\n } else {\r\n const err = result.error as { message?: string; issues?: unknown[] } | undefined;\r\n const errorJson = {\r\n success: false,\r\n error: err?.message,\r\n issues: err?.issues\r\n };\r\n console.log(JSON.stringify(errorJson));\r\n }\r\n } else {\r\n if (result.success) {\r\n if (!quiet) {\r\n console.log(pigment.green('✓ Validation passed'));\r\n console.log('');\r\n console.log(pigment.dim('Data:'));\r\n console.log(JSON.stringify(result.data, null, 2));\r\n }\r\n } else {\r\n console.error(pigment.red('✗ Validation failed'));\r\n console.error('');\r\n\r\n // Check if it's a VldError with issues\r\n if (result.error && 'issues' in result.error) {\r\n const formatted = noColor\r\n ? prettifyError(result.error as Parameters<typeof prettifyError>[0], { colored: false })\r\n : prettifyErrorColored(result.error as Parameters<typeof prettifyErrorColored>[0]);\r\n console.error(formatted);\r\n } else {\r\n console.error(result.error?.message || 'Unknown error');\r\n }\r\n\r\n process.exitCode = 1;\r\n }\r\n }\r\n }\r\n};\r\n"]}
@@ -1,14 +0,0 @@
1
- /**
2
- * VLD CLI - Generate Command
3
- *
4
- * TypeScript interface'lerinden VLD schema üretir.
5
- *
6
- * Kullanım:
7
- * vld generate <input.ts> -o <output.ts>
8
- */
9
- import type { Command } from './index.js';
10
- /**
11
- * Generate command
12
- */
13
- export declare const generateCommand: Command;
14
- //# sourceMappingURL=generate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/cli/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAK1C;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,OA6F7B,CAAC"}
@@ -1,233 +0,0 @@
1
- /**
2
- * VLD CLI - Generate Command
3
- *
4
- * TypeScript interface'lerinden VLD schema üretir.
5
- *
6
- * Kullanım:
7
- * vld generate <input.ts> -o <output.ts>
8
- */
9
- import { style } from '../style.js';
10
- import * as fs from 'fs';
11
- import * as path from 'path';
12
- /**
13
- * Generate command
14
- */
15
- export const generateCommand = {
16
- name: 'generate',
17
- description: 'Generate VLD schema from TypeScript interface',
18
- aliases: ['gen', 'g'],
19
- arguments: [
20
- {
21
- name: 'input',
22
- description: 'Input TypeScript file',
23
- required: true
24
- }
25
- ],
26
- options: [
27
- {
28
- name: 'output',
29
- short: 'o',
30
- description: 'Output file path',
31
- type: 'string'
32
- },
33
- {
34
- name: 'export-name',
35
- short: 'e',
36
- description: 'Export name for the schema',
37
- type: 'string',
38
- default: 'schema'
39
- },
40
- {
41
- name: 'strict',
42
- short: 's',
43
- description: 'Enable strict mode',
44
- type: 'boolean',
45
- default: false
46
- },
47
- {
48
- name: 'dry-run',
49
- description: 'Print output without writing file',
50
- type: 'boolean',
51
- default: false
52
- }
53
- ],
54
- async action(args, opts) {
55
- const inputPath = path.resolve(args.input);
56
- const outputPath = opts.output
57
- ? path.resolve(opts.output)
58
- : inputPath.replace(/\.ts$/, '.schema.ts');
59
- console.log(style.cyan('VLD Schema Generator'));
60
- console.log('');
61
- // Check input file exists
62
- if (!fs.existsSync(inputPath)) {
63
- throw new Error(`Input file not found: ${inputPath}`);
64
- }
65
- console.log(`${style.dim('Input:')} ${inputPath}`);
66
- console.log(`${style.dim('Output:')} ${outputPath}`);
67
- console.log('');
68
- // Read input file
69
- const content = fs.readFileSync(inputPath, 'utf-8');
70
- // Parse TypeScript interfaces
71
- const interfaces = parseInterfaces(content);
72
- if (interfaces.length === 0) {
73
- console.log(style.yellow('No interfaces found in input file.'));
74
- return;
75
- }
76
- console.log(`Found ${style.bold(String(interfaces.length))} interface(s):`);
77
- for (const iface of interfaces) {
78
- console.log(` - ${style.cyan(iface.name)}`);
79
- }
80
- console.log('');
81
- // Generate schema
82
- const schema = generateSchema(interfaces, {
83
- exportName: opts['export-name'],
84
- strict: opts.strict
85
- });
86
- // Output
87
- if (opts['dry-run']) {
88
- console.log(style.bold('Generated Schema:'));
89
- console.log('');
90
- console.log(schema);
91
- }
92
- else {
93
- fs.writeFileSync(outputPath, schema, 'utf-8');
94
- console.log(style.green('✔') + ` Schema written to ${outputPath}`);
95
- }
96
- }
97
- };
98
- /**
99
- * Basit TypeScript interface parser
100
- */
101
- function parseInterfaces(content) {
102
- const interfaces = [];
103
- // Interface regex (basit versiyon)
104
- const interfaceRegex = /(?:export\s+)?interface\s+(\w+)(?:\s+extends\s+([\w,\s]+))?\s*\{([^}]+)\}/g;
105
- const propertyRegex = /(?:readonly\s+)?(\w+)(\?)?:\s*([^;]+);/g;
106
- let match;
107
- while ((match = interfaceRegex.exec(content)) !== null) {
108
- const name = match[1];
109
- const extendsStr = match[2];
110
- const bodyStr = match[3];
111
- const extendsArr = extendsStr
112
- ? extendsStr.split(',').map((s) => s.trim())
113
- : undefined;
114
- const properties = [];
115
- let propMatch;
116
- while ((propMatch = propertyRegex.exec(bodyStr)) !== null) {
117
- const isReadonly = propMatch[0].startsWith('readonly');
118
- properties.push({
119
- name: propMatch[1],
120
- optional: !!propMatch[2],
121
- type: propMatch[3].trim(),
122
- readonly: isReadonly
123
- });
124
- }
125
- interfaces.push({ name, properties, extends: extendsArr });
126
- }
127
- return interfaces;
128
- }
129
- /**
130
- * VLD schema üretir
131
- */
132
- function generateSchema(interfaces, options) {
133
- const lines = [];
134
- // Import statement
135
- lines.push("import { v } from '@oxog/vld';");
136
- lines.push('');
137
- // Generate schema for each interface
138
- for (const iface of interfaces) {
139
- lines.push(`/**`);
140
- lines.push(` * Schema for ${iface.name}`);
141
- lines.push(` */`);
142
- lines.push(`export const ${camelCase(iface.name)}Schema = v.object({`);
143
- for (const prop of iface.properties) {
144
- const schemaType = typeToSchema(prop.type);
145
- const optionalSuffix = prop.optional ? '.optional()' : '';
146
- lines.push(` ${prop.name}: ${schemaType}${optionalSuffix},`);
147
- }
148
- lines.push(`})${options.strict ? '.strict()' : ''};`);
149
- lines.push('');
150
- // Infer type
151
- lines.push(`export type ${iface.name} = typeof ${camelCase(iface.name)}Schema._type;`);
152
- lines.push('');
153
- }
154
- // Combined schema if requested
155
- if (interfaces.length > 1 && options.exportName !== 'schema') {
156
- lines.push(`/**`);
157
- lines.push(` * Combined schemas`);
158
- lines.push(` */`);
159
- lines.push(`export const ${options.exportName} = {`);
160
- for (const iface of interfaces) {
161
- lines.push(` ${camelCase(iface.name)}: ${camelCase(iface.name)}Schema,`);
162
- }
163
- lines.push(`};`);
164
- }
165
- return lines.join('\n');
166
- }
167
- /**
168
- * TypeScript tipini VLD schema'ya çevirir
169
- */
170
- function typeToSchema(type) {
171
- // Array type
172
- if (type.endsWith('[]')) {
173
- const itemType = type.slice(0, -2);
174
- return `v.array(${typeToSchema(itemType)})`;
175
- }
176
- // Generic array
177
- if (type.startsWith('Array<') && type.endsWith('>')) {
178
- const itemType = type.slice(6, -1);
179
- return `v.array(${typeToSchema(itemType)})`;
180
- }
181
- // Union type
182
- if (type.includes(' | ')) {
183
- const types = type.split(' | ').map((t) => t.trim());
184
- return `v.union(${types.map(typeToSchema).join(', ')})`;
185
- }
186
- // Literal types
187
- if (type.startsWith("'") || type.startsWith('"')) {
188
- return `v.literal(${type})`;
189
- }
190
- if (type === 'true' || type === 'false') {
191
- return `v.literal(${type})`;
192
- }
193
- if (/^\d+$/.test(type)) {
194
- return `v.literal(${type})`;
195
- }
196
- // Primitive types
197
- switch (type) {
198
- case 'string':
199
- return 'v.string()';
200
- case 'number':
201
- return 'v.number()';
202
- case 'boolean':
203
- return 'v.boolean()';
204
- case 'Date':
205
- return 'v.date()';
206
- case 'bigint':
207
- return 'v.bigint()';
208
- case 'symbol':
209
- return 'v.symbol()';
210
- case 'null':
211
- return 'v.null()';
212
- case 'undefined':
213
- return 'v.undefined()';
214
- case 'any':
215
- return 'v.any()';
216
- case 'unknown':
217
- return 'v.unknown()';
218
- case 'never':
219
- return 'v.never()';
220
- case 'void':
221
- return 'v.void()';
222
- default:
223
- // Reference to another schema
224
- return `${camelCase(type)}Schema`;
225
- }
226
- }
227
- /**
228
- * PascalCase'i camelCase'e çevirir
229
- */
230
- function camelCase(str) {
231
- return str.charAt(0).toLowerCase() + str.slice(1);
232
- }
233
- //# sourceMappingURL=generate.js.map