{ "version": 3, "sources": ["apps/partner-center-client/src/app/common/form/validator.ts"], "sourcesContent": ["import { UntypedFormControl } from '@angular/forms';\n\nconst PRICE_REGEX = /^\\d{0,8}(\\.\\d{1,2})?$/;\nexport const URL_REGEX = /^((https?:\\/\\/)?([\\w-]+(\\.[\\w-]+)+|localhost)\\.?(:\\d+)?((\\/)?\\S*)?)$/i;\nexport const EMAIL_REGEX =\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,}))$/;\nconst SUBDOMAIN_REGEX = /(^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$)/;\n// Following regex matches North American, South African, UK, and Australian phone numbers, with some support for extensions\nconst PHONE_NUMBER_REGEX =\n /(^(?:(?:\\+?1\\s*(?:[.-]\\s*)?)?(?:\\(\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\\s*\\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\s*(?:[.-]\\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\\s*(?:[.-]\\s*)?([0-9]{4})(?:\\s*(?:#|x\\.?|ext\\.?|extension)\\s*(\\d+))?$)|(^(((\\+44\\s?\\d{4}|\\(?0\\d{4}\\)?)\\s?\\d{3}\\s?\\d{3})|((\\+44\\s?\\d{3}|\\(?0\\d{3}\\)?)\\s?\\d{3}\\s?\\d{4})|((\\+44\\s?\\d{2}|\\(?0\\d{2}\\)?)\\s?\\d{4}\\s?\\d{4}))(\\s?#(\\d{4}|\\d{3}))?$)|(^(\\+\\d{2}[ -]{0,1}){0,1}(((\\({0,1}[ -]{0,1})0{0,1}\\){0,1}[2|3|7|8]{1}\\){0,1}[ -]*(\\d{4}[ -]{0,1}\\d{4}))|(1[ -]{0,1}(300|800|900|902)[ -]{0,1}((\\d{6})|(\\d{3}[ -]{0,1}\\d{3})))|(13[ -]{0,1}([\\d -]{5})|((\\({0,1}[ -]{0,1})0{0,1}\\){0,1}4{1}[\\d -]{8,10})))$)|((\\(0\\d\\d\\)\\s\\d{3}[\\s-]+\\d{4})|(0\\d\\d[\\s-]+\\d{3}[\\s-]+\\d{4})|(0\\d{9})|(\\+\\d\\d\\s?[(\\s]\\d\\d[)\\s]\\s?\\d{3}[\\s-]?\\d{4}))/;\nconst MARKET_ID_REGEX = /(^[a-z0-9-]*$)/;\n\n/**\n * import from https://github.com/ReactiveX/rxjs/blob/5.5.8/src/util/isNumeric.ts\n */\nconst isArray = Array.isArray || ((x: any): x is T[] => x && typeof x.length === 'number');\n\nfunction isNumeric(val: any): val is number {\n return !isArray(val) && val - parseFloat(val) + 1 >= 0;\n}\n\n// TODO: put in a shared lib like @vendasta/core\nexport class Validator {\n static isPrice(control: UntypedFormControl): any {\n if (control.value && typeof control.value === 'string' && control.value.match(PRICE_REGEX)) {\n return null;\n } else if (\n control.value &&\n typeof control.value === 'number' &&\n parseFloat((control.value * 100).toFixed(2)) % 1 === 0\n ) {\n // modulus with floating point bases is broken\n return null;\n } else if (!control.value) {\n return null;\n } else {\n return { invalidPrice: true };\n }\n }\n\n static isUrl(control: UntypedFormControl): any {\n if (control.value && control.value.match(URL_REGEX)) {\n return null;\n } else if (control.value) {\n return { invalidUrl: true };\n }\n }\n\n static isEmailList(control: UntypedFormControl): any {\n if (control.value) {\n const emails = control.value\n .toString()\n .split(/[,;]+/)\n .map((email) => email.trim());\n const invalidEmails = emails.filter((email) => !email.match(EMAIL_REGEX));\n if (invalidEmails.length) {\n return { invalidEmail: true };\n }\n }\n }\n\n static isEmail(control: UntypedFormControl): any {\n if (control.value && control.value.match(EMAIL_REGEX)) {\n return null;\n } else if (control.value) {\n return { invalidEmail: true };\n }\n }\n\n static isPhoneNumber(control: UntypedFormControl): any {\n if (control.value && control.value.match(PHONE_NUMBER_REGEX)) {\n return null;\n } else if (control.value) {\n return { invalidPhoneNumber: true };\n }\n }\n\n static isInRange = (lower: number, upper: number) => {\n return (control: UntypedFormControl) => {\n const value = control.value;\n if (!isNumeric(value) || (lower !== null && Number(value) < lower) || (upper !== null && Number(value) > upper)) {\n return { outOfRange: true };\n }\n return null;\n };\n };\n\n static isValidMarketId(control: UntypedFormControl): any {\n if (control.value && control.value.match(MARKET_ID_REGEX)) {\n return null;\n } else if (control.value) {\n return { invalidMarketId: true };\n }\n }\n\n static isMinimumLength = (minimumLength: number) => {\n return (control: UntypedFormControl): any => {\n if (control.value && control.value.length >= minimumLength) {\n return null;\n } else if (control.value) {\n return { minlength: true };\n }\n };\n };\n\n static isValidSubdomain(control: UntypedFormControl): any {\n if (control.value && control.value.match(SUBDOMAIN_REGEX)) {\n return null;\n } else if (control.value) {\n return { invalidSubdomain: true };\n }\n }\n\n static isGreaterThanZero = () => {\n return (control: UntypedFormControl) => {\n if (control.value <= 0) {\n return { isLessThanOrEqualToZero: true };\n }\n return null;\n };\n };\n\n static errorMessage(validatorName: string, validatorValue?: any): string {\n const config = {\n required: 'Required',\n minlength: `Minimum length ${validatorValue.requiredLength}`,\n invalidPrice: `Invalid price`,\n outOfRange: `Out of range`,\n invalidEmail: 'Invalid Email',\n invalidPhoneNumber: 'Invalid Phone Number',\n invalidZipCode: 'Invalid Zip/Postal Code',\n invalidSubdomain: 'Invalid Subdomain',\n };\n\n return config[validatorName];\n }\n}\n"], "mappings": "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", "names": ["PRICE_REGEX", "URL_REGEX", "EMAIL_REGEX", "SUBDOMAIN_REGEX", "PHONE_NUMBER_REGEX", "MARKET_ID_REGEX", "isArray", "Array", "x", "length", "isNumeric", "val", "parseFloat", "Validator", "isPrice", "control", "value", "match", "toFixed", "invalidPrice", "isUrl", "invalidUrl", "isEmailList", "toString", "split", "map", "email", "trim", "filter", "invalidEmail", "isEmail", "isPhoneNumber", "invalidPhoneNumber", "isValidMarketId", "invalidMarketId", "isValidSubdomain", "invalidSubdomain", "errorMessage", "validatorName", "validatorValue", "required", "minlength", "requiredLength", "outOfRange", "invalidZipCode", "_Validator", "isInRange", "lower", "upper", "Number", "isMinimumLength", "minimumLength", "isGreaterThanZero", "isLessThanOrEqualToZero"] }