@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.
- package/CHANGELOG.md +168 -0
- package/LICENSE +20 -20
- package/README.md +558 -517
- package/dist/chunks/bigint-DgsCr2dC.js +1709 -0
- package/dist/chunks/bigint-DgsCr2dC.js.map +1 -0
- package/dist/{coercion/string.js → chunks/date-ODue_rtq.js} +271 -5
- package/dist/chunks/date-ODue_rtq.js.map +1 -0
- package/dist/chunks/index-BZqWZvVe.js +426 -0
- package/dist/chunks/index-BZqWZvVe.js.map +1 -0
- package/dist/chunks/index-CETyGkrv.js +894 -0
- package/dist/chunks/index-CETyGkrv.js.map +1 -0
- package/dist/chunks/json-o20GFhTh.js +2021 -0
- package/dist/chunks/json-o20GFhTh.js.map +1 -0
- package/dist/{validators/unknown.js → chunks/unknown-SLIH1VCf.js} +6 -3
- package/dist/chunks/unknown-SLIH1VCf.js.map +1 -0
- package/dist/cjs/errors.cjs +387 -0
- package/dist/cjs/errors.cjs.map +1 -0
- package/dist/cjs/index.cjs +9983 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/locales/index.cjs +2877 -0
- package/dist/cjs/locales/index.cjs.map +1 -0
- package/dist/cjs/locales/lazy.cjs +3169 -0
- package/dist/cjs/locales/lazy.cjs.map +1 -0
- package/dist/cjs/mini.cjs +7329 -0
- package/dist/cjs/mini.cjs.map +1 -0
- package/dist/codecs/index.js +4 -275
- package/dist/codecs/index.js.map +1 -1
- package/dist/coercion/index.d.ts +11 -0
- package/dist/coercion/index.d.ts.map +1 -0
- package/dist/coercion/{bigint.js → index.js} +7 -4
- package/dist/coercion/index.js.map +1 -0
- package/dist/compat/emitter.js +6 -4
- package/dist/compat/emitter.js.map +1 -1
- package/dist/compat/result.js +21 -19
- package/dist/compat/result.js.map +1 -1
- package/dist/errors.js +13 -10
- package/dist/errors.js.map +1 -1
- package/dist/index.js +225 -126
- package/dist/index.js.map +1 -1
- package/dist/kernel.js +10 -7
- package/dist/kernel.js.map +1 -1
- package/dist/locales/af.js +4 -2
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.js +4 -2
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/bn.js +4 -2
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.js +4 -2
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.js +4 -2
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.js +4 -2
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.js +4 -2
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.js +4 -2
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.js +4 -2
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.js +4 -2
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.js +4 -2
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.js +4 -2
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/index.js +3 -91
- package/dist/locales/index.js.map +1 -1
- package/dist/locales/it.js +4 -2
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.js +4 -2
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +4 -2
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/lazy.d.ts +111 -0
- package/dist/locales/lazy.d.ts.map +1 -0
- package/dist/locales/lazy.js +220 -0
- package/dist/locales/lazy.js.map +1 -0
- package/dist/locales/nl.js +4 -2
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.js +4 -2
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.js +4 -2
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.js +4 -2
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.js +4 -2
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.js +4 -2
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.js +4 -2
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.js +4 -2
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.js +4 -2
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.js +4 -2
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/vi.js +4 -2
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.js +4 -2
- package/dist/locales/zh.js.map +1 -1
- package/dist/mini.d.ts +182 -0
- package/dist/mini.d.ts.map +1 -0
- package/dist/mini.js +132 -0
- package/dist/mini.js.map +1 -0
- package/dist/pigment.js +8 -7
- package/dist/pigment.js.map +1 -1
- package/dist/validators/array.d.ts +5 -0
- package/dist/validators/array.d.ts.map +1 -1
- package/dist/validators/discriminated-union.d.ts.map +1 -1
- package/dist/validators/enum.d.ts +5 -1
- package/dist/validators/enum.d.ts.map +1 -1
- package/dist/validators/index.js +5 -45
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/lazy.d.ts +8 -1
- package/dist/validators/lazy.d.ts.map +1 -1
- package/dist/validators/literal.d.ts +5 -1
- package/dist/validators/literal.d.ts.map +1 -1
- package/dist/validators/object.d.ts +30 -3
- package/dist/validators/object.d.ts.map +1 -1
- package/dist/validators/string.d.ts +12 -1
- package/dist/validators/string.d.ts.map +1 -1
- package/package.json +69 -11
- package/dist/cli/benchmark.d.ts +0 -15
- package/dist/cli/benchmark.d.ts.map +0 -1
- package/dist/cli/benchmark.js +0 -248
- package/dist/cli/benchmark.js.map +0 -1
- package/dist/cli/bin.js +0 -35
- package/dist/cli/bin.js.map +0 -1
- package/dist/cli/commands/benchmark.js +0 -204
- package/dist/cli/commands/benchmark.js.map +0 -1
- package/dist/cli/commands/validate.js +0 -157
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/generate.d.ts +0 -14
- package/dist/cli/generate.d.ts.map +0 -1
- package/dist/cli/generate.js +0 -233
- package/dist/cli/generate.js.map +0 -1
- package/dist/cli/index.js +0 -182
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/validate.d.ts +0 -15
- package/dist/cli/validate.d.ts.map +0 -1
- package/dist/cli/validate.js +0 -162
- package/dist/cli/validate.js.map +0 -1
- package/dist/coercion/bigint.js.map +0 -1
- package/dist/coercion/boolean.js +0 -59
- package/dist/coercion/boolean.js.map +0 -1
- package/dist/coercion/date.js +0 -52
- package/dist/coercion/date.js.map +0 -1
- package/dist/coercion/number.js +0 -160
- package/dist/coercion/number.js.map +0 -1
- package/dist/coercion/string.js.map +0 -1
- package/dist/compat/index.js +0 -14
- package/dist/compat/index.js.map +0 -1
- package/dist/events.js +0 -8
- package/dist/events.js.map +0 -1
- package/dist/guards.d.ts +0 -143
- package/dist/guards.d.ts.map +0 -1
- package/dist/guards.js +0 -238
- package/dist/guards.js.map +0 -1
- package/dist/index-new.d.ts.map +0 -1
- package/dist/locales/backup-en.js +0 -105
- package/dist/locales/backup-en.js.map +0 -1
- package/dist/locales/types.js +0 -2
- package/dist/locales/types.js.map +0 -1
- package/dist/locales.d.ts +0 -54
- package/dist/locales.d.ts.map +0 -1
- package/dist/locales.js +0 -732
- package/dist/locales.js.map +0 -1
- package/dist/logger.js +0 -184
- package/dist/logger.js.map +0 -1
- package/dist/plugins/codecs.d.ts +0 -17
- package/dist/plugins/codecs.d.ts.map +0 -1
- package/dist/plugins/codecs.js +0 -29
- package/dist/plugins/codecs.js.map +0 -1
- package/dist/plugins/coercion.d.ts +0 -13
- package/dist/plugins/coercion.d.ts.map +0 -1
- package/dist/plugins/coercion.js +0 -34
- package/dist/plugins/coercion.js.map +0 -1
- package/dist/plugins/core-validators.d.ts +0 -13
- package/dist/plugins/core-validators.d.ts.map +0 -1
- package/dist/plugins/core-validators.js +0 -96
- package/dist/plugins/core-validators.js.map +0 -1
- package/dist/plugins/index.js +0 -8
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/kernel.d.ts +0 -29
- package/dist/plugins/kernel.d.ts.map +0 -1
- package/dist/plugins/kernel.js +0 -486
- package/dist/plugins/kernel.js.map +0 -1
- package/dist/plugins/types.js +0 -8
- package/dist/plugins/types.js.map +0 -1
- package/dist/style.d.ts +0 -123
- package/dist/style.d.ts.map +0 -1
- package/dist/style.js +0 -369
- package/dist/style.js.map +0 -1
- package/dist/utils/codec-utils.js +0 -229
- package/dist/utils/codec-utils.js.map +0 -1
- package/dist/utils/deep-merge.js +0 -76
- package/dist/utils/deep-merge.js.map +0 -1
- package/dist/utils/ip-validation.js +0 -98
- package/dist/utils/ip-validation.js.map +0 -1
- package/dist/utils/security.js +0 -61
- package/dist/utils/security.js.map +0 -1
- package/dist/validators/any.js +0 -25
- package/dist/validators/any.js.map +0 -1
- package/dist/validators/array.js +0 -190
- package/dist/validators/array.js.map +0 -1
- package/dist/validators/base.js +0 -499
- package/dist/validators/base.js.map +0 -1
- package/dist/validators/base64.js +0 -65
- package/dist/validators/base64.js.map +0 -1
- package/dist/validators/bigint.js +0 -142
- package/dist/validators/bigint.js.map +0 -1
- package/dist/validators/boolean.js +0 -114
- package/dist/validators/boolean.js.map +0 -1
- package/dist/validators/codec.js +0 -182
- package/dist/validators/codec.js.map +0 -1
- package/dist/validators/custom.js +0 -50
- package/dist/validators/custom.js.map +0 -1
- package/dist/validators/date.js +0 -227
- package/dist/validators/date.js.map +0 -1
- package/dist/validators/discriminated-union.js +0 -98
- package/dist/validators/discriminated-union.js.map +0 -1
- package/dist/validators/enum.js +0 -82
- package/dist/validators/enum.js.map +0 -1
- package/dist/validators/file.js +0 -114
- package/dist/validators/file.js.map +0 -1
- package/dist/validators/function.js +0 -45
- package/dist/validators/function.js.map +0 -1
- package/dist/validators/hex.js +0 -62
- package/dist/validators/hex.js.map +0 -1
- package/dist/validators/intersection.js +0 -64
- package/dist/validators/intersection.js.map +0 -1
- package/dist/validators/json.js +0 -64
- package/dist/validators/json.js.map +0 -1
- package/dist/validators/lazy.js +0 -42
- package/dist/validators/lazy.js.map +0 -1
- package/dist/validators/literal.js +0 -45
- package/dist/validators/literal.js.map +0 -1
- package/dist/validators/map.js +0 -54
- package/dist/validators/map.js.map +0 -1
- package/dist/validators/nan.js +0 -32
- package/dist/validators/nan.js.map +0 -1
- package/dist/validators/never.js +0 -29
- package/dist/validators/never.js.map +0 -1
- package/dist/validators/null.js +0 -31
- package/dist/validators/null.js.map +0 -1
- package/dist/validators/number.js +0 -225
- package/dist/validators/number.js.map +0 -1
- package/dist/validators/object-optimized.d.ts +0 -23
- package/dist/validators/object-optimized.d.ts.map +0 -1
- package/dist/validators/object-optimized.js +0 -179
- package/dist/validators/object-optimized.js.map +0 -1
- package/dist/validators/object-ultra.d.ts +0 -34
- package/dist/validators/object-ultra.d.ts.map +0 -1
- package/dist/validators/object-ultra.js +0 -175
- package/dist/validators/object-ultra.js.map +0 -1
- package/dist/validators/object.js +0 -458
- package/dist/validators/object.js.map +0 -1
- package/dist/validators/record.js +0 -128
- package/dist/validators/record.js.map +0 -1
- package/dist/validators/set.js +0 -51
- package/dist/validators/set.js.map +0 -1
- package/dist/validators/string-bool.js +0 -127
- package/dist/validators/string-bool.js.map +0 -1
- package/dist/validators/string-formats.js +0 -120
- package/dist/validators/string-formats.js.map +0 -1
- package/dist/validators/string-ultra.d.ts +0 -49
- package/dist/validators/string-ultra.d.ts.map +0 -1
- package/dist/validators/string-ultra.js +0 -217
- package/dist/validators/string-ultra.js.map +0 -1
- package/dist/validators/string.js +0 -253
- package/dist/validators/string.js.map +0 -1
- package/dist/validators/symbol.js +0 -42
- package/dist/validators/symbol.js.map +0 -1
- package/dist/validators/template-literal.js +0 -102
- package/dist/validators/template-literal.js.map +0 -1
- package/dist/validators/tuple.js +0 -55
- package/dist/validators/tuple.js.map +0 -1
- package/dist/validators/uint8array.js +0 -98
- package/dist/validators/uint8array.js.map +0 -1
- package/dist/validators/undefined.js +0 -31
- package/dist/validators/undefined.js.map +0 -1
- package/dist/validators/union-optimized.d.ts +0 -15
- package/dist/validators/union-optimized.d.ts.map +0 -1
- package/dist/validators/union-optimized.js +0 -92
- package/dist/validators/union-optimized.js.map +0 -1
- package/dist/validators/union.js +0 -126
- package/dist/validators/union.js.map +0 -1
- package/dist/validators/unknown.js.map +0 -1
- package/dist/validators/void.js +0 -35
- package/dist/validators/void.js.map +0 -1
- package/dist/validators/xor.js +0 -64
- 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"]}
|
package/dist/cli/generate.d.ts
DELETED
|
@@ -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"}
|
package/dist/cli/generate.js
DELETED
|
@@ -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
|