/** * Хранилище пресетов масок */ type TMaskPreset = Record; type TMaskPresets = Record; type TRubMaskInstance = { value?: string | null; }; let presets: TMaskPresets = { email: { mask: (value: string) => { const regexes = [ /^[a-zA-Z0-9а-яА-Я_.\-+]+$/, /^[a-zA-Z0-9а-яА-Я_.\-+]+@$/, /^[a-zA-Z0-9а-яА-Я_.\-+]+@[a-zA-Z0-9а-яА-Я-]+$/, /^[a-zA-Z0-9а-яА-Я_.\-+]+@[a-zA-Z0-9а-яА-Я-]+\.$/, /^[a-zA-Z0-9а-яА-Я_.\-+]+@[a-zA-Z0-9а-яА-Я-]+\.[a-zA-Z0-9а-яА-Я-]{1,63}$/, /^[a-zA-Z0-9а-яА-Я_.\-+]+@[a-zA-Z0-9а-яА-Я-]+\.[a-zA-Z0-9а-яА-Я-]{1,63}\.$/, /^[a-zA-Z0-9а-яА-Я_.\-+]+@[a-zA-Z0-9а-яА-Я-]+\.[a-zA-Z0-9а-яА-Я-]{1,63}\.[a-zA-Z0-9а-яА-Я]{1,63}$/, ]; return regexes.some((regex) => regex.test(value)); }, }, "phone": { mask: "+{7} (000) 000-00-00", unmask: true, }, "digits": { mask: /^\d+$/, }, "number": { mask: Number, thousandsSeparator: " ", unmask: true, }, "date": { mask: Date, lazy: true, autofix: false, pattern: "d{.}`m{.}`Y", }, "rub": { mask: "{num} ₽", unmask: true, prepare: (val: string, mask: TRubMaskInstance) => { const currentValue = mask.value; if (currentValue && !currentValue.endsWith("₽")) { return val + " ₽"; } else { return val; } }, blocks: { num: { unmask: true, mask: Number, thousandsSeparator: " ", radix: ".", scale: 2, padFractionalZeros: true, normalizeZeros: true, signed: false, }, }, }, "letters": { mask: /^[A-Za-zА-яёЁ\s-]+$/, }, }; /** * Дополняет или перезаписывает существующие пресеты */ const setPresets = (value: TMaskPresets = {}) => { presets = { ...presets, ...value, }; }; export { presets, setPresets, type TMaskPreset, type TMaskPresets, };