@br-validators/core 0.10.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +91 -0
- package/dist/boleto.d.ts +113 -0
- package/dist/boleto.js +4 -0
- package/dist/boleto.js.map +1 -0
- package/dist/cartao-credito.d.ts +47 -0
- package/dist/cartao-credito.js +4 -0
- package/dist/cartao-credito.js.map +1 -0
- package/dist/cep.d.ts +20 -0
- package/dist/cep.js +7 -0
- package/dist/cep.js.map +1 -0
- package/dist/chunk-54DTXC6V.js +207 -0
- package/dist/chunk-54DTXC6V.js.map +1 -0
- package/dist/chunk-7FOWIH6F.js +20 -0
- package/dist/chunk-7FOWIH6F.js.map +1 -0
- package/dist/chunk-AKJHIJ5E.js +387 -0
- package/dist/chunk-AKJHIJ5E.js.map +1 -0
- package/dist/chunk-B2TDI3YS.js +23 -0
- package/dist/chunk-B2TDI3YS.js.map +1 -0
- package/dist/chunk-DKRM66US.js +35 -0
- package/dist/chunk-DKRM66US.js.map +1 -0
- package/dist/chunk-EB3G4IG6.js +8 -0
- package/dist/chunk-EB3G4IG6.js.map +1 -0
- package/dist/chunk-M66MGLHE.js +156 -0
- package/dist/chunk-M66MGLHE.js.map +1 -0
- package/dist/chunk-OWJ5HN4T.js +91 -0
- package/dist/chunk-OWJ5HN4T.js.map +1 -0
- package/dist/chunk-PBNVKDCF.js +82 -0
- package/dist/chunk-PBNVKDCF.js.map +1 -0
- package/dist/chunk-RMKTJQBB.js +61 -0
- package/dist/chunk-RMKTJQBB.js.map +1 -0
- package/dist/chunk-RZ2JG5PP.js +14 -0
- package/dist/chunk-RZ2JG5PP.js.map +1 -0
- package/dist/chunk-SE33CFGM.js +276 -0
- package/dist/chunk-SE33CFGM.js.map +1 -0
- package/dist/chunk-UCJPSJN5.js +8 -0
- package/dist/chunk-UCJPSJN5.js.map +1 -0
- package/dist/chunk-W6UXVWSR.js +13 -0
- package/dist/chunk-W6UXVWSR.js.map +1 -0
- package/dist/chunk-YY4M2YS6.js +115 -0
- package/dist/chunk-YY4M2YS6.js.map +1 -0
- package/dist/chunk-Z4F75QEC.js +1180 -0
- package/dist/chunk-Z4F75QEC.js.map +1 -0
- package/dist/cnpj.d.ts +37 -0
- package/dist/cnpj.js +7 -0
- package/dist/cnpj.js.map +1 -0
- package/dist/cpf.d.ts +20 -0
- package/dist/cpf.js +7 -0
- package/dist/cpf.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/inscricao-estadual.d.ts +57 -0
- package/dist/inscricao-estadual.js +4 -0
- package/dist/inscricao-estadual.js.map +1 -0
- package/dist/pis-pasep.d.ts +20 -0
- package/dist/pis-pasep.js +5 -0
- package/dist/pis-pasep.js.map +1 -0
- package/dist/pix-DP6jnwpN.d.ts +44 -0
- package/dist/pix.d.ts +11 -0
- package/dist/pix.js +9 -0
- package/dist/pix.js.map +1 -0
- package/dist/placa.d.ts +35 -0
- package/dist/placa.js +7 -0
- package/dist/placa.js.map +1 -0
- package/dist/validation-result-BK4qJuei.d.ts +101 -0
- package/package.json +91 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { stripCnpj } from './chunk-EB3G4IG6.js';
|
|
2
|
+
import { computeCheckDigit } from './chunk-B2TDI3YS.js';
|
|
3
|
+
import { brandCnpj } from './chunk-DKRM66US.js';
|
|
4
|
+
|
|
5
|
+
// src/core/cnpj/constants.ts
|
|
6
|
+
var CNPJ_LENGTH = 14;
|
|
7
|
+
var CNPJ_BASE_LENGTH = 12;
|
|
8
|
+
var CNPJ_DV1_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
9
|
+
var CNPJ_DV2_WEIGHTS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
10
|
+
var CNPJ_ALPHANUMERIC_PATTERN = /^[A-Z0-9]{12}[0-9]{2}$/;
|
|
11
|
+
var CNPJ_NUMERIC_PATTERN = /^[0-9]{14}$/;
|
|
12
|
+
var CNPJ_OFFICIAL_SOURCE_URL = "https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf";
|
|
13
|
+
var CNPJ_GOLDEN_ALPHANUMERIC = "12ABC34501DE35";
|
|
14
|
+
var CNPJ_GOLDEN_NUMERIC = "11222333000181";
|
|
15
|
+
var CNPJ_GOLDEN_NUMERIC_MASKED = "11.222.333/0001-81";
|
|
16
|
+
var CNPJ_GOLDEN_ALPHANUMERIC_MASKED = "12.ABC.345/01DE-35";
|
|
17
|
+
var CNPJ_MASK_PATTERN = /^(.{2})(.{3})(.{3})(.{4})(.{2})$/;
|
|
18
|
+
|
|
19
|
+
// src/core/cnpj/ascii-value.ts
|
|
20
|
+
function cnpjCharValue(char) {
|
|
21
|
+
return char.charCodeAt(0) - 48;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// src/core/cnpj/alphanumeric.ts
|
|
25
|
+
function hasRepeatedChars(value) {
|
|
26
|
+
const first = value[0];
|
|
27
|
+
for (let i = 1; i < value.length; i++) {
|
|
28
|
+
if (value[i] !== first) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
function isValidStructure(canonical) {
|
|
35
|
+
return canonical.length === CNPJ_LENGTH && CNPJ_ALPHANUMERIC_PATTERN.test(canonical);
|
|
36
|
+
}
|
|
37
|
+
function isValidCnpjAlphanumeric(input) {
|
|
38
|
+
const canonical = input.toUpperCase();
|
|
39
|
+
if (!isValidStructure(canonical)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
if (hasRepeatedChars(canonical)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const base = canonical.slice(0, CNPJ_BASE_LENGTH);
|
|
46
|
+
const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, cnpjCharValue));
|
|
47
|
+
const dv2Expected = String(
|
|
48
|
+
computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, cnpjCharValue)
|
|
49
|
+
);
|
|
50
|
+
return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/core/cnpj/detect.ts
|
|
54
|
+
function detectCnpjFormat(stripped) {
|
|
55
|
+
const upper = stripped.toUpperCase();
|
|
56
|
+
if (CNPJ_NUMERIC_PATTERN.test(upper)) {
|
|
57
|
+
return "numeric";
|
|
58
|
+
}
|
|
59
|
+
if (CNPJ_ALPHANUMERIC_PATTERN.test(upper)) {
|
|
60
|
+
return "alphanumeric";
|
|
61
|
+
}
|
|
62
|
+
return "unknown";
|
|
63
|
+
}
|
|
64
|
+
function containsLetter(value) {
|
|
65
|
+
return /[A-Za-z]/.test(value);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/core/cnpj/numeric.ts
|
|
69
|
+
function digitValue(char) {
|
|
70
|
+
return Number(char);
|
|
71
|
+
}
|
|
72
|
+
function hasRepeatedDigits(value) {
|
|
73
|
+
const first = value[0];
|
|
74
|
+
for (let i = 1; i < value.length; i++) {
|
|
75
|
+
if (value[i] !== first) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
function isValidCnpjNumeric(input) {
|
|
82
|
+
const canonical = input.replace(/\D/g, "");
|
|
83
|
+
if (!CNPJ_NUMERIC_PATTERN.test(canonical)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (hasRepeatedDigits(canonical)) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
const base = canonical.slice(0, CNPJ_BASE_LENGTH);
|
|
90
|
+
const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, digitValue));
|
|
91
|
+
const dv2Expected = String(
|
|
92
|
+
computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, digitValue)
|
|
93
|
+
);
|
|
94
|
+
return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// src/core/cnpj/index.ts
|
|
98
|
+
function failure(code, message) {
|
|
99
|
+
return { ok: false, code, message };
|
|
100
|
+
}
|
|
101
|
+
function validateStructure(input, stripped) {
|
|
102
|
+
if (stripped.length === 0) {
|
|
103
|
+
return failure("EMPTY_INPUT", "CNPJ input is empty");
|
|
104
|
+
}
|
|
105
|
+
const withoutMask = input.replace(/[.\-/]/g, "");
|
|
106
|
+
if (/[^A-Za-z0-9]/.test(withoutMask)) {
|
|
107
|
+
return failure("INVALID_CHARACTER", "CNPJ contains invalid characters");
|
|
108
|
+
}
|
|
109
|
+
if (stripped.length !== CNPJ_LENGTH) {
|
|
110
|
+
return failure("INVALID_LENGTH", `CNPJ must have ${CNPJ_LENGTH} characters after normalization`);
|
|
111
|
+
}
|
|
112
|
+
const format = detectCnpjFormat(stripped);
|
|
113
|
+
if (format === "unknown") {
|
|
114
|
+
return failure("UNSUPPORTED_FORMAT", "CNPJ format is not numeric or alphanumeric");
|
|
115
|
+
}
|
|
116
|
+
return { format };
|
|
117
|
+
}
|
|
118
|
+
function isValidCnpj(input) {
|
|
119
|
+
return validateCnpj(input).ok;
|
|
120
|
+
}
|
|
121
|
+
function validateCnpj(input) {
|
|
122
|
+
const stripped = stripCnpj(input);
|
|
123
|
+
const structural = validateStructure(input, stripped);
|
|
124
|
+
if ("ok" in structural) {
|
|
125
|
+
return structural;
|
|
126
|
+
}
|
|
127
|
+
const { format } = structural;
|
|
128
|
+
if (format === "numeric" || !containsLetter(stripped)) {
|
|
129
|
+
if (isValidCnpjNumeric(stripped)) {
|
|
130
|
+
return { ok: true, value: brandCnpj(stripped), format: "numeric" };
|
|
131
|
+
}
|
|
132
|
+
if (format === "numeric") {
|
|
133
|
+
if (/^(\d)\1{13}$/.test(stripped)) {
|
|
134
|
+
return failure("KNOWN_INVALID_PATTERN", "CNPJ with all identical digits is invalid");
|
|
135
|
+
}
|
|
136
|
+
return failure("INVALID_CHECK_DIGIT", "CNPJ check digits are invalid");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (isValidCnpjAlphanumeric(stripped)) {
|
|
140
|
+
return { ok: true, value: brandCnpj(stripped), format: "alphanumeric" };
|
|
141
|
+
}
|
|
142
|
+
return failure("INVALID_CHECK_DIGIT", "CNPJ check digits are invalid");
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// src/core/cnpj/mask.ts
|
|
146
|
+
function applyCnpjMask(canonical) {
|
|
147
|
+
const match = CNPJ_MASK_PATTERN.exec(canonical);
|
|
148
|
+
if (!match) {
|
|
149
|
+
throw new Error("CNPJ must have exactly 14 characters to apply mask");
|
|
150
|
+
}
|
|
151
|
+
return `${match[1]}.${match[2]}.${match[3]}/${match[4]}-${match[5]}`;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
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 };
|
|
155
|
+
//# sourceMappingURL=chunk-M66MGLHE.js.map
|
|
156
|
+
//# sourceMappingURL=chunk-M66MGLHE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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-M66MGLHE.js","sourcesContent":["/**\n * CNPJ constants — modulo 11 weights from RFB FAQ Q14.\n * @see https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf\n */\nexport const CNPJ_LENGTH = 14;\nexport const CNPJ_BASE_LENGTH = 12;\n\nexport const CNPJ_DV1_WEIGHTS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CNPJ_DV2_WEIGHTS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\n\nexport const CNPJ_ALPHANUMERIC_PATTERN = /^[A-Z0-9]{12}[0-9]{2}$/;\nexport const CNPJ_NUMERIC_PATTERN = /^[0-9]{14}$/;\n\nexport const CNPJ_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf';\n\n/** RFB Q14 golden vector */\nexport const CNPJ_GOLDEN_ALPHANUMERIC = '12ABC34501DE35';\n\n/** Valid numeric CNPJ for regression tests (modulo 11) */\nexport const CNPJ_GOLDEN_NUMERIC = '11222333000181';\nexport const CNPJ_GOLDEN_NUMERIC_MASKED = '11.222.333/0001-81';\nexport const CNPJ_GOLDEN_ALPHANUMERIC_MASKED = '12.ABC.345/01DE-35';\n\nexport const CNPJ_MASK_PATTERN = /^(.{2})(.{3})(.{3})(.{4})(.{2})$/;\n","/**\n * Character value for CNPJ modulo 11 — ASCII decimal minus 48 (RFB Q14).\n * @see https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf\n */\nexport function cnpjCharValue(char: string): number {\n return char.charCodeAt(0) - 48;\n}\n","import { CNPJ_ALPHANUMERIC_PATTERN, CNPJ_BASE_LENGTH, CNPJ_DV1_WEIGHTS, CNPJ_DV2_WEIGHTS, CNPJ_LENGTH } from './constants.js';\nimport { cnpjCharValue } from './ascii-value.js';\nimport { computeCheckDigit } from './modulo11.js';\n\nfunction hasRepeatedChars(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction isValidStructure(canonical: string): boolean {\n return canonical.length === CNPJ_LENGTH && CNPJ_ALPHANUMERIC_PATTERN.test(canonical);\n}\n\n/**\n * Alphanumeric CNPJ — ASCII-48 modulo 11 (RFB Q14).\n * Golden vector: 12ABC34501DE35\n */\nexport function isValidCnpjAlphanumeric(input: string): boolean {\n const canonical = input.toUpperCase();\n if (!isValidStructure(canonical)) {\n return false;\n }\n if (hasRepeatedChars(canonical)) {\n return false;\n }\n\n const base = canonical.slice(0, CNPJ_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, cnpjCharValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, cnpjCharValue),\n );\n\n return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n","import { CNPJ_ALPHANUMERIC_PATTERN, CNPJ_NUMERIC_PATTERN } from './constants.js';\nimport type { DocumentFormat } from '../../types/validation-result.js';\n\nexport function detectCnpjFormat(stripped: string): DocumentFormat | 'unknown' {\n const upper = stripped.toUpperCase();\n if (CNPJ_NUMERIC_PATTERN.test(upper)) {\n return 'numeric';\n }\n if (CNPJ_ALPHANUMERIC_PATTERN.test(upper)) {\n return 'alphanumeric';\n }\n return 'unknown';\n}\n\nexport function containsLetter(value: string): boolean {\n return /[A-Za-z]/.test(value);\n}\n","import { CNPJ_BASE_LENGTH, CNPJ_DV1_WEIGHTS, CNPJ_DV2_WEIGHTS, CNPJ_NUMERIC_PATTERN } from './constants.js';\nimport { computeCheckDigit } from './modulo11.js';\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Numeric CNPJ — traditional modulo 11 on digits (RFB Q6–Q7 coexistence).\n */\nexport function isValidCnpjNumeric(input: string): boolean {\n const canonical = input.replace(/\\D/g, '');\n if (!CNPJ_NUMERIC_PATTERN.test(canonical)) {\n return false;\n }\n if (hasRepeatedDigits(canonical)) {\n return false;\n }\n\n const base = canonical.slice(0, CNPJ_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CNPJ_DV1_WEIGHTS, digitValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CNPJ_DV2_WEIGHTS, digitValue),\n );\n\n return canonical.slice(CNPJ_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n","import { stripCnpj } from '../../strip/cnpj.js';\nimport type { DocumentFormat, ValidationResult } from '../../types/validation-result.js';\nimport { brandCnpj } from '../../types/validation-result.js';\nimport { isValidCnpjAlphanumeric } from './alphanumeric.js';\nimport { CNPJ_LENGTH } from './constants.js';\nimport { containsLetter, detectCnpjFormat } from './detect.js';\nimport { isValidCnpjNumeric } from './numeric.js';\n\nexport { detectCnpjFormat, containsLetter } from './detect.js';\nexport { isValidCnpjAlphanumeric } from './alphanumeric.js';\nexport { isValidCnpjNumeric } from './numeric.js';\nexport {\n CNPJ_GOLDEN_ALPHANUMERIC,\n CNPJ_GOLDEN_ALPHANUMERIC_MASKED,\n CNPJ_GOLDEN_NUMERIC,\n CNPJ_GOLDEN_NUMERIC_MASKED,\n CNPJ_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(\n input: string,\n stripped: string,\n): FailedResult | { format: DocumentFormat } {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CNPJ input is empty');\n }\n\n const withoutMask = input.replace(/[.\\-/]/g, '');\n if (/[^A-Za-z0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CNPJ contains invalid characters');\n }\n\n if (stripped.length !== CNPJ_LENGTH) {\n return failure('INVALID_LENGTH', `CNPJ must have ${CNPJ_LENGTH} characters after normalization`);\n }\n\n const format = detectCnpjFormat(stripped);\n if (format === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'CNPJ format is not numeric or alphanumeric');\n }\n\n return { format };\n}\n\nexport function isValidCnpj(input: string): boolean {\n return validateCnpj(input).ok;\n}\n\nexport function validateCnpj(input: string): ValidationResult {\n const stripped = stripCnpj(input);\n const structural = validateStructure(input, stripped);\n if ('ok' in structural) {\n return structural;\n }\n\n const { format } = structural;\n\n if (format === 'numeric' || !containsLetter(stripped)) {\n if (isValidCnpjNumeric(stripped)) {\n return { ok: true, value: brandCnpj(stripped), format: 'numeric' };\n }\n if (format === 'numeric') {\n if (/^(\\d)\\1{13}$/.test(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'CNPJ with all identical digits is invalid');\n }\n return failure('INVALID_CHECK_DIGIT', 'CNPJ check digits are invalid');\n }\n }\n\n if (isValidCnpjAlphanumeric(stripped)) {\n return { ok: true, value: brandCnpj(stripped), format: 'alphanumeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'CNPJ check digits are invalid');\n}\n","import { CNPJ_MASK_PATTERN } from './constants.js';\n\n/** Mask XX.XXX.XXX/XXXX-DD — same for numeric and alphanumeric (RFB Q21). */\nexport function applyCnpjMask(canonical: string): string {\n const match = CNPJ_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CNPJ must have exactly 14 characters to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}/${match[4]}-${match[5]}`;\n}\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { computeCheckDigit } from './chunk-B2TDI3YS.js';
|
|
2
|
+
import { brandPisPasep } from './chunk-DKRM66US.js';
|
|
3
|
+
|
|
4
|
+
// src/strip/pis-pasep.ts
|
|
5
|
+
function stripPisPasep(input) {
|
|
6
|
+
return input.replace(/\D/g, "");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// src/core/pis-pasep/constants.ts
|
|
10
|
+
var PIS_PASEP_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
11
|
+
var PIS_PASEP_LENGTH = 11;
|
|
12
|
+
var PIS_PASEP_BASE_LENGTH = 10;
|
|
13
|
+
var PIS_PASEP_MASK_PATTERN = /^(\d{3})(\d{5})(\d{2})(\d{1})$/;
|
|
14
|
+
var PIS_PASEP_GOLDEN_PRIMARY = "10027230888";
|
|
15
|
+
var PIS_PASEP_GOLDEN_SECONDARY = "12056456402";
|
|
16
|
+
var PIS_PASEP_GOLDEN_PRIMARY_MASKED = "100.27230.88-8";
|
|
17
|
+
var PIS_PASEP_OFFICIAL_SOURCE_URL = "https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf";
|
|
18
|
+
|
|
19
|
+
// src/core/pis-pasep/index.ts
|
|
20
|
+
function failure(code, message) {
|
|
21
|
+
return { ok: false, code, message };
|
|
22
|
+
}
|
|
23
|
+
function digitValue(char) {
|
|
24
|
+
return Number(char);
|
|
25
|
+
}
|
|
26
|
+
function hasRepeatedDigits(value) {
|
|
27
|
+
const first = value[0];
|
|
28
|
+
for (let i = 1; i < value.length; i++) {
|
|
29
|
+
if (value[i] !== first) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
function isValidPisPasepChecksum(stripped) {
|
|
36
|
+
const base = stripped.slice(0, PIS_PASEP_BASE_LENGTH);
|
|
37
|
+
const dvExpected = String(computeCheckDigit(base, PIS_PASEP_DV_WEIGHTS, digitValue));
|
|
38
|
+
return stripped.charAt(PIS_PASEP_BASE_LENGTH) === dvExpected;
|
|
39
|
+
}
|
|
40
|
+
function validateStructure(input, stripped) {
|
|
41
|
+
if (stripped.length === 0) {
|
|
42
|
+
return failure("EMPTY_INPUT", "PIS/PASEP input is empty");
|
|
43
|
+
}
|
|
44
|
+
const withoutMask = input.replace(/[.-]/g, "");
|
|
45
|
+
if (/[^0-9]/.test(withoutMask)) {
|
|
46
|
+
return failure("INVALID_CHARACTER", "PIS/PASEP contains invalid characters");
|
|
47
|
+
}
|
|
48
|
+
if (stripped.length !== PIS_PASEP_LENGTH) {
|
|
49
|
+
return failure("INVALID_LENGTH", `PIS/PASEP must have ${PIS_PASEP_LENGTH} digits after normalization`);
|
|
50
|
+
}
|
|
51
|
+
if (hasRepeatedDigits(stripped)) {
|
|
52
|
+
return failure("KNOWN_INVALID_PATTERN", "PIS/PASEP with all identical digits is invalid");
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
function isValidPisPasep(input) {
|
|
57
|
+
return validatePisPasep(input).ok;
|
|
58
|
+
}
|
|
59
|
+
function validatePisPasep(input) {
|
|
60
|
+
const stripped = stripPisPasep(input);
|
|
61
|
+
const structural = validateStructure(input, stripped);
|
|
62
|
+
if (structural) {
|
|
63
|
+
return structural;
|
|
64
|
+
}
|
|
65
|
+
if (isValidPisPasepChecksum(stripped)) {
|
|
66
|
+
return { ok: true, value: brandPisPasep(stripped), format: "numeric" };
|
|
67
|
+
}
|
|
68
|
+
return failure("INVALID_CHECK_DIGIT", "PIS/PASEP check digit is invalid");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// src/core/pis-pasep/mask.ts
|
|
72
|
+
function applyPisPasepMask(canonical) {
|
|
73
|
+
const match = PIS_PASEP_MASK_PATTERN.exec(canonical);
|
|
74
|
+
if (!match) {
|
|
75
|
+
throw new Error("PIS/PASEP must have exactly 11 digits to apply mask");
|
|
76
|
+
}
|
|
77
|
+
return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// src/format/pis-pasep.ts
|
|
81
|
+
function formatPisPasep(input) {
|
|
82
|
+
const result = validatePisPasep(input);
|
|
83
|
+
if (!result.ok) {
|
|
84
|
+
return { ok: false, code: result.code, message: result.message };
|
|
85
|
+
}
|
|
86
|
+
return { ok: true, formatted: applyPisPasepMask(result.value) };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_OFFICIAL_SOURCE_URL, formatPisPasep, isValidPisPasep, stripPisPasep, validatePisPasep };
|
|
90
|
+
//# sourceMappingURL=chunk-OWJ5HN4T.js.map
|
|
91
|
+
//# sourceMappingURL=chunk-OWJ5HN4T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/strip/pis-pasep.ts","../src/core/pis-pasep/constants.ts","../src/core/pis-pasep/index.ts","../src/core/pis-pasep/mask.ts","../src/format/pis-pasep.ts"],"names":[],"mappings":"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","file":"chunk-OWJ5HN4T.js","sourcesContent":["/**\n * Strip PIS/PASEP mask — digits only (BR-PIS-002).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n */\nexport function stripPisPasep(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * PIS/PASEP/NIS/NIT constants — modulo 11 (CNIS unified registry).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n * @see docs/use-cases/UC-006-validate-pis-pasep.md — golden vector 10027230888\n *\n * PIS, PASEP, NIS, and NIT share the same 11-digit algorithm and check-digit weights.\n */\nexport const PIS_PASEP_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const PIS_PASEP_LENGTH = 11;\nexport const PIS_PASEP_BASE_LENGTH = 10;\nexport const PIS_PASEP_MASK_PATTERN = /^(\\d{3})(\\d{5})(\\d{2})(\\d{1})$/;\n\nexport const PIS_PASEP_GOLDEN_PRIMARY = '10027230888';\nexport const PIS_PASEP_GOLDEN_SECONDARY = '12056456402';\nexport const PIS_PASEP_GOLDEN_PRIMARY_MASKED = '100.27230.88-8';\nexport const PIS_PASEP_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf';\n","/**\n * PIS/PASEP validation — modulo 11 (CNIS unified registry).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n * @see docs/use-cases/UC-006-validate-pis-pasep.md — golden vector 10027230888\n */\nimport { stripPisPasep } from '../../strip/pis-pasep.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandPisPasep } from '../../types/validation-result.js';\nimport { computeCheckDigit } from '../cnpj/modulo11.js';\nimport {\n PIS_PASEP_BASE_LENGTH,\n PIS_PASEP_DV_WEIGHTS,\n PIS_PASEP_LENGTH,\n} from './constants.js';\n\nexport {\n PIS_PASEP_GOLDEN_PRIMARY,\n PIS_PASEP_GOLDEN_PRIMARY_MASKED,\n PIS_PASEP_GOLDEN_SECONDARY,\n PIS_PASEP_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction isValidPisPasepChecksum(stripped: string): boolean {\n const base = stripped.slice(0, PIS_PASEP_BASE_LENGTH);\n const dvExpected = String(computeCheckDigit(base, PIS_PASEP_DV_WEIGHTS, digitValue));\n return stripped.charAt(PIS_PASEP_BASE_LENGTH) === dvExpected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'PIS/PASEP input is empty');\n }\n\n const withoutMask = input.replace(/[.-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'PIS/PASEP contains invalid characters');\n }\n\n if (stripped.length !== PIS_PASEP_LENGTH) {\n return failure('INVALID_LENGTH', `PIS/PASEP must have ${PIS_PASEP_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'PIS/PASEP with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidPisPasep(input: string): boolean {\n return validatePisPasep(input).ok;\n}\n\nexport function validatePisPasep(input: string): ValidationResult {\n const stripped = stripPisPasep(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidPisPasepChecksum(stripped)) {\n return { ok: true, value: brandPisPasep(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'PIS/PASEP check digit is invalid');\n}\n","import { PIS_PASEP_MASK_PATTERN } from './constants.js';\n\n/** Mask XXX.XXXXX.XX-X (BR-PIS-006). */\nexport function applyPisPasepMask(canonical: string): string {\n const match = PIS_PASEP_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('PIS/PASEP must have exactly 11 digits to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;\n}\n","import { applyPisPasepMask } from '../core/pis-pasep/mask.js';\nimport { validatePisPasep } from '../core/pis-pasep/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatPisPasep(input: string): FormatResult {\n const result = validatePisPasep(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyPisPasepMask(result.value) };\n}\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { stripCpf } from './chunk-UCJPSJN5.js';
|
|
2
|
+
import { computeCheckDigit } from './chunk-B2TDI3YS.js';
|
|
3
|
+
import { brandCpf } from './chunk-DKRM66US.js';
|
|
4
|
+
|
|
5
|
+
// src/core/cpf/constants.ts
|
|
6
|
+
var CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
7
|
+
var CPF_DV2_WEIGHTS = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
8
|
+
var CPF_LENGTH = 11;
|
|
9
|
+
var CPF_BASE_LENGTH = 9;
|
|
10
|
+
var CPF_MASK_PATTERN = /^(\d{3})(\d{3})(\d{3})(\d{2})$/;
|
|
11
|
+
var CPF_GOLDEN_PRIMARY = "12345678909";
|
|
12
|
+
var CPF_GOLDEN_SECONDARY = "11144477735";
|
|
13
|
+
var CPF_GOLDEN_PRIMARY_MASKED = "123.456.789-09";
|
|
14
|
+
var CPF_OFFICIAL_SOURCE_URL = "https://www.gov.br/receitafederal/pt-br/assuntos/cpf";
|
|
15
|
+
|
|
16
|
+
// src/core/cpf/index.ts
|
|
17
|
+
function failure(code, message) {
|
|
18
|
+
return { ok: false, code, message };
|
|
19
|
+
}
|
|
20
|
+
function digitValue(char) {
|
|
21
|
+
return Number(char);
|
|
22
|
+
}
|
|
23
|
+
function hasRepeatedDigits(value) {
|
|
24
|
+
const first = value[0];
|
|
25
|
+
for (let i = 1; i < value.length; i++) {
|
|
26
|
+
if (value[i] !== first) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
function isValidCpfChecksum(stripped) {
|
|
33
|
+
const base = stripped.slice(0, CPF_BASE_LENGTH);
|
|
34
|
+
const dv1Expected = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue));
|
|
35
|
+
const dv2Expected = String(
|
|
36
|
+
computeCheckDigit(base + dv1Expected, CPF_DV2_WEIGHTS, digitValue)
|
|
37
|
+
);
|
|
38
|
+
return stripped.slice(CPF_BASE_LENGTH) === dv1Expected + dv2Expected;
|
|
39
|
+
}
|
|
40
|
+
function validateStructure(input, stripped) {
|
|
41
|
+
if (stripped.length === 0) {
|
|
42
|
+
return failure("EMPTY_INPUT", "CPF input is empty");
|
|
43
|
+
}
|
|
44
|
+
const withoutMask = input.replace(/[.-]/g, "");
|
|
45
|
+
if (/[^0-9]/.test(withoutMask)) {
|
|
46
|
+
return failure("INVALID_CHARACTER", "CPF contains invalid characters");
|
|
47
|
+
}
|
|
48
|
+
if (stripped.length !== CPF_LENGTH) {
|
|
49
|
+
return failure("INVALID_LENGTH", `CPF must have ${CPF_LENGTH} digits after normalization`);
|
|
50
|
+
}
|
|
51
|
+
if (hasRepeatedDigits(stripped)) {
|
|
52
|
+
return failure("KNOWN_INVALID_PATTERN", "CPF with all identical digits is invalid");
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
function isValidCpf(input) {
|
|
57
|
+
return validateCpf(input).ok;
|
|
58
|
+
}
|
|
59
|
+
function validateCpf(input) {
|
|
60
|
+
const stripped = stripCpf(input);
|
|
61
|
+
const structural = validateStructure(input, stripped);
|
|
62
|
+
if (structural) {
|
|
63
|
+
return structural;
|
|
64
|
+
}
|
|
65
|
+
if (isValidCpfChecksum(stripped)) {
|
|
66
|
+
return { ok: true, value: brandCpf(stripped), format: "numeric" };
|
|
67
|
+
}
|
|
68
|
+
return failure("INVALID_CHECK_DIGIT", "CPF check digits are invalid");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// src/core/cpf/mask.ts
|
|
72
|
+
function applyCpfMask(canonical) {
|
|
73
|
+
const match = CPF_MASK_PATTERN.exec(canonical);
|
|
74
|
+
if (!match) {
|
|
75
|
+
throw new Error("CPF must have exactly 11 digits to apply mask");
|
|
76
|
+
}
|
|
77
|
+
return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, applyCpfMask, isValidCpf, validateCpf };
|
|
81
|
+
//# sourceMappingURL=chunk-PBNVKDCF.js.map
|
|
82
|
+
//# sourceMappingURL=chunk-PBNVKDCF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/cpf/constants.ts","../src/core/cpf/index.ts","../src/core/cpf/mask.ts"],"names":[],"mappings":"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","file":"chunk-PBNVKDCF.js","sourcesContent":["/**\n * CPF constants — modulo 11 weights (RFB standard).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nexport const CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_DV2_WEIGHTS = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_LENGTH = 11;\nexport const CPF_BASE_LENGTH = 9;\nexport const CPF_NUMERIC_PATTERN = /^\\d{11}$/;\nexport const CPF_MASK_PATTERN = /^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/;\n\nexport const CPF_GOLDEN_PRIMARY = '12345678909';\nexport const CPF_GOLDEN_SECONDARY = '11144477735';\nexport const CPF_GOLDEN_PRIMARY_MASKED = '123.456.789-09';\nexport const CPF_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/receitafederal/pt-br/assuntos/cpf';\n","/**\n * CPF validation — modulo 11 (RFB standard weights).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nimport { stripCpf } from '../../strip/cpf.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCpf } from '../../types/validation-result.js';\nimport { computeCheckDigit } from '../cnpj/modulo11.js';\nimport {\n CPF_BASE_LENGTH,\n CPF_DV1_WEIGHTS,\n CPF_DV2_WEIGHTS,\n CPF_LENGTH,\n} from './constants.js';\n\nexport {\n CPF_GOLDEN_PRIMARY,\n CPF_GOLDEN_PRIMARY_MASKED,\n CPF_GOLDEN_SECONDARY,\n CPF_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction isValidCpfChecksum(stripped: string): boolean {\n const base = stripped.slice(0, CPF_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CPF_DV2_WEIGHTS, digitValue),\n );\n\n return stripped.slice(CPF_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CPF input is empty');\n }\n\n const withoutMask = input.replace(/[.-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CPF contains invalid characters');\n }\n\n if (stripped.length !== CPF_LENGTH) {\n return failure('INVALID_LENGTH', `CPF must have ${CPF_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'CPF with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidCpf(input: string): boolean {\n return validateCpf(input).ok;\n}\n\nexport function validateCpf(input: string): ValidationResult {\n const stripped = stripCpf(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidCpfChecksum(stripped)) {\n return { ok: true, value: brandCpf(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'CPF check digits are invalid');\n}\n","import { CPF_MASK_PATTERN } from './constants.js';\n\n/** Mask XXX.XXX.XXX-DD (BR-CPF-005). */\nexport function applyCpfMask(canonical: string): string {\n const match = CPF_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CPF must have exactly 11 digits to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;\n}\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { stripCep } from './chunk-W6UXVWSR.js';
|
|
2
|
+
import { brandCep } from './chunk-DKRM66US.js';
|
|
3
|
+
|
|
4
|
+
// src/core/cep/constants.ts
|
|
5
|
+
var CEP_LENGTH = 8;
|
|
6
|
+
var CEP_MASK_PATTERN = /^(\d{5})(\d{3})$/;
|
|
7
|
+
var CEP_GOLDEN_PRIMARY = "01310100";
|
|
8
|
+
var CEP_GOLDEN_SECONDARY = "20040020";
|
|
9
|
+
var CEP_GOLDEN_PRIMARY_MASKED = "01310-100";
|
|
10
|
+
var CEP_OFFICIAL_SOURCE_URL = "https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep";
|
|
11
|
+
|
|
12
|
+
// src/core/cep/index.ts
|
|
13
|
+
function failure(code, message) {
|
|
14
|
+
return { ok: false, code, message };
|
|
15
|
+
}
|
|
16
|
+
function validateStructure(input, stripped) {
|
|
17
|
+
if (stripped.length === 0) {
|
|
18
|
+
return failure("EMPTY_INPUT", "CEP input is empty");
|
|
19
|
+
}
|
|
20
|
+
const withoutMask = input.replace(/[-\s]/g, "");
|
|
21
|
+
if (/[^0-9]/.test(withoutMask)) {
|
|
22
|
+
return failure("INVALID_CHARACTER", "CEP contains invalid characters");
|
|
23
|
+
}
|
|
24
|
+
if (stripped.length !== CEP_LENGTH) {
|
|
25
|
+
return failure("INVALID_LENGTH", `CEP must have ${CEP_LENGTH} digits after normalization`);
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
function isValidCep(input) {
|
|
30
|
+
return validateCep(input).ok;
|
|
31
|
+
}
|
|
32
|
+
function validateCep(input) {
|
|
33
|
+
const stripped = stripCep(input);
|
|
34
|
+
const structural = validateStructure(input, stripped);
|
|
35
|
+
if (structural) {
|
|
36
|
+
return structural;
|
|
37
|
+
}
|
|
38
|
+
return { ok: true, value: brandCep(stripped), format: "numeric" };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/core/cep/mask.ts
|
|
42
|
+
function applyCepMask(canonical) {
|
|
43
|
+
const match = CEP_MASK_PATTERN.exec(canonical);
|
|
44
|
+
if (!match) {
|
|
45
|
+
throw new Error("CEP must have exactly 8 digits to apply mask");
|
|
46
|
+
}
|
|
47
|
+
return `${match[1]}-${match[2]}`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/format/cep.ts
|
|
51
|
+
function formatCep(input) {
|
|
52
|
+
const result = validateCep(input);
|
|
53
|
+
if (!result.ok) {
|
|
54
|
+
return { ok: false, code: result.code, message: result.message };
|
|
55
|
+
}
|
|
56
|
+
return { ok: true, formatted: applyCepMask(result.value) };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep };
|
|
60
|
+
//# sourceMappingURL=chunk-RMKTJQBB.js.map
|
|
61
|
+
//# sourceMappingURL=chunk-RMKTJQBB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/cep/constants.ts","../src/core/cep/index.ts","../src/core/cep/mask.ts","../src/format/cep.ts"],"names":[],"mappings":";;;;AAKO,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,gBAAA,GAAmB,kBAAA;AAGzB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,yBAAA,GAA4B;AAClC,IAAM,uBAAA,GACX;;;ACMF,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEA,SAAS,iBAAA,CAAkB,OAAe,QAAA,EAAuC;AAC/E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,eAAe,oBAAoB,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC9C,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,OAAA,CAAQ,qBAAqB,iCAAiC,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,UAAA,EAAY;AAClC,IAAA,OAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAA,cAAA,EAAiB,UAAU,CAAA,2BAAA,CAA6B,CAAA;AAAA,EAC3F;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,EAAA;AAC5B;AAEO,SAAS,YAAY,KAAA,EAAiC;AAC3D,EAAA,MAAM,QAAA,GAAW,SAAS,KAAK,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AACpD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,SAAS,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAClE;;;ACjDO,SAAS,aAAa,SAAA,EAA2B;AACtD,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA;AAC7C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAChC;;;ACLO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3D","file":"chunk-RMKTJQBB.js","sourcesContent":["/**\n * CEP constants — 8 digits, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nexport const CEP_LENGTH = 8;\nexport const CEP_MASK_PATTERN = /^(\\d{5})(\\d{3})$/;\nexport const CEP_NUMERIC_PATTERN = /^\\d{8}$/;\n\nexport const CEP_GOLDEN_PRIMARY = '01310100';\nexport const CEP_GOLDEN_SECONDARY = '20040020';\nexport const CEP_GOLDEN_PRIMARY_MASKED = '01310-100';\nexport const CEP_OFFICIAL_SOURCE_URL =\n 'https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep';\n","/**\n * CEP validation — structural only, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nimport { stripCep } from '../../strip/index.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCep } from '../../types/validation-result.js';\nimport { CEP_LENGTH } from './constants.js';\n\nexport {\n CEP_GOLDEN_PRIMARY,\n CEP_GOLDEN_PRIMARY_MASKED,\n CEP_GOLDEN_SECONDARY,\n CEP_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CEP input is empty');\n }\n\n const withoutMask = input.replace(/[-\\s]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CEP contains invalid characters');\n }\n\n if (stripped.length !== CEP_LENGTH) {\n return failure('INVALID_LENGTH', `CEP must have ${CEP_LENGTH} digits after normalization`);\n }\n\n return null;\n}\n\nexport function isValidCep(input: string): boolean {\n return validateCep(input).ok;\n}\n\nexport function validateCep(input: string): ValidationResult {\n const stripped = stripCep(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n return { ok: true, value: brandCep(stripped), format: 'numeric' };\n}\n","import { CEP_MASK_PATTERN } from './constants.js';\n\n/** Mask XXXXX-XXX (BR-CEP-004). */\nexport function applyCepMask(canonical: string): string {\n const match = CEP_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CEP must have exactly 8 digits to apply mask');\n }\n return `${match[1]}-${match[2]}`;\n}\n","import { applyCepMask } from '../core/cep/mask.js';\nimport { validateCep } from '../core/cep/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCep(input: string): FormatResult {\n const result = validateCep(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCepMask(result.value) };\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { validateCpf, applyCpfMask } from './chunk-PBNVKDCF.js';
|
|
2
|
+
|
|
3
|
+
// src/format/cpf.ts
|
|
4
|
+
function formatCpf(input) {
|
|
5
|
+
const result = validateCpf(input);
|
|
6
|
+
if (!result.ok) {
|
|
7
|
+
return { ok: false, code: result.code, message: result.message };
|
|
8
|
+
}
|
|
9
|
+
return { ok: true, formatted: applyCpfMask(result.value) };
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { formatCpf };
|
|
13
|
+
//# sourceMappingURL=chunk-RZ2JG5PP.js.map
|
|
14
|
+
//# sourceMappingURL=chunk-RZ2JG5PP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/format/cpf.ts"],"names":[],"mappings":";;;AAIO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3D","file":"chunk-RZ2JG5PP.js","sourcesContent":["import { applyCpfMask } from '../core/cpf/mask.js';\nimport { validateCpf } from '../core/cpf/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCpf(input: string): FormatResult {\n const result = validateCpf(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCpfMask(result.value) };\n}\n"]}
|