🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@br-validators/core

Package Overview
Dependencies
Maintainers
1
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@br-validators/core - npm Package Compare versions

Comparing version
0.11.0-alpha.0
to
0.12.0-alpha.0
+3
dist/chunk-2CNYSY3Z.js
//# sourceMappingURL=chunk-2CNYSY3Z.js.map
//# sourceMappingURL=chunk-2CNYSY3Z.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-2CNYSY3Z.js"}
import { stripCep } from './chunk-YYHS5WQN.js';
import { brandCep } from './chunk-MSLJF2FM.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" };
}
export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_MASK_PATTERN, CEP_OFFICIAL_SOURCE_URL, isValidCep, validateCep };
//# sourceMappingURL=chunk-2JJS46FM.js.map
//# sourceMappingURL=chunk-2JJS46FM.js.map
{"version":3,"sources":["../src/core/cep/constants.ts","../src/core/cep/index.ts"],"names":[],"mappings":";;;;AAKO,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,gBAAA,GAAmB;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","file":"chunk-2JJS46FM.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 { IE_DF_LENGTH, IE_DF_PREFIX, computeIeDfCheckDigit, IE_DF_DV1_WEIGHTS, IE_DF_DV2_WEIGHTS, IE_MT_CANONICAL_LENGTH, IE_MT_LEGACY_LENGTH, IE_MT_PREFIX, computeIeMtCheckDigit, IE_SP_LENGTH, computeIeSpCheckDigit, IE_SP_DV1_WEIGHTS, IE_SP_DV2_WEIGHTS, IE_OFFICIAL_SOURCE_URLS, applyIeSpMask, applyIeDfMask, IE_SUPPORTED_UFS, IE_TO_LEGACY_PREFIXES, computeIeToCheckDigit, computeIeCyclicMod11CheckDigit, IE_RR_PREFIX, computeIeRrCheckDigit, computeIeRoCheckDigit, IE_RN_PREFIX, computeIePrStyleCheckDigit, computeIePeCheckDigit, IE_PA_PREFIX, IE_MS_PREFIX, computeIeMgFirstCheckDigit, computeIeMgSecondCheckDigit, IE_MA_PREFIX, IE_GO_PREFIXES, computeIeGoCheckDigit, computeIeCeCheckDigit, computeIeBaModule, computeIeBaCheckDigit, IE_AP_PREFIX, computeIeApCheckDigit, computeIeAmCheckDigit, IE_AL_PREFIX, computeIeAlCheckDigit, IE_AC_PREFIX, computeIeAcCheckDigit } from './chunk-Y6IW2LMW.js';
import { brandInscricaoEstadual } from './chunk-MSLJF2FM.js';
// 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/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/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) requires validateIeProdutorRural");
}
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/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/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/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/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/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 { formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual };
//# sourceMappingURL=chunk-3QP6R46N.js.map
//# sourceMappingURL=chunk-3QP6R46N.js.map

Sorry, the diff of this file is too big to display

// src/strip/nfe-chave.ts
function stripNfeChave(input) {
return input.replace(/\D/g, "");
}
export { stripNfeChave };
//# sourceMappingURL=chunk-4SNBZFS5.js.map
//# sourceMappingURL=chunk-4SNBZFS5.js.map
{"version":3,"sources":["../src/strip/nfe-chave.ts"],"names":[],"mappings":";AAIO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC","file":"chunk-4SNBZFS5.js","sourcesContent":["/**\n * Strip NF-e chave de acesso — digits only (BR-NFE-CHAVE-002).\n * @see http://moc.sped.fazenda.pr.gov.br/ — §2.2.6 chave de acesso\n */\nexport function stripNfeChave(input: string): string {\n return input.replace(/\\D/g, '');\n}\n"]}
import { brandCodigoBarras, brandLinhaDigitavel } from './chunk-MSLJF2FM.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
};
}
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, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento };
//# sourceMappingURL=chunk-4W4OKLSZ.js.map
//# sourceMappingURL=chunk-4W4OKLSZ.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"],"names":["LINHA_MASK_PATTERN","failure"],"mappings":"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","file":"chunk-4W4OKLSZ.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"]}
import { validateNfeChave, NFE_CHAVE_NUMERIC_PATTERN } from './chunk-D36RM7OD.js';
// src/core/nfe-chave/mask.ts
function applyNfeChaveMask(canonical) {
if (!NFE_CHAVE_NUMERIC_PATTERN.test(canonical)) {
throw new Error("NF-e chave must have exactly 44 digits to apply mask");
}
const groups = [];
for (let i = 0; i < canonical.length; i += 4) {
groups.push(canonical.slice(i, i + 4));
}
return groups.join(" ");
}
// src/format/nfe-chave.ts
function formatNfeChave(input) {
const result = validateNfeChave(input);
if (!result.ok) {
return { ok: false, code: result.code, message: result.message };
}
return { ok: true, formatted: applyNfeChaveMask(result.value) };
}
export { formatNfeChave };
//# sourceMappingURL=chunk-4Y2FBO57.js.map
//# sourceMappingURL=chunk-4Y2FBO57.js.map
{"version":3,"sources":["../src/core/nfe-chave/mask.ts","../src/format/nfe-chave.ts"],"names":[],"mappings":";;;AAMO,SAAS,kBAAkB,SAAA,EAA2B;AAC3D,EAAA,IAAI,CAAC,yBAAA,CAA0B,IAAA,CAAK,SAAS,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC5C,IAAA,MAAA,CAAO,KAAK,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACxB;;;ACZO,SAAS,eAAe,KAAA,EAA6B;AAC1D,EAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,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,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,EAAE;AAChE","file":"chunk-4Y2FBO57.js","sourcesContent":["import { NFE_CHAVE_NUMERIC_PATTERN } from './constants.js';\n\n/**\n * Display mask — 11 groups of 4 digits (BR-NFE-CHAVE-006).\n * @see http://moc.sped.fazenda.pr.gov.br/ — chave de acesso layout\n */\nexport function applyNfeChaveMask(canonical: string): string {\n if (!NFE_CHAVE_NUMERIC_PATTERN.test(canonical)) {\n throw new Error('NF-e chave must have exactly 44 digits to apply mask');\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","import { applyNfeChaveMask } from '../core/nfe-chave/mask.js';\nimport { validateNfeChave } from '../core/nfe-chave/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatNfeChave(input: string): FormatResult {\n const result = validateNfeChave(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyNfeChaveMask(result.value) };\n}\n"]}
import { brandTelefone } from './chunk-MSLJF2FM.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"
};
}
export { ANATEL_DDDS, ANATEL_DDD_SET, TELEFONE_ANATEL_DDD_PANEL_URL, TELEFONE_CELULAR_MASK_PATTERN, TELEFONE_FIXO_MASK_PATTERN, TELEFONE_GOLDEN_CELULAR, TELEFONE_GOLDEN_CELULAR_MASKED, TELEFONE_GOLDEN_FIXO, TELEFONE_GOLDEN_FIXO_MASKED, TELEFONE_OFFICIAL_SOURCE_URL, extractTelefoneDigits, isValidTelefone, normalizeTelefoneDigits, stripTelefone, validateTelefone };
//# sourceMappingURL=chunk-5UL3M7IU.js.map
//# sourceMappingURL=chunk-5UL3M7IU.js.map
{"version":3,"sources":["../src/core/telefone/constants.ts","../src/strip/telefone.ts","../src/core/telefone/index.ts"],"names":[],"mappings":"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","file":"chunk-5UL3M7IU.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 { validateCnh, CNH_NUMERIC_PATTERN, CNH_LENGTH } from './chunk-US4OLTJ2.js';
// src/core/cnh/mask.ts
function applyCnhCanonicalFormat(canonical) {
if (!CNH_NUMERIC_PATTERN.test(canonical)) {
throw new Error(`CNH must have exactly ${CNH_LENGTH} digits to format`);
}
return canonical;
}
// src/format/cnh.ts
function formatCnh(input) {
const result = validateCnh(input);
if (!result.ok) {
return { ok: false, code: result.code, message: result.message };
}
return { ok: true, formatted: applyCnhCanonicalFormat(result.value) };
}
export { formatCnh };
//# sourceMappingURL=chunk-6QJFMOIX.js.map
//# sourceMappingURL=chunk-6QJFMOIX.js.map
{"version":3,"sources":["../src/core/cnh/mask.ts","../src/format/cnh.ts"],"names":[],"mappings":";;;AAQO,SAAS,wBAAwB,SAAA,EAA2B;AACjE,EAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,UAAU,CAAA,iBAAA,CAAmB,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,SAAA;AACT;;;ACTO,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,uBAAA,CAAwB,MAAA,CAAO,KAAK,CAAA,EAAE;AACtE","file":"chunk-6QJFMOIX.js","sourcesContent":["import { CNH_LENGTH, CNH_NUMERIC_PATTERN } from './constants.js';\n\n/**\n * Official system format — 11 contiguous digits (BR-CNH-005).\n * Unlike CPF, CONTRAN/SENATRAN systems do not use dot/dash decoration.\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf\n * @see https://www.gov.br/pt-br/servicos/validar-cnh\n */\nexport function applyCnhCanonicalFormat(canonical: string): string {\n if (!CNH_NUMERIC_PATTERN.test(canonical)) {\n throw new Error(`CNH must have exactly ${CNH_LENGTH} digits to format`);\n }\n return canonical;\n}\n","import { applyCnhCanonicalFormat } from '../core/cnh/mask.js';\nimport { validateCnh } from '../core/cnh/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCnh(input: string): FormatResult {\n const result = validateCnh(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCnhCanonicalFormat(result.value) };\n}\n"]}
import { validateRenavam } from './chunk-WLE2ENQA.js';
import { validateTituloEleitor } from './chunk-MLPXW7N2.js';
import { validateTelefone, extractTelefoneDigits, normalizeTelefoneDigits } from './chunk-5UL3M7IU.js';
import { validateInscricaoEstadual } from './chunk-3QP6R46N.js';
import { validateIeSpRural, stripIeSpRural } from './chunk-Y6IW2LMW.js';
import { validateNfeChave } from './chunk-D36RM7OD.js';
import { validatePisPasep } from './chunk-KH7DWOUA.js';
import { validatePlaca } from './chunk-WPL47PWJ.js';
import { validateBoleto } from './chunk-4W4OKLSZ.js';
import { validateCartaoCredito } from './chunk-EPKHEW5V.js';
import { validateCep } from './chunk-2JJS46FM.js';
import { validateCnh } from './chunk-US4OLTJ2.js';
import { stripPlaca } from './chunk-YYHS5WQN.js';
import { validateCnpj } from './chunk-YXELVV37.js';
import { validateCpf } from './chunk-F6PTZY4O.js';
// src/sanitize/fixes.ts
function trimFix(raw) {
const trimmed = raw.trim();
const fixes = [];
if (trimmed !== raw) {
fixes.push("trimmed");
}
return { value: trimmed, fixes };
}
function digitsFix(value, fixes) {
const digits = value.replace(/\D/g, "");
if (digits !== value) {
fixes.push("removed_non_digits");
}
return { value: digits, fixes };
}
function upperAndStripSeparators(value, fixes) {
const upper = value.toUpperCase();
if (upper !== value) {
fixes.push("uppercased");
}
const stripped = upper.replace(/[^A-Z0-9]/g, "");
if (stripped !== upper) {
fixes.push("removed_separators");
}
return { value: stripped, fixes };
}
function placaFix(value, fixes) {
const upper = value.toUpperCase();
if (upper !== value) {
fixes.push("uppercased");
}
if (/[-.\s/]/.test(value)) {
fixes.push("removed_separators");
}
return { value: stripPlaca(upper), fixes };
}
function telefoneFix(value, fixes) {
if (/[\s()-]/.test(value)) {
fixes.push("removed_mask_chars");
}
const digitsOnly = extractTelefoneDigits(value);
const normalized = normalizeTelefoneDigits(value);
if (normalized !== digitsOnly && normalized.length > 0) {
fixes.push("normalized_national");
}
return { value: normalized, fixes };
}
function ieProdutorRuralFix(value, fixes) {
const upper = value.toUpperCase();
if (upper !== value) {
fixes.push("uppercased");
}
if (/^[Pp]/.test(upper)) {
fixes.push("preserved_p_prefix");
}
return { value: stripIeSpRural(upper), fixes };
}
function applyFixes(raw, type) {
const { value: trimmed, fixes } = trimFix(raw);
switch (type) {
case "cpf":
case "cep":
case "pis-pasep":
case "cnh":
case "renavam":
case "nfe-chave":
case "cartao-credito":
case "boleto":
case "titulo-eleitor":
case "inscricao-estadual":
return digitsFix(trimmed, fixes);
case "cnpj":
return upperAndStripSeparators(trimmed, fixes);
case "placa":
return placaFix(trimmed, fixes);
case "telefone":
return telefoneFix(trimmed, fixes);
case "inscricao-estadual-produtor-rural":
return ieProdutorRuralFix(trimmed, fixes);
default: {
const _exhaustive = type;
return { value: _exhaustive, fixes };
}
}
}
// src/sanitize/index.ts
function sanitize(raw, type, options = {}) {
const { value: fixed, fixes } = applyFixes(raw, type);
if (type === "inscricao-estadual" && !options.uf) {
return {
ok: false,
code: "UNSUPPORTED_FORMAT",
message: "UF is required for inscricao-estadual sanitization"
};
}
const validation = validateFixed(fixed, type, options.uf);
if (!validation.ok) {
return { ok: false, code: validation.code, message: validation.message };
}
return { ok: true, value: validation.value, fixes };
}
function validateFixed(value, type, uf) {
switch (type) {
case "cpf": {
const result = validateCpf(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "cnpj": {
const result = validateCnpj(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "cep": {
const result = validateCep(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "placa": {
const result = validatePlaca(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "pis-pasep": {
const result = validatePisPasep(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "telefone": {
const result = validateTelefone(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "cnh": {
const result = validateCnh(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "renavam": {
const result = validateRenavam(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "titulo-eleitor": {
const result = validateTituloEleitor(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "nfe-chave": {
const result = validateNfeChave(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "boleto": {
const result = validateBoleto(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "cartao-credito": {
const result = validateCartaoCredito(value);
return result.ok ? { ok: true, value: result.value } : result;
}
case "inscricao-estadual": {
const result = validateInscricaoEstadual(value, { uf });
return result.ok ? { ok: true, value: result.value } : result;
}
case "inscricao-estadual-produtor-rural": {
const result = validateIeSpRural(value);
return result.ok ? { ok: true, value: result.value } : result;
}
default: {
const _exhaustive = type;
return { ok: false, code: "UNSUPPORTED_FORMAT", message: `Unsupported type: ${String(_exhaustive)}` };
}
}
}
export { sanitize };
//# sourceMappingURL=chunk-7ZL7PZII.js.map
//# sourceMappingURL=chunk-7ZL7PZII.js.map
{"version":3,"sources":["../src/sanitize/fixes.ts","../src/sanitize/index.ts"],"names":[],"mappings":"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","file":"chunk-7ZL7PZII.js","sourcesContent":["import { stripCep } from '../strip/cep.js';\nimport { stripCnh } from '../strip/cnh.js';\nimport { stripCnpj } from '../strip/cnpj.js';\nimport { stripCpf } from '../strip/cpf.js';\nimport { stripIeSpRural } from '../strip/inscricao-estadual-produtor-rural.js';\nimport { stripInscricaoEstadual } from '../core/inscricao-estadual/index.js';\nimport { stripNfeChave } from '../strip/nfe-chave.js';\nimport { stripPisPasep } from '../strip/pis-pasep.js';\nimport { stripPlaca } from '../strip/placa.js';\nimport { stripRenavam } from '../strip/renavam.js';\nimport { stripTituloEleitor } from '../strip/titulo-eleitor.js';\nimport { extractTelefoneDigits, normalizeTelefoneDigits } from '../strip/telefone.js';\n\nexport type SanitizableDocumentType =\n | 'cpf'\n | 'cnpj'\n | 'cep'\n | 'placa'\n | 'pis-pasep'\n | 'telefone'\n | 'cnh'\n | 'renavam'\n | 'titulo-eleitor'\n | 'nfe-chave'\n | 'boleto'\n | 'cartao-credito'\n | 'inscricao-estadual'\n | 'inscricao-estadual-produtor-rural';\n\nexport type FixResult = {\n value: string;\n fixes: string[];\n};\n\nfunction trimFix(raw: string): FixResult {\n const trimmed = raw.trim();\n const fixes: string[] = [];\n if (trimmed !== raw) {\n fixes.push('trimmed');\n }\n return { value: trimmed, fixes };\n}\n\nfunction digitsFix(value: string, fixes: string[]): FixResult {\n const digits = value.replace(/\\D/g, '');\n if (digits !== value) {\n fixes.push('removed_non_digits');\n }\n return { value: digits, fixes };\n}\n\nfunction upperAndStripSeparators(value: string, fixes: string[]): FixResult {\n const upper = value.toUpperCase();\n if (upper !== value) {\n fixes.push('uppercased');\n }\n const stripped = upper.replace(/[^A-Z0-9]/g, '');\n if (stripped !== upper) {\n fixes.push('removed_separators');\n }\n return { value: stripped, fixes };\n}\n\nfunction placaFix(value: string, fixes: string[]): FixResult {\n const upper = value.toUpperCase();\n if (upper !== value) {\n fixes.push('uppercased');\n }\n if (/[-.\\s/]/.test(value)) {\n fixes.push('removed_separators');\n }\n return { value: stripPlaca(upper), fixes };\n}\n\nfunction telefoneFix(value: string, fixes: string[]): FixResult {\n if (/[\\s()-]/.test(value)) {\n fixes.push('removed_mask_chars');\n }\n const digitsOnly = extractTelefoneDigits(value);\n const normalized = normalizeTelefoneDigits(value);\n if (normalized !== digitsOnly && normalized.length > 0) {\n fixes.push('normalized_national');\n }\n return { value: normalized, fixes };\n}\n\nfunction ieProdutorRuralFix(value: string, fixes: string[]): FixResult {\n const upper = value.toUpperCase();\n if (upper !== value) {\n fixes.push('uppercased');\n }\n if (/^[Pp]/.test(upper)) {\n fixes.push('preserved_p_prefix');\n }\n return { value: stripIeSpRural(upper), fixes };\n}\n\nexport function applyFixes(raw: string, type: SanitizableDocumentType): FixResult {\n const { value: trimmed, fixes } = trimFix(raw);\n\n switch (type) {\n case 'cpf':\n case 'cep':\n case 'pis-pasep':\n case 'cnh':\n case 'renavam':\n case 'nfe-chave':\n case 'cartao-credito':\n case 'boleto':\n case 'titulo-eleitor':\n case 'inscricao-estadual':\n return digitsFix(trimmed, fixes);\n case 'cnpj':\n return upperAndStripSeparators(trimmed, fixes);\n case 'placa':\n return placaFix(trimmed, fixes);\n case 'telefone':\n return telefoneFix(trimmed, fixes);\n case 'inscricao-estadual-produtor-rural':\n return ieProdutorRuralFix(trimmed, fixes);\n default: {\n const _exhaustive: never = type;\n return { value: _exhaustive, fixes };\n }\n }\n}\n\n/** Validates canonical strip output matches fix pipeline (used in tests). */\nexport function stripForType(value: string, type: SanitizableDocumentType): string {\n switch (type) {\n case 'cpf':\n return stripCpf(value);\n case 'cnpj':\n return stripCnpj(value);\n case 'cep':\n return stripCep(value);\n case 'placa':\n return stripPlaca(value);\n case 'pis-pasep':\n return stripPisPasep(value);\n case 'telefone':\n return normalizeTelefoneDigits(value);\n case 'cnh':\n return stripCnh(value);\n case 'renavam':\n return stripRenavam(value);\n case 'titulo-eleitor':\n return stripTituloEleitor(value);\n case 'nfe-chave':\n return stripNfeChave(value);\n case 'boleto':\n return value.replace(/\\D/g, '');\n case 'cartao-credito':\n return value.replace(/\\D/g, '');\n case 'inscricao-estadual':\n return stripInscricaoEstadual(value);\n case 'inscricao-estadual-produtor-rural':\n return stripIeSpRural(value);\n default: {\n const _exhaustive: never = type;\n return _exhaustive;\n }\n }\n}\n","/**\n * ETL-style document sanitization — applies fixes then validates (BR-SANITIZE-001).\n * @see docs/VALIDATION-RULES.md\n */\nimport { validateBoleto } from '../core/boleto/index.js';\nimport { validateCartaoCredito } from '../core/cartao-credito/index.js';\nimport { validateCep } from '../core/cep/index.js';\nimport { validateCnh } from '../core/cnh/index.js';\nimport { validateCnpj } from '../core/cnpj/index.js';\nimport { validateCpf } from '../core/cpf/index.js';\nimport { validateInscricaoEstadual } from '../core/inscricao-estadual/index.js';\nimport { validateIeSpRural } from '../core/inscricao-estadual/sp-rural.js';\nimport { validateNfeChave } from '../core/nfe-chave/index.js';\nimport { validatePisPasep } from '../core/pis-pasep/index.js';\nimport { validatePlaca } from '../core/placa/index.js';\nimport { validateRenavam } from '../core/renavam/index.js';\nimport { validateTelefone } from '../core/telefone/index.js';\nimport { validateTituloEleitor } from '../core/titulo-eleitor/index.js';\nimport type { UfCode, ValidationErrorCode } from '../types/validation-result.js';\nimport { applyFixes } from './fixes.js';\n\nexport type SanitizableDocumentType =\n | 'cpf'\n | 'cnpj'\n | 'cep'\n | 'placa'\n | 'pis-pasep'\n | 'telefone'\n | 'cnh'\n | 'renavam'\n | 'titulo-eleitor'\n | 'nfe-chave'\n | 'boleto'\n | 'cartao-credito'\n | 'inscricao-estadual'\n | 'inscricao-estadual-produtor-rural';\n\nexport type SanitizeOptions = {\n uf?: UfCode;\n};\n\nexport type SanitizeSuccess = {\n ok: true;\n value: string;\n fixes: string[];\n};\n\nexport type SanitizeFailure = {\n ok: false;\n code: ValidationErrorCode;\n message: string;\n};\n\nexport type SanitizeResult = SanitizeSuccess | SanitizeFailure;\n\nexport type { FixResult } from './fixes.js';\n\ntype ValidateFixedResult =\n | { ok: true; value: string }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport function sanitize(\n raw: string,\n type: SanitizableDocumentType,\n options: SanitizeOptions = {},\n): SanitizeResult {\n const { value: fixed, fixes } = applyFixes(raw, type);\n\n if (type === 'inscricao-estadual' && !options.uf) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'UF is required for inscricao-estadual sanitization',\n };\n }\n\n const validation = validateFixed(fixed, type, options.uf);\n if (!validation.ok) {\n return { ok: false, code: validation.code, message: validation.message };\n }\n\n return { ok: true, value: validation.value, fixes };\n}\n\nfunction validateFixed(value: string, type: SanitizableDocumentType, uf?: UfCode): ValidateFixedResult {\n switch (type) {\n case 'cpf': {\n const result = validateCpf(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'cnpj': {\n const result = validateCnpj(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'cep': {\n const result = validateCep(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'placa': {\n const result = validatePlaca(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'pis-pasep': {\n const result = validatePisPasep(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'telefone': {\n const result = validateTelefone(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'cnh': {\n const result = validateCnh(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'renavam': {\n const result = validateRenavam(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'titulo-eleitor': {\n const result = validateTituloEleitor(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'nfe-chave': {\n const result = validateNfeChave(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'boleto': {\n const result = validateBoleto(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'cartao-credito': {\n const result = validateCartaoCredito(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'inscricao-estadual': {\n const result = validateInscricaoEstadual(value, { uf: uf as UfCode });\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'inscricao-estadual-produtor-rural': {\n const result = validateIeSpRural(value);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n default: {\n const _exhaustive: never = type;\n return { ok: false, code: 'UNSUPPORTED_FORMAT', message: `Unsupported type: ${String(_exhaustive)}` };\n }\n }\n}\n"]}
import { validateIeSpRural, applyIeSpRuralMask } from './chunk-Y6IW2LMW.js';
// src/format/inscricao-estadual-produtor-rural.ts
function formatIeProdutorRural(input) {
const result = validateIeSpRural(input);
if (!result.ok) {
return { ok: false, code: result.code, message: result.message };
}
return { ok: true, formatted: applyIeSpRuralMask(result.value) };
}
export { formatIeProdutorRural };
//# sourceMappingURL=chunk-BFZPCEYB.js.map
//# sourceMappingURL=chunk-BFZPCEYB.js.map
{"version":3,"sources":["../src/format/inscricao-estadual-produtor-rural.ts"],"names":[],"mappings":";;;AAIO,SAAS,sBAAsB,KAAA,EAA6B;AACjE,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,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,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA,EAAE;AACjE","file":"chunk-BFZPCEYB.js","sourcesContent":["import { applyIeSpRuralMask } from '../core/inscricao-estadual/mask.js';\nimport { validateIeSpRural } from '../core/inscricao-estadual/sp-rural.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatIeProdutorRural(input: string): FormatResult {\n const result = validateIeSpRural(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyIeSpRuralMask(result.value) };\n}\n"]}
import { validateRenavam, RENAVAM_NUMERIC_PATTERN, RENAVAM_LENGTH } from './chunk-WLE2ENQA.js';
// src/core/renavam/mask.ts
function applyRenavamCanonicalFormat(canonical) {
if (!RENAVAM_NUMERIC_PATTERN.test(canonical)) {
throw new Error(`RENAVAM must have exactly ${RENAVAM_LENGTH} digits to format`);
}
return canonical;
}
// src/format/renavam.ts
function formatRenavam(input) {
const result = validateRenavam(input);
if (!result.ok) {
return { ok: false, code: result.code, message: result.message };
}
return { ok: true, formatted: applyRenavamCanonicalFormat(result.value) };
}
export { formatRenavam };
//# sourceMappingURL=chunk-CDGRHI7W.js.map
//# sourceMappingURL=chunk-CDGRHI7W.js.map
{"version":3,"sources":["../src/core/renavam/mask.ts","../src/format/renavam.ts"],"names":[],"mappings":";;;AAMO,SAAS,4BAA4B,SAAA,EAA2B;AACrE,EAAA,IAAI,CAAC,uBAAA,CAAwB,IAAA,CAAK,SAAS,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,cAAc,CAAA,iBAAA,CAAmB,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,SAAA;AACT;;;ACPO,SAAS,cAAc,KAAA,EAA6B;AACzD,EAAA,MAAM,MAAA,GAAS,gBAAgB,KAAK,CAAA;AACpC,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,2BAAA,CAA4B,MAAA,CAAO,KAAK,CAAA,EAAE;AAC1E","file":"chunk-CDGRHI7W.js","sourcesContent":["import { RENAVAM_LENGTH, RENAVAM_NUMERIC_PATTERN } from './constants.js';\n\n/**\n * Official system format — 11 contiguous digits (BR-RENAVAM-005).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n */\nexport function applyRenavamCanonicalFormat(canonical: string): string {\n if (!RENAVAM_NUMERIC_PATTERN.test(canonical)) {\n throw new Error(`RENAVAM must have exactly ${RENAVAM_LENGTH} digits to format`);\n }\n return canonical;\n}\n","import { applyRenavamCanonicalFormat } from '../core/renavam/mask.js';\nimport { validateRenavam } from '../core/renavam/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatRenavam(input: string): FormatResult {\n const result = validateRenavam(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyRenavamCanonicalFormat(result.value) };\n}\n"]}
//# sourceMappingURL=chunk-CQPM43VV.js.map
//# sourceMappingURL=chunk-CQPM43VV.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-CQPM43VV.js"}
import { stripNfeChave } from './chunk-4SNBZFS5.js';
import { brandNfeChave } from './chunk-MSLJF2FM.js';
// src/core/nfe-chave/constants.ts
var NFE_CHAVE_OFFICIAL_SOURCE_URL = "https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=ndIjl+iEFdE%3D";
var NFE_CHAVE_MOC_ONLINE_URL = "http://moc.sped.fazenda.pr.gov.br/";
var NFE_CHAVE_MOC_DV_SECTION_URL = "http://moc.sped.fazenda.pr.gov.br/#2.2.6.2. C\xE1lculo do D\xEDgito Verificador da Chave de Acesso da NF-e";
var NFE_CHAVE_MOC_PDF_URL = "https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf";
var NFE_CHAVE_DFE_PORTAL_URL = "https://dfe-portal.svrs.rs.gov.br/NFe/Documentos";
var NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL = "http://moc.sped.fazenda.pr.gov.br/DanfeQrCodeNFCe.html";
var NFE_CHAVE_LENGTH = 44;
var NFE_CHAVE_BASE_LENGTH = 43;
var NFE_CHAVE_MOD = 11;
var NFE_CHAVE_WEIGHT_CYCLE = [2, 3, 4, 5, 6, 7, 8, 9];
var NFE_CHAVE_NUMERIC_PATTERN = /^\d{44}$/;
var NFE_CHAVE_GOLDEN_PRIMARY = "52060433009911002506550120000007800267301615";
var NFE_CHAVE_GOLDEN_SECONDARY = "41180678393592000146558900000006041028190697";
var NFE_CHAVE_NFCE_QR_ILLUSTRATIVE = "28170800156225000131650110000151341562040824";
var NFE_MODELO_NFE = "55";
var NFE_MODELO_NFCE = "65";
var NFE_MODELOS = [NFE_MODELO_NFE, NFE_MODELO_NFCE];
var NFE_IBGE_UF_CODES = /* @__PURE__ */ new Set([
11,
12,
13,
14,
15,
16,
17,
21,
22,
23,
24,
25,
26,
27,
28,
29,
31,
32,
33,
35,
41,
42,
43,
50,
51,
52,
53
]);
var NFE_IBGE_UF_BY_CODE = {
11: "RO",
12: "AC",
13: "AM",
14: "RR",
15: "PA",
16: "AP",
17: "TO",
21: "MA",
22: "PI",
23: "CE",
24: "RN",
25: "PB",
26: "PE",
27: "AL",
28: "SE",
29: "BA",
31: "MG",
32: "ES",
33: "RJ",
35: "SP",
41: "PR",
42: "SC",
43: "RS",
50: "MS",
51: "MT",
52: "GO",
53: "DF"
};
// src/core/nfe-chave/dv.ts
function computeNfeChaveWeightedSum(base43) {
let multiplier = 2;
let sum = 0;
for (let i = base43.length - 1; i >= 0; i--) {
sum += Number(base43[i]) * multiplier;
multiplier = multiplier >= 9 ? 2 : multiplier + 1;
}
return sum;
}
function resolveNfeChaveCheckDigit(weightedSum) {
const remainder = weightedSum % 11;
return remainder < 2 ? 0 : 11 - remainder;
}
function computeNfeChaveCheckDigit(base43) {
if (base43.length !== NFE_CHAVE_BASE_LENGTH) {
throw new Error(`NF-e chave base must have exactly ${NFE_CHAVE_BASE_LENGTH} digits`);
}
return resolveNfeChaveCheckDigit(computeNfeChaveWeightedSum(base43));
}
function isValidNfeChaveCheckDigit(stripped) {
const base = stripped.slice(0, NFE_CHAVE_BASE_LENGTH);
const expected = String(computeNfeChaveCheckDigit(base));
return stripped[NFE_CHAVE_BASE_LENGTH] === expected;
}
// src/core/nfe-chave/parse.ts
function parseNfeChaveParts(stripped) {
if (stripped.length !== NFE_CHAVE_LENGTH) {
return null;
}
return {
cUF: stripped.slice(0, 2),
aamm: stripped.slice(2, 6),
cnpj: stripped.slice(6, 20),
mod: stripped.slice(20, 22),
serie: stripped.slice(22, 25),
nNF: stripped.slice(25, 34),
tpEmis: stripped.slice(34, 35),
cNF: stripped.slice(35, 43),
cDV: stripped.slice(43, 44)
};
}
// src/core/nfe-chave/index.ts
function failure(code, message) {
return { ok: false, code, message };
}
function isKnownModel(mod) {
return NFE_MODELOS.includes(mod);
}
function resolveUf(cuf) {
return NFE_IBGE_UF_BY_CODE[Number(cuf)];
}
function validateStructure(input, stripped) {
if (stripped.length === 0) {
return { ok: false, error: failure("EMPTY_INPUT", "NF-e chave de acesso input is empty") };
}
const withoutMask = input.replace(/[\s.]/g, "");
if (/[^0-9]/.test(withoutMask)) {
return { ok: false, error: failure("INVALID_CHARACTER", "NF-e chave de acesso contains invalid characters") };
}
if (stripped.length !== NFE_CHAVE_LENGTH) {
return {
ok: false,
error: failure(
"INVALID_LENGTH",
`NF-e chave de acesso must have ${NFE_CHAVE_LENGTH} digits after normalization`
)
};
}
const parts = parseNfeChaveParts(stripped);
const cufCode = Number(parts.cUF);
if (!NFE_IBGE_UF_CODES.has(cufCode)) {
return {
ok: false,
error: failure(
"KNOWN_INVALID_PATTERN",
`NF-e chave cUF ${parts.cUF} is not a valid IBGE UF code`
)
};
}
if (!isKnownModel(parts.mod)) {
return {
ok: false,
error: failure(
"KNOWN_INVALID_PATTERN",
`NF-e chave modelo ${parts.mod} is not 55 (NF-e) or 65 (NFC-e)`
)
};
}
return { ok: true, parts };
}
function buildSuccess(stripped, parts) {
const uf = resolveUf(parts.cUF);
const success = {
ok: true,
value: brandNfeChave(stripped),
format: "numeric",
parsed: parts
};
if (uf !== void 0) {
success.uf = uf;
}
return success;
}
function isValidNfeChave(input) {
return validateNfeChave(input).ok;
}
function parseNfeChave(input) {
const stripped = stripNfeChave(input);
const structure = validateStructure(input, stripped);
if (!structure.ok) {
return structure.error;
}
if (!isValidNfeChaveCheckDigit(stripped)) {
return failure("INVALID_CHECK_DIGIT", "NF-e chave de acesso check digit is invalid");
}
return buildSuccess(stripped, structure.parts);
}
function validateNfeChave(input) {
return parseNfeChave(input);
}
export { NFE_CHAVE_BASE_LENGTH, NFE_CHAVE_DFE_PORTAL_URL, NFE_CHAVE_GOLDEN_PRIMARY, NFE_CHAVE_GOLDEN_SECONDARY, NFE_CHAVE_LENGTH, NFE_CHAVE_MOC_DV_SECTION_URL, NFE_CHAVE_MOC_ONLINE_URL, NFE_CHAVE_MOC_PDF_URL, NFE_CHAVE_MOD, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL, NFE_CHAVE_NUMERIC_PATTERN, NFE_CHAVE_OFFICIAL_SOURCE_URL, NFE_CHAVE_WEIGHT_CYCLE, NFE_IBGE_UF_BY_CODE, NFE_IBGE_UF_CODES, NFE_MODELOS, NFE_MODELO_NFCE, NFE_MODELO_NFE, computeNfeChaveCheckDigit, computeNfeChaveWeightedSum, isValidNfeChave, isValidNfeChaveCheckDigit, parseNfeChave, parseNfeChaveParts, resolveNfeChaveCheckDigit, validateNfeChave };
//# sourceMappingURL=chunk-D36RM7OD.js.map
//# sourceMappingURL=chunk-D36RM7OD.js.map
{"version":3,"sources":["../src/core/nfe-chave/constants.ts","../src/core/nfe-chave/dv.ts","../src/core/nfe-chave/parse.ts","../src/core/nfe-chave/index.ts"],"names":[],"mappings":"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","file":"chunk-D36RM7OD.js","sourcesContent":["/**\n * NF-e / NFC-e chave de acesso — 44 digits (ENCAT / SEFAZ MOC).\n * @see https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=ndIjl+iEFdE%3D — MOC 7.0 index\n * @see http://moc.sped.fazenda.pr.gov.br/ — MOC online (SEFAZ-PR mirror), §2.2.6\n * @see https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf — MOC 7.0 §2.2.6.1–2.2.6.2\n */\nimport type { UfCode } from '../../types/validation-result.js';\n\nexport const NFE_CHAVE_OFFICIAL_SOURCE_URL =\n 'https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=ndIjl+iEFdE%3D';\n\nexport const NFE_CHAVE_MOC_ONLINE_URL = 'http://moc.sped.fazenda.pr.gov.br/';\n\nexport const NFE_CHAVE_MOC_DV_SECTION_URL =\n 'http://moc.sped.fazenda.pr.gov.br/#2.2.6.2. Cálculo do Dígito Verificador da Chave de Acesso da NF-e';\n\nexport const NFE_CHAVE_MOC_PDF_URL =\n 'https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf';\n\nexport const NFE_CHAVE_DFE_PORTAL_URL = 'https://dfe-portal.svrs.rs.gov.br/NFe/Documentos';\n\n/** MOC DANFE NFC-e QR Code page — illustrative chave (DV inconsistent with §2.2.6.2). */\nexport const NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL =\n 'http://moc.sped.fazenda.pr.gov.br/DanfeQrCodeNFCe.html';\n\nexport const NFE_CHAVE_LENGTH = 44;\nexport const NFE_CHAVE_BASE_LENGTH = 43;\nexport const NFE_CHAVE_MOD = 11;\nexport const NFE_CHAVE_WEIGHT_CYCLE = [2, 3, 4, 5, 6, 7, 8, 9] as const;\nexport const NFE_CHAVE_NUMERIC_PATTERN = /^\\d{44}$/;\n\n/**\n * Golden primary — MOC §2.2.6.2 worked example (sum=644, remainder=6, DV=5).\n * Base 43 digits from MOC table; DV appended per modulo-11 rule.\n */\nexport const NFE_CHAVE_GOLDEN_PRIMARY = '52060433009911002506550120000007800267301615';\n\n/** Secondary valid vector from MOC online examples. */\nexport const NFE_CHAVE_GOLDEN_SECONDARY = '41180678393592000146558900000006041028190697';\n\n/** MOC NFC-e QR page illustrative chave — fails DV under §2.2.6.2 (not used as valid golden). */\nexport const NFE_CHAVE_NFCE_QR_ILLUSTRATIVE = '28170800156225000131650110000151341562040824';\n\nexport const NFE_MODELO_NFE = '55';\nexport const NFE_MODELO_NFCE = '65';\nexport const NFE_MODELOS = [NFE_MODELO_NFE, NFE_MODELO_NFCE] as const;\n\n/** IBGE UF codes valid in cUF (positions 1–2). */\nexport const NFE_IBGE_UF_CODES = new Set<number>([\n 11, 12, 13, 14, 15, 16, 17,\n 21, 22, 23, 24, 25, 26, 27, 28, 29,\n 31, 32, 33, 35,\n 41, 42, 43,\n 50, 51, 52, 53,\n]);\n\n/** IBGE cUF → Brazilian UF sigla. */\nexport const NFE_IBGE_UF_BY_CODE: Readonly<Record<number, UfCode>> = {\n 11: 'RO',\n 12: 'AC',\n 13: 'AM',\n 14: 'RR',\n 15: 'PA',\n 16: 'AP',\n 17: 'TO',\n 21: 'MA',\n 22: 'PI',\n 23: 'CE',\n 24: 'RN',\n 25: 'PB',\n 26: 'PE',\n 27: 'AL',\n 28: 'SE',\n 29: 'BA',\n 31: 'MG',\n 32: 'ES',\n 33: 'RJ',\n 35: 'SP',\n 41: 'PR',\n 42: 'SC',\n 43: 'RS',\n 50: 'MS',\n 51: 'MT',\n 52: 'GO',\n 53: 'DF',\n};\n","/**\n * NF-e chave de acesso DV — modulo 11, weights 2..9 right-to-left (MOC §2.2.6.2).\n * @see http://moc.sped.fazenda.pr.gov.br/#2.2.6.2. Cálculo do Dígito Verificador da Chave de Acesso da NF-e\n */\nimport { NFE_CHAVE_BASE_LENGTH } from './constants.js';\n\nexport function computeNfeChaveWeightedSum(base43: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = base43.length - 1; i >= 0; i--) {\n sum += Number(base43[i]) * multiplier;\n multiplier = multiplier >= 9 ? 2 : multiplier + 1;\n }\n\n return sum;\n}\n\nexport function resolveNfeChaveCheckDigit(weightedSum: number): number {\n const remainder = weightedSum % 11;\n return remainder < 2 ? 0 : 11 - remainder;\n}\n\n/** Compute DV for the first 43 digits of a chave de acesso. */\nexport function computeNfeChaveCheckDigit(base43: string): number {\n if (base43.length !== NFE_CHAVE_BASE_LENGTH) {\n throw new Error(`NF-e chave base must have exactly ${NFE_CHAVE_BASE_LENGTH} digits`);\n }\n return resolveNfeChaveCheckDigit(computeNfeChaveWeightedSum(base43));\n}\n\nexport function isValidNfeChaveCheckDigit(stripped: string): boolean {\n const base = stripped.slice(0, NFE_CHAVE_BASE_LENGTH);\n const expected = String(computeNfeChaveCheckDigit(base));\n return stripped[NFE_CHAVE_BASE_LENGTH] === expected;\n}\n","import { NFE_CHAVE_LENGTH } from './constants.js';\n\nexport type NfeChaveParts = {\n cUF: string;\n aamm: string;\n cnpj: string;\n mod: string;\n serie: string;\n nNF: string;\n tpEmis: string;\n cNF: string;\n cDV: string;\n};\n\nexport function parseNfeChaveParts(stripped: string): NfeChaveParts | null {\n if (stripped.length !== NFE_CHAVE_LENGTH) {\n return null;\n }\n\n return {\n cUF: stripped.slice(0, 2),\n aamm: stripped.slice(2, 6),\n cnpj: stripped.slice(6, 20),\n mod: stripped.slice(20, 22),\n serie: stripped.slice(22, 25),\n nNF: stripped.slice(25, 34),\n tpEmis: stripped.slice(34, 35),\n cNF: stripped.slice(35, 43),\n cDV: stripped.slice(43, 44),\n };\n}\n","/**\n * NF-e / NFC-e chave de acesso validation — 44 digits, modulo-11 DV (MOC §2.2.6).\n * @see http://moc.sped.fazenda.pr.gov.br/#2.2.6.2. Cálculo do Dígito Verificador da Chave de Acesso da NF-e\n */\nimport { stripNfeChave } from '../../strip/nfe-chave.js';\nimport type { NfeChaveValidationResult, UfCode } from '../../types/validation-result.js';\nimport { brandNfeChave } from '../../types/validation-result.js';\nimport {\n NFE_CHAVE_LENGTH,\n NFE_IBGE_UF_BY_CODE,\n NFE_IBGE_UF_CODES,\n NFE_MODELOS,\n} from './constants.js';\nimport { isValidNfeChaveCheckDigit } from './dv.js';\nimport { parseNfeChaveParts, type NfeChaveParts } from './parse.js';\n\nexport {\n NFE_CHAVE_BASE_LENGTH,\n NFE_CHAVE_DFE_PORTAL_URL,\n NFE_CHAVE_GOLDEN_PRIMARY,\n NFE_CHAVE_GOLDEN_SECONDARY,\n NFE_CHAVE_LENGTH,\n NFE_CHAVE_MOD,\n NFE_CHAVE_MOC_DV_SECTION_URL,\n NFE_CHAVE_MOC_ONLINE_URL,\n NFE_CHAVE_MOC_PDF_URL,\n NFE_CHAVE_NFCE_QR_ILLUSTRATIVE,\n NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL,\n NFE_CHAVE_NUMERIC_PATTERN,\n NFE_CHAVE_OFFICIAL_SOURCE_URL,\n NFE_CHAVE_WEIGHT_CYCLE,\n NFE_IBGE_UF_BY_CODE,\n NFE_IBGE_UF_CODES,\n NFE_MODELO_NFCE,\n NFE_MODELO_NFE,\n NFE_MODELOS,\n} from './constants.js';\nexport {\n computeNfeChaveCheckDigit,\n computeNfeChaveWeightedSum,\n isValidNfeChaveCheckDigit,\n resolveNfeChaveCheckDigit,\n} from './dv.js';\nexport { parseNfeChaveParts, type NfeChaveParts } from './parse.js';\n\ntype FailedResult = Extract<NfeChaveValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction isKnownModel(mod: string): boolean {\n return (NFE_MODELOS as readonly string[]).includes(mod);\n}\n\nfunction resolveUf(cuf: string): UfCode | undefined {\n return NFE_IBGE_UF_BY_CODE[Number(cuf)];\n}\n\ntype StructureResult =\n | { ok: false; error: FailedResult }\n | { ok: true; parts: NfeChaveParts };\n\nfunction validateStructure(input: string, stripped: string): StructureResult {\n if (stripped.length === 0) {\n return { ok: false, error: failure('EMPTY_INPUT', 'NF-e chave de acesso input is empty') };\n }\n\n const withoutMask = input.replace(/[\\s.]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return { ok: false, error: failure('INVALID_CHARACTER', 'NF-e chave de acesso contains invalid characters') };\n }\n\n if (stripped.length !== NFE_CHAVE_LENGTH) {\n return {\n ok: false,\n error: failure(\n 'INVALID_LENGTH',\n `NF-e chave de acesso must have ${NFE_CHAVE_LENGTH} digits after normalization`,\n ),\n };\n }\n\n const parts = parseNfeChaveParts(stripped)!;\n const cufCode = Number(parts.cUF);\n if (!NFE_IBGE_UF_CODES.has(cufCode)) {\n return {\n ok: false,\n error: failure(\n 'KNOWN_INVALID_PATTERN',\n `NF-e chave cUF ${parts.cUF} is not a valid IBGE UF code`,\n ),\n };\n }\n\n if (!isKnownModel(parts.mod)) {\n return {\n ok: false,\n error: failure(\n 'KNOWN_INVALID_PATTERN',\n `NF-e chave modelo ${parts.mod} is not 55 (NF-e) or 65 (NFC-e)`,\n ),\n };\n }\n\n return { ok: true, parts };\n}\n\nfunction buildSuccess(stripped: string, parts: NfeChaveParts): Extract<NfeChaveValidationResult, { ok: true }> {\n const uf = resolveUf(parts.cUF);\n const success: Extract<NfeChaveValidationResult, { ok: true }> = {\n ok: true,\n value: brandNfeChave(stripped),\n format: 'numeric',\n parsed: parts,\n };\n if (uf !== undefined) {\n success.uf = uf;\n }\n return success;\n}\n\nexport function isValidNfeChave(input: string): boolean {\n return validateNfeChave(input).ok;\n}\n\nexport function parseNfeChave(input: string): NfeChaveValidationResult {\n const stripped = stripNfeChave(input);\n const structure = validateStructure(input, stripped);\n if (!structure.ok) {\n return structure.error;\n }\n\n if (!isValidNfeChaveCheckDigit(stripped)) {\n return failure('INVALID_CHECK_DIGIT', 'NF-e chave de acesso check digit is invalid');\n }\n\n return buildSuccess(stripped, structure.parts);\n}\n\nexport function validateNfeChave(input: string): NfeChaveValidationResult {\n return parseNfeChave(input);\n}\n"]}
import { brandCartaoCredito } from './chunk-MSLJF2FM.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
};
}
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, applyCartaoCreditoMask, computeLuhnSum, detectCardBrand, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito };
//# sourceMappingURL=chunk-EPKHEW5V.js.map
//# sourceMappingURL=chunk-EPKHEW5V.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"],"names":[],"mappings":"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","file":"chunk-EPKHEW5V.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 { stripCpf } from './chunk-UCJPSJN5.js';
import { computeCheckDigit } from './chunk-OTZHMJYE.js';
import { brandCpf } from './chunk-MSLJF2FM.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");
}
export { CPF_BASE_LENGTH, CPF_DV1_WEIGHTS, CPF_DV2_WEIGHTS, CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_MASK_PATTERN, CPF_OFFICIAL_SOURCE_URL, isValidCpf, validateCpf };
//# sourceMappingURL=chunk-F6PTZY4O.js.map
//# sourceMappingURL=chunk-F6PTZY4O.js.map
{"version":3,"sources":["../src/core/cpf/constants.ts","../src/core/cpf/index.ts"],"names":[],"mappings":";;;;;AAKO,IAAM,eAAA,GAAkB,CAAC,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC;AACnD,IAAM,eAAA,GAAkB,CAAC,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC;AACvD,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,eAAA,GAAkB;AAExB,IAAM,gBAAA,GAAmB;AAEzB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,yBAAA,GAA4B;AAClC,IAAM,uBAAA,GACX;;;ACSF,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEA,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;AAEA,SAAS,mBAAmB,QAAA,EAA2B;AACrD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA;AAC9C,EAAA,MAAM,cAAc,MAAA,CAAO,iBAAA,CAAkB,IAAA,EAAM,eAAA,EAAiB,UAAU,CAAC,CAAA;AAC/E,EAAA,MAAM,WAAA,GAAc,MAAA;AAAA,IAClB,iBAAA,CAAkB,IAAA,GAAO,WAAA,EAAa,eAAA,EAAiB,UAAU;AAAA,GACnE;AAEA,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,eAAe,CAAA,KAAM,WAAA,GAAc,WAAA;AAC3D;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,OAAA,EAAS,EAAE,CAAA;AAC7C,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,IAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAC/B,IAAA,OAAO,OAAA,CAAQ,yBAAyB,0CAA0C,CAAA;AAAA,EACpF;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,IAAI,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAChC,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,SAAS,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAAA,EAClE;AAEA,EAAA,OAAO,OAAA,CAAQ,uBAAuB,8BAA8B,CAAA;AACtE","file":"chunk-F6PTZY4O.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 { detectBoletoInputKind, validateLinhaDigitavel, applyLinhaDigitavelMask } from './chunk-4W4OKLSZ.js';
// 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 { formatBoleto };
//# sourceMappingURL=chunk-FXLVNCG3.js.map
//# sourceMappingURL=chunk-FXLVNCG3.js.map
{"version":3,"sources":["../src/format/boleto.ts"],"names":[],"mappings":";;;AAUO,SAAS,aAAa,KAAA,EAA6B;AACxD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,aAAA,EAAe,SAAS,uBAAA,EAAwB;AAAA,EAC5E;AAEA,EAAA,MAAM,IAAA,GAAO,sBAAsB,OAAO,CAAA;AAC1C,EAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,IAAA,EAAM,oBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,uBAAuB,OAAO,CAAA;AAC7C,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,EAAA,EAAI,IAAA,EAAM,WAAW,uBAAA,CAAwB,MAAA,CAAO,KAAK,CAAA,EAAE;AACtE","file":"chunk-FXLVNCG3.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 { 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"]}
//# sourceMappingURL=chunk-G24G7WR5.js.map
//# sourceMappingURL=chunk-G24G7WR5.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-G24G7WR5.js"}
import { validateTelefone, TELEFONE_CELULAR_MASK_PATTERN, TELEFONE_FIXO_MASK_PATTERN } from './chunk-5UL3M7IU.js';
// 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 { formatTelefone };
//# sourceMappingURL=chunk-G2Y63PIF.js.map
//# sourceMappingURL=chunk-G2Y63PIF.js.map
{"version":3,"sources":["../src/core/telefone/mask.ts","../src/format/telefone.ts"],"names":[],"mappings":";;;AAOO,SAAS,iBAAA,CAAkB,WAAmB,IAAA,EAA4B;AAC/E,EAAA,MAAM,OAAA,GAAU,IAAA,KAAS,SAAA,GAAY,6BAAA,GAAgC,0BAAA;AACrE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AACpC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAI,CAAA,qBAAA,CAAuB,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC9C;;;ACVO,SAAS,eAAe,KAAA,EAA6B;AAC1D,EAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,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,IAAI,IAAA,EAAM,SAAA,EAAW,kBAAkB,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA,EAAE;AAC7E","file":"chunk-G2Y63PIF.js","sourcesContent":["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 { validatePlaca } from './chunk-WPL47PWJ.js';
// 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 { formatPlaca };
//# sourceMappingURL=chunk-G32U6YQ5.js.map
//# sourceMappingURL=chunk-G32U6YQ5.js.map
{"version":3,"sources":["../src/format/placa.ts"],"names":[],"mappings":";;;AAGO,SAAS,YAAY,KAAA,EAA6B;AACvD,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,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,SAAA,EAAW,OAAO,KAAA,EAAM;AAC7C","file":"chunk-G32U6YQ5.js","sourcesContent":["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 { validatePixKey, applyPixEvpKeyMask, applyPixEmailKeyMask, applyPixPhoneKeyMask, applyPixCnpjKeyMask, applyPixCpfKeyMask } from './chunk-MK7OJUF5.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-GRDUTHNX.js.map
//# sourceMappingURL=chunk-GRDUTHNX.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-GRDUTHNX.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"]}
//# sourceMappingURL=chunk-GVK6IMBF.js.map
//# sourceMappingURL=chunk-GVK6IMBF.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-GVK6IMBF.js"}
import { validatePisPasep, PIS_PASEP_MASK_PATTERN } from './chunk-KH7DWOUA.js';
// 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 { formatPisPasep };
//# sourceMappingURL=chunk-IQGRFAQV.js.map
//# sourceMappingURL=chunk-IQGRFAQV.js.map
{"version":3,"sources":["../src/core/pis-pasep/mask.ts","../src/format/pis-pasep.ts"],"names":[],"mappings":";;;AAGO,SAAS,kBAAkB,SAAA,EAA2B;AAC3D,EAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,IAAA,CAAK,SAAS,CAAA;AACnD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,IAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACxD;;;ACLO,SAAS,eAAe,KAAA,EAA6B;AAC1D,EAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,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,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,EAAE;AAChE","file":"chunk-IQGRFAQV.js","sourcesContent":["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"]}
//# sourceMappingURL=chunk-JQABTHUJ.js.map
//# sourceMappingURL=chunk-JQABTHUJ.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-JQABTHUJ.js"}
import { computeCheckDigit } from './chunk-OTZHMJYE.js';
import { brandPisPasep } from './chunk-MSLJF2FM.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");
}
export { PIS_PASEP_BASE_LENGTH, PIS_PASEP_DV_WEIGHTS, PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_MASK_PATTERN, PIS_PASEP_OFFICIAL_SOURCE_URL, isValidPisPasep, stripPisPasep, validatePisPasep };
//# sourceMappingURL=chunk-KH7DWOUA.js.map
//# sourceMappingURL=chunk-KH7DWOUA.js.map
{"version":3,"sources":["../src/strip/pis-pasep.ts","../src/core/pis-pasep/constants.ts","../src/core/pis-pasep/index.ts"],"names":[],"mappings":"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","file":"chunk-KH7DWOUA.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 { CPF_MASK_PATTERN } from './chunk-F6PTZY4O.js';
// 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 { applyCpfMask };
//# sourceMappingURL=chunk-KQDLIGSG.js.map
//# sourceMappingURL=chunk-KQDLIGSG.js.map
{"version":3,"sources":["../src/core/cpf/mask.ts"],"names":[],"mappings":";;;AAGO,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,+CAA+C,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,IAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACxD","file":"chunk-KQDLIGSG.js","sourcesContent":["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"]}
//# sourceMappingURL=chunk-LF2B4VPE.js.map
//# sourceMappingURL=chunk-LF2B4VPE.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-LF2B4VPE.js"}
import { formatRenavam } from './chunk-CDGRHI7W.js';
import { computeRenavamCheckDigit, RENAVAM_BASE_LENGTH } from './chunk-WLE2ENQA.js';
import { formatTelefone } from './chunk-G2Y63PIF.js';
import { formatPisPasep } from './chunk-IQGRFAQV.js';
import { formatPlaca } from './chunk-G32U6YQ5.js';
import { formatCartaoCredito } from './chunk-XKY2CV3G.js';
import { formatCep } from './chunk-ZAUZRIOU.js';
import { formatCnh } from './chunk-6QJFMOIX.js';
import { formatCnpj } from './chunk-LYBFUKHR.js';
import { formatCpf } from './chunk-NHLLC6WH.js';
import { ANATEL_DDDS, validateTelefone } from './chunk-5UL3M7IU.js';
import { PIS_PASEP_DV_WEIGHTS, PIS_PASEP_BASE_LENGTH } from './chunk-KH7DWOUA.js';
import { PLACA_LEGACY_PATTERN, PLACA_MERCOSUL_PATTERN, validatePlaca } from './chunk-WPL47PWJ.js';
import { validateCartaoCredito } from './chunk-EPKHEW5V.js';
import { validateCep } from './chunk-2JJS46FM.js';
import { computeCnhCheckDigits, CNH_BASE_LENGTH } from './chunk-US4OLTJ2.js';
import { CNPJ_DV1_WEIGHTS, cnpjCharValue, CNPJ_DV2_WEIGHTS, CNPJ_BASE_LENGTH } from './chunk-YXELVV37.js';
import { CPF_DV1_WEIGHTS, CPF_DV2_WEIGHTS, CPF_BASE_LENGTH } from './chunk-F6PTZY4O.js';
import { computeCheckDigit } from './chunk-OTZHMJYE.js';
// src/generate/apply-mask.ts
function applyMask(type, value) {
switch (type) {
case "cpf": {
const result = formatCpf(value);
return result.ok ? result.formatted : value;
}
case "cnpj": {
const result = formatCnpj(value);
return result.ok ? result.formatted : value;
}
case "cep": {
const result = formatCep(value);
return result.ok ? result.formatted : value;
}
case "placa": {
const result = formatPlaca(value);
return result.ok ? result.formatted : value;
}
case "pis-pasep": {
const result = formatPisPasep(value);
return result.ok ? result.formatted : value;
}
case "renavam": {
const result = formatRenavam(value);
return result.ok ? result.formatted : value;
}
case "cnh": {
const result = formatCnh(value);
return result.ok ? result.formatted : value;
}
case "telefone": {
const result = formatTelefone(value);
return result.ok ? result.formatted : value;
}
case "cartao-credito": {
const result = formatCartaoCredito(value);
return result.ok ? result.formatted : value;
}
default: {
const _exhaustive = type;
return _exhaustive;
}
}
}
// src/generate/random.ts
function mulberry32(seed) {
let state = seed >>> 0;
return () => {
state = state + 1831565813 >>> 0;
let t = state;
t = Math.imul(t ^ t >>> 15, t | 1);
t ^= t + Math.imul(t ^ t >>> 7, t | 61);
return ((t ^ t >>> 14) >>> 0) / 4294967296;
};
}
function createRandomSource(seed) {
const nextFn = seed === void 0 ? () => Math.random() : mulberry32(seed);
return {
next: nextFn,
int(min, max) {
return Math.floor(nextFn() * (max - min + 1)) + min;
},
digit() {
return String(Math.floor(nextFn() * 10));
},
digits(count) {
let out = "";
for (let i = 0; i < count; i++) {
out += this.digit();
}
return out;
},
letter() {
const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return letters.charAt(this.int(0, letters.length - 1));
},
pick(items) {
return items[this.int(0, items.length - 1)];
}
};
}
function hasRepeatedChars(value) {
const first = value[0];
for (let i = 1; i < value.length; i++) {
if (value[i] !== first) {
return false;
}
}
return true;
}
function computeLuhnCheckDigit(partial) {
let sum = 0;
let double = true;
for (let i = partial.length - 1; i >= 0; i--) {
let digit = Number(partial.charAt(i));
if (double) {
digit *= 2;
if (digit > 9) {
digit -= 9;
}
}
sum += digit;
double = !double;
}
return String((10 - sum % 10) % 10);
}
// src/generate/index.ts
var CNPJ_ALNUM_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var MAX_ATTEMPTS = 50;
function digitValue(char) {
return Number(char);
}
function randomBaseDigits(rng, length) {
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
const base = rng.digits(length);
if (!hasRepeatedChars(base)) {
return base;
}
}
return "123456789".slice(0, length).padEnd(length, "1");
}
function randomCnpjAlphanumericBase(rng) {
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
let base = "";
for (let i = 0; i < CNPJ_BASE_LENGTH; i++) {
base += CNPJ_ALNUM_CHARS.charAt(rng.int(0, CNPJ_ALNUM_CHARS.length - 1));
}
if (!hasRepeatedChars(base)) {
return base;
}
}
return "12ABC34501DE";
}
function generateCpfValue(rng) {
const base = randomBaseDigits(rng, CPF_BASE_LENGTH);
const dv1 = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue));
const dv2 = String(computeCheckDigit(base + dv1, CPF_DV2_WEIGHTS, digitValue));
return base + dv1 + dv2;
}
function generateCnpjValue(rng, format) {
if (format === "alphanumeric") {
const base2 = randomCnpjAlphanumericBase(rng);
const dv12 = String(computeCheckDigit(base2, CNPJ_DV1_WEIGHTS, cnpjCharValue));
const dv22 = String(computeCheckDigit(base2 + dv12, CNPJ_DV2_WEIGHTS, cnpjCharValue));
return base2 + dv12 + dv22;
}
const base = randomBaseDigits(rng, CNPJ_BASE_LENGTH);
const dv1 = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, digitValue));
const dv2 = String(computeCheckDigit(base + dv1, CNPJ_DV2_WEIGHTS, digitValue));
return base + dv1 + dv2;
}
function generateCepValue(rng) {
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
const value = rng.digits(8);
if (value !== "00000000" && validateCep(value).ok) {
return value;
}
}
return "01310100";
}
function generatePlacaValue(rng, format) {
const mode = format === "legacy" ? "legacy" : "mercosul";
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
const letters = rng.letter() + rng.letter() + rng.letter();
let candidate;
if (mode === "legacy") {
candidate = letters + rng.digits(4);
if (!PLACA_LEGACY_PATTERN.test(candidate)) {
continue;
}
} else {
candidate = letters + rng.digit() + rng.pick(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]) + rng.digits(2);
if (!PLACA_MERCOSUL_PATTERN.test(candidate)) {
continue;
}
}
if (validatePlaca(candidate).ok) {
return candidate;
}
}
return mode === "legacy" ? "ABC1234" : "ABC1D23";
}
function generatePisValue(rng) {
const base = randomBaseDigits(rng, PIS_PASEP_BASE_LENGTH);
const dv = String(computeCheckDigit(base, PIS_PASEP_DV_WEIGHTS, digitValue));
return base + dv;
}
function generateRenavamValue(rng) {
const base = randomBaseDigits(rng, RENAVAM_BASE_LENGTH);
const dv = String(computeRenavamCheckDigit(base));
return base + dv;
}
function generateCnhValue(rng) {
const base = randomBaseDigits(rng, CNH_BASE_LENGTH);
return base + computeCnhCheckDigits(base);
}
function generateTelefoneValue(rng, format) {
const ddd = rng.pick(ANATEL_DDDS);
const useFixo = format === "fixo";
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
const local = useFixo ? String(rng.int(2, 5)) + rng.digits(7) : `9${rng.digits(8)}`;
const candidate = ddd + local;
if (validateTelefone(candidate).ok) {
return candidate;
}
}
return useFixo ? "1133333333" : "11999999999";
}
function generateCartaoValue(rng) {
const length = rng.int(13, 16);
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
const partial = rng.digits(length - 1);
if (hasRepeatedChars(partial)) {
continue;
}
const check = computeLuhnCheckDigit(partial);
const candidate = partial + check;
if (validateCartaoCredito(candidate).ok) {
return candidate;
}
}
return "4111111111111111";
}
function generate(type, options = {}) {
const rng = createRandomSource(options.seed);
let value;
switch (type) {
case "cpf":
value = generateCpfValue(rng);
break;
case "cnpj":
value = generateCnpjValue(rng, options.format);
break;
case "cep":
value = generateCepValue(rng);
break;
case "placa":
value = generatePlacaValue(rng, options.format);
break;
case "pis-pasep":
value = generatePisValue(rng);
break;
case "renavam":
value = generateRenavamValue(rng);
break;
case "cnh":
value = generateCnhValue(rng);
break;
case "telefone":
value = generateTelefoneValue(rng, options.format);
break;
case "cartao-credito":
value = generateCartaoValue(rng);
break;
default: {
const _exhaustive = type;
throw new Error(`Unsupported generatable type: ${String(_exhaustive)}`);
}
}
return options.masked ? applyMask(type, value) : value;
}
export { generate };
//# sourceMappingURL=chunk-LGD2JJBZ.js.map
//# sourceMappingURL=chunk-LGD2JJBZ.js.map
{"version":3,"sources":["../src/generate/apply-mask.ts","../src/generate/random.ts","../src/generate/index.ts"],"names":["base","dv1","dv2"],"mappings":"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","file":"chunk-LGD2JJBZ.js","sourcesContent":["import { formatCartaoCredito } from '../format/cartao-credito.js';\nimport { formatCep } from '../format/cep.js';\nimport { formatCnh } from '../format/cnh.js';\nimport { formatCnpj } from '../format/cnpj.js';\nimport { formatCpf } from '../format/cpf.js';\nimport { formatPisPasep } from '../format/pis-pasep.js';\nimport { formatPlaca } from '../format/placa.js';\nimport { formatRenavam } from '../format/renavam.js';\nimport { formatTelefone } from '../format/telefone.js';\nimport type { GeneratableDocumentType } from './index.js';\n\nexport function applyMask(type: GeneratableDocumentType, value: string): string {\n switch (type) {\n case 'cpf': {\n const result = formatCpf(value);\n return result.ok ? result.formatted : value;\n }\n case 'cnpj': {\n const result = formatCnpj(value);\n return result.ok ? result.formatted : value;\n }\n case 'cep': {\n const result = formatCep(value);\n return result.ok ? result.formatted : value;\n }\n case 'placa': {\n const result = formatPlaca(value);\n return result.ok ? result.formatted : value;\n }\n case 'pis-pasep': {\n const result = formatPisPasep(value);\n return result.ok ? result.formatted : value;\n }\n case 'renavam': {\n const result = formatRenavam(value);\n return result.ok ? result.formatted : value;\n }\n case 'cnh': {\n const result = formatCnh(value);\n return result.ok ? result.formatted : value;\n }\n case 'telefone': {\n const result = formatTelefone(value);\n return result.ok ? result.formatted : value;\n }\n case 'cartao-credito': {\n const result = formatCartaoCredito(value);\n return result.ok ? result.formatted : value;\n }\n default: {\n const _exhaustive: never = type;\n return _exhaustive;\n }\n }\n}\n","/**\n * Mulberry32 PRNG — deterministic when seed is provided (BR-GENERATE-001).\n */\nexport type RandomSource = {\n next(): number;\n int(min: number, max: number): number;\n digit(): string;\n digits(count: number): string;\n letter(): string;\n pick<T>(items: readonly T[]): T;\n};\n\nfunction mulberry32(seed: number): () => number {\n let state = seed >>> 0;\n return () => {\n state = (state + 0x6d2b79f5) >>> 0;\n let t = state;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport function createRandomSource(seed?: number): RandomSource {\n const nextFn = seed === undefined ? () => Math.random() : mulberry32(seed);\n\n return {\n next: nextFn,\n int(min: number, max: number): number {\n return Math.floor(nextFn() * (max - min + 1)) + min;\n },\n digit(): string {\n return String(Math.floor(nextFn() * 10));\n },\n digits(count: number): string {\n let out = '';\n for (let i = 0; i < count; i++) {\n out += this.digit();\n }\n return out;\n },\n letter(): string {\n const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n return letters.charAt(this.int(0, letters.length - 1));\n },\n pick<T>(items: readonly T[]): T {\n return items[this.int(0, items.length - 1)];\n },\n };\n}\n\nexport function 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\nexport function computeLuhnCheckDigit(partial: string): string {\n let sum = 0;\n let double = true;\n for (let i = partial.length - 1; i >= 0; i--) {\n let digit = Number(partial.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 String((10 - (sum % 10)) % 10);\n}\n","/**\n * Synthetic document generation — test fixtures only (BR-GENERATE-001).\n * Reuses existing modulo 11 / Luhn compute helpers — never duplicates DV logic.\n * @see docs/VALIDATION-RULES.md\n */\nimport { computeCheckDigit } from '../core/cnpj/modulo11.js';\nimport { cnpjCharValue } from '../core/cnpj/ascii-value.js';\nimport { CNPJ_BASE_LENGTH, CNPJ_DV1_WEIGHTS, CNPJ_DV2_WEIGHTS } from '../core/cnpj/constants.js';\nimport { computeCnhCheckDigits } from '../core/cnh/check-digits.js';\nimport { CNH_BASE_LENGTH } from '../core/cnh/constants.js';\nimport { CPF_BASE_LENGTH, CPF_DV1_WEIGHTS, CPF_DV2_WEIGHTS } from '../core/cpf/constants.js';\nimport { PIS_PASEP_BASE_LENGTH, PIS_PASEP_DV_WEIGHTS } from '../core/pis-pasep/constants.js';\nimport { computeRenavamCheckDigit } from '../core/renavam/check-digits.js';\nimport { RENAVAM_BASE_LENGTH } from '../core/renavam/constants.js';\nimport { PLACA_LEGACY_PATTERN, PLACA_MERCOSUL_PATTERN } from '../core/placa/constants.js';\nimport { ANATEL_DDDS } from '../core/telefone/constants.js';\nimport { validateCep } from '../core/cep/index.js';\nimport { validateCartaoCredito } from '../core/cartao-credito/index.js';\nimport { validatePlaca } from '../core/placa/index.js';\nimport { validateTelefone } from '../core/telefone/index.js';\nimport { applyMask } from './apply-mask.js';\nimport { computeLuhnCheckDigit, createRandomSource, hasRepeatedChars, type RandomSource } from './random.js';\n\nexport type GeneratableDocumentType =\n | 'cpf'\n | 'cnpj'\n | 'cep'\n | 'placa'\n | 'pis-pasep'\n | 'renavam'\n | 'cnh'\n | 'telefone'\n | 'cartao-credito';\n\nexport type GenerateFormat =\n | 'numeric'\n | 'alphanumeric'\n | 'legacy'\n | 'mercosul'\n | 'celular'\n | 'fixo';\n\nexport type GenerateOptions = {\n format?: GenerateFormat;\n masked?: boolean;\n seed?: number;\n};\n\nconst CNPJ_ALNUM_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nconst MAX_ATTEMPTS = 50;\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction randomBaseDigits(rng: RandomSource, length: number): string {\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n const base = rng.digits(length);\n if (!hasRepeatedChars(base)) {\n return base;\n }\n }\n return '123456789'.slice(0, length).padEnd(length, '1');\n}\n\nfunction randomCnpjAlphanumericBase(rng: RandomSource): string {\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n let base = '';\n for (let i = 0; i < CNPJ_BASE_LENGTH; i++) {\n base += CNPJ_ALNUM_CHARS.charAt(rng.int(0, CNPJ_ALNUM_CHARS.length - 1));\n }\n if (!hasRepeatedChars(base)) {\n return base;\n }\n }\n return '12ABC34501DE';\n}\n\nfunction generateCpfValue(rng: RandomSource): string {\n const base = randomBaseDigits(rng, CPF_BASE_LENGTH);\n const dv1 = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue));\n const dv2 = String(computeCheckDigit(base + dv1, CPF_DV2_WEIGHTS, digitValue));\n return base + dv1 + dv2;\n}\n\nfunction generateCnpjValue(rng: RandomSource, format: GenerateOptions['format']): string {\n if (format === 'alphanumeric') {\n const base = randomCnpjAlphanumericBase(rng);\n const dv1 = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, cnpjCharValue));\n const dv2 = String(computeCheckDigit(base + dv1, CNPJ_DV2_WEIGHTS, cnpjCharValue));\n return base + dv1 + dv2;\n }\n const base = randomBaseDigits(rng, CNPJ_BASE_LENGTH);\n const dv1 = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, digitValue));\n const dv2 = String(computeCheckDigit(base + dv1, CNPJ_DV2_WEIGHTS, digitValue));\n return base + dv1 + dv2;\n}\n\nfunction generateCepValue(rng: RandomSource): string {\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n const value = rng.digits(8);\n if (value !== '00000000' && validateCep(value).ok) {\n return value;\n }\n }\n return '01310100';\n}\n\nfunction generatePlacaValue(rng: RandomSource, format: GenerateOptions['format']): string {\n const mode = format === 'legacy' ? 'legacy' : 'mercosul';\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n const letters = rng.letter() + rng.letter() + rng.letter();\n let candidate: string;\n if (mode === 'legacy') {\n candidate = letters + rng.digits(4);\n if (!PLACA_LEGACY_PATTERN.test(candidate)) {\n continue;\n }\n } else {\n candidate =\n letters +\n rng.digit() +\n rng.pick(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']) +\n rng.digits(2);\n if (!PLACA_MERCOSUL_PATTERN.test(candidate)) {\n continue;\n }\n }\n if (validatePlaca(candidate).ok) {\n return candidate;\n }\n }\n return mode === 'legacy' ? 'ABC1234' : 'ABC1D23';\n}\n\nfunction generatePisValue(rng: RandomSource): string {\n const base = randomBaseDigits(rng, PIS_PASEP_BASE_LENGTH);\n const dv = String(computeCheckDigit(base, PIS_PASEP_DV_WEIGHTS, digitValue));\n return base + dv;\n}\n\nfunction generateRenavamValue(rng: RandomSource): string {\n const base = randomBaseDigits(rng, RENAVAM_BASE_LENGTH);\n const dv = String(computeRenavamCheckDigit(base));\n return base + dv;\n}\n\nfunction generateCnhValue(rng: RandomSource): string {\n const base = randomBaseDigits(rng, CNH_BASE_LENGTH);\n return base + computeCnhCheckDigits(base);\n}\n\nfunction generateTelefoneValue(rng: RandomSource, format: GenerateOptions['format']): string {\n const ddd = rng.pick(ANATEL_DDDS);\n const useFixo = format === 'fixo';\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n const local = useFixo ? String(rng.int(2, 5)) + rng.digits(7) : `9${rng.digits(8)}`;\n const candidate = ddd + local;\n if (validateTelefone(candidate).ok) {\n return candidate;\n }\n }\n return useFixo ? '1133333333' : '11999999999';\n}\n\nfunction generateCartaoValue(rng: RandomSource): string {\n const length = rng.int(13, 16);\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n const partial = rng.digits(length - 1);\n if (hasRepeatedChars(partial)) {\n continue;\n }\n const check = computeLuhnCheckDigit(partial);\n const candidate = partial + check;\n if (validateCartaoCredito(candidate).ok) {\n return candidate;\n }\n }\n return '4111111111111111';\n}\n\nexport function generate(type: GeneratableDocumentType, options: GenerateOptions = {}): string {\n const rng = createRandomSource(options.seed);\n let value: string;\n\n switch (type) {\n case 'cpf':\n value = generateCpfValue(rng);\n break;\n case 'cnpj':\n value = generateCnpjValue(rng, options.format);\n break;\n case 'cep':\n value = generateCepValue(rng);\n break;\n case 'placa':\n value = generatePlacaValue(rng, options.format);\n break;\n case 'pis-pasep':\n value = generatePisValue(rng);\n break;\n case 'renavam':\n value = generateRenavamValue(rng);\n break;\n case 'cnh':\n value = generateCnhValue(rng);\n break;\n case 'telefone':\n value = generateTelefoneValue(rng, options.format);\n break;\n case 'cartao-credito':\n value = generateCartaoValue(rng);\n break;\n default: {\n const _exhaustive: never = type;\n throw new Error(`Unsupported generatable type: ${String(_exhaustive)}`);\n }\n }\n\n return options.masked ? applyMask(type, value) : value;\n}\n\nconst repeatingRng: RandomSource = {\n next: () => 0,\n int: (min: number) => min,\n digit: () => '1',\n digits: (count: number) => '1'.repeat(count),\n letter: () => 'A',\n pick: <T>(items: readonly T[]) => items[0],\n};\n\nconst zeroRng: RandomSource = {\n ...repeatingRng,\n digits: (count: number) => '0'.repeat(count),\n};\n\n/** Always fails placa pattern checks so fallback constants are returned. */\nconst exhaustPlacaLegacyRng: RandomSource = {\n ...repeatingRng,\n digits: (count: number) => '1'.repeat(Math.max(0, count - 1)),\n};\n\nconst exhaustPlacaMercosulRng: RandomSource = {\n ...repeatingRng,\n digits: () => '1',\n};\n\n/** Always fails telefone validation so fallback constants are returned. */\nconst exhaustTelefoneRng: RandomSource = {\n ...repeatingRng,\n int: () => 0,\n digits: () => '0',\n};\n\n/** @internal Test hooks for generator fallback branches. */\nexport const __generateTesting = {\n randomBaseDigits: (length: number) => randomBaseDigits(repeatingRng, length),\n randomCnpjAlphanumericBase: () => randomCnpjAlphanumericBase(repeatingRng),\n generateCpfValue: () => generateCpfValue(repeatingRng),\n generateCnpjValue: (format?: GenerateOptions['format']) => generateCnpjValue(repeatingRng, format),\n generateCepValue: () => generateCepValue(zeroRng),\n generateCartaoValue: () => generateCartaoValue(repeatingRng),\n generatePlacaValue: (format?: GenerateOptions['format']) =>\n generatePlacaValue(format === 'legacy' ? exhaustPlacaLegacyRng : exhaustPlacaMercosulRng, format),\n generateTelefoneValue: (format?: GenerateOptions['format']) =>\n generateTelefoneValue(exhaustTelefoneRng, format),\n generatePisValue: () => generatePisValue(repeatingRng),\n generateRenavamValue: () => generateRenavamValue(repeatingRng),\n generateCnhValue: () => generateCnhValue(repeatingRng),\n touchAllRngMethods: () => {\n for (const rng of [repeatingRng, zeroRng, exhaustPlacaLegacyRng, exhaustPlacaMercosulRng, exhaustTelefoneRng]) {\n rng.next();\n rng.int(1, 2);\n rng.digit();\n rng.digits(3);\n rng.letter();\n rng.pick(['a']);\n }\n },\n};\n"]}
import { applyCnpjMask } from './chunk-XUO7FV6Z.js';
import { validateCnpj } from './chunk-YXELVV37.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-LYBFUKHR.js.map
//# sourceMappingURL=chunk-LYBFUKHR.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-LYBFUKHR.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"]}
//# sourceMappingURL=chunk-MFNJTAUS.js.map
//# sourceMappingURL=chunk-MFNJTAUS.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-MFNJTAUS.js"}
import { applyCnpjMask } from './chunk-XUO7FV6Z.js';
import { validateCnpj, detectCnpjFormat } from './chunk-YXELVV37.js';
import { stripCnpj } from './chunk-EB3G4IG6.js';
import { applyCpfMask } from './chunk-KQDLIGSG.js';
import { validateCpf } from './chunk-F6PTZY4O.js';
import { stripCpf } from './chunk-UCJPSJN5.js';
import { brandPixKey } from './chunk-MSLJF2FM.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-MK7OJUF5.js.map
//# sourceMappingURL=chunk-MK7OJUF5.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-MK7OJUF5.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 { stripTituloEleitor } from './chunk-YYHS5WQN.js';
import { weightedSum } from './chunk-OTZHMJYE.js';
import { brandTituloEleitor } from './chunk-MSLJF2FM.js';
// src/core/titulo-eleitor/constants.ts
var TITULO_ELEITOR_DV1_WEIGHTS_8 = [2, 3, 4, 5, 6, 7, 8, 9];
var TITULO_ELEITOR_DV1_WEIGHTS_9 = [9, 2, 3, 4, 5, 6, 7, 8, 9];
var TITULO_ELEITOR_DV2_WEIGHTS = [7, 8, 9];
var TITULO_ELEITOR_SEQUENTIAL_LENGTH = 8;
var TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED = 9;
var TITULO_ELEITOR_LENGTH = 12;
var TITULO_ELEITOR_LENGTH_EXTENDED = 13;
var TITULO_ELEITOR_MIN_UF_CODE = 1;
var TITULO_ELEITOR_MAX_UF_CODE = 28;
var TITULO_ELEITOR_NUMERIC_PATTERN_12 = /^\d{12}$/;
var TITULO_ELEITOR_NUMERIC_PATTERN_13 = /^\d{13}$/;
var TITULO_ELEITOR_SPECIAL_UF_CODES = [1, 2];
var TITULO_ELEITOR_GOLDEN_PRIMARY = "004356870906";
var TITULO_ELEITOR_GOLDEN_SP_SPECIAL = "000000000116";
var TITULO_ELEITOR_GOLDEN_SP_EXTENDED = "1234567890175";
var TITULO_ELEITOR_GOLDEN_EXTERIOR = "000000012895";
var TITULO_ELEITOR_GOLDEN_MASKED_INPUT = "0043 5687 0906";
var TITULO_ELEITOR_OFFICIAL_SOURCE_URL = "https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998";
var TITULO_ELEITOR_NORMATIVE_SECONDARY_URL = "https://www.tse.jus.br/legislacao/compilada/res/2021/resolucao-no-23-659-de-26-de-outubro-de-2021";
var TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL = "https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador";
var TITULO_ELEITOR_ALGORITHM_REF_URL = "http://ghiorzi.org/DVnew.htm#e";
var TITULO_ELEITOR_TSE_PORTAL_URL = "https://www.tse.jus.br/";
var TITULO_ELEITOR_ETITULO_URL = "https://www.tse.jus.br/eleitor/servicos/aplicativo-e-titulo";
var TITULO_ELEITOR_UF_BY_CODE = {
1: "SP",
2: "MG",
3: "RJ",
4: "RS",
5: "BA",
6: "PR",
7: "CE",
8: "PE",
9: "SC",
10: "GO",
11: "MA",
12: "PB",
13: "PA",
14: "ES",
15: "PI",
16: "RN",
17: "AL",
18: "MT",
19: "MS",
20: "DF",
21: "SE",
22: "AM",
23: "RO",
24: "AC",
25: "AP",
26: "RR",
27: "TO"
};
var TITULO_ELEITOR_EXTERIOR_UF_CODE = 28;
// src/core/titulo-eleitor/check-digits.ts
function digitValues(chars) {
const values = [];
for (let i = 0; i < chars.length; i++) {
values.push(Number(chars.charAt(i)));
}
return values;
}
function isSpecialUf(ufCode) {
return TITULO_ELEITOR_SPECIAL_UF_CODES.includes(ufCode);
}
function resolveTituloEleitorCheckDigit(remainder, ufCode) {
if (remainder >= 10) {
return 0;
}
if (remainder === 0 && isSpecialUf(ufCode)) {
return 1;
}
return remainder;
}
function computeTituloEleitorFirstCheckDigit(sequential, ufCode) {
const weights = sequential.length === 8 ? TITULO_ELEITOR_DV1_WEIGHTS_8 : TITULO_ELEITOR_DV1_WEIGHTS_9;
const remainder = weightedSum(digitValues(sequential), weights) % 11;
return resolveTituloEleitorCheckDigit(remainder, ufCode);
}
function computeTituloEleitorSecondCheckDigit(ufDigits, firstDv, ufCode) {
const uf1 = Number(ufDigits.charAt(0));
const uf2 = Number(ufDigits.charAt(1));
const remainder = weightedSum([uf1, uf2, firstDv], TITULO_ELEITOR_DV2_WEIGHTS) % 11;
return resolveTituloEleitorCheckDigit(remainder, ufCode);
}
function computeTituloEleitorCheckDigits(sequential, ufDigits, ufCode) {
const dv1 = computeTituloEleitorFirstCheckDigit(sequential, ufCode);
const dv2 = computeTituloEleitorSecondCheckDigit(ufDigits, dv1, ufCode);
return `${String(dv1)}${String(dv2)}`;
}
// src/core/titulo-eleitor/parse.ts
function parseTituloEleitorParts(stripped) {
if (stripped.length === TITULO_ELEITOR_LENGTH) {
return {
sequential: stripped.slice(0, TITULO_ELEITOR_SEQUENTIAL_LENGTH),
ufDigits: stripped.slice(TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_LENGTH - 2),
ufCode: Number(stripped.slice(TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_LENGTH - 2)),
checkDigits: stripped.slice(TITULO_ELEITOR_LENGTH - 2)
};
}
if (stripped.length === TITULO_ELEITOR_LENGTH_EXTENDED) {
const ufDigits = stripped.slice(
TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,
TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED + 2
);
const ufCode = Number(ufDigits);
if (!TITULO_ELEITOR_SPECIAL_UF_CODES.includes(ufCode)) {
return null;
}
return {
sequential: stripped.slice(0, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED),
ufDigits,
ufCode,
checkDigits: stripped.slice(TITULO_ELEITOR_LENGTH_EXTENDED - 2)
};
}
return null;
}
// src/core/titulo-eleitor/index.ts
function failure(code, message, ufCode) {
if (ufCode === void 0) {
return { ok: false, code, message };
}
return { ok: false, code, message, ufCode };
}
function hasRepeatedDigits(value) {
const first = value[0];
for (let i = 1; i < value.length; i++) {
if (value[i] !== first) {
return false;
}
}
return true;
}
function isValidUfCode(ufCode) {
return ufCode >= TITULO_ELEITOR_MIN_UF_CODE && ufCode <= TITULO_ELEITOR_MAX_UF_CODE;
}
function resolveUf(ufCode) {
return TITULO_ELEITOR_UF_BY_CODE[ufCode];
}
function validateStructure(input, stripped) {
if (stripped.length === 0) {
return { ok: false, error: failure("EMPTY_INPUT", "T\xEDtulo de Eleitor input is empty") };
}
if (/[^0-9\s]/.test(input.replace(/\s/g, ""))) {
return { ok: false, error: failure("INVALID_CHARACTER", "T\xEDtulo de Eleitor contains invalid characters") };
}
if (stripped.length !== TITULO_ELEITOR_LENGTH && stripped.length !== TITULO_ELEITOR_LENGTH_EXTENDED) {
return {
ok: false,
error: failure(
"INVALID_LENGTH",
`T\xEDtulo de Eleitor must have ${TITULO_ELEITOR_LENGTH} or ${TITULO_ELEITOR_LENGTH_EXTENDED} digits after normalization`
)
};
}
const parts = parseTituloEleitorParts(stripped);
if (!parts) {
return {
ok: false,
error: failure(
"UNSUPPORTED_FORMAT",
`13-digit T\xEDtulo de Eleitor is only valid for SP (01) or MG (02)`
)
};
}
if (!isValidUfCode(parts.ufCode)) {
return {
ok: false,
error: failure(
"KNOWN_INVALID_PATTERN",
`T\xEDtulo de Eleitor UF code ${parts.ufDigits} is not a valid TSE electoral code`,
parts.ufCode
)
};
}
if (hasRepeatedDigits(stripped)) {
return {
ok: false,
error: failure("KNOWN_INVALID_PATTERN", "T\xEDtulo de Eleitor with all identical digits is invalid")
};
}
return { ok: true, parts };
}
function isValidTituloEleitorChecksum(parts) {
const expected = computeTituloEleitorCheckDigits(parts.sequential, parts.ufDigits, parts.ufCode);
return parts.checkDigits === expected;
}
function isValidTituloEleitor(input) {
return validateTituloEleitor(input).ok;
}
function validateTituloEleitor(input) {
const stripped = stripTituloEleitor(input);
const structure = validateStructure(input, stripped);
if (!structure.ok) {
return structure.error;
}
const { parts } = structure;
if (!isValidTituloEleitorChecksum(parts)) {
return failure("INVALID_CHECK_DIGIT", "T\xEDtulo de Eleitor check digits are invalid", parts.ufCode);
}
const uf = resolveUf(parts.ufCode);
const success = {
ok: true,
value: brandTituloEleitor(stripped),
format: "numeric",
ufCode: parts.ufCode
};
if (uf !== void 0) {
success.uf = uf;
} else if (parts.ufCode === TITULO_ELEITOR_EXTERIOR_UF_CODE) {
success.exterior = true;
}
return success;
}
export { TITULO_ELEITOR_ALGORITHM_REF_URL, TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL, TITULO_ELEITOR_DV1_WEIGHTS_8, TITULO_ELEITOR_DV1_WEIGHTS_9, TITULO_ELEITOR_DV2_WEIGHTS, TITULO_ELEITOR_ETITULO_URL, TITULO_ELEITOR_EXTERIOR_UF_CODE, TITULO_ELEITOR_GOLDEN_EXTERIOR, TITULO_ELEITOR_GOLDEN_MASKED_INPUT, TITULO_ELEITOR_GOLDEN_PRIMARY, TITULO_ELEITOR_GOLDEN_SP_EXTENDED, TITULO_ELEITOR_GOLDEN_SP_SPECIAL, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED, TITULO_ELEITOR_NORMATIVE_SECONDARY_URL, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_OFFICIAL_SOURCE_URL, TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED, TITULO_ELEITOR_SPECIAL_UF_CODES, TITULO_ELEITOR_TSE_PORTAL_URL, TITULO_ELEITOR_UF_BY_CODE, isValidTituloEleitor, validateTituloEleitor };
//# sourceMappingURL=chunk-MLPXW7N2.js.map
//# sourceMappingURL=chunk-MLPXW7N2.js.map
{"version":3,"sources":["../src/core/titulo-eleitor/constants.ts","../src/core/titulo-eleitor/check-digits.ts","../src/core/titulo-eleitor/parse.ts","../src/core/titulo-eleitor/index.ts"],"names":[],"mappings":"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","file":"chunk-MLPXW7N2.js","sourcesContent":["/**\n * Título de Eleitor constants — modulo 11 (TSE Res. 20.132/1998 + algorithm cross-checks).\n * @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998 — Art. 10 (structure, mod 11)\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador — weights + SP/MG rule\n * @see http://ghiorzi.org/DVnew.htm#e — algorithm cross-check\n */\nimport type { UfCode } from '../../types/validation-result.js';\n\nexport const TITULO_ELEITOR_DV1_WEIGHTS_8 = [2, 3, 4, 5, 6, 7, 8, 9] as const;\nexport const TITULO_ELEITOR_DV1_WEIGHTS_9 = [9, 2, 3, 4, 5, 6, 7, 8, 9] as const;\nexport const TITULO_ELEITOR_DV2_WEIGHTS = [7, 8, 9] as const;\nexport const TITULO_ELEITOR_SEQUENTIAL_LENGTH = 8;\nexport const TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED = 9;\nexport const TITULO_ELEITOR_LENGTH = 12;\nexport const TITULO_ELEITOR_LENGTH_EXTENDED = 13;\nexport const TITULO_ELEITOR_UF_LENGTH = 2;\nexport const TITULO_ELEITOR_DV_LENGTH = 2;\nexport const TITULO_ELEITOR_MIN_UF_CODE = 1;\nexport const TITULO_ELEITOR_MAX_UF_CODE = 28;\nexport const TITULO_ELEITOR_NUMERIC_PATTERN_12 = /^\\d{12}$/;\nexport const TITULO_ELEITOR_NUMERIC_PATTERN_13 = /^\\d{13}$/;\n\n/** TSE UF codes where remainder 0 maps DV to 1 instead of 0. */\nexport const TITULO_ELEITOR_SPECIAL_UF_CODES = [1, 2] as const;\n\n/** Golden primary — SC (UF=09), Wikipedia PT walkthrough. */\nexport const TITULO_ELEITOR_GOLDEN_PRIMARY = '004356870906';\nexport const TITULO_ELEITOR_GOLDEN_SP_SPECIAL = '000000000116';\nexport const TITULO_ELEITOR_GOLDEN_SP_EXTENDED = '1234567890175';\nexport const TITULO_ELEITOR_GOLDEN_EXTERIOR = '000000012895';\nexport const TITULO_ELEITOR_GOLDEN_MASKED_INPUT = '0043 5687 0906';\n\n/** Normative — Resolução TSE 20.132/1998, Art. 10 (8 seq + 2 UF + 2 DV, mod 11). */\nexport const TITULO_ELEITOR_OFFICIAL_SOURCE_URL =\n 'https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998';\n\n/** Normative — Resolução TSE 23.659/2021 (Cadastro Eleitoral; confirms UF + DV structure). */\nexport const TITULO_ELEITOR_NORMATIVE_SECONDARY_URL =\n 'https://www.tse.jus.br/legislacao/compilada/res/2021/resolucao-no-23-659-de-26-de-outubro-de-2021';\n\n/**\n * Algorithm weights + SP/MG remainder-zero rule — not in TSE resolution text.\n * Community consensus validated empirically (Wikipedia PT worked example).\n */\nexport const TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL =\n 'https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador';\n\n/** Algorithm cross-check — Ghiorzi DV table. */\nexport const TITULO_ELEITOR_ALGORITHM_REF_URL = 'http://ghiorzi.org/DVnew.htm#e';\n\nexport const TITULO_ELEITOR_TSE_PORTAL_URL = 'https://www.tse.jus.br/';\n\nexport const TITULO_ELEITOR_ETITULO_URL =\n 'https://www.tse.jus.br/eleitor/servicos/aplicativo-e-titulo';\n\n/** TSE electoral UF code → Brazilian UF (28 = exterior / ZZ). */\nexport const TITULO_ELEITOR_UF_BY_CODE: Readonly<Record<number, UfCode>> = {\n 1: 'SP',\n 2: 'MG',\n 3: 'RJ',\n 4: 'RS',\n 5: 'BA',\n 6: 'PR',\n 7: 'CE',\n 8: 'PE',\n 9: 'SC',\n 10: 'GO',\n 11: 'MA',\n 12: 'PB',\n 13: 'PA',\n 14: 'ES',\n 15: 'PI',\n 16: 'RN',\n 17: 'AL',\n 18: 'MT',\n 19: 'MS',\n 20: 'DF',\n 21: 'SE',\n 22: 'AM',\n 23: 'RO',\n 24: 'AC',\n 25: 'AP',\n 26: 'RR',\n 27: 'TO',\n};\n\nexport const TITULO_ELEITOR_EXTERIOR_UF_CODE = 28;\n","/**\n * Título de Eleitor check digits — modulo 11 (TSE / Wikipedia PT + Ghiorzi).\n * @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n * @see http://ghiorzi.org/DVnew.htm#e\n */\nimport { weightedSum } from '../cnpj/modulo11.js';\nimport {\n TITULO_ELEITOR_DV1_WEIGHTS_8,\n TITULO_ELEITOR_DV1_WEIGHTS_9,\n TITULO_ELEITOR_DV2_WEIGHTS,\n TITULO_ELEITOR_SPECIAL_UF_CODES,\n} from './constants.js';\n\nfunction digitValues(chars: string): number[] {\n const values: number[] = [];\n for (let i = 0; i < chars.length; i++) {\n values.push(Number(chars.charAt(i)));\n }\n return values;\n}\n\nfunction isSpecialUf(ufCode: number): boolean {\n return (TITULO_ELEITOR_SPECIAL_UF_CODES as readonly number[]).includes(ufCode);\n}\n\nexport function resolveTituloEleitorCheckDigit(remainder: number, ufCode: number): number {\n if (remainder >= 10) {\n return 0;\n }\n if (remainder === 0 && isSpecialUf(ufCode)) {\n return 1;\n }\n return remainder;\n}\n\nexport function computeTituloEleitorFirstCheckDigit(sequential: string, ufCode: number): number {\n const weights =\n sequential.length === 8 ? TITULO_ELEITOR_DV1_WEIGHTS_8 : TITULO_ELEITOR_DV1_WEIGHTS_9;\n const remainder = weightedSum(digitValues(sequential), weights) % 11;\n return resolveTituloEleitorCheckDigit(remainder, ufCode);\n}\n\nexport function computeTituloEleitorSecondCheckDigit(\n ufDigits: string,\n firstDv: number,\n ufCode: number,\n): number {\n const uf1 = Number(ufDigits.charAt(0));\n const uf2 = Number(ufDigits.charAt(1));\n const remainder = weightedSum([uf1, uf2, firstDv], TITULO_ELEITOR_DV2_WEIGHTS) % 11;\n return resolveTituloEleitorCheckDigit(remainder, ufCode);\n}\n\nexport function computeTituloEleitorCheckDigits(\n sequential: string,\n ufDigits: string,\n ufCode: number,\n): string {\n const dv1 = computeTituloEleitorFirstCheckDigit(sequential, ufCode);\n const dv2 = computeTituloEleitorSecondCheckDigit(ufDigits, dv1, ufCode);\n return `${String(dv1)}${String(dv2)}`;\n}\n","import {\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,\n TITULO_ELEITOR_SPECIAL_UF_CODES,\n} from './constants.js';\n\nexport type TituloEleitorParts = {\n sequential: string;\n ufDigits: string;\n ufCode: number;\n checkDigits: string;\n};\n\nexport function parseTituloEleitorParts(stripped: string): TituloEleitorParts | null {\n if (stripped.length === TITULO_ELEITOR_LENGTH) {\n return {\n sequential: stripped.slice(0, TITULO_ELEITOR_SEQUENTIAL_LENGTH),\n ufDigits: stripped.slice(TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_LENGTH - 2),\n ufCode: Number(stripped.slice(TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_LENGTH - 2)),\n checkDigits: stripped.slice(TITULO_ELEITOR_LENGTH - 2),\n };\n }\n\n if (stripped.length === TITULO_ELEITOR_LENGTH_EXTENDED) {\n const ufDigits = stripped.slice(\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED + 2,\n );\n const ufCode = Number(ufDigits);\n if (!(TITULO_ELEITOR_SPECIAL_UF_CODES as readonly number[]).includes(ufCode)) {\n return null;\n }\n return {\n sequential: stripped.slice(0, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED),\n ufDigits,\n ufCode,\n checkDigits: stripped.slice(TITULO_ELEITOR_LENGTH_EXTENDED - 2),\n };\n }\n\n return null;\n}\n","/**\n * Título de Eleitor validation — modulo 11 (TSE Res. 20.132/1998 + algorithm cross-checks).\n * @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n * @see http://ghiorzi.org/DVnew.htm#e\n */\nimport { stripTituloEleitor } from '../../strip/index.js';\nimport type { TituloEleitorValidationResult, UfCode } from '../../types/validation-result.js';\nimport { brandTituloEleitor } from '../../types/validation-result.js';\nimport { computeTituloEleitorCheckDigits } from './check-digits.js';\nimport {\n TITULO_ELEITOR_EXTERIOR_UF_CODE,\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_MAX_UF_CODE,\n TITULO_ELEITOR_MIN_UF_CODE,\n TITULO_ELEITOR_UF_BY_CODE,\n} from './constants.js';\nimport { parseTituloEleitorParts } from './parse.js';\n\nexport {\n TITULO_ELEITOR_ALGORITHM_REF_URL,\n TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL,\n TITULO_ELEITOR_DV1_WEIGHTS_8,\n TITULO_ELEITOR_DV1_WEIGHTS_9,\n TITULO_ELEITOR_DV2_WEIGHTS,\n TITULO_ELEITOR_ETITULO_URL,\n TITULO_ELEITOR_EXTERIOR_UF_CODE,\n TITULO_ELEITOR_GOLDEN_EXTERIOR,\n TITULO_ELEITOR_GOLDEN_MASKED_INPUT,\n TITULO_ELEITOR_GOLDEN_PRIMARY,\n TITULO_ELEITOR_GOLDEN_SP_EXTENDED,\n TITULO_ELEITOR_GOLDEN_SP_SPECIAL,\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_NORMATIVE_SECONDARY_URL,\n TITULO_ELEITOR_NUMERIC_PATTERN_12,\n TITULO_ELEITOR_NUMERIC_PATTERN_13,\n TITULO_ELEITOR_OFFICIAL_SOURCE_URL,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,\n TITULO_ELEITOR_SPECIAL_UF_CODES,\n TITULO_ELEITOR_TSE_PORTAL_URL,\n TITULO_ELEITOR_UF_BY_CODE,\n} from './constants.js';\n\ntype FailedResult = Extract<TituloEleitorValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, ufCode?: number): FailedResult {\n if (ufCode === undefined) {\n return { ok: false, code, message };\n }\n return { ok: false, code, message, ufCode };\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 isValidUfCode(ufCode: number): boolean {\n return ufCode >= TITULO_ELEITOR_MIN_UF_CODE && ufCode <= TITULO_ELEITOR_MAX_UF_CODE;\n}\n\nfunction resolveUf(ufCode: number): UfCode | undefined {\n return TITULO_ELEITOR_UF_BY_CODE[ufCode];\n}\n\ntype StructureResult =\n | { ok: false; error: FailedResult }\n | { ok: true; parts: NonNullable<ReturnType<typeof parseTituloEleitorParts>> };\n\nfunction validateStructure(input: string, stripped: string): StructureResult {\n if (stripped.length === 0) {\n return { ok: false, error: failure('EMPTY_INPUT', 'Título de Eleitor input is empty') };\n }\n\n if (/[^0-9\\s]/.test(input.replace(/\\s/g, ''))) {\n return { ok: false, error: failure('INVALID_CHARACTER', 'Título de Eleitor contains invalid characters') };\n }\n\n if (stripped.length !== TITULO_ELEITOR_LENGTH && stripped.length !== TITULO_ELEITOR_LENGTH_EXTENDED) {\n return {\n ok: false,\n error: failure(\n 'INVALID_LENGTH',\n `Título de Eleitor must have ${TITULO_ELEITOR_LENGTH} or ${TITULO_ELEITOR_LENGTH_EXTENDED} digits after normalization`,\n ),\n };\n }\n\n const parts = parseTituloEleitorParts(stripped);\n if (!parts) {\n return {\n ok: false,\n error: failure(\n 'UNSUPPORTED_FORMAT',\n `13-digit Título de Eleitor is only valid for SP (01) or MG (02)`,\n ),\n };\n }\n\n if (!isValidUfCode(parts.ufCode)) {\n return {\n ok: false,\n error: failure(\n 'KNOWN_INVALID_PATTERN',\n `Título de Eleitor UF code ${parts.ufDigits} is not a valid TSE electoral code`,\n parts.ufCode,\n ),\n };\n }\n\n if (hasRepeatedDigits(stripped)) {\n return {\n ok: false,\n error: failure('KNOWN_INVALID_PATTERN', 'Título de Eleitor with all identical digits is invalid'),\n };\n }\n\n return { ok: true, parts };\n}\n\nfunction isValidTituloEleitorChecksum(parts: {\n sequential: string;\n ufDigits: string;\n ufCode: number;\n checkDigits: string;\n}): boolean {\n const expected = computeTituloEleitorCheckDigits(parts.sequential, parts.ufDigits, parts.ufCode);\n return parts.checkDigits === expected;\n}\n\nexport function isValidTituloEleitor(input: string): boolean {\n return validateTituloEleitor(input).ok;\n}\n\nexport function validateTituloEleitor(input: string): TituloEleitorValidationResult {\n const stripped = stripTituloEleitor(input);\n const structure = validateStructure(input, stripped);\n if (!structure.ok) {\n return structure.error;\n }\n\n const { parts } = structure;\n\n if (!isValidTituloEleitorChecksum(parts)) {\n return failure('INVALID_CHECK_DIGIT', 'Título de Eleitor check digits are invalid', parts.ufCode);\n }\n\n const uf = resolveUf(parts.ufCode);\n const success: Extract<TituloEleitorValidationResult, { ok: true }> = {\n ok: true,\n value: brandTituloEleitor(stripped),\n format: 'numeric',\n ufCode: parts.ufCode,\n };\n if (uf !== undefined) {\n success.uf = uf;\n } else if (parts.ufCode === TITULO_ELEITOR_EXTERIOR_UF_CODE) {\n success.exterior = true;\n }\n return success;\n}\n"]}
// src/types/validation-result.ts
function brandCnpj(value) {
return value;
}
function brandCpf(value) {
return value;
}
function brandCnh(value) {
return value;
}
function brandRenavam(value) {
return value;
}
function brandTituloEleitor(value) {
return value;
}
function brandNfeChave(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 brandInscricaoEstadualProdutorRural(value) {
return value;
}
function brandTelefone(value) {
return value;
}
function brandBrCodePayload(value) {
return value;
}
export { brandBrCodePayload, brandCartaoCredito, brandCep, brandCnh, brandCnpj, brandCodigoBarras, brandCpf, brandInscricaoEstadual, brandInscricaoEstadualProdutorRural, brandLinhaDigitavel, brandNfeChave, brandPisPasep, brandPixKey, brandPlaca, brandRenavam, brandTelefone, brandTituloEleitor };
//# sourceMappingURL=chunk-MSLJF2FM.js.map
//# sourceMappingURL=chunk-MSLJF2FM.js.map
{"version":3,"sources":["../src/types/validation-result.ts"],"names":[],"mappings":";AAwIO,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,aAAa,KAAA,EAAwB;AACnD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,mBAAmB,KAAA,EAA8B;AAC/D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,KAAA,EAAyB;AACrD,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,oCAAoC,KAAA,EAA+C;AACjG,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-MSLJF2FM.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 | 'inscricao-estadual-produtor-rural'\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 Cnh = string & { readonly __brand: 'Cnh' };\nexport type Renavam = string & { readonly __brand: 'Renavam' };\nexport type TituloEleitor = string & { readonly __brand: 'TituloEleitor' };\nexport type NfeChave = string & { readonly __brand: 'NfeChave' };\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 InscricaoEstadualProdutorRural = string & { readonly __brand: 'InscricaoEstadualProdutorRural' };\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 IeProdutorRuralValidationResult =\n | { ok: true; value: InscricaoEstadualProdutorRural; uf: 'SP'; format: 'inscricao-estadual-produtor-rural' }\n | { ok: false; code: ValidationErrorCode; message: string; uf?: UfCode };\n\nexport type TituloEleitorValidationResult =\n | {\n ok: true;\n value: TituloEleitor;\n format: 'numeric';\n ufCode: number;\n uf?: UfCode;\n exterior?: true;\n }\n | { ok: false; code: ValidationErrorCode; message: string; ufCode?: number };\n\nexport type NfeChaveParsed = {\n cUF: string;\n aamm: string;\n cnpj: string;\n mod: string;\n serie: string;\n nNF: string;\n tpEmis: string;\n cNF: string;\n cDV: string;\n};\n\nexport type NfeChaveValidationResult =\n | { ok: true; value: NfeChave; format: 'numeric'; parsed: NfeChaveParsed; uf?: UfCode }\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 brandCnh(value: string): Cnh {\n return value as Cnh;\n}\n\nexport function brandRenavam(value: string): Renavam {\n return value as Renavam;\n}\n\nexport function brandTituloEleitor(value: string): TituloEleitor {\n return value as TituloEleitor;\n}\n\nexport function brandNfeChave(value: string): NfeChave {\n return value as NfeChave;\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 brandInscricaoEstadualProdutorRural(value: string): InscricaoEstadualProdutorRural {\n return value as InscricaoEstadualProdutorRural;\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 { applyCpfMask } from './chunk-KQDLIGSG.js';
import { validateCpf } from './chunk-F6PTZY4O.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-NHLLC6WH.js.map
//# sourceMappingURL=chunk-NHLLC6WH.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-NHLLC6WH.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 { validateTituloEleitor } from './chunk-MLPXW7N2.js';
import { validateTelefone } from './chunk-5UL3M7IU.js';
import { validateInscricaoEstadual } from './chunk-3QP6R46N.js';
import { isSpRuralIeInput, validateIeProdutorRural } from './chunk-Y6IW2LMW.js';
import { validateNfeChave, NFE_CHAVE_LENGTH } from './chunk-D36RM7OD.js';
import { validatePisPasep } from './chunk-KH7DWOUA.js';
import { validatePlaca, PLACA_LENGTH } from './chunk-WPL47PWJ.js';
import { validateBoleto, detectBoletoInputKind } from './chunk-4W4OKLSZ.js';
import { validateBrCode } from './chunk-WCQUQ2WX.js';
import { validatePixKey } from './chunk-MK7OJUF5.js';
import { validateCartaoCredito, CARTAO_PAN_MIN_LENGTH, CARTAO_PAN_MAX_LENGTH } from './chunk-EPKHEW5V.js';
import { validateCep } from './chunk-2JJS46FM.js';
import { validateCnh } from './chunk-US4OLTJ2.js';
import { validateCnpj, CNPJ_LENGTH } from './chunk-YXELVV37.js';
import { validateCpf } from './chunk-F6PTZY4O.js';
// src/detect/helpers.ts
function stripDigits(input) {
return input.replace(/\D/g, "");
}
function stripAlnumUpper(input) {
return input.replace(/[^A-Za-z0-9]/g, "").toUpperCase();
}
function hasLetters(input) {
return /[A-Za-z]/.test(input);
}
function looksLikeBrCode(input) {
const trimmed = input.trim();
return trimmed.startsWith("00020") && trimmed.length > 20;
}
function looksLikeBoleto(input) {
const kind = detectBoletoInputKind(input);
return kind === "linha-digitavel" || kind === "codigo-barras";
}
function isBoletoArrecadacao(input) {
return detectBoletoInputKind(input) === "arrecadacao";
}
function looksLikeNfeChave(input) {
const digits = stripDigits(input);
return digits.length === NFE_CHAVE_LENGTH && /^\d+$/.test(digits);
}
function looksLikeCnpjNumeric(input) {
const digits = stripDigits(input);
return digits.length === CNPJ_LENGTH && /^\d+$/.test(digits);
}
function looksLikeCnpjAlphanumeric(input) {
const stripped = stripAlnumUpper(input);
return stripped.length === CNPJ_LENGTH && hasLetters(input);
}
function looksLikeElevenDigits(input) {
const digits = stripDigits(input);
return digits.length === 11 && /^\d+$/.test(digits);
}
function looksLikeTituloEleitor(input) {
const digits = stripDigits(input);
return digits.length === 12 && /^\d+$/.test(digits);
}
function looksLikeCep(input) {
const digits = stripDigits(input);
return digits.length === 8 && /^\d+$/.test(digits);
}
function looksLikePlaca(input) {
const stripped = stripAlnumUpper(input);
return stripped.length === PLACA_LENGTH && /^[A-Z0-9]+$/.test(stripped);
}
function looksLikeCartao(input) {
const withoutMask = input.replace(/[\s-]/g, "");
if (/[^0-9]/.test(withoutMask)) {
return false;
}
const digits = stripDigits(input);
return digits.length >= CARTAO_PAN_MIN_LENGTH && digits.length <= CARTAO_PAN_MAX_LENGTH;
}
function looksLikeIe(input, uf) {
if (!uf) {
return false;
}
if (uf === "SP" && isSpRuralIeInput(input)) {
return true;
}
const digits = stripDigits(input);
return digits.length >= 8 && digits.length <= 14;
}
function looksLikePix(input) {
const trimmed = input.trim();
if (trimmed.includes("@")) {
return true;
}
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmed)) {
return true;
}
if (/^\+?\d/.test(trimmed)) {
const digits = stripDigits(trimmed);
return digits.length === 11 || digits.length === 14;
}
return false;
}
function looksLikeTelefone(input) {
const digits = stripDigits(input);
return digits.length >= 10 && digits.length <= 13;
}
// src/detect/index.ts
function success(type, value, format, meta) {
return { type, ok: true, value, ...format ? { format } : {}, ...meta ? { meta } : {} };
}
function tryValidators(attempts) {
for (const attempt of attempts) {
const result = attempt();
if (result) {
return result;
}
}
return null;
}
var CANDIDATES = [
{
canTry: (raw) => looksLikeBoleto(raw) && !isBoletoArrecadacao(raw),
detect: (raw) => {
const result = validateBoleto(raw);
if (!result.ok) {
return null;
}
return success("boleto", result.value, result.format, {
inputKind: result.inputKind,
situacao: result.situacao
});
}
},
{
canTry: (raw) => looksLikeNfeChave(raw),
detect: (raw) => {
const result = validateNfeChave(raw);
if (!result.ok) {
return null;
}
return success("nfe-chave", result.value, result.format, {
parsed: result.parsed,
uf: result.uf
});
}
},
{
canTry: (raw) => looksLikeBrCode(raw),
detect: (raw) => {
const result = validateBrCode(raw);
if (!result.ok) {
return null;
}
return success("brcode", result.value, result.format, {
merchantName: result.merchantName,
merchantCity: result.merchantCity,
pixKey: result.pixKey,
pixKeyType: result.pixKeyType
});
}
},
{
canTry: (raw) => looksLikeCnpjAlphanumeric(raw),
detect: (raw) => {
const result = validateCnpj(raw);
if (!result.ok) {
return null;
}
return success("cnpj", result.value, result.format);
}
},
{
canTry: (raw) => looksLikeCnpjNumeric(raw),
detect: (raw) => {
const result = validateCnpj(raw);
if (!result.ok) {
return null;
}
return success("cnpj", result.value, result.format);
}
},
{
canTry: (raw) => looksLikeElevenDigits(raw),
detect: (raw) => tryValidators([
() => {
const result = validateCpf(raw);
return result.ok ? success("cpf", result.value, result.format) : null;
},
() => {
const result = validateCnh(raw);
return result.ok ? success("cnh", result.value, result.format) : null;
},
() => {
const result = validatePisPasep(raw);
return result.ok ? success("pis-pasep", result.value, result.format) : null;
}
])
},
{
canTry: (raw) => looksLikeTituloEleitor(raw),
detect: (raw) => {
const result = validateTituloEleitor(raw);
if (!result.ok) {
return null;
}
return success("titulo-eleitor", result.value, result.format, {
ufCode: result.ufCode,
...result.uf ? { uf: result.uf } : {},
...result.exterior ? { exterior: result.exterior } : {}
});
}
},
{
canTry: (raw) => looksLikeCep(raw),
detect: (raw) => {
const result = validateCep(raw);
if (!result.ok) {
return null;
}
return success("cep", result.value, result.format);
}
},
{
canTry: (raw) => looksLikePlaca(raw),
detect: (raw) => {
const result = validatePlaca(raw);
if (!result.ok) {
return null;
}
return success("placa", result.value, result.format);
}
},
{
canTry: (raw) => looksLikePix(raw),
detect: (raw) => {
const result = validatePixKey(raw);
if (!result.ok) {
return null;
}
return success("pix", result.value, result.format, { keyType: result.keyType });
}
},
{
canTry: (raw) => looksLikeTelefone(raw),
detect: (raw) => {
const result = validateTelefone(raw);
if (!result.ok) {
return null;
}
return success("telefone", result.value, result.format, { tipo: result.tipo });
}
},
{
canTry: (raw) => looksLikeCartao(raw),
detect: (raw) => {
const result = validateCartaoCredito(raw);
if (!result.ok) {
return null;
}
return success("cartao-credito", result.value, result.format, { brand: result.brand });
}
},
{
canTry: (raw, options) => looksLikeIe(raw, options.uf),
detect: (raw, options) => {
const uf = options.uf;
if (uf === "SP" && isSpRuralIeInput(raw)) {
const result2 = validateIeProdutorRural(uf, raw);
if (!result2.ok) {
return null;
}
return success("inscricao-estadual-produtor-rural", result2.value, result2.format, { uf: result2.uf });
}
const result = validateInscricaoEstadual(raw, { uf });
if (!result.ok) {
return null;
}
return success("inscricao-estadual", result.value, result.format, { uf: result.uf });
}
}
];
function detect(raw, options = {}) {
const trimmed = raw.trim();
if (trimmed.length === 0) {
return {
type: "unknown",
ok: false,
code: "EMPTY_INPUT",
message: "Input is empty"
};
}
for (const candidate of CANDIDATES) {
if (!candidate.canTry(trimmed, options)) {
continue;
}
const result = candidate.detect(trimmed, options);
if (result?.ok) {
return result;
}
}
return {
type: "unknown",
ok: false,
code: "UNSUPPORTED_FORMAT",
message: options.uf ? "No supported document type matched the input" : "No supported document type matched the input; provide options.uf for Inscri\xE7\xE3o Estadual detection"
};
}
export { detect };
//# sourceMappingURL=chunk-OCYXNLHO.js.map
//# sourceMappingURL=chunk-OCYXNLHO.js.map
{"version":3,"sources":["../src/detect/helpers.ts","../src/detect/index.ts"],"names":["result"],"mappings":"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","file":"chunk-OCYXNLHO.js","sourcesContent":["import { BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_LINHA_LENGTH } from '../core/boleto/constants.js';\nimport { CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH } from '../core/cartao-credito/constants.js';\nimport { CNPJ_LENGTH } from '../core/cnpj/constants.js';\nimport { NFE_CHAVE_LENGTH } from '../core/nfe-chave/constants.js';\nimport { PLACA_LENGTH } from '../core/placa/constants.js';\nimport { detectBoletoInputKind } from '../core/boleto/detect.js';\nimport { isSpRuralIeInput } from '../core/inscricao-estadual/sp-rural.js';\n\nexport function stripDigits(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nexport function stripAlnumUpper(input: string): string {\n return input.replace(/[^A-Za-z0-9]/g, '').toUpperCase();\n}\n\nexport function hasLetters(input: string): boolean {\n return /[A-Za-z]/.test(input);\n}\n\nexport function looksLikeBrCode(input: string): boolean {\n const trimmed = input.trim();\n return trimmed.startsWith('00020') && trimmed.length > 20;\n}\n\nexport function looksLikeBoleto(input: string): boolean {\n const kind = detectBoletoInputKind(input);\n return kind === 'linha-digitavel' || kind === 'codigo-barras';\n}\n\nexport function isBoletoArrecadacao(input: string): boolean {\n return detectBoletoInputKind(input) === 'arrecadacao';\n}\n\nexport function looksLikeNfeChave(input: string): boolean {\n const digits = stripDigits(input);\n return digits.length === NFE_CHAVE_LENGTH && /^\\d+$/.test(digits);\n}\n\nexport function looksLikeCnpjNumeric(input: string): boolean {\n const digits = stripDigits(input);\n return digits.length === CNPJ_LENGTH && /^\\d+$/.test(digits);\n}\n\nexport function looksLikeCnpjAlphanumeric(input: string): boolean {\n const stripped = stripAlnumUpper(input);\n return stripped.length === CNPJ_LENGTH && hasLetters(input);\n}\n\nexport function looksLikeElevenDigits(input: string): boolean {\n const digits = stripDigits(input);\n return digits.length === 11 && /^\\d+$/.test(digits);\n}\n\nexport function looksLikeTituloEleitor(input: string): boolean {\n const digits = stripDigits(input);\n return digits.length === 12 && /^\\d+$/.test(digits);\n}\n\nexport function looksLikeCep(input: string): boolean {\n const digits = stripDigits(input);\n return digits.length === 8 && /^\\d+$/.test(digits);\n}\n\nexport function looksLikePlaca(input: string): boolean {\n const stripped = stripAlnumUpper(input);\n return stripped.length === PLACA_LENGTH && /^[A-Z0-9]+$/.test(stripped);\n}\n\nexport function looksLikeCartao(input: string): boolean {\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return false;\n }\n const digits = stripDigits(input);\n return digits.length >= CARTAO_PAN_MIN_LENGTH && digits.length <= CARTAO_PAN_MAX_LENGTH;\n}\n\nexport function looksLikeIe(input: string, uf?: string): boolean {\n if (!uf) {\n return false;\n }\n if (uf === 'SP' && isSpRuralIeInput(input)) {\n return true;\n }\n const digits = stripDigits(input);\n return digits.length >= 8 && digits.length <= 14;\n}\n\nexport function looksLikePix(input: string): boolean {\n const trimmed = input.trim();\n if (trimmed.includes('@')) {\n return true;\n }\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmed)) {\n return true;\n }\n if (/^\\+?\\d/.test(trimmed)) {\n const digits = stripDigits(trimmed);\n return digits.length === 11 || digits.length === 14;\n }\n return false;\n}\n\nexport function looksLikeTelefone(input: string): boolean {\n const digits = stripDigits(input);\n return digits.length >= 10 && digits.length <= 13;\n}\n\nexport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n};\n","/**\n * Unified document type detection — delegates to existing validators (BR-DETECT-001).\n * @see docs/VALIDATION-RULES.md\n */\nimport { validateBoleto } from '../core/boleto/index.js';\nimport { validateBrCode } from '../core/brcode/index.js';\nimport { validateCartaoCredito } from '../core/cartao-credito/index.js';\nimport { validateCep } from '../core/cep/index.js';\nimport { validateCnh } from '../core/cnh/index.js';\nimport { validateCnpj } from '../core/cnpj/index.js';\nimport { validateCpf } from '../core/cpf/index.js';\nimport { validateInscricaoEstadual } from '../core/inscricao-estadual/index.js';\nimport { validateIeProdutorRural } from '../core/inscricao-estadual/validate-produtor-rural.js';\nimport { isSpRuralIeInput } from '../core/inscricao-estadual/sp-rural.js';\nimport { validateNfeChave } from '../core/nfe-chave/index.js';\nimport { validatePisPasep } from '../core/pis-pasep/index.js';\nimport { validatePlaca } from '../core/placa/index.js';\nimport { validatePixKey } from '../core/pix/index.js';\nimport { validateTelefone } from '../core/telefone/index.js';\nimport { validateTituloEleitor } from '../core/titulo-eleitor/index.js';\nimport {\n isBoletoArrecadacao,\n looksLikeBoleto,\n looksLikeBrCode,\n looksLikeCartao,\n looksLikeCep,\n looksLikeCnpjAlphanumeric,\n looksLikeCnpjNumeric,\n looksLikeElevenDigits,\n looksLikeIe,\n looksLikeNfeChave,\n looksLikePix,\n looksLikePlaca,\n looksLikeTelefone,\n looksLikeTituloEleitor,\n} from './helpers.js';\nimport type { DocumentFormat, UfCode, ValidationErrorCode } from '../types/validation-result.js';\n\nexport type DetectableDocumentType =\n | 'cpf'\n | 'cnpj'\n | 'cep'\n | 'placa'\n | 'pis-pasep'\n | 'pix'\n | 'telefone'\n | 'boleto'\n | 'cartao-credito'\n | 'cnh'\n | 'renavam'\n | 'nfe-chave'\n | 'titulo-eleitor'\n | 'inscricao-estadual'\n | 'inscricao-estadual-produtor-rural'\n | 'brcode'\n | 'unknown';\n\nexport type DetectOptions = {\n uf?: UfCode;\n};\n\nexport type DetectSuccess = {\n type: DetectableDocumentType;\n ok: true;\n value: string;\n format?: DocumentFormat;\n meta?: Record<string, unknown>;\n};\n\nexport type DetectFailure = {\n type: DetectableDocumentType;\n ok: false;\n code: ValidationErrorCode;\n message: string;\n};\n\nexport type DetectResult = DetectSuccess | DetectFailure;\n\ntype Candidate = {\n canTry: (raw: string, options: DetectOptions) => boolean;\n detect: (raw: string, options: DetectOptions) => DetectResult | null;\n};\n\n/** @internal Test hook for success result branches. */\nexport function buildDetectSuccess(\n type: DetectableDocumentType,\n value: string,\n format?: DocumentFormat,\n meta?: Record<string, unknown>,\n): DetectResult {\n return success(type, value, format, meta);\n}\n\nfunction success(\n type: DetectableDocumentType,\n value: string,\n format?: DocumentFormat,\n meta?: Record<string, unknown>,\n): DetectResult {\n return { type, ok: true, value, ...(format ? { format } : {}), ...(meta ? { meta } : {}) };\n}\n\nfunction tryValidators(attempts: Array<() => DetectResult | null>): DetectResult | null {\n for (const attempt of attempts) {\n const result = attempt();\n if (result) {\n return result;\n }\n }\n return null;\n}\n\nconst CANDIDATES: Candidate[] = [\n {\n canTry: (raw) => looksLikeBoleto(raw) && !isBoletoArrecadacao(raw),\n detect: (raw) => {\n const result = validateBoleto(raw);\n if (!result.ok) {\n return null;\n }\n return success('boleto', result.value, result.format, {\n inputKind: result.inputKind,\n situacao: result.situacao,\n });\n },\n },\n {\n canTry: (raw) => looksLikeNfeChave(raw),\n detect: (raw) => {\n const result = validateNfeChave(raw);\n if (!result.ok) {\n return null;\n }\n return success('nfe-chave', result.value, result.format, {\n parsed: result.parsed,\n uf: result.uf,\n });\n },\n },\n {\n canTry: (raw) => looksLikeBrCode(raw),\n detect: (raw) => {\n const result = validateBrCode(raw);\n if (!result.ok) {\n return null;\n }\n return success('brcode', result.value, result.format, {\n merchantName: result.merchantName,\n merchantCity: result.merchantCity,\n pixKey: result.pixKey,\n pixKeyType: result.pixKeyType,\n });\n },\n },\n {\n canTry: (raw) => looksLikeCnpjAlphanumeric(raw),\n detect: (raw) => {\n const result = validateCnpj(raw);\n if (!result.ok) {\n return null;\n }\n return success('cnpj', result.value, result.format);\n },\n },\n {\n canTry: (raw) => looksLikeCnpjNumeric(raw),\n detect: (raw) => {\n const result = validateCnpj(raw);\n if (!result.ok) {\n return null;\n }\n return success('cnpj', result.value, result.format);\n },\n },\n {\n canTry: (raw) => looksLikeElevenDigits(raw),\n detect: (raw) =>\n tryValidators([\n () => {\n const result = validateCpf(raw);\n return result.ok ? success('cpf', result.value, result.format) : null;\n },\n () => {\n const result = validateCnh(raw);\n return result.ok ? success('cnh', result.value, result.format) : null;\n },\n () => {\n const result = validatePisPasep(raw);\n return result.ok ? success('pis-pasep', result.value, result.format) : null;\n },\n ]),\n },\n {\n canTry: (raw) => looksLikeTituloEleitor(raw),\n detect: (raw) => {\n const result = validateTituloEleitor(raw);\n if (!result.ok) {\n return null;\n }\n return success('titulo-eleitor', result.value, result.format, {\n ufCode: result.ufCode,\n ...(result.uf ? { uf: result.uf } : {}),\n ...(result.exterior ? { exterior: result.exterior } : {}),\n });\n },\n },\n {\n canTry: (raw) => looksLikeCep(raw),\n detect: (raw) => {\n const result = validateCep(raw);\n if (!result.ok) {\n return null;\n }\n return success('cep', result.value, result.format);\n },\n },\n {\n canTry: (raw) => looksLikePlaca(raw),\n detect: (raw) => {\n const result = validatePlaca(raw);\n if (!result.ok) {\n return null;\n }\n return success('placa', result.value, result.format);\n },\n },\n {\n canTry: (raw) => looksLikePix(raw),\n detect: (raw) => {\n const result = validatePixKey(raw);\n if (!result.ok) {\n return null;\n }\n return success('pix', result.value, result.format, { keyType: result.keyType });\n },\n },\n {\n canTry: (raw) => looksLikeTelefone(raw),\n detect: (raw) => {\n const result = validateTelefone(raw);\n if (!result.ok) {\n return null;\n }\n return success('telefone', result.value, result.format, { tipo: result.tipo });\n },\n },\n {\n canTry: (raw) => looksLikeCartao(raw),\n detect: (raw) => {\n const result = validateCartaoCredito(raw);\n if (!result.ok) {\n return null;\n }\n return success('cartao-credito', result.value, result.format, { brand: result.brand });\n },\n },\n {\n canTry: (raw, options) => looksLikeIe(raw, options.uf),\n detect: (raw, options) => {\n const uf = options.uf as UfCode;\n if (uf === 'SP' && isSpRuralIeInput(raw)) {\n const result = validateIeProdutorRural(uf, raw);\n if (!result.ok) {\n return null;\n }\n return success('inscricao-estadual-produtor-rural', result.value, result.format, { uf: result.uf });\n }\n const result = validateInscricaoEstadual(raw, { uf });\n if (!result.ok) {\n return null;\n }\n return success('inscricao-estadual', result.value, result.format, { uf: result.uf });\n },\n },\n];\n\nexport function detect(raw: string, options: DetectOptions = {}): DetectResult {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return {\n type: 'unknown',\n ok: false,\n code: 'EMPTY_INPUT',\n message: 'Input is empty',\n };\n }\n\n for (const candidate of CANDIDATES) {\n if (!candidate.canTry(trimmed, options)) {\n continue;\n }\n const result = candidate.detect(trimmed, options);\n if (result?.ok) {\n return result;\n }\n }\n\n return {\n type: 'unknown',\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: options.uf\n ? 'No supported document type matched the input'\n : 'No supported document type matched the input; provide options.uf for Inscrição Estadual detection',\n };\n}\n"]}
// src/core/cnpj/modulo11.ts
function modulo11CheckDigit(sum) {
const remainder = sum % 11;
return remainder < 2 ? 0 : 11 - remainder;
}
function weightedSum(values, weights) {
let sum = 0;
for (let i = 0; i < weights.length; i++) {
sum += values[i] * weights[i];
}
return sum;
}
function computeCheckDigit(chars, weights, valueFn) {
const values = [];
for (let i = 0; i < chars.length; i++) {
values.push(valueFn(chars.charAt(i)));
}
return modulo11CheckDigit(weightedSum(values, weights));
}
export { computeCheckDigit, weightedSum };
//# sourceMappingURL=chunk-OTZHMJYE.js.map
//# sourceMappingURL=chunk-OTZHMJYE.js.map
{"version":3,"sources":["../src/core/cnpj/modulo11.ts"],"names":[],"mappings":";AAIO,SAAS,mBAAmB,GAAA,EAAqB;AACtD,EAAA,MAAM,YAAY,GAAA,GAAM,EAAA;AACxB,EAAA,OAAO,SAAA,GAAY,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,SAAA;AAClC;AAEO,SAAS,WAAA,CAAY,QAAkB,OAAA,EAAoC;AAChF,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,GAAA,IAAO,MAAA,CAAO,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,KAAA,EAAe,OAAA,EAA4B,OAAA,EAAwC;AACnH,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,CAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,kBAAA,CAAmB,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAC,CAAA;AACxD","file":"chunk-OTZHMJYE.js","sourcesContent":["/**\n * Modulo 11 check digit — RFB Q14 remainder rule.\n * @see https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf\n */\nexport function modulo11CheckDigit(sum: number): number {\n const remainder = sum % 11;\n return remainder < 2 ? 0 : 11 - remainder;\n}\n\nexport function weightedSum(values: number[], weights: readonly number[]): number {\n let sum = 0;\n for (let i = 0; i < weights.length; i++) {\n sum += values[i] * weights[i];\n }\n return sum;\n}\n\nexport function computeCheckDigit(chars: string, weights: readonly number[], valueFn: (c: string) => number): number {\n const values: number[] = [];\n for (let i = 0; i < chars.length; i++) {\n values.push(valueFn(chars.charAt(i)));\n }\n return modulo11CheckDigit(weightedSum(values, weights));\n}\n"]}
//# sourceMappingURL=chunk-P55H5YRX.js.map
//# sourceMappingURL=chunk-P55H5YRX.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-P55H5YRX.js"}
import { validateTituloEleitor, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED } from './chunk-MLPXW7N2.js';
// src/core/titulo-eleitor/mask.ts
function applyTituloEleitorMask(canonical) {
if (TITULO_ELEITOR_NUMERIC_PATTERN_12.test(canonical)) {
return `${canonical.slice(0, 4)} ${canonical.slice(4, 8)} ${canonical.slice(8)}`;
}
if (TITULO_ELEITOR_NUMERIC_PATTERN_13.test(canonical)) {
return `${canonical.slice(0, 5)} ${canonical.slice(5, 9)} ${canonical.slice(9)}`;
}
throw new Error(
`T\xEDtulo de Eleitor must have exactly ${TITULO_ELEITOR_LENGTH} or ${TITULO_ELEITOR_LENGTH_EXTENDED} digits to format`
);
}
// src/format/titulo-eleitor.ts
function formatTituloEleitor(input) {
const result = validateTituloEleitor(input);
if (!result.ok) {
return { ok: false, code: result.code, message: result.message };
}
return { ok: true, formatted: applyTituloEleitorMask(result.value) };
}
export { formatTituloEleitor };
//# sourceMappingURL=chunk-PB4RIS6G.js.map
//# sourceMappingURL=chunk-PB4RIS6G.js.map
{"version":3,"sources":["../src/core/titulo-eleitor/mask.ts","../src/format/titulo-eleitor.ts"],"names":[],"mappings":";;;AAWO,SAAS,uBAAuB,SAAA,EAA2B;AAChE,EAAA,IAAI,iCAAA,CAAkC,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,GAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,iCAAA,CAAkC,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,GAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,uCAAA,EAAuC,qBAAqB,CAAA,IAAA,EAAO,8BAA8B,CAAA,iBAAA;AAAA,GACnG;AACF;;;ACjBO,SAAS,oBAAoB,KAAA,EAA6B;AAC/D,EAAA,MAAM,MAAA,GAAS,sBAAsB,KAAK,CAAA;AAC1C,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,sBAAA,CAAuB,MAAA,CAAO,KAAK,CAAA,EAAE;AACrE","file":"chunk-PB4RIS6G.js","sourcesContent":["import {\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_NUMERIC_PATTERN_12,\n TITULO_ELEITOR_NUMERIC_PATTERN_13,\n} from './constants.js';\n\n/**\n * Display mask — `XXXX XXXX XXXX` (BR-TITULO-005).\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n */\nexport function applyTituloEleitorMask(canonical: string): string {\n if (TITULO_ELEITOR_NUMERIC_PATTERN_12.test(canonical)) {\n return `${canonical.slice(0, 4)} ${canonical.slice(4, 8)} ${canonical.slice(8)}`;\n }\n if (TITULO_ELEITOR_NUMERIC_PATTERN_13.test(canonical)) {\n return `${canonical.slice(0, 5)} ${canonical.slice(5, 9)} ${canonical.slice(9)}`;\n }\n throw new Error(\n `Título de Eleitor must have exactly ${TITULO_ELEITOR_LENGTH} or ${TITULO_ELEITOR_LENGTH_EXTENDED} digits to format`,\n );\n}\n","import { applyTituloEleitorMask } from '../core/titulo-eleitor/mask.js';\nimport { validateTituloEleitor } from '../core/titulo-eleitor/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatTituloEleitor(input: string): FormatResult {\n const result = validateTituloEleitor(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyTituloEleitorMask(result.value) };\n}\n"]}
//# sourceMappingURL=chunk-QGMVUIDD.js.map
//# sourceMappingURL=chunk-QGMVUIDD.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-QGMVUIDD.js"}
//# sourceMappingURL=chunk-RYGAK7PB.js.map
//# sourceMappingURL=chunk-RYGAK7PB.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-RYGAK7PB.js"}
import { stripCnh } from './chunk-YYHS5WQN.js';
import { weightedSum } from './chunk-OTZHMJYE.js';
import { brandCnh } from './chunk-MSLJF2FM.js';
// src/core/cnh/constants.ts
var CNH_DV1_WEIGHTS = [9, 8, 7, 6, 5, 4, 3, 2, 1];
var CNH_DV2_WEIGHTS = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var CNH_LENGTH = 11;
var CNH_BASE_LENGTH = 9;
var CNH_NUMERIC_PATTERN = /^\d{11}$/;
var CNH_GOLDEN_PRIMARY = "62472927637";
var CNH_GOLDEN_SECONDARY = "69044271146";
var CNH_GOLDEN_DISCOUNT_CASE = "00000001801";
var CNH_GOLDEN_PRIMARY_DECORATED_INPUT = "624.729.276-37";
var CNH_OFFICIAL_SOURCE_URL = "https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf";
var CNH_SENATRAN_VALIDAR_URL = "https://www.gov.br/pt-br/servicos/validar-cnh";
// src/core/cnh/check-digits.ts
function digitValues(chars) {
const values = [];
for (let i = 0; i < chars.length; i++) {
values.push(Number(chars.charAt(i)));
}
return values;
}
function computeCnhFirstCheckDigit(base) {
const remainder = weightedSum(digitValues(base), CNH_DV1_WEIGHTS) % 11;
if (remainder >= 10) {
return { dv: 0, discount: 2 };
}
return { dv: remainder, discount: 0 };
}
function computeCnhSecondCheckDigit(base, discount) {
let dv = weightedSum(digitValues(base), CNH_DV2_WEIGHTS) % 11;
if (discount === 2) {
if (dv - 2 < 0) {
dv += 9;
} else {
dv -= 2;
}
}
if (dv > 9) {
dv = 0;
}
return dv;
}
function computeCnhCheckDigits(base) {
const { dv: dv1, discount } = computeCnhFirstCheckDigit(base);
const dv2 = computeCnhSecondCheckDigit(base, discount);
return `${String(dv1)}${String(dv2)}`;
}
// src/core/cnh/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 isValidCnhChecksum(stripped) {
const base = stripped.slice(0, CNH_BASE_LENGTH);
const expected = computeCnhCheckDigits(base);
return stripped.slice(CNH_BASE_LENGTH) === expected;
}
function validateStructure(input, stripped) {
if (stripped.length === 0) {
return failure("EMPTY_INPUT", "CNH input is empty");
}
const withoutMask = input.replace(/[.\s-]/g, "");
if (/[^0-9]/.test(withoutMask)) {
return failure("INVALID_CHARACTER", "CNH contains invalid characters");
}
if (stripped.length !== CNH_LENGTH) {
return failure("INVALID_LENGTH", `CNH must have ${CNH_LENGTH} digits after normalization`);
}
if (hasRepeatedDigits(stripped)) {
return failure("KNOWN_INVALID_PATTERN", "CNH with all identical digits is invalid");
}
return null;
}
function isValidCnh(input) {
return validateCnh(input).ok;
}
function validateCnh(input) {
const stripped = stripCnh(input);
const structural = validateStructure(input, stripped);
if (structural) {
return structural;
}
if (isValidCnhChecksum(stripped)) {
return { ok: true, value: brandCnh(stripped), format: "numeric" };
}
return failure("INVALID_CHECK_DIGIT", "CNH check digits are invalid");
}
export { CNH_BASE_LENGTH, CNH_DV1_WEIGHTS, CNH_DV2_WEIGHTS, CNH_GOLDEN_DISCOUNT_CASE, CNH_GOLDEN_PRIMARY, CNH_GOLDEN_PRIMARY_DECORATED_INPUT, CNH_GOLDEN_SECONDARY, CNH_LENGTH, CNH_NUMERIC_PATTERN, CNH_OFFICIAL_SOURCE_URL, CNH_SENATRAN_VALIDAR_URL, computeCnhCheckDigits, isValidCnh, validateCnh };
//# sourceMappingURL=chunk-US4OLTJ2.js.map
//# sourceMappingURL=chunk-US4OLTJ2.js.map
{"version":3,"sources":["../src/core/cnh/constants.ts","../src/core/cnh/check-digits.ts","../src/core/cnh/index.ts"],"names":[],"mappings":";;;;;AASO,IAAM,eAAA,GAAkB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC;AAClD,IAAM,eAAA,GAAkB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC;AAClD,IAAM,UAAA,GAAa;AACnB,IAAM,eAAA,GAAkB;AACxB,IAAM,mBAAA,GAAsB;AAG5B,IAAM,kBAAA,GAAqB;AAC3B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,wBAAA,GAA2B;AAGjC,IAAM,kCAAA,GAAqC;AAE3C,IAAM,uBAAA,GACX;AAGK,IAAM,wBAAA,GAA2B;;;AClBxC,SAAS,YAAY,KAAA,EAAyB;AAC5C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,CAAO,KAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,0BAA0B,IAAA,EAAgD;AACxF,EAAA,MAAM,YAAY,WAAA,CAAY,WAAA,CAAY,IAAI,CAAA,EAAG,eAAe,CAAA,GAAI,EAAA;AACpE,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO,EAAE,EAAA,EAAI,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AAAA,EAC9B;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,QAAA,EAAU,CAAA,EAAE;AACtC;AAEO,SAAS,0BAAA,CAA2B,MAAc,QAAA,EAA0B;AACjF,EAAA,IAAI,KAAK,WAAA,CAAY,WAAA,CAAY,IAAI,CAAA,EAAG,eAAe,CAAA,GAAI,EAAA;AAC3D,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,IAAI,EAAA,GAAK,IAAI,CAAA,EAAG;AACd,MAAA,EAAA,IAAM,CAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,EAAA,IAAM,CAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,IAAI,KAAK,CAAA,EAAG;AACV,IAAA,EAAA,GAAK,CAAA;AAAA,EACP;AACA,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,sBAAsB,IAAA,EAAsB;AAC1D,EAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAK,QAAA,EAAS,GAAI,0BAA0B,IAAI,CAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,0BAAA,CAA2B,IAAA,EAAM,QAAQ,CAAA;AACrD,EAAA,OAAO,GAAG,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AACrC;;;ACjBA,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;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;AAEA,SAAS,mBAAmB,QAAA,EAA2B;AACrD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,sBAAsB,IAAI,CAAA;AAC3C,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,eAAe,CAAA,KAAM,QAAA;AAC7C;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,SAAA,EAAW,EAAE,CAAA;AAC/C,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,IAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAC/B,IAAA,OAAO,OAAA,CAAQ,yBAAyB,0CAA0C,CAAA;AAAA,EACpF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,EAAA;AAC5B;AAEO,SAAS,YAAY,KAAA,EAAsC;AAChE,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,IAAI,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAChC,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,SAAS,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAAA,EAClE;AAEA,EAAA,OAAO,OAAA,CAAQ,uBAAuB,8BAA8B,CAAA;AACtE","file":"chunk-US4OLTJ2.js","sourcesContent":["/**\n * CNH constants — Registro Nacional modulo 11 (CONTRAN / SENATRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/Resolucao8862021.pdf\n * @see https://www.gov.br/pt-br/servicos/validar-cnh\n * @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-cnh/ — algorithm cross-check (AdvPL)\n * @see https://www.geravalida.com.br/validador-cnh — implementation cross-check\n * @see https://geradorbr.com/validador-de-cnh/ — implementation cross-check\n */\nexport const CNH_DV1_WEIGHTS = [9, 8, 7, 6, 5, 4, 3, 2, 1] as const;\nexport const CNH_DV2_WEIGHTS = [1, 2, 3, 4, 5, 6, 7, 8, 9] as const;\nexport const CNH_LENGTH = 11;\nexport const CNH_BASE_LENGTH = 9;\nexport const CNH_NUMERIC_PATTERN = /^\\d{11}$/;\n\n/** Golden primary — DV walkthrough: base `624729276` → DV `37`. */\nexport const CNH_GOLDEN_PRIMARY = '62472927637';\nexport const CNH_GOLDEN_SECONDARY = '69044271146';\nexport const CNH_GOLDEN_DISCOUNT_CASE = '00000001801';\n\n/** Non-official CPF-style decoration — accepted on input via strip, never emitted by format. */\nexport const CNH_GOLDEN_PRIMARY_DECORATED_INPUT = '624.729.276-37';\n\nexport const CNH_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf';\n\n/** SENATRAN online validation — requires plain 11-digit registration number. */\nexport const CNH_SENATRAN_VALIDAR_URL = 'https://www.gov.br/pt-br/servicos/validar-cnh';\n","/**\n * CNH check digits — modulo 11 with inter-DV discount (desconto).\n * DV1 and DV2 weighted sums are computed in parallel on the same 9 base digits.\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf\n * @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-cnh/ — algorithm cross-check (AdvPL)\n */\nimport { weightedSum } from '../cnpj/modulo11.js';\nimport { CNH_DV1_WEIGHTS, CNH_DV2_WEIGHTS } from './constants.js';\n\nfunction digitValues(chars: string): number[] {\n const values: number[] = [];\n for (let i = 0; i < chars.length; i++) {\n values.push(Number(chars.charAt(i)));\n }\n return values;\n}\n\nexport function computeCnhFirstCheckDigit(base: string): { dv: number; discount: number } {\n const remainder = weightedSum(digitValues(base), CNH_DV1_WEIGHTS) % 11;\n if (remainder >= 10) {\n return { dv: 0, discount: 2 };\n }\n return { dv: remainder, discount: 0 };\n}\n\nexport function computeCnhSecondCheckDigit(base: string, discount: number): number {\n let dv = weightedSum(digitValues(base), CNH_DV2_WEIGHTS) % 11;\n if (discount === 2) {\n if (dv - 2 < 0) {\n dv += 9;\n } else {\n dv -= 2;\n }\n }\n if (dv > 9) {\n dv = 0;\n }\n return dv;\n}\n\nexport function computeCnhCheckDigits(base: string): string {\n const { dv: dv1, discount } = computeCnhFirstCheckDigit(base);\n const dv2 = computeCnhSecondCheckDigit(base, discount);\n return `${String(dv1)}${String(dv2)}`;\n}\n","/**\n * CNH validation — Registro Nacional modulo 11 with inter-DV discount.\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf\n * @see https://www.gov.br/infraestrutura/pt-br/assuntos/transito/senatran\n */\nimport { stripCnh } from '../../strip/index.js';\nimport type { Cnh, ValidationResult } from '../../types/validation-result.js';\nimport { brandCnh } from '../../types/validation-result.js';\nimport { computeCnhCheckDigits } from './check-digits.js';\nimport { CNH_BASE_LENGTH, CNH_LENGTH } from './constants.js';\n\nexport {\n CNH_BASE_LENGTH,\n CNH_DV1_WEIGHTS,\n CNH_DV2_WEIGHTS,\n CNH_GOLDEN_DISCOUNT_CASE,\n CNH_GOLDEN_PRIMARY,\n CNH_GOLDEN_PRIMARY_DECORATED_INPUT,\n CNH_GOLDEN_SECONDARY,\n CNH_LENGTH,\n CNH_NUMERIC_PATTERN,\n CNH_OFFICIAL_SOURCE_URL,\n CNH_SENATRAN_VALIDAR_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 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 isValidCnhChecksum(stripped: string): boolean {\n const base = stripped.slice(0, CNH_BASE_LENGTH);\n const expected = computeCnhCheckDigits(base);\n return stripped.slice(CNH_BASE_LENGTH) === expected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CNH input is empty');\n }\n\n const withoutMask = input.replace(/[.\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CNH contains invalid characters');\n }\n\n if (stripped.length !== CNH_LENGTH) {\n return failure('INVALID_LENGTH', `CNH must have ${CNH_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'CNH with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidCnh(input: string): boolean {\n return validateCnh(input).ok;\n}\n\nexport function validateCnh(input: string): ValidationResult<Cnh> {\n const stripped = stripCnh(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidCnhChecksum(stripped)) {\n return { ok: true, value: brandCnh(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'CNH check digits are invalid');\n}\n"]}
import { validatePixKey } from './chunk-MK7OJUF5.js';
import { brandBrCodePayload } from './chunk-MSLJF2FM.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-WCQUQ2WX.js.map
//# sourceMappingURL=chunk-WCQUQ2WX.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-WCQUQ2WX.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 { stripRenavam } from './chunk-YYHS5WQN.js';
import { weightedSum } from './chunk-OTZHMJYE.js';
import { brandRenavam } from './chunk-MSLJF2FM.js';
// src/core/renavam/constants.ts
var RENAVAM_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
var RENAVAM_LENGTH = 11;
var RENAVAM_BASE_LENGTH = 10;
var RENAVAM_NUMERIC_PATTERN = /^\d{11}$/;
var RENAVAM_GOLDEN_PRIMARY = "63977791104";
var RENAVAM_GOLDEN_SECONDARY = "72176426415";
var RENAVAM_GOLDEN_LEADING_ZEROS = "00207104255";
var RENAVAM_GOLDEN_DV_ZERO = "12345678900";
var RENAVAM_GOLDEN_DASH_INPUT = "7217642641-5";
var RENAVAM_OFFICIAL_SOURCE_URL = "https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf";
var RENAVAM_SENATRAN_CONSULTA_URL = "https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam";
// src/core/renavam/check-digits.ts
function digitValue(char) {
return Number(char);
}
function computeRenavamWeightedSum(base) {
const values = base.split("").map(digitValue);
return weightedSum(values, RENAVAM_DV_WEIGHTS);
}
function computeRenavamCheckDigit(base) {
const remainder = computeRenavamWeightedSum(base) % 11;
let dv = 11 - remainder;
if (dv > 9) {
dv = 0;
}
return dv;
}
// src/core/renavam/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 isValidRenavamChecksum(stripped) {
const base = stripped.slice(0, RENAVAM_BASE_LENGTH);
const expected = String(computeRenavamCheckDigit(base));
return stripped.charAt(RENAVAM_BASE_LENGTH) === expected;
}
function validateStructure(input, stripped) {
if (stripped.length === 0) {
return failure("EMPTY_INPUT", "RENAVAM input is empty");
}
const withoutMask = input.replace(/-/g, "");
if (/[^0-9]/.test(withoutMask)) {
return failure("INVALID_CHARACTER", "RENAVAM contains invalid characters");
}
if (stripped.length !== RENAVAM_LENGTH) {
return failure("INVALID_LENGTH", `RENAVAM must have ${RENAVAM_LENGTH} digits after normalization`);
}
if (hasRepeatedDigits(stripped)) {
return failure("KNOWN_INVALID_PATTERN", "RENAVAM with all identical digits is invalid");
}
return null;
}
function isValidRenavam(input) {
return validateRenavam(input).ok;
}
function validateRenavam(input) {
const stripped = stripRenavam(input);
const structural = validateStructure(input, stripped);
if (structural) {
return structural;
}
if (isValidRenavamChecksum(stripped)) {
return { ok: true, value: brandRenavam(stripped), format: "numeric" };
}
return failure("INVALID_CHECK_DIGIT", "RENAVAM check digit is invalid");
}
export { RENAVAM_BASE_LENGTH, RENAVAM_DV_WEIGHTS, RENAVAM_GOLDEN_DASH_INPUT, RENAVAM_GOLDEN_DV_ZERO, RENAVAM_GOLDEN_LEADING_ZEROS, RENAVAM_GOLDEN_PRIMARY, RENAVAM_GOLDEN_SECONDARY, RENAVAM_LENGTH, RENAVAM_NUMERIC_PATTERN, RENAVAM_OFFICIAL_SOURCE_URL, RENAVAM_SENATRAN_CONSULTA_URL, computeRenavamCheckDigit, isValidRenavam, validateRenavam };
//# sourceMappingURL=chunk-WLE2ENQA.js.map
//# sourceMappingURL=chunk-WLE2ENQA.js.map
{"version":3,"sources":["../src/core/renavam/constants.ts","../src/core/renavam/check-digits.ts","../src/core/renavam/index.ts"],"names":[],"mappings":"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","file":"chunk-WLE2ENQA.js","sourcesContent":["/**\n * RENAVAM constants — modulo 11, peso 9 (DENATRAN / SENATRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n * @see https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam\n * @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-renavam/ — algorithm cross-check (AdvPL)\n * @see https://www.geravalida.com.br/gerador-de-renavam — implementation cross-check\n * @see https://geradorfacil.com/geradores/renavam — implementation cross-check\n */\nexport const RENAVAM_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const RENAVAM_LENGTH = 11;\nexport const RENAVAM_BASE_LENGTH = 10;\nexport const RENAVAM_NUMERIC_PATTERN = /^\\d{11}$/;\n\n/** Golden primary — DV walkthrough: base `6397779110` → DV `4`. */\nexport const RENAVAM_GOLDEN_PRIMARY = '63977791104';\nexport const RENAVAM_GOLDEN_SECONDARY = '72176426415';\nexport const RENAVAM_GOLDEN_LEADING_ZEROS = '00207104255';\nexport const RENAVAM_GOLDEN_DV_ZERO = '12345678900';\n\n/** Optional dash before check digit — accepted on input via strip, never emitted by format. */\nexport const RENAVAM_GOLDEN_DASH_INPUT = '7217642641-5';\n\nexport const RENAVAM_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf';\n\n/** SENATRAN online vehicle lookup — requires RENAVAM + plate + owner CPF/CNPJ. */\nexport const RENAVAM_SENATRAN_CONSULTA_URL =\n 'https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam';\n","/**\n * RENAVAM check digit — modulo 11, peso 9 (Portaria DENATRAN 27/2013).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n * @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-renavam/ — algorithm cross-check (AdvPL)\n */\nimport { weightedSum } from '../cnpj/modulo11.js';\nimport { RENAVAM_DV_WEIGHTS } from './constants.js';\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nexport function computeRenavamWeightedSum(base: string): number {\n const values = base.split('').map(digitValue);\n return weightedSum(values, RENAVAM_DV_WEIGHTS);\n}\n\nexport function computeRenavamCheckDigit(base: string): number {\n const remainder = computeRenavamWeightedSum(base) % 11;\n let dv = 11 - remainder;\n if (dv > 9) {\n dv = 0;\n }\n return dv;\n}\n","/**\n * RENAVAM validation — modulo 11, peso 9 (DENATRAN / SENATRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n * @see https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam\n */\nimport { stripRenavam } from '../../strip/index.js';\nimport type { Renavam, ValidationResult } from '../../types/validation-result.js';\nimport { brandRenavam } from '../../types/validation-result.js';\nimport { computeRenavamCheckDigit } from './check-digits.js';\nimport { RENAVAM_BASE_LENGTH, RENAVAM_LENGTH } from './constants.js';\n\nexport {\n RENAVAM_BASE_LENGTH,\n RENAVAM_DV_WEIGHTS,\n RENAVAM_GOLDEN_DASH_INPUT,\n RENAVAM_GOLDEN_DV_ZERO,\n RENAVAM_GOLDEN_LEADING_ZEROS,\n RENAVAM_GOLDEN_PRIMARY,\n RENAVAM_GOLDEN_SECONDARY,\n RENAVAM_LENGTH,\n RENAVAM_NUMERIC_PATTERN,\n RENAVAM_OFFICIAL_SOURCE_URL,\n RENAVAM_SENATRAN_CONSULTA_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 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 isValidRenavamChecksum(stripped: string): boolean {\n const base = stripped.slice(0, RENAVAM_BASE_LENGTH);\n const expected = String(computeRenavamCheckDigit(base));\n return stripped.charAt(RENAVAM_BASE_LENGTH) === expected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'RENAVAM input is empty');\n }\n\n const withoutMask = input.replace(/-/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'RENAVAM contains invalid characters');\n }\n\n if (stripped.length !== RENAVAM_LENGTH) {\n return failure('INVALID_LENGTH', `RENAVAM must have ${RENAVAM_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'RENAVAM with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidRenavam(input: string): boolean {\n return validateRenavam(input).ok;\n}\n\nexport function validateRenavam(input: string): ValidationResult<Renavam> {\n const stripped = stripRenavam(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidRenavamChecksum(stripped)) {\n return { ok: true, value: brandRenavam(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'RENAVAM check digit is invalid');\n}\n"]}
import { stripPlaca } from './chunk-YYHS5WQN.js';
import { brandPlaca } from './chunk-MSLJF2FM.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 };
}
export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_LEGACY_PATTERN, PLACA_LENGTH, PLACA_MERCOSUL_PATTERN, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca };
//# sourceMappingURL=chunk-WPL47PWJ.js.map
//# sourceMappingURL=chunk-WPL47PWJ.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"],"names":["failure"],"mappings":"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","file":"chunk-WPL47PWJ.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 { validateCartaoCredito, applyCartaoCreditoMask } from './chunk-EPKHEW5V.js';
// 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 { formatCartaoCredito };
//# sourceMappingURL=chunk-XKY2CV3G.js.map
//# sourceMappingURL=chunk-XKY2CV3G.js.map
{"version":3,"sources":["../src/format/cartao-credito.ts"],"names":[],"mappings":";;;AAIO,SAAS,oBAAoB,KAAA,EAA6B;AAC/D,EAAA,MAAM,MAAA,GAAS,sBAAsB,KAAK,CAAA;AAC1C,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,sBAAA,CAAuB,MAAA,CAAO,KAAK,CAAA,EAAE;AACrE","file":"chunk-XKY2CV3G.js","sourcesContent":["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 { CNPJ_MASK_PATTERN } from './chunk-YXELVV37.js';
// 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 { applyCnpjMask };
//# sourceMappingURL=chunk-XUO7FV6Z.js.map
//# sourceMappingURL=chunk-XUO7FV6Z.js.map
{"version":3,"sources":["../src/core/cnpj/mask.ts"],"names":[],"mappings":";;;AAGO,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-XUO7FV6Z.js","sourcesContent":["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"]}
//# sourceMappingURL=chunk-Y2KUN2D3.js.map
//# sourceMappingURL=chunk-Y2KUN2D3.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-Y2KUN2D3.js"}
import { brandInscricaoEstadualProdutorRural } from './chunk-MSLJF2FM.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_SP_RURAL_LENGTH = 13;
var IE_SP_RURAL_GOLDEN = "P011004243002";
var IE_SP_RURAL_GOLDEN_MASKED = "P-01100424.3/002";
var IE_SP_RURAL_OFFICIAL_SOURCE_URL = "http://www.sintegra.gov.br/Cad_Estados/cad_SP.html";
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/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/sp-rural.ts
var SP_RURAL_MASK_PATTERN = /^[Pp0-9.\-\s/]+$/;
function failure(code, message) {
return { ok: false, code, message, uf: "SP" };
}
function isSpRuralIeInput(input) {
return /^[Pp]/.test(input.trim());
}
function stripIeSpRural(input) {
const trimmed = input.trim().toUpperCase();
const digits = trimmed.replace(/^[P]/, "").replace(/\D/g, "");
return `P${digits}`;
}
function validateIeSpRural(input) {
const trimmed = input.trim();
if (trimmed.length === 0) {
return { ok: false, code: "EMPTY_INPUT", message: "Inscri\xE7\xE3o Estadual produtor rural input is empty", uf: "SP" };
}
if (!/^[Pp]/.test(trimmed)) {
return failure("INVALID_CHARACTER", "SP produtor rural Inscri\xE7\xE3o Estadual must start with P");
}
if (!SP_RURAL_MASK_PATTERN.test(trimmed)) {
return failure("INVALID_CHARACTER", "SP produtor rural Inscri\xE7\xE3o Estadual contains invalid characters");
}
const stripped = stripIeSpRural(trimmed);
if (stripped.length !== IE_SP_RURAL_LENGTH) {
return failure(
"INVALID_LENGTH",
`SP produtor rural Inscri\xE7\xE3o Estadual must have ${IE_SP_RURAL_LENGTH} characters after normalization`
);
}
const dvInput = stripped.slice(1, 9);
const expectedDv = computeIeSpCheckDigit(dvInput, IE_SP_DV1_WEIGHTS);
const actualDv = Number(stripped.charAt(9));
if (actualDv !== expectedDv) {
return failure("INVALID_CHECK_DIGIT", "SP produtor rural Inscri\xE7\xE3o Estadual check digit is invalid");
}
return {
ok: true,
value: brandInscricaoEstadualProdutorRural(stripped),
uf: "SP",
format: "inscricao-estadual-produtor-rural"
};
}
// src/core/inscricao-estadual/validate-produtor-rural.ts
function failure2(code, message, uf) {
return { ok: false, code, message, uf };
}
function getIeProdutorRuralOfficialSourceUrl() {
return IE_SP_RURAL_OFFICIAL_SOURCE_URL;
}
function isValidIeProdutorRural(uf, input) {
return validateIeProdutorRural(uf, input).ok;
}
function validateIeProdutorRural(uf, input) {
if (uf !== "SP") {
return failure2(
"UNSUPPORTED_FORMAT",
"Produtor rural Inscri\xE7\xE3o Estadual validation is supported for SP only; use validateInscricaoEstadual for other UFs",
uf
);
}
return validateIeSpRural(input);
}
// 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 applyIeSpRuralMask(stripped) {
if (stripped.length !== IE_SP_RURAL_LENGTH || !stripped.startsWith("P")) {
throw new Error("SP produtor rural IE must have exactly 13 characters starting with P to apply mask");
}
const body = stripped.slice(1);
return `P-${body.slice(0, 8)}.${body.charAt(8)}/${body.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)}`;
}
export { IE_AC_PREFIX, IE_AL_PREFIX, IE_AP_PREFIX, IE_DF_DV1_WEIGHTS, IE_DF_DV2_WEIGHTS, IE_DF_GOLDEN, IE_DF_GOLDEN_MASKED, IE_DF_LENGTH, IE_DF_OFFICIAL_SOURCE_URL, IE_DF_PREFIX, IE_GO_PREFIXES, IE_MA_PREFIX, IE_MS_PREFIX, IE_MT_CANONICAL_LENGTH, IE_MT_GOLDEN_CANONICAL, IE_MT_GOLDEN_LEGACY, IE_MT_LEGACY_LENGTH, IE_MT_OFFICIAL_SOURCE_URL, IE_MT_PREFIX, IE_OFFICIAL_SOURCE_URLS, IE_PA_PREFIX, IE_RN_PREFIX, IE_RR_PREFIX, IE_SP_DV1_WEIGHTS, IE_SP_DV2_WEIGHTS, IE_SP_GOLDEN, IE_SP_GOLDEN_MASKED, IE_SP_LENGTH, IE_SP_OFFICIAL_SOURCE_URL, IE_SP_RURAL_GOLDEN, IE_SP_RURAL_GOLDEN_MASKED, IE_SP_RURAL_LENGTH, IE_SP_RURAL_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, IE_TO_LEGACY_PREFIXES, applyIeDfMask, applyIeSpMask, applyIeSpRuralMask, computeIeAcCheckDigit, computeIeAlCheckDigit, computeIeAmCheckDigit, computeIeApCheckDigit, computeIeBaCheckDigit, computeIeBaModule, computeIeCeCheckDigit, computeIeCyclicMod11CheckDigit, computeIeDfCheckDigit, computeIeGoCheckDigit, computeIeMgFirstCheckDigit, computeIeMgSecondCheckDigit, computeIeMtCheckDigit, computeIePeCheckDigit, computeIePrStyleCheckDigit, computeIeRoCheckDigit, computeIeRrCheckDigit, computeIeSpCheckDigit, computeIeToCheckDigit, getIeProdutorRuralOfficialSourceUrl, isSpRuralIeInput, isValidIeProdutorRural, stripIeSpRural, validateIeProdutorRural, validateIeSpRural };
//# sourceMappingURL=chunk-Y6IW2LMW.js.map
//# sourceMappingURL=chunk-Y6IW2LMW.js.map
{"version":3,"sources":["../src/core/inscricao-estadual/constants.ts","../src/core/inscricao-estadual/modulo-ie.ts","../src/core/inscricao-estadual/sp-rural.ts","../src/core/inscricao-estadual/validate-produtor-rural.ts","../src/core/inscricao-estadual/mask.ts"],"names":["failure"],"mappings":"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","file":"chunk-Y6IW2LMW.js","sourcesContent":["/**\n * Inscrição Estadual — per-UF constants (27 UFs).\n * @see docs/IE-STATE-ALGORITHMS.md\n */\nimport type { UfCode } from '../../types/validation-result.js';\n\nexport type { UfCode };\n\nexport const IE_SUPPORTED_UFS: readonly 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];\n\nexport const IE_OFFICIAL_SOURCE_URLS: Readonly<Record<UfCode, string>> = {\n AC: 'https://sefaz.ac.gov.br/',\n AL: 'https://www.sefaz.al.gov.br/calculo',\n AM: 'https://www.sefaz.am.gov.br/',\n AP: 'https://www.sefaz.ap.gov.br/',\n BA: 'https://www.sefaz.ba.gov.br/inspetoria-eletronica/icms/cadastro/calculo-dv/',\n CE: 'https://www.sefaz.ce.gov.br/',\n DF: 'https://www.receita.fazenda.df.gov.br/',\n ES: 'https://sitenet.es.gov.br/sefaz/',\n GO: 'http://www.sefaz.go.gov.br/ServicosAFA/ece.html',\n MA: 'https://www.sefaz.ma.gov.br/',\n MG: 'https://www.fazenda.mg.gov.br/empresas/Cadastro/cadastro/consultapublica.html',\n MS: 'https://www.sefaz.ms.gov.br/',\n MT: 'https://app1.sefaz.mt.gov.br/Sistema/legislacao/legislacaotribut.nsf/709f9c981a9d9f468425671300482be0/2217ddcf7a9b7cea03258c6c007324ba?OpenDocument=',\n PA: 'https://www.sefa.pa.gov.br/',\n PB: 'https://www.receita.pb.gov.br/',\n PE: 'https://www.sefaz.pe.gov.br/',\n PI: 'https://www.sefaz.pi.gov.br/',\n PR: 'https://www.fazenda.pr.gov.br/Pagina/calculo-digito-verificador',\n RJ: 'https://portal.fazenda.rj.gov.br/cadastro/',\n RN: 'https://www.set.rn.gov.br/',\n RO: 'https://www.sefin.ro.gov.br/',\n RR: 'https://www.sefaz.rr.gov.br/',\n RS: 'https://www.sefaz.rs.gov.br/',\n SC: 'https://sat.sef.sc.gov.br/',\n SE: 'https://www.sefaz.se.gov.br/',\n SP: 'https://portal.fazenda.sp.gov.br/servicos/icms/Paginas/sintegra-rotina-consistencia.aspx',\n TO: 'https://www.sefaz.to.gov.br/',\n};\n\nexport const IE_OFFICIAL_SOURCE_URL = 'docs/IE-STATE-ALGORITHMS.md';\n\nexport const IE_AC_PREFIX = '01';\nexport const IE_AL_PREFIX = '24';\nexport const IE_AM_PREFIX = '04';\nexport const IE_AP_PREFIX = '03';\nexport const IE_DF_PREFIX = '07';\nexport const IE_GO_PREFIXES = ['10', '11', '15', '20'] as const;\nexport const IE_MA_PREFIX = '12';\nexport const IE_MS_PREFIX = '28';\nexport const IE_MT_PREFIX = '13';\nexport const IE_PA_PREFIX = '15';\nexport const IE_RN_PREFIX = '20';\nexport const IE_RR_PREFIX = '24';\nexport const IE_TO_LEGACY_PREFIXES = ['01', '02', '03', '99'] as const;\n\nexport const IE_SP_LENGTH = 12;\nexport const IE_SP_DV1_WEIGHTS = [1, 3, 4, 5, 6, 7, 8, 10] as const;\nexport const IE_SP_DV2_WEIGHTS = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const IE_SP_GOLDEN = '110042490114';\nexport const IE_SP_GOLDEN_MASKED = '110.042.490.114';\nexport const IE_SP_OFFICIAL_SOURCE_URL = IE_OFFICIAL_SOURCE_URLS.SP;\n\nexport const IE_SP_RURAL_LENGTH = 13;\nexport const IE_SP_RURAL_GOLDEN = 'P011004243002';\nexport const IE_SP_RURAL_GOLDEN_MASKED = 'P-01100424.3/002';\nexport const IE_SP_RURAL_OFFICIAL_SOURCE_URL = 'http://www.sintegra.gov.br/Cad_Estados/cad_SP.html';\n\nexport const IE_MT_CANONICAL_LENGTH = 9;\nexport const IE_MT_LEGACY_LENGTH = 11;\nexport const IE_MT_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const IE_MT_GOLDEN_LEGACY = '00130000019';\nexport const IE_MT_GOLDEN_CANONICAL = '130000019';\nexport const IE_MT_OFFICIAL_SOURCE_URL = IE_OFFICIAL_SOURCE_URLS.MT;\n\nexport const IE_DF_LENGTH = 13;\nexport const IE_DF_DV1_WEIGHTS = [4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const IE_DF_DV2_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const IE_DF_GOLDEN = '0730000100109';\nexport const IE_DF_GOLDEN_MASKED = '073.00001.001-09';\nexport const IE_DF_OFFICIAL_SOURCE_URL = IE_OFFICIAL_SOURCE_URLS.DF;\n","/**\n * Shared modulo helpers for IE check digits.\n */\n\nexport function computeIeSpCheckDigit(digits: string, weights: readonly number[]): number {\n let sum = 0;\n for (let i = 0; i < weights.length; i++) {\n sum += Number(digits[i]) * weights[i];\n }\n const remainder = sum % 11;\n return remainder === 10 ? 0 : remainder % 10;\n}\n\nexport function computeIeMtCheckDigit(digits10: string): number {\n let sum = 0;\n const weights = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n for (let i = 0; i < 10; i++) {\n sum += Number(digits10[i]) * weights[i];\n }\n const remainder = sum % 11;\n return remainder <= 1 ? 0 : 11 - remainder;\n}\n\nexport function computeIeDfCheckDigit(\n digits: string,\n weights: readonly number[],\n includeDv1 = false,\n dv1 = 0,\n): number {\n let sum = 0;\n const digitCount = includeDv1 ? 11 : digits.length;\n for (let i = 0; i < digitCount; i++) {\n sum += Number(digits[i]) * weights[i];\n }\n if (includeDv1) {\n sum += dv1 * weights[11];\n }\n const remainder = sum % 11;\n return remainder <= 1 ? 0 : 11 - remainder;\n}\n\n/** CE / SC / SE / PB / PI — weights 9..2 on 8 body digits. */\nexport function computeIeCeCheckDigit(body8: string): number {\n let weight = 9;\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += Number(body8[i]) * weight;\n weight--;\n }\n const rest = sum % 11;\n let digit = 11 - rest;\n if (digit >= 10) {\n digit = 0;\n }\n return digit;\n}\n\n/** AL — product×10 mod 11. */\nexport function computeIeAlCheckDigit(body8: string): number {\n let weight = 9;\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += Number(body8[i]) * weight;\n weight--;\n }\n const product = sum * 10;\n let digit = product - Math.floor(product / 11) * 11;\n if (digit >= 10) {\n digit = 0;\n }\n return digit;\n}\n\n/** AM — descending weights with special remainder rule. */\nexport function computeIeAmCheckDigit(body8: string): number {\n let weight = 9;\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += Number(body8[i]) * weight;\n weight--;\n }\n if (sum < 11) {\n return 11 - sum;\n }\n const remainder = sum % 11;\n let digit = 11 - remainder;\n if (digit >= 10) {\n digit = 0;\n }\n return digit;\n}\n\n/** PR / AC style — mod11, weights cycle 2..7 from right. */\nexport function computeIePrStyleCheckDigit(body: string): number {\n let weight = body.length - 5;\n let sum = 0;\n for (let i = 0; i < body.length; i++) {\n sum += Number(body[i]) * weight;\n weight--;\n if (weight === 1) {\n weight = 7;\n }\n }\n const rest = sum % 11;\n let digit = 11 - rest;\n if (digit >= 10) {\n digit = 0;\n }\n return digit;\n}\n\n/** AC — weights cycle 9..2 from left. */\nexport function computeIeAcCheckDigit(body: string): number {\n let weight = body.length - 7;\n let sum = 0;\n for (let i = 0; i < body.length; i++) {\n sum += Number(body[i]) * weight;\n weight--;\n if (weight === 1) {\n weight = 9;\n }\n }\n const rest = sum % 11;\n let digit = 11 - rest;\n if (digit >= 10) {\n digit = 0;\n }\n return digit;\n}\n\n/** BA — mod10 or mod11 by reference digit. */\nexport function computeIeBaModule(ie: string): number {\n const refIndex = ie.length === 9 ? 1 : 0;\n const refDigit = Number(ie[refIndex]);\n const mod10Digits = [0, 1, 2, 3, 4, 5, 8];\n return mod10Digits.includes(refDigit) ? 10 : 11;\n}\n\nexport function computeIeBaCheckDigit(body: string, mod: number): number {\n let weight = body.length + 1;\n let sum = 0;\n for (let i = 0; i < body.length; i++) {\n sum += Number(body[i]) * weight;\n weight--;\n }\n const rest = sum % mod;\n let digit = mod - rest;\n if (digit >= 10) {\n digit = 0;\n }\n return digit;\n}\n\n/** PE — dual DV, weights length+1..2. */\nexport function computeIePeCheckDigit(body: string): number {\n let weight = body.length + 1;\n let sum = 0;\n for (let i = 0; i < body.length; i++) {\n sum += Number(body[i]) * weight;\n weight--;\n }\n const rest = sum % 11;\n let digit = 11 - rest;\n if (digit >= 10) {\n digit = 0;\n }\n return digit;\n}\n\n/** RJ / RS / RO — cyclic descending weights. */\nexport function computeIeCyclicMod11CheckDigit(\n body: string,\n startWeight: number,\n resetWeight: number,\n): number {\n let weight = startWeight;\n let sum = 0;\n for (let i = 0; i < body.length; i++) {\n sum += Number(body[i]) * weight;\n weight--;\n if (weight === 1) {\n weight = resetWeight;\n }\n }\n const rest = sum % 11;\n let digit = 11 - rest;\n if (digit >= 10) {\n digit = 0;\n }\n return digit;\n}\n\n/** RO — cyclic weights 6..9, subtract 10 when digit >= 10. */\nexport function computeIeRoCheckDigit(body: string): number {\n let weight = 6;\n let sum = 0;\n for (let i = 0; i < body.length; i++) {\n sum += Number(body[i]) * weight;\n weight--;\n if (weight === 1) {\n weight = 9;\n }\n }\n const rest = sum % 11;\n let digit = 11 - rest;\n if (digit >= 10) {\n digit -= 10;\n }\n return digit;\n}\n\n/** GO — mod11 with special range override. */\nexport function computeIeGoCheckDigit(body8: string): number {\n let weight = 9;\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += Number(body8[i]) * weight;\n weight--;\n }\n const rest = sum % 11;\n let digit = 11 - rest;\n const bodyInt = Number(body8);\n if (digit >= 10) {\n if (digit === 11 && bodyInt >= 10103105 && bodyInt <= 10119997) {\n digit = 1;\n } else {\n digit = 0;\n }\n }\n return digit;\n}\n\n/** AP — prefix 03 with range-based p/d constants. */\nexport function computeIeApCheckDigit(body8: string): number {\n const bodyInt = Number(body8);\n let p = 0;\n let d = 0;\n if (bodyInt >= 3000001 && bodyInt <= 3017000) {\n p = 5;\n d = 0;\n } else if (bodyInt >= 3017001 && bodyInt <= 3019022) {\n p = 9;\n d = 1;\n }\n let weight = 9;\n let sum = p;\n for (let i = 0; i < 8; i++) {\n sum += Number(body8[i]) * weight;\n weight--;\n }\n let digit = 11 - (sum % 11);\n if (digit === 10) {\n digit = 0;\n } else if (digit === 11) {\n digit = d;\n }\n return digit;\n}\n\n/** RR — mod9, ascending weights 1..8. */\nexport function computeIeRrCheckDigit(body8: string): number {\n let weight = 1;\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += Number(body8[i]) * weight;\n weight++;\n }\n return sum % 9;\n}\n\n/** TO — mod11, rest < 2 → DV 0. */\nexport function computeIeToCheckDigit(body: string): number {\n let weight = 9;\n let sum = 0;\n for (let i = 0; i < body.length; i++) {\n sum += Number(body[i]) * weight;\n weight--;\n }\n const rest = sum % 11;\n if (rest < 2) {\n return 0;\n }\n return 11 - rest;\n}\n\n/** MG — first DV via digit-sum on alternating products. */\nexport function computeIeMgFirstCheckDigit(body11: string): number {\n const bodyWithZero = `${body11.slice(0, 3)}0${body11.slice(3)}`;\n let weightedSum = '';\n for (let i = 0; i < bodyWithZero.length; i++) {\n const w = (i + 1) % 2 === 0 ? 2 : 1;\n weightedSum += (Number(bodyWithZero[i]) * w).toString();\n }\n let sum = 0;\n for (let i = 0; i < weightedSum.length; i++) {\n sum += Number(weightedSum[i]);\n }\n const lastDigit = Number(sum.toString().slice(-1));\n return lastDigit === 0 ? 0 : 10 - lastDigit;\n}\n\n/** MG — second DV, weights 3..11 cycling. */\nexport function computeIeMgSecondCheckDigit(body12: string): number {\n let weight = 3;\n let sum = 0;\n for (let i = 0; i < body12.length; i++) {\n sum += Number(body12[i]) * weight;\n weight--;\n if (weight === 1) {\n weight = 11;\n }\n }\n const rest = sum % 11;\n let digit = 11 - rest;\n if (digit >= 10) {\n digit = 0;\n }\n return digit;\n}\n","/**\n * São Paulo produtor rural IE — Regra II (SINTEGRA cad_SP.html Bloco II).\n * @see BR-IE-SP-RURAL-001\n * @see http://www.sintegra.gov.br/Cad_Estados/cad_SP.html\n */\nimport type { IeProdutorRuralValidationResult } from '../../types/validation-result.js';\nimport { brandInscricaoEstadualProdutorRural } from '../../types/validation-result.js';\nimport { IE_SP_DV1_WEIGHTS, IE_SP_RURAL_LENGTH } from './constants.js';\nimport { computeIeSpCheckDigit } from './modulo-ie.js';\n\ntype FailedResult = Extract<IeProdutorRuralValidationResult, { ok: false }>;\n\nconst SP_RURAL_MASK_PATTERN = /^[Pp0-9.\\-\\s/]+$/;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, uf: 'SP' };\n}\n\nexport function isSpRuralIeInput(input: string): boolean {\n return /^[Pp]/.test(input.trim());\n}\n\nexport function stripIeSpRural(input: string): string {\n const trimmed = input.trim().toUpperCase();\n const digits = trimmed.replace(/^[P]/, '').replace(/\\D/g, '');\n return `P${digits}`;\n}\n\nexport function validateIeSpRural(input: string): IeProdutorRuralValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Inscrição Estadual produtor rural input is empty', uf: 'SP' };\n }\n\n if (!/^[Pp]/.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'SP produtor rural Inscrição Estadual must start with P');\n }\n\n if (!SP_RURAL_MASK_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'SP produtor rural Inscrição Estadual contains invalid characters');\n }\n\n const stripped = stripIeSpRural(trimmed);\n if (stripped.length !== IE_SP_RURAL_LENGTH) {\n return failure(\n 'INVALID_LENGTH',\n `SP produtor rural Inscrição Estadual must have ${IE_SP_RURAL_LENGTH} characters after normalization`,\n );\n }\n\n const dvInput = stripped.slice(1, 9);\n const expectedDv = computeIeSpCheckDigit(dvInput, IE_SP_DV1_WEIGHTS);\n const actualDv = Number(stripped.charAt(9));\n\n if (actualDv !== expectedDv) {\n return failure('INVALID_CHECK_DIGIT', 'SP produtor rural Inscrição Estadual check digit is invalid');\n }\n\n return {\n ok: true,\n value: brandInscricaoEstadualProdutorRural(stripped),\n uf: 'SP',\n format: 'inscricao-estadual-produtor-rural',\n };\n}\n","/**\n * Inscrição Estadual produtor rural — SP Regra II only.\n * @see http://www.sintegra.gov.br/Cad_Estados/cad_SP.html\n */\nimport type { IeProdutorRuralValidationResult, UfCode } from '../../types/validation-result.js';\nimport { IE_SP_RURAL_OFFICIAL_SOURCE_URL } from './constants.js';\nimport { validateIeSpRural } from './sp-rural.js';\n\ntype FailedResult = Extract<IeProdutorRuralValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, uf: UfCode): FailedResult {\n return { ok: false, code, message, uf };\n}\n\nexport function getIeProdutorRuralOfficialSourceUrl(): string {\n return IE_SP_RURAL_OFFICIAL_SOURCE_URL;\n}\n\nexport function isValidIeProdutorRural(uf: UfCode, input: string): boolean {\n return validateIeProdutorRural(uf, input).ok;\n}\n\nexport function validateIeProdutorRural(uf: UfCode, input: string): IeProdutorRuralValidationResult {\n if (uf !== 'SP') {\n return failure(\n 'UNSUPPORTED_FORMAT',\n 'Produtor rural Inscrição Estadual validation is supported for SP only; use validateInscricaoEstadual for other UFs',\n uf,\n );\n }\n return validateIeSpRural(input);\n}\n","import { IE_DF_LENGTH, IE_SP_LENGTH, IE_SP_RURAL_LENGTH } from './constants.js';\n\nexport function applyIeSpMask(stripped: string): string {\n if (stripped.length !== IE_SP_LENGTH) {\n throw new Error('SP IE must have exactly 12 digits to apply mask');\n }\n return `${stripped.slice(0, 3)}.${stripped.slice(3, 6)}.${stripped.slice(6, 9)}.${stripped.slice(9)}`;\n}\n\nexport function applyIeSpRuralMask(stripped: string): string {\n if (stripped.length !== IE_SP_RURAL_LENGTH || !stripped.startsWith('P')) {\n throw new Error('SP produtor rural IE must have exactly 13 characters starting with P to apply mask');\n }\n const body = stripped.slice(1);\n return `P-${body.slice(0, 8)}.${body.charAt(8)}/${body.slice(9)}`;\n}\n\nexport function applyIeDfMask(stripped: string): string {\n if (stripped.length !== IE_DF_LENGTH) {\n throw new Error('DF IE must have exactly 13 digits to apply mask');\n }\n return `${stripped.slice(0, 3)}.${stripped.slice(3, 8)}.${stripped.slice(8, 11)}-${stripped.slice(11)}`;\n}\n"]}
//# sourceMappingURL=chunk-YGA5W54J.js.map
//# sourceMappingURL=chunk-YGA5W54J.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-YGA5W54J.js"}
import { stripCnpj } from './chunk-EB3G4IG6.js';
import { computeCheckDigit } from './chunk-OTZHMJYE.js';
import { brandCnpj } from './chunk-MSLJF2FM.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");
}
export { CNPJ_BASE_LENGTH, CNPJ_DV1_WEIGHTS, CNPJ_DV2_WEIGHTS, CNPJ_GOLDEN_ALPHANUMERIC, CNPJ_GOLDEN_ALPHANUMERIC_MASKED, CNPJ_GOLDEN_NUMERIC, CNPJ_GOLDEN_NUMERIC_MASKED, CNPJ_LENGTH, CNPJ_MASK_PATTERN, CNPJ_OFFICIAL_SOURCE_URL, cnpjCharValue, detectCnpjFormat, isValidCnpj, isValidCnpjAlphanumeric, isValidCnpjNumeric, validateCnpj };
//# sourceMappingURL=chunk-YXELVV37.js.map
//# sourceMappingURL=chunk-YXELVV37.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"],"names":[],"mappings":"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","file":"chunk-YXELVV37.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"]}
// src/strip/cep.ts
function stripCep(input) {
return input.replace(/\D/g, "");
}
// src/strip/cnh.ts
function stripCnh(input) {
return input.replace(/\D/g, "");
}
// src/strip/renavam.ts
function stripRenavam(input) {
return input.replace(/\D/g, "");
}
// src/strip/titulo-eleitor.ts
function stripTituloEleitor(input) {
return input.replace(/\D/g, "");
}
// src/strip/placa.ts
function stripPlaca(input) {
return input.replace(/[^A-Za-z0-9]/g, "").toUpperCase();
}
export { stripCep, stripCnh, stripPlaca, stripRenavam, stripTituloEleitor };
//# sourceMappingURL=chunk-YYHS5WQN.js.map
//# sourceMappingURL=chunk-YYHS5WQN.js.map
{"version":3,"sources":["../src/strip/cep.ts","../src/strip/cnh.ts","../src/strip/renavam.ts","../src/strip/titulo-eleitor.ts","../src/strip/placa.ts"],"names":[],"mappings":";AAIO,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACDO,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACHO,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACFO,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACFO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,eAAA,EAAiB,EAAE,EAAE,WAAA,EAAY;AACxD","file":"chunk-YYHS5WQN.js","sourcesContent":["/**\n * Strip CEP mask — digits only (BR-CEP-001).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n */\nexport function stripCep(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip CNH — digits only (BR-CNH-002). Removes non-official decoration (e.g. CPF-style dots).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf\n * @see https://www.gov.br/pt-br/servicos/validar-cnh\n */\nexport function stripCnh(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip RENAVAM — digits only (BR-RENAVAM-002).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n */\nexport function stripRenavam(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip Título de Eleitor — digits only (BR-TITULO-002).\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n */\nexport function stripTituloEleitor(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip placa mask — preserve A-Z0-9, uppercase (BR-PLACA-004).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nexport function stripPlaca(input: string): string {\n return input.replace(/[^A-Za-z0-9]/g, '').toUpperCase();\n}\n"]}
import { validateCep, CEP_MASK_PATTERN } from './chunk-2JJS46FM.js';
// 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 { formatCep };
//# sourceMappingURL=chunk-ZAUZRIOU.js.map
//# sourceMappingURL=chunk-ZAUZRIOU.js.map
{"version":3,"sources":["../src/core/cep/mask.ts","../src/format/cep.ts"],"names":[],"mappings":";;;AAGO,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-ZAUZRIOU.js","sourcesContent":["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"]}
//# sourceMappingURL=chunk-ZH4RJNG7.js.map
//# sourceMappingURL=chunk-ZH4RJNG7.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-ZH4RJNG7.js"}
import { x as ValidationResult, g as Cnh, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';
/**
* CNH constants — Registro Nacional modulo 11 (CONTRAN / SENATRAN).
* @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf
* @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/Resolucao8862021.pdf
* @see https://www.gov.br/pt-br/servicos/validar-cnh
* @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-cnh/ — algorithm cross-check (AdvPL)
* @see https://www.geravalida.com.br/validador-cnh — implementation cross-check
* @see https://geradorbr.com/validador-de-cnh/ — implementation cross-check
*/
declare const CNH_DV1_WEIGHTS: readonly [9, 8, 7, 6, 5, 4, 3, 2, 1];
declare const CNH_DV2_WEIGHTS: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9];
declare const CNH_LENGTH = 11;
declare const CNH_BASE_LENGTH = 9;
/** Golden primary — DV walkthrough: base `624729276` → DV `37`. */
declare const CNH_GOLDEN_PRIMARY = "62472927637";
declare const CNH_GOLDEN_SECONDARY = "69044271146";
declare const CNH_GOLDEN_DISCOUNT_CASE = "00000001801";
/** Non-official CPF-style decoration — accepted on input via strip, never emitted by format. */
declare const CNH_GOLDEN_PRIMARY_DECORATED_INPUT = "624.729.276-37";
declare const CNH_OFFICIAL_SOURCE_URL = "https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf";
/** SENATRAN online validation — requires plain 11-digit registration number. */
declare const CNH_SENATRAN_VALIDAR_URL = "https://www.gov.br/pt-br/servicos/validar-cnh";
declare function isValidCnh(input: string): boolean;
declare function validateCnh(input: string): ValidationResult<Cnh>;
/**
* Strip CNH — digits only (BR-CNH-002). Removes non-official decoration (e.g. CPF-style dots).
* @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf
* @see https://www.gov.br/pt-br/servicos/validar-cnh
*/
declare function stripCnh(input: string): string;
declare function formatCnh(input: string): FormatResult;
export { CNH_BASE_LENGTH, CNH_DV1_WEIGHTS, CNH_DV2_WEIGHTS, CNH_GOLDEN_DISCOUNT_CASE, CNH_GOLDEN_PRIMARY, CNH_GOLDEN_PRIMARY_DECORATED_INPUT, CNH_GOLDEN_SECONDARY, CNH_LENGTH, CNH_OFFICIAL_SOURCE_URL, CNH_SENATRAN_VALIDAR_URL, Cnh, FormatResult, ValidationResult, formatCnh, isValidCnh, stripCnh, validateCnh };
import './chunk-Y2KUN2D3.js';
export { formatCnh } from './chunk-6QJFMOIX.js';
export { CNH_BASE_LENGTH, CNH_DV1_WEIGHTS, CNH_DV2_WEIGHTS, CNH_GOLDEN_DISCOUNT_CASE, CNH_GOLDEN_PRIMARY, CNH_GOLDEN_PRIMARY_DECORATED_INPUT, CNH_GOLDEN_SECONDARY, CNH_LENGTH, CNH_OFFICIAL_SOURCE_URL, CNH_SENATRAN_VALIDAR_URL, isValidCnh, validateCnh } from './chunk-US4OLTJ2.js';
export { stripCnh } from './chunk-YYHS5WQN.js';
import './chunk-4SNBZFS5.js';
import './chunk-EB3G4IG6.js';
import './chunk-UCJPSJN5.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=cnh.js.map
//# sourceMappingURL=cnh.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"cnh.js"}
import { U as UfCode, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';
type DetectableDocumentType = 'cpf' | 'cnpj' | 'cep' | 'placa' | 'pis-pasep' | 'pix' | 'telefone' | 'boleto' | 'cartao-credito' | 'cnh' | 'renavam' | 'nfe-chave' | 'titulo-eleitor' | 'inscricao-estadual' | 'inscricao-estadual-produtor-rural' | 'brcode' | 'unknown';
type DetectOptions = {
uf?: UfCode;
};
type DetectSuccess = {
type: DetectableDocumentType;
ok: true;
value: string;
format?: DocumentFormat;
meta?: Record<string, unknown>;
};
type DetectFailure = {
type: DetectableDocumentType;
ok: false;
code: ValidationErrorCode;
message: string;
};
type DetectResult = DetectSuccess | DetectFailure;
declare function detect(raw: string, options?: DetectOptions): DetectResult;
export { type DetectOptions, type DetectResult, type DetectableDocumentType, detect };
export { detect } from './chunk-OCYXNLHO.js';
import './chunk-MLPXW7N2.js';
import './chunk-5UL3M7IU.js';
import './chunk-3QP6R46N.js';
import './chunk-Y6IW2LMW.js';
import './chunk-D36RM7OD.js';
import './chunk-KH7DWOUA.js';
import './chunk-WPL47PWJ.js';
import './chunk-4W4OKLSZ.js';
import './chunk-WCQUQ2WX.js';
import './chunk-MK7OJUF5.js';
import './chunk-EPKHEW5V.js';
import './chunk-2JJS46FM.js';
import './chunk-US4OLTJ2.js';
import './chunk-YYHS5WQN.js';
import './chunk-4SNBZFS5.js';
import './chunk-XUO7FV6Z.js';
import './chunk-YXELVV37.js';
import './chunk-EB3G4IG6.js';
import './chunk-KQDLIGSG.js';
import './chunk-F6PTZY4O.js';
import './chunk-UCJPSJN5.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=detect.js.map
//# sourceMappingURL=detect.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"detect.js"}
type GeneratableDocumentType = 'cpf' | 'cnpj' | 'cep' | 'placa' | 'pis-pasep' | 'renavam' | 'cnh' | 'telefone' | 'cartao-credito';
type GenerateFormat = 'numeric' | 'alphanumeric' | 'legacy' | 'mercosul' | 'celular' | 'fixo';
type GenerateOptions = {
format?: GenerateFormat;
masked?: boolean;
seed?: number;
};
declare function generate(type: GeneratableDocumentType, options?: GenerateOptions): string;
export { type GeneratableDocumentType, type GenerateFormat, type GenerateOptions, generate };
export { generate } from './chunk-LGD2JJBZ.js';
import './chunk-CDGRHI7W.js';
import './chunk-WLE2ENQA.js';
import './chunk-G2Y63PIF.js';
import './chunk-IQGRFAQV.js';
import './chunk-G32U6YQ5.js';
import './chunk-XKY2CV3G.js';
import './chunk-ZAUZRIOU.js';
import './chunk-6QJFMOIX.js';
import './chunk-LYBFUKHR.js';
import './chunk-NHLLC6WH.js';
import './chunk-5UL3M7IU.js';
import './chunk-KH7DWOUA.js';
import './chunk-WPL47PWJ.js';
import './chunk-EPKHEW5V.js';
import './chunk-2JJS46FM.js';
import './chunk-US4OLTJ2.js';
import './chunk-YYHS5WQN.js';
import './chunk-4SNBZFS5.js';
import './chunk-XUO7FV6Z.js';
import './chunk-YXELVV37.js';
import './chunk-EB3G4IG6.js';
import './chunk-KQDLIGSG.js';
import './chunk-F6PTZY4O.js';
import './chunk-UCJPSJN5.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=generate.js.map
//# sourceMappingURL=generate.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"generate.js"}
import { U as UfCode, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';
type SanitizableDocumentType = 'cpf' | 'cnpj' | 'cep' | 'placa' | 'pis-pasep' | 'telefone' | 'cnh' | 'renavam' | 'titulo-eleitor' | 'nfe-chave' | 'boleto' | 'cartao-credito' | 'inscricao-estadual' | 'inscricao-estadual-produtor-rural';
type SanitizeOptions = {
uf?: UfCode;
};
type SanitizeSuccess = {
ok: true;
value: string;
fixes: string[];
};
type SanitizeFailure = {
ok: false;
code: ValidationErrorCode;
message: string;
};
type SanitizeResult = SanitizeSuccess | SanitizeFailure;
declare function sanitize(raw: string, type: SanitizableDocumentType, options?: SanitizeOptions): SanitizeResult;
export { type SanitizableDocumentType as S, type SanitizeOptions as a, type SanitizeResult as b, sanitize as s };
import { U as UfCode, I as IeProdutorRuralValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
/**
* Inscrição Estadual produtor rural — SP Regra II only.
* @see http://www.sintegra.gov.br/Cad_Estados/cad_SP.html
*/
declare function getIeProdutorRuralOfficialSourceUrl(): string;
declare function isValidIeProdutorRural(uf: UfCode, input: string): boolean;
declare function validateIeProdutorRural(uf: UfCode, input: string): IeProdutorRuralValidationResult;
/**
* São Paulo produtor rural IE — Regra II (SINTEGRA cad_SP.html Bloco II).
* @see BR-IE-SP-RURAL-001
* @see http://www.sintegra.gov.br/Cad_Estados/cad_SP.html
*/
declare function isSpRuralIeInput(input: string): boolean;
declare function stripIeSpRural(input: string): string;
declare function validateIeSpRural(input: string): IeProdutorRuralValidationResult;
/**
* Inscrição Estadual — per-UF constants (27 UFs).
* @see docs/IE-STATE-ALGORITHMS.md
*/
declare const IE_SUPPORTED_UFS: readonly UfCode[];
declare const IE_OFFICIAL_SOURCE_URLS: Readonly<Record<UfCode, string>>;
declare const IE_SP_GOLDEN = "110042490114";
declare const IE_SP_GOLDEN_MASKED = "110.042.490.114";
declare const IE_SP_OFFICIAL_SOURCE_URL: string;
declare const IE_SP_RURAL_LENGTH = 13;
declare const IE_SP_RURAL_GOLDEN = "P011004243002";
declare const IE_SP_RURAL_GOLDEN_MASKED = "P-01100424.3/002";
declare const IE_SP_RURAL_OFFICIAL_SOURCE_URL = "http://www.sintegra.gov.br/Cad_Estados/cad_SP.html";
declare const IE_MT_GOLDEN_LEGACY = "00130000019";
declare const IE_MT_GOLDEN_CANONICAL = "130000019";
declare const IE_MT_OFFICIAL_SOURCE_URL: string;
declare const IE_DF_LENGTH = 13;
declare const IE_DF_GOLDEN = "0730000100109";
declare const IE_DF_GOLDEN_MASKED = "073.00001.001-09";
declare const IE_DF_OFFICIAL_SOURCE_URL: string;
declare function formatIeProdutorRural(input: string): FormatResult;
export { IE_DF_GOLDEN as I, IE_DF_GOLDEN_MASKED as a, IE_DF_OFFICIAL_SOURCE_URL as b, IE_MT_GOLDEN_CANONICAL as c, IE_MT_GOLDEN_LEGACY as d, IE_MT_OFFICIAL_SOURCE_URL as e, IE_OFFICIAL_SOURCE_URLS as f, IE_SP_GOLDEN as g, IE_SP_GOLDEN_MASKED as h, IE_SP_OFFICIAL_SOURCE_URL as i, IE_SP_RURAL_GOLDEN as j, IE_SP_RURAL_GOLDEN_MASKED as k, IE_SP_RURAL_LENGTH as l, IE_SP_RURAL_OFFICIAL_SOURCE_URL as m, IE_SUPPORTED_UFS as n, formatIeProdutorRural as o, getIeProdutorRuralOfficialSourceUrl as p, isSpRuralIeInput as q, isValidIeProdutorRural as r, stripIeSpRural as s, validateIeSpRural as t, IE_DF_LENGTH as u, validateIeProdutorRural as v };
export { j as IE_SP_RURAL_GOLDEN, k as IE_SP_RURAL_GOLDEN_MASKED, l as IE_SP_RURAL_LENGTH, m as IE_SP_RURAL_OFFICIAL_SOURCE_URL, o as formatIeProdutorRural, p as getIeProdutorRuralOfficialSourceUrl, q as isSpRuralIeInput, r as isValidIeProdutorRural, s as stripIeSpRural, s as stripInscricaoEstadualProdutorRural, v as validateIeProdutorRural, t as validateIeSpRural } from './inscricao-estadual-produtor-rural-CfWUaggb.js';
export { F as FormatResult, I as IeProdutorRuralValidationResult, l as InscricaoEstadualProdutorRural, U as UfCode, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';
import './chunk-MFNJTAUS.js';
import './chunk-GVK6IMBF.js';
export { formatIeProdutorRural } from './chunk-BFZPCEYB.js';
export { IE_SP_RURAL_GOLDEN, IE_SP_RURAL_GOLDEN_MASKED, IE_SP_RURAL_LENGTH, IE_SP_RURAL_OFFICIAL_SOURCE_URL, getIeProdutorRuralOfficialSourceUrl, isSpRuralIeInput, isValidIeProdutorRural, stripIeSpRural, stripIeSpRural as stripInscricaoEstadualProdutorRural, validateIeProdutorRural, validateIeSpRural } from './chunk-Y6IW2LMW.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=inscricao-estadual-produtor-rural.js.map
//# sourceMappingURL=inscricao-estadual-produtor-rural.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"inscricao-estadual-produtor-rural.js"}
import { U as UfCode, o as NfeChaveValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { D as DocumentFormat, N as NfeChave, n as NfeChaveParsed, V as ValidationErrorCode, x as ValidationResult } from './validation-result-BhQE-1_O.js';
/**
* NF-e / NFC-e chave de acesso — 44 digits (ENCAT / SEFAZ MOC).
* @see https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=ndIjl+iEFdE%3D — MOC 7.0 index
* @see http://moc.sped.fazenda.pr.gov.br/ — MOC online (SEFAZ-PR mirror), §2.2.6
* @see https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf — MOC 7.0 §2.2.6.1–2.2.6.2
*/
declare const NFE_CHAVE_OFFICIAL_SOURCE_URL = "https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=ndIjl+iEFdE%3D";
declare const NFE_CHAVE_MOC_ONLINE_URL = "http://moc.sped.fazenda.pr.gov.br/";
declare const NFE_CHAVE_MOC_DV_SECTION_URL = "http://moc.sped.fazenda.pr.gov.br/#2.2.6.2. C\u00E1lculo do D\u00EDgito Verificador da Chave de Acesso da NF-e";
declare const NFE_CHAVE_MOC_PDF_URL = "https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf";
declare const NFE_CHAVE_DFE_PORTAL_URL = "https://dfe-portal.svrs.rs.gov.br/NFe/Documentos";
/** MOC DANFE NFC-e QR Code page — illustrative chave (DV inconsistent with §2.2.6.2). */
declare const NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL = "http://moc.sped.fazenda.pr.gov.br/DanfeQrCodeNFCe.html";
declare const NFE_CHAVE_LENGTH = 44;
declare const NFE_CHAVE_BASE_LENGTH = 43;
declare const NFE_CHAVE_MOD = 11;
declare const NFE_CHAVE_WEIGHT_CYCLE: readonly [2, 3, 4, 5, 6, 7, 8, 9];
declare const NFE_CHAVE_NUMERIC_PATTERN: RegExp;
/**
* Golden primary — MOC §2.2.6.2 worked example (sum=644, remainder=6, DV=5).
* Base 43 digits from MOC table; DV appended per modulo-11 rule.
*/
declare const NFE_CHAVE_GOLDEN_PRIMARY = "52060433009911002506550120000007800267301615";
/** Secondary valid vector from MOC online examples. */
declare const NFE_CHAVE_GOLDEN_SECONDARY = "41180678393592000146558900000006041028190697";
/** MOC NFC-e QR page illustrative chave — fails DV under §2.2.6.2 (not used as valid golden). */
declare const NFE_CHAVE_NFCE_QR_ILLUSTRATIVE = "28170800156225000131650110000151341562040824";
declare const NFE_MODELO_NFE = "55";
declare const NFE_MODELO_NFCE = "65";
declare const NFE_MODELOS: readonly ["55", "65"];
/** IBGE UF codes valid in cUF (positions 1–2). */
declare const NFE_IBGE_UF_CODES: Set<number>;
/** IBGE cUF → Brazilian UF sigla. */
declare const NFE_IBGE_UF_BY_CODE: Readonly<Record<number, UfCode>>;
declare function computeNfeChaveWeightedSum(base43: string): number;
declare function resolveNfeChaveCheckDigit(weightedSum: number): number;
/** Compute DV for the first 43 digits of a chave de acesso. */
declare function computeNfeChaveCheckDigit(base43: string): number;
declare function isValidNfeChaveCheckDigit(stripped: string): boolean;
type NfeChaveParts = {
cUF: string;
aamm: string;
cnpj: string;
mod: string;
serie: string;
nNF: string;
tpEmis: string;
cNF: string;
cDV: string;
};
declare function parseNfeChaveParts(stripped: string): NfeChaveParts | null;
declare function isValidNfeChave(input: string): boolean;
declare function parseNfeChave(input: string): NfeChaveValidationResult;
declare function validateNfeChave(input: string): NfeChaveValidationResult;
/**
* Strip NF-e chave de acesso — digits only (BR-NFE-CHAVE-002).
* @see http://moc.sped.fazenda.pr.gov.br/ — §2.2.6 chave de acesso
*/
declare function stripNfeChave(input: string): string;
declare function formatNfeChave(input: string): FormatResult;
export { FormatResult, NFE_CHAVE_BASE_LENGTH, NFE_CHAVE_DFE_PORTAL_URL, NFE_CHAVE_GOLDEN_PRIMARY, NFE_CHAVE_GOLDEN_SECONDARY, NFE_CHAVE_LENGTH, NFE_CHAVE_MOC_DV_SECTION_URL, NFE_CHAVE_MOC_ONLINE_URL, NFE_CHAVE_MOC_PDF_URL, NFE_CHAVE_MOD, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL, NFE_CHAVE_NUMERIC_PATTERN, NFE_CHAVE_OFFICIAL_SOURCE_URL, NFE_CHAVE_WEIGHT_CYCLE, NFE_IBGE_UF_BY_CODE, NFE_IBGE_UF_CODES, NFE_MODELOS, NFE_MODELO_NFCE, NFE_MODELO_NFE, type NfeChaveParts, NfeChaveValidationResult, UfCode, computeNfeChaveCheckDigit, computeNfeChaveWeightedSum, formatNfeChave, isValidNfeChave, isValidNfeChaveCheckDigit, parseNfeChave, parseNfeChaveParts, resolveNfeChaveCheckDigit, stripNfeChave, validateNfeChave };
export { formatNfeChave } from './chunk-4Y2FBO57.js';
export { NFE_CHAVE_BASE_LENGTH, NFE_CHAVE_DFE_PORTAL_URL, NFE_CHAVE_GOLDEN_PRIMARY, NFE_CHAVE_GOLDEN_SECONDARY, NFE_CHAVE_LENGTH, NFE_CHAVE_MOC_DV_SECTION_URL, NFE_CHAVE_MOC_ONLINE_URL, NFE_CHAVE_MOC_PDF_URL, NFE_CHAVE_MOD, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL, NFE_CHAVE_NUMERIC_PATTERN, NFE_CHAVE_OFFICIAL_SOURCE_URL, NFE_CHAVE_WEIGHT_CYCLE, NFE_IBGE_UF_BY_CODE, NFE_IBGE_UF_CODES, NFE_MODELOS, NFE_MODELO_NFCE, NFE_MODELO_NFE, computeNfeChaveCheckDigit, computeNfeChaveWeightedSum, isValidNfeChave, isValidNfeChaveCheckDigit, parseNfeChave, parseNfeChaveParts, resolveNfeChaveCheckDigit, validateNfeChave } from './chunk-D36RM7OD.js';
export { stripNfeChave } from './chunk-4SNBZFS5.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=nfe-chave.js.map
//# sourceMappingURL=nfe-chave.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"nfe-chave.js"}
import { q as PixKeyType, r as PixValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.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 { x as ValidationResult, R as Renavam, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';
/**
* RENAVAM constants — modulo 11, peso 9 (DENATRAN / SENATRAN).
* @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf
* @see https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam
* @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-renavam/ — algorithm cross-check (AdvPL)
* @see https://www.geravalida.com.br/gerador-de-renavam — implementation cross-check
* @see https://geradorfacil.com/geradores/renavam — implementation cross-check
*/
declare const RENAVAM_DV_WEIGHTS: readonly [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
declare const RENAVAM_LENGTH = 11;
declare const RENAVAM_BASE_LENGTH = 10;
/** Golden primary — DV walkthrough: base `6397779110` → DV `4`. */
declare const RENAVAM_GOLDEN_PRIMARY = "63977791104";
declare const RENAVAM_GOLDEN_SECONDARY = "72176426415";
declare const RENAVAM_GOLDEN_LEADING_ZEROS = "00207104255";
declare const RENAVAM_GOLDEN_DV_ZERO = "12345678900";
/** Optional dash before check digit — accepted on input via strip, never emitted by format. */
declare const RENAVAM_GOLDEN_DASH_INPUT = "7217642641-5";
declare const RENAVAM_OFFICIAL_SOURCE_URL = "https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf";
/** SENATRAN online vehicle lookup — requires RENAVAM + plate + owner CPF/CNPJ. */
declare const RENAVAM_SENATRAN_CONSULTA_URL = "https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam";
declare function isValidRenavam(input: string): boolean;
declare function validateRenavam(input: string): ValidationResult<Renavam>;
/**
* Strip RENAVAM — digits only (BR-RENAVAM-002).
* @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf
*/
declare function stripRenavam(input: string): string;
declare function formatRenavam(input: string): FormatResult;
export { FormatResult, RENAVAM_BASE_LENGTH, RENAVAM_DV_WEIGHTS, RENAVAM_GOLDEN_DASH_INPUT, RENAVAM_GOLDEN_DV_ZERO, RENAVAM_GOLDEN_LEADING_ZEROS, RENAVAM_GOLDEN_PRIMARY, RENAVAM_GOLDEN_SECONDARY, RENAVAM_LENGTH, RENAVAM_OFFICIAL_SOURCE_URL, RENAVAM_SENATRAN_CONSULTA_URL, Renavam, ValidationResult, formatRenavam, isValidRenavam, stripRenavam, validateRenavam };
import './chunk-G24G7WR5.js';
export { formatRenavam } from './chunk-CDGRHI7W.js';
export { RENAVAM_BASE_LENGTH, RENAVAM_DV_WEIGHTS, RENAVAM_GOLDEN_DASH_INPUT, RENAVAM_GOLDEN_DV_ZERO, RENAVAM_GOLDEN_LEADING_ZEROS, RENAVAM_GOLDEN_PRIMARY, RENAVAM_GOLDEN_SECONDARY, RENAVAM_LENGTH, RENAVAM_OFFICIAL_SOURCE_URL, RENAVAM_SENATRAN_CONSULTA_URL, isValidRenavam, validateRenavam } from './chunk-WLE2ENQA.js';
export { stripRenavam } from './chunk-YYHS5WQN.js';
import './chunk-4SNBZFS5.js';
import './chunk-EB3G4IG6.js';
import './chunk-UCJPSJN5.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=renavam.js.map
//# sourceMappingURL=renavam.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"renavam.js"}
export { S as SanitizableDocumentType, a as SanitizeOptions, b as SanitizeResult, s as sanitize } from './index-CZLo9YOT.js';
import './validation-result-BhQE-1_O.js';
type FixResult = {
value: string;
fixes: string[];
};
export type { FixResult };
export { sanitize } from './chunk-7ZL7PZII.js';
import './chunk-WLE2ENQA.js';
import './chunk-GVK6IMBF.js';
import './chunk-MLPXW7N2.js';
import './chunk-5UL3M7IU.js';
import './chunk-3QP6R46N.js';
import './chunk-Y6IW2LMW.js';
import './chunk-D36RM7OD.js';
import './chunk-KH7DWOUA.js';
import './chunk-WPL47PWJ.js';
import './chunk-4W4OKLSZ.js';
import './chunk-EPKHEW5V.js';
import './chunk-2JJS46FM.js';
import './chunk-US4OLTJ2.js';
import './chunk-YYHS5WQN.js';
import './chunk-4SNBZFS5.js';
import './chunk-YXELVV37.js';
import './chunk-EB3G4IG6.js';
import './chunk-F6PTZY4O.js';
import './chunk-UCJPSJN5.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=sanitize.js.map
//# sourceMappingURL=sanitize.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"sanitize.js"}
import { U as UfCode, w as TituloEleitorValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { D as DocumentFormat, v as TituloEleitor, V as ValidationErrorCode, x as ValidationResult } from './validation-result-BhQE-1_O.js';
/**
* Título de Eleitor constants — modulo 11 (TSE Res. 20.132/1998 + algorithm cross-checks).
* @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998 — Art. 10 (structure, mod 11)
* @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador — weights + SP/MG rule
* @see http://ghiorzi.org/DVnew.htm#e — algorithm cross-check
*/
declare const TITULO_ELEITOR_DV1_WEIGHTS_8: readonly [2, 3, 4, 5, 6, 7, 8, 9];
declare const TITULO_ELEITOR_DV1_WEIGHTS_9: readonly [9, 2, 3, 4, 5, 6, 7, 8, 9];
declare const TITULO_ELEITOR_DV2_WEIGHTS: readonly [7, 8, 9];
declare const TITULO_ELEITOR_SEQUENTIAL_LENGTH = 8;
declare const TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED = 9;
declare const TITULO_ELEITOR_LENGTH = 12;
declare const TITULO_ELEITOR_LENGTH_EXTENDED = 13;
declare const TITULO_ELEITOR_NUMERIC_PATTERN_12: RegExp;
declare const TITULO_ELEITOR_NUMERIC_PATTERN_13: RegExp;
/** TSE UF codes where remainder 0 maps DV to 1 instead of 0. */
declare const TITULO_ELEITOR_SPECIAL_UF_CODES: readonly [1, 2];
/** Golden primary — SC (UF=09), Wikipedia PT walkthrough. */
declare const TITULO_ELEITOR_GOLDEN_PRIMARY = "004356870906";
declare const TITULO_ELEITOR_GOLDEN_SP_SPECIAL = "000000000116";
declare const TITULO_ELEITOR_GOLDEN_SP_EXTENDED = "1234567890175";
declare const TITULO_ELEITOR_GOLDEN_EXTERIOR = "000000012895";
declare const TITULO_ELEITOR_GOLDEN_MASKED_INPUT = "0043 5687 0906";
/** Normative — Resolução TSE 20.132/1998, Art. 10 (8 seq + 2 UF + 2 DV, mod 11). */
declare const TITULO_ELEITOR_OFFICIAL_SOURCE_URL = "https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998";
/** Normative — Resolução TSE 23.659/2021 (Cadastro Eleitoral; confirms UF + DV structure). */
declare const TITULO_ELEITOR_NORMATIVE_SECONDARY_URL = "https://www.tse.jus.br/legislacao/compilada/res/2021/resolucao-no-23-659-de-26-de-outubro-de-2021";
/**
* Algorithm weights + SP/MG remainder-zero rule — not in TSE resolution text.
* Community consensus validated empirically (Wikipedia PT worked example).
*/
declare const TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL = "https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador";
/** Algorithm cross-check — Ghiorzi DV table. */
declare const TITULO_ELEITOR_ALGORITHM_REF_URL = "http://ghiorzi.org/DVnew.htm#e";
declare const TITULO_ELEITOR_TSE_PORTAL_URL = "https://www.tse.jus.br/";
declare const TITULO_ELEITOR_ETITULO_URL = "https://www.tse.jus.br/eleitor/servicos/aplicativo-e-titulo";
/** TSE electoral UF code → Brazilian UF (28 = exterior / ZZ). */
declare const TITULO_ELEITOR_UF_BY_CODE: Readonly<Record<number, UfCode>>;
declare const TITULO_ELEITOR_EXTERIOR_UF_CODE = 28;
declare function isValidTituloEleitor(input: string): boolean;
declare function validateTituloEleitor(input: string): TituloEleitorValidationResult;
/**
* Strip Título de Eleitor — digits only (BR-TITULO-002).
* @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador
*/
declare function stripTituloEleitor(input: string): string;
declare function formatTituloEleitor(input: string): FormatResult;
export { FormatResult, TITULO_ELEITOR_ALGORITHM_REF_URL, TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL, TITULO_ELEITOR_DV1_WEIGHTS_8, TITULO_ELEITOR_DV1_WEIGHTS_9, TITULO_ELEITOR_DV2_WEIGHTS, TITULO_ELEITOR_ETITULO_URL, TITULO_ELEITOR_EXTERIOR_UF_CODE, TITULO_ELEITOR_GOLDEN_EXTERIOR, TITULO_ELEITOR_GOLDEN_MASKED_INPUT, TITULO_ELEITOR_GOLDEN_PRIMARY, TITULO_ELEITOR_GOLDEN_SP_EXTENDED, TITULO_ELEITOR_GOLDEN_SP_SPECIAL, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED, TITULO_ELEITOR_NORMATIVE_SECONDARY_URL, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_OFFICIAL_SOURCE_URL, TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED, TITULO_ELEITOR_SPECIAL_UF_CODES, TITULO_ELEITOR_TSE_PORTAL_URL, TITULO_ELEITOR_UF_BY_CODE, TituloEleitorValidationResult, UfCode, formatTituloEleitor, isValidTituloEleitor, stripTituloEleitor, validateTituloEleitor };
export { formatTituloEleitor } from './chunk-PB4RIS6G.js';
export { TITULO_ELEITOR_ALGORITHM_REF_URL, TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL, TITULO_ELEITOR_DV1_WEIGHTS_8, TITULO_ELEITOR_DV1_WEIGHTS_9, TITULO_ELEITOR_DV2_WEIGHTS, TITULO_ELEITOR_ETITULO_URL, TITULO_ELEITOR_EXTERIOR_UF_CODE, TITULO_ELEITOR_GOLDEN_EXTERIOR, TITULO_ELEITOR_GOLDEN_MASKED_INPUT, TITULO_ELEITOR_GOLDEN_PRIMARY, TITULO_ELEITOR_GOLDEN_SP_EXTENDED, TITULO_ELEITOR_GOLDEN_SP_SPECIAL, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED, TITULO_ELEITOR_NORMATIVE_SECONDARY_URL, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_OFFICIAL_SOURCE_URL, TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED, TITULO_ELEITOR_SPECIAL_UF_CODES, TITULO_ELEITOR_TSE_PORTAL_URL, TITULO_ELEITOR_UF_BY_CODE, isValidTituloEleitor, validateTituloEleitor } from './chunk-MLPXW7N2.js';
export { stripTituloEleitor } from './chunk-YYHS5WQN.js';
import './chunk-4SNBZFS5.js';
import './chunk-EB3G4IG6.js';
import './chunk-UCJPSJN5.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=titulo-eleitor.js.map
//# sourceMappingURL=titulo-eleitor.js.map
{"version":3,"sources":[],"names":[],"mappings":"","file":"titulo-eleitor.js"}
type DocumentFormat = 'numeric' | 'alphanumeric' | 'legacy' | 'mercosul' | 'email' | 'phone' | 'evp' | 'linha-digitavel' | 'codigo-barras' | 'cartao-credito' | 'inscricao-estadual' | 'inscricao-estadual-produtor-rural' | '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 Cnh = string & {
readonly __brand: 'Cnh';
};
type Renavam = string & {
readonly __brand: 'Renavam';
};
type TituloEleitor = string & {
readonly __brand: 'TituloEleitor';
};
type NfeChave = string & {
readonly __brand: 'NfeChave';
};
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 InscricaoEstadualProdutorRural = string & {
readonly __brand: 'InscricaoEstadualProdutorRural';
};
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 IeProdutorRuralValidationResult = {
ok: true;
value: InscricaoEstadualProdutorRural;
uf: 'SP';
format: 'inscricao-estadual-produtor-rural';
} | {
ok: false;
code: ValidationErrorCode;
message: string;
uf?: UfCode;
};
type TituloEleitorValidationResult = {
ok: true;
value: TituloEleitor;
format: 'numeric';
ufCode: number;
uf?: UfCode;
exterior?: true;
} | {
ok: false;
code: ValidationErrorCode;
message: string;
ufCode?: number;
};
type NfeChaveParsed = {
cUF: string;
aamm: string;
cnpj: string;
mod: string;
serie: string;
nNF: string;
tpEmis: string;
cNF: string;
cDV: string;
};
type NfeChaveValidationResult = {
ok: true;
value: NfeChave;
format: 'numeric';
parsed: NfeChaveParsed;
uf?: UfCode;
} | {
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, IeProdutorRuralValidationResult as I, LinhaDigitavel as L, NfeChave as N, PisPasep as P, Renavam as R, 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, Cnh as g, Cnpj as h, CodigoBarras as i, Cpf as j, InscricaoEstadual as k, InscricaoEstadualProdutorRural as l, InscricaoEstadualValidationResult as m, NfeChaveParsed as n, NfeChaveValidationResult as o, PixKey as p, PixKeyType as q, PixValidationResult as r, Placa as s, TelefoneTipo as t, TelefoneValidationResult as u, TituloEleitor as v, TituloEleitorValidationResult as w, ValidationResult as x };
+2
-2

@@ -1,3 +0,3 @@

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';
import { b as BoletoValidationResult, V as ValidationErrorCode, B as BoletoInputKind, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { a as BoletoSituacao, i as CodigoBarras, D as DocumentFormat, L as LinhaDigitavel } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ /**

@@ -1,4 +0,5 @@

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';
export { formatBoleto } from './chunk-FXLVNCG3.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, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-4W4OKLSZ.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=boleto.js.map
//# sourceMappingURL=boleto.js.map

@@ -1,3 +0,3 @@

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';
import { p as PixKey, q as PixKeyType, V as ValidationErrorCode, d as BrCodeValidationResult } from './validation-result-BhQE-1_O.js';
export { c as BrCodePayload } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ /** Bacen Manual BR Code — EMV-QRCPS-MPM TLV + CRC16-CCITT */

@@ -1,10 +0,13 @@

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-RYGAK7PB.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-WCQUQ2WX.js';
import './chunk-MK7OJUF5.js';
import './chunk-XUO7FV6Z.js';
import './chunk-YXELVV37.js';
import './chunk-EB3G4IG6.js';
import './chunk-5BBNLRZP.js';
import './chunk-KQDLIGSG.js';
import './chunk-F6PTZY4O.js';
import './chunk-UCJPSJN5.js';
import './chunk-B2TDI3YS.js';
import './chunk-BBL6ZPXH.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=brcode.js.map
//# sourceMappingURL=brcode.js.map

@@ -1,3 +0,3 @@

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';
import { e as CartaoCreditoValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { C as CartaoCredito, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ /**

@@ -1,4 +0,6 @@

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';
import './chunk-CQPM43VV.js';
export { formatCartaoCredito } from './chunk-XKY2CV3G.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, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-EPKHEW5V.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=cartao-credito.js.map
//# sourceMappingURL=cartao-credito.js.map

@@ -1,3 +0,3 @@

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';
import { x as ValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { f as Cep, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ declare const CEP_GOLDEN_PRIMARY = "01310100";

@@ -1,7 +0,10 @@

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-2CNYSY3Z.js';
export { formatCep } from './chunk-ZAUZRIOU.js';
export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, isValidCep, validateCep } from './chunk-2JJS46FM.js';
export { stripCep } from './chunk-YYHS5WQN.js';
import './chunk-4SNBZFS5.js';
import './chunk-EB3G4IG6.js';
import './chunk-UCJPSJN5.js';
import './chunk-BBL6ZPXH.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=cep.js.map
//# sourceMappingURL=cep.js.map

@@ -1,3 +0,3 @@

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';
import { D as DocumentFormat, x as ValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { h as Cnpj, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ declare function detectCnpjFormat(stripped: string): DocumentFormat | 'unknown';

@@ -1,7 +0,9 @@

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';
import './chunk-LF2B4VPE.js';
export { formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric } from './chunk-LYBFUKHR.js';
import './chunk-XUO7FV6Z.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-YXELVV37.js';
export { stripCnpj } from './chunk-EB3G4IG6.js';
import './chunk-B2TDI3YS.js';
import './chunk-BBL6ZPXH.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=cnpj.js.map
//# sourceMappingURL=cnpj.js.map

@@ -1,3 +0,3 @@

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';
import { x as ValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { j as Cpf, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ declare const CPF_GOLDEN_PRIMARY = "12345678909";

@@ -1,7 +0,9 @@

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';
import './chunk-YGA5W54J.js';
export { formatCpf } from './chunk-NHLLC6WH.js';
import './chunk-KQDLIGSG.js';
export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, isValidCpf, validateCpf } from './chunk-F6PTZY4O.js';
export { stripCpf } from './chunk-UCJPSJN5.js';
import './chunk-B2TDI3YS.js';
import './chunk-BBL6ZPXH.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=cpf.js.map
//# sourceMappingURL=cpf.js.map
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-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';
import { F as FormatResult } from './validation-result-BhQE-1_O.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 Cnh, h as Cnpj, i as CodigoBarras, j as Cpf, D as DocumentFormat, I as IeProdutorRuralValidationResult, k as InscricaoEstadual, l as InscricaoEstadualProdutorRural, m as InscricaoEstadualValidationResult, L as LinhaDigitavel, N as NfeChave, n as NfeChaveParsed, o as NfeChaveValidationResult, P as PisPasep, p as PixKey, q as PixKeyType, r as PixValidationResult, s as Placa, R as Renavam, T as Telefone, t as TelefoneTipo, u as TelefoneValidationResult, v as TituloEleitor, w as TituloEleitorValidationResult, U as UfCode, V as ValidationErrorCode, x as ValidationResult } from './validation-result-BhQE-1_O.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 { CNH_BASE_LENGTH, CNH_DV1_WEIGHTS, CNH_DV2_WEIGHTS, CNH_GOLDEN_DISCOUNT_CASE, CNH_GOLDEN_PRIMARY, CNH_GOLDEN_PRIMARY_DECORATED_INPUT, CNH_GOLDEN_SECONDARY, CNH_LENGTH, CNH_OFFICIAL_SOURCE_URL, CNH_SENATRAN_VALIDAR_URL, formatCnh, isValidCnh, stripCnh, validateCnh } from './cnh.js';
export { RENAVAM_BASE_LENGTH, RENAVAM_DV_WEIGHTS, RENAVAM_GOLDEN_DASH_INPUT, RENAVAM_GOLDEN_DV_ZERO, RENAVAM_GOLDEN_LEADING_ZEROS, RENAVAM_GOLDEN_PRIMARY, RENAVAM_GOLDEN_SECONDARY, RENAVAM_LENGTH, RENAVAM_OFFICIAL_SOURCE_URL, RENAVAM_SENATRAN_CONSULTA_URL, formatRenavam, isValidRenavam, stripRenavam, validateRenavam } from './renavam.js';
export { TITULO_ELEITOR_ALGORITHM_REF_URL, TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL, TITULO_ELEITOR_DV1_WEIGHTS_8, TITULO_ELEITOR_DV1_WEIGHTS_9, TITULO_ELEITOR_DV2_WEIGHTS, TITULO_ELEITOR_ETITULO_URL, TITULO_ELEITOR_EXTERIOR_UF_CODE, TITULO_ELEITOR_GOLDEN_EXTERIOR, TITULO_ELEITOR_GOLDEN_MASKED_INPUT, TITULO_ELEITOR_GOLDEN_PRIMARY, TITULO_ELEITOR_GOLDEN_SP_EXTENDED, TITULO_ELEITOR_GOLDEN_SP_SPECIAL, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED, TITULO_ELEITOR_NORMATIVE_SECONDARY_URL, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_OFFICIAL_SOURCE_URL, TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED, TITULO_ELEITOR_SPECIAL_UF_CODES, TITULO_ELEITOR_TSE_PORTAL_URL, TITULO_ELEITOR_UF_BY_CODE, formatTituloEleitor, isValidTituloEleitor, stripTituloEleitor, validateTituloEleitor } from './titulo-eleitor.js';
export { NFE_CHAVE_BASE_LENGTH, NFE_CHAVE_DFE_PORTAL_URL, NFE_CHAVE_GOLDEN_PRIMARY, NFE_CHAVE_GOLDEN_SECONDARY, NFE_CHAVE_LENGTH, NFE_CHAVE_MOC_DV_SECTION_URL, NFE_CHAVE_MOC_ONLINE_URL, NFE_CHAVE_MOC_PDF_URL, NFE_CHAVE_MOD, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL, NFE_CHAVE_NUMERIC_PATTERN, NFE_CHAVE_OFFICIAL_SOURCE_URL, NFE_CHAVE_WEIGHT_CYCLE, NFE_IBGE_UF_BY_CODE, NFE_IBGE_UF_CODES, NFE_MODELOS, NFE_MODELO_NFCE, NFE_MODELO_NFE, NfeChaveParts, computeNfeChaveCheckDigit, computeNfeChaveWeightedSum, formatNfeChave, isValidNfeChave, isValidNfeChaveCheckDigit, parseNfeChave, parseNfeChaveParts, resolveNfeChaveCheckDigit, stripNfeChave, validateNfeChave } from './nfe-chave.js';
export { I as IE_DF_GOLDEN, a as IE_DF_GOLDEN_MASKED, b as IE_DF_OFFICIAL_SOURCE_URL, c as IE_MT_GOLDEN_CANONICAL, d as IE_MT_GOLDEN_LEGACY, e as IE_MT_OFFICIAL_SOURCE_URL, f as IE_OFFICIAL_SOURCE_URLS, g as IE_SP_GOLDEN, h as IE_SP_GOLDEN_MASKED, i as IE_SP_OFFICIAL_SOURCE_URL, j as IE_SP_RURAL_GOLDEN, k as IE_SP_RURAL_GOLDEN_MASKED, l as IE_SP_RURAL_LENGTH, m as IE_SP_RURAL_OFFICIAL_SOURCE_URL, n as IE_SUPPORTED_UFS, o as formatIeProdutorRural, p as getIeProdutorRuralOfficialSourceUrl, q as isSpRuralIeInput, r as isValidIeProdutorRural, s as stripIeSpRural, s as stripInscricaoEstadualProdutorRural, v as validateIeProdutorRural, t as validateIeSpRural } from './inscricao-estadual-produtor-rural-CfWUaggb.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';

@@ -11,5 +16,8 @@ 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 { 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-BtTx04Si.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-ddldLlb7.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';
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';
export { ValidateInscricaoEstadualOptions, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual } from './inscricao-estadual.js';
export { DetectOptions, DetectResult, DetectableDocumentType, detect } from './detect.js';
export { S as SanitizableDocumentType, a as SanitizeOptions, b as SanitizeResult, s as sanitize } from './index-CZLo9YOT.js';
export { GeneratableDocumentType, GenerateOptions, generate } from './generate.js';

@@ -16,0 +24,0 @@ /**

@@ -1,28 +0,63 @@

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-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';
import './chunk-G24G7WR5.js';
export { sanitize } from './chunk-7ZL7PZII.js';
import './chunk-ZH4RJNG7.js';
export { formatTituloEleitor } from './chunk-PB4RIS6G.js';
export { generate } from './chunk-LGD2JJBZ.js';
export { formatRenavam } from './chunk-CDGRHI7W.js';
export { RENAVAM_BASE_LENGTH, RENAVAM_DV_WEIGHTS, RENAVAM_GOLDEN_DASH_INPUT, RENAVAM_GOLDEN_DV_ZERO, RENAVAM_GOLDEN_LEADING_ZEROS, RENAVAM_GOLDEN_PRIMARY, RENAVAM_GOLDEN_SECONDARY, RENAVAM_LENGTH, RENAVAM_OFFICIAL_SOURCE_URL, RENAVAM_SENATRAN_CONSULTA_URL, isValidRenavam, validateRenavam } from './chunk-WLE2ENQA.js';
export { formatTelefone } from './chunk-G2Y63PIF.js';
import './chunk-MFNJTAUS.js';
import './chunk-GVK6IMBF.js';
import './chunk-QGMVUIDD.js';
export { formatIeProdutorRural } from './chunk-BFZPCEYB.js';
export { formatNfeChave } from './chunk-4Y2FBO57.js';
import './chunk-P55H5YRX.js';
import { formatPisPasep } from './chunk-IQGRFAQV.js';
export { formatPisPasep } from './chunk-IQGRFAQV.js';
import { formatPixKey } from './chunk-GRDUTHNX.js';
export { formatPixKey } from './chunk-GRDUTHNX.js';
import './chunk-JQABTHUJ.js';
import { formatPlaca } from './chunk-G32U6YQ5.js';
export { formatPlaca } from './chunk-G32U6YQ5.js';
import { formatBoleto } from './chunk-FXLVNCG3.js';
export { formatBoleto } from './chunk-FXLVNCG3.js';
import './chunk-RYGAK7PB.js';
import './chunk-CQPM43VV.js';
import { formatCartaoCredito } from './chunk-XKY2CV3G.js';
export { formatCartaoCredito } from './chunk-XKY2CV3G.js';
import './chunk-2CNYSY3Z.js';
import { formatCep } from './chunk-ZAUZRIOU.js';
export { formatCep } from './chunk-ZAUZRIOU.js';
import './chunk-Y2KUN2D3.js';
export { formatCnh } from './chunk-6QJFMOIX.js';
import './chunk-LF2B4VPE.js';
import { formatCnpj } from './chunk-LYBFUKHR.js';
export { formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric } from './chunk-LYBFUKHR.js';
import './chunk-YGA5W54J.js';
import { formatCpf } from './chunk-NHLLC6WH.js';
export { formatCpf } from './chunk-NHLLC6WH.js';
export { detect } from './chunk-OCYXNLHO.js';
export { TITULO_ELEITOR_ALGORITHM_REF_URL, TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL, TITULO_ELEITOR_DV1_WEIGHTS_8, TITULO_ELEITOR_DV1_WEIGHTS_9, TITULO_ELEITOR_DV2_WEIGHTS, TITULO_ELEITOR_ETITULO_URL, TITULO_ELEITOR_EXTERIOR_UF_CODE, TITULO_ELEITOR_GOLDEN_EXTERIOR, TITULO_ELEITOR_GOLDEN_MASKED_INPUT, TITULO_ELEITOR_GOLDEN_PRIMARY, TITULO_ELEITOR_GOLDEN_SP_EXTENDED, TITULO_ELEITOR_GOLDEN_SP_SPECIAL, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED, TITULO_ELEITOR_NORMATIVE_SECONDARY_URL, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_OFFICIAL_SOURCE_URL, TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED, TITULO_ELEITOR_SPECIAL_UF_CODES, TITULO_ELEITOR_TSE_PORTAL_URL, TITULO_ELEITOR_UF_BY_CODE, isValidTituloEleitor, validateTituloEleitor } from './chunk-MLPXW7N2.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, isValidTelefone, normalizeTelefoneDigits, stripTelefone, validateTelefone } from './chunk-5UL3M7IU.js';
export { formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual } from './chunk-3QP6R46N.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_SP_RURAL_GOLDEN, IE_SP_RURAL_GOLDEN_MASKED, IE_SP_RURAL_LENGTH, IE_SP_RURAL_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, getIeProdutorRuralOfficialSourceUrl, isSpRuralIeInput, isValidIeProdutorRural, stripIeSpRural, stripIeSpRural as stripInscricaoEstadualProdutorRural, validateIeProdutorRural, validateIeSpRural } from './chunk-Y6IW2LMW.js';
export { NFE_CHAVE_BASE_LENGTH, NFE_CHAVE_DFE_PORTAL_URL, NFE_CHAVE_GOLDEN_PRIMARY, NFE_CHAVE_GOLDEN_SECONDARY, NFE_CHAVE_LENGTH, NFE_CHAVE_MOC_DV_SECTION_URL, NFE_CHAVE_MOC_ONLINE_URL, NFE_CHAVE_MOC_PDF_URL, NFE_CHAVE_MOD, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE, NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL, NFE_CHAVE_NUMERIC_PATTERN, NFE_CHAVE_OFFICIAL_SOURCE_URL, NFE_CHAVE_WEIGHT_CYCLE, NFE_IBGE_UF_BY_CODE, NFE_IBGE_UF_CODES, NFE_MODELOS, NFE_MODELO_NFCE, NFE_MODELO_NFE, computeNfeChaveCheckDigit, computeNfeChaveWeightedSum, isValidNfeChave, isValidNfeChaveCheckDigit, parseNfeChave, parseNfeChaveParts, resolveNfeChaveCheckDigit, validateNfeChave } from './chunk-D36RM7OD.js';
export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, isValidPisPasep, stripPisPasep, validatePisPasep } from './chunk-KH7DWOUA.js';
export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca } from './chunk-WPL47PWJ.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, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-4W4OKLSZ.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-WCQUQ2WX.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-MK7OJUF5.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, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-EPKHEW5V.js';
export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, isValidCep, validateCep } from './chunk-2JJS46FM.js';
export { CNH_BASE_LENGTH, CNH_DV1_WEIGHTS, CNH_DV2_WEIGHTS, CNH_GOLDEN_DISCOUNT_CASE, CNH_GOLDEN_PRIMARY, CNH_GOLDEN_PRIMARY_DECORATED_INPUT, CNH_GOLDEN_SECONDARY, CNH_LENGTH, CNH_OFFICIAL_SOURCE_URL, CNH_SENATRAN_VALIDAR_URL, isValidCnh, validateCnh } from './chunk-US4OLTJ2.js';
export { stripCep, stripCnh, stripPlaca, stripRenavam, stripTituloEleitor } from './chunk-YYHS5WQN.js';
export { stripNfeChave } from './chunk-4SNBZFS5.js';
import './chunk-XUO7FV6Z.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-YXELVV37.js';
export { stripCnpj } from './chunk-EB3G4IG6.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';
import './chunk-KQDLIGSG.js';
export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, isValidCpf, validateCpf } from './chunk-F6PTZY4O.js';
export { stripCpf } from './chunk-UCJPSJN5.js';
import './chunk-B2TDI3YS.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';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';

@@ -29,0 +64,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,23 +0,6 @@

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';
import { m as InscricaoEstadualValidationResult, U as UfCode, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { I as IeProdutorRuralValidationResult, k as InscricaoEstadual, l as InscricaoEstadualProdutorRural } from './validation-result-BhQE-1_O.js';
export { I as IE_DF_GOLDEN, a as IE_DF_GOLDEN_MASKED, u as IE_DF_LENGTH, b as IE_DF_OFFICIAL_SOURCE_URL, c as IE_MT_GOLDEN_CANONICAL, d as IE_MT_GOLDEN_LEGACY, e as IE_MT_OFFICIAL_SOURCE_URL, f as IE_OFFICIAL_SOURCE_URLS, g as IE_SP_GOLDEN, h as IE_SP_GOLDEN_MASKED, i as IE_SP_OFFICIAL_SOURCE_URL, j as IE_SP_RURAL_GOLDEN, k as IE_SP_RURAL_GOLDEN_MASKED, m as IE_SP_RURAL_OFFICIAL_SOURCE_URL, n as IE_SUPPORTED_UFS, o as formatIeProdutorRural, p as getIeProdutorRuralOfficialSourceUrl, q as isSpRuralIeInput, r as isValidIeProdutorRural, s as stripIeSpRural, v as validateIeProdutorRural, t as validateIeSpRural } from './inscricao-estadual-produtor-rural-CfWUaggb.js';
/**
* Inscrição Estadual — per-UF constants (27 UFs).
* @see docs/IE-STATE-ALGORITHMS.md
*/
declare const IE_SUPPORTED_UFS: readonly UfCode[];
declare const IE_OFFICIAL_SOURCE_URLS: Readonly<Record<UfCode, string>>;
declare const IE_SP_GOLDEN = "110042490114";
declare const IE_SP_GOLDEN_MASKED = "110.042.490.114";
declare const IE_SP_OFFICIAL_SOURCE_URL: string;
declare const IE_MT_GOLDEN_LEGACY = "00130000019";
declare const IE_MT_GOLDEN_CANONICAL = "130000019";
declare const IE_MT_OFFICIAL_SOURCE_URL: string;
declare const IE_DF_LENGTH = 13;
declare const IE_DF_GOLDEN = "0730000100109";
declare const IE_DF_GOLDEN_MASKED = "073.00001.001-09";
declare const IE_DF_OFFICIAL_SOURCE_URL: string;
/**
* Distrito Federal IE validation — CF/DF 13 digits, dual modulo-11 DVs.

@@ -57,2 +40,2 @@ * @see BR-IE-DF-001

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, InscricaoEstadualValidationResult, UfCode, type ValidateInscricaoEstadualOptions, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual };
export { InscricaoEstadualValidationResult, UfCode, type ValidateInscricaoEstadualOptions, formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual };

@@ -1,4 +0,7 @@

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';
import './chunk-QGMVUIDD.js';
export { formatIeProdutorRural } from './chunk-BFZPCEYB.js';
export { formatInscricaoEstadual, getIeOfficialSourceUrl, isValidInscricaoEstadual, stripInscricaoEstadual, validateIeDf, validateIeMt, validateIeSp, validateInscricaoEstadual } from './chunk-3QP6R46N.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_SP_RURAL_GOLDEN, IE_SP_RURAL_GOLDEN_MASKED, IE_SP_RURAL_OFFICIAL_SOURCE_URL, IE_SUPPORTED_UFS, getIeProdutorRuralOfficialSourceUrl, isSpRuralIeInput, isValidIeProdutorRural, stripIeSpRural, validateIeProdutorRural, validateIeSpRural } from './chunk-Y6IW2LMW.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=inscricao-estadual.js.map
//# sourceMappingURL=inscricao-estadual.js.map

@@ -1,3 +0,3 @@

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';
import { x as ValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { D as DocumentFormat, P as PisPasep, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ declare const PIS_PASEP_GOLDEN_PRIMARY = "10027230888";

@@ -1,5 +0,7 @@

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-BBL6ZPXH.js';
import './chunk-P55H5YRX.js';
export { formatPisPasep } from './chunk-IQGRFAQV.js';
export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, isValidPisPasep, stripPisPasep, validatePisPasep } from './chunk-KH7DWOUA.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=pis-pasep.js.map
//# sourceMappingURL=pis-pasep.js.map

@@ -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-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';
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-ddldLlb7.js';
export { D as DocumentFormat, p as PixKey, q as PixKeyType, r as PixValidationResult, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ declare function applyPixCpfKeyMask(canonical: string): string;

@@ -1,10 +0,12 @@

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';
export { formatPixKey } from './chunk-GRDUTHNX.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-MK7OJUF5.js';
import './chunk-XUO7FV6Z.js';
import './chunk-YXELVV37.js';
import './chunk-EB3G4IG6.js';
import './chunk-5BBNLRZP.js';
import './chunk-KQDLIGSG.js';
import './chunk-F6PTZY4O.js';
import './chunk-UCJPSJN5.js';
import './chunk-B2TDI3YS.js';
import './chunk-BBL6ZPXH.js';
import './chunk-OTZHMJYE.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=pix.js.map
//# sourceMappingURL=pix.js.map

@@ -1,3 +0,3 @@

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';
import { F as FormatResult, x as ValidationResult, s as Placa } from './validation-result-BhQE-1_O.js';
export { D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ declare const PLACA_GOLDEN_MERCOSUL = "ABC1D23";

@@ -1,7 +0,10 @@

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-JQABTHUJ.js';
export { formatPlaca } from './chunk-G32U6YQ5.js';
export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca } from './chunk-WPL47PWJ.js';
export { stripPlaca } from './chunk-YYHS5WQN.js';
import './chunk-4SNBZFS5.js';
import './chunk-EB3G4IG6.js';
import './chunk-UCJPSJN5.js';
import './chunk-BBL6ZPXH.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=placa.js.map
//# sourceMappingURL=placa.js.map

@@ -1,3 +0,3 @@

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';
import { u as TelefoneValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
export { D as DocumentFormat, T as Telefone, t as TelefoneTipo, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';

@@ -4,0 +4,0 @@ /** 67 official Anatel national area codes (CN / DDD). */

@@ -1,4 +0,6 @@

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';
import './chunk-ZH4RJNG7.js';
export { formatTelefone } from './chunk-G2Y63PIF.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, isValidTelefone, normalizeTelefoneDigits, stripTelefone, validateTelefone } from './chunk-5UL3M7IU.js';
import './chunk-MSLJF2FM.js';
//# sourceMappingURL=telefone.js.map
//# sourceMappingURL=telefone.js.map
{
"name": "@br-validators/core",
"version": "0.11.0-alpha.0",
"version": "0.12.0-alpha.0",
"description": "100% open-source Brazilian document validators — CPF, CNPJ, CEP, IE (27 UFs), PIX, boleto, and more",

@@ -54,2 +54,18 @@ "license": "MIT",

},
"./cnh": {
"types": "./dist/cnh.d.ts",
"import": "./dist/cnh.js"
},
"./renavam": {
"types": "./dist/renavam.d.ts",
"import": "./dist/renavam.js"
},
"./titulo-eleitor": {
"types": "./dist/titulo-eleitor.d.ts",
"import": "./dist/titulo-eleitor.js"
},
"./nfe-chave": {
"types": "./dist/nfe-chave.d.ts",
"import": "./dist/nfe-chave.js"
},
"./brcode": {

@@ -82,2 +98,18 @@ "types": "./dist/brcode.d.ts",

"import": "./dist/inscricao-estadual.js"
},
"./inscricao-estadual-produtor-rural": {
"types": "./dist/inscricao-estadual-produtor-rural.d.ts",
"import": "./dist/inscricao-estadual-produtor-rural.js"
},
"./detect": {
"types": "./dist/detect.d.ts",
"import": "./dist/detect.js"
},
"./sanitize": {
"types": "./dist/sanitize.d.ts",
"import": "./dist/sanitize.js"
},
"./generate": {
"types": "./dist/generate.d.ts",
"import": "./dist/generate.js"
}

@@ -84,0 +116,0 @@ },

@@ -29,2 +29,5 @@ # @br-validators/core

| CEP | `validateCep`, `formatCep`, `stripCep` | `01310100` |
| Telefone | `validateTelefone`, `formatTelefone`, `stripTelefone` | `11999999999` |
| CNH | `validateCnh`, `formatCnh`, `stripCnh` | `62472927637` (11 digits, no CPF mask) |
| RENAVAM | `validateRenavam`, `formatRenavam`, `stripRenavam` | `63977791104` (11 digits, modulo 11 peso 9) |
| Placa | `validatePlaca`, `formatPlaca`, `convertPlacaToMercosul` | `ABC1D23` |

@@ -31,0 +34,0 @@ | PIS/PASEP | `validatePisPasep`, `formatPisPasep` | `10027230888` |

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":";;;;AAKO,IAAM,YAAA,GAAe,CAAA;AACrB,IAAM,oBAAA,GAAuB,oBAAA;AAC7B,IAAM,sBAAA,GAAyB,iCAAA;AAC/B,IAAM,4BAAA,GAAuD;AAAA,EAClE,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AACO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,mBAAA,GAAsB;AAC5B,IAAM,4BAAA,GAA+B;AACrC,IAAM,0BAAA,GAA6B;AACnC,IAAM,yBAAA,GACX;;;AChBK,SAAS,kBAAkB,KAAA,EAA4B;AAC5D,EAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,EAAA,IAAI,QAAA,CAAS,WAAW,YAAA,EAAc;AACpC,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACzC,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA;AACT;;;ACdO,SAAS,mBAAmB,KAAA,EAAwB;AACzD,EAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,EAAA,OAAO,oBAAA,CAAqB,KAAK,QAAQ,CAAA;AAC3C;;;ACHO,SAAS,qBAAqB,KAAA,EAAwB;AAC3D,EAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,EAAA,OAAO,sBAAA,CAAuB,KAAK,QAAQ,CAAA;AAC7C;;;ACCA,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEO,SAAS,uBAAuB,KAAA,EAA6B;AAClE,EAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,eAAe,sBAAsB,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,KAAM,QAAA,EAAU;AACzC,IAAA,OAAO,OAAA,CAAQ,sBAAsB,oDAAoD,CAAA;AAAA,EAC3F;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AAC/B,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAG;AAC9D;;;ACJA,SAASA,QAAAA,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,OAAOA,QAAAA,CAAQ,eAAe,sBAAsB,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACpD,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,iBAAiB,CAAA,EAAG;AAC1C,IAAA,OAAOA,QAAAA,CAAQ,qBAAqB,mCAAmC,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,YAAA,EAAc;AACpC,IAAA,OAAOA,QAAAA,CAAQ,gBAAA,EAAkB,CAAA,gBAAA,EAAmB,YAAY,CAAA,+BAAA,CAAiC,CAAA;AAAA,EACnG;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,OAAO,aAAA,CAAc,KAAK,CAAA,CAAE,EAAA;AAC9B;AAEO,SAAS,cAAc,KAAA,EAAwC;AACpE,EAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AACpD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,OAAOA,QAAAA,CAAQ,sBAAsB,gDAAgD,CAAA;AAAA,EACvF;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,UAAA,CAAW,QAAQ,GAAG,MAAA,EAAiC;AACnF;;;AC5DO,SAAS,YAAY,KAAA,EAA6B;AACvD,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,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,SAAA,EAAW,OAAO,KAAA,EAAM;AAC7C","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/core/cnpj/modulo11.ts
function modulo11CheckDigit(sum) {
const remainder = sum % 11;
return remainder < 2 ? 0 : 11 - remainder;
}
function weightedSum(values, weights) {
let sum = 0;
for (let i = 0; i < weights.length; i++) {
sum += values[i] * weights[i];
}
return sum;
}
function computeCheckDigit(chars, weights, valueFn) {
const values = [];
for (let i = 0; i < chars.length; i++) {
values.push(valueFn(chars.charAt(i)));
}
return modulo11CheckDigit(weightedSum(values, weights));
}
export { computeCheckDigit };
//# sourceMappingURL=chunk-B2TDI3YS.js.map
//# sourceMappingURL=chunk-B2TDI3YS.js.map
{"version":3,"sources":["../src/core/cnpj/modulo11.ts"],"names":[],"mappings":";AAIO,SAAS,mBAAmB,GAAA,EAAqB;AACtD,EAAA,MAAM,YAAY,GAAA,GAAM,EAAA;AACxB,EAAA,OAAO,SAAA,GAAY,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,SAAA;AAClC;AAEO,SAAS,WAAA,CAAY,QAAkB,OAAA,EAAoC;AAChF,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,GAAA,IAAO,MAAA,CAAO,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,KAAA,EAAe,OAAA,EAA4B,OAAA,EAAwC;AACnH,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,CAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,kBAAA,CAAmB,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAC,CAAA;AACxD","file":"chunk-B2TDI3YS.js","sourcesContent":["/**\n * Modulo 11 check digit — RFB Q14 remainder rule.\n * @see https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf\n */\nexport function modulo11CheckDigit(sum: number): number {\n const remainder = sum % 11;\n return remainder < 2 ? 0 : 11 - remainder;\n}\n\nexport function weightedSum(values: number[], weights: readonly number[]): number {\n let sum = 0;\n for (let i = 0; i < weights.length; i++) {\n sum += values[i] * weights[i];\n }\n return sum;\n}\n\nexport function computeCheckDigit(chars: string, weights: readonly number[], valueFn: (c: string) => number): number {\n const values: number[] = [];\n for (let i = 0; i < chars.length; i++) {\n values.push(valueFn(chars.charAt(i)));\n }\n return modulo11CheckDigit(weightedSum(values, weights));\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"]}
// src/strip/cep.ts
function stripCep(input) {
return input.replace(/\D/g, "");
}
// src/strip/placa.ts
function stripPlaca(input) {
return input.replace(/[^A-Za-z0-9]/g, "").toUpperCase();
}
export { stripCep, stripPlaca };
//# sourceMappingURL=chunk-W6UXVWSR.js.map
//# sourceMappingURL=chunk-W6UXVWSR.js.map
{"version":3,"sources":["../src/strip/cep.ts","../src/strip/placa.ts"],"names":[],"mappings":";AAIO,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACFO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,eAAA,EAAiB,EAAE,EAAE,WAAA,EAAY;AACxD","file":"chunk-W6UXVWSR.js","sourcesContent":["/**\n * Strip CEP mask — digits only (BR-CEP-001).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n */\nexport function stripCep(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip placa mask — preserve A-Z0-9, uppercase (BR-PLACA-004).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nexport function stripPlaca(input: string): string {\n return input.replace(/[^A-Za-z0-9]/g, '').toUpperCase();\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 };
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 };