{"version":3,"file":"index-COJgxcwI.js","sources":["../../Client/shared/Validations/index.ts"],"sourcesContent":["import { validatePhoneNumber } from '@shared/Common';\r\nimport * as Constants from '@shared/Constants';\r\nimport dayjs from 'dayjs';\r\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\r\nimport isBetween from 'dayjs/plugin/isBetween';\r\nimport utc from 'dayjs/plugin/utc';\r\n\r\ndayjs.extend(utc);\r\ndayjs.extend(isBetween);\r\ndayjs.extend(customParseFormat);\r\n\r\nlet stateNames: string[] = [];\r\n\r\nexport function getStateNames() {\r\n    if (!stateNames.length) {\r\n        for (let code in Constants.statesByCode) {\r\n            if (Constants.statesByCode.hasOwnProperty(code)) {\r\n                stateNames.push(Constants.statesByCode[code]);\r\n            }\r\n        }\r\n    }\r\n    return stateNames;\r\n}\r\n\r\nexport function getStateCodeByName(name: string): string {\r\n    name = (name || '').toLowerCase();\r\n    return Constants.statesByName[name];\r\n}\r\n\r\nexport function getStateNameByCode(code: string): string {\r\n    code = (code || '').toLowerCase();\r\n    return Constants.statesByCode[code];\r\n}\r\n\r\nexport function validateEmail(email: string) {\r\n    const regEx =\r\n        /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n    return regEx.test(email);\r\n}\r\n\r\nexport function validateOptionalEmail(email: string) {\r\n    const regEx =\r\n        /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n    return regEx.test(email) || !email;\r\n}\r\n\r\n// Validate latitude and longitude for continental USA, Hawaii and Alaska.\r\n// References:\r\n// https://en.wikipedia.org/wiki/List_of_extreme_points_of_the_United_States\r\n// https://en.wikipedia.org/wiki/List_of_extreme_points_of_U.S._states_and_territories\r\nexport function validateLatitudeAndLongitude(latitude: number, longitude: number): boolean {\r\n    return (\r\n        (23 <= latitude && latitude <= 50 && -125 <= longitude && longitude <= -65) || //48 continental states\r\n        (17 <= latitude && latitude <= 29 && -179 <= longitude && longitude <= -153) || //Hawaii\r\n        (50 <= latitude && latitude <= 72 && -173 <= longitude && longitude <= -128) //Alaska\r\n    );\r\n}\r\n\r\n// similar to validateZip method, but adds ability for zip code to be blank on additional info page mortgage bank section\r\nexport function validateMortgageCompanyZip(zipCode: string) {\r\n    return !zipCode || validateZip(zipCode);\r\n}\r\n\r\nexport function validateZip(zipCode: string) {\r\n    return /^(\\?(^00000)|(\\d{5}))$/.test(zipCode);\r\n}\r\n\r\nexport function validateStateCode(stateCode: string) {\r\n    stateCode = (stateCode || '').toLowerCase();\r\n    return Constants.statesByCode.hasOwnProperty(stateCode);\r\n}\r\n\r\n/**similar to validateStateCode method, but adds ability for state code to be blank on mortgage bank section\r\n */\r\nexport function validateOptionalState(state: string) {\r\n    state = (state || '').toLowerCase();\r\n    return !state || Constants.statesByCode.hasOwnProperty(state) || Constants.statesByName.hasOwnProperty(state);\r\n}\r\n\r\nexport function validateStateName(stateName: string) {\r\n    stateName = (stateName || '').toLowerCase();\r\n    return Constants.statesByName.hasOwnProperty(stateName);\r\n}\r\n\r\n/**\r\n * Luhn algorithm in JavaScript: validate credit card number supplied as string of numbers\r\n * @author ShirtlessKirk. Copyright (c) 2012.\r\n * @license WTFPL (http://www.wtfpl.net/txt/copying)\r\n */\r\nconst luhnChk = ((arr: number[]) => (ccNum: string) => {\r\n    let len = ccNum.length,\r\n        bit = 1,\r\n        sum = 0,\r\n        val: number;\r\n\r\n    while (len) {\r\n        val = parseInt(ccNum.charAt(--len), 10);\r\n        sum += (bit ^= 1) ? arr[val] : val;\r\n    }\r\n\r\n    return sum && sum % 10 === 0;\r\n})([0, 2, 4, 6, 8, 1, 3, 5, 7, 9]);\r\n\r\nexport function validateCardNumber(cardNumber: string) {\r\n    const visa = /^4[0-9]{12}(?:[0-9]{3})?$/;\r\n    const americanExpress = /^3[47][0-9]{13}$/;\r\n    const mastercard = /^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$/;\r\n    const discover = /6(?:011|5[0-9]{2})[0-9]{12}$/;\r\n    return (\r\n        !!luhnChk(cardNumber) &&\r\n        (visa.test(cardNumber) ||\r\n            americanExpress.test(cardNumber) ||\r\n            mastercard.test(cardNumber) ||\r\n            discover.test(cardNumber))\r\n    );\r\n}\r\n\r\nexport function validateCvn(cvn: string) {\r\n    if (isNaN(parseFloat(cvn))) return false;\r\n    if (cvn.length === 3 || cvn.length === 4) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * Returns true if the specified routing number matches the ABA checksum rules.\r\n * See http://www.brainjar.com/js/validation/\r\n */\r\nexport function validateRoutingNumber(s: string) {\r\n    // First, remove any non-numeric characters.\r\n    let t = '';\r\n    for (let i = 0; i < s.length; i++) {\r\n        const c = parseInt(s.charAt(i), 10);\r\n        if (c >= 0 && c <= 9) t = t + c;\r\n    }\r\n\r\n    // Check the length, it should be nine digits.\r\n    if (t.length !== 9) return false;\r\n\r\n    // Now run through each digit and calculate the total.\r\n    let n = 0;\r\n    for (let i = 0; i < t.length; i += 3) {\r\n        n += parseInt(t.charAt(i), 10) * 3 + parseInt(t.charAt(i + 1), 10) * 7 + parseInt(t.charAt(i + 2), 10);\r\n    }\r\n\r\n    // If the resulting sum is an even multiple of ten (but not zero),\r\n    // the aba routing number is good.\r\n    if (n !== 0 && n % 10 === 0) return true;\r\n    else return false;\r\n}\r\n\r\n/**\r\n * Returns true if the specified account number looks reasonably valid\r\n * See http://stackoverflow.com/questions/1540285/united-states-banking-institution-account-number-regular-expression\r\n */\r\nexport function validateAccountNumber(s: string) {\r\n    // First, remove any non-numeric characters.\r\n    let t = '';\r\n    for (let i = 0; i < s.length; i++) {\r\n        const c = parseInt(s.charAt(i), 10);\r\n        if (c >= 0 && c <= 9) t = t + c;\r\n    }\r\n\r\n    // Check the length, it should at least four and no more than 17 digits.\r\n    if (t.length < 4 || t.length > 17) return false;\r\n    return true;\r\n}\r\n\r\n/**\r\n * Returns true if the value is a valid date, false if not.\r\n */\r\nexport function validateDate(date: any): boolean {\r\n    const isValid = /^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(date) || /^\\d{2}-\\d{2}-\\d{4}$/.test(date);\r\n    if (isValid) {\r\n        // Check Date format\r\n        let separator = '/';\r\n        if (date.indexOf(separator) === -1) {\r\n            separator = '-';\r\n            if (date.indexOf(separator) === -1) {\r\n                return false;\r\n            }\r\n        }\r\n        const [dtMonth, dtDay, dtYear] = date.split(separator).map(x => parseFloat(x) || 0);\r\n\r\n        // Check Month for validity\r\n        if (dtMonth < 1 || dtMonth > 12) {\r\n            return false;\r\n        } //If month is not valid i.e not in range 1-12\r\n        else if (dtDay < 1 || dtDay > 31) {\r\n            return false;\r\n        } // If day is not valid i.e. not in range 1-31\r\n        else if ((dtMonth === 4 || dtMonth === 6 || dtMonth === 9 || dtMonth === 11) && dtDay === 31) {\r\n            return false;\r\n        } else if (dtMonth === 2) {\r\n            const isLeap = dtYear % 4 === 0 && (dtYear % 100 !== 0 || dtYear % 400 === 0);\r\n            if (dtDay > 29 || (dtDay === 29 && !isLeap)) return false;\r\n        }\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n\r\nexport function validateExpirationDate(expiration: string | dayjs.Dayjs | Date) {\r\n    const today = dayjs();\r\n    let expirationDate = typeof expiration === 'string' ? dayjs(expiration, 'MM/YY') : dayjs(expiration);\r\n    if (expirationDate.isBefore(today)) return false;\r\n    if (expirationDate.isAfter(today.add(10, 'year'))) return false;\r\n    return true;\r\n}\r\n\r\nexport function validateOptionalPhoneNumber(phoneNumber: any): boolean {\r\n    return !phoneNumber || validatePhoneNumber(phoneNumber);\r\n}\r\n\r\n// Social Security Number should be formatted as 222-22-2222\r\n// TIN# (Fein#) should be formatted as 22-2222222\r\n// per dawn.myers@swyfft.com 7Nov23\r\nexport function validateFein(fein: any): boolean {\r\n    let ssn = new RegExp('^[0-9]{3}[-][0-9]{2}[-][0-9]{4}$');\r\n    let tin = new RegExp('^[0-9]{2}[-][0-9]{7}$');\r\n    // if fein is not null and is either a ssn or tin, return true\r\n    let result = !(fein == null) && (ssn.test(fein) || tin.test(fein));\r\n    return result;\r\n}\r\n\r\nexport function phoneNumberRegex() {\r\n    return '\\\\(?([2-9][0-9]{2})\\\\)?[-. ]?([[2-9][0-9]{2})[-. ]?([0-9]{4})';\r\n}\r\n\r\nexport function validateField(name: string) {\r\n    if (name && name.length < 50) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n\r\nexport function validateInt(value: number) {\r\n    if (value && value >= 0) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n\r\nexport function validateAdditionalInfoField(value: string, maxLength: number) {\r\n    if (value.length <= maxLength) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n"],"names":["dayjs","utc","isBetween","customParseFormat","getStateCodeByName","name","Constants.statesByName","validateEmail","email","validateOptionalEmail","validateMortgageCompanyZip","zipCode","validateZip","validateStateCode","stateCode","Constants.statesByCode","validateOptionalState","state","luhnChk","arr","ccNum","len","bit","sum","val","validateCardNumber","cardNumber","visa","americanExpress","mastercard","discover","validateCvn","cvn","validateRoutingNumber","s","t","i","c","n","validateAccountNumber","validateDate","date","separator","dtMonth","dtDay","dtYear","x","isLeap","validateExpirationDate","expiration","today","expirationDate","validateOptionalPhoneNumber","phoneNumber","validatePhoneNumber","phoneNumberRegex","validateField","validateAdditionalInfoField","value","maxLength"],"mappings":"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"}