@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.
- package/CHANGELOG.md +333 -284
- package/README.md +13 -12
- package/dist/cli/benchmark.d.ts +15 -0
- package/dist/cli/benchmark.d.ts.map +1 -0
- package/dist/cli/benchmark.js +248 -0
- package/dist/cli/benchmark.js.map +1 -0
- package/dist/cli/bin.d.ts +8 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +35 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/benchmark.d.ts +11 -0
- package/dist/cli/commands/benchmark.d.ts.map +1 -0
- package/dist/cli/commands/benchmark.js +204 -0
- package/dist/cli/commands/benchmark.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +11 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +157 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/generate.d.ts +14 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +233 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +59 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +182 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/validate.d.ts +15 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +162 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/codecs/index.d.ts.map +1 -1
- package/dist/codecs/index.js +29 -10
- package/dist/codecs/index.js.map +1 -1
- package/dist/coercion/bigint.js +1 -1
- package/dist/coercion/boolean.d.ts.map +1 -1
- package/dist/coercion/boolean.js +24 -32
- package/dist/coercion/boolean.js.map +1 -1
- package/dist/coercion/date.js +2 -2
- package/dist/coercion/date.js.map +1 -1
- package/dist/coercion/number.d.ts.map +1 -1
- package/dist/coercion/number.js +20 -4
- package/dist/coercion/number.js.map +1 -1
- package/dist/coercion/string.d.ts.map +1 -1
- package/dist/coercion/string.js +9 -73
- package/dist/coercion/string.js.map +1 -1
- package/dist/compat/emitter.d.ts +73 -0
- package/dist/compat/emitter.d.ts.map +1 -0
- package/dist/compat/emitter.js +179 -0
- package/dist/compat/emitter.js.map +1 -0
- package/dist/compat/index.d.ts +15 -0
- package/dist/compat/index.d.ts.map +1 -0
- package/dist/compat/index.js +14 -0
- package/dist/compat/index.js.map +1 -0
- package/dist/compat/result.d.ts +128 -0
- package/dist/compat/result.d.ts.map +1 -0
- package/dist/compat/result.js +169 -0
- package/dist/compat/result.js.map +1 -0
- package/dist/errors.d.ts +58 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +97 -9
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +140 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +8 -0
- package/dist/events.js.map +1 -0
- package/dist/guards.d.ts +143 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +238 -0
- package/dist/guards.js.map +1 -0
- package/dist/index.d.ts +606 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +105 -6
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +29 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +402 -0
- package/dist/kernel.js.map +1 -0
- package/dist/locales/af.d.ts.map +1 -1
- package/dist/locales/af.js +18 -1
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.d.ts.map +1 -1
- package/dist/locales/ar.js +18 -1
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/backup-en.d.ts +3 -0
- package/dist/locales/backup-en.d.ts.map +1 -0
- package/dist/locales/backup-en.js +105 -0
- package/dist/locales/backup-en.js.map +1 -0
- package/dist/locales/bn.d.ts.map +1 -1
- package/dist/locales/bn.js +18 -1
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.d.ts.map +1 -1
- package/dist/locales/da.js +18 -1
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.d.ts.map +1 -1
- package/dist/locales/de.js +18 -1
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/en.js +18 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.d.ts.map +1 -1
- package/dist/locales/es-MX.js +17 -1
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.d.ts.map +1 -1
- package/dist/locales/es.js +18 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.d.ts.map +1 -1
- package/dist/locales/fi.js +18 -1
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.d.ts.map +1 -1
- package/dist/locales/fr.js +18 -1
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.d.ts.map +1 -1
- package/dist/locales/hi.js +18 -1
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.d.ts.map +1 -1
- package/dist/locales/id.js +18 -1
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/it.d.ts.map +1 -1
- package/dist/locales/it.js +18 -1
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.d.ts.map +1 -1
- package/dist/locales/ja.js +18 -1
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.d.ts.map +1 -1
- package/dist/locales/ko.js +18 -1
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/nl.d.ts.map +1 -1
- package/dist/locales/nl.js +18 -1
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.d.ts.map +1 -1
- package/dist/locales/no.js +18 -1
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.d.ts.map +1 -1
- package/dist/locales/pl.js +18 -1
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/locales/pt-BR.js +18 -1
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.d.ts.map +1 -1
- package/dist/locales/pt.js +18 -1
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.d.ts.map +1 -1
- package/dist/locales/ru.js +18 -1
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.d.ts.map +1 -1
- package/dist/locales/sv.js +18 -1
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.d.ts.map +1 -1
- package/dist/locales/sw.js +18 -1
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.d.ts.map +1 -1
- package/dist/locales/th.js +18 -1
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.d.ts.map +1 -1
- package/dist/locales/tr.js +18 -1
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/types.d.ts +13 -0
- package/dist/locales/types.d.ts.map +1 -1
- package/dist/locales/types.js.map +1 -1
- package/dist/locales/vi.d.ts.map +1 -1
- package/dist/locales/vi.js +18 -1
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.d.ts.map +1 -1
- package/dist/locales/zh.js +18 -1
- package/dist/locales/zh.js.map +1 -1
- package/dist/logger.d.ts +94 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +184 -0
- package/dist/logger.js.map +1 -0
- package/dist/pigment.d.ts +124 -0
- package/dist/pigment.d.ts.map +1 -0
- package/dist/pigment.js +177 -0
- package/dist/pigment.js.map +1 -0
- package/dist/plugins/codecs.d.ts +17 -0
- package/dist/plugins/codecs.d.ts.map +1 -0
- package/dist/plugins/codecs.js +29 -0
- package/dist/plugins/codecs.js.map +1 -0
- package/dist/plugins/coercion.d.ts +13 -0
- package/dist/plugins/coercion.d.ts.map +1 -0
- package/dist/plugins/coercion.js +34 -0
- package/dist/plugins/coercion.js.map +1 -0
- package/dist/plugins/core-validators.d.ts +13 -0
- package/dist/plugins/core-validators.d.ts.map +1 -0
- package/dist/plugins/core-validators.js +96 -0
- package/dist/plugins/core-validators.js.map +1 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +8 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/kernel.d.ts +29 -0
- package/dist/plugins/kernel.d.ts.map +1 -0
- package/dist/plugins/kernel.js +486 -0
- package/dist/plugins/kernel.js.map +1 -0
- package/dist/plugins/types.d.ts +186 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +8 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/style.d.ts +123 -0
- package/dist/style.d.ts.map +1 -0
- package/dist/style.js +369 -0
- package/dist/style.js.map +1 -0
- package/dist/utils/codec-utils.d.ts +2 -0
- package/dist/utils/codec-utils.d.ts.map +1 -1
- package/dist/utils/codec-utils.js +28 -4
- package/dist/utils/codec-utils.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +2 -0
- package/dist/utils/deep-merge.d.ts.map +1 -1
- package/dist/utils/deep-merge.js +22 -39
- package/dist/utils/deep-merge.js.map +1 -1
- package/dist/utils/ip-validation.d.ts +11 -0
- package/dist/utils/ip-validation.d.ts.map +1 -0
- package/dist/utils/ip-validation.js +98 -0
- package/dist/utils/ip-validation.js.map +1 -0
- package/dist/utils/security.d.ts +12 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +61 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/validators/array.d.ts +3 -1
- package/dist/validators/array.d.ts.map +1 -1
- package/dist/validators/array.js +41 -15
- package/dist/validators/array.js.map +1 -1
- package/dist/validators/base.d.ts +134 -0
- package/dist/validators/base.d.ts.map +1 -1
- package/dist/validators/base.js +255 -1
- package/dist/validators/base.js.map +1 -1
- package/dist/validators/base64.js +1 -1
- package/dist/validators/bigint.d.ts +20 -0
- package/dist/validators/bigint.d.ts.map +1 -1
- package/dist/validators/bigint.js +39 -1
- package/dist/validators/bigint.js.map +1 -1
- package/dist/validators/boolean.js +29 -1
- package/dist/validators/boolean.js.map +1 -1
- package/dist/validators/codec.js +1 -1
- package/dist/validators/custom.d.ts +47 -0
- package/dist/validators/custom.d.ts.map +1 -0
- package/dist/validators/custom.js +50 -0
- package/dist/validators/custom.js.map +1 -0
- package/dist/validators/date.d.ts +16 -0
- package/dist/validators/date.d.ts.map +1 -1
- package/dist/validators/date.js +62 -7
- package/dist/validators/date.js.map +1 -1
- package/dist/validators/discriminated-union.d.ts +29 -0
- package/dist/validators/discriminated-union.d.ts.map +1 -0
- package/dist/validators/discriminated-union.js +98 -0
- package/dist/validators/discriminated-union.js.map +1 -0
- package/dist/validators/enum.d.ts +10 -0
- package/dist/validators/enum.d.ts.map +1 -1
- package/dist/validators/enum.js +38 -1
- package/dist/validators/enum.js.map +1 -1
- package/dist/validators/file.d.ts +57 -0
- package/dist/validators/file.d.ts.map +1 -0
- package/dist/validators/file.js +114 -0
- package/dist/validators/file.js.map +1 -0
- package/dist/validators/function.d.ts +26 -0
- package/dist/validators/function.d.ts.map +1 -0
- package/dist/validators/function.js +45 -0
- package/dist/validators/function.js.map +1 -0
- package/dist/validators/hex.d.ts.map +1 -1
- package/dist/validators/hex.js +3 -2
- package/dist/validators/hex.js.map +1 -1
- package/dist/validators/index.d.ts +18 -1
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +16 -1
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/intersection.d.ts.map +1 -1
- package/dist/validators/intersection.js +15 -8
- package/dist/validators/intersection.js.map +1 -1
- package/dist/validators/json.d.ts +26 -0
- package/dist/validators/json.d.ts.map +1 -0
- package/dist/validators/json.js +64 -0
- package/dist/validators/json.js.map +1 -0
- package/dist/validators/lazy.d.ts +28 -0
- package/dist/validators/lazy.d.ts.map +1 -0
- package/dist/validators/lazy.js +42 -0
- package/dist/validators/lazy.js.map +1 -0
- package/dist/validators/literal.js +1 -1
- package/dist/validators/map.js +1 -1
- package/dist/validators/nan.d.ts +17 -0
- package/dist/validators/nan.d.ts.map +1 -0
- package/dist/validators/nan.js +32 -0
- package/dist/validators/nan.js.map +1 -0
- package/dist/validators/never.js +1 -1
- package/dist/validators/null.d.ts +16 -0
- package/dist/validators/null.d.ts.map +1 -0
- package/dist/validators/null.js +31 -0
- package/dist/validators/null.js.map +1 -0
- package/dist/validators/number.d.ts +22 -0
- package/dist/validators/number.d.ts.map +1 -1
- package/dist/validators/number.js +47 -8
- package/dist/validators/number.js.map +1 -1
- package/dist/validators/object.d.ts +32 -0
- package/dist/validators/object.d.ts.map +1 -1
- package/dist/validators/object.js +125 -8
- package/dist/validators/object.js.map +1 -1
- package/dist/validators/record.d.ts +15 -2
- package/dist/validators/record.d.ts.map +1 -1
- package/dist/validators/record.js +74 -4
- package/dist/validators/record.js.map +1 -1
- package/dist/validators/set.js +1 -1
- package/dist/validators/string-bool.d.ts +61 -0
- package/dist/validators/string-bool.d.ts.map +1 -0
- package/dist/validators/string-bool.js +127 -0
- package/dist/validators/string-bool.js.map +1 -0
- package/dist/validators/string-formats.d.ts +97 -0
- package/dist/validators/string-formats.d.ts.map +1 -0
- package/dist/validators/string-formats.js +120 -0
- package/dist/validators/string-formats.js.map +1 -0
- package/dist/validators/string.d.ts.map +1 -1
- package/dist/validators/string.js +2 -73
- package/dist/validators/string.js.map +1 -1
- package/dist/validators/symbol.js +1 -1
- package/dist/validators/template-literal.d.ts +32 -0
- package/dist/validators/template-literal.d.ts.map +1 -0
- package/dist/validators/template-literal.js +102 -0
- package/dist/validators/template-literal.js.map +1 -0
- package/dist/validators/tuple.js +1 -1
- package/dist/validators/uint8array.d.ts +21 -4
- package/dist/validators/uint8array.d.ts.map +1 -1
- package/dist/validators/uint8array.js +34 -23
- package/dist/validators/uint8array.js.map +1 -1
- package/dist/validators/undefined.d.ts +16 -0
- package/dist/validators/undefined.d.ts.map +1 -0
- package/dist/validators/undefined.js +31 -0
- package/dist/validators/undefined.js.map +1 -0
- package/dist/validators/union.d.ts +2 -0
- package/dist/validators/union.d.ts.map +1 -1
- package/dist/validators/union.js +15 -21
- package/dist/validators/union.js.map +1 -1
- package/dist/validators/void.js +1 -1
- package/dist/validators/xor.d.ts +23 -0
- package/dist/validators/xor.d.ts.map +1 -0
- package/dist/validators/xor.js +64 -0
- package/dist/validators/xor.js.map +1 -0
- package/package.json +95 -79
package/README.md
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
# VLD - Fast & Lightweight TypeScript Validation Library
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@oxog/vld)
|
|
4
|
-
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[](https://www.typescriptlang.org/)
|
|
6
|
-
[](package.json)
|
|
7
|
-
[](package.json)
|
|
3
|
+
[](https://www.npmjs.com/package/@oxog/vld) [](https://opensource.org/licenses/MIT) [](https://www.typescriptlang.org/) [](package.json) [](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
|
|
39
|
-
- **🏆 Industry Leading Performance**: 2.
|
|
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
|
|
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
|
|
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.
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|
package/dist/cli/bin.js
ADDED
|
@@ -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
|