@br-validators/core 0.11.0-alpha.0 → 0.12.0-alpha.1
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/README.md +147 -22
- package/dist/boleto.d.ts +2 -2
- package/dist/boleto.js +3 -2
- package/dist/brcode.d.ts +2 -2
- package/dist/brcode.js +9 -6
- package/dist/cartao-credito.d.ts +2 -2
- package/dist/cartao-credito.js +4 -2
- package/dist/cep.d.ts +2 -2
- package/dist/cep.js +6 -3
- package/dist/chunk-2CNYSY3Z.js +3 -0
- package/dist/chunk-2CNYSY3Z.js.map +1 -0
- package/dist/{chunk-GLKGX552.js → chunk-2JJS46FM.js} +5 -23
- package/dist/chunk-2JJS46FM.js.map +1 -0
- package/dist/{chunk-FLZ6IHOD.js → chunk-3QP6R46N.js} +119 -496
- package/dist/chunk-3QP6R46N.js.map +1 -0
- package/dist/chunk-4SNBZFS5.js +8 -0
- package/dist/chunk-4SNBZFS5.js.map +1 -0
- package/dist/{chunk-IW3ESGWH.js → chunk-4W4OKLSZ.js} +4 -25
- package/dist/chunk-4W4OKLSZ.js.map +1 -0
- package/dist/chunk-4Y2FBO57.js +26 -0
- package/dist/chunk-4Y2FBO57.js.map +1 -0
- package/dist/{chunk-465IC76U.js → chunk-5UL3M7IU.js} +4 -23
- package/dist/chunk-5UL3M7IU.js.map +1 -0
- package/dist/chunk-6QJFMOIX.js +22 -0
- package/dist/chunk-6QJFMOIX.js.map +1 -0
- package/dist/chunk-7ZL7PZII.js +187 -0
- package/dist/chunk-7ZL7PZII.js.map +1 -0
- package/dist/chunk-BFZPCEYB.js +14 -0
- package/dist/chunk-BFZPCEYB.js.map +1 -0
- package/dist/chunk-CDGRHI7W.js +22 -0
- package/dist/chunk-CDGRHI7W.js.map +1 -0
- package/dist/chunk-CQPM43VV.js +3 -0
- package/dist/chunk-CQPM43VV.js.map +1 -0
- package/dist/chunk-D36RM7OD.js +207 -0
- package/dist/chunk-D36RM7OD.js.map +1 -0
- package/dist/{chunk-CR45BOLS.js → chunk-EPKHEW5V.js} +4 -13
- package/dist/chunk-EPKHEW5V.js.map +1 -0
- package/dist/{chunk-5BBNLRZP.js → chunk-F6PTZY4O.js} +5 -14
- package/dist/chunk-F6PTZY4O.js.map +1 -0
- package/dist/chunk-FXLVNCG3.js +26 -0
- package/dist/chunk-FXLVNCG3.js.map +1 -0
- package/dist/chunk-G24G7WR5.js +3 -0
- package/dist/chunk-G24G7WR5.js.map +1 -0
- package/dist/chunk-G2Y63PIF.js +24 -0
- package/dist/chunk-G2Y63PIF.js.map +1 -0
- package/dist/chunk-G32U6YQ5.js +14 -0
- package/dist/chunk-G32U6YQ5.js.map +1 -0
- package/dist/{chunk-TVVNTLIH.js → chunk-GRDUTHNX.js} +3 -3
- package/dist/{chunk-TVVNTLIH.js.map → chunk-GRDUTHNX.js.map} +1 -1
- package/dist/chunk-GVK6IMBF.js +3 -0
- package/dist/chunk-GVK6IMBF.js.map +1 -0
- package/dist/chunk-IQGRFAQV.js +23 -0
- package/dist/chunk-IQGRFAQV.js.map +1 -0
- package/dist/chunk-JQABTHUJ.js +3 -0
- package/dist/chunk-JQABTHUJ.js.map +1 -0
- package/dist/{chunk-GN7QIQE6.js → chunk-KH7DWOUA.js} +5 -23
- package/dist/chunk-KH7DWOUA.js.map +1 -0
- package/dist/chunk-KQDLIGSG.js +14 -0
- package/dist/chunk-KQDLIGSG.js.map +1 -0
- package/dist/chunk-LF2B4VPE.js +3 -0
- package/dist/chunk-LF2B4VPE.js.map +1 -0
- package/dist/chunk-LGD2JJBZ.js +288 -0
- package/dist/chunk-LGD2JJBZ.js.map +1 -0
- package/dist/{chunk-MQT25QN7.js → chunk-LYBFUKHR.js} +4 -3
- package/dist/chunk-LYBFUKHR.js.map +1 -0
- package/dist/chunk-MFNJTAUS.js +3 -0
- package/dist/chunk-MFNJTAUS.js.map +1 -0
- package/dist/{chunk-D5JMGN7U.js → chunk-MK7OJUF5.js} +7 -5
- package/dist/chunk-MK7OJUF5.js.map +1 -0
- package/dist/chunk-MLPXW7N2.js +226 -0
- package/dist/chunk-MLPXW7N2.js.map +1 -0
- package/dist/{chunk-BBL6ZPXH.js → chunk-MSLJF2FM.js} +18 -3
- package/dist/chunk-MSLJF2FM.js.map +1 -0
- package/dist/{chunk-V3OWDXRU.js → chunk-NHLLC6WH.js} +4 -3
- package/dist/chunk-NHLLC6WH.js.map +1 -0
- package/dist/chunk-OCYXNLHO.js +307 -0
- package/dist/chunk-OCYXNLHO.js.map +1 -0
- package/dist/{chunk-B2TDI3YS.js → chunk-OTZHMJYE.js} +3 -3
- package/dist/{chunk-B2TDI3YS.js.map → chunk-OTZHMJYE.js.map} +1 -1
- package/dist/chunk-P55H5YRX.js +3 -0
- package/dist/chunk-P55H5YRX.js.map +1 -0
- package/dist/chunk-PB4RIS6G.js +27 -0
- package/dist/chunk-PB4RIS6G.js.map +1 -0
- package/dist/chunk-QGMVUIDD.js +3 -0
- package/dist/chunk-QGMVUIDD.js.map +1 -0
- package/dist/chunk-RYGAK7PB.js +3 -0
- package/dist/chunk-RYGAK7PB.js.map +1 -0
- package/dist/chunk-US4OLTJ2.js +104 -0
- package/dist/chunk-US4OLTJ2.js.map +1 -0
- package/dist/{chunk-GEHAH4OH.js → chunk-WCQUQ2WX.js} +4 -4
- package/dist/{chunk-GEHAH4OH.js.map → chunk-WCQUQ2WX.js.map} +1 -1
- package/dist/chunk-WLE2ENQA.js +86 -0
- package/dist/chunk-WLE2ENQA.js.map +1 -0
- package/dist/{chunk-2KTD23PD.js → chunk-WPL47PWJ.js} +5 -14
- package/dist/chunk-WPL47PWJ.js.map +1 -0
- package/dist/chunk-XKY2CV3G.js +14 -0
- package/dist/chunk-XKY2CV3G.js.map +1 -0
- package/dist/chunk-XUO7FV6Z.js +14 -0
- package/dist/chunk-XUO7FV6Z.js.map +1 -0
- package/dist/chunk-Y2KUN2D3.js +3 -0
- package/dist/chunk-Y2KUN2D3.js.map +1 -0
- package/dist/chunk-Y6IW2LMW.js +460 -0
- package/dist/chunk-Y6IW2LMW.js.map +1 -0
- package/dist/chunk-YGA5W54J.js +3 -0
- package/dist/chunk-YGA5W54J.js.map +1 -0
- package/dist/{chunk-UE4PVN6Y.js → chunk-YXELVV37.js} +5 -14
- package/dist/chunk-YXELVV37.js.map +1 -0
- package/dist/chunk-YYHS5WQN.js +28 -0
- package/dist/chunk-YYHS5WQN.js.map +1 -0
- package/dist/chunk-ZAUZRIOU.js +23 -0
- package/dist/chunk-ZAUZRIOU.js.map +1 -0
- package/dist/chunk-ZH4RJNG7.js +3 -0
- package/dist/chunk-ZH4RJNG7.js.map +1 -0
- package/dist/cnh.d.ts +39 -0
- package/dist/cnh.js +11 -0
- package/dist/cnh.js.map +1 -0
- package/dist/cnpj.d.ts +2 -2
- package/dist/cnpj.js +6 -4
- package/dist/cpf.d.ts +2 -2
- package/dist/cpf.js +6 -4
- package/dist/detect.d.ts +23 -0
- package/dist/detect.js +26 -0
- package/dist/detect.js.map +1 -0
- package/dist/generate.d.ts +10 -0
- package/dist/generate.js +29 -0
- package/dist/generate.js.map +1 -0
- package/dist/index-CZLo9YOT.d.ts +21 -0
- package/dist/index.d.ts +12 -4
- package/dist/index.js +60 -25
- package/dist/index.js.map +1 -1
- package/dist/inscricao-estadual-produtor-rural-CfWUaggb.d.ts +46 -0
- package/dist/inscricao-estadual-produtor-rural.d.ts +2 -0
- package/dist/inscricao-estadual-produtor-rural.js +7 -0
- package/dist/inscricao-estadual-produtor-rural.js.map +1 -0
- package/dist/inscricao-estadual.d.ts +4 -21
- package/dist/inscricao-estadual.js +5 -2
- package/dist/nfe-chave.d.ts +71 -0
- package/dist/nfe-chave.js +6 -0
- package/dist/nfe-chave.js.map +1 -0
- package/dist/pis-pasep.d.ts +2 -2
- package/dist/pis-pasep.js +5 -3
- package/dist/{pix-BtTx04Si.d.ts → pix-ddldLlb7.d.ts} +1 -1
- package/dist/pix.d.ts +2 -2
- package/dist/pix.js +8 -6
- package/dist/placa.d.ts +2 -2
- package/dist/placa.js +6 -3
- package/dist/renavam.d.ts +37 -0
- package/dist/renavam.js +11 -0
- package/dist/renavam.js.map +1 -0
- package/dist/sanitize.d.ts +9 -0
- package/dist/sanitize.js +24 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/telefone.d.ts +2 -2
- package/dist/telefone.js +4 -2
- package/dist/titulo-eleitor.d.ts +56 -0
- package/dist/titulo-eleitor.js +10 -0
- package/dist/titulo-eleitor.js.map +1 -0
- package/dist/{validation-result-C-Ei-lZH.d.ts → validation-result-BhQE-1_O.d.ts} +64 -2
- package/package.json +48 -4
- package/dist/chunk-2KTD23PD.js.map +0 -1
- package/dist/chunk-465IC76U.js.map +0 -1
- package/dist/chunk-5BBNLRZP.js.map +0 -1
- package/dist/chunk-BBL6ZPXH.js.map +0 -1
- package/dist/chunk-CR45BOLS.js.map +0 -1
- package/dist/chunk-D5JMGN7U.js.map +0 -1
- package/dist/chunk-FLZ6IHOD.js.map +0 -1
- package/dist/chunk-GLKGX552.js.map +0 -1
- package/dist/chunk-GN7QIQE6.js.map +0 -1
- package/dist/chunk-IW3ESGWH.js.map +0 -1
- package/dist/chunk-MQT25QN7.js.map +0 -1
- package/dist/chunk-UE4PVN6Y.js.map +0 -1
- package/dist/chunk-V3OWDXRU.js.map +0 -1
- package/dist/chunk-W6UXVWSR.js +0 -13
- package/dist/chunk-W6UXVWSR.js.map +0 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { validateRenavam } from './chunk-WLE2ENQA.js';
|
|
2
|
+
import { validateTituloEleitor } from './chunk-MLPXW7N2.js';
|
|
3
|
+
import { validateTelefone, extractTelefoneDigits, normalizeTelefoneDigits } from './chunk-5UL3M7IU.js';
|
|
4
|
+
import { validateInscricaoEstadual } from './chunk-3QP6R46N.js';
|
|
5
|
+
import { validateIeSpRural, stripIeSpRural } from './chunk-Y6IW2LMW.js';
|
|
6
|
+
import { validateNfeChave } from './chunk-D36RM7OD.js';
|
|
7
|
+
import { validatePisPasep } from './chunk-KH7DWOUA.js';
|
|
8
|
+
import { validatePlaca } from './chunk-WPL47PWJ.js';
|
|
9
|
+
import { validateBoleto } from './chunk-4W4OKLSZ.js';
|
|
10
|
+
import { validateCartaoCredito } from './chunk-EPKHEW5V.js';
|
|
11
|
+
import { validateCep } from './chunk-2JJS46FM.js';
|
|
12
|
+
import { validateCnh } from './chunk-US4OLTJ2.js';
|
|
13
|
+
import { stripPlaca } from './chunk-YYHS5WQN.js';
|
|
14
|
+
import { validateCnpj } from './chunk-YXELVV37.js';
|
|
15
|
+
import { validateCpf } from './chunk-F6PTZY4O.js';
|
|
16
|
+
|
|
17
|
+
// src/sanitize/fixes.ts
|
|
18
|
+
function trimFix(raw) {
|
|
19
|
+
const trimmed = raw.trim();
|
|
20
|
+
const fixes = [];
|
|
21
|
+
if (trimmed !== raw) {
|
|
22
|
+
fixes.push("trimmed");
|
|
23
|
+
}
|
|
24
|
+
return { value: trimmed, fixes };
|
|
25
|
+
}
|
|
26
|
+
function digitsFix(value, fixes) {
|
|
27
|
+
const digits = value.replace(/\D/g, "");
|
|
28
|
+
if (digits !== value) {
|
|
29
|
+
fixes.push("removed_non_digits");
|
|
30
|
+
}
|
|
31
|
+
return { value: digits, fixes };
|
|
32
|
+
}
|
|
33
|
+
function upperAndStripSeparators(value, fixes) {
|
|
34
|
+
const upper = value.toUpperCase();
|
|
35
|
+
if (upper !== value) {
|
|
36
|
+
fixes.push("uppercased");
|
|
37
|
+
}
|
|
38
|
+
const stripped = upper.replace(/[^A-Z0-9]/g, "");
|
|
39
|
+
if (stripped !== upper) {
|
|
40
|
+
fixes.push("removed_separators");
|
|
41
|
+
}
|
|
42
|
+
return { value: stripped, fixes };
|
|
43
|
+
}
|
|
44
|
+
function placaFix(value, fixes) {
|
|
45
|
+
const upper = value.toUpperCase();
|
|
46
|
+
if (upper !== value) {
|
|
47
|
+
fixes.push("uppercased");
|
|
48
|
+
}
|
|
49
|
+
if (/[-.\s/]/.test(value)) {
|
|
50
|
+
fixes.push("removed_separators");
|
|
51
|
+
}
|
|
52
|
+
return { value: stripPlaca(upper), fixes };
|
|
53
|
+
}
|
|
54
|
+
function telefoneFix(value, fixes) {
|
|
55
|
+
if (/[\s()-]/.test(value)) {
|
|
56
|
+
fixes.push("removed_mask_chars");
|
|
57
|
+
}
|
|
58
|
+
const digitsOnly = extractTelefoneDigits(value);
|
|
59
|
+
const normalized = normalizeTelefoneDigits(value);
|
|
60
|
+
if (normalized !== digitsOnly && normalized.length > 0) {
|
|
61
|
+
fixes.push("normalized_national");
|
|
62
|
+
}
|
|
63
|
+
return { value: normalized, fixes };
|
|
64
|
+
}
|
|
65
|
+
function ieProdutorRuralFix(value, fixes) {
|
|
66
|
+
const upper = value.toUpperCase();
|
|
67
|
+
if (upper !== value) {
|
|
68
|
+
fixes.push("uppercased");
|
|
69
|
+
}
|
|
70
|
+
if (/^[Pp]/.test(upper)) {
|
|
71
|
+
fixes.push("preserved_p_prefix");
|
|
72
|
+
}
|
|
73
|
+
return { value: stripIeSpRural(upper), fixes };
|
|
74
|
+
}
|
|
75
|
+
function applyFixes(raw, type) {
|
|
76
|
+
const { value: trimmed, fixes } = trimFix(raw);
|
|
77
|
+
switch (type) {
|
|
78
|
+
case "cpf":
|
|
79
|
+
case "cep":
|
|
80
|
+
case "pis-pasep":
|
|
81
|
+
case "cnh":
|
|
82
|
+
case "renavam":
|
|
83
|
+
case "nfe-chave":
|
|
84
|
+
case "cartao-credito":
|
|
85
|
+
case "boleto":
|
|
86
|
+
case "titulo-eleitor":
|
|
87
|
+
case "inscricao-estadual":
|
|
88
|
+
return digitsFix(trimmed, fixes);
|
|
89
|
+
case "cnpj":
|
|
90
|
+
return upperAndStripSeparators(trimmed, fixes);
|
|
91
|
+
case "placa":
|
|
92
|
+
return placaFix(trimmed, fixes);
|
|
93
|
+
case "telefone":
|
|
94
|
+
return telefoneFix(trimmed, fixes);
|
|
95
|
+
case "inscricao-estadual-produtor-rural":
|
|
96
|
+
return ieProdutorRuralFix(trimmed, fixes);
|
|
97
|
+
default: {
|
|
98
|
+
const _exhaustive = type;
|
|
99
|
+
return { value: _exhaustive, fixes };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// src/sanitize/index.ts
|
|
105
|
+
function sanitize(raw, type, options = {}) {
|
|
106
|
+
const { value: fixed, fixes } = applyFixes(raw, type);
|
|
107
|
+
if (type === "inscricao-estadual" && !options.uf) {
|
|
108
|
+
return {
|
|
109
|
+
ok: false,
|
|
110
|
+
code: "UNSUPPORTED_FORMAT",
|
|
111
|
+
message: "UF is required for inscricao-estadual sanitization"
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const validation = validateFixed(fixed, type, options.uf);
|
|
115
|
+
if (!validation.ok) {
|
|
116
|
+
return { ok: false, code: validation.code, message: validation.message };
|
|
117
|
+
}
|
|
118
|
+
return { ok: true, value: validation.value, fixes };
|
|
119
|
+
}
|
|
120
|
+
function validateFixed(value, type, uf) {
|
|
121
|
+
switch (type) {
|
|
122
|
+
case "cpf": {
|
|
123
|
+
const result = validateCpf(value);
|
|
124
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
125
|
+
}
|
|
126
|
+
case "cnpj": {
|
|
127
|
+
const result = validateCnpj(value);
|
|
128
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
129
|
+
}
|
|
130
|
+
case "cep": {
|
|
131
|
+
const result = validateCep(value);
|
|
132
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
133
|
+
}
|
|
134
|
+
case "placa": {
|
|
135
|
+
const result = validatePlaca(value);
|
|
136
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
137
|
+
}
|
|
138
|
+
case "pis-pasep": {
|
|
139
|
+
const result = validatePisPasep(value);
|
|
140
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
141
|
+
}
|
|
142
|
+
case "telefone": {
|
|
143
|
+
const result = validateTelefone(value);
|
|
144
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
145
|
+
}
|
|
146
|
+
case "cnh": {
|
|
147
|
+
const result = validateCnh(value);
|
|
148
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
149
|
+
}
|
|
150
|
+
case "renavam": {
|
|
151
|
+
const result = validateRenavam(value);
|
|
152
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
153
|
+
}
|
|
154
|
+
case "titulo-eleitor": {
|
|
155
|
+
const result = validateTituloEleitor(value);
|
|
156
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
157
|
+
}
|
|
158
|
+
case "nfe-chave": {
|
|
159
|
+
const result = validateNfeChave(value);
|
|
160
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
161
|
+
}
|
|
162
|
+
case "boleto": {
|
|
163
|
+
const result = validateBoleto(value);
|
|
164
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
165
|
+
}
|
|
166
|
+
case "cartao-credito": {
|
|
167
|
+
const result = validateCartaoCredito(value);
|
|
168
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
169
|
+
}
|
|
170
|
+
case "inscricao-estadual": {
|
|
171
|
+
const result = validateInscricaoEstadual(value, { uf });
|
|
172
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
173
|
+
}
|
|
174
|
+
case "inscricao-estadual-produtor-rural": {
|
|
175
|
+
const result = validateIeSpRural(value);
|
|
176
|
+
return result.ok ? { ok: true, value: result.value } : result;
|
|
177
|
+
}
|
|
178
|
+
default: {
|
|
179
|
+
const _exhaustive = type;
|
|
180
|
+
return { ok: false, code: "UNSUPPORTED_FORMAT", message: `Unsupported type: ${String(_exhaustive)}` };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export { sanitize };
|
|
186
|
+
//# sourceMappingURL=chunk-7ZL7PZII.js.map
|
|
187
|
+
//# sourceMappingURL=chunk-7ZL7PZII.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { validateIeSpRural, applyIeSpRuralMask } from './chunk-Y6IW2LMW.js';
|
|
2
|
+
|
|
3
|
+
// src/format/inscricao-estadual-produtor-rural.ts
|
|
4
|
+
function formatIeProdutorRural(input) {
|
|
5
|
+
const result = validateIeSpRural(input);
|
|
6
|
+
if (!result.ok) {
|
|
7
|
+
return { ok: false, code: result.code, message: result.message };
|
|
8
|
+
}
|
|
9
|
+
return { ok: true, formatted: applyIeSpRuralMask(result.value) };
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { formatIeProdutorRural };
|
|
13
|
+
//# sourceMappingURL=chunk-BFZPCEYB.js.map
|
|
14
|
+
//# sourceMappingURL=chunk-BFZPCEYB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { validateRenavam, RENAVAM_NUMERIC_PATTERN, RENAVAM_LENGTH } from './chunk-WLE2ENQA.js';
|
|
2
|
+
|
|
3
|
+
// src/core/renavam/mask.ts
|
|
4
|
+
function applyRenavamCanonicalFormat(canonical) {
|
|
5
|
+
if (!RENAVAM_NUMERIC_PATTERN.test(canonical)) {
|
|
6
|
+
throw new Error(`RENAVAM must have exactly ${RENAVAM_LENGTH} digits to format`);
|
|
7
|
+
}
|
|
8
|
+
return canonical;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// src/format/renavam.ts
|
|
12
|
+
function formatRenavam(input) {
|
|
13
|
+
const result = validateRenavam(input);
|
|
14
|
+
if (!result.ok) {
|
|
15
|
+
return { ok: false, code: result.code, message: result.message };
|
|
16
|
+
}
|
|
17
|
+
return { ok: true, formatted: applyRenavamCanonicalFormat(result.value) };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { formatRenavam };
|
|
21
|
+
//# sourceMappingURL=chunk-CDGRHI7W.js.map
|
|
22
|
+
//# sourceMappingURL=chunk-CDGRHI7W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-CQPM43VV.js"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { stripNfeChave } from './chunk-4SNBZFS5.js';
|
|
2
|
+
import { brandNfeChave } from './chunk-MSLJF2FM.js';
|
|
3
|
+
|
|
4
|
+
// src/core/nfe-chave/constants.ts
|
|
5
|
+
var NFE_CHAVE_OFFICIAL_SOURCE_URL = "https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=ndIjl+iEFdE%3D";
|
|
6
|
+
var NFE_CHAVE_MOC_ONLINE_URL = "http://moc.sped.fazenda.pr.gov.br/";
|
|
7
|
+
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";
|
|
8
|
+
var NFE_CHAVE_MOC_PDF_URL = "https://www.confaz.fazenda.gov.br/legislacao/arquivo-manuais/moc7-visao-geral.pdf";
|
|
9
|
+
var NFE_CHAVE_DFE_PORTAL_URL = "https://dfe-portal.svrs.rs.gov.br/NFe/Documentos";
|
|
10
|
+
var NFE_CHAVE_NFCE_QR_ILLUSTRATIVE_URL = "http://moc.sped.fazenda.pr.gov.br/DanfeQrCodeNFCe.html";
|
|
11
|
+
var NFE_CHAVE_LENGTH = 44;
|
|
12
|
+
var NFE_CHAVE_BASE_LENGTH = 43;
|
|
13
|
+
var NFE_CHAVE_MOD = 11;
|
|
14
|
+
var NFE_CHAVE_WEIGHT_CYCLE = [2, 3, 4, 5, 6, 7, 8, 9];
|
|
15
|
+
var NFE_CHAVE_NUMERIC_PATTERN = /^\d{44}$/;
|
|
16
|
+
var NFE_CHAVE_GOLDEN_PRIMARY = "52060433009911002506550120000007800267301615";
|
|
17
|
+
var NFE_CHAVE_GOLDEN_SECONDARY = "41180678393592000146558900000006041028190697";
|
|
18
|
+
var NFE_CHAVE_NFCE_QR_ILLUSTRATIVE = "28170800156225000131650110000151341562040824";
|
|
19
|
+
var NFE_MODELO_NFE = "55";
|
|
20
|
+
var NFE_MODELO_NFCE = "65";
|
|
21
|
+
var NFE_MODELOS = [NFE_MODELO_NFE, NFE_MODELO_NFCE];
|
|
22
|
+
var NFE_IBGE_UF_CODES = /* @__PURE__ */ new Set([
|
|
23
|
+
11,
|
|
24
|
+
12,
|
|
25
|
+
13,
|
|
26
|
+
14,
|
|
27
|
+
15,
|
|
28
|
+
16,
|
|
29
|
+
17,
|
|
30
|
+
21,
|
|
31
|
+
22,
|
|
32
|
+
23,
|
|
33
|
+
24,
|
|
34
|
+
25,
|
|
35
|
+
26,
|
|
36
|
+
27,
|
|
37
|
+
28,
|
|
38
|
+
29,
|
|
39
|
+
31,
|
|
40
|
+
32,
|
|
41
|
+
33,
|
|
42
|
+
35,
|
|
43
|
+
41,
|
|
44
|
+
42,
|
|
45
|
+
43,
|
|
46
|
+
50,
|
|
47
|
+
51,
|
|
48
|
+
52,
|
|
49
|
+
53
|
|
50
|
+
]);
|
|
51
|
+
var NFE_IBGE_UF_BY_CODE = {
|
|
52
|
+
11: "RO",
|
|
53
|
+
12: "AC",
|
|
54
|
+
13: "AM",
|
|
55
|
+
14: "RR",
|
|
56
|
+
15: "PA",
|
|
57
|
+
16: "AP",
|
|
58
|
+
17: "TO",
|
|
59
|
+
21: "MA",
|
|
60
|
+
22: "PI",
|
|
61
|
+
23: "CE",
|
|
62
|
+
24: "RN",
|
|
63
|
+
25: "PB",
|
|
64
|
+
26: "PE",
|
|
65
|
+
27: "AL",
|
|
66
|
+
28: "SE",
|
|
67
|
+
29: "BA",
|
|
68
|
+
31: "MG",
|
|
69
|
+
32: "ES",
|
|
70
|
+
33: "RJ",
|
|
71
|
+
35: "SP",
|
|
72
|
+
41: "PR",
|
|
73
|
+
42: "SC",
|
|
74
|
+
43: "RS",
|
|
75
|
+
50: "MS",
|
|
76
|
+
51: "MT",
|
|
77
|
+
52: "GO",
|
|
78
|
+
53: "DF"
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// src/core/nfe-chave/dv.ts
|
|
82
|
+
function computeNfeChaveWeightedSum(base43) {
|
|
83
|
+
let multiplier = 2;
|
|
84
|
+
let sum = 0;
|
|
85
|
+
for (let i = base43.length - 1; i >= 0; i--) {
|
|
86
|
+
sum += Number(base43[i]) * multiplier;
|
|
87
|
+
multiplier = multiplier >= 9 ? 2 : multiplier + 1;
|
|
88
|
+
}
|
|
89
|
+
return sum;
|
|
90
|
+
}
|
|
91
|
+
function resolveNfeChaveCheckDigit(weightedSum) {
|
|
92
|
+
const remainder = weightedSum % 11;
|
|
93
|
+
return remainder < 2 ? 0 : 11 - remainder;
|
|
94
|
+
}
|
|
95
|
+
function computeNfeChaveCheckDigit(base43) {
|
|
96
|
+
if (base43.length !== NFE_CHAVE_BASE_LENGTH) {
|
|
97
|
+
throw new Error(`NF-e chave base must have exactly ${NFE_CHAVE_BASE_LENGTH} digits`);
|
|
98
|
+
}
|
|
99
|
+
return resolveNfeChaveCheckDigit(computeNfeChaveWeightedSum(base43));
|
|
100
|
+
}
|
|
101
|
+
function isValidNfeChaveCheckDigit(stripped) {
|
|
102
|
+
const base = stripped.slice(0, NFE_CHAVE_BASE_LENGTH);
|
|
103
|
+
const expected = String(computeNfeChaveCheckDigit(base));
|
|
104
|
+
return stripped[NFE_CHAVE_BASE_LENGTH] === expected;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/core/nfe-chave/parse.ts
|
|
108
|
+
function parseNfeChaveParts(stripped) {
|
|
109
|
+
if (stripped.length !== NFE_CHAVE_LENGTH) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
cUF: stripped.slice(0, 2),
|
|
114
|
+
aamm: stripped.slice(2, 6),
|
|
115
|
+
cnpj: stripped.slice(6, 20),
|
|
116
|
+
mod: stripped.slice(20, 22),
|
|
117
|
+
serie: stripped.slice(22, 25),
|
|
118
|
+
nNF: stripped.slice(25, 34),
|
|
119
|
+
tpEmis: stripped.slice(34, 35),
|
|
120
|
+
cNF: stripped.slice(35, 43),
|
|
121
|
+
cDV: stripped.slice(43, 44)
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// src/core/nfe-chave/index.ts
|
|
126
|
+
function failure(code, message) {
|
|
127
|
+
return { ok: false, code, message };
|
|
128
|
+
}
|
|
129
|
+
function isKnownModel(mod) {
|
|
130
|
+
return NFE_MODELOS.includes(mod);
|
|
131
|
+
}
|
|
132
|
+
function resolveUf(cuf) {
|
|
133
|
+
return NFE_IBGE_UF_BY_CODE[Number(cuf)];
|
|
134
|
+
}
|
|
135
|
+
function validateStructure(input, stripped) {
|
|
136
|
+
if (stripped.length === 0) {
|
|
137
|
+
return { ok: false, error: failure("EMPTY_INPUT", "NF-e chave de acesso input is empty") };
|
|
138
|
+
}
|
|
139
|
+
const withoutMask = input.replace(/[\s.]/g, "");
|
|
140
|
+
if (/[^0-9]/.test(withoutMask)) {
|
|
141
|
+
return { ok: false, error: failure("INVALID_CHARACTER", "NF-e chave de acesso contains invalid characters") };
|
|
142
|
+
}
|
|
143
|
+
if (stripped.length !== NFE_CHAVE_LENGTH) {
|
|
144
|
+
return {
|
|
145
|
+
ok: false,
|
|
146
|
+
error: failure(
|
|
147
|
+
"INVALID_LENGTH",
|
|
148
|
+
`NF-e chave de acesso must have ${NFE_CHAVE_LENGTH} digits after normalization`
|
|
149
|
+
)
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const parts = parseNfeChaveParts(stripped);
|
|
153
|
+
const cufCode = Number(parts.cUF);
|
|
154
|
+
if (!NFE_IBGE_UF_CODES.has(cufCode)) {
|
|
155
|
+
return {
|
|
156
|
+
ok: false,
|
|
157
|
+
error: failure(
|
|
158
|
+
"KNOWN_INVALID_PATTERN",
|
|
159
|
+
`NF-e chave cUF ${parts.cUF} is not a valid IBGE UF code`
|
|
160
|
+
)
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (!isKnownModel(parts.mod)) {
|
|
164
|
+
return {
|
|
165
|
+
ok: false,
|
|
166
|
+
error: failure(
|
|
167
|
+
"KNOWN_INVALID_PATTERN",
|
|
168
|
+
`NF-e chave modelo ${parts.mod} is not 55 (NF-e) or 65 (NFC-e)`
|
|
169
|
+
)
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return { ok: true, parts };
|
|
173
|
+
}
|
|
174
|
+
function buildSuccess(stripped, parts) {
|
|
175
|
+
const uf = resolveUf(parts.cUF);
|
|
176
|
+
const success = {
|
|
177
|
+
ok: true,
|
|
178
|
+
value: brandNfeChave(stripped),
|
|
179
|
+
format: "numeric",
|
|
180
|
+
parsed: parts
|
|
181
|
+
};
|
|
182
|
+
if (uf !== void 0) {
|
|
183
|
+
success.uf = uf;
|
|
184
|
+
}
|
|
185
|
+
return success;
|
|
186
|
+
}
|
|
187
|
+
function isValidNfeChave(input) {
|
|
188
|
+
return validateNfeChave(input).ok;
|
|
189
|
+
}
|
|
190
|
+
function parseNfeChave(input) {
|
|
191
|
+
const stripped = stripNfeChave(input);
|
|
192
|
+
const structure = validateStructure(input, stripped);
|
|
193
|
+
if (!structure.ok) {
|
|
194
|
+
return structure.error;
|
|
195
|
+
}
|
|
196
|
+
if (!isValidNfeChaveCheckDigit(stripped)) {
|
|
197
|
+
return failure("INVALID_CHECK_DIGIT", "NF-e chave de acesso check digit is invalid");
|
|
198
|
+
}
|
|
199
|
+
return buildSuccess(stripped, structure.parts);
|
|
200
|
+
}
|
|
201
|
+
function validateNfeChave(input) {
|
|
202
|
+
return parseNfeChave(input);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
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 };
|
|
206
|
+
//# sourceMappingURL=chunk-D36RM7OD.js.map
|
|
207
|
+
//# sourceMappingURL=chunk-D36RM7OD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { brandCartaoCredito } from './chunk-
|
|
1
|
+
import { brandCartaoCredito } from './chunk-MSLJF2FM.js';
|
|
2
2
|
|
|
3
3
|
// src/strip/cartao-credito.ts
|
|
4
4
|
function stripCartaoCredito(input) {
|
|
@@ -193,15 +193,6 @@ function validateCartaoCredito(input) {
|
|
|
193
193
|
};
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if (!result.ok) {
|
|
200
|
-
return { ok: false, code: result.code, message: result.message };
|
|
201
|
-
}
|
|
202
|
-
return { ok: true, formatted: applyCartaoCreditoMask(result.value) };
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
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 };
|
|
206
|
-
//# sourceMappingURL=chunk-CR45BOLS.js.map
|
|
207
|
-
//# sourceMappingURL=chunk-CR45BOLS.js.map
|
|
196
|
+
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 };
|
|
197
|
+
//# sourceMappingURL=chunk-EPKHEW5V.js.map
|
|
198
|
+
//# sourceMappingURL=chunk-EPKHEW5V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { stripCpf } from './chunk-UCJPSJN5.js';
|
|
2
|
-
import { computeCheckDigit } from './chunk-
|
|
3
|
-
import { brandCpf } from './chunk-
|
|
2
|
+
import { computeCheckDigit } from './chunk-OTZHMJYE.js';
|
|
3
|
+
import { brandCpf } from './chunk-MSLJF2FM.js';
|
|
4
4
|
|
|
5
5
|
// src/core/cpf/constants.ts
|
|
6
6
|
var CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
@@ -68,15 +68,6 @@ function validateCpf(input) {
|
|
|
68
68
|
return failure("INVALID_CHECK_DIGIT", "CPF check digits are invalid");
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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-5BBNLRZP.js.map
|
|
82
|
-
//# sourceMappingURL=chunk-5BBNLRZP.js.map
|
|
71
|
+
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 };
|
|
72
|
+
//# sourceMappingURL=chunk-F6PTZY4O.js.map
|
|
73
|
+
//# sourceMappingURL=chunk-F6PTZY4O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/cpf/constants.ts","../src/core/cpf/index.ts"],"names":[],"mappings":"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","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"]}
|