smart-auth-validator 1.0.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/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
 
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",
@@ -159,6 +162,16 @@ var booleanRule = {
159
162
  }
160
163
  };
161
164
 
165
+ // src/rules/imageRule.ts
166
+ var imageRule = {
167
+ messages: {
168
+ REQUIRED: "Image is required",
169
+ INVALID_IMAGE: "Invalid image payload",
170
+ IMAGE_TOO_LARGE: "Image size exceeds limit",
171
+ UNSUPPORTED_IMAGE_TYPE: "Unsupported image format"
172
+ }
173
+ };
174
+
162
175
  // src/rules/index.ts
163
176
  var RULES = {
164
177
  name: nameRule,
@@ -175,44 +188,72 @@ var RULES = {
175
188
  street: streetRule,
176
189
  username: usernameRule,
177
190
  time: timeRule,
178
- active: booleanRule
191
+ active: booleanRule,
192
+ avatar: imageRule
179
193
  };
180
194
 
181
195
  // src/core/error.ts
182
196
  var ERROR_MESSAGES = {
183
197
  REQUIRED: (field) => `${field} is required`,
184
- INVALID_TYPE: (field) => `${field} must be valid ${field}`,
198
+ INVALID_TYPE: (field) => `${field} must be a valid ${field}`,
185
199
  MIN_LENGTH: (field, rule) => `${field} must be at least ${rule?.min} characters`,
186
200
  MAX_LENGTH: (field, rule) => `${field} must be maximum ${rule?.max} characters`,
187
201
  PATTERN: (field) => `${field} format is invalid`,
188
202
  WEAK_PASSWORD: () => "Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)",
189
203
  INVALID_PHONE: () => "Phone must be a valid international/local number (+923001234567)",
190
- INVALID_URL: () => "URL must be valid (https://example.com)"
204
+ INVALID_URL: () => "URL must be valid (https://example.com)",
205
+ INVALID_IMAGE: (field) => `${field} must be a valid image object`,
206
+ IMAGE_TOO_LARGE: () => "Image size exceeds allowed limit",
207
+ UNSUPPORTED_IMAGE_TYPE: () => "Unsupported image format (jpeg, png, webp, avif only)"
191
208
  };
192
209
  function createError(field, code, rule) {
193
- const message = rule?.messages?.[code] || ERROR_MESSAGES[code](field, rule);
210
+ const message = rule?.messages?.[code] || ERROR_MESSAGES[code]?.(field, rule) || "Validation error";
194
211
  return { field, code, message };
195
212
  }
196
213
 
214
+ // src/constants/image.ts
215
+ var ALLOWED_IMAGE_MIME_TYPES = /* @__PURE__ */ new Set([
216
+ "image/jpeg",
217
+ "image/png",
218
+ "image/webp",
219
+ "image/avif"
220
+ ]);
221
+
197
222
  // src/core/rule-engine.ts
198
223
  function applyRule(field, value, rule) {
199
- if (value === void 0 || value === null || value === "") {
224
+ if (value == null) {
200
225
  return createError(field, "REQUIRED", rule);
201
226
  }
227
+ if (field === "image" || field === "avatar") {
228
+ if (typeof value !== "object" || Array.isArray(value)) {
229
+ return createError(field, "INVALID_IMAGE", rule);
230
+ }
231
+ const img = value;
232
+ if (typeof img.url !== "string") return createError(field, "INVALID_IMAGE", rule);
233
+ if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType)) {
234
+ return createError(field, "UNSUPPORTED_IMAGE_TYPE", rule);
235
+ }
236
+ if (img.sizeKB && img.sizeKB > 5120) {
237
+ return createError(field, "IMAGE_TOO_LARGE", rule);
238
+ }
239
+ return null;
240
+ }
241
+ if (typeof value === "boolean") {
242
+ return null;
243
+ }
202
244
  if (typeof value !== "string") {
203
245
  return createError(field, "INVALID_TYPE", rule);
204
246
  }
205
- const strValue = value;
206
- if (rule.min !== void 0 && strValue.length < rule.min) {
247
+ if (rule.min !== void 0 && value.length < rule.min) {
207
248
  return createError(field, "MIN_LENGTH", rule);
208
249
  }
209
- if (rule.max !== void 0 && strValue.length > rule.max) {
250
+ if (rule.max !== void 0 && value.length > rule.max) {
210
251
  return createError(field, "MAX_LENGTH", rule);
211
252
  }
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);
253
+ if (rule.regex && !rule.regex.test(value)) {
254
+ if (field === "password") {
255
+ return createError(field, "PATTERN", rule);
256
+ }
216
257
  return createError(field, "PATTERN", rule);
217
258
  }
218
259
  return null;
@@ -223,16 +264,21 @@ function validate(schema, data) {
223
264
  const errors = [];
224
265
  const validData = {};
225
266
  for (const field of Object.keys(schema)) {
226
- const rule = RULES[field] || schema[field];
267
+ const schemaRule = schema[field];
268
+ const rule = typeof schemaRule === "boolean" ? RULES[field] : RULES[field] ?? schemaRule;
227
269
  if (!rule) {
228
270
  errors.push(createError(field, "INVALID_TYPE"));
229
271
  continue;
230
272
  }
231
- const error = applyRule(field, data[field], rule);
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);
232
278
  if (error) {
233
279
  errors.push(error);
234
280
  } else {
235
- validData[field] = data[field];
281
+ validData[field] = currentValue;
236
282
  }
237
283
  }
238
284
  return errors.length > 0 ? { success: false, errors } : { success: true, data: validData };
@@ -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 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
@@ -3,6 +3,7 @@ type FieldRule = {
3
3
  max?: number;
4
4
  regex?: RegExp;
5
5
  messages?: Partial<Record<ValidationErrorCode, string>>;
6
+ transform?: (value: unknown) => unknown;
6
7
  };
7
8
  type Schema = boolean | {
8
9
  min?: number;
@@ -11,7 +12,7 @@ type Schema = boolean | {
11
12
  interface ValidationSchema {
12
13
  [field: string]: FieldRule | Schema | boolean;
13
14
  }
14
- type ValidationErrorCode = "REQUIRED" | "INVALID_TYPE" | "MIN_LENGTH" | "MAX_LENGTH" | "PATTERN" | "WEAK_PASSWORD" | "INVALID_PHONE" | "INVALID_URL";
15
+ 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
16
  interface ValidationError {
16
17
  field: string;
17
18
  code: ValidationErrorCode;
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ type FieldRule = {
3
3
  max?: number;
4
4
  regex?: RegExp;
5
5
  messages?: Partial<Record<ValidationErrorCode, string>>;
6
+ transform?: (value: unknown) => unknown;
6
7
  };
7
8
  type Schema = boolean | {
8
9
  min?: number;
@@ -11,7 +12,7 @@ type Schema = boolean | {
11
12
  interface ValidationSchema {
12
13
  [field: string]: FieldRule | Schema | boolean;
13
14
  }
14
- type ValidationErrorCode = "REQUIRED" | "INVALID_TYPE" | "MIN_LENGTH" | "MAX_LENGTH" | "PATTERN" | "WEAK_PASSWORD" | "INVALID_PHONE" | "INVALID_URL";
15
+ 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
16
  interface ValidationError {
16
17
  field: string;
17
18
  code: ValidationErrorCode;
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",
@@ -157,6 +160,16 @@ var booleanRule = {
157
160
  }
158
161
  };
159
162
 
163
+ // src/rules/imageRule.ts
164
+ var imageRule = {
165
+ messages: {
166
+ REQUIRED: "Image is required",
167
+ INVALID_IMAGE: "Invalid image payload",
168
+ IMAGE_TOO_LARGE: "Image size exceeds limit",
169
+ UNSUPPORTED_IMAGE_TYPE: "Unsupported image format"
170
+ }
171
+ };
172
+
160
173
  // src/rules/index.ts
161
174
  var RULES = {
162
175
  name: nameRule,
@@ -173,44 +186,72 @@ var RULES = {
173
186
  street: streetRule,
174
187
  username: usernameRule,
175
188
  time: timeRule,
176
- active: booleanRule
189
+ active: booleanRule,
190
+ avatar: imageRule
177
191
  };
178
192
 
179
193
  // src/core/error.ts
180
194
  var ERROR_MESSAGES = {
181
195
  REQUIRED: (field) => `${field} is required`,
182
- INVALID_TYPE: (field) => `${field} must be valid ${field}`,
196
+ INVALID_TYPE: (field) => `${field} must be a valid ${field}`,
183
197
  MIN_LENGTH: (field, rule) => `${field} must be at least ${rule?.min} characters`,
184
198
  MAX_LENGTH: (field, rule) => `${field} must be maximum ${rule?.max} characters`,
185
199
  PATTERN: (field) => `${field} format is invalid`,
186
200
  WEAK_PASSWORD: () => "Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)",
187
201
  INVALID_PHONE: () => "Phone must be a valid international/local number (+923001234567)",
188
- INVALID_URL: () => "URL must be valid (https://example.com)"
202
+ INVALID_URL: () => "URL must be valid (https://example.com)",
203
+ INVALID_IMAGE: (field) => `${field} must be a valid image object`,
204
+ IMAGE_TOO_LARGE: () => "Image size exceeds allowed limit",
205
+ UNSUPPORTED_IMAGE_TYPE: () => "Unsupported image format (jpeg, png, webp, avif only)"
189
206
  };
190
207
  function createError(field, code, rule) {
191
- const message = rule?.messages?.[code] || ERROR_MESSAGES[code](field, rule);
208
+ const message = rule?.messages?.[code] || ERROR_MESSAGES[code]?.(field, rule) || "Validation error";
192
209
  return { field, code, message };
193
210
  }
194
211
 
212
+ // src/constants/image.ts
213
+ var ALLOWED_IMAGE_MIME_TYPES = /* @__PURE__ */ new Set([
214
+ "image/jpeg",
215
+ "image/png",
216
+ "image/webp",
217
+ "image/avif"
218
+ ]);
219
+
195
220
  // src/core/rule-engine.ts
196
221
  function applyRule(field, value, rule) {
197
- if (value === void 0 || value === null || value === "") {
222
+ if (value == null) {
198
223
  return createError(field, "REQUIRED", rule);
199
224
  }
225
+ if (field === "image" || field === "avatar") {
226
+ if (typeof value !== "object" || Array.isArray(value)) {
227
+ return createError(field, "INVALID_IMAGE", rule);
228
+ }
229
+ const img = value;
230
+ if (typeof img.url !== "string") return createError(field, "INVALID_IMAGE", rule);
231
+ if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType)) {
232
+ return createError(field, "UNSUPPORTED_IMAGE_TYPE", rule);
233
+ }
234
+ if (img.sizeKB && img.sizeKB > 5120) {
235
+ return createError(field, "IMAGE_TOO_LARGE", rule);
236
+ }
237
+ return null;
238
+ }
239
+ if (typeof value === "boolean") {
240
+ return null;
241
+ }
200
242
  if (typeof value !== "string") {
201
243
  return createError(field, "INVALID_TYPE", rule);
202
244
  }
203
- const strValue = value;
204
- if (rule.min !== void 0 && strValue.length < rule.min) {
245
+ if (rule.min !== void 0 && value.length < rule.min) {
205
246
  return createError(field, "MIN_LENGTH", rule);
206
247
  }
207
- if (rule.max !== void 0 && strValue.length > rule.max) {
248
+ if (rule.max !== void 0 && value.length > rule.max) {
208
249
  return createError(field, "MAX_LENGTH", rule);
209
250
  }
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);
251
+ if (rule.regex && !rule.regex.test(value)) {
252
+ if (field === "password") {
253
+ return createError(field, "PATTERN", rule);
254
+ }
214
255
  return createError(field, "PATTERN", rule);
215
256
  }
216
257
  return null;
@@ -221,16 +262,21 @@ function validate(schema, data) {
221
262
  const errors = [];
222
263
  const validData = {};
223
264
  for (const field of Object.keys(schema)) {
224
- const rule = RULES[field] || schema[field];
265
+ const schemaRule = schema[field];
266
+ const rule = typeof schemaRule === "boolean" ? RULES[field] : RULES[field] ?? schemaRule;
225
267
  if (!rule) {
226
268
  errors.push(createError(field, "INVALID_TYPE"));
227
269
  continue;
228
270
  }
229
- const error = applyRule(field, data[field], rule);
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);
230
276
  if (error) {
231
277
  errors.push(error);
232
278
  } else {
233
- validData[field] = data[field];
279
+ validData[field] = currentValue;
234
280
  }
235
281
  }
236
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/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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smart-auth-validator",
3
- "version": "1.0.1",
3
+ "version": "1.2.0",
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",