We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
I want to suggest to use a more functional approach for the library. I created an example of this for PostalCode:
type PostalCodeInfo = { pattern: RegExp; search?: RegExp | undefined; replace?: string | undefined; }; function createPostalCodeInfo( pattern: RegExp, search?: RegExp | undefined, replace?: string | undefined ): PostalCodeInfo { return { pattern, search, replace }; } const PostalCodeInfos = { AD: createPostalCodeInfo(/^(AD)?[1-7][0-9]{2}$/, /^(AD)?(...)$/, 'AD-$2'), AF: createPostalCodeInfo(/^(0[1-9]|[1-3][0-9]|4[0-3])([0-9]{2})(?<!00)$/), AI: createPostalCodeInfo(/^(AI)?2640$/, /^.+$/, 'AI-2640'), AL: createPostalCodeInfo(/^[1-9][0-9]{3}$/), AM: createPostalCodeInfo(/^[0-4][0-9]{3}$/), AR: createPostalCodeInfo(/^[A-Z][1-9][0-9]{3}[A-Z]{3}$/, /^(.)(....)(...)$/, '$1 $2 $3'), AS: createPostalCodeInfo(/^9[0-9]{4}([0-9]{4})?$/, /^(.{5})(....)?$/, '$1 $2'), AT: createPostalCodeInfo(/^[1-9][0-9]{3}$/), AU: createPostalCodeInfo(/^(0[89]|[1-9][0-9])[0-9]{2}$/), AX: createPostalCodeInfo(/^22[0-9]{3}$/, /^(..)(...)$/, '$1-$2'), AZ: createPostalCodeInfo(/^(AZ)?[0-9]{4}$/, /^(AZ)?(....)$/, 'AZ-$2'), BA: createPostalCodeInfo(/^[0-9]{5}$/), BB: createPostalCodeInfo(/^(BB)?[0-9]{5}$/, /^(BB)?(.{5})$/, 'BB-$2'), BD: createPostalCodeInfo(/^[0-9]{4}$/), BE: createPostalCodeInfo(/^[1-9][0-9]{3}$/), BG: createPostalCodeInfo(/^[1-9][0-9]{3}$/), BH: createPostalCodeInfo(/^(1[0-2]|[1-9])[0-9]{2}$/), BL: createPostalCodeInfo(/^977[0-9]{2}$/), BM: createPostalCodeInfo(/^[A-Z]{2}([A-Z0-9]{2})?$/, /^(..)(..)$/, '$1 $2'), BN: createPostalCodeInfo(/^[A-Z]{2}[0-9]{4}$/), BO: createPostalCodeInfo(/^[0-9]{4}$/), BR: createPostalCodeInfo(/^([0-9]{2})(?<!00)[0-9]{6}$/, /^(.{5})(...)$/, '$1-$2'), BT: createPostalCodeInfo(/^[0-9]{3}$/), BY: createPostalCodeInfo(/^[0-9]{6}$/), CA: createPostalCodeInfo(/^[ABCEGHJKLMNPRSTVXY][0-9][ABCEGHJKLMNPRSTVWXYZ][0-9][ABCEGHJKLMNPRSTVWXYZ][0-9]$/, /^(...)(...)$/, '$1 $2'), CC: createPostalCodeInfo(/^[0-9]{4}$/), CH: createPostalCodeInfo(/^[1-9][0-9]{3}$/), CL: createPostalCodeInfo(/^[0-9]{7}$/, /^(...)(....)$/, '$1-$2'), CN: createPostalCodeInfo(/^([0-9]{2})(?<!00)[0-9]{4}$/), CO: createPostalCodeInfo(/^[0-9]{6}$/), CR: createPostalCodeInfo(/^[0-9]{5}$/), CU: createPostalCodeInfo(/^(CP)?[0-9]{5}$/, /^(..)?(.{5})$/, 'CP$2'), CV: createPostalCodeInfo(/^[0-9]{4}$/), CX: createPostalCodeInfo(/^[0-9]{4}$/), CY: createPostalCodeInfo(/^[1-9][0-9]{3}$/), CZ: createPostalCodeInfo(/^[1-7][0-9]{4}$/, /^(...)(..)$/, '$1 $2'), DE: createPostalCodeInfo(/^([0-9]{2})(?<!00)[0-9]{3}$/), DK: createPostalCodeInfo(/^(DK)?[1-9][0-9]{3}$/, /^(DK)?(....)$/, 'DK-$2'), DZ: createPostalCodeInfo(/^[0-9]{5}$/), EC: createPostalCodeInfo(/^[0-9]{6}$/), EE: createPostalCodeInfo(/^[0-9]{5}$/), EG: createPostalCodeInfo(/^[1-9][0-9]{4}$/), ES: createPostalCodeInfo(/^((0[1-9])|([1-4][0-9])|(5[012]))[0-9]{3}$/), ET: createPostalCodeInfo(/^[0-9]{4}$/), FI: createPostalCodeInfo(/^[0-9]{5}$/, /^(..)(...)$/, '$1-$2'), FK: createPostalCodeInfo(/^FIQQ1ZZ$/, /^.+$/, 'FIQQ 1ZZ'), FM: createPostalCodeInfo(/^9694[1234]([0-9]{4})?$/, /^(.{5})(....)$/, '$1-$2'), FO: createPostalCodeInfo(/^(FO)?[1-9][0-9]{2}$/, /^(FO)?(...)$/, 'FO-$2'), FR: createPostalCodeInfo(/^([0-9]{2})(?<!00)[0-9]{3}$/), GA: createPostalCodeInfo(/^[0-9]{4}$/, /^(..)(..)$/, '$1 $2'), GB: createPostalCodeInfo(/^[A-Z]?[A-Z][0-9][A-Z0-9]?[0-9][A-Z]{2}$/, /^(.+)(...)$/, '$1 $2'), GE: createPostalCodeInfo(/^[0-9]{4}$/), GF: createPostalCodeInfo(/^973[0-9]{2}$/), GG: createPostalCodeInfo(/^(GY)?[0-9]{2,3}[A-Z]{2}$/, /^(GY)?(...?)(...)$/, 'GY$2 $3'), GI: createPostalCodeInfo(/^GX111AA$/, /^.+$/, 'GX11 1AA'), GL: createPostalCodeInfo(/^(GL)?39[0-9]{2}$/, /^(GL)?(....)$/, 'GL-$2'), GP: createPostalCodeInfo(/^971[0-9]{2}$/), GR: createPostalCodeInfo(/^[1-9][0-9]{4}$/, /^(...)(..)$/, '$1 $2'), GS: createPostalCodeInfo(/^SIQQ1ZZ$/, /^.+$/, 'SIQQ 1ZZ'), GT: createPostalCodeInfo(/^[0-9]{5}$/), GU: createPostalCodeInfo(/^969([12][0-9]|3[0-3])([0-9]{4})?$/, /^(.{5})(....)$/, '$1-$2'), GW: createPostalCodeInfo(/^[0-9]{4}$/), HM: createPostalCodeInfo(/^[0-9]{4}$/), HN: createPostalCodeInfo(/^[0-9]{5}$/), HR: createPostalCodeInfo(/^[0-9]{5}$/), HT: createPostalCodeInfo(/^[0-9]{4}$/), HU: createPostalCodeInfo(/^[1-9][0-9]{3}$/), ID: createPostalCodeInfo(/^[1-9][0-9]{4}$/), IL: createPostalCodeInfo(/^[0-9]{7}$/), IM: createPostalCodeInfo(/^(IM)?[0-9]{2,3}[A-Z]{2}$/, /^(IM)?(..?)(...)$/, 'IM$2 $3'), IN: createPostalCodeInfo(/^[1-9][0-9]{5}$/), IO: createPostalCodeInfo(/^BBND1ZZ$/, /^.+$/, 'BBND 1ZZ'), IQ: createPostalCodeInfo(/^[13456][0-9]{4}$/), IR: createPostalCodeInfo(/^[0-9]{10}$/, /^(.{5})(.{5})$/, '$1-$2'), IS: createPostalCodeInfo(/^[0-9]{3}$/), IT: createPostalCodeInfo(/^([0-9]{3})(?<!000)[0-9]{2}$/), JE: createPostalCodeInfo(/^(JE)?[0-9]{2,3}[A-Z]{2}$/, /^(JE)?(...?)(...)$/, 'JE$2 $3'), JO: createPostalCodeInfo(/^[0-9]{5}$/), JP: createPostalCodeInfo(/^[0-9]{7}$/, /^(....)(...)$/, '$1-$2'), KG: createPostalCodeInfo(/^[0-9]{6}$/), KH: createPostalCodeInfo(/^[0-9]{5}$/), KR: createPostalCodeInfo(/^[1-7][0-9]{5}$/, /^(...)(...)$/, '$1-$2'), KY: createPostalCodeInfo(/^(KY)?[0-9]{5}$/, /^(KY)?(.)(....)$/, 'KY$2-$3'), KZ: createPostalCodeInfo(/^[0-9]{6}$/), LA: createPostalCodeInfo(/^[0-9]{5}$/), LB: createPostalCodeInfo(/^[0-9]{8}$/, /^(....)(....)$/, '$1 $2'), LI: createPostalCodeInfo(/^94(8[5-9]|9[0-8])$/), LK: createPostalCodeInfo(/^[0-9]{5}$/), LR: createPostalCodeInfo(/^[0-9]{4}$/), LS: createPostalCodeInfo(/^[0-9]{3}$/), LT: createPostalCodeInfo(/^(LT)?[0-9]{5}$/, /^(LT)?(.{5})$/, 'LT-$2'), LU: createPostalCodeInfo(/^[0-9]{4}$/), LV: createPostalCodeInfo(/^(LV)?[0-9]{4}$/, /^(LV)?(....)$/, 'LV-$2'), LY: createPostalCodeInfo(/^[0-9]{5}$/), MA: createPostalCodeInfo(/^[1-9][0-9]{4}$/, /^(..)(...)$/, '$1 $2'), MC: createPostalCodeInfo(/^(MC)?980[0-9]{2}$/), MD: createPostalCodeInfo(/^(MD)?[0-9]{4}$/, /^(MD)?(....)$/, 'MD-$2'), ME: createPostalCodeInfo(/^8[145][0-9]{3}$/), MF: createPostalCodeInfo(/^978[0-9]{2}$/), MG: createPostalCodeInfo(/^[0-9]{3}$/), MH: createPostalCodeInfo(/^969[67][0-9]([0-9]{4})?$/, /^(.{5})(....)$/, '$1-$2'), MK: createPostalCodeInfo(/^[0-9]{4}$/), MM: createPostalCodeInfo(/^[0-9]{5}$/), MN: createPostalCodeInfo(/^[0-9]{5}$/), MP: createPostalCodeInfo(/^9695[012]([0-9]{4})?$/, /^(.{5})(....)$/, '$1-$2'), MQ: createPostalCodeInfo(/^972[0-9]{2}$/), MT: createPostalCodeInfo(/^[A-Z]{3}[0-9]{4}$/, /^(...)(....)$/, '$1 $2'), MX: createPostalCodeInfo(/^[0-9]{5}$/), MY: createPostalCodeInfo(/^([0-9]{2})(?<!00)[0-9]{3}$/), MZ: createPostalCodeInfo(/^[0-9]{4}$/), NA: createPostalCodeInfo(/^9[0-2][0-9]{3}$/), NC: createPostalCodeInfo(/^988[0-9]{2}$/), NE: createPostalCodeInfo(/^[0-9]{4}$/), NF: createPostalCodeInfo(/^[0-9]{4}$/), NG: createPostalCodeInfo(/^[0-9]{6}$/), NI: createPostalCodeInfo(/^[0-9]{5}$/), NL: createPostalCodeInfo(/^[1-9][0-9]{3}([A-Z]{2})(?<!SS|SA|SD)$/, /^(....)(..)$/, '$1 $2'), NO: createPostalCodeInfo(/^[0-9]{4}$/), NP: createPostalCodeInfo(/^[0-9]{5}$/), NZ: createPostalCodeInfo(/^[0-9]{4}$/), OM: createPostalCodeInfo(/^[0-9]{3}$/), PA: createPostalCodeInfo(/^[0-9]{6}$/), PE: createPostalCodeInfo(/^[0-9]{5}$/), PF: createPostalCodeInfo(/^987[0-9]{2}$/), PG: createPostalCodeInfo(/^[0-9]{3}$/), PH: createPostalCodeInfo(/^([0-9]{2})(?<!00)[0-9]{2}$/), PK: createPostalCodeInfo(/^[1-9][0-9]{4}$/), PL: createPostalCodeInfo(/^[0-9]{5}$/, /^(..)(...)$/, '$1-$2'), PM: createPostalCodeInfo(/^97500$/), PN: createPostalCodeInfo(/^PCRN1ZZ$/, /^.+$/, 'PCRN 1ZZ'), PR: createPostalCodeInfo(/^[0-9]{5}$/), PS: createPostalCodeInfo(/^[0-9]{5}$/), PT: createPostalCodeInfo(/^[1-9][0-9]{6}$/, /^(....)(...)$/, '$1 $2'), PW: createPostalCodeInfo(/^96940([0-9]{4})?$/, /^(.{5})(....)$/, '$1-$2'), PY: createPostalCodeInfo(/^[0-9]{4}$/), RE: createPostalCodeInfo(/^974[0-9]{2}$/), RO: createPostalCodeInfo(/^([0-9]{2})(?<!00)[0-9]{4}$/), RS: createPostalCodeInfo(/^[123][0-9]{4}$/), RU: createPostalCodeInfo(/^[1-6][0-9]{5}$/), SA: createPostalCodeInfo(/^[0-9]{5}([0-9]{4})?$/, /^(.{5})(....)$/, '$1-$2'), SD: createPostalCodeInfo(/^[0-9]{5}$/), SE: createPostalCodeInfo(/^[1-9][0-9]{4}$/, /^(...)(..)$/, '$1 $2'), SG: createPostalCodeInfo(/^[0-9]{6}$/), SH: createPostalCodeInfo(/^STHL1ZZ$/, /^.+$/, 'STHL 1ZZ'), SI: createPostalCodeInfo(/^(SI)?[0-9]{4}$/, /^(SI)?(....)$/, 'SI-$2'), SK: createPostalCodeInfo(/^[0-9]{5}$/, /^(...)(..)$/, '$1 $2'), SM: createPostalCodeInfo(/^4789[0-9]$/), SN: createPostalCodeInfo(/^(CP)?[0-9]{5}$/, /^(..)?(.{5})$/, 'CP$2'), SV: createPostalCodeInfo(/^01101$/), SZ: createPostalCodeInfo(/^[HLMS][0-9]{3}$/), TC: createPostalCodeInfo(/^TKCA1ZZ$/, /^.+$/, 'TKCA 1ZZ'), TD: createPostalCodeInfo(/^[0-9]{5}$/), TH: createPostalCodeInfo(/^[1-9][0-9]{4}$/), TJ: createPostalCodeInfo(/^[0-9]{6}$/), TM: createPostalCodeInfo(/^[0-9]{6}$/), TN: createPostalCodeInfo(/^[0-9]{4}$/), TR: createPostalCodeInfo(/^([0-9]{2})(?<!00)[0-9]{3}$/), TT: createPostalCodeInfo(/^[0-9]{6}$/), TW: createPostalCodeInfo(/^[1-9][0-9]{4}$/), UA: createPostalCodeInfo(/^([0-9]{2})(?<!00)[0-9]{3}$/), US: createPostalCodeInfo(/^[0-9]{5}([0-9]{4})?$/, /^(.{5})(....)$/, '$1-$2'), UY: createPostalCodeInfo(/^[0-9]{5}$/), VA: createPostalCodeInfo(/^00120$/), VC: createPostalCodeInfo(/^(VC)?[0-9]{4}$/, /^(VC)?(....)$/, 'VC$2'), VE: createPostalCodeInfo(/^[0-9]{4}[A-Z]?$/, /^(....)(.)$/, '$1-$2'), VG: createPostalCodeInfo(/^(VG)?11[0-6][0-9]$/, /^(VG)?(....)$/, 'VG$2'), VI: createPostalCodeInfo(/^008[1-5][0-9]([0-9]{4})?$/, /^(.{5})(....)$/, '$1-$2'), VN: createPostalCodeInfo(/^[0-9]{6}$/), WF: createPostalCodeInfo(/^986[0-9]{2}$/), XK: createPostalCodeInfo(/^[1-7][0-9]{4}$/), YT: createPostalCodeInfo(/^976[0-9]{2}$/), ZA: createPostalCodeInfo(/^([0-9]{4})(?<!0000)$/), ZM: createPostalCodeInfo(/^[0-9]{5}$/), }; export type PostalCode = string; export function formatPostalCode(code: PostalCode, country: keyof typeof PostalCodeInfos): string { if (!validatePostalCode(code, country)) { throw new Error(`Not a valid postal code for country ${country}`); } const info = PostalCodeInfos[country]; return info.search === undefined ? code : code.replace(this.search, this.replace); } export function validatePostalCode(code: PostalCode | undefined | null, country: keyof typeof PostalCodeInfos): code is PostalCode { if (code === '' || code === null || code === undefined) { return false; } const info = PostalCodeInfos[country]; return info.pattern.test(code); } export function normalizePostalCode(value: string): PostalCode { return value .replace(/[_- \.]/g, '') .toUpperCase(); }
It will have these benefits:
validatePostalCode
The text was updated successfully, but these errors were encountered:
No branches or pull requests
I want to suggest to use a more functional approach for the library. I created an example of this for PostalCode:
It will have these benefits:
validatePostalCode
function.The text was updated successfully, but these errors were encountered: