@jdsalasc/solvejs-validators 1.0.3 → 1.2.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 CHANGED
@@ -1,19 +1,18 @@
1
1
  # @jdsalasc/solvejs-validators
2
2
 
3
- Validation helpers for common web and app form pain points.
3
+ Zero-dependency validators for real-world JS/TS forms with structured error results.
4
+
5
+ ## Tools Included
6
+
7
+ - `validateCellphoneNumber` (country presets)
8
+ - `validateAddressDirection` (locale support)
9
+ - `validateName`, `validateUsername`, `validateAddressLine`
10
+ - `validateEmail`, `validateHttpUrl`, `validatePostalCode`
11
+ - `validateStrongPassword`, `validateCreditCardNumber`
12
+ - Boolean wrappers (`isX`) for quick checks
4
13
 
5
14
  ## Install
6
15
 
7
16
  ```bash
8
17
  npm i @jdsalasc/solvejs-validators
9
18
  ```
10
-
11
- ## Example
12
-
13
- ```ts
14
- import { isCellphoneNumber, isAddressDirection, isValidName } from "@jdsalasc/solvejs-validators";
15
-
16
- isCellphoneNumber("+573001112233");
17
- isAddressDirection("NORTH");
18
- isValidName("Maria Fernanda");
19
- ```
@@ -1,129 +1,439 @@
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.isAddresDirection = isAddresDirection;
8
+ exports.isAddresDirrection = isAddresDirrection;
9
+ exports.validateName = validateName;
5
10
  exports.isValidName = isValidName;
11
+ exports.validateUsername = validateUsername;
12
+ exports.isUsername = isUsername;
13
+ exports.validateEmail = validateEmail;
6
14
  exports.isEmail = isEmail;
15
+ exports.validateHttpUrl = validateHttpUrl;
7
16
  exports.isHttpUrl = isHttpUrl;
17
+ exports.validatePostalCode = validatePostalCode;
8
18
  exports.isPostalCode = isPostalCode;
19
+ exports.validateAddressLine = validateAddressLine;
20
+ exports.isAddressLine = isAddressLine;
21
+ exports.validateStrongPassword = validateStrongPassword;
9
22
  exports.isStrongPassword = isStrongPassword;
10
- const ADDRESS_DIRECTIONS = new Set([
11
- "N",
12
- "S",
13
- "E",
14
- "W",
15
- "NE",
16
- "NW",
17
- "SE",
18
- "SW",
19
- "NORTH",
20
- "SOUTH",
21
- "EAST",
22
- "WEST",
23
- "NORTHEAST",
24
- "NORTHWEST",
25
- "SOUTHEAST",
26
- "SOUTHWEST"
27
- ]);
28
- /**
29
- * Checks whether a string is a valid international or local cellphone number.
23
+ exports.validateCreditCardNumber = validateCreditCardNumber;
24
+ exports.isCreditCardNumber = isCreditCardNumber;
25
+ const ADDRESS_DIRECTIONS = {
26
+ en: new Set([
27
+ "N",
28
+ "S",
29
+ "E",
30
+ "W",
31
+ "NE",
32
+ "NW",
33
+ "SE",
34
+ "SW",
35
+ "NORTH",
36
+ "SOUTH",
37
+ "EAST",
38
+ "WEST",
39
+ "NORTHEAST",
40
+ "NORTHWEST",
41
+ "SOUTHEAST",
42
+ "SOUTHWEST"
43
+ ]),
44
+ es: new Set([
45
+ "N",
46
+ "S",
47
+ "E",
48
+ "O",
49
+ "NE",
50
+ "NO",
51
+ "SE",
52
+ "SO",
53
+ "NORTE",
54
+ "SUR",
55
+ "ESTE",
56
+ "OESTE",
57
+ "NORESTE",
58
+ "NOROESTE",
59
+ "SURESTE",
60
+ "SUROESTE"
61
+ ])
62
+ };
63
+ const COUNTRY_RULES = {
64
+ US: { minDigits: 10, maxDigits: 11 },
65
+ CO: { minDigits: 10, maxDigits: 12 },
66
+ MX: { minDigits: 10, maxDigits: 13 },
67
+ ES: { minDigits: 9, maxDigits: 11 }
68
+ };
69
+ function ok(message = "Validation passed.") {
70
+ return { ok: true, code: "VALID", message };
71
+ }
72
+ function fail(code, message) {
73
+ return { ok: false, code, message };
74
+ }
75
+ /**
76
+ * Validates cellphone numbers using regional presets.
30
77
  *
31
78
  * @param value - Input phone string.
32
79
  * @param options - Validation options.
33
80
  * @param options.allowInternational - Allows a leading `+`.
34
- * @param options.minDigits - Minimum number of digits.
35
- * @param options.maxDigits - Maximum number of digits.
36
- * @returns `true` when the input matches configured constraints.
81
+ * @param options.country - Country preset used for length constraints.
82
+ * @param options.minDigits - Override minimum digits.
83
+ * @param options.maxDigits - Override maximum digits.
84
+ * @returns Structured validation result.
37
85
  */
38
- function isCellphoneNumber(value, options = {}) {
86
+ function validateCellphoneNumber(value, options = {}) {
39
87
  const allowInternational = options.allowInternational ?? true;
40
- const minDigits = options.minDigits ?? 7;
41
- const maxDigits = options.maxDigits ?? 15;
42
- const normalized = value.trim().replace(/[\s().-]/g, "");
88
+ const country = options.country ?? "ANY";
89
+ if (!["ANY", "US", "CO", "MX", "ES"].includes(country)) {
90
+ return fail("UNSUPPORTED_COUNTRY", `Unsupported country preset: ${country}.`);
91
+ }
92
+ const normalized = value.trim();
93
+ if (normalized.length === 0) {
94
+ return fail("EMPTY", "Phone number cannot be empty.");
95
+ }
96
+ const compact = normalized.replace(/[\s().-]/g, "");
43
97
  const pattern = allowInternational ? /^\+?\d+$/ : /^\d+$/;
44
- if (!pattern.test(normalized)) {
45
- return false;
98
+ if (!pattern.test(compact)) {
99
+ return fail("INVALID_FORMAT", "Phone number contains invalid characters.");
100
+ }
101
+ const digits = compact.startsWith("+") ? compact.slice(1) : compact;
102
+ const preset = country === "ANY" ? { minDigits: 7, maxDigits: 15 } : COUNTRY_RULES[country];
103
+ const minDigits = options.minDigits ?? preset.minDigits;
104
+ const maxDigits = options.maxDigits ?? preset.maxDigits;
105
+ if (digits.length < minDigits) {
106
+ return fail("TOO_SHORT", `Phone number must have at least ${minDigits} digits.`);
46
107
  }
47
- const digits = normalized.startsWith("+") ? normalized.slice(1) : normalized;
48
- return digits.length >= minDigits && digits.length <= maxDigits;
108
+ if (digits.length > maxDigits) {
109
+ return fail("TOO_LONG", `Phone number must have at most ${maxDigits} digits.`);
110
+ }
111
+ return ok("Valid cellphone number.");
112
+ }
113
+ /**
114
+ * Boolean wrapper for `validateCellphoneNumber`.
115
+ *
116
+ * @param value - Input phone string.
117
+ * @param options - Validation options.
118
+ * @returns `true` when the value is valid.
119
+ */
120
+ function isCellphoneNumber(value, options = {}) {
121
+ return validateCellphoneNumber(value, options).ok;
122
+ }
123
+ /**
124
+ * Validates address direction using localized dictionaries.
125
+ *
126
+ * @param value - Direction text.
127
+ * @param options - Validation options.
128
+ * @param options.locale - Locale dictionary (`en`, `es`).
129
+ * @returns Structured validation result.
130
+ */
131
+ function validateAddressDirection(value, options = {}) {
132
+ const locale = options.locale ?? "en";
133
+ if (!ADDRESS_DIRECTIONS[locale]) {
134
+ return fail("UNSUPPORTED_LOCALE", `Unsupported direction locale: ${locale}.`);
135
+ }
136
+ const normalized = value.trim().toUpperCase();
137
+ if (!normalized) {
138
+ return fail("EMPTY", "Direction cannot be empty.");
139
+ }
140
+ return ADDRESS_DIRECTIONS[locale].has(normalized)
141
+ ? ok("Valid address direction.")
142
+ : fail("INVALID_FORMAT", "Direction does not match locale dictionary.");
143
+ }
144
+ /**
145
+ * Boolean wrapper for `validateAddressDirection`.
146
+ *
147
+ * @param value - Direction text.
148
+ * @param options - Validation options.
149
+ * @returns `true` when the value is valid.
150
+ */
151
+ function isAddressDirection(value, options = {}) {
152
+ return validateAddressDirection(value, options).ok;
153
+ }
154
+ /**
155
+ * Backward-compatible alias for users who typed the previous function with one missing `d`.
156
+ *
157
+ * @param value - Direction text.
158
+ * @param options - Validation options.
159
+ * @returns `true` when the direction is valid.
160
+ */
161
+ function isAddresDirection(value, options = {}) {
162
+ return isAddressDirection(value, options);
49
163
  }
50
164
  /**
51
- * Validates common cardinal and intercardinal address directions.
165
+ * Backward-compatible alias for users who typed the previous function with two spelling mistakes.
52
166
  *
53
167
  * @param value - Direction text.
54
- * @returns `true` when the input matches known direction tokens.
168
+ * @param options - Validation options.
169
+ * @returns `true` when the direction is valid.
55
170
  */
56
- function isAddressDirection(value) {
57
- return ADDRESS_DIRECTIONS.has(value.trim().toUpperCase());
171
+ function isAddresDirrection(value, options = {}) {
172
+ return isAddressDirection(value, options);
58
173
  }
59
174
  /**
60
- * Validates names using practical rules for most user forms.
175
+ * Validates person names with practical production constraints.
61
176
  *
62
177
  * @param value - Name string.
63
178
  * @param options - Validation options.
64
179
  * @param options.minLength - Minimum total length.
65
180
  * @param options.maxLength - Maximum total length.
66
- * @returns `true` when the name is considered valid.
181
+ * @returns Structured validation result.
67
182
  */
68
- function isValidName(value, options = {}) {
183
+ function validateName(value, options = {}) {
69
184
  const minLength = options.minLength ?? 2;
70
185
  const maxLength = options.maxLength ?? 80;
71
186
  const normalized = value.trim();
72
- if (normalized.length < minLength || normalized.length > maxLength) {
73
- return false;
187
+ if (!normalized) {
188
+ return fail("EMPTY", "Name cannot be empty.");
189
+ }
190
+ if (normalized.length < minLength) {
191
+ return fail("TOO_SHORT", `Name must have at least ${minLength} characters.`);
192
+ }
193
+ if (normalized.length > maxLength) {
194
+ return fail("TOO_LONG", `Name must have at most ${maxLength} characters.`);
195
+ }
196
+ if (!/^[A-Za-zÀ-ÖØ-öø-ÿ' -]+$/.test(normalized)) {
197
+ return fail("INVALID_CHARACTERS", "Name contains unsupported characters.");
198
+ }
199
+ return ok("Valid name.");
200
+ }
201
+ /**
202
+ * Boolean wrapper for `validateName`.
203
+ *
204
+ * @param value - Name string.
205
+ * @param options - Validation options.
206
+ * @returns `true` when the value is valid.
207
+ */
208
+ function isValidName(value, options = {}) {
209
+ return validateName(value, options).ok;
210
+ }
211
+ /**
212
+ * Validates usernames used in sign-up forms.
213
+ *
214
+ * @param value - Username candidate.
215
+ * @param options - Validation options.
216
+ * @param options.minLength - Minimum length.
217
+ * @param options.maxLength - Maximum length.
218
+ * @returns Structured validation result.
219
+ */
220
+ function validateUsername(value, options = {}) {
221
+ const minLength = options.minLength ?? 3;
222
+ const maxLength = options.maxLength ?? 30;
223
+ const normalized = value.trim();
224
+ if (!normalized) {
225
+ return fail("EMPTY", "Username cannot be empty.");
226
+ }
227
+ if (normalized.length < minLength) {
228
+ return fail("TOO_SHORT", `Username must have at least ${minLength} characters.`);
229
+ }
230
+ if (normalized.length > maxLength) {
231
+ return fail("TOO_LONG", `Username must have at most ${maxLength} characters.`);
232
+ }
233
+ if (!/^[a-zA-Z0-9_]+$/.test(normalized)) {
234
+ return fail("INVALID_CHARACTERS", "Username can only contain letters, numbers, and underscores.");
235
+ }
236
+ return ok("Valid username.");
237
+ }
238
+ /**
239
+ * Boolean wrapper for `validateUsername`.
240
+ *
241
+ * @param value - Username candidate.
242
+ * @param options - Validation options.
243
+ * @returns `true` when the username is valid.
244
+ */
245
+ function isUsername(value, options = {}) {
246
+ return validateUsername(value, options).ok;
247
+ }
248
+ /**
249
+ * Validates an email shape.
250
+ *
251
+ * @param value - Email string.
252
+ * @returns Structured validation result.
253
+ */
254
+ function validateEmail(value) {
255
+ const normalized = value.trim();
256
+ if (!normalized) {
257
+ return fail("EMPTY", "Email cannot be empty.");
74
258
  }
75
- return /^[A-Za-zÀ-ÖØ-öø-ÿ' -]+$/.test(normalized);
259
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(normalized)
260
+ ? ok("Valid email.")
261
+ : fail("INVALID_FORMAT", "Email does not match expected format.");
76
262
  }
77
263
  /**
78
- * Validates an email using practical constraints for application forms.
264
+ * Boolean wrapper for `validateEmail`.
79
265
  *
80
266
  * @param value - Email string.
81
- * @returns `true` when email shape is valid.
267
+ * @returns `true` when the value is valid.
82
268
  */
83
269
  function isEmail(value) {
84
- return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value.trim());
270
+ return validateEmail(value).ok;
85
271
  }
86
272
  /**
87
273
  * Validates an HTTP(S) URL.
88
274
  *
89
275
  * @param value - URL string.
90
- * @returns `true` when URL is valid and protocol is HTTP or HTTPS.
276
+ * @returns Structured validation result.
91
277
  */
92
- function isHttpUrl(value) {
278
+ function validateHttpUrl(value) {
279
+ const normalized = value.trim();
280
+ if (!normalized) {
281
+ return fail("EMPTY", "URL cannot be empty.");
282
+ }
93
283
  try {
94
- const parsed = new URL(value.trim());
95
- return parsed.protocol === "http:" || parsed.protocol === "https:";
284
+ const parsed = new URL(normalized);
285
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
286
+ return fail("INVALID_FORMAT", "Only HTTP and HTTPS URLs are supported.");
287
+ }
288
+ return ok("Valid URL.");
96
289
  }
97
290
  catch {
98
- return false;
291
+ return fail("INVALID_FORMAT", "URL does not match expected format.");
99
292
  }
100
293
  }
294
+ /**
295
+ * Boolean wrapper for `validateHttpUrl`.
296
+ *
297
+ * @param value - URL string.
298
+ * @returns `true` when the value is valid.
299
+ */
300
+ function isHttpUrl(value) {
301
+ return validateHttpUrl(value).ok;
302
+ }
101
303
  /**
102
304
  * Validates US-style postal codes (`12345` or `12345-6789`).
103
305
  *
104
306
  * @param value - Postal code string.
105
- * @returns `true` when value matches supported postal formats.
307
+ * @returns Structured validation result.
308
+ */
309
+ function validatePostalCode(value) {
310
+ const normalized = value.trim();
311
+ if (!normalized) {
312
+ return fail("EMPTY", "Postal code cannot be empty.");
313
+ }
314
+ return /^\d{5}(?:-\d{4})?$/.test(normalized)
315
+ ? ok("Valid postal code.")
316
+ : fail("INVALID_FORMAT", "Postal code does not match supported formats.");
317
+ }
318
+ /**
319
+ * Boolean wrapper for `validatePostalCode`.
320
+ *
321
+ * @param value - Postal code string.
322
+ * @returns `true` when the value is valid.
106
323
  */
107
324
  function isPostalCode(value) {
108
- return /^\d{5}(?:-\d{4})?$/.test(value.trim());
325
+ return validatePostalCode(value).ok;
326
+ }
327
+ /**
328
+ * Validates address line input for common delivery/billing forms.
329
+ *
330
+ * @param value - Address line string.
331
+ * @param options - Validation options.
332
+ * @param options.minLength - Minimum length.
333
+ * @param options.maxLength - Maximum length.
334
+ * @returns Structured validation result.
335
+ */
336
+ function validateAddressLine(value, options = {}) {
337
+ const minLength = options.minLength ?? 5;
338
+ const maxLength = options.maxLength ?? 120;
339
+ const normalized = value.trim();
340
+ if (!normalized) {
341
+ return fail("EMPTY", "Address line cannot be empty.");
342
+ }
343
+ if (normalized.length < minLength) {
344
+ return fail("TOO_SHORT", `Address line must have at least ${minLength} characters.`);
345
+ }
346
+ if (normalized.length > maxLength) {
347
+ return fail("TOO_LONG", `Address line must have at most ${maxLength} characters.`);
348
+ }
349
+ if (!/^[A-Za-z0-9À-ÖØ-öø-ÿ#.,'\/ -]+$/.test(normalized)) {
350
+ return fail("INVALID_CHARACTERS", "Address line contains unsupported characters.");
351
+ }
352
+ return ok("Valid address line.");
353
+ }
354
+ /**
355
+ * Boolean wrapper for `validateAddressLine`.
356
+ *
357
+ * @param value - Address line string.
358
+ * @param options - Validation options.
359
+ * @returns `true` when the address line is valid.
360
+ */
361
+ function isAddressLine(value, options = {}) {
362
+ return validateAddressLine(value, options).ok;
109
363
  }
110
364
  /**
111
- * Validates password strength with common security requirements.
365
+ * Validates password strength using default security checks.
112
366
  *
113
367
  * @param value - Password candidate.
114
368
  * @param options - Validation options.
115
369
  * @param options.minLength - Minimum required length.
116
- * @returns `true` when password meets complexity requirements.
370
+ * @returns Structured validation result.
117
371
  */
118
- function isStrongPassword(value, options = {}) {
372
+ function validateStrongPassword(value, options = {}) {
119
373
  const minLength = options.minLength ?? 8;
374
+ if (!value) {
375
+ return fail("EMPTY", "Password cannot be empty.");
376
+ }
120
377
  if (value.length < minLength) {
121
- return false;
378
+ return fail("TOO_SHORT", `Password must have at least ${minLength} characters.`);
122
379
  }
123
- const hasUpper = /[A-Z]/.test(value);
124
- const hasLower = /[a-z]/.test(value);
125
- const hasDigit = /\d/.test(value);
126
- const hasSymbol = /[^A-Za-z0-9]/.test(value);
127
- return hasUpper && hasLower && hasDigit && hasSymbol;
380
+ if (!/[A-Z]/.test(value) || !/[a-z]/.test(value) || !/\d/.test(value) || !/[^A-Za-z0-9]/.test(value)) {
381
+ return fail("INVALID_FORMAT", "Password must include upper, lower, digit, and symbol characters.");
382
+ }
383
+ return ok("Strong password.");
384
+ }
385
+ /**
386
+ * Boolean wrapper for `validateStrongPassword`.
387
+ *
388
+ * @param value - Password candidate.
389
+ * @param options - Validation options.
390
+ * @returns `true` when the value is valid.
391
+ */
392
+ function isStrongPassword(value, options = {}) {
393
+ return validateStrongPassword(value, options).ok;
394
+ }
395
+ function luhnCheck(value) {
396
+ let sum = 0;
397
+ let shouldDouble = false;
398
+ for (let index = value.length - 1; index >= 0; index -= 1) {
399
+ let digit = Number(value[index]);
400
+ if (shouldDouble) {
401
+ digit *= 2;
402
+ if (digit > 9) {
403
+ digit -= 9;
404
+ }
405
+ }
406
+ sum += digit;
407
+ shouldDouble = !shouldDouble;
408
+ }
409
+ return sum % 10 === 0;
410
+ }
411
+ /**
412
+ * Validates card numbers using basic shape checks plus Luhn checksum.
413
+ *
414
+ * @param value - Card number candidate.
415
+ * @returns Structured validation result.
416
+ */
417
+ function validateCreditCardNumber(value) {
418
+ const normalized = value.replace(/[\s-]/g, "");
419
+ if (!normalized) {
420
+ return fail("EMPTY", "Card number cannot be empty.");
421
+ }
422
+ if (!/^\d{12,19}$/.test(normalized)) {
423
+ return fail("INVALID_FORMAT", "Card number must contain only digits and valid length.");
424
+ }
425
+ if (!luhnCheck(normalized)) {
426
+ return fail("CHECKSUM_FAILED", "Card number checksum is invalid.");
427
+ }
428
+ return ok("Valid card number.");
429
+ }
430
+ /**
431
+ * Boolean wrapper for `validateCreditCardNumber`.
432
+ *
433
+ * @param value - Card number candidate.
434
+ * @returns `true` when the card number is valid.
435
+ */
436
+ function isCreditCardNumber(value) {
437
+ return validateCreditCardNumber(value).ok;
128
438
  }
129
439
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}