smart-auth-validator 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +9 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -17,6 +17,9 @@ var passwordRule = {
|
|
|
17
17
|
var emailRule = {
|
|
18
18
|
max: 50,
|
|
19
19
|
regex: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
20
|
+
transform: (value) => {
|
|
21
|
+
return typeof value === "string" ? value.trim().toLowerCase() : value;
|
|
22
|
+
},
|
|
20
23
|
messages: {
|
|
21
24
|
REQUIRED: "Email is required",
|
|
22
25
|
MAX_LENGTH: "Email must be under 50 characters",
|
|
@@ -267,11 +270,15 @@ function validate(schema, data) {
|
|
|
267
270
|
errors.push(createError(field, "INVALID_TYPE"));
|
|
268
271
|
continue;
|
|
269
272
|
}
|
|
270
|
-
|
|
273
|
+
let currentValue = data[field];
|
|
274
|
+
if (rule.transform && currentValue !== void 0) {
|
|
275
|
+
currentValue = rule.transform(currentValue);
|
|
276
|
+
}
|
|
277
|
+
const error = applyRule(field, currentValue, rule);
|
|
271
278
|
if (error) {
|
|
272
279
|
errors.push(error);
|
|
273
280
|
} else {
|
|
274
|
-
validData[field] =
|
|
281
|
+
validData[field] = currentValue;
|
|
275
282
|
}
|
|
276
283
|
}
|
|
277
284
|
return errors.length > 0 ? { success: false, errors } : { success: true, data: validData };
|
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/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"]}
|
|
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 transform: (value: unknown) => {\r\n return typeof value === \"string\" \r\n ? value.trim().toLowerCase() \r\n : value;\r\n },\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 const rule: FieldRule | undefined =\r\n typeof schemaRule === \"boolean\"\r\n ? RULES[field]\r\n : (RULES[field] ?? (schemaRule 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 let currentValue = data[field as keyof T];\r\n\r\n if (rule.transform && currentValue !== undefined) {\r\n currentValue = rule.transform(currentValue) as T[keyof T];\r\n }\r\n\r\n const error = applyRule(field, currentValue, rule);\r\n\r\n if (error) {\r\n errors.push(error);\r\n } else {\r\n validData[field as keyof T] = currentValue;\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}"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -15,6 +15,9 @@ var passwordRule = {
|
|
|
15
15
|
var emailRule = {
|
|
16
16
|
max: 50,
|
|
17
17
|
regex: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
18
|
+
transform: (value) => {
|
|
19
|
+
return typeof value === "string" ? value.trim().toLowerCase() : value;
|
|
20
|
+
},
|
|
18
21
|
messages: {
|
|
19
22
|
REQUIRED: "Email is required",
|
|
20
23
|
MAX_LENGTH: "Email must be under 50 characters",
|
|
@@ -265,11 +268,15 @@ function validate(schema, data) {
|
|
|
265
268
|
errors.push(createError(field, "INVALID_TYPE"));
|
|
266
269
|
continue;
|
|
267
270
|
}
|
|
268
|
-
|
|
271
|
+
let currentValue = data[field];
|
|
272
|
+
if (rule.transform && currentValue !== void 0) {
|
|
273
|
+
currentValue = rule.transform(currentValue);
|
|
274
|
+
}
|
|
275
|
+
const error = applyRule(field, currentValue, rule);
|
|
269
276
|
if (error) {
|
|
270
277
|
errors.push(error);
|
|
271
278
|
} else {
|
|
272
|
-
validData[field] =
|
|
279
|
+
validData[field] = currentValue;
|
|
273
280
|
}
|
|
274
281
|
}
|
|
275
282
|
return errors.length > 0 ? { success: false, errors } : { success: true, data: validData };
|
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/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":";AAEO,IAAM,YAAA,GAA0B;AAAA,EACrC,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO,+CAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,sBAAA;AAAA,IACV,UAAA,EAAY,wCAAA;AAAA,IACZ,UAAA,EAAY,uCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACVO,IAAM,SAAA,GAAuB;AAAA,EAClC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,4BAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,UAAA,EAAY,mCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,QAAA,GAAsB;AAAA,EACjC,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,iBAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACT,QAAA,EAAU,kBAAA;AAAA,IACV,UAAA,EAAY,oCAAA;AAAA,IACZ,UAAA,EAAY,kCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACVO,IAAM,SAAA,GAAuB;AAAA,EAClC,KAAA,EAAO,qBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,0BAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,OAAA,GAAqB;AAAA,EAChC,GAAA,EAAK,IAAA;AAAA;AAAA,EACL,KAAA,EAAO,0EAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,iBAAA;AAAA,IACV,UAAA,EAAY,iBAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,cAAA,GAA4B;AAAA,EACvC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,wBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,yBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACPO,IAAM,QAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,qBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,cAAA,GAA4B;AAAA,EACvC,KAAA,EAAO,aAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,gCAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,OAAA,GAAqB;AAAA,EAChC,KAAA,EAAO,WAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,iBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,SAAA,GAAuB;AAAA,EAClC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,eAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,UAAA,EAAY,mCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,QAAA,GAAsB;AAAA,EACjC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,eAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,UAAA,EAAY,kCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,UAAA,GAAwB;AAAA,EACnC,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO,qBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,4BAAA;AAAA,IACV,UAAA,EAAY,qCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,YAAA,GAA0B;AAAA,EACrC,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,iBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,sBAAA;AAAA,IACV,UAAA,EAAY,wCAAA;AAAA,IACZ,UAAA,EAAY,sCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACVO,IAAM,QAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,6BAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,WAAA,GAAyB;AAAA,EACpC,KAAA,EAAO,gBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,SAAA,GAAuB;AAAA,EAClC,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,aAAA,EAAe,uBAAA;AAAA,IACf,eAAA,EAAiB,0BAAA;AAAA,IACjB,sBAAA,EAAwB;AAAA;AAE5B,CAAA;;;ACSO,IAAM,KAAA,GAAmC;AAAA,EAC9C,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU,YAAA;AAAA,EACV,KAAA,EAAO,SAAA;AAAA,EACP,GAAA,EAAK,OAAA;AAAA,EACL,UAAA,EAAY,cAAA;AAAA,EACZ,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY,cAAA;AAAA,EACZ,GAAA,EAAK,OAAA;AAAA,EACL,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,YAAA;AAAA,EACV,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;;;ACjCO,IAAM,cAAA,GAGT;AAAA,EACF,QAAA,EAAU,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,CAAA,YAAA,CAAA;AAAA,EAE7B,cAAc,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,oBAAoB,KAAK,CAAA,CAAA;AAAA,EAE1D,UAAA,EAAY,CAAC,KAAA,EAAO,IAAA,KAClB,GAAG,KAAK,CAAA,kBAAA,EAAqB,MAAM,GAAG,CAAA,WAAA,CAAA;AAAA,EAExC,UAAA,EAAY,CAAC,KAAA,EAAO,IAAA,KAClB,GAAG,KAAK,CAAA,iBAAA,EAAoB,MAAM,GAAG,CAAA,WAAA,CAAA;AAAA,EAEvC,OAAA,EAAS,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,CAAA,kBAAA,CAAA;AAAA,EAE5B,eAAe,MACb,0EAAA;AAAA,EAEF,eAAe,MACb,kEAAA;AAAA,EAEF,aAAa,MACX,yCAAA;AAAA,EAEF,aAAA,EAAe,CAAC,KAAA,KACd,CAAA,EAAG,KAAK,CAAA,6BAAA,CAAA;AAAA,EAEV,iBAAiB,MACf,kCAAA;AAAA,EAEF,wBAAwB,MACtB;AACJ,CAAA;AAEO,SAAS,WAAA,CACd,KAAA,EACA,IAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GACJ,IAAA,EAAM,QAAA,GAAW,IAAI,CAAA,IACrB,eAAe,IAAI,CAAA,GAAI,KAAA,EAAO,IAAI,CAAA,IAClC,kBAAA;AAEF,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AAChC;;;AChDO,IAAM,wBAAA,uBAA+B,GAAA,CAAI;AAAA,EAC9C,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;;;ACDM,SAAS,SAAA,CACd,KAAA,EACA,KAAA,EACA,IAAA,EACwB;AAExB,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,UAAA,EAAY,IAAI,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,QAAA,EAAU;AAC3C,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,eAAA,EAAiB,IAAI,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,OAAO,IAAI,GAAA,KAAQ,QAAA,SAAiB,WAAA,CAAY,KAAA,EAAO,iBAAiB,IAAI,CAAA;AAChF,IAAA,IAAI,IAAI,QAAA,IAAY,CAAC,yBAAyB,GAAA,CAAI,GAAA,CAAI,QAAkB,CAAA,EAAG;AACzE,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,wBAAA,EAA0B,IAAI,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,GAAA,CAAI,MAAA,IAAW,GAAA,CAAI,MAAA,GAAoB,IAAA,EAAM;AAC/C,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,iBAAA,EAAmB,IAAI,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,cAAA,EAAgB,IAAI,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,KAAK,KAAA,IAAS,CAAC,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACzC,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,IAAA;AACT;;;ACzCO,SAAS,QAAA,CACd,QACA,IAAA,EAC8B;AAC9B,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,YAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACvC,IAAA,MAAM,UAAA,GAAa,OAAO,KAAK,CAAA;AAEjC,IAAA,MAAM,IAAA,GACN,OAAO,UAAA,KAAe,SAAA,GAClB,MAAM,KAAK,CAAA,GACX,KAAA,CAAM,KAAK,CAAA,IAAK,UAAA;AAEtB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,cAAc,CAAC,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,SAAA,CAAU,KAAA,EAAO,IAAA,CAAK,KAAgB,GAAG,IAAI,CAAA;AAEvD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,KAAgB,CAAA,GAAI,IAAA,CAAK,KAAgB,CAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GACnB,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO,GACzB,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AACvC","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"]}
|
|
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 transform: (value: unknown) => {\r\n return typeof value === \"string\" \r\n ? value.trim().toLowerCase() \r\n : value;\r\n },\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 const rule: FieldRule | undefined =\r\n typeof schemaRule === \"boolean\"\r\n ? RULES[field]\r\n : (RULES[field] ?? (schemaRule 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 let currentValue = data[field as keyof T];\r\n\r\n if (rule.transform && currentValue !== undefined) {\r\n currentValue = rule.transform(currentValue) as T[keyof T];\r\n }\r\n\r\n const error = applyRule(field, currentValue, rule);\r\n\r\n if (error) {\r\n errors.push(error);\r\n } else {\r\n validData[field as keyof T] = currentValue;\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}"]}
|
package/package.json
CHANGED