@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.
Files changed (174) hide show
  1. package/README.md +147 -22
  2. package/dist/boleto.d.ts +2 -2
  3. package/dist/boleto.js +3 -2
  4. package/dist/brcode.d.ts +2 -2
  5. package/dist/brcode.js +9 -6
  6. package/dist/cartao-credito.d.ts +2 -2
  7. package/dist/cartao-credito.js +4 -2
  8. package/dist/cep.d.ts +2 -2
  9. package/dist/cep.js +6 -3
  10. package/dist/chunk-2CNYSY3Z.js +3 -0
  11. package/dist/chunk-2CNYSY3Z.js.map +1 -0
  12. package/dist/{chunk-GLKGX552.js → chunk-2JJS46FM.js} +5 -23
  13. package/dist/chunk-2JJS46FM.js.map +1 -0
  14. package/dist/{chunk-FLZ6IHOD.js → chunk-3QP6R46N.js} +119 -496
  15. package/dist/chunk-3QP6R46N.js.map +1 -0
  16. package/dist/chunk-4SNBZFS5.js +8 -0
  17. package/dist/chunk-4SNBZFS5.js.map +1 -0
  18. package/dist/{chunk-IW3ESGWH.js → chunk-4W4OKLSZ.js} +4 -25
  19. package/dist/chunk-4W4OKLSZ.js.map +1 -0
  20. package/dist/chunk-4Y2FBO57.js +26 -0
  21. package/dist/chunk-4Y2FBO57.js.map +1 -0
  22. package/dist/{chunk-465IC76U.js → chunk-5UL3M7IU.js} +4 -23
  23. package/dist/chunk-5UL3M7IU.js.map +1 -0
  24. package/dist/chunk-6QJFMOIX.js +22 -0
  25. package/dist/chunk-6QJFMOIX.js.map +1 -0
  26. package/dist/chunk-7ZL7PZII.js +187 -0
  27. package/dist/chunk-7ZL7PZII.js.map +1 -0
  28. package/dist/chunk-BFZPCEYB.js +14 -0
  29. package/dist/chunk-BFZPCEYB.js.map +1 -0
  30. package/dist/chunk-CDGRHI7W.js +22 -0
  31. package/dist/chunk-CDGRHI7W.js.map +1 -0
  32. package/dist/chunk-CQPM43VV.js +3 -0
  33. package/dist/chunk-CQPM43VV.js.map +1 -0
  34. package/dist/chunk-D36RM7OD.js +207 -0
  35. package/dist/chunk-D36RM7OD.js.map +1 -0
  36. package/dist/{chunk-CR45BOLS.js → chunk-EPKHEW5V.js} +4 -13
  37. package/dist/chunk-EPKHEW5V.js.map +1 -0
  38. package/dist/{chunk-5BBNLRZP.js → chunk-F6PTZY4O.js} +5 -14
  39. package/dist/chunk-F6PTZY4O.js.map +1 -0
  40. package/dist/chunk-FXLVNCG3.js +26 -0
  41. package/dist/chunk-FXLVNCG3.js.map +1 -0
  42. package/dist/chunk-G24G7WR5.js +3 -0
  43. package/dist/chunk-G24G7WR5.js.map +1 -0
  44. package/dist/chunk-G2Y63PIF.js +24 -0
  45. package/dist/chunk-G2Y63PIF.js.map +1 -0
  46. package/dist/chunk-G32U6YQ5.js +14 -0
  47. package/dist/chunk-G32U6YQ5.js.map +1 -0
  48. package/dist/{chunk-TVVNTLIH.js → chunk-GRDUTHNX.js} +3 -3
  49. package/dist/{chunk-TVVNTLIH.js.map → chunk-GRDUTHNX.js.map} +1 -1
  50. package/dist/chunk-GVK6IMBF.js +3 -0
  51. package/dist/chunk-GVK6IMBF.js.map +1 -0
  52. package/dist/chunk-IQGRFAQV.js +23 -0
  53. package/dist/chunk-IQGRFAQV.js.map +1 -0
  54. package/dist/chunk-JQABTHUJ.js +3 -0
  55. package/dist/chunk-JQABTHUJ.js.map +1 -0
  56. package/dist/{chunk-GN7QIQE6.js → chunk-KH7DWOUA.js} +5 -23
  57. package/dist/chunk-KH7DWOUA.js.map +1 -0
  58. package/dist/chunk-KQDLIGSG.js +14 -0
  59. package/dist/chunk-KQDLIGSG.js.map +1 -0
  60. package/dist/chunk-LF2B4VPE.js +3 -0
  61. package/dist/chunk-LF2B4VPE.js.map +1 -0
  62. package/dist/chunk-LGD2JJBZ.js +288 -0
  63. package/dist/chunk-LGD2JJBZ.js.map +1 -0
  64. package/dist/{chunk-MQT25QN7.js → chunk-LYBFUKHR.js} +4 -3
  65. package/dist/chunk-LYBFUKHR.js.map +1 -0
  66. package/dist/chunk-MFNJTAUS.js +3 -0
  67. package/dist/chunk-MFNJTAUS.js.map +1 -0
  68. package/dist/{chunk-D5JMGN7U.js → chunk-MK7OJUF5.js} +7 -5
  69. package/dist/chunk-MK7OJUF5.js.map +1 -0
  70. package/dist/chunk-MLPXW7N2.js +226 -0
  71. package/dist/chunk-MLPXW7N2.js.map +1 -0
  72. package/dist/{chunk-BBL6ZPXH.js → chunk-MSLJF2FM.js} +18 -3
  73. package/dist/chunk-MSLJF2FM.js.map +1 -0
  74. package/dist/{chunk-V3OWDXRU.js → chunk-NHLLC6WH.js} +4 -3
  75. package/dist/chunk-NHLLC6WH.js.map +1 -0
  76. package/dist/chunk-OCYXNLHO.js +307 -0
  77. package/dist/chunk-OCYXNLHO.js.map +1 -0
  78. package/dist/{chunk-B2TDI3YS.js → chunk-OTZHMJYE.js} +3 -3
  79. package/dist/{chunk-B2TDI3YS.js.map → chunk-OTZHMJYE.js.map} +1 -1
  80. package/dist/chunk-P55H5YRX.js +3 -0
  81. package/dist/chunk-P55H5YRX.js.map +1 -0
  82. package/dist/chunk-PB4RIS6G.js +27 -0
  83. package/dist/chunk-PB4RIS6G.js.map +1 -0
  84. package/dist/chunk-QGMVUIDD.js +3 -0
  85. package/dist/chunk-QGMVUIDD.js.map +1 -0
  86. package/dist/chunk-RYGAK7PB.js +3 -0
  87. package/dist/chunk-RYGAK7PB.js.map +1 -0
  88. package/dist/chunk-US4OLTJ2.js +104 -0
  89. package/dist/chunk-US4OLTJ2.js.map +1 -0
  90. package/dist/{chunk-GEHAH4OH.js → chunk-WCQUQ2WX.js} +4 -4
  91. package/dist/{chunk-GEHAH4OH.js.map → chunk-WCQUQ2WX.js.map} +1 -1
  92. package/dist/chunk-WLE2ENQA.js +86 -0
  93. package/dist/chunk-WLE2ENQA.js.map +1 -0
  94. package/dist/{chunk-2KTD23PD.js → chunk-WPL47PWJ.js} +5 -14
  95. package/dist/chunk-WPL47PWJ.js.map +1 -0
  96. package/dist/chunk-XKY2CV3G.js +14 -0
  97. package/dist/chunk-XKY2CV3G.js.map +1 -0
  98. package/dist/chunk-XUO7FV6Z.js +14 -0
  99. package/dist/chunk-XUO7FV6Z.js.map +1 -0
  100. package/dist/chunk-Y2KUN2D3.js +3 -0
  101. package/dist/chunk-Y2KUN2D3.js.map +1 -0
  102. package/dist/chunk-Y6IW2LMW.js +460 -0
  103. package/dist/chunk-Y6IW2LMW.js.map +1 -0
  104. package/dist/chunk-YGA5W54J.js +3 -0
  105. package/dist/chunk-YGA5W54J.js.map +1 -0
  106. package/dist/{chunk-UE4PVN6Y.js → chunk-YXELVV37.js} +5 -14
  107. package/dist/chunk-YXELVV37.js.map +1 -0
  108. package/dist/chunk-YYHS5WQN.js +28 -0
  109. package/dist/chunk-YYHS5WQN.js.map +1 -0
  110. package/dist/chunk-ZAUZRIOU.js +23 -0
  111. package/dist/chunk-ZAUZRIOU.js.map +1 -0
  112. package/dist/chunk-ZH4RJNG7.js +3 -0
  113. package/dist/chunk-ZH4RJNG7.js.map +1 -0
  114. package/dist/cnh.d.ts +39 -0
  115. package/dist/cnh.js +11 -0
  116. package/dist/cnh.js.map +1 -0
  117. package/dist/cnpj.d.ts +2 -2
  118. package/dist/cnpj.js +6 -4
  119. package/dist/cpf.d.ts +2 -2
  120. package/dist/cpf.js +6 -4
  121. package/dist/detect.d.ts +23 -0
  122. package/dist/detect.js +26 -0
  123. package/dist/detect.js.map +1 -0
  124. package/dist/generate.d.ts +10 -0
  125. package/dist/generate.js +29 -0
  126. package/dist/generate.js.map +1 -0
  127. package/dist/index-CZLo9YOT.d.ts +21 -0
  128. package/dist/index.d.ts +12 -4
  129. package/dist/index.js +60 -25
  130. package/dist/index.js.map +1 -1
  131. package/dist/inscricao-estadual-produtor-rural-CfWUaggb.d.ts +46 -0
  132. package/dist/inscricao-estadual-produtor-rural.d.ts +2 -0
  133. package/dist/inscricao-estadual-produtor-rural.js +7 -0
  134. package/dist/inscricao-estadual-produtor-rural.js.map +1 -0
  135. package/dist/inscricao-estadual.d.ts +4 -21
  136. package/dist/inscricao-estadual.js +5 -2
  137. package/dist/nfe-chave.d.ts +71 -0
  138. package/dist/nfe-chave.js +6 -0
  139. package/dist/nfe-chave.js.map +1 -0
  140. package/dist/pis-pasep.d.ts +2 -2
  141. package/dist/pis-pasep.js +5 -3
  142. package/dist/{pix-BtTx04Si.d.ts → pix-ddldLlb7.d.ts} +1 -1
  143. package/dist/pix.d.ts +2 -2
  144. package/dist/pix.js +8 -6
  145. package/dist/placa.d.ts +2 -2
  146. package/dist/placa.js +6 -3
  147. package/dist/renavam.d.ts +37 -0
  148. package/dist/renavam.js +11 -0
  149. package/dist/renavam.js.map +1 -0
  150. package/dist/sanitize.d.ts +9 -0
  151. package/dist/sanitize.js +24 -0
  152. package/dist/sanitize.js.map +1 -0
  153. package/dist/telefone.d.ts +2 -2
  154. package/dist/telefone.js +4 -2
  155. package/dist/titulo-eleitor.d.ts +56 -0
  156. package/dist/titulo-eleitor.js +10 -0
  157. package/dist/titulo-eleitor.js.map +1 -0
  158. package/dist/{validation-result-C-Ei-lZH.d.ts → validation-result-BhQE-1_O.d.ts} +64 -2
  159. package/package.json +48 -4
  160. package/dist/chunk-2KTD23PD.js.map +0 -1
  161. package/dist/chunk-465IC76U.js.map +0 -1
  162. package/dist/chunk-5BBNLRZP.js.map +0 -1
  163. package/dist/chunk-BBL6ZPXH.js.map +0 -1
  164. package/dist/chunk-CR45BOLS.js.map +0 -1
  165. package/dist/chunk-D5JMGN7U.js.map +0 -1
  166. package/dist/chunk-FLZ6IHOD.js.map +0 -1
  167. package/dist/chunk-GLKGX552.js.map +0 -1
  168. package/dist/chunk-GN7QIQE6.js.map +0 -1
  169. package/dist/chunk-IW3ESGWH.js.map +0 -1
  170. package/dist/chunk-MQT25QN7.js.map +0 -1
  171. package/dist/chunk-UE4PVN6Y.js.map +0 -1
  172. package/dist/chunk-V3OWDXRU.js.map +0 -1
  173. package/dist/chunk-W6UXVWSR.js +0 -13
  174. 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. Use **`@br-validators/core`**.
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
- ## Supported types
23
+ ## Platform APIs
23
24
 
24
- | Module | Functions | Golden vector |
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
- Subpath imports for tree-shaking:
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
- const result = validateCnpj('12ABC34501DE35');
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. Full table: [OFFICIAL-SOURCES.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/OFFICIAL-SOURCES.md)
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
- Per-type URLs also available via constants (`CNPJ_OFFICIAL_SOURCE_URL`, `IE_OFFICIAL_SOURCE_URLS`, etc.).
170
+ Golden test vectors: `tests/vectors/*.official.json` in the repo.
71
171
 
72
172
  ---
73
173
 
74
174
  ## API reference
75
175
 
76
- [docs/LIBRARY-API.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/LIBRARY-API.md)
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-C-Ei-lZH.js';
2
- export { a as BoletoSituacao, h as CodigoBarras, D as DocumentFormat, L as LinhaDigitavel } from './validation-result-C-Ei-lZH.js';
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 { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-IW3ESGWH.js';
2
- import './chunk-BBL6ZPXH.js';
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 { k as PixKey, l as PixKeyType, V as ValidationErrorCode, d as BrCodeValidationResult } from './validation-result-C-Ei-lZH.js';
2
- export { c as BrCodePayload } from './validation-result-C-Ei-lZH.js';
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
- export { BRCODE_GOLDEN_COMPOSITE, BRCODE_GOLDEN_DYNAMIC_URL, BRCODE_GOLDEN_STATIC_CPF, BRCODE_GOLDEN_STATIC_EMAIL, BRCODE_GOLDEN_STATIC_EVP, BRCODE_OFFICIAL_SOURCE_URL, BRCODE_PIX_INITIATION_MANUAL_URL, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc } from './chunk-GEHAH4OH.js';
2
- import './chunk-D5JMGN7U.js';
3
- import './chunk-UE4PVN6Y.js';
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-5BBNLRZP.js';
7
+ import './chunk-KQDLIGSG.js';
8
+ import './chunk-F6PTZY4O.js';
6
9
  import './chunk-UCJPSJN5.js';
7
- import './chunk-B2TDI3YS.js';
8
- import './chunk-BBL6ZPXH.js';
10
+ import './chunk-OTZHMJYE.js';
11
+ import './chunk-MSLJF2FM.js';
9
12
  //# sourceMappingURL=brcode.js.map
10
13
  //# sourceMappingURL=brcode.js.map
@@ -1,5 +1,5 @@
1
- import { e as CartaoCreditoValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js';
2
- export { C as CartaoCredito, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js';
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).
@@ -1,4 +1,6 @@
1
- export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-CR45BOLS.js';
2
- import './chunk-BBL6ZPXH.js';
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 { q as ValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js';
2
- export { f as Cep, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js';
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
- export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep } from './chunk-GLKGX552.js';
2
- export { stripCep } from './chunk-W6UXVWSR.js';
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-BBL6ZPXH.js';
8
+ import './chunk-MSLJF2FM.js';
6
9
  //# sourceMappingURL=cep.js.map
7
10
  //# sourceMappingURL=cep.js.map
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-2CNYSY3Z.js.map
3
+ //# sourceMappingURL=chunk-2CNYSY3Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-2CNYSY3Z.js"}
@@ -1,5 +1,5 @@
1
- import { stripCep } from './chunk-W6UXVWSR.js';
2
- import { brandCep } from './chunk-BBL6ZPXH.js';
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
- // 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-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"]}