analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
1 lines • 8.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/utils/brazilianFormatters.ts"],"sourcesContent":["/**\n * Tipos de mascara/formatador disponiveis para documentos e contatos brasileiros.\n */\nexport enum MASK_TYPE {\n /** CNPJ - 14 digitos no padrao XX.XXX.XXX/XXXX-XX */\n CNPJ = 'CNPJ',\n /** CPF - 11 digitos no padrao XXX.XXX.XXX-XX */\n CPF = 'CPF',\n /** Telefone brasileiro - 10 ou 11 digitos */\n PHONE = 'PHONE',\n /** CEP - 8 digitos no padrao XXXXX-XXX */\n CEP = 'CEP',\n}\n\n/**\n * Quantidade maxima de digitos aceita por cada tipo de mascara.\n */\nconst MASK_MAX_DIGITS: Record<MASK_TYPE, number> = {\n [MASK_TYPE.CNPJ]: 14,\n [MASK_TYPE.CPF]: 11,\n [MASK_TYPE.PHONE]: 11,\n [MASK_TYPE.CEP]: 8,\n};\n\n/**\n * Extrai todos os digitos do valor sem truncar.\n * Use nos formatters, que validam comprimento exato antes de aplicar o padrao.\n */\nconst extractDigits = (value: string): string => value.replaceAll(/\\D/g, '');\n\n/**\n * Extrai os digitos limitando ao maximo permitido pela mascara.\n * Use nas mascaras progressivas de input (o usuario nao deve conseguir\n * digitar alem do cap).\n */\nconst onlyDigits = (value: string, type: MASK_TYPE): string =>\n extractDigits(value).slice(0, MASK_MAX_DIGITS[type]);\n\n// =====================================================================\n// Formatadores: aplicam a mascara completa quando o valor tem todos os\n// digitos. Use para EXIBIR valores ja armazenados (tabelas, detalhes).\n// =====================================================================\n\n/**\n * Formata um CNPJ completo (14 digitos) no padrao XX.XXX.XXX/XXXX-XX.\n * Caso a entrada nao tenha 14 digitos, retorna o valor original.\n */\nexport function formatCnpj(value: string): string {\n const digits = extractDigits(value);\n if (digits.length !== MASK_MAX_DIGITS[MASK_TYPE.CNPJ]) return value;\n return digits.replace(\n /^(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})$/,\n '$1.$2.$3/$4-$5'\n );\n}\n\n/**\n * Formata um CPF completo (11 digitos) no padrao XXX.XXX.XXX-XX.\n * Caso a entrada nao tenha 11 digitos, retorna o valor original.\n */\nexport function formatCpf(value: string): string {\n const digits = extractDigits(value);\n if (digits.length !== MASK_MAX_DIGITS[MASK_TYPE.CPF]) return value;\n return digits.replace(/^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/, '$1.$2.$3-$4');\n}\n\n/**\n * Formata um telefone brasileiro completo nos padroes:\n * - Celular (11 digitos): (XX) XXXXX-XXXX\n * - Fixo (10 digitos): (XX) XXXX-XXXX\n * Caso a entrada nao tenha 10 ou 11 digitos, retorna o valor original.\n */\nexport function formatPhone(value: string): string {\n const digits = extractDigits(value);\n if (digits.length === 11) {\n return digits.replace(/^(\\d{2})(\\d{5})(\\d{4})$/, '($1) $2-$3');\n }\n if (digits.length === 10) {\n return digits.replace(/^(\\d{2})(\\d{4})(\\d{4})$/, '($1) $2-$3');\n }\n return value;\n}\n\n/**\n * Formata um CEP completo (8 digitos) no padrao XXXXX-XXX.\n * Caso a entrada nao tenha 8 digitos, retorna o valor original.\n */\nexport function formatCep(value: string): string {\n const digits = extractDigits(value);\n if (digits.length !== MASK_MAX_DIGITS[MASK_TYPE.CEP]) return value;\n return digits.replace(/^(\\d{5})(\\d{3})$/, '$1-$2');\n}\n\n// =====================================================================\n// Mascaras progressivas: aplicam o formato parcialmente conforme o\n// usuario digita. Use no onChange de inputs.\n// =====================================================================\n\n/**\n * Aplica mascara progressiva de CNPJ enquanto o usuario digita.\n */\nexport function maskCnpjInput(value: string): string {\n const digits = onlyDigits(value, MASK_TYPE.CNPJ);\n return digits\n .replace(/^(\\d{2})(\\d)/, '$1.$2')\n .replace(/^(\\d{2})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/^(\\d{2})\\.(\\d{3})\\.(\\d{3})(\\d)/, '$1.$2.$3/$4')\n .replace(/^(\\d{2})\\.(\\d{3})\\.(\\d{3})\\/(\\d{4})(\\d)/, '$1.$2.$3/$4-$5');\n}\n\n/**\n * Aplica mascara progressiva de CPF enquanto o usuario digita.\n */\nexport function maskCpfInput(value: string): string {\n const digits = onlyDigits(value, MASK_TYPE.CPF);\n return digits\n .replace(/^(\\d{3})(\\d)/, '$1.$2')\n .replace(/^(\\d{3})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/^(\\d{3})\\.(\\d{3})\\.(\\d{3})(\\d)/, '$1.$2.$3-$4');\n}\n\n/**\n * Aplica mascara progressiva de telefone brasileiro enquanto o usuario digita.\n */\nexport function maskPhoneInput(value: string): string {\n const digits = onlyDigits(value, MASK_TYPE.PHONE);\n if (digits.length === 0) return '';\n if (digits.length <= 2) return `(${digits}`;\n if (digits.length <= 6) return digits.replace(/^(\\d{2})(\\d{0,4})/, '($1) $2');\n if (digits.length <= 10)\n return digits.replace(/^(\\d{2})(\\d{4})(\\d{0,4})/, '($1) $2-$3');\n return digits.replace(/^(\\d{2})(\\d{5})(\\d{0,4})/, '($1) $2-$3');\n}\n\n/**\n * Aplica mascara progressiva de CEP enquanto o usuario digita.\n */\nexport function maskCepInput(value: string): string {\n const digits = onlyDigits(value, MASK_TYPE.CEP);\n return digits.replace(/^(\\d{5})(\\d)/, '$1-$2');\n}\n\n// =====================================================================\n// API generica via enum: util quando o tipo de mascara e dinamico\n// (ex.: input que troca entre CNPJ/CPF baseado em radio).\n// =====================================================================\n\nconst MASKERS: Record<MASK_TYPE, (value: string) => string> = {\n [MASK_TYPE.CNPJ]: maskCnpjInput,\n [MASK_TYPE.CPF]: maskCpfInput,\n [MASK_TYPE.PHONE]: maskPhoneInput,\n [MASK_TYPE.CEP]: maskCepInput,\n};\n\nconst FORMATTERS: Record<MASK_TYPE, (value: string) => string> = {\n [MASK_TYPE.CNPJ]: formatCnpj,\n [MASK_TYPE.CPF]: formatCpf,\n [MASK_TYPE.PHONE]: formatPhone,\n [MASK_TYPE.CEP]: formatCep,\n};\n\n/**\n * Aplica a mascara progressiva do tipo informado (uso em onChange de inputs).\n */\nexport function applyInputMask(value: string, type: MASK_TYPE): string {\n return MASKERS[type](value);\n}\n\n/**\n * Aplica o formatador completo do tipo informado (uso em exibicao).\n */\nexport function formatDocument(value: string, type: MASK_TYPE): string {\n return FORMATTERS[type](value);\n}\n"],"mappings":"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","names":["MASK_TYPE"]}