@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.
Files changed (138) hide show
  1. package/CHANGELOG.md +117 -102
  2. package/README.md +78 -13
  3. package/dist/coercion/bigint.d.ts +27 -0
  4. package/dist/coercion/bigint.d.ts.map +1 -0
  5. package/dist/coercion/bigint.js +108 -0
  6. package/dist/coercion/bigint.js.map +1 -0
  7. package/dist/coercion/boolean.d.ts +20 -0
  8. package/dist/coercion/boolean.d.ts.map +1 -0
  9. package/dist/coercion/boolean.js +63 -0
  10. package/dist/coercion/boolean.js.map +1 -0
  11. package/dist/coercion/date.d.ts +20 -0
  12. package/dist/coercion/date.d.ts.map +1 -0
  13. package/dist/coercion/date.js +52 -0
  14. package/dist/coercion/date.js.map +1 -0
  15. package/dist/coercion/number.d.ts +35 -0
  16. package/dist/coercion/number.d.ts.map +1 -0
  17. package/dist/coercion/number.js +144 -0
  18. package/dist/coercion/number.js.map +1 -0
  19. package/dist/coercion/string.d.ts +38 -0
  20. package/dist/coercion/string.d.ts.map +1 -0
  21. package/dist/coercion/string.js +168 -0
  22. package/dist/coercion/string.js.map +1 -0
  23. package/dist/index-new.d.ts.map +1 -0
  24. package/dist/index.d.ts +64 -257
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +86 -1164
  27. package/dist/index.js.map +1 -1
  28. package/dist/locales/af.js +3 -3
  29. package/dist/locales/af.js.map +1 -1
  30. package/dist/utils/deep-merge.d.ts +18 -0
  31. package/dist/utils/deep-merge.d.ts.map +1 -0
  32. package/dist/utils/deep-merge.js +68 -0
  33. package/dist/utils/deep-merge.js.map +1 -0
  34. package/dist/validators/any.d.ts +19 -0
  35. package/dist/validators/any.d.ts.map +1 -0
  36. package/dist/validators/any.js +25 -0
  37. package/dist/validators/any.js.map +1 -0
  38. package/dist/validators/array.d.ts +48 -0
  39. package/dist/validators/array.d.ts.map +1 -0
  40. package/dist/validators/array.js +135 -0
  41. package/dist/validators/array.js.map +1 -0
  42. package/dist/validators/base.d.ts +155 -0
  43. package/dist/validators/base.d.ts.map +1 -0
  44. package/dist/validators/base.js +245 -0
  45. package/dist/validators/base.js.map +1 -0
  46. package/dist/validators/bigint.d.ts +60 -0
  47. package/dist/validators/bigint.d.ts.map +1 -0
  48. package/dist/validators/bigint.js +104 -0
  49. package/dist/validators/bigint.js.map +1 -0
  50. package/dist/validators/boolean.d.ts +32 -0
  51. package/dist/validators/boolean.d.ts.map +1 -0
  52. package/dist/validators/boolean.js +86 -0
  53. package/dist/validators/boolean.js.map +1 -0
  54. package/dist/validators/date.d.ts +68 -0
  55. package/dist/validators/date.d.ts.map +1 -0
  56. package/dist/validators/date.js +148 -0
  57. package/dist/validators/date.js.map +1 -0
  58. package/dist/validators/enum.d.ts +25 -0
  59. package/dist/validators/enum.d.ts.map +1 -0
  60. package/dist/validators/enum.js +45 -0
  61. package/dist/validators/enum.js.map +1 -0
  62. package/dist/validators/index.d.ts +27 -0
  63. package/dist/validators/index.d.ts.map +1 -0
  64. package/dist/validators/index.js +30 -0
  65. package/dist/validators/index.js.map +1 -0
  66. package/dist/validators/intersection.d.ts +25 -0
  67. package/dist/validators/intersection.d.ts.map +1 -0
  68. package/dist/validators/intersection.js +57 -0
  69. package/dist/validators/intersection.js.map +1 -0
  70. package/dist/validators/literal.d.ts +25 -0
  71. package/dist/validators/literal.d.ts.map +1 -0
  72. package/dist/validators/literal.js +45 -0
  73. package/dist/validators/literal.js.map +1 -0
  74. package/dist/validators/map.d.ts +26 -0
  75. package/dist/validators/map.d.ts.map +1 -0
  76. package/dist/validators/map.js +54 -0
  77. package/dist/validators/map.js.map +1 -0
  78. package/dist/validators/never.d.ts +19 -0
  79. package/dist/validators/never.d.ts.map +1 -0
  80. package/dist/validators/never.js +29 -0
  81. package/dist/validators/never.js.map +1 -0
  82. package/dist/validators/number.d.ts +92 -0
  83. package/dist/validators/number.d.ts.map +1 -0
  84. package/dist/validators/number.js +173 -0
  85. package/dist/validators/number.js.map +1 -0
  86. package/dist/validators/object-optimized.d.ts +23 -0
  87. package/dist/validators/object-optimized.d.ts.map +1 -0
  88. package/dist/validators/object-optimized.js +179 -0
  89. package/dist/validators/object-optimized.js.map +1 -0
  90. package/dist/validators/object-ultra.d.ts +34 -0
  91. package/dist/validators/object-ultra.d.ts.map +1 -0
  92. package/dist/validators/object-ultra.js +175 -0
  93. package/dist/validators/object-ultra.js.map +1 -0
  94. package/dist/validators/object.d.ts +73 -0
  95. package/dist/validators/object.d.ts.map +1 -0
  96. package/dist/validators/object.js +289 -0
  97. package/dist/validators/object.js.map +1 -0
  98. package/dist/validators/record.d.ts +25 -0
  99. package/dist/validators/record.d.ts.map +1 -0
  100. package/dist/validators/record.js +52 -0
  101. package/dist/validators/record.js.map +1 -0
  102. package/dist/validators/set.d.ts +25 -0
  103. package/dist/validators/set.d.ts.map +1 -0
  104. package/dist/validators/set.js +51 -0
  105. package/dist/validators/set.js.map +1 -0
  106. package/dist/validators/string-ultra.d.ts +49 -0
  107. package/dist/validators/string-ultra.d.ts.map +1 -0
  108. package/dist/validators/string-ultra.js +217 -0
  109. package/dist/validators/string-ultra.js.map +1 -0
  110. package/dist/validators/string.d.ts +109 -0
  111. package/dist/validators/string.d.ts.map +1 -0
  112. package/dist/validators/string.js +242 -0
  113. package/dist/validators/string.js.map +1 -0
  114. package/dist/validators/symbol.d.ts +24 -0
  115. package/dist/validators/symbol.d.ts.map +1 -0
  116. package/dist/validators/symbol.js +42 -0
  117. package/dist/validators/symbol.js.map +1 -0
  118. package/dist/validators/tuple.d.ts +31 -0
  119. package/dist/validators/tuple.d.ts.map +1 -0
  120. package/dist/validators/tuple.js +55 -0
  121. package/dist/validators/tuple.js.map +1 -0
  122. package/dist/validators/union-optimized.d.ts +15 -0
  123. package/dist/validators/union-optimized.d.ts.map +1 -0
  124. package/dist/validators/union-optimized.js +92 -0
  125. package/dist/validators/union-optimized.js.map +1 -0
  126. package/dist/validators/union.d.ts +33 -0
  127. package/dist/validators/union.d.ts.map +1 -0
  128. package/dist/validators/union.js +121 -0
  129. package/dist/validators/union.js.map +1 -0
  130. package/dist/validators/unknown.d.ts +19 -0
  131. package/dist/validators/unknown.d.ts.map +1 -0
  132. package/dist/validators/unknown.js +25 -0
  133. package/dist/validators/unknown.js.map +1 -0
  134. package/dist/validators/void.d.ts +19 -0
  135. package/dist/validators/void.d.ts.map +1 -0
  136. package/dist/validators/void.js +35 -0
  137. package/dist/validators/void.js.map +1 -0
  138. 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"}