smart-auth-validator 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -7
- package/dist/index.cjs +52 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +52 -13
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -12,13 +12,12 @@ Smart, type-safe, zero-regex validation middleware for Node.js backends. Support
|
|
|
12
12
|
|
|
13
13
|
## Features
|
|
14
14
|
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
- ✅ Easy to extend with custom rules
|
|
15
|
+
- Type-safe validation with **TypeScript**
|
|
16
|
+
- Supports **Fastify** and **Express** out of the box
|
|
17
|
+
- Standard rules for common fields: `email`, `password`, `name`, `phone`, etc.
|
|
18
|
+
- Returns structured **errors** for each field
|
|
19
|
+
- Minimal and lightweight
|
|
20
|
+
- Easy to extend with custom rules
|
|
22
21
|
|
|
23
22
|
---
|
|
24
23
|
|
|
@@ -26,3 +25,35 @@ Smart, type-safe, zero-regex validation middleware for Node.js backends. Support
|
|
|
26
25
|
|
|
27
26
|
```bash
|
|
28
27
|
npm install smart-auth-validator
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Supported Fields
|
|
31
|
+
The library currently supports a wide array of built-in validation rules. You can validate these fields by simply passing their keys:
|
|
32
|
+
|
|
33
|
+
Category: Supported Fields
|
|
34
|
+
Identity "name, username, email, password"
|
|
35
|
+
Contact "phone, url"
|
|
36
|
+
Address "street, city, state, postalCode"
|
|
37
|
+
Finance "creditCard, cvv"
|
|
38
|
+
General "date, time, active (boolean)"
|
|
39
|
+
|
|
40
|
+
Simple Usage
|
|
41
|
+
To use Smart Auth Validator, simply define a schema with the fields you want to validate and pass your input data to the validate function.
|
|
42
|
+
|
|
43
|
+
Basic 3-Field Example
|
|
44
|
+
Even though the library supports 10+ fields, you can choose only the ones you need:
|
|
45
|
+
|
|
46
|
+
import { validate } from "smart-auth-validator";
|
|
47
|
+
const result = validate({ name: true, email: true, password: true }, req.body);
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
Error Response Format
|
|
51
|
+
If validation fails, you get a clean array explaining exactly what went wrong:
|
|
52
|
+
|
|
53
|
+
REQUIRED: Field is missing.
|
|
54
|
+
|
|
55
|
+
PATTERN: Invalid format (e.g., bad email).
|
|
56
|
+
|
|
57
|
+
MIN_LENGTH: Input is too short.
|
|
58
|
+
|
|
59
|
+
WEAK_PASSWORD: Password doesn't meet security standards.
|
package/dist/index.cjs
CHANGED
|
@@ -159,6 +159,16 @@ var booleanRule = {
|
|
|
159
159
|
}
|
|
160
160
|
};
|
|
161
161
|
|
|
162
|
+
// src/rules/imageRule.ts
|
|
163
|
+
var imageRule = {
|
|
164
|
+
messages: {
|
|
165
|
+
REQUIRED: "Image is required",
|
|
166
|
+
INVALID_IMAGE: "Invalid image payload",
|
|
167
|
+
IMAGE_TOO_LARGE: "Image size exceeds limit",
|
|
168
|
+
UNSUPPORTED_IMAGE_TYPE: "Unsupported image format"
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
162
172
|
// src/rules/index.ts
|
|
163
173
|
var RULES = {
|
|
164
174
|
name: nameRule,
|
|
@@ -175,44 +185,72 @@ var RULES = {
|
|
|
175
185
|
street: streetRule,
|
|
176
186
|
username: usernameRule,
|
|
177
187
|
time: timeRule,
|
|
178
|
-
active: booleanRule
|
|
188
|
+
active: booleanRule,
|
|
189
|
+
avatar: imageRule
|
|
179
190
|
};
|
|
180
191
|
|
|
181
192
|
// src/core/error.ts
|
|
182
193
|
var ERROR_MESSAGES = {
|
|
183
194
|
REQUIRED: (field) => `${field} is required`,
|
|
184
|
-
INVALID_TYPE: (field) => `${field} must be valid ${field}`,
|
|
195
|
+
INVALID_TYPE: (field) => `${field} must be a valid ${field}`,
|
|
185
196
|
MIN_LENGTH: (field, rule) => `${field} must be at least ${rule?.min} characters`,
|
|
186
197
|
MAX_LENGTH: (field, rule) => `${field} must be maximum ${rule?.max} characters`,
|
|
187
198
|
PATTERN: (field) => `${field} format is invalid`,
|
|
188
199
|
WEAK_PASSWORD: () => "Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)",
|
|
189
200
|
INVALID_PHONE: () => "Phone must be a valid international/local number (+923001234567)",
|
|
190
|
-
INVALID_URL: () => "URL must be valid (https://example.com)"
|
|
201
|
+
INVALID_URL: () => "URL must be valid (https://example.com)",
|
|
202
|
+
INVALID_IMAGE: (field) => `${field} must be a valid image object`,
|
|
203
|
+
IMAGE_TOO_LARGE: () => "Image size exceeds allowed limit",
|
|
204
|
+
UNSUPPORTED_IMAGE_TYPE: () => "Unsupported image format (jpeg, png, webp, avif only)"
|
|
191
205
|
};
|
|
192
206
|
function createError(field, code, rule) {
|
|
193
|
-
const message = rule?.messages?.[code] || ERROR_MESSAGES[code](field, rule);
|
|
207
|
+
const message = rule?.messages?.[code] || ERROR_MESSAGES[code]?.(field, rule) || "Validation error";
|
|
194
208
|
return { field, code, message };
|
|
195
209
|
}
|
|
196
210
|
|
|
211
|
+
// src/constants/image.ts
|
|
212
|
+
var ALLOWED_IMAGE_MIME_TYPES = /* @__PURE__ */ new Set([
|
|
213
|
+
"image/jpeg",
|
|
214
|
+
"image/png",
|
|
215
|
+
"image/webp",
|
|
216
|
+
"image/avif"
|
|
217
|
+
]);
|
|
218
|
+
|
|
197
219
|
// src/core/rule-engine.ts
|
|
198
220
|
function applyRule(field, value, rule) {
|
|
199
|
-
if (value
|
|
221
|
+
if (value == null) {
|
|
200
222
|
return createError(field, "REQUIRED", rule);
|
|
201
223
|
}
|
|
224
|
+
if (field === "image" || field === "avatar") {
|
|
225
|
+
if (typeof value !== "object" || Array.isArray(value)) {
|
|
226
|
+
return createError(field, "INVALID_IMAGE", rule);
|
|
227
|
+
}
|
|
228
|
+
const img = value;
|
|
229
|
+
if (typeof img.url !== "string") return createError(field, "INVALID_IMAGE", rule);
|
|
230
|
+
if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType)) {
|
|
231
|
+
return createError(field, "UNSUPPORTED_IMAGE_TYPE", rule);
|
|
232
|
+
}
|
|
233
|
+
if (img.sizeKB && img.sizeKB > 5120) {
|
|
234
|
+
return createError(field, "IMAGE_TOO_LARGE", rule);
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
if (typeof value === "boolean") {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
202
241
|
if (typeof value !== "string") {
|
|
203
242
|
return createError(field, "INVALID_TYPE", rule);
|
|
204
243
|
}
|
|
205
|
-
|
|
206
|
-
if (rule.min !== void 0 && strValue.length < rule.min) {
|
|
244
|
+
if (rule.min !== void 0 && value.length < rule.min) {
|
|
207
245
|
return createError(field, "MIN_LENGTH", rule);
|
|
208
246
|
}
|
|
209
|
-
if (rule.max !== void 0 &&
|
|
247
|
+
if (rule.max !== void 0 && value.length > rule.max) {
|
|
210
248
|
return createError(field, "MAX_LENGTH", rule);
|
|
211
249
|
}
|
|
212
|
-
if (rule.regex && !rule.regex.test(
|
|
213
|
-
if (field === "
|
|
214
|
-
|
|
215
|
-
|
|
250
|
+
if (rule.regex && !rule.regex.test(value)) {
|
|
251
|
+
if (field === "password") {
|
|
252
|
+
return createError(field, "PATTERN", rule);
|
|
253
|
+
}
|
|
216
254
|
return createError(field, "PATTERN", rule);
|
|
217
255
|
}
|
|
218
256
|
return null;
|
|
@@ -223,7 +261,8 @@ function validate(schema, data) {
|
|
|
223
261
|
const errors = [];
|
|
224
262
|
const validData = {};
|
|
225
263
|
for (const field of Object.keys(schema)) {
|
|
226
|
-
const
|
|
264
|
+
const schemaRule = schema[field];
|
|
265
|
+
const rule = typeof schemaRule === "boolean" ? RULES[field] : RULES[field] ?? schemaRule;
|
|
227
266
|
if (!rule) {
|
|
228
267
|
errors.push(createError(field, "INVALID_TYPE"));
|
|
229
268
|
continue;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rules/password.ts","../src/rules/email.ts","../src/rules/name.ts","../src/rules/phone.ts","../src/rules/urlRule.ts","../src/rules/postalCodeRule.ts","../src/rules/dateRule.ts","../src/rules/creditCardRule.ts","../src/rules/cvvRule.ts","../src/rules/stateRule.ts","../src/rules/cityRule.ts","../src/rules/streetRule.ts","../src/rules/usernameRule.ts","../src/rules/timeRule.ts","../src/rules/booleanRule.ts","../src/rules/index.ts","../src/core/error.ts","../src/core/rule-engine.ts","../src/core/validate.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import { FieldRule } from \"../types/schema\";\r\n\r\nexport const passwordRule: FieldRule = {\r\n min: 8,\r\n max: 128,\r\n regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$/,\r\n messages: {\r\n REQUIRED: \"Password is required\",\r\n MIN_LENGTH: \"Password must be at least 8 characters\",\r\n MAX_LENGTH: \"Password must be under 128 characters\",\r\n PATTERN: \"Password must include uppercase, lowercase, number, and special character\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const emailRule: FieldRule = {\r\n max: 50,\r\n regex: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n messages: {\r\n REQUIRED: \"Email is required\",\r\n MAX_LENGTH: \"Email must be under 50 characters\",\r\n PATTERN: \"Invalid email format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const nameRule: FieldRule = {\r\n min: 2,\r\n max: 50,\r\n regex: /^[a-zA-Z\\s'-]+$/,\r\n messages: {\r\n REQUIRED: \"Name is required\",\r\n MIN_LENGTH: \"Name must be at least 2 characters\",\r\n MAX_LENGTH: \"Name must be under 50 characters\",\r\n PATTERN: \"Name can only contain letters, spaces, apostrophes, or hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const phoneRule: FieldRule = {\r\n regex: /^\\+?[1-9]\\d{10,14}$/,\r\n messages: {\r\n REQUIRED: \"Phone number is required\",\r\n PATTERN: \"Phone number must be in international format (+countrycodexxxxxxxx)\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const urlRule: FieldRule = {\r\n max: 2083, // typical max URL length\r\n regex: /^(https?:\\/\\/)?([\\w-]+(\\.[\\w-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?$/,\r\n messages: {\r\n REQUIRED: \"URL is required\",\r\n MAX_LENGTH: \"URL is too long\",\r\n PATTERN: \"Invalid URL format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const postalCodeRule: FieldRule = {\r\n max: 10,\r\n regex: /^[A-Za-z0-9\\- ]{3,10}$/,\r\n messages: {\r\n REQUIRED: \"Postal code is required\",\r\n PATTERN: \"Invalid postal code format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const dateRule: FieldRule = {\r\n regex: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n messages: {\r\n REQUIRED: \"Date is required\",\r\n PATTERN: \"Date must be in YYYY-MM-DD format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const creditCardRule: FieldRule = {\r\n regex: /^\\d{13,19}$/,\r\n messages: {\r\n REQUIRED: \"Credit card number is required\",\r\n PATTERN: \"Invalid credit card number\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cvvRule: FieldRule = {\r\n regex: /^\\d{3,4}$/,\r\n messages: {\r\n REQUIRED: \"CVV is required\",\r\n PATTERN: \"CVV must be 3 or 4 digits\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const stateRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"State is required\",\r\n MAX_LENGTH: \"State must be under 50 characters\",\r\n PATTERN: \"State can only contain letters and spaces\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cityRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"City is required\",\r\n MAX_LENGTH: \"City must be under 50 characters\",\r\n PATTERN: \"City can only contain letters and spaces\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const streetRule: FieldRule = {\r\n max: 100,\r\n regex: /^[a-zA-Z0-9\\s,.-]+$/,\r\n messages: {\r\n REQUIRED: \"Street address is required\",\r\n MAX_LENGTH: \"Street must be under 100 characters\",\r\n PATTERN: \"Street can contain letters, numbers, commas, dots, and hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const usernameRule: FieldRule = {\r\n min: 3,\r\n max: 30,\r\n regex: /^[a-zA-Z0-9_]+$/,\r\n messages: {\r\n REQUIRED: \"Username is required\",\r\n MIN_LENGTH: \"Username must be at least 3 characters\",\r\n MAX_LENGTH: \"Username must be under 30 characters\",\r\n PATTERN: \"Username can contain only letters, numbers, and underscores\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const timeRule: FieldRule = {\r\n regex: /^([01]\\d|2[0-3]):([0-5]\\d)$/,\r\n messages: {\r\n REQUIRED: \"Time is required\",\r\n PATTERN: \"Time must be in HH:MM 24-hour format\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const booleanRule: FieldRule = {\r\n regex: /^(true|false)$/,\r\n messages: {\r\n REQUIRED: \"Value is required\",\r\n PATTERN: \"Value must be true or false\"\r\n }\r\n};","import { passwordRule } from \"./password\";\r\nimport { emailRule } from \"./email\";\r\nimport { nameRule } from \"./name\";\r\nimport { FieldRule } from \"../types/schema\";\r\nimport { phoneRule } from \"./phone\";\r\nimport { urlRule } from \"./urlRule\";\r\nimport { postalCodeRule } from \"./postalCodeRule\";\r\nimport { dateRule } from \"./dateRule\";\r\nimport { creditCardRule } from \"./creditCardRule\";\r\nimport { cvvRule } from \"./cvvRule\";\r\nimport { stateRule } from \"./stateRule\";\r\nimport { cityRule } from \"./cityRule\";\r\nimport { streetRule } from \"./streetRule\";\r\nimport { usernameRule } from \"./usernameRule\";\r\nimport { timeRule } from \"./timeRule\";\r\nimport { booleanRule } from \"./booleanRule\";\r\n\r\nexport const RULES: Record<string, FieldRule> = {\r\n name: nameRule,\r\n email: emailRule,\r\n password: passwordRule,\r\n phone: phoneRule,\r\n url: urlRule,\r\n postalCode: postalCodeRule,\r\n date: dateRule,\r\n creditCard: creditCardRule,\r\n cvv: cvvRule,\r\n state: stateRule,\r\n city: cityRule,\r\n street: streetRule,\r\n username: usernameRule,\r\n time: timeRule,\r\n active: booleanRule\r\n};\r\n","import type { FieldRule, ValidationError, ValidationErrorCode } from \"../types/schema\";\r\n\r\nexport const ERROR_MESSAGES: Record<ValidationErrorCode, (field: string, rule?: FieldRule) => string> = {\r\n REQUIRED: (field) => `${field} is required`,\r\n INVALID_TYPE: (field) => `${field} must be valid ${field}`,\r\n MIN_LENGTH: (field, rule) => `${field} must be at least ${rule?.min} characters`,\r\n MAX_LENGTH: (field, rule) => `${field} must be maximum ${rule?.max} characters`,\r\n PATTERN: (field) => `${field} format is invalid`,\r\n WEAK_PASSWORD: () => \"Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)\",\r\n INVALID_PHONE: () => \"Phone must be a valid international/local number (+923001234567)\",\r\n INVALID_URL: () => \"URL must be valid (https://example.com)\"\r\n};\r\n\r\nexport function createError(field: string, code: ValidationErrorCode, rule?: FieldRule): ValidationError {\r\n const message = rule?.messages?.[code] || ERROR_MESSAGES[code](field, rule);\r\n return { field, code, message };\r\n}\r\n","import type { FieldRule, ValidationError } from \"../types/schema\";\r\nimport { createError } from \"../core/error\";\r\n\r\nexport function applyRule(field: string, value: unknown, rule: FieldRule): ValidationError | null {\r\n if (value === undefined || value === null || value === \"\") {\r\n return createError(field, \"REQUIRED\", rule);\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return createError(field, \"INVALID_TYPE\", rule);\r\n }\r\n\r\n const strValue = value as string;\r\n\r\n if (rule.min !== undefined && strValue.length < rule.min) {\r\n return createError(field, \"MIN_LENGTH\", rule);\r\n }\r\n\r\n if (rule.max !== undefined && strValue.length > rule.max) {\r\n return createError(field, \"MAX_LENGTH\", rule);\r\n }\r\n\r\n if (rule.regex && !rule.regex.test(strValue)) {\r\n if (field === \"phone\") return createError(field, \"INVALID_PHONE\", rule);\r\n if (field === \"url\") return createError(field, \"INVALID_URL\", rule);\r\n if (field === \"password\") return createError(field, \"WEAK_PASSWORD\", rule);\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n\r\n return null;\r\n}","import { RULES } from \"../rules\";\r\nimport { applyRule } from \"./rule-engine\";\r\nimport { createError } from \"../core/error\";\r\nimport type { FieldRule, ValidationError, ValidationResult, ValidationSchema } from \"../types/schema\";\r\nexport function validate<T extends Record<string, unknown>>(schema: ValidationSchema, data: T): ValidationResult<Partial<T>> {\r\n const errors: ValidationError[] = [];\r\n const validData: Partial<T> = {};\r\n\r\n for (const field of Object.keys(schema)) {\r\n const rule = RULES[field] || (schema[field] as FieldRule);\r\n\r\n if (!rule) {\r\n errors.push(createError(field, \"INVALID_TYPE\"));\r\n continue;\r\n }\r\n\r\n const error = applyRule(field, data[field as keyof T], rule);\r\n\r\n if (error) {\r\n errors.push(error);\r\n } else {\r\n validData[field as keyof T] = data[field as keyof T];\r\n }\r\n }\r\n\r\n return errors.length > 0 ? { success: false, errors } : { success: true, data: validData };\r\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/rules/password.ts","../src/rules/email.ts","../src/rules/name.ts","../src/rules/phone.ts","../src/rules/urlRule.ts","../src/rules/postalCodeRule.ts","../src/rules/dateRule.ts","../src/rules/creditCardRule.ts","../src/rules/cvvRule.ts","../src/rules/stateRule.ts","../src/rules/cityRule.ts","../src/rules/streetRule.ts","../src/rules/usernameRule.ts","../src/rules/timeRule.ts","../src/rules/booleanRule.ts","../src/rules/imageRule.ts","../src/rules/index.ts","../src/core/error.ts","../src/constants/image.ts","../src/core/rule-engine.ts","../src/core/validate.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import { FieldRule } from \"../types/schema\";\r\n\r\nexport const passwordRule: FieldRule = {\r\n min: 8,\r\n max: 128,\r\n regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$/,\r\n messages: {\r\n REQUIRED: \"Password is required\",\r\n MIN_LENGTH: \"Password must be at least 8 characters\",\r\n MAX_LENGTH: \"Password must be under 128 characters\",\r\n PATTERN: \"Password must include uppercase, lowercase, number, and special character\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const emailRule: FieldRule = {\r\n max: 50,\r\n regex: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n messages: {\r\n REQUIRED: \"Email is required\",\r\n MAX_LENGTH: \"Email must be under 50 characters\",\r\n PATTERN: \"Invalid email format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const nameRule: FieldRule = {\r\n min: 2,\r\n max: 50,\r\n regex: /^[a-zA-Z\\s'-]+$/,\r\n messages: {\r\n REQUIRED: \"Name is required\",\r\n MIN_LENGTH: \"Name must be at least 2 characters\",\r\n MAX_LENGTH: \"Name must be under 50 characters\",\r\n PATTERN: \"Name can only contain letters, spaces, apostrophes, or hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const phoneRule: FieldRule = {\r\n regex: /^\\+?[1-9]\\d{10,14}$/,\r\n messages: {\r\n REQUIRED: \"Phone number is required\",\r\n PATTERN: \"Phone number must be in international format (+countrycodexxxxxxxx)\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const urlRule: FieldRule = {\r\n max: 2083, // typical max URL length\r\n regex: /^(https?:\\/\\/)?([\\w-]+(\\.[\\w-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?$/,\r\n messages: {\r\n REQUIRED: \"URL is required\",\r\n MAX_LENGTH: \"URL is too long\",\r\n PATTERN: \"Invalid URL format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const postalCodeRule: FieldRule = {\r\n max: 10,\r\n regex: /^[A-Za-z0-9\\- ]{3,10}$/,\r\n messages: {\r\n REQUIRED: \"Postal code is required\",\r\n PATTERN: \"Invalid postal code format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const dateRule: FieldRule = {\r\n regex: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n messages: {\r\n REQUIRED: \"Date is required\",\r\n PATTERN: \"Date must be in YYYY-MM-DD format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const creditCardRule: FieldRule = {\r\n regex: /^\\d{13,19}$/,\r\n messages: {\r\n REQUIRED: \"Credit card number is required\",\r\n PATTERN: \"Invalid credit card number\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cvvRule: FieldRule = {\r\n regex: /^\\d{3,4}$/,\r\n messages: {\r\n REQUIRED: \"CVV is required\",\r\n PATTERN: \"CVV must be 3 or 4 digits\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const stateRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"State is required\",\r\n MAX_LENGTH: \"State must be under 50 characters\",\r\n PATTERN: \"State can only contain letters and spaces\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cityRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"City is required\",\r\n MAX_LENGTH: \"City must be under 50 characters\",\r\n PATTERN: \"City can only contain letters and spaces\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const streetRule: FieldRule = {\r\n max: 100,\r\n regex: /^[a-zA-Z0-9\\s,.-]+$/,\r\n messages: {\r\n REQUIRED: \"Street address is required\",\r\n MAX_LENGTH: \"Street must be under 100 characters\",\r\n PATTERN: \"Street can contain letters, numbers, commas, dots, and hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const usernameRule: FieldRule = {\r\n min: 3,\r\n max: 30,\r\n regex: /^[a-zA-Z0-9_]+$/,\r\n messages: {\r\n REQUIRED: \"Username is required\",\r\n MIN_LENGTH: \"Username must be at least 3 characters\",\r\n MAX_LENGTH: \"Username must be under 30 characters\",\r\n PATTERN: \"Username can contain only letters, numbers, and underscores\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const timeRule: FieldRule = {\r\n regex: /^([01]\\d|2[0-3]):([0-5]\\d)$/,\r\n messages: {\r\n REQUIRED: \"Time is required\",\r\n PATTERN: \"Time must be in HH:MM 24-hour format\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const booleanRule: FieldRule = {\r\n regex: /^(true|false)$/,\r\n messages: {\r\n REQUIRED: \"Value is required\",\r\n PATTERN: \"Value must be true or false\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const imageRule: FieldRule = {\r\n messages: {\r\n REQUIRED: \"Image is required\",\r\n INVALID_IMAGE: \"Invalid image payload\",\r\n IMAGE_TOO_LARGE: \"Image size exceeds limit\",\r\n UNSUPPORTED_IMAGE_TYPE: \"Unsupported image format\"\r\n }\r\n};\r\n","import { passwordRule } from \"./password\";\r\nimport { emailRule } from \"./email\";\r\nimport { nameRule } from \"./name\";\r\nimport { FieldRule } from \"../types/schema\";\r\nimport { phoneRule } from \"./phone\";\r\nimport { urlRule } from \"./urlRule\";\r\nimport { postalCodeRule } from \"./postalCodeRule\";\r\nimport { dateRule } from \"./dateRule\";\r\nimport { creditCardRule } from \"./creditCardRule\";\r\nimport { cvvRule } from \"./cvvRule\";\r\nimport { stateRule } from \"./stateRule\";\r\nimport { cityRule } from \"./cityRule\";\r\nimport { streetRule } from \"./streetRule\";\r\nimport { usernameRule } from \"./usernameRule\";\r\nimport { timeRule } from \"./timeRule\";\r\nimport { booleanRule } from \"./booleanRule\";\r\nimport { imageRule } from \"./imageRule\";\r\n\r\nexport const RULES: Record<string, FieldRule> = {\r\n name: nameRule,\r\n email: emailRule,\r\n password: passwordRule,\r\n phone: phoneRule,\r\n url: urlRule,\r\n postalCode: postalCodeRule,\r\n date: dateRule,\r\n creditCard: creditCardRule,\r\n cvv: cvvRule,\r\n state: stateRule,\r\n city: cityRule,\r\n street: streetRule,\r\n username: usernameRule,\r\n time: timeRule,\r\n active: booleanRule,\r\n avatar: imageRule \r\n};\r\n","import type { FieldRule, ValidationError, ValidationErrorCode } from \"../types/schema\";\r\n\r\nexport const ERROR_MESSAGES: Record<\r\n ValidationErrorCode,\r\n (field: string, rule?: FieldRule) => string\r\n> = {\r\n REQUIRED: (field) => `${field} is required`,\r\n\r\n INVALID_TYPE: (field) => `${field} must be a valid ${field}`,\r\n\r\n MIN_LENGTH: (field, rule) =>\r\n `${field} must be at least ${rule?.min} characters`,\r\n\r\n MAX_LENGTH: (field, rule) =>\r\n `${field} must be maximum ${rule?.max} characters`,\r\n\r\n PATTERN: (field) => `${field} format is invalid`,\r\n\r\n WEAK_PASSWORD: () =>\r\n \"Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)\",\r\n\r\n INVALID_PHONE: () =>\r\n \"Phone must be a valid international/local number (+923001234567)\",\r\n\r\n INVALID_URL: () =>\r\n \"URL must be valid (https://example.com)\",\r\n\r\n INVALID_IMAGE: (field) =>\r\n `${field} must be a valid image object`,\r\n\r\n IMAGE_TOO_LARGE: () =>\r\n \"Image size exceeds allowed limit\",\r\n\r\n UNSUPPORTED_IMAGE_TYPE: () =>\r\n \"Unsupported image format (jpeg, png, webp, avif only)\"\r\n};\r\n\r\nexport function createError(\r\n field: string,\r\n code: ValidationErrorCode,\r\n rule?: FieldRule\r\n): ValidationError {\r\n const message =\r\n rule?.messages?.[code] ||\r\n ERROR_MESSAGES[code]?.(field, rule) ||\r\n \"Validation error\";\r\n\r\n return { field, code, message };\r\n}\r\n","export const ALLOWED_IMAGE_MIME_TYPES = new Set([\r\n \"image/jpeg\",\r\n \"image/png\",\r\n \"image/webp\",\r\n \"image/avif\"\r\n]);\r\n","import type { FieldRule, ValidationError } from \"../types/schema\";\r\nimport { createError } from \"../core/error\";\r\nimport { ALLOWED_IMAGE_MIME_TYPES } from \"../constants/image\";\r\n\r\nexport function applyRule(\r\n field: string,\r\n value: unknown,\r\n rule: FieldRule\r\n): ValidationError | null {\r\n\r\n if (value == null) {\r\n return createError(field, \"REQUIRED\", rule);\r\n }\r\n\r\n if (field === \"image\" || field === \"avatar\") {\r\n if (typeof value !== \"object\" || Array.isArray(value)) {\r\n return createError(field, \"INVALID_IMAGE\", rule);\r\n }\r\n const img = value as Record<string, unknown>;\r\n if (typeof img.url !== \"string\") return createError(field, \"INVALID_IMAGE\", rule);\r\n if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType as string)) {\r\n return createError(field, \"UNSUPPORTED_IMAGE_TYPE\", rule);\r\n }\r\n if (img.sizeKB && (img.sizeKB as number) > 5120) {\r\n return createError(field, \"IMAGE_TOO_LARGE\", rule);\r\n }\r\n return null;\r\n }\r\n\r\n if (typeof value === \"boolean\") {\r\n return null;\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return createError(field, \"INVALID_TYPE\", rule);\r\n }\r\n\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n return createError(field, \"MIN_LENGTH\", rule);\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n return createError(field, \"MAX_LENGTH\", rule);\r\n }\r\n if (rule.regex && !rule.regex.test(value)) {\r\n if (field === \"password\") {\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n\r\n return null;\r\n}\r\n","import { RULES } from \"../rules\";\r\nimport { applyRule } from \"./rule-engine\";\r\nimport { createError } from \"../core/error\";\r\nimport type {\r\n FieldRule,\r\n ValidationError,\r\n ValidationResult,\r\n ValidationSchema\r\n} from \"../types/schema\";\r\n\r\nexport function validate<T extends Record<string, unknown>>(\r\n schema: ValidationSchema,\r\n data: T\r\n): ValidationResult<Partial<T>> {\r\n const errors: ValidationError[] = [];\r\n const validData: Partial<T> = {};\r\n\r\n for (const field of Object.keys(schema)) {\r\n const schemaRule = schema[field];\r\n\r\n const rule: FieldRule | undefined =\r\n typeof schemaRule === \"boolean\"\r\n ? RULES[field]\r\n : RULES[field] ?? schemaRule;\r\n\r\nif (!rule) {\r\n errors.push(createError(field, \"INVALID_TYPE\"));\r\n continue;\r\n}\r\n\r\nconst error = applyRule(field, data[field as keyof T], rule);\r\n\r\n if (error) {\r\n errors.push(error);\r\n } else {\r\n validData[field as keyof T] = data[field as keyof T];\r\n }\r\n }\r\n\r\n return errors.length > 0\r\n ? { success: false, errors }\r\n : { success: true, data: validData };\r\n}\r\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -11,7 +11,7 @@ type Schema = boolean | {
|
|
|
11
11
|
interface ValidationSchema {
|
|
12
12
|
[field: string]: FieldRule | Schema | boolean;
|
|
13
13
|
}
|
|
14
|
-
type ValidationErrorCode = "REQUIRED" | "INVALID_TYPE" | "MIN_LENGTH" | "MAX_LENGTH" | "PATTERN" | "WEAK_PASSWORD" | "INVALID_PHONE" | "INVALID_URL";
|
|
14
|
+
type ValidationErrorCode = "REQUIRED" | "INVALID_TYPE" | "MIN_LENGTH" | "MAX_LENGTH" | "PATTERN" | "WEAK_PASSWORD" | "INVALID_PHONE" | "INVALID_URL" | "INVALID_IMAGE" | "IMAGE_TOO_LARGE" | "UNSUPPORTED_IMAGE_TYPE";
|
|
15
15
|
interface ValidationError {
|
|
16
16
|
field: string;
|
|
17
17
|
code: ValidationErrorCode;
|
package/dist/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ type Schema = boolean | {
|
|
|
11
11
|
interface ValidationSchema {
|
|
12
12
|
[field: string]: FieldRule | Schema | boolean;
|
|
13
13
|
}
|
|
14
|
-
type ValidationErrorCode = "REQUIRED" | "INVALID_TYPE" | "MIN_LENGTH" | "MAX_LENGTH" | "PATTERN" | "WEAK_PASSWORD" | "INVALID_PHONE" | "INVALID_URL";
|
|
14
|
+
type ValidationErrorCode = "REQUIRED" | "INVALID_TYPE" | "MIN_LENGTH" | "MAX_LENGTH" | "PATTERN" | "WEAK_PASSWORD" | "INVALID_PHONE" | "INVALID_URL" | "INVALID_IMAGE" | "IMAGE_TOO_LARGE" | "UNSUPPORTED_IMAGE_TYPE";
|
|
15
15
|
interface ValidationError {
|
|
16
16
|
field: string;
|
|
17
17
|
code: ValidationErrorCode;
|
package/dist/index.js
CHANGED
|
@@ -157,6 +157,16 @@ var booleanRule = {
|
|
|
157
157
|
}
|
|
158
158
|
};
|
|
159
159
|
|
|
160
|
+
// src/rules/imageRule.ts
|
|
161
|
+
var imageRule = {
|
|
162
|
+
messages: {
|
|
163
|
+
REQUIRED: "Image is required",
|
|
164
|
+
INVALID_IMAGE: "Invalid image payload",
|
|
165
|
+
IMAGE_TOO_LARGE: "Image size exceeds limit",
|
|
166
|
+
UNSUPPORTED_IMAGE_TYPE: "Unsupported image format"
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
160
170
|
// src/rules/index.ts
|
|
161
171
|
var RULES = {
|
|
162
172
|
name: nameRule,
|
|
@@ -173,44 +183,72 @@ var RULES = {
|
|
|
173
183
|
street: streetRule,
|
|
174
184
|
username: usernameRule,
|
|
175
185
|
time: timeRule,
|
|
176
|
-
active: booleanRule
|
|
186
|
+
active: booleanRule,
|
|
187
|
+
avatar: imageRule
|
|
177
188
|
};
|
|
178
189
|
|
|
179
190
|
// src/core/error.ts
|
|
180
191
|
var ERROR_MESSAGES = {
|
|
181
192
|
REQUIRED: (field) => `${field} is required`,
|
|
182
|
-
INVALID_TYPE: (field) => `${field} must be valid ${field}`,
|
|
193
|
+
INVALID_TYPE: (field) => `${field} must be a valid ${field}`,
|
|
183
194
|
MIN_LENGTH: (field, rule) => `${field} must be at least ${rule?.min} characters`,
|
|
184
195
|
MAX_LENGTH: (field, rule) => `${field} must be maximum ${rule?.max} characters`,
|
|
185
196
|
PATTERN: (field) => `${field} format is invalid`,
|
|
186
197
|
WEAK_PASSWORD: () => "Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)",
|
|
187
198
|
INVALID_PHONE: () => "Phone must be a valid international/local number (+923001234567)",
|
|
188
|
-
INVALID_URL: () => "URL must be valid (https://example.com)"
|
|
199
|
+
INVALID_URL: () => "URL must be valid (https://example.com)",
|
|
200
|
+
INVALID_IMAGE: (field) => `${field} must be a valid image object`,
|
|
201
|
+
IMAGE_TOO_LARGE: () => "Image size exceeds allowed limit",
|
|
202
|
+
UNSUPPORTED_IMAGE_TYPE: () => "Unsupported image format (jpeg, png, webp, avif only)"
|
|
189
203
|
};
|
|
190
204
|
function createError(field, code, rule) {
|
|
191
|
-
const message = rule?.messages?.[code] || ERROR_MESSAGES[code](field, rule);
|
|
205
|
+
const message = rule?.messages?.[code] || ERROR_MESSAGES[code]?.(field, rule) || "Validation error";
|
|
192
206
|
return { field, code, message };
|
|
193
207
|
}
|
|
194
208
|
|
|
209
|
+
// src/constants/image.ts
|
|
210
|
+
var ALLOWED_IMAGE_MIME_TYPES = /* @__PURE__ */ new Set([
|
|
211
|
+
"image/jpeg",
|
|
212
|
+
"image/png",
|
|
213
|
+
"image/webp",
|
|
214
|
+
"image/avif"
|
|
215
|
+
]);
|
|
216
|
+
|
|
195
217
|
// src/core/rule-engine.ts
|
|
196
218
|
function applyRule(field, value, rule) {
|
|
197
|
-
if (value
|
|
219
|
+
if (value == null) {
|
|
198
220
|
return createError(field, "REQUIRED", rule);
|
|
199
221
|
}
|
|
222
|
+
if (field === "image" || field === "avatar") {
|
|
223
|
+
if (typeof value !== "object" || Array.isArray(value)) {
|
|
224
|
+
return createError(field, "INVALID_IMAGE", rule);
|
|
225
|
+
}
|
|
226
|
+
const img = value;
|
|
227
|
+
if (typeof img.url !== "string") return createError(field, "INVALID_IMAGE", rule);
|
|
228
|
+
if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType)) {
|
|
229
|
+
return createError(field, "UNSUPPORTED_IMAGE_TYPE", rule);
|
|
230
|
+
}
|
|
231
|
+
if (img.sizeKB && img.sizeKB > 5120) {
|
|
232
|
+
return createError(field, "IMAGE_TOO_LARGE", rule);
|
|
233
|
+
}
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
if (typeof value === "boolean") {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
200
239
|
if (typeof value !== "string") {
|
|
201
240
|
return createError(field, "INVALID_TYPE", rule);
|
|
202
241
|
}
|
|
203
|
-
|
|
204
|
-
if (rule.min !== void 0 && strValue.length < rule.min) {
|
|
242
|
+
if (rule.min !== void 0 && value.length < rule.min) {
|
|
205
243
|
return createError(field, "MIN_LENGTH", rule);
|
|
206
244
|
}
|
|
207
|
-
if (rule.max !== void 0 &&
|
|
245
|
+
if (rule.max !== void 0 && value.length > rule.max) {
|
|
208
246
|
return createError(field, "MAX_LENGTH", rule);
|
|
209
247
|
}
|
|
210
|
-
if (rule.regex && !rule.regex.test(
|
|
211
|
-
if (field === "
|
|
212
|
-
|
|
213
|
-
|
|
248
|
+
if (rule.regex && !rule.regex.test(value)) {
|
|
249
|
+
if (field === "password") {
|
|
250
|
+
return createError(field, "PATTERN", rule);
|
|
251
|
+
}
|
|
214
252
|
return createError(field, "PATTERN", rule);
|
|
215
253
|
}
|
|
216
254
|
return null;
|
|
@@ -221,7 +259,8 @@ function validate(schema, data) {
|
|
|
221
259
|
const errors = [];
|
|
222
260
|
const validData = {};
|
|
223
261
|
for (const field of Object.keys(schema)) {
|
|
224
|
-
const
|
|
262
|
+
const schemaRule = schema[field];
|
|
263
|
+
const rule = typeof schemaRule === "boolean" ? RULES[field] : RULES[field] ?? schemaRule;
|
|
225
264
|
if (!rule) {
|
|
226
265
|
errors.push(createError(field, "INVALID_TYPE"));
|
|
227
266
|
continue;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rules/password.ts","../src/rules/email.ts","../src/rules/name.ts","../src/rules/phone.ts","../src/rules/urlRule.ts","../src/rules/postalCodeRule.ts","../src/rules/dateRule.ts","../src/rules/creditCardRule.ts","../src/rules/cvvRule.ts","../src/rules/stateRule.ts","../src/rules/cityRule.ts","../src/rules/streetRule.ts","../src/rules/usernameRule.ts","../src/rules/timeRule.ts","../src/rules/booleanRule.ts","../src/rules/index.ts","../src/core/error.ts","../src/core/rule-engine.ts","../src/core/validate.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { FieldRule } from \"../types/schema\";\r\n\r\nexport const passwordRule: FieldRule = {\r\n min: 8,\r\n max: 128,\r\n regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$/,\r\n messages: {\r\n REQUIRED: \"Password is required\",\r\n MIN_LENGTH: \"Password must be at least 8 characters\",\r\n MAX_LENGTH: \"Password must be under 128 characters\",\r\n PATTERN: \"Password must include uppercase, lowercase, number, and special character\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const emailRule: FieldRule = {\r\n max: 50,\r\n regex: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n messages: {\r\n REQUIRED: \"Email is required\",\r\n MAX_LENGTH: \"Email must be under 50 characters\",\r\n PATTERN: \"Invalid email format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const nameRule: FieldRule = {\r\n min: 2,\r\n max: 50,\r\n regex: /^[a-zA-Z\\s'-]+$/,\r\n messages: {\r\n REQUIRED: \"Name is required\",\r\n MIN_LENGTH: \"Name must be at least 2 characters\",\r\n MAX_LENGTH: \"Name must be under 50 characters\",\r\n PATTERN: \"Name can only contain letters, spaces, apostrophes, or hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const phoneRule: FieldRule = {\r\n regex: /^\\+?[1-9]\\d{10,14}$/,\r\n messages: {\r\n REQUIRED: \"Phone number is required\",\r\n PATTERN: \"Phone number must be in international format (+countrycodexxxxxxxx)\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const urlRule: FieldRule = {\r\n max: 2083, // typical max URL length\r\n regex: /^(https?:\\/\\/)?([\\w-]+(\\.[\\w-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?$/,\r\n messages: {\r\n REQUIRED: \"URL is required\",\r\n MAX_LENGTH: \"URL is too long\",\r\n PATTERN: \"Invalid URL format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const postalCodeRule: FieldRule = {\r\n max: 10,\r\n regex: /^[A-Za-z0-9\\- ]{3,10}$/,\r\n messages: {\r\n REQUIRED: \"Postal code is required\",\r\n PATTERN: \"Invalid postal code format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const dateRule: FieldRule = {\r\n regex: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n messages: {\r\n REQUIRED: \"Date is required\",\r\n PATTERN: \"Date must be in YYYY-MM-DD format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const creditCardRule: FieldRule = {\r\n regex: /^\\d{13,19}$/,\r\n messages: {\r\n REQUIRED: \"Credit card number is required\",\r\n PATTERN: \"Invalid credit card number\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cvvRule: FieldRule = {\r\n regex: /^\\d{3,4}$/,\r\n messages: {\r\n REQUIRED: \"CVV is required\",\r\n PATTERN: \"CVV must be 3 or 4 digits\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const stateRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"State is required\",\r\n MAX_LENGTH: \"State must be under 50 characters\",\r\n PATTERN: \"State can only contain letters and spaces\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cityRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"City is required\",\r\n MAX_LENGTH: \"City must be under 50 characters\",\r\n PATTERN: \"City can only contain letters and spaces\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const streetRule: FieldRule = {\r\n max: 100,\r\n regex: /^[a-zA-Z0-9\\s,.-]+$/,\r\n messages: {\r\n REQUIRED: \"Street address is required\",\r\n MAX_LENGTH: \"Street must be under 100 characters\",\r\n PATTERN: \"Street can contain letters, numbers, commas, dots, and hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const usernameRule: FieldRule = {\r\n min: 3,\r\n max: 30,\r\n regex: /^[a-zA-Z0-9_]+$/,\r\n messages: {\r\n REQUIRED: \"Username is required\",\r\n MIN_LENGTH: \"Username must be at least 3 characters\",\r\n MAX_LENGTH: \"Username must be under 30 characters\",\r\n PATTERN: \"Username can contain only letters, numbers, and underscores\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const timeRule: FieldRule = {\r\n regex: /^([01]\\d|2[0-3]):([0-5]\\d)$/,\r\n messages: {\r\n REQUIRED: \"Time is required\",\r\n PATTERN: \"Time must be in HH:MM 24-hour format\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const booleanRule: FieldRule = {\r\n regex: /^(true|false)$/,\r\n messages: {\r\n REQUIRED: \"Value is required\",\r\n PATTERN: \"Value must be true or false\"\r\n }\r\n};","import { passwordRule } from \"./password\";\r\nimport { emailRule } from \"./email\";\r\nimport { nameRule } from \"./name\";\r\nimport { FieldRule } from \"../types/schema\";\r\nimport { phoneRule } from \"./phone\";\r\nimport { urlRule } from \"./urlRule\";\r\nimport { postalCodeRule } from \"./postalCodeRule\";\r\nimport { dateRule } from \"./dateRule\";\r\nimport { creditCardRule } from \"./creditCardRule\";\r\nimport { cvvRule } from \"./cvvRule\";\r\nimport { stateRule } from \"./stateRule\";\r\nimport { cityRule } from \"./cityRule\";\r\nimport { streetRule } from \"./streetRule\";\r\nimport { usernameRule } from \"./usernameRule\";\r\nimport { timeRule } from \"./timeRule\";\r\nimport { booleanRule } from \"./booleanRule\";\r\n\r\nexport const RULES: Record<string, FieldRule> = {\r\n name: nameRule,\r\n email: emailRule,\r\n password: passwordRule,\r\n phone: phoneRule,\r\n url: urlRule,\r\n postalCode: postalCodeRule,\r\n date: dateRule,\r\n creditCard: creditCardRule,\r\n cvv: cvvRule,\r\n state: stateRule,\r\n city: cityRule,\r\n street: streetRule,\r\n username: usernameRule,\r\n time: timeRule,\r\n active: booleanRule\r\n};\r\n","import type { FieldRule, ValidationError, ValidationErrorCode } from \"../types/schema\";\r\n\r\nexport const ERROR_MESSAGES: Record<ValidationErrorCode, (field: string, rule?: FieldRule) => string> = {\r\n REQUIRED: (field) => `${field} is required`,\r\n INVALID_TYPE: (field) => `${field} must be valid ${field}`,\r\n MIN_LENGTH: (field, rule) => `${field} must be at least ${rule?.min} characters`,\r\n MAX_LENGTH: (field, rule) => `${field} must be maximum ${rule?.max} characters`,\r\n PATTERN: (field) => `${field} format is invalid`,\r\n WEAK_PASSWORD: () => \"Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)\",\r\n INVALID_PHONE: () => \"Phone must be a valid international/local number (+923001234567)\",\r\n INVALID_URL: () => \"URL must be valid (https://example.com)\"\r\n};\r\n\r\nexport function createError(field: string, code: ValidationErrorCode, rule?: FieldRule): ValidationError {\r\n const message = rule?.messages?.[code] || ERROR_MESSAGES[code](field, rule);\r\n return { field, code, message };\r\n}\r\n","import type { FieldRule, ValidationError } from \"../types/schema\";\r\nimport { createError } from \"../core/error\";\r\n\r\nexport function applyRule(field: string, value: unknown, rule: FieldRule): ValidationError | null {\r\n if (value === undefined || value === null || value === \"\") {\r\n return createError(field, \"REQUIRED\", rule);\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return createError(field, \"INVALID_TYPE\", rule);\r\n }\r\n\r\n const strValue = value as string;\r\n\r\n if (rule.min !== undefined && strValue.length < rule.min) {\r\n return createError(field, \"MIN_LENGTH\", rule);\r\n }\r\n\r\n if (rule.max !== undefined && strValue.length > rule.max) {\r\n return createError(field, \"MAX_LENGTH\", rule);\r\n }\r\n\r\n if (rule.regex && !rule.regex.test(strValue)) {\r\n if (field === \"phone\") return createError(field, \"INVALID_PHONE\", rule);\r\n if (field === \"url\") return createError(field, \"INVALID_URL\", rule);\r\n if (field === \"password\") return createError(field, \"WEAK_PASSWORD\", rule);\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n\r\n return null;\r\n}","import { RULES } from \"../rules\";\r\nimport { applyRule } from \"./rule-engine\";\r\nimport { createError } from \"../core/error\";\r\nimport type { FieldRule, ValidationError, ValidationResult, ValidationSchema } from \"../types/schema\";\r\nexport function validate<T extends Record<string, unknown>>(schema: ValidationSchema, data: T): ValidationResult<Partial<T>> {\r\n const errors: ValidationError[] = [];\r\n const validData: Partial<T> = {};\r\n\r\n for (const field of Object.keys(schema)) {\r\n const rule = RULES[field] || (schema[field] as FieldRule);\r\n\r\n if (!rule) {\r\n errors.push(createError(field, \"INVALID_TYPE\"));\r\n continue;\r\n }\r\n\r\n const error = applyRule(field, data[field as keyof T], rule);\r\n\r\n if (error) {\r\n errors.push(error);\r\n } else {\r\n validData[field as keyof T] = data[field as keyof T];\r\n }\r\n }\r\n\r\n return errors.length > 0 ? { success: false, errors } : { success: true, data: validData };\r\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/rules/password.ts","../src/rules/email.ts","../src/rules/name.ts","../src/rules/phone.ts","../src/rules/urlRule.ts","../src/rules/postalCodeRule.ts","../src/rules/dateRule.ts","../src/rules/creditCardRule.ts","../src/rules/cvvRule.ts","../src/rules/stateRule.ts","../src/rules/cityRule.ts","../src/rules/streetRule.ts","../src/rules/usernameRule.ts","../src/rules/timeRule.ts","../src/rules/booleanRule.ts","../src/rules/imageRule.ts","../src/rules/index.ts","../src/core/error.ts","../src/constants/image.ts","../src/core/rule-engine.ts","../src/core/validate.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { FieldRule } from \"../types/schema\";\r\n\r\nexport const passwordRule: FieldRule = {\r\n min: 8,\r\n max: 128,\r\n regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$/,\r\n messages: {\r\n REQUIRED: \"Password is required\",\r\n MIN_LENGTH: \"Password must be at least 8 characters\",\r\n MAX_LENGTH: \"Password must be under 128 characters\",\r\n PATTERN: \"Password must include uppercase, lowercase, number, and special character\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const emailRule: FieldRule = {\r\n max: 50,\r\n regex: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n messages: {\r\n REQUIRED: \"Email is required\",\r\n MAX_LENGTH: \"Email must be under 50 characters\",\r\n PATTERN: \"Invalid email format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const nameRule: FieldRule = {\r\n min: 2,\r\n max: 50,\r\n regex: /^[a-zA-Z\\s'-]+$/,\r\n messages: {\r\n REQUIRED: \"Name is required\",\r\n MIN_LENGTH: \"Name must be at least 2 characters\",\r\n MAX_LENGTH: \"Name must be under 50 characters\",\r\n PATTERN: \"Name can only contain letters, spaces, apostrophes, or hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const phoneRule: FieldRule = {\r\n regex: /^\\+?[1-9]\\d{10,14}$/,\r\n messages: {\r\n REQUIRED: \"Phone number is required\",\r\n PATTERN: \"Phone number must be in international format (+countrycodexxxxxxxx)\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const urlRule: FieldRule = {\r\n max: 2083, // typical max URL length\r\n regex: /^(https?:\\/\\/)?([\\w-]+(\\.[\\w-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?$/,\r\n messages: {\r\n REQUIRED: \"URL is required\",\r\n MAX_LENGTH: \"URL is too long\",\r\n PATTERN: \"Invalid URL format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const postalCodeRule: FieldRule = {\r\n max: 10,\r\n regex: /^[A-Za-z0-9\\- ]{3,10}$/,\r\n messages: {\r\n REQUIRED: \"Postal code is required\",\r\n PATTERN: \"Invalid postal code format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const dateRule: FieldRule = {\r\n regex: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n messages: {\r\n REQUIRED: \"Date is required\",\r\n PATTERN: \"Date must be in YYYY-MM-DD format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const creditCardRule: FieldRule = {\r\n regex: /^\\d{13,19}$/,\r\n messages: {\r\n REQUIRED: \"Credit card number is required\",\r\n PATTERN: \"Invalid credit card number\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cvvRule: FieldRule = {\r\n regex: /^\\d{3,4}$/,\r\n messages: {\r\n REQUIRED: \"CVV is required\",\r\n PATTERN: \"CVV must be 3 or 4 digits\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const stateRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"State is required\",\r\n MAX_LENGTH: \"State must be under 50 characters\",\r\n PATTERN: \"State can only contain letters and spaces\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cityRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"City is required\",\r\n MAX_LENGTH: \"City must be under 50 characters\",\r\n PATTERN: \"City can only contain letters and spaces\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const streetRule: FieldRule = {\r\n max: 100,\r\n regex: /^[a-zA-Z0-9\\s,.-]+$/,\r\n messages: {\r\n REQUIRED: \"Street address is required\",\r\n MAX_LENGTH: \"Street must be under 100 characters\",\r\n PATTERN: \"Street can contain letters, numbers, commas, dots, and hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const usernameRule: FieldRule = {\r\n min: 3,\r\n max: 30,\r\n regex: /^[a-zA-Z0-9_]+$/,\r\n messages: {\r\n REQUIRED: \"Username is required\",\r\n MIN_LENGTH: \"Username must be at least 3 characters\",\r\n MAX_LENGTH: \"Username must be under 30 characters\",\r\n PATTERN: \"Username can contain only letters, numbers, and underscores\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const timeRule: FieldRule = {\r\n regex: /^([01]\\d|2[0-3]):([0-5]\\d)$/,\r\n messages: {\r\n REQUIRED: \"Time is required\",\r\n PATTERN: \"Time must be in HH:MM 24-hour format\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const booleanRule: FieldRule = {\r\n regex: /^(true|false)$/,\r\n messages: {\r\n REQUIRED: \"Value is required\",\r\n PATTERN: \"Value must be true or false\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const imageRule: FieldRule = {\r\n messages: {\r\n REQUIRED: \"Image is required\",\r\n INVALID_IMAGE: \"Invalid image payload\",\r\n IMAGE_TOO_LARGE: \"Image size exceeds limit\",\r\n UNSUPPORTED_IMAGE_TYPE: \"Unsupported image format\"\r\n }\r\n};\r\n","import { passwordRule } from \"./password\";\r\nimport { emailRule } from \"./email\";\r\nimport { nameRule } from \"./name\";\r\nimport { FieldRule } from \"../types/schema\";\r\nimport { phoneRule } from \"./phone\";\r\nimport { urlRule } from \"./urlRule\";\r\nimport { postalCodeRule } from \"./postalCodeRule\";\r\nimport { dateRule } from \"./dateRule\";\r\nimport { creditCardRule } from \"./creditCardRule\";\r\nimport { cvvRule } from \"./cvvRule\";\r\nimport { stateRule } from \"./stateRule\";\r\nimport { cityRule } from \"./cityRule\";\r\nimport { streetRule } from \"./streetRule\";\r\nimport { usernameRule } from \"./usernameRule\";\r\nimport { timeRule } from \"./timeRule\";\r\nimport { booleanRule } from \"./booleanRule\";\r\nimport { imageRule } from \"./imageRule\";\r\n\r\nexport const RULES: Record<string, FieldRule> = {\r\n name: nameRule,\r\n email: emailRule,\r\n password: passwordRule,\r\n phone: phoneRule,\r\n url: urlRule,\r\n postalCode: postalCodeRule,\r\n date: dateRule,\r\n creditCard: creditCardRule,\r\n cvv: cvvRule,\r\n state: stateRule,\r\n city: cityRule,\r\n street: streetRule,\r\n username: usernameRule,\r\n time: timeRule,\r\n active: booleanRule,\r\n avatar: imageRule \r\n};\r\n","import type { FieldRule, ValidationError, ValidationErrorCode } from \"../types/schema\";\r\n\r\nexport const ERROR_MESSAGES: Record<\r\n ValidationErrorCode,\r\n (field: string, rule?: FieldRule) => string\r\n> = {\r\n REQUIRED: (field) => `${field} is required`,\r\n\r\n INVALID_TYPE: (field) => `${field} must be a valid ${field}`,\r\n\r\n MIN_LENGTH: (field, rule) =>\r\n `${field} must be at least ${rule?.min} characters`,\r\n\r\n MAX_LENGTH: (field, rule) =>\r\n `${field} must be maximum ${rule?.max} characters`,\r\n\r\n PATTERN: (field) => `${field} format is invalid`,\r\n\r\n WEAK_PASSWORD: () =>\r\n \"Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)\",\r\n\r\n INVALID_PHONE: () =>\r\n \"Phone must be a valid international/local number (+923001234567)\",\r\n\r\n INVALID_URL: () =>\r\n \"URL must be valid (https://example.com)\",\r\n\r\n INVALID_IMAGE: (field) =>\r\n `${field} must be a valid image object`,\r\n\r\n IMAGE_TOO_LARGE: () =>\r\n \"Image size exceeds allowed limit\",\r\n\r\n UNSUPPORTED_IMAGE_TYPE: () =>\r\n \"Unsupported image format (jpeg, png, webp, avif only)\"\r\n};\r\n\r\nexport function createError(\r\n field: string,\r\n code: ValidationErrorCode,\r\n rule?: FieldRule\r\n): ValidationError {\r\n const message =\r\n rule?.messages?.[code] ||\r\n ERROR_MESSAGES[code]?.(field, rule) ||\r\n \"Validation error\";\r\n\r\n return { field, code, message };\r\n}\r\n","export const ALLOWED_IMAGE_MIME_TYPES = new Set([\r\n \"image/jpeg\",\r\n \"image/png\",\r\n \"image/webp\",\r\n \"image/avif\"\r\n]);\r\n","import type { FieldRule, ValidationError } from \"../types/schema\";\r\nimport { createError } from \"../core/error\";\r\nimport { ALLOWED_IMAGE_MIME_TYPES } from \"../constants/image\";\r\n\r\nexport function applyRule(\r\n field: string,\r\n value: unknown,\r\n rule: FieldRule\r\n): ValidationError | null {\r\n\r\n if (value == null) {\r\n return createError(field, \"REQUIRED\", rule);\r\n }\r\n\r\n if (field === \"image\" || field === \"avatar\") {\r\n if (typeof value !== \"object\" || Array.isArray(value)) {\r\n return createError(field, \"INVALID_IMAGE\", rule);\r\n }\r\n const img = value as Record<string, unknown>;\r\n if (typeof img.url !== \"string\") return createError(field, \"INVALID_IMAGE\", rule);\r\n if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType as string)) {\r\n return createError(field, \"UNSUPPORTED_IMAGE_TYPE\", rule);\r\n }\r\n if (img.sizeKB && (img.sizeKB as number) > 5120) {\r\n return createError(field, \"IMAGE_TOO_LARGE\", rule);\r\n }\r\n return null;\r\n }\r\n\r\n if (typeof value === \"boolean\") {\r\n return null;\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return createError(field, \"INVALID_TYPE\", rule);\r\n }\r\n\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n return createError(field, \"MIN_LENGTH\", rule);\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n return createError(field, \"MAX_LENGTH\", rule);\r\n }\r\n if (rule.regex && !rule.regex.test(value)) {\r\n if (field === \"password\") {\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n\r\n return null;\r\n}\r\n","import { RULES } from \"../rules\";\r\nimport { applyRule } from \"./rule-engine\";\r\nimport { createError } from \"../core/error\";\r\nimport type {\r\n FieldRule,\r\n ValidationError,\r\n ValidationResult,\r\n ValidationSchema\r\n} from \"../types/schema\";\r\n\r\nexport function validate<T extends Record<string, unknown>>(\r\n schema: ValidationSchema,\r\n data: T\r\n): ValidationResult<Partial<T>> {\r\n const errors: ValidationError[] = [];\r\n const validData: Partial<T> = {};\r\n\r\n for (const field of Object.keys(schema)) {\r\n const schemaRule = schema[field];\r\n\r\n const rule: FieldRule | undefined =\r\n typeof schemaRule === \"boolean\"\r\n ? RULES[field]\r\n : RULES[field] ?? schemaRule;\r\n\r\nif (!rule) {\r\n errors.push(createError(field, \"INVALID_TYPE\"));\r\n continue;\r\n}\r\n\r\nconst error = applyRule(field, data[field as keyof T], rule);\r\n\r\n if (error) {\r\n errors.push(error);\r\n } else {\r\n validData[field as keyof T] = data[field as keyof T];\r\n }\r\n }\r\n\r\n return errors.length > 0\r\n ? { success: false, errors }\r\n : { success: true, data: validData };\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "smart-auth-validator",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Zero-regex, type-safe authentication and form validation for Fastify and Express",
|
|
5
5
|
"author": "Muhammad Burhan Chughtai",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
"dist"
|
|
20
20
|
],
|
|
21
21
|
"sideEffects": false,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"lint": "eslint src --max-warnings=0",
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"prepublishOnly": "npm run lint && npm run test && npm run build"
|
|
27
|
+
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"express": "^4.22.1",
|
|
30
30
|
"fastify": "^4 || ^5"
|