@oxog/vld 2.1.0 → 2.2.5
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 +87 -0
- package/README.md +1296 -1235
- package/dist/chunks/errors-core-Cqi4-9ew.js +1 -0
- package/dist/chunks/index-CkbfQQ4n.js +1 -0
- package/dist/chunks/index-yjpbvFgw.js +1 -0
- package/dist/chunks/ip-validation-g5LWgy9t.js +1 -0
- package/dist/chunks/security-Dy24T8N7.js +1 -0
- package/dist/cjs/chunks/errors-core-DKPohm9I.cjs +1 -0
- package/dist/cjs/chunks/index-BEV9nG0N.cjs +1 -0
- package/dist/cjs/chunks/index-ZjHAxYdA.cjs +1 -0
- package/dist/cjs/chunks/ip-validation-BZqPamPC.cjs +1 -0
- package/dist/cjs/chunks/security-aXZVI7qW.cjs +1 -0
- package/dist/cjs/cli/bin.cjs +1 -505
- package/dist/cjs/cli/index.cjs +1 -209
- package/dist/cjs/codecs/index.cjs +1 -45
- package/dist/cjs/coercion/index.cjs +1 -588
- package/dist/cjs/compat/emitter.cjs +1 -184
- package/dist/cjs/compat/result.cjs +1 -189
- package/dist/cjs/errors.cjs +1 -180
- package/dist/cjs/index.cjs +1 -1894
- package/dist/cjs/kernel.cjs +1 -415
- package/dist/cjs/locales/af.cjs +1 -108
- package/dist/cjs/locales/ar.cjs +1 -108
- package/dist/cjs/locales/bn.cjs +1 -108
- package/dist/cjs/locales/da.cjs +1 -108
- package/dist/cjs/locales/de.cjs +1 -108
- package/dist/cjs/locales/en.cjs +1 -108
- package/dist/cjs/locales/es-MX.cjs +1 -107
- package/dist/cjs/locales/es.cjs +1 -96
- package/dist/cjs/locales/fi.cjs +1 -108
- package/dist/cjs/locales/fr.cjs +1 -96
- package/dist/cjs/locales/hi.cjs +1 -108
- package/dist/cjs/locales/id.cjs +1 -108
- package/dist/cjs/locales/index.cjs +1 -43
- package/dist/cjs/locales/it.cjs +1 -108
- package/dist/cjs/locales/ja.cjs +1 -108
- package/dist/cjs/locales/ko.cjs +1 -108
- package/dist/cjs/locales/lazy.cjs +1 -188
- package/dist/cjs/locales/nl.cjs +1 -108
- package/dist/cjs/locales/no.cjs +1 -108
- package/dist/cjs/locales/pl.cjs +1 -108
- package/dist/cjs/locales/pt-BR.cjs +1 -108
- package/dist/cjs/locales/pt.cjs +1 -108
- package/dist/cjs/locales/ru.cjs +1 -108
- package/dist/cjs/locales/runtime.cjs +1 -51
- package/dist/cjs/locales/sv.cjs +1 -108
- package/dist/cjs/locales/sw.cjs +1 -108
- package/dist/cjs/locales/th.cjs +1 -108
- package/dist/cjs/locales/tr.cjs +1 -108
- package/dist/cjs/locales/vi.cjs +1 -108
- package/dist/cjs/locales/zh.cjs +1 -108
- package/dist/cjs/mini.cjs +1 -242
- package/dist/cjs/pigment.cjs +1 -207
- package/dist/cjs/plugins/index.cjs +1 -12
- package/dist/cjs/registry.cjs +1 -37
- package/dist/cjs/v3/index.cjs +1 -425
- package/dist/cjs/v4/core/index.cjs +1 -894
- package/dist/cjs/v4/index.cjs +1 -425
- package/dist/cjs/v4/locales/index.cjs +1 -130
- package/dist/cjs/v4/mini/index.cjs +1 -509
- package/dist/cjs/v4-mini/index.cjs +1 -532
- package/dist/cjs/validators/any.cjs +1 -40
- package/dist/cjs/validators/array.cjs +1 -283
- package/dist/cjs/validators/base.cjs +1 -887
- package/dist/cjs/validators/base64.cjs +1 -73
- package/dist/cjs/validators/bigint.cjs +1 -232
- package/dist/cjs/validators/boolean.cjs +1 -146
- package/dist/cjs/validators/codec.cjs +1 -205
- package/dist/cjs/validators/custom.cjs +1 -71
- package/dist/cjs/validators/date.cjs +1 -278
- package/dist/cjs/validators/discriminated-union.cjs +1 -130
- package/dist/cjs/validators/enum.cjs +1 -154
- package/dist/cjs/validators/file.cjs +1 -130
- package/dist/cjs/validators/function.cjs +1 -63
- package/dist/cjs/validators/hex.cjs +1 -70
- package/dist/cjs/validators/index.cjs +1 -123
- package/dist/cjs/validators/intersection.cjs +1 -120
- package/dist/cjs/validators/json.cjs +1 -70
- package/dist/cjs/validators/lazy.cjs +1 -53
- package/dist/cjs/validators/literal.cjs +1 -64
- package/dist/cjs/validators/map.cjs +1 -218
- package/dist/cjs/validators/nan.cjs +1 -41
- package/dist/cjs/validators/never.cjs +1 -36
- package/dist/cjs/validators/null.cjs +1 -43
- package/dist/cjs/validators/number.cjs +1 -427
- package/dist/cjs/validators/object.cjs +1 -868
- package/dist/cjs/validators/promise.cjs +1 -115
- package/dist/cjs/validators/record.cjs +1 -262
- package/dist/cjs/validators/set.cjs +1 -203
- package/dist/cjs/validators/string-bool.cjs +1 -124
- package/dist/cjs/validators/string-formats.cjs +1 -168
- package/dist/cjs/validators/string.cjs +1 -12
- package/dist/cjs/validators/symbol.cjs +1 -62
- package/dist/cjs/validators/template-literal.cjs +1 -108
- package/dist/cjs/validators/tuple.cjs +1 -187
- package/dist/cjs/validators/uint8array.cjs +1 -106
- package/dist/cjs/validators/undefined.cjs +1 -43
- package/dist/cjs/validators/union.cjs +1 -191
- package/dist/cjs/validators/unknown.cjs +1 -40
- package/dist/cjs/validators/void.cjs +1 -48
- package/dist/cjs/validators/xor.cjs +1 -69
- package/dist/cli/bin.js +1 -406
- package/dist/cli/index.js +1 -205
- package/dist/codecs/index.js +1 -11
- package/dist/coercion/index.js +1 -579
- package/dist/compat/emitter.js +1 -180
- package/dist/compat/result.js +1 -170
- package/dist/errors-core.d.ts +20 -1
- package/dist/errors.js +1 -171
- package/dist/index.d.ts +248 -357
- package/dist/index.js +1 -1534
- package/dist/kernel.js +1 -409
- package/dist/locales/af.js +1 -106
- package/dist/locales/ar.js +1 -106
- package/dist/locales/bn.js +1 -106
- package/dist/locales/da.js +1 -106
- package/dist/locales/de.js +1 -106
- package/dist/locales/en.js +1 -106
- package/dist/locales/es-MX.js +1 -105
- package/dist/locales/es.js +1 -94
- package/dist/locales/fi.js +1 -106
- package/dist/locales/fr.js +1 -94
- package/dist/locales/hi.js +1 -106
- package/dist/locales/id.js +1 -106
- package/dist/locales/index.js +1 -29
- package/dist/locales/it.js +1 -106
- package/dist/locales/ja.js +1 -106
- package/dist/locales/ko.js +1 -106
- package/dist/locales/lazy.js +1 -177
- package/dist/locales/nl.js +1 -106
- package/dist/locales/no.js +1 -106
- package/dist/locales/pl.js +1 -106
- package/dist/locales/pt-BR.js +1 -106
- package/dist/locales/pt.js +1 -106
- package/dist/locales/ru.js +1 -106
- package/dist/locales/runtime.js +1 -41
- package/dist/locales/sv.js +1 -106
- package/dist/locales/sw.js +1 -106
- package/dist/locales/th.js +1 -106
- package/dist/locales/tr.js +1 -106
- package/dist/locales/vi.js +1 -106
- package/dist/locales/zh.js +1 -106
- package/dist/mini.d.ts +3 -3
- package/dist/mini.js +1 -156
- package/dist/pigment.js +1 -180
- package/dist/plugins/index.js +1 -1
- package/dist/registry.js +1 -34
- package/dist/utils/json-schema.d.ts +10 -1
- package/dist/v3/index.js +1 -46
- package/dist/v4/core/index.d.ts +28 -16
- package/dist/v4/core/index.js +1 -277
- package/dist/v4/index.js +1 -50
- package/dist/v4/locales/index.d.ts +4 -0
- package/dist/v4/locales/index.js +1 -77
- package/dist/v4/mini/index.js +1 -47
- package/dist/v4-mini/index.d.ts +1 -1
- package/dist/v4-mini/index.js +1 -75
- package/dist/validators/any.js +1 -37
- package/dist/validators/array.d.ts +7 -0
- package/dist/validators/array.js +1 -279
- package/dist/validators/base.d.ts +63 -8
- package/dist/validators/base.js +1 -868
- package/dist/validators/base64.js +1 -68
- package/dist/validators/bigint.js +1 -228
- package/dist/validators/boolean.js +1 -142
- package/dist/validators/codec.js +1 -200
- package/dist/validators/custom.js +1 -67
- package/dist/validators/date.js +1 -274
- package/dist/validators/discriminated-union.d.ts +2 -2
- package/dist/validators/discriminated-union.js +1 -123
- package/dist/validators/enum.js +1 -150
- package/dist/validators/file.js +1 -125
- package/dist/validators/function.js +1 -58
- package/dist/validators/hex.js +1 -65
- package/dist/validators/index.d.ts +1 -1
- package/dist/validators/index.js +1 -35
- package/dist/validators/intersection.js +1 -116
- package/dist/validators/json.js +1 -66
- package/dist/validators/lazy.js +1 -50
- package/dist/validators/literal.d.ts +7 -3
- package/dist/validators/literal.js +1 -60
- package/dist/validators/map.js +1 -214
- package/dist/validators/nan.js +1 -38
- package/dist/validators/never.js +1 -32
- package/dist/validators/null.js +1 -40
- package/dist/validators/number.d.ts +20 -1
- package/dist/validators/number.js +1 -423
- package/dist/validators/object.d.ts +12 -2
- package/dist/validators/object.js +1 -864
- package/dist/validators/promise.js +1 -111
- package/dist/validators/record.d.ts +11 -8
- package/dist/validators/record.js +1 -258
- package/dist/validators/set.js +1 -199
- package/dist/validators/string-bool.js +1 -120
- package/dist/validators/string-formats.d.ts +58 -62
- package/dist/validators/string-formats.js +1 -135
- package/dist/validators/string.d.ts +47 -10
- package/dist/validators/string.js +1 -4
- package/dist/validators/symbol.js +1 -58
- package/dist/validators/template-literal.js +1 -103
- package/dist/validators/tuple.d.ts +17 -13
- package/dist/validators/tuple.js +1 -183
- package/dist/validators/uint8array.js +1 -101
- package/dist/validators/undefined.js +1 -40
- package/dist/validators/union.js +1 -187
- package/dist/validators/unknown.js +1 -37
- package/dist/validators/void.js +1 -44
- package/dist/validators/xor.d.ts +2 -2
- package/dist/validators/xor.js +1 -66
- package/package.json +239 -238
- package/dist/chunks/errors-core-BeiFUtZM.js +0 -81
- package/dist/chunks/index-0R2ntSud.js +0 -508
- package/dist/chunks/index-BvH403Yy.js +0 -88
- package/dist/chunks/security-B0Pd_vSY.js +0 -35
- package/dist/chunks/string-BJRQod3t.js +0 -530
- package/dist/cjs/chunks/errors-core-DWxLFs2f.cjs +0 -83
- package/dist/cjs/chunks/index-BkI37108.cjs +0 -538
- package/dist/cjs/chunks/index-Cc3bjUMX.cjs +0 -91
- package/dist/cjs/chunks/security-Dc3Jh13T.cjs +0 -37
- package/dist/cjs/chunks/string-BKZrc4hs.cjs +0 -533
|
@@ -1,588 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var validators_string = require('../chunks/string-BKZrc4hs.cjs');
|
|
4
|
-
var validators_base = require('../validators/base.cjs');
|
|
5
|
-
var locales_runtime = require('../locales/runtime.cjs');
|
|
6
|
-
var validators_number = require('../validators/number.cjs');
|
|
7
|
-
var validators_boolean = require('../validators/boolean.cjs');
|
|
8
|
-
var validators_date = require('../validators/date.cjs');
|
|
9
|
-
var validators_bigint = require('../validators/bigint.cjs');
|
|
10
|
-
require('../chunks/errors-core-DWxLFs2f.cjs');
|
|
11
|
-
require('../registry.cjs');
|
|
12
|
-
require('../locales/en.cjs');
|
|
13
|
-
|
|
14
|
-
// BUG-NEW-001 FIX: IPv6 validation moved to shared utility (src/utils/ip-validation.ts)
|
|
15
|
-
// to eliminate code duplication between string.ts and coercion/string.ts
|
|
16
|
-
/**
|
|
17
|
-
* String coercion validator that attempts to convert values to strings
|
|
18
|
-
*/
|
|
19
|
-
class VldCoerceString extends validators_string.VldString {
|
|
20
|
-
constructor(config) {
|
|
21
|
-
// Pass COERCE_STRING type to base class instead of STRING
|
|
22
|
-
super({ ...config, validatorType: validators_base.VLD_VALIDATOR_TYPES.COERCE_STRING });
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Create a new coerce string validator
|
|
26
|
-
*/
|
|
27
|
-
static create() {
|
|
28
|
-
return new VldCoerceString();
|
|
29
|
-
}
|
|
30
|
-
// Override all chain methods to return VldCoerceString instances
|
|
31
|
-
min(length, message) {
|
|
32
|
-
return new VldCoerceString({
|
|
33
|
-
checks: [...this.config.checks, (v) => v.length >= length],
|
|
34
|
-
transforms: this.config.transforms,
|
|
35
|
-
errorMessage: message || locales_runtime.getMessages().stringMin(length)
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
max(length, message) {
|
|
39
|
-
return new VldCoerceString({
|
|
40
|
-
checks: [...this.config.checks, (v) => v.length <= length],
|
|
41
|
-
transforms: this.config.transforms,
|
|
42
|
-
errorMessage: message || locales_runtime.getMessages().stringMax(length)
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
length(length, message) {
|
|
46
|
-
return new VldCoerceString({
|
|
47
|
-
checks: [...this.config.checks, (v) => v.length === length],
|
|
48
|
-
transforms: this.config.transforms,
|
|
49
|
-
errorMessage: message || locales_runtime.getMessages().stringLength(length)
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
email(message) {
|
|
53
|
-
// BUG-007 FIX: Use simpler, ReDoS-safe regex (consistent with VldString)
|
|
54
|
-
const FAST_EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
55
|
-
return new VldCoerceString({
|
|
56
|
-
checks: [...this.config.checks, (v) => FAST_EMAIL_REGEX.test(v)],
|
|
57
|
-
transforms: this.config.transforms,
|
|
58
|
-
errorMessage: message || locales_runtime.getMessages().stringEmail
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
url(message) {
|
|
62
|
-
return new VldCoerceString({
|
|
63
|
-
checks: [...this.config.checks, (v) => /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/.test(v)],
|
|
64
|
-
transforms: this.config.transforms,
|
|
65
|
-
errorMessage: message || locales_runtime.getMessages().stringUrl
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
uuid(message) {
|
|
69
|
-
return new VldCoerceString({
|
|
70
|
-
checks: [...this.config.checks, (v) => /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(v)],
|
|
71
|
-
transforms: this.config.transforms,
|
|
72
|
-
errorMessage: message || locales_runtime.getMessages().stringUuid
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
regex(pattern, message) {
|
|
76
|
-
return new VldCoerceString({
|
|
77
|
-
checks: [...this.config.checks, (v) => pattern.test(v)],
|
|
78
|
-
transforms: this.config.transforms,
|
|
79
|
-
errorMessage: message || locales_runtime.getMessages().stringRegex
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
trim() {
|
|
83
|
-
return new VldCoerceString({
|
|
84
|
-
checks: this.config.checks,
|
|
85
|
-
transforms: [...this.config.transforms, (v) => v.trim()],
|
|
86
|
-
errorMessage: this.config.errorMessage
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
toLowerCase() {
|
|
90
|
-
return new VldCoerceString({
|
|
91
|
-
checks: this.config.checks,
|
|
92
|
-
transforms: [...this.config.transforms, (v) => v.toLowerCase()],
|
|
93
|
-
errorMessage: this.config.errorMessage
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
toUpperCase() {
|
|
97
|
-
return new VldCoerceString({
|
|
98
|
-
checks: this.config.checks,
|
|
99
|
-
transforms: [...this.config.transforms, (v) => v.toUpperCase()],
|
|
100
|
-
errorMessage: this.config.errorMessage
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
startsWith(str, message) {
|
|
104
|
-
return new VldCoerceString({
|
|
105
|
-
checks: [...this.config.checks, (v) => v.startsWith(str)],
|
|
106
|
-
transforms: this.config.transforms,
|
|
107
|
-
errorMessage: message || locales_runtime.getMessages().stringStartsWith(str)
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
endsWith(str, message) {
|
|
111
|
-
return new VldCoerceString({
|
|
112
|
-
checks: [...this.config.checks, (v) => v.endsWith(str)],
|
|
113
|
-
transforms: this.config.transforms,
|
|
114
|
-
errorMessage: message || locales_runtime.getMessages().stringEndsWith(str)
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
includes(str, message) {
|
|
118
|
-
return new VldCoerceString({
|
|
119
|
-
checks: [...this.config.checks, (v) => v.includes(str)],
|
|
120
|
-
transforms: this.config.transforms,
|
|
121
|
-
errorMessage: message || locales_runtime.getMessages().stringIncludes(str)
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
ip(message) {
|
|
125
|
-
const ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
126
|
-
return new VldCoerceString({
|
|
127
|
-
checks: [...this.config.checks, (v) => {
|
|
128
|
-
// Prevent ReDoS: Check length before validation
|
|
129
|
-
if (v.length > 100)
|
|
130
|
-
return false;
|
|
131
|
-
return ipv4.test(v) || validators_string.isValidIPv6(v);
|
|
132
|
-
}],
|
|
133
|
-
transforms: this.config.transforms,
|
|
134
|
-
errorMessage: message || locales_runtime.getMessages().stringIp
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
ipv4(message) {
|
|
138
|
-
return new VldCoerceString({
|
|
139
|
-
checks: [...this.config.checks, (v) => /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(v)],
|
|
140
|
-
transforms: this.config.transforms,
|
|
141
|
-
errorMessage: message || locales_runtime.getMessages().stringIpv4
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
ipv6(message) {
|
|
145
|
-
return new VldCoerceString({
|
|
146
|
-
checks: [...this.config.checks, (v) => {
|
|
147
|
-
// Use safe IPv6 validation to prevent ReDoS attacks
|
|
148
|
-
return validators_string.isValidIPv6(v);
|
|
149
|
-
}],
|
|
150
|
-
transforms: this.config.transforms,
|
|
151
|
-
errorMessage: message || locales_runtime.getMessages().stringIpv6
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
nonempty(message) {
|
|
155
|
-
return new VldCoerceString({
|
|
156
|
-
checks: [...this.config.checks, (v) => v.length > 0],
|
|
157
|
-
transforms: this.config.transforms,
|
|
158
|
-
errorMessage: message || locales_runtime.getMessages().stringEmpty
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Parse and coerce a value to string
|
|
163
|
-
*/
|
|
164
|
-
parse(value) {
|
|
165
|
-
// If it's already a string, apply security controls first
|
|
166
|
-
if (typeof value === 'string') {
|
|
167
|
-
// Enforce length limits to prevent DoS
|
|
168
|
-
if (value.length > 1000000) {
|
|
169
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('string', value));
|
|
170
|
-
}
|
|
171
|
-
// Sanitize control characters for security
|
|
172
|
-
// Remove characters that could cause issues in logs, databases, or UI
|
|
173
|
-
// eslint-disable-next-line no-control-regex -- Intentional removal of control characters for security
|
|
174
|
-
const sanitized = value.replace(/[\x00-\x1F\x7F]/g, '');
|
|
175
|
-
// Use parent validation with sanitized string
|
|
176
|
-
return super.parse(sanitized);
|
|
177
|
-
}
|
|
178
|
-
// Safe type coercion with security measures
|
|
179
|
-
let coerced;
|
|
180
|
-
if (typeof value === 'number') {
|
|
181
|
-
// Numbers: safe conversion
|
|
182
|
-
coerced = String(value);
|
|
183
|
-
}
|
|
184
|
-
else if (typeof value === 'boolean') {
|
|
185
|
-
// Booleans: safe conversion
|
|
186
|
-
coerced = value ? 'true' : 'false';
|
|
187
|
-
}
|
|
188
|
-
else if (typeof value === 'bigint') {
|
|
189
|
-
// BigInt: safe conversion
|
|
190
|
-
coerced = value.toString();
|
|
191
|
-
}
|
|
192
|
-
else if (typeof value === 'symbol') {
|
|
193
|
-
// Symbols: String() matches Zod coercion semantics without throwing.
|
|
194
|
-
coerced = String(value);
|
|
195
|
-
}
|
|
196
|
-
else if (typeof value === 'object') {
|
|
197
|
-
// Objects: only allow specific safe object types
|
|
198
|
-
if (value instanceof Date) {
|
|
199
|
-
// Dates: convert to ISO string
|
|
200
|
-
coerced = value.toISOString();
|
|
201
|
-
}
|
|
202
|
-
else if (Array.isArray(value)) {
|
|
203
|
-
// Arrays: convert to comma-separated string (original behavior)
|
|
204
|
-
coerced = value.join(',');
|
|
205
|
-
}
|
|
206
|
-
else if (value instanceof RegExp) {
|
|
207
|
-
// RegExp: convert to string representation
|
|
208
|
-
coerced = value.toString();
|
|
209
|
-
}
|
|
210
|
-
else if (value instanceof Error) {
|
|
211
|
-
// Errors: use message property (safe)
|
|
212
|
-
coerced = value.message || value.toString();
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
// For plain objects, use the original String() behavior for backwards compatibility
|
|
216
|
-
coerced = String(value);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
// Fallback for other types
|
|
221
|
-
coerced = String(value);
|
|
222
|
-
}
|
|
223
|
-
// Apply security controls
|
|
224
|
-
// Enforce length limits to prevent DoS
|
|
225
|
-
if (coerced.length > 1000000) {
|
|
226
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('string', value));
|
|
227
|
-
}
|
|
228
|
-
// Sanitize control characters for security
|
|
229
|
-
// Remove characters that could cause issues in logs, databases, or UI
|
|
230
|
-
// eslint-disable-next-line no-control-regex -- Intentional removal of control characters for security
|
|
231
|
-
const sanitized = coerced.replace(/[\x00-\x1F\x7F]/g, '');
|
|
232
|
-
// Use parent validation with sanitized value
|
|
233
|
-
return super.parse(sanitized);
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Safely parse and coerce a value to string
|
|
237
|
-
*/
|
|
238
|
-
safeParse(value) {
|
|
239
|
-
try {
|
|
240
|
-
return { success: true, data: this.parse(value) };
|
|
241
|
-
}
|
|
242
|
-
catch (error) {
|
|
243
|
-
return { success: false, error: error };
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Number coercion validator that attempts to convert values to numbers
|
|
250
|
-
*/
|
|
251
|
-
class VldCoerceNumber extends validators_number.VldNumber {
|
|
252
|
-
constructor(config) {
|
|
253
|
-
super({ ...config, validatorType: validators_base.VLD_VALIDATOR_TYPES.COERCE_NUMBER });
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Create a new coerce number validator
|
|
257
|
-
*/
|
|
258
|
-
static create() {
|
|
259
|
-
return new VldCoerceNumber();
|
|
260
|
-
}
|
|
261
|
-
// Override all chain methods to return VldCoerceNumber instances
|
|
262
|
-
min(value, message) {
|
|
263
|
-
return new VldCoerceNumber({
|
|
264
|
-
checks: [...this.config.checks, (v) => v >= value],
|
|
265
|
-
errorMessage: message || locales_runtime.getMessages().numberMin(value)
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
max(value, message) {
|
|
269
|
-
return new VldCoerceNumber({
|
|
270
|
-
checks: [...this.config.checks, (v) => v <= value],
|
|
271
|
-
errorMessage: message || locales_runtime.getMessages().numberMax(value)
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
int(message) {
|
|
275
|
-
return new VldCoerceNumber({
|
|
276
|
-
checks: [...this.config.checks, (v) => Number.isInteger(v)],
|
|
277
|
-
errorMessage: message || locales_runtime.getMessages().numberInt
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
positive(message) {
|
|
281
|
-
return new VldCoerceNumber({
|
|
282
|
-
checks: [...this.config.checks, (v) => v > 0],
|
|
283
|
-
errorMessage: message || locales_runtime.getMessages().numberPositive
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
negative(message) {
|
|
287
|
-
return new VldCoerceNumber({
|
|
288
|
-
checks: [...this.config.checks, (v) => v < 0],
|
|
289
|
-
errorMessage: message || locales_runtime.getMessages().numberNegative
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
nonnegative(message) {
|
|
293
|
-
return new VldCoerceNumber({
|
|
294
|
-
checks: [...this.config.checks, (v) => v >= 0],
|
|
295
|
-
errorMessage: message || locales_runtime.getMessages().numberNonnegative
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
nonpositive(message) {
|
|
299
|
-
return new VldCoerceNumber({
|
|
300
|
-
checks: [...this.config.checks, (v) => v <= 0],
|
|
301
|
-
errorMessage: message || locales_runtime.getMessages().numberNonpositive
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
finite(message) {
|
|
305
|
-
return new VldCoerceNumber({
|
|
306
|
-
checks: [...this.config.checks, (v) => Number.isFinite(v)],
|
|
307
|
-
errorMessage: message || locales_runtime.getMessages().numberFinite
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
safe(message) {
|
|
311
|
-
return new VldCoerceNumber({
|
|
312
|
-
checks: [...this.config.checks, (v) => Number.isSafeInteger(v)],
|
|
313
|
-
errorMessage: message || locales_runtime.getMessages().numberSafe
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
multipleOf(value, message) {
|
|
317
|
-
return new VldCoerceNumber({
|
|
318
|
-
checks: [...this.config.checks, (v) => {
|
|
319
|
-
// BUG-004 FIX: Use epsilon comparison for floating point precision (consistent with VldNumber)
|
|
320
|
-
const remainder = Math.abs(v % value);
|
|
321
|
-
return remainder < Number.EPSILON || Math.abs(remainder - Math.abs(value)) < Number.EPSILON;
|
|
322
|
-
}],
|
|
323
|
-
errorMessage: message || locales_runtime.getMessages().numberMultipleOf(value)
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
step(value, message) {
|
|
327
|
-
return this.multipleOf(value, message);
|
|
328
|
-
}
|
|
329
|
-
between(min, max, message) {
|
|
330
|
-
return new VldCoerceNumber({
|
|
331
|
-
checks: [...this.config.checks, (v) => v >= min && v <= max],
|
|
332
|
-
errorMessage: message || `Number must be between ${min} and ${max}`
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
even(message) {
|
|
336
|
-
// BUG-NEW-007 FIX: Add integer check before even/odd validation
|
|
337
|
-
return new VldCoerceNumber({
|
|
338
|
-
checks: [...this.config.checks, (v) => {
|
|
339
|
-
if (!Number.isInteger(v)) {
|
|
340
|
-
return false;
|
|
341
|
-
}
|
|
342
|
-
return v % 2 === 0;
|
|
343
|
-
}],
|
|
344
|
-
errorMessage: message || 'Number must be even'
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
odd(message) {
|
|
348
|
-
// BUG-NEW-007 FIX: Add integer check before even/odd validation
|
|
349
|
-
return new VldCoerceNumber({
|
|
350
|
-
checks: [...this.config.checks, (v) => {
|
|
351
|
-
if (!Number.isInteger(v)) {
|
|
352
|
-
return false;
|
|
353
|
-
}
|
|
354
|
-
return v % 2 !== 0;
|
|
355
|
-
}],
|
|
356
|
-
errorMessage: message || 'Number must be odd'
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Parse and coerce a value to number
|
|
361
|
-
*/
|
|
362
|
-
parse(value) {
|
|
363
|
-
// If it's already a valid number, use parent validation directly
|
|
364
|
-
if (typeof value === 'number' && !isNaN(value)) {
|
|
365
|
-
if (this.config.checks.length === 0) {
|
|
366
|
-
return value;
|
|
367
|
-
}
|
|
368
|
-
return super.parse(value);
|
|
369
|
-
}
|
|
370
|
-
let coerced;
|
|
371
|
-
try {
|
|
372
|
-
coerced = Number(value);
|
|
373
|
-
}
|
|
374
|
-
catch {
|
|
375
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('number', value));
|
|
376
|
-
}
|
|
377
|
-
if (isNaN(coerced)) {
|
|
378
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('number', value));
|
|
379
|
-
}
|
|
380
|
-
if (this.config.checks.length === 0) {
|
|
381
|
-
return coerced;
|
|
382
|
-
}
|
|
383
|
-
// Use parent validation with coerced value
|
|
384
|
-
return super.parse(coerced);
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Safely parse and coerce a value to number
|
|
388
|
-
*/
|
|
389
|
-
safeParse(value) {
|
|
390
|
-
try {
|
|
391
|
-
return { success: true, data: this.parse(value) };
|
|
392
|
-
}
|
|
393
|
-
catch (error) {
|
|
394
|
-
return { success: false, error: error };
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Boolean coercion validator that attempts to convert values to booleans
|
|
401
|
-
*/
|
|
402
|
-
class VldCoerceBoolean extends validators_boolean.VldBoolean {
|
|
403
|
-
/**
|
|
404
|
-
* Create a new coerce boolean validator
|
|
405
|
-
*/
|
|
406
|
-
static create() {
|
|
407
|
-
return new VldCoerceBoolean();
|
|
408
|
-
}
|
|
409
|
-
constructor() {
|
|
410
|
-
super(undefined, validators_base.VLD_VALIDATOR_TYPES.COERCE_BOOLEAN);
|
|
411
|
-
}
|
|
412
|
-
/**
|
|
413
|
-
* Parse and coerce a value to boolean
|
|
414
|
-
*/
|
|
415
|
-
parse(value) {
|
|
416
|
-
return Boolean(value);
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Safely parse and coerce a value to boolean
|
|
420
|
-
*/
|
|
421
|
-
safeParse(value) {
|
|
422
|
-
try {
|
|
423
|
-
return { success: true, data: this.parse(value) };
|
|
424
|
-
}
|
|
425
|
-
catch (error) {
|
|
426
|
-
return { success: false, error: error };
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
/**
|
|
432
|
-
* Date coercion validator that attempts to convert values to dates
|
|
433
|
-
*/
|
|
434
|
-
class VldCoerceDate extends validators_date.VldDate {
|
|
435
|
-
/**
|
|
436
|
-
* Create a new coerce date validator
|
|
437
|
-
*/
|
|
438
|
-
static create() {
|
|
439
|
-
return new VldCoerceDate();
|
|
440
|
-
}
|
|
441
|
-
constructor() {
|
|
442
|
-
super({ validatorType: validators_base.VLD_VALIDATOR_TYPES.COERCE_DATE });
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Parse and coerce a value to date
|
|
446
|
-
*/
|
|
447
|
-
parse(value) {
|
|
448
|
-
try {
|
|
449
|
-
if (value instanceof Date) {
|
|
450
|
-
return super.parse(value);
|
|
451
|
-
}
|
|
452
|
-
const date = new Date(value);
|
|
453
|
-
if (isNaN(date.getTime())) {
|
|
454
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('date', value));
|
|
455
|
-
}
|
|
456
|
-
return super.parse(date);
|
|
457
|
-
}
|
|
458
|
-
catch (error) {
|
|
459
|
-
if (error.message.includes('Cannot coerce')) {
|
|
460
|
-
throw error;
|
|
461
|
-
}
|
|
462
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('date', value));
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
/**
|
|
466
|
-
* Safely parse and coerce a value to date
|
|
467
|
-
*/
|
|
468
|
-
safeParse(value) {
|
|
469
|
-
try {
|
|
470
|
-
return { success: true, data: this.parse(value) };
|
|
471
|
-
}
|
|
472
|
-
catch (error) {
|
|
473
|
-
return { success: false, error: error };
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
/**
|
|
479
|
-
* BigInt coercion validator that attempts to convert values to bigint
|
|
480
|
-
*/
|
|
481
|
-
class VldCoerceBigInt extends validators_bigint.VldBigInt {
|
|
482
|
-
constructor(config) {
|
|
483
|
-
super({ ...config, validatorType: validators_base.VLD_VALIDATOR_TYPES.COERCE_BIGINT });
|
|
484
|
-
}
|
|
485
|
-
/**
|
|
486
|
-
* Create a new coerce bigint validator
|
|
487
|
-
*/
|
|
488
|
-
static create() {
|
|
489
|
-
return new VldCoerceBigInt();
|
|
490
|
-
}
|
|
491
|
-
// Override all chain methods to return VldCoerceBigInt instances
|
|
492
|
-
min(value, message) {
|
|
493
|
-
return new VldCoerceBigInt({
|
|
494
|
-
checks: [...this.config.checks, (v) => v >= value],
|
|
495
|
-
errorMessage: message || `BigInt must be at least ${value}`
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
max(value, message) {
|
|
499
|
-
return new VldCoerceBigInt({
|
|
500
|
-
checks: [...this.config.checks, (v) => v <= value],
|
|
501
|
-
errorMessage: message || `BigInt must be at most ${value}`
|
|
502
|
-
});
|
|
503
|
-
}
|
|
504
|
-
positive(message) {
|
|
505
|
-
return new VldCoerceBigInt({
|
|
506
|
-
checks: [...this.config.checks, (v) => v > 0n],
|
|
507
|
-
errorMessage: message || 'BigInt must be positive'
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
negative(message) {
|
|
511
|
-
return new VldCoerceBigInt({
|
|
512
|
-
checks: [...this.config.checks, (v) => v < 0n],
|
|
513
|
-
errorMessage: message || 'BigInt must be negative'
|
|
514
|
-
});
|
|
515
|
-
}
|
|
516
|
-
nonnegative(message) {
|
|
517
|
-
return new VldCoerceBigInt({
|
|
518
|
-
checks: [...this.config.checks, (v) => v >= 0n],
|
|
519
|
-
errorMessage: message || 'BigInt must be non-negative'
|
|
520
|
-
});
|
|
521
|
-
}
|
|
522
|
-
nonpositive(message) {
|
|
523
|
-
return new VldCoerceBigInt({
|
|
524
|
-
checks: [...this.config.checks, (v) => v <= 0n],
|
|
525
|
-
errorMessage: message || 'BigInt must be non-positive'
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
/**
|
|
529
|
-
* Parse and coerce a value to bigint
|
|
530
|
-
*/
|
|
531
|
-
parse(value) {
|
|
532
|
-
// If it's already a bigint, use parent validation directly
|
|
533
|
-
if (typeof value === 'bigint') {
|
|
534
|
-
return super.parse(value);
|
|
535
|
-
}
|
|
536
|
-
// Handle string values
|
|
537
|
-
if (typeof value === 'string') {
|
|
538
|
-
const trimmed = value.trim();
|
|
539
|
-
if (trimmed === '') {
|
|
540
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('bigint', value));
|
|
541
|
-
}
|
|
542
|
-
try {
|
|
543
|
-
const coerced = BigInt(trimmed);
|
|
544
|
-
return super.parse(coerced);
|
|
545
|
-
}
|
|
546
|
-
catch {
|
|
547
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('bigint', value));
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
// Handle number values (must be integer)
|
|
551
|
-
if (typeof value === 'number') {
|
|
552
|
-
if (!Number.isInteger(value)) {
|
|
553
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('bigint', value));
|
|
554
|
-
}
|
|
555
|
-
const coerced = BigInt(value);
|
|
556
|
-
return super.parse(coerced);
|
|
557
|
-
}
|
|
558
|
-
// Handle null and undefined
|
|
559
|
-
if (value === null || value === undefined) {
|
|
560
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('bigint', value));
|
|
561
|
-
}
|
|
562
|
-
// Try to coerce other values
|
|
563
|
-
try {
|
|
564
|
-
const coerced = BigInt(value);
|
|
565
|
-
return super.parse(coerced);
|
|
566
|
-
}
|
|
567
|
-
catch {
|
|
568
|
-
throw new Error(locales_runtime.getMessages().coercionFailed('bigint', value));
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
/**
|
|
572
|
-
* Safely parse and coerce a value to bigint
|
|
573
|
-
*/
|
|
574
|
-
safeParse(value) {
|
|
575
|
-
try {
|
|
576
|
-
return { success: true, data: this.parse(value) };
|
|
577
|
-
}
|
|
578
|
-
catch (error) {
|
|
579
|
-
return { success: false, error: error };
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
exports.VldCoerceBigInt = VldCoerceBigInt;
|
|
585
|
-
exports.VldCoerceBoolean = VldCoerceBoolean;
|
|
586
|
-
exports.VldCoerceDate = VldCoerceDate;
|
|
587
|
-
exports.VldCoerceNumber = VldCoerceNumber;
|
|
588
|
-
exports.VldCoerceString = VldCoerceString;
|
|
1
|
+
"use strict";var e=require("../validators/string.cjs"),r=require("../validators/base.cjs"),s=require("../locales/runtime.cjs"),t=require("../chunks/ip-validation-BZqPamPC.cjs"),n=require("../validators/number.cjs"),c=require("../validators/boolean.cjs"),i=require("../validators/date.cjs"),o=require("../validators/bigint.cjs");require("../chunks/errors-core-DKPohm9I.cjs"),require("../registry.cjs"),require("../locales/en.cjs");class VldCoerceString extends e.VldString{constructor(e){super({...e,validatorType:r.VLD_VALIDATOR_TYPES.COERCE_STRING})}static create(){return new VldCoerceString}min(e,r){return new VldCoerceString({checks:[...this.config.checks,r=>r.length>=e],transforms:this.config.transforms,errorMessage:r||s.getMessages().stringMin(e)})}max(e,r){return new VldCoerceString({checks:[...this.config.checks,r=>r.length<=e],transforms:this.config.transforms,errorMessage:r||s.getMessages().stringMax(e)})}length(e,r){return new VldCoerceString({checks:[...this.config.checks,r=>r.length===e],transforms:this.config.transforms,errorMessage:r||s.getMessages().stringLength(e)})}email(e){const r=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return new VldCoerceString({checks:[...this.config.checks,e=>r.test(e)],transforms:this.config.transforms,errorMessage:e||s.getMessages().stringEmail})}url(e){return new VldCoerceString({checks:[...this.config.checks,e=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/.test(e)],transforms:this.config.transforms,errorMessage:e||s.getMessages().stringUrl})}uuid(e){return new VldCoerceString({checks:[...this.config.checks,e=>/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)],transforms:this.config.transforms,errorMessage:e||s.getMessages().stringUuid})}regex(e,r){return new VldCoerceString({checks:[...this.config.checks,r=>e.test(r)],transforms:this.config.transforms,errorMessage:r||s.getMessages().stringRegex})}trim(){return new VldCoerceString({checks:this.config.checks,transforms:[...this.config.transforms,e=>e.trim()],errorMessage:this.config.errorMessage})}toLowerCase(){return new VldCoerceString({checks:this.config.checks,transforms:[...this.config.transforms,e=>e.toLowerCase()],errorMessage:this.config.errorMessage})}toUpperCase(){return new VldCoerceString({checks:this.config.checks,transforms:[...this.config.transforms,e=>e.toUpperCase()],errorMessage:this.config.errorMessage})}startsWith(e,r){return new VldCoerceString({checks:[...this.config.checks,r=>r.startsWith(e)],transforms:this.config.transforms,errorMessage:r||s.getMessages().stringStartsWith(e)})}endsWith(e,r){return new VldCoerceString({checks:[...this.config.checks,r=>r.endsWith(e)],transforms:this.config.transforms,errorMessage:r||s.getMessages().stringEndsWith(e)})}includes(e,r){return new VldCoerceString({checks:[...this.config.checks,r=>r.includes(e)],transforms:this.config.transforms,errorMessage:r||s.getMessages().stringIncludes(e)})}ip(e){const r=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;return new VldCoerceString({checks:[...this.config.checks,e=>!(e.length>100)&&(r.test(e)||t.isValidIPv6(e))],transforms:this.config.transforms,errorMessage:e||s.getMessages().stringIp})}ipv4(e){return new VldCoerceString({checks:[...this.config.checks,e=>/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e)],transforms:this.config.transforms,errorMessage:e||s.getMessages().stringIpv4})}ipv6(e){return new VldCoerceString({checks:[...this.config.checks,e=>t.isValidIPv6(e)],transforms:this.config.transforms,errorMessage:e||s.getMessages().stringIpv6})}nonempty(e){return new VldCoerceString({checks:[...this.config.checks,e=>e.length>0],transforms:this.config.transforms,errorMessage:e||s.getMessages().stringEmpty})}parse(e){if("string"==typeof e){if(e.length>1e6)throw new Error(s.getMessages().coercionFailed("string",e));const r=e.replace(/[\x00-\x1F\x7F]/g,"");return super.parse(r)}let r;if(r="number"==typeof e?String(e):"boolean"==typeof e?e?"true":"false":"bigint"==typeof e?e.toString():"symbol"==typeof e?String(e):"object"==typeof e?e instanceof Date?e.toISOString():Array.isArray(e)?e.join(","):e instanceof RegExp?e.toString():e instanceof Error?e.message||e.toString():String(e):String(e),r.length>1e6)throw new Error(s.getMessages().coercionFailed("string",e));const t=r.replace(/[\x00-\x1F\x7F]/g,"");return super.parse(t)}safeParse(e){try{return{success:!0,data:this.parse(e)}}catch(e){return{success:!1,error:e}}}}class VldCoerceNumber extends n.VldNumber{constructor(e){super({...e,validatorType:r.VLD_VALIDATOR_TYPES.COERCE_NUMBER})}static create(){return new VldCoerceNumber}min(e,r){return new VldCoerceNumber({checks:[...this.config.checks,r=>r>=e],errorMessage:r||s.getMessages().numberMin(e)})}max(e,r){return new VldCoerceNumber({checks:[...this.config.checks,r=>r<=e],errorMessage:r||s.getMessages().numberMax(e)})}int(e){return new VldCoerceNumber({checks:[...this.config.checks,e=>Number.isInteger(e)],errorMessage:e||s.getMessages().numberInt})}positive(e){return new VldCoerceNumber({checks:[...this.config.checks,e=>e>0],errorMessage:e||s.getMessages().numberPositive})}negative(e){return new VldCoerceNumber({checks:[...this.config.checks,e=>e<0],errorMessage:e||s.getMessages().numberNegative})}nonnegative(e){return new VldCoerceNumber({checks:[...this.config.checks,e=>e>=0],errorMessage:e||s.getMessages().numberNonnegative})}nonpositive(e){return new VldCoerceNumber({checks:[...this.config.checks,e=>e<=0],errorMessage:e||s.getMessages().numberNonpositive})}finite(e){return new VldCoerceNumber({checks:[...this.config.checks,e=>Number.isFinite(e)],errorMessage:e||s.getMessages().numberFinite})}safe(e){return new VldCoerceNumber({checks:[...this.config.checks,e=>Number.isSafeInteger(e)],errorMessage:e||s.getMessages().numberSafe})}multipleOf(e,r){return new VldCoerceNumber({checks:[...this.config.checks,r=>{const s=Math.abs(r%e);return s<Number.EPSILON||Math.abs(s-Math.abs(e))<Number.EPSILON}],errorMessage:r||s.getMessages().numberMultipleOf(e)})}step(e,r){return this.multipleOf(e,r)}between(e,r,s){return new VldCoerceNumber({checks:[...this.config.checks,s=>s>=e&&s<=r],errorMessage:s||`Number must be between ${e} and ${r}`})}even(e){return new VldCoerceNumber({checks:[...this.config.checks,e=>!!Number.isInteger(e)&&e%2==0],errorMessage:e||"Number must be even"})}odd(e){return new VldCoerceNumber({checks:[...this.config.checks,e=>!!Number.isInteger(e)&&e%2!=0],errorMessage:e||"Number must be odd"})}parse(e){if("number"==typeof e&&!isNaN(e))return 0===this.config.checks.length?e:super.parse(e);let r;try{r=Number(e)}catch{throw new Error(s.getMessages().coercionFailed("number",e))}if(isNaN(r))throw new Error(s.getMessages().coercionFailed("number",e));return 0===this.config.checks.length?r:super.parse(r)}safeParse(e){try{return{success:!0,data:this.parse(e)}}catch(e){return{success:!1,error:e}}}}class VldCoerceBoolean extends c.VldBoolean{static create(){return new VldCoerceBoolean}constructor(){super(void 0,r.VLD_VALIDATOR_TYPES.COERCE_BOOLEAN)}parse(e){return Boolean(e)}safeParse(e){try{return{success:!0,data:this.parse(e)}}catch(e){return{success:!1,error:e}}}}class VldCoerceDate extends i.VldDate{static create(){return new VldCoerceDate}constructor(){super({validatorType:r.VLD_VALIDATOR_TYPES.COERCE_DATE})}parse(e){try{if(e instanceof Date)return super.parse(e);const r=new Date(e);if(isNaN(r.getTime()))throw new Error(s.getMessages().coercionFailed("date",e));return super.parse(r)}catch(r){if(r.message.includes("Cannot coerce"))throw r;throw new Error(s.getMessages().coercionFailed("date",e))}}safeParse(e){try{return{success:!0,data:this.parse(e)}}catch(e){return{success:!1,error:e}}}}class VldCoerceBigInt extends o.VldBigInt{constructor(e){super({...e,validatorType:r.VLD_VALIDATOR_TYPES.COERCE_BIGINT})}static create(){return new VldCoerceBigInt}min(e,r){return new VldCoerceBigInt({checks:[...this.config.checks,r=>r>=e],errorMessage:r||`BigInt must be at least ${e}`})}max(e,r){return new VldCoerceBigInt({checks:[...this.config.checks,r=>r<=e],errorMessage:r||`BigInt must be at most ${e}`})}positive(e){return new VldCoerceBigInt({checks:[...this.config.checks,e=>e>0n],errorMessage:e||"BigInt must be positive"})}negative(e){return new VldCoerceBigInt({checks:[...this.config.checks,e=>e<0n],errorMessage:e||"BigInt must be negative"})}nonnegative(e){return new VldCoerceBigInt({checks:[...this.config.checks,e=>e>=0n],errorMessage:e||"BigInt must be non-negative"})}nonpositive(e){return new VldCoerceBigInt({checks:[...this.config.checks,e=>e<=0n],errorMessage:e||"BigInt must be non-positive"})}parse(e){if("bigint"==typeof e)return super.parse(e);if("string"==typeof e){const r=e.trim();if(""===r)throw new Error(s.getMessages().coercionFailed("bigint",e));try{const e=BigInt(r);return super.parse(e)}catch{throw new Error(s.getMessages().coercionFailed("bigint",e))}}if("number"==typeof e){if(!Number.isInteger(e))throw new Error(s.getMessages().coercionFailed("bigint",e));const r=BigInt(e);return super.parse(r)}if(null==e)throw new Error(s.getMessages().coercionFailed("bigint",e));try{const r=BigInt(e);return super.parse(r)}catch{throw new Error(s.getMessages().coercionFailed("bigint",e))}}safeParse(e){try{return{success:!0,data:this.parse(e)}}catch(e){return{success:!1,error:e}}}}exports.VldCoerceBigInt=VldCoerceBigInt,exports.VldCoerceBoolean=VldCoerceBoolean,exports.VldCoerceDate=VldCoerceDate,exports.VldCoerceNumber=VldCoerceNumber,exports.VldCoerceString=VldCoerceString;
|