@exyconn/common 2.0.0 → 2.3.2
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 +864 -261
- package/dist/{index-BLltj-zN.d.ts → client/hooks/index.d.mts} +1 -195
- package/dist/{index-CIUdLBjA.d.mts → client/hooks/index.d.ts} +1 -195
- package/dist/client/hooks/index.js +2276 -0
- package/dist/client/hooks/index.js.map +1 -0
- package/dist/client/hooks/index.mjs +2217 -0
- package/dist/client/hooks/index.mjs.map +1 -0
- package/dist/client/index.d.mts +4 -1
- package/dist/client/index.d.ts +4 -1
- package/dist/client/index.js +2693 -19
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +2634 -21
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/web/index.d.mts +1461 -0
- package/dist/client/web/index.d.ts +1461 -0
- package/dist/client/web/index.js +2681 -0
- package/dist/client/web/index.js.map +1 -0
- package/dist/client/web/index.mjs +2618 -0
- package/dist/client/web/index.mjs.map +1 -0
- package/dist/data/brand-identity.d.mts +149 -0
- package/dist/data/brand-identity.d.ts +149 -0
- package/dist/data/brand-identity.js +235 -0
- package/dist/data/brand-identity.js.map +1 -0
- package/dist/data/brand-identity.mjs +220 -0
- package/dist/data/brand-identity.mjs.map +1 -0
- package/dist/data/countries.d.mts +61 -0
- package/dist/data/countries.d.ts +61 -0
- package/dist/data/countries.js +987 -0
- package/dist/data/countries.js.map +1 -0
- package/dist/data/countries.mjs +971 -0
- package/dist/data/countries.mjs.map +1 -0
- package/dist/data/currencies.d.mts +19 -0
- package/dist/data/currencies.d.ts +19 -0
- package/dist/data/currencies.js +162 -0
- package/dist/data/currencies.js.map +1 -0
- package/dist/data/currencies.mjs +153 -0
- package/dist/data/currencies.mjs.map +1 -0
- package/dist/data/index.d.mts +7 -0
- package/dist/data/index.d.ts +7 -0
- package/dist/data/index.js +2087 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/index.mjs +1948 -0
- package/dist/data/index.mjs.map +1 -0
- package/dist/data/phone-codes.d.mts +15 -0
- package/dist/data/phone-codes.d.ts +15 -0
- package/dist/data/phone-codes.js +219 -0
- package/dist/data/phone-codes.js.map +1 -0
- package/dist/data/phone-codes.mjs +211 -0
- package/dist/data/phone-codes.mjs.map +1 -0
- package/dist/data/regex.d.mts +287 -0
- package/dist/data/regex.d.ts +287 -0
- package/dist/data/regex.js +306 -0
- package/dist/data/regex.js.map +1 -0
- package/dist/data/regex.mjs +208 -0
- package/dist/data/regex.mjs.map +1 -0
- package/dist/data/timezones.d.mts +16 -0
- package/dist/data/timezones.d.ts +16 -0
- package/dist/data/timezones.js +98 -0
- package/dist/data/timezones.js.map +1 -0
- package/dist/data/timezones.mjs +89 -0
- package/dist/data/timezones.mjs.map +1 -0
- package/dist/index-01hoqibP.d.ts +119 -0
- package/dist/index-D3yCCjBZ.d.mts +119 -0
- package/dist/index-D9a9oxQy.d.ts +305 -0
- package/dist/index-DKn4raO7.d.ts +222 -0
- package/dist/index-DuxL84IW.d.mts +305 -0
- package/dist/index-NS8dS0p9.d.mts +222 -0
- package/dist/index-Nqm5_lwT.d.ts +188 -0
- package/dist/index-jBi3V6e5.d.mts +188 -0
- package/dist/index.d.mts +21 -729
- package/dist/index.d.ts +21 -729
- package/dist/index.js +3470 -97
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3457 -104
- package/dist/index.mjs.map +1 -1
- package/dist/server/configs/index.d.mts +602 -0
- package/dist/server/configs/index.d.ts +602 -0
- package/dist/server/configs/index.js +707 -0
- package/dist/server/configs/index.js.map +1 -0
- package/dist/server/configs/index.mjs +665 -0
- package/dist/server/configs/index.mjs.map +1 -0
- package/dist/server/index.d.mts +3 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +699 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +662 -1
- package/dist/server/index.mjs.map +1 -1
- package/dist/shared/config/index.d.mts +40 -0
- package/dist/shared/config/index.d.ts +40 -0
- package/dist/shared/config/index.js +58 -0
- package/dist/shared/config/index.js.map +1 -0
- package/dist/shared/config/index.mjs +51 -0
- package/dist/shared/config/index.mjs.map +1 -0
- package/dist/shared/constants/index.d.mts +593 -0
- package/dist/shared/constants/index.d.ts +593 -0
- package/dist/shared/constants/index.js +391 -0
- package/dist/shared/constants/index.js.map +1 -0
- package/dist/shared/constants/index.mjs +360 -0
- package/dist/shared/constants/index.mjs.map +1 -0
- package/dist/shared/index.d.mts +5 -1
- package/dist/shared/index.d.ts +5 -1
- package/dist/shared/types/index.d.mts +140 -0
- package/dist/shared/types/index.d.ts +140 -0
- package/dist/shared/types/index.js +4 -0
- package/dist/shared/types/index.js.map +1 -0
- package/dist/shared/types/index.mjs +3 -0
- package/dist/shared/types/index.mjs.map +1 -0
- package/dist/shared/utils/index.d.mts +255 -0
- package/dist/shared/utils/index.d.ts +255 -0
- package/dist/shared/utils/index.js +623 -0
- package/dist/shared/utils/index.js.map +1 -0
- package/dist/shared/utils/index.mjs +324 -0
- package/dist/shared/utils/index.mjs.map +1 -0
- package/dist/shared/validation/index.d.mts +258 -0
- package/dist/shared/validation/index.d.ts +258 -0
- package/dist/shared/validation/index.js +185 -0
- package/dist/shared/validation/index.js.map +1 -0
- package/dist/shared/validation/index.mjs +172 -0
- package/dist/shared/validation/index.mjs.map +1 -0
- package/package.json +151 -56
- package/dist/index-DEzgM15j.d.ts +0 -67
- package/dist/index-DNFVgQx8.d.ts +0 -1375
- package/dist/index-DbV04Dx8.d.mts +0 -67
- package/dist/index-DfqEP6Oe.d.mts +0 -1375
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common Validation Rules & Patterns
|
|
3
|
+
* Use with Yup, Zod, or custom validators
|
|
4
|
+
*/
|
|
5
|
+
declare const VALIDATION_PATTERNS: {
|
|
6
|
+
/** Email pattern (RFC 5322 simplified) */
|
|
7
|
+
readonly EMAIL: RegExp;
|
|
8
|
+
/** Strong password: min 8 chars, uppercase, lowercase, number, special char */
|
|
9
|
+
readonly PASSWORD_STRONG: RegExp;
|
|
10
|
+
/** Medium password: min 8 chars, uppercase, lowercase, number */
|
|
11
|
+
readonly PASSWORD_MEDIUM: RegExp;
|
|
12
|
+
/** Basic password: min 8 chars */
|
|
13
|
+
readonly PASSWORD_BASIC: RegExp;
|
|
14
|
+
/** Phone number (international) */
|
|
15
|
+
readonly PHONE_INTERNATIONAL: RegExp;
|
|
16
|
+
/** Phone number (US) */
|
|
17
|
+
readonly PHONE_US: RegExp;
|
|
18
|
+
/** Phone number (India) */
|
|
19
|
+
readonly PHONE_INDIA: RegExp;
|
|
20
|
+
/** URL pattern */
|
|
21
|
+
readonly URL: RegExp;
|
|
22
|
+
/** URL with required protocol */
|
|
23
|
+
readonly URL_STRICT: RegExp;
|
|
24
|
+
/** Alphanumeric only */
|
|
25
|
+
readonly ALPHANUMERIC: RegExp;
|
|
26
|
+
/** Letters only */
|
|
27
|
+
readonly LETTERS_ONLY: RegExp;
|
|
28
|
+
/** Numbers only */
|
|
29
|
+
readonly NUMBERS_ONLY: RegExp;
|
|
30
|
+
/** Slug pattern (kebab-case) */
|
|
31
|
+
readonly SLUG: RegExp;
|
|
32
|
+
/** Username pattern (alphanumeric, underscore, hyphen) */
|
|
33
|
+
readonly USERNAME: RegExp;
|
|
34
|
+
/** Credit card (basic validation) */
|
|
35
|
+
readonly CREDIT_CARD: RegExp;
|
|
36
|
+
/** CVV (3 or 4 digits) */
|
|
37
|
+
readonly CVV: RegExp;
|
|
38
|
+
/** ZIP code (US) */
|
|
39
|
+
readonly ZIP_US: RegExp;
|
|
40
|
+
/** Postal code (India) */
|
|
41
|
+
readonly POSTAL_INDIA: RegExp;
|
|
42
|
+
/** IP Address (IPv4) */
|
|
43
|
+
readonly IPV4: RegExp;
|
|
44
|
+
/** Hex color */
|
|
45
|
+
readonly HEX_COLOR: RegExp;
|
|
46
|
+
/** Date (YYYY-MM-DD) */
|
|
47
|
+
readonly DATE_ISO: RegExp;
|
|
48
|
+
/** Time (HH:MM or HH:MM:SS) */
|
|
49
|
+
readonly TIME: RegExp;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Validate email format
|
|
53
|
+
*/
|
|
54
|
+
declare const isValidEmail: (email: string) => boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Validate password strength
|
|
57
|
+
*/
|
|
58
|
+
declare const isValidPassword: (password: string, strength?: "basic" | "medium" | "strong") => boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Validate phone number
|
|
61
|
+
*/
|
|
62
|
+
declare const isValidPhone: (phone: string, format?: "international" | "us" | "india") => boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Validate URL format
|
|
65
|
+
*/
|
|
66
|
+
declare const isValidUrl: (url: string, requireProtocol?: boolean) => boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Validate username format
|
|
69
|
+
*/
|
|
70
|
+
declare const isValidUsername: (username: string) => boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Validate slug format
|
|
73
|
+
*/
|
|
74
|
+
declare const isValidSlug: (slug: string) => boolean;
|
|
75
|
+
declare const VALIDATION_MESSAGES: {
|
|
76
|
+
readonly REQUIRED: "This field is required";
|
|
77
|
+
readonly REQUIRED_FIELD: (field: string) => string;
|
|
78
|
+
readonly EMAIL_INVALID: "Please enter a valid email address";
|
|
79
|
+
readonly EMAIL_REQUIRED: "Email is required";
|
|
80
|
+
readonly PASSWORD_REQUIRED: "Password is required";
|
|
81
|
+
readonly PASSWORD_MIN_LENGTH: (length: number) => string;
|
|
82
|
+
readonly PASSWORD_WEAK: "Password is too weak";
|
|
83
|
+
readonly PASSWORD_MEDIUM: "Password must contain uppercase, lowercase, and number";
|
|
84
|
+
readonly PASSWORD_STRONG: "Password must contain uppercase, lowercase, number, and special character";
|
|
85
|
+
readonly PASSWORD_MISMATCH: "Passwords do not match";
|
|
86
|
+
readonly NAME_REQUIRED: "Name is required";
|
|
87
|
+
readonly FIRST_NAME_REQUIRED: "First name is required";
|
|
88
|
+
readonly LAST_NAME_REQUIRED: "Last name is required";
|
|
89
|
+
readonly NAME_MIN_LENGTH: (length: number) => string;
|
|
90
|
+
readonly NAME_MAX_LENGTH: (length: number) => string;
|
|
91
|
+
readonly PHONE_INVALID: "Please enter a valid phone number";
|
|
92
|
+
readonly PHONE_REQUIRED: "Phone number is required";
|
|
93
|
+
readonly URL_INVALID: "Please enter a valid URL";
|
|
94
|
+
readonly USERNAME_INVALID: "Username can only contain letters, numbers, underscores, and hyphens";
|
|
95
|
+
readonly USERNAME_MIN_LENGTH: "Username must be at least 3 characters";
|
|
96
|
+
readonly USERNAME_MAX_LENGTH: "Username must be at most 30 characters";
|
|
97
|
+
readonly USERNAME_TAKEN: "This username is already taken";
|
|
98
|
+
readonly MIN_LENGTH: (field: string, length: number) => string;
|
|
99
|
+
readonly MAX_LENGTH: (field: string, length: number) => string;
|
|
100
|
+
readonly MIN_VALUE: (field: string, value: number) => string;
|
|
101
|
+
readonly MAX_VALUE: (field: string, value: number) => string;
|
|
102
|
+
readonly INVALID_FORMAT: "Invalid format";
|
|
103
|
+
readonly TERMS_REQUIRED: "You must accept the terms and conditions";
|
|
104
|
+
};
|
|
105
|
+
declare const VALIDATION_RULES: {
|
|
106
|
+
readonly email: {
|
|
107
|
+
readonly pattern: RegExp;
|
|
108
|
+
readonly message: "Please enter a valid email address";
|
|
109
|
+
};
|
|
110
|
+
readonly password: {
|
|
111
|
+
readonly minLength: 8;
|
|
112
|
+
readonly pattern: RegExp;
|
|
113
|
+
readonly message: "Password must contain uppercase, lowercase, and number";
|
|
114
|
+
};
|
|
115
|
+
readonly passwordStrong: {
|
|
116
|
+
readonly minLength: 8;
|
|
117
|
+
readonly pattern: RegExp;
|
|
118
|
+
readonly message: "Password must contain uppercase, lowercase, number, and special character";
|
|
119
|
+
};
|
|
120
|
+
readonly name: {
|
|
121
|
+
readonly minLength: 2;
|
|
122
|
+
readonly maxLength: 50;
|
|
123
|
+
};
|
|
124
|
+
readonly username: {
|
|
125
|
+
readonly minLength: 3;
|
|
126
|
+
readonly maxLength: 30;
|
|
127
|
+
readonly pattern: RegExp;
|
|
128
|
+
readonly message: "Username can only contain letters, numbers, underscores, and hyphens";
|
|
129
|
+
};
|
|
130
|
+
readonly phone: {
|
|
131
|
+
readonly pattern: RegExp;
|
|
132
|
+
readonly message: "Please enter a valid phone number";
|
|
133
|
+
};
|
|
134
|
+
readonly url: {
|
|
135
|
+
readonly pattern: RegExp;
|
|
136
|
+
readonly message: "Please enter a valid URL";
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
declare const _default: {
|
|
140
|
+
VALIDATION_PATTERNS: {
|
|
141
|
+
/** Email pattern (RFC 5322 simplified) */
|
|
142
|
+
readonly EMAIL: RegExp;
|
|
143
|
+
/** Strong password: min 8 chars, uppercase, lowercase, number, special char */
|
|
144
|
+
readonly PASSWORD_STRONG: RegExp;
|
|
145
|
+
/** Medium password: min 8 chars, uppercase, lowercase, number */
|
|
146
|
+
readonly PASSWORD_MEDIUM: RegExp;
|
|
147
|
+
/** Basic password: min 8 chars */
|
|
148
|
+
readonly PASSWORD_BASIC: RegExp;
|
|
149
|
+
/** Phone number (international) */
|
|
150
|
+
readonly PHONE_INTERNATIONAL: RegExp;
|
|
151
|
+
/** Phone number (US) */
|
|
152
|
+
readonly PHONE_US: RegExp;
|
|
153
|
+
/** Phone number (India) */
|
|
154
|
+
readonly PHONE_INDIA: RegExp;
|
|
155
|
+
/** URL pattern */
|
|
156
|
+
readonly URL: RegExp;
|
|
157
|
+
/** URL with required protocol */
|
|
158
|
+
readonly URL_STRICT: RegExp;
|
|
159
|
+
/** Alphanumeric only */
|
|
160
|
+
readonly ALPHANUMERIC: RegExp;
|
|
161
|
+
/** Letters only */
|
|
162
|
+
readonly LETTERS_ONLY: RegExp;
|
|
163
|
+
/** Numbers only */
|
|
164
|
+
readonly NUMBERS_ONLY: RegExp;
|
|
165
|
+
/** Slug pattern (kebab-case) */
|
|
166
|
+
readonly SLUG: RegExp;
|
|
167
|
+
/** Username pattern (alphanumeric, underscore, hyphen) */
|
|
168
|
+
readonly USERNAME: RegExp;
|
|
169
|
+
/** Credit card (basic validation) */
|
|
170
|
+
readonly CREDIT_CARD: RegExp;
|
|
171
|
+
/** CVV (3 or 4 digits) */
|
|
172
|
+
readonly CVV: RegExp;
|
|
173
|
+
/** ZIP code (US) */
|
|
174
|
+
readonly ZIP_US: RegExp;
|
|
175
|
+
/** Postal code (India) */
|
|
176
|
+
readonly POSTAL_INDIA: RegExp;
|
|
177
|
+
/** IP Address (IPv4) */
|
|
178
|
+
readonly IPV4: RegExp;
|
|
179
|
+
/** Hex color */
|
|
180
|
+
readonly HEX_COLOR: RegExp;
|
|
181
|
+
/** Date (YYYY-MM-DD) */
|
|
182
|
+
readonly DATE_ISO: RegExp;
|
|
183
|
+
/** Time (HH:MM or HH:MM:SS) */
|
|
184
|
+
readonly TIME: RegExp;
|
|
185
|
+
};
|
|
186
|
+
VALIDATION_MESSAGES: {
|
|
187
|
+
readonly REQUIRED: "This field is required";
|
|
188
|
+
readonly REQUIRED_FIELD: (field: string) => string;
|
|
189
|
+
readonly EMAIL_INVALID: "Please enter a valid email address";
|
|
190
|
+
readonly EMAIL_REQUIRED: "Email is required";
|
|
191
|
+
readonly PASSWORD_REQUIRED: "Password is required";
|
|
192
|
+
readonly PASSWORD_MIN_LENGTH: (length: number) => string;
|
|
193
|
+
readonly PASSWORD_WEAK: "Password is too weak";
|
|
194
|
+
readonly PASSWORD_MEDIUM: "Password must contain uppercase, lowercase, and number";
|
|
195
|
+
readonly PASSWORD_STRONG: "Password must contain uppercase, lowercase, number, and special character";
|
|
196
|
+
readonly PASSWORD_MISMATCH: "Passwords do not match";
|
|
197
|
+
readonly NAME_REQUIRED: "Name is required";
|
|
198
|
+
readonly FIRST_NAME_REQUIRED: "First name is required";
|
|
199
|
+
readonly LAST_NAME_REQUIRED: "Last name is required";
|
|
200
|
+
readonly NAME_MIN_LENGTH: (length: number) => string;
|
|
201
|
+
readonly NAME_MAX_LENGTH: (length: number) => string;
|
|
202
|
+
readonly PHONE_INVALID: "Please enter a valid phone number";
|
|
203
|
+
readonly PHONE_REQUIRED: "Phone number is required";
|
|
204
|
+
readonly URL_INVALID: "Please enter a valid URL";
|
|
205
|
+
readonly USERNAME_INVALID: "Username can only contain letters, numbers, underscores, and hyphens";
|
|
206
|
+
readonly USERNAME_MIN_LENGTH: "Username must be at least 3 characters";
|
|
207
|
+
readonly USERNAME_MAX_LENGTH: "Username must be at most 30 characters";
|
|
208
|
+
readonly USERNAME_TAKEN: "This username is already taken";
|
|
209
|
+
readonly MIN_LENGTH: (field: string, length: number) => string;
|
|
210
|
+
readonly MAX_LENGTH: (field: string, length: number) => string;
|
|
211
|
+
readonly MIN_VALUE: (field: string, value: number) => string;
|
|
212
|
+
readonly MAX_VALUE: (field: string, value: number) => string;
|
|
213
|
+
readonly INVALID_FORMAT: "Invalid format";
|
|
214
|
+
readonly TERMS_REQUIRED: "You must accept the terms and conditions";
|
|
215
|
+
};
|
|
216
|
+
VALIDATION_RULES: {
|
|
217
|
+
readonly email: {
|
|
218
|
+
readonly pattern: RegExp;
|
|
219
|
+
readonly message: "Please enter a valid email address";
|
|
220
|
+
};
|
|
221
|
+
readonly password: {
|
|
222
|
+
readonly minLength: 8;
|
|
223
|
+
readonly pattern: RegExp;
|
|
224
|
+
readonly message: "Password must contain uppercase, lowercase, and number";
|
|
225
|
+
};
|
|
226
|
+
readonly passwordStrong: {
|
|
227
|
+
readonly minLength: 8;
|
|
228
|
+
readonly pattern: RegExp;
|
|
229
|
+
readonly message: "Password must contain uppercase, lowercase, number, and special character";
|
|
230
|
+
};
|
|
231
|
+
readonly name: {
|
|
232
|
+
readonly minLength: 2;
|
|
233
|
+
readonly maxLength: 50;
|
|
234
|
+
};
|
|
235
|
+
readonly username: {
|
|
236
|
+
readonly minLength: 3;
|
|
237
|
+
readonly maxLength: 30;
|
|
238
|
+
readonly pattern: RegExp;
|
|
239
|
+
readonly message: "Username can only contain letters, numbers, underscores, and hyphens";
|
|
240
|
+
};
|
|
241
|
+
readonly phone: {
|
|
242
|
+
readonly pattern: RegExp;
|
|
243
|
+
readonly message: "Please enter a valid phone number";
|
|
244
|
+
};
|
|
245
|
+
readonly url: {
|
|
246
|
+
readonly pattern: RegExp;
|
|
247
|
+
readonly message: "Please enter a valid URL";
|
|
248
|
+
};
|
|
249
|
+
};
|
|
250
|
+
isValidEmail: (email: string) => boolean;
|
|
251
|
+
isValidPassword: (password: string, strength?: "basic" | "medium" | "strong") => boolean;
|
|
252
|
+
isValidPhone: (phone: string, format?: "international" | "us" | "india") => boolean;
|
|
253
|
+
isValidUrl: (url: string, requireProtocol?: boolean) => boolean;
|
|
254
|
+
isValidUsername: (username: string) => boolean;
|
|
255
|
+
isValidSlug: (slug: string) => boolean;
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
export { VALIDATION_MESSAGES, VALIDATION_PATTERNS, VALIDATION_RULES, _default as default, isValidEmail, isValidPassword, isValidPhone, isValidSlug, isValidUrl, isValidUsername };
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
// src/shared/validation/index.ts
|
|
6
|
+
var VALIDATION_PATTERNS = {
|
|
7
|
+
/** Email pattern (RFC 5322 simplified) */
|
|
8
|
+
EMAIL: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
9
|
+
/** Strong password: min 8 chars, uppercase, lowercase, number, special char */
|
|
10
|
+
PASSWORD_STRONG: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
|
|
11
|
+
/** Medium password: min 8 chars, uppercase, lowercase, number */
|
|
12
|
+
PASSWORD_MEDIUM: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d@$!%*?&]{8,}$/,
|
|
13
|
+
/** Basic password: min 8 chars */
|
|
14
|
+
PASSWORD_BASIC: /^.{8,}$/,
|
|
15
|
+
/** Phone number (international) */
|
|
16
|
+
PHONE_INTERNATIONAL: /^\+?[\d\s\-().]{10,}$/,
|
|
17
|
+
/** Phone number (US) */
|
|
18
|
+
PHONE_US: /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/,
|
|
19
|
+
/** Phone number (India) */
|
|
20
|
+
PHONE_INDIA: /^[6-9]\d{9}$/,
|
|
21
|
+
/** URL pattern */
|
|
22
|
+
URL: /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/,
|
|
23
|
+
/** URL with required protocol */
|
|
24
|
+
URL_STRICT: /^https?:\/\/([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/,
|
|
25
|
+
/** Alphanumeric only */
|
|
26
|
+
ALPHANUMERIC: /^[a-zA-Z0-9]+$/,
|
|
27
|
+
/** Letters only */
|
|
28
|
+
LETTERS_ONLY: /^[a-zA-Z]+$/,
|
|
29
|
+
/** Numbers only */
|
|
30
|
+
NUMBERS_ONLY: /^\d+$/,
|
|
31
|
+
/** Slug pattern (kebab-case) */
|
|
32
|
+
SLUG: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,
|
|
33
|
+
/** Username pattern (alphanumeric, underscore, hyphen) */
|
|
34
|
+
USERNAME: /^[a-zA-Z0-9_-]{3,30}$/,
|
|
35
|
+
/** Credit card (basic validation) */
|
|
36
|
+
CREDIT_CARD: /^\d{13,19}$/,
|
|
37
|
+
/** CVV (3 or 4 digits) */
|
|
38
|
+
CVV: /^\d{3,4}$/,
|
|
39
|
+
/** ZIP code (US) */
|
|
40
|
+
ZIP_US: /^\d{5}(-\d{4})?$/,
|
|
41
|
+
/** Postal code (India) */
|
|
42
|
+
POSTAL_INDIA: /^\d{6}$/,
|
|
43
|
+
/** IP Address (IPv4) */
|
|
44
|
+
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]?)$/,
|
|
45
|
+
/** Hex color */
|
|
46
|
+
HEX_COLOR: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,
|
|
47
|
+
/** Date (YYYY-MM-DD) */
|
|
48
|
+
DATE_ISO: /^\d{4}-\d{2}-\d{2}$/,
|
|
49
|
+
/** Time (HH:MM or HH:MM:SS) */
|
|
50
|
+
TIME: /^([01]\d|2[0-3]):([0-5]\d)(:[0-5]\d)?$/
|
|
51
|
+
};
|
|
52
|
+
var isValidEmail = (email) => {
|
|
53
|
+
return VALIDATION_PATTERNS.EMAIL.test(email.trim());
|
|
54
|
+
};
|
|
55
|
+
var isValidPassword = (password, strength = "medium") => {
|
|
56
|
+
switch (strength) {
|
|
57
|
+
case "strong":
|
|
58
|
+
return VALIDATION_PATTERNS.PASSWORD_STRONG.test(password);
|
|
59
|
+
case "medium":
|
|
60
|
+
return VALIDATION_PATTERNS.PASSWORD_MEDIUM.test(password);
|
|
61
|
+
case "basic":
|
|
62
|
+
default:
|
|
63
|
+
return VALIDATION_PATTERNS.PASSWORD_BASIC.test(password);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
var isValidPhone = (phone, format = "international") => {
|
|
67
|
+
const cleaned = phone.replace(/\s/g, "");
|
|
68
|
+
switch (format) {
|
|
69
|
+
case "us":
|
|
70
|
+
return VALIDATION_PATTERNS.PHONE_US.test(cleaned);
|
|
71
|
+
case "india":
|
|
72
|
+
return VALIDATION_PATTERNS.PHONE_INDIA.test(cleaned);
|
|
73
|
+
case "international":
|
|
74
|
+
default:
|
|
75
|
+
return VALIDATION_PATTERNS.PHONE_INTERNATIONAL.test(cleaned);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
var isValidUrl = (url, requireProtocol = false) => {
|
|
79
|
+
if (requireProtocol) {
|
|
80
|
+
return VALIDATION_PATTERNS.URL_STRICT.test(url);
|
|
81
|
+
}
|
|
82
|
+
return VALIDATION_PATTERNS.URL.test(url);
|
|
83
|
+
};
|
|
84
|
+
var isValidUsername = (username) => {
|
|
85
|
+
return VALIDATION_PATTERNS.USERNAME.test(username);
|
|
86
|
+
};
|
|
87
|
+
var isValidSlug = (slug) => {
|
|
88
|
+
return VALIDATION_PATTERNS.SLUG.test(slug);
|
|
89
|
+
};
|
|
90
|
+
var VALIDATION_MESSAGES = {
|
|
91
|
+
// Required fields
|
|
92
|
+
REQUIRED: "This field is required",
|
|
93
|
+
REQUIRED_FIELD: (field) => `${field} is required`,
|
|
94
|
+
// Email
|
|
95
|
+
EMAIL_INVALID: "Please enter a valid email address",
|
|
96
|
+
EMAIL_REQUIRED: "Email is required",
|
|
97
|
+
// Password
|
|
98
|
+
PASSWORD_REQUIRED: "Password is required",
|
|
99
|
+
PASSWORD_MIN_LENGTH: (length) => `Password must be at least ${length} characters`,
|
|
100
|
+
PASSWORD_WEAK: "Password is too weak",
|
|
101
|
+
PASSWORD_MEDIUM: "Password must contain uppercase, lowercase, and number",
|
|
102
|
+
PASSWORD_STRONG: "Password must contain uppercase, lowercase, number, and special character",
|
|
103
|
+
PASSWORD_MISMATCH: "Passwords do not match",
|
|
104
|
+
// Name
|
|
105
|
+
NAME_REQUIRED: "Name is required",
|
|
106
|
+
FIRST_NAME_REQUIRED: "First name is required",
|
|
107
|
+
LAST_NAME_REQUIRED: "Last name is required",
|
|
108
|
+
NAME_MIN_LENGTH: (length) => `Name must be at least ${length} characters`,
|
|
109
|
+
NAME_MAX_LENGTH: (length) => `Name must be at most ${length} characters`,
|
|
110
|
+
// Phone
|
|
111
|
+
PHONE_INVALID: "Please enter a valid phone number",
|
|
112
|
+
PHONE_REQUIRED: "Phone number is required",
|
|
113
|
+
// URL
|
|
114
|
+
URL_INVALID: "Please enter a valid URL",
|
|
115
|
+
// Username
|
|
116
|
+
USERNAME_INVALID: "Username can only contain letters, numbers, underscores, and hyphens",
|
|
117
|
+
USERNAME_MIN_LENGTH: "Username must be at least 3 characters",
|
|
118
|
+
USERNAME_MAX_LENGTH: "Username must be at most 30 characters",
|
|
119
|
+
USERNAME_TAKEN: "This username is already taken",
|
|
120
|
+
// General
|
|
121
|
+
MIN_LENGTH: (field, length) => `${field} must be at least ${length} characters`,
|
|
122
|
+
MAX_LENGTH: (field, length) => `${field} must be at most ${length} characters`,
|
|
123
|
+
MIN_VALUE: (field, value) => `${field} must be at least ${value}`,
|
|
124
|
+
MAX_VALUE: (field, value) => `${field} must be at most ${value}`,
|
|
125
|
+
INVALID_FORMAT: "Invalid format",
|
|
126
|
+
TERMS_REQUIRED: "You must accept the terms and conditions"
|
|
127
|
+
};
|
|
128
|
+
var VALIDATION_RULES = {
|
|
129
|
+
email: {
|
|
130
|
+
pattern: VALIDATION_PATTERNS.EMAIL,
|
|
131
|
+
message: VALIDATION_MESSAGES.EMAIL_INVALID
|
|
132
|
+
},
|
|
133
|
+
password: {
|
|
134
|
+
minLength: 8,
|
|
135
|
+
pattern: VALIDATION_PATTERNS.PASSWORD_MEDIUM,
|
|
136
|
+
message: VALIDATION_MESSAGES.PASSWORD_MEDIUM
|
|
137
|
+
},
|
|
138
|
+
passwordStrong: {
|
|
139
|
+
minLength: 8,
|
|
140
|
+
pattern: VALIDATION_PATTERNS.PASSWORD_STRONG,
|
|
141
|
+
message: VALIDATION_MESSAGES.PASSWORD_STRONG
|
|
142
|
+
},
|
|
143
|
+
name: {
|
|
144
|
+
minLength: 2,
|
|
145
|
+
maxLength: 50
|
|
146
|
+
},
|
|
147
|
+
username: {
|
|
148
|
+
minLength: 3,
|
|
149
|
+
maxLength: 30,
|
|
150
|
+
pattern: VALIDATION_PATTERNS.USERNAME,
|
|
151
|
+
message: VALIDATION_MESSAGES.USERNAME_INVALID
|
|
152
|
+
},
|
|
153
|
+
phone: {
|
|
154
|
+
pattern: VALIDATION_PATTERNS.PHONE_INTERNATIONAL,
|
|
155
|
+
message: VALIDATION_MESSAGES.PHONE_INVALID
|
|
156
|
+
},
|
|
157
|
+
url: {
|
|
158
|
+
pattern: VALIDATION_PATTERNS.URL,
|
|
159
|
+
message: VALIDATION_MESSAGES.URL_INVALID
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
var validation_default = {
|
|
163
|
+
VALIDATION_PATTERNS,
|
|
164
|
+
VALIDATION_MESSAGES,
|
|
165
|
+
VALIDATION_RULES,
|
|
166
|
+
isValidEmail,
|
|
167
|
+
isValidPassword,
|
|
168
|
+
isValidPhone,
|
|
169
|
+
isValidUrl,
|
|
170
|
+
isValidUsername,
|
|
171
|
+
isValidSlug
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
exports.VALIDATION_MESSAGES = VALIDATION_MESSAGES;
|
|
175
|
+
exports.VALIDATION_PATTERNS = VALIDATION_PATTERNS;
|
|
176
|
+
exports.VALIDATION_RULES = VALIDATION_RULES;
|
|
177
|
+
exports.default = validation_default;
|
|
178
|
+
exports.isValidEmail = isValidEmail;
|
|
179
|
+
exports.isValidPassword = isValidPassword;
|
|
180
|
+
exports.isValidPhone = isValidPhone;
|
|
181
|
+
exports.isValidSlug = isValidSlug;
|
|
182
|
+
exports.isValidUrl = isValidUrl;
|
|
183
|
+
exports.isValidUsername = isValidUsername;
|
|
184
|
+
//# sourceMappingURL=index.js.map
|
|
185
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/validation/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Common Validation Rules & Patterns\r\n * Use with Yup, Zod, or custom validators\r\n */\r\n\r\n// ==========================================\r\n// REGEX PATTERNS\r\n// ==========================================\r\n\r\nexport const VALIDATION_PATTERNS = {\r\n /** Email pattern (RFC 5322 simplified) */\r\n EMAIL: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n\r\n /** Strong password: min 8 chars, uppercase, lowercase, number, special char */\r\n PASSWORD_STRONG:\r\n /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$/,\r\n\r\n /** Medium password: min 8 chars, uppercase, lowercase, number */\r\n PASSWORD_MEDIUM: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d@$!%*?&]{8,}$/,\r\n\r\n /** Basic password: min 8 chars */\r\n PASSWORD_BASIC: /^.{8,}$/,\r\n\r\n /** Phone number (international) */\r\n PHONE_INTERNATIONAL: /^\\+?[\\d\\s\\-().]{10,}$/,\r\n\r\n /** Phone number (US) */\r\n PHONE_US: /^\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/,\r\n\r\n /** Phone number (India) */\r\n PHONE_INDIA: /^[6-9]\\d{9}$/,\r\n\r\n /** URL pattern */\r\n URL: /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/,\r\n\r\n /** URL with required protocol */\r\n URL_STRICT: /^https?:\\/\\/([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/,\r\n\r\n /** Alphanumeric only */\r\n ALPHANUMERIC: /^[a-zA-Z0-9]+$/,\r\n\r\n /** Letters only */\r\n LETTERS_ONLY: /^[a-zA-Z]+$/,\r\n\r\n /** Numbers only */\r\n NUMBERS_ONLY: /^\\d+$/,\r\n\r\n /** Slug pattern (kebab-case) */\r\n SLUG: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\r\n\r\n /** Username pattern (alphanumeric, underscore, hyphen) */\r\n USERNAME: /^[a-zA-Z0-9_-]{3,30}$/,\r\n\r\n /** Credit card (basic validation) */\r\n CREDIT_CARD: /^\\d{13,19}$/,\r\n\r\n /** CVV (3 or 4 digits) */\r\n CVV: /^\\d{3,4}$/,\r\n\r\n /** ZIP code (US) */\r\n ZIP_US: /^\\d{5}(-\\d{4})?$/,\r\n\r\n /** Postal code (India) */\r\n POSTAL_INDIA: /^\\d{6}$/,\r\n\r\n /** IP Address (IPv4) */\r\n 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]?)$/,\r\n\r\n /** Hex color */\r\n HEX_COLOR: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,\r\n\r\n /** Date (YYYY-MM-DD) */\r\n DATE_ISO: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n\r\n /** Time (HH:MM or HH:MM:SS) */\r\n TIME: /^([01]\\d|2[0-3]):([0-5]\\d)(:[0-5]\\d)?$/,\r\n} as const;\r\n\r\n// ==========================================\r\n// VALIDATION FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport const isValidEmail = (email: string): boolean => {\r\n return VALIDATION_PATTERNS.EMAIL.test(email.trim());\r\n};\r\n\r\n/**\r\n * Validate password strength\r\n */\r\nexport const isValidPassword = (\r\n password: string,\r\n strength: 'basic' | 'medium' | 'strong' = 'medium'\r\n): boolean => {\r\n switch (strength) {\r\n case 'strong':\r\n return VALIDATION_PATTERNS.PASSWORD_STRONG.test(password);\r\n case 'medium':\r\n return VALIDATION_PATTERNS.PASSWORD_MEDIUM.test(password);\r\n case 'basic':\r\n default:\r\n return VALIDATION_PATTERNS.PASSWORD_BASIC.test(password);\r\n }\r\n};\r\n\r\n/**\r\n * Validate phone number\r\n */\r\nexport const isValidPhone = (\r\n phone: string,\r\n format: 'international' | 'us' | 'india' = 'international'\r\n): boolean => {\r\n const cleaned = phone.replace(/\\s/g, '');\r\n switch (format) {\r\n case 'us':\r\n return VALIDATION_PATTERNS.PHONE_US.test(cleaned);\r\n case 'india':\r\n return VALIDATION_PATTERNS.PHONE_INDIA.test(cleaned);\r\n case 'international':\r\n default:\r\n return VALIDATION_PATTERNS.PHONE_INTERNATIONAL.test(cleaned);\r\n }\r\n};\r\n\r\n/**\r\n * Validate URL format\r\n */\r\nexport const isValidUrl = (url: string, requireProtocol: boolean = false): boolean => {\r\n if (requireProtocol) {\r\n return VALIDATION_PATTERNS.URL_STRICT.test(url);\r\n }\r\n return VALIDATION_PATTERNS.URL.test(url);\r\n};\r\n\r\n/**\r\n * Validate username format\r\n */\r\nexport const isValidUsername = (username: string): boolean => {\r\n return VALIDATION_PATTERNS.USERNAME.test(username);\r\n};\r\n\r\n/**\r\n * Validate slug format\r\n */\r\nexport const isValidSlug = (slug: string): boolean => {\r\n return VALIDATION_PATTERNS.SLUG.test(slug);\r\n};\r\n\r\n// ==========================================\r\n// VALIDATION MESSAGES\r\n// ==========================================\r\n\r\nexport const VALIDATION_MESSAGES = {\r\n // Required fields\r\n REQUIRED: 'This field is required',\r\n REQUIRED_FIELD: (field: string) => `${field} is required`,\r\n\r\n // Email\r\n EMAIL_INVALID: 'Please enter a valid email address',\r\n EMAIL_REQUIRED: 'Email is required',\r\n\r\n // Password\r\n PASSWORD_REQUIRED: 'Password is required',\r\n PASSWORD_MIN_LENGTH: (length: number) => `Password must be at least ${length} characters`,\r\n PASSWORD_WEAK: 'Password is too weak',\r\n PASSWORD_MEDIUM: 'Password must contain uppercase, lowercase, and number',\r\n PASSWORD_STRONG: 'Password must contain uppercase, lowercase, number, and special character',\r\n PASSWORD_MISMATCH: 'Passwords do not match',\r\n\r\n // Name\r\n NAME_REQUIRED: 'Name is required',\r\n FIRST_NAME_REQUIRED: 'First name is required',\r\n LAST_NAME_REQUIRED: 'Last name is required',\r\n NAME_MIN_LENGTH: (length: number) => `Name must be at least ${length} characters`,\r\n NAME_MAX_LENGTH: (length: number) => `Name must be at most ${length} characters`,\r\n\r\n // Phone\r\n PHONE_INVALID: 'Please enter a valid phone number',\r\n PHONE_REQUIRED: 'Phone number is required',\r\n\r\n // URL\r\n URL_INVALID: 'Please enter a valid URL',\r\n\r\n // Username\r\n USERNAME_INVALID: 'Username can only contain letters, numbers, underscores, and hyphens',\r\n USERNAME_MIN_LENGTH: 'Username must be at least 3 characters',\r\n USERNAME_MAX_LENGTH: 'Username must be at most 30 characters',\r\n USERNAME_TAKEN: 'This username is already taken',\r\n\r\n // General\r\n MIN_LENGTH: (field: string, length: number) => `${field} must be at least ${length} characters`,\r\n MAX_LENGTH: (field: string, length: number) => `${field} must be at most ${length} characters`,\r\n MIN_VALUE: (field: string, value: number) => `${field} must be at least ${value}`,\r\n MAX_VALUE: (field: string, value: number) => `${field} must be at most ${value}`,\r\n INVALID_FORMAT: 'Invalid format',\r\n TERMS_REQUIRED: 'You must accept the terms and conditions',\r\n} as const;\r\n\r\n// ==========================================\r\n// COMMON VALIDATION RULES (for schema builders)\r\n// ==========================================\r\n\r\nexport const VALIDATION_RULES = {\r\n email: {\r\n pattern: VALIDATION_PATTERNS.EMAIL,\r\n message: VALIDATION_MESSAGES.EMAIL_INVALID,\r\n },\r\n password: {\r\n minLength: 8,\r\n pattern: VALIDATION_PATTERNS.PASSWORD_MEDIUM,\r\n message: VALIDATION_MESSAGES.PASSWORD_MEDIUM,\r\n },\r\n passwordStrong: {\r\n minLength: 8,\r\n pattern: VALIDATION_PATTERNS.PASSWORD_STRONG,\r\n message: VALIDATION_MESSAGES.PASSWORD_STRONG,\r\n },\r\n name: {\r\n minLength: 2,\r\n maxLength: 50,\r\n },\r\n username: {\r\n minLength: 3,\r\n maxLength: 30,\r\n pattern: VALIDATION_PATTERNS.USERNAME,\r\n message: VALIDATION_MESSAGES.USERNAME_INVALID,\r\n },\r\n phone: {\r\n pattern: VALIDATION_PATTERNS.PHONE_INTERNATIONAL,\r\n message: VALIDATION_MESSAGES.PHONE_INVALID,\r\n },\r\n url: {\r\n pattern: VALIDATION_PATTERNS.URL,\r\n message: VALIDATION_MESSAGES.URL_INVALID,\r\n },\r\n} as const;\r\n\r\nexport default {\r\n VALIDATION_PATTERNS,\r\n VALIDATION_MESSAGES,\r\n VALIDATION_RULES,\r\n isValidEmail,\r\n isValidPassword,\r\n isValidPhone,\r\n isValidUrl,\r\n isValidUsername,\r\n isValidSlug,\r\n};\r\n"]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// src/shared/validation/index.ts
|
|
2
|
+
var VALIDATION_PATTERNS = {
|
|
3
|
+
/** Email pattern (RFC 5322 simplified) */
|
|
4
|
+
EMAIL: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
5
|
+
/** Strong password: min 8 chars, uppercase, lowercase, number, special char */
|
|
6
|
+
PASSWORD_STRONG: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
|
|
7
|
+
/** Medium password: min 8 chars, uppercase, lowercase, number */
|
|
8
|
+
PASSWORD_MEDIUM: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d@$!%*?&]{8,}$/,
|
|
9
|
+
/** Basic password: min 8 chars */
|
|
10
|
+
PASSWORD_BASIC: /^.{8,}$/,
|
|
11
|
+
/** Phone number (international) */
|
|
12
|
+
PHONE_INTERNATIONAL: /^\+?[\d\s\-().]{10,}$/,
|
|
13
|
+
/** Phone number (US) */
|
|
14
|
+
PHONE_US: /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/,
|
|
15
|
+
/** Phone number (India) */
|
|
16
|
+
PHONE_INDIA: /^[6-9]\d{9}$/,
|
|
17
|
+
/** URL pattern */
|
|
18
|
+
URL: /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/,
|
|
19
|
+
/** URL with required protocol */
|
|
20
|
+
URL_STRICT: /^https?:\/\/([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/,
|
|
21
|
+
/** Alphanumeric only */
|
|
22
|
+
ALPHANUMERIC: /^[a-zA-Z0-9]+$/,
|
|
23
|
+
/** Letters only */
|
|
24
|
+
LETTERS_ONLY: /^[a-zA-Z]+$/,
|
|
25
|
+
/** Numbers only */
|
|
26
|
+
NUMBERS_ONLY: /^\d+$/,
|
|
27
|
+
/** Slug pattern (kebab-case) */
|
|
28
|
+
SLUG: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,
|
|
29
|
+
/** Username pattern (alphanumeric, underscore, hyphen) */
|
|
30
|
+
USERNAME: /^[a-zA-Z0-9_-]{3,30}$/,
|
|
31
|
+
/** Credit card (basic validation) */
|
|
32
|
+
CREDIT_CARD: /^\d{13,19}$/,
|
|
33
|
+
/** CVV (3 or 4 digits) */
|
|
34
|
+
CVV: /^\d{3,4}$/,
|
|
35
|
+
/** ZIP code (US) */
|
|
36
|
+
ZIP_US: /^\d{5}(-\d{4})?$/,
|
|
37
|
+
/** Postal code (India) */
|
|
38
|
+
POSTAL_INDIA: /^\d{6}$/,
|
|
39
|
+
/** IP Address (IPv4) */
|
|
40
|
+
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]?)$/,
|
|
41
|
+
/** Hex color */
|
|
42
|
+
HEX_COLOR: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,
|
|
43
|
+
/** Date (YYYY-MM-DD) */
|
|
44
|
+
DATE_ISO: /^\d{4}-\d{2}-\d{2}$/,
|
|
45
|
+
/** Time (HH:MM or HH:MM:SS) */
|
|
46
|
+
TIME: /^([01]\d|2[0-3]):([0-5]\d)(:[0-5]\d)?$/
|
|
47
|
+
};
|
|
48
|
+
var isValidEmail = (email) => {
|
|
49
|
+
return VALIDATION_PATTERNS.EMAIL.test(email.trim());
|
|
50
|
+
};
|
|
51
|
+
var isValidPassword = (password, strength = "medium") => {
|
|
52
|
+
switch (strength) {
|
|
53
|
+
case "strong":
|
|
54
|
+
return VALIDATION_PATTERNS.PASSWORD_STRONG.test(password);
|
|
55
|
+
case "medium":
|
|
56
|
+
return VALIDATION_PATTERNS.PASSWORD_MEDIUM.test(password);
|
|
57
|
+
case "basic":
|
|
58
|
+
default:
|
|
59
|
+
return VALIDATION_PATTERNS.PASSWORD_BASIC.test(password);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var isValidPhone = (phone, format = "international") => {
|
|
63
|
+
const cleaned = phone.replace(/\s/g, "");
|
|
64
|
+
switch (format) {
|
|
65
|
+
case "us":
|
|
66
|
+
return VALIDATION_PATTERNS.PHONE_US.test(cleaned);
|
|
67
|
+
case "india":
|
|
68
|
+
return VALIDATION_PATTERNS.PHONE_INDIA.test(cleaned);
|
|
69
|
+
case "international":
|
|
70
|
+
default:
|
|
71
|
+
return VALIDATION_PATTERNS.PHONE_INTERNATIONAL.test(cleaned);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
var isValidUrl = (url, requireProtocol = false) => {
|
|
75
|
+
if (requireProtocol) {
|
|
76
|
+
return VALIDATION_PATTERNS.URL_STRICT.test(url);
|
|
77
|
+
}
|
|
78
|
+
return VALIDATION_PATTERNS.URL.test(url);
|
|
79
|
+
};
|
|
80
|
+
var isValidUsername = (username) => {
|
|
81
|
+
return VALIDATION_PATTERNS.USERNAME.test(username);
|
|
82
|
+
};
|
|
83
|
+
var isValidSlug = (slug) => {
|
|
84
|
+
return VALIDATION_PATTERNS.SLUG.test(slug);
|
|
85
|
+
};
|
|
86
|
+
var VALIDATION_MESSAGES = {
|
|
87
|
+
// Required fields
|
|
88
|
+
REQUIRED: "This field is required",
|
|
89
|
+
REQUIRED_FIELD: (field) => `${field} is required`,
|
|
90
|
+
// Email
|
|
91
|
+
EMAIL_INVALID: "Please enter a valid email address",
|
|
92
|
+
EMAIL_REQUIRED: "Email is required",
|
|
93
|
+
// Password
|
|
94
|
+
PASSWORD_REQUIRED: "Password is required",
|
|
95
|
+
PASSWORD_MIN_LENGTH: (length) => `Password must be at least ${length} characters`,
|
|
96
|
+
PASSWORD_WEAK: "Password is too weak",
|
|
97
|
+
PASSWORD_MEDIUM: "Password must contain uppercase, lowercase, and number",
|
|
98
|
+
PASSWORD_STRONG: "Password must contain uppercase, lowercase, number, and special character",
|
|
99
|
+
PASSWORD_MISMATCH: "Passwords do not match",
|
|
100
|
+
// Name
|
|
101
|
+
NAME_REQUIRED: "Name is required",
|
|
102
|
+
FIRST_NAME_REQUIRED: "First name is required",
|
|
103
|
+
LAST_NAME_REQUIRED: "Last name is required",
|
|
104
|
+
NAME_MIN_LENGTH: (length) => `Name must be at least ${length} characters`,
|
|
105
|
+
NAME_MAX_LENGTH: (length) => `Name must be at most ${length} characters`,
|
|
106
|
+
// Phone
|
|
107
|
+
PHONE_INVALID: "Please enter a valid phone number",
|
|
108
|
+
PHONE_REQUIRED: "Phone number is required",
|
|
109
|
+
// URL
|
|
110
|
+
URL_INVALID: "Please enter a valid URL",
|
|
111
|
+
// Username
|
|
112
|
+
USERNAME_INVALID: "Username can only contain letters, numbers, underscores, and hyphens",
|
|
113
|
+
USERNAME_MIN_LENGTH: "Username must be at least 3 characters",
|
|
114
|
+
USERNAME_MAX_LENGTH: "Username must be at most 30 characters",
|
|
115
|
+
USERNAME_TAKEN: "This username is already taken",
|
|
116
|
+
// General
|
|
117
|
+
MIN_LENGTH: (field, length) => `${field} must be at least ${length} characters`,
|
|
118
|
+
MAX_LENGTH: (field, length) => `${field} must be at most ${length} characters`,
|
|
119
|
+
MIN_VALUE: (field, value) => `${field} must be at least ${value}`,
|
|
120
|
+
MAX_VALUE: (field, value) => `${field} must be at most ${value}`,
|
|
121
|
+
INVALID_FORMAT: "Invalid format",
|
|
122
|
+
TERMS_REQUIRED: "You must accept the terms and conditions"
|
|
123
|
+
};
|
|
124
|
+
var VALIDATION_RULES = {
|
|
125
|
+
email: {
|
|
126
|
+
pattern: VALIDATION_PATTERNS.EMAIL,
|
|
127
|
+
message: VALIDATION_MESSAGES.EMAIL_INVALID
|
|
128
|
+
},
|
|
129
|
+
password: {
|
|
130
|
+
minLength: 8,
|
|
131
|
+
pattern: VALIDATION_PATTERNS.PASSWORD_MEDIUM,
|
|
132
|
+
message: VALIDATION_MESSAGES.PASSWORD_MEDIUM
|
|
133
|
+
},
|
|
134
|
+
passwordStrong: {
|
|
135
|
+
minLength: 8,
|
|
136
|
+
pattern: VALIDATION_PATTERNS.PASSWORD_STRONG,
|
|
137
|
+
message: VALIDATION_MESSAGES.PASSWORD_STRONG
|
|
138
|
+
},
|
|
139
|
+
name: {
|
|
140
|
+
minLength: 2,
|
|
141
|
+
maxLength: 50
|
|
142
|
+
},
|
|
143
|
+
username: {
|
|
144
|
+
minLength: 3,
|
|
145
|
+
maxLength: 30,
|
|
146
|
+
pattern: VALIDATION_PATTERNS.USERNAME,
|
|
147
|
+
message: VALIDATION_MESSAGES.USERNAME_INVALID
|
|
148
|
+
},
|
|
149
|
+
phone: {
|
|
150
|
+
pattern: VALIDATION_PATTERNS.PHONE_INTERNATIONAL,
|
|
151
|
+
message: VALIDATION_MESSAGES.PHONE_INVALID
|
|
152
|
+
},
|
|
153
|
+
url: {
|
|
154
|
+
pattern: VALIDATION_PATTERNS.URL,
|
|
155
|
+
message: VALIDATION_MESSAGES.URL_INVALID
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
var validation_default = {
|
|
159
|
+
VALIDATION_PATTERNS,
|
|
160
|
+
VALIDATION_MESSAGES,
|
|
161
|
+
VALIDATION_RULES,
|
|
162
|
+
isValidEmail,
|
|
163
|
+
isValidPassword,
|
|
164
|
+
isValidPhone,
|
|
165
|
+
isValidUrl,
|
|
166
|
+
isValidUsername,
|
|
167
|
+
isValidSlug
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export { VALIDATION_MESSAGES, VALIDATION_PATTERNS, VALIDATION_RULES, validation_default as default, isValidEmail, isValidPassword, isValidPhone, isValidSlug, isValidUrl, isValidUsername };
|
|
171
|
+
//# sourceMappingURL=index.mjs.map
|
|
172
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/validation/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Common Validation Rules & Patterns\r\n * Use with Yup, Zod, or custom validators\r\n */\r\n\r\n// ==========================================\r\n// REGEX PATTERNS\r\n// ==========================================\r\n\r\nexport const VALIDATION_PATTERNS = {\r\n /** Email pattern (RFC 5322 simplified) */\r\n EMAIL: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n\r\n /** Strong password: min 8 chars, uppercase, lowercase, number, special char */\r\n PASSWORD_STRONG:\r\n /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$/,\r\n\r\n /** Medium password: min 8 chars, uppercase, lowercase, number */\r\n PASSWORD_MEDIUM: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d@$!%*?&]{8,}$/,\r\n\r\n /** Basic password: min 8 chars */\r\n PASSWORD_BASIC: /^.{8,}$/,\r\n\r\n /** Phone number (international) */\r\n PHONE_INTERNATIONAL: /^\\+?[\\d\\s\\-().]{10,}$/,\r\n\r\n /** Phone number (US) */\r\n PHONE_US: /^\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/,\r\n\r\n /** Phone number (India) */\r\n PHONE_INDIA: /^[6-9]\\d{9}$/,\r\n\r\n /** URL pattern */\r\n URL: /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/,\r\n\r\n /** URL with required protocol */\r\n URL_STRICT: /^https?:\\/\\/([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/,\r\n\r\n /** Alphanumeric only */\r\n ALPHANUMERIC: /^[a-zA-Z0-9]+$/,\r\n\r\n /** Letters only */\r\n LETTERS_ONLY: /^[a-zA-Z]+$/,\r\n\r\n /** Numbers only */\r\n NUMBERS_ONLY: /^\\d+$/,\r\n\r\n /** Slug pattern (kebab-case) */\r\n SLUG: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\r\n\r\n /** Username pattern (alphanumeric, underscore, hyphen) */\r\n USERNAME: /^[a-zA-Z0-9_-]{3,30}$/,\r\n\r\n /** Credit card (basic validation) */\r\n CREDIT_CARD: /^\\d{13,19}$/,\r\n\r\n /** CVV (3 or 4 digits) */\r\n CVV: /^\\d{3,4}$/,\r\n\r\n /** ZIP code (US) */\r\n ZIP_US: /^\\d{5}(-\\d{4})?$/,\r\n\r\n /** Postal code (India) */\r\n POSTAL_INDIA: /^\\d{6}$/,\r\n\r\n /** IP Address (IPv4) */\r\n 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]?)$/,\r\n\r\n /** Hex color */\r\n HEX_COLOR: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,\r\n\r\n /** Date (YYYY-MM-DD) */\r\n DATE_ISO: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n\r\n /** Time (HH:MM or HH:MM:SS) */\r\n TIME: /^([01]\\d|2[0-3]):([0-5]\\d)(:[0-5]\\d)?$/,\r\n} as const;\r\n\r\n// ==========================================\r\n// VALIDATION FUNCTIONS\r\n// ==========================================\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport const isValidEmail = (email: string): boolean => {\r\n return VALIDATION_PATTERNS.EMAIL.test(email.trim());\r\n};\r\n\r\n/**\r\n * Validate password strength\r\n */\r\nexport const isValidPassword = (\r\n password: string,\r\n strength: 'basic' | 'medium' | 'strong' = 'medium'\r\n): boolean => {\r\n switch (strength) {\r\n case 'strong':\r\n return VALIDATION_PATTERNS.PASSWORD_STRONG.test(password);\r\n case 'medium':\r\n return VALIDATION_PATTERNS.PASSWORD_MEDIUM.test(password);\r\n case 'basic':\r\n default:\r\n return VALIDATION_PATTERNS.PASSWORD_BASIC.test(password);\r\n }\r\n};\r\n\r\n/**\r\n * Validate phone number\r\n */\r\nexport const isValidPhone = (\r\n phone: string,\r\n format: 'international' | 'us' | 'india' = 'international'\r\n): boolean => {\r\n const cleaned = phone.replace(/\\s/g, '');\r\n switch (format) {\r\n case 'us':\r\n return VALIDATION_PATTERNS.PHONE_US.test(cleaned);\r\n case 'india':\r\n return VALIDATION_PATTERNS.PHONE_INDIA.test(cleaned);\r\n case 'international':\r\n default:\r\n return VALIDATION_PATTERNS.PHONE_INTERNATIONAL.test(cleaned);\r\n }\r\n};\r\n\r\n/**\r\n * Validate URL format\r\n */\r\nexport const isValidUrl = (url: string, requireProtocol: boolean = false): boolean => {\r\n if (requireProtocol) {\r\n return VALIDATION_PATTERNS.URL_STRICT.test(url);\r\n }\r\n return VALIDATION_PATTERNS.URL.test(url);\r\n};\r\n\r\n/**\r\n * Validate username format\r\n */\r\nexport const isValidUsername = (username: string): boolean => {\r\n return VALIDATION_PATTERNS.USERNAME.test(username);\r\n};\r\n\r\n/**\r\n * Validate slug format\r\n */\r\nexport const isValidSlug = (slug: string): boolean => {\r\n return VALIDATION_PATTERNS.SLUG.test(slug);\r\n};\r\n\r\n// ==========================================\r\n// VALIDATION MESSAGES\r\n// ==========================================\r\n\r\nexport const VALIDATION_MESSAGES = {\r\n // Required fields\r\n REQUIRED: 'This field is required',\r\n REQUIRED_FIELD: (field: string) => `${field} is required`,\r\n\r\n // Email\r\n EMAIL_INVALID: 'Please enter a valid email address',\r\n EMAIL_REQUIRED: 'Email is required',\r\n\r\n // Password\r\n PASSWORD_REQUIRED: 'Password is required',\r\n PASSWORD_MIN_LENGTH: (length: number) => `Password must be at least ${length} characters`,\r\n PASSWORD_WEAK: 'Password is too weak',\r\n PASSWORD_MEDIUM: 'Password must contain uppercase, lowercase, and number',\r\n PASSWORD_STRONG: 'Password must contain uppercase, lowercase, number, and special character',\r\n PASSWORD_MISMATCH: 'Passwords do not match',\r\n\r\n // Name\r\n NAME_REQUIRED: 'Name is required',\r\n FIRST_NAME_REQUIRED: 'First name is required',\r\n LAST_NAME_REQUIRED: 'Last name is required',\r\n NAME_MIN_LENGTH: (length: number) => `Name must be at least ${length} characters`,\r\n NAME_MAX_LENGTH: (length: number) => `Name must be at most ${length} characters`,\r\n\r\n // Phone\r\n PHONE_INVALID: 'Please enter a valid phone number',\r\n PHONE_REQUIRED: 'Phone number is required',\r\n\r\n // URL\r\n URL_INVALID: 'Please enter a valid URL',\r\n\r\n // Username\r\n USERNAME_INVALID: 'Username can only contain letters, numbers, underscores, and hyphens',\r\n USERNAME_MIN_LENGTH: 'Username must be at least 3 characters',\r\n USERNAME_MAX_LENGTH: 'Username must be at most 30 characters',\r\n USERNAME_TAKEN: 'This username is already taken',\r\n\r\n // General\r\n MIN_LENGTH: (field: string, length: number) => `${field} must be at least ${length} characters`,\r\n MAX_LENGTH: (field: string, length: number) => `${field} must be at most ${length} characters`,\r\n MIN_VALUE: (field: string, value: number) => `${field} must be at least ${value}`,\r\n MAX_VALUE: (field: string, value: number) => `${field} must be at most ${value}`,\r\n INVALID_FORMAT: 'Invalid format',\r\n TERMS_REQUIRED: 'You must accept the terms and conditions',\r\n} as const;\r\n\r\n// ==========================================\r\n// COMMON VALIDATION RULES (for schema builders)\r\n// ==========================================\r\n\r\nexport const VALIDATION_RULES = {\r\n email: {\r\n pattern: VALIDATION_PATTERNS.EMAIL,\r\n message: VALIDATION_MESSAGES.EMAIL_INVALID,\r\n },\r\n password: {\r\n minLength: 8,\r\n pattern: VALIDATION_PATTERNS.PASSWORD_MEDIUM,\r\n message: VALIDATION_MESSAGES.PASSWORD_MEDIUM,\r\n },\r\n passwordStrong: {\r\n minLength: 8,\r\n pattern: VALIDATION_PATTERNS.PASSWORD_STRONG,\r\n message: VALIDATION_MESSAGES.PASSWORD_STRONG,\r\n },\r\n name: {\r\n minLength: 2,\r\n maxLength: 50,\r\n },\r\n username: {\r\n minLength: 3,\r\n maxLength: 30,\r\n pattern: VALIDATION_PATTERNS.USERNAME,\r\n message: VALIDATION_MESSAGES.USERNAME_INVALID,\r\n },\r\n phone: {\r\n pattern: VALIDATION_PATTERNS.PHONE_INTERNATIONAL,\r\n message: VALIDATION_MESSAGES.PHONE_INVALID,\r\n },\r\n url: {\r\n pattern: VALIDATION_PATTERNS.URL,\r\n message: VALIDATION_MESSAGES.URL_INVALID,\r\n },\r\n} as const;\r\n\r\nexport default {\r\n VALIDATION_PATTERNS,\r\n VALIDATION_MESSAGES,\r\n VALIDATION_RULES,\r\n isValidEmail,\r\n isValidPassword,\r\n isValidPhone,\r\n isValidUrl,\r\n isValidUsername,\r\n isValidSlug,\r\n};\r\n"]}
|