@oxog/vld 1.0.0 → 1.1.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 +97 -103
- package/README.md +78 -13
- package/dist/coercion/bigint.d.ts +27 -0
- package/dist/coercion/bigint.d.ts.map +1 -0
- package/dist/coercion/bigint.js +108 -0
- package/dist/coercion/bigint.js.map +1 -0
- package/dist/coercion/boolean.d.ts +20 -0
- package/dist/coercion/boolean.d.ts.map +1 -0
- package/dist/coercion/boolean.js +63 -0
- package/dist/coercion/boolean.js.map +1 -0
- package/dist/coercion/date.d.ts +20 -0
- package/dist/coercion/date.d.ts.map +1 -0
- package/dist/coercion/date.js +52 -0
- package/dist/coercion/date.js.map +1 -0
- package/dist/coercion/number.d.ts +35 -0
- package/dist/coercion/number.d.ts.map +1 -0
- package/dist/coercion/number.js +144 -0
- package/dist/coercion/number.js.map +1 -0
- package/dist/coercion/string.d.ts +38 -0
- package/dist/coercion/string.d.ts.map +1 -0
- package/dist/coercion/string.js +168 -0
- package/dist/coercion/string.js.map +1 -0
- package/dist/index-new.d.ts.map +1 -0
- package/dist/index.d.ts +64 -257
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -1164
- package/dist/index.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +18 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +68 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/validators/any.d.ts +19 -0
- package/dist/validators/any.d.ts.map +1 -0
- package/dist/validators/any.js +25 -0
- package/dist/validators/any.js.map +1 -0
- package/dist/validators/array.d.ts +48 -0
- package/dist/validators/array.d.ts.map +1 -0
- package/dist/validators/array.js +135 -0
- package/dist/validators/array.js.map +1 -0
- package/dist/validators/base.d.ts +155 -0
- package/dist/validators/base.d.ts.map +1 -0
- package/dist/validators/base.js +245 -0
- package/dist/validators/base.js.map +1 -0
- package/dist/validators/bigint.d.ts +60 -0
- package/dist/validators/bigint.d.ts.map +1 -0
- package/dist/validators/bigint.js +104 -0
- package/dist/validators/bigint.js.map +1 -0
- package/dist/validators/boolean.d.ts +32 -0
- package/dist/validators/boolean.d.ts.map +1 -0
- package/dist/validators/boolean.js +86 -0
- package/dist/validators/boolean.js.map +1 -0
- package/dist/validators/date.d.ts +68 -0
- package/dist/validators/date.d.ts.map +1 -0
- package/dist/validators/date.js +148 -0
- package/dist/validators/date.js.map +1 -0
- package/dist/validators/enum.d.ts +25 -0
- package/dist/validators/enum.d.ts.map +1 -0
- package/dist/validators/enum.js +45 -0
- package/dist/validators/enum.js.map +1 -0
- package/dist/validators/index.d.ts +27 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +30 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/intersection.d.ts +25 -0
- package/dist/validators/intersection.d.ts.map +1 -0
- package/dist/validators/intersection.js +57 -0
- package/dist/validators/intersection.js.map +1 -0
- package/dist/validators/literal.d.ts +25 -0
- package/dist/validators/literal.d.ts.map +1 -0
- package/dist/validators/literal.js +45 -0
- package/dist/validators/literal.js.map +1 -0
- package/dist/validators/map.d.ts +26 -0
- package/dist/validators/map.d.ts.map +1 -0
- package/dist/validators/map.js +54 -0
- package/dist/validators/map.js.map +1 -0
- package/dist/validators/never.d.ts +19 -0
- package/dist/validators/never.d.ts.map +1 -0
- package/dist/validators/never.js +29 -0
- package/dist/validators/never.js.map +1 -0
- package/dist/validators/number.d.ts +92 -0
- package/dist/validators/number.d.ts.map +1 -0
- package/dist/validators/number.js +173 -0
- package/dist/validators/number.js.map +1 -0
- package/dist/validators/object-optimized.d.ts +23 -0
- package/dist/validators/object-optimized.d.ts.map +1 -0
- package/dist/validators/object-optimized.js +179 -0
- package/dist/validators/object-optimized.js.map +1 -0
- package/dist/validators/object-ultra.d.ts +34 -0
- package/dist/validators/object-ultra.d.ts.map +1 -0
- package/dist/validators/object-ultra.js +175 -0
- package/dist/validators/object-ultra.js.map +1 -0
- package/dist/validators/object.d.ts +73 -0
- package/dist/validators/object.d.ts.map +1 -0
- package/dist/validators/object.js +285 -0
- package/dist/validators/object.js.map +1 -0
- package/dist/validators/record.d.ts +25 -0
- package/dist/validators/record.d.ts.map +1 -0
- package/dist/validators/record.js +52 -0
- package/dist/validators/record.js.map +1 -0
- package/dist/validators/set.d.ts +25 -0
- package/dist/validators/set.d.ts.map +1 -0
- package/dist/validators/set.js +51 -0
- package/dist/validators/set.js.map +1 -0
- package/dist/validators/string-ultra.d.ts +49 -0
- package/dist/validators/string-ultra.d.ts.map +1 -0
- package/dist/validators/string-ultra.js +217 -0
- package/dist/validators/string-ultra.js.map +1 -0
- package/dist/validators/string.d.ts +109 -0
- package/dist/validators/string.d.ts.map +1 -0
- package/dist/validators/string.js +242 -0
- package/dist/validators/string.js.map +1 -0
- package/dist/validators/symbol.d.ts +24 -0
- package/dist/validators/symbol.d.ts.map +1 -0
- package/dist/validators/symbol.js +42 -0
- package/dist/validators/symbol.js.map +1 -0
- package/dist/validators/tuple.d.ts +31 -0
- package/dist/validators/tuple.d.ts.map +1 -0
- package/dist/validators/tuple.js +55 -0
- package/dist/validators/tuple.js.map +1 -0
- package/dist/validators/union-optimized.d.ts +15 -0
- package/dist/validators/union-optimized.d.ts.map +1 -0
- package/dist/validators/union-optimized.js +92 -0
- package/dist/validators/union-optimized.js.map +1 -0
- package/dist/validators/union.d.ts +33 -0
- package/dist/validators/union.d.ts.map +1 -0
- package/dist/validators/union.js +121 -0
- package/dist/validators/union.js.map +1 -0
- package/dist/validators/unknown.d.ts +19 -0
- package/dist/validators/unknown.d.ts.map +1 -0
- package/dist/validators/unknown.js +25 -0
- package/dist/validators/unknown.js.map +1 -0
- package/dist/validators/void.d.ts +19 -0
- package/dist/validators/void.d.ts.map +1 -0
- package/dist/validators/void.js +35 -0
- package/dist/validators/void.js.map +1 -0
- package/package.json +12 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,113 +1,107 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
All notable changes to
|
|
3
|
+
All notable changes to VLD will be documented in this file.
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [1.
|
|
8
|
+
## [1.1.0] - 2025-01-11
|
|
9
9
|
|
|
10
10
|
### Added
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
- Multiple/step validation
|
|
43
|
-
- Precision constraints
|
|
44
|
-
- Special number handling (NaN, Infinity)
|
|
45
|
-
|
|
46
|
-
**Object & Array Features**
|
|
47
|
-
- Nested object validation with strict/passthrough/strip modes
|
|
48
|
-
- Array length constraints and element validation
|
|
49
|
-
- Tuple validation with exact type inference
|
|
50
|
-
- Record validation with key/value constraints
|
|
51
|
-
- Deep object merging and extension
|
|
52
|
-
- Partial and required modifiers
|
|
53
|
-
- Pick and omit operations
|
|
54
|
-
|
|
55
|
-
**Union & Intersection Types**
|
|
56
|
-
- Standard unions with type inference
|
|
57
|
-
- **Discriminated unions with O(1) performance** (up to 12x faster than regular unions)
|
|
58
|
-
- Intersection types for combining schemas
|
|
59
|
-
- Enum validation with compile-time safety
|
|
60
|
-
|
|
61
|
-
**Modifiers & Transformations**
|
|
62
|
-
- `optional()`: Make fields optional (T | undefined)
|
|
63
|
-
- `nullable()`: Allow null values (T | null)
|
|
64
|
-
- `nullish()`: Allow null or undefined (T | null | undefined)
|
|
65
|
-
- `default()`: Provide default values
|
|
66
|
-
- `catch()`: Fallback values on validation errors
|
|
67
|
-
- `transform()`: Data transformation pipeline
|
|
68
|
-
- `refine()` and `superRefine()`: Custom validation logic
|
|
69
|
-
- `pipe()`: Sequential transformation chains
|
|
70
|
-
|
|
71
|
-
**Async Support**
|
|
72
|
-
- `parseAsync()` and `safeParseAsync()` methods
|
|
73
|
-
- Async refinement functions
|
|
74
|
-
- Promise schema validation
|
|
75
|
-
- Async transform functions
|
|
76
|
-
|
|
77
|
-
**Plugin System**
|
|
78
|
-
- Built-in plugins: DateTime, i18n, Custom Formats
|
|
79
|
-
- Plugin hooks: beforeParse, afterParse, onError
|
|
80
|
-
- Custom schema registration
|
|
81
|
-
- Transform and validator registration
|
|
82
|
-
- Configurable plugin loading
|
|
83
|
-
|
|
84
|
-
**Built-in Plugins**
|
|
85
|
-
- **DateTime Plugin**: Date, time, and datetime validation with timezone support
|
|
86
|
-
- **i18n Plugin**: Multi-language error messages (English, Spanish, French, German, Chinese, Japanese)
|
|
87
|
-
- **Custom Formats Plugin**: Credit cards, IP addresses, hex colors, Base64, MAC addresses, ISBN/EAN
|
|
88
|
-
|
|
89
|
-
**Error Handling**
|
|
90
|
-
- Detailed error paths and messages
|
|
91
|
-
- Error formatting and flattening utilities
|
|
92
|
-
- Custom error messages with interpolation
|
|
93
|
-
- Structured error reporting
|
|
94
|
-
- Error caching for performance
|
|
95
|
-
|
|
96
|
-
**Security Features**
|
|
97
|
-
- Automatic prototype pollution protection
|
|
98
|
-
- Input sanitization safeguards
|
|
99
|
-
- DoS attack mitigation with size limits
|
|
100
|
-
- Safe error messages (no sensitive data leakage)
|
|
101
|
-
- Schema validation prevents code execution
|
|
11
|
+
- Professional benchmark suite with real-world performance testing
|
|
12
|
+
- `benchmarks/quick-bench.cjs` - Fast performance comparison
|
|
13
|
+
- `benchmarks/memory.cjs` - Memory usage analysis
|
|
14
|
+
- `benchmarks/startup.cjs` - Startup time comparison
|
|
15
|
+
- `benchmarks/performance.cjs` - Comprehensive benchmark suite
|
|
16
|
+
- Complete documentation overhaul in `/docs` folder:
|
|
17
|
+
- `API.md` - Full API reference with all methods and examples
|
|
18
|
+
- `GETTING_STARTED.md` - Beginner-friendly guide
|
|
19
|
+
- `MIGRATION.md` - Step-by-step Zod to VLD migration
|
|
20
|
+
- `PERFORMANCE.md` - Performance optimization guide
|
|
21
|
+
- `ADVANCED_FEATURES.md` - Deep dive into advanced features
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- Updated README with accurate benchmark results showing 2.07x average improvement
|
|
25
|
+
- All documentation converted to English
|
|
26
|
+
- Improved build process with automatic ES module import fixes
|
|
27
|
+
- Test coverage increased to 99.5%
|
|
28
|
+
- Cleaned up project structure for better maintainability
|
|
29
|
+
|
|
30
|
+
### Removed
|
|
31
|
+
- Deleted `coverage/` folder (unnecessary for npm package)
|
|
32
|
+
- Removed 12 old benchmark files
|
|
33
|
+
- Cleaned up `src/errors/` and `src/types/` folders
|
|
34
|
+
- Removed redundant test files focused on coverage metrics
|
|
35
|
+
- Deleted unnecessary example files
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
- Fixed ES module import issues with `.js` extension resolver
|
|
39
|
+
- Resolved CommonJS compatibility for benchmark files
|
|
40
|
+
- Fixed all TypeScript compilation errors
|
|
41
|
+
- Corrected package.json export configurations
|
|
102
42
|
|
|
103
43
|
### Performance
|
|
104
|
-
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
44
|
+
- Memory usage: 86% less than Zod
|
|
45
|
+
- Startup time: 1.94x faster
|
|
46
|
+
- Schema creation: 8.22x faster
|
|
47
|
+
- Overall performance: 2.07x faster average
|
|
48
|
+
|
|
49
|
+
## [1.0.0] - 2024-12-15
|
|
50
|
+
|
|
51
|
+
### Initial Release
|
|
52
|
+
|
|
53
|
+
#### Core Features
|
|
54
|
+
- **Blazing Fast Performance**: 2-4x faster than Zod in most operations
|
|
55
|
+
- **Zero Dependencies**: Lightweight with no external packages
|
|
56
|
+
- **Full TypeScript Support**: Excellent type inference and IntelliSense
|
|
57
|
+
- **Zod API Compatibility**: Drop-in replacement with identical API
|
|
58
|
+
- **Tree-Shakeable**: Only import what you need
|
|
59
|
+
|
|
60
|
+
#### Validation Types
|
|
61
|
+
- **Primitives**: string, number, boolean, bigint, symbol, date, undefined, null, void, any, unknown, never
|
|
62
|
+
- **Collections**: array, tuple, object, record, map, set
|
|
63
|
+
- **Compositions**: union, intersection, literal, enum
|
|
64
|
+
- **Modifiers**: optional, nullable, nullish, default, catch
|
|
65
|
+
|
|
66
|
+
#### Advanced Features
|
|
67
|
+
- **Type Coercion**: Automatic type conversion for common cases
|
|
68
|
+
- **Custom Validation**: `refine()` and `superRefine()` for custom logic
|
|
69
|
+
- **Data Transformation**: `transform()` for post-validation processing
|
|
70
|
+
- **Object Utilities**: `pick()`, `omit()`, `extend()`, `merge()`, `partial()`
|
|
71
|
+
- **Error Formatting**: Tree, pretty, and flatten utilities
|
|
72
|
+
|
|
73
|
+
#### Internationalization
|
|
74
|
+
- Built-in support for 27+ languages
|
|
75
|
+
- Easy locale switching with `setLocale()`
|
|
76
|
+
- Comprehensive translation coverage
|
|
77
|
+
|
|
78
|
+
#### String Validators
|
|
79
|
+
- Email, URL, UUID validation
|
|
80
|
+
- IP address (v4/v6) validation
|
|
81
|
+
- Regex pattern matching
|
|
82
|
+
- Length constraints (min, max, length)
|
|
83
|
+
- Content checks (includes, startsWith, endsWith)
|
|
84
|
+
- Transformations (trim, toLowerCase, toUpperCase)
|
|
85
|
+
|
|
86
|
+
#### Number Validators
|
|
87
|
+
- Range validation (min, max)
|
|
88
|
+
- Type constraints (int, positive, negative, finite, safe)
|
|
89
|
+
- Mathematical checks (multipleOf)
|
|
90
|
+
|
|
91
|
+
#### Performance Optimizations
|
|
92
|
+
- Optimized for V8 JavaScript engine
|
|
93
|
+
- Minimal memory allocations
|
|
94
|
+
- Fast-path optimizations for common cases
|
|
95
|
+
- Immutable validators prevent memory leaks
|
|
96
|
+
- Pre-computed validation strategies
|
|
97
|
+
|
|
98
|
+
#### Developer Experience
|
|
99
|
+
- Clear, actionable error messages
|
|
100
|
+
- Comprehensive test suite (99.5% coverage)
|
|
101
|
+
- Extensive documentation and examples
|
|
102
|
+
- TypeScript-first design
|
|
103
|
+
- Intuitive, chainable API
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
For more details, see the [GitHub Releases](https://github.com/ersinkoc/vld/releases)
|
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# VLD - Fast
|
|
1
|
+
# VLD - Fast & Lightweight TypeScript Validation Library
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@oxog/vld)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
[](https://www.typescriptlang.org/)
|
|
6
6
|
[](package.json)
|
|
7
|
-
[](package.json)
|
|
8
8
|
|
|
9
9
|
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
10
|
|
|
@@ -18,7 +18,8 @@ VLD is a blazing-fast, type-safe validation library for TypeScript and JavaScrip
|
|
|
18
18
|
- **🔧 Composable**: Chain validations for complex schemas
|
|
19
19
|
- **⚠️ Advanced Error Formatting**: Tree, pretty, and flatten error utilities
|
|
20
20
|
- **🌍 Multi-language**: Built-in support for 27+ languages
|
|
21
|
-
- **✅
|
|
21
|
+
- **✅ 99.5% Test Coverage**: Rigorously tested with comprehensive test suite
|
|
22
|
+
- **🏆 Industry Leading Performance**: 2.07x faster than Zod on average
|
|
22
23
|
|
|
23
24
|
### Advanced Zod-Compatible Features
|
|
24
25
|
- **🔄 Type Coercion**: `v.coerce.string()`, `v.coerce.number()`, `v.coerce.boolean()`, etc.
|
|
@@ -32,11 +33,29 @@ VLD is a blazing-fast, type-safe validation library for TypeScript and JavaScrip
|
|
|
32
33
|
|
|
33
34
|
## 📊 Performance
|
|
34
35
|
|
|
35
|
-
VLD is designed for speed
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
- **
|
|
39
|
-
- **
|
|
36
|
+
VLD is designed for speed and efficiency with recent optimizations delivering exceptional performance:
|
|
37
|
+
|
|
38
|
+
### Speed Benchmarks (v1.0.0 - Optimized)
|
|
39
|
+
- **4.6x faster** for number validation with constraints
|
|
40
|
+
- **3.6x faster** for union type validation
|
|
41
|
+
- **2.5x faster** for email validation
|
|
42
|
+
- **1.9x faster** for array validation
|
|
43
|
+
- **1.7x faster** for primitive string validation
|
|
44
|
+
- **2.8x faster** overall average performance
|
|
45
|
+
|
|
46
|
+
### Recent Optimizations (v1.0.0)
|
|
47
|
+
- **110x improvement** in union type validation
|
|
48
|
+
- **Simplified email regex** for maximum performance
|
|
49
|
+
- **Inline type checks** in object validation
|
|
50
|
+
- **Optimized loops** with direct array assignment
|
|
51
|
+
- **SafeParse optimization** to avoid try-catch overhead
|
|
52
|
+
- **Pre-computed keys** with Set for O(1) lookups
|
|
53
|
+
|
|
54
|
+
### Memory Efficiency
|
|
55
|
+
- **98% less memory** for validator creation
|
|
56
|
+
- **51% less memory** for data parsing
|
|
57
|
+
- **86% less memory** for error handling
|
|
58
|
+
- **78% less memory** overall average
|
|
40
59
|
|
|
41
60
|
### 🎭 The Truth About Zod's Benchmarks
|
|
42
61
|
|
|
@@ -749,16 +768,62 @@ schema.extend({ email: v.string().email() })
|
|
|
749
768
|
.catch({ name: 'Unknown', email: 'no-email@example.com' });
|
|
750
769
|
```
|
|
751
770
|
|
|
771
|
+
## 🔄 Migrating from Zod
|
|
772
|
+
|
|
773
|
+
VLD provides 100% feature parity with Zod, making migration seamless:
|
|
774
|
+
|
|
775
|
+
### Simple Migration
|
|
776
|
+
```javascript
|
|
777
|
+
// Before (Zod)
|
|
778
|
+
import { z } from 'zod';
|
|
779
|
+
const schema = z.string().email();
|
|
780
|
+
|
|
781
|
+
// After (VLD) - Exact same syntax!
|
|
782
|
+
import { v } from '@oxog/vld';
|
|
783
|
+
const schema = v.string().email();
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
### Why Migrate?
|
|
787
|
+
- **⚡ Performance**: 2-4x faster for most operations
|
|
788
|
+
- **💾 Memory**: Uses 1.18-1.82x less memory than Zod
|
|
789
|
+
- **🌍 Internationalization**: Built-in 27+ language support
|
|
790
|
+
- **📦 Bundle Size**: Smaller with zero dependencies
|
|
791
|
+
- **🔒 Security**: Immutable validators prevent memory leaks
|
|
792
|
+
- **✅ Testing**: 99.5% test coverage with 584 tests
|
|
793
|
+
|
|
752
794
|
## 📈 Benchmarks
|
|
753
795
|
|
|
754
|
-
|
|
796
|
+
### Performance Results
|
|
797
|
+
|
|
798
|
+
Latest benchmark results show VLD consistently outperforming Zod:
|
|
799
|
+
|
|
800
|
+
| Test Case | VLD Performance | Improvement |
|
|
801
|
+
|-----------|----------------|-------------|
|
|
802
|
+
| Simple String | 44.4M ops/sec | **1.67x faster** |
|
|
803
|
+
| Email Validation | 18.6M ops/sec | **3.63x faster** |
|
|
804
|
+
| Number Validation | 22.7M ops/sec | **2.62x faster** |
|
|
805
|
+
| Object Validation | 7.6M ops/sec | **1.27x faster** |
|
|
806
|
+
| Array Validation | 6.7M ops/sec | **1.29x faster** |
|
|
807
|
+
| Union Types | 6.8M ops/sec | **1.54x faster** |
|
|
808
|
+
| Optional Values | 32.7M ops/sec | **4.52x faster** |
|
|
809
|
+
| Type Coercion | 18.4M ops/sec | **1.46x faster** |
|
|
810
|
+
|
|
811
|
+
**Average: 2.07x faster than Zod**
|
|
812
|
+
|
|
813
|
+
### Run Benchmarks
|
|
755
814
|
|
|
756
815
|
```bash
|
|
757
|
-
#
|
|
816
|
+
# Quick performance comparison
|
|
758
817
|
npm run benchmark
|
|
759
818
|
|
|
760
|
-
#
|
|
761
|
-
npm run benchmark:
|
|
819
|
+
# Memory usage comparison
|
|
820
|
+
npm run benchmark:memory
|
|
821
|
+
|
|
822
|
+
# Startup time comparison
|
|
823
|
+
npm run benchmark:startup
|
|
824
|
+
|
|
825
|
+
# Run all benchmarks
|
|
826
|
+
npm run benchmark:all
|
|
762
827
|
```
|
|
763
828
|
|
|
764
829
|
## 🤝 Contributing
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { VldBigInt } from '../validators/bigint';
|
|
2
|
+
import { ParseResult } from '../validators/base';
|
|
3
|
+
/**
|
|
4
|
+
* BigInt coercion validator that attempts to convert values to bigint
|
|
5
|
+
*/
|
|
6
|
+
export declare class VldCoerceBigInt extends VldBigInt {
|
|
7
|
+
protected constructor(config?: any);
|
|
8
|
+
/**
|
|
9
|
+
* Create a new coerce bigint validator
|
|
10
|
+
*/
|
|
11
|
+
static create(): VldCoerceBigInt;
|
|
12
|
+
min(value: bigint, message?: string): VldCoerceBigInt;
|
|
13
|
+
max(value: bigint, message?: string): VldCoerceBigInt;
|
|
14
|
+
positive(message?: string): VldCoerceBigInt;
|
|
15
|
+
negative(message?: string): VldCoerceBigInt;
|
|
16
|
+
nonnegative(message?: string): VldCoerceBigInt;
|
|
17
|
+
nonpositive(message?: string): VldCoerceBigInt;
|
|
18
|
+
/**
|
|
19
|
+
* Parse and coerce a value to bigint
|
|
20
|
+
*/
|
|
21
|
+
parse(value: unknown): bigint;
|
|
22
|
+
/**
|
|
23
|
+
* Safely parse and coerce a value to bigint
|
|
24
|
+
*/
|
|
25
|
+
safeParse(value: unknown): ParseResult<bigint>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=bigint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bigint.d.ts","sourceRoot":"","sources":["../../src/coercion/bigint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,SAAS,aAAa,MAAM,CAAC,EAAE,GAAG;IAIlC;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,eAAe;IAKhC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAOrD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAOrD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAO3C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAO3C,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAO9C,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAO9C;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IA2C7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;CAO/C"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { VldBigInt } from '../validators/bigint.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* BigInt coercion validator that attempts to convert values to bigint
|
|
5
|
+
*/
|
|
6
|
+
export class VldCoerceBigInt extends VldBigInt {
|
|
7
|
+
constructor(config) {
|
|
8
|
+
super(config);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a new coerce bigint validator
|
|
12
|
+
*/
|
|
13
|
+
static create() {
|
|
14
|
+
return new VldCoerceBigInt();
|
|
15
|
+
}
|
|
16
|
+
// Override all chain methods to return VldCoerceBigInt instances
|
|
17
|
+
min(value, message) {
|
|
18
|
+
return new VldCoerceBigInt({
|
|
19
|
+
checks: [...this.config.checks, (v) => v >= value],
|
|
20
|
+
errorMessage: message || `BigInt must be at least ${value}`
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
max(value, message) {
|
|
24
|
+
return new VldCoerceBigInt({
|
|
25
|
+
checks: [...this.config.checks, (v) => v <= value],
|
|
26
|
+
errorMessage: message || `BigInt must be at most ${value}`
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
positive(message) {
|
|
30
|
+
return new VldCoerceBigInt({
|
|
31
|
+
checks: [...this.config.checks, (v) => v > 0n],
|
|
32
|
+
errorMessage: message || 'BigInt must be positive'
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
negative(message) {
|
|
36
|
+
return new VldCoerceBigInt({
|
|
37
|
+
checks: [...this.config.checks, (v) => v < 0n],
|
|
38
|
+
errorMessage: message || 'BigInt must be negative'
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
nonnegative(message) {
|
|
42
|
+
return new VldCoerceBigInt({
|
|
43
|
+
checks: [...this.config.checks, (v) => v >= 0n],
|
|
44
|
+
errorMessage: message || 'BigInt must be non-negative'
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
nonpositive(message) {
|
|
48
|
+
return new VldCoerceBigInt({
|
|
49
|
+
checks: [...this.config.checks, (v) => v <= 0n],
|
|
50
|
+
errorMessage: message || 'BigInt must be non-positive'
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse and coerce a value to bigint
|
|
55
|
+
*/
|
|
56
|
+
parse(value) {
|
|
57
|
+
// If it's already a bigint, use parent validation directly
|
|
58
|
+
if (typeof value === 'bigint') {
|
|
59
|
+
return super.parse(value);
|
|
60
|
+
}
|
|
61
|
+
// Handle string values
|
|
62
|
+
if (typeof value === 'string') {
|
|
63
|
+
const trimmed = value.trim();
|
|
64
|
+
if (trimmed === '') {
|
|
65
|
+
throw new Error(getMessages().coercionFailed('bigint', value));
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const coerced = BigInt(trimmed);
|
|
69
|
+
return super.parse(coerced);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw new Error(getMessages().coercionFailed('bigint', value));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Handle number values (must be integer)
|
|
76
|
+
if (typeof value === 'number') {
|
|
77
|
+
if (!Number.isInteger(value)) {
|
|
78
|
+
throw new Error(getMessages().coercionFailed('bigint', value));
|
|
79
|
+
}
|
|
80
|
+
const coerced = BigInt(value);
|
|
81
|
+
return super.parse(coerced);
|
|
82
|
+
}
|
|
83
|
+
// Handle null and undefined
|
|
84
|
+
if (value === null || value === undefined) {
|
|
85
|
+
throw new Error(getMessages().coercionFailed('bigint', value));
|
|
86
|
+
}
|
|
87
|
+
// Try to coerce other values
|
|
88
|
+
try {
|
|
89
|
+
const coerced = BigInt(value);
|
|
90
|
+
return super.parse(coerced);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
throw new Error(getMessages().coercionFailed('bigint', value));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Safely parse and coerce a value to bigint
|
|
98
|
+
*/
|
|
99
|
+
safeParse(value) {
|
|
100
|
+
try {
|
|
101
|
+
return { success: true, data: this.parse(value) };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return { success: false, error: error };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=bigint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bigint.js","sourceRoot":"","sources":["../../src/coercion/bigint.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBigInt } from '../validators/bigint';\nimport { ParseResult } from '../validators/base';\nimport { getMessages } from '../locales';\n\n/**\n * BigInt coercion validator that attempts to convert values to bigint\n */\nexport class VldCoerceBigInt extends VldBigInt {\n protected constructor(config?: any) {\n super(config);\n }\n \n /**\n * Create a new coerce bigint validator\n */\n static create(): VldCoerceBigInt {\n return new VldCoerceBigInt();\n }\n \n // Override all chain methods to return VldCoerceBigInt instances\n min(value: bigint, message?: string): VldCoerceBigInt {\n return new VldCoerceBigInt({\n checks: [...this.config.checks, (v: bigint) => v >= value],\n errorMessage: message || `BigInt must be at least ${value}`\n });\n }\n \n max(value: bigint, message?: string): VldCoerceBigInt {\n return new VldCoerceBigInt({\n checks: [...this.config.checks, (v: bigint) => v <= value],\n errorMessage: message || `BigInt must be at most ${value}`\n });\n }\n \n positive(message?: string): VldCoerceBigInt {\n return new VldCoerceBigInt({\n checks: [...this.config.checks, (v: bigint) => v > 0n],\n errorMessage: message || 'BigInt must be positive'\n });\n }\n \n negative(message?: string): VldCoerceBigInt {\n return new VldCoerceBigInt({\n checks: [...this.config.checks, (v: bigint) => v < 0n],\n errorMessage: message || 'BigInt must be negative'\n });\n }\n \n nonnegative(message?: string): VldCoerceBigInt {\n return new VldCoerceBigInt({\n checks: [...this.config.checks, (v: bigint) => v >= 0n],\n errorMessage: message || 'BigInt must be non-negative'\n });\n }\n \n nonpositive(message?: string): VldCoerceBigInt {\n return new VldCoerceBigInt({\n checks: [...this.config.checks, (v: bigint) => v <= 0n],\n errorMessage: message || 'BigInt must be non-positive'\n });\n }\n \n /**\n * Parse and coerce a value to bigint\n */\n parse(value: unknown): bigint {\n // If it's already a bigint, use parent validation directly\n if (typeof value === 'bigint') {\n return super.parse(value);\n }\n \n // Handle string values\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed === '') {\n throw new Error(getMessages().coercionFailed('bigint', value));\n }\n try {\n const coerced = BigInt(trimmed);\n return super.parse(coerced);\n } catch {\n throw new Error(getMessages().coercionFailed('bigint', value));\n }\n }\n \n // Handle number values (must be integer)\n if (typeof value === 'number') {\n if (!Number.isInteger(value)) {\n throw new Error(getMessages().coercionFailed('bigint', value));\n }\n const coerced = BigInt(value);\n return super.parse(coerced);\n }\n \n // Handle null and undefined\n if (value === null || value === undefined) {\n throw new Error(getMessages().coercionFailed('bigint', value));\n }\n \n // Try to coerce other values\n try {\n const coerced = BigInt(value as any);\n return super.parse(coerced);\n } catch {\n throw new Error(getMessages().coercionFailed('bigint', value));\n }\n }\n \n /**\n * Safely parse and coerce a value to bigint\n */\n safeParse(value: unknown): ParseResult<bigint> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { VldBoolean } from '../validators/boolean';
|
|
2
|
+
import { ParseResult } from '../validators/base';
|
|
3
|
+
/**
|
|
4
|
+
* Boolean coercion validator that attempts to convert values to booleans
|
|
5
|
+
*/
|
|
6
|
+
export declare class VldCoerceBoolean extends VldBoolean {
|
|
7
|
+
/**
|
|
8
|
+
* Create a new coerce boolean validator
|
|
9
|
+
*/
|
|
10
|
+
static create(): VldCoerceBoolean;
|
|
11
|
+
/**
|
|
12
|
+
* Parse and coerce a value to boolean
|
|
13
|
+
*/
|
|
14
|
+
parse(value: unknown): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Safely parse and coerce a value to boolean
|
|
17
|
+
*/
|
|
18
|
+
safeParse(value: unknown): ParseResult<boolean>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=boolean.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/coercion/boolean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,gBAAgB;IAIjC;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAoC9B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;CAOhD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { VldBoolean } from '../validators/boolean.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Boolean coercion validator that attempts to convert values to booleans
|
|
5
|
+
*/
|
|
6
|
+
export class VldCoerceBoolean extends VldBoolean {
|
|
7
|
+
/**
|
|
8
|
+
* Create a new coerce boolean validator
|
|
9
|
+
*/
|
|
10
|
+
static create() {
|
|
11
|
+
return new VldCoerceBoolean();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parse and coerce a value to boolean
|
|
15
|
+
*/
|
|
16
|
+
parse(value) {
|
|
17
|
+
try {
|
|
18
|
+
// Handle string values
|
|
19
|
+
if (typeof value === 'string') {
|
|
20
|
+
const lower = value.toLowerCase().trim();
|
|
21
|
+
if (lower === 'true' || lower === '1' || lower === 'yes' || lower === 'on') {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
if (lower === 'false' || lower === '0' || lower === 'no' || lower === 'off') {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
throw new Error(getMessages().coercionFailed('boolean', value));
|
|
28
|
+
}
|
|
29
|
+
// Handle number values
|
|
30
|
+
if (typeof value === 'number') {
|
|
31
|
+
if (value === 1)
|
|
32
|
+
return true;
|
|
33
|
+
if (value === 0)
|
|
34
|
+
return false;
|
|
35
|
+
throw new Error(getMessages().coercionFailed('boolean', value));
|
|
36
|
+
}
|
|
37
|
+
// Handle null and undefined
|
|
38
|
+
if (value === null || value === undefined) {
|
|
39
|
+
throw new Error(getMessages().coercionFailed('boolean', value));
|
|
40
|
+
}
|
|
41
|
+
// Use parent validation for actual booleans
|
|
42
|
+
return super.parse(Boolean(value));
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.message.includes('coercionFailed')) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
throw new Error(getMessages().coercionFailed('boolean', value));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Safely parse and coerce a value to boolean
|
|
53
|
+
*/
|
|
54
|
+
safeParse(value) {
|
|
55
|
+
try {
|
|
56
|
+
return { success: true, data: this.parse(value) };
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return { success: false, error: error };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=boolean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean.js","sourceRoot":"","sources":["../../src/coercion/boolean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,gBAAgB,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC;YACH,uBAAuB;YACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;gBACzC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAC3E,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;oBAC5E,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YAClE,CAAC;YAED,uBAAuB;YACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,IAAI,KAAK,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC7B,IAAI,KAAK,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YAClE,CAAC;YAED,4BAA4B;YAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YAClE,CAAC;YAED,4CAA4C;YAC5C,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACxD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;CACF","sourcesContent":["import { VldBoolean } from '../validators/boolean';\nimport { ParseResult } from '../validators/base';\nimport { getMessages } from '../locales';\n\n/**\n * Boolean coercion validator that attempts to convert values to booleans\n */\nexport class VldCoerceBoolean extends VldBoolean {\n /**\n * Create a new coerce boolean validator\n */\n static create(): VldCoerceBoolean {\n return new VldCoerceBoolean();\n }\n \n /**\n * Parse and coerce a value to boolean\n */\n parse(value: unknown): boolean {\n try {\n // Handle string values\n if (typeof value === 'string') {\n const lower = value.toLowerCase().trim();\n if (lower === 'true' || lower === '1' || lower === 'yes' || lower === 'on') {\n return true;\n }\n if (lower === 'false' || lower === '0' || lower === 'no' || lower === 'off') {\n return false;\n }\n throw new Error(getMessages().coercionFailed('boolean', value));\n }\n \n // Handle number values\n if (typeof value === 'number') {\n if (value === 1) return true;\n if (value === 0) return false;\n throw new Error(getMessages().coercionFailed('boolean', value));\n }\n \n // Handle null and undefined\n if (value === null || value === undefined) {\n throw new Error(getMessages().coercionFailed('boolean', value));\n }\n \n // Use parent validation for actual booleans\n return super.parse(Boolean(value));\n } catch (error) {\n if ((error as Error).message.includes('coercionFailed')) {\n throw error;\n }\n throw new Error(getMessages().coercionFailed('boolean', value));\n }\n }\n \n /**\n * Safely parse and coerce a value to boolean\n */\n safeParse(value: unknown): ParseResult<boolean> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { VldDate } from '../validators/date';
|
|
2
|
+
import { ParseResult } from '../validators/base';
|
|
3
|
+
/**
|
|
4
|
+
* Date coercion validator that attempts to convert values to dates
|
|
5
|
+
*/
|
|
6
|
+
export declare class VldCoerceDate extends VldDate {
|
|
7
|
+
/**
|
|
8
|
+
* Create a new coerce date validator
|
|
9
|
+
*/
|
|
10
|
+
static create(): VldCoerceDate;
|
|
11
|
+
/**
|
|
12
|
+
* Parse and coerce a value to date
|
|
13
|
+
*/
|
|
14
|
+
parse(value: unknown): Date;
|
|
15
|
+
/**
|
|
16
|
+
* Safely parse and coerce a value to date
|
|
17
|
+
*/
|
|
18
|
+
safeParse(value: unknown): ParseResult<Date>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=date.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/coercion/date.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD;;GAEG;AACH,qBAAa,aAAc,SAAQ,OAAO;IACxC;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,aAAa;IAI9B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IA0B3B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;CAO7C"}
|