@jdsalasc/solvejs-validators 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/dist/cjs/index.cjs +223 -59
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.d.ts +94 -15
- package/dist/esm/index.js +216 -59
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,9 +11,19 @@ npm i @jdsalasc/solvejs-validators
|
|
|
11
11
|
## Example
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
|
-
import { isCellphoneNumber,
|
|
14
|
+
import { isCellphoneNumber, validateCellphoneNumber, validateName } from "@jdsalasc/solvejs-validators";
|
|
15
15
|
|
|
16
16
|
isCellphoneNumber("+573001112233");
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
validateCellphoneNumber("+573001112233", { country: "CO" });
|
|
18
|
+
validateName("Maria Fernanda");
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Structured validators return:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
type ValidationResult = {
|
|
25
|
+
ok: boolean;
|
|
26
|
+
code: string;
|
|
27
|
+
message: string;
|
|
28
|
+
};
|
|
19
29
|
```
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,129 +1,293 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateCellphoneNumber = validateCellphoneNumber;
|
|
3
4
|
exports.isCellphoneNumber = isCellphoneNumber;
|
|
5
|
+
exports.validateAddressDirection = validateAddressDirection;
|
|
4
6
|
exports.isAddressDirection = isAddressDirection;
|
|
7
|
+
exports.validateName = validateName;
|
|
5
8
|
exports.isValidName = isValidName;
|
|
9
|
+
exports.validateEmail = validateEmail;
|
|
6
10
|
exports.isEmail = isEmail;
|
|
11
|
+
exports.validateHttpUrl = validateHttpUrl;
|
|
7
12
|
exports.isHttpUrl = isHttpUrl;
|
|
13
|
+
exports.validatePostalCode = validatePostalCode;
|
|
8
14
|
exports.isPostalCode = isPostalCode;
|
|
15
|
+
exports.validateStrongPassword = validateStrongPassword;
|
|
9
16
|
exports.isStrongPassword = isStrongPassword;
|
|
10
|
-
const ADDRESS_DIRECTIONS =
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
17
|
+
const ADDRESS_DIRECTIONS = {
|
|
18
|
+
en: new Set([
|
|
19
|
+
"N",
|
|
20
|
+
"S",
|
|
21
|
+
"E",
|
|
22
|
+
"W",
|
|
23
|
+
"NE",
|
|
24
|
+
"NW",
|
|
25
|
+
"SE",
|
|
26
|
+
"SW",
|
|
27
|
+
"NORTH",
|
|
28
|
+
"SOUTH",
|
|
29
|
+
"EAST",
|
|
30
|
+
"WEST",
|
|
31
|
+
"NORTHEAST",
|
|
32
|
+
"NORTHWEST",
|
|
33
|
+
"SOUTHEAST",
|
|
34
|
+
"SOUTHWEST"
|
|
35
|
+
]),
|
|
36
|
+
es: new Set([
|
|
37
|
+
"N",
|
|
38
|
+
"S",
|
|
39
|
+
"E",
|
|
40
|
+
"O",
|
|
41
|
+
"NE",
|
|
42
|
+
"NO",
|
|
43
|
+
"SE",
|
|
44
|
+
"SO",
|
|
45
|
+
"NORTE",
|
|
46
|
+
"SUR",
|
|
47
|
+
"ESTE",
|
|
48
|
+
"OESTE",
|
|
49
|
+
"NORESTE",
|
|
50
|
+
"NOROESTE",
|
|
51
|
+
"SURESTE",
|
|
52
|
+
"SUROESTE"
|
|
53
|
+
])
|
|
54
|
+
};
|
|
55
|
+
const COUNTRY_RULES = {
|
|
56
|
+
US: { minDigits: 10, maxDigits: 11 },
|
|
57
|
+
CO: { minDigits: 10, maxDigits: 12 },
|
|
58
|
+
MX: { minDigits: 10, maxDigits: 13 },
|
|
59
|
+
ES: { minDigits: 9, maxDigits: 11 }
|
|
60
|
+
};
|
|
61
|
+
function ok(message = "Validation passed.") {
|
|
62
|
+
return { ok: true, code: "VALID", message };
|
|
63
|
+
}
|
|
64
|
+
function fail(code, message) {
|
|
65
|
+
return { ok: false, code, message };
|
|
66
|
+
}
|
|
28
67
|
/**
|
|
29
|
-
*
|
|
68
|
+
* Validates cellphone numbers using regional presets.
|
|
30
69
|
*
|
|
31
70
|
* @param value - Input phone string.
|
|
32
71
|
* @param options - Validation options.
|
|
33
72
|
* @param options.allowInternational - Allows a leading `+`.
|
|
34
|
-
* @param options.
|
|
35
|
-
* @param options.
|
|
36
|
-
* @
|
|
73
|
+
* @param options.country - Country preset used for length constraints.
|
|
74
|
+
* @param options.minDigits - Override minimum digits.
|
|
75
|
+
* @param options.maxDigits - Override maximum digits.
|
|
76
|
+
* @returns Structured validation result.
|
|
37
77
|
*/
|
|
38
|
-
function
|
|
78
|
+
function validateCellphoneNumber(value, options = {}) {
|
|
39
79
|
const allowInternational = options.allowInternational ?? true;
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
80
|
+
const country = options.country ?? "ANY";
|
|
81
|
+
if (!["ANY", "US", "CO", "MX", "ES"].includes(country)) {
|
|
82
|
+
return fail("UNSUPPORTED_COUNTRY", `Unsupported country preset: ${country}.`);
|
|
83
|
+
}
|
|
84
|
+
const normalized = value.trim();
|
|
85
|
+
if (normalized.length === 0) {
|
|
86
|
+
return fail("EMPTY", "Phone number cannot be empty.");
|
|
87
|
+
}
|
|
88
|
+
const compact = normalized.replace(/[\s().-]/g, "");
|
|
43
89
|
const pattern = allowInternational ? /^\+?\d+$/ : /^\d+$/;
|
|
44
|
-
if (!pattern.test(
|
|
45
|
-
return
|
|
90
|
+
if (!pattern.test(compact)) {
|
|
91
|
+
return fail("INVALID_FORMAT", "Phone number contains invalid characters.");
|
|
92
|
+
}
|
|
93
|
+
const digits = compact.startsWith("+") ? compact.slice(1) : compact;
|
|
94
|
+
const preset = country === "ANY" ? { minDigits: 7, maxDigits: 15 } : COUNTRY_RULES[country];
|
|
95
|
+
const minDigits = options.minDigits ?? preset.minDigits;
|
|
96
|
+
const maxDigits = options.maxDigits ?? preset.maxDigits;
|
|
97
|
+
if (digits.length < minDigits) {
|
|
98
|
+
return fail("TOO_SHORT", `Phone number must have at least ${minDigits} digits.`);
|
|
99
|
+
}
|
|
100
|
+
if (digits.length > maxDigits) {
|
|
101
|
+
return fail("TOO_LONG", `Phone number must have at most ${maxDigits} digits.`);
|
|
102
|
+
}
|
|
103
|
+
return ok("Valid cellphone number.");
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Boolean wrapper for `validateCellphoneNumber`.
|
|
107
|
+
*
|
|
108
|
+
* @param value - Input phone string.
|
|
109
|
+
* @param options - Validation options.
|
|
110
|
+
* @returns `true` when the value is valid.
|
|
111
|
+
*/
|
|
112
|
+
function isCellphoneNumber(value, options = {}) {
|
|
113
|
+
return validateCellphoneNumber(value, options).ok;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Validates address direction using localized dictionaries.
|
|
117
|
+
*
|
|
118
|
+
* @param value - Direction text.
|
|
119
|
+
* @param options - Validation options.
|
|
120
|
+
* @param options.locale - Locale dictionary (`en`, `es`).
|
|
121
|
+
* @returns Structured validation result.
|
|
122
|
+
*/
|
|
123
|
+
function validateAddressDirection(value, options = {}) {
|
|
124
|
+
const locale = options.locale ?? "en";
|
|
125
|
+
if (!ADDRESS_DIRECTIONS[locale]) {
|
|
126
|
+
return fail("UNSUPPORTED_LOCALE", `Unsupported direction locale: ${locale}.`);
|
|
46
127
|
}
|
|
47
|
-
const
|
|
48
|
-
|
|
128
|
+
const normalized = value.trim().toUpperCase();
|
|
129
|
+
if (!normalized) {
|
|
130
|
+
return fail("EMPTY", "Direction cannot be empty.");
|
|
131
|
+
}
|
|
132
|
+
return ADDRESS_DIRECTIONS[locale].has(normalized)
|
|
133
|
+
? ok("Valid address direction.")
|
|
134
|
+
: fail("INVALID_FORMAT", "Direction does not match locale dictionary.");
|
|
49
135
|
}
|
|
50
136
|
/**
|
|
51
|
-
*
|
|
137
|
+
* Boolean wrapper for `validateAddressDirection`.
|
|
52
138
|
*
|
|
53
139
|
* @param value - Direction text.
|
|
54
|
-
* @
|
|
140
|
+
* @param options - Validation options.
|
|
141
|
+
* @returns `true` when the value is valid.
|
|
55
142
|
*/
|
|
56
|
-
function isAddressDirection(value) {
|
|
57
|
-
return
|
|
143
|
+
function isAddressDirection(value, options = {}) {
|
|
144
|
+
return validateAddressDirection(value, options).ok;
|
|
58
145
|
}
|
|
59
146
|
/**
|
|
60
|
-
* Validates names
|
|
147
|
+
* Validates person names with practical production constraints.
|
|
61
148
|
*
|
|
62
149
|
* @param value - Name string.
|
|
63
150
|
* @param options - Validation options.
|
|
64
151
|
* @param options.minLength - Minimum total length.
|
|
65
152
|
* @param options.maxLength - Maximum total length.
|
|
66
|
-
* @returns
|
|
153
|
+
* @returns Structured validation result.
|
|
67
154
|
*/
|
|
68
|
-
function
|
|
155
|
+
function validateName(value, options = {}) {
|
|
69
156
|
const minLength = options.minLength ?? 2;
|
|
70
157
|
const maxLength = options.maxLength ?? 80;
|
|
71
158
|
const normalized = value.trim();
|
|
72
|
-
if (normalized
|
|
73
|
-
return
|
|
159
|
+
if (!normalized) {
|
|
160
|
+
return fail("EMPTY", "Name cannot be empty.");
|
|
161
|
+
}
|
|
162
|
+
if (normalized.length < minLength) {
|
|
163
|
+
return fail("TOO_SHORT", `Name must have at least ${minLength} characters.`);
|
|
164
|
+
}
|
|
165
|
+
if (normalized.length > maxLength) {
|
|
166
|
+
return fail("TOO_LONG", `Name must have at most ${maxLength} characters.`);
|
|
167
|
+
}
|
|
168
|
+
if (!/^[A-Za-zÀ-ÖØ-öø-ÿ' -]+$/.test(normalized)) {
|
|
169
|
+
return fail("INVALID_CHARACTERS", "Name contains unsupported characters.");
|
|
170
|
+
}
|
|
171
|
+
return ok("Valid name.");
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Boolean wrapper for `validateName`.
|
|
175
|
+
*
|
|
176
|
+
* @param value - Name string.
|
|
177
|
+
* @param options - Validation options.
|
|
178
|
+
* @returns `true` when the value is valid.
|
|
179
|
+
*/
|
|
180
|
+
function isValidName(value, options = {}) {
|
|
181
|
+
return validateName(value, options).ok;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Validates an email shape.
|
|
185
|
+
*
|
|
186
|
+
* @param value - Email string.
|
|
187
|
+
* @returns Structured validation result.
|
|
188
|
+
*/
|
|
189
|
+
function validateEmail(value) {
|
|
190
|
+
const normalized = value.trim();
|
|
191
|
+
if (!normalized) {
|
|
192
|
+
return fail("EMPTY", "Email cannot be empty.");
|
|
74
193
|
}
|
|
75
|
-
return /^[
|
|
194
|
+
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(normalized)
|
|
195
|
+
? ok("Valid email.")
|
|
196
|
+
: fail("INVALID_FORMAT", "Email does not match expected format.");
|
|
76
197
|
}
|
|
77
198
|
/**
|
|
78
|
-
*
|
|
199
|
+
* Boolean wrapper for `validateEmail`.
|
|
79
200
|
*
|
|
80
201
|
* @param value - Email string.
|
|
81
|
-
* @returns `true` when
|
|
202
|
+
* @returns `true` when the value is valid.
|
|
82
203
|
*/
|
|
83
204
|
function isEmail(value) {
|
|
84
|
-
return
|
|
205
|
+
return validateEmail(value).ok;
|
|
85
206
|
}
|
|
86
207
|
/**
|
|
87
208
|
* Validates an HTTP(S) URL.
|
|
88
209
|
*
|
|
89
210
|
* @param value - URL string.
|
|
90
|
-
* @returns
|
|
211
|
+
* @returns Structured validation result.
|
|
91
212
|
*/
|
|
92
|
-
function
|
|
213
|
+
function validateHttpUrl(value) {
|
|
214
|
+
const normalized = value.trim();
|
|
215
|
+
if (!normalized) {
|
|
216
|
+
return fail("EMPTY", "URL cannot be empty.");
|
|
217
|
+
}
|
|
93
218
|
try {
|
|
94
|
-
const parsed = new URL(
|
|
95
|
-
|
|
219
|
+
const parsed = new URL(normalized);
|
|
220
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
221
|
+
return fail("INVALID_FORMAT", "Only HTTP and HTTPS URLs are supported.");
|
|
222
|
+
}
|
|
223
|
+
return ok("Valid URL.");
|
|
96
224
|
}
|
|
97
225
|
catch {
|
|
98
|
-
return
|
|
226
|
+
return fail("INVALID_FORMAT", "URL does not match expected format.");
|
|
99
227
|
}
|
|
100
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Boolean wrapper for `validateHttpUrl`.
|
|
231
|
+
*
|
|
232
|
+
* @param value - URL string.
|
|
233
|
+
* @returns `true` when the value is valid.
|
|
234
|
+
*/
|
|
235
|
+
function isHttpUrl(value) {
|
|
236
|
+
return validateHttpUrl(value).ok;
|
|
237
|
+
}
|
|
101
238
|
/**
|
|
102
239
|
* Validates US-style postal codes (`12345` or `12345-6789`).
|
|
103
240
|
*
|
|
104
241
|
* @param value - Postal code string.
|
|
105
|
-
* @returns
|
|
242
|
+
* @returns Structured validation result.
|
|
243
|
+
*/
|
|
244
|
+
function validatePostalCode(value) {
|
|
245
|
+
const normalized = value.trim();
|
|
246
|
+
if (!normalized) {
|
|
247
|
+
return fail("EMPTY", "Postal code cannot be empty.");
|
|
248
|
+
}
|
|
249
|
+
return /^\d{5}(?:-\d{4})?$/.test(normalized)
|
|
250
|
+
? ok("Valid postal code.")
|
|
251
|
+
: fail("INVALID_FORMAT", "Postal code does not match supported formats.");
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Boolean wrapper for `validatePostalCode`.
|
|
255
|
+
*
|
|
256
|
+
* @param value - Postal code string.
|
|
257
|
+
* @returns `true` when the value is valid.
|
|
106
258
|
*/
|
|
107
259
|
function isPostalCode(value) {
|
|
108
|
-
return
|
|
260
|
+
return validatePostalCode(value).ok;
|
|
109
261
|
}
|
|
110
262
|
/**
|
|
111
|
-
* Validates password strength
|
|
263
|
+
* Validates password strength using default security checks.
|
|
112
264
|
*
|
|
113
265
|
* @param value - Password candidate.
|
|
114
266
|
* @param options - Validation options.
|
|
115
267
|
* @param options.minLength - Minimum required length.
|
|
116
|
-
* @returns
|
|
268
|
+
* @returns Structured validation result.
|
|
117
269
|
*/
|
|
118
|
-
function
|
|
270
|
+
function validateStrongPassword(value, options = {}) {
|
|
119
271
|
const minLength = options.minLength ?? 8;
|
|
272
|
+
if (!value) {
|
|
273
|
+
return fail("EMPTY", "Password cannot be empty.");
|
|
274
|
+
}
|
|
120
275
|
if (value.length < minLength) {
|
|
121
|
-
return
|
|
276
|
+
return fail("TOO_SHORT", `Password must have at least ${minLength} characters.`);
|
|
122
277
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
278
|
+
if (!/[A-Z]/.test(value) || !/[a-z]/.test(value) || !/\d/.test(value) || !/[^A-Za-z0-9]/.test(value)) {
|
|
279
|
+
return fail("INVALID_FORMAT", "Password must include upper, lower, digit, and symbol characters.");
|
|
280
|
+
}
|
|
281
|
+
return ok("Strong password.");
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Boolean wrapper for `validateStrongPassword`.
|
|
285
|
+
*
|
|
286
|
+
* @param value - Password candidate.
|
|
287
|
+
* @param options - Validation options.
|
|
288
|
+
* @returns `true` when the value is valid.
|
|
289
|
+
*/
|
|
290
|
+
function isStrongPassword(value, options = {}) {
|
|
291
|
+
return validateStrongPassword(value, options).ok;
|
|
128
292
|
}
|
|
129
293
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,66 +1,145 @@
|
|
|
1
|
+
export type ValidationResultCode = "VALID" | "EMPTY" | "INVALID_FORMAT" | "TOO_SHORT" | "TOO_LONG" | "INVALID_CHARACTERS" | "UNSUPPORTED_LOCALE" | "UNSUPPORTED_COUNTRY";
|
|
2
|
+
export type ValidationResult = {
|
|
3
|
+
ok: boolean;
|
|
4
|
+
code: ValidationResultCode;
|
|
5
|
+
message: string;
|
|
6
|
+
};
|
|
7
|
+
export type SupportedCountry = "ANY" | "US" | "CO" | "MX" | "ES";
|
|
8
|
+
export type DirectionLocale = "en" | "es";
|
|
1
9
|
/**
|
|
2
|
-
*
|
|
10
|
+
* Validates cellphone numbers using regional presets.
|
|
3
11
|
*
|
|
4
12
|
* @param value - Input phone string.
|
|
5
13
|
* @param options - Validation options.
|
|
6
14
|
* @param options.allowInternational - Allows a leading `+`.
|
|
7
|
-
* @param options.
|
|
8
|
-
* @param options.
|
|
9
|
-
* @
|
|
15
|
+
* @param options.country - Country preset used for length constraints.
|
|
16
|
+
* @param options.minDigits - Override minimum digits.
|
|
17
|
+
* @param options.maxDigits - Override maximum digits.
|
|
18
|
+
* @returns Structured validation result.
|
|
19
|
+
*/
|
|
20
|
+
export declare function validateCellphoneNumber(value: string, options?: {
|
|
21
|
+
allowInternational?: boolean;
|
|
22
|
+
country?: SupportedCountry;
|
|
23
|
+
minDigits?: number;
|
|
24
|
+
maxDigits?: number;
|
|
25
|
+
}): ValidationResult;
|
|
26
|
+
/**
|
|
27
|
+
* Boolean wrapper for `validateCellphoneNumber`.
|
|
28
|
+
*
|
|
29
|
+
* @param value - Input phone string.
|
|
30
|
+
* @param options - Validation options.
|
|
31
|
+
* @returns `true` when the value is valid.
|
|
10
32
|
*/
|
|
11
33
|
export declare function isCellphoneNumber(value: string, options?: {
|
|
12
34
|
allowInternational?: boolean;
|
|
35
|
+
country?: SupportedCountry;
|
|
13
36
|
minDigits?: number;
|
|
14
37
|
maxDigits?: number;
|
|
15
38
|
}): boolean;
|
|
16
39
|
/**
|
|
17
|
-
* Validates
|
|
40
|
+
* Validates address direction using localized dictionaries.
|
|
41
|
+
*
|
|
42
|
+
* @param value - Direction text.
|
|
43
|
+
* @param options - Validation options.
|
|
44
|
+
* @param options.locale - Locale dictionary (`en`, `es`).
|
|
45
|
+
* @returns Structured validation result.
|
|
46
|
+
*/
|
|
47
|
+
export declare function validateAddressDirection(value: string, options?: {
|
|
48
|
+
locale?: DirectionLocale;
|
|
49
|
+
}): ValidationResult;
|
|
50
|
+
/**
|
|
51
|
+
* Boolean wrapper for `validateAddressDirection`.
|
|
18
52
|
*
|
|
19
53
|
* @param value - Direction text.
|
|
20
|
-
* @
|
|
54
|
+
* @param options - Validation options.
|
|
55
|
+
* @returns `true` when the value is valid.
|
|
21
56
|
*/
|
|
22
|
-
export declare function isAddressDirection(value: string
|
|
57
|
+
export declare function isAddressDirection(value: string, options?: {
|
|
58
|
+
locale?: DirectionLocale;
|
|
59
|
+
}): boolean;
|
|
23
60
|
/**
|
|
24
|
-
* Validates names
|
|
61
|
+
* Validates person names with practical production constraints.
|
|
25
62
|
*
|
|
26
63
|
* @param value - Name string.
|
|
27
64
|
* @param options - Validation options.
|
|
28
65
|
* @param options.minLength - Minimum total length.
|
|
29
66
|
* @param options.maxLength - Maximum total length.
|
|
30
|
-
* @returns
|
|
67
|
+
* @returns Structured validation result.
|
|
68
|
+
*/
|
|
69
|
+
export declare function validateName(value: string, options?: {
|
|
70
|
+
minLength?: number;
|
|
71
|
+
maxLength?: number;
|
|
72
|
+
}): ValidationResult;
|
|
73
|
+
/**
|
|
74
|
+
* Boolean wrapper for `validateName`.
|
|
75
|
+
*
|
|
76
|
+
* @param value - Name string.
|
|
77
|
+
* @param options - Validation options.
|
|
78
|
+
* @returns `true` when the value is valid.
|
|
31
79
|
*/
|
|
32
80
|
export declare function isValidName(value: string, options?: {
|
|
33
81
|
minLength?: number;
|
|
34
82
|
maxLength?: number;
|
|
35
83
|
}): boolean;
|
|
36
84
|
/**
|
|
37
|
-
* Validates an email
|
|
85
|
+
* Validates an email shape.
|
|
86
|
+
*
|
|
87
|
+
* @param value - Email string.
|
|
88
|
+
* @returns Structured validation result.
|
|
89
|
+
*/
|
|
90
|
+
export declare function validateEmail(value: string): ValidationResult;
|
|
91
|
+
/**
|
|
92
|
+
* Boolean wrapper for `validateEmail`.
|
|
38
93
|
*
|
|
39
94
|
* @param value - Email string.
|
|
40
|
-
* @returns `true` when
|
|
95
|
+
* @returns `true` when the value is valid.
|
|
41
96
|
*/
|
|
42
97
|
export declare function isEmail(value: string): boolean;
|
|
43
98
|
/**
|
|
44
99
|
* Validates an HTTP(S) URL.
|
|
45
100
|
*
|
|
46
101
|
* @param value - URL string.
|
|
47
|
-
* @returns
|
|
102
|
+
* @returns Structured validation result.
|
|
103
|
+
*/
|
|
104
|
+
export declare function validateHttpUrl(value: string): ValidationResult;
|
|
105
|
+
/**
|
|
106
|
+
* Boolean wrapper for `validateHttpUrl`.
|
|
107
|
+
*
|
|
108
|
+
* @param value - URL string.
|
|
109
|
+
* @returns `true` when the value is valid.
|
|
48
110
|
*/
|
|
49
111
|
export declare function isHttpUrl(value: string): boolean;
|
|
50
112
|
/**
|
|
51
113
|
* Validates US-style postal codes (`12345` or `12345-6789`).
|
|
52
114
|
*
|
|
53
115
|
* @param value - Postal code string.
|
|
54
|
-
* @returns
|
|
116
|
+
* @returns Structured validation result.
|
|
117
|
+
*/
|
|
118
|
+
export declare function validatePostalCode(value: string): ValidationResult;
|
|
119
|
+
/**
|
|
120
|
+
* Boolean wrapper for `validatePostalCode`.
|
|
121
|
+
*
|
|
122
|
+
* @param value - Postal code string.
|
|
123
|
+
* @returns `true` when the value is valid.
|
|
55
124
|
*/
|
|
56
125
|
export declare function isPostalCode(value: string): boolean;
|
|
57
126
|
/**
|
|
58
|
-
* Validates password strength
|
|
127
|
+
* Validates password strength using default security checks.
|
|
59
128
|
*
|
|
60
129
|
* @param value - Password candidate.
|
|
61
130
|
* @param options - Validation options.
|
|
62
131
|
* @param options.minLength - Minimum required length.
|
|
63
|
-
* @returns
|
|
132
|
+
* @returns Structured validation result.
|
|
133
|
+
*/
|
|
134
|
+
export declare function validateStrongPassword(value: string, options?: {
|
|
135
|
+
minLength?: number;
|
|
136
|
+
}): ValidationResult;
|
|
137
|
+
/**
|
|
138
|
+
* Boolean wrapper for `validateStrongPassword`.
|
|
139
|
+
*
|
|
140
|
+
* @param value - Password candidate.
|
|
141
|
+
* @param options - Validation options.
|
|
142
|
+
* @returns `true` when the value is valid.
|
|
64
143
|
*/
|
|
65
144
|
export declare function isStrongPassword(value: string, options?: {
|
|
66
145
|
minLength?: number;
|
package/dist/esm/index.js
CHANGED
|
@@ -1,120 +1,277 @@
|
|
|
1
|
-
const ADDRESS_DIRECTIONS =
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
const ADDRESS_DIRECTIONS = {
|
|
2
|
+
en: new Set([
|
|
3
|
+
"N",
|
|
4
|
+
"S",
|
|
5
|
+
"E",
|
|
6
|
+
"W",
|
|
7
|
+
"NE",
|
|
8
|
+
"NW",
|
|
9
|
+
"SE",
|
|
10
|
+
"SW",
|
|
11
|
+
"NORTH",
|
|
12
|
+
"SOUTH",
|
|
13
|
+
"EAST",
|
|
14
|
+
"WEST",
|
|
15
|
+
"NORTHEAST",
|
|
16
|
+
"NORTHWEST",
|
|
17
|
+
"SOUTHEAST",
|
|
18
|
+
"SOUTHWEST"
|
|
19
|
+
]),
|
|
20
|
+
es: new Set([
|
|
21
|
+
"N",
|
|
22
|
+
"S",
|
|
23
|
+
"E",
|
|
24
|
+
"O",
|
|
25
|
+
"NE",
|
|
26
|
+
"NO",
|
|
27
|
+
"SE",
|
|
28
|
+
"SO",
|
|
29
|
+
"NORTE",
|
|
30
|
+
"SUR",
|
|
31
|
+
"ESTE",
|
|
32
|
+
"OESTE",
|
|
33
|
+
"NORESTE",
|
|
34
|
+
"NOROESTE",
|
|
35
|
+
"SURESTE",
|
|
36
|
+
"SUROESTE"
|
|
37
|
+
])
|
|
38
|
+
};
|
|
39
|
+
const COUNTRY_RULES = {
|
|
40
|
+
US: { minDigits: 10, maxDigits: 11 },
|
|
41
|
+
CO: { minDigits: 10, maxDigits: 12 },
|
|
42
|
+
MX: { minDigits: 10, maxDigits: 13 },
|
|
43
|
+
ES: { minDigits: 9, maxDigits: 11 }
|
|
44
|
+
};
|
|
45
|
+
function ok(message = "Validation passed.") {
|
|
46
|
+
return { ok: true, code: "VALID", message };
|
|
47
|
+
}
|
|
48
|
+
function fail(code, message) {
|
|
49
|
+
return { ok: false, code, message };
|
|
50
|
+
}
|
|
19
51
|
/**
|
|
20
|
-
*
|
|
52
|
+
* Validates cellphone numbers using regional presets.
|
|
21
53
|
*
|
|
22
54
|
* @param value - Input phone string.
|
|
23
55
|
* @param options - Validation options.
|
|
24
56
|
* @param options.allowInternational - Allows a leading `+`.
|
|
25
|
-
* @param options.
|
|
26
|
-
* @param options.
|
|
27
|
-
* @
|
|
57
|
+
* @param options.country - Country preset used for length constraints.
|
|
58
|
+
* @param options.minDigits - Override minimum digits.
|
|
59
|
+
* @param options.maxDigits - Override maximum digits.
|
|
60
|
+
* @returns Structured validation result.
|
|
28
61
|
*/
|
|
29
|
-
export function
|
|
62
|
+
export function validateCellphoneNumber(value, options = {}) {
|
|
30
63
|
const allowInternational = options.allowInternational ?? true;
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
64
|
+
const country = options.country ?? "ANY";
|
|
65
|
+
if (!["ANY", "US", "CO", "MX", "ES"].includes(country)) {
|
|
66
|
+
return fail("UNSUPPORTED_COUNTRY", `Unsupported country preset: ${country}.`);
|
|
67
|
+
}
|
|
68
|
+
const normalized = value.trim();
|
|
69
|
+
if (normalized.length === 0) {
|
|
70
|
+
return fail("EMPTY", "Phone number cannot be empty.");
|
|
71
|
+
}
|
|
72
|
+
const compact = normalized.replace(/[\s().-]/g, "");
|
|
34
73
|
const pattern = allowInternational ? /^\+?\d+$/ : /^\d+$/;
|
|
35
|
-
if (!pattern.test(
|
|
36
|
-
return
|
|
74
|
+
if (!pattern.test(compact)) {
|
|
75
|
+
return fail("INVALID_FORMAT", "Phone number contains invalid characters.");
|
|
76
|
+
}
|
|
77
|
+
const digits = compact.startsWith("+") ? compact.slice(1) : compact;
|
|
78
|
+
const preset = country === "ANY" ? { minDigits: 7, maxDigits: 15 } : COUNTRY_RULES[country];
|
|
79
|
+
const minDigits = options.minDigits ?? preset.minDigits;
|
|
80
|
+
const maxDigits = options.maxDigits ?? preset.maxDigits;
|
|
81
|
+
if (digits.length < minDigits) {
|
|
82
|
+
return fail("TOO_SHORT", `Phone number must have at least ${minDigits} digits.`);
|
|
83
|
+
}
|
|
84
|
+
if (digits.length > maxDigits) {
|
|
85
|
+
return fail("TOO_LONG", `Phone number must have at most ${maxDigits} digits.`);
|
|
86
|
+
}
|
|
87
|
+
return ok("Valid cellphone number.");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Boolean wrapper for `validateCellphoneNumber`.
|
|
91
|
+
*
|
|
92
|
+
* @param value - Input phone string.
|
|
93
|
+
* @param options - Validation options.
|
|
94
|
+
* @returns `true` when the value is valid.
|
|
95
|
+
*/
|
|
96
|
+
export function isCellphoneNumber(value, options = {}) {
|
|
97
|
+
return validateCellphoneNumber(value, options).ok;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validates address direction using localized dictionaries.
|
|
101
|
+
*
|
|
102
|
+
* @param value - Direction text.
|
|
103
|
+
* @param options - Validation options.
|
|
104
|
+
* @param options.locale - Locale dictionary (`en`, `es`).
|
|
105
|
+
* @returns Structured validation result.
|
|
106
|
+
*/
|
|
107
|
+
export function validateAddressDirection(value, options = {}) {
|
|
108
|
+
const locale = options.locale ?? "en";
|
|
109
|
+
if (!ADDRESS_DIRECTIONS[locale]) {
|
|
110
|
+
return fail("UNSUPPORTED_LOCALE", `Unsupported direction locale: ${locale}.`);
|
|
37
111
|
}
|
|
38
|
-
const
|
|
39
|
-
|
|
112
|
+
const normalized = value.trim().toUpperCase();
|
|
113
|
+
if (!normalized) {
|
|
114
|
+
return fail("EMPTY", "Direction cannot be empty.");
|
|
115
|
+
}
|
|
116
|
+
return ADDRESS_DIRECTIONS[locale].has(normalized)
|
|
117
|
+
? ok("Valid address direction.")
|
|
118
|
+
: fail("INVALID_FORMAT", "Direction does not match locale dictionary.");
|
|
40
119
|
}
|
|
41
120
|
/**
|
|
42
|
-
*
|
|
121
|
+
* Boolean wrapper for `validateAddressDirection`.
|
|
43
122
|
*
|
|
44
123
|
* @param value - Direction text.
|
|
45
|
-
* @
|
|
124
|
+
* @param options - Validation options.
|
|
125
|
+
* @returns `true` when the value is valid.
|
|
46
126
|
*/
|
|
47
|
-
export function isAddressDirection(value) {
|
|
48
|
-
return
|
|
127
|
+
export function isAddressDirection(value, options = {}) {
|
|
128
|
+
return validateAddressDirection(value, options).ok;
|
|
49
129
|
}
|
|
50
130
|
/**
|
|
51
|
-
* Validates names
|
|
131
|
+
* Validates person names with practical production constraints.
|
|
52
132
|
*
|
|
53
133
|
* @param value - Name string.
|
|
54
134
|
* @param options - Validation options.
|
|
55
135
|
* @param options.minLength - Minimum total length.
|
|
56
136
|
* @param options.maxLength - Maximum total length.
|
|
57
|
-
* @returns
|
|
137
|
+
* @returns Structured validation result.
|
|
58
138
|
*/
|
|
59
|
-
export function
|
|
139
|
+
export function validateName(value, options = {}) {
|
|
60
140
|
const minLength = options.minLength ?? 2;
|
|
61
141
|
const maxLength = options.maxLength ?? 80;
|
|
62
142
|
const normalized = value.trim();
|
|
63
|
-
if (normalized
|
|
64
|
-
return
|
|
143
|
+
if (!normalized) {
|
|
144
|
+
return fail("EMPTY", "Name cannot be empty.");
|
|
145
|
+
}
|
|
146
|
+
if (normalized.length < minLength) {
|
|
147
|
+
return fail("TOO_SHORT", `Name must have at least ${minLength} characters.`);
|
|
148
|
+
}
|
|
149
|
+
if (normalized.length > maxLength) {
|
|
150
|
+
return fail("TOO_LONG", `Name must have at most ${maxLength} characters.`);
|
|
151
|
+
}
|
|
152
|
+
if (!/^[A-Za-zÀ-ÖØ-öø-ÿ' -]+$/.test(normalized)) {
|
|
153
|
+
return fail("INVALID_CHARACTERS", "Name contains unsupported characters.");
|
|
154
|
+
}
|
|
155
|
+
return ok("Valid name.");
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Boolean wrapper for `validateName`.
|
|
159
|
+
*
|
|
160
|
+
* @param value - Name string.
|
|
161
|
+
* @param options - Validation options.
|
|
162
|
+
* @returns `true` when the value is valid.
|
|
163
|
+
*/
|
|
164
|
+
export function isValidName(value, options = {}) {
|
|
165
|
+
return validateName(value, options).ok;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Validates an email shape.
|
|
169
|
+
*
|
|
170
|
+
* @param value - Email string.
|
|
171
|
+
* @returns Structured validation result.
|
|
172
|
+
*/
|
|
173
|
+
export function validateEmail(value) {
|
|
174
|
+
const normalized = value.trim();
|
|
175
|
+
if (!normalized) {
|
|
176
|
+
return fail("EMPTY", "Email cannot be empty.");
|
|
65
177
|
}
|
|
66
|
-
return /^[
|
|
178
|
+
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(normalized)
|
|
179
|
+
? ok("Valid email.")
|
|
180
|
+
: fail("INVALID_FORMAT", "Email does not match expected format.");
|
|
67
181
|
}
|
|
68
182
|
/**
|
|
69
|
-
*
|
|
183
|
+
* Boolean wrapper for `validateEmail`.
|
|
70
184
|
*
|
|
71
185
|
* @param value - Email string.
|
|
72
|
-
* @returns `true` when
|
|
186
|
+
* @returns `true` when the value is valid.
|
|
73
187
|
*/
|
|
74
188
|
export function isEmail(value) {
|
|
75
|
-
return
|
|
189
|
+
return validateEmail(value).ok;
|
|
76
190
|
}
|
|
77
191
|
/**
|
|
78
192
|
* Validates an HTTP(S) URL.
|
|
79
193
|
*
|
|
80
194
|
* @param value - URL string.
|
|
81
|
-
* @returns
|
|
195
|
+
* @returns Structured validation result.
|
|
82
196
|
*/
|
|
83
|
-
export function
|
|
197
|
+
export function validateHttpUrl(value) {
|
|
198
|
+
const normalized = value.trim();
|
|
199
|
+
if (!normalized) {
|
|
200
|
+
return fail("EMPTY", "URL cannot be empty.");
|
|
201
|
+
}
|
|
84
202
|
try {
|
|
85
|
-
const parsed = new URL(
|
|
86
|
-
|
|
203
|
+
const parsed = new URL(normalized);
|
|
204
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
205
|
+
return fail("INVALID_FORMAT", "Only HTTP and HTTPS URLs are supported.");
|
|
206
|
+
}
|
|
207
|
+
return ok("Valid URL.");
|
|
87
208
|
}
|
|
88
209
|
catch {
|
|
89
|
-
return
|
|
210
|
+
return fail("INVALID_FORMAT", "URL does not match expected format.");
|
|
90
211
|
}
|
|
91
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Boolean wrapper for `validateHttpUrl`.
|
|
215
|
+
*
|
|
216
|
+
* @param value - URL string.
|
|
217
|
+
* @returns `true` when the value is valid.
|
|
218
|
+
*/
|
|
219
|
+
export function isHttpUrl(value) {
|
|
220
|
+
return validateHttpUrl(value).ok;
|
|
221
|
+
}
|
|
92
222
|
/**
|
|
93
223
|
* Validates US-style postal codes (`12345` or `12345-6789`).
|
|
94
224
|
*
|
|
95
225
|
* @param value - Postal code string.
|
|
96
|
-
* @returns
|
|
226
|
+
* @returns Structured validation result.
|
|
227
|
+
*/
|
|
228
|
+
export function validatePostalCode(value) {
|
|
229
|
+
const normalized = value.trim();
|
|
230
|
+
if (!normalized) {
|
|
231
|
+
return fail("EMPTY", "Postal code cannot be empty.");
|
|
232
|
+
}
|
|
233
|
+
return /^\d{5}(?:-\d{4})?$/.test(normalized)
|
|
234
|
+
? ok("Valid postal code.")
|
|
235
|
+
: fail("INVALID_FORMAT", "Postal code does not match supported formats.");
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Boolean wrapper for `validatePostalCode`.
|
|
239
|
+
*
|
|
240
|
+
* @param value - Postal code string.
|
|
241
|
+
* @returns `true` when the value is valid.
|
|
97
242
|
*/
|
|
98
243
|
export function isPostalCode(value) {
|
|
99
|
-
return
|
|
244
|
+
return validatePostalCode(value).ok;
|
|
100
245
|
}
|
|
101
246
|
/**
|
|
102
|
-
* Validates password strength
|
|
247
|
+
* Validates password strength using default security checks.
|
|
103
248
|
*
|
|
104
249
|
* @param value - Password candidate.
|
|
105
250
|
* @param options - Validation options.
|
|
106
251
|
* @param options.minLength - Minimum required length.
|
|
107
|
-
* @returns
|
|
252
|
+
* @returns Structured validation result.
|
|
108
253
|
*/
|
|
109
|
-
export function
|
|
254
|
+
export function validateStrongPassword(value, options = {}) {
|
|
110
255
|
const minLength = options.minLength ?? 8;
|
|
256
|
+
if (!value) {
|
|
257
|
+
return fail("EMPTY", "Password cannot be empty.");
|
|
258
|
+
}
|
|
111
259
|
if (value.length < minLength) {
|
|
112
|
-
return
|
|
260
|
+
return fail("TOO_SHORT", `Password must have at least ${minLength} characters.`);
|
|
113
261
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
262
|
+
if (!/[A-Z]/.test(value) || !/[a-z]/.test(value) || !/\d/.test(value) || !/[^A-Za-z0-9]/.test(value)) {
|
|
263
|
+
return fail("INVALID_FORMAT", "Password must include upper, lower, digit, and symbol characters.");
|
|
264
|
+
}
|
|
265
|
+
return ok("Strong password.");
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Boolean wrapper for `validateStrongPassword`.
|
|
269
|
+
*
|
|
270
|
+
* @param value - Password candidate.
|
|
271
|
+
* @param options - Validation options.
|
|
272
|
+
* @returns `true` when the value is valid.
|
|
273
|
+
*/
|
|
274
|
+
export function isStrongPassword(value, options = {}) {
|
|
275
|
+
return validateStrongPassword(value, options).ok;
|
|
119
276
|
}
|
|
120
277
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAmBA,MAAM,kBAAkB,GAAiD;IACvE,EAAE,EAAE,IAAI,GAAG,CAAC;QACV,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG;QACH,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,OAAO;QACP,MAAM;QACN,MAAM;QACN,WAAW;QACX,WAAW;QACX,WAAW;QACX,WAAW;KACZ,CAAC;IACF,EAAE,EAAE,IAAI,GAAG,CAAC;QACV,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG;QACH,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,KAAK;QACL,MAAM;QACN,OAAO;QACP,SAAS;QACT,UAAU;QACV,SAAS;QACT,UAAU;KACX,CAAC;CACH,CAAC;AAEF,MAAM,aAAa,GAAuF;IACxG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IACpC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IACpC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IACpC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;CACpC,CAAC;AAEF,SAAS,EAAE,CAAC,OAAO,GAAG,oBAAoB;IACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,IAAI,CAAC,IAA4C,EAAE,OAAe;IACzE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAa,EACb,UAKI,EAAE;IAEN,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAEzC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC,qBAAqB,EAAE,+BAA+B,OAAO,GAAG,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;IAE1D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,gBAAgB,EAAE,2CAA2C,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACpE,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5F,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IAExD,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,mCAAmC,SAAS,UAAU,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,UAAU,EAAE,kCAAkC,SAAS,UAAU,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,EAAE,CAAC,yBAAyB,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,UAKI,EAAE;IAEN,OAAO,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAa,EACb,UAAwC,EAAE;IAE1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,oBAAoB,EAAE,iCAAiC,MAAM,GAAG,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QAC/C,CAAC,CAAC,EAAE,CAAC,0BAA0B,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,6CAA6C,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,UAAwC,EAAE;IAC1F,OAAO,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,UAAsD,EAAE;IAExD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAEhC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,WAAW,EAAE,2BAA2B,SAAS,cAAc,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,UAAU,EAAE,0BAA0B,SAAS,cAAc,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,oBAAoB,EAAE,uCAAuC,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,UAAsD,EAAE;IACjG,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,4BAA4B,CAAC,IAAI,CAAC,UAAU,CAAC;QAClD,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC;QACpB,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,uCAAuC,CAAC,CAAC;AACtE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC,gBAAgB,EAAE,yCAAyC,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,gBAAgB,EAAE,qCAAqC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC,oBAAoB,CAAC;QAC1B,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,+CAA+C,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,UAAkC,EAAE;IACxF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;IAEzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,+BAA+B,SAAS,cAAc,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrG,OAAO,IAAI,CAAC,gBAAgB,EAAE,mEAAmE,CAAC,CAAC;IACrG,CAAC;IAED,OAAO,EAAE,CAAC,kBAAkB,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAAkC,EAAE;IAClF,OAAO,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC"}
|
package/package.json
CHANGED