@jdsalasc/solvejs-validators 1.1.0 → 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 +10 -21
- package/dist/cjs/index.cjs +146 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.d.ts +83 -1
- package/dist/esm/index.js +138 -0
- package/dist/esm/index.js.map +1 -1
- package/package.json +7 -5
package/README.md
CHANGED
|
@@ -1,29 +1,18 @@
|
|
|
1
1
|
# @jdsalasc/solvejs-validators
|
|
2
2
|
|
|
3
|
-
|
|
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, validateCellphoneNumber, validateName } from "@jdsalasc/solvejs-validators";
|
|
15
|
-
|
|
16
|
-
isCellphoneNumber("+573001112233");
|
|
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
|
-
};
|
|
29
|
-
```
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -4,16 +4,24 @@ exports.validateCellphoneNumber = validateCellphoneNumber;
|
|
|
4
4
|
exports.isCellphoneNumber = isCellphoneNumber;
|
|
5
5
|
exports.validateAddressDirection = validateAddressDirection;
|
|
6
6
|
exports.isAddressDirection = isAddressDirection;
|
|
7
|
+
exports.isAddresDirection = isAddresDirection;
|
|
8
|
+
exports.isAddresDirrection = isAddresDirrection;
|
|
7
9
|
exports.validateName = validateName;
|
|
8
10
|
exports.isValidName = isValidName;
|
|
11
|
+
exports.validateUsername = validateUsername;
|
|
12
|
+
exports.isUsername = isUsername;
|
|
9
13
|
exports.validateEmail = validateEmail;
|
|
10
14
|
exports.isEmail = isEmail;
|
|
11
15
|
exports.validateHttpUrl = validateHttpUrl;
|
|
12
16
|
exports.isHttpUrl = isHttpUrl;
|
|
13
17
|
exports.validatePostalCode = validatePostalCode;
|
|
14
18
|
exports.isPostalCode = isPostalCode;
|
|
19
|
+
exports.validateAddressLine = validateAddressLine;
|
|
20
|
+
exports.isAddressLine = isAddressLine;
|
|
15
21
|
exports.validateStrongPassword = validateStrongPassword;
|
|
16
22
|
exports.isStrongPassword = isStrongPassword;
|
|
23
|
+
exports.validateCreditCardNumber = validateCreditCardNumber;
|
|
24
|
+
exports.isCreditCardNumber = isCreditCardNumber;
|
|
17
25
|
const ADDRESS_DIRECTIONS = {
|
|
18
26
|
en: new Set([
|
|
19
27
|
"N",
|
|
@@ -143,6 +151,26 @@ function validateAddressDirection(value, options = {}) {
|
|
|
143
151
|
function isAddressDirection(value, options = {}) {
|
|
144
152
|
return validateAddressDirection(value, options).ok;
|
|
145
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);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Backward-compatible alias for users who typed the previous function with two spelling mistakes.
|
|
166
|
+
*
|
|
167
|
+
* @param value - Direction text.
|
|
168
|
+
* @param options - Validation options.
|
|
169
|
+
* @returns `true` when the direction is valid.
|
|
170
|
+
*/
|
|
171
|
+
function isAddresDirrection(value, options = {}) {
|
|
172
|
+
return isAddressDirection(value, options);
|
|
173
|
+
}
|
|
146
174
|
/**
|
|
147
175
|
* Validates person names with practical production constraints.
|
|
148
176
|
*
|
|
@@ -180,6 +208,43 @@ function validateName(value, options = {}) {
|
|
|
180
208
|
function isValidName(value, options = {}) {
|
|
181
209
|
return validateName(value, options).ok;
|
|
182
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
|
+
}
|
|
183
248
|
/**
|
|
184
249
|
* Validates an email shape.
|
|
185
250
|
*
|
|
@@ -259,6 +324,43 @@ function validatePostalCode(value) {
|
|
|
259
324
|
function isPostalCode(value) {
|
|
260
325
|
return validatePostalCode(value).ok;
|
|
261
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;
|
|
363
|
+
}
|
|
262
364
|
/**
|
|
263
365
|
* Validates password strength using default security checks.
|
|
264
366
|
*
|
|
@@ -290,4 +392,48 @@ function validateStrongPassword(value, options = {}) {
|
|
|
290
392
|
function isStrongPassword(value, options = {}) {
|
|
291
393
|
return validateStrongPassword(value, options).ok;
|
|
292
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;
|
|
438
|
+
}
|
|
293
439
|
//# 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,4 +1,4 @@
|
|
|
1
|
-
export type ValidationResultCode = "VALID" | "EMPTY" | "INVALID_FORMAT" | "TOO_SHORT" | "TOO_LONG" | "INVALID_CHARACTERS" | "UNSUPPORTED_LOCALE" | "UNSUPPORTED_COUNTRY";
|
|
1
|
+
export type ValidationResultCode = "VALID" | "EMPTY" | "INVALID_FORMAT" | "TOO_SHORT" | "TOO_LONG" | "INVALID_CHARACTERS" | "UNSUPPORTED_LOCALE" | "UNSUPPORTED_COUNTRY" | "CHECKSUM_FAILED";
|
|
2
2
|
export type ValidationResult = {
|
|
3
3
|
ok: boolean;
|
|
4
4
|
code: ValidationResultCode;
|
|
@@ -57,6 +57,26 @@ export declare function validateAddressDirection(value: string, options?: {
|
|
|
57
57
|
export declare function isAddressDirection(value: string, options?: {
|
|
58
58
|
locale?: DirectionLocale;
|
|
59
59
|
}): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Backward-compatible alias for users who typed the previous function with one missing `d`.
|
|
62
|
+
*
|
|
63
|
+
* @param value - Direction text.
|
|
64
|
+
* @param options - Validation options.
|
|
65
|
+
* @returns `true` when the direction is valid.
|
|
66
|
+
*/
|
|
67
|
+
export declare function isAddresDirection(value: string, options?: {
|
|
68
|
+
locale?: DirectionLocale;
|
|
69
|
+
}): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Backward-compatible alias for users who typed the previous function with two spelling mistakes.
|
|
72
|
+
*
|
|
73
|
+
* @param value - Direction text.
|
|
74
|
+
* @param options - Validation options.
|
|
75
|
+
* @returns `true` when the direction is valid.
|
|
76
|
+
*/
|
|
77
|
+
export declare function isAddresDirrection(value: string, options?: {
|
|
78
|
+
locale?: DirectionLocale;
|
|
79
|
+
}): boolean;
|
|
60
80
|
/**
|
|
61
81
|
* Validates person names with practical production constraints.
|
|
62
82
|
*
|
|
@@ -81,6 +101,30 @@ export declare function isValidName(value: string, options?: {
|
|
|
81
101
|
minLength?: number;
|
|
82
102
|
maxLength?: number;
|
|
83
103
|
}): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Validates usernames used in sign-up forms.
|
|
106
|
+
*
|
|
107
|
+
* @param value - Username candidate.
|
|
108
|
+
* @param options - Validation options.
|
|
109
|
+
* @param options.minLength - Minimum length.
|
|
110
|
+
* @param options.maxLength - Maximum length.
|
|
111
|
+
* @returns Structured validation result.
|
|
112
|
+
*/
|
|
113
|
+
export declare function validateUsername(value: string, options?: {
|
|
114
|
+
minLength?: number;
|
|
115
|
+
maxLength?: number;
|
|
116
|
+
}): ValidationResult;
|
|
117
|
+
/**
|
|
118
|
+
* Boolean wrapper for `validateUsername`.
|
|
119
|
+
*
|
|
120
|
+
* @param value - Username candidate.
|
|
121
|
+
* @param options - Validation options.
|
|
122
|
+
* @returns `true` when the username is valid.
|
|
123
|
+
*/
|
|
124
|
+
export declare function isUsername(value: string, options?: {
|
|
125
|
+
minLength?: number;
|
|
126
|
+
maxLength?: number;
|
|
127
|
+
}): boolean;
|
|
84
128
|
/**
|
|
85
129
|
* Validates an email shape.
|
|
86
130
|
*
|
|
@@ -123,6 +167,30 @@ export declare function validatePostalCode(value: string): ValidationResult;
|
|
|
123
167
|
* @returns `true` when the value is valid.
|
|
124
168
|
*/
|
|
125
169
|
export declare function isPostalCode(value: string): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* Validates address line input for common delivery/billing forms.
|
|
172
|
+
*
|
|
173
|
+
* @param value - Address line string.
|
|
174
|
+
* @param options - Validation options.
|
|
175
|
+
* @param options.minLength - Minimum length.
|
|
176
|
+
* @param options.maxLength - Maximum length.
|
|
177
|
+
* @returns Structured validation result.
|
|
178
|
+
*/
|
|
179
|
+
export declare function validateAddressLine(value: string, options?: {
|
|
180
|
+
minLength?: number;
|
|
181
|
+
maxLength?: number;
|
|
182
|
+
}): ValidationResult;
|
|
183
|
+
/**
|
|
184
|
+
* Boolean wrapper for `validateAddressLine`.
|
|
185
|
+
*
|
|
186
|
+
* @param value - Address line string.
|
|
187
|
+
* @param options - Validation options.
|
|
188
|
+
* @returns `true` when the address line is valid.
|
|
189
|
+
*/
|
|
190
|
+
export declare function isAddressLine(value: string, options?: {
|
|
191
|
+
minLength?: number;
|
|
192
|
+
maxLength?: number;
|
|
193
|
+
}): boolean;
|
|
126
194
|
/**
|
|
127
195
|
* Validates password strength using default security checks.
|
|
128
196
|
*
|
|
@@ -144,3 +212,17 @@ export declare function validateStrongPassword(value: string, options?: {
|
|
|
144
212
|
export declare function isStrongPassword(value: string, options?: {
|
|
145
213
|
minLength?: number;
|
|
146
214
|
}): boolean;
|
|
215
|
+
/**
|
|
216
|
+
* Validates card numbers using basic shape checks plus Luhn checksum.
|
|
217
|
+
*
|
|
218
|
+
* @param value - Card number candidate.
|
|
219
|
+
* @returns Structured validation result.
|
|
220
|
+
*/
|
|
221
|
+
export declare function validateCreditCardNumber(value: string): ValidationResult;
|
|
222
|
+
/**
|
|
223
|
+
* Boolean wrapper for `validateCreditCardNumber`.
|
|
224
|
+
*
|
|
225
|
+
* @param value - Card number candidate.
|
|
226
|
+
* @returns `true` when the card number is valid.
|
|
227
|
+
*/
|
|
228
|
+
export declare function isCreditCardNumber(value: string): boolean;
|
package/dist/esm/index.js
CHANGED
|
@@ -127,6 +127,26 @@ export function validateAddressDirection(value, options = {}) {
|
|
|
127
127
|
export function isAddressDirection(value, options = {}) {
|
|
128
128
|
return validateAddressDirection(value, options).ok;
|
|
129
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* Backward-compatible alias for users who typed the previous function with one missing `d`.
|
|
132
|
+
*
|
|
133
|
+
* @param value - Direction text.
|
|
134
|
+
* @param options - Validation options.
|
|
135
|
+
* @returns `true` when the direction is valid.
|
|
136
|
+
*/
|
|
137
|
+
export function isAddresDirection(value, options = {}) {
|
|
138
|
+
return isAddressDirection(value, options);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Backward-compatible alias for users who typed the previous function with two spelling mistakes.
|
|
142
|
+
*
|
|
143
|
+
* @param value - Direction text.
|
|
144
|
+
* @param options - Validation options.
|
|
145
|
+
* @returns `true` when the direction is valid.
|
|
146
|
+
*/
|
|
147
|
+
export function isAddresDirrection(value, options = {}) {
|
|
148
|
+
return isAddressDirection(value, options);
|
|
149
|
+
}
|
|
130
150
|
/**
|
|
131
151
|
* Validates person names with practical production constraints.
|
|
132
152
|
*
|
|
@@ -164,6 +184,43 @@ export function validateName(value, options = {}) {
|
|
|
164
184
|
export function isValidName(value, options = {}) {
|
|
165
185
|
return validateName(value, options).ok;
|
|
166
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Validates usernames used in sign-up forms.
|
|
189
|
+
*
|
|
190
|
+
* @param value - Username candidate.
|
|
191
|
+
* @param options - Validation options.
|
|
192
|
+
* @param options.minLength - Minimum length.
|
|
193
|
+
* @param options.maxLength - Maximum length.
|
|
194
|
+
* @returns Structured validation result.
|
|
195
|
+
*/
|
|
196
|
+
export function validateUsername(value, options = {}) {
|
|
197
|
+
const minLength = options.minLength ?? 3;
|
|
198
|
+
const maxLength = options.maxLength ?? 30;
|
|
199
|
+
const normalized = value.trim();
|
|
200
|
+
if (!normalized) {
|
|
201
|
+
return fail("EMPTY", "Username cannot be empty.");
|
|
202
|
+
}
|
|
203
|
+
if (normalized.length < minLength) {
|
|
204
|
+
return fail("TOO_SHORT", `Username must have at least ${minLength} characters.`);
|
|
205
|
+
}
|
|
206
|
+
if (normalized.length > maxLength) {
|
|
207
|
+
return fail("TOO_LONG", `Username must have at most ${maxLength} characters.`);
|
|
208
|
+
}
|
|
209
|
+
if (!/^[a-zA-Z0-9_]+$/.test(normalized)) {
|
|
210
|
+
return fail("INVALID_CHARACTERS", "Username can only contain letters, numbers, and underscores.");
|
|
211
|
+
}
|
|
212
|
+
return ok("Valid username.");
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Boolean wrapper for `validateUsername`.
|
|
216
|
+
*
|
|
217
|
+
* @param value - Username candidate.
|
|
218
|
+
* @param options - Validation options.
|
|
219
|
+
* @returns `true` when the username is valid.
|
|
220
|
+
*/
|
|
221
|
+
export function isUsername(value, options = {}) {
|
|
222
|
+
return validateUsername(value, options).ok;
|
|
223
|
+
}
|
|
167
224
|
/**
|
|
168
225
|
* Validates an email shape.
|
|
169
226
|
*
|
|
@@ -243,6 +300,43 @@ export function validatePostalCode(value) {
|
|
|
243
300
|
export function isPostalCode(value) {
|
|
244
301
|
return validatePostalCode(value).ok;
|
|
245
302
|
}
|
|
303
|
+
/**
|
|
304
|
+
* Validates address line input for common delivery/billing forms.
|
|
305
|
+
*
|
|
306
|
+
* @param value - Address line string.
|
|
307
|
+
* @param options - Validation options.
|
|
308
|
+
* @param options.minLength - Minimum length.
|
|
309
|
+
* @param options.maxLength - Maximum length.
|
|
310
|
+
* @returns Structured validation result.
|
|
311
|
+
*/
|
|
312
|
+
export function validateAddressLine(value, options = {}) {
|
|
313
|
+
const minLength = options.minLength ?? 5;
|
|
314
|
+
const maxLength = options.maxLength ?? 120;
|
|
315
|
+
const normalized = value.trim();
|
|
316
|
+
if (!normalized) {
|
|
317
|
+
return fail("EMPTY", "Address line cannot be empty.");
|
|
318
|
+
}
|
|
319
|
+
if (normalized.length < minLength) {
|
|
320
|
+
return fail("TOO_SHORT", `Address line must have at least ${minLength} characters.`);
|
|
321
|
+
}
|
|
322
|
+
if (normalized.length > maxLength) {
|
|
323
|
+
return fail("TOO_LONG", `Address line must have at most ${maxLength} characters.`);
|
|
324
|
+
}
|
|
325
|
+
if (!/^[A-Za-z0-9À-ÖØ-öø-ÿ#.,'\/ -]+$/.test(normalized)) {
|
|
326
|
+
return fail("INVALID_CHARACTERS", "Address line contains unsupported characters.");
|
|
327
|
+
}
|
|
328
|
+
return ok("Valid address line.");
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Boolean wrapper for `validateAddressLine`.
|
|
332
|
+
*
|
|
333
|
+
* @param value - Address line string.
|
|
334
|
+
* @param options - Validation options.
|
|
335
|
+
* @returns `true` when the address line is valid.
|
|
336
|
+
*/
|
|
337
|
+
export function isAddressLine(value, options = {}) {
|
|
338
|
+
return validateAddressLine(value, options).ok;
|
|
339
|
+
}
|
|
246
340
|
/**
|
|
247
341
|
* Validates password strength using default security checks.
|
|
248
342
|
*
|
|
@@ -274,4 +368,48 @@ export function validateStrongPassword(value, options = {}) {
|
|
|
274
368
|
export function isStrongPassword(value, options = {}) {
|
|
275
369
|
return validateStrongPassword(value, options).ok;
|
|
276
370
|
}
|
|
371
|
+
function luhnCheck(value) {
|
|
372
|
+
let sum = 0;
|
|
373
|
+
let shouldDouble = false;
|
|
374
|
+
for (let index = value.length - 1; index >= 0; index -= 1) {
|
|
375
|
+
let digit = Number(value[index]);
|
|
376
|
+
if (shouldDouble) {
|
|
377
|
+
digit *= 2;
|
|
378
|
+
if (digit > 9) {
|
|
379
|
+
digit -= 9;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
sum += digit;
|
|
383
|
+
shouldDouble = !shouldDouble;
|
|
384
|
+
}
|
|
385
|
+
return sum % 10 === 0;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Validates card numbers using basic shape checks plus Luhn checksum.
|
|
389
|
+
*
|
|
390
|
+
* @param value - Card number candidate.
|
|
391
|
+
* @returns Structured validation result.
|
|
392
|
+
*/
|
|
393
|
+
export function validateCreditCardNumber(value) {
|
|
394
|
+
const normalized = value.replace(/[\s-]/g, "");
|
|
395
|
+
if (!normalized) {
|
|
396
|
+
return fail("EMPTY", "Card number cannot be empty.");
|
|
397
|
+
}
|
|
398
|
+
if (!/^\d{12,19}$/.test(normalized)) {
|
|
399
|
+
return fail("INVALID_FORMAT", "Card number must contain only digits and valid length.");
|
|
400
|
+
}
|
|
401
|
+
if (!luhnCheck(normalized)) {
|
|
402
|
+
return fail("CHECKSUM_FAILED", "Card number checksum is invalid.");
|
|
403
|
+
}
|
|
404
|
+
return ok("Valid card number.");
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Boolean wrapper for `validateCreditCardNumber`.
|
|
408
|
+
*
|
|
409
|
+
* @param value - Card number candidate.
|
|
410
|
+
* @returns `true` when the card number is valid.
|
|
411
|
+
*/
|
|
412
|
+
export function isCreditCardNumber(value) {
|
|
413
|
+
return validateCreditCardNumber(value).ok;
|
|
414
|
+
}
|
|
277
415
|
//# 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":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jdsalasc/solvejs-validators",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Zero-dependency validators for JS/TS forms with structured result codes and region-aware checks.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"sideEffects": false,
|
|
@@ -44,9 +44,11 @@
|
|
|
44
44
|
},
|
|
45
45
|
"keywords": [
|
|
46
46
|
"validators",
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
47
|
+
"form validation",
|
|
48
|
+
"cellphone validation",
|
|
49
|
+
"credit card luhn",
|
|
50
|
+
"username validation",
|
|
51
|
+
"typescript validation",
|
|
50
52
|
"solvejs"
|
|
51
53
|
]
|
|
52
54
|
}
|