UNPKG

@stacksjs/ts-validation

Version:

A simple TypeScript starter kit using Bun.

45 lines (43 loc) 4.81 kB
declare type ValidatorFunction = (str: string) => boolean interface Validators { [key: string]: ValidatorFunction } const validators: Validators = { 'cs-CZ': (str: string) => /^[A-FH-NPR-VXYZ0-9](?:-?[A-FH-NPR-VXYZ0-9]){4,7}$/.test(str), 'de-DE': (str: string) => { const districtCodes = '[A-HJ-NPRSVWZ]|AA|AB|AC|AE|AH|AK|AM|AN|AÖ|AP|AS|AT|AU|AW|AZ|BA|BB|BC|BE|BF|BH|BI|BK|BL|BM|BN|BO|BÖ|BS|BT|BZ|CA|CB|CE|CO|CR|CW|DA|DD|DE|DH|DI|DL|DM|DN|DO|DU|DW|DZ|EA|EB|ED|EE|EF|EG|EH|EI|EL|EM|EN|ER|ES|EU|EW|FB|FD|FF|FG|FI|FL|FN|FO|FR|FS|FT|FÜ|FW|FZ|GA|GC|GD|GE|GF|GG|GI|GK|GL|GM|GN|GÖ|GP|GR|GS|GT|GÜ|GV|GW|GZ|HA|HB|HC|HD|HE|HF|HG|HH|HI|HK|HL|HM|HN|HO|HP|HR|HS|HU|HV|HX|HY|HZ|IK|IL|IN|IZ|JE|JL|KA|KB|KC|KE|KF|KG|KH|KI|KK|KL|KM|KN|KO|KR|KS|KT|KU|KW|KY|LA|LB|LC|LD|LF|LG|LH|LI|LL|LM|LN|LÖ|LP|LR|LU|MA|MB|MC|MD|ME|MG|MH|MI|MK|ML|MM|MN|MO|MQ|MR|MS|MÜ|MW|MY|MZ|NB|ND|NE|NF|NH|NI|NK|NM|NÖ|NP|NR|NT|NU|NW|NY|NZ|OA|OB|OC|OD|OE|OF|OG|OH|OK|OL|OP|OS|OZ|PA|PB|PE|PF|PI|PL|PM|PN|PR|PS|PW|PZ|RA|RC|RD|RE|RG|RH|RI|RL|RM|RN|RO|RP|RS|RT|RU|RV|RW|RZ|SB|SC|SE|SG|SI|SK|SL|SM|SN|SO|SP|SR|ST|SU|SW|SY|SZ|TE|TF|TG|TO|TP|TR|TS|TT|TÜ|ÜB|UE|UH|UL|UM|UN|VB|VG|VK|VR|VS|WA|WB|WE|WF|WI|WK|WL|WM|WN|WO|WR|WS|WT|WÜ|WW|WZ|ZE|ZI|ZP|ZR|ZW|ZZ' const specialCodes = 'ABG|ABI|AIB|AIC|ALF|ALZ|ANA|ANG|ANK|APD|ARN|ART|ASL|ASZ|AUR|AZE|BAD|BAR|BBG|BCH|BED|BER|BGD|BGL|BID|BIN|BIR|BIT|BIW|BKS|BLB|BLK|BNA|BOG|BOH|BOR|BOT|BRA|BRB|BRG|BRK|BRL|BRV|BSB|BSK|BTF|BÜD|BUL|BÜR|BÜS|BÜZ|CAS|CHA|CLP|CLZ|COC|COE|CUX|DAH|DAN|DAU|DBR|DEG|DEL|DGF|DIL|DIN|DIZ|DKB|DLG|DON|DUD|DÜW|EBE|EBN|EBS|ECK|EIC|EIL|EIN|EIS|EMD|EMS|ERB|ERH|ERK|ERZ|ESB|ESW|FDB|FDS|FEU|FFB|FKB|FLÖ|FOR|FRG|FRI|FRW|FTL|FÜS|GAN|GAP|GDB|GEL|GEO|GER|GHA|GHC|GLA|GMN|GNT|GOA|GOH|GRA|GRH|GRI|GRM|GRZ|GTH|GUB|GUN|GVM|HAB|HAL|HAM|HAS|HBN|HBS|HCH|HDH|HDL|HEB|HEF|HEI|HER|HET|HGN|HGW|HHM|HIG|HIP|HMÜ|HOG|HOH|HOL|HOM|HOR|HÖS|HOT|HRO|HSK|HST|HVL|HWI|IGB|ILL|JÜL|KEH|KEL|KEM|KIB|KLE|KLZ|KÖN|KÖT|KÖZ|KRU|KÜN|KUS|KYF|LAN|LAU|LBS|LBZ|LDK|LDS|LEO|LER|LEV|LIB|LIF|LIP|LÖB|LOS|LRO|LSZ|LÜN|LUP|LWL|MAB|MAI|MAK|MAL|MED|MEG|MEI|MEK|MEL|MER|MET|MGH|MGN|MHL|MIL|MKK|MOD|MOL|MON|MOS|MSE|MSH|MSP|MST|MTK|MTL|MÜB|MÜR|MYK|MZG|NAB|NAI|NAU|NDH|NEA|NEB|NEC|NEN|NES|NEW|NMB|NMS|NOH|NOL|NOM|NOR|NVP|NWM|OAL|OBB|OBG|OCH|OHA|ÖHR|OHV|OHZ|OPR|OSL|OVI|OVL|OVP|PAF|PAN|PAR|PCH|PEG|PIR|PLÖ|PRÜ|QFT|QLB|RDG|REG|REH|REI|RID|RIE|ROD|ROF|ROK|ROL|ROS|ROT|ROW|RSL|RÜD|RÜG|SAB|SAD|SAN|SAW|SBG|SBK|SCZ|SDH|SDL|SDT|SEB|SEE|SEF|SEL|SFB|SFT|SGH|SHA|SHG|SHK|SHL|SIG|SIM|SLE|SLF|SLK|SLN|SLS|SLÜ|SLZ|SMÜ|SOB|SOG|SOK|SÖM|SON|SPB|SPN|SRB|SRO|STA|STB|STD|STE|STL|SUL|SÜW|SWA|SZB|TBB|TDO|TET|TIR|TÖL|TUT|UEM|UER|UFF|USI|VAI|VEC|VER|VIB|VIE|VIT|VOH|WAF|WAK|WAN|WAR|WAT|WBS|WDA|WEL|WEN|WER|WES|WHV|WIL|WIS|WIT|WIZ|WLG|WMS|WND|WOB|WOH|WOL|WOR|WOS|WRN|WSF|WST|WSW|WTL|WTM|WUG|WÜM|WUN|WUR|WZL|ZEL|ZIG' const pattern = new RegExp(`^(?:${districtCodes})[- ]?[A-Z]{1,2}[- ]?\\d{1,4}|(?:${specialCodes})[- ]?(?:[A-Z][- ]?\\d{1,4}|[A-Z]{2}[- ]?\\d{1,3})[- ]?(?:E|H)?$`) return pattern.test(str) }, 'de-LI': (str: string) => /^FL[- ]?\d{1,5}[UZ]?$/.test(str), 'en-IN': (str: string) => /^[A-Z]{2}[ -]?\d{1,2}[ -]?[A-Z](?:[ -]?[A-Z]*)?[ -]?\d{4}$/.test(str), 'en-SG': (str: string) => /^[A-Z]{3}[ -]?\d{4}[ -]?[A-Z]$/.test(str), 'es-AR': (str: string) => /^(?:[A-Z]{2} ?\d{3} ?[A-Z]{2}|[A-Z]{3} ?\d{3})$/.test(str), 'fi-FI': (str: string) => /^(?=.{4})(?:[A-Z]{1,3}|\d{1,3})[\s-]?(?:[A-Z]{1,3}|\d{1,5})$/.test(str), 'hu-HU': (str: string) => /^((((?!AAA)(([A-NPRSTV-Z])([A-PR-Z])([A-HJ-NPR-Z]))|(A[ABC]I)|A[ABC]O|A[A-W]Q|BPI|BPO|UCO|UDO|XAO)-(?!000)\d{3})|(M\d{6})|((CK|DT|CD|HC|H[ABEFIK-NPRSTVX]|MA|OT|R[A-Z]) \d{2}-\d{2})|(CD \d{3}-\d{3})|(C-(C|X) \d{4})|(X-([ABC]) \d{4})|(([EPVZ]-\d{5}))|(S A[A-Z]{2} \d{2})|(SP \d{2}-\d{2}))$/.test(str), 'pt-BR': (str: string) => /^[A-Z]{3}[ -]?\d[A-Z]\d{2}|[A-Z]{3}[ -]?\d{4}$/.test(str), 'pt-PT': (str: string) => /^(?:[A-Z]{2}|\d{2})[ -·]?(?:[A-Z]{2}|\d{2})[ -·]?(?:[A-Z]{2}|\d{2})$/.test(str), 'sq-AL': (str: string) => /^[A-Z]{2}[- ]?((\d{3}[- ]?(([A-Z]{2})|T))|(R[- ]?\d{3}))$/.test(str), 'sv-SE': (str: string) => /^[A-HJ-PR-UW-Z]{3} ?\d{2}[A-HJ-PR-UW-Z1-9]$|(^[A-ZÅÄÖ ]{2,7}$)/.test(str.trim()), 'en-PK': (str: string) => /(^[A-Z]{2}((\s|-)?)\d{3,4}((\s|-)\d{2})?$)|(^[A-Z]{3}((\s|-)?)\d{3,4}((\s|-)\d{2})?$)|(^[A-Z]{4}((\s|-)?)\d{3,4}((\s|-)\d{2})?$)|(^[A-Z]((\s|-)?)\d{4}((\s|-)\d{2})?$)/.test(str.trim()), } export default function isLicensePlate(str: string, locale: string): boolean { assertString(str) if (locale in validators) { return validators[locale](str) } else if (locale === 'any') { for (const key in validators) { const validator = validators[key] if (validator(str)) { return true } } return false } throw new Error(`Invalid locale '${locale}'`) }