@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
package/README.md
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# @br-validators/core
|
|
2
2
|
|
|
3
|
-
100% open-source Brazilian document validators (MIT).
|
|
3
|
+
100% open-source Brazilian document validators (MIT). Pure TypeScript — no HTTP lookups, no frameworks.
|
|
4
4
|
|
|
5
5
|
**npm:** [`@br-validators/core`](https://www.npmjs.com/package/@br-validators/core)
|
|
6
|
-
**Repo:** [github.com/AlexandreZanata/br-validators](https://github.com/AlexandreZanata/br-validators)
|
|
6
|
+
**Repo:** [github.com/AlexandreZanata/br-validators](https://github.com/AlexandreZanata/br-validators)
|
|
7
|
+
**Playground:** [doc-raiz-playground.vercel.app](https://doc-raiz-playground.vercel.app/)
|
|
7
8
|
|
|
8
|
-
> The unscoped name `br-validators` on npm is a different package
|
|
9
|
+
> The unscoped name `br-validators` on npm is a **different package**. Use **`@br-validators/core`**.
|
|
9
10
|
|
|
10
11
|
---
|
|
11
12
|
|
|
@@ -19,61 +20,164 @@ Requires Node ≥ 18. ESM only (`"type": "module"`).
|
|
|
19
20
|
|
|
20
21
|
---
|
|
21
22
|
|
|
22
|
-
##
|
|
23
|
+
## Platform APIs
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|--------|-----------|---------------|
|
|
26
|
-
| CNPJ | `validateCnpj`, `formatCnpj`, `stripCnpj` | `12ABC34501DE35` |
|
|
27
|
-
| CPF | `validateCpf`, `formatCpf`, `stripCpf` | `12345678909` |
|
|
28
|
-
| CEP | `validateCep`, `formatCep`, `stripCep` | `01310100` |
|
|
29
|
-
| Placa | `validatePlaca`, `formatPlaca`, `convertPlacaToMercosul` | `ABC1D23` |
|
|
30
|
-
| PIS/PASEP | `validatePisPasep`, `formatPisPasep` | `10027230888` |
|
|
31
|
-
| PIX key | `validatePixKey`, `formatPixKey` | `pix@bcb.gov.br` |
|
|
32
|
-
| Boleto | `validateBoleto`, `formatBoleto` | Situação 1 + 2 |
|
|
33
|
-
| Credit card | `validateCartaoCredito`, `passesLuhn` | `4111111111111111` |
|
|
34
|
-
| IE (27 UFs) | `validateInscricaoEstadual`, `validateIeSp`, … | per UF — see docs |
|
|
25
|
+
Cross-cutting helpers that **compose existing validators** — never duplicate check-digit logic.
|
|
35
26
|
|
|
36
|
-
|
|
27
|
+
| API | Import | Purpose |
|
|
28
|
+
|-----|--------|---------|
|
|
29
|
+
| **`detect()`** | `@br-validators/core/detect` | Classify raw input (priority router over all shipped types) |
|
|
30
|
+
| **`sanitize()`** | `@br-validators/core/sanitize` | ETL fixes → validate (returns `fixes[]`) |
|
|
31
|
+
| **`generate()`** | `@br-validators/core/generate` | Synthetic **test fixtures** only (`seed` for reproducibility) |
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { detect, sanitize, generate } from '@br-validators/core';
|
|
35
|
+
import { validateCpf } from '@br-validators/core/cpf';
|
|
36
|
+
|
|
37
|
+
// Auto-detect document type
|
|
38
|
+
detect('123.456.789-09');
|
|
39
|
+
// → { type: 'cpf', ok: true, value: '12345678909', format: 'numeric' }
|
|
40
|
+
|
|
41
|
+
detect('110042490114', { uf: 'SP' });
|
|
42
|
+
// → { type: 'inscricao-estadual', ok: true, ... }
|
|
43
|
+
|
|
44
|
+
// Messy ETL input → canonical + fix audit trail
|
|
45
|
+
sanitize(' 123.456.789-09 ', 'cpf');
|
|
46
|
+
// → { ok: true, value: '12345678909', fixes: ['trimmed', 'removed_non_digits'] }
|
|
47
|
+
|
|
48
|
+
sanitize('110.042.490.114', 'inscricao-estadual', { uf: 'SP' });
|
|
49
|
+
// → { ok: true, value: '110042490114', fixes: [...] }
|
|
50
|
+
|
|
51
|
+
// Synthetic valid documents for tests (never production IDs)
|
|
52
|
+
const cpf = generate('cpf', { seed: 42 });
|
|
53
|
+
validateCpf(cpf).ok; // true
|
|
54
|
+
|
|
55
|
+
generate('cnpj', { format: 'alphanumeric', masked: true, seed: 7 });
|
|
56
|
+
generate('placa', { format: 'mercosul', seed: 3 });
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Detect notes:** 11-digit bucket tries CPF → CNH → PIS (RENAVAM equivalent DV may classify as `pis-pasep`). IE detection requires `{ uf }`. 48-digit boleto arrecadação is skipped.
|
|
60
|
+
|
|
61
|
+
**Generate policy:** 9 types — CPF, CNPJ, CEP, placa, PIS, RENAVAM, CNH, telefone, cartão. Excludes boleto, NF-e chave, IE, BR Code, PIX.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Per-type validators
|
|
66
|
+
|
|
67
|
+
Every module exposes `validate*`, `format*`, `strip*` (where applicable). All return `ValidationResult` — **never throw** on invalid input.
|
|
68
|
+
|
|
69
|
+
| Subpath | Key functions | Golden vector |
|
|
70
|
+
|---------|---------------|---------------|
|
|
71
|
+
| `./cnpj` | `validateCnpj`, `formatCnpj`, `stripCnpj` | `12ABC34501DE35` (alphanumeric) |
|
|
72
|
+
| `./cpf` | `validateCpf`, `formatCpf`, `stripCpf` | `12345678909` |
|
|
73
|
+
| `./cep` | `validateCep`, `formatCep`, `stripCep` | `01310100` |
|
|
74
|
+
| `./telefone` | `validateTelefone`, `formatTelefone`, `stripTelefone` | `11999999999` (celular) |
|
|
75
|
+
| `./cnh` | `validateCnh`, `formatCnh`, `stripCnh` | `62472927637` (11 digits, no CPF mask) |
|
|
76
|
+
| `./renavam` | `validateRenavam`, `formatRenavam`, `stripRenavam` | `63977791104` |
|
|
77
|
+
| `./titulo-eleitor` | `validateTituloEleitor`, `formatTituloEleitor`, `stripTituloEleitor` | `004356870906` |
|
|
78
|
+
| `./nfe-chave` | `validateNfeChave`, `parseNfeChave`, `formatNfeChave` | `52060433009911002506550120000007800267301615` |
|
|
79
|
+
| `./brcode` | `validateBrCode`, `parseBrCode` | EMV PIX payload (CRC16) |
|
|
80
|
+
| `./placa` | `validatePlaca`, `formatPlaca`, `convertPlacaToMercosul` | `ABC1D23` (Mercosul), `ABC1234` (legacy) |
|
|
81
|
+
| `./pis-pasep` | `validatePisPasep`, `formatPisPasep`, `stripPisPasep` | `10027230888` |
|
|
82
|
+
| `./pix` | `validatePixKey`, `formatPixKey`, `detectPixKeyType` | `pix@bcb.gov.br` |
|
|
83
|
+
| `./boleto` | `validateBoleto`, `formatBoleto`, `convertLinhaToCodigoBarras` | Situação 1 + 2 (FEBRABAN) |
|
|
84
|
+
| `./cartao-credito` | `validateCartaoCredito`, `passesLuhn`, `detectCardBrand` | `4111111111111111` |
|
|
85
|
+
| `./inscricao-estadual` | `validateInscricaoEstadual`, `formatInscricaoEstadual` | `110042490114` (SP) — **27 UFs**, `{ uf }` required |
|
|
86
|
+
| `./inscricao-estadual-produtor-rural` | `validateIeProdutorRural`, `validateIeSpRural` | `P011004243002` (SP Regra II) |
|
|
87
|
+
|
|
88
|
+
Tree-shaking via subpaths:
|
|
37
89
|
|
|
38
90
|
```typescript
|
|
39
91
|
import { validateCnpj } from '@br-validators/core/cnpj';
|
|
92
|
+
import { validateNfeChave } from '@br-validators/core/nfe-chave';
|
|
93
|
+
import { validateTituloEleitor } from '@br-validators/core/titulo-eleitor';
|
|
94
|
+
import { validateBrCode } from '@br-validators/core/brcode';
|
|
40
95
|
import { validateInscricaoEstadual } from '@br-validators/core/inscricao-estadual';
|
|
96
|
+
import { validateIeProdutorRural } from '@br-validators/core/inscricao-estadual-produtor-rural';
|
|
41
97
|
```
|
|
42
98
|
|
|
43
99
|
---
|
|
44
100
|
|
|
45
101
|
## Examples
|
|
46
102
|
|
|
103
|
+
### CNPJ (numeric + alphanumeric)
|
|
104
|
+
|
|
47
105
|
```typescript
|
|
48
106
|
import { validateCnpj, formatCnpj } from '@br-validators/core';
|
|
49
107
|
|
|
50
|
-
|
|
51
|
-
// { ok: true, value: '12ABC34501DE35', format: 'alphanumeric'
|
|
108
|
+
validateCnpj('12ABC34501DE35');
|
|
109
|
+
// { ok: true, value: '12ABC34501DE35', format: 'alphanumeric' }
|
|
52
110
|
|
|
53
111
|
formatCnpj('12ABC34501DE35');
|
|
54
|
-
// { ok: true, formatted: '12.ABC.345/01DE-35'
|
|
112
|
+
// { ok: true, formatted: '12.ABC.345/01DE-35' }
|
|
55
113
|
```
|
|
56
114
|
|
|
115
|
+
### Inscrição Estadual (all 27 UFs)
|
|
116
|
+
|
|
57
117
|
```typescript
|
|
58
118
|
import { validateInscricaoEstadual } from '@br-validators/core/inscricao-estadual';
|
|
59
119
|
|
|
60
120
|
validateInscricaoEstadual('110042490114', { uf: 'SP' });
|
|
61
121
|
validateInscricaoEstadual('0730000100109', { uf: 'DF' });
|
|
122
|
+
// getIeOfficialSourceUrl('SP') → SEFAZ primary URL
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### SP produtor rural (`P` prefix)
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
import { validateIeProdutorRural } from '@br-validators/core/inscricao-estadual-produtor-rural';
|
|
129
|
+
|
|
130
|
+
validateIeProdutorRural('SP', 'P-01100424.3/002');
|
|
131
|
+
// { ok: true, value: 'P011004243002', ... }
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### NF-e / NFC-e chave de acesso (44 digits)
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
import { validateNfeChave, parseNfeChave } from '@br-validators/core/nfe-chave';
|
|
138
|
+
|
|
139
|
+
const result = validateNfeChave('52060433009911002506550120000007800267301615');
|
|
140
|
+
// { ok: true, parsed: { cUF, cnpj, mod, serie, nNF, ... }, uf: 'GO' }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### BR Code (PIX QR payload)
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
import { validateBrCode } from '@br-validators/core/brcode';
|
|
147
|
+
|
|
148
|
+
validateBrCode('00020126580014br.gov.bcb.pix0136...63041D3D');
|
|
149
|
+
// { ok: true, pixKey, merchantName, merchantCity, ... }
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Boleto (linha digitável ↔ código de barras)
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
import { validateBoleto, convertLinhaToCodigoBarras } from '@br-validators/core/boleto';
|
|
156
|
+
|
|
157
|
+
validateBoleto('03399.02579 08991.834006 71742.301014 6 14500000099668');
|
|
62
158
|
```
|
|
63
159
|
|
|
64
160
|
---
|
|
65
161
|
|
|
66
162
|
## Official sources
|
|
67
163
|
|
|
68
|
-
Every algorithm cites a primary government source
|
|
164
|
+
Every algorithm cites a primary government or standards body source (RFB, Bacen, CONTRAN, TSE, SEFAZ, FEBRABAN, ISO, Correios, Anatel, SIPREV).
|
|
165
|
+
|
|
166
|
+
Full index: [docs/OFFICIAL-SOURCES.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/OFFICIAL-SOURCES.md)
|
|
167
|
+
|
|
168
|
+
Per-type constants: `CNPJ_OFFICIAL_SOURCE_URL`, `NFE_CHAVE_OFFICIAL_SOURCE_URL`, `IE_OFFICIAL_SOURCE_URLS`, `BRCODE_OFFICIAL_SOURCE_URL`, etc.
|
|
69
169
|
|
|
70
|
-
|
|
170
|
+
Golden test vectors: `tests/vectors/*.official.json` in the repo.
|
|
71
171
|
|
|
72
172
|
---
|
|
73
173
|
|
|
74
174
|
## API reference
|
|
75
175
|
|
|
76
|
-
|
|
176
|
+
| Doc | Content |
|
|
177
|
+
|-----|---------|
|
|
178
|
+
| [LIBRARY-API.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/LIBRARY-API.md) | Full signatures + platform APIs |
|
|
179
|
+
| [VALIDATION-RULES.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/VALIDATION-RULES.md) | Business rules (BR-* IDs) |
|
|
180
|
+
| [DELIVERY-SURFACES.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/DELIVERY-SURFACES.md) | Library + CLI + playground matrix |
|
|
77
181
|
|
|
78
182
|
---
|
|
79
183
|
|
|
@@ -81,11 +185,32 @@ Per-type URLs also available via constants (`CNPJ_OFFICIAL_SOURCE_URL`, `IE_OFFI
|
|
|
81
185
|
|
|
82
186
|
```bash
|
|
83
187
|
npm install -g @br-validators/cli
|
|
188
|
+
|
|
189
|
+
br-validators list
|
|
84
190
|
br-validators cnpj validate 12ABC34501DE35 --json
|
|
191
|
+
br-validators nfe-chave validate 52060433009911002506550120000007800267301615 --json
|
|
192
|
+
br-validators titulo-eleitor validate 004356870906
|
|
193
|
+
br-validators brcode validate '<emv-payload>'
|
|
194
|
+
br-validators ie validate 110042490114 --uf SP
|
|
195
|
+
|
|
196
|
+
# Platform APIs
|
|
197
|
+
br-validators detect '123.456.789-09' --json
|
|
198
|
+
br-validators sanitize cpf ' 123.456.789-09 ' --json
|
|
199
|
+
br-validators generate cpf --seed 42 --masked --json
|
|
85
200
|
```
|
|
86
201
|
|
|
87
202
|
---
|
|
88
203
|
|
|
204
|
+
## Related packages (monorepo)
|
|
205
|
+
|
|
206
|
+
| Package | Status |
|
|
207
|
+
|---------|--------|
|
|
208
|
+
| `@br-validators/cli` | Published — terminal CLI |
|
|
209
|
+
| `@br-validators/zod` | Workspace — Zod schemas (not on npm yet) |
|
|
210
|
+
| `@br-validators/react-hook-form` | Workspace — RHF resolvers (not on npm yet) |
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
89
214
|
## License
|
|
90
215
|
|
|
91
216
|
MIT
|
package/dist/boleto.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { b as BoletoValidationResult, V as ValidationErrorCode, B as BoletoInputKind, F as FormatResult } from './validation-result-
|
|
2
|
-
export { a as BoletoSituacao,
|
|
1
|
+
import { b as BoletoValidationResult, V as ValidationErrorCode, B as BoletoInputKind, F as FormatResult } from './validation-result-BhQE-1_O.js';
|
|
2
|
+
export { a as BoletoSituacao, i as CodigoBarras, D as DocumentFormat, L as LinhaDigitavel } from './validation-result-BhQE-1_O.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* FEBRABAN bank boleto (cobrança) — linha digitável + código de barras.
|
package/dist/boleto.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
|
|
1
|
+
export { formatBoleto } from './chunk-FXLVNCG3.js';
|
|
2
|
+
export { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-4W4OKLSZ.js';
|
|
3
|
+
import './chunk-MSLJF2FM.js';
|
|
3
4
|
//# sourceMappingURL=boleto.js.map
|
|
4
5
|
//# sourceMappingURL=boleto.js.map
|
package/dist/brcode.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { c as BrCodePayload } from './validation-result-
|
|
1
|
+
import { p as PixKey, q as PixKeyType, V as ValidationErrorCode, d as BrCodeValidationResult } from './validation-result-BhQE-1_O.js';
|
|
2
|
+
export { c as BrCodePayload } from './validation-result-BhQE-1_O.js';
|
|
3
3
|
|
|
4
4
|
/** Bacen Manual BR Code — EMV-QRCPS-MPM TLV + CRC16-CCITT */
|
|
5
5
|
declare const BRCODE_OFFICIAL_SOURCE_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf";
|
package/dist/brcode.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import './chunk-
|
|
1
|
+
import './chunk-RYGAK7PB.js';
|
|
2
|
+
export { BRCODE_GOLDEN_COMPOSITE, BRCODE_GOLDEN_DYNAMIC_URL, BRCODE_GOLDEN_STATIC_CPF, BRCODE_GOLDEN_STATIC_EMAIL, BRCODE_GOLDEN_STATIC_EVP, BRCODE_OFFICIAL_SOURCE_URL, BRCODE_PIX_INITIATION_MANUAL_URL, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc } from './chunk-WCQUQ2WX.js';
|
|
3
|
+
import './chunk-MK7OJUF5.js';
|
|
4
|
+
import './chunk-XUO7FV6Z.js';
|
|
5
|
+
import './chunk-YXELVV37.js';
|
|
4
6
|
import './chunk-EB3G4IG6.js';
|
|
5
|
-
import './chunk-
|
|
7
|
+
import './chunk-KQDLIGSG.js';
|
|
8
|
+
import './chunk-F6PTZY4O.js';
|
|
6
9
|
import './chunk-UCJPSJN5.js';
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
10
|
+
import './chunk-OTZHMJYE.js';
|
|
11
|
+
import './chunk-MSLJF2FM.js';
|
|
9
12
|
//# sourceMappingURL=brcode.js.map
|
|
10
13
|
//# sourceMappingURL=brcode.js.map
|
package/dist/cartao-credito.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { e as CartaoCreditoValidationResult, F as FormatResult } from './validation-result-
|
|
2
|
-
export { C as CartaoCredito, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-
|
|
1
|
+
import { e as CartaoCreditoValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
|
|
2
|
+
export { C as CartaoCredito, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Credit card PAN constants — ISO/IEC 7812-1 Annex B (Luhn).
|
package/dist/cartao-credito.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import './chunk-CQPM43VV.js';
|
|
2
|
+
export { formatCartaoCredito } from './chunk-XKY2CV3G.js';
|
|
3
|
+
export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-EPKHEW5V.js';
|
|
4
|
+
import './chunk-MSLJF2FM.js';
|
|
3
5
|
//# sourceMappingURL=cartao-credito.js.map
|
|
4
6
|
//# sourceMappingURL=cartao-credito.js.map
|
package/dist/cep.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { f as Cep, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-
|
|
1
|
+
import { x as ValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
|
|
2
|
+
export { f as Cep, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';
|
|
3
3
|
|
|
4
4
|
declare const CEP_GOLDEN_PRIMARY = "01310100";
|
|
5
5
|
declare const CEP_GOLDEN_SECONDARY = "20040020";
|
package/dist/cep.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import './chunk-2CNYSY3Z.js';
|
|
2
|
+
export { formatCep } from './chunk-ZAUZRIOU.js';
|
|
3
|
+
export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, isValidCep, validateCep } from './chunk-2JJS46FM.js';
|
|
4
|
+
export { stripCep } from './chunk-YYHS5WQN.js';
|
|
5
|
+
import './chunk-4SNBZFS5.js';
|
|
3
6
|
import './chunk-EB3G4IG6.js';
|
|
4
7
|
import './chunk-UCJPSJN5.js';
|
|
5
|
-
import './chunk-
|
|
8
|
+
import './chunk-MSLJF2FM.js';
|
|
6
9
|
//# sourceMappingURL=cep.js.map
|
|
7
10
|
//# sourceMappingURL=cep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-2CNYSY3Z.js"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { stripCep } from './chunk-
|
|
2
|
-
import { brandCep } from './chunk-
|
|
1
|
+
import { stripCep } from './chunk-YYHS5WQN.js';
|
|
2
|
+
import { brandCep } from './chunk-MSLJF2FM.js';
|
|
3
3
|
|
|
4
4
|
// src/core/cep/constants.ts
|
|
5
5
|
var CEP_LENGTH = 8;
|
|
@@ -38,24 +38,6 @@ function validateCep(input) {
|
|
|
38
38
|
return { ok: true, value: brandCep(stripped), format: "numeric" };
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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-GLKGX552.js.map
|
|
61
|
-
//# sourceMappingURL=chunk-GLKGX552.js.map
|
|
41
|
+
export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_MASK_PATTERN, CEP_OFFICIAL_SOURCE_URL, isValidCep, validateCep };
|
|
42
|
+
//# sourceMappingURL=chunk-2JJS46FM.js.map
|
|
43
|
+
//# sourceMappingURL=chunk-2JJS46FM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/cep/constants.ts","../src/core/cep/index.ts"],"names":[],"mappings":";;;;AAKO,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,gBAAA,GAAmB;AAGzB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,yBAAA,GAA4B;AAClC,IAAM,uBAAA,GACX;;;ACMF,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEA,SAAS,iBAAA,CAAkB,OAAe,QAAA,EAAuC;AAC/E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,eAAe,oBAAoB,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC9C,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,OAAA,CAAQ,qBAAqB,iCAAiC,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,UAAA,EAAY;AAClC,IAAA,OAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAA,cAAA,EAAiB,UAAU,CAAA,2BAAA,CAA6B,CAAA;AAAA,EAC3F;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,EAAA;AAC5B;AAEO,SAAS,YAAY,KAAA,EAAiC;AAC3D,EAAA,MAAM,QAAA,GAAW,SAAS,KAAK,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AACpD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,SAAS,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAClE","file":"chunk-2JJS46FM.js","sourcesContent":["/**\n * CEP constants — 8 digits, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nexport const CEP_LENGTH = 8;\nexport const CEP_MASK_PATTERN = /^(\\d{5})(\\d{3})$/;\nexport const CEP_NUMERIC_PATTERN = /^\\d{8}$/;\n\nexport const CEP_GOLDEN_PRIMARY = '01310100';\nexport const CEP_GOLDEN_SECONDARY = '20040020';\nexport const CEP_GOLDEN_PRIMARY_MASKED = '01310-100';\nexport const CEP_OFFICIAL_SOURCE_URL =\n 'https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep';\n","/**\n * CEP validation — structural only, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nimport { stripCep } from '../../strip/index.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCep } from '../../types/validation-result.js';\nimport { CEP_LENGTH } from './constants.js';\n\nexport {\n CEP_GOLDEN_PRIMARY,\n CEP_GOLDEN_PRIMARY_MASKED,\n CEP_GOLDEN_SECONDARY,\n CEP_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CEP input is empty');\n }\n\n const withoutMask = input.replace(/[-\\s]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CEP contains invalid characters');\n }\n\n if (stripped.length !== CEP_LENGTH) {\n return failure('INVALID_LENGTH', `CEP must have ${CEP_LENGTH} digits after normalization`);\n }\n\n return null;\n}\n\nexport function isValidCep(input: string): boolean {\n return validateCep(input).ok;\n}\n\nexport function validateCep(input: string): ValidationResult {\n const stripped = stripCep(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n return { ok: true, value: brandCep(stripped), format: 'numeric' };\n}\n"]}
|