@br-validators/core
Advanced tools
| import { k as PixKey, l as PixKeyType, V as ValidationErrorCode, d as BrCodeValidationResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { c as BrCodePayload } from './validation-result-C-Ei-lZH.js'; | ||
| /** Bacen Manual BR Code — EMV-QRCPS-MPM TLV + CRC16-CCITT */ | ||
| declare const BRCODE_OFFICIAL_SOURCE_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf"; | ||
| declare const BRCODE_PIX_INITIATION_MANUAL_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf"; | ||
| /** Manual de Padrões PIX — static QR, EVP key (CRC 1D3D). */ | ||
| declare const BRCODE_GOLDEN_STATIC_EVP = "00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-4266554400005204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***63041D3D"; | ||
| /** Manual de Padrões PIX — dynamic QR with amount (CRC 7309). */ | ||
| declare const BRCODE_GOLDEN_DYNAMIC_URL = "00020101021226730014br.gov.bcb.pix2551pix.example.com/v2/8b3da2f39a4140d1a91abd93113bd4415204000053039865406123.455802BR5913Fulano de Tal6008BRASILIA62190515RP12345678-201963047309"; | ||
| /** Manual BR Code — composite payload with PIX + other arranjos (CRC AD38). */ | ||
| declare const BRCODE_GOLDEN_COMPOSITE = "00020104141234567890123426580014BR.GOV.BCB.PIX0136123e4567-e12b-12d1-a456-42665544000027300012BR.COM.OUTRO011001234567895204000053039865406123.455802BR5917NOME DO RECEBEDOR6008BRASILIA61087007490062190515RP12345678-201980390012BR.COM.OUTRO01190123.ABCD.3456.WXYZ6304AD38"; | ||
| /** Golden CPF PIX key 12345678909 — CRC computed per manual algorithm. */ | ||
| declare const BRCODE_GOLDEN_STATIC_CPF = "00020126330014br.gov.bcb.pix0111123456789095204000053039865802BR5917NOME DO RECEBEDOR6009SAO PAULO62070503***6304258E"; | ||
| /** Golden email pix@bcb.gov.br — CRC computed per manual algorithm. */ | ||
| declare const BRCODE_GOLDEN_STATIC_EMAIL = "00020126360014br.gov.bcb.pix0114pix@bcb.gov.br5204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***6304A7E9"; | ||
| /** CRC16-CCITT-FALSE — polynomial 0x1021, initial 0xFFFF (Bacen Manual BR Code). */ | ||
| declare function computeCrc16Ccitt(payload: string): string; | ||
| declare function verifyBrCodeCrc(payload: string): { | ||
| ok: true; | ||
| } | { | ||
| ok: false; | ||
| message: string; | ||
| }; | ||
| type BrCodeParsedFields = { | ||
| merchantName: string; | ||
| merchantCity: string; | ||
| amount?: string; | ||
| txid?: string; | ||
| pixKey?: PixKey; | ||
| pixKeyType?: PixKeyType; | ||
| pixInitiationUrl?: string; | ||
| }; | ||
| type BrCodeParseFailure = { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| }; | ||
| type BrCodeParseSuccess = { | ||
| ok: true; | ||
| payload: string; | ||
| fields: BrCodeParsedFields; | ||
| }; | ||
| type BrCodeParseResult = BrCodeParseSuccess | BrCodeParseFailure; | ||
| declare function normalizeBrCodePayload(input: string): string; | ||
| declare function parseBrCodePayload(input: string): BrCodeParseResult; | ||
| type TlvField = { | ||
| id: string; | ||
| value: string; | ||
| }; | ||
| type TlvParseFailure = { | ||
| ok: false; | ||
| message: string; | ||
| }; | ||
| type TlvParseSuccess = { | ||
| ok: true; | ||
| fields: TlvField[]; | ||
| }; | ||
| type TlvParseResult = TlvParseSuccess | TlvParseFailure; | ||
| declare function parseTlvSequence(data: string): TlvParseResult; | ||
| declare function findTlvField(fields: TlvField[], id: string): string | undefined; | ||
| declare function findPixMerchantAccount(fields: TlvField[]): { | ||
| value: string; | ||
| nestedFields: TlvField[]; | ||
| } | undefined; | ||
| /** | ||
| * BR Code (PIX QR) payload parsing — EMV TLV + CRC16-CCITT. | ||
| * @see https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf | ||
| */ | ||
| declare function isValidBrCode(input: string): boolean; | ||
| declare function parseBrCode(input: string): BrCodeValidationResult; | ||
| declare function validateBrCode(input: string): BrCodeValidationResult; | ||
| export { BRCODE_GOLDEN_COMPOSITE, BRCODE_GOLDEN_DYNAMIC_URL, BRCODE_GOLDEN_STATIC_CPF, BRCODE_GOLDEN_STATIC_EMAIL, BRCODE_GOLDEN_STATIC_EVP, BRCODE_OFFICIAL_SOURCE_URL, BRCODE_PIX_INITIATION_MANUAL_URL, type BrCodeParseResult, type BrCodeParsedFields, BrCodeValidationResult, PixKeyType, type TlvField, type TlvParseResult, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc }; |
| export { BRCODE_GOLDEN_COMPOSITE, BRCODE_GOLDEN_DYNAMIC_URL, BRCODE_GOLDEN_STATIC_CPF, BRCODE_GOLDEN_STATIC_EMAIL, BRCODE_GOLDEN_STATIC_EVP, BRCODE_OFFICIAL_SOURCE_URL, BRCODE_PIX_INITIATION_MANUAL_URL, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc } from './chunk-GEHAH4OH.js'; | ||
| import './chunk-D5JMGN7U.js'; | ||
| import './chunk-UE4PVN6Y.js'; | ||
| import './chunk-EB3G4IG6.js'; | ||
| import './chunk-5BBNLRZP.js'; | ||
| import './chunk-UCJPSJN5.js'; | ||
| import './chunk-B2TDI3YS.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=brcode.js.map | ||
| //# sourceMappingURL=brcode.js.map |
| {"version":3,"sources":[],"names":[],"mappings":"","file":"brcode.js"} |
| import { stripPlaca } from './chunk-W6UXVWSR.js'; | ||
| import { brandPlaca } from './chunk-BBL6ZPXH.js'; | ||
| // src/core/placa/constants.ts | ||
| var PLACA_LENGTH = 7; | ||
| var PLACA_LEGACY_PATTERN = /^[A-Z]{3}[0-9]{4}$/; | ||
| var PLACA_MERCOSUL_PATTERN = /^[A-Z]{3}[0-9][A-Z0-9][0-9]{2}$/; | ||
| var PLACA_LEGACY_TO_MERCOSUL_MAP = { | ||
| "0": "A", | ||
| "1": "B", | ||
| "2": "C", | ||
| "3": "D", | ||
| "4": "E", | ||
| "5": "F", | ||
| "6": "G", | ||
| "7": "H", | ||
| "8": "I", | ||
| "9": "J" | ||
| }; | ||
| var PLACA_GOLDEN_MERCOSUL = "ABC1D23"; | ||
| var PLACA_GOLDEN_LEGACY = "ABC1234"; | ||
| var PLACA_GOLDEN_CONVERSION_FROM = "ABC1234"; | ||
| var PLACA_GOLDEN_CONVERSION_TO = "ABC1C34"; | ||
| var PLACA_OFFICIAL_SOURCE_URL = "https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf"; | ||
| // src/core/placa/detect.ts | ||
| function detectPlacaFormat(input) { | ||
| const stripped = stripPlaca(input); | ||
| if (stripped.length !== PLACA_LENGTH) { | ||
| return "unknown"; | ||
| } | ||
| if (PLACA_LEGACY_PATTERN.test(stripped)) { | ||
| return "legacy"; | ||
| } | ||
| if (PLACA_MERCOSUL_PATTERN.test(stripped)) { | ||
| return "mercosul"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/placa/legacy.ts | ||
| function isValidPlacaLegacy(input) { | ||
| const stripped = stripPlaca(input); | ||
| return PLACA_LEGACY_PATTERN.test(stripped); | ||
| } | ||
| // src/core/placa/mercosul.ts | ||
| function isValidPlacaMercosul(input) { | ||
| const stripped = stripPlaca(input); | ||
| return PLACA_MERCOSUL_PATTERN.test(stripped); | ||
| } | ||
| // src/core/placa/convert.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function convertPlacaToMercosul(input) { | ||
| const stripped = stripPlaca(input); | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "Placa input is empty"); | ||
| } | ||
| if (detectPlacaFormat(input) !== "legacy") { | ||
| return failure("UNSUPPORTED_FORMAT", "Conversion requires a valid legacy plate (LLLNNNN)"); | ||
| } | ||
| const prefix = stripped.slice(0, 4); | ||
| const mapped = PLACA_LEGACY_TO_MERCOSUL_MAP[stripped.charAt(4)]; | ||
| const suffix = stripped.slice(5); | ||
| return { ok: true, formatted: `${prefix}${mapped}${suffix}` }; | ||
| } | ||
| // src/core/placa/index.ts | ||
| function failure2(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure2("EMPTY_INPUT", "Placa input is empty"); | ||
| } | ||
| const withoutSeparators = input.replace(/[-\s]/g, ""); | ||
| if (/[^A-Za-z0-9]/.test(withoutSeparators)) { | ||
| return failure2("INVALID_CHARACTER", "Placa contains invalid characters"); | ||
| } | ||
| if (stripped.length !== PLACA_LENGTH) { | ||
| return failure2("INVALID_LENGTH", `Placa must have ${PLACA_LENGTH} characters after normalization`); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidPlaca(input) { | ||
| return validatePlaca(input).ok; | ||
| } | ||
| function validatePlaca(input) { | ||
| const stripped = stripPlaca(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| const format = detectPlacaFormat(input); | ||
| if (format === "unknown") { | ||
| return failure2("UNSUPPORTED_FORMAT", "Placa does not match legacy or Mercosul format"); | ||
| } | ||
| return { ok: true, value: brandPlaca(stripped), format }; | ||
| } | ||
| // src/format/placa.ts | ||
| function formatPlaca(input) { | ||
| const result = validatePlaca(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: result.value }; | ||
| } | ||
| export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, formatPlaca, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca }; | ||
| //# sourceMappingURL=chunk-2KTD23PD.js.map | ||
| //# sourceMappingURL=chunk-2KTD23PD.js.map |
| {"version":3,"sources":["../src/core/placa/constants.ts","../src/core/placa/detect.ts","../src/core/placa/legacy.ts","../src/core/placa/mercosul.ts","../src/core/placa/convert.ts","../src/core/placa/index.ts","../src/format/placa.ts"],"names":["failure"],"mappings":"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","file":"chunk-2KTD23PD.js","sourcesContent":["/**\n * License plate patterns — CONTRAN 729/2018 (legacy + Mercosul).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n * @see docs/use-cases/UC-004-validate-placa.md — golden vectors ABC1D23, ABC1234\n */\nexport const PLACA_LENGTH = 7;\nexport const PLACA_LEGACY_PATTERN = /^[A-Z]{3}[0-9]{4}$/;\nexport const PLACA_MERCOSUL_PATTERN = /^[A-Z]{3}[0-9][A-Z0-9][0-9]{2}$/;\nexport const PLACA_LEGACY_TO_MERCOSUL_MAP: Record<string, string> = {\n '0': 'A',\n '1': 'B',\n '2': 'C',\n '3': 'D',\n '4': 'E',\n '5': 'F',\n '6': 'G',\n '7': 'H',\n '8': 'I',\n '9': 'J',\n};\nexport const PLACA_GOLDEN_MERCOSUL = 'ABC1D23';\nexport const PLACA_GOLDEN_LEGACY = 'ABC1234';\nexport const PLACA_GOLDEN_CONVERSION_FROM = 'ABC1234';\nexport const PLACA_GOLDEN_CONVERSION_TO = 'ABC1C34';\nexport const PLACA_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf';\n","/**\n * License plate format detection — legacy vs Mercosul (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LENGTH, PLACA_LEGACY_PATTERN, PLACA_MERCOSUL_PATTERN } from './constants.js';\n\nexport type PlacaFormat = 'legacy' | 'mercosul' | 'unknown';\n\nexport function detectPlacaFormat(input: string): PlacaFormat {\n const stripped = stripPlaca(input);\n if (stripped.length !== PLACA_LENGTH) {\n return 'unknown';\n }\n if (PLACA_LEGACY_PATTERN.test(stripped)) {\n return 'legacy';\n }\n if (PLACA_MERCOSUL_PATTERN.test(stripped)) {\n return 'mercosul';\n }\n return 'unknown';\n}\n","/**\n * License plate — legacy format LLLNNNN (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LEGACY_PATTERN } from './constants.js';\n\nexport function isValidPlacaLegacy(input: string): boolean {\n const stripped = stripPlaca(input);\n return PLACA_LEGACY_PATTERN.test(stripped);\n}\n","/**\n * License plate — Mercosul format LLLNLNN (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_MERCOSUL_PATTERN } from './constants.js';\n\nexport function isValidPlacaMercosul(input: string): boolean {\n const stripped = stripPlaca(input);\n return PLACA_MERCOSUL_PATTERN.test(stripped);\n}\n","/**\n * Legacy → Mercosul plate conversion (CONTRAN digit-to-letter table).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport type { FormatResult } from '../../types/validation-result.js';\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LEGACY_TO_MERCOSUL_MAP } from './constants.js';\nimport { detectPlacaFormat } from './detect.js';\n\ntype FailedResult = Extract<FormatResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nexport function convertPlacaToMercosul(input: string): FormatResult {\n const stripped = stripPlaca(input);\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Placa input is empty');\n }\n\n if (detectPlacaFormat(input) !== 'legacy') {\n return failure('UNSUPPORTED_FORMAT', 'Conversion requires a valid legacy plate (LLLNNNN)');\n }\n\n const prefix = stripped.slice(0, 4);\n const mapped = PLACA_LEGACY_TO_MERCOSUL_MAP[stripped.charAt(4)];\n const suffix = stripped.slice(5);\n return { ok: true, formatted: `${prefix}${mapped}${suffix}` };\n}\n","/**\n * License plate validation — legacy (LLLNNNN) + Mercosul (LLLNLNN). CONTRAN 729/2018.\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n * @see docs/use-cases/UC-004-validate-placa.md — golden vectors ABC1D23, ABC1234\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport type { DocumentFormat, Placa, ValidationResult } from '../../types/validation-result.js';\nimport { brandPlaca } from '../../types/validation-result.js';\nimport { detectPlacaFormat } from './detect.js';\nimport { PLACA_LENGTH } from './constants.js';\n\nexport {\n PLACA_GOLDEN_CONVERSION_FROM,\n PLACA_GOLDEN_CONVERSION_TO,\n PLACA_GOLDEN_LEGACY,\n PLACA_GOLDEN_MERCOSUL,\n PLACA_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { detectPlacaFormat, type PlacaFormat } from './detect.js';\nexport { isValidPlacaLegacy } from './legacy.js';\nexport { isValidPlacaMercosul } from './mercosul.js';\nexport { convertPlacaToMercosul } from './convert.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Placa input is empty');\n }\n\n const withoutSeparators = input.replace(/[-\\s]/g, '');\n if (/[^A-Za-z0-9]/.test(withoutSeparators)) {\n return failure('INVALID_CHARACTER', 'Placa contains invalid characters');\n }\n\n if (stripped.length !== PLACA_LENGTH) {\n return failure('INVALID_LENGTH', `Placa must have ${PLACA_LENGTH} characters after normalization`);\n }\n\n return null;\n}\n\nexport function isValidPlaca(input: string): boolean {\n return validatePlaca(input).ok;\n}\n\nexport function validatePlaca(input: string): ValidationResult<Placa> {\n const stripped = stripPlaca(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n const format = detectPlacaFormat(input);\n if (format === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'Placa does not match legacy or Mercosul format');\n }\n\n return { ok: true, value: brandPlaca(stripped), format: format as DocumentFormat };\n}\n","import { validatePlaca } from '../core/placa/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatPlaca(input: string): FormatResult {\n const result = validatePlaca(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: result.value };\n}\n"]} |
| import { brandTelefone } from './chunk-BBL6ZPXH.js'; | ||
| // src/core/telefone/constants.ts | ||
| var TELEFONE_COUNTRY_CODE = "55"; | ||
| var ANATEL_DDDS = [ | ||
| "11", | ||
| "12", | ||
| "13", | ||
| "14", | ||
| "15", | ||
| "16", | ||
| "17", | ||
| "18", | ||
| "19", | ||
| "21", | ||
| "22", | ||
| "24", | ||
| "27", | ||
| "28", | ||
| "31", | ||
| "32", | ||
| "33", | ||
| "34", | ||
| "35", | ||
| "37", | ||
| "38", | ||
| "41", | ||
| "42", | ||
| "43", | ||
| "44", | ||
| "45", | ||
| "46", | ||
| "47", | ||
| "48", | ||
| "49", | ||
| "51", | ||
| "53", | ||
| "54", | ||
| "55", | ||
| "61", | ||
| "62", | ||
| "64", | ||
| "63", | ||
| "65", | ||
| "66", | ||
| "67", | ||
| "68", | ||
| "69", | ||
| "71", | ||
| "73", | ||
| "74", | ||
| "75", | ||
| "77", | ||
| "79", | ||
| "81", | ||
| "87", | ||
| "82", | ||
| "83", | ||
| "84", | ||
| "85", | ||
| "88", | ||
| "86", | ||
| "89", | ||
| "91", | ||
| "93", | ||
| "94", | ||
| "92", | ||
| "97", | ||
| "95", | ||
| "96", | ||
| "98", | ||
| "99" | ||
| ]; | ||
| var ANATEL_DDD_SET = new Set(ANATEL_DDDS); | ||
| var TELEFONE_DDD_LENGTH = 2; | ||
| var TELEFONE_CELULAR_MASK_PATTERN = /^(\d{2})(\d{5})(\d{4})$/; | ||
| var TELEFONE_FIXO_MASK_PATTERN = /^(\d{2})(\d{4})(\d{4})$/; | ||
| var TELEFONE_EMERGENCY_CODES = /* @__PURE__ */ new Set(["190", "192", "193", "197", "198", "199"]); | ||
| var TELEFONE_GOLDEN_CELULAR = "11999999999"; | ||
| var TELEFONE_GOLDEN_CELULAR_MASKED = "(11) 99999-9999"; | ||
| var TELEFONE_GOLDEN_FIXO = "1133333333"; | ||
| var TELEFONE_GOLDEN_FIXO_MASKED = "(11) 3333-3333"; | ||
| var TELEFONE_OFFICIAL_SOURCE_URL = "https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro"; | ||
| var TELEFONE_ANATEL_DDD_PANEL_URL = "https://informacoes.anatel.gov.br/paineis/areas-tarifarias/codigos-nacionais"; | ||
| // src/strip/telefone.ts | ||
| function extractTelefoneDigits(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function normalizeTelefoneDigits(input) { | ||
| let digits = extractTelefoneDigits(input); | ||
| if (digits.length === 0) { | ||
| return ""; | ||
| } | ||
| if (digits.startsWith(TELEFONE_COUNTRY_CODE) && (digits.length === 12 || digits.length === 13)) { | ||
| digits = digits.slice(TELEFONE_COUNTRY_CODE.length); | ||
| } | ||
| if (digits.startsWith("0") && (digits.length === 11 || digits.length === 12)) { | ||
| digits = digits.slice(1); | ||
| } | ||
| return digits; | ||
| } | ||
| function stripTelefone(input) { | ||
| return normalizeTelefoneDigits(input); | ||
| } | ||
| // src/core/telefone/index.ts | ||
| var MASK_CHARS_PATTERN = /[\s().+-]/g; | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function hasInvalidCharacters(input) { | ||
| const withoutMask = input.replace(MASK_CHARS_PATTERN, ""); | ||
| return /[^0-9]/.test(withoutMask); | ||
| } | ||
| function detectTipo(local) { | ||
| if (local.length === 9 && local[0] === "9") { | ||
| return "celular"; | ||
| } | ||
| if (local.length === 8 && /^[2345]/.test(local)) { | ||
| return "fixo"; | ||
| } | ||
| return null; | ||
| } | ||
| function rejectLocalPattern(local, nationalLength) { | ||
| if (nationalLength === 11) { | ||
| return failure( | ||
| "KNOWN_INVALID_PATTERN", | ||
| "Mobile numbers must have 9 digits starting with 9 after DDD (Anatel nono d\xEDgito)" | ||
| ); | ||
| } | ||
| if (nationalLength === 10 && /^[6789]/.test(local)) { | ||
| return failure( | ||
| "KNOWN_INVALID_PATTERN", | ||
| "Mobile numbers require 9 digits starting with 9; numbers starting with 6\u20139 without the 9th digit are invalid" | ||
| ); | ||
| } | ||
| return failure( | ||
| "KNOWN_INVALID_PATTERN", | ||
| "Landline numbers must have 8 digits starting with 2, 3, 4, or 5 after DDD" | ||
| ); | ||
| } | ||
| function validateStructure(input, normalized) { | ||
| if (input.trim().length === 0) { | ||
| return failure("EMPTY_INPUT", "Telephone input is empty"); | ||
| } | ||
| if (hasInvalidCharacters(input)) { | ||
| return failure("INVALID_CHARACTER", "Telephone contains invalid characters"); | ||
| } | ||
| if (normalized.length === 0) { | ||
| return failure("EMPTY_INPUT", "Telephone input is empty"); | ||
| } | ||
| if (TELEFONE_EMERGENCY_CODES.has(normalized)) { | ||
| return failure("UNSUPPORTED_FORMAT", "Emergency short codes are not subscriber telephone numbers"); | ||
| } | ||
| if (normalized.length !== 10 && normalized.length !== 11) { | ||
| return failure( | ||
| "INVALID_LENGTH", | ||
| "Telephone must have 10 digits (fixo) or 11 digits (celular) after normalization" | ||
| ); | ||
| } | ||
| const ddd = normalized.slice(0, TELEFONE_DDD_LENGTH); | ||
| if (!ANATEL_DDD_SET.has(ddd)) { | ||
| return failure("KNOWN_INVALID_PATTERN", `Area code ${ddd} is not a valid Anatel DDD`); | ||
| } | ||
| const local = normalized.slice(TELEFONE_DDD_LENGTH); | ||
| const tipo = detectTipo(local); | ||
| if (!tipo) { | ||
| return rejectLocalPattern(local, normalized.length); | ||
| } | ||
| return { tipo }; | ||
| } | ||
| function isValidTelefone(input) { | ||
| return validateTelefone(input).ok; | ||
| } | ||
| function validateTelefone(input) { | ||
| const normalized = normalizeTelefoneDigits(input); | ||
| const structural = validateStructure(input, normalized); | ||
| if ("ok" in structural) { | ||
| return structural; | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandTelefone(normalized), | ||
| tipo: structural.tipo, | ||
| format: "telefone" | ||
| }; | ||
| } | ||
| // src/core/telefone/mask.ts | ||
| function applyTelefoneMask(canonical, tipo) { | ||
| const pattern = tipo === "celular" ? TELEFONE_CELULAR_MASK_PATTERN : TELEFONE_FIXO_MASK_PATTERN; | ||
| const match = pattern.exec(canonical); | ||
| if (!match) { | ||
| throw new Error(`Telephone must have valid ${tipo} length to apply mask`); | ||
| } | ||
| return `(${match[1]}) ${match[2]}-${match[3]}`; | ||
| } | ||
| // src/format/telefone.ts | ||
| function formatTelefone(input) { | ||
| const result = validateTelefone(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyTelefoneMask(result.value, result.tipo) }; | ||
| } | ||
| export { ANATEL_DDDS, ANATEL_DDD_SET, TELEFONE_ANATEL_DDD_PANEL_URL, TELEFONE_GOLDEN_CELULAR, TELEFONE_GOLDEN_CELULAR_MASKED, TELEFONE_GOLDEN_FIXO, TELEFONE_GOLDEN_FIXO_MASKED, TELEFONE_OFFICIAL_SOURCE_URL, extractTelefoneDigits, formatTelefone, isValidTelefone, normalizeTelefoneDigits, stripTelefone, validateTelefone }; | ||
| //# sourceMappingURL=chunk-465IC76U.js.map | ||
| //# sourceMappingURL=chunk-465IC76U.js.map |
| {"version":3,"sources":["../src/core/telefone/constants.ts","../src/strip/telefone.ts","../src/core/telefone/index.ts","../src/core/telefone/mask.ts","../src/format/telefone.ts"],"names":[],"mappings":"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","file":"chunk-465IC76U.js","sourcesContent":["/**\n * Brazilian telephone constants — Anatel national area codes (CN/DDD).\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro\n * @see https://informacoes.anatel.gov.br/paineis/areas-tarifarias/codigos-nacionais\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/nono-digito\n */\nexport const TELEFONE_COUNTRY_CODE = '55';\n\n/** 67 official Anatel national area codes (CN / DDD). */\nexport const ANATEL_DDDS = [\n '11', '12', '13', '14', '15', '16', '17', '18', '19',\n '21', '22', '24',\n '27', '28',\n '31', '32', '33', '34', '35', '37', '38',\n '41', '42', '43', '44', '45', '46',\n '47', '48', '49',\n '51', '53', '54', '55',\n '61',\n '62', '64',\n '63',\n '65', '66',\n '67',\n '68',\n '69',\n '71', '73', '74', '75', '77',\n '79',\n '81', '87',\n '82',\n '83',\n '84',\n '85', '88',\n '86', '89',\n '91', '93', '94',\n '92', '97',\n '95',\n '96',\n '98', '99',\n] as const;\n\nexport const ANATEL_DDD_SET: ReadonlySet<string> = new Set(ANATEL_DDDS);\n\nexport const TELEFONE_CELULAR_LOCAL_LENGTH = 9;\nexport const TELEFONE_FIXO_LOCAL_LENGTH = 8;\nexport const TELEFONE_DDD_LENGTH = 2;\n\nexport const TELEFONE_CELULAR_MASK_PATTERN = /^(\\d{2})(\\d{5})(\\d{4})$/;\nexport const TELEFONE_FIXO_MASK_PATTERN = /^(\\d{2})(\\d{4})(\\d{4})$/;\n\n/** Emergency / public utility short codes — out of subscriber scope (BR-TEL-007). */\nexport const TELEFONE_EMERGENCY_CODES = new Set(['190', '192', '193', '197', '198', '199']);\n\nexport const TELEFONE_GOLDEN_CELULAR = '11999999999';\nexport const TELEFONE_GOLDEN_CELULAR_MASKED = '(11) 99999-9999';\nexport const TELEFONE_GOLDEN_FIXO = '1133333333';\nexport const TELEFONE_GOLDEN_FIXO_MASKED = '(11) 3333-3333';\n\nexport const TELEFONE_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro';\n\nexport const TELEFONE_ANATEL_DDD_PANEL_URL =\n 'https://informacoes.anatel.gov.br/paineis/areas-tarifarias/codigos-nacionais';\n","/**\n * Strip and normalize Brazilian telephone numbers (BR-TEL-001).\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro\n */\nimport { TELEFONE_COUNTRY_CODE } from '../core/telefone/constants.js';\n\n/** Digits only from input (no country/trunk normalization). */\nexport function extractTelefoneDigits(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\n/**\n * National canonical form: DDD + local digits (10 or 11 digits).\n * Strips +55 country code and leading domestic trunk `0` when present.\n */\nexport function normalizeTelefoneDigits(input: string): string {\n let digits = extractTelefoneDigits(input);\n if (digits.length === 0) {\n return '';\n }\n\n if (digits.startsWith(TELEFONE_COUNTRY_CODE) && (digits.length === 12 || digits.length === 13)) {\n digits = digits.slice(TELEFONE_COUNTRY_CODE.length);\n }\n\n if (digits.startsWith('0') && (digits.length === 11 || digits.length === 12)) {\n digits = digits.slice(1);\n }\n\n return digits;\n}\n\n/** @see normalizeTelefoneDigits */\nexport function stripTelefone(input: string): string {\n return normalizeTelefoneDigits(input);\n}\n","/**\n * Brazilian telephone validation — Anatel DDD + fixo/celular structure.\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/nono-digito\n */\nimport { normalizeTelefoneDigits } from '../../strip/telefone.js';\nimport type { TelefoneTipo, TelefoneValidationResult } from '../../types/validation-result.js';\nimport { brandTelefone } from '../../types/validation-result.js';\nimport {\n ANATEL_DDD_SET,\n TELEFONE_DDD_LENGTH,\n TELEFONE_EMERGENCY_CODES,\n} from './constants.js';\n\nexport {\n ANATEL_DDDS,\n ANATEL_DDD_SET,\n TELEFONE_ANATEL_DDD_PANEL_URL,\n TELEFONE_GOLDEN_CELULAR,\n TELEFONE_GOLDEN_CELULAR_MASKED,\n TELEFONE_GOLDEN_FIXO,\n TELEFONE_GOLDEN_FIXO_MASKED,\n TELEFONE_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<TelefoneValidationResult, { ok: false }>;\n\nconst MASK_CHARS_PATTERN = /[\\s().+-]/g;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction hasInvalidCharacters(input: string): boolean {\n const withoutMask = input.replace(MASK_CHARS_PATTERN, '');\n return /[^0-9]/.test(withoutMask);\n}\n\nfunction detectTipo(local: string): TelefoneTipo | null {\n if (local.length === 9 && local[0] === '9') {\n return 'celular';\n }\n if (local.length === 8 && /^[2345]/.test(local)) {\n return 'fixo';\n }\n return null;\n}\n\nfunction rejectLocalPattern(local: string, nationalLength: number): FailedResult {\n if (nationalLength === 11) {\n return failure(\n 'KNOWN_INVALID_PATTERN',\n 'Mobile numbers must have 9 digits starting with 9 after DDD (Anatel nono dígito)',\n );\n }\n\n if (nationalLength === 10 && /^[6789]/.test(local)) {\n return failure(\n 'KNOWN_INVALID_PATTERN',\n 'Mobile numbers require 9 digits starting with 9; numbers starting with 6–9 without the 9th digit are invalid',\n );\n }\n\n return failure(\n 'KNOWN_INVALID_PATTERN',\n 'Landline numbers must have 8 digits starting with 2, 3, 4, or 5 after DDD',\n );\n}\n\nfunction validateStructure(\n input: string,\n normalized: string,\n): FailedResult | { tipo: TelefoneTipo } {\n if (input.trim().length === 0) {\n return failure('EMPTY_INPUT', 'Telephone input is empty');\n }\n\n if (hasInvalidCharacters(input)) {\n return failure('INVALID_CHARACTER', 'Telephone contains invalid characters');\n }\n\n if (normalized.length === 0) {\n return failure('EMPTY_INPUT', 'Telephone input is empty');\n }\n\n if (TELEFONE_EMERGENCY_CODES.has(normalized)) {\n return failure('UNSUPPORTED_FORMAT', 'Emergency short codes are not subscriber telephone numbers');\n }\n\n if (normalized.length !== 10 && normalized.length !== 11) {\n return failure(\n 'INVALID_LENGTH',\n 'Telephone must have 10 digits (fixo) or 11 digits (celular) after normalization',\n );\n }\n\n const ddd = normalized.slice(0, TELEFONE_DDD_LENGTH);\n if (!ANATEL_DDD_SET.has(ddd)) {\n return failure('KNOWN_INVALID_PATTERN', `Area code ${ddd} is not a valid Anatel DDD`);\n }\n\n const local = normalized.slice(TELEFONE_DDD_LENGTH);\n const tipo = detectTipo(local);\n if (!tipo) {\n return rejectLocalPattern(local, normalized.length);\n }\n\n return { tipo };\n}\n\nexport function isValidTelefone(input: string): boolean {\n return validateTelefone(input).ok;\n}\n\nexport function validateTelefone(input: string): TelefoneValidationResult {\n const normalized = normalizeTelefoneDigits(input);\n const structural = validateStructure(input, normalized);\n if ('ok' in structural) {\n return structural;\n }\n\n return {\n ok: true,\n value: brandTelefone(normalized),\n tipo: structural.tipo,\n format: 'telefone',\n };\n}\n","import {\n TELEFONE_CELULAR_MASK_PATTERN,\n TELEFONE_FIXO_MASK_PATTERN,\n} from './constants.js';\nimport type { TelefoneTipo } from '../../types/validation-result.js';\n\n/** Mask (DD) 9XXXX-XXXX or (DD) XXXX-XXXX per Anatel E.164 layout. */\nexport function applyTelefoneMask(canonical: string, tipo: TelefoneTipo): string {\n const pattern = tipo === 'celular' ? TELEFONE_CELULAR_MASK_PATTERN : TELEFONE_FIXO_MASK_PATTERN;\n const match = pattern.exec(canonical);\n if (!match) {\n throw new Error(`Telephone must have valid ${tipo} length to apply mask`);\n }\n return `(${match[1]}) ${match[2]}-${match[3]}`;\n}\n","import { applyTelefoneMask } from '../core/telefone/mask.js';\nimport { validateTelefone } from '../core/telefone/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatTelefone(input: string): FormatResult {\n const result = validateTelefone(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyTelefoneMask(result.value, result.tipo) };\n}\n"]} |
| import { stripCpf } from './chunk-UCJPSJN5.js'; | ||
| import { computeCheckDigit } from './chunk-B2TDI3YS.js'; | ||
| import { brandCpf } from './chunk-BBL6ZPXH.js'; | ||
| // src/core/cpf/constants.ts | ||
| var CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var CPF_DV2_WEIGHTS = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var CPF_LENGTH = 11; | ||
| var CPF_BASE_LENGTH = 9; | ||
| var CPF_MASK_PATTERN = /^(\d{3})(\d{3})(\d{3})(\d{2})$/; | ||
| var CPF_GOLDEN_PRIMARY = "12345678909"; | ||
| var CPF_GOLDEN_SECONDARY = "11144477735"; | ||
| var CPF_GOLDEN_PRIMARY_MASKED = "123.456.789-09"; | ||
| var CPF_OFFICIAL_SOURCE_URL = "https://www.gov.br/receitafederal/pt-br/assuntos/cpf"; | ||
| // src/core/cpf/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function digitValue(char) { | ||
| return Number(char); | ||
| } | ||
| function hasRepeatedDigits(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function isValidCpfChecksum(stripped) { | ||
| const base = stripped.slice(0, CPF_BASE_LENGTH); | ||
| const dv1Expected = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue)); | ||
| const dv2Expected = String( | ||
| computeCheckDigit(base + dv1Expected, CPF_DV2_WEIGHTS, digitValue) | ||
| ); | ||
| return stripped.slice(CPF_BASE_LENGTH) === dv1Expected + dv2Expected; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "CPF input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[.-]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "CPF contains invalid characters"); | ||
| } | ||
| if (stripped.length !== CPF_LENGTH) { | ||
| return failure("INVALID_LENGTH", `CPF must have ${CPF_LENGTH} digits after normalization`); | ||
| } | ||
| if (hasRepeatedDigits(stripped)) { | ||
| return failure("KNOWN_INVALID_PATTERN", "CPF with all identical digits is invalid"); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidCpf(input) { | ||
| return validateCpf(input).ok; | ||
| } | ||
| function validateCpf(input) { | ||
| const stripped = stripCpf(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| if (isValidCpfChecksum(stripped)) { | ||
| return { ok: true, value: brandCpf(stripped), format: "numeric" }; | ||
| } | ||
| return failure("INVALID_CHECK_DIGIT", "CPF check digits are invalid"); | ||
| } | ||
| // src/core/cpf/mask.ts | ||
| function applyCpfMask(canonical) { | ||
| const match = CPF_MASK_PATTERN.exec(canonical); | ||
| if (!match) { | ||
| throw new Error("CPF must have exactly 11 digits to apply mask"); | ||
| } | ||
| return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`; | ||
| } | ||
| export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, applyCpfMask, isValidCpf, validateCpf }; | ||
| //# sourceMappingURL=chunk-5BBNLRZP.js.map | ||
| //# sourceMappingURL=chunk-5BBNLRZP.js.map |
| {"version":3,"sources":["../src/core/cpf/constants.ts","../src/core/cpf/index.ts","../src/core/cpf/mask.ts"],"names":[],"mappings":"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","file":"chunk-5BBNLRZP.js","sourcesContent":["/**\n * CPF constants — modulo 11 weights (RFB standard).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nexport const CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_DV2_WEIGHTS = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_LENGTH = 11;\nexport const CPF_BASE_LENGTH = 9;\nexport const CPF_NUMERIC_PATTERN = /^\\d{11}$/;\nexport const CPF_MASK_PATTERN = /^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/;\n\nexport const CPF_GOLDEN_PRIMARY = '12345678909';\nexport const CPF_GOLDEN_SECONDARY = '11144477735';\nexport const CPF_GOLDEN_PRIMARY_MASKED = '123.456.789-09';\nexport const CPF_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/receitafederal/pt-br/assuntos/cpf';\n","/**\n * CPF validation — modulo 11 (RFB standard weights).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nimport { stripCpf } from '../../strip/cpf.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCpf } from '../../types/validation-result.js';\nimport { computeCheckDigit } from '../cnpj/modulo11.js';\nimport {\n CPF_BASE_LENGTH,\n CPF_DV1_WEIGHTS,\n CPF_DV2_WEIGHTS,\n CPF_LENGTH,\n} from './constants.js';\n\nexport {\n CPF_GOLDEN_PRIMARY,\n CPF_GOLDEN_PRIMARY_MASKED,\n CPF_GOLDEN_SECONDARY,\n CPF_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction isValidCpfChecksum(stripped: string): boolean {\n const base = stripped.slice(0, CPF_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CPF_DV2_WEIGHTS, digitValue),\n );\n\n return stripped.slice(CPF_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CPF input is empty');\n }\n\n const withoutMask = input.replace(/[.-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CPF contains invalid characters');\n }\n\n if (stripped.length !== CPF_LENGTH) {\n return failure('INVALID_LENGTH', `CPF must have ${CPF_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'CPF with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidCpf(input: string): boolean {\n return validateCpf(input).ok;\n}\n\nexport function validateCpf(input: string): ValidationResult {\n const stripped = stripCpf(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidCpfChecksum(stripped)) {\n return { ok: true, value: brandCpf(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'CPF check digits are invalid');\n}\n","import { CPF_MASK_PATTERN } from './constants.js';\n\n/** Mask XXX.XXX.XXX-DD (BR-CPF-005). */\nexport function applyCpfMask(canonical: string): string {\n const match = CPF_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CPF must have exactly 11 digits to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;\n}\n"]} |
| // src/types/validation-result.ts | ||
| function brandCnpj(value) { | ||
| return value; | ||
| } | ||
| function brandCpf(value) { | ||
| return value; | ||
| } | ||
| function brandCep(value) { | ||
| return value; | ||
| } | ||
| function brandPlaca(value) { | ||
| return value; | ||
| } | ||
| function brandPisPasep(value) { | ||
| return value; | ||
| } | ||
| function brandPixKey(value) { | ||
| return value; | ||
| } | ||
| function brandLinhaDigitavel(value) { | ||
| return value; | ||
| } | ||
| function brandCodigoBarras(value) { | ||
| return value; | ||
| } | ||
| function brandCartaoCredito(value) { | ||
| return value; | ||
| } | ||
| function brandInscricaoEstadual(value) { | ||
| return value; | ||
| } | ||
| function brandTelefone(value) { | ||
| return value; | ||
| } | ||
| function brandBrCodePayload(value) { | ||
| return value; | ||
| } | ||
| export { brandBrCodePayload, brandCartaoCredito, brandCep, brandCnpj, brandCodigoBarras, brandCpf, brandInscricaoEstadual, brandLinhaDigitavel, brandPisPasep, brandPixKey, brandPlaca, brandTelefone }; | ||
| //# sourceMappingURL=chunk-BBL6ZPXH.js.map | ||
| //# sourceMappingURL=chunk-BBL6ZPXH.js.map |
| {"version":3,"sources":["../src/types/validation-result.ts"],"names":[],"mappings":";AAmGO,SAAS,UAAU,KAAA,EAAqB;AAC7C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAoB;AAC3C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAoB;AAC3C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAAsB;AAC/C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,KAAA,EAAyB;AACrD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,oBAAoB,KAAA,EAA+B;AACjE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAkB,KAAA,EAA6B;AAC7D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,mBAAmB,KAAA,EAA8B;AAC/D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,uBAAuB,KAAA,EAAkC;AACvE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,KAAA,EAAyB;AACrD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,mBAAmB,KAAA,EAA8B;AAC/D,EAAA,OAAO,KAAA;AACT","file":"chunk-BBL6ZPXH.js","sourcesContent":["export type DocumentFormat =\n | 'numeric'\n | 'alphanumeric'\n | 'legacy'\n | 'mercosul'\n | 'email'\n | 'phone'\n | 'evp'\n | 'linha-digitavel'\n | 'codigo-barras'\n | 'cartao-credito'\n | 'inscricao-estadual'\n | 'telefone'\n | 'brcode';\n\nexport type PixKeyType = 'cpf' | 'cnpj' | 'email' | 'phone' | 'evp';\n\nexport type TelefoneTipo = 'celular' | 'fixo';\n\nexport type BoletoInputKind = 'linha-digitavel' | 'codigo-barras';\n\nexport type ValidationErrorCode =\n | 'INVALID_LENGTH'\n | 'INVALID_CHARACTER'\n | 'INVALID_CHECK_DIGIT'\n | 'KNOWN_INVALID_PATTERN'\n | 'UNSUPPORTED_FORMAT'\n | 'EMPTY_INPUT';\n\nexport type ValidationResult<T extends string = string> =\n | { ok: true; value: T; format: DocumentFormat }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport type FormatResult =\n | { ok: true; formatted: string }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport type Cnpj = string & { readonly __brand: 'Cnpj' };\nexport type Cpf = string & { readonly __brand: 'Cpf' };\nexport type Cep = string & { readonly __brand: 'Cep' };\nexport type Placa = string & { readonly __brand: 'Placa' };\nexport type PisPasep = string & { readonly __brand: 'PisPasep' };\nexport type PixKey = string & { readonly __brand: 'PixKey' };\nexport type LinhaDigitavel = string & { readonly __brand: 'LinhaDigitavel' };\nexport type CodigoBarras = string & { readonly __brand: 'CodigoBarras' };\nexport type CartaoCredito = string & { readonly __brand: 'CartaoCredito' };\nexport type InscricaoEstadual = string & { readonly __brand: 'InscricaoEstadual' };\nexport type Telefone = string & { readonly __brand: 'Telefone' };\nexport type BrCodePayload = string & { readonly __brand: 'BrCodePayload' };\n\nexport type UfCode =\n | 'AC' | 'AL' | 'AM' | 'AP' | 'BA' | 'CE' | 'DF' | 'ES' | 'GO' | 'MA' | 'MG' | 'MS' | 'MT'\n | 'PA' | 'PB' | 'PE' | 'PI' | 'PR' | 'RJ' | 'RN' | 'RO' | 'RR' | 'RS' | 'SC' | 'SE' | 'SP' | 'TO';\n\nexport type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown';\n\nexport type CartaoCreditoValidationResult =\n | { ok: true; value: CartaoCredito; format: 'cartao-credito'; brand: CardBrand }\n | { ok: false; code: ValidationErrorCode; message: string; brand?: CardBrand };\n\nexport type PixValidationResult =\n | { ok: true; value: PixKey; keyType: PixKeyType; format: DocumentFormat }\n | { ok: false; code: ValidationErrorCode; message: string; keyType?: PixKeyType };\n\nexport type BoletoSituacao = '1' | '2';\n\nexport type BoletoValidationResult =\n | {\n ok: true;\n value: LinhaDigitavel | CodigoBarras;\n inputKind: BoletoInputKind;\n format: DocumentFormat;\n situacao: BoletoSituacao;\n }\n | { ok: false; code: ValidationErrorCode; message: string; inputKind?: BoletoInputKind };\n\nexport type InscricaoEstadualValidationResult =\n | { ok: true; value: InscricaoEstadual; uf: UfCode; format: 'inscricao-estadual' }\n | { ok: false; code: ValidationErrorCode; message: string; uf?: UfCode };\n\nexport type TelefoneValidationResult =\n | { ok: true; value: Telefone; tipo: TelefoneTipo; format: 'telefone' }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport type BrCodeValidationResult =\n | {\n ok: true;\n value: BrCodePayload;\n format: 'brcode';\n merchantName: string;\n merchantCity: string;\n amount?: string;\n txid?: string;\n pixKey?: PixKey;\n pixKeyType?: PixKeyType;\n pixInitiationUrl?: string;\n }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport function brandCnpj(value: string): Cnpj {\n return value as Cnpj;\n}\n\nexport function brandCpf(value: string): Cpf {\n return value as Cpf;\n}\n\nexport function brandCep(value: string): Cep {\n return value as Cep;\n}\n\nexport function brandPlaca(value: string): Placa {\n return value as Placa;\n}\n\nexport function brandPisPasep(value: string): PisPasep {\n return value as PisPasep;\n}\n\nexport function brandPixKey(value: string): PixKey {\n return value as PixKey;\n}\n\nexport function brandLinhaDigitavel(value: string): LinhaDigitavel {\n return value as LinhaDigitavel;\n}\n\nexport function brandCodigoBarras(value: string): CodigoBarras {\n return value as CodigoBarras;\n}\n\nexport function brandCartaoCredito(value: string): CartaoCredito {\n return value as CartaoCredito;\n}\n\nexport function brandInscricaoEstadual(value: string): InscricaoEstadual {\n return value as InscricaoEstadual;\n}\n\nexport function brandTelefone(value: string): Telefone {\n return value as Telefone;\n}\n\nexport function brandBrCodePayload(value: string): BrCodePayload {\n return value as BrCodePayload;\n}\n"]} |
| import { brandCartaoCredito } from './chunk-BBL6ZPXH.js'; | ||
| // src/strip/cartao-credito.ts | ||
| function stripCartaoCredito(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| // src/core/cartao-credito/constants.ts | ||
| var CARTAO_PAN_MIN_LENGTH = 8; | ||
| var CARTAO_PAN_MAX_LENGTH = 19; | ||
| var CARTAO_GOLDEN_VISA = "4111111111111111"; | ||
| var CARTAO_GOLDEN_MASTERCARD = "5555555555554444"; | ||
| var CARTAO_GOLDEN_AMEX = "378282246310005"; | ||
| var CARTAO_GOLDEN_LUHN_WALKTHROUGH = "79927398713"; | ||
| var CARTAO_GOLDEN_VISA_MASKED = "4111 1111 1111 1111"; | ||
| var CARTAO_GOLDEN_MIN_LENGTH = "12345674"; | ||
| var CARTAO_OFFICIAL_SOURCE_URL = "https://www.iso.org/standard/70484.html"; | ||
| var CARTAO_IEC_SOURCE_URL = "https://webstore.iec.ch/en/publication/59763"; | ||
| var ELO_IIN_PREFIXES = [ | ||
| "401178", | ||
| "401179", | ||
| "431274", | ||
| "438935", | ||
| "451416", | ||
| "457393", | ||
| "457631", | ||
| "457632", | ||
| "504175", | ||
| "506699", | ||
| "506770", | ||
| "509048", | ||
| "509049", | ||
| "627780", | ||
| "636297", | ||
| "636368", | ||
| "650031", | ||
| "650032", | ||
| "650033", | ||
| "650035", | ||
| "650051", | ||
| "650405", | ||
| "650439", | ||
| "650485", | ||
| "650486", | ||
| "650487", | ||
| "650488", | ||
| "650489", | ||
| "650490", | ||
| "650491", | ||
| "650492", | ||
| "650493", | ||
| "650494", | ||
| "650495", | ||
| "650496", | ||
| "650497", | ||
| "650498", | ||
| "650499", | ||
| "651652", | ||
| "651653", | ||
| "651654", | ||
| "651655", | ||
| "651656", | ||
| "651657", | ||
| "651658", | ||
| "651659", | ||
| "651660", | ||
| "655000", | ||
| "655001" | ||
| ]; | ||
| var HIPERCARD_IIN_PREFIXES = ["606282", "384100"]; | ||
| // src/core/cartao-credito/detect-brand.ts | ||
| function detectCardBrand(strippedPan) { | ||
| for (const prefix of ELO_IIN_PREFIXES) { | ||
| if (strippedPan.startsWith(prefix)) { | ||
| return "elo"; | ||
| } | ||
| } | ||
| for (const prefix of HIPERCARD_IIN_PREFIXES) { | ||
| if (strippedPan.startsWith(prefix)) { | ||
| return "hipercard"; | ||
| } | ||
| } | ||
| if (/^3[47]/.test(strippedPan)) { | ||
| return "amex"; | ||
| } | ||
| if (/^5[1-5]/.test(strippedPan) || /^2[2-7]/.test(strippedPan)) { | ||
| return "mastercard"; | ||
| } | ||
| if (strippedPan.startsWith("4")) { | ||
| return "visa"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/cartao-credito/luhn.ts | ||
| function computeLuhnSum(pan) { | ||
| let sum = 0; | ||
| let double = false; | ||
| for (let i = pan.length - 1; i >= 0; i--) { | ||
| let digit = Number(pan.charAt(i)); | ||
| if (double) { | ||
| digit *= 2; | ||
| if (digit > 9) { | ||
| digit -= 9; | ||
| } | ||
| } | ||
| sum += digit; | ||
| double = !double; | ||
| } | ||
| return sum; | ||
| } | ||
| function passesLuhn(pan) { | ||
| return computeLuhnSum(pan) % 10 === 0; | ||
| } | ||
| // src/core/cartao-credito/mask.ts | ||
| function applyCartaoCreditoMask(canonical) { | ||
| if (canonical.length < CARTAO_PAN_MIN_LENGTH || canonical.length > CARTAO_PAN_MAX_LENGTH) { | ||
| throw new Error(`PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits to apply mask`); | ||
| } | ||
| if (canonical.length === 15) { | ||
| return `${canonical.slice(0, 4)} ${canonical.slice(4, 10)} ${canonical.slice(10)}`; | ||
| } | ||
| const groups = []; | ||
| for (let i = 0; i < canonical.length; i += 4) { | ||
| groups.push(canonical.slice(i, i + 4)); | ||
| } | ||
| return groups.join(" "); | ||
| } | ||
| // src/core/cartao-credito/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function hasRepeatedDigits(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "Credit card PAN input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[\s-]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "Credit card PAN contains invalid characters"); | ||
| } | ||
| if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) { | ||
| return failure( | ||
| "INVALID_LENGTH", | ||
| `Credit card PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits after normalization` | ||
| ); | ||
| } | ||
| if (hasRepeatedDigits(stripped)) { | ||
| return failure("KNOWN_INVALID_PATTERN", "Credit card PAN with all identical digits is invalid"); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidLuhn(input) { | ||
| const stripped = stripCartaoCredito(input); | ||
| if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) { | ||
| return false; | ||
| } | ||
| const withoutMask = input.replace(/[\s-]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return false; | ||
| } | ||
| return passesLuhn(stripped); | ||
| } | ||
| function isValidCartaoCredito(input) { | ||
| return validateCartaoCredito(input).ok; | ||
| } | ||
| function validateCartaoCredito(input) { | ||
| const stripped = stripCartaoCredito(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| if (!passesLuhn(stripped)) { | ||
| return failure("INVALID_CHECK_DIGIT", "Credit card PAN check digit is invalid"); | ||
| } | ||
| const brand = detectCardBrand(stripped); | ||
| return { | ||
| ok: true, | ||
| value: brandCartaoCredito(stripped), | ||
| format: "cartao-credito", | ||
| brand | ||
| }; | ||
| } | ||
| // src/format/cartao-credito.ts | ||
| function formatCartaoCredito(input) { | ||
| const result = validateCartaoCredito(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyCartaoCreditoMask(result.value) }; | ||
| } | ||
| export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito }; | ||
| //# sourceMappingURL=chunk-CR45BOLS.js.map | ||
| //# sourceMappingURL=chunk-CR45BOLS.js.map |
| {"version":3,"sources":["../src/strip/cartao-credito.ts","../src/core/cartao-credito/constants.ts","../src/core/cartao-credito/detect-brand.ts","../src/core/cartao-credito/luhn.ts","../src/core/cartao-credito/mask.ts","../src/core/cartao-credito/index.ts","../src/format/cartao-credito.ts"],"names":[],"mappings":"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","file":"chunk-CR45BOLS.js","sourcesContent":["/**\n * Strip credit card PAN mask — digits only (BR-LUHN-001).\n * @see https://www.iso.org/standard/70484.html\n */\nexport function stripCartaoCredito(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Credit card PAN constants — ISO/IEC 7812-1 Annex B (Luhn).\n * @see https://www.iso.org/standard/70484.html\n * @see docs/use-cases/UC-008-validate-cartao-credito.md\n */\nexport type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown';\n\nexport const CARTAO_PAN_MIN_LENGTH = 8;\nexport const CARTAO_PAN_MAX_LENGTH = 19;\n\nexport const CARTAO_GOLDEN_VISA = '4111111111111111';\nexport const CARTAO_GOLDEN_MASTERCARD = '5555555555554444';\nexport const CARTAO_GOLDEN_AMEX = '378282246310005';\nexport const CARTAO_GOLDEN_LUHN_WALKTHROUGH = '79927398713';\nexport const CARTAO_GOLDEN_VISA_MASKED = '4111 1111 1111 1111';\nexport const CARTAO_GOLDEN_MIN_LENGTH = '12345674';\n\nexport const CARTAO_OFFICIAL_SOURCE_URL = 'https://www.iso.org/standard/70484.html';\nexport const CARTAO_IEC_SOURCE_URL = 'https://webstore.iec.ch/en/publication/59763';\n\n/** Best-effort IIN prefixes — longest match first (BR-LUHN-005, non-authoritative). */\nexport const ELO_IIN_PREFIXES = [\n '401178',\n '401179',\n '431274',\n '438935',\n '451416',\n '457393',\n '457631',\n '457632',\n '504175',\n '506699',\n '506770',\n '509048',\n '509049',\n '627780',\n '636297',\n '636368',\n '650031',\n '650032',\n '650033',\n '650035',\n '650051',\n '650405',\n '650439',\n '650485',\n '650486',\n '650487',\n '650488',\n '650489',\n '650490',\n '650491',\n '650492',\n '650493',\n '650494',\n '650495',\n '650496',\n '650497',\n '650498',\n '650499',\n '651652',\n '651653',\n '651654',\n '651655',\n '651656',\n '651657',\n '651658',\n '651659',\n '651660',\n '655000',\n '655001',\n] as const;\n\nexport const HIPERCARD_IIN_PREFIXES = ['606282', '384100'] as const;\n","/**\n * Best-effort card brand from IIN prefix — non-authoritative (BR-LUHN-005).\n */\nimport type { CardBrand } from './constants.js';\nimport { ELO_IIN_PREFIXES, HIPERCARD_IIN_PREFIXES } from './constants.js';\n\nexport type { CardBrand };\n\nexport function detectCardBrand(strippedPan: string): CardBrand {\n for (const prefix of ELO_IIN_PREFIXES) {\n if (strippedPan.startsWith(prefix)) {\n return 'elo';\n }\n }\n\n for (const prefix of HIPERCARD_IIN_PREFIXES) {\n if (strippedPan.startsWith(prefix)) {\n return 'hipercard';\n }\n }\n\n if (/^3[47]/.test(strippedPan)) {\n return 'amex';\n }\n\n if (/^5[1-5]/.test(strippedPan) || /^2[2-7]/.test(strippedPan)) {\n return 'mastercard';\n }\n\n if (strippedPan.startsWith('4')) {\n return 'visa';\n }\n\n return 'unknown';\n}\n","/**\n * Luhn checksum — ISO/IEC 7812-1 Annex B (modulus-10 double-add-double).\n * @see BR-LUHN-003\n */\n\nexport function computeLuhnSum(pan: string): number {\n let sum = 0;\n let double = false;\n for (let i = pan.length - 1; i >= 0; i--) {\n let digit = Number(pan.charAt(i));\n if (double) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n sum += digit;\n double = !double;\n }\n return sum;\n}\n\n/** ISO/IEC 7812-1 Annex B — returns true when PAN passes Luhn. */\nexport function passesLuhn(pan: string): boolean {\n return computeLuhnSum(pan) % 10 === 0;\n}\n","import { CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH } from './constants.js';\n\n/** Grouped display mask (BR-LUHN-007). */\nexport function applyCartaoCreditoMask(canonical: string): string {\n if (canonical.length < CARTAO_PAN_MIN_LENGTH || canonical.length > CARTAO_PAN_MAX_LENGTH) {\n throw new Error(`PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits to apply mask`);\n }\n\n if (canonical.length === 15) {\n return `${canonical.slice(0, 4)} ${canonical.slice(4, 10)} ${canonical.slice(10)}`;\n }\n\n const groups: string[] = [];\n for (let i = 0; i < canonical.length; i += 4) {\n groups.push(canonical.slice(i, i + 4));\n }\n return groups.join(' ');\n}\n","/**\n * Credit card PAN validation — Luhn / ISO/IEC 7812-1 Annex B.\n * @see docs/use-cases/UC-008-validate-cartao-credito.md\n */\nimport { stripCartaoCredito } from '../../strip/cartao-credito.js';\nimport type { CartaoCreditoValidationResult } from '../../types/validation-result.js';\nimport { brandCartaoCredito } from '../../types/validation-result.js';\nimport { detectCardBrand } from './detect-brand.js';\nimport { CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH } from './constants.js';\nimport { passesLuhn } from './luhn.js';\n\nexport {\n CARTAO_GOLDEN_AMEX,\n CARTAO_GOLDEN_LUHN_WALKTHROUGH,\n CARTAO_GOLDEN_MASTERCARD,\n CARTAO_GOLDEN_MIN_LENGTH,\n CARTAO_GOLDEN_VISA,\n CARTAO_GOLDEN_VISA_MASKED,\n CARTAO_IEC_SOURCE_URL,\n CARTAO_OFFICIAL_SOURCE_URL,\n CARTAO_PAN_MAX_LENGTH,\n CARTAO_PAN_MIN_LENGTH,\n} from './constants.js';\nexport type { CardBrand } from './constants.js';\nexport { detectCardBrand } from './detect-brand.js';\nexport { computeLuhnSum, passesLuhn } from './luhn.js';\nexport { applyCartaoCreditoMask } from './mask.js';\n\ntype FailedResult = Extract<CartaoCreditoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Credit card PAN input is empty');\n }\n\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'Credit card PAN contains invalid characters');\n }\n\n if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) {\n return failure(\n 'INVALID_LENGTH',\n `Credit card PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits after normalization`,\n );\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'Credit card PAN with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidLuhn(input: string): boolean {\n const stripped = stripCartaoCredito(input);\n if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) {\n return false;\n }\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return false;\n }\n return passesLuhn(stripped);\n}\n\nexport function isValidCartaoCredito(input: string): boolean {\n return validateCartaoCredito(input).ok;\n}\n\nexport function validateCartaoCredito(input: string): CartaoCreditoValidationResult {\n const stripped = stripCartaoCredito(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (!passesLuhn(stripped)) {\n return failure('INVALID_CHECK_DIGIT', 'Credit card PAN check digit is invalid');\n }\n\n const brand = detectCardBrand(stripped);\n return {\n ok: true,\n value: brandCartaoCredito(stripped),\n format: 'cartao-credito',\n brand,\n };\n}\n","import { applyCartaoCreditoMask } from '../core/cartao-credito/mask.js';\nimport { validateCartaoCredito } from '../core/cartao-credito/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCartaoCredito(input: string): FormatResult {\n const result = validateCartaoCredito(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCartaoCreditoMask(result.value) };\n}\n"]} |
| import { validateCnpj, applyCnpjMask, detectCnpjFormat } from './chunk-UE4PVN6Y.js'; | ||
| import { stripCnpj } from './chunk-EB3G4IG6.js'; | ||
| import { validateCpf, applyCpfMask } from './chunk-5BBNLRZP.js'; | ||
| import { stripCpf } from './chunk-UCJPSJN5.js'; | ||
| import { brandPixKey } from './chunk-BBL6ZPXH.js'; | ||
| // src/core/pix/cnpj.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message, keyType: "cnpj" }; | ||
| } | ||
| function validatePixCnpjKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure("EMPTY_INPUT", "PIX CNPJ key input is empty"); | ||
| } | ||
| const result = validateCnpj(trimmed); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message, keyType: "cnpj" }; | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(result.value), | ||
| keyType: "cnpj", | ||
| format: result.format | ||
| }; | ||
| } | ||
| // src/core/pix/cpf.ts | ||
| function failure2(code, message) { | ||
| return { ok: false, code, message, keyType: "cpf" }; | ||
| } | ||
| function validatePixCpfKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure2("EMPTY_INPUT", "PIX CPF key input is empty"); | ||
| } | ||
| const result = validateCpf(trimmed); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message, keyType: "cpf" }; | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(result.value), | ||
| keyType: "cpf", | ||
| format: result.format | ||
| }; | ||
| } | ||
| // src/core/pix/constants.ts | ||
| var PIX_EMAIL_MAX_LENGTH = 77; | ||
| var PIX_EMAIL_PATTERN = /^[a-z0-9.!#$'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/; | ||
| var PIX_PHONE_E164_PATTERN = /^\+[1-9]\d{1,14}$/; | ||
| var PIX_PHONE_BR_MOBILE_PATTERN = /^\+55\d{2}9\d{8}$/; | ||
| var PIX_EVP_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; | ||
| var PIX_CPF_DIGITS_PATTERN = /^[0-9]{11}$/; | ||
| var PIX_GOLDEN_CPF = "12345678909"; | ||
| var PIX_GOLDEN_CNPJ_NUMERIC = "11222333000181"; | ||
| var PIX_GOLDEN_CNPJ_ALPHANUMERIC = "12ABC34501DE35"; | ||
| var PIX_GOLDEN_EMAIL = "pix@bcb.gov.br"; | ||
| var PIX_GOLDEN_PHONE = "+5510998765432"; | ||
| var PIX_GOLDEN_EVP = "123e4567-e89b-12d3-a456-426655440000"; | ||
| var PIX_OFFICIAL_SOURCE_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf"; | ||
| var PIX_DICT_API_SOURCE_URL = "https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html"; | ||
| // src/core/pix/detect.ts | ||
| function isCpfShapedInput(input) { | ||
| const trimmed = input.trim(); | ||
| const stripped = stripCpf(trimmed); | ||
| if (!PIX_CPF_DIGITS_PATTERN.test(stripped)) { | ||
| return false; | ||
| } | ||
| return /^[\d.\-\s]+$/.test(trimmed); | ||
| } | ||
| function isCnpjShapedInput(input) { | ||
| const trimmed = input.trim(); | ||
| const stripped = stripCnpj(trimmed); | ||
| if (detectCnpjFormat(stripped) === "unknown") { | ||
| return false; | ||
| } | ||
| return /^[A-Za-z0-9./\-\s]+$/.test(trimmed); | ||
| } | ||
| function detectPixKeyType(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return "unknown"; | ||
| } | ||
| if (trimmed.includes("@")) { | ||
| return "email"; | ||
| } | ||
| if (trimmed.startsWith("+")) { | ||
| return "phone"; | ||
| } | ||
| if (PIX_EVP_PATTERN.test(trimmed)) { | ||
| return "evp"; | ||
| } | ||
| if (isCpfShapedInput(trimmed)) { | ||
| return "cpf"; | ||
| } | ||
| if (isCnpjShapedInput(trimmed)) { | ||
| return "cnpj"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/pix/email.ts | ||
| function failure3(code, message) { | ||
| return { ok: false, code, message, keyType: "email" }; | ||
| } | ||
| function validatePixEmailKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure3("EMPTY_INPUT", "PIX email key input is empty"); | ||
| } | ||
| if (trimmed !== trimmed.toLowerCase()) { | ||
| return failure3("INVALID_CHARACTER", "PIX email key must be lowercase"); | ||
| } | ||
| if (trimmed.length > PIX_EMAIL_MAX_LENGTH) { | ||
| return failure3("INVALID_LENGTH", `PIX email key must have at most ${PIX_EMAIL_MAX_LENGTH} characters`); | ||
| } | ||
| if (!trimmed.includes("@") || !PIX_EMAIL_PATTERN.test(trimmed)) { | ||
| return failure3("UNSUPPORTED_FORMAT", "PIX email key format is invalid"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(trimmed), | ||
| keyType: "email", | ||
| format: "email" | ||
| }; | ||
| } | ||
| // src/core/pix/evp.ts | ||
| function failure4(code, message) { | ||
| return { ok: false, code, message, keyType: "evp" }; | ||
| } | ||
| function validatePixEvpKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure4("EMPTY_INPUT", "PIX EVP key input is empty"); | ||
| } | ||
| if (trimmed !== trimmed.toLowerCase()) { | ||
| return failure4("INVALID_CHARACTER", "PIX EVP key must be lowercase"); | ||
| } | ||
| if (!PIX_EVP_PATTERN.test(trimmed)) { | ||
| return failure4("UNSUPPORTED_FORMAT", "PIX EVP key must be a lowercase UUID with hyphens"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(trimmed), | ||
| keyType: "evp", | ||
| format: "evp" | ||
| }; | ||
| } | ||
| // src/core/pix/phone.ts | ||
| function failure5(code, message) { | ||
| return { ok: false, code, message, keyType: "phone" }; | ||
| } | ||
| function validatePixPhoneKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure5("EMPTY_INPUT", "PIX phone key input is empty"); | ||
| } | ||
| if (!trimmed.startsWith("+")) { | ||
| return failure5("INVALID_CHARACTER", "PIX phone key must start with + (E.164)"); | ||
| } | ||
| if (!PIX_PHONE_E164_PATTERN.test(trimmed)) { | ||
| return failure5("INVALID_CHARACTER", "PIX phone key contains invalid characters"); | ||
| } | ||
| if (!trimmed.startsWith("+55")) { | ||
| return failure5("UNSUPPORTED_FORMAT", "PIX phone key must use Brazilian country code +55"); | ||
| } | ||
| if (!PIX_PHONE_BR_MOBILE_PATTERN.test(trimmed)) { | ||
| return failure5("UNSUPPORTED_FORMAT", "PIX phone key must match Brazilian mobile format +55DD9XXXXXXXX"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(trimmed), | ||
| keyType: "phone", | ||
| format: "phone" | ||
| }; | ||
| } | ||
| // src/core/pix/mask.ts | ||
| function applyPixCpfKeyMask(canonical) { | ||
| return applyCpfMask(canonical); | ||
| } | ||
| function applyPixCnpjKeyMask(canonical) { | ||
| return applyCnpjMask(canonical); | ||
| } | ||
| function applyPixPhoneKeyMask(e164) { | ||
| const match = /^\+55(\d{2})(9\d{4})(\d{4})$/.exec(e164); | ||
| if (!match) { | ||
| throw new Error("PIX phone key must be a validated Brazilian mobile E.164 number"); | ||
| } | ||
| return `+55 (${match[1]}) ${match[2]}-${match[3]}`; | ||
| } | ||
| function applyPixEmailKeyMask(email) { | ||
| return email.toLowerCase().trim(); | ||
| } | ||
| function applyPixEvpKeyMask(uuid) { | ||
| return uuid.toLowerCase(); | ||
| } | ||
| // src/core/pix/index.ts | ||
| function failure6(code, message, keyType) { | ||
| return { ok: false, code, message, ...keyType ? { keyType } : {} }; | ||
| } | ||
| function validateByType(input, keyType) { | ||
| switch (keyType) { | ||
| case "cpf": | ||
| return validatePixCpfKey(input); | ||
| case "cnpj": | ||
| return validatePixCnpjKey(input); | ||
| case "email": | ||
| return validatePixEmailKey(input); | ||
| case "phone": | ||
| return validatePixPhoneKey(input); | ||
| case "evp": | ||
| return validatePixEvpKey(input); | ||
| default: { | ||
| const _exhaustive = keyType; | ||
| return failure6("UNSUPPORTED_FORMAT", `Unknown PIX key type: ${_exhaustive}`); | ||
| } | ||
| } | ||
| } | ||
| function isValidPixKey(input, options) { | ||
| return validatePixKey(input, options).ok; | ||
| } | ||
| function validatePixKey(input, options) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure6("EMPTY_INPUT", "PIX key input is empty"); | ||
| } | ||
| const detected = detectPixKeyType(trimmed); | ||
| if (options?.type !== void 0) { | ||
| if (detected !== "unknown" && detected !== options.type) { | ||
| return failure6( | ||
| "UNSUPPORTED_FORMAT", | ||
| `PIX key detected as ${detected} but forced type is ${options.type}`, | ||
| options.type | ||
| ); | ||
| } | ||
| return validateByType(trimmed, options.type); | ||
| } | ||
| if (detected === "unknown") { | ||
| return failure6("UNSUPPORTED_FORMAT", "PIX key type could not be determined"); | ||
| } | ||
| return validateByType(trimmed, detected); | ||
| } | ||
| export { PIX_DICT_API_SOURCE_URL, PIX_GOLDEN_CNPJ_ALPHANUMERIC, PIX_GOLDEN_CNPJ_NUMERIC, PIX_GOLDEN_CPF, PIX_GOLDEN_EMAIL, PIX_GOLDEN_EVP, PIX_GOLDEN_PHONE, PIX_OFFICIAL_SOURCE_URL, applyPixCnpjKeyMask, applyPixCpfKeyMask, applyPixEmailKeyMask, applyPixEvpKeyMask, applyPixPhoneKeyMask, detectPixKeyType, isValidPixKey, validatePixCnpjKey, validatePixCpfKey, validatePixEmailKey, validatePixEvpKey, validatePixKey, validatePixPhoneKey }; | ||
| //# sourceMappingURL=chunk-D5JMGN7U.js.map | ||
| //# sourceMappingURL=chunk-D5JMGN7U.js.map |
| {"version":3,"sources":["../src/core/pix/cnpj.ts","../src/core/pix/cpf.ts","../src/core/pix/constants.ts","../src/core/pix/detect.ts","../src/core/pix/email.ts","../src/core/pix/evp.ts","../src/core/pix/phone.ts","../src/core/pix/mask.ts","../src/core/pix/index.ts"],"names":["failure"],"mappings":"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","file":"chunk-D5JMGN7U.js","sourcesContent":["import { validateCnpj } from '../cnpj/index.js';\nimport type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'cnpj' };\n}\n\nexport function validatePixCnpjKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX CNPJ key input is empty');\n }\n\n const result = validateCnpj(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message, keyType: 'cnpj' };\n }\n\n return {\n ok: true,\n value: brandPixKey(result.value),\n keyType: 'cnpj',\n format: result.format,\n };\n}\n","import { validateCpf } from '../cpf/index.js';\nimport type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'cpf' };\n}\n\nexport function validatePixCpfKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX CPF key input is empty');\n }\n\n const result = validateCpf(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message, keyType: 'cpf' };\n }\n\n return {\n ok: true,\n value: brandPixKey(result.value),\n keyType: 'cpf',\n format: result.format,\n };\n}\n","/**\n * PIX key constants — Bacen DICT API + Manual de Iniciação do Pix.\n * @see https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html\n * @see https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf\n * @see docs/use-cases/UC-005-validate-pix-key.md\n */\nexport const PIX_EMAIL_MAX_LENGTH = 77;\nexport const PIX_EMAIL_PATTERN =\n /^[a-z0-9.!#$'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/;\n\nexport const PIX_PHONE_E164_PATTERN = /^\\+[1-9]\\d{1,14}$/;\nexport const PIX_PHONE_BR_MOBILE_PATTERN = /^\\+55\\d{2}9\\d{8}$/;\n\nexport const PIX_EVP_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport const PIX_CPF_DIGITS_PATTERN = /^[0-9]{11}$/;\n\nexport const PIX_GOLDEN_CPF = '12345678909';\nexport const PIX_GOLDEN_CNPJ_NUMERIC = '11222333000181';\nexport const PIX_GOLDEN_CNPJ_ALPHANUMERIC = '12ABC34501DE35';\nexport const PIX_GOLDEN_EMAIL = 'pix@bcb.gov.br';\nexport const PIX_GOLDEN_PHONE = '+5510998765432';\nexport const PIX_GOLDEN_PHONE_SECONDARY = '+5561912345678';\nexport const PIX_GOLDEN_EVP = '123e4567-e89b-12d3-a456-426655440000';\nexport const PIX_GOLDEN_EMAIL_SECONDARY = 'fulano_da_silva.recebedor@example.com';\n\nexport const PIX_OFFICIAL_SOURCE_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf';\n\nexport const PIX_DICT_API_SOURCE_URL =\n 'https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html';\n","import { stripCnpj } from '../../strip/cnpj.js';\nimport { stripCpf } from '../../strip/cpf.js';\nimport type { PixKeyType } from '../../types/validation-result.js';\nimport { detectCnpjFormat } from '../cnpj/detect.js';\nimport {\n PIX_CPF_DIGITS_PATTERN,\n PIX_EVP_PATTERN,\n} from './constants.js';\n\nexport type DetectedPixKeyType = PixKeyType | 'unknown';\n\nfunction isCpfShapedInput(input: string): boolean {\n const trimmed = input.trim();\n const stripped = stripCpf(trimmed);\n if (!PIX_CPF_DIGITS_PATTERN.test(stripped)) {\n return false;\n }\n return /^[\\d.\\-\\s]+$/.test(trimmed);\n}\n\nfunction isCnpjShapedInput(input: string): boolean {\n const trimmed = input.trim();\n const stripped = stripCnpj(trimmed);\n if (detectCnpjFormat(stripped) === 'unknown') {\n return false;\n }\n return /^[A-Za-z0-9./\\-\\s]+$/.test(trimmed);\n}\n\nexport function detectPixKeyType(input: string): DetectedPixKeyType {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return 'unknown';\n }\n\n if (trimmed.includes('@')) {\n return 'email';\n }\n\n if (trimmed.startsWith('+')) {\n return 'phone';\n }\n\n if (PIX_EVP_PATTERN.test(trimmed)) {\n return 'evp';\n }\n\n if (isCpfShapedInput(trimmed)) {\n return 'cpf';\n }\n\n if (isCnpjShapedInput(trimmed)) {\n return 'cnpj';\n }\n\n return 'unknown';\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_EMAIL_MAX_LENGTH, PIX_EMAIL_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'email' };\n}\n\nexport function validatePixEmailKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX email key input is empty');\n }\n\n if (trimmed !== trimmed.toLowerCase()) {\n return failure('INVALID_CHARACTER', 'PIX email key must be lowercase');\n }\n\n if (trimmed.length > PIX_EMAIL_MAX_LENGTH) {\n return failure('INVALID_LENGTH', `PIX email key must have at most ${PIX_EMAIL_MAX_LENGTH} characters`);\n }\n\n if (!trimmed.includes('@') || !PIX_EMAIL_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX email key format is invalid');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'email',\n format: 'email',\n };\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_EVP_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'evp' };\n}\n\nexport function validatePixEvpKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX EVP key input is empty');\n }\n\n if (trimmed !== trimmed.toLowerCase()) {\n return failure('INVALID_CHARACTER', 'PIX EVP key must be lowercase');\n }\n\n if (!PIX_EVP_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX EVP key must be a lowercase UUID with hyphens');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'evp',\n format: 'evp',\n };\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_PHONE_BR_MOBILE_PATTERN, PIX_PHONE_E164_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'phone' };\n}\n\nexport function validatePixPhoneKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX phone key input is empty');\n }\n\n if (!trimmed.startsWith('+')) {\n return failure('INVALID_CHARACTER', 'PIX phone key must start with + (E.164)');\n }\n\n if (!PIX_PHONE_E164_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'PIX phone key contains invalid characters');\n }\n\n if (!trimmed.startsWith('+55')) {\n return failure('UNSUPPORTED_FORMAT', 'PIX phone key must use Brazilian country code +55');\n }\n\n if (!PIX_PHONE_BR_MOBILE_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX phone key must match Brazilian mobile format +55DD9XXXXXXXX');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'phone',\n format: 'phone',\n };\n}\n","/**\n * PIX key display masks — delegates to parent validators where applicable (BR-PIX-001…005).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport { applyCnpjMask } from '../cnpj/mask.js';\nimport { applyCpfMask } from '../cpf/mask.js';\n\nexport function applyPixCpfKeyMask(canonical: string): string {\n return applyCpfMask(canonical);\n}\n\nexport function applyPixCnpjKeyMask(canonical: string): string {\n return applyCnpjMask(canonical);\n}\n\n/** Brazilian mobile E.164 → +55 (DD) 9XXXX-XXXX display. */\nexport function applyPixPhoneKeyMask(e164: string): string {\n const match = /^\\+55(\\d{2})(9\\d{4})(\\d{4})$/.exec(e164);\n if (!match) {\n throw new Error('PIX phone key must be a validated Brazilian mobile E.164 number');\n }\n return `+55 (${match[1]}) ${match[2]}-${match[3]}`;\n}\n\nexport function applyPixEmailKeyMask(email: string): string {\n return email.toLowerCase().trim();\n}\n\nexport function applyPixEvpKeyMask(uuid: string): string {\n return uuid.toLowerCase();\n}\n","/**\n * PIX key validation — five Bacen types (CPF, CNPJ, email, phone, EVP).\n * @see docs/use-cases/UC-005-validate-pix-key.md\n */\nimport type { PixKeyType, PixValidationResult } from '../../types/validation-result.js';\nimport { validatePixCnpjKey } from './cnpj.js';\nimport { validatePixCpfKey } from './cpf.js';\nimport { detectPixKeyType } from './detect.js';\nimport { validatePixEmailKey } from './email.js';\nimport { validatePixEvpKey } from './evp.js';\nimport { validatePixPhoneKey } from './phone.js';\n\nexport {\n PIX_DICT_API_SOURCE_URL,\n PIX_GOLDEN_CNPJ_ALPHANUMERIC,\n PIX_GOLDEN_CNPJ_NUMERIC,\n PIX_GOLDEN_CPF,\n PIX_GOLDEN_EMAIL,\n PIX_GOLDEN_EMAIL_SECONDARY,\n PIX_GOLDEN_EVP,\n PIX_GOLDEN_PHONE,\n PIX_GOLDEN_PHONE_SECONDARY,\n PIX_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { detectPixKeyType, type DetectedPixKeyType } from './detect.js';\nexport { validatePixCpfKey } from './cpf.js';\nexport { validatePixCnpjKey } from './cnpj.js';\nexport { validatePixEmailKey } from './email.js';\nexport { validatePixPhoneKey } from './phone.js';\nexport { validatePixEvpKey } from './evp.js';\nexport {\n applyPixCnpjKeyMask,\n applyPixCpfKeyMask,\n applyPixEmailKeyMask,\n applyPixEvpKeyMask,\n applyPixPhoneKeyMask,\n} from './mask.js';\n\nexport type ValidatePixKeyOptions = {\n type?: PixKeyType;\n};\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, keyType?: PixKeyType): FailedResult {\n return { ok: false, code, message, ...(keyType ? { keyType } : {}) };\n}\n\nfunction validateByType(input: string, keyType: PixKeyType): PixValidationResult {\n switch (keyType) {\n case 'cpf':\n return validatePixCpfKey(input);\n case 'cnpj':\n return validatePixCnpjKey(input);\n case 'email':\n return validatePixEmailKey(input);\n case 'phone':\n return validatePixPhoneKey(input);\n case 'evp':\n return validatePixEvpKey(input);\n default: {\n const _exhaustive: never = keyType;\n return failure('UNSUPPORTED_FORMAT', `Unknown PIX key type: ${_exhaustive}`);\n }\n }\n}\n\nexport function isValidPixKey(input: string, options?: ValidatePixKeyOptions): boolean {\n return validatePixKey(input, options).ok;\n}\n\nexport function validatePixKey(input: string, options?: ValidatePixKeyOptions): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX key input is empty');\n }\n\n const detected = detectPixKeyType(trimmed);\n\n if (options?.type !== undefined) {\n if (detected !== 'unknown' && detected !== options.type) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `PIX key detected as ${detected} but forced type is ${options.type}`,\n options.type,\n );\n }\n return validateByType(trimmed, options.type);\n }\n\n if (detected === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'PIX key type could not be determined');\n }\n\n return validateByType(trimmed, detected);\n}\n"]} |
| import { brandInscricaoEstadual } from './chunk-BBL6ZPXH.js'; | ||
| // src/core/inscricao-estadual/constants.ts | ||
| var IE_SUPPORTED_UFS = [ | ||
| "AC", | ||
| "AL", | ||
| "AM", | ||
| "AP", | ||
| "BA", | ||
| "CE", | ||
| "DF", | ||
| "ES", | ||
| "GO", | ||
| "MA", | ||
| "MG", | ||
| "MS", | ||
| "MT", | ||
| "PA", | ||
| "PB", | ||
| "PE", | ||
| "PI", | ||
| "PR", | ||
| "RJ", | ||
| "RN", | ||
| "RO", | ||
| "RR", | ||
| "RS", | ||
| "SC", | ||
| "SE", | ||
| "SP", | ||
| "TO" | ||
| ]; | ||
| var IE_OFFICIAL_SOURCE_URLS = { | ||
| AC: "https://sefaz.ac.gov.br/", | ||
| AL: "https://www.sefaz.al.gov.br/calculo", | ||
| AM: "https://www.sefaz.am.gov.br/", | ||
| AP: "https://www.sefaz.ap.gov.br/", | ||
| BA: "https://www.sefaz.ba.gov.br/inspetoria-eletronica/icms/cadastro/calculo-dv/", | ||
| CE: "https://www.sefaz.ce.gov.br/", | ||
| DF: "https://www.receita.fazenda.df.gov.br/", | ||
| ES: "https://sitenet.es.gov.br/sefaz/", | ||
| GO: "http://www.sefaz.go.gov.br/ServicosAFA/ece.html", | ||
| MA: "https://www.sefaz.ma.gov.br/", | ||
| MG: "https://www.fazenda.mg.gov.br/empresas/Cadastro/cadastro/consultapublica.html", | ||
| MS: "https://www.sefaz.ms.gov.br/", | ||
| MT: "https://app1.sefaz.mt.gov.br/Sistema/legislacao/legislacaotribut.nsf/709f9c981a9d9f468425671300482be0/2217ddcf7a9b7cea03258c6c007324ba?OpenDocument=", | ||
| PA: "https://www.sefa.pa.gov.br/", | ||
| PB: "https://www.receita.pb.gov.br/", | ||
| PE: "https://www.sefaz.pe.gov.br/", | ||
| PI: "https://www.sefaz.pi.gov.br/", | ||
| PR: "https://www.fazenda.pr.gov.br/Pagina/calculo-digito-verificador", | ||
| RJ: "https://portal.fazenda.rj.gov.br/cadastro/", | ||
| RN: "https://www.set.rn.gov.br/", | ||
| RO: "https://www.sefin.ro.gov.br/", | ||
| RR: "https://www.sefaz.rr.gov.br/", | ||
| RS: "https://www.sefaz.rs.gov.br/", | ||
| SC: "https://sat.sef.sc.gov.br/", | ||
| SE: "https://www.sefaz.se.gov.br/", | ||
| SP: "https://portal.fazenda.sp.gov.br/servicos/icms/Paginas/sintegra-rotina-consistencia.aspx", | ||
| TO: "https://www.sefaz.to.gov.br/" | ||
| }; | ||
| var IE_AC_PREFIX = "01"; | ||
| var IE_AL_PREFIX = "24"; | ||
| var IE_AP_PREFIX = "03"; | ||
| var IE_DF_PREFIX = "07"; | ||
| var IE_GO_PREFIXES = ["10", "11", "15", "20"]; | ||
| var IE_MA_PREFIX = "12"; | ||
| var IE_MS_PREFIX = "28"; | ||
| var IE_MT_PREFIX = "13"; | ||
| var IE_PA_PREFIX = "15"; | ||
| var IE_RN_PREFIX = "20"; | ||
| var IE_RR_PREFIX = "24"; | ||
| var IE_TO_LEGACY_PREFIXES = ["01", "02", "03", "99"]; | ||
| var IE_SP_LENGTH = 12; | ||
| var IE_SP_DV1_WEIGHTS = [1, 3, 4, 5, 6, 7, 8, 10]; | ||
| var IE_SP_DV2_WEIGHTS = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var IE_SP_GOLDEN = "110042490114"; | ||
| var IE_SP_GOLDEN_MASKED = "110.042.490.114"; | ||
| var IE_SP_OFFICIAL_SOURCE_URL = IE_OFFICIAL_SOURCE_URLS.SP; | ||
| var IE_MT_CANONICAL_LENGTH = 9; | ||
| var IE_MT_LEGACY_LENGTH = 11; | ||
| var IE_MT_GOLDEN_LEGACY = "00130000019"; | ||
| var IE_MT_GOLDEN_CANONICAL = "130000019"; | ||
| var IE_MT_OFFICIAL_SOURCE_URL = IE_OFFICIAL_SOURCE_URLS.MT; | ||
| var IE_DF_LENGTH = 13; | ||
| var IE_DF_DV1_WEIGHTS = [4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var IE_DF_DV2_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var IE_DF_GOLDEN = "0730000100109"; | ||
| var IE_DF_GOLDEN_MASKED = "073.00001.001-09"; | ||
| var IE_DF_OFFICIAL_SOURCE_URL = IE_OFFICIAL_SOURCE_URLS.DF; | ||
| // src/core/inscricao-estadual/ie-common.ts | ||
| function stripIeDigits(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function ieFailure(uf, code, message) { | ||
| return { ok: false, code, message, uf }; | ||
| } | ||
| function ieEmptyInput(uf) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Inscri\xE7\xE3o Estadual input is empty", uf }; | ||
| } | ||
| function ieSuccess(stripped, uf) { | ||
| return { | ||
| ok: true, | ||
| value: brandInscricaoEstadual(stripped), | ||
| uf, | ||
| format: "inscricao-estadual" | ||
| }; | ||
| } | ||
| function checkTrimmedEmpty(trimmed, uf) { | ||
| if (trimmed.length === 0) { | ||
| return ieEmptyInput(uf); | ||
| } | ||
| return null; | ||
| } | ||
| function checkDigitChars(trimmed, uf, pattern = /^[0-9.\-\s/]+$/) { | ||
| if (!pattern.test(trimmed)) { | ||
| return ieFailure(uf, "INVALID_CHARACTER", `${uf} Inscri\xE7\xE3o Estadual contains invalid characters`); | ||
| } | ||
| return null; | ||
| } | ||
| // src/core/inscricao-estadual/modulo-ie.ts | ||
| function computeIeSpCheckDigit(digits, weights) { | ||
| let sum = 0; | ||
| for (let i = 0; i < weights.length; i++) { | ||
| sum += Number(digits[i]) * weights[i]; | ||
| } | ||
| const remainder = sum % 11; | ||
| return remainder === 10 ? 0 : remainder % 10; | ||
| } | ||
| function computeIeMtCheckDigit(digits10) { | ||
| let sum = 0; | ||
| const weights = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| for (let i = 0; i < 10; i++) { | ||
| sum += Number(digits10[i]) * weights[i]; | ||
| } | ||
| const remainder = sum % 11; | ||
| return remainder <= 1 ? 0 : 11 - remainder; | ||
| } | ||
| function computeIeDfCheckDigit(digits, weights, includeDv1 = false, dv1 = 0) { | ||
| let sum = 0; | ||
| const digitCount = includeDv1 ? 11 : digits.length; | ||
| for (let i = 0; i < digitCount; i++) { | ||
| sum += Number(digits[i]) * weights[i]; | ||
| } | ||
| if (includeDv1) { | ||
| sum += dv1 * weights[11]; | ||
| } | ||
| const remainder = sum % 11; | ||
| return remainder <= 1 ? 0 : 11 - remainder; | ||
| } | ||
| function computeIeCeCheckDigit(body8) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeAlCheckDigit(body8) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| const product = sum * 10; | ||
| let digit = product - Math.floor(product / 11) * 11; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeAmCheckDigit(body8) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| if (sum < 11) { | ||
| return 11 - sum; | ||
| } | ||
| const remainder = sum % 11; | ||
| let digit = 11 - remainder; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIePrStyleCheckDigit(body) { | ||
| let weight = body.length - 5; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = 7; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeAcCheckDigit(body) { | ||
| let weight = body.length - 7; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = 9; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeBaModule(ie) { | ||
| const refIndex = ie.length === 9 ? 1 : 0; | ||
| const refDigit = Number(ie[refIndex]); | ||
| const mod10Digits = [0, 1, 2, 3, 4, 5, 8]; | ||
| return mod10Digits.includes(refDigit) ? 10 : 11; | ||
| } | ||
| function computeIeBaCheckDigit(body, mod) { | ||
| let weight = body.length + 1; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % mod; | ||
| let digit = mod - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIePeCheckDigit(body) { | ||
| let weight = body.length + 1; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeCyclicMod11CheckDigit(body, startWeight, resetWeight) { | ||
| let weight = startWeight; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = resetWeight; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeRoCheckDigit(body) { | ||
| let weight = 6; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = 9; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit -= 10; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeGoCheckDigit(body8) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| const bodyInt = Number(body8); | ||
| if (digit >= 10) { | ||
| if (digit === 11 && bodyInt >= 10103105 && bodyInt <= 10119997) { | ||
| digit = 1; | ||
| } else { | ||
| digit = 0; | ||
| } | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeApCheckDigit(body8) { | ||
| const bodyInt = Number(body8); | ||
| let p = 0; | ||
| let d = 0; | ||
| if (bodyInt >= 3000001 && bodyInt <= 3017e3) { | ||
| p = 5; | ||
| d = 0; | ||
| } else if (bodyInt >= 3017001 && bodyInt <= 3019022) { | ||
| p = 9; | ||
| d = 1; | ||
| } | ||
| let weight = 9; | ||
| let sum = p; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| let digit = 11 - sum % 11; | ||
| if (digit === 10) { | ||
| digit = 0; | ||
| } else if (digit === 11) { | ||
| digit = d; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeRrCheckDigit(body8) { | ||
| let weight = 1; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight++; | ||
| } | ||
| return sum % 9; | ||
| } | ||
| function computeIeToCheckDigit(body) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % 11; | ||
| if (rest < 2) { | ||
| return 0; | ||
| } | ||
| return 11 - rest; | ||
| } | ||
| function computeIeMgFirstCheckDigit(body11) { | ||
| const bodyWithZero = `${body11.slice(0, 3)}0${body11.slice(3)}`; | ||
| let weightedSum = ""; | ||
| for (let i = 0; i < bodyWithZero.length; i++) { | ||
| const w = (i + 1) % 2 === 0 ? 2 : 1; | ||
| weightedSum += (Number(bodyWithZero[i]) * w).toString(); | ||
| } | ||
| let sum = 0; | ||
| for (let i = 0; i < weightedSum.length; i++) { | ||
| sum += Number(weightedSum[i]); | ||
| } | ||
| const lastDigit = Number(sum.toString().slice(-1)); | ||
| return lastDigit === 0 ? 0 : 10 - lastDigit; | ||
| } | ||
| function computeIeMgSecondCheckDigit(body12) { | ||
| let weight = 3; | ||
| let sum = 0; | ||
| for (let i = 0; i < body12.length; i++) { | ||
| sum += Number(body12[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = 11; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| // src/core/inscricao-estadual/ac.ts | ||
| var UF = "AC"; | ||
| var LENGTH = 13; | ||
| function stripIeAc(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeAc(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeAc(trimmed); | ||
| if (stripped.length !== LENGTH) { | ||
| return ieFailure(UF, "INVALID_LENGTH", `AC Inscri\xE7\xE3o Estadual must have ${LENGTH} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_AC_PREFIX)) { | ||
| return ieFailure(UF, "UNSUPPORTED_FORMAT", "AC Inscri\xE7\xE3o Estadual must start with prefix 01"); | ||
| } | ||
| const body = stripped.slice(0, 11); | ||
| const firstDig = computeIeAcCheckDigit(body); | ||
| const secondDig = computeIeAcCheckDigit(body + String(firstDig)); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF, "INVALID_CHECK_DIGIT", "AC Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF); | ||
| } | ||
| // src/core/inscricao-estadual/al.ts | ||
| var UF2 = "AL"; | ||
| var LENGTH2 = 9; | ||
| function stripIeAl(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeAl(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF2); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF2); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeAl(trimmed); | ||
| if (stripped.length !== LENGTH2) { | ||
| return ieFailure(UF2, "INVALID_LENGTH", `AL Inscri\xE7\xE3o Estadual must have ${LENGTH2} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_AL_PREFIX)) { | ||
| return ieFailure(UF2, "UNSUPPORTED_FORMAT", "AL Inscri\xE7\xE3o Estadual must start with prefix 24"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeAlCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF2, "INVALID_CHECK_DIGIT", "AL Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF2); | ||
| } | ||
| // src/core/inscricao-estadual/am.ts | ||
| var UF3 = "AM"; | ||
| var LENGTH3 = 9; | ||
| function stripIeAm(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeAm(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF3); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF3); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeAm(trimmed); | ||
| if (stripped.length !== LENGTH3) { | ||
| return ieFailure(UF3, "INVALID_LENGTH", `AM Inscri\xE7\xE3o Estadual must have ${LENGTH3} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeAmCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF3, "INVALID_CHECK_DIGIT", "AM Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF3); | ||
| } | ||
| // src/core/inscricao-estadual/ap.ts | ||
| var UF4 = "AP"; | ||
| var LENGTH4 = 9; | ||
| function stripIeAp(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeAp(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF4); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF4); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeAp(trimmed); | ||
| if (stripped.length !== LENGTH4) { | ||
| return ieFailure(UF4, "INVALID_LENGTH", `AP Inscri\xE7\xE3o Estadual must have ${LENGTH4} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_AP_PREFIX)) { | ||
| return ieFailure(UF4, "UNSUPPORTED_FORMAT", "AP Inscri\xE7\xE3o Estadual must start with prefix 03"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeApCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF4, "INVALID_CHECK_DIGIT", "AP Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF4); | ||
| } | ||
| // src/core/inscricao-estadual/ba.ts | ||
| var UF5 = "BA"; | ||
| function stripIeBa(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeBa(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF5); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF5); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeBa(trimmed); | ||
| if (stripped.length !== 8 && stripped.length !== 9) { | ||
| return ieFailure(UF5, "INVALID_LENGTH", "BA Inscri\xE7\xE3o Estadual must have 8 or 9 digits after normalization"); | ||
| } | ||
| const body = stripped.slice(0, stripped.length - 2); | ||
| const mod = computeIeBaModule(stripped); | ||
| const secondDig = computeIeBaCheckDigit(body, mod); | ||
| const firstDig = computeIeBaCheckDigit(body + String(secondDig), mod); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF5, "INVALID_CHECK_DIGIT", "BA Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF5); | ||
| } | ||
| // src/core/inscricao-estadual/ce.ts | ||
| var UF6 = "CE"; | ||
| var LENGTH5 = 9; | ||
| function stripIeCe(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeCe(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF6); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF6); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeCe(trimmed); | ||
| if (stripped.length !== LENGTH5) { | ||
| return ieFailure(UF6, "INVALID_LENGTH", `CE Inscri\xE7\xE3o Estadual must have ${LENGTH5} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeCeCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF6, "INVALID_CHECK_DIGIT", "CE Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF6); | ||
| } | ||
| // src/core/inscricao-estadual/df.ts | ||
| var DF_MASK_PATTERN = /^[0-9.-]+$/; | ||
| function failure(code, message) { | ||
| return { ok: false, code, message, uf: "DF" }; | ||
| } | ||
| function stripIeDf(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function validateIeDf(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Inscri\xE7\xE3o Estadual input is empty", uf: "DF" }; | ||
| } | ||
| if (!DF_MASK_PATTERN.test(trimmed)) { | ||
| return failure("INVALID_CHARACTER", "DF Inscri\xE7\xE3o Estadual contains invalid characters"); | ||
| } | ||
| const stripped = stripIeDf(trimmed); | ||
| if (stripped.length === 12) { | ||
| return failure("INVALID_LENGTH", "DF Inscri\xE7\xE3o Estadual legacy 12-digit format is not supported; use 13 digits"); | ||
| } | ||
| if (stripped.length !== IE_DF_LENGTH) { | ||
| return failure("INVALID_LENGTH", `DF Inscri\xE7\xE3o Estadual must have ${IE_DF_LENGTH} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_DF_PREFIX)) { | ||
| return failure("UNSUPPORTED_FORMAT", "DF Inscri\xE7\xE3o Estadual must start with prefix 07"); | ||
| } | ||
| const dv1 = computeIeDfCheckDigit(stripped.slice(0, 11), IE_DF_DV1_WEIGHTS); | ||
| const dv2 = computeIeDfCheckDigit(stripped.slice(0, 11), IE_DF_DV2_WEIGHTS, true, dv1); | ||
| if (Number(stripped.charAt(11)) !== dv1 || Number(stripped.charAt(12)) !== dv2) { | ||
| return failure("INVALID_CHECK_DIGIT", "DF Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandInscricaoEstadual(stripped), | ||
| uf: "DF", | ||
| format: "inscricao-estadual" | ||
| }; | ||
| } | ||
| // src/core/inscricao-estadual/es.ts | ||
| var UF7 = "ES"; | ||
| function stripIeEs(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeEs(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF7); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF7); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIeEs(trimmed)); | ||
| if (!ceResult.ok) { | ||
| return { ...ceResult, uf: UF7 }; | ||
| } | ||
| return { ...ceResult, uf: UF7 }; | ||
| } | ||
| // src/core/inscricao-estadual/go.ts | ||
| var UF8 = "GO"; | ||
| var LENGTH6 = 9; | ||
| function stripIeGo(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeGo(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF8); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF8); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeGo(trimmed); | ||
| if (stripped.length !== LENGTH6) { | ||
| return ieFailure(UF8, "INVALID_LENGTH", `GO Inscri\xE7\xE3o Estadual must have ${LENGTH6} digits after normalization`); | ||
| } | ||
| const prefix = stripped.slice(0, 2); | ||
| if (!IE_GO_PREFIXES.includes(prefix)) { | ||
| return ieFailure(UF8, "UNSUPPORTED_FORMAT", "GO Inscri\xE7\xE3o Estadual prefix is not supported"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeGoCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF8, "INVALID_CHECK_DIGIT", "GO Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF8); | ||
| } | ||
| // src/core/inscricao-estadual/ma.ts | ||
| var UF9 = "MA"; | ||
| function stripIeMa(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeMa(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF9); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF9); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeMa(trimmed); | ||
| if (!stripped.startsWith(IE_MA_PREFIX)) { | ||
| return ieFailure(UF9, "UNSUPPORTED_FORMAT", "MA Inscri\xE7\xE3o Estadual must start with prefix 12"); | ||
| } | ||
| const ceResult = validateIeCe(stripped); | ||
| if (!ceResult.ok) { | ||
| return { ...ceResult, uf: UF9 }; | ||
| } | ||
| return { ...ceResult, uf: UF9 }; | ||
| } | ||
| // src/core/inscricao-estadual/mg.ts | ||
| var UF10 = "MG"; | ||
| var LENGTH7 = 13; | ||
| function stripIeMg(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeMg(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF10); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF10); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeMg(trimmed); | ||
| if (stripped.length !== LENGTH7) { | ||
| return ieFailure(UF10, "INVALID_LENGTH", `MG Inscri\xE7\xE3o Estadual must have ${LENGTH7} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 11); | ||
| const firstDig = computeIeMgFirstCheckDigit(body); | ||
| const secondDig = computeIeMgSecondCheckDigit(body + String(firstDig)); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF10, "INVALID_CHECK_DIGIT", "MG Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF10); | ||
| } | ||
| // src/core/inscricao-estadual/ms.ts | ||
| var UF11 = "MS"; | ||
| function stripIeMs(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeMs(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF11); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF11); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeMs(trimmed); | ||
| if (!stripped.startsWith(IE_MS_PREFIX)) { | ||
| return ieFailure(UF11, "UNSUPPORTED_FORMAT", "MS Inscri\xE7\xE3o Estadual must start with prefix 28"); | ||
| } | ||
| const ceResult = validateIeCe(stripped); | ||
| if (!ceResult.ok) { | ||
| return { ...ceResult, uf: UF11 }; | ||
| } | ||
| return { ...ceResult, uf: UF11 }; | ||
| } | ||
| // src/core/inscricao-estadual/mt.ts | ||
| function failure2(code, message) { | ||
| return { ok: false, code, message, uf: "MT" }; | ||
| } | ||
| function stripIeMt(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function normalizeMtToCanonical(padded11) { | ||
| const trimmed = padded11.replace(/^0+/, ""); | ||
| return trimmed.length === IE_MT_CANONICAL_LENGTH ? trimmed : padded11.slice(-IE_MT_CANONICAL_LENGTH); | ||
| } | ||
| function validateIeMt(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Inscri\xE7\xE3o Estadual input is empty", uf: "MT" }; | ||
| } | ||
| if (/[^0-9.\-\s]/.test(trimmed)) { | ||
| return failure2("INVALID_CHARACTER", "MT Inscri\xE7\xE3o Estadual contains invalid characters"); | ||
| } | ||
| const stripped = stripIeMt(trimmed); | ||
| if (stripped.length < IE_MT_CANONICAL_LENGTH || stripped.length > IE_MT_LEGACY_LENGTH) { | ||
| return failure2( | ||
| "INVALID_LENGTH", | ||
| `MT Inscri\xE7\xE3o Estadual must have ${IE_MT_CANONICAL_LENGTH} or ${IE_MT_LEGACY_LENGTH} digits after normalization` | ||
| ); | ||
| } | ||
| const padded = stripped.length === IE_MT_LEGACY_LENGTH ? stripped : stripped.padStart(IE_MT_LEGACY_LENGTH, "0"); | ||
| const canonical = normalizeMtToCanonical(padded); | ||
| if (!canonical.startsWith(IE_MT_PREFIX)) { | ||
| return failure2("UNSUPPORTED_FORMAT", "MT Inscri\xE7\xE3o Estadual must start with prefix 13"); | ||
| } | ||
| const expectedDv = computeIeMtCheckDigit(padded.slice(0, 10)); | ||
| if (Number(padded.charAt(10)) !== expectedDv) { | ||
| return failure2("INVALID_CHECK_DIGIT", "MT Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandInscricaoEstadual(canonical), | ||
| uf: "MT", | ||
| format: "inscricao-estadual" | ||
| }; | ||
| } | ||
| // src/core/inscricao-estadual/mask.ts | ||
| function applyIeSpMask(stripped) { | ||
| if (stripped.length !== IE_SP_LENGTH) { | ||
| throw new Error("SP IE must have exactly 12 digits to apply mask"); | ||
| } | ||
| return `${stripped.slice(0, 3)}.${stripped.slice(3, 6)}.${stripped.slice(6, 9)}.${stripped.slice(9)}`; | ||
| } | ||
| function applyIeDfMask(stripped) { | ||
| if (stripped.length !== IE_DF_LENGTH) { | ||
| throw new Error("DF IE must have exactly 13 digits to apply mask"); | ||
| } | ||
| return `${stripped.slice(0, 3)}.${stripped.slice(3, 8)}.${stripped.slice(8, 11)}-${stripped.slice(11)}`; | ||
| } | ||
| // src/core/inscricao-estadual/pa.ts | ||
| var UF12 = "PA"; | ||
| function stripIePa(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePa(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF12); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF12); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIePa(trimmed); | ||
| if (!stripped.startsWith(IE_PA_PREFIX)) { | ||
| return ieFailure(UF12, "UNSUPPORTED_FORMAT", "PA Inscri\xE7\xE3o Estadual must start with prefix 15"); | ||
| } | ||
| const ceResult = validateIeCe(stripped); | ||
| if (!ceResult.ok) { | ||
| return { ...ceResult, uf: UF12 }; | ||
| } | ||
| return { ...ceResult, uf: UF12 }; | ||
| } | ||
| // src/core/inscricao-estadual/pb.ts | ||
| var UF13 = "PB"; | ||
| function stripIePb(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePb(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF13); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF13); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIePb(trimmed)); | ||
| if (!ceResult.ok) return { ...ceResult, uf: UF13 }; | ||
| return { ...ceResult, uf: UF13 }; | ||
| } | ||
| // src/core/inscricao-estadual/pe.ts | ||
| var UF14 = "PE"; | ||
| var LENGTH8 = 9; | ||
| function stripIePe(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePe(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF14); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF14); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIePe(trimmed); | ||
| if (stripped.length !== LENGTH8) { | ||
| return ieFailure(UF14, "INVALID_LENGTH", `PE Inscri\xE7\xE3o Estadual must have ${LENGTH8} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 7); | ||
| const firstDig = computeIePeCheckDigit(body); | ||
| const secondDig = computeIePeCheckDigit(body + String(firstDig)); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF14, "INVALID_CHECK_DIGIT", "PE Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF14); | ||
| } | ||
| // src/core/inscricao-estadual/pi.ts | ||
| var UF15 = "PI"; | ||
| function stripIePi(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePi(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF15); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF15); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIePi(trimmed)); | ||
| if (!ceResult.ok) return { ...ceResult, uf: UF15 }; | ||
| return { ...ceResult, uf: UF15 }; | ||
| } | ||
| // src/core/inscricao-estadual/pr.ts | ||
| var UF16 = "PR"; | ||
| var LENGTH9 = 10; | ||
| function stripIePr(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePr(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF16); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF16); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIePr(trimmed); | ||
| if (stripped.length !== LENGTH9) { | ||
| return ieFailure(UF16, "INVALID_LENGTH", `PR Inscri\xE7\xE3o Estadual must have ${LENGTH9} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const firstDig = computeIePrStyleCheckDigit(body); | ||
| const secondDig = computeIePrStyleCheckDigit(body + String(firstDig)); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF16, "INVALID_CHECK_DIGIT", "PR Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF16); | ||
| } | ||
| // src/core/inscricao-estadual/rj.ts | ||
| var UF17 = "RJ"; | ||
| var LENGTH10 = 8; | ||
| function stripIeRj(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeRj(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF17); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF17); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRj(trimmed); | ||
| if (stripped.length !== LENGTH10) { | ||
| return ieFailure(UF17, "INVALID_LENGTH", `RJ Inscri\xE7\xE3o Estadual must have ${LENGTH10} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 7); | ||
| const expected = computeIeCyclicMod11CheckDigit(body, 2, 7); | ||
| if (Number(stripped.charAt(7)) !== expected) { | ||
| return ieFailure(UF17, "INVALID_CHECK_DIGIT", "RJ Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF17); | ||
| } | ||
| // src/core/inscricao-estadual/rn.ts | ||
| var UF18 = "RN"; | ||
| var LENGTH11 = 9; | ||
| var RN_WEIGHTS = [9, 8, 7, 6, 5, 4, 3, 2]; | ||
| function stripIeRn(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function computeRnCheckDigit(body8) { | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * RN_WEIGHTS[i]; | ||
| } | ||
| const mod = sum % 11; | ||
| return mod < 2 ? 0 : 11 - mod; | ||
| } | ||
| function validateIeRn(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF18); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF18); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRn(trimmed); | ||
| if (stripped.length !== LENGTH11) { | ||
| return ieFailure(UF18, "INVALID_LENGTH", `RN Inscri\xE7\xE3o Estadual must have ${LENGTH11} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_RN_PREFIX)) { | ||
| return ieFailure(UF18, "UNSUPPORTED_FORMAT", "RN Inscri\xE7\xE3o Estadual must start with prefix 20"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeRnCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF18, "INVALID_CHECK_DIGIT", "RN Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF18); | ||
| } | ||
| // src/core/inscricao-estadual/ro.ts | ||
| var UF19 = "RO"; | ||
| var LENGTH12 = 14; | ||
| function stripIeRo(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeRo(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF19); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF19); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRo(trimmed); | ||
| if (stripped.length !== LENGTH12) { | ||
| return ieFailure(UF19, "INVALID_LENGTH", `RO Inscri\xE7\xE3o Estadual must have ${LENGTH12} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 13); | ||
| const expected = computeIeRoCheckDigit(body); | ||
| if (Number(stripped.charAt(13)) !== expected) { | ||
| return ieFailure(UF19, "INVALID_CHECK_DIGIT", "RO Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF19); | ||
| } | ||
| // src/core/inscricao-estadual/rr.ts | ||
| var UF20 = "RR"; | ||
| var LENGTH13 = 9; | ||
| function stripIeRr(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeRr(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF20); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF20); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRr(trimmed); | ||
| if (stripped.length !== LENGTH13) { | ||
| return ieFailure(UF20, "INVALID_LENGTH", `RR Inscri\xE7\xE3o Estadual must have ${LENGTH13} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_RR_PREFIX)) { | ||
| return ieFailure(UF20, "UNSUPPORTED_FORMAT", "RR Inscri\xE7\xE3o Estadual must start with prefix 24"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeRrCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF20, "INVALID_CHECK_DIGIT", "RR Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF20); | ||
| } | ||
| // src/core/inscricao-estadual/rs.ts | ||
| var UF21 = "RS"; | ||
| var LENGTH14 = 10; | ||
| function stripIeRs(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeRs(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF21); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF21, /^[0-9.\-\s/]+$/); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRs(trimmed); | ||
| if (stripped.length !== LENGTH14) { | ||
| return ieFailure(UF21, "INVALID_LENGTH", `RS Inscri\xE7\xE3o Estadual must have ${LENGTH14} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 9); | ||
| const expected = computeIeCyclicMod11CheckDigit(body, 2, 9); | ||
| if (Number(stripped.charAt(9)) !== expected) { | ||
| return ieFailure(UF21, "INVALID_CHECK_DIGIT", "RS Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF21); | ||
| } | ||
| // src/core/inscricao-estadual/sc.ts | ||
| var UF22 = "SC"; | ||
| function stripIeSc(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeSc(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF22); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF22); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIeSc(trimmed)); | ||
| if (!ceResult.ok) return { ...ceResult, uf: UF22 }; | ||
| return { ...ceResult, uf: UF22 }; | ||
| } | ||
| // src/core/inscricao-estadual/se.ts | ||
| var UF23 = "SE"; | ||
| function stripIeSe(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeSe(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF23); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF23); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIeSe(trimmed)); | ||
| if (!ceResult.ok) return { ...ceResult, uf: UF23 }; | ||
| return { ...ceResult, uf: UF23 }; | ||
| } | ||
| // src/core/inscricao-estadual/sp.ts | ||
| var SP_MASK_PATTERN = /^[0-9.]+$/; | ||
| function failure3(code, message) { | ||
| return { ok: false, code, message, uf: "SP" }; | ||
| } | ||
| function stripIeSp(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function validateIeSp(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Inscri\xE7\xE3o Estadual input is empty", uf: "SP" }; | ||
| } | ||
| if (/[Pp]/.test(trimmed)) { | ||
| return failure3("UNSUPPORTED_FORMAT", "SP rural IE format (P\u2026) is not supported in v1"); | ||
| } | ||
| if (!SP_MASK_PATTERN.test(trimmed)) { | ||
| return failure3("INVALID_CHARACTER", "SP Inscri\xE7\xE3o Estadual contains invalid characters"); | ||
| } | ||
| const stripped = stripIeSp(trimmed); | ||
| if (stripped.length !== IE_SP_LENGTH) { | ||
| return failure3("INVALID_LENGTH", `SP Inscri\xE7\xE3o Estadual must have ${IE_SP_LENGTH} digits after normalization`); | ||
| } | ||
| const dv1 = computeIeSpCheckDigit(stripped, IE_SP_DV1_WEIGHTS); | ||
| const dv2 = computeIeSpCheckDigit(stripped, IE_SP_DV2_WEIGHTS); | ||
| if (Number(stripped.charAt(8)) !== dv1 || Number(stripped.charAt(11)) !== dv2) { | ||
| return failure3("INVALID_CHECK_DIGIT", "SP Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandInscricaoEstadual(stripped), | ||
| uf: "SP", | ||
| format: "inscricao-estadual" | ||
| }; | ||
| } | ||
| // src/core/inscricao-estadual/to.ts | ||
| var UF24 = "TO"; | ||
| function stripIeTo(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeTo(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF24); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF24); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeTo(trimmed); | ||
| if (stripped.length !== 9 && stripped.length !== 11) { | ||
| return ieFailure(UF24, "INVALID_LENGTH", "TO Inscri\xE7\xE3o Estadual must have 9 or 11 digits after normalization"); | ||
| } | ||
| let body; | ||
| if (stripped.length === 11) { | ||
| const midPrefix = stripped.slice(2, 4); | ||
| if (!IE_TO_LEGACY_PREFIXES.includes(midPrefix)) { | ||
| return ieFailure(UF24, "UNSUPPORTED_FORMAT", "TO legacy 11-digit IE middle prefix is not supported"); | ||
| } | ||
| body = stripped.slice(0, 2) + stripped.slice(4, 10); | ||
| } else { | ||
| body = stripped.slice(0, 8); | ||
| } | ||
| const expected = computeIeToCheckDigit(body); | ||
| if (Number(stripped.slice(-1)) !== expected) { | ||
| return ieFailure(UF24, "INVALID_CHECK_DIGIT", "TO Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF24); | ||
| } | ||
| // src/core/inscricao-estadual/index.ts | ||
| var VALIDATORS = { | ||
| AC: validateIeAc, | ||
| AL: validateIeAl, | ||
| AM: validateIeAm, | ||
| AP: validateIeAp, | ||
| BA: validateIeBa, | ||
| CE: validateIeCe, | ||
| DF: validateIeDf, | ||
| ES: validateIeEs, | ||
| GO: validateIeGo, | ||
| MA: validateIeMa, | ||
| MG: validateIeMg, | ||
| MS: validateIeMs, | ||
| MT: validateIeMt, | ||
| PA: validateIePa, | ||
| PB: validateIePb, | ||
| PE: validateIePe, | ||
| PI: validateIePi, | ||
| PR: validateIePr, | ||
| RJ: validateIeRj, | ||
| RN: validateIeRn, | ||
| RO: validateIeRo, | ||
| RR: validateIeRr, | ||
| RS: validateIeRs, | ||
| SC: validateIeSc, | ||
| SE: validateIeSe, | ||
| SP: validateIeSp, | ||
| TO: validateIeTo | ||
| }; | ||
| function failure4(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function getIeOfficialSourceUrl(uf) { | ||
| return IE_OFFICIAL_SOURCE_URLS[uf]; | ||
| } | ||
| function isSupportedUf(uf) { | ||
| return uf !== void 0 && IE_SUPPORTED_UFS.includes(uf); | ||
| } | ||
| function stripInscricaoEstadual(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function isValidInscricaoEstadual(input, options) { | ||
| return validateInscricaoEstadual(input, options).ok; | ||
| } | ||
| function validateInscricaoEstadual(input, options) { | ||
| if (!isSupportedUf(options.uf)) { | ||
| return failure4("UNSUPPORTED_FORMAT", `UF ${String(options.uf)} is not supported`); | ||
| } | ||
| return VALIDATORS[options.uf](input); | ||
| } | ||
| function formatInscricaoEstadual(input, options) { | ||
| const result = validateInscricaoEstadual(input, options); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| try { | ||
| if (result.uf === "SP") { | ||
| return { ok: true, formatted: applyIeSpMask(result.value) }; | ||
| } | ||
| if (result.uf === "DF") { | ||
| return { ok: true, formatted: applyIeDfMask(result.value) }; | ||
| } | ||
| return { ok: true, formatted: result.value }; | ||
| } catch (error) { | ||
| const message = error instanceof Error ? error.message : "Failed to format Inscri\xE7\xE3o Estadual"; | ||
| return { ok: false, code: "UNSUPPORTED_FORMAT", message }; | ||
| } | ||
| } | ||
| export { IE_DF_GOLDEN, IE_DF_GOLDEN_MASKED, IE_DF_LENGTH, IE_DF_OFFICIAL_SOURCE_URL, IE_MT_GOLDEN_CANONICAL, IE_MT_GOLDEN_LEGACY, IE_MT_OFFICIAL_SOURCE_URL, IE_OFFICIAL_SOURCE_URLS, IE_SP_GOLDEN, IE_SP_GOLDEN_MASKED, IE_SP_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual }; | ||
| //# sourceMappingURL=chunk-FLZ6IHOD.js.map | ||
| //# sourceMappingURL=chunk-FLZ6IHOD.js.map |
Sorry, the diff of this file is too big to display
| import { validatePixKey } from './chunk-D5JMGN7U.js'; | ||
| import { brandBrCodePayload } from './chunk-BBL6ZPXH.js'; | ||
| // src/core/brcode/constants.ts | ||
| var BRCODE_OFFICIAL_SOURCE_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf"; | ||
| var BRCODE_PIX_INITIATION_MANUAL_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf"; | ||
| var BRCODE_PAYLOAD_FORMAT_INDICATOR = "01"; | ||
| var BRCODE_COUNTRY_CODE = "BR"; | ||
| var BRCODE_CRC_TAG = "63"; | ||
| var BRCODE_CRC_LENGTH = 4; | ||
| var BRCODE_GOLDEN_STATIC_EVP = "00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-4266554400005204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***63041D3D"; | ||
| var BRCODE_GOLDEN_DYNAMIC_URL = "00020101021226730014br.gov.bcb.pix2551pix.example.com/v2/8b3da2f39a4140d1a91abd93113bd4415204000053039865406123.455802BR5913Fulano de Tal6008BRASILIA62190515RP12345678-201963047309"; | ||
| var BRCODE_GOLDEN_COMPOSITE = "00020104141234567890123426580014BR.GOV.BCB.PIX0136123e4567-e12b-12d1-a456-42665544000027300012BR.COM.OUTRO011001234567895204000053039865406123.455802BR5917NOME DO RECEBEDOR6008BRASILIA61087007490062190515RP12345678-201980390012BR.COM.OUTRO01190123.ABCD.3456.WXYZ6304AD38"; | ||
| var BRCODE_GOLDEN_STATIC_CPF = "00020126330014br.gov.bcb.pix0111123456789095204000053039865802BR5917NOME DO RECEBEDOR6009SAO PAULO62070503***6304258E"; | ||
| var BRCODE_GOLDEN_STATIC_EMAIL = "00020126360014br.gov.bcb.pix0114pix@bcb.gov.br5204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***6304A7E9"; | ||
| // src/core/brcode/crc16.ts | ||
| function computeCrc16Ccitt(payload) { | ||
| let crc = 65535; | ||
| for (let i = 0; i < payload.length; i++) { | ||
| crc ^= payload.charCodeAt(i) << 8; | ||
| for (let bit = 0; bit < 8; bit++) { | ||
| if ((crc & 32768) !== 0) { | ||
| crc = (crc << 1 ^ 4129) & 65535; | ||
| } else { | ||
| crc = crc << 1 & 65535; | ||
| } | ||
| } | ||
| } | ||
| return crc.toString(16).toUpperCase().padStart(BRCODE_CRC_LENGTH, "0"); | ||
| } | ||
| function verifyBrCodeCrc(payload) { | ||
| if (payload.length < BRCODE_CRC_LENGTH + 4) { | ||
| return { ok: false, message: "BR Code payload is too short for CRC validation" }; | ||
| } | ||
| const providedCrc = payload.slice(-BRCODE_CRC_LENGTH); | ||
| if (!/^[0-9A-Fa-f]{4}$/.test(providedCrc)) { | ||
| return { ok: false, message: "BR Code CRC must be 4 hexadecimal characters" }; | ||
| } | ||
| const body = payload.slice(0, -BRCODE_CRC_LENGTH); | ||
| if (!body.endsWith(`${BRCODE_CRC_TAG}${String(BRCODE_CRC_LENGTH).padStart(2, "0")}`)) { | ||
| return { ok: false, message: "BR Code payload must end with CRC tag 63 before checksum" }; | ||
| } | ||
| const expected = computeCrc16Ccitt(body); | ||
| if (providedCrc.toUpperCase() !== expected) { | ||
| return { ok: false, message: "BR Code CRC16-CCITT checksum is invalid" }; | ||
| } | ||
| return { ok: true }; | ||
| } | ||
| // src/core/brcode/tlv.ts | ||
| function tlvFailure(message) { | ||
| return { ok: false, message }; | ||
| } | ||
| function parseTlvSequence(data) { | ||
| const fields = []; | ||
| let offset = 0; | ||
| while (offset < data.length) { | ||
| if (data.length - offset < 4) { | ||
| return tlvFailure("TLV sequence is incomplete"); | ||
| } | ||
| const id = data.slice(offset, offset + 2); | ||
| const lengthRaw = data.slice(offset + 2, offset + 4); | ||
| const length = Number.parseInt(lengthRaw, 10); | ||
| if (!/^\d{2}$/.test(lengthRaw) || Number.isNaN(length)) { | ||
| return tlvFailure(`TLV length is not numeric for id ${id}`); | ||
| } | ||
| offset += 4; | ||
| if (data.length - offset < length) { | ||
| return tlvFailure(`TLV value for id ${id} exceeds payload length`); | ||
| } | ||
| const value = data.slice(offset, offset + length); | ||
| offset += length; | ||
| fields.push({ id, value }); | ||
| } | ||
| return { ok: true, fields }; | ||
| } | ||
| function findTlvField(fields, id) { | ||
| return fields.find((field) => field.id === id)?.value; | ||
| } | ||
| function findPixMerchantAccount(fields) { | ||
| for (const field of fields) { | ||
| if (field.id !== "26") { | ||
| continue; | ||
| } | ||
| const nested = parseTlvSequence(field.value); | ||
| if (!nested.ok) { | ||
| continue; | ||
| } | ||
| const gui = findTlvField(nested.fields, "00"); | ||
| if (gui?.toLowerCase() === "br.gov.bcb.pix") { | ||
| return { value: field.value, nestedFields: nested.fields }; | ||
| } | ||
| } | ||
| return void 0; | ||
| } | ||
| // src/core/brcode/parse.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function normalizeBrCodePayload(input) { | ||
| return input.trim(); | ||
| } | ||
| function extractPixAccount(nestedFields) { | ||
| const pixKey = findTlvField(nestedFields, "01"); | ||
| const pixInitiationUrl = findTlvField(nestedFields, "25"); | ||
| if (!pixKey && !pixInitiationUrl) { | ||
| return failure("UNSUPPORTED_FORMAT", "PIX merchant account must include key (01) or initiation URL (25)"); | ||
| } | ||
| return { ok: true, pixKey, pixInitiationUrl }; | ||
| } | ||
| function extractTxid(tag62) { | ||
| if (!tag62) { | ||
| return void 0; | ||
| } | ||
| const nested = parseTlvSequence(tag62); | ||
| if (!nested.ok) { | ||
| return void 0; | ||
| } | ||
| return findTlvField(nested.fields, "05"); | ||
| } | ||
| function parseFields(rootFields) { | ||
| const formatIndicator = findTlvField(rootFields, "00"); | ||
| if (formatIndicator !== BRCODE_PAYLOAD_FORMAT_INDICATOR) { | ||
| return failure( | ||
| "UNSUPPORTED_FORMAT", | ||
| `BR Code payload format indicator must be ${BRCODE_PAYLOAD_FORMAT_INDICATOR}` | ||
| ); | ||
| } | ||
| const merchantAccount = findPixMerchantAccount(rootFields); | ||
| if (!merchantAccount) { | ||
| return failure("UNSUPPORTED_FORMAT", "BR Code payload must include PIX merchant account (tag 26)"); | ||
| } | ||
| const pixAccount = extractPixAccount(merchantAccount.nestedFields); | ||
| if (!pixAccount.ok) { | ||
| return pixAccount; | ||
| } | ||
| const countryCode = findTlvField(rootFields, "58"); | ||
| if (countryCode !== BRCODE_COUNTRY_CODE) { | ||
| return failure("UNSUPPORTED_FORMAT", `BR Code country code must be ${BRCODE_COUNTRY_CODE}`); | ||
| } | ||
| const merchantName = findTlvField(rootFields, "59"); | ||
| const merchantCity = findTlvField(rootFields, "60"); | ||
| if (!merchantName || !merchantCity) { | ||
| return failure("UNSUPPORTED_FORMAT", "BR Code payload must include merchant name (59) and city (60)"); | ||
| } | ||
| const amount = findTlvField(rootFields, "54"); | ||
| const txid = extractTxid(findTlvField(rootFields, "62")); | ||
| let pixKeyType; | ||
| let pixKey; | ||
| if (pixAccount.pixKey) { | ||
| const keyResult = validatePixKey(pixAccount.pixKey); | ||
| if (!keyResult.ok) { | ||
| return failure(keyResult.code, keyResult.message); | ||
| } | ||
| pixKey = keyResult.value; | ||
| pixKeyType = keyResult.keyType; | ||
| } | ||
| return { | ||
| ok: true, | ||
| payload: "", | ||
| fields: { | ||
| merchantName, | ||
| merchantCity, | ||
| ...amount ? { amount } : {}, | ||
| ...txid ? { txid } : {}, | ||
| ...pixKey ? { pixKey, pixKeyType } : {}, | ||
| ...pixAccount.pixInitiationUrl ? { pixInitiationUrl: pixAccount.pixInitiationUrl } : {} | ||
| } | ||
| }; | ||
| } | ||
| function parseBrCodePayload(input) { | ||
| const normalized = normalizeBrCodePayload(input); | ||
| if (normalized.length === 0) { | ||
| return failure("EMPTY_INPUT", "BR Code payload is empty"); | ||
| } | ||
| if (!/^[\x20-\x7E]+$/.test(normalized)) { | ||
| return failure("INVALID_CHARACTER", "BR Code payload contains invalid characters"); | ||
| } | ||
| const crc = verifyBrCodeCrc(normalized); | ||
| if (!crc.ok) { | ||
| return failure("INVALID_CHECK_DIGIT", crc.message); | ||
| } | ||
| const withoutCrc = normalized.slice(0, -BRCODE_CRC_LENGTH); | ||
| const crcTagHeader = `${BRCODE_CRC_TAG}${String(BRCODE_CRC_LENGTH).padStart(2, "0")}`; | ||
| const tlv = parseTlvSequence(withoutCrc.slice(0, -crcTagHeader.length)); | ||
| if (!tlv.ok) { | ||
| return failure("UNSUPPORTED_FORMAT", tlv.message); | ||
| } | ||
| const parsed = parseFields(tlv.fields); | ||
| if (!parsed.ok) { | ||
| return parsed; | ||
| } | ||
| return { | ||
| ok: true, | ||
| payload: normalized, | ||
| fields: parsed.fields | ||
| }; | ||
| } | ||
| // src/core/brcode/index.ts | ||
| function isValidBrCode(input) { | ||
| return validateBrCode(input).ok; | ||
| } | ||
| function parseBrCode(input) { | ||
| const parsed = parseBrCodePayload(input); | ||
| if (!parsed.ok) { | ||
| return { ok: false, code: parsed.code, message: parsed.message }; | ||
| } | ||
| const { fields, payload } = parsed; | ||
| return { | ||
| ok: true, | ||
| value: brandBrCodePayload(payload), | ||
| format: "brcode", | ||
| merchantName: fields.merchantName, | ||
| merchantCity: fields.merchantCity, | ||
| ...fields.amount ? { amount: fields.amount } : {}, | ||
| ...fields.txid ? { txid: fields.txid } : {}, | ||
| ...fields.pixKey && fields.pixKeyType ? { pixKey: fields.pixKey, pixKeyType: fields.pixKeyType } : {}, | ||
| ...fields.pixInitiationUrl ? { pixInitiationUrl: fields.pixInitiationUrl } : {} | ||
| }; | ||
| } | ||
| function validateBrCode(input) { | ||
| const parsed = parseBrCode(input); | ||
| if (!parsed.ok) { | ||
| return parsed; | ||
| } | ||
| if (!parsed.pixKey || !parsed.pixKeyType) { | ||
| return { | ||
| ok: false, | ||
| code: "UNSUPPORTED_FORMAT", | ||
| message: "BR Code validation requires a static PIX key (merchant account subfield 01)" | ||
| }; | ||
| } | ||
| return parsed; | ||
| } | ||
| export { BRCODE_GOLDEN_COMPOSITE, BRCODE_GOLDEN_DYNAMIC_URL, BRCODE_GOLDEN_STATIC_CPF, BRCODE_GOLDEN_STATIC_EMAIL, BRCODE_GOLDEN_STATIC_EVP, BRCODE_OFFICIAL_SOURCE_URL, BRCODE_PIX_INITIATION_MANUAL_URL, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc }; | ||
| //# sourceMappingURL=chunk-GEHAH4OH.js.map | ||
| //# sourceMappingURL=chunk-GEHAH4OH.js.map |
| {"version":3,"sources":["../src/core/brcode/constants.ts","../src/core/brcode/crc16.ts","../src/core/brcode/tlv.ts","../src/core/brcode/parse.ts","../src/core/brcode/index.ts"],"names":[],"mappings":"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","file":"chunk-GEHAH4OH.js","sourcesContent":["/** Bacen Manual BR Code — EMV-QRCPS-MPM TLV + CRC16-CCITT */\nexport const BRCODE_OFFICIAL_SOURCE_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf';\n\nexport const BRCODE_PIX_INITIATION_MANUAL_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf';\n\nexport const BRCODE_PAYLOAD_FORMAT_INDICATOR = '01';\n\nexport const BRCODE_PIX_GUI = 'br.gov.bcb.pix';\n\nexport const BRCODE_COUNTRY_CODE = 'BR';\n\nexport const BRCODE_CURRENCY_BRL = '986';\n\nexport const BRCODE_CRC_TAG = '63';\n\nexport const BRCODE_CRC_LENGTH = 4;\n\n/** Manual de Padrões PIX — static QR, EVP key (CRC 1D3D). */\nexport const BRCODE_GOLDEN_STATIC_EVP =\n '00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-4266554400005204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***63041D3D';\n\n/** Manual de Padrões PIX — dynamic QR with amount (CRC 7309). */\nexport const BRCODE_GOLDEN_DYNAMIC_URL =\n '00020101021226730014br.gov.bcb.pix2551pix.example.com/v2/8b3da2f39a4140d1a91abd93113bd4415204000053039865406123.455802BR5913Fulano de Tal6008BRASILIA62190515RP12345678-201963047309';\n\n/** Manual BR Code — composite payload with PIX + other arranjos (CRC AD38). */\nexport const BRCODE_GOLDEN_COMPOSITE =\n '00020104141234567890123426580014BR.GOV.BCB.PIX0136123e4567-e12b-12d1-a456-42665544000027300012BR.COM.OUTRO011001234567895204000053039865406123.455802BR5917NOME DO RECEBEDOR6008BRASILIA61087007490062190515RP12345678-201980390012BR.COM.OUTRO01190123.ABCD.3456.WXYZ6304AD38';\n\n/** Golden CPF PIX key 12345678909 — CRC computed per manual algorithm. */\nexport const BRCODE_GOLDEN_STATIC_CPF =\n '00020126330014br.gov.bcb.pix0111123456789095204000053039865802BR5917NOME DO RECEBEDOR6009SAO PAULO62070503***6304258E';\n\n/** Golden email pix@bcb.gov.br — CRC computed per manual algorithm. */\nexport const BRCODE_GOLDEN_STATIC_EMAIL =\n '00020126360014br.gov.bcb.pix0114pix@bcb.gov.br5204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***6304A7E9';\n","import { BRCODE_CRC_LENGTH, BRCODE_CRC_TAG } from './constants.js';\n\n/** CRC16-CCITT-FALSE — polynomial 0x1021, initial 0xFFFF (Bacen Manual BR Code). */\nexport function computeCrc16Ccitt(payload: string): string {\n let crc = 0xffff;\n\n for (let i = 0; i < payload.length; i++) {\n crc ^= payload.charCodeAt(i) << 8;\n for (let bit = 0; bit < 8; bit++) {\n if ((crc & 0x8000) !== 0) {\n crc = ((crc << 1) ^ 0x1021) & 0xffff;\n } else {\n crc = (crc << 1) & 0xffff;\n }\n }\n }\n\n return crc.toString(16).toUpperCase().padStart(BRCODE_CRC_LENGTH, '0');\n}\n\nexport function verifyBrCodeCrc(payload: string): { ok: true } | { ok: false; message: string } {\n if (payload.length < BRCODE_CRC_LENGTH + 4) {\n return { ok: false, message: 'BR Code payload is too short for CRC validation' };\n }\n\n const providedCrc = payload.slice(-BRCODE_CRC_LENGTH);\n if (!/^[0-9A-Fa-f]{4}$/.test(providedCrc)) {\n return { ok: false, message: 'BR Code CRC must be 4 hexadecimal characters' };\n }\n\n const body = payload.slice(0, -BRCODE_CRC_LENGTH);\n if (!body.endsWith(`${BRCODE_CRC_TAG}${String(BRCODE_CRC_LENGTH).padStart(2, '0')}`)) {\n return { ok: false, message: 'BR Code payload must end with CRC tag 63 before checksum' };\n }\n\n const expected = computeCrc16Ccitt(body);\n if (providedCrc.toUpperCase() !== expected) {\n return { ok: false, message: 'BR Code CRC16-CCITT checksum is invalid' };\n }\n\n return { ok: true };\n}\n","export type TlvField = {\n id: string;\n value: string;\n};\n\nexport type TlvParseFailure = {\n ok: false;\n message: string;\n};\n\nexport type TlvParseSuccess = {\n ok: true;\n fields: TlvField[];\n};\n\nexport type TlvParseResult = TlvParseSuccess | TlvParseFailure;\n\nfunction tlvFailure(message: string): TlvParseFailure {\n return { ok: false, message };\n}\n\nexport function parseTlvSequence(data: string): TlvParseResult {\n const fields: TlvField[] = [];\n let offset = 0;\n\n while (offset < data.length) {\n if (data.length - offset < 4) {\n return tlvFailure('TLV sequence is incomplete');\n }\n\n const id = data.slice(offset, offset + 2);\n const lengthRaw = data.slice(offset + 2, offset + 4);\n const length = Number.parseInt(lengthRaw, 10);\n\n if (!/^\\d{2}$/.test(lengthRaw) || Number.isNaN(length)) {\n return tlvFailure(`TLV length is not numeric for id ${id}`);\n }\n\n offset += 4;\n\n if (data.length - offset < length) {\n return tlvFailure(`TLV value for id ${id} exceeds payload length`);\n }\n\n const value = data.slice(offset, offset + length);\n offset += length;\n fields.push({ id, value });\n }\n\n return { ok: true, fields };\n}\n\nexport function findTlvField(fields: TlvField[], id: string): string | undefined {\n return fields.find((field) => field.id === id)?.value;\n}\n\nexport function findPixMerchantAccount(\n fields: TlvField[],\n): { value: string; nestedFields: TlvField[] } | undefined {\n for (const field of fields) {\n if (field.id !== '26') {\n continue;\n }\n const nested = parseTlvSequence(field.value);\n if (!nested.ok) {\n continue;\n }\n const gui = findTlvField(nested.fields, '00');\n if (gui?.toLowerCase() === 'br.gov.bcb.pix') {\n return { value: field.value, nestedFields: nested.fields };\n }\n }\n return undefined;\n}\n","import { validatePixKey } from '../pix/index.js';\nimport type { PixKey, PixKeyType, ValidationErrorCode } from '../../types/validation-result.js';\nimport { BRCODE_COUNTRY_CODE, BRCODE_CRC_LENGTH, BRCODE_CRC_TAG, BRCODE_PAYLOAD_FORMAT_INDICATOR } from './constants.js';\nimport { verifyBrCodeCrc } from './crc16.js';\nimport { findPixMerchantAccount, findTlvField, parseTlvSequence, type TlvField } from './tlv.js';\n\nexport type BrCodeParsedFields = {\n merchantName: string;\n merchantCity: string;\n amount?: string;\n txid?: string;\n pixKey?: PixKey;\n pixKeyType?: PixKeyType;\n pixInitiationUrl?: string;\n};\n\nexport type BrCodeParseFailure = {\n ok: false;\n code: ValidationErrorCode;\n message: string;\n};\n\nexport type BrCodeParseSuccess = {\n ok: true;\n payload: string;\n fields: BrCodeParsedFields;\n};\n\nexport type BrCodeParseResult = BrCodeParseSuccess | BrCodeParseFailure;\n\nfunction failure(\n code: BrCodeParseFailure['code'],\n message: string,\n): BrCodeParseFailure {\n return { ok: false, code, message };\n}\n\nexport function normalizeBrCodePayload(input: string): string {\n return input.trim();\n}\n\nfunction extractPixAccount(\n nestedFields: TlvField[],\n): { ok: true; pixKey?: string; pixInitiationUrl?: string } | BrCodeParseFailure {\n const pixKey = findTlvField(nestedFields, '01');\n const pixInitiationUrl = findTlvField(nestedFields, '25');\n\n if (!pixKey && !pixInitiationUrl) {\n return failure('UNSUPPORTED_FORMAT', 'PIX merchant account must include key (01) or initiation URL (25)');\n }\n\n return { ok: true, pixKey, pixInitiationUrl };\n}\n\nfunction extractTxid(tag62: string | undefined): string | undefined {\n if (!tag62) {\n return undefined;\n }\n const nested = parseTlvSequence(tag62);\n if (!nested.ok) {\n return undefined;\n }\n return findTlvField(nested.fields, '05');\n}\n\nfunction parseFields(rootFields: TlvField[]): BrCodeParseSuccess | BrCodeParseFailure {\n const formatIndicator = findTlvField(rootFields, '00');\n if (formatIndicator !== BRCODE_PAYLOAD_FORMAT_INDICATOR) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `BR Code payload format indicator must be ${BRCODE_PAYLOAD_FORMAT_INDICATOR}`,\n );\n }\n\n const merchantAccount = findPixMerchantAccount(rootFields);\n if (!merchantAccount) {\n return failure('UNSUPPORTED_FORMAT', 'BR Code payload must include PIX merchant account (tag 26)');\n }\n\n const pixAccount = extractPixAccount(merchantAccount.nestedFields);\n if (!pixAccount.ok) {\n return pixAccount;\n }\n\n const countryCode = findTlvField(rootFields, '58');\n if (countryCode !== BRCODE_COUNTRY_CODE) {\n return failure('UNSUPPORTED_FORMAT', `BR Code country code must be ${BRCODE_COUNTRY_CODE}`);\n }\n\n const merchantName = findTlvField(rootFields, '59');\n const merchantCity = findTlvField(rootFields, '60');\n if (!merchantName || !merchantCity) {\n return failure('UNSUPPORTED_FORMAT', 'BR Code payload must include merchant name (59) and city (60)');\n }\n\n const amount = findTlvField(rootFields, '54');\n const txid = extractTxid(findTlvField(rootFields, '62'));\n\n let pixKeyType: PixKeyType | undefined;\n let pixKey: PixKey | undefined;\n\n if (pixAccount.pixKey) {\n const keyResult = validatePixKey(pixAccount.pixKey);\n if (!keyResult.ok) {\n return failure(keyResult.code, keyResult.message);\n }\n pixKey = keyResult.value;\n pixKeyType = keyResult.keyType;\n }\n\n return {\n ok: true,\n payload: '',\n fields: {\n merchantName,\n merchantCity,\n ...(amount ? { amount } : {}),\n ...(txid ? { txid } : {}),\n ...(pixKey ? { pixKey, pixKeyType } : {}),\n ...(pixAccount.pixInitiationUrl ? { pixInitiationUrl: pixAccount.pixInitiationUrl } : {}),\n },\n };\n}\n\nexport function parseBrCodePayload(input: string): BrCodeParseResult {\n const normalized = normalizeBrCodePayload(input);\n\n if (normalized.length === 0) {\n return failure('EMPTY_INPUT', 'BR Code payload is empty');\n }\n\n if (!/^[\\x20-\\x7E]+$/.test(normalized)) {\n return failure('INVALID_CHARACTER', 'BR Code payload contains invalid characters');\n }\n\n const crc = verifyBrCodeCrc(normalized);\n if (!crc.ok) {\n return failure('INVALID_CHECK_DIGIT', crc.message);\n }\n\n const withoutCrc = normalized.slice(0, -BRCODE_CRC_LENGTH);\n const crcTagHeader = `${BRCODE_CRC_TAG}${String(BRCODE_CRC_LENGTH).padStart(2, '0')}`;\n const tlv = parseTlvSequence(withoutCrc.slice(0, -crcTagHeader.length));\n if (!tlv.ok) {\n return failure('UNSUPPORTED_FORMAT', tlv.message);\n }\n\n const parsed = parseFields(tlv.fields);\n if (!parsed.ok) {\n return parsed;\n }\n\n return {\n ok: true,\n payload: normalized,\n fields: parsed.fields,\n };\n}\n","/**\n * BR Code (PIX QR) payload parsing — EMV TLV + CRC16-CCITT.\n * @see https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf\n */\nimport type { BrCodeValidationResult } from '../../types/validation-result.js';\nimport { brandBrCodePayload } from '../../types/validation-result.js';\nimport { parseBrCodePayload } from './parse.js';\n\nexport {\n BRCODE_COUNTRY_CODE,\n BRCODE_CURRENCY_BRL,\n BRCODE_GOLDEN_COMPOSITE,\n BRCODE_GOLDEN_DYNAMIC_URL,\n BRCODE_GOLDEN_STATIC_CPF,\n BRCODE_GOLDEN_STATIC_EMAIL,\n BRCODE_GOLDEN_STATIC_EVP,\n BRCODE_OFFICIAL_SOURCE_URL,\n BRCODE_PAYLOAD_FORMAT_INDICATOR,\n BRCODE_PIX_GUI,\n BRCODE_PIX_INITIATION_MANUAL_URL,\n} from './constants.js';\nexport { computeCrc16Ccitt, verifyBrCodeCrc } from './crc16.js';\nexport { normalizeBrCodePayload, parseBrCodePayload } from './parse.js';\nexport { findPixMerchantAccount, findTlvField, parseTlvSequence } from './tlv.js';\nexport type { TlvField, TlvParseResult } from './tlv.js';\nexport type { BrCodeParseResult, BrCodeParsedFields } from './parse.js';\n\nexport function isValidBrCode(input: string): boolean {\n return validateBrCode(input).ok;\n}\n\nexport function parseBrCode(input: string): BrCodeValidationResult {\n const parsed = parseBrCodePayload(input);\n if (!parsed.ok) {\n return { ok: false, code: parsed.code, message: parsed.message };\n }\n\n const { fields, payload } = parsed;\n\n return {\n ok: true,\n value: brandBrCodePayload(payload),\n format: 'brcode',\n merchantName: fields.merchantName,\n merchantCity: fields.merchantCity,\n ...(fields.amount ? { amount: fields.amount } : {}),\n ...(fields.txid ? { txid: fields.txid } : {}),\n ...(fields.pixKey && fields.pixKeyType\n ? { pixKey: fields.pixKey, pixKeyType: fields.pixKeyType }\n : {}),\n ...(fields.pixInitiationUrl ? { pixInitiationUrl: fields.pixInitiationUrl } : {}),\n };\n}\n\nexport function validateBrCode(input: string): BrCodeValidationResult {\n const parsed = parseBrCode(input);\n if (!parsed.ok) {\n return parsed;\n }\n\n if (!parsed.pixKey || !parsed.pixKeyType) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'BR Code validation requires a static PIX key (merchant account subfield 01)',\n };\n }\n\n return parsed;\n}\n"]} |
| import { stripCep } from './chunk-W6UXVWSR.js'; | ||
| import { brandCep } from './chunk-BBL6ZPXH.js'; | ||
| // src/core/cep/constants.ts | ||
| var CEP_LENGTH = 8; | ||
| var CEP_MASK_PATTERN = /^(\d{5})(\d{3})$/; | ||
| var CEP_GOLDEN_PRIMARY = "01310100"; | ||
| var CEP_GOLDEN_SECONDARY = "20040020"; | ||
| var CEP_GOLDEN_PRIMARY_MASKED = "01310-100"; | ||
| var CEP_OFFICIAL_SOURCE_URL = "https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep"; | ||
| // src/core/cep/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "CEP input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[-\s]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "CEP contains invalid characters"); | ||
| } | ||
| if (stripped.length !== CEP_LENGTH) { | ||
| return failure("INVALID_LENGTH", `CEP must have ${CEP_LENGTH} digits after normalization`); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidCep(input) { | ||
| return validateCep(input).ok; | ||
| } | ||
| function validateCep(input) { | ||
| const stripped = stripCep(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| return { ok: true, value: brandCep(stripped), format: "numeric" }; | ||
| } | ||
| // src/core/cep/mask.ts | ||
| function applyCepMask(canonical) { | ||
| const match = CEP_MASK_PATTERN.exec(canonical); | ||
| if (!match) { | ||
| throw new Error("CEP must have exactly 8 digits to apply mask"); | ||
| } | ||
| return `${match[1]}-${match[2]}`; | ||
| } | ||
| // src/format/cep.ts | ||
| function formatCep(input) { | ||
| const result = validateCep(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyCepMask(result.value) }; | ||
| } | ||
| export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep }; | ||
| //# sourceMappingURL=chunk-GLKGX552.js.map | ||
| //# sourceMappingURL=chunk-GLKGX552.js.map |
| {"version":3,"sources":["../src/core/cep/constants.ts","../src/core/cep/index.ts","../src/core/cep/mask.ts","../src/format/cep.ts"],"names":[],"mappings":";;;;AAKO,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,gBAAA,GAAmB,kBAAA;AAGzB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,yBAAA,GAA4B;AAClC,IAAM,uBAAA,GACX;;;ACMF,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEA,SAAS,iBAAA,CAAkB,OAAe,QAAA,EAAuC;AAC/E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,eAAe,oBAAoB,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC9C,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,OAAA,CAAQ,qBAAqB,iCAAiC,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,UAAA,EAAY;AAClC,IAAA,OAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAA,cAAA,EAAiB,UAAU,CAAA,2BAAA,CAA6B,CAAA;AAAA,EAC3F;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,EAAA;AAC5B;AAEO,SAAS,YAAY,KAAA,EAAiC;AAC3D,EAAA,MAAM,QAAA,GAAW,SAAS,KAAK,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AACpD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,SAAS,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAClE;;;ACjDO,SAAS,aAAa,SAAA,EAA2B;AACtD,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA;AAC7C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAChC;;;ACLO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3D","file":"chunk-GLKGX552.js","sourcesContent":["/**\n * CEP constants — 8 digits, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nexport const CEP_LENGTH = 8;\nexport const CEP_MASK_PATTERN = /^(\\d{5})(\\d{3})$/;\nexport const CEP_NUMERIC_PATTERN = /^\\d{8}$/;\n\nexport const CEP_GOLDEN_PRIMARY = '01310100';\nexport const CEP_GOLDEN_SECONDARY = '20040020';\nexport const CEP_GOLDEN_PRIMARY_MASKED = '01310-100';\nexport const CEP_OFFICIAL_SOURCE_URL =\n 'https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep';\n","/**\n * CEP validation — structural only, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nimport { stripCep } from '../../strip/index.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCep } from '../../types/validation-result.js';\nimport { CEP_LENGTH } from './constants.js';\n\nexport {\n CEP_GOLDEN_PRIMARY,\n CEP_GOLDEN_PRIMARY_MASKED,\n CEP_GOLDEN_SECONDARY,\n CEP_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CEP input is empty');\n }\n\n const withoutMask = input.replace(/[-\\s]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CEP contains invalid characters');\n }\n\n if (stripped.length !== CEP_LENGTH) {\n return failure('INVALID_LENGTH', `CEP must have ${CEP_LENGTH} digits after normalization`);\n }\n\n return null;\n}\n\nexport function isValidCep(input: string): boolean {\n return validateCep(input).ok;\n}\n\nexport function validateCep(input: string): ValidationResult {\n const stripped = stripCep(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n return { ok: true, value: brandCep(stripped), format: 'numeric' };\n}\n","import { CEP_MASK_PATTERN } from './constants.js';\n\n/** Mask XXXXX-XXX (BR-CEP-004). */\nexport function applyCepMask(canonical: string): string {\n const match = CEP_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CEP must have exactly 8 digits to apply mask');\n }\n return `${match[1]}-${match[2]}`;\n}\n","import { applyCepMask } from '../core/cep/mask.js';\nimport { validateCep } from '../core/cep/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCep(input: string): FormatResult {\n const result = validateCep(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCepMask(result.value) };\n}\n"]} |
| import { computeCheckDigit } from './chunk-B2TDI3YS.js'; | ||
| import { brandPisPasep } from './chunk-BBL6ZPXH.js'; | ||
| // src/strip/pis-pasep.ts | ||
| function stripPisPasep(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| // src/core/pis-pasep/constants.ts | ||
| var PIS_PASEP_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var PIS_PASEP_LENGTH = 11; | ||
| var PIS_PASEP_BASE_LENGTH = 10; | ||
| var PIS_PASEP_MASK_PATTERN = /^(\d{3})(\d{5})(\d{2})(\d{1})$/; | ||
| var PIS_PASEP_GOLDEN_PRIMARY = "10027230888"; | ||
| var PIS_PASEP_GOLDEN_SECONDARY = "12056456402"; | ||
| var PIS_PASEP_GOLDEN_PRIMARY_MASKED = "100.27230.88-8"; | ||
| var PIS_PASEP_OFFICIAL_SOURCE_URL = "https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf"; | ||
| // src/core/pis-pasep/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function digitValue(char) { | ||
| return Number(char); | ||
| } | ||
| function hasRepeatedDigits(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function isValidPisPasepChecksum(stripped) { | ||
| const base = stripped.slice(0, PIS_PASEP_BASE_LENGTH); | ||
| const dvExpected = String(computeCheckDigit(base, PIS_PASEP_DV_WEIGHTS, digitValue)); | ||
| return stripped.charAt(PIS_PASEP_BASE_LENGTH) === dvExpected; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "PIS/PASEP input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[.-]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "PIS/PASEP contains invalid characters"); | ||
| } | ||
| if (stripped.length !== PIS_PASEP_LENGTH) { | ||
| return failure("INVALID_LENGTH", `PIS/PASEP must have ${PIS_PASEP_LENGTH} digits after normalization`); | ||
| } | ||
| if (hasRepeatedDigits(stripped)) { | ||
| return failure("KNOWN_INVALID_PATTERN", "PIS/PASEP with all identical digits is invalid"); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidPisPasep(input) { | ||
| return validatePisPasep(input).ok; | ||
| } | ||
| function validatePisPasep(input) { | ||
| const stripped = stripPisPasep(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| if (isValidPisPasepChecksum(stripped)) { | ||
| return { ok: true, value: brandPisPasep(stripped), format: "numeric" }; | ||
| } | ||
| return failure("INVALID_CHECK_DIGIT", "PIS/PASEP check digit is invalid"); | ||
| } | ||
| // src/core/pis-pasep/mask.ts | ||
| function applyPisPasepMask(canonical) { | ||
| const match = PIS_PASEP_MASK_PATTERN.exec(canonical); | ||
| if (!match) { | ||
| throw new Error("PIS/PASEP must have exactly 11 digits to apply mask"); | ||
| } | ||
| return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`; | ||
| } | ||
| // src/format/pis-pasep.ts | ||
| function formatPisPasep(input) { | ||
| const result = validatePisPasep(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyPisPasepMask(result.value) }; | ||
| } | ||
| export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, formatPisPasep, isValidPisPasep, stripPisPasep, validatePisPasep }; | ||
| //# sourceMappingURL=chunk-GN7QIQE6.js.map | ||
| //# sourceMappingURL=chunk-GN7QIQE6.js.map |
| {"version":3,"sources":["../src/strip/pis-pasep.ts","../src/core/pis-pasep/constants.ts","../src/core/pis-pasep/index.ts","../src/core/pis-pasep/mask.ts","../src/format/pis-pasep.ts"],"names":[],"mappings":"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","file":"chunk-GN7QIQE6.js","sourcesContent":["/**\n * Strip PIS/PASEP mask — digits only (BR-PIS-002).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n */\nexport function stripPisPasep(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * PIS/PASEP/NIS/NIT constants — modulo 11 (CNIS unified registry).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n * @see docs/use-cases/UC-006-validate-pis-pasep.md — golden vector 10027230888\n *\n * PIS, PASEP, NIS, and NIT share the same 11-digit algorithm and check-digit weights.\n */\nexport const PIS_PASEP_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const PIS_PASEP_LENGTH = 11;\nexport const PIS_PASEP_BASE_LENGTH = 10;\nexport const PIS_PASEP_MASK_PATTERN = /^(\\d{3})(\\d{5})(\\d{2})(\\d{1})$/;\n\nexport const PIS_PASEP_GOLDEN_PRIMARY = '10027230888';\nexport const PIS_PASEP_GOLDEN_SECONDARY = '12056456402';\nexport const PIS_PASEP_GOLDEN_PRIMARY_MASKED = '100.27230.88-8';\nexport const PIS_PASEP_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf';\n","/**\n * PIS/PASEP validation — modulo 11 (CNIS unified registry).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n * @see docs/use-cases/UC-006-validate-pis-pasep.md — golden vector 10027230888\n */\nimport { stripPisPasep } from '../../strip/pis-pasep.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandPisPasep } from '../../types/validation-result.js';\nimport { computeCheckDigit } from '../cnpj/modulo11.js';\nimport {\n PIS_PASEP_BASE_LENGTH,\n PIS_PASEP_DV_WEIGHTS,\n PIS_PASEP_LENGTH,\n} from './constants.js';\n\nexport {\n PIS_PASEP_GOLDEN_PRIMARY,\n PIS_PASEP_GOLDEN_PRIMARY_MASKED,\n PIS_PASEP_GOLDEN_SECONDARY,\n PIS_PASEP_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction isValidPisPasepChecksum(stripped: string): boolean {\n const base = stripped.slice(0, PIS_PASEP_BASE_LENGTH);\n const dvExpected = String(computeCheckDigit(base, PIS_PASEP_DV_WEIGHTS, digitValue));\n return stripped.charAt(PIS_PASEP_BASE_LENGTH) === dvExpected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'PIS/PASEP input is empty');\n }\n\n const withoutMask = input.replace(/[.-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'PIS/PASEP contains invalid characters');\n }\n\n if (stripped.length !== PIS_PASEP_LENGTH) {\n return failure('INVALID_LENGTH', `PIS/PASEP must have ${PIS_PASEP_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'PIS/PASEP with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidPisPasep(input: string): boolean {\n return validatePisPasep(input).ok;\n}\n\nexport function validatePisPasep(input: string): ValidationResult {\n const stripped = stripPisPasep(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidPisPasepChecksum(stripped)) {\n return { ok: true, value: brandPisPasep(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'PIS/PASEP check digit is invalid');\n}\n","import { PIS_PASEP_MASK_PATTERN } from './constants.js';\n\n/** Mask XXX.XXXXX.XX-X (BR-PIS-006). */\nexport function applyPisPasepMask(canonical: string): string {\n const match = PIS_PASEP_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('PIS/PASEP must have exactly 11 digits to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;\n}\n","import { applyPisPasepMask } from '../core/pis-pasep/mask.js';\nimport { validatePisPasep } from '../core/pis-pasep/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatPisPasep(input: string): FormatResult {\n const result = validatePisPasep(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyPisPasepMask(result.value) };\n}\n"]} |
| import { brandCodigoBarras, brandLinhaDigitavel } from './chunk-BBL6ZPXH.js'; | ||
| // src/core/boleto/constants.ts | ||
| var BOLETO_LINHA_LENGTH = 47; | ||
| var BOLETO_CODIGO_BARRAS_LENGTH = 44; | ||
| var BOLETO_CURRENCY_REAL = "9"; | ||
| var BOLETO_CODE_ISPB_HOLDER = "988"; | ||
| var BOLETO_CURRENCY_ISPB = "0"; | ||
| var BOLETO_GOLDEN_LINHA_MASKED = "03399.02579 08991.834006 71742.301014 6 14500000099668"; | ||
| var BOLETO_GOLDEN_LINHA_STRIPPED = "03399025790899183400671742301014614500000099668"; | ||
| var BOLETO_GOLDEN_CODIGO_BARRAS = "03396145000000996689025708991834007174230101"; | ||
| var BOLETO_GOLDEN_LINHA_BB_STRIPPED = "00191234546789012345767890123457112340000001500"; | ||
| var BOLETO_GOLDEN_CODIGO_BARRAS_BB = "00191123400000015001234567890123456789012345"; | ||
| var BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED = "98801234516789012345767890123457760746948000112"; | ||
| var BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2 = "98807607469480001121234567890123456789012345"; | ||
| var BOLETO_OFFICIAL_SOURCE_URL = "https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf"; | ||
| var BOLETO_LAYOUTS_PORTAL_URL = "https://portal.febraban.org.br/pagina/3425/33/pt-br/layout-febraban"; | ||
| // src/core/boleto/detect-situacao.ts | ||
| function toBoletoSituacaoCode(kind) { | ||
| if (kind === "situacao-1") { | ||
| return "1"; | ||
| } | ||
| if (kind === "situacao-2") { | ||
| return "2"; | ||
| } | ||
| return void 0; | ||
| } | ||
| function detectBoletoSituacao(stripped) { | ||
| if (stripped.length !== BOLETO_LINHA_LENGTH && stripped.length !== BOLETO_CODIGO_BARRAS_LENGTH) { | ||
| return "unknown"; | ||
| } | ||
| if (stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER) { | ||
| if (stripped.charAt(3) === BOLETO_CURRENCY_ISPB) { | ||
| return "situacao-2"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| if (stripped.charAt(3) === BOLETO_CURRENCY_REAL) { | ||
| return "situacao-1"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/boleto/modulo11.ts | ||
| function computeModulo11BarcodeDv(barcodeWithoutDv) { | ||
| let multiplier = 2; | ||
| let sum = 0; | ||
| for (let i = barcodeWithoutDv.length - 1; i >= 0; i--) { | ||
| sum += Number(barcodeWithoutDv[i]) * multiplier; | ||
| multiplier = multiplier >= 9 ? 2 : multiplier + 1; | ||
| } | ||
| const remainder = sum % 11; | ||
| let dv = 11 - remainder; | ||
| if (dv === 0 || dv === 10 || dv === 11) { | ||
| dv = 1; | ||
| } | ||
| return dv; | ||
| } | ||
| // src/core/boleto/codigo-barras.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message, inputKind: "codigo-barras" }; | ||
| } | ||
| function stripCodigoBarras(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function validateCodigoBarras(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "C\xF3digo de barras input is empty" }; | ||
| } | ||
| if (/[^0-9]/.test(trimmed)) { | ||
| return failure("INVALID_CHARACTER", "C\xF3digo de barras contains invalid characters"); | ||
| } | ||
| if (trimmed.length !== BOLETO_CODIGO_BARRAS_LENGTH) { | ||
| return failure("INVALID_LENGTH", `C\xF3digo de barras must have ${BOLETO_CODIGO_BARRAS_LENGTH} digits`); | ||
| } | ||
| const situacaoKind = detectBoletoSituacao(trimmed); | ||
| if (situacaoKind === "unknown") { | ||
| const isIspbHolder = trimmed.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER; | ||
| const message = isIspbHolder ? "ISPB holder boleto (code 988) requires currency indicator 0 (Situa\xE7\xE3o 2)" : "Bank boleto currency code must be 9 (Real) for Situa\xE7\xE3o 1"; | ||
| return failure("UNSUPPORTED_FORMAT", message); | ||
| } | ||
| if (trimmed.charAt(4) === "0") { | ||
| return failure("INVALID_CHECK_DIGIT", "Barcode DV cannot be 0"); | ||
| } | ||
| const expectedDv = String(computeModulo11BarcodeDv(trimmed.slice(0, 4) + trimmed.slice(5))); | ||
| if (trimmed.charAt(4) !== expectedDv) { | ||
| return failure("INVALID_CHECK_DIGIT", "C\xF3digo de barras check digit is invalid"); | ||
| } | ||
| const situacao = toBoletoSituacaoCode(situacaoKind); | ||
| return { | ||
| ok: true, | ||
| value: brandCodigoBarras(trimmed), | ||
| inputKind: "codigo-barras", | ||
| format: "codigo-barras", | ||
| situacao | ||
| }; | ||
| } | ||
| // src/core/boleto/modulo10.ts | ||
| function computeModulo10FieldDv(digits) { | ||
| let multiplier = 2; | ||
| let sum = 0; | ||
| for (let i = digits.length - 1; i >= 0; i--) { | ||
| let product = Number(digits[i]) * multiplier; | ||
| if (product > 9) { | ||
| product = Math.floor(product / 10) + product % 10; | ||
| } | ||
| sum += product; | ||
| multiplier = multiplier === 2 ? 1 : 2; | ||
| } | ||
| const remainder = sum % 10; | ||
| return remainder === 0 ? 0 : 10 - remainder; | ||
| } | ||
| // src/core/boleto/convert.ts | ||
| function convertLinhaToCodigoBarrasDigits(strippedLinha) { | ||
| return strippedLinha.slice(0, 4) + strippedLinha[32] + strippedLinha.slice(33, BOLETO_LINHA_LENGTH) + strippedLinha.slice(4, 9) + strippedLinha.slice(10, 20) + strippedLinha.slice(21, 31); | ||
| } | ||
| function convertCodigoBarrasToLinhaDigits(barcode) { | ||
| const field1 = barcode.slice(0, 4) + barcode.slice(19, 24); | ||
| const field2 = barcode.slice(24, 34); | ||
| const field3 = barcode.slice(34, BOLETO_CODIGO_BARRAS_LENGTH); | ||
| const field5 = barcode.slice(5, 9) + barcode.slice(9, 19); | ||
| const dv1 = String(computeModulo10FieldDv(field1)); | ||
| const dv2 = String(computeModulo10FieldDv(field2)); | ||
| const dv3 = String(computeModulo10FieldDv(field3)); | ||
| return field1 + dv1 + field2 + dv2 + field3 + dv3 + barcode[4] + field5; | ||
| } | ||
| // src/core/boleto/detect.ts | ||
| var LINHA_MASK_PATTERN = /^[0-9.\s]+$/; | ||
| function stripDigits(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function detectBoletoInputKind(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return "unknown"; | ||
| } | ||
| const digits = stripDigits(trimmed); | ||
| if (digits.length === 48 && digits.startsWith("8")) { | ||
| return "arrecadacao"; | ||
| } | ||
| if (digits.length === BOLETO_CODIGO_BARRAS_LENGTH && /^\d+$/.test(digits)) { | ||
| return "codigo-barras"; | ||
| } | ||
| if (digits.length === BOLETO_LINHA_LENGTH) { | ||
| if (/^\d+$/.test(trimmed)) { | ||
| return "linha-digitavel"; | ||
| } | ||
| if (LINHA_MASK_PATTERN.test(trimmed)) { | ||
| return "linha-digitavel"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/boleto/mask.ts | ||
| function applyLinhaDigitavelMask(stripped47) { | ||
| if (stripped47.length !== BOLETO_LINHA_LENGTH) { | ||
| throw new Error(`Linha digit\xE1vel must have exactly ${BOLETO_LINHA_LENGTH} digits to apply mask`); | ||
| } | ||
| return `${stripped47.slice(0, 5)}.${stripped47.slice(5, 10)} ${stripped47.slice(10, 15)}.${stripped47.slice(15, 21)} ${stripped47.slice(21, 26)}.${stripped47.slice(26, 32)} ${stripped47[32]} ${stripped47.slice(33)}`; | ||
| } | ||
| function formatLinhaDigitavel(stripped) { | ||
| return applyLinhaDigitavelMask(stripped); | ||
| } | ||
| // src/core/boleto/linha-digitavel.ts | ||
| var LINHA_MASK_PATTERN2 = /^[0-9.\s]+$/; | ||
| function failure2(code, message) { | ||
| return { ok: false, code, message, inputKind: "linha-digitavel" }; | ||
| } | ||
| function stripLinhaDigitavel(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function validateFieldDv(fieldDigits, actualDv, fieldNumber) { | ||
| const expected = String(computeModulo10FieldDv(fieldDigits)); | ||
| if (actualDv !== expected) { | ||
| return failure2("INVALID_CHECK_DIGIT", `Linha digit\xE1vel field ${fieldNumber} check digit is invalid`); | ||
| } | ||
| return null; | ||
| } | ||
| function validateLinhaDigitavel(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Linha digit\xE1vel input is empty" }; | ||
| } | ||
| if (!LINHA_MASK_PATTERN2.test(trimmed)) { | ||
| return failure2("INVALID_CHARACTER", "Linha digit\xE1vel contains invalid characters"); | ||
| } | ||
| const stripped = stripLinhaDigitavel(trimmed); | ||
| if (stripped.length !== BOLETO_LINHA_LENGTH) { | ||
| return failure2("INVALID_LENGTH", `Linha digit\xE1vel must have ${BOLETO_LINHA_LENGTH} digits after normalization`); | ||
| } | ||
| const situacaoKind = detectBoletoSituacao(stripped); | ||
| if (situacaoKind === "unknown") { | ||
| const isIspbHolder = stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER; | ||
| const message = isIspbHolder ? "ISPB holder boleto (code 988) requires currency indicator 0 (Situa\xE7\xE3o 2)" : "Bank boleto currency code must be 9 (Real) for Situa\xE7\xE3o 1"; | ||
| return failure2("UNSUPPORTED_FORMAT", message); | ||
| } | ||
| const field1Error = validateFieldDv(stripped.slice(0, 9), stripped.charAt(9), 1); | ||
| if (field1Error) { | ||
| return field1Error; | ||
| } | ||
| const field2Error = validateFieldDv(stripped.slice(10, 20), stripped.charAt(20), 2); | ||
| if (field2Error) { | ||
| return field2Error; | ||
| } | ||
| const field3Error = validateFieldDv(stripped.slice(21, 31), stripped.charAt(31), 3); | ||
| if (field3Error) { | ||
| return field3Error; | ||
| } | ||
| const barcode = convertLinhaToCodigoBarrasDigits(stripped); | ||
| const barcodeDvFromMod11 = String( | ||
| computeModulo11BarcodeDv(barcode.slice(0, 4) + barcode.slice(5)) | ||
| ); | ||
| if (stripped.charAt(32) !== barcodeDvFromMod11) { | ||
| return failure2("INVALID_CHECK_DIGIT", "Linha digit\xE1vel field 4 (barcode DV) is invalid"); | ||
| } | ||
| const situacao = toBoletoSituacaoCode(situacaoKind); | ||
| return { | ||
| ok: true, | ||
| value: brandLinhaDigitavel(stripped), | ||
| inputKind: "linha-digitavel", | ||
| format: "linha-digitavel", | ||
| situacao | ||
| }; | ||
| } | ||
| // src/core/boleto/fator-vencimento.ts | ||
| var FATOR_MIN = 1; | ||
| var FATOR_SEMANTIC_MAX = 9997; | ||
| function validateFatorVencimento(factor) { | ||
| if (!/^\d{4}$/.test(factor)) { | ||
| return { | ||
| ok: false, | ||
| code: "INVALID_LENGTH", | ||
| message: "Due-date factor must have exactly 4 digits" | ||
| }; | ||
| } | ||
| if (factor === "0000") { | ||
| return { ok: true, factor, hasDueDate: false }; | ||
| } | ||
| const days = Number(factor); | ||
| if (days < FATOR_MIN || days > FATOR_SEMANTIC_MAX) { | ||
| return { | ||
| ok: false, | ||
| code: "UNSUPPORTED_FORMAT", | ||
| message: "Due-date factor is out of the supported range" | ||
| }; | ||
| } | ||
| return { ok: true, factor, hasDueDate: true }; | ||
| } | ||
| // src/core/boleto/valor-documento.ts | ||
| function validateValorDocumento(value) { | ||
| if (!/^\d{10}$/.test(value)) { | ||
| return { | ||
| ok: false, | ||
| code: "INVALID_LENGTH", | ||
| message: "Document amount must have exactly 10 digits (centavos)" | ||
| }; | ||
| } | ||
| return { ok: true, amountCents: Number(value) }; | ||
| } | ||
| // src/core/boleto/semantic.ts | ||
| function failure3(code, message, inputKind) { | ||
| return { ok: false, code, message, inputKind }; | ||
| } | ||
| function validateSemanticFields(barcode, options, inputKind) { | ||
| if (detectBoletoSituacao(barcode) !== "situacao-1") { | ||
| return null; | ||
| } | ||
| if (options.validateDueFactor) { | ||
| const factorResult = validateFatorVencimento(barcode.slice(5, 9)); | ||
| if (!factorResult.ok) { | ||
| return failure3(factorResult.code, factorResult.message, inputKind); | ||
| } | ||
| } | ||
| if (options.validateAmount && detectBoletoSituacao(barcode) === "situacao-1") { | ||
| validateValorDocumento(barcode.slice(9, 19)); | ||
| } | ||
| return null; | ||
| } | ||
| // src/core/boleto/index.ts | ||
| function failure4(code, message, inputKind) { | ||
| return { ok: false, code, message, ...inputKind ? { inputKind } : {} }; | ||
| } | ||
| function validateByKind(input, kind, options) { | ||
| const result = kind === "linha-digitavel" ? validateLinhaDigitavel(input) : validateCodigoBarras(input); | ||
| if (!result.ok) { | ||
| return result; | ||
| } | ||
| const barcode = kind === "linha-digitavel" ? convertLinhaToCodigoBarrasDigits(result.value) : result.value; | ||
| const semanticError = validateSemanticFields(barcode, options ?? {}, kind); | ||
| if (semanticError) { | ||
| return semanticError; | ||
| } | ||
| return result; | ||
| } | ||
| function isValidBoleto(input, options) { | ||
| return validateBoleto(input, options).ok; | ||
| } | ||
| function validateBoleto(input, options) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure4("EMPTY_INPUT", "Boleto input is empty"); | ||
| } | ||
| const detected = detectBoletoInputKind(trimmed); | ||
| if (detected === "arrecadacao") { | ||
| return failure4("UNSUPPORTED_FORMAT", "48-digit arrecada\xE7\xE3o slips are not supported"); | ||
| } | ||
| if (options?.kind !== void 0) { | ||
| if (detected !== "unknown" && detected !== options.kind) { | ||
| return failure4( | ||
| "UNSUPPORTED_FORMAT", | ||
| `Boleto detected as ${detected} but forced kind is ${options.kind}`, | ||
| options.kind | ||
| ); | ||
| } | ||
| return validateByKind(trimmed, options.kind, options); | ||
| } | ||
| if (detected === "unknown") { | ||
| return failure4("UNSUPPORTED_FORMAT", "Boleto input kind could not be determined"); | ||
| } | ||
| return validateByKind(trimmed, detected, options); | ||
| } | ||
| function convertLinhaToCodigoBarras(input) { | ||
| const result = validateLinhaDigitavel(input); | ||
| if (!result.ok) { | ||
| return result; | ||
| } | ||
| const barcode = convertLinhaToCodigoBarrasDigits(result.value); | ||
| return { | ||
| ok: true, | ||
| value: brandCodigoBarras(barcode), | ||
| inputKind: "codigo-barras", | ||
| format: "codigo-barras", | ||
| situacao: result.situacao | ||
| }; | ||
| } | ||
| function convertCodigoBarrasToLinhaDigitavel(input) { | ||
| const result = validateCodigoBarras(input); | ||
| if (!result.ok) { | ||
| return result; | ||
| } | ||
| const linha = convertCodigoBarrasToLinhaDigits(result.value); | ||
| return { | ||
| ok: true, | ||
| value: brandLinhaDigitavel(linha), | ||
| inputKind: "linha-digitavel", | ||
| format: "linha-digitavel", | ||
| situacao: result.situacao | ||
| }; | ||
| } | ||
| // src/format/boleto.ts | ||
| function formatBoleto(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Boleto input is empty" }; | ||
| } | ||
| const kind = detectBoletoInputKind(trimmed); | ||
| if (kind === "codigo-barras") { | ||
| return { | ||
| ok: false, | ||
| code: "UNSUPPORTED_FORMAT", | ||
| message: "Boleto barcode formatting is not supported in v1" | ||
| }; | ||
| } | ||
| const result = validateLinhaDigitavel(trimmed); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyLinhaDigitavelMask(result.value) }; | ||
| } | ||
| export { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento }; | ||
| //# sourceMappingURL=chunk-IW3ESGWH.js.map | ||
| //# sourceMappingURL=chunk-IW3ESGWH.js.map |
| {"version":3,"sources":["../src/core/boleto/constants.ts","../src/core/boleto/detect-situacao.ts","../src/core/boleto/modulo11.ts","../src/core/boleto/codigo-barras.ts","../src/core/boleto/modulo10.ts","../src/core/boleto/convert.ts","../src/core/boleto/detect.ts","../src/core/boleto/mask.ts","../src/core/boleto/linha-digitavel.ts","../src/core/boleto/fator-vencimento.ts","../src/core/boleto/valor-documento.ts","../src/core/boleto/semantic.ts","../src/core/boleto/index.ts","../src/format/boleto.ts"],"names":["LINHA_MASK_PATTERN","failure"],"mappings":"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","file":"chunk-IW3ESGWH.js","sourcesContent":["/**\n * FEBRABAN bank boleto (cobrança) — linha digitável + código de barras.\n * @see Convenção da Cobrança FB-0061/2021 — Anexos V, VI, IX, X\n * @see https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf\n */\n\nexport const BOLETO_LINHA_LENGTH = 47;\nexport const BOLETO_CODIGO_BARRAS_LENGTH = 44;\nexport const BOLETO_CURRENCY_REAL = '9';\nexport const BOLETO_CODE_ISPB_HOLDER = '988';\nexport const BOLETO_CURRENCY_ISPB = '0';\n\nexport const BOLETO_GOLDEN_LINHA_MASKED =\n '03399.02579 08991.834006 71742.301014 6 14500000099668';\nexport const BOLETO_GOLDEN_LINHA_STRIPPED =\n '03399025790899183400671742301014614500000099668';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS =\n '03396145000000996689025708991834007174230101';\n\nexport const BOLETO_GOLDEN_LINHA_BB_STRIPPED =\n '00191234546789012345767890123457112340000001500';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_BB =\n '00191123400000015001234567890123456789012345';\n\nexport const BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED =\n '98801234516789012345767890123457760746948000112';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2 =\n '98807607469480001121234567890123456789012345';\n\nexport const BOLETO_OFFICIAL_SOURCE_URL =\n 'https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf';\n\nexport const BOLETO_LAYOUTS_PORTAL_URL =\n 'https://portal.febraban.org.br/pagina/3425/33/pt-br/layout-febraban';\n","/**\n * Situação 1 vs Situação 2 detection (Anexo V §2.3.2).\n * @see BR-BOLETO-011\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_CURRENCY_ISPB,\n BOLETO_CURRENCY_REAL,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type BoletoSituacaoKind = 'situacao-1' | 'situacao-2' | 'unknown';\n\nexport type BoletoSituacaoCode = '1' | '2';\n\nexport function toBoletoSituacaoCode(kind: BoletoSituacaoKind): BoletoSituacaoCode | undefined {\n if (kind === 'situacao-1') {\n return '1';\n }\n if (kind === 'situacao-2') {\n return '2';\n }\n return undefined;\n}\n\nexport function detectBoletoSituacao(stripped: string): BoletoSituacaoKind {\n if (\n stripped.length !== BOLETO_LINHA_LENGTH &&\n stripped.length !== BOLETO_CODIGO_BARRAS_LENGTH\n ) {\n return 'unknown';\n }\n\n if (stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER) {\n if (stripped.charAt(3) === BOLETO_CURRENCY_ISPB) {\n return 'situacao-2';\n }\n return 'unknown';\n }\n\n if (stripped.charAt(3) === BOLETO_CURRENCY_REAL) {\n return 'situacao-1';\n }\n\n return 'unknown';\n}\n","/**\n * Modulo 11 — código de barras general DV (Anexo X).\n */\nexport function computeModulo11BarcodeDv(barcodeWithoutDv: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = barcodeWithoutDv.length - 1; i >= 0; i--) {\n sum += Number(barcodeWithoutDv[i]) * multiplier;\n multiplier = multiplier >= 9 ? 2 : multiplier + 1;\n }\n\n const remainder = sum % 11;\n let dv = 11 - remainder;\n if (dv === 0 || dv === 10 || dv === 11) {\n dv = 1;\n }\n return dv;\n}\n","/**\n * Código de barras validation — modulo 11 general DV (Anexo X).\n * @see BR-BOLETO-003, BR-BOLETO-004, BR-BOLETO-010\n */\nimport type { BoletoSituacao, BoletoValidationResult } from '../../types/validation-result.js';\nimport { brandCodigoBarras } from '../../types/validation-result.js';\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n} from './constants.js';\nimport { detectBoletoSituacao, toBoletoSituacaoCode } from './detect-situacao.js';\nimport { computeModulo11BarcodeDv } from './modulo11.js';\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, inputKind: 'codigo-barras' };\n}\n\nexport function stripCodigoBarras(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nexport function validateCodigoBarras(input: string): BoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Código de barras input is empty' };\n }\n\n if (/[^0-9]/.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Código de barras contains invalid characters');\n }\n\n if (trimmed.length !== BOLETO_CODIGO_BARRAS_LENGTH) {\n return failure('INVALID_LENGTH', `Código de barras must have ${BOLETO_CODIGO_BARRAS_LENGTH} digits`);\n }\n\n const situacaoKind = detectBoletoSituacao(trimmed);\n if (situacaoKind === 'unknown') {\n const isIspbHolder = trimmed.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;\n const message = isIspbHolder\n ? 'ISPB holder boleto (code 988) requires currency indicator 0 (Situação 2)'\n : 'Bank boleto currency code must be 9 (Real) for Situação 1';\n return failure('UNSUPPORTED_FORMAT', message);\n }\n\n if (trimmed.charAt(4) === '0') {\n return failure('INVALID_CHECK_DIGIT', 'Barcode DV cannot be 0');\n }\n\n const expectedDv = String(computeModulo11BarcodeDv(trimmed.slice(0, 4) + trimmed.slice(5)));\n if (trimmed.charAt(4) !== expectedDv) {\n return failure('INVALID_CHECK_DIGIT', 'Código de barras check digit is invalid');\n }\n\n const situacao = toBoletoSituacaoCode(situacaoKind) as BoletoSituacao;\n return {\n ok: true,\n value: brandCodigoBarras(trimmed),\n inputKind: 'codigo-barras',\n format: 'codigo-barras',\n situacao,\n };\n}\n","/**\n * Modulo 10 — linha digitável field DVs (Anexo IX).\n */\nexport function computeModulo10FieldDv(digits: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let product = Number(digits[i]) * multiplier;\n if (product > 9) {\n product = Math.floor(product / 10) + (product % 10);\n }\n sum += product;\n multiplier = multiplier === 2 ? 1 : 2;\n }\n\n const remainder = sum % 10;\n return remainder === 0 ? 0 : 10 - remainder;\n}\n","/**\n * Linha digitável ↔ código de barras conversion (Anexo V §2.3.4).\n * Situação 1 and Situação 2 share the same field permutation; campo 5 semantics differ\n * (fator+valor vs ISPB 14 digits).\n * @see BR-BOLETO-006\n */\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport function convertLinhaToCodigoBarrasDigits(strippedLinha: string): string {\n return (\n strippedLinha.slice(0, 4) +\n strippedLinha[32] +\n strippedLinha.slice(33, BOLETO_LINHA_LENGTH) +\n strippedLinha.slice(4, 9) +\n strippedLinha.slice(10, 20) +\n strippedLinha.slice(21, 31)\n );\n}\n\nexport function convertCodigoBarrasToLinhaDigits(barcode: string): string {\n const field1 = barcode.slice(0, 4) + barcode.slice(19, 24);\n const field2 = barcode.slice(24, 34);\n const field3 = barcode.slice(34, BOLETO_CODIGO_BARRAS_LENGTH);\n const field5 = barcode.slice(5, 9) + barcode.slice(9, 19);\n const dv1 = String(computeModulo10FieldDv(field1));\n const dv2 = String(computeModulo10FieldDv(field2));\n const dv3 = String(computeModulo10FieldDv(field3));\n return field1 + dv1 + field2 + dv2 + field3 + dv3 + barcode[4] + field5;\n}\n","/**\n * Boleto input kind detection — linha digitável (47) vs código de barras (44).\n * @see BR-BOLETO-001\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type DetectedBoletoInputKind = 'linha-digitavel' | 'codigo-barras' | 'arrecadacao' | 'unknown';\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction stripDigits(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nexport function detectBoletoInputKind(input: string): DetectedBoletoInputKind {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return 'unknown';\n }\n\n const digits = stripDigits(trimmed);\n\n if (digits.length === 48 && digits.startsWith('8')) {\n return 'arrecadacao';\n }\n\n if (digits.length === BOLETO_CODIGO_BARRAS_LENGTH && /^\\d+$/.test(digits)) {\n return 'codigo-barras';\n }\n\n if (digits.length === BOLETO_LINHA_LENGTH) {\n if (/^\\d+$/.test(trimmed)) {\n return 'linha-digitavel';\n }\n if (LINHA_MASK_PATTERN.test(trimmed)) {\n return 'linha-digitavel';\n }\n return 'unknown';\n }\n\n return 'unknown';\n}\n","/**\n * Linha digitável display mask — FEBRABAN Anexo IX (BR-BOLETO-008).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport { BOLETO_LINHA_LENGTH } from './constants.js';\n\n/** FEBRABAN typable linha digitável mask (47 digits). */\nexport function applyLinhaDigitavelMask(stripped47: string): string {\n if (stripped47.length !== BOLETO_LINHA_LENGTH) {\n throw new Error(`Linha digitável must have exactly ${BOLETO_LINHA_LENGTH} digits to apply mask`);\n }\n return (\n `${stripped47.slice(0, 5)}.${stripped47.slice(5, 10)} ` +\n `${stripped47.slice(10, 15)}.${stripped47.slice(15, 21)} ` +\n `${stripped47.slice(21, 26)}.${stripped47.slice(26, 32)} ` +\n `${stripped47[32]} ${stripped47.slice(33)}`\n );\n}\n\n/** Backward-compatible alias for applyLinhaDigitavelMask. */\nexport function formatLinhaDigitavel(stripped: string): string {\n return applyLinhaDigitavelMask(stripped);\n}\n","/**\n * Linha digitável validation — modulo 10 field DVs (Anexo IX).\n * @see BR-BOLETO-002, BR-BOLETO-008\n */\nimport type { BoletoSituacao, BoletoValidationResult } from '../../types/validation-result.js';\nimport { brandLinhaDigitavel } from '../../types/validation-result.js';\nimport {\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\nimport { convertLinhaToCodigoBarrasDigits } from './convert.js';\nimport { detectBoletoSituacao, toBoletoSituacaoCode } from './detect-situacao.js';\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport { computeModulo11BarcodeDv } from './modulo11.js';\n\nexport { applyLinhaDigitavelMask, formatLinhaDigitavel } from './mask.js';\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, inputKind: 'linha-digitavel' };\n}\n\nexport function stripLinhaDigitavel(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nfunction validateFieldDv(\n fieldDigits: string,\n actualDv: string,\n fieldNumber: 1 | 2 | 3,\n): FailedResult | null {\n const expected = String(computeModulo10FieldDv(fieldDigits));\n if (actualDv !== expected) {\n return failure('INVALID_CHECK_DIGIT', `Linha digitável field ${fieldNumber} check digit is invalid`);\n }\n return null;\n}\n\nexport function validateLinhaDigitavel(input: string): BoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Linha digitável input is empty' };\n }\n\n if (!LINHA_MASK_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Linha digitável contains invalid characters');\n }\n\n const stripped = stripLinhaDigitavel(trimmed);\n if (stripped.length !== BOLETO_LINHA_LENGTH) {\n return failure('INVALID_LENGTH', `Linha digitável must have ${BOLETO_LINHA_LENGTH} digits after normalization`);\n }\n\n const situacaoKind = detectBoletoSituacao(stripped);\n if (situacaoKind === 'unknown') {\n const isIspbHolder = stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;\n const message = isIspbHolder\n ? 'ISPB holder boleto (code 988) requires currency indicator 0 (Situação 2)'\n : 'Bank boleto currency code must be 9 (Real) for Situação 1';\n return failure('UNSUPPORTED_FORMAT', message);\n }\n\n const field1Error = validateFieldDv(stripped.slice(0, 9), stripped.charAt(9), 1);\n if (field1Error) {\n return field1Error;\n }\n\n const field2Error = validateFieldDv(stripped.slice(10, 20), stripped.charAt(20), 2);\n if (field2Error) {\n return field2Error;\n }\n\n const field3Error = validateFieldDv(stripped.slice(21, 31), stripped.charAt(31), 3);\n if (field3Error) {\n return field3Error;\n }\n\n const barcode = convertLinhaToCodigoBarrasDigits(stripped);\n const barcodeDvFromMod11 = String(\n computeModulo11BarcodeDv(barcode.slice(0, 4) + barcode.slice(5)),\n );\n\n if (stripped.charAt(32) !== barcodeDvFromMod11) {\n return failure('INVALID_CHECK_DIGIT', 'Linha digitável field 4 (barcode DV) is invalid');\n }\n\n const situacao = toBoletoSituacaoCode(situacaoKind) as BoletoSituacao;\n return {\n ok: true,\n value: brandLinhaDigitavel(stripped),\n inputKind: 'linha-digitavel',\n format: 'linha-digitavel',\n situacao,\n };\n}\n","/**\n * Due-date factor semantic validation (Situação 1 only).\n * @see BR-BOLETO-012\n */\nimport type { ValidationErrorCode } from '../../types/validation-result.js';\n\nconst FATOR_MIN = 1;\n/** FEBRABAN factor space; values above this fail optional semantic validation. */\nconst FATOR_SEMANTIC_MAX = 9997;\n\nexport type FatorVencimentoValidationResult =\n | { ok: true; factor: string; hasDueDate: boolean }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport function validateFatorVencimento(factor: string): FatorVencimentoValidationResult {\n if (!/^\\d{4}$/.test(factor)) {\n return {\n ok: false,\n code: 'INVALID_LENGTH',\n message: 'Due-date factor must have exactly 4 digits',\n };\n }\n\n if (factor === '0000') {\n return { ok: true, factor, hasDueDate: false };\n }\n\n const days = Number(factor);\n if (days < FATOR_MIN || days > FATOR_SEMANTIC_MAX) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'Due-date factor is out of the supported range',\n };\n }\n\n return { ok: true, factor, hasDueDate: true };\n}\n","/**\n * Document amount semantic validation (Situação 1 only).\n * @see BR-BOLETO-013\n */\nimport type { ValidationErrorCode } from '../../types/validation-result.js';\n\nexport type ValorDocumentoValidationResult =\n | { ok: true; amountCents: number }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport function validateValorDocumento(value: string): ValorDocumentoValidationResult {\n if (!/^\\d{10}$/.test(value)) {\n return {\n ok: false,\n code: 'INVALID_LENGTH',\n message: 'Document amount must have exactly 10 digits (centavos)',\n };\n }\n\n return { ok: true, amountCents: Number(value) };\n}\n","/**\n * Optional semantic checks for Situação 1 cobrança fields.\n * @see BR-BOLETO-012, BR-BOLETO-013\n */\nimport type { BoletoInputKind, BoletoValidationResult } from '../../types/validation-result.js';\nimport { detectBoletoSituacao } from './detect-situacao.js';\nimport { validateFatorVencimento } from './fator-vencimento.js';\nimport { validateValorDocumento } from './valor-documento.js';\n\nexport type SemanticValidationOptions = {\n validateDueFactor?: boolean;\n validateAmount?: boolean;\n};\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, inputKind: BoletoInputKind): FailedResult {\n return { ok: false, code, message, inputKind };\n}\n\nexport function validateSemanticFields(\n barcode: string,\n options: SemanticValidationOptions,\n inputKind: BoletoInputKind,\n): FailedResult | null {\n if (detectBoletoSituacao(barcode) !== 'situacao-1') {\n return null;\n }\n\n if (options.validateDueFactor) {\n const factorResult = validateFatorVencimento(barcode.slice(5, 9));\n if (!factorResult.ok) {\n return failure(factorResult.code, factorResult.message, inputKind);\n }\n }\n\n if (options.validateAmount && detectBoletoSituacao(barcode) === 'situacao-1') {\n validateValorDocumento(barcode.slice(9, 19));\n }\n\n return null;\n}\n","/**\n * Boleto validation — linha digitável + código de barras (FEBRABAN cobrança).\n * @see docs/use-cases/UC-007-validate-boleto.md\n */\nimport type { BoletoInputKind, BoletoValidationResult } from '../../types/validation-result.js';\nimport { brandCodigoBarras, brandLinhaDigitavel } from '../../types/validation-result.js';\nimport { validateCodigoBarras } from './codigo-barras.js';\nimport {\n convertCodigoBarrasToLinhaDigits,\n convertLinhaToCodigoBarrasDigits,\n} from './convert.js';\nimport { detectBoletoInputKind } from './detect.js';\nimport { validateLinhaDigitavel } from './linha-digitavel.js';\nimport { validateSemanticFields } from './semantic.js';\n\nexport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_CURRENCY_ISPB,\n BOLETO_CURRENCY_REAL,\n BOLETO_GOLDEN_CODIGO_BARRAS,\n BOLETO_GOLDEN_CODIGO_BARRAS_BB,\n BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2,\n BOLETO_GOLDEN_LINHA_BB_STRIPPED,\n BOLETO_GOLDEN_LINHA_MASKED,\n BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED,\n BOLETO_GOLDEN_LINHA_STRIPPED,\n BOLETO_LAYOUTS_PORTAL_URL,\n BOLETO_LINHA_LENGTH,\n BOLETO_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { computeModulo10FieldDv } from './modulo10.js';\nexport { computeModulo11BarcodeDv } from './modulo11.js';\nexport { detectBoletoInputKind, type DetectedBoletoInputKind } from './detect.js';\nexport {\n detectBoletoSituacao,\n toBoletoSituacaoCode,\n type BoletoSituacaoCode,\n type BoletoSituacaoKind,\n} from './detect-situacao.js';\nexport {\n convertCodigoBarrasToLinhaDigits,\n convertLinhaToCodigoBarrasDigits,\n} from './convert.js';\nexport {\n formatLinhaDigitavel,\n stripLinhaDigitavel,\n validateLinhaDigitavel,\n} from './linha-digitavel.js';\nexport { applyLinhaDigitavelMask } from './mask.js';\nexport { stripCodigoBarras, validateCodigoBarras } from './codigo-barras.js';\nexport { validateFatorVencimento, type FatorVencimentoValidationResult } from './fator-vencimento.js';\nexport { validateValorDocumento, type ValorDocumentoValidationResult } from './valor-documento.js';\nexport { validateSemanticFields } from './semantic.js';\n\nexport type ValidateBoletoOptions = {\n kind?: BoletoInputKind;\n validateDueFactor?: boolean;\n validateAmount?: boolean;\n};\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, inputKind?: BoletoInputKind): FailedResult {\n return { ok: false, code, message, ...(inputKind ? { inputKind } : {}) };\n}\n\nfunction validateByKind(input: string, kind: BoletoInputKind, options?: ValidateBoletoOptions): BoletoValidationResult {\n const result = kind === 'linha-digitavel' ? validateLinhaDigitavel(input) : validateCodigoBarras(input);\n if (!result.ok) {\n return result;\n }\n\n const barcode =\n kind === 'linha-digitavel'\n ? convertLinhaToCodigoBarrasDigits(result.value)\n : result.value;\n\n const semanticError = validateSemanticFields(barcode, options ?? {}, kind);\n if (semanticError) {\n return semanticError;\n }\n\n return result;\n}\n\nexport function isValidBoleto(input: string, options?: ValidateBoletoOptions): boolean {\n return validateBoleto(input, options).ok;\n}\n\nexport function validateBoleto(input: string, options?: ValidateBoletoOptions): BoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'Boleto input is empty');\n }\n\n const detected = detectBoletoInputKind(trimmed);\n\n if (detected === 'arrecadacao') {\n return failure('UNSUPPORTED_FORMAT', '48-digit arrecadação slips are not supported');\n }\n\n if (options?.kind !== undefined) {\n if (detected !== 'unknown' && detected !== options.kind) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `Boleto detected as ${detected} but forced kind is ${options.kind}`,\n options.kind,\n );\n }\n return validateByKind(trimmed, options.kind, options);\n }\n\n if (detected === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'Boleto input kind could not be determined');\n }\n\n return validateByKind(trimmed, detected, options);\n}\n\nexport function convertLinhaToCodigoBarras(input: string): BoletoValidationResult {\n const result = validateLinhaDigitavel(input);\n if (!result.ok) {\n return result;\n }\n const barcode = convertLinhaToCodigoBarrasDigits(result.value);\n return {\n ok: true,\n value: brandCodigoBarras(barcode),\n inputKind: 'codigo-barras',\n format: 'codigo-barras',\n situacao: result.situacao,\n };\n}\n\nexport function convertCodigoBarrasToLinhaDigitavel(input: string): BoletoValidationResult {\n const result = validateCodigoBarras(input);\n if (!result.ok) {\n return result;\n }\n const linha = convertCodigoBarrasToLinhaDigits(result.value);\n return {\n ok: true,\n value: brandLinhaDigitavel(linha),\n inputKind: 'linha-digitavel',\n format: 'linha-digitavel',\n situacao: result.situacao,\n };\n}\n","/**\n * Format decorator — strip → validate → apply official mask (UC-003).\n * @see docs/use-cases/UC-003-format-document.md\n * @see docs/VALIDATION-RULES.md BR-GLOBAL-002\n */\nimport { applyLinhaDigitavelMask } from '../core/boleto/mask.js';\nimport { detectBoletoInputKind } from '../core/boleto/detect.js';\nimport { validateLinhaDigitavel } from '../core/boleto/linha-digitavel.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatBoleto(input: string): FormatResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Boleto input is empty' };\n }\n\n const kind = detectBoletoInputKind(trimmed);\n if (kind === 'codigo-barras') {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'Boleto barcode formatting is not supported in v1',\n };\n }\n\n const result = validateLinhaDigitavel(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n\n return { ok: true, formatted: applyLinhaDigitavelMask(result.value) };\n}\n"]} |
| import { validateCnpj, applyCnpjMask } from './chunk-UE4PVN6Y.js'; | ||
| // src/format/cnpj.ts | ||
| function formatCnpj(input) { | ||
| const result = validateCnpj(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyCnpjMask(result.value) }; | ||
| } | ||
| function formatCnpjNumeric(input) { | ||
| return formatCnpj(input); | ||
| } | ||
| function formatCnpjAlphanumeric(input) { | ||
| return formatCnpj(input); | ||
| } | ||
| export { formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric }; | ||
| //# sourceMappingURL=chunk-MQT25QN7.js.map | ||
| //# sourceMappingURL=chunk-MQT25QN7.js.map |
| {"version":3,"sources":["../src/format/cnpj.ts"],"names":[],"mappings":";;;AAIO,SAAS,WAAW,KAAA,EAA6B;AACtD,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,aAAA,CAAc,MAAA,CAAO,KAAK,CAAA,EAAE;AAC5D;AAEO,SAAS,kBAAkB,KAAA,EAA6B;AAC7D,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;AAEO,SAAS,uBAAuB,KAAA,EAA6B;AAClE,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB","file":"chunk-MQT25QN7.js","sourcesContent":["import { applyCnpjMask } from '../core/cnpj/mask.js';\nimport { validateCnpj } from '../core/cnpj/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCnpj(input: string): FormatResult {\n const result = validateCnpj(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCnpjMask(result.value) };\n}\n\nexport function formatCnpjNumeric(input: string): FormatResult {\n return formatCnpj(input);\n}\n\nexport function formatCnpjAlphanumeric(input: string): FormatResult {\n return formatCnpj(input);\n}\n"]} |
| import { validatePixKey, applyPixEvpKeyMask, applyPixEmailKeyMask, applyPixPhoneKeyMask, applyPixCnpjKeyMask, applyPixCpfKeyMask } from './chunk-D5JMGN7U.js'; | ||
| // src/format/pix.ts | ||
| function applyPixMask(keyType, value) { | ||
| switch (keyType) { | ||
| case "cpf": | ||
| return applyPixCpfKeyMask(value); | ||
| case "cnpj": | ||
| return applyPixCnpjKeyMask(value); | ||
| case "phone": | ||
| return applyPixPhoneKeyMask(value); | ||
| case "email": | ||
| return applyPixEmailKeyMask(value); | ||
| case "evp": | ||
| return applyPixEvpKeyMask(value); | ||
| } | ||
| } | ||
| function formatPixKey(input, options) { | ||
| const result = validatePixKey(input, options); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyPixMask(result.keyType, result.value) }; | ||
| } | ||
| export { formatPixKey }; | ||
| //# sourceMappingURL=chunk-TVVNTLIH.js.map | ||
| //# sourceMappingURL=chunk-TVVNTLIH.js.map |
| {"version":3,"sources":["../src/format/pix.ts"],"names":[],"mappings":";;;AAgBA,SAAS,YAAA,CAAa,SAAqB,KAAA,EAAuB;AAChE,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,KAAA;AACH,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA,IAClC,KAAK,OAAA;AACH,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC,KAAK,OAAA;AACH,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC,KAAK,KAAA;AACH,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA;AAErC;AAEO,SAAS,YAAA,CAAa,OAAe,OAAA,EAA+C;AACzF,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,OAAO,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,SAAA,EAAW,aAAa,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3E","file":"chunk-TVVNTLIH.js","sourcesContent":["/**\n * Format decorator — strip → validate → apply official mask (UC-003).\n * @see docs/use-cases/UC-003-format-document.md\n * @see docs/VALIDATION-RULES.md BR-GLOBAL-002\n */\nimport type { ValidatePixKeyOptions } from '../core/pix/index.js';\nimport { validatePixKey } from '../core/pix/index.js';\nimport {\n applyPixCnpjKeyMask,\n applyPixCpfKeyMask,\n applyPixEmailKeyMask,\n applyPixEvpKeyMask,\n applyPixPhoneKeyMask,\n} from '../core/pix/mask.js';\nimport type { FormatResult, PixKeyType } from '../types/validation-result.js';\n\nfunction applyPixMask(keyType: PixKeyType, value: string): string {\n switch (keyType) {\n case 'cpf':\n return applyPixCpfKeyMask(value);\n case 'cnpj':\n return applyPixCnpjKeyMask(value);\n case 'phone':\n return applyPixPhoneKeyMask(value);\n case 'email':\n return applyPixEmailKeyMask(value);\n case 'evp':\n return applyPixEvpKeyMask(value);\n }\n}\n\nexport function formatPixKey(input: string, options?: ValidatePixKeyOptions): FormatResult {\n const result = validatePixKey(input, options);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n\n return { ok: true, formatted: applyPixMask(result.keyType, result.value) };\n}\n"]} |
| import { stripCnpj } from './chunk-EB3G4IG6.js'; | ||
| import { computeCheckDigit } from './chunk-B2TDI3YS.js'; | ||
| import { brandCnpj } from './chunk-BBL6ZPXH.js'; | ||
| // src/core/cnpj/constants.ts | ||
| var CNPJ_LENGTH = 14; | ||
| var CNPJ_BASE_LENGTH = 12; | ||
| var CNPJ_DV1_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var CNPJ_DV2_WEIGHTS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var CNPJ_ALPHANUMERIC_PATTERN = /^[A-Z0-9]{12}[0-9]{2}$/; | ||
| var CNPJ_NUMERIC_PATTERN = /^[0-9]{14}$/; | ||
| var CNPJ_OFFICIAL_SOURCE_URL = "https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf"; | ||
| var CNPJ_GOLDEN_ALPHANUMERIC = "12ABC34501DE35"; | ||
| var CNPJ_GOLDEN_NUMERIC = "11222333000181"; | ||
| var CNPJ_GOLDEN_NUMERIC_MASKED = "11.222.333/0001-81"; | ||
| var CNPJ_GOLDEN_ALPHANUMERIC_MASKED = "12.ABC.345/01DE-35"; | ||
| var CNPJ_MASK_PATTERN = /^(.{2})(.{3})(.{3})(.{4})(.{2})$/; | ||
| // src/core/cnpj/ascii-value.ts | ||
| function cnpjCharValue(char) { | ||
| return char.charCodeAt(0) - 48; | ||
| } | ||
| // src/core/cnpj/alphanumeric.ts | ||
| function hasRepeatedChars(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function isValidStructure(canonical) { | ||
| return canonical.length === CNPJ_LENGTH && CNPJ_ALPHANUMERIC_PATTERN.test(canonical); | ||
| } | ||
| function isValidCnpjAlphanumeric(input) { | ||
| const canonical = input.toUpperCase(); | ||
| if (!isValidStructure(canonical)) { | ||
| return false; | ||
| } | ||
| if (hasRepeatedChars(canonical)) { | ||
| return false; | ||
| } | ||
| const base = canonical.slice(0, CNPJ_BASE_LENGTH); | ||
| const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, cnpjCharValue)); | ||
| const dv2Expected = String( | ||
| computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, cnpjCharValue) | ||
| ); | ||
| return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected; | ||
| } | ||
| // src/core/cnpj/detect.ts | ||
| function detectCnpjFormat(stripped) { | ||
| const upper = stripped.toUpperCase(); | ||
| if (CNPJ_NUMERIC_PATTERN.test(upper)) { | ||
| return "numeric"; | ||
| } | ||
| if (CNPJ_ALPHANUMERIC_PATTERN.test(upper)) { | ||
| return "alphanumeric"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| function containsLetter(value) { | ||
| return /[A-Za-z]/.test(value); | ||
| } | ||
| // src/core/cnpj/numeric.ts | ||
| function digitValue(char) { | ||
| return Number(char); | ||
| } | ||
| function hasRepeatedDigits(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function isValidCnpjNumeric(input) { | ||
| const canonical = input.replace(/\D/g, ""); | ||
| if (!CNPJ_NUMERIC_PATTERN.test(canonical)) { | ||
| return false; | ||
| } | ||
| if (hasRepeatedDigits(canonical)) { | ||
| return false; | ||
| } | ||
| const base = canonical.slice(0, CNPJ_BASE_LENGTH); | ||
| const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, digitValue)); | ||
| const dv2Expected = String( | ||
| computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, digitValue) | ||
| ); | ||
| return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected; | ||
| } | ||
| // src/core/cnpj/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "CNPJ input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[.\-/]/g, ""); | ||
| if (/[^A-Za-z0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "CNPJ contains invalid characters"); | ||
| } | ||
| if (stripped.length !== CNPJ_LENGTH) { | ||
| return failure("INVALID_LENGTH", `CNPJ must have ${CNPJ_LENGTH} characters after normalization`); | ||
| } | ||
| const format = detectCnpjFormat(stripped); | ||
| if (format === "unknown") { | ||
| return failure("UNSUPPORTED_FORMAT", "CNPJ format is not numeric or alphanumeric"); | ||
| } | ||
| return { format }; | ||
| } | ||
| function isValidCnpj(input) { | ||
| return validateCnpj(input).ok; | ||
| } | ||
| function validateCnpj(input) { | ||
| const stripped = stripCnpj(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if ("ok" in structural) { | ||
| return structural; | ||
| } | ||
| const { format } = structural; | ||
| if (format === "numeric" || !containsLetter(stripped)) { | ||
| if (isValidCnpjNumeric(stripped)) { | ||
| return { ok: true, value: brandCnpj(stripped), format: "numeric" }; | ||
| } | ||
| if (format === "numeric") { | ||
| if (/^(\d)\1{13}$/.test(stripped)) { | ||
| return failure("KNOWN_INVALID_PATTERN", "CNPJ with all identical digits is invalid"); | ||
| } | ||
| return failure("INVALID_CHECK_DIGIT", "CNPJ check digits are invalid"); | ||
| } | ||
| } | ||
| if (isValidCnpjAlphanumeric(stripped)) { | ||
| return { ok: true, value: brandCnpj(stripped), format: "alphanumeric" }; | ||
| } | ||
| return failure("INVALID_CHECK_DIGIT", "CNPJ check digits are invalid"); | ||
| } | ||
| // src/core/cnpj/mask.ts | ||
| function applyCnpjMask(canonical) { | ||
| const match = CNPJ_MASK_PATTERN.exec(canonical); | ||
| if (!match) { | ||
| throw new Error("CNPJ must have exactly 14 characters to apply mask"); | ||
| } | ||
| return `${match[1]}.${match[2]}.${match[3]}/${match[4]}-${match[5]}`; | ||
| } | ||
| export { CNPJ_GOLDEN_ALPHANUMERIC, CNPJ_GOLDEN_ALPHANUMERIC_MASKED, CNPJ_GOLDEN_NUMERIC, CNPJ_GOLDEN_NUMERIC_MASKED, CNPJ_OFFICIAL_SOURCE_URL, applyCnpjMask, detectCnpjFormat, isValidCnpj, isValidCnpjAlphanumeric, isValidCnpjNumeric, validateCnpj }; | ||
| //# sourceMappingURL=chunk-UE4PVN6Y.js.map | ||
| //# sourceMappingURL=chunk-UE4PVN6Y.js.map |
| {"version":3,"sources":["../src/core/cnpj/constants.ts","../src/core/cnpj/ascii-value.ts","../src/core/cnpj/alphanumeric.ts","../src/core/cnpj/detect.ts","../src/core/cnpj/numeric.ts","../src/core/cnpj/index.ts","../src/core/cnpj/mask.ts"],"names":[],"mappings":"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","file":"chunk-UE4PVN6Y.js","sourcesContent":["/**\n * CNPJ constants — modulo 11 weights from RFB FAQ Q14.\n * @see https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf\n */\nexport const CNPJ_LENGTH = 14;\nexport const CNPJ_BASE_LENGTH = 12;\n\nexport const CNPJ_DV1_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CNPJ_DV2_WEIGHTS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\n\nexport const CNPJ_ALPHANUMERIC_PATTERN = /^[A-Z0-9]{12}[0-9]{2}$/;\nexport const CNPJ_NUMERIC_PATTERN = /^[0-9]{14}$/;\n\nexport const CNPJ_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf';\n\n/** RFB Q14 golden vector */\nexport const CNPJ_GOLDEN_ALPHANUMERIC = '12ABC34501DE35';\n\n/** Valid numeric CNPJ for regression tests (modulo 11) */\nexport const CNPJ_GOLDEN_NUMERIC = '11222333000181';\nexport const CNPJ_GOLDEN_NUMERIC_MASKED = '11.222.333/0001-81';\nexport const CNPJ_GOLDEN_ALPHANUMERIC_MASKED = '12.ABC.345/01DE-35';\n\nexport const CNPJ_MASK_PATTERN = /^(.{2})(.{3})(.{3})(.{4})(.{2})$/;\n","/**\n * Character value for CNPJ modulo 11 — ASCII decimal minus 48 (RFB Q14).\n * @see https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf\n */\nexport function cnpjCharValue(char: string): number {\n return char.charCodeAt(0) - 48;\n}\n","import { CNPJ_ALPHANUMERIC_PATTERN, CNPJ_BASE_LENGTH, CNPJ_DV1_WEIGHTS, CNPJ_DV2_WEIGHTS, CNPJ_LENGTH } from './constants.js';\nimport { cnpjCharValue } from './ascii-value.js';\nimport { computeCheckDigit } from './modulo11.js';\n\nfunction hasRepeatedChars(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction isValidStructure(canonical: string): boolean {\n return canonical.length === CNPJ_LENGTH && CNPJ_ALPHANUMERIC_PATTERN.test(canonical);\n}\n\n/**\n * Alphanumeric CNPJ — ASCII-48 modulo 11 (RFB Q14).\n * Golden vector: 12ABC34501DE35\n */\nexport function isValidCnpjAlphanumeric(input: string): boolean {\n const canonical = input.toUpperCase();\n if (!isValidStructure(canonical)) {\n return false;\n }\n if (hasRepeatedChars(canonical)) {\n return false;\n }\n\n const base = canonical.slice(0, CNPJ_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, cnpjCharValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, cnpjCharValue),\n );\n\n return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n","import { CNPJ_ALPHANUMERIC_PATTERN, CNPJ_NUMERIC_PATTERN } from './constants.js';\nimport type { DocumentFormat } from '../../types/validation-result.js';\n\nexport function detectCnpjFormat(stripped: string): DocumentFormat | 'unknown' {\n const upper = stripped.toUpperCase();\n if (CNPJ_NUMERIC_PATTERN.test(upper)) {\n return 'numeric';\n }\n if (CNPJ_ALPHANUMERIC_PATTERN.test(upper)) {\n return 'alphanumeric';\n }\n return 'unknown';\n}\n\nexport function containsLetter(value: string): boolean {\n return /[A-Za-z]/.test(value);\n}\n","import { CNPJ_BASE_LENGTH, CNPJ_DV1_WEIGHTS, CNPJ_DV2_WEIGHTS, CNPJ_NUMERIC_PATTERN } from './constants.js';\nimport { computeCheckDigit } from './modulo11.js';\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Numeric CNPJ — traditional modulo 11 on digits (RFB Q6–Q7 coexistence).\n */\nexport function isValidCnpjNumeric(input: string): boolean {\n const canonical = input.replace(/\\D/g, '');\n if (!CNPJ_NUMERIC_PATTERN.test(canonical)) {\n return false;\n }\n if (hasRepeatedDigits(canonical)) {\n return false;\n }\n\n const base = canonical.slice(0, CNPJ_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, digitValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, digitValue),\n );\n\n return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n","import { stripCnpj } from '../../strip/cnpj.js';\nimport type { DocumentFormat, ValidationResult } from '../../types/validation-result.js';\nimport { brandCnpj } from '../../types/validation-result.js';\nimport { isValidCnpjAlphanumeric } from './alphanumeric.js';\nimport { CNPJ_LENGTH } from './constants.js';\nimport { containsLetter, detectCnpjFormat } from './detect.js';\nimport { isValidCnpjNumeric } from './numeric.js';\n\nexport { detectCnpjFormat, containsLetter } from './detect.js';\nexport { isValidCnpjAlphanumeric } from './alphanumeric.js';\nexport { isValidCnpjNumeric } from './numeric.js';\nexport {\n CNPJ_GOLDEN_ALPHANUMERIC,\n CNPJ_GOLDEN_ALPHANUMERIC_MASKED,\n CNPJ_GOLDEN_NUMERIC,\n CNPJ_GOLDEN_NUMERIC_MASKED,\n CNPJ_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(\n input: string,\n stripped: string,\n): FailedResult | { format: DocumentFormat } {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CNPJ input is empty');\n }\n\n const withoutMask = input.replace(/[.\\-/]/g, '');\n if (/[^A-Za-z0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CNPJ contains invalid characters');\n }\n\n if (stripped.length !== CNPJ_LENGTH) {\n return failure('INVALID_LENGTH', `CNPJ must have ${CNPJ_LENGTH} characters after normalization`);\n }\n\n const format = detectCnpjFormat(stripped);\n if (format === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'CNPJ format is not numeric or alphanumeric');\n }\n\n return { format };\n}\n\nexport function isValidCnpj(input: string): boolean {\n return validateCnpj(input).ok;\n}\n\nexport function validateCnpj(input: string): ValidationResult {\n const stripped = stripCnpj(input);\n const structural = validateStructure(input, stripped);\n if ('ok' in structural) {\n return structural;\n }\n\n const { format } = structural;\n\n if (format === 'numeric' || !containsLetter(stripped)) {\n if (isValidCnpjNumeric(stripped)) {\n return { ok: true, value: brandCnpj(stripped), format: 'numeric' };\n }\n if (format === 'numeric') {\n if (/^(\\d)\\1{13}$/.test(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'CNPJ with all identical digits is invalid');\n }\n return failure('INVALID_CHECK_DIGIT', 'CNPJ check digits are invalid');\n }\n }\n\n if (isValidCnpjAlphanumeric(stripped)) {\n return { ok: true, value: brandCnpj(stripped), format: 'alphanumeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'CNPJ check digits are invalid');\n}\n","import { CNPJ_MASK_PATTERN } from './constants.js';\n\n/** Mask XX.XXX.XXX/XXXX-DD — same for numeric and alphanumeric (RFB Q21). */\nexport function applyCnpjMask(canonical: string): string {\n const match = CNPJ_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CNPJ must have exactly 14 characters to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}/${match[4]}-${match[5]}`;\n}\n"]} |
| import { validateCpf, applyCpfMask } from './chunk-5BBNLRZP.js'; | ||
| // src/format/cpf.ts | ||
| function formatCpf(input) { | ||
| const result = validateCpf(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyCpfMask(result.value) }; | ||
| } | ||
| export { formatCpf }; | ||
| //# sourceMappingURL=chunk-V3OWDXRU.js.map | ||
| //# sourceMappingURL=chunk-V3OWDXRU.js.map |
| {"version":3,"sources":["../src/format/cpf.ts"],"names":[],"mappings":";;;AAIO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3D","file":"chunk-V3OWDXRU.js","sourcesContent":["import { applyCpfMask } from '../core/cpf/mask.js';\nimport { validateCpf } from '../core/cpf/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCpf(input: string): FormatResult {\n const result = validateCpf(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCpfMask(result.value) };\n}\n"]} |
| import { l as PixKeyType, m as PixValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| declare const PIX_GOLDEN_CPF = "12345678909"; | ||
| declare const PIX_GOLDEN_CNPJ_NUMERIC = "11222333000181"; | ||
| declare const PIX_GOLDEN_CNPJ_ALPHANUMERIC = "12ABC34501DE35"; | ||
| declare const PIX_GOLDEN_EMAIL = "pix@bcb.gov.br"; | ||
| declare const PIX_GOLDEN_PHONE = "+5510998765432"; | ||
| declare const PIX_GOLDEN_EVP = "123e4567-e89b-12d3-a456-426655440000"; | ||
| declare const PIX_OFFICIAL_SOURCE_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf"; | ||
| declare const PIX_DICT_API_SOURCE_URL = "https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html"; | ||
| type DetectedPixKeyType = PixKeyType | 'unknown'; | ||
| declare function detectPixKeyType(input: string): DetectedPixKeyType; | ||
| declare function validatePixCpfKey(input: string): PixValidationResult; | ||
| declare function validatePixCnpjKey(input: string): PixValidationResult; | ||
| declare function validatePixEmailKey(input: string): PixValidationResult; | ||
| declare function validatePixPhoneKey(input: string): PixValidationResult; | ||
| declare function validatePixEvpKey(input: string): PixValidationResult; | ||
| /** | ||
| * PIX key validation — five Bacen types (CPF, CNPJ, email, phone, EVP). | ||
| * @see docs/use-cases/UC-005-validate-pix-key.md | ||
| */ | ||
| type ValidatePixKeyOptions = { | ||
| type?: PixKeyType; | ||
| }; | ||
| declare function isValidPixKey(input: string, options?: ValidatePixKeyOptions): boolean; | ||
| declare function validatePixKey(input: string, options?: ValidatePixKeyOptions): PixValidationResult; | ||
| /** | ||
| * Format decorator — strip → validate → apply official mask (UC-003). | ||
| * @see docs/use-cases/UC-003-format-document.md | ||
| * @see docs/VALIDATION-RULES.md BR-GLOBAL-002 | ||
| */ | ||
| declare function formatPixKey(input: string, options?: ValidatePixKeyOptions): FormatResult; | ||
| export { type DetectedPixKeyType as D, PIX_DICT_API_SOURCE_URL as P, type ValidatePixKeyOptions as V, PIX_GOLDEN_CNPJ_ALPHANUMERIC as a, PIX_GOLDEN_CNPJ_NUMERIC as b, PIX_GOLDEN_CPF as c, PIX_GOLDEN_EMAIL as d, PIX_GOLDEN_EVP as e, PIX_GOLDEN_PHONE as f, PIX_OFFICIAL_SOURCE_URL as g, detectPixKeyType as h, formatPixKey as i, isValidPixKey as j, validatePixCpfKey as k, validatePixEmailKey as l, validatePixEvpKey as m, validatePixKey as n, validatePixPhoneKey as o, validatePixCnpjKey as v }; |
| import { p as TelefoneValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { D as DocumentFormat, T as Telefone, o as TelefoneTipo, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js'; | ||
| /** 67 official Anatel national area codes (CN / DDD). */ | ||
| declare const ANATEL_DDDS: readonly ["11", "12", "13", "14", "15", "16", "17", "18", "19", "21", "22", "24", "27", "28", "31", "32", "33", "34", "35", "37", "38", "41", "42", "43", "44", "45", "46", "47", "48", "49", "51", "53", "54", "55", "61", "62", "64", "63", "65", "66", "67", "68", "69", "71", "73", "74", "75", "77", "79", "81", "87", "82", "83", "84", "85", "88", "86", "89", "91", "93", "94", "92", "97", "95", "96", "98", "99"]; | ||
| declare const ANATEL_DDD_SET: ReadonlySet<string>; | ||
| declare const TELEFONE_GOLDEN_CELULAR = "11999999999"; | ||
| declare const TELEFONE_GOLDEN_CELULAR_MASKED = "(11) 99999-9999"; | ||
| declare const TELEFONE_GOLDEN_FIXO = "1133333333"; | ||
| declare const TELEFONE_GOLDEN_FIXO_MASKED = "(11) 3333-3333"; | ||
| declare const TELEFONE_OFFICIAL_SOURCE_URL = "https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro"; | ||
| declare const TELEFONE_ANATEL_DDD_PANEL_URL = "https://informacoes.anatel.gov.br/paineis/areas-tarifarias/codigos-nacionais"; | ||
| declare function isValidTelefone(input: string): boolean; | ||
| declare function validateTelefone(input: string): TelefoneValidationResult; | ||
| /** Digits only from input (no country/trunk normalization). */ | ||
| declare function extractTelefoneDigits(input: string): string; | ||
| /** | ||
| * National canonical form: DDD + local digits (10 or 11 digits). | ||
| * Strips +55 country code and leading domestic trunk `0` when present. | ||
| */ | ||
| declare function normalizeTelefoneDigits(input: string): string; | ||
| /** @see normalizeTelefoneDigits */ | ||
| declare function stripTelefone(input: string): string; | ||
| declare function formatTelefone(input: string): FormatResult; | ||
| export { ANATEL_DDDS, ANATEL_DDD_SET, FormatResult, TELEFONE_ANATEL_DDD_PANEL_URL, TELEFONE_GOLDEN_CELULAR, TELEFONE_GOLDEN_CELULAR_MASKED, TELEFONE_GOLDEN_FIXO, TELEFONE_GOLDEN_FIXO_MASKED, TELEFONE_OFFICIAL_SOURCE_URL, TelefoneValidationResult, extractTelefoneDigits, formatTelefone, isValidTelefone, normalizeTelefoneDigits, stripTelefone, validateTelefone }; |
| export { ANATEL_DDDS, ANATEL_DDD_SET, TELEFONE_ANATEL_DDD_PANEL_URL, TELEFONE_GOLDEN_CELULAR, TELEFONE_GOLDEN_CELULAR_MASKED, TELEFONE_GOLDEN_FIXO, TELEFONE_GOLDEN_FIXO_MASKED, TELEFONE_OFFICIAL_SOURCE_URL, extractTelefoneDigits, formatTelefone, isValidTelefone, normalizeTelefoneDigits, stripTelefone, validateTelefone } from './chunk-465IC76U.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=telefone.js.map | ||
| //# sourceMappingURL=telefone.js.map |
| {"version":3,"sources":[],"names":[],"mappings":"","file":"telefone.js"} |
| type DocumentFormat = 'numeric' | 'alphanumeric' | 'legacy' | 'mercosul' | 'email' | 'phone' | 'evp' | 'linha-digitavel' | 'codigo-barras' | 'cartao-credito' | 'inscricao-estadual' | 'telefone' | 'brcode'; | ||
| type PixKeyType = 'cpf' | 'cnpj' | 'email' | 'phone' | 'evp'; | ||
| type TelefoneTipo = 'celular' | 'fixo'; | ||
| type BoletoInputKind = 'linha-digitavel' | 'codigo-barras'; | ||
| type ValidationErrorCode = 'INVALID_LENGTH' | 'INVALID_CHARACTER' | 'INVALID_CHECK_DIGIT' | 'KNOWN_INVALID_PATTERN' | 'UNSUPPORTED_FORMAT' | 'EMPTY_INPUT'; | ||
| type ValidationResult<T extends string = string> = { | ||
| ok: true; | ||
| value: T; | ||
| format: DocumentFormat; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| }; | ||
| type FormatResult = { | ||
| ok: true; | ||
| formatted: string; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| }; | ||
| type Cnpj = string & { | ||
| readonly __brand: 'Cnpj'; | ||
| }; | ||
| type Cpf = string & { | ||
| readonly __brand: 'Cpf'; | ||
| }; | ||
| type Cep = string & { | ||
| readonly __brand: 'Cep'; | ||
| }; | ||
| type Placa = string & { | ||
| readonly __brand: 'Placa'; | ||
| }; | ||
| type PisPasep = string & { | ||
| readonly __brand: 'PisPasep'; | ||
| }; | ||
| type PixKey = string & { | ||
| readonly __brand: 'PixKey'; | ||
| }; | ||
| type LinhaDigitavel = string & { | ||
| readonly __brand: 'LinhaDigitavel'; | ||
| }; | ||
| type CodigoBarras = string & { | ||
| readonly __brand: 'CodigoBarras'; | ||
| }; | ||
| type CartaoCredito = string & { | ||
| readonly __brand: 'CartaoCredito'; | ||
| }; | ||
| type InscricaoEstadual = string & { | ||
| readonly __brand: 'InscricaoEstadual'; | ||
| }; | ||
| type Telefone = string & { | ||
| readonly __brand: 'Telefone'; | ||
| }; | ||
| type BrCodePayload = string & { | ||
| readonly __brand: 'BrCodePayload'; | ||
| }; | ||
| type UfCode = 'AC' | 'AL' | 'AM' | 'AP' | 'BA' | 'CE' | 'DF' | 'ES' | 'GO' | 'MA' | 'MG' | 'MS' | 'MT' | 'PA' | 'PB' | 'PE' | 'PI' | 'PR' | 'RJ' | 'RN' | 'RO' | 'RR' | 'RS' | 'SC' | 'SE' | 'SP' | 'TO'; | ||
| type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown'; | ||
| type CartaoCreditoValidationResult = { | ||
| ok: true; | ||
| value: CartaoCredito; | ||
| format: 'cartao-credito'; | ||
| brand: CardBrand; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| brand?: CardBrand; | ||
| }; | ||
| type PixValidationResult = { | ||
| ok: true; | ||
| value: PixKey; | ||
| keyType: PixKeyType; | ||
| format: DocumentFormat; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| keyType?: PixKeyType; | ||
| }; | ||
| type BoletoSituacao = '1' | '2'; | ||
| type BoletoValidationResult = { | ||
| ok: true; | ||
| value: LinhaDigitavel | CodigoBarras; | ||
| inputKind: BoletoInputKind; | ||
| format: DocumentFormat; | ||
| situacao: BoletoSituacao; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| inputKind?: BoletoInputKind; | ||
| }; | ||
| type InscricaoEstadualValidationResult = { | ||
| ok: true; | ||
| value: InscricaoEstadual; | ||
| uf: UfCode; | ||
| format: 'inscricao-estadual'; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| uf?: UfCode; | ||
| }; | ||
| type TelefoneValidationResult = { | ||
| ok: true; | ||
| value: Telefone; | ||
| tipo: TelefoneTipo; | ||
| format: 'telefone'; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| }; | ||
| type BrCodeValidationResult = { | ||
| ok: true; | ||
| value: BrCodePayload; | ||
| format: 'brcode'; | ||
| merchantName: string; | ||
| merchantCity: string; | ||
| amount?: string; | ||
| txid?: string; | ||
| pixKey?: PixKey; | ||
| pixKeyType?: PixKeyType; | ||
| pixInitiationUrl?: string; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| }; | ||
| export type { BoletoInputKind as B, CartaoCredito as C, DocumentFormat as D, FormatResult as F, InscricaoEstadual as I, LinhaDigitavel as L, PisPasep as P, Telefone as T, UfCode as U, ValidationErrorCode as V, BoletoSituacao as a, BoletoValidationResult as b, BrCodePayload as c, BrCodeValidationResult as d, CartaoCreditoValidationResult as e, Cep as f, Cnpj as g, CodigoBarras as h, Cpf as i, InscricaoEstadualValidationResult as j, PixKey as k, PixKeyType as l, PixValidationResult as m, Placa as n, TelefoneTipo as o, TelefoneValidationResult as p, ValidationResult as q }; |
+2
-2
@@ -1,3 +0,3 @@ | ||
| import { b as BoletoValidationResult, V as ValidationErrorCode, B as BoletoInputKind, F as FormatResult } from './validation-result-BK4qJuei.js'; | ||
| export { a as BoletoSituacao, f as CodigoBarras, D as DocumentFormat, L as LinhaDigitavel } from './validation-result-BK4qJuei.js'; | ||
| import { b as BoletoValidationResult, V as ValidationErrorCode, B as BoletoInputKind, F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { a as BoletoSituacao, h as CodigoBarras, D as DocumentFormat, L as LinhaDigitavel } from './validation-result-C-Ei-lZH.js'; | ||
@@ -4,0 +4,0 @@ /** |
+2
-2
@@ -1,4 +0,4 @@ | ||
| export { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-AKJHIJ5E.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| export { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-IW3ESGWH.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=boleto.js.map | ||
| //# sourceMappingURL=boleto.js.map |
@@ -1,3 +0,3 @@ | ||
| import { c as CartaoCreditoValidationResult, F as FormatResult } from './validation-result-BK4qJuei.js'; | ||
| export { C as CartaoCredito, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BK4qJuei.js'; | ||
| import { e as CartaoCreditoValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { C as CartaoCredito, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js'; | ||
@@ -4,0 +4,0 @@ /** |
@@ -1,4 +0,4 @@ | ||
| export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-54DTXC6V.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-CR45BOLS.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=cartao-credito.js.map | ||
| //# sourceMappingURL=cartao-credito.js.map |
+2
-2
@@ -1,3 +0,3 @@ | ||
| import { m as ValidationResult, F as FormatResult } from './validation-result-BK4qJuei.js'; | ||
| export { d as Cep, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BK4qJuei.js'; | ||
| import { q as ValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { f as Cep, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js'; | ||
@@ -4,0 +4,0 @@ declare const CEP_GOLDEN_PRIMARY = "01310100"; |
+2
-2
@@ -1,7 +0,7 @@ | ||
| export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep } from './chunk-RMKTJQBB.js'; | ||
| export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep } from './chunk-GLKGX552.js'; | ||
| export { stripCep } from './chunk-W6UXVWSR.js'; | ||
| import './chunk-EB3G4IG6.js'; | ||
| import './chunk-UCJPSJN5.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=cep.js.map | ||
| //# sourceMappingURL=cep.js.map |
+2
-2
@@ -1,3 +0,3 @@ | ||
| import { D as DocumentFormat, m as ValidationResult, F as FormatResult } from './validation-result-BK4qJuei.js'; | ||
| export { e as Cnpj, V as ValidationErrorCode } from './validation-result-BK4qJuei.js'; | ||
| import { D as DocumentFormat, q as ValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { g as Cnpj, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js'; | ||
@@ -4,0 +4,0 @@ declare function detectCnpjFormat(stripped: string): DocumentFormat | 'unknown'; |
+3
-3
@@ -1,7 +0,7 @@ | ||
| export { formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric } from './chunk-7FOWIH6F.js'; | ||
| export { CNPJ_GOLDEN_ALPHANUMERIC, CNPJ_GOLDEN_ALPHANUMERIC_MASKED, CNPJ_GOLDEN_NUMERIC, CNPJ_GOLDEN_NUMERIC_MASKED, CNPJ_OFFICIAL_SOURCE_URL, detectCnpjFormat, isValidCnpj, isValidCnpjAlphanumeric, isValidCnpjNumeric, validateCnpj } from './chunk-M66MGLHE.js'; | ||
| export { formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric } from './chunk-MQT25QN7.js'; | ||
| export { CNPJ_GOLDEN_ALPHANUMERIC, CNPJ_GOLDEN_ALPHANUMERIC_MASKED, CNPJ_GOLDEN_NUMERIC, CNPJ_GOLDEN_NUMERIC_MASKED, CNPJ_OFFICIAL_SOURCE_URL, detectCnpjFormat, isValidCnpj, isValidCnpjAlphanumeric, isValidCnpjNumeric, validateCnpj } from './chunk-UE4PVN6Y.js'; | ||
| export { stripCnpj } from './chunk-EB3G4IG6.js'; | ||
| import './chunk-B2TDI3YS.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=cnpj.js.map | ||
| //# sourceMappingURL=cnpj.js.map |
+2
-2
@@ -1,3 +0,3 @@ | ||
| import { m as ValidationResult, F as FormatResult } from './validation-result-BK4qJuei.js'; | ||
| export { g as Cpf, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BK4qJuei.js'; | ||
| import { q as ValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { i as Cpf, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js'; | ||
@@ -4,0 +4,0 @@ declare const CPF_GOLDEN_PRIMARY = "12345678909"; |
+3
-3
@@ -1,7 +0,7 @@ | ||
| export { formatCpf } from './chunk-RZ2JG5PP.js'; | ||
| export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, isValidCpf, validateCpf } from './chunk-PBNVKDCF.js'; | ||
| export { formatCpf } from './chunk-V3OWDXRU.js'; | ||
| export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, isValidCpf, validateCpf } from './chunk-5BBNLRZP.js'; | ||
| export { stripCpf } from './chunk-UCJPSJN5.js'; | ||
| import './chunk-B2TDI3YS.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=cpf.js.map | ||
| //# sourceMappingURL=cpf.js.map |
+5
-3
| export { CNPJ_GOLDEN_ALPHANUMERIC, CNPJ_GOLDEN_ALPHANUMERIC_MASKED, CNPJ_GOLDEN_NUMERIC, CNPJ_GOLDEN_NUMERIC_MASKED, CNPJ_OFFICIAL_SOURCE_URL, detectCnpjFormat, formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric, isValidCnpj, isValidCnpjAlphanumeric, isValidCnpjNumeric, stripCnpj, validateCnpj } from './cnpj.js'; | ||
| import { F as FormatResult } from './validation-result-BK4qJuei.js'; | ||
| export { B as BoletoInputKind, a as BoletoSituacao, b as BoletoValidationResult, C as CartaoCredito, c as CartaoCreditoValidationResult, d as Cep, e as Cnpj, f as CodigoBarras, g as Cpf, D as DocumentFormat, I as InscricaoEstadual, h as InscricaoEstadualValidationResult, L as LinhaDigitavel, P as PisPasep, i as PixKey, j as PixKeyType, k as PixValidationResult, l as Placa, U as UfCode, V as ValidationErrorCode, m as ValidationResult } from './validation-result-BK4qJuei.js'; | ||
| import { F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { B as BoletoInputKind, a as BoletoSituacao, b as BoletoValidationResult, c as BrCodePayload, d as BrCodeValidationResult, C as CartaoCredito, e as CartaoCreditoValidationResult, f as Cep, g as Cnpj, h as CodigoBarras, i as Cpf, D as DocumentFormat, I as InscricaoEstadual, j as InscricaoEstadualValidationResult, L as LinhaDigitavel, P as PisPasep, k as PixKey, l as PixKeyType, m as PixValidationResult, n as Placa, T as Telefone, o as TelefoneTipo, p as TelefoneValidationResult, U as UfCode, V as ValidationErrorCode, q as ValidationResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, formatCpf, isValidCpf, stripCpf, validateCpf } from './cpf.js'; | ||
| export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, stripCep, validateCep } from './cep.js'; | ||
| export { ANATEL_DDDS, ANATEL_DDD_SET, TELEFONE_ANATEL_DDD_PANEL_URL, TELEFONE_GOLDEN_CELULAR, TELEFONE_GOLDEN_CELULAR_MASKED, TELEFONE_GOLDEN_FIXO, TELEFONE_GOLDEN_FIXO_MASKED, TELEFONE_OFFICIAL_SOURCE_URL, extractTelefoneDigits, formatTelefone, isValidTelefone, normalizeTelefoneDigits, stripTelefone, validateTelefone } from './telefone.js'; | ||
| export { BRCODE_GOLDEN_COMPOSITE, BRCODE_GOLDEN_DYNAMIC_URL, BRCODE_GOLDEN_STATIC_CPF, BRCODE_GOLDEN_STATIC_EMAIL, BRCODE_GOLDEN_STATIC_EVP, BRCODE_OFFICIAL_SOURCE_URL, BRCODE_PIX_INITIATION_MANUAL_URL, BrCodeParseResult, BrCodeParsedFields, TlvField, TlvParseResult, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc } from './brcode.js'; | ||
| export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, PlacaFormat, convertPlacaToMercosul, detectPlacaFormat, formatPlaca, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, stripPlaca, validatePlaca } from './placa.js'; | ||
| export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, formatPisPasep, isValidPisPasep, stripPisPasep, validatePisPasep } from './pis-pasep.js'; | ||
| export { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, BoletoSituacaoCode, BoletoSituacaoKind, DetectedBoletoInputKind, FatorVencimentoValidationResult, ValidateBoletoOptions, ValorDocumentoValidationResult, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './boleto.js'; | ||
| export { D as DetectedPixKeyType, P as PIX_DICT_API_SOURCE_URL, a as PIX_GOLDEN_CNPJ_ALPHANUMERIC, b as PIX_GOLDEN_CNPJ_NUMERIC, c as PIX_GOLDEN_CPF, d as PIX_GOLDEN_EMAIL, e as PIX_GOLDEN_EVP, f as PIX_GOLDEN_PHONE, g as PIX_OFFICIAL_SOURCE_URL, V as ValidatePixKeyOptions, h as detectPixKeyType, i as formatPixKey, j as isValidPixKey, v as validatePixCnpjKey, k as validatePixCpfKey, l as validatePixEmailKey, m as validatePixEvpKey, n as validatePixKey, o as validatePixPhoneKey } from './pix-DP6jnwpN.js'; | ||
| export { D as DetectedPixKeyType, P as PIX_DICT_API_SOURCE_URL, a as PIX_GOLDEN_CNPJ_ALPHANUMERIC, b as PIX_GOLDEN_CNPJ_NUMERIC, c as PIX_GOLDEN_CPF, d as PIX_GOLDEN_EMAIL, e as PIX_GOLDEN_EVP, f as PIX_GOLDEN_PHONE, g as PIX_OFFICIAL_SOURCE_URL, V as ValidatePixKeyOptions, h as detectPixKeyType, i as formatPixKey, j as isValidPixKey, v as validatePixCnpjKey, k as validatePixCpfKey, l as validatePixEmailKey, m as validatePixEvpKey, n as validatePixKey, o as validatePixPhoneKey } from './pix-BtTx04Si.js'; | ||
| export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, CardBrand, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './cartao-credito.js'; | ||
@@ -11,0 +13,0 @@ export { IE_DF_GOLDEN, IE_DF_GOLDEN_MASKED, IE_DF_OFFICIAL_SOURCE_URL, IE_MT_GOLDEN_CANONICAL, IE_MT_GOLDEN_LEGACY, IE_MT_OFFICIAL_SOURCE_URL, IE_OFFICIAL_SOURCE_URLS, IE_SP_GOLDEN, IE_SP_GOLDEN_MASKED, IE_SP_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, ValidateInscricaoEstadualOptions, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual } from './inscricao-estadual.js'; |
+23
-20
@@ -1,25 +0,28 @@ | ||
| import { formatPixKey } from './chunk-SE33CFGM.js'; | ||
| export { PIX_DICT_API_SOURCE_URL, PIX_GOLDEN_CNPJ_ALPHANUMERIC, PIX_GOLDEN_CNPJ_NUMERIC, PIX_GOLDEN_CPF, PIX_GOLDEN_EMAIL, PIX_GOLDEN_EVP, PIX_GOLDEN_PHONE, PIX_OFFICIAL_SOURCE_URL, detectPixKeyType, formatPixKey, isValidPixKey, validatePixCnpjKey, validatePixCpfKey, validatePixEmailKey, validatePixEvpKey, validatePixKey, validatePixPhoneKey } from './chunk-SE33CFGM.js'; | ||
| import { formatPlaca } from './chunk-YY4M2YS6.js'; | ||
| export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, formatPlaca, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca } from './chunk-YY4M2YS6.js'; | ||
| import { formatBoleto } from './chunk-AKJHIJ5E.js'; | ||
| export { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-AKJHIJ5E.js'; | ||
| import { formatCartaoCredito } from './chunk-54DTXC6V.js'; | ||
| export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-54DTXC6V.js'; | ||
| import { formatCep } from './chunk-RMKTJQBB.js'; | ||
| export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep } from './chunk-RMKTJQBB.js'; | ||
| import { formatPisPasep } from './chunk-GN7QIQE6.js'; | ||
| export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, formatPisPasep, isValidPisPasep, stripPisPasep, validatePisPasep } from './chunk-GN7QIQE6.js'; | ||
| import { formatPixKey } from './chunk-TVVNTLIH.js'; | ||
| export { formatPixKey } from './chunk-TVVNTLIH.js'; | ||
| import { formatPlaca } from './chunk-2KTD23PD.js'; | ||
| export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, formatPlaca, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca } from './chunk-2KTD23PD.js'; | ||
| export { ANATEL_DDDS, ANATEL_DDD_SET, TELEFONE_ANATEL_DDD_PANEL_URL, TELEFONE_GOLDEN_CELULAR, TELEFONE_GOLDEN_CELULAR_MASKED, TELEFONE_GOLDEN_FIXO, TELEFONE_GOLDEN_FIXO_MASKED, TELEFONE_OFFICIAL_SOURCE_URL, extractTelefoneDigits, formatTelefone, isValidTelefone, normalizeTelefoneDigits, stripTelefone, validateTelefone } from './chunk-465IC76U.js'; | ||
| import { formatBoleto } from './chunk-IW3ESGWH.js'; | ||
| export { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-IW3ESGWH.js'; | ||
| export { BRCODE_GOLDEN_COMPOSITE, BRCODE_GOLDEN_DYNAMIC_URL, BRCODE_GOLDEN_STATIC_CPF, BRCODE_GOLDEN_STATIC_EMAIL, BRCODE_GOLDEN_STATIC_EVP, BRCODE_OFFICIAL_SOURCE_URL, BRCODE_PIX_INITIATION_MANUAL_URL, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc } from './chunk-GEHAH4OH.js'; | ||
| export { PIX_DICT_API_SOURCE_URL, PIX_GOLDEN_CNPJ_ALPHANUMERIC, PIX_GOLDEN_CNPJ_NUMERIC, PIX_GOLDEN_CPF, PIX_GOLDEN_EMAIL, PIX_GOLDEN_EVP, PIX_GOLDEN_PHONE, PIX_OFFICIAL_SOURCE_URL, detectPixKeyType, isValidPixKey, validatePixCnpjKey, validatePixCpfKey, validatePixEmailKey, validatePixEvpKey, validatePixKey, validatePixPhoneKey } from './chunk-D5JMGN7U.js'; | ||
| import { formatCartaoCredito } from './chunk-CR45BOLS.js'; | ||
| export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-CR45BOLS.js'; | ||
| import { formatCep } from './chunk-GLKGX552.js'; | ||
| export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep } from './chunk-GLKGX552.js'; | ||
| export { stripCep, stripPlaca } from './chunk-W6UXVWSR.js'; | ||
| import { formatCnpj } from './chunk-7FOWIH6F.js'; | ||
| export { formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric } from './chunk-7FOWIH6F.js'; | ||
| export { CNPJ_GOLDEN_ALPHANUMERIC, CNPJ_GOLDEN_ALPHANUMERIC_MASKED, CNPJ_GOLDEN_NUMERIC, CNPJ_GOLDEN_NUMERIC_MASKED, CNPJ_OFFICIAL_SOURCE_URL, detectCnpjFormat, isValidCnpj, isValidCnpjAlphanumeric, isValidCnpjNumeric, validateCnpj } from './chunk-M66MGLHE.js'; | ||
| import { formatCnpj } from './chunk-MQT25QN7.js'; | ||
| export { formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric } from './chunk-MQT25QN7.js'; | ||
| export { CNPJ_GOLDEN_ALPHANUMERIC, CNPJ_GOLDEN_ALPHANUMERIC_MASKED, CNPJ_GOLDEN_NUMERIC, CNPJ_GOLDEN_NUMERIC_MASKED, CNPJ_OFFICIAL_SOURCE_URL, detectCnpjFormat, isValidCnpj, isValidCnpjAlphanumeric, isValidCnpjNumeric, validateCnpj } from './chunk-UE4PVN6Y.js'; | ||
| export { stripCnpj } from './chunk-EB3G4IG6.js'; | ||
| import { formatCpf } from './chunk-RZ2JG5PP.js'; | ||
| export { formatCpf } from './chunk-RZ2JG5PP.js'; | ||
| export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, isValidCpf, validateCpf } from './chunk-PBNVKDCF.js'; | ||
| import { formatCpf } from './chunk-V3OWDXRU.js'; | ||
| export { formatCpf } from './chunk-V3OWDXRU.js'; | ||
| export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, isValidCpf, validateCpf } from './chunk-5BBNLRZP.js'; | ||
| export { stripCpf } from './chunk-UCJPSJN5.js'; | ||
| export { IE_DF_GOLDEN, IE_DF_GOLDEN_MASKED, IE_DF_OFFICIAL_SOURCE_URL, IE_MT_GOLDEN_CANONICAL, IE_MT_GOLDEN_LEGACY, IE_MT_OFFICIAL_SOURCE_URL, IE_OFFICIAL_SOURCE_URLS, IE_SP_GOLDEN, IE_SP_GOLDEN_MASKED, IE_SP_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual } from './chunk-Z4F75QEC.js'; | ||
| import { formatPisPasep } from './chunk-OWJ5HN4T.js'; | ||
| export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, formatPisPasep, isValidPisPasep, stripPisPasep, validatePisPasep } from './chunk-OWJ5HN4T.js'; | ||
| import './chunk-B2TDI3YS.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| export { IE_DF_GOLDEN, IE_DF_GOLDEN_MASKED, IE_DF_OFFICIAL_SOURCE_URL, IE_MT_GOLDEN_CANONICAL, IE_MT_GOLDEN_LEGACY, IE_MT_OFFICIAL_SOURCE_URL, IE_OFFICIAL_SOURCE_URLS, IE_SP_GOLDEN, IE_SP_GOLDEN_MASKED, IE_SP_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual } from './chunk-FLZ6IHOD.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
@@ -26,0 +29,0 @@ // src/format/document.ts |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/format/document.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwBO,IAAM,0BAAA,GAA6B;AAAA,EACxC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;AAEO,SAAS,0BAA0B,IAAA,EAA+C;AACvF,EAAA,OAAQ,0BAAA,CAAiD,SAAS,IAAI,CAAA;AACxE;AAEO,SAAS,cAAA,CAAe,MAA+B,KAAA,EAA6B;AACzF,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,MAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,KAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,OAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,WAAA;AACH,MAAA,OAAO,eAAe,KAAK,CAAA;AAAA,IAC7B,KAAK,KAAA;AACH,MAAA,OAAO,aAAa,KAAK,CAAA;AAAA,IAC3B,KAAK,QAAA;AACH,MAAA,OAAO,aAAa,KAAK,CAAA;AAAA,IAC3B,KAAK,gBAAA;AACH,MAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA;AAEtC;AAGO,SAAS,qBAAA,CAAsB,MAAc,KAAA,EAA6B;AAC/E,EAAA,IAAI,CAAC,yBAAA,CAA0B,IAAI,CAAA,EAAG;AACpC,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,sBAAsB,OAAA,EAAS,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAA,EAAG;AAAA,EAC5F;AACA,EAAA,OAAO,cAAA,CAAe,MAAM,KAAK,CAAA;AACnC","file":"index.js","sourcesContent":["/**\n * Format decorator — union entrypoint (UC-003).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport type { FormatResult } from '../types/validation-result.js';\nimport { formatBoleto } from './boleto.js';\nimport { formatCartaoCredito } from './cartao-credito.js';\nimport { formatCep } from './cep.js';\nimport { formatCnpj } from './cnpj.js';\nimport { formatCpf } from './cpf.js';\nimport { formatPisPasep } from './pis-pasep.js';\nimport { formatPixKey } from './pix.js';\nimport { formatPlaca } from './placa.js';\n\nexport type FormattableDocumentType =\n | 'cpf'\n | 'cnpj'\n | 'cep'\n | 'placa'\n | 'pis-pasep'\n | 'pix'\n | 'boleto'\n | 'cartao-credito';\n\nexport const FORMATTABLE_DOCUMENT_TYPES = [\n 'cpf',\n 'cnpj',\n 'cep',\n 'placa',\n 'pis-pasep',\n 'pix',\n 'boleto',\n 'cartao-credito',\n] as const satisfies readonly FormattableDocumentType[];\n\nexport function isFormattableDocumentType(type: string): type is FormattableDocumentType {\n return (FORMATTABLE_DOCUMENT_TYPES as readonly string[]).includes(type);\n}\n\nexport function formatDocument(type: FormattableDocumentType, input: string): FormatResult {\n switch (type) {\n case 'cpf':\n return formatCpf(input);\n case 'cnpj':\n return formatCnpj(input);\n case 'cep':\n return formatCep(input);\n case 'placa':\n return formatPlaca(input);\n case 'pis-pasep':\n return formatPisPasep(input);\n case 'pix':\n return formatPixKey(input);\n case 'boleto':\n return formatBoleto(input);\n case 'cartao-credito':\n return formatCartaoCredito(input);\n }\n}\n\n/** Runtime guard for dynamic callers (non-exhaustive type string). */\nexport function formatDocumentRuntime(type: string, input: string): FormatResult {\n if (!isFormattableDocumentType(type)) {\n return { ok: false, code: 'UNSUPPORTED_FORMAT', message: `Unknown document type: ${type}` };\n }\n return formatDocument(type, input);\n}\n"]} | ||
| {"version":3,"sources":["../src/format/document.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBO,IAAM,0BAAA,GAA6B;AAAA,EACxC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;AAEO,SAAS,0BAA0B,IAAA,EAA+C;AACvF,EAAA,OAAQ,0BAAA,CAAiD,SAAS,IAAI,CAAA;AACxE;AAEO,SAAS,cAAA,CAAe,MAA+B,KAAA,EAA6B;AACzF,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,MAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,KAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,OAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,WAAA;AACH,MAAA,OAAO,eAAe,KAAK,CAAA;AAAA,IAC7B,KAAK,KAAA;AACH,MAAA,OAAO,aAAa,KAAK,CAAA;AAAA,IAC3B,KAAK,QAAA;AACH,MAAA,OAAO,aAAa,KAAK,CAAA;AAAA,IAC3B,KAAK,gBAAA;AACH,MAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA;AAEtC;AAGO,SAAS,qBAAA,CAAsB,MAAc,KAAA,EAA6B;AAC/E,EAAA,IAAI,CAAC,yBAAA,CAA0B,IAAI,CAAA,EAAG;AACpC,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,sBAAsB,OAAA,EAAS,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAA,EAAG;AAAA,EAC5F;AACA,EAAA,OAAO,cAAA,CAAe,MAAM,KAAK,CAAA;AACnC","file":"index.js","sourcesContent":["/**\n * Format decorator — union entrypoint (UC-003).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport type { FormatResult } from '../types/validation-result.js';\nimport { formatBoleto } from './boleto.js';\nimport { formatCartaoCredito } from './cartao-credito.js';\nimport { formatCep } from './cep.js';\nimport { formatCnpj } from './cnpj.js';\nimport { formatCpf } from './cpf.js';\nimport { formatPisPasep } from './pis-pasep.js';\nimport { formatPixKey } from './pix.js';\nimport { formatPlaca } from './placa.js';\n\nexport type FormattableDocumentType =\n | 'cpf'\n | 'cnpj'\n | 'cep'\n | 'placa'\n | 'pis-pasep'\n | 'pix'\n | 'boleto'\n | 'cartao-credito';\n\nexport const FORMATTABLE_DOCUMENT_TYPES = [\n 'cpf',\n 'cnpj',\n 'cep',\n 'placa',\n 'pis-pasep',\n 'pix',\n 'boleto',\n 'cartao-credito',\n] as const satisfies readonly FormattableDocumentType[];\n\nexport function isFormattableDocumentType(type: string): type is FormattableDocumentType {\n return (FORMATTABLE_DOCUMENT_TYPES as readonly string[]).includes(type);\n}\n\nexport function formatDocument(type: FormattableDocumentType, input: string): FormatResult {\n switch (type) {\n case 'cpf':\n return formatCpf(input);\n case 'cnpj':\n return formatCnpj(input);\n case 'cep':\n return formatCep(input);\n case 'placa':\n return formatPlaca(input);\n case 'pis-pasep':\n return formatPisPasep(input);\n case 'pix':\n return formatPixKey(input);\n case 'boleto':\n return formatBoleto(input);\n case 'cartao-credito':\n return formatCartaoCredito(input);\n }\n}\n\n/** Runtime guard for dynamic callers (non-exhaustive type string). */\nexport function formatDocumentRuntime(type: string, input: string): FormatResult {\n if (!isFormattableDocumentType(type)) {\n return { ok: false, code: 'UNSUPPORTED_FORMAT', message: `Unknown document type: ${type}` };\n }\n return formatDocument(type, input);\n}\n"]} |
@@ -1,3 +0,3 @@ | ||
| import { U as UfCode, h as InscricaoEstadualValidationResult, F as FormatResult } from './validation-result-BK4qJuei.js'; | ||
| export { I as InscricaoEstadual } from './validation-result-BK4qJuei.js'; | ||
| import { U as UfCode, j as InscricaoEstadualValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { I as InscricaoEstadual } from './validation-result-C-Ei-lZH.js'; | ||
@@ -4,0 +4,0 @@ /** |
@@ -1,4 +0,4 @@ | ||
| export { IE_DF_GOLDEN, IE_DF_GOLDEN_MASKED, IE_DF_LENGTH, IE_DF_OFFICIAL_SOURCE_URL, IE_MT_GOLDEN_CANONICAL, IE_MT_GOLDEN_LEGACY, IE_MT_OFFICIAL_SOURCE_URL, IE_OFFICIAL_SOURCE_URLS, IE_SP_GOLDEN, IE_SP_GOLDEN_MASKED, IE_SP_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual } from './chunk-Z4F75QEC.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| export { IE_DF_GOLDEN, IE_DF_GOLDEN_MASKED, IE_DF_LENGTH, IE_DF_OFFICIAL_SOURCE_URL, IE_MT_GOLDEN_CANONICAL, IE_MT_GOLDEN_LEGACY, IE_MT_OFFICIAL_SOURCE_URL, IE_OFFICIAL_SOURCE_URLS, IE_SP_GOLDEN, IE_SP_GOLDEN_MASKED, IE_SP_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual } from './chunk-FLZ6IHOD.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=inscricao-estadual.js.map | ||
| //# sourceMappingURL=inscricao-estadual.js.map |
@@ -1,3 +0,3 @@ | ||
| import { m as ValidationResult, F as FormatResult } from './validation-result-BK4qJuei.js'; | ||
| export { D as DocumentFormat, P as PisPasep, V as ValidationErrorCode } from './validation-result-BK4qJuei.js'; | ||
| import { q as ValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js'; | ||
| export { D as DocumentFormat, P as PisPasep, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js'; | ||
@@ -4,0 +4,0 @@ declare const PIS_PASEP_GOLDEN_PRIMARY = "10027230888"; |
@@ -1,5 +0,5 @@ | ||
| export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, formatPisPasep, isValidPisPasep, stripPisPasep, validatePisPasep } from './chunk-OWJ5HN4T.js'; | ||
| export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, formatPisPasep, isValidPisPasep, stripPisPasep, validatePisPasep } from './chunk-GN7QIQE6.js'; | ||
| import './chunk-B2TDI3YS.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=pis-pasep.js.map | ||
| //# sourceMappingURL=pis-pasep.js.map |
+2
-2
@@ -1,3 +0,3 @@ | ||
| export { D as DetectedPixKeyType, P as PIX_DICT_API_SOURCE_URL, a as PIX_GOLDEN_CNPJ_ALPHANUMERIC, b as PIX_GOLDEN_CNPJ_NUMERIC, c as PIX_GOLDEN_CPF, d as PIX_GOLDEN_EMAIL, e as PIX_GOLDEN_EVP, f as PIX_GOLDEN_PHONE, g as PIX_OFFICIAL_SOURCE_URL, V as ValidatePixKeyOptions, h as detectPixKeyType, i as formatPixKey, j as isValidPixKey, v as validatePixCnpjKey, k as validatePixCpfKey, l as validatePixEmailKey, m as validatePixEvpKey, n as validatePixKey, o as validatePixPhoneKey } from './pix-DP6jnwpN.js'; | ||
| export { D as DocumentFormat, i as PixKey, j as PixKeyType, k as PixValidationResult, V as ValidationErrorCode } from './validation-result-BK4qJuei.js'; | ||
| export { D as DetectedPixKeyType, P as PIX_DICT_API_SOURCE_URL, a as PIX_GOLDEN_CNPJ_ALPHANUMERIC, b as PIX_GOLDEN_CNPJ_NUMERIC, c as PIX_GOLDEN_CPF, d as PIX_GOLDEN_EMAIL, e as PIX_GOLDEN_EVP, f as PIX_GOLDEN_PHONE, g as PIX_OFFICIAL_SOURCE_URL, V as ValidatePixKeyOptions, h as detectPixKeyType, i as formatPixKey, j as isValidPixKey, v as validatePixCnpjKey, k as validatePixCpfKey, l as validatePixEmailKey, m as validatePixEvpKey, n as validatePixKey, o as validatePixPhoneKey } from './pix-BtTx04Si.js'; | ||
| export { D as DocumentFormat, k as PixKey, l as PixKeyType, m as PixValidationResult, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js'; | ||
@@ -4,0 +4,0 @@ declare function applyPixCpfKeyMask(canonical: string): string; |
+5
-4
@@ -1,9 +0,10 @@ | ||
| export { PIX_DICT_API_SOURCE_URL, PIX_GOLDEN_CNPJ_ALPHANUMERIC, PIX_GOLDEN_CNPJ_NUMERIC, PIX_GOLDEN_CPF, PIX_GOLDEN_EMAIL, PIX_GOLDEN_EVP, PIX_GOLDEN_PHONE, PIX_OFFICIAL_SOURCE_URL, applyPixCnpjKeyMask, applyPixCpfKeyMask, applyPixEmailKeyMask, applyPixEvpKeyMask, applyPixPhoneKeyMask, detectPixKeyType, formatPixKey, isValidPixKey, validatePixCnpjKey, validatePixCpfKey, validatePixEmailKey, validatePixEvpKey, validatePixKey, validatePixPhoneKey } from './chunk-SE33CFGM.js'; | ||
| import './chunk-M66MGLHE.js'; | ||
| export { formatPixKey } from './chunk-TVVNTLIH.js'; | ||
| export { PIX_DICT_API_SOURCE_URL, PIX_GOLDEN_CNPJ_ALPHANUMERIC, PIX_GOLDEN_CNPJ_NUMERIC, PIX_GOLDEN_CPF, PIX_GOLDEN_EMAIL, PIX_GOLDEN_EVP, PIX_GOLDEN_PHONE, PIX_OFFICIAL_SOURCE_URL, applyPixCnpjKeyMask, applyPixCpfKeyMask, applyPixEmailKeyMask, applyPixEvpKeyMask, applyPixPhoneKeyMask, detectPixKeyType, isValidPixKey, validatePixCnpjKey, validatePixCpfKey, validatePixEmailKey, validatePixEvpKey, validatePixKey, validatePixPhoneKey } from './chunk-D5JMGN7U.js'; | ||
| import './chunk-UE4PVN6Y.js'; | ||
| import './chunk-EB3G4IG6.js'; | ||
| import './chunk-PBNVKDCF.js'; | ||
| import './chunk-5BBNLRZP.js'; | ||
| import './chunk-UCJPSJN5.js'; | ||
| import './chunk-B2TDI3YS.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=pix.js.map | ||
| //# sourceMappingURL=pix.js.map |
+2
-2
@@ -1,3 +0,3 @@ | ||
| import { F as FormatResult, m as ValidationResult, l as Placa } from './validation-result-BK4qJuei.js'; | ||
| export { D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BK4qJuei.js'; | ||
| import { F as FormatResult, q as ValidationResult, n as Placa } from './validation-result-C-Ei-lZH.js'; | ||
| export { D as DocumentFormat, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js'; | ||
@@ -4,0 +4,0 @@ declare const PLACA_GOLDEN_MERCOSUL = "ABC1D23"; |
+2
-2
@@ -1,7 +0,7 @@ | ||
| export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, formatPlaca, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca } from './chunk-YY4M2YS6.js'; | ||
| export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, formatPlaca, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca } from './chunk-2KTD23PD.js'; | ||
| export { stripPlaca } from './chunk-W6UXVWSR.js'; | ||
| import './chunk-EB3G4IG6.js'; | ||
| import './chunk-UCJPSJN5.js'; | ||
| import './chunk-DKRM66US.js'; | ||
| import './chunk-BBL6ZPXH.js'; | ||
| //# sourceMappingURL=placa.js.map | ||
| //# sourceMappingURL=placa.js.map |
+14
-5
| { | ||
| "name": "@br-validators/core", | ||
| "version": "0.10.0-alpha.0", | ||
| "version": "0.11.0-alpha.0", | ||
| "description": "100% open-source Brazilian document validators — CPF, CNPJ, CEP, IE (27 UFs), PIX, boleto, and more", | ||
@@ -9,8 +9,8 @@ "license": "MIT", | ||
| "type": "git", | ||
| "url": "git+https://github.com/AlexandreZanata/doc-raiz.git", | ||
| "url": "git+https://github.com/AlexandreZanata/br-validators.git", | ||
| "directory": "packages/br-validators" | ||
| }, | ||
| "homepage": "https://github.com/AlexandreZanata/doc-raiz#readme", | ||
| "homepage": "https://github.com/AlexandreZanata/br-validators/tree/main/packages/br-validators#readme", | ||
| "bugs": { | ||
| "url": "https://github.com/AlexandreZanata/doc-raiz/issues" | ||
| "url": "https://github.com/AlexandreZanata/br-validators/issues" | ||
| }, | ||
@@ -29,3 +29,4 @@ "keywords": [ | ||
| "publishConfig": { | ||
| "access": "public" | ||
| "access": "public", | ||
| "tag": "alpha" | ||
| }, | ||
@@ -51,2 +52,10 @@ "main": "./dist/index.js", | ||
| }, | ||
| "./telefone": { | ||
| "types": "./dist/telefone.d.ts", | ||
| "import": "./dist/telefone.js" | ||
| }, | ||
| "./brcode": { | ||
| "types": "./dist/brcode.d.ts", | ||
| "import": "./dist/brcode.js" | ||
| }, | ||
| "./placa": { | ||
@@ -53,0 +62,0 @@ "types": "./dist/placa.d.ts", |
+3
-3
@@ -6,3 +6,3 @@ # @br-validators/core | ||
| **npm:** [`@br-validators/core`](https://www.npmjs.com/package/@br-validators/core) | ||
| **Repo:** [github.com/AlexandreZanata/doc-raiz](https://github.com/AlexandreZanata/doc-raiz) | ||
| **Repo:** [github.com/AlexandreZanata/br-validators](https://github.com/AlexandreZanata/br-validators) | ||
@@ -69,3 +69,3 @@ > The unscoped name `br-validators` on npm is a different package. Use **`@br-validators/core`**. | ||
| Every algorithm cites a primary government source. Full table: [OFFICIAL-SOURCES.md](https://github.com/AlexandreZanata/doc-raiz/blob/main/docs/OFFICIAL-SOURCES.md) | ||
| Every algorithm cites a primary government source. Full table: [OFFICIAL-SOURCES.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/OFFICIAL-SOURCES.md) | ||
@@ -78,3 +78,3 @@ Per-type URLs also available via constants (`CNPJ_OFFICIAL_SOURCE_URL`, `IE_OFFICIAL_SOURCE_URLS`, etc.). | ||
| [docs/LIBRARY-API.md](https://github.com/AlexandreZanata/doc-raiz/blob/main/docs/LIBRARY-API.md) | ||
| [docs/LIBRARY-API.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/LIBRARY-API.md) | ||
@@ -81,0 +81,0 @@ --- |
| import { brandCartaoCredito } from './chunk-DKRM66US.js'; | ||
| // src/strip/cartao-credito.ts | ||
| function stripCartaoCredito(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| // src/core/cartao-credito/constants.ts | ||
| var CARTAO_PAN_MIN_LENGTH = 8; | ||
| var CARTAO_PAN_MAX_LENGTH = 19; | ||
| var CARTAO_GOLDEN_VISA = "4111111111111111"; | ||
| var CARTAO_GOLDEN_MASTERCARD = "5555555555554444"; | ||
| var CARTAO_GOLDEN_AMEX = "378282246310005"; | ||
| var CARTAO_GOLDEN_LUHN_WALKTHROUGH = "79927398713"; | ||
| var CARTAO_GOLDEN_VISA_MASKED = "4111 1111 1111 1111"; | ||
| var CARTAO_GOLDEN_MIN_LENGTH = "12345674"; | ||
| var CARTAO_OFFICIAL_SOURCE_URL = "https://www.iso.org/standard/70484.html"; | ||
| var CARTAO_IEC_SOURCE_URL = "https://webstore.iec.ch/en/publication/59763"; | ||
| var ELO_IIN_PREFIXES = [ | ||
| "401178", | ||
| "401179", | ||
| "431274", | ||
| "438935", | ||
| "451416", | ||
| "457393", | ||
| "457631", | ||
| "457632", | ||
| "504175", | ||
| "506699", | ||
| "506770", | ||
| "509048", | ||
| "509049", | ||
| "627780", | ||
| "636297", | ||
| "636368", | ||
| "650031", | ||
| "650032", | ||
| "650033", | ||
| "650035", | ||
| "650051", | ||
| "650405", | ||
| "650439", | ||
| "650485", | ||
| "650486", | ||
| "650487", | ||
| "650488", | ||
| "650489", | ||
| "650490", | ||
| "650491", | ||
| "650492", | ||
| "650493", | ||
| "650494", | ||
| "650495", | ||
| "650496", | ||
| "650497", | ||
| "650498", | ||
| "650499", | ||
| "651652", | ||
| "651653", | ||
| "651654", | ||
| "651655", | ||
| "651656", | ||
| "651657", | ||
| "651658", | ||
| "651659", | ||
| "651660", | ||
| "655000", | ||
| "655001" | ||
| ]; | ||
| var HIPERCARD_IIN_PREFIXES = ["606282", "384100"]; | ||
| // src/core/cartao-credito/detect-brand.ts | ||
| function detectCardBrand(strippedPan) { | ||
| for (const prefix of ELO_IIN_PREFIXES) { | ||
| if (strippedPan.startsWith(prefix)) { | ||
| return "elo"; | ||
| } | ||
| } | ||
| for (const prefix of HIPERCARD_IIN_PREFIXES) { | ||
| if (strippedPan.startsWith(prefix)) { | ||
| return "hipercard"; | ||
| } | ||
| } | ||
| if (/^3[47]/.test(strippedPan)) { | ||
| return "amex"; | ||
| } | ||
| if (/^5[1-5]/.test(strippedPan) || /^2[2-7]/.test(strippedPan)) { | ||
| return "mastercard"; | ||
| } | ||
| if (strippedPan.startsWith("4")) { | ||
| return "visa"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/cartao-credito/luhn.ts | ||
| function computeLuhnSum(pan) { | ||
| let sum = 0; | ||
| let double = false; | ||
| for (let i = pan.length - 1; i >= 0; i--) { | ||
| let digit = Number(pan.charAt(i)); | ||
| if (double) { | ||
| digit *= 2; | ||
| if (digit > 9) { | ||
| digit -= 9; | ||
| } | ||
| } | ||
| sum += digit; | ||
| double = !double; | ||
| } | ||
| return sum; | ||
| } | ||
| function passesLuhn(pan) { | ||
| return computeLuhnSum(pan) % 10 === 0; | ||
| } | ||
| // src/core/cartao-credito/mask.ts | ||
| function applyCartaoCreditoMask(canonical) { | ||
| if (canonical.length < CARTAO_PAN_MIN_LENGTH || canonical.length > CARTAO_PAN_MAX_LENGTH) { | ||
| throw new Error(`PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits to apply mask`); | ||
| } | ||
| if (canonical.length === 15) { | ||
| return `${canonical.slice(0, 4)} ${canonical.slice(4, 10)} ${canonical.slice(10)}`; | ||
| } | ||
| const groups = []; | ||
| for (let i = 0; i < canonical.length; i += 4) { | ||
| groups.push(canonical.slice(i, i + 4)); | ||
| } | ||
| return groups.join(" "); | ||
| } | ||
| // src/core/cartao-credito/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function hasRepeatedDigits(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "Credit card PAN input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[\s-]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "Credit card PAN contains invalid characters"); | ||
| } | ||
| if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) { | ||
| return failure( | ||
| "INVALID_LENGTH", | ||
| `Credit card PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits after normalization` | ||
| ); | ||
| } | ||
| if (hasRepeatedDigits(stripped)) { | ||
| return failure("KNOWN_INVALID_PATTERN", "Credit card PAN with all identical digits is invalid"); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidLuhn(input) { | ||
| const stripped = stripCartaoCredito(input); | ||
| if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) { | ||
| return false; | ||
| } | ||
| const withoutMask = input.replace(/[\s-]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return false; | ||
| } | ||
| return passesLuhn(stripped); | ||
| } | ||
| function isValidCartaoCredito(input) { | ||
| return validateCartaoCredito(input).ok; | ||
| } | ||
| function validateCartaoCredito(input) { | ||
| const stripped = stripCartaoCredito(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| if (!passesLuhn(stripped)) { | ||
| return failure("INVALID_CHECK_DIGIT", "Credit card PAN check digit is invalid"); | ||
| } | ||
| const brand = detectCardBrand(stripped); | ||
| return { | ||
| ok: true, | ||
| value: brandCartaoCredito(stripped), | ||
| format: "cartao-credito", | ||
| brand | ||
| }; | ||
| } | ||
| // src/format/cartao-credito.ts | ||
| function formatCartaoCredito(input) { | ||
| const result = validateCartaoCredito(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyCartaoCreditoMask(result.value) }; | ||
| } | ||
| export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito }; | ||
| //# sourceMappingURL=chunk-54DTXC6V.js.map | ||
| //# sourceMappingURL=chunk-54DTXC6V.js.map |
| {"version":3,"sources":["../src/strip/cartao-credito.ts","../src/core/cartao-credito/constants.ts","../src/core/cartao-credito/detect-brand.ts","../src/core/cartao-credito/luhn.ts","../src/core/cartao-credito/mask.ts","../src/core/cartao-credito/index.ts","../src/format/cartao-credito.ts"],"names":[],"mappings":"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","file":"chunk-54DTXC6V.js","sourcesContent":["/**\n * Strip credit card PAN mask — digits only (BR-LUHN-001).\n * @see https://www.iso.org/standard/70484.html\n */\nexport function stripCartaoCredito(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Credit card PAN constants — ISO/IEC 7812-1 Annex B (Luhn).\n * @see https://www.iso.org/standard/70484.html\n * @see docs/use-cases/UC-008-validate-cartao-credito.md\n */\nexport type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown';\n\nexport const CARTAO_PAN_MIN_LENGTH = 8;\nexport const CARTAO_PAN_MAX_LENGTH = 19;\n\nexport const CARTAO_GOLDEN_VISA = '4111111111111111';\nexport const CARTAO_GOLDEN_MASTERCARD = '5555555555554444';\nexport const CARTAO_GOLDEN_AMEX = '378282246310005';\nexport const CARTAO_GOLDEN_LUHN_WALKTHROUGH = '79927398713';\nexport const CARTAO_GOLDEN_VISA_MASKED = '4111 1111 1111 1111';\nexport const CARTAO_GOLDEN_MIN_LENGTH = '12345674';\n\nexport const CARTAO_OFFICIAL_SOURCE_URL = 'https://www.iso.org/standard/70484.html';\nexport const CARTAO_IEC_SOURCE_URL = 'https://webstore.iec.ch/en/publication/59763';\n\n/** Best-effort IIN prefixes — longest match first (BR-LUHN-005, non-authoritative). */\nexport const ELO_IIN_PREFIXES = [\n '401178',\n '401179',\n '431274',\n '438935',\n '451416',\n '457393',\n '457631',\n '457632',\n '504175',\n '506699',\n '506770',\n '509048',\n '509049',\n '627780',\n '636297',\n '636368',\n '650031',\n '650032',\n '650033',\n '650035',\n '650051',\n '650405',\n '650439',\n '650485',\n '650486',\n '650487',\n '650488',\n '650489',\n '650490',\n '650491',\n '650492',\n '650493',\n '650494',\n '650495',\n '650496',\n '650497',\n '650498',\n '650499',\n '651652',\n '651653',\n '651654',\n '651655',\n '651656',\n '651657',\n '651658',\n '651659',\n '651660',\n '655000',\n '655001',\n] as const;\n\nexport const HIPERCARD_IIN_PREFIXES = ['606282', '384100'] as const;\n","/**\n * Best-effort card brand from IIN prefix — non-authoritative (BR-LUHN-005).\n */\nimport type { CardBrand } from './constants.js';\nimport { ELO_IIN_PREFIXES, HIPERCARD_IIN_PREFIXES } from './constants.js';\n\nexport type { CardBrand };\n\nexport function detectCardBrand(strippedPan: string): CardBrand {\n for (const prefix of ELO_IIN_PREFIXES) {\n if (strippedPan.startsWith(prefix)) {\n return 'elo';\n }\n }\n\n for (const prefix of HIPERCARD_IIN_PREFIXES) {\n if (strippedPan.startsWith(prefix)) {\n return 'hipercard';\n }\n }\n\n if (/^3[47]/.test(strippedPan)) {\n return 'amex';\n }\n\n if (/^5[1-5]/.test(strippedPan) || /^2[2-7]/.test(strippedPan)) {\n return 'mastercard';\n }\n\n if (strippedPan.startsWith('4')) {\n return 'visa';\n }\n\n return 'unknown';\n}\n","/**\n * Luhn checksum — ISO/IEC 7812-1 Annex B (modulus-10 double-add-double).\n * @see BR-LUHN-003\n */\n\nexport function computeLuhnSum(pan: string): number {\n let sum = 0;\n let double = false;\n for (let i = pan.length - 1; i >= 0; i--) {\n let digit = Number(pan.charAt(i));\n if (double) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n sum += digit;\n double = !double;\n }\n return sum;\n}\n\n/** ISO/IEC 7812-1 Annex B — returns true when PAN passes Luhn. */\nexport function passesLuhn(pan: string): boolean {\n return computeLuhnSum(pan) % 10 === 0;\n}\n","import { CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH } from './constants.js';\n\n/** Grouped display mask (BR-LUHN-007). */\nexport function applyCartaoCreditoMask(canonical: string): string {\n if (canonical.length < CARTAO_PAN_MIN_LENGTH || canonical.length > CARTAO_PAN_MAX_LENGTH) {\n throw new Error(`PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits to apply mask`);\n }\n\n if (canonical.length === 15) {\n return `${canonical.slice(0, 4)} ${canonical.slice(4, 10)} ${canonical.slice(10)}`;\n }\n\n const groups: string[] = [];\n for (let i = 0; i < canonical.length; i += 4) {\n groups.push(canonical.slice(i, i + 4));\n }\n return groups.join(' ');\n}\n","/**\n * Credit card PAN validation — Luhn / ISO/IEC 7812-1 Annex B.\n * @see docs/use-cases/UC-008-validate-cartao-credito.md\n */\nimport { stripCartaoCredito } from '../../strip/cartao-credito.js';\nimport type { CartaoCreditoValidationResult } from '../../types/validation-result.js';\nimport { brandCartaoCredito } from '../../types/validation-result.js';\nimport { detectCardBrand } from './detect-brand.js';\nimport { CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH } from './constants.js';\nimport { passesLuhn } from './luhn.js';\n\nexport {\n CARTAO_GOLDEN_AMEX,\n CARTAO_GOLDEN_LUHN_WALKTHROUGH,\n CARTAO_GOLDEN_MASTERCARD,\n CARTAO_GOLDEN_MIN_LENGTH,\n CARTAO_GOLDEN_VISA,\n CARTAO_GOLDEN_VISA_MASKED,\n CARTAO_IEC_SOURCE_URL,\n CARTAO_OFFICIAL_SOURCE_URL,\n CARTAO_PAN_MAX_LENGTH,\n CARTAO_PAN_MIN_LENGTH,\n} from './constants.js';\nexport type { CardBrand } from './constants.js';\nexport { detectCardBrand } from './detect-brand.js';\nexport { computeLuhnSum, passesLuhn } from './luhn.js';\nexport { applyCartaoCreditoMask } from './mask.js';\n\ntype FailedResult = Extract<CartaoCreditoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Credit card PAN input is empty');\n }\n\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'Credit card PAN contains invalid characters');\n }\n\n if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) {\n return failure(\n 'INVALID_LENGTH',\n `Credit card PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits after normalization`,\n );\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'Credit card PAN with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidLuhn(input: string): boolean {\n const stripped = stripCartaoCredito(input);\n if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) {\n return false;\n }\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return false;\n }\n return passesLuhn(stripped);\n}\n\nexport function isValidCartaoCredito(input: string): boolean {\n return validateCartaoCredito(input).ok;\n}\n\nexport function validateCartaoCredito(input: string): CartaoCreditoValidationResult {\n const stripped = stripCartaoCredito(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (!passesLuhn(stripped)) {\n return failure('INVALID_CHECK_DIGIT', 'Credit card PAN check digit is invalid');\n }\n\n const brand = detectCardBrand(stripped);\n return {\n ok: true,\n value: brandCartaoCredito(stripped),\n format: 'cartao-credito',\n brand,\n };\n}\n","import { applyCartaoCreditoMask } from '../core/cartao-credito/mask.js';\nimport { validateCartaoCredito } from '../core/cartao-credito/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCartaoCredito(input: string): FormatResult {\n const result = validateCartaoCredito(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCartaoCreditoMask(result.value) };\n}\n"]} |
| import { validateCnpj, applyCnpjMask } from './chunk-M66MGLHE.js'; | ||
| // src/format/cnpj.ts | ||
| function formatCnpj(input) { | ||
| const result = validateCnpj(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyCnpjMask(result.value) }; | ||
| } | ||
| function formatCnpjNumeric(input) { | ||
| return formatCnpj(input); | ||
| } | ||
| function formatCnpjAlphanumeric(input) { | ||
| return formatCnpj(input); | ||
| } | ||
| export { formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric }; | ||
| //# sourceMappingURL=chunk-7FOWIH6F.js.map | ||
| //# sourceMappingURL=chunk-7FOWIH6F.js.map |
| {"version":3,"sources":["../src/format/cnpj.ts"],"names":[],"mappings":";;;AAIO,SAAS,WAAW,KAAA,EAA6B;AACtD,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,aAAA,CAAc,MAAA,CAAO,KAAK,CAAA,EAAE;AAC5D;AAEO,SAAS,kBAAkB,KAAA,EAA6B;AAC7D,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;AAEO,SAAS,uBAAuB,KAAA,EAA6B;AAClE,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB","file":"chunk-7FOWIH6F.js","sourcesContent":["import { applyCnpjMask } from '../core/cnpj/mask.js';\nimport { validateCnpj } from '../core/cnpj/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCnpj(input: string): FormatResult {\n const result = validateCnpj(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCnpjMask(result.value) };\n}\n\nexport function formatCnpjNumeric(input: string): FormatResult {\n return formatCnpj(input);\n}\n\nexport function formatCnpjAlphanumeric(input: string): FormatResult {\n return formatCnpj(input);\n}\n"]} |
| import { brandCodigoBarras, brandLinhaDigitavel } from './chunk-DKRM66US.js'; | ||
| // src/core/boleto/constants.ts | ||
| var BOLETO_LINHA_LENGTH = 47; | ||
| var BOLETO_CODIGO_BARRAS_LENGTH = 44; | ||
| var BOLETO_CURRENCY_REAL = "9"; | ||
| var BOLETO_CODE_ISPB_HOLDER = "988"; | ||
| var BOLETO_CURRENCY_ISPB = "0"; | ||
| var BOLETO_GOLDEN_LINHA_MASKED = "03399.02579 08991.834006 71742.301014 6 14500000099668"; | ||
| var BOLETO_GOLDEN_LINHA_STRIPPED = "03399025790899183400671742301014614500000099668"; | ||
| var BOLETO_GOLDEN_CODIGO_BARRAS = "03396145000000996689025708991834007174230101"; | ||
| var BOLETO_GOLDEN_LINHA_BB_STRIPPED = "00191234546789012345767890123457112340000001500"; | ||
| var BOLETO_GOLDEN_CODIGO_BARRAS_BB = "00191123400000015001234567890123456789012345"; | ||
| var BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED = "98801234516789012345767890123457760746948000112"; | ||
| var BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2 = "98807607469480001121234567890123456789012345"; | ||
| var BOLETO_OFFICIAL_SOURCE_URL = "https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf"; | ||
| var BOLETO_LAYOUTS_PORTAL_URL = "https://portal.febraban.org.br/pagina/3425/33/pt-br/layout-febraban"; | ||
| // src/core/boleto/detect-situacao.ts | ||
| function toBoletoSituacaoCode(kind) { | ||
| if (kind === "situacao-1") { | ||
| return "1"; | ||
| } | ||
| if (kind === "situacao-2") { | ||
| return "2"; | ||
| } | ||
| return void 0; | ||
| } | ||
| function detectBoletoSituacao(stripped) { | ||
| if (stripped.length !== BOLETO_LINHA_LENGTH && stripped.length !== BOLETO_CODIGO_BARRAS_LENGTH) { | ||
| return "unknown"; | ||
| } | ||
| if (stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER) { | ||
| if (stripped.charAt(3) === BOLETO_CURRENCY_ISPB) { | ||
| return "situacao-2"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| if (stripped.charAt(3) === BOLETO_CURRENCY_REAL) { | ||
| return "situacao-1"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/boleto/modulo11.ts | ||
| function computeModulo11BarcodeDv(barcodeWithoutDv) { | ||
| let multiplier = 2; | ||
| let sum = 0; | ||
| for (let i = barcodeWithoutDv.length - 1; i >= 0; i--) { | ||
| sum += Number(barcodeWithoutDv[i]) * multiplier; | ||
| multiplier = multiplier >= 9 ? 2 : multiplier + 1; | ||
| } | ||
| const remainder = sum % 11; | ||
| let dv = 11 - remainder; | ||
| if (dv === 0 || dv === 10 || dv === 11) { | ||
| dv = 1; | ||
| } | ||
| return dv; | ||
| } | ||
| // src/core/boleto/codigo-barras.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message, inputKind: "codigo-barras" }; | ||
| } | ||
| function stripCodigoBarras(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function validateCodigoBarras(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "C\xF3digo de barras input is empty" }; | ||
| } | ||
| if (/[^0-9]/.test(trimmed)) { | ||
| return failure("INVALID_CHARACTER", "C\xF3digo de barras contains invalid characters"); | ||
| } | ||
| if (trimmed.length !== BOLETO_CODIGO_BARRAS_LENGTH) { | ||
| return failure("INVALID_LENGTH", `C\xF3digo de barras must have ${BOLETO_CODIGO_BARRAS_LENGTH} digits`); | ||
| } | ||
| const situacaoKind = detectBoletoSituacao(trimmed); | ||
| if (situacaoKind === "unknown") { | ||
| const isIspbHolder = trimmed.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER; | ||
| const message = isIspbHolder ? "ISPB holder boleto (code 988) requires currency indicator 0 (Situa\xE7\xE3o 2)" : "Bank boleto currency code must be 9 (Real) for Situa\xE7\xE3o 1"; | ||
| return failure("UNSUPPORTED_FORMAT", message); | ||
| } | ||
| if (trimmed.charAt(4) === "0") { | ||
| return failure("INVALID_CHECK_DIGIT", "Barcode DV cannot be 0"); | ||
| } | ||
| const expectedDv = String(computeModulo11BarcodeDv(trimmed.slice(0, 4) + trimmed.slice(5))); | ||
| if (trimmed.charAt(4) !== expectedDv) { | ||
| return failure("INVALID_CHECK_DIGIT", "C\xF3digo de barras check digit is invalid"); | ||
| } | ||
| const situacao = toBoletoSituacaoCode(situacaoKind); | ||
| return { | ||
| ok: true, | ||
| value: brandCodigoBarras(trimmed), | ||
| inputKind: "codigo-barras", | ||
| format: "codigo-barras", | ||
| situacao | ||
| }; | ||
| } | ||
| // src/core/boleto/modulo10.ts | ||
| function computeModulo10FieldDv(digits) { | ||
| let multiplier = 2; | ||
| let sum = 0; | ||
| for (let i = digits.length - 1; i >= 0; i--) { | ||
| let product = Number(digits[i]) * multiplier; | ||
| if (product > 9) { | ||
| product = Math.floor(product / 10) + product % 10; | ||
| } | ||
| sum += product; | ||
| multiplier = multiplier === 2 ? 1 : 2; | ||
| } | ||
| const remainder = sum % 10; | ||
| return remainder === 0 ? 0 : 10 - remainder; | ||
| } | ||
| // src/core/boleto/convert.ts | ||
| function convertLinhaToCodigoBarrasDigits(strippedLinha) { | ||
| return strippedLinha.slice(0, 4) + strippedLinha[32] + strippedLinha.slice(33, BOLETO_LINHA_LENGTH) + strippedLinha.slice(4, 9) + strippedLinha.slice(10, 20) + strippedLinha.slice(21, 31); | ||
| } | ||
| function convertCodigoBarrasToLinhaDigits(barcode) { | ||
| const field1 = barcode.slice(0, 4) + barcode.slice(19, 24); | ||
| const field2 = barcode.slice(24, 34); | ||
| const field3 = barcode.slice(34, BOLETO_CODIGO_BARRAS_LENGTH); | ||
| const field5 = barcode.slice(5, 9) + barcode.slice(9, 19); | ||
| const dv1 = String(computeModulo10FieldDv(field1)); | ||
| const dv2 = String(computeModulo10FieldDv(field2)); | ||
| const dv3 = String(computeModulo10FieldDv(field3)); | ||
| return field1 + dv1 + field2 + dv2 + field3 + dv3 + barcode[4] + field5; | ||
| } | ||
| // src/core/boleto/detect.ts | ||
| var LINHA_MASK_PATTERN = /^[0-9.\s]+$/; | ||
| function stripDigits(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function detectBoletoInputKind(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return "unknown"; | ||
| } | ||
| const digits = stripDigits(trimmed); | ||
| if (digits.length === 48 && digits.startsWith("8")) { | ||
| return "arrecadacao"; | ||
| } | ||
| if (digits.length === BOLETO_CODIGO_BARRAS_LENGTH && /^\d+$/.test(digits)) { | ||
| return "codigo-barras"; | ||
| } | ||
| if (digits.length === BOLETO_LINHA_LENGTH) { | ||
| if (/^\d+$/.test(trimmed)) { | ||
| return "linha-digitavel"; | ||
| } | ||
| if (LINHA_MASK_PATTERN.test(trimmed)) { | ||
| return "linha-digitavel"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/boleto/mask.ts | ||
| function applyLinhaDigitavelMask(stripped47) { | ||
| if (stripped47.length !== BOLETO_LINHA_LENGTH) { | ||
| throw new Error(`Linha digit\xE1vel must have exactly ${BOLETO_LINHA_LENGTH} digits to apply mask`); | ||
| } | ||
| return `${stripped47.slice(0, 5)}.${stripped47.slice(5, 10)} ${stripped47.slice(10, 15)}.${stripped47.slice(15, 21)} ${stripped47.slice(21, 26)}.${stripped47.slice(26, 32)} ${stripped47[32]} ${stripped47.slice(33)}`; | ||
| } | ||
| function formatLinhaDigitavel(stripped) { | ||
| return applyLinhaDigitavelMask(stripped); | ||
| } | ||
| // src/core/boleto/linha-digitavel.ts | ||
| var LINHA_MASK_PATTERN2 = /^[0-9.\s]+$/; | ||
| function failure2(code, message) { | ||
| return { ok: false, code, message, inputKind: "linha-digitavel" }; | ||
| } | ||
| function stripLinhaDigitavel(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function validateFieldDv(fieldDigits, actualDv, fieldNumber) { | ||
| const expected = String(computeModulo10FieldDv(fieldDigits)); | ||
| if (actualDv !== expected) { | ||
| return failure2("INVALID_CHECK_DIGIT", `Linha digit\xE1vel field ${fieldNumber} check digit is invalid`); | ||
| } | ||
| return null; | ||
| } | ||
| function validateLinhaDigitavel(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Linha digit\xE1vel input is empty" }; | ||
| } | ||
| if (!LINHA_MASK_PATTERN2.test(trimmed)) { | ||
| return failure2("INVALID_CHARACTER", "Linha digit\xE1vel contains invalid characters"); | ||
| } | ||
| const stripped = stripLinhaDigitavel(trimmed); | ||
| if (stripped.length !== BOLETO_LINHA_LENGTH) { | ||
| return failure2("INVALID_LENGTH", `Linha digit\xE1vel must have ${BOLETO_LINHA_LENGTH} digits after normalization`); | ||
| } | ||
| const situacaoKind = detectBoletoSituacao(stripped); | ||
| if (situacaoKind === "unknown") { | ||
| const isIspbHolder = stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER; | ||
| const message = isIspbHolder ? "ISPB holder boleto (code 988) requires currency indicator 0 (Situa\xE7\xE3o 2)" : "Bank boleto currency code must be 9 (Real) for Situa\xE7\xE3o 1"; | ||
| return failure2("UNSUPPORTED_FORMAT", message); | ||
| } | ||
| const field1Error = validateFieldDv(stripped.slice(0, 9), stripped.charAt(9), 1); | ||
| if (field1Error) { | ||
| return field1Error; | ||
| } | ||
| const field2Error = validateFieldDv(stripped.slice(10, 20), stripped.charAt(20), 2); | ||
| if (field2Error) { | ||
| return field2Error; | ||
| } | ||
| const field3Error = validateFieldDv(stripped.slice(21, 31), stripped.charAt(31), 3); | ||
| if (field3Error) { | ||
| return field3Error; | ||
| } | ||
| const barcode = convertLinhaToCodigoBarrasDigits(stripped); | ||
| const barcodeDvFromMod11 = String( | ||
| computeModulo11BarcodeDv(barcode.slice(0, 4) + barcode.slice(5)) | ||
| ); | ||
| if (stripped.charAt(32) !== barcodeDvFromMod11) { | ||
| return failure2("INVALID_CHECK_DIGIT", "Linha digit\xE1vel field 4 (barcode DV) is invalid"); | ||
| } | ||
| const situacao = toBoletoSituacaoCode(situacaoKind); | ||
| return { | ||
| ok: true, | ||
| value: brandLinhaDigitavel(stripped), | ||
| inputKind: "linha-digitavel", | ||
| format: "linha-digitavel", | ||
| situacao | ||
| }; | ||
| } | ||
| // src/core/boleto/fator-vencimento.ts | ||
| var FATOR_MIN = 1; | ||
| var FATOR_SEMANTIC_MAX = 9997; | ||
| function validateFatorVencimento(factor) { | ||
| if (!/^\d{4}$/.test(factor)) { | ||
| return { | ||
| ok: false, | ||
| code: "INVALID_LENGTH", | ||
| message: "Due-date factor must have exactly 4 digits" | ||
| }; | ||
| } | ||
| if (factor === "0000") { | ||
| return { ok: true, factor, hasDueDate: false }; | ||
| } | ||
| const days = Number(factor); | ||
| if (days < FATOR_MIN || days > FATOR_SEMANTIC_MAX) { | ||
| return { | ||
| ok: false, | ||
| code: "UNSUPPORTED_FORMAT", | ||
| message: "Due-date factor is out of the supported range" | ||
| }; | ||
| } | ||
| return { ok: true, factor, hasDueDate: true }; | ||
| } | ||
| // src/core/boleto/valor-documento.ts | ||
| function validateValorDocumento(value) { | ||
| if (!/^\d{10}$/.test(value)) { | ||
| return { | ||
| ok: false, | ||
| code: "INVALID_LENGTH", | ||
| message: "Document amount must have exactly 10 digits (centavos)" | ||
| }; | ||
| } | ||
| return { ok: true, amountCents: Number(value) }; | ||
| } | ||
| // src/core/boleto/semantic.ts | ||
| function failure3(code, message, inputKind) { | ||
| return { ok: false, code, message, inputKind }; | ||
| } | ||
| function validateSemanticFields(barcode, options, inputKind) { | ||
| if (detectBoletoSituacao(barcode) !== "situacao-1") { | ||
| return null; | ||
| } | ||
| if (options.validateDueFactor) { | ||
| const factorResult = validateFatorVencimento(barcode.slice(5, 9)); | ||
| if (!factorResult.ok) { | ||
| return failure3(factorResult.code, factorResult.message, inputKind); | ||
| } | ||
| } | ||
| if (options.validateAmount && detectBoletoSituacao(barcode) === "situacao-1") { | ||
| validateValorDocumento(barcode.slice(9, 19)); | ||
| } | ||
| return null; | ||
| } | ||
| // src/core/boleto/index.ts | ||
| function failure4(code, message, inputKind) { | ||
| return { ok: false, code, message, ...inputKind ? { inputKind } : {} }; | ||
| } | ||
| function validateByKind(input, kind, options) { | ||
| const result = kind === "linha-digitavel" ? validateLinhaDigitavel(input) : validateCodigoBarras(input); | ||
| if (!result.ok) { | ||
| return result; | ||
| } | ||
| const barcode = kind === "linha-digitavel" ? convertLinhaToCodigoBarrasDigits(result.value) : result.value; | ||
| const semanticError = validateSemanticFields(barcode, options ?? {}, kind); | ||
| if (semanticError) { | ||
| return semanticError; | ||
| } | ||
| return result; | ||
| } | ||
| function isValidBoleto(input, options) { | ||
| return validateBoleto(input, options).ok; | ||
| } | ||
| function validateBoleto(input, options) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure4("EMPTY_INPUT", "Boleto input is empty"); | ||
| } | ||
| const detected = detectBoletoInputKind(trimmed); | ||
| if (detected === "arrecadacao") { | ||
| return failure4("UNSUPPORTED_FORMAT", "48-digit arrecada\xE7\xE3o slips are not supported"); | ||
| } | ||
| if (options?.kind !== void 0) { | ||
| if (detected !== "unknown" && detected !== options.kind) { | ||
| return failure4( | ||
| "UNSUPPORTED_FORMAT", | ||
| `Boleto detected as ${detected} but forced kind is ${options.kind}`, | ||
| options.kind | ||
| ); | ||
| } | ||
| return validateByKind(trimmed, options.kind, options); | ||
| } | ||
| if (detected === "unknown") { | ||
| return failure4("UNSUPPORTED_FORMAT", "Boleto input kind could not be determined"); | ||
| } | ||
| return validateByKind(trimmed, detected, options); | ||
| } | ||
| function convertLinhaToCodigoBarras(input) { | ||
| const result = validateLinhaDigitavel(input); | ||
| if (!result.ok) { | ||
| return result; | ||
| } | ||
| const barcode = convertLinhaToCodigoBarrasDigits(result.value); | ||
| return { | ||
| ok: true, | ||
| value: brandCodigoBarras(barcode), | ||
| inputKind: "codigo-barras", | ||
| format: "codigo-barras", | ||
| situacao: result.situacao | ||
| }; | ||
| } | ||
| function convertCodigoBarrasToLinhaDigitavel(input) { | ||
| const result = validateCodigoBarras(input); | ||
| if (!result.ok) { | ||
| return result; | ||
| } | ||
| const linha = convertCodigoBarrasToLinhaDigits(result.value); | ||
| return { | ||
| ok: true, | ||
| value: brandLinhaDigitavel(linha), | ||
| inputKind: "linha-digitavel", | ||
| format: "linha-digitavel", | ||
| situacao: result.situacao | ||
| }; | ||
| } | ||
| // src/format/boleto.ts | ||
| function formatBoleto(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Boleto input is empty" }; | ||
| } | ||
| const kind = detectBoletoInputKind(trimmed); | ||
| if (kind === "codigo-barras") { | ||
| return { | ||
| ok: false, | ||
| code: "UNSUPPORTED_FORMAT", | ||
| message: "Boleto barcode formatting is not supported in v1" | ||
| }; | ||
| } | ||
| const result = validateLinhaDigitavel(trimmed); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyLinhaDigitavelMask(result.value) }; | ||
| } | ||
| export { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento }; | ||
| //# sourceMappingURL=chunk-AKJHIJ5E.js.map | ||
| //# sourceMappingURL=chunk-AKJHIJ5E.js.map |
| {"version":3,"sources":["../src/core/boleto/constants.ts","../src/core/boleto/detect-situacao.ts","../src/core/boleto/modulo11.ts","../src/core/boleto/codigo-barras.ts","../src/core/boleto/modulo10.ts","../src/core/boleto/convert.ts","../src/core/boleto/detect.ts","../src/core/boleto/mask.ts","../src/core/boleto/linha-digitavel.ts","../src/core/boleto/fator-vencimento.ts","../src/core/boleto/valor-documento.ts","../src/core/boleto/semantic.ts","../src/core/boleto/index.ts","../src/format/boleto.ts"],"names":["LINHA_MASK_PATTERN","failure"],"mappings":"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","file":"chunk-AKJHIJ5E.js","sourcesContent":["/**\n * FEBRABAN bank boleto (cobrança) — linha digitável + código de barras.\n * @see Convenção da Cobrança FB-0061/2021 — Anexos V, VI, IX, X\n * @see https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf\n */\n\nexport const BOLETO_LINHA_LENGTH = 47;\nexport const BOLETO_CODIGO_BARRAS_LENGTH = 44;\nexport const BOLETO_CURRENCY_REAL = '9';\nexport const BOLETO_CODE_ISPB_HOLDER = '988';\nexport const BOLETO_CURRENCY_ISPB = '0';\n\nexport const BOLETO_GOLDEN_LINHA_MASKED =\n '03399.02579 08991.834006 71742.301014 6 14500000099668';\nexport const BOLETO_GOLDEN_LINHA_STRIPPED =\n '03399025790899183400671742301014614500000099668';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS =\n '03396145000000996689025708991834007174230101';\n\nexport const BOLETO_GOLDEN_LINHA_BB_STRIPPED =\n '00191234546789012345767890123457112340000001500';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_BB =\n '00191123400000015001234567890123456789012345';\n\nexport const BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED =\n '98801234516789012345767890123457760746948000112';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2 =\n '98807607469480001121234567890123456789012345';\n\nexport const BOLETO_OFFICIAL_SOURCE_URL =\n 'https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf';\n\nexport const BOLETO_LAYOUTS_PORTAL_URL =\n 'https://portal.febraban.org.br/pagina/3425/33/pt-br/layout-febraban';\n","/**\n * Situação 1 vs Situação 2 detection (Anexo V §2.3.2).\n * @see BR-BOLETO-011\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_CURRENCY_ISPB,\n BOLETO_CURRENCY_REAL,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type BoletoSituacaoKind = 'situacao-1' | 'situacao-2' | 'unknown';\n\nexport type BoletoSituacaoCode = '1' | '2';\n\nexport function toBoletoSituacaoCode(kind: BoletoSituacaoKind): BoletoSituacaoCode | undefined {\n if (kind === 'situacao-1') {\n return '1';\n }\n if (kind === 'situacao-2') {\n return '2';\n }\n return undefined;\n}\n\nexport function detectBoletoSituacao(stripped: string): BoletoSituacaoKind {\n if (\n stripped.length !== BOLETO_LINHA_LENGTH &&\n stripped.length !== BOLETO_CODIGO_BARRAS_LENGTH\n ) {\n return 'unknown';\n }\n\n if (stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER) {\n if (stripped.charAt(3) === BOLETO_CURRENCY_ISPB) {\n return 'situacao-2';\n }\n return 'unknown';\n }\n\n if (stripped.charAt(3) === BOLETO_CURRENCY_REAL) {\n return 'situacao-1';\n }\n\n return 'unknown';\n}\n","/**\n * Modulo 11 — código de barras general DV (Anexo X).\n */\nexport function computeModulo11BarcodeDv(barcodeWithoutDv: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = barcodeWithoutDv.length - 1; i >= 0; i--) {\n sum += Number(barcodeWithoutDv[i]) * multiplier;\n multiplier = multiplier >= 9 ? 2 : multiplier + 1;\n }\n\n const remainder = sum % 11;\n let dv = 11 - remainder;\n if (dv === 0 || dv === 10 || dv === 11) {\n dv = 1;\n }\n return dv;\n}\n","/**\n * Código de barras validation — modulo 11 general DV (Anexo X).\n * @see BR-BOLETO-003, BR-BOLETO-004, BR-BOLETO-010\n */\nimport type { BoletoSituacao, BoletoValidationResult } from '../../types/validation-result.js';\nimport { brandCodigoBarras } from '../../types/validation-result.js';\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n} from './constants.js';\nimport { detectBoletoSituacao, toBoletoSituacaoCode } from './detect-situacao.js';\nimport { computeModulo11BarcodeDv } from './modulo11.js';\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, inputKind: 'codigo-barras' };\n}\n\nexport function stripCodigoBarras(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nexport function validateCodigoBarras(input: string): BoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Código de barras input is empty' };\n }\n\n if (/[^0-9]/.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Código de barras contains invalid characters');\n }\n\n if (trimmed.length !== BOLETO_CODIGO_BARRAS_LENGTH) {\n return failure('INVALID_LENGTH', `Código de barras must have ${BOLETO_CODIGO_BARRAS_LENGTH} digits`);\n }\n\n const situacaoKind = detectBoletoSituacao(trimmed);\n if (situacaoKind === 'unknown') {\n const isIspbHolder = trimmed.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;\n const message = isIspbHolder\n ? 'ISPB holder boleto (code 988) requires currency indicator 0 (Situação 2)'\n : 'Bank boleto currency code must be 9 (Real) for Situação 1';\n return failure('UNSUPPORTED_FORMAT', message);\n }\n\n if (trimmed.charAt(4) === '0') {\n return failure('INVALID_CHECK_DIGIT', 'Barcode DV cannot be 0');\n }\n\n const expectedDv = String(computeModulo11BarcodeDv(trimmed.slice(0, 4) + trimmed.slice(5)));\n if (trimmed.charAt(4) !== expectedDv) {\n return failure('INVALID_CHECK_DIGIT', 'Código de barras check digit is invalid');\n }\n\n const situacao = toBoletoSituacaoCode(situacaoKind) as BoletoSituacao;\n return {\n ok: true,\n value: brandCodigoBarras(trimmed),\n inputKind: 'codigo-barras',\n format: 'codigo-barras',\n situacao,\n };\n}\n","/**\n * Modulo 10 — linha digitável field DVs (Anexo IX).\n */\nexport function computeModulo10FieldDv(digits: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let product = Number(digits[i]) * multiplier;\n if (product > 9) {\n product = Math.floor(product / 10) + (product % 10);\n }\n sum += product;\n multiplier = multiplier === 2 ? 1 : 2;\n }\n\n const remainder = sum % 10;\n return remainder === 0 ? 0 : 10 - remainder;\n}\n","/**\n * Linha digitável ↔ código de barras conversion (Anexo V §2.3.4).\n * Situação 1 and Situação 2 share the same field permutation; campo 5 semantics differ\n * (fator+valor vs ISPB 14 digits).\n * @see BR-BOLETO-006\n */\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport function convertLinhaToCodigoBarrasDigits(strippedLinha: string): string {\n return (\n strippedLinha.slice(0, 4) +\n strippedLinha[32] +\n strippedLinha.slice(33, BOLETO_LINHA_LENGTH) +\n strippedLinha.slice(4, 9) +\n strippedLinha.slice(10, 20) +\n strippedLinha.slice(21, 31)\n );\n}\n\nexport function convertCodigoBarrasToLinhaDigits(barcode: string): string {\n const field1 = barcode.slice(0, 4) + barcode.slice(19, 24);\n const field2 = barcode.slice(24, 34);\n const field3 = barcode.slice(34, BOLETO_CODIGO_BARRAS_LENGTH);\n const field5 = barcode.slice(5, 9) + barcode.slice(9, 19);\n const dv1 = String(computeModulo10FieldDv(field1));\n const dv2 = String(computeModulo10FieldDv(field2));\n const dv3 = String(computeModulo10FieldDv(field3));\n return field1 + dv1 + field2 + dv2 + field3 + dv3 + barcode[4] + field5;\n}\n","/**\n * Boleto input kind detection — linha digitável (47) vs código de barras (44).\n * @see BR-BOLETO-001\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type DetectedBoletoInputKind = 'linha-digitavel' | 'codigo-barras' | 'arrecadacao' | 'unknown';\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction stripDigits(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nexport function detectBoletoInputKind(input: string): DetectedBoletoInputKind {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return 'unknown';\n }\n\n const digits = stripDigits(trimmed);\n\n if (digits.length === 48 && digits.startsWith('8')) {\n return 'arrecadacao';\n }\n\n if (digits.length === BOLETO_CODIGO_BARRAS_LENGTH && /^\\d+$/.test(digits)) {\n return 'codigo-barras';\n }\n\n if (digits.length === BOLETO_LINHA_LENGTH) {\n if (/^\\d+$/.test(trimmed)) {\n return 'linha-digitavel';\n }\n if (LINHA_MASK_PATTERN.test(trimmed)) {\n return 'linha-digitavel';\n }\n return 'unknown';\n }\n\n return 'unknown';\n}\n","/**\n * Linha digitável display mask — FEBRABAN Anexo IX (BR-BOLETO-008).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport { BOLETO_LINHA_LENGTH } from './constants.js';\n\n/** FEBRABAN typable linha digitável mask (47 digits). */\nexport function applyLinhaDigitavelMask(stripped47: string): string {\n if (stripped47.length !== BOLETO_LINHA_LENGTH) {\n throw new Error(`Linha digitável must have exactly ${BOLETO_LINHA_LENGTH} digits to apply mask`);\n }\n return (\n `${stripped47.slice(0, 5)}.${stripped47.slice(5, 10)} ` +\n `${stripped47.slice(10, 15)}.${stripped47.slice(15, 21)} ` +\n `${stripped47.slice(21, 26)}.${stripped47.slice(26, 32)} ` +\n `${stripped47[32]} ${stripped47.slice(33)}`\n );\n}\n\n/** Backward-compatible alias for applyLinhaDigitavelMask. */\nexport function formatLinhaDigitavel(stripped: string): string {\n return applyLinhaDigitavelMask(stripped);\n}\n","/**\n * Linha digitável validation — modulo 10 field DVs (Anexo IX).\n * @see BR-BOLETO-002, BR-BOLETO-008\n */\nimport type { BoletoSituacao, BoletoValidationResult } from '../../types/validation-result.js';\nimport { brandLinhaDigitavel } from '../../types/validation-result.js';\nimport {\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\nimport { convertLinhaToCodigoBarrasDigits } from './convert.js';\nimport { detectBoletoSituacao, toBoletoSituacaoCode } from './detect-situacao.js';\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport { computeModulo11BarcodeDv } from './modulo11.js';\n\nexport { applyLinhaDigitavelMask, formatLinhaDigitavel } from './mask.js';\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, inputKind: 'linha-digitavel' };\n}\n\nexport function stripLinhaDigitavel(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nfunction validateFieldDv(\n fieldDigits: string,\n actualDv: string,\n fieldNumber: 1 | 2 | 3,\n): FailedResult | null {\n const expected = String(computeModulo10FieldDv(fieldDigits));\n if (actualDv !== expected) {\n return failure('INVALID_CHECK_DIGIT', `Linha digitável field ${fieldNumber} check digit is invalid`);\n }\n return null;\n}\n\nexport function validateLinhaDigitavel(input: string): BoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Linha digitável input is empty' };\n }\n\n if (!LINHA_MASK_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Linha digitável contains invalid characters');\n }\n\n const stripped = stripLinhaDigitavel(trimmed);\n if (stripped.length !== BOLETO_LINHA_LENGTH) {\n return failure('INVALID_LENGTH', `Linha digitável must have ${BOLETO_LINHA_LENGTH} digits after normalization`);\n }\n\n const situacaoKind = detectBoletoSituacao(stripped);\n if (situacaoKind === 'unknown') {\n const isIspbHolder = stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;\n const message = isIspbHolder\n ? 'ISPB holder boleto (code 988) requires currency indicator 0 (Situação 2)'\n : 'Bank boleto currency code must be 9 (Real) for Situação 1';\n return failure('UNSUPPORTED_FORMAT', message);\n }\n\n const field1Error = validateFieldDv(stripped.slice(0, 9), stripped.charAt(9), 1);\n if (field1Error) {\n return field1Error;\n }\n\n const field2Error = validateFieldDv(stripped.slice(10, 20), stripped.charAt(20), 2);\n if (field2Error) {\n return field2Error;\n }\n\n const field3Error = validateFieldDv(stripped.slice(21, 31), stripped.charAt(31), 3);\n if (field3Error) {\n return field3Error;\n }\n\n const barcode = convertLinhaToCodigoBarrasDigits(stripped);\n const barcodeDvFromMod11 = String(\n computeModulo11BarcodeDv(barcode.slice(0, 4) + barcode.slice(5)),\n );\n\n if (stripped.charAt(32) !== barcodeDvFromMod11) {\n return failure('INVALID_CHECK_DIGIT', 'Linha digitável field 4 (barcode DV) is invalid');\n }\n\n const situacao = toBoletoSituacaoCode(situacaoKind) as BoletoSituacao;\n return {\n ok: true,\n value: brandLinhaDigitavel(stripped),\n inputKind: 'linha-digitavel',\n format: 'linha-digitavel',\n situacao,\n };\n}\n","/**\n * Due-date factor semantic validation (Situação 1 only).\n * @see BR-BOLETO-012\n */\nimport type { ValidationErrorCode } from '../../types/validation-result.js';\n\nconst FATOR_MIN = 1;\n/** FEBRABAN factor space; values above this fail optional semantic validation. */\nconst FATOR_SEMANTIC_MAX = 9997;\n\nexport type FatorVencimentoValidationResult =\n | { ok: true; factor: string; hasDueDate: boolean }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport function validateFatorVencimento(factor: string): FatorVencimentoValidationResult {\n if (!/^\\d{4}$/.test(factor)) {\n return {\n ok: false,\n code: 'INVALID_LENGTH',\n message: 'Due-date factor must have exactly 4 digits',\n };\n }\n\n if (factor === '0000') {\n return { ok: true, factor, hasDueDate: false };\n }\n\n const days = Number(factor);\n if (days < FATOR_MIN || days > FATOR_SEMANTIC_MAX) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'Due-date factor is out of the supported range',\n };\n }\n\n return { ok: true, factor, hasDueDate: true };\n}\n","/**\n * Document amount semantic validation (Situação 1 only).\n * @see BR-BOLETO-013\n */\nimport type { ValidationErrorCode } from '../../types/validation-result.js';\n\nexport type ValorDocumentoValidationResult =\n | { ok: true; amountCents: number }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport function validateValorDocumento(value: string): ValorDocumentoValidationResult {\n if (!/^\\d{10}$/.test(value)) {\n return {\n ok: false,\n code: 'INVALID_LENGTH',\n message: 'Document amount must have exactly 10 digits (centavos)',\n };\n }\n\n return { ok: true, amountCents: Number(value) };\n}\n","/**\n * Optional semantic checks for Situação 1 cobrança fields.\n * @see BR-BOLETO-012, BR-BOLETO-013\n */\nimport type { BoletoInputKind, BoletoValidationResult } from '../../types/validation-result.js';\nimport { detectBoletoSituacao } from './detect-situacao.js';\nimport { validateFatorVencimento } from './fator-vencimento.js';\nimport { validateValorDocumento } from './valor-documento.js';\n\nexport type SemanticValidationOptions = {\n validateDueFactor?: boolean;\n validateAmount?: boolean;\n};\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, inputKind: BoletoInputKind): FailedResult {\n return { ok: false, code, message, inputKind };\n}\n\nexport function validateSemanticFields(\n barcode: string,\n options: SemanticValidationOptions,\n inputKind: BoletoInputKind,\n): FailedResult | null {\n if (detectBoletoSituacao(barcode) !== 'situacao-1') {\n return null;\n }\n\n if (options.validateDueFactor) {\n const factorResult = validateFatorVencimento(barcode.slice(5, 9));\n if (!factorResult.ok) {\n return failure(factorResult.code, factorResult.message, inputKind);\n }\n }\n\n if (options.validateAmount && detectBoletoSituacao(barcode) === 'situacao-1') {\n validateValorDocumento(barcode.slice(9, 19));\n }\n\n return null;\n}\n","/**\n * Boleto validation — linha digitável + código de barras (FEBRABAN cobrança).\n * @see docs/use-cases/UC-007-validate-boleto.md\n */\nimport type { BoletoInputKind, BoletoValidationResult } from '../../types/validation-result.js';\nimport { brandCodigoBarras, brandLinhaDigitavel } from '../../types/validation-result.js';\nimport { validateCodigoBarras } from './codigo-barras.js';\nimport {\n convertCodigoBarrasToLinhaDigits,\n convertLinhaToCodigoBarrasDigits,\n} from './convert.js';\nimport { detectBoletoInputKind } from './detect.js';\nimport { validateLinhaDigitavel } from './linha-digitavel.js';\nimport { validateSemanticFields } from './semantic.js';\n\nexport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_CURRENCY_ISPB,\n BOLETO_CURRENCY_REAL,\n BOLETO_GOLDEN_CODIGO_BARRAS,\n BOLETO_GOLDEN_CODIGO_BARRAS_BB,\n BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2,\n BOLETO_GOLDEN_LINHA_BB_STRIPPED,\n BOLETO_GOLDEN_LINHA_MASKED,\n BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED,\n BOLETO_GOLDEN_LINHA_STRIPPED,\n BOLETO_LAYOUTS_PORTAL_URL,\n BOLETO_LINHA_LENGTH,\n BOLETO_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { computeModulo10FieldDv } from './modulo10.js';\nexport { computeModulo11BarcodeDv } from './modulo11.js';\nexport { detectBoletoInputKind, type DetectedBoletoInputKind } from './detect.js';\nexport {\n detectBoletoSituacao,\n toBoletoSituacaoCode,\n type BoletoSituacaoCode,\n type BoletoSituacaoKind,\n} from './detect-situacao.js';\nexport {\n convertCodigoBarrasToLinhaDigits,\n convertLinhaToCodigoBarrasDigits,\n} from './convert.js';\nexport {\n formatLinhaDigitavel,\n stripLinhaDigitavel,\n validateLinhaDigitavel,\n} from './linha-digitavel.js';\nexport { applyLinhaDigitavelMask } from './mask.js';\nexport { stripCodigoBarras, validateCodigoBarras } from './codigo-barras.js';\nexport { validateFatorVencimento, type FatorVencimentoValidationResult } from './fator-vencimento.js';\nexport { validateValorDocumento, type ValorDocumentoValidationResult } from './valor-documento.js';\nexport { validateSemanticFields } from './semantic.js';\n\nexport type ValidateBoletoOptions = {\n kind?: BoletoInputKind;\n validateDueFactor?: boolean;\n validateAmount?: boolean;\n};\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, inputKind?: BoletoInputKind): FailedResult {\n return { ok: false, code, message, ...(inputKind ? { inputKind } : {}) };\n}\n\nfunction validateByKind(input: string, kind: BoletoInputKind, options?: ValidateBoletoOptions): BoletoValidationResult {\n const result = kind === 'linha-digitavel' ? validateLinhaDigitavel(input) : validateCodigoBarras(input);\n if (!result.ok) {\n return result;\n }\n\n const barcode =\n kind === 'linha-digitavel'\n ? convertLinhaToCodigoBarrasDigits(result.value)\n : result.value;\n\n const semanticError = validateSemanticFields(barcode, options ?? {}, kind);\n if (semanticError) {\n return semanticError;\n }\n\n return result;\n}\n\nexport function isValidBoleto(input: string, options?: ValidateBoletoOptions): boolean {\n return validateBoleto(input, options).ok;\n}\n\nexport function validateBoleto(input: string, options?: ValidateBoletoOptions): BoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'Boleto input is empty');\n }\n\n const detected = detectBoletoInputKind(trimmed);\n\n if (detected === 'arrecadacao') {\n return failure('UNSUPPORTED_FORMAT', '48-digit arrecadação slips are not supported');\n }\n\n if (options?.kind !== undefined) {\n if (detected !== 'unknown' && detected !== options.kind) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `Boleto detected as ${detected} but forced kind is ${options.kind}`,\n options.kind,\n );\n }\n return validateByKind(trimmed, options.kind, options);\n }\n\n if (detected === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'Boleto input kind could not be determined');\n }\n\n return validateByKind(trimmed, detected, options);\n}\n\nexport function convertLinhaToCodigoBarras(input: string): BoletoValidationResult {\n const result = validateLinhaDigitavel(input);\n if (!result.ok) {\n return result;\n }\n const barcode = convertLinhaToCodigoBarrasDigits(result.value);\n return {\n ok: true,\n value: brandCodigoBarras(barcode),\n inputKind: 'codigo-barras',\n format: 'codigo-barras',\n situacao: result.situacao,\n };\n}\n\nexport function convertCodigoBarrasToLinhaDigitavel(input: string): BoletoValidationResult {\n const result = validateCodigoBarras(input);\n if (!result.ok) {\n return result;\n }\n const linha = convertCodigoBarrasToLinhaDigits(result.value);\n return {\n ok: true,\n value: brandLinhaDigitavel(linha),\n inputKind: 'linha-digitavel',\n format: 'linha-digitavel',\n situacao: result.situacao,\n };\n}\n","/**\n * Format decorator — strip → validate → apply official mask (UC-003).\n * @see docs/use-cases/UC-003-format-document.md\n * @see docs/VALIDATION-RULES.md BR-GLOBAL-002\n */\nimport { applyLinhaDigitavelMask } from '../core/boleto/mask.js';\nimport { detectBoletoInputKind } from '../core/boleto/detect.js';\nimport { validateLinhaDigitavel } from '../core/boleto/linha-digitavel.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatBoleto(input: string): FormatResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Boleto input is empty' };\n }\n\n const kind = detectBoletoInputKind(trimmed);\n if (kind === 'codigo-barras') {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'Boleto barcode formatting is not supported in v1',\n };\n }\n\n const result = validateLinhaDigitavel(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n\n return { ok: true, formatted: applyLinhaDigitavelMask(result.value) };\n}\n"]} |
| // src/types/validation-result.ts | ||
| function brandCnpj(value) { | ||
| return value; | ||
| } | ||
| function brandCpf(value) { | ||
| return value; | ||
| } | ||
| function brandCep(value) { | ||
| return value; | ||
| } | ||
| function brandPlaca(value) { | ||
| return value; | ||
| } | ||
| function brandPisPasep(value) { | ||
| return value; | ||
| } | ||
| function brandPixKey(value) { | ||
| return value; | ||
| } | ||
| function brandLinhaDigitavel(value) { | ||
| return value; | ||
| } | ||
| function brandCodigoBarras(value) { | ||
| return value; | ||
| } | ||
| function brandCartaoCredito(value) { | ||
| return value; | ||
| } | ||
| function brandInscricaoEstadual(value) { | ||
| return value; | ||
| } | ||
| export { brandCartaoCredito, brandCep, brandCnpj, brandCodigoBarras, brandCpf, brandInscricaoEstadual, brandLinhaDigitavel, brandPisPasep, brandPixKey, brandPlaca }; | ||
| //# sourceMappingURL=chunk-DKRM66US.js.map | ||
| //# sourceMappingURL=chunk-DKRM66US.js.map |
| {"version":3,"sources":["../src/types/validation-result.ts"],"names":[],"mappings":";AA0EO,SAAS,UAAU,KAAA,EAAqB;AAC7C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAoB;AAC3C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAoB;AAC3C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAAsB;AAC/C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,KAAA,EAAyB;AACrD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,oBAAoB,KAAA,EAA+B;AACjE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAkB,KAAA,EAA6B;AAC7D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,mBAAmB,KAAA,EAA8B;AAC/D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,uBAAuB,KAAA,EAAkC;AACvE,EAAA,OAAO,KAAA;AACT","file":"chunk-DKRM66US.js","sourcesContent":["export type DocumentFormat =\n | 'numeric'\n | 'alphanumeric'\n | 'legacy'\n | 'mercosul'\n | 'email'\n | 'phone'\n | 'evp'\n | 'linha-digitavel'\n | 'codigo-barras'\n | 'cartao-credito'\n | 'inscricao-estadual';\n\nexport type PixKeyType = 'cpf' | 'cnpj' | 'email' | 'phone' | 'evp';\n\nexport type BoletoInputKind = 'linha-digitavel' | 'codigo-barras';\n\nexport type ValidationErrorCode =\n | 'INVALID_LENGTH'\n | 'INVALID_CHARACTER'\n | 'INVALID_CHECK_DIGIT'\n | 'KNOWN_INVALID_PATTERN'\n | 'UNSUPPORTED_FORMAT'\n | 'EMPTY_INPUT';\n\nexport type ValidationResult<T extends string = string> =\n | { ok: true; value: T; format: DocumentFormat }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport type FormatResult =\n | { ok: true; formatted: string }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport type Cnpj = string & { readonly __brand: 'Cnpj' };\nexport type Cpf = string & { readonly __brand: 'Cpf' };\nexport type Cep = string & { readonly __brand: 'Cep' };\nexport type Placa = string & { readonly __brand: 'Placa' };\nexport type PisPasep = string & { readonly __brand: 'PisPasep' };\nexport type PixKey = string & { readonly __brand: 'PixKey' };\nexport type LinhaDigitavel = string & { readonly __brand: 'LinhaDigitavel' };\nexport type CodigoBarras = string & { readonly __brand: 'CodigoBarras' };\nexport type CartaoCredito = string & { readonly __brand: 'CartaoCredito' };\nexport type InscricaoEstadual = string & { readonly __brand: 'InscricaoEstadual' };\n\nexport type UfCode =\n | 'AC' | 'AL' | 'AM' | 'AP' | 'BA' | 'CE' | 'DF' | 'ES' | 'GO' | 'MA' | 'MG' | 'MS' | 'MT'\n | 'PA' | 'PB' | 'PE' | 'PI' | 'PR' | 'RJ' | 'RN' | 'RO' | 'RR' | 'RS' | 'SC' | 'SE' | 'SP' | 'TO';\n\nexport type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown';\n\nexport type CartaoCreditoValidationResult =\n | { ok: true; value: CartaoCredito; format: 'cartao-credito'; brand: CardBrand }\n | { ok: false; code: ValidationErrorCode; message: string; brand?: CardBrand };\n\nexport type PixValidationResult =\n | { ok: true; value: PixKey; keyType: PixKeyType; format: DocumentFormat }\n | { ok: false; code: ValidationErrorCode; message: string; keyType?: PixKeyType };\n\nexport type BoletoSituacao = '1' | '2';\n\nexport type BoletoValidationResult =\n | {\n ok: true;\n value: LinhaDigitavel | CodigoBarras;\n inputKind: BoletoInputKind;\n format: DocumentFormat;\n situacao: BoletoSituacao;\n }\n | { ok: false; code: ValidationErrorCode; message: string; inputKind?: BoletoInputKind };\n\nexport type InscricaoEstadualValidationResult =\n | { ok: true; value: InscricaoEstadual; uf: UfCode; format: 'inscricao-estadual' }\n | { ok: false; code: ValidationErrorCode; message: string; uf?: UfCode };\n\nexport function brandCnpj(value: string): Cnpj {\n return value as Cnpj;\n}\n\nexport function brandCpf(value: string): Cpf {\n return value as Cpf;\n}\n\nexport function brandCep(value: string): Cep {\n return value as Cep;\n}\n\nexport function brandPlaca(value: string): Placa {\n return value as Placa;\n}\n\nexport function brandPisPasep(value: string): PisPasep {\n return value as PisPasep;\n}\n\nexport function brandPixKey(value: string): PixKey {\n return value as PixKey;\n}\n\nexport function brandLinhaDigitavel(value: string): LinhaDigitavel {\n return value as LinhaDigitavel;\n}\n\nexport function brandCodigoBarras(value: string): CodigoBarras {\n return value as CodigoBarras;\n}\n\nexport function brandCartaoCredito(value: string): CartaoCredito {\n return value as CartaoCredito;\n}\n\nexport function brandInscricaoEstadual(value: string): InscricaoEstadual {\n return value as InscricaoEstadual;\n}\n"]} |
| import { stripCnpj } from './chunk-EB3G4IG6.js'; | ||
| import { computeCheckDigit } from './chunk-B2TDI3YS.js'; | ||
| import { brandCnpj } from './chunk-DKRM66US.js'; | ||
| // src/core/cnpj/constants.ts | ||
| var CNPJ_LENGTH = 14; | ||
| var CNPJ_BASE_LENGTH = 12; | ||
| var CNPJ_DV1_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var CNPJ_DV2_WEIGHTS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var CNPJ_ALPHANUMERIC_PATTERN = /^[A-Z0-9]{12}[0-9]{2}$/; | ||
| var CNPJ_NUMERIC_PATTERN = /^[0-9]{14}$/; | ||
| var CNPJ_OFFICIAL_SOURCE_URL = "https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf"; | ||
| var CNPJ_GOLDEN_ALPHANUMERIC = "12ABC34501DE35"; | ||
| var CNPJ_GOLDEN_NUMERIC = "11222333000181"; | ||
| var CNPJ_GOLDEN_NUMERIC_MASKED = "11.222.333/0001-81"; | ||
| var CNPJ_GOLDEN_ALPHANUMERIC_MASKED = "12.ABC.345/01DE-35"; | ||
| var CNPJ_MASK_PATTERN = /^(.{2})(.{3})(.{3})(.{4})(.{2})$/; | ||
| // src/core/cnpj/ascii-value.ts | ||
| function cnpjCharValue(char) { | ||
| return char.charCodeAt(0) - 48; | ||
| } | ||
| // src/core/cnpj/alphanumeric.ts | ||
| function hasRepeatedChars(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function isValidStructure(canonical) { | ||
| return canonical.length === CNPJ_LENGTH && CNPJ_ALPHANUMERIC_PATTERN.test(canonical); | ||
| } | ||
| function isValidCnpjAlphanumeric(input) { | ||
| const canonical = input.toUpperCase(); | ||
| if (!isValidStructure(canonical)) { | ||
| return false; | ||
| } | ||
| if (hasRepeatedChars(canonical)) { | ||
| return false; | ||
| } | ||
| const base = canonical.slice(0, CNPJ_BASE_LENGTH); | ||
| const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, cnpjCharValue)); | ||
| const dv2Expected = String( | ||
| computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, cnpjCharValue) | ||
| ); | ||
| return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected; | ||
| } | ||
| // src/core/cnpj/detect.ts | ||
| function detectCnpjFormat(stripped) { | ||
| const upper = stripped.toUpperCase(); | ||
| if (CNPJ_NUMERIC_PATTERN.test(upper)) { | ||
| return "numeric"; | ||
| } | ||
| if (CNPJ_ALPHANUMERIC_PATTERN.test(upper)) { | ||
| return "alphanumeric"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| function containsLetter(value) { | ||
| return /[A-Za-z]/.test(value); | ||
| } | ||
| // src/core/cnpj/numeric.ts | ||
| function digitValue(char) { | ||
| return Number(char); | ||
| } | ||
| function hasRepeatedDigits(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function isValidCnpjNumeric(input) { | ||
| const canonical = input.replace(/\D/g, ""); | ||
| if (!CNPJ_NUMERIC_PATTERN.test(canonical)) { | ||
| return false; | ||
| } | ||
| if (hasRepeatedDigits(canonical)) { | ||
| return false; | ||
| } | ||
| const base = canonical.slice(0, CNPJ_BASE_LENGTH); | ||
| const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, digitValue)); | ||
| const dv2Expected = String( | ||
| computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, digitValue) | ||
| ); | ||
| return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected; | ||
| } | ||
| // src/core/cnpj/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "CNPJ input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[.\-/]/g, ""); | ||
| if (/[^A-Za-z0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "CNPJ contains invalid characters"); | ||
| } | ||
| if (stripped.length !== CNPJ_LENGTH) { | ||
| return failure("INVALID_LENGTH", `CNPJ must have ${CNPJ_LENGTH} characters after normalization`); | ||
| } | ||
| const format = detectCnpjFormat(stripped); | ||
| if (format === "unknown") { | ||
| return failure("UNSUPPORTED_FORMAT", "CNPJ format is not numeric or alphanumeric"); | ||
| } | ||
| return { format }; | ||
| } | ||
| function isValidCnpj(input) { | ||
| return validateCnpj(input).ok; | ||
| } | ||
| function validateCnpj(input) { | ||
| const stripped = stripCnpj(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if ("ok" in structural) { | ||
| return structural; | ||
| } | ||
| const { format } = structural; | ||
| if (format === "numeric" || !containsLetter(stripped)) { | ||
| if (isValidCnpjNumeric(stripped)) { | ||
| return { ok: true, value: brandCnpj(stripped), format: "numeric" }; | ||
| } | ||
| if (format === "numeric") { | ||
| if (/^(\d)\1{13}$/.test(stripped)) { | ||
| return failure("KNOWN_INVALID_PATTERN", "CNPJ with all identical digits is invalid"); | ||
| } | ||
| return failure("INVALID_CHECK_DIGIT", "CNPJ check digits are invalid"); | ||
| } | ||
| } | ||
| if (isValidCnpjAlphanumeric(stripped)) { | ||
| return { ok: true, value: brandCnpj(stripped), format: "alphanumeric" }; | ||
| } | ||
| return failure("INVALID_CHECK_DIGIT", "CNPJ check digits are invalid"); | ||
| } | ||
| // src/core/cnpj/mask.ts | ||
| function applyCnpjMask(canonical) { | ||
| const match = CNPJ_MASK_PATTERN.exec(canonical); | ||
| if (!match) { | ||
| throw new Error("CNPJ must have exactly 14 characters to apply mask"); | ||
| } | ||
| return `${match[1]}.${match[2]}.${match[3]}/${match[4]}-${match[5]}`; | ||
| } | ||
| export { CNPJ_GOLDEN_ALPHANUMERIC, CNPJ_GOLDEN_ALPHANUMERIC_MASKED, CNPJ_GOLDEN_NUMERIC, CNPJ_GOLDEN_NUMERIC_MASKED, CNPJ_OFFICIAL_SOURCE_URL, applyCnpjMask, detectCnpjFormat, isValidCnpj, isValidCnpjAlphanumeric, isValidCnpjNumeric, validateCnpj }; | ||
| //# sourceMappingURL=chunk-M66MGLHE.js.map | ||
| //# sourceMappingURL=chunk-M66MGLHE.js.map |
| {"version":3,"sources":["../src/core/cnpj/constants.ts","../src/core/cnpj/ascii-value.ts","../src/core/cnpj/alphanumeric.ts","../src/core/cnpj/detect.ts","../src/core/cnpj/numeric.ts","../src/core/cnpj/index.ts","../src/core/cnpj/mask.ts"],"names":[],"mappings":";;;;;AAIO,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,gBAAA,GAAmB,EAAA;AAEzB,IAAM,gBAAA,GAAmB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5D,IAAM,gBAAA,GAAmB,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAE/D,IAAM,yBAAA,GAA4B,wBAAA;AAClC,IAAM,oBAAA,GAAuB,aAAA;AAE7B,IAAM,wBAAA,GACX;AAGK,IAAM,wBAAA,GAA2B;AAGjC,IAAM,mBAAA,GAAsB;AAC5B,IAAM,0BAAA,GAA6B;AACnC,IAAM,+BAAA,GAAkC;AAExC,IAAM,iBAAA,GAAoB,kCAAA;;;ACpB1B,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,OAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,GAAI,EAAA;AAC9B;;;ACFA,SAAS,iBAAiB,KAAA,EAAwB;AAChD,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,KAAA,EAAO;AACtB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAiB,SAAA,EAA4B;AACpD,EAAA,OAAO,SAAA,CAAU,MAAA,KAAW,WAAA,IAAe,yBAAA,CAA0B,KAAK,SAAS,CAAA;AACrF;AAMO,SAAS,wBAAwB,KAAA,EAAwB;AAC9D,EAAA,MAAM,SAAA,GAAY,MAAM,WAAA,EAAY;AACpC,EAAA,IAAI,CAAC,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAChC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,gBAAgB,CAAA;AAChD,EAAA,MAAM,cAAc,MAAA,CAAO,iBAAA,CAAkB,IAAA,EAAM,gBAAA,EAAkB,aAAa,CAAC,CAAA;AACnF,EAAA,MAAM,WAAA,GAAc,MAAA;AAAA,IAClB,iBAAA,CAAkB,IAAA,GAAO,WAAA,EAAa,gBAAA,EAAkB,aAAa;AAAA,GACvE;AAEA,EAAA,OAAO,SAAA,CAAU,KAAA,CAAM,gBAAgB,CAAA,KAAM,WAAA,GAAc,WAAA;AAC7D;;;ACnCO,SAAS,iBAAiB,QAAA,EAA8C;AAC7E,EAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,EAAY;AACnC,EAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,IAAI,yBAAA,CAA0B,IAAA,CAAK,KAAK,CAAA,EAAG;AACzC,IAAA,OAAO,cAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAC9B;;;ACbA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,OAAO,IAAI,CAAA;AACpB;AAEA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,KAAA,EAAO;AACtB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,mBAAmB,KAAA,EAAwB;AACzD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACzC,EAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,SAAS,CAAA,EAAG;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,gBAAgB,CAAA;AAChD,EAAA,MAAM,cAAc,MAAA,CAAO,iBAAA,CAAkB,IAAA,EAAM,gBAAA,EAAkB,UAAU,CAAC,CAAA;AAChF,EAAA,MAAM,WAAA,GAAc,MAAA;AAAA,IAClB,iBAAA,CAAkB,IAAA,GAAO,WAAA,EAAa,gBAAA,EAAkB,UAAU;AAAA,GACpE;AAEA,EAAA,OAAO,SAAA,CAAU,KAAA,CAAM,gBAAgB,CAAA,KAAM,WAAA,GAAc,WAAA;AAC7D;;;ACfA,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEA,SAAS,iBAAA,CACP,OACA,QAAA,EAC2C;AAC3C,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,eAAe,qBAAqB,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAC/C,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,WAAW,CAAA,EAAG;AACpC,IAAA,OAAO,OAAA,CAAQ,qBAAqB,kCAAkC,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,WAAA,EAAa;AACnC,IAAA,OAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAA,eAAA,EAAkB,WAAW,CAAA,+BAAA,CAAiC,CAAA;AAAA,EACjG;AAEA,EAAA,MAAM,MAAA,GAAS,iBAAiB,QAAQ,CAAA;AACxC,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,OAAO,OAAA,CAAQ,sBAAsB,4CAA4C,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAEO,SAAS,YAAY,KAAA,EAAwB;AAClD,EAAA,OAAO,YAAA,CAAa,KAAK,CAAA,CAAE,EAAA;AAC7B;AAEO,SAAS,aAAa,KAAA,EAAiC;AAC5D,EAAA,MAAM,QAAA,GAAW,UAAU,KAAK,CAAA;AAChC,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AACpD,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,QAAO,GAAI,UAAA;AAEnB,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,CAAC,cAAA,CAAe,QAAQ,CAAA,EAAG;AACrD,IAAA,IAAI,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,UAAU,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAAA,IACnE;AACA,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,IAAI,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,EAAG;AACjC,QAAA,OAAO,OAAA,CAAQ,yBAAyB,2CAA2C,CAAA;AAAA,MACrF;AACA,MAAA,OAAO,OAAA,CAAQ,uBAAuB,+BAA+B,CAAA;AAAA,IACvE;AAAA,EACF;AAEA,EAAA,IAAI,uBAAA,CAAwB,QAAQ,CAAA,EAAG;AACrC,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,UAAU,QAAQ,CAAA,EAAG,QAAQ,cAAA,EAAe;AAAA,EACxE;AAEA,EAAA,OAAO,OAAA,CAAQ,uBAAuB,+BAA+B,CAAA;AACvE;;;AC7EO,SAAS,cAAc,SAAA,EAA2B;AACvD,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAA;AAC9C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,IAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE","file":"chunk-M66MGLHE.js","sourcesContent":["/**\n * CNPJ constants — modulo 11 weights from RFB FAQ Q14.\n * @see https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf\n */\nexport const CNPJ_LENGTH = 14;\nexport const CNPJ_BASE_LENGTH = 12;\n\nexport const CNPJ_DV1_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CNPJ_DV2_WEIGHTS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\n\nexport const CNPJ_ALPHANUMERIC_PATTERN = /^[A-Z0-9]{12}[0-9]{2}$/;\nexport const CNPJ_NUMERIC_PATTERN = /^[0-9]{14}$/;\n\nexport const CNPJ_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf';\n\n/** RFB Q14 golden vector */\nexport const CNPJ_GOLDEN_ALPHANUMERIC = '12ABC34501DE35';\n\n/** Valid numeric CNPJ for regression tests (modulo 11) */\nexport const CNPJ_GOLDEN_NUMERIC = '11222333000181';\nexport const CNPJ_GOLDEN_NUMERIC_MASKED = '11.222.333/0001-81';\nexport const CNPJ_GOLDEN_ALPHANUMERIC_MASKED = '12.ABC.345/01DE-35';\n\nexport const CNPJ_MASK_PATTERN = /^(.{2})(.{3})(.{3})(.{4})(.{2})$/;\n","/**\n * Character value for CNPJ modulo 11 — ASCII decimal minus 48 (RFB Q14).\n * @see https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf\n */\nexport function cnpjCharValue(char: string): number {\n return char.charCodeAt(0) - 48;\n}\n","import { CNPJ_ALPHANUMERIC_PATTERN, CNPJ_BASE_LENGTH, CNPJ_DV1_WEIGHTS, CNPJ_DV2_WEIGHTS, CNPJ_LENGTH } from './constants.js';\nimport { cnpjCharValue } from './ascii-value.js';\nimport { computeCheckDigit } from './modulo11.js';\n\nfunction hasRepeatedChars(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction isValidStructure(canonical: string): boolean {\n return canonical.length === CNPJ_LENGTH && CNPJ_ALPHANUMERIC_PATTERN.test(canonical);\n}\n\n/**\n * Alphanumeric CNPJ — ASCII-48 modulo 11 (RFB Q14).\n * Golden vector: 12ABC34501DE35\n */\nexport function isValidCnpjAlphanumeric(input: string): boolean {\n const canonical = input.toUpperCase();\n if (!isValidStructure(canonical)) {\n return false;\n }\n if (hasRepeatedChars(canonical)) {\n return false;\n }\n\n const base = canonical.slice(0, CNPJ_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, cnpjCharValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, cnpjCharValue),\n );\n\n return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n","import { CNPJ_ALPHANUMERIC_PATTERN, CNPJ_NUMERIC_PATTERN } from './constants.js';\nimport type { DocumentFormat } from '../../types/validation-result.js';\n\nexport function detectCnpjFormat(stripped: string): DocumentFormat | 'unknown' {\n const upper = stripped.toUpperCase();\n if (CNPJ_NUMERIC_PATTERN.test(upper)) {\n return 'numeric';\n }\n if (CNPJ_ALPHANUMERIC_PATTERN.test(upper)) {\n return 'alphanumeric';\n }\n return 'unknown';\n}\n\nexport function containsLetter(value: string): boolean {\n return /[A-Za-z]/.test(value);\n}\n","import { CNPJ_BASE_LENGTH, CNPJ_DV1_WEIGHTS, CNPJ_DV2_WEIGHTS, CNPJ_NUMERIC_PATTERN } from './constants.js';\nimport { computeCheckDigit } from './modulo11.js';\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Numeric CNPJ — traditional modulo 11 on digits (RFB Q6–Q7 coexistence).\n */\nexport function isValidCnpjNumeric(input: string): boolean {\n const canonical = input.replace(/\\D/g, '');\n if (!CNPJ_NUMERIC_PATTERN.test(canonical)) {\n return false;\n }\n if (hasRepeatedDigits(canonical)) {\n return false;\n }\n\n const base = canonical.slice(0, CNPJ_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, digitValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, digitValue),\n );\n\n return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n","import { stripCnpj } from '../../strip/cnpj.js';\nimport type { DocumentFormat, ValidationResult } from '../../types/validation-result.js';\nimport { brandCnpj } from '../../types/validation-result.js';\nimport { isValidCnpjAlphanumeric } from './alphanumeric.js';\nimport { CNPJ_LENGTH } from './constants.js';\nimport { containsLetter, detectCnpjFormat } from './detect.js';\nimport { isValidCnpjNumeric } from './numeric.js';\n\nexport { detectCnpjFormat, containsLetter } from './detect.js';\nexport { isValidCnpjAlphanumeric } from './alphanumeric.js';\nexport { isValidCnpjNumeric } from './numeric.js';\nexport {\n CNPJ_GOLDEN_ALPHANUMERIC,\n CNPJ_GOLDEN_ALPHANUMERIC_MASKED,\n CNPJ_GOLDEN_NUMERIC,\n CNPJ_GOLDEN_NUMERIC_MASKED,\n CNPJ_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(\n input: string,\n stripped: string,\n): FailedResult | { format: DocumentFormat } {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CNPJ input is empty');\n }\n\n const withoutMask = input.replace(/[.\\-/]/g, '');\n if (/[^A-Za-z0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CNPJ contains invalid characters');\n }\n\n if (stripped.length !== CNPJ_LENGTH) {\n return failure('INVALID_LENGTH', `CNPJ must have ${CNPJ_LENGTH} characters after normalization`);\n }\n\n const format = detectCnpjFormat(stripped);\n if (format === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'CNPJ format is not numeric or alphanumeric');\n }\n\n return { format };\n}\n\nexport function isValidCnpj(input: string): boolean {\n return validateCnpj(input).ok;\n}\n\nexport function validateCnpj(input: string): ValidationResult {\n const stripped = stripCnpj(input);\n const structural = validateStructure(input, stripped);\n if ('ok' in structural) {\n return structural;\n }\n\n const { format } = structural;\n\n if (format === 'numeric' || !containsLetter(stripped)) {\n if (isValidCnpjNumeric(stripped)) {\n return { ok: true, value: brandCnpj(stripped), format: 'numeric' };\n }\n if (format === 'numeric') {\n if (/^(\\d)\\1{13}$/.test(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'CNPJ with all identical digits is invalid');\n }\n return failure('INVALID_CHECK_DIGIT', 'CNPJ check digits are invalid');\n }\n }\n\n if (isValidCnpjAlphanumeric(stripped)) {\n return { ok: true, value: brandCnpj(stripped), format: 'alphanumeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'CNPJ check digits are invalid');\n}\n","import { CNPJ_MASK_PATTERN } from './constants.js';\n\n/** Mask XX.XXX.XXX/XXXX-DD — same for numeric and alphanumeric (RFB Q21). */\nexport function applyCnpjMask(canonical: string): string {\n const match = CNPJ_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CNPJ must have exactly 14 characters to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}/${match[4]}-${match[5]}`;\n}\n"]} |
| import { computeCheckDigit } from './chunk-B2TDI3YS.js'; | ||
| import { brandPisPasep } from './chunk-DKRM66US.js'; | ||
| // src/strip/pis-pasep.ts | ||
| function stripPisPasep(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| // src/core/pis-pasep/constants.ts | ||
| var PIS_PASEP_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var PIS_PASEP_LENGTH = 11; | ||
| var PIS_PASEP_BASE_LENGTH = 10; | ||
| var PIS_PASEP_MASK_PATTERN = /^(\d{3})(\d{5})(\d{2})(\d{1})$/; | ||
| var PIS_PASEP_GOLDEN_PRIMARY = "10027230888"; | ||
| var PIS_PASEP_GOLDEN_SECONDARY = "12056456402"; | ||
| var PIS_PASEP_GOLDEN_PRIMARY_MASKED = "100.27230.88-8"; | ||
| var PIS_PASEP_OFFICIAL_SOURCE_URL = "https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf"; | ||
| // src/core/pis-pasep/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function digitValue(char) { | ||
| return Number(char); | ||
| } | ||
| function hasRepeatedDigits(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function isValidPisPasepChecksum(stripped) { | ||
| const base = stripped.slice(0, PIS_PASEP_BASE_LENGTH); | ||
| const dvExpected = String(computeCheckDigit(base, PIS_PASEP_DV_WEIGHTS, digitValue)); | ||
| return stripped.charAt(PIS_PASEP_BASE_LENGTH) === dvExpected; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "PIS/PASEP input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[.-]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "PIS/PASEP contains invalid characters"); | ||
| } | ||
| if (stripped.length !== PIS_PASEP_LENGTH) { | ||
| return failure("INVALID_LENGTH", `PIS/PASEP must have ${PIS_PASEP_LENGTH} digits after normalization`); | ||
| } | ||
| if (hasRepeatedDigits(stripped)) { | ||
| return failure("KNOWN_INVALID_PATTERN", "PIS/PASEP with all identical digits is invalid"); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidPisPasep(input) { | ||
| return validatePisPasep(input).ok; | ||
| } | ||
| function validatePisPasep(input) { | ||
| const stripped = stripPisPasep(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| if (isValidPisPasepChecksum(stripped)) { | ||
| return { ok: true, value: brandPisPasep(stripped), format: "numeric" }; | ||
| } | ||
| return failure("INVALID_CHECK_DIGIT", "PIS/PASEP check digit is invalid"); | ||
| } | ||
| // src/core/pis-pasep/mask.ts | ||
| function applyPisPasepMask(canonical) { | ||
| const match = PIS_PASEP_MASK_PATTERN.exec(canonical); | ||
| if (!match) { | ||
| throw new Error("PIS/PASEP must have exactly 11 digits to apply mask"); | ||
| } | ||
| return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`; | ||
| } | ||
| // src/format/pis-pasep.ts | ||
| function formatPisPasep(input) { | ||
| const result = validatePisPasep(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyPisPasepMask(result.value) }; | ||
| } | ||
| export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, formatPisPasep, isValidPisPasep, stripPisPasep, validatePisPasep }; | ||
| //# sourceMappingURL=chunk-OWJ5HN4T.js.map | ||
| //# sourceMappingURL=chunk-OWJ5HN4T.js.map |
| {"version":3,"sources":["../src/strip/pis-pasep.ts","../src/core/pis-pasep/constants.ts","../src/core/pis-pasep/index.ts","../src/core/pis-pasep/mask.ts","../src/format/pis-pasep.ts"],"names":[],"mappings":"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","file":"chunk-OWJ5HN4T.js","sourcesContent":["/**\n * Strip PIS/PASEP mask — digits only (BR-PIS-002).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n */\nexport function stripPisPasep(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * PIS/PASEP/NIS/NIT constants — modulo 11 (CNIS unified registry).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n * @see docs/use-cases/UC-006-validate-pis-pasep.md — golden vector 10027230888\n *\n * PIS, PASEP, NIS, and NIT share the same 11-digit algorithm and check-digit weights.\n */\nexport const PIS_PASEP_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const PIS_PASEP_LENGTH = 11;\nexport const PIS_PASEP_BASE_LENGTH = 10;\nexport const PIS_PASEP_MASK_PATTERN = /^(\\d{3})(\\d{5})(\\d{2})(\\d{1})$/;\n\nexport const PIS_PASEP_GOLDEN_PRIMARY = '10027230888';\nexport const PIS_PASEP_GOLDEN_SECONDARY = '12056456402';\nexport const PIS_PASEP_GOLDEN_PRIMARY_MASKED = '100.27230.88-8';\nexport const PIS_PASEP_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf';\n","/**\n * PIS/PASEP validation — modulo 11 (CNIS unified registry).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n * @see docs/use-cases/UC-006-validate-pis-pasep.md — golden vector 10027230888\n */\nimport { stripPisPasep } from '../../strip/pis-pasep.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandPisPasep } from '../../types/validation-result.js';\nimport { computeCheckDigit } from '../cnpj/modulo11.js';\nimport {\n PIS_PASEP_BASE_LENGTH,\n PIS_PASEP_DV_WEIGHTS,\n PIS_PASEP_LENGTH,\n} from './constants.js';\n\nexport {\n PIS_PASEP_GOLDEN_PRIMARY,\n PIS_PASEP_GOLDEN_PRIMARY_MASKED,\n PIS_PASEP_GOLDEN_SECONDARY,\n PIS_PASEP_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction isValidPisPasepChecksum(stripped: string): boolean {\n const base = stripped.slice(0, PIS_PASEP_BASE_LENGTH);\n const dvExpected = String(computeCheckDigit(base, PIS_PASEP_DV_WEIGHTS, digitValue));\n return stripped.charAt(PIS_PASEP_BASE_LENGTH) === dvExpected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'PIS/PASEP input is empty');\n }\n\n const withoutMask = input.replace(/[.-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'PIS/PASEP contains invalid characters');\n }\n\n if (stripped.length !== PIS_PASEP_LENGTH) {\n return failure('INVALID_LENGTH', `PIS/PASEP must have ${PIS_PASEP_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'PIS/PASEP with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidPisPasep(input: string): boolean {\n return validatePisPasep(input).ok;\n}\n\nexport function validatePisPasep(input: string): ValidationResult {\n const stripped = stripPisPasep(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidPisPasepChecksum(stripped)) {\n return { ok: true, value: brandPisPasep(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'PIS/PASEP check digit is invalid');\n}\n","import { PIS_PASEP_MASK_PATTERN } from './constants.js';\n\n/** Mask XXX.XXXXX.XX-X (BR-PIS-006). */\nexport function applyPisPasepMask(canonical: string): string {\n const match = PIS_PASEP_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('PIS/PASEP must have exactly 11 digits to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;\n}\n","import { applyPisPasepMask } from '../core/pis-pasep/mask.js';\nimport { validatePisPasep } from '../core/pis-pasep/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatPisPasep(input: string): FormatResult {\n const result = validatePisPasep(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyPisPasepMask(result.value) };\n}\n"]} |
| import { stripCpf } from './chunk-UCJPSJN5.js'; | ||
| import { computeCheckDigit } from './chunk-B2TDI3YS.js'; | ||
| import { brandCpf } from './chunk-DKRM66US.js'; | ||
| // src/core/cpf/constants.ts | ||
| var CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var CPF_DV2_WEIGHTS = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var CPF_LENGTH = 11; | ||
| var CPF_BASE_LENGTH = 9; | ||
| var CPF_MASK_PATTERN = /^(\d{3})(\d{3})(\d{3})(\d{2})$/; | ||
| var CPF_GOLDEN_PRIMARY = "12345678909"; | ||
| var CPF_GOLDEN_SECONDARY = "11144477735"; | ||
| var CPF_GOLDEN_PRIMARY_MASKED = "123.456.789-09"; | ||
| var CPF_OFFICIAL_SOURCE_URL = "https://www.gov.br/receitafederal/pt-br/assuntos/cpf"; | ||
| // src/core/cpf/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function digitValue(char) { | ||
| return Number(char); | ||
| } | ||
| function hasRepeatedDigits(value) { | ||
| const first = value[0]; | ||
| for (let i = 1; i < value.length; i++) { | ||
| if (value[i] !== first) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function isValidCpfChecksum(stripped) { | ||
| const base = stripped.slice(0, CPF_BASE_LENGTH); | ||
| const dv1Expected = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue)); | ||
| const dv2Expected = String( | ||
| computeCheckDigit(base + dv1Expected, CPF_DV2_WEIGHTS, digitValue) | ||
| ); | ||
| return stripped.slice(CPF_BASE_LENGTH) === dv1Expected + dv2Expected; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "CPF input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[.-]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "CPF contains invalid characters"); | ||
| } | ||
| if (stripped.length !== CPF_LENGTH) { | ||
| return failure("INVALID_LENGTH", `CPF must have ${CPF_LENGTH} digits after normalization`); | ||
| } | ||
| if (hasRepeatedDigits(stripped)) { | ||
| return failure("KNOWN_INVALID_PATTERN", "CPF with all identical digits is invalid"); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidCpf(input) { | ||
| return validateCpf(input).ok; | ||
| } | ||
| function validateCpf(input) { | ||
| const stripped = stripCpf(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| if (isValidCpfChecksum(stripped)) { | ||
| return { ok: true, value: brandCpf(stripped), format: "numeric" }; | ||
| } | ||
| return failure("INVALID_CHECK_DIGIT", "CPF check digits are invalid"); | ||
| } | ||
| // src/core/cpf/mask.ts | ||
| function applyCpfMask(canonical) { | ||
| const match = CPF_MASK_PATTERN.exec(canonical); | ||
| if (!match) { | ||
| throw new Error("CPF must have exactly 11 digits to apply mask"); | ||
| } | ||
| return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`; | ||
| } | ||
| export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, applyCpfMask, isValidCpf, validateCpf }; | ||
| //# sourceMappingURL=chunk-PBNVKDCF.js.map | ||
| //# sourceMappingURL=chunk-PBNVKDCF.js.map |
| {"version":3,"sources":["../src/core/cpf/constants.ts","../src/core/cpf/index.ts","../src/core/cpf/mask.ts"],"names":[],"mappings":"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","file":"chunk-PBNVKDCF.js","sourcesContent":["/**\n * CPF constants — modulo 11 weights (RFB standard).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nexport const CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_DV2_WEIGHTS = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_LENGTH = 11;\nexport const CPF_BASE_LENGTH = 9;\nexport const CPF_NUMERIC_PATTERN = /^\\d{11}$/;\nexport const CPF_MASK_PATTERN = /^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/;\n\nexport const CPF_GOLDEN_PRIMARY = '12345678909';\nexport const CPF_GOLDEN_SECONDARY = '11144477735';\nexport const CPF_GOLDEN_PRIMARY_MASKED = '123.456.789-09';\nexport const CPF_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/receitafederal/pt-br/assuntos/cpf';\n","/**\n * CPF validation — modulo 11 (RFB standard weights).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nimport { stripCpf } from '../../strip/cpf.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCpf } from '../../types/validation-result.js';\nimport { computeCheckDigit } from '../cnpj/modulo11.js';\nimport {\n CPF_BASE_LENGTH,\n CPF_DV1_WEIGHTS,\n CPF_DV2_WEIGHTS,\n CPF_LENGTH,\n} from './constants.js';\n\nexport {\n CPF_GOLDEN_PRIMARY,\n CPF_GOLDEN_PRIMARY_MASKED,\n CPF_GOLDEN_SECONDARY,\n CPF_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction isValidCpfChecksum(stripped: string): boolean {\n const base = stripped.slice(0, CPF_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CPF_DV2_WEIGHTS, digitValue),\n );\n\n return stripped.slice(CPF_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CPF input is empty');\n }\n\n const withoutMask = input.replace(/[.-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CPF contains invalid characters');\n }\n\n if (stripped.length !== CPF_LENGTH) {\n return failure('INVALID_LENGTH', `CPF must have ${CPF_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'CPF with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidCpf(input: string): boolean {\n return validateCpf(input).ok;\n}\n\nexport function validateCpf(input: string): ValidationResult {\n const stripped = stripCpf(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidCpfChecksum(stripped)) {\n return { ok: true, value: brandCpf(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'CPF check digits are invalid');\n}\n","import { CPF_MASK_PATTERN } from './constants.js';\n\n/** Mask XXX.XXX.XXX-DD (BR-CPF-005). */\nexport function applyCpfMask(canonical: string): string {\n const match = CPF_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CPF must have exactly 11 digits to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;\n}\n"]} |
| import { stripCep } from './chunk-W6UXVWSR.js'; | ||
| import { brandCep } from './chunk-DKRM66US.js'; | ||
| // src/core/cep/constants.ts | ||
| var CEP_LENGTH = 8; | ||
| var CEP_MASK_PATTERN = /^(\d{5})(\d{3})$/; | ||
| var CEP_GOLDEN_PRIMARY = "01310100"; | ||
| var CEP_GOLDEN_SECONDARY = "20040020"; | ||
| var CEP_GOLDEN_PRIMARY_MASKED = "01310-100"; | ||
| var CEP_OFFICIAL_SOURCE_URL = "https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep"; | ||
| // src/core/cep/index.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "CEP input is empty"); | ||
| } | ||
| const withoutMask = input.replace(/[-\s]/g, ""); | ||
| if (/[^0-9]/.test(withoutMask)) { | ||
| return failure("INVALID_CHARACTER", "CEP contains invalid characters"); | ||
| } | ||
| if (stripped.length !== CEP_LENGTH) { | ||
| return failure("INVALID_LENGTH", `CEP must have ${CEP_LENGTH} digits after normalization`); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidCep(input) { | ||
| return validateCep(input).ok; | ||
| } | ||
| function validateCep(input) { | ||
| const stripped = stripCep(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| return { ok: true, value: brandCep(stripped), format: "numeric" }; | ||
| } | ||
| // src/core/cep/mask.ts | ||
| function applyCepMask(canonical) { | ||
| const match = CEP_MASK_PATTERN.exec(canonical); | ||
| if (!match) { | ||
| throw new Error("CEP must have exactly 8 digits to apply mask"); | ||
| } | ||
| return `${match[1]}-${match[2]}`; | ||
| } | ||
| // src/format/cep.ts | ||
| function formatCep(input) { | ||
| const result = validateCep(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyCepMask(result.value) }; | ||
| } | ||
| export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep }; | ||
| //# sourceMappingURL=chunk-RMKTJQBB.js.map | ||
| //# sourceMappingURL=chunk-RMKTJQBB.js.map |
| {"version":3,"sources":["../src/core/cep/constants.ts","../src/core/cep/index.ts","../src/core/cep/mask.ts","../src/format/cep.ts"],"names":[],"mappings":";;;;AAKO,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,gBAAA,GAAmB,kBAAA;AAGzB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,yBAAA,GAA4B;AAClC,IAAM,uBAAA,GACX;;;ACMF,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEA,SAAS,iBAAA,CAAkB,OAAe,QAAA,EAAuC;AAC/E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,eAAe,oBAAoB,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC9C,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,OAAA,CAAQ,qBAAqB,iCAAiC,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,UAAA,EAAY;AAClC,IAAA,OAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAA,cAAA,EAAiB,UAAU,CAAA,2BAAA,CAA6B,CAAA;AAAA,EAC3F;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,EAAA;AAC5B;AAEO,SAAS,YAAY,KAAA,EAAiC;AAC3D,EAAA,MAAM,QAAA,GAAW,SAAS,KAAK,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AACpD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,SAAS,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAClE;;;ACjDO,SAAS,aAAa,SAAA,EAA2B;AACtD,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA;AAC7C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAChC;;;ACLO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3D","file":"chunk-RMKTJQBB.js","sourcesContent":["/**\n * CEP constants — 8 digits, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nexport const CEP_LENGTH = 8;\nexport const CEP_MASK_PATTERN = /^(\\d{5})(\\d{3})$/;\nexport const CEP_NUMERIC_PATTERN = /^\\d{8}$/;\n\nexport const CEP_GOLDEN_PRIMARY = '01310100';\nexport const CEP_GOLDEN_SECONDARY = '20040020';\nexport const CEP_GOLDEN_PRIMARY_MASKED = '01310-100';\nexport const CEP_OFFICIAL_SOURCE_URL =\n 'https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep';\n","/**\n * CEP validation — structural only, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nimport { stripCep } from '../../strip/index.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCep } from '../../types/validation-result.js';\nimport { CEP_LENGTH } from './constants.js';\n\nexport {\n CEP_GOLDEN_PRIMARY,\n CEP_GOLDEN_PRIMARY_MASKED,\n CEP_GOLDEN_SECONDARY,\n CEP_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CEP input is empty');\n }\n\n const withoutMask = input.replace(/[-\\s]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CEP contains invalid characters');\n }\n\n if (stripped.length !== CEP_LENGTH) {\n return failure('INVALID_LENGTH', `CEP must have ${CEP_LENGTH} digits after normalization`);\n }\n\n return null;\n}\n\nexport function isValidCep(input: string): boolean {\n return validateCep(input).ok;\n}\n\nexport function validateCep(input: string): ValidationResult {\n const stripped = stripCep(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n return { ok: true, value: brandCep(stripped), format: 'numeric' };\n}\n","import { CEP_MASK_PATTERN } from './constants.js';\n\n/** Mask XXXXX-XXX (BR-CEP-004). */\nexport function applyCepMask(canonical: string): string {\n const match = CEP_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CEP must have exactly 8 digits to apply mask');\n }\n return `${match[1]}-${match[2]}`;\n}\n","import { applyCepMask } from '../core/cep/mask.js';\nimport { validateCep } from '../core/cep/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCep(input: string): FormatResult {\n const result = validateCep(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCepMask(result.value) };\n}\n"]} |
| import { validateCpf, applyCpfMask } from './chunk-PBNVKDCF.js'; | ||
| // src/format/cpf.ts | ||
| function formatCpf(input) { | ||
| const result = validateCpf(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyCpfMask(result.value) }; | ||
| } | ||
| export { formatCpf }; | ||
| //# sourceMappingURL=chunk-RZ2JG5PP.js.map | ||
| //# sourceMappingURL=chunk-RZ2JG5PP.js.map |
| {"version":3,"sources":["../src/format/cpf.ts"],"names":[],"mappings":";;;AAIO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3D","file":"chunk-RZ2JG5PP.js","sourcesContent":["import { applyCpfMask } from '../core/cpf/mask.js';\nimport { validateCpf } from '../core/cpf/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCpf(input: string): FormatResult {\n const result = validateCpf(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCpfMask(result.value) };\n}\n"]} |
| import { validateCnpj, applyCnpjMask, detectCnpjFormat } from './chunk-M66MGLHE.js'; | ||
| import { stripCnpj } from './chunk-EB3G4IG6.js'; | ||
| import { validateCpf, applyCpfMask } from './chunk-PBNVKDCF.js'; | ||
| import { stripCpf } from './chunk-UCJPSJN5.js'; | ||
| import { brandPixKey } from './chunk-DKRM66US.js'; | ||
| // src/core/pix/cnpj.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message, keyType: "cnpj" }; | ||
| } | ||
| function validatePixCnpjKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure("EMPTY_INPUT", "PIX CNPJ key input is empty"); | ||
| } | ||
| const result = validateCnpj(trimmed); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message, keyType: "cnpj" }; | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(result.value), | ||
| keyType: "cnpj", | ||
| format: result.format | ||
| }; | ||
| } | ||
| // src/core/pix/cpf.ts | ||
| function failure2(code, message) { | ||
| return { ok: false, code, message, keyType: "cpf" }; | ||
| } | ||
| function validatePixCpfKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure2("EMPTY_INPUT", "PIX CPF key input is empty"); | ||
| } | ||
| const result = validateCpf(trimmed); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message, keyType: "cpf" }; | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(result.value), | ||
| keyType: "cpf", | ||
| format: result.format | ||
| }; | ||
| } | ||
| // src/core/pix/constants.ts | ||
| var PIX_EMAIL_MAX_LENGTH = 77; | ||
| var PIX_EMAIL_PATTERN = /^[a-z0-9.!#$'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/; | ||
| var PIX_PHONE_E164_PATTERN = /^\+[1-9]\d{1,14}$/; | ||
| var PIX_PHONE_BR_MOBILE_PATTERN = /^\+55\d{2}9\d{8}$/; | ||
| var PIX_EVP_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; | ||
| var PIX_CPF_DIGITS_PATTERN = /^[0-9]{11}$/; | ||
| var PIX_GOLDEN_CPF = "12345678909"; | ||
| var PIX_GOLDEN_CNPJ_NUMERIC = "11222333000181"; | ||
| var PIX_GOLDEN_CNPJ_ALPHANUMERIC = "12ABC34501DE35"; | ||
| var PIX_GOLDEN_EMAIL = "pix@bcb.gov.br"; | ||
| var PIX_GOLDEN_PHONE = "+5510998765432"; | ||
| var PIX_GOLDEN_EVP = "123e4567-e89b-12d3-a456-426655440000"; | ||
| var PIX_OFFICIAL_SOURCE_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf"; | ||
| var PIX_DICT_API_SOURCE_URL = "https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html"; | ||
| // src/core/pix/detect.ts | ||
| function isCpfShapedInput(input) { | ||
| const trimmed = input.trim(); | ||
| const stripped = stripCpf(trimmed); | ||
| if (!PIX_CPF_DIGITS_PATTERN.test(stripped)) { | ||
| return false; | ||
| } | ||
| return /^[\d.\-\s]+$/.test(trimmed); | ||
| } | ||
| function isCnpjShapedInput(input) { | ||
| const trimmed = input.trim(); | ||
| const stripped = stripCnpj(trimmed); | ||
| if (detectCnpjFormat(stripped) === "unknown") { | ||
| return false; | ||
| } | ||
| return /^[A-Za-z0-9./\-\s]+$/.test(trimmed); | ||
| } | ||
| function detectPixKeyType(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return "unknown"; | ||
| } | ||
| if (trimmed.includes("@")) { | ||
| return "email"; | ||
| } | ||
| if (trimmed.startsWith("+")) { | ||
| return "phone"; | ||
| } | ||
| if (PIX_EVP_PATTERN.test(trimmed)) { | ||
| return "evp"; | ||
| } | ||
| if (isCpfShapedInput(trimmed)) { | ||
| return "cpf"; | ||
| } | ||
| if (isCnpjShapedInput(trimmed)) { | ||
| return "cnpj"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/pix/email.ts | ||
| function failure3(code, message) { | ||
| return { ok: false, code, message, keyType: "email" }; | ||
| } | ||
| function validatePixEmailKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure3("EMPTY_INPUT", "PIX email key input is empty"); | ||
| } | ||
| if (trimmed !== trimmed.toLowerCase()) { | ||
| return failure3("INVALID_CHARACTER", "PIX email key must be lowercase"); | ||
| } | ||
| if (trimmed.length > PIX_EMAIL_MAX_LENGTH) { | ||
| return failure3("INVALID_LENGTH", `PIX email key must have at most ${PIX_EMAIL_MAX_LENGTH} characters`); | ||
| } | ||
| if (!trimmed.includes("@") || !PIX_EMAIL_PATTERN.test(trimmed)) { | ||
| return failure3("UNSUPPORTED_FORMAT", "PIX email key format is invalid"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(trimmed), | ||
| keyType: "email", | ||
| format: "email" | ||
| }; | ||
| } | ||
| // src/core/pix/evp.ts | ||
| function failure4(code, message) { | ||
| return { ok: false, code, message, keyType: "evp" }; | ||
| } | ||
| function validatePixEvpKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure4("EMPTY_INPUT", "PIX EVP key input is empty"); | ||
| } | ||
| if (trimmed !== trimmed.toLowerCase()) { | ||
| return failure4("INVALID_CHARACTER", "PIX EVP key must be lowercase"); | ||
| } | ||
| if (!PIX_EVP_PATTERN.test(trimmed)) { | ||
| return failure4("UNSUPPORTED_FORMAT", "PIX EVP key must be a lowercase UUID with hyphens"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(trimmed), | ||
| keyType: "evp", | ||
| format: "evp" | ||
| }; | ||
| } | ||
| // src/core/pix/phone.ts | ||
| function failure5(code, message) { | ||
| return { ok: false, code, message, keyType: "phone" }; | ||
| } | ||
| function validatePixPhoneKey(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure5("EMPTY_INPUT", "PIX phone key input is empty"); | ||
| } | ||
| if (!trimmed.startsWith("+")) { | ||
| return failure5("INVALID_CHARACTER", "PIX phone key must start with + (E.164)"); | ||
| } | ||
| if (!PIX_PHONE_E164_PATTERN.test(trimmed)) { | ||
| return failure5("INVALID_CHARACTER", "PIX phone key contains invalid characters"); | ||
| } | ||
| if (!trimmed.startsWith("+55")) { | ||
| return failure5("UNSUPPORTED_FORMAT", "PIX phone key must use Brazilian country code +55"); | ||
| } | ||
| if (!PIX_PHONE_BR_MOBILE_PATTERN.test(trimmed)) { | ||
| return failure5("UNSUPPORTED_FORMAT", "PIX phone key must match Brazilian mobile format +55DD9XXXXXXXX"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandPixKey(trimmed), | ||
| keyType: "phone", | ||
| format: "phone" | ||
| }; | ||
| } | ||
| // src/core/pix/mask.ts | ||
| function applyPixCpfKeyMask(canonical) { | ||
| return applyCpfMask(canonical); | ||
| } | ||
| function applyPixCnpjKeyMask(canonical) { | ||
| return applyCnpjMask(canonical); | ||
| } | ||
| function applyPixPhoneKeyMask(e164) { | ||
| const match = /^\+55(\d{2})(9\d{4})(\d{4})$/.exec(e164); | ||
| if (!match) { | ||
| throw new Error("PIX phone key must be a validated Brazilian mobile E.164 number"); | ||
| } | ||
| return `+55 (${match[1]}) ${match[2]}-${match[3]}`; | ||
| } | ||
| function applyPixEmailKeyMask(email) { | ||
| return email.toLowerCase().trim(); | ||
| } | ||
| function applyPixEvpKeyMask(uuid) { | ||
| return uuid.toLowerCase(); | ||
| } | ||
| // src/core/pix/index.ts | ||
| function failure6(code, message, keyType) { | ||
| return { ok: false, code, message, ...keyType ? { keyType } : {} }; | ||
| } | ||
| function validateByType(input, keyType) { | ||
| switch (keyType) { | ||
| case "cpf": | ||
| return validatePixCpfKey(input); | ||
| case "cnpj": | ||
| return validatePixCnpjKey(input); | ||
| case "email": | ||
| return validatePixEmailKey(input); | ||
| case "phone": | ||
| return validatePixPhoneKey(input); | ||
| case "evp": | ||
| return validatePixEvpKey(input); | ||
| default: { | ||
| const _exhaustive = keyType; | ||
| return failure6("UNSUPPORTED_FORMAT", `Unknown PIX key type: ${_exhaustive}`); | ||
| } | ||
| } | ||
| } | ||
| function isValidPixKey(input, options) { | ||
| return validatePixKey(input, options).ok; | ||
| } | ||
| function validatePixKey(input, options) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return failure6("EMPTY_INPUT", "PIX key input is empty"); | ||
| } | ||
| const detected = detectPixKeyType(trimmed); | ||
| if (options?.type !== void 0) { | ||
| if (detected !== "unknown" && detected !== options.type) { | ||
| return failure6( | ||
| "UNSUPPORTED_FORMAT", | ||
| `PIX key detected as ${detected} but forced type is ${options.type}`, | ||
| options.type | ||
| ); | ||
| } | ||
| return validateByType(trimmed, options.type); | ||
| } | ||
| if (detected === "unknown") { | ||
| return failure6("UNSUPPORTED_FORMAT", "PIX key type could not be determined"); | ||
| } | ||
| return validateByType(trimmed, detected); | ||
| } | ||
| // src/format/pix.ts | ||
| function applyPixMask(keyType, value) { | ||
| switch (keyType) { | ||
| case "cpf": | ||
| return applyPixCpfKeyMask(value); | ||
| case "cnpj": | ||
| return applyPixCnpjKeyMask(value); | ||
| case "phone": | ||
| return applyPixPhoneKeyMask(value); | ||
| case "email": | ||
| return applyPixEmailKeyMask(value); | ||
| case "evp": | ||
| return applyPixEvpKeyMask(value); | ||
| } | ||
| } | ||
| function formatPixKey(input, options) { | ||
| const result = validatePixKey(input, options); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: applyPixMask(result.keyType, result.value) }; | ||
| } | ||
| export { PIX_DICT_API_SOURCE_URL, PIX_GOLDEN_CNPJ_ALPHANUMERIC, PIX_GOLDEN_CNPJ_NUMERIC, PIX_GOLDEN_CPF, PIX_GOLDEN_EMAIL, PIX_GOLDEN_EVP, PIX_GOLDEN_PHONE, PIX_OFFICIAL_SOURCE_URL, applyPixCnpjKeyMask, applyPixCpfKeyMask, applyPixEmailKeyMask, applyPixEvpKeyMask, applyPixPhoneKeyMask, detectPixKeyType, formatPixKey, isValidPixKey, validatePixCnpjKey, validatePixCpfKey, validatePixEmailKey, validatePixEvpKey, validatePixKey, validatePixPhoneKey }; | ||
| //# sourceMappingURL=chunk-SE33CFGM.js.map | ||
| //# sourceMappingURL=chunk-SE33CFGM.js.map |
| {"version":3,"sources":["../src/core/pix/cnpj.ts","../src/core/pix/cpf.ts","../src/core/pix/constants.ts","../src/core/pix/detect.ts","../src/core/pix/email.ts","../src/core/pix/evp.ts","../src/core/pix/phone.ts","../src/core/pix/mask.ts","../src/core/pix/index.ts","../src/format/pix.ts"],"names":["failure"],"mappings":"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","file":"chunk-SE33CFGM.js","sourcesContent":["import { validateCnpj } from '../cnpj/index.js';\nimport type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'cnpj' };\n}\n\nexport function validatePixCnpjKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX CNPJ key input is empty');\n }\n\n const result = validateCnpj(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message, keyType: 'cnpj' };\n }\n\n return {\n ok: true,\n value: brandPixKey(result.value),\n keyType: 'cnpj',\n format: result.format,\n };\n}\n","import { validateCpf } from '../cpf/index.js';\nimport type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'cpf' };\n}\n\nexport function validatePixCpfKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX CPF key input is empty');\n }\n\n const result = validateCpf(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message, keyType: 'cpf' };\n }\n\n return {\n ok: true,\n value: brandPixKey(result.value),\n keyType: 'cpf',\n format: result.format,\n };\n}\n","/**\n * PIX key constants — Bacen DICT API + Manual de Iniciação do Pix.\n * @see https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html\n * @see https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf\n * @see docs/use-cases/UC-005-validate-pix-key.md\n */\nexport const PIX_EMAIL_MAX_LENGTH = 77;\nexport const PIX_EMAIL_PATTERN =\n /^[a-z0-9.!#$'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/;\n\nexport const PIX_PHONE_E164_PATTERN = /^\\+[1-9]\\d{1,14}$/;\nexport const PIX_PHONE_BR_MOBILE_PATTERN = /^\\+55\\d{2}9\\d{8}$/;\n\nexport const PIX_EVP_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport const PIX_CPF_DIGITS_PATTERN = /^[0-9]{11}$/;\n\nexport const PIX_GOLDEN_CPF = '12345678909';\nexport const PIX_GOLDEN_CNPJ_NUMERIC = '11222333000181';\nexport const PIX_GOLDEN_CNPJ_ALPHANUMERIC = '12ABC34501DE35';\nexport const PIX_GOLDEN_EMAIL = 'pix@bcb.gov.br';\nexport const PIX_GOLDEN_PHONE = '+5510998765432';\nexport const PIX_GOLDEN_PHONE_SECONDARY = '+5561912345678';\nexport const PIX_GOLDEN_EVP = '123e4567-e89b-12d3-a456-426655440000';\nexport const PIX_GOLDEN_EMAIL_SECONDARY = 'fulano_da_silva.recebedor@example.com';\n\nexport const PIX_OFFICIAL_SOURCE_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf';\n\nexport const PIX_DICT_API_SOURCE_URL =\n 'https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html';\n","import { stripCnpj } from '../../strip/cnpj.js';\nimport { stripCpf } from '../../strip/cpf.js';\nimport type { PixKeyType } from '../../types/validation-result.js';\nimport { detectCnpjFormat } from '../cnpj/detect.js';\nimport {\n PIX_CPF_DIGITS_PATTERN,\n PIX_EVP_PATTERN,\n} from './constants.js';\n\nexport type DetectedPixKeyType = PixKeyType | 'unknown';\n\nfunction isCpfShapedInput(input: string): boolean {\n const trimmed = input.trim();\n const stripped = stripCpf(trimmed);\n if (!PIX_CPF_DIGITS_PATTERN.test(stripped)) {\n return false;\n }\n return /^[\\d.\\-\\s]+$/.test(trimmed);\n}\n\nfunction isCnpjShapedInput(input: string): boolean {\n const trimmed = input.trim();\n const stripped = stripCnpj(trimmed);\n if (detectCnpjFormat(stripped) === 'unknown') {\n return false;\n }\n return /^[A-Za-z0-9./\\-\\s]+$/.test(trimmed);\n}\n\nexport function detectPixKeyType(input: string): DetectedPixKeyType {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return 'unknown';\n }\n\n if (trimmed.includes('@')) {\n return 'email';\n }\n\n if (trimmed.startsWith('+')) {\n return 'phone';\n }\n\n if (PIX_EVP_PATTERN.test(trimmed)) {\n return 'evp';\n }\n\n if (isCpfShapedInput(trimmed)) {\n return 'cpf';\n }\n\n if (isCnpjShapedInput(trimmed)) {\n return 'cnpj';\n }\n\n return 'unknown';\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_EMAIL_MAX_LENGTH, PIX_EMAIL_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'email' };\n}\n\nexport function validatePixEmailKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX email key input is empty');\n }\n\n if (trimmed !== trimmed.toLowerCase()) {\n return failure('INVALID_CHARACTER', 'PIX email key must be lowercase');\n }\n\n if (trimmed.length > PIX_EMAIL_MAX_LENGTH) {\n return failure('INVALID_LENGTH', `PIX email key must have at most ${PIX_EMAIL_MAX_LENGTH} characters`);\n }\n\n if (!trimmed.includes('@') || !PIX_EMAIL_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX email key format is invalid');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'email',\n format: 'email',\n };\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_EVP_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'evp' };\n}\n\nexport function validatePixEvpKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX EVP key input is empty');\n }\n\n if (trimmed !== trimmed.toLowerCase()) {\n return failure('INVALID_CHARACTER', 'PIX EVP key must be lowercase');\n }\n\n if (!PIX_EVP_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX EVP key must be a lowercase UUID with hyphens');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'evp',\n format: 'evp',\n };\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_PHONE_BR_MOBILE_PATTERN, PIX_PHONE_E164_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'phone' };\n}\n\nexport function validatePixPhoneKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX phone key input is empty');\n }\n\n if (!trimmed.startsWith('+')) {\n return failure('INVALID_CHARACTER', 'PIX phone key must start with + (E.164)');\n }\n\n if (!PIX_PHONE_E164_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'PIX phone key contains invalid characters');\n }\n\n if (!trimmed.startsWith('+55')) {\n return failure('UNSUPPORTED_FORMAT', 'PIX phone key must use Brazilian country code +55');\n }\n\n if (!PIX_PHONE_BR_MOBILE_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX phone key must match Brazilian mobile format +55DD9XXXXXXXX');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'phone',\n format: 'phone',\n };\n}\n","/**\n * PIX key display masks — delegates to parent validators where applicable (BR-PIX-001…005).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport { applyCnpjMask } from '../cnpj/mask.js';\nimport { applyCpfMask } from '../cpf/mask.js';\n\nexport function applyPixCpfKeyMask(canonical: string): string {\n return applyCpfMask(canonical);\n}\n\nexport function applyPixCnpjKeyMask(canonical: string): string {\n return applyCnpjMask(canonical);\n}\n\n/** Brazilian mobile E.164 → +55 (DD) 9XXXX-XXXX display. */\nexport function applyPixPhoneKeyMask(e164: string): string {\n const match = /^\\+55(\\d{2})(9\\d{4})(\\d{4})$/.exec(e164);\n if (!match) {\n throw new Error('PIX phone key must be a validated Brazilian mobile E.164 number');\n }\n return `+55 (${match[1]}) ${match[2]}-${match[3]}`;\n}\n\nexport function applyPixEmailKeyMask(email: string): string {\n return email.toLowerCase().trim();\n}\n\nexport function applyPixEvpKeyMask(uuid: string): string {\n return uuid.toLowerCase();\n}\n","/**\n * PIX key validation — five Bacen types (CPF, CNPJ, email, phone, EVP).\n * @see docs/use-cases/UC-005-validate-pix-key.md\n */\nimport type { PixKeyType, PixValidationResult } from '../../types/validation-result.js';\nimport { validatePixCnpjKey } from './cnpj.js';\nimport { validatePixCpfKey } from './cpf.js';\nimport { detectPixKeyType } from './detect.js';\nimport { validatePixEmailKey } from './email.js';\nimport { validatePixEvpKey } from './evp.js';\nimport { validatePixPhoneKey } from './phone.js';\n\nexport {\n PIX_DICT_API_SOURCE_URL,\n PIX_GOLDEN_CNPJ_ALPHANUMERIC,\n PIX_GOLDEN_CNPJ_NUMERIC,\n PIX_GOLDEN_CPF,\n PIX_GOLDEN_EMAIL,\n PIX_GOLDEN_EMAIL_SECONDARY,\n PIX_GOLDEN_EVP,\n PIX_GOLDEN_PHONE,\n PIX_GOLDEN_PHONE_SECONDARY,\n PIX_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { detectPixKeyType, type DetectedPixKeyType } from './detect.js';\nexport { validatePixCpfKey } from './cpf.js';\nexport { validatePixCnpjKey } from './cnpj.js';\nexport { validatePixEmailKey } from './email.js';\nexport { validatePixPhoneKey } from './phone.js';\nexport { validatePixEvpKey } from './evp.js';\nexport {\n applyPixCnpjKeyMask,\n applyPixCpfKeyMask,\n applyPixEmailKeyMask,\n applyPixEvpKeyMask,\n applyPixPhoneKeyMask,\n} from './mask.js';\n\nexport type ValidatePixKeyOptions = {\n type?: PixKeyType;\n};\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, keyType?: PixKeyType): FailedResult {\n return { ok: false, code, message, ...(keyType ? { keyType } : {}) };\n}\n\nfunction validateByType(input: string, keyType: PixKeyType): PixValidationResult {\n switch (keyType) {\n case 'cpf':\n return validatePixCpfKey(input);\n case 'cnpj':\n return validatePixCnpjKey(input);\n case 'email':\n return validatePixEmailKey(input);\n case 'phone':\n return validatePixPhoneKey(input);\n case 'evp':\n return validatePixEvpKey(input);\n default: {\n const _exhaustive: never = keyType;\n return failure('UNSUPPORTED_FORMAT', `Unknown PIX key type: ${_exhaustive}`);\n }\n }\n}\n\nexport function isValidPixKey(input: string, options?: ValidatePixKeyOptions): boolean {\n return validatePixKey(input, options).ok;\n}\n\nexport function validatePixKey(input: string, options?: ValidatePixKeyOptions): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX key input is empty');\n }\n\n const detected = detectPixKeyType(trimmed);\n\n if (options?.type !== undefined) {\n if (detected !== 'unknown' && detected !== options.type) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `PIX key detected as ${detected} but forced type is ${options.type}`,\n options.type,\n );\n }\n return validateByType(trimmed, options.type);\n }\n\n if (detected === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'PIX key type could not be determined');\n }\n\n return validateByType(trimmed, detected);\n}\n","/**\n * Format decorator — strip → validate → apply official mask (UC-003).\n * @see docs/use-cases/UC-003-format-document.md\n * @see docs/VALIDATION-RULES.md BR-GLOBAL-002\n */\nimport type { ValidatePixKeyOptions } from '../core/pix/index.js';\nimport { validatePixKey } from '../core/pix/index.js';\nimport {\n applyPixCnpjKeyMask,\n applyPixCpfKeyMask,\n applyPixEmailKeyMask,\n applyPixEvpKeyMask,\n applyPixPhoneKeyMask,\n} from '../core/pix/mask.js';\nimport type { FormatResult, PixKeyType } from '../types/validation-result.js';\n\nfunction applyPixMask(keyType: PixKeyType, value: string): string {\n switch (keyType) {\n case 'cpf':\n return applyPixCpfKeyMask(value);\n case 'cnpj':\n return applyPixCnpjKeyMask(value);\n case 'phone':\n return applyPixPhoneKeyMask(value);\n case 'email':\n return applyPixEmailKeyMask(value);\n case 'evp':\n return applyPixEvpKeyMask(value);\n }\n}\n\nexport function formatPixKey(input: string, options?: ValidatePixKeyOptions): FormatResult {\n const result = validatePixKey(input, options);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n\n return { ok: true, formatted: applyPixMask(result.keyType, result.value) };\n}\n"]} |
| import { stripPlaca } from './chunk-W6UXVWSR.js'; | ||
| import { brandPlaca } from './chunk-DKRM66US.js'; | ||
| // src/core/placa/constants.ts | ||
| var PLACA_LENGTH = 7; | ||
| var PLACA_LEGACY_PATTERN = /^[A-Z]{3}[0-9]{4}$/; | ||
| var PLACA_MERCOSUL_PATTERN = /^[A-Z]{3}[0-9][A-Z0-9][0-9]{2}$/; | ||
| var PLACA_LEGACY_TO_MERCOSUL_MAP = { | ||
| "0": "A", | ||
| "1": "B", | ||
| "2": "C", | ||
| "3": "D", | ||
| "4": "E", | ||
| "5": "F", | ||
| "6": "G", | ||
| "7": "H", | ||
| "8": "I", | ||
| "9": "J" | ||
| }; | ||
| var PLACA_GOLDEN_MERCOSUL = "ABC1D23"; | ||
| var PLACA_GOLDEN_LEGACY = "ABC1234"; | ||
| var PLACA_GOLDEN_CONVERSION_FROM = "ABC1234"; | ||
| var PLACA_GOLDEN_CONVERSION_TO = "ABC1C34"; | ||
| var PLACA_OFFICIAL_SOURCE_URL = "https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf"; | ||
| // src/core/placa/detect.ts | ||
| function detectPlacaFormat(input) { | ||
| const stripped = stripPlaca(input); | ||
| if (stripped.length !== PLACA_LENGTH) { | ||
| return "unknown"; | ||
| } | ||
| if (PLACA_LEGACY_PATTERN.test(stripped)) { | ||
| return "legacy"; | ||
| } | ||
| if (PLACA_MERCOSUL_PATTERN.test(stripped)) { | ||
| return "mercosul"; | ||
| } | ||
| return "unknown"; | ||
| } | ||
| // src/core/placa/legacy.ts | ||
| function isValidPlacaLegacy(input) { | ||
| const stripped = stripPlaca(input); | ||
| return PLACA_LEGACY_PATTERN.test(stripped); | ||
| } | ||
| // src/core/placa/mercosul.ts | ||
| function isValidPlacaMercosul(input) { | ||
| const stripped = stripPlaca(input); | ||
| return PLACA_MERCOSUL_PATTERN.test(stripped); | ||
| } | ||
| // src/core/placa/convert.ts | ||
| function failure(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function convertPlacaToMercosul(input) { | ||
| const stripped = stripPlaca(input); | ||
| if (stripped.length === 0) { | ||
| return failure("EMPTY_INPUT", "Placa input is empty"); | ||
| } | ||
| if (detectPlacaFormat(input) !== "legacy") { | ||
| return failure("UNSUPPORTED_FORMAT", "Conversion requires a valid legacy plate (LLLNNNN)"); | ||
| } | ||
| const prefix = stripped.slice(0, 4); | ||
| const mapped = PLACA_LEGACY_TO_MERCOSUL_MAP[stripped.charAt(4)]; | ||
| const suffix = stripped.slice(5); | ||
| return { ok: true, formatted: `${prefix}${mapped}${suffix}` }; | ||
| } | ||
| // src/core/placa/index.ts | ||
| function failure2(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function validateStructure(input, stripped) { | ||
| if (stripped.length === 0) { | ||
| return failure2("EMPTY_INPUT", "Placa input is empty"); | ||
| } | ||
| const withoutSeparators = input.replace(/[-\s]/g, ""); | ||
| if (/[^A-Za-z0-9]/.test(withoutSeparators)) { | ||
| return failure2("INVALID_CHARACTER", "Placa contains invalid characters"); | ||
| } | ||
| if (stripped.length !== PLACA_LENGTH) { | ||
| return failure2("INVALID_LENGTH", `Placa must have ${PLACA_LENGTH} characters after normalization`); | ||
| } | ||
| return null; | ||
| } | ||
| function isValidPlaca(input) { | ||
| return validatePlaca(input).ok; | ||
| } | ||
| function validatePlaca(input) { | ||
| const stripped = stripPlaca(input); | ||
| const structural = validateStructure(input, stripped); | ||
| if (structural) { | ||
| return structural; | ||
| } | ||
| const format = detectPlacaFormat(input); | ||
| if (format === "unknown") { | ||
| return failure2("UNSUPPORTED_FORMAT", "Placa does not match legacy or Mercosul format"); | ||
| } | ||
| return { ok: true, value: brandPlaca(stripped), format }; | ||
| } | ||
| // src/format/placa.ts | ||
| function formatPlaca(input) { | ||
| const result = validatePlaca(input); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| return { ok: true, formatted: result.value }; | ||
| } | ||
| export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, formatPlaca, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca }; | ||
| //# sourceMappingURL=chunk-YY4M2YS6.js.map | ||
| //# sourceMappingURL=chunk-YY4M2YS6.js.map |
| {"version":3,"sources":["../src/core/placa/constants.ts","../src/core/placa/detect.ts","../src/core/placa/legacy.ts","../src/core/placa/mercosul.ts","../src/core/placa/convert.ts","../src/core/placa/index.ts","../src/format/placa.ts"],"names":["failure"],"mappings":"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","file":"chunk-YY4M2YS6.js","sourcesContent":["/**\n * License plate patterns — CONTRAN 729/2018 (legacy + Mercosul).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n * @see docs/use-cases/UC-004-validate-placa.md — golden vectors ABC1D23, ABC1234\n */\nexport const PLACA_LENGTH = 7;\nexport const PLACA_LEGACY_PATTERN = /^[A-Z]{3}[0-9]{4}$/;\nexport const PLACA_MERCOSUL_PATTERN = /^[A-Z]{3}[0-9][A-Z0-9][0-9]{2}$/;\nexport const PLACA_LEGACY_TO_MERCOSUL_MAP: Record<string, string> = {\n '0': 'A',\n '1': 'B',\n '2': 'C',\n '3': 'D',\n '4': 'E',\n '5': 'F',\n '6': 'G',\n '7': 'H',\n '8': 'I',\n '9': 'J',\n};\nexport const PLACA_GOLDEN_MERCOSUL = 'ABC1D23';\nexport const PLACA_GOLDEN_LEGACY = 'ABC1234';\nexport const PLACA_GOLDEN_CONVERSION_FROM = 'ABC1234';\nexport const PLACA_GOLDEN_CONVERSION_TO = 'ABC1C34';\nexport const PLACA_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf';\n","/**\n * License plate format detection — legacy vs Mercosul (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LENGTH, PLACA_LEGACY_PATTERN, PLACA_MERCOSUL_PATTERN } from './constants.js';\n\nexport type PlacaFormat = 'legacy' | 'mercosul' | 'unknown';\n\nexport function detectPlacaFormat(input: string): PlacaFormat {\n const stripped = stripPlaca(input);\n if (stripped.length !== PLACA_LENGTH) {\n return 'unknown';\n }\n if (PLACA_LEGACY_PATTERN.test(stripped)) {\n return 'legacy';\n }\n if (PLACA_MERCOSUL_PATTERN.test(stripped)) {\n return 'mercosul';\n }\n return 'unknown';\n}\n","/**\n * License plate — legacy format LLLNNNN (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LEGACY_PATTERN } from './constants.js';\n\nexport function isValidPlacaLegacy(input: string): boolean {\n const stripped = stripPlaca(input);\n return PLACA_LEGACY_PATTERN.test(stripped);\n}\n","/**\n * License plate — Mercosul format LLLNLNN (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_MERCOSUL_PATTERN } from './constants.js';\n\nexport function isValidPlacaMercosul(input: string): boolean {\n const stripped = stripPlaca(input);\n return PLACA_MERCOSUL_PATTERN.test(stripped);\n}\n","/**\n * Legacy → Mercosul plate conversion (CONTRAN digit-to-letter table).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport type { FormatResult } from '../../types/validation-result.js';\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LEGACY_TO_MERCOSUL_MAP } from './constants.js';\nimport { detectPlacaFormat } from './detect.js';\n\ntype FailedResult = Extract<FormatResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nexport function convertPlacaToMercosul(input: string): FormatResult {\n const stripped = stripPlaca(input);\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Placa input is empty');\n }\n\n if (detectPlacaFormat(input) !== 'legacy') {\n return failure('UNSUPPORTED_FORMAT', 'Conversion requires a valid legacy plate (LLLNNNN)');\n }\n\n const prefix = stripped.slice(0, 4);\n const mapped = PLACA_LEGACY_TO_MERCOSUL_MAP[stripped.charAt(4)];\n const suffix = stripped.slice(5);\n return { ok: true, formatted: `${prefix}${mapped}${suffix}` };\n}\n","/**\n * License plate validation — legacy (LLLNNNN) + Mercosul (LLLNLNN). CONTRAN 729/2018.\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n * @see docs/use-cases/UC-004-validate-placa.md — golden vectors ABC1D23, ABC1234\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport type { DocumentFormat, Placa, ValidationResult } from '../../types/validation-result.js';\nimport { brandPlaca } from '../../types/validation-result.js';\nimport { detectPlacaFormat } from './detect.js';\nimport { PLACA_LENGTH } from './constants.js';\n\nexport {\n PLACA_GOLDEN_CONVERSION_FROM,\n PLACA_GOLDEN_CONVERSION_TO,\n PLACA_GOLDEN_LEGACY,\n PLACA_GOLDEN_MERCOSUL,\n PLACA_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { detectPlacaFormat, type PlacaFormat } from './detect.js';\nexport { isValidPlacaLegacy } from './legacy.js';\nexport { isValidPlacaMercosul } from './mercosul.js';\nexport { convertPlacaToMercosul } from './convert.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Placa input is empty');\n }\n\n const withoutSeparators = input.replace(/[-\\s]/g, '');\n if (/[^A-Za-z0-9]/.test(withoutSeparators)) {\n return failure('INVALID_CHARACTER', 'Placa contains invalid characters');\n }\n\n if (stripped.length !== PLACA_LENGTH) {\n return failure('INVALID_LENGTH', `Placa must have ${PLACA_LENGTH} characters after normalization`);\n }\n\n return null;\n}\n\nexport function isValidPlaca(input: string): boolean {\n return validatePlaca(input).ok;\n}\n\nexport function validatePlaca(input: string): ValidationResult<Placa> {\n const stripped = stripPlaca(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n const format = detectPlacaFormat(input);\n if (format === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'Placa does not match legacy or Mercosul format');\n }\n\n return { ok: true, value: brandPlaca(stripped), format: format as DocumentFormat };\n}\n","import { validatePlaca } from '../core/placa/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatPlaca(input: string): FormatResult {\n const result = validatePlaca(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: result.value };\n}\n"]} |
| import { brandInscricaoEstadual } from './chunk-DKRM66US.js'; | ||
| // src/core/inscricao-estadual/constants.ts | ||
| var IE_SUPPORTED_UFS = [ | ||
| "AC", | ||
| "AL", | ||
| "AM", | ||
| "AP", | ||
| "BA", | ||
| "CE", | ||
| "DF", | ||
| "ES", | ||
| "GO", | ||
| "MA", | ||
| "MG", | ||
| "MS", | ||
| "MT", | ||
| "PA", | ||
| "PB", | ||
| "PE", | ||
| "PI", | ||
| "PR", | ||
| "RJ", | ||
| "RN", | ||
| "RO", | ||
| "RR", | ||
| "RS", | ||
| "SC", | ||
| "SE", | ||
| "SP", | ||
| "TO" | ||
| ]; | ||
| var IE_OFFICIAL_SOURCE_URLS = { | ||
| AC: "https://sefaz.ac.gov.br/", | ||
| AL: "https://www.sefaz.al.gov.br/calculo", | ||
| AM: "https://www.sefaz.am.gov.br/", | ||
| AP: "https://www.sefaz.ap.gov.br/", | ||
| BA: "https://www.sefaz.ba.gov.br/inspetoria-eletronica/icms/cadastro/calculo-dv/", | ||
| CE: "https://www.sefaz.ce.gov.br/", | ||
| DF: "https://www.receita.fazenda.df.gov.br/", | ||
| ES: "https://sitenet.es.gov.br/sefaz/", | ||
| GO: "http://www.sefaz.go.gov.br/ServicosAFA/ece.html", | ||
| MA: "https://www.sefaz.ma.gov.br/", | ||
| MG: "https://www.fazenda.mg.gov.br/empresas/Cadastro/cadastro/consultapublica.html", | ||
| MS: "https://www.sefaz.ms.gov.br/", | ||
| MT: "https://app1.sefaz.mt.gov.br/Sistema/legislacao/legislacaotribut.nsf/709f9c981a9d9f468425671300482be0/2217ddcf7a9b7cea03258c6c007324ba?OpenDocument=", | ||
| PA: "https://www.sefa.pa.gov.br/", | ||
| PB: "https://www.receita.pb.gov.br/", | ||
| PE: "https://www.sefaz.pe.gov.br/", | ||
| PI: "https://www.sefaz.pi.gov.br/", | ||
| PR: "https://www.fazenda.pr.gov.br/Pagina/calculo-digito-verificador", | ||
| RJ: "https://portal.fazenda.rj.gov.br/cadastro/", | ||
| RN: "https://www.set.rn.gov.br/", | ||
| RO: "https://www.sefin.ro.gov.br/", | ||
| RR: "https://www.sefaz.rr.gov.br/", | ||
| RS: "https://www.sefaz.rs.gov.br/", | ||
| SC: "https://sat.sef.sc.gov.br/", | ||
| SE: "https://www.sefaz.se.gov.br/", | ||
| SP: "https://portal.fazenda.sp.gov.br/servicos/icms/Paginas/sintegra-rotina-consistencia.aspx", | ||
| TO: "https://www.sefaz.to.gov.br/" | ||
| }; | ||
| var IE_AC_PREFIX = "01"; | ||
| var IE_AL_PREFIX = "24"; | ||
| var IE_AP_PREFIX = "03"; | ||
| var IE_DF_PREFIX = "07"; | ||
| var IE_GO_PREFIXES = ["10", "11", "15", "20"]; | ||
| var IE_MA_PREFIX = "12"; | ||
| var IE_MS_PREFIX = "28"; | ||
| var IE_MT_PREFIX = "13"; | ||
| var IE_PA_PREFIX = "15"; | ||
| var IE_RN_PREFIX = "20"; | ||
| var IE_RR_PREFIX = "24"; | ||
| var IE_TO_LEGACY_PREFIXES = ["01", "02", "03", "99"]; | ||
| var IE_SP_LENGTH = 12; | ||
| var IE_SP_DV1_WEIGHTS = [1, 3, 4, 5, 6, 7, 8, 10]; | ||
| var IE_SP_DV2_WEIGHTS = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var IE_SP_GOLDEN = "110042490114"; | ||
| var IE_SP_GOLDEN_MASKED = "110.042.490.114"; | ||
| var IE_SP_OFFICIAL_SOURCE_URL = IE_OFFICIAL_SOURCE_URLS.SP; | ||
| var IE_MT_CANONICAL_LENGTH = 9; | ||
| var IE_MT_LEGACY_LENGTH = 11; | ||
| var IE_MT_GOLDEN_LEGACY = "00130000019"; | ||
| var IE_MT_GOLDEN_CANONICAL = "130000019"; | ||
| var IE_MT_OFFICIAL_SOURCE_URL = IE_OFFICIAL_SOURCE_URLS.MT; | ||
| var IE_DF_LENGTH = 13; | ||
| var IE_DF_DV1_WEIGHTS = [4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var IE_DF_DV2_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| var IE_DF_GOLDEN = "0730000100109"; | ||
| var IE_DF_GOLDEN_MASKED = "073.00001.001-09"; | ||
| var IE_DF_OFFICIAL_SOURCE_URL = IE_OFFICIAL_SOURCE_URLS.DF; | ||
| // src/core/inscricao-estadual/ie-common.ts | ||
| function stripIeDigits(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function ieFailure(uf, code, message) { | ||
| return { ok: false, code, message, uf }; | ||
| } | ||
| function ieEmptyInput(uf) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Inscri\xE7\xE3o Estadual input is empty", uf }; | ||
| } | ||
| function ieSuccess(stripped, uf) { | ||
| return { | ||
| ok: true, | ||
| value: brandInscricaoEstadual(stripped), | ||
| uf, | ||
| format: "inscricao-estadual" | ||
| }; | ||
| } | ||
| function checkTrimmedEmpty(trimmed, uf) { | ||
| if (trimmed.length === 0) { | ||
| return ieEmptyInput(uf); | ||
| } | ||
| return null; | ||
| } | ||
| function checkDigitChars(trimmed, uf, pattern = /^[0-9.\-\s/]+$/) { | ||
| if (!pattern.test(trimmed)) { | ||
| return ieFailure(uf, "INVALID_CHARACTER", `${uf} Inscri\xE7\xE3o Estadual contains invalid characters`); | ||
| } | ||
| return null; | ||
| } | ||
| // src/core/inscricao-estadual/modulo-ie.ts | ||
| function computeIeSpCheckDigit(digits, weights) { | ||
| let sum = 0; | ||
| for (let i = 0; i < weights.length; i++) { | ||
| sum += Number(digits[i]) * weights[i]; | ||
| } | ||
| const remainder = sum % 11; | ||
| return remainder === 10 ? 0 : remainder % 10; | ||
| } | ||
| function computeIeMtCheckDigit(digits10) { | ||
| let sum = 0; | ||
| const weights = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; | ||
| for (let i = 0; i < 10; i++) { | ||
| sum += Number(digits10[i]) * weights[i]; | ||
| } | ||
| const remainder = sum % 11; | ||
| return remainder <= 1 ? 0 : 11 - remainder; | ||
| } | ||
| function computeIeDfCheckDigit(digits, weights, includeDv1 = false, dv1 = 0) { | ||
| let sum = 0; | ||
| const digitCount = includeDv1 ? 11 : digits.length; | ||
| for (let i = 0; i < digitCount; i++) { | ||
| sum += Number(digits[i]) * weights[i]; | ||
| } | ||
| if (includeDv1) { | ||
| sum += dv1 * weights[11]; | ||
| } | ||
| const remainder = sum % 11; | ||
| return remainder <= 1 ? 0 : 11 - remainder; | ||
| } | ||
| function computeIeCeCheckDigit(body8) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeAlCheckDigit(body8) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| const product = sum * 10; | ||
| let digit = product - Math.floor(product / 11) * 11; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeAmCheckDigit(body8) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| if (sum < 11) { | ||
| return 11 - sum; | ||
| } | ||
| const remainder = sum % 11; | ||
| let digit = 11 - remainder; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIePrStyleCheckDigit(body) { | ||
| let weight = body.length - 5; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = 7; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeAcCheckDigit(body) { | ||
| let weight = body.length - 7; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = 9; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeBaModule(ie) { | ||
| const refIndex = ie.length === 9 ? 1 : 0; | ||
| const refDigit = Number(ie[refIndex]); | ||
| const mod10Digits = [0, 1, 2, 3, 4, 5, 8]; | ||
| return mod10Digits.includes(refDigit) ? 10 : 11; | ||
| } | ||
| function computeIeBaCheckDigit(body, mod) { | ||
| let weight = body.length + 1; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % mod; | ||
| let digit = mod - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIePeCheckDigit(body) { | ||
| let weight = body.length + 1; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeCyclicMod11CheckDigit(body, startWeight, resetWeight) { | ||
| let weight = startWeight; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = resetWeight; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeRoCheckDigit(body) { | ||
| let weight = 6; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = 9; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit -= 10; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeGoCheckDigit(body8) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| const bodyInt = Number(body8); | ||
| if (digit >= 10) { | ||
| if (digit === 11 && bodyInt >= 10103105 && bodyInt <= 10119997) { | ||
| digit = 1; | ||
| } else { | ||
| digit = 0; | ||
| } | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeApCheckDigit(body8) { | ||
| const bodyInt = Number(body8); | ||
| let p = 0; | ||
| let d = 0; | ||
| if (bodyInt >= 3000001 && bodyInt <= 3017e3) { | ||
| p = 5; | ||
| d = 0; | ||
| } else if (bodyInt >= 3017001 && bodyInt <= 3019022) { | ||
| p = 9; | ||
| d = 1; | ||
| } | ||
| let weight = 9; | ||
| let sum = p; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight--; | ||
| } | ||
| let digit = 11 - sum % 11; | ||
| if (digit === 10) { | ||
| digit = 0; | ||
| } else if (digit === 11) { | ||
| digit = d; | ||
| } | ||
| return digit; | ||
| } | ||
| function computeIeRrCheckDigit(body8) { | ||
| let weight = 1; | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * weight; | ||
| weight++; | ||
| } | ||
| return sum % 9; | ||
| } | ||
| function computeIeToCheckDigit(body) { | ||
| let weight = 9; | ||
| let sum = 0; | ||
| for (let i = 0; i < body.length; i++) { | ||
| sum += Number(body[i]) * weight; | ||
| weight--; | ||
| } | ||
| const rest = sum % 11; | ||
| if (rest < 2) { | ||
| return 0; | ||
| } | ||
| return 11 - rest; | ||
| } | ||
| function computeIeMgFirstCheckDigit(body11) { | ||
| const bodyWithZero = `${body11.slice(0, 3)}0${body11.slice(3)}`; | ||
| let weightedSum = ""; | ||
| for (let i = 0; i < bodyWithZero.length; i++) { | ||
| const w = (i + 1) % 2 === 0 ? 2 : 1; | ||
| weightedSum += (Number(bodyWithZero[i]) * w).toString(); | ||
| } | ||
| let sum = 0; | ||
| for (let i = 0; i < weightedSum.length; i++) { | ||
| sum += Number(weightedSum[i]); | ||
| } | ||
| const lastDigit = Number(sum.toString().slice(-1)); | ||
| return lastDigit === 0 ? 0 : 10 - lastDigit; | ||
| } | ||
| function computeIeMgSecondCheckDigit(body12) { | ||
| let weight = 3; | ||
| let sum = 0; | ||
| for (let i = 0; i < body12.length; i++) { | ||
| sum += Number(body12[i]) * weight; | ||
| weight--; | ||
| if (weight === 1) { | ||
| weight = 11; | ||
| } | ||
| } | ||
| const rest = sum % 11; | ||
| let digit = 11 - rest; | ||
| if (digit >= 10) { | ||
| digit = 0; | ||
| } | ||
| return digit; | ||
| } | ||
| // src/core/inscricao-estadual/ac.ts | ||
| var UF = "AC"; | ||
| var LENGTH = 13; | ||
| function stripIeAc(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeAc(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeAc(trimmed); | ||
| if (stripped.length !== LENGTH) { | ||
| return ieFailure(UF, "INVALID_LENGTH", `AC Inscri\xE7\xE3o Estadual must have ${LENGTH} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_AC_PREFIX)) { | ||
| return ieFailure(UF, "UNSUPPORTED_FORMAT", "AC Inscri\xE7\xE3o Estadual must start with prefix 01"); | ||
| } | ||
| const body = stripped.slice(0, 11); | ||
| const firstDig = computeIeAcCheckDigit(body); | ||
| const secondDig = computeIeAcCheckDigit(body + String(firstDig)); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF, "INVALID_CHECK_DIGIT", "AC Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF); | ||
| } | ||
| // src/core/inscricao-estadual/al.ts | ||
| var UF2 = "AL"; | ||
| var LENGTH2 = 9; | ||
| function stripIeAl(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeAl(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF2); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF2); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeAl(trimmed); | ||
| if (stripped.length !== LENGTH2) { | ||
| return ieFailure(UF2, "INVALID_LENGTH", `AL Inscri\xE7\xE3o Estadual must have ${LENGTH2} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_AL_PREFIX)) { | ||
| return ieFailure(UF2, "UNSUPPORTED_FORMAT", "AL Inscri\xE7\xE3o Estadual must start with prefix 24"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeAlCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF2, "INVALID_CHECK_DIGIT", "AL Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF2); | ||
| } | ||
| // src/core/inscricao-estadual/am.ts | ||
| var UF3 = "AM"; | ||
| var LENGTH3 = 9; | ||
| function stripIeAm(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeAm(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF3); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF3); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeAm(trimmed); | ||
| if (stripped.length !== LENGTH3) { | ||
| return ieFailure(UF3, "INVALID_LENGTH", `AM Inscri\xE7\xE3o Estadual must have ${LENGTH3} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeAmCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF3, "INVALID_CHECK_DIGIT", "AM Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF3); | ||
| } | ||
| // src/core/inscricao-estadual/ap.ts | ||
| var UF4 = "AP"; | ||
| var LENGTH4 = 9; | ||
| function stripIeAp(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeAp(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF4); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF4); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeAp(trimmed); | ||
| if (stripped.length !== LENGTH4) { | ||
| return ieFailure(UF4, "INVALID_LENGTH", `AP Inscri\xE7\xE3o Estadual must have ${LENGTH4} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_AP_PREFIX)) { | ||
| return ieFailure(UF4, "UNSUPPORTED_FORMAT", "AP Inscri\xE7\xE3o Estadual must start with prefix 03"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeApCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF4, "INVALID_CHECK_DIGIT", "AP Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF4); | ||
| } | ||
| // src/core/inscricao-estadual/ba.ts | ||
| var UF5 = "BA"; | ||
| function stripIeBa(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeBa(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF5); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF5); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeBa(trimmed); | ||
| if (stripped.length !== 8 && stripped.length !== 9) { | ||
| return ieFailure(UF5, "INVALID_LENGTH", "BA Inscri\xE7\xE3o Estadual must have 8 or 9 digits after normalization"); | ||
| } | ||
| const body = stripped.slice(0, stripped.length - 2); | ||
| const mod = computeIeBaModule(stripped); | ||
| const secondDig = computeIeBaCheckDigit(body, mod); | ||
| const firstDig = computeIeBaCheckDigit(body + String(secondDig), mod); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF5, "INVALID_CHECK_DIGIT", "BA Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF5); | ||
| } | ||
| // src/core/inscricao-estadual/ce.ts | ||
| var UF6 = "CE"; | ||
| var LENGTH5 = 9; | ||
| function stripIeCe(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeCe(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF6); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF6); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeCe(trimmed); | ||
| if (stripped.length !== LENGTH5) { | ||
| return ieFailure(UF6, "INVALID_LENGTH", `CE Inscri\xE7\xE3o Estadual must have ${LENGTH5} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeCeCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF6, "INVALID_CHECK_DIGIT", "CE Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF6); | ||
| } | ||
| // src/core/inscricao-estadual/df.ts | ||
| var DF_MASK_PATTERN = /^[0-9.-]+$/; | ||
| function failure(code, message) { | ||
| return { ok: false, code, message, uf: "DF" }; | ||
| } | ||
| function stripIeDf(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function validateIeDf(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Inscri\xE7\xE3o Estadual input is empty", uf: "DF" }; | ||
| } | ||
| if (!DF_MASK_PATTERN.test(trimmed)) { | ||
| return failure("INVALID_CHARACTER", "DF Inscri\xE7\xE3o Estadual contains invalid characters"); | ||
| } | ||
| const stripped = stripIeDf(trimmed); | ||
| if (stripped.length === 12) { | ||
| return failure("INVALID_LENGTH", "DF Inscri\xE7\xE3o Estadual legacy 12-digit format is not supported; use 13 digits"); | ||
| } | ||
| if (stripped.length !== IE_DF_LENGTH) { | ||
| return failure("INVALID_LENGTH", `DF Inscri\xE7\xE3o Estadual must have ${IE_DF_LENGTH} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_DF_PREFIX)) { | ||
| return failure("UNSUPPORTED_FORMAT", "DF Inscri\xE7\xE3o Estadual must start with prefix 07"); | ||
| } | ||
| const dv1 = computeIeDfCheckDigit(stripped.slice(0, 11), IE_DF_DV1_WEIGHTS); | ||
| const dv2 = computeIeDfCheckDigit(stripped.slice(0, 11), IE_DF_DV2_WEIGHTS, true, dv1); | ||
| if (Number(stripped.charAt(11)) !== dv1 || Number(stripped.charAt(12)) !== dv2) { | ||
| return failure("INVALID_CHECK_DIGIT", "DF Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandInscricaoEstadual(stripped), | ||
| uf: "DF", | ||
| format: "inscricao-estadual" | ||
| }; | ||
| } | ||
| // src/core/inscricao-estadual/es.ts | ||
| var UF7 = "ES"; | ||
| function stripIeEs(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeEs(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF7); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF7); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIeEs(trimmed)); | ||
| if (!ceResult.ok) { | ||
| return { ...ceResult, uf: UF7 }; | ||
| } | ||
| return { ...ceResult, uf: UF7 }; | ||
| } | ||
| // src/core/inscricao-estadual/go.ts | ||
| var UF8 = "GO"; | ||
| var LENGTH6 = 9; | ||
| function stripIeGo(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeGo(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF8); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF8); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeGo(trimmed); | ||
| if (stripped.length !== LENGTH6) { | ||
| return ieFailure(UF8, "INVALID_LENGTH", `GO Inscri\xE7\xE3o Estadual must have ${LENGTH6} digits after normalization`); | ||
| } | ||
| const prefix = stripped.slice(0, 2); | ||
| if (!IE_GO_PREFIXES.includes(prefix)) { | ||
| return ieFailure(UF8, "UNSUPPORTED_FORMAT", "GO Inscri\xE7\xE3o Estadual prefix is not supported"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeGoCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF8, "INVALID_CHECK_DIGIT", "GO Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF8); | ||
| } | ||
| // src/core/inscricao-estadual/ma.ts | ||
| var UF9 = "MA"; | ||
| function stripIeMa(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeMa(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF9); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF9); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeMa(trimmed); | ||
| if (!stripped.startsWith(IE_MA_PREFIX)) { | ||
| return ieFailure(UF9, "UNSUPPORTED_FORMAT", "MA Inscri\xE7\xE3o Estadual must start with prefix 12"); | ||
| } | ||
| const ceResult = validateIeCe(stripped); | ||
| if (!ceResult.ok) { | ||
| return { ...ceResult, uf: UF9 }; | ||
| } | ||
| return { ...ceResult, uf: UF9 }; | ||
| } | ||
| // src/core/inscricao-estadual/mg.ts | ||
| var UF10 = "MG"; | ||
| var LENGTH7 = 13; | ||
| function stripIeMg(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeMg(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF10); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF10); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeMg(trimmed); | ||
| if (stripped.length !== LENGTH7) { | ||
| return ieFailure(UF10, "INVALID_LENGTH", `MG Inscri\xE7\xE3o Estadual must have ${LENGTH7} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 11); | ||
| const firstDig = computeIeMgFirstCheckDigit(body); | ||
| const secondDig = computeIeMgSecondCheckDigit(body + String(firstDig)); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF10, "INVALID_CHECK_DIGIT", "MG Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF10); | ||
| } | ||
| // src/core/inscricao-estadual/ms.ts | ||
| var UF11 = "MS"; | ||
| function stripIeMs(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeMs(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF11); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF11); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeMs(trimmed); | ||
| if (!stripped.startsWith(IE_MS_PREFIX)) { | ||
| return ieFailure(UF11, "UNSUPPORTED_FORMAT", "MS Inscri\xE7\xE3o Estadual must start with prefix 28"); | ||
| } | ||
| const ceResult = validateIeCe(stripped); | ||
| if (!ceResult.ok) { | ||
| return { ...ceResult, uf: UF11 }; | ||
| } | ||
| return { ...ceResult, uf: UF11 }; | ||
| } | ||
| // src/core/inscricao-estadual/mt.ts | ||
| function failure2(code, message) { | ||
| return { ok: false, code, message, uf: "MT" }; | ||
| } | ||
| function stripIeMt(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function normalizeMtToCanonical(padded11) { | ||
| const trimmed = padded11.replace(/^0+/, ""); | ||
| return trimmed.length === IE_MT_CANONICAL_LENGTH ? trimmed : padded11.slice(-IE_MT_CANONICAL_LENGTH); | ||
| } | ||
| function validateIeMt(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Inscri\xE7\xE3o Estadual input is empty", uf: "MT" }; | ||
| } | ||
| if (/[^0-9.\-\s]/.test(trimmed)) { | ||
| return failure2("INVALID_CHARACTER", "MT Inscri\xE7\xE3o Estadual contains invalid characters"); | ||
| } | ||
| const stripped = stripIeMt(trimmed); | ||
| if (stripped.length < IE_MT_CANONICAL_LENGTH || stripped.length > IE_MT_LEGACY_LENGTH) { | ||
| return failure2( | ||
| "INVALID_LENGTH", | ||
| `MT Inscri\xE7\xE3o Estadual must have ${IE_MT_CANONICAL_LENGTH} or ${IE_MT_LEGACY_LENGTH} digits after normalization` | ||
| ); | ||
| } | ||
| const padded = stripped.length === IE_MT_LEGACY_LENGTH ? stripped : stripped.padStart(IE_MT_LEGACY_LENGTH, "0"); | ||
| const canonical = normalizeMtToCanonical(padded); | ||
| if (!canonical.startsWith(IE_MT_PREFIX)) { | ||
| return failure2("UNSUPPORTED_FORMAT", "MT Inscri\xE7\xE3o Estadual must start with prefix 13"); | ||
| } | ||
| const expectedDv = computeIeMtCheckDigit(padded.slice(0, 10)); | ||
| if (Number(padded.charAt(10)) !== expectedDv) { | ||
| return failure2("INVALID_CHECK_DIGIT", "MT Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandInscricaoEstadual(canonical), | ||
| uf: "MT", | ||
| format: "inscricao-estadual" | ||
| }; | ||
| } | ||
| // src/core/inscricao-estadual/mask.ts | ||
| function applyIeSpMask(stripped) { | ||
| if (stripped.length !== IE_SP_LENGTH) { | ||
| throw new Error("SP IE must have exactly 12 digits to apply mask"); | ||
| } | ||
| return `${stripped.slice(0, 3)}.${stripped.slice(3, 6)}.${stripped.slice(6, 9)}.${stripped.slice(9)}`; | ||
| } | ||
| function applyIeDfMask(stripped) { | ||
| if (stripped.length !== IE_DF_LENGTH) { | ||
| throw new Error("DF IE must have exactly 13 digits to apply mask"); | ||
| } | ||
| return `${stripped.slice(0, 3)}.${stripped.slice(3, 8)}.${stripped.slice(8, 11)}-${stripped.slice(11)}`; | ||
| } | ||
| // src/core/inscricao-estadual/pa.ts | ||
| var UF12 = "PA"; | ||
| function stripIePa(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePa(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF12); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF12); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIePa(trimmed); | ||
| if (!stripped.startsWith(IE_PA_PREFIX)) { | ||
| return ieFailure(UF12, "UNSUPPORTED_FORMAT", "PA Inscri\xE7\xE3o Estadual must start with prefix 15"); | ||
| } | ||
| const ceResult = validateIeCe(stripped); | ||
| if (!ceResult.ok) { | ||
| return { ...ceResult, uf: UF12 }; | ||
| } | ||
| return { ...ceResult, uf: UF12 }; | ||
| } | ||
| // src/core/inscricao-estadual/pb.ts | ||
| var UF13 = "PB"; | ||
| function stripIePb(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePb(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF13); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF13); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIePb(trimmed)); | ||
| if (!ceResult.ok) return { ...ceResult, uf: UF13 }; | ||
| return { ...ceResult, uf: UF13 }; | ||
| } | ||
| // src/core/inscricao-estadual/pe.ts | ||
| var UF14 = "PE"; | ||
| var LENGTH8 = 9; | ||
| function stripIePe(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePe(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF14); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF14); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIePe(trimmed); | ||
| if (stripped.length !== LENGTH8) { | ||
| return ieFailure(UF14, "INVALID_LENGTH", `PE Inscri\xE7\xE3o Estadual must have ${LENGTH8} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 7); | ||
| const firstDig = computeIePeCheckDigit(body); | ||
| const secondDig = computeIePeCheckDigit(body + String(firstDig)); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF14, "INVALID_CHECK_DIGIT", "PE Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF14); | ||
| } | ||
| // src/core/inscricao-estadual/pi.ts | ||
| var UF15 = "PI"; | ||
| function stripIePi(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePi(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF15); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF15); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIePi(trimmed)); | ||
| if (!ceResult.ok) return { ...ceResult, uf: UF15 }; | ||
| return { ...ceResult, uf: UF15 }; | ||
| } | ||
| // src/core/inscricao-estadual/pr.ts | ||
| var UF16 = "PR"; | ||
| var LENGTH9 = 10; | ||
| function stripIePr(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIePr(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF16); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF16); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIePr(trimmed); | ||
| if (stripped.length !== LENGTH9) { | ||
| return ieFailure(UF16, "INVALID_LENGTH", `PR Inscri\xE7\xE3o Estadual must have ${LENGTH9} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const firstDig = computeIePrStyleCheckDigit(body); | ||
| const secondDig = computeIePrStyleCheckDigit(body + String(firstDig)); | ||
| const checkDigits = `${firstDig}${secondDig}`; | ||
| if (stripped.slice(-2) !== checkDigits) { | ||
| return ieFailure(UF16, "INVALID_CHECK_DIGIT", "PR Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF16); | ||
| } | ||
| // src/core/inscricao-estadual/rj.ts | ||
| var UF17 = "RJ"; | ||
| var LENGTH10 = 8; | ||
| function stripIeRj(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeRj(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF17); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF17); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRj(trimmed); | ||
| if (stripped.length !== LENGTH10) { | ||
| return ieFailure(UF17, "INVALID_LENGTH", `RJ Inscri\xE7\xE3o Estadual must have ${LENGTH10} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 7); | ||
| const expected = computeIeCyclicMod11CheckDigit(body, 2, 7); | ||
| if (Number(stripped.charAt(7)) !== expected) { | ||
| return ieFailure(UF17, "INVALID_CHECK_DIGIT", "RJ Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF17); | ||
| } | ||
| // src/core/inscricao-estadual/rn.ts | ||
| var UF18 = "RN"; | ||
| var LENGTH11 = 9; | ||
| var RN_WEIGHTS = [9, 8, 7, 6, 5, 4, 3, 2]; | ||
| function stripIeRn(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function computeRnCheckDigit(body8) { | ||
| let sum = 0; | ||
| for (let i = 0; i < 8; i++) { | ||
| sum += Number(body8[i]) * RN_WEIGHTS[i]; | ||
| } | ||
| const mod = sum % 11; | ||
| return mod < 2 ? 0 : 11 - mod; | ||
| } | ||
| function validateIeRn(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF18); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF18); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRn(trimmed); | ||
| if (stripped.length !== LENGTH11) { | ||
| return ieFailure(UF18, "INVALID_LENGTH", `RN Inscri\xE7\xE3o Estadual must have ${LENGTH11} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_RN_PREFIX)) { | ||
| return ieFailure(UF18, "UNSUPPORTED_FORMAT", "RN Inscri\xE7\xE3o Estadual must start with prefix 20"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeRnCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF18, "INVALID_CHECK_DIGIT", "RN Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF18); | ||
| } | ||
| // src/core/inscricao-estadual/ro.ts | ||
| var UF19 = "RO"; | ||
| var LENGTH12 = 14; | ||
| function stripIeRo(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeRo(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF19); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF19); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRo(trimmed); | ||
| if (stripped.length !== LENGTH12) { | ||
| return ieFailure(UF19, "INVALID_LENGTH", `RO Inscri\xE7\xE3o Estadual must have ${LENGTH12} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 13); | ||
| const expected = computeIeRoCheckDigit(body); | ||
| if (Number(stripped.charAt(13)) !== expected) { | ||
| return ieFailure(UF19, "INVALID_CHECK_DIGIT", "RO Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF19); | ||
| } | ||
| // src/core/inscricao-estadual/rr.ts | ||
| var UF20 = "RR"; | ||
| var LENGTH13 = 9; | ||
| function stripIeRr(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeRr(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF20); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF20); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRr(trimmed); | ||
| if (stripped.length !== LENGTH13) { | ||
| return ieFailure(UF20, "INVALID_LENGTH", `RR Inscri\xE7\xE3o Estadual must have ${LENGTH13} digits after normalization`); | ||
| } | ||
| if (!stripped.startsWith(IE_RR_PREFIX)) { | ||
| return ieFailure(UF20, "UNSUPPORTED_FORMAT", "RR Inscri\xE7\xE3o Estadual must start with prefix 24"); | ||
| } | ||
| const body = stripped.slice(0, 8); | ||
| const expected = computeIeRrCheckDigit(body); | ||
| if (Number(stripped.charAt(8)) !== expected) { | ||
| return ieFailure(UF20, "INVALID_CHECK_DIGIT", "RR Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF20); | ||
| } | ||
| // src/core/inscricao-estadual/rs.ts | ||
| var UF21 = "RS"; | ||
| var LENGTH14 = 10; | ||
| function stripIeRs(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeRs(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF21); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF21, /^[0-9.\-\s/]+$/); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeRs(trimmed); | ||
| if (stripped.length !== LENGTH14) { | ||
| return ieFailure(UF21, "INVALID_LENGTH", `RS Inscri\xE7\xE3o Estadual must have ${LENGTH14} digits after normalization`); | ||
| } | ||
| const body = stripped.slice(0, 9); | ||
| const expected = computeIeCyclicMod11CheckDigit(body, 2, 9); | ||
| if (Number(stripped.charAt(9)) !== expected) { | ||
| return ieFailure(UF21, "INVALID_CHECK_DIGIT", "RS Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF21); | ||
| } | ||
| // src/core/inscricao-estadual/sc.ts | ||
| var UF22 = "SC"; | ||
| function stripIeSc(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeSc(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF22); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF22); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIeSc(trimmed)); | ||
| if (!ceResult.ok) return { ...ceResult, uf: UF22 }; | ||
| return { ...ceResult, uf: UF22 }; | ||
| } | ||
| // src/core/inscricao-estadual/se.ts | ||
| var UF23 = "SE"; | ||
| function stripIeSe(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeSe(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF23); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF23); | ||
| if (invalidChar) return invalidChar; | ||
| const ceResult = validateIeCe(stripIeSe(trimmed)); | ||
| if (!ceResult.ok) return { ...ceResult, uf: UF23 }; | ||
| return { ...ceResult, uf: UF23 }; | ||
| } | ||
| // src/core/inscricao-estadual/sp.ts | ||
| var SP_MASK_PATTERN = /^[0-9.]+$/; | ||
| function failure3(code, message) { | ||
| return { ok: false, code, message, uf: "SP" }; | ||
| } | ||
| function stripIeSp(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function validateIeSp(input) { | ||
| const trimmed = input.trim(); | ||
| if (trimmed.length === 0) { | ||
| return { ok: false, code: "EMPTY_INPUT", message: "Inscri\xE7\xE3o Estadual input is empty", uf: "SP" }; | ||
| } | ||
| if (/[Pp]/.test(trimmed)) { | ||
| return failure3("UNSUPPORTED_FORMAT", "SP rural IE format (P\u2026) is not supported in v1"); | ||
| } | ||
| if (!SP_MASK_PATTERN.test(trimmed)) { | ||
| return failure3("INVALID_CHARACTER", "SP Inscri\xE7\xE3o Estadual contains invalid characters"); | ||
| } | ||
| const stripped = stripIeSp(trimmed); | ||
| if (stripped.length !== IE_SP_LENGTH) { | ||
| return failure3("INVALID_LENGTH", `SP Inscri\xE7\xE3o Estadual must have ${IE_SP_LENGTH} digits after normalization`); | ||
| } | ||
| const dv1 = computeIeSpCheckDigit(stripped, IE_SP_DV1_WEIGHTS); | ||
| const dv2 = computeIeSpCheckDigit(stripped, IE_SP_DV2_WEIGHTS); | ||
| if (Number(stripped.charAt(8)) !== dv1 || Number(stripped.charAt(11)) !== dv2) { | ||
| return failure3("INVALID_CHECK_DIGIT", "SP Inscri\xE7\xE3o Estadual check digits are invalid"); | ||
| } | ||
| return { | ||
| ok: true, | ||
| value: brandInscricaoEstadual(stripped), | ||
| uf: "SP", | ||
| format: "inscricao-estadual" | ||
| }; | ||
| } | ||
| // src/core/inscricao-estadual/to.ts | ||
| var UF24 = "TO"; | ||
| function stripIeTo(input) { | ||
| return stripIeDigits(input); | ||
| } | ||
| function validateIeTo(input) { | ||
| const trimmed = input.trim(); | ||
| const empty = checkTrimmedEmpty(trimmed, UF24); | ||
| if (empty) return empty; | ||
| const invalidChar = checkDigitChars(trimmed, UF24); | ||
| if (invalidChar) return invalidChar; | ||
| const stripped = stripIeTo(trimmed); | ||
| if (stripped.length !== 9 && stripped.length !== 11) { | ||
| return ieFailure(UF24, "INVALID_LENGTH", "TO Inscri\xE7\xE3o Estadual must have 9 or 11 digits after normalization"); | ||
| } | ||
| let body; | ||
| if (stripped.length === 11) { | ||
| const midPrefix = stripped.slice(2, 4); | ||
| if (!IE_TO_LEGACY_PREFIXES.includes(midPrefix)) { | ||
| return ieFailure(UF24, "UNSUPPORTED_FORMAT", "TO legacy 11-digit IE middle prefix is not supported"); | ||
| } | ||
| body = stripped.slice(0, 2) + stripped.slice(4, 10); | ||
| } else { | ||
| body = stripped.slice(0, 8); | ||
| } | ||
| const expected = computeIeToCheckDigit(body); | ||
| if (Number(stripped.slice(-1)) !== expected) { | ||
| return ieFailure(UF24, "INVALID_CHECK_DIGIT", "TO Inscri\xE7\xE3o Estadual check digit is invalid"); | ||
| } | ||
| return ieSuccess(stripped, UF24); | ||
| } | ||
| // src/core/inscricao-estadual/index.ts | ||
| var VALIDATORS = { | ||
| AC: validateIeAc, | ||
| AL: validateIeAl, | ||
| AM: validateIeAm, | ||
| AP: validateIeAp, | ||
| BA: validateIeBa, | ||
| CE: validateIeCe, | ||
| DF: validateIeDf, | ||
| ES: validateIeEs, | ||
| GO: validateIeGo, | ||
| MA: validateIeMa, | ||
| MG: validateIeMg, | ||
| MS: validateIeMs, | ||
| MT: validateIeMt, | ||
| PA: validateIePa, | ||
| PB: validateIePb, | ||
| PE: validateIePe, | ||
| PI: validateIePi, | ||
| PR: validateIePr, | ||
| RJ: validateIeRj, | ||
| RN: validateIeRn, | ||
| RO: validateIeRo, | ||
| RR: validateIeRr, | ||
| RS: validateIeRs, | ||
| SC: validateIeSc, | ||
| SE: validateIeSe, | ||
| SP: validateIeSp, | ||
| TO: validateIeTo | ||
| }; | ||
| function failure4(code, message) { | ||
| return { ok: false, code, message }; | ||
| } | ||
| function getIeOfficialSourceUrl(uf) { | ||
| return IE_OFFICIAL_SOURCE_URLS[uf]; | ||
| } | ||
| function isSupportedUf(uf) { | ||
| return uf !== void 0 && IE_SUPPORTED_UFS.includes(uf); | ||
| } | ||
| function stripInscricaoEstadual(input) { | ||
| return input.replace(/\D/g, ""); | ||
| } | ||
| function isValidInscricaoEstadual(input, options) { | ||
| return validateInscricaoEstadual(input, options).ok; | ||
| } | ||
| function validateInscricaoEstadual(input, options) { | ||
| if (!isSupportedUf(options.uf)) { | ||
| return failure4("UNSUPPORTED_FORMAT", `UF ${String(options.uf)} is not supported`); | ||
| } | ||
| return VALIDATORS[options.uf](input); | ||
| } | ||
| function formatInscricaoEstadual(input, options) { | ||
| const result = validateInscricaoEstadual(input, options); | ||
| if (!result.ok) { | ||
| return { ok: false, code: result.code, message: result.message }; | ||
| } | ||
| try { | ||
| if (result.uf === "SP") { | ||
| return { ok: true, formatted: applyIeSpMask(result.value) }; | ||
| } | ||
| if (result.uf === "DF") { | ||
| return { ok: true, formatted: applyIeDfMask(result.value) }; | ||
| } | ||
| return { ok: true, formatted: result.value }; | ||
| } catch (error) { | ||
| const message = error instanceof Error ? error.message : "Failed to format Inscri\xE7\xE3o Estadual"; | ||
| return { ok: false, code: "UNSUPPORTED_FORMAT", message }; | ||
| } | ||
| } | ||
| export { IE_DF_GOLDEN, IE_DF_GOLDEN_MASKED, IE_DF_LENGTH, IE_DF_OFFICIAL_SOURCE_URL, IE_MT_GOLDEN_CANONICAL, IE_MT_GOLDEN_LEGACY, IE_MT_OFFICIAL_SOURCE_URL, IE_OFFICIAL_SOURCE_URLS, IE_SP_GOLDEN, IE_SP_GOLDEN_MASKED, IE_SP_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual }; | ||
| //# sourceMappingURL=chunk-Z4F75QEC.js.map | ||
| //# sourceMappingURL=chunk-Z4F75QEC.js.map |
Sorry, the diff of this file is too big to display
| import { j as PixKeyType, k as PixValidationResult, F as FormatResult } from './validation-result-BK4qJuei.js'; | ||
| declare const PIX_GOLDEN_CPF = "12345678909"; | ||
| declare const PIX_GOLDEN_CNPJ_NUMERIC = "11222333000181"; | ||
| declare const PIX_GOLDEN_CNPJ_ALPHANUMERIC = "12ABC34501DE35"; | ||
| declare const PIX_GOLDEN_EMAIL = "pix@bcb.gov.br"; | ||
| declare const PIX_GOLDEN_PHONE = "+5510998765432"; | ||
| declare const PIX_GOLDEN_EVP = "123e4567-e89b-12d3-a456-426655440000"; | ||
| declare const PIX_OFFICIAL_SOURCE_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf"; | ||
| declare const PIX_DICT_API_SOURCE_URL = "https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html"; | ||
| type DetectedPixKeyType = PixKeyType | 'unknown'; | ||
| declare function detectPixKeyType(input: string): DetectedPixKeyType; | ||
| declare function validatePixCpfKey(input: string): PixValidationResult; | ||
| declare function validatePixCnpjKey(input: string): PixValidationResult; | ||
| declare function validatePixEmailKey(input: string): PixValidationResult; | ||
| declare function validatePixPhoneKey(input: string): PixValidationResult; | ||
| declare function validatePixEvpKey(input: string): PixValidationResult; | ||
| /** | ||
| * PIX key validation — five Bacen types (CPF, CNPJ, email, phone, EVP). | ||
| * @see docs/use-cases/UC-005-validate-pix-key.md | ||
| */ | ||
| type ValidatePixKeyOptions = { | ||
| type?: PixKeyType; | ||
| }; | ||
| declare function isValidPixKey(input: string, options?: ValidatePixKeyOptions): boolean; | ||
| declare function validatePixKey(input: string, options?: ValidatePixKeyOptions): PixValidationResult; | ||
| /** | ||
| * Format decorator — strip → validate → apply official mask (UC-003). | ||
| * @see docs/use-cases/UC-003-format-document.md | ||
| * @see docs/VALIDATION-RULES.md BR-GLOBAL-002 | ||
| */ | ||
| declare function formatPixKey(input: string, options?: ValidatePixKeyOptions): FormatResult; | ||
| export { type DetectedPixKeyType as D, PIX_DICT_API_SOURCE_URL as P, type ValidatePixKeyOptions as V, PIX_GOLDEN_CNPJ_ALPHANUMERIC as a, PIX_GOLDEN_CNPJ_NUMERIC as b, PIX_GOLDEN_CPF as c, PIX_GOLDEN_EMAIL as d, PIX_GOLDEN_EVP as e, PIX_GOLDEN_PHONE as f, PIX_OFFICIAL_SOURCE_URL as g, detectPixKeyType as h, formatPixKey as i, isValidPixKey as j, validatePixCpfKey as k, validatePixEmailKey as l, validatePixEvpKey as m, validatePixKey as n, validatePixPhoneKey as o, validatePixCnpjKey as v }; |
| type DocumentFormat = 'numeric' | 'alphanumeric' | 'legacy' | 'mercosul' | 'email' | 'phone' | 'evp' | 'linha-digitavel' | 'codigo-barras' | 'cartao-credito' | 'inscricao-estadual'; | ||
| type PixKeyType = 'cpf' | 'cnpj' | 'email' | 'phone' | 'evp'; | ||
| type BoletoInputKind = 'linha-digitavel' | 'codigo-barras'; | ||
| type ValidationErrorCode = 'INVALID_LENGTH' | 'INVALID_CHARACTER' | 'INVALID_CHECK_DIGIT' | 'KNOWN_INVALID_PATTERN' | 'UNSUPPORTED_FORMAT' | 'EMPTY_INPUT'; | ||
| type ValidationResult<T extends string = string> = { | ||
| ok: true; | ||
| value: T; | ||
| format: DocumentFormat; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| }; | ||
| type FormatResult = { | ||
| ok: true; | ||
| formatted: string; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| }; | ||
| type Cnpj = string & { | ||
| readonly __brand: 'Cnpj'; | ||
| }; | ||
| type Cpf = string & { | ||
| readonly __brand: 'Cpf'; | ||
| }; | ||
| type Cep = string & { | ||
| readonly __brand: 'Cep'; | ||
| }; | ||
| type Placa = string & { | ||
| readonly __brand: 'Placa'; | ||
| }; | ||
| type PisPasep = string & { | ||
| readonly __brand: 'PisPasep'; | ||
| }; | ||
| type PixKey = string & { | ||
| readonly __brand: 'PixKey'; | ||
| }; | ||
| type LinhaDigitavel = string & { | ||
| readonly __brand: 'LinhaDigitavel'; | ||
| }; | ||
| type CodigoBarras = string & { | ||
| readonly __brand: 'CodigoBarras'; | ||
| }; | ||
| type CartaoCredito = string & { | ||
| readonly __brand: 'CartaoCredito'; | ||
| }; | ||
| type InscricaoEstadual = string & { | ||
| readonly __brand: 'InscricaoEstadual'; | ||
| }; | ||
| type UfCode = 'AC' | 'AL' | 'AM' | 'AP' | 'BA' | 'CE' | 'DF' | 'ES' | 'GO' | 'MA' | 'MG' | 'MS' | 'MT' | 'PA' | 'PB' | 'PE' | 'PI' | 'PR' | 'RJ' | 'RN' | 'RO' | 'RR' | 'RS' | 'SC' | 'SE' | 'SP' | 'TO'; | ||
| type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown'; | ||
| type CartaoCreditoValidationResult = { | ||
| ok: true; | ||
| value: CartaoCredito; | ||
| format: 'cartao-credito'; | ||
| brand: CardBrand; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| brand?: CardBrand; | ||
| }; | ||
| type PixValidationResult = { | ||
| ok: true; | ||
| value: PixKey; | ||
| keyType: PixKeyType; | ||
| format: DocumentFormat; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| keyType?: PixKeyType; | ||
| }; | ||
| type BoletoSituacao = '1' | '2'; | ||
| type BoletoValidationResult = { | ||
| ok: true; | ||
| value: LinhaDigitavel | CodigoBarras; | ||
| inputKind: BoletoInputKind; | ||
| format: DocumentFormat; | ||
| situacao: BoletoSituacao; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| inputKind?: BoletoInputKind; | ||
| }; | ||
| type InscricaoEstadualValidationResult = { | ||
| ok: true; | ||
| value: InscricaoEstadual; | ||
| uf: UfCode; | ||
| format: 'inscricao-estadual'; | ||
| } | { | ||
| ok: false; | ||
| code: ValidationErrorCode; | ||
| message: string; | ||
| uf?: UfCode; | ||
| }; | ||
| export type { BoletoInputKind as B, CartaoCredito as C, DocumentFormat as D, FormatResult as F, InscricaoEstadual as I, LinhaDigitavel as L, PisPasep as P, UfCode as U, ValidationErrorCode as V, BoletoSituacao as a, BoletoValidationResult as b, CartaoCreditoValidationResult as c, Cep as d, Cnpj as e, CodigoBarras as f, Cpf as g, InscricaoEstadualValidationResult as h, PixKey as i, PixKeyType as j, PixValidationResult as k, Placa as l, ValidationResult as m }; |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
419714
17.16%79
17.91%3751
19.31%1
Infinity%