@oxog/vld 1.0.0 → 1.1.1
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 +117 -102
- 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/locales/af.js +3 -3
- package/dist/locales/af.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 +289 -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
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { VldDate } from '../validators/date.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Date coercion validator that attempts to convert values to dates
|
|
5
|
+
*/
|
|
6
|
+
export class VldCoerceDate extends VldDate {
|
|
7
|
+
/**
|
|
8
|
+
* Create a new coerce date validator
|
|
9
|
+
*/
|
|
10
|
+
static create() {
|
|
11
|
+
return new VldCoerceDate();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parse and coerce a value to date
|
|
15
|
+
*/
|
|
16
|
+
parse(value) {
|
|
17
|
+
try {
|
|
18
|
+
// Handle string and number values
|
|
19
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
20
|
+
const date = new Date(value);
|
|
21
|
+
if (isNaN(date.getTime())) {
|
|
22
|
+
throw new Error(getMessages().coercionFailed('date', value));
|
|
23
|
+
}
|
|
24
|
+
return super.parse(date);
|
|
25
|
+
}
|
|
26
|
+
// Handle null and undefined
|
|
27
|
+
if (value === null || value === undefined) {
|
|
28
|
+
throw new Error(getMessages().coercionFailed('date', value));
|
|
29
|
+
}
|
|
30
|
+
// Use parent validation for actual dates
|
|
31
|
+
return super.parse(value);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (error.message.includes('coercionFailed')) {
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
throw new Error(getMessages().coercionFailed('date', value));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Safely parse and coerce a value to date
|
|
42
|
+
*/
|
|
43
|
+
safeParse(value) {
|
|
44
|
+
try {
|
|
45
|
+
return { success: true, data: this.parse(value) };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return { success: false, error: error };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=date.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/coercion/date.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,OAAO;IACxC;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC;YACH,kCAAkC;YAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC3D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC/D,CAAC;gBACD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,4BAA4B;YAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;YAED,yCAAyC;YACzC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,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,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/D,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 { VldDate } from '../validators/date';\nimport { ParseResult } from '../validators/base';\nimport { getMessages } from '../locales';\n\n/**\n * Date coercion validator that attempts to convert values to dates\n */\nexport class VldCoerceDate extends VldDate {\n /**\n * Create a new coerce date validator\n */\n static create(): VldCoerceDate {\n return new VldCoerceDate();\n }\n \n /**\n * Parse and coerce a value to date\n */\n parse(value: unknown): Date {\n try {\n // Handle string and number values\n if (typeof value === 'string' || typeof value === 'number') {\n const date = new Date(value);\n if (isNaN(date.getTime())) {\n throw new Error(getMessages().coercionFailed('date', value));\n }\n return super.parse(date);\n }\n \n // Handle null and undefined\n if (value === null || value === undefined) {\n throw new Error(getMessages().coercionFailed('date', value));\n }\n \n // Use parent validation for actual dates\n return super.parse(value);\n } catch (error) {\n if ((error as Error).message.includes('coercionFailed')) {\n throw error;\n }\n throw new Error(getMessages().coercionFailed('date', value));\n }\n }\n \n /**\n * Safely parse and coerce a value to date\n */\n safeParse(value: unknown): ParseResult<Date> {\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,35 @@
|
|
|
1
|
+
import { VldNumber } from '../validators/number';
|
|
2
|
+
import { ParseResult } from '../validators/base';
|
|
3
|
+
/**
|
|
4
|
+
* Number coercion validator that attempts to convert values to numbers
|
|
5
|
+
*/
|
|
6
|
+
export declare class VldCoerceNumber extends VldNumber {
|
|
7
|
+
protected constructor(config?: any);
|
|
8
|
+
/**
|
|
9
|
+
* Create a new coerce number validator
|
|
10
|
+
*/
|
|
11
|
+
static create(): VldCoerceNumber;
|
|
12
|
+
min(value: number, message?: string): VldCoerceNumber;
|
|
13
|
+
max(value: number, message?: string): VldCoerceNumber;
|
|
14
|
+
int(message?: string): VldCoerceNumber;
|
|
15
|
+
positive(message?: string): VldCoerceNumber;
|
|
16
|
+
negative(message?: string): VldCoerceNumber;
|
|
17
|
+
nonnegative(message?: string): VldCoerceNumber;
|
|
18
|
+
nonpositive(message?: string): VldCoerceNumber;
|
|
19
|
+
finite(message?: string): VldCoerceNumber;
|
|
20
|
+
safe(message?: string): VldCoerceNumber;
|
|
21
|
+
multipleOf(value: number, message?: string): VldCoerceNumber;
|
|
22
|
+
step(value: number, message?: string): VldCoerceNumber;
|
|
23
|
+
between(min: number, max: number, message?: string): VldCoerceNumber;
|
|
24
|
+
even(message?: string): VldCoerceNumber;
|
|
25
|
+
odd(message?: string): VldCoerceNumber;
|
|
26
|
+
/**
|
|
27
|
+
* Parse and coerce a value to number
|
|
28
|
+
*/
|
|
29
|
+
parse(value: unknown): number;
|
|
30
|
+
/**
|
|
31
|
+
* Safely parse and coerce a value to number
|
|
32
|
+
*/
|
|
33
|
+
safeParse(value: unknown): ParseResult<number>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=number.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/coercion/number.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,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAOtC,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,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAOzC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAOvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAO5D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAItD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAOpE,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAOvC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAOtC;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAgC7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;CAO/C"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { VldNumber } from '../validators/number.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Number coercion validator that attempts to convert values to numbers
|
|
5
|
+
*/
|
|
6
|
+
export class VldCoerceNumber extends VldNumber {
|
|
7
|
+
constructor(config) {
|
|
8
|
+
super(config);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a new coerce number validator
|
|
12
|
+
*/
|
|
13
|
+
static create() {
|
|
14
|
+
return new VldCoerceNumber();
|
|
15
|
+
}
|
|
16
|
+
// Override all chain methods to return VldCoerceNumber instances
|
|
17
|
+
min(value, message) {
|
|
18
|
+
return new VldCoerceNumber({
|
|
19
|
+
checks: [...this.config.checks, (v) => v >= value],
|
|
20
|
+
errorMessage: message || getMessages().numberMin(value)
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
max(value, message) {
|
|
24
|
+
return new VldCoerceNumber({
|
|
25
|
+
checks: [...this.config.checks, (v) => v <= value],
|
|
26
|
+
errorMessage: message || getMessages().numberMax(value)
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
int(message) {
|
|
30
|
+
return new VldCoerceNumber({
|
|
31
|
+
checks: [...this.config.checks, (v) => Number.isInteger(v)],
|
|
32
|
+
errorMessage: message || getMessages().numberInt
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
positive(message) {
|
|
36
|
+
return new VldCoerceNumber({
|
|
37
|
+
checks: [...this.config.checks, (v) => v > 0],
|
|
38
|
+
errorMessage: message || getMessages().numberPositive
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
negative(message) {
|
|
42
|
+
return new VldCoerceNumber({
|
|
43
|
+
checks: [...this.config.checks, (v) => v < 0],
|
|
44
|
+
errorMessage: message || getMessages().numberNegative
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
nonnegative(message) {
|
|
48
|
+
return new VldCoerceNumber({
|
|
49
|
+
checks: [...this.config.checks, (v) => v >= 0],
|
|
50
|
+
errorMessage: message || getMessages().numberNonnegative
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
nonpositive(message) {
|
|
54
|
+
return new VldCoerceNumber({
|
|
55
|
+
checks: [...this.config.checks, (v) => v <= 0],
|
|
56
|
+
errorMessage: message || getMessages().numberNonpositive
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
finite(message) {
|
|
60
|
+
return new VldCoerceNumber({
|
|
61
|
+
checks: [...this.config.checks, (v) => Number.isFinite(v)],
|
|
62
|
+
errorMessage: message || getMessages().numberFinite
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
safe(message) {
|
|
66
|
+
return new VldCoerceNumber({
|
|
67
|
+
checks: [...this.config.checks, (v) => Number.isSafeInteger(v)],
|
|
68
|
+
errorMessage: message || getMessages().numberSafe
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
multipleOf(value, message) {
|
|
72
|
+
return new VldCoerceNumber({
|
|
73
|
+
checks: [...this.config.checks, (v) => v % value === 0],
|
|
74
|
+
errorMessage: message || getMessages().numberMultipleOf(value)
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
step(value, message) {
|
|
78
|
+
return this.multipleOf(value, message);
|
|
79
|
+
}
|
|
80
|
+
between(min, max, message) {
|
|
81
|
+
return new VldCoerceNumber({
|
|
82
|
+
checks: [...this.config.checks, (v) => v >= min && v <= max],
|
|
83
|
+
errorMessage: message || `Number must be between ${min} and ${max}`
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
even(message) {
|
|
87
|
+
return new VldCoerceNumber({
|
|
88
|
+
checks: [...this.config.checks, (v) => v % 2 === 0],
|
|
89
|
+
errorMessage: message || 'Number must be even'
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
odd(message) {
|
|
93
|
+
return new VldCoerceNumber({
|
|
94
|
+
checks: [...this.config.checks, (v) => v % 2 !== 0],
|
|
95
|
+
errorMessage: message || 'Number must be odd'
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Parse and coerce a value to number
|
|
100
|
+
*/
|
|
101
|
+
parse(value) {
|
|
102
|
+
// If it's already a valid number, use parent validation directly
|
|
103
|
+
if (typeof value === 'number' && !isNaN(value)) {
|
|
104
|
+
return super.parse(value);
|
|
105
|
+
}
|
|
106
|
+
let coerced;
|
|
107
|
+
if (typeof value === 'string') {
|
|
108
|
+
const trimmed = value.trim();
|
|
109
|
+
if (trimmed === '') {
|
|
110
|
+
throw new Error(getMessages().coercionFailed('number', value));
|
|
111
|
+
}
|
|
112
|
+
coerced = Number(trimmed);
|
|
113
|
+
if (isNaN(coerced)) {
|
|
114
|
+
throw new Error(getMessages().coercionFailed('number', value));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else if (typeof value === 'boolean') {
|
|
118
|
+
coerced = value ? 1 : 0;
|
|
119
|
+
}
|
|
120
|
+
else if (value === null || value === undefined) {
|
|
121
|
+
throw new Error(getMessages().coercionFailed('number', value));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
coerced = Number(value);
|
|
125
|
+
if (isNaN(coerced)) {
|
|
126
|
+
throw new Error(getMessages().coercionFailed('number', value));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Use parent validation with coerced value
|
|
130
|
+
return super.parse(coerced);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Safely parse and coerce a value to number
|
|
134
|
+
*/
|
|
135
|
+
safeParse(value) {
|
|
136
|
+
try {
|
|
137
|
+
return { success: true, data: this.parse(value) };
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
return { success: false, error: error };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/coercion/number.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldNumber } from '../validators/number';\nimport { ParseResult } from '../validators/base';\nimport { getMessages } from '../locales';\n\n/**\n * Number coercion validator that attempts to convert values to numbers\n */\nexport class VldCoerceNumber extends VldNumber {\n protected constructor(config?: any) {\n super(config);\n }\n \n /**\n * Create a new coerce number validator\n */\n static create(): VldCoerceNumber {\n return new VldCoerceNumber();\n }\n \n // Override all chain methods to return VldCoerceNumber instances\n min(value: number, message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v >= value],\n errorMessage: message || getMessages().numberMin(value)\n });\n }\n \n max(value: number, message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v <= value],\n errorMessage: message || getMessages().numberMax(value)\n });\n }\n \n int(message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => Number.isInteger(v)],\n errorMessage: message || getMessages().numberInt\n });\n }\n \n positive(message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v > 0],\n errorMessage: message || getMessages().numberPositive\n });\n }\n \n negative(message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v < 0],\n errorMessage: message || getMessages().numberNegative\n });\n }\n \n nonnegative(message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v >= 0],\n errorMessage: message || getMessages().numberNonnegative\n });\n }\n \n nonpositive(message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v <= 0],\n errorMessage: message || getMessages().numberNonpositive\n });\n }\n \n finite(message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => Number.isFinite(v)],\n errorMessage: message || getMessages().numberFinite\n });\n }\n \n safe(message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => Number.isSafeInteger(v)],\n errorMessage: message || getMessages().numberSafe\n });\n }\n \n multipleOf(value: number, message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v % value === 0],\n errorMessage: message || getMessages().numberMultipleOf(value)\n });\n }\n \n step(value: number, message?: string): VldCoerceNumber {\n return this.multipleOf(value, message);\n }\n \n between(min: number, max: number, message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v >= min && v <= max],\n errorMessage: message || `Number must be between ${min} and ${max}`\n });\n }\n \n even(message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v % 2 === 0],\n errorMessage: message || 'Number must be even'\n });\n }\n \n odd(message?: string): VldCoerceNumber {\n return new VldCoerceNumber({\n checks: [...this.config.checks, (v: number) => v % 2 !== 0],\n errorMessage: message || 'Number must be odd'\n });\n }\n \n /**\n * Parse and coerce a value to number\n */\n parse(value: unknown): number {\n // If it's already a valid number, use parent validation directly\n if (typeof value === 'number' && !isNaN(value)) {\n return super.parse(value);\n }\n \n let coerced: number;\n \n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed === '') {\n throw new Error(getMessages().coercionFailed('number', value));\n }\n coerced = Number(trimmed);\n if (isNaN(coerced)) {\n throw new Error(getMessages().coercionFailed('number', value));\n }\n } else if (typeof value === 'boolean') {\n coerced = value ? 1 : 0;\n } else if (value === null || value === undefined) {\n throw new Error(getMessages().coercionFailed('number', value));\n } else {\n coerced = Number(value);\n if (isNaN(coerced)) {\n throw new Error(getMessages().coercionFailed('number', value));\n }\n }\n \n // Use parent validation with coerced value\n return super.parse(coerced);\n }\n \n /**\n * Safely parse and coerce a value to number\n */\n safeParse(value: unknown): ParseResult<number> {\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,38 @@
|
|
|
1
|
+
import { VldString } from '../validators/string';
|
|
2
|
+
import { ParseResult } from '../validators/base';
|
|
3
|
+
/**
|
|
4
|
+
* String coercion validator that attempts to convert values to strings
|
|
5
|
+
*/
|
|
6
|
+
export declare class VldCoerceString extends VldString {
|
|
7
|
+
protected constructor(config?: any);
|
|
8
|
+
/**
|
|
9
|
+
* Create a new coerce string validator
|
|
10
|
+
*/
|
|
11
|
+
static create(): VldCoerceString;
|
|
12
|
+
min(length: number, message?: string): VldCoerceString;
|
|
13
|
+
max(length: number, message?: string): VldCoerceString;
|
|
14
|
+
length(length: number, message?: string): VldCoerceString;
|
|
15
|
+
email(message?: string): VldCoerceString;
|
|
16
|
+
url(message?: string): VldCoerceString;
|
|
17
|
+
uuid(message?: string): VldCoerceString;
|
|
18
|
+
regex(pattern: RegExp, message?: string): VldCoerceString;
|
|
19
|
+
trim(): VldCoerceString;
|
|
20
|
+
toLowerCase(): VldCoerceString;
|
|
21
|
+
toUpperCase(): VldCoerceString;
|
|
22
|
+
startsWith(str: string, message?: string): VldCoerceString;
|
|
23
|
+
endsWith(str: string, message?: string): VldCoerceString;
|
|
24
|
+
includes(str: string, message?: string): VldCoerceString;
|
|
25
|
+
ip(message?: string): VldCoerceString;
|
|
26
|
+
ipv4(message?: string): VldCoerceString;
|
|
27
|
+
ipv6(message?: string): VldCoerceString;
|
|
28
|
+
nonempty(message?: string): VldCoerceString;
|
|
29
|
+
/**
|
|
30
|
+
* Parse and coerce a value to string
|
|
31
|
+
*/
|
|
32
|
+
parse(value: unknown): string;
|
|
33
|
+
/**
|
|
34
|
+
* Safely parse and coerce a value to string
|
|
35
|
+
*/
|
|
36
|
+
safeParse(value: unknown): ParseResult<string>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=string.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/coercion/string.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,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQtD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQtD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQzD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQxC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQtC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQzD,IAAI,IAAI,eAAe;IAQvB,WAAW,IAAI,eAAe;IAQ9B,WAAW,IAAI,eAAe;IAQ9B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQ1D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQxD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQxD,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAUrC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQvC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IASvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAQ3C;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAkB7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;CAO/C"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { VldString } from '../validators/string.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* String coercion validator that attempts to convert values to strings
|
|
5
|
+
*/
|
|
6
|
+
export class VldCoerceString extends VldString {
|
|
7
|
+
constructor(config) {
|
|
8
|
+
super(config);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a new coerce string validator
|
|
12
|
+
*/
|
|
13
|
+
static create() {
|
|
14
|
+
return new VldCoerceString();
|
|
15
|
+
}
|
|
16
|
+
// Override all chain methods to return VldCoerceString instances
|
|
17
|
+
min(length, message) {
|
|
18
|
+
return new VldCoerceString({
|
|
19
|
+
checks: [...this.config.checks, (v) => v.length >= length],
|
|
20
|
+
transforms: this.config.transforms,
|
|
21
|
+
errorMessage: message || getMessages().stringMin(length)
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
max(length, message) {
|
|
25
|
+
return new VldCoerceString({
|
|
26
|
+
checks: [...this.config.checks, (v) => v.length <= length],
|
|
27
|
+
transforms: this.config.transforms,
|
|
28
|
+
errorMessage: message || getMessages().stringMax(length)
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
length(length, message) {
|
|
32
|
+
return new VldCoerceString({
|
|
33
|
+
checks: [...this.config.checks, (v) => v.length === length],
|
|
34
|
+
transforms: this.config.transforms,
|
|
35
|
+
errorMessage: message || getMessages().stringLength(length)
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
email(message) {
|
|
39
|
+
return new VldCoerceString({
|
|
40
|
+
checks: [...this.config.checks, (v) => /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/.test(v)],
|
|
41
|
+
transforms: this.config.transforms,
|
|
42
|
+
errorMessage: message || getMessages().stringEmail
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
url(message) {
|
|
46
|
+
return new VldCoerceString({
|
|
47
|
+
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)],
|
|
48
|
+
transforms: this.config.transforms,
|
|
49
|
+
errorMessage: message || getMessages().stringUrl
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
uuid(message) {
|
|
53
|
+
return new VldCoerceString({
|
|
54
|
+
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)],
|
|
55
|
+
transforms: this.config.transforms,
|
|
56
|
+
errorMessage: message || getMessages().stringUuid
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
regex(pattern, message) {
|
|
60
|
+
return new VldCoerceString({
|
|
61
|
+
checks: [...this.config.checks, (v) => pattern.test(v)],
|
|
62
|
+
transforms: this.config.transforms,
|
|
63
|
+
errorMessage: message || getMessages().stringRegex
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
trim() {
|
|
67
|
+
return new VldCoerceString({
|
|
68
|
+
checks: this.config.checks,
|
|
69
|
+
transforms: [...this.config.transforms, (v) => v.trim()],
|
|
70
|
+
errorMessage: this.config.errorMessage
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
toLowerCase() {
|
|
74
|
+
return new VldCoerceString({
|
|
75
|
+
checks: this.config.checks,
|
|
76
|
+
transforms: [...this.config.transforms, (v) => v.toLowerCase()],
|
|
77
|
+
errorMessage: this.config.errorMessage
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
toUpperCase() {
|
|
81
|
+
return new VldCoerceString({
|
|
82
|
+
checks: this.config.checks,
|
|
83
|
+
transforms: [...this.config.transforms, (v) => v.toUpperCase()],
|
|
84
|
+
errorMessage: this.config.errorMessage
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
startsWith(str, message) {
|
|
88
|
+
return new VldCoerceString({
|
|
89
|
+
checks: [...this.config.checks, (v) => v.startsWith(str)],
|
|
90
|
+
transforms: this.config.transforms,
|
|
91
|
+
errorMessage: message || getMessages().stringStartsWith(str)
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
endsWith(str, message) {
|
|
95
|
+
return new VldCoerceString({
|
|
96
|
+
checks: [...this.config.checks, (v) => v.endsWith(str)],
|
|
97
|
+
transforms: this.config.transforms,
|
|
98
|
+
errorMessage: message || getMessages().stringEndsWith(str)
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
includes(str, message) {
|
|
102
|
+
return new VldCoerceString({
|
|
103
|
+
checks: [...this.config.checks, (v) => v.includes(str)],
|
|
104
|
+
transforms: this.config.transforms,
|
|
105
|
+
errorMessage: message || getMessages().stringIncludes(str)
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
ip(message) {
|
|
109
|
+
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]?)$/;
|
|
110
|
+
const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;
|
|
111
|
+
return new VldCoerceString({
|
|
112
|
+
checks: [...this.config.checks, (v) => ipv4.test(v) || ipv6.test(v)],
|
|
113
|
+
transforms: this.config.transforms,
|
|
114
|
+
errorMessage: message || getMessages().stringIp
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
ipv4(message) {
|
|
118
|
+
return new VldCoerceString({
|
|
119
|
+
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)],
|
|
120
|
+
transforms: this.config.transforms,
|
|
121
|
+
errorMessage: message || getMessages().stringIpv4
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
ipv6(message) {
|
|
125
|
+
const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;
|
|
126
|
+
return new VldCoerceString({
|
|
127
|
+
checks: [...this.config.checks, (v) => ipv6.test(v)],
|
|
128
|
+
transforms: this.config.transforms,
|
|
129
|
+
errorMessage: message || getMessages().stringIpv6
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
nonempty(message) {
|
|
133
|
+
return new VldCoerceString({
|
|
134
|
+
checks: [...this.config.checks, (v) => v.length > 0],
|
|
135
|
+
transforms: this.config.transforms,
|
|
136
|
+
errorMessage: message || getMessages().stringEmpty
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Parse and coerce a value to string
|
|
141
|
+
*/
|
|
142
|
+
parse(value) {
|
|
143
|
+
// If it's already a string, use parent validation directly
|
|
144
|
+
if (typeof value === 'string') {
|
|
145
|
+
return super.parse(value);
|
|
146
|
+
}
|
|
147
|
+
// Handle null and undefined explicitly
|
|
148
|
+
if (value === null || value === undefined) {
|
|
149
|
+
throw new Error(getMessages().coercionFailed('string', value));
|
|
150
|
+
}
|
|
151
|
+
// Coerce to string
|
|
152
|
+
const coerced = String(value);
|
|
153
|
+
// Use parent validation with coerced value
|
|
154
|
+
return super.parse(coerced);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Safely parse and coerce a value to string
|
|
158
|
+
*/
|
|
159
|
+
safeParse(value) {
|
|
160
|
+
try {
|
|
161
|
+
return { success: true, data: this.parse(value) };
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
return { success: false, error: error };
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/coercion/string.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldString } from '../validators/string';\nimport { ParseResult } from '../validators/base';\nimport { getMessages } from '../locales';\n\n/**\n * String coercion validator that attempts to convert values to strings\n */\nexport class VldCoerceString extends VldString {\n protected constructor(config?: any) {\n super(config);\n }\n \n /**\n * Create a new coerce string validator\n */\n static create(): VldCoerceString {\n return new VldCoerceString();\n }\n \n // Override all chain methods to return VldCoerceString instances\n min(length: number, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length >= length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringMin(length)\n });\n }\n \n max(length: number, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length <= length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringMax(length)\n });\n }\n \n length(length: number, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length === length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringLength(length)\n });\n }\n \n email(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEmail\n });\n }\n \n url(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringUrl\n });\n }\n \n uuid(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^[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)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringUuid\n });\n }\n \n regex(pattern: RegExp, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => pattern.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringRegex\n });\n }\n \n trim(): VldCoerceString {\n return new VldCoerceString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.trim()],\n errorMessage: this.config.errorMessage\n });\n }\n \n toLowerCase(): VldCoerceString {\n return new VldCoerceString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.toLowerCase()],\n errorMessage: this.config.errorMessage\n });\n }\n \n toUpperCase(): VldCoerceString {\n return new VldCoerceString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.toUpperCase()],\n errorMessage: this.config.errorMessage\n });\n }\n \n startsWith(str: string, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.startsWith(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringStartsWith(str)\n });\n }\n \n endsWith(str: string, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.endsWith(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEndsWith(str)\n });\n }\n \n includes(str: string, message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.includes(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIncludes(str)\n });\n }\n \n ip(message?: string): VldCoerceString {\n 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]?)$/;\n const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => ipv4.test(v) || ipv6.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIp\n });\n }\n \n ipv4(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => /^(?:(?: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)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIpv4\n });\n }\n \n ipv6(message?: string): VldCoerceString {\n const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => ipv6.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIpv6\n });\n }\n \n nonempty(message?: string): VldCoerceString {\n return new VldCoerceString({\n checks: [...this.config.checks, (v: string) => v.length > 0],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEmpty\n });\n }\n \n /**\n * Parse and coerce a value to string\n */\n parse(value: unknown): string {\n // If it's already a string, use parent validation directly\n if (typeof value === 'string') {\n return super.parse(value);\n }\n \n // Handle null and undefined explicitly\n if (value === null || value === undefined) {\n throw new Error(getMessages().coercionFailed('string', value));\n }\n \n // Coerce to string\n const coerced = String(value);\n \n // Use parent validation with coerced value\n return super.parse(coerced);\n }\n \n /**\n * Safely parse and coerce a value to string\n */\n safeParse(value: unknown): ParseResult<string> {\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 @@
|
|
|
1
|
+
{"version":3,"file":"index-new.d.ts","sourceRoot":"","sources":["../src/index-new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAG3E,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,eAAO,MAAM,CAAC;;;;;YAQJ,CAAC,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;aAC3B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAE;YAIjF,CAAC,SAAS,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,iBAAiB,CAAC;cAItD,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,SAAS,CAAC;;;;;;;;CAW3E,CAAC;AAGF,eAAe,CAAC,CAAC"}
|