UNPKG

smart-form-utils

Version:

Smart form helpers: validate and format user input like credit cards, phone numbers, Aadhaar, and more.

8 lines (7 loc) 15 kB
{ "version": 3, "sources": ["../../Validators/mobile.js", "../../Validators/aadhar.js", "../../src/index.js", "../../Validators/email.js", "../../Validators/zipcode.js", "../../Validators/panCard.js", "../../Validators/gst.js", "../../Validators/passwordValidator.js", "../../Formatters/india/aadhar.js", "../../Formatters/india/licence-plate.js", "../../Formatters/india/phone.js", "../../Formatters/universal/currency.js", "../../Formatters/universal/creditcard.js"], "sourcesContent": ["// validators/phone.js\r\n\r\nexport default function validatePhone(number, countryCode) {\r\n const patterns = {\r\n IN: /^[6-9]\\d{9}$/, // India\r\n US: /^([2-9][0-9]{2})[- ]?[2-9][0-9]{2}[- ]?[0-9]{4}$/, // USA\r\n UK: /^(?:\\+44|0)7\\d{3}[- ]?\\d{6}$/, // UK\r\n AU: /^(\\+61|0)?\\s?4\\d{2}[\\s-]?\\d{3}[\\s-]?\\d{3}$/, // Australia\r\n CA: /^\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$/, // Canada\r\n };\r\n\r\n const pattern = patterns[countryCode.toUpperCase()];\r\n return pattern ? pattern.test(number) : false;\r\n}\r\n\r\n\r\n\r\n ", "export default function validateAadhaar(aadhaar) {\r\n if (typeof aadhaar !== 'string') return false;\r\n\r\n const str = aadhaar.replace(/\\s+/g, ''); // remove spaces\r\n if (!/^\\d{12}$/.test(str)) return false;\r\n\r\n // Verhoeff algorithm to validate Aadhaar checksum\r\n const d = [\r\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\r\n [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],\r\n [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],\r\n [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],\r\n [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],\r\n [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],\r\n [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],\r\n [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],\r\n [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],\r\n [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\r\n ];\r\n const p = [\r\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\r\n [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],\r\n [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],\r\n [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],\r\n [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],\r\n [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],\r\n [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],\r\n [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]\r\n ];\r\n const inv = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9];\r\n\r\n let c = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n c = d[c][p[(i % 8)][parseInt(str.charAt(str.length - i - 1), 10)]];\r\n }\r\n\r\n return c === 0;\r\n};\r\n\r\n\r\n", "export { default as validateEmail } from '../Validators/email'\r\nexport { default as validateZipCode } from '../Validators/zipcode'\r\nexport { default as validatePanCard } from '../Validators/panCard'\r\nexport { default as validatePhone } from '../Validators/mobile'\r\nexport { default as validateGST } from '../Validators/gst'\r\nexport { default as validateAadhaar } from '../Validators/aadhar'\r\nexport { default as validateStrongPassword } from '../Validators/passwordValidator'\r\n\r\n\r\n// formatters of india \r\nexport { default as formatAadhaar } from '../Formatters/india/aadhar'\r\nexport { default as formatLicensePlate } from '../Formatters/india/licence-plate'\r\nexport { default as formatPhoneIN } from '../Formatters/india/phone'\r\n\r\n\r\n// universal formatters \r\nexport { default as formatCurrency } from '../Formatters/universal/currency'\r\nexport { default as formatCreditCard } from '../Formatters/universal/creditcard'\r\n\r\n\r\n\r\n\r\n", "export default function validateEmail(email) {\r\n if (typeof email !== 'string') return false;\r\n const str = email.trim();\r\n\r\n // Basic RFC 5322 simplified regex for email format\r\n const regex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z]{2,}$/;\r\n if (!regex.test(str)) return false;\r\n\r\n // Additional checks:\r\n\r\n // 1. No consecutive dots in local or domain parts\r\n const [local, domain] = str.split('@');\r\n if (local.includes('..') || domain.includes('..')) return false;\r\n\r\n // 2. Local part cannot start or end with dot\r\n if (local.startsWith('.') || local.endsWith('.')) return false;\r\n\r\n // 3. Domain part cannot start or end with hyphen or dot\r\n if (domain.startsWith('-') || domain.endsWith('-')) return false;\r\n if (domain.startsWith('.') || domain.endsWith('.')) return false;\r\n\r\n // 4. Domain labels (parts between dots) cannot start or end with hyphen\r\n const domainLabels = domain.split('.');\r\n if (domainLabels.some(label => label.startsWith('-') || label.endsWith('-'))) return false;\r\n\r\n return true;\r\n};\r\n\r\n", "function isFakePattern(zip) {\r\n // All digits same (e.g., 000000, 1111)\r\n if (/^(\\d)\\1+$/.test(zip)) return true;\r\n\r\n // Known fake-like sequences\r\n const fakeSequences = ['123456', '987654', '1234', '9876'];\r\n if (fakeSequences.includes(zip)) return true;\r\n\r\n return false;\r\n}\r\n\r\nexport default function validateZipCode(zip, country) {\r\n let regex;\r\n switch (country.toLowerCase()) {\r\n case 'us':\r\n regex = /^\\d{5}(-\\d{4})?$/;\r\n break;\r\n case 'canada':\r\n regex = /^[A-Za-z]\\d[A-Za-z][ ]?\\d[A-Za-z]\\d$/;\r\n break;\r\n case 'uk':\r\n regex = /^[A-Z]{1,2}\\d[A-Z\\d]?\\s?\\d[A-Z]{2}$/i;\r\n break;\r\n case 'au':\r\n regex = /^\\d{4}$/;\r\n break;\r\n case 'in':\r\n regex = /^\\d{6}$/;\r\n break;\r\n default:\r\n return false;\r\n }\r\n\r\n // Check format\r\n if (!regex.test(zip)) return false;\r\n\r\n // Check for fake numeric patterns\r\n if (/^\\d+$/.test(zip) && isFakePattern(zip)) return false;\r\n\r\n return true;\r\n}\r\n\r\n", "export default function validatePanCard(pan) {\r\n if (typeof pan !== 'string' ) return false;\r\n\r\n const str = pan.trim().toUpperCase();\r\n\r\n if (str.length !== 10) return false;\r\n\r\n // Basic pattern check: 5 letters, 4 digits, 1 letter\r\n const regex = /^[A-Z]{5}[0-9]{4}[A-Z]$/;\r\n if (!regex.test(str)) return false;\r\n\r\n const validStatusCodes = ['P', 'C', 'H', 'A', 'B', 'G', 'J', 'L', 'F', 'T'];\r\n if (!validStatusCodes.includes(str[3])) return false;\r\n\r\n return true;\r\n};\r\n", "export default function validateGST(gst) {\r\n if (typeof gst !== 'string') return false;\r\n const str = gst.trim().toUpperCase();\r\n\r\n // GST format: 2 digits (state code), 10 char PAN, 1 char entity code, 1 char Z by default, 1 checksum char\r\n const regex = /^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z][1-9A-Z]Z[0-9A-Z]$/;\r\n if (!regex.test(str)) return false;\r\n\r\n return true;\r\n};\r\n\r\n", "export default function validateStrongPassword(password, minLength = 8) {\r\n if (typeof password !== 'string') return false;\r\n if (password.length < minLength) return false;\r\n\r\n // Must contain at least one lowercase, one uppercase, one number, and one special character\r\n const pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?#&])/;\r\n return pattern.test(password);\r\n}\r\n\r\n", "const validateAadhaar = require('../../Validators/aadhar')\r\n\r\nexport default function formatAadhaar(input) {\r\n if (!validateAadhaar(input)) return 'invalid aadhar' ; // or return null/error\r\n const digits = input.replace(/\\D/g, '');\r\n return `${digits.slice(0, 4)} ${digits.slice(4, 8)} ${digits.slice(8, 12)}`;\r\n}\r\n", "export default function formatLicensePlate(input) {\r\n const cleaned = input.replace(/[^A-Z0-9]/gi, '').toUpperCase();\r\n\r\n // Validate the cleaned string\r\n const validPattern = /^[A-Z]{2}\\d{2}[A-Z]{2}\\d{4}$/;\r\n if (!validPattern.test(cleaned)) {\r\n return 'not a valid license plate number'; // or return null / throw error depending on your use case\r\n }\r\n\r\n const stateCode = cleaned.slice(0, 2);\r\n const districtCode = cleaned.slice(2, 4);\r\n const series = cleaned.slice(4, 6);\r\n const number = cleaned.slice(6);\r\n\r\n return `${stateCode} ${districtCode} ${series} ${number}`;\r\n}\r\n", "const validatePhone = require('../../Validators/mobile')\r\n\r\nexport default function formatPhoneIN(input) {\r\n if (!validatePhone(input, 'IN')) return 'invalid mobile number'\r\n return input.replace(/\\D/g, '').replace(/(\\d{5})(\\d{5})/, '$1 $2');\r\n}\r\n", "export default function formatCurrency(amount, currency = 'INR', locale = 'en-IN') {\r\n if (typeof amount !== 'number') {\r\n amount = parseFloat(amount);\r\n }\r\n\r\n if (isNaN(amount)) return 'Invalid amount';\r\n\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n minimumFractionDigits: 2,\r\n }).format(amount);\r\n}\r\n", "export default function formatCreditCard(input) {\r\n const digits = input.replace(/\\D/g, '');\r\n\r\n // Handle American Express (15 digits, format 4-6-5)\r\n if (/^3[47]\\d{13}$/.test(digits)) {\r\n return `${digits.slice(0, 4)} ${digits.slice(4, 10)} ${digits.slice(10)}`;\r\n }\r\n\r\n // Handle Diners Club (14 digits, format 4-6-4)\r\n if (/^3(?:0[0-5]|[68]\\d)\\d{11}$/.test(digits)) {\r\n return `${digits.slice(0, 4)} ${digits.slice(4, 10)} ${digits.slice(10)}`;\r\n }\r\n\r\n // Handle standard 16-digit cards (Visa, MasterCard, Discover, etc.) \u2192 format 4-4-4-4\r\n if (/^\\d{16}$/.test(digits)) {\r\n return digits.replace(/(\\d{4})(?=\\d)/g, '$1 ').trim();\r\n }\r\n\r\n // Fallback: Group in 4s for any other length up to 19\r\n return digits.replace(/(\\d{4})(?=\\d)/g, '$1 ').trim();\r\n}\r\n"], "mappings": "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", "names": ["validateAadhaar", "validatePhone"] }