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 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
- - 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
- - O(1) **rule lookup** for maximum performance
19
- - Returns structured **errors** for each field
20
- - Minimal and lightweight
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 === void 0 || value === null || 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
- const strValue = value;
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 && strValue.length > rule.max) {
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(strValue)) {
213
- if (field === "phone") return createError(field, "INVALID_PHONE", rule);
214
- if (field === "url") return createError(field, "INVALID_URL", rule);
215
- if (field === "password") return createError(field, "WEAK_PASSWORD", rule);
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 rule = RULES[field] || schema[field];
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;
@@ -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 === void 0 || value === null || 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
- const strValue = value;
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 && strValue.length > rule.max) {
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(strValue)) {
211
- if (field === "phone") return createError(field, "INVALID_PHONE", rule);
212
- if (field === "url") return createError(field, "INVALID_URL", rule);
213
- if (field === "password") return createError(field, "WEAK_PASSWORD", rule);
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 rule = RULES[field] || schema[field];
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.0.0",
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
- "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
- },
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"