@br-validators/core 0.12.0-alpha.1 → 0.12.0-alpha.3

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 CHANGED
@@ -1,110 +1,63 @@
1
1
  # @br-validators/core
2
2
 
3
- 100% open-source Brazilian document validators (MIT). Pure TypeScript — no HTTP lookups, no frameworks.
3
+ > **The** Brazilian document validation library for TypeScript.
4
+ > Validate, format, and generate CPF, CNPJ (including the new alphanumeric format), NF-e, BR Code PIX, boleto, IE (all 27 states), and 15+ more — zero dependencies, fully typed, never throws.
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)
7
- **Playground:** [doc-raiz-playground.vercel.app](https://doc-raiz-playground.vercel.app/)
8
-
9
- > The unscoped name `br-validators` on npm is a **different package**. Use **`@br-validators/core`**.
10
-
11
- ---
12
-
13
- ## Install
6
+ [![npm](https://img.shields.io/npm/v/@br-validators/core)](https://www.npmjs.com/package/@br-validators/core)
7
+ [![MIT](https://img.shields.io/badge/license-MIT-blue)](https://github.com/AlexandreZanata/br-validators/blob/main/LICENSE)
8
+ [![Node ≥ 18](https://img.shields.io/badge/node-%3E%3D18-brightgreen)]()
14
9
 
15
10
  ```bash
16
11
  npm install @br-validators/core
17
12
  ```
18
13
 
19
- Requires Node 18. ESM only (`"type": "module"`).
14
+ **Try it now → [doc-raiz-playground.vercel.app](https://doc-raiz-playground.vercel.app)**
15
+ **CLI → `npm install -g @br-validators/cli`**
20
16
 
21
- ---
17
+ > ⚠️ The unscoped `br-validators` on npm is a different package. Use **`@br-validators/core`**.
22
18
 
23
- ## Platform APIs
19
+ ---
24
20
 
25
- Cross-cutting helpers that **compose existing validators** — never duplicate check-digit logic.
21
+ ## Why this library
26
22
 
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) |
23
+ Every Brazilian SaaS eventually reinvents CPF validation — usually wrong.
24
+ `@br-validators/core` implements each algorithm from its **official primary source**
25
+ (Receita Federal, Bacen, CONTRAN, TSE, SEFAZ, FEBRABAN, Anatel) so you don't have to.
32
26
 
33
- ```typescript
34
- import { detect, sanitize, generate } from '@br-validators/core';
35
- import { validateCpf } from '@br-validators/core/cpf';
27
+ - ✅ **CNPJ alfanumérico** — new RFB format (effective July 2026), ready now
28
+ - **18 document types** — CPF, CNPJ, CEP, NF-e chave, BR Code PIX, boleto, CNH, RENAVAM, placa, PIS/PASEP, PIX key, cartão de crédito, IE (27 UFs), IE produtor rural, título de eleitor, telefone, + platform APIs
29
+ - **Zero runtime dependencies** — pure TypeScript logic, no HTTP calls
30
+ - ✅ **Never throws** — every function returns `{ ok: true, value } | { ok: false, message, code }`
31
+ - ✅ **Tree-shakeable** — subpath imports per document type
32
+ - ✅ **ESM only**, Node ≥ 18, works in browser, Bun, Deno
36
33
 
37
- // Auto-detect document type
38
- detect('123.456.789-09');
39
- // → { type: 'cpf', ok: true, value: '12345678909', format: 'numeric' }
34
+ ---
40
35
 
41
- detect('110042490114', { uf: 'SP' });
42
- // → { type: 'inscricao-estadual', ok: true, ... }
36
+ ## Quick start
43
37
 
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'] }
38
+ ```typescript
39
+ import { validateCpf, formatCpf } from '@br-validators/core';
47
40
 
48
- sanitize('110.042.490.114', 'inscricao-estadual', { uf: 'SP' });
49
- // { ok: true, value: '110042490114', fixes: [...] }
41
+ validateCpf('123.456.789-09');
42
+ // { ok: true, value: '12345678909' }
50
43
 
51
- // Synthetic valid documents for tests (never production IDs)
52
- const cpf = generate('cpf', { seed: 42 });
53
- validateCpf(cpf).ok; // true
44
+ formatCpf('12345678909');
45
+ // { ok: true, formatted: '123.456.789-09' }
54
46
 
55
- generate('cnpj', { format: 'alphanumeric', masked: true, seed: 7 });
56
- generate('placa', { format: 'mercosul', seed: 3 });
47
+ validateCpf('111.111.111-11');
48
+ // { ok: false, message: 'CPF with all identical digits is invalid', code: 'KNOWN_INVALID_PATTERN' }
57
49
  ```
58
50
 
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:
51
+ ### CNPJ numeric and alphanumeric (new RFB format)
89
52
 
90
53
  ```typescript
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';
95
- import { validateInscricaoEstadual } from '@br-validators/core/inscricao-estadual';
96
- import { validateIeProdutorRural } from '@br-validators/core/inscricao-estadual-produtor-rural';
97
- ```
98
-
99
- ---
54
+ import { validateCnpj, formatCnpj } from '@br-validators/core/cnpj';
100
55
 
101
- ## Examples
102
-
103
- ### CNPJ (numeric + alphanumeric)
104
-
105
- ```typescript
106
- import { validateCnpj, formatCnpj } from '@br-validators/core';
56
+ // Numeric (current format)
57
+ validateCnpj('11.222.333/0001-81');
58
+ // { ok: true, value: '11222333000181', format: 'numeric' }
107
59
 
60
+ // Alphanumeric (new format — effective July 2026)
108
61
  validateCnpj('12ABC34501DE35');
109
62
  // { ok: true, value: '12ABC34501DE35', format: 'alphanumeric' }
110
63
 
@@ -112,105 +65,160 @@ formatCnpj('12ABC34501DE35');
112
65
  // { ok: true, formatted: '12.ABC.345/01DE-35' }
113
66
  ```
114
67
 
115
- ### Inscrição Estadual (all 27 UFs)
68
+ ### Auto-detect document type
116
69
 
117
70
  ```typescript
118
- import { validateInscricaoEstadual } from '@br-validators/core/inscricao-estadual';
71
+ import { detect } from '@br-validators/core';
119
72
 
120
- validateInscricaoEstadual('110042490114', { uf: 'SP' });
121
- validateInscricaoEstadual('0730000100109', { uf: 'DF' });
122
- // getIeOfficialSourceUrl('SP') → SEFAZ primary URL
73
+ detect('123.456.789-09');
74
+ // { type: 'cpf', ok: true, value: '12345678909' }
75
+
76
+ detect('ABC1D23');
77
+ // { type: 'placa', ok: true, format: 'mercosul' }
78
+
79
+ detect('110042490114', { uf: 'SP' });
80
+ // { type: 'inscricao-estadual', ok: true }
123
81
  ```
124
82
 
125
- ### SP produtor rural (`P` prefix)
83
+ ### Generate valid documents for tests
126
84
 
127
85
  ```typescript
128
- import { validateIeProdutorRural } from '@br-validators/core/inscricao-estadual-produtor-rural';
86
+ import { generate } from '@br-validators/core';
87
+
88
+ generate('cpf', { seed: 42 }); // reproducible, always valid
89
+ generate('cnpj', { format: 'alphanumeric', masked: true });
90
+ generate('placa', { format: 'mercosul' });
91
+ generate('renavam');
92
+ generate('cnh');
93
+ generate('inscricao-estadual', { uf: 'SP', seed: 42 });
94
+ generate('titulo-eleitor', { uf: 'SC', seed: 42 });
95
+ generate('cartao-credito', { brand: 'visa', seed: 42 });
96
+ ```
97
+
98
+ > `generate()` is for test fixtures and seed data only — never use in production.
99
+
100
+ ### ETL / data cleanup
101
+
102
+ ```typescript
103
+ import { sanitize } from '@br-validators/core';
104
+
105
+ sanitize(' 123.456.789-09 ', 'cpf');
106
+ // { ok: true, value: '12345678909', fixes: ['trimmed', 'removed_non_digits'] }
129
107
 
130
- validateIeProdutorRural('SP', 'P-01100424.3/002');
131
- // { ok: true, value: 'P011004243002', ... }
108
+ sanitize('110.042.490.114', 'inscricao-estadual', { uf: 'SP' });
109
+ // { ok: true, value: '110042490114', fixes: [...] }
132
110
  ```
133
111
 
134
- ### NF-e / NFC-e chave de acesso (44 digits)
112
+ ### NF-e chave de acesso (44 digits)
135
113
 
136
114
  ```typescript
137
115
  import { validateNfeChave, parseNfeChave } from '@br-validators/core/nfe-chave';
138
116
 
139
117
  const result = validateNfeChave('52060433009911002506550120000007800267301615');
140
- // { ok: true, parsed: { cUF, cnpj, mod, serie, nNF, ... }, uf: 'GO' }
118
+ // { ok: true, parsed: { cUF: '52', cnpj: '33009911002506', mod: '55', ... }, uf: 'GO' }
141
119
  ```
142
120
 
143
121
  ### BR Code (PIX QR payload)
144
122
 
145
123
  ```typescript
146
- import { validateBrCode } from '@br-validators/core/brcode';
124
+ import { validateBrCode, parseBrCode } from '@br-validators/core/brcode';
147
125
 
148
- validateBrCode('00020126580014br.gov.bcb.pix0136...63041D3D');
149
- // { ok: true, pixKey, merchantName, merchantCity, ... }
126
+ parseBrCode('00020126580014br.gov.bcb.pix0136...');
127
+ // { ok: true, pixKey, pixKeyType, merchantName, merchantCity, amount, txid }
150
128
  ```
151
129
 
152
- ### Boleto (linha digitável ↔ código de barras)
130
+ ### Form handler (React / Next.js)
153
131
 
154
132
  ```typescript
155
- import { validateBoleto, convertLinhaToCodigoBarras } from '@br-validators/core/boleto';
156
-
157
- validateBoleto('03399.02579 08991.834006 71742.301014 6 14500000099668');
133
+ 'use client';
134
+ import { validateCnpj, formatCnpj } from '@br-validators/core/cnpj';
135
+ import { useState } from 'react';
136
+
137
+ export function CnpjField() {
138
+ const [input, setInput] = useState('');
139
+ const result = input ? validateCnpj(input) : null;
140
+ const formatted = result?.ok ? formatCnpj(result.value) : null;
141
+
142
+ return (
143
+ <div>
144
+ <input value={input} onChange={e => setInput(e.target.value)} />
145
+ {formatted?.ok && <p>✅ {formatted.formatted}</p>}
146
+ {result && !result.ok && <p>❌ {result.message}</p>}
147
+ </div>
148
+ );
149
+ }
158
150
  ```
159
151
 
160
- ---
161
-
162
- ## Official sources
163
-
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.
152
+ ### Shell / CI
169
153
 
170
- Golden test vectors: `tests/vectors/*.official.json` in the repo.
154
+ ```bash
155
+ br-validators cnpj validate "$CNPJ" --quiet || exit 1
156
+ br-validators ie validate "$IE" --uf SP --json
157
+ br-validators detect '123.456.789-09' --json
158
+ br-validators generate cpf --seed 42 --masked
159
+ br-validators generate inscricao-estadual --uf SP --seed 42
160
+ br-validators generate cartao-credito --brand visa --seed 42
161
+ ```
171
162
 
172
163
  ---
173
164
 
174
- ## API reference
175
-
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 |
165
+ ## All supported types
166
+
167
+ | Document | Subpath import | CLI | Playground |
168
+ |---|---|---|---|
169
+ | CPF | `@br-validators/core/cpf` | `br-validators cpf …` | `/cpf` |
170
+ | CNPJ (numeric + alphanumeric) | `@br-validators/core/cnpj` | `br-validators cnpj …` | `/cnpj` |
171
+ | CEP | `@br-validators/core/cep` | `br-validators cep …` | `/cep` |
172
+ | Telefone | `@br-validators/core/telefone` | `br-validators telefone …` | `/telefone` |
173
+ | CNH | `@br-validators/core/cnh` | `br-validators cnh …` | `/cnh` |
174
+ | RENAVAM | `@br-validators/core/renavam` | `br-validators renavam …` | `/renavam` |
175
+ | Título de Eleitor | `@br-validators/core/titulo-eleitor` | `br-validators titulo-eleitor …` | `/titulo-eleitor` |
176
+ | Placa (Mercosul + legada) | `@br-validators/core/placa` | `br-validators placa …` | `/placa` |
177
+ | PIS / PASEP / NIS | `@br-validators/core/pis-pasep` | `br-validators pis-pasep …` | `/pis` |
178
+ | PIX key | `@br-validators/core/pix` | `br-validators pix …` | `/pix` |
179
+ | BR Code (PIX QR payload) | `@br-validators/core/brcode` | `br-validators brcode …` | `/brcode` |
180
+ | Boleto (Situação 1 + 2) | `@br-validators/core/boleto` | `br-validators boleto …` | `/boleto` |
181
+ | NF-e / NFC-e chave (44 digits) | `@br-validators/core/nfe-chave` | `br-validators nfe-chave …` | `/nfe-chave` |
182
+ | Cartão de crédito (Luhn) | `@br-validators/core/cartao-credito` | `br-validators cartao …` | `/cartao-credito` |
183
+ | Inscrição Estadual (27 UFs) | `@br-validators/core/inscricao-estadual` | `br-validators ie … --uf SP` | `/ie` |
184
+ | IE Produtor Rural | `@br-validators/core/inscricao-estadual-produtor-rural` | `br-validators ie …` (auto-detect `P` prefix) | `/ie` |
185
+ | **detect()** | `@br-validators/core/detect` | `br-validators detect …` | `/detect` |
186
+ | **sanitize()** | `@br-validators/core/sanitize` | `br-validators sanitize …` | `/sanitize` |
187
+ | **generate()** | `@br-validators/core/generate` | `br-validators generate …` | `/generate` |
188
+
189
+ Full official sources per type: [docs/OFFICIAL-SOURCES.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/OFFICIAL-SOURCES.md)
181
190
 
182
191
  ---
183
192
 
184
- ## CLI companion
193
+ ## Tree-shaking
185
194
 
186
- ```bash
187
- npm install -g @br-validators/cli
188
-
189
- br-validators list
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
+ ```typescript
196
+ // Only ships the CPF module — nothing else
197
+ import { validateCpf } from '@br-validators/core/cpf';
195
198
 
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
199
+ // Only ships NF-e module
200
+ import { parseNfeChave } from '@br-validators/core/nfe-chave';
200
201
  ```
201
202
 
202
203
  ---
203
204
 
204
- ## Related packages (monorepo)
205
+ ## Related packages
205
206
 
206
207
  | 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) |
208
+ |---|---|
209
+ | [`@br-validators/cli`](https://www.npmjs.com/package/@br-validators/cli) | Published |
210
+ | `@br-validators/zod` | Coming soon — Zod schemas |
211
+ | `@br-validators/react-hook-form` | Coming soon — RHF resolvers |
212
+
213
+ ---
214
+
215
+ ## Contributing
216
+
217
+ Issues, corrections, and new document types are welcome.
218
+ See [CONTRIBUTING.md](https://github.com/AlexandreZanata/br-validators/blob/main/CONTRIBUTING.md) and open `good first issue` items.
211
219
 
212
220
  ---
213
221
 
214
222
  ## License
215
223
 
216
- MIT
224
+ [MIT](https://github.com/AlexandreZanata/br-validators/blob/main/LICENSE) — permanently free and open source.
@@ -1,22 +1,7 @@
1
1
  import { e as CartaoCreditoValidationResult, F as FormatResult } from './validation-result-BhQE-1_O.js';
2
2
  export { C as CartaoCredito, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BhQE-1_O.js';
3
-
4
- /**
5
- * Credit card PAN constants — ISO/IEC 7812-1 Annex B (Luhn).
6
- * @see https://www.iso.org/standard/70484.html
7
- * @see docs/use-cases/UC-008-validate-cartao-credito.md
8
- */
9
- type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown';
10
- declare const CARTAO_PAN_MIN_LENGTH = 8;
11
- declare const CARTAO_PAN_MAX_LENGTH = 19;
12
- declare const CARTAO_GOLDEN_VISA = "4111111111111111";
13
- declare const CARTAO_GOLDEN_MASTERCARD = "5555555555554444";
14
- declare const CARTAO_GOLDEN_AMEX = "378282246310005";
15
- declare const CARTAO_GOLDEN_LUHN_WALKTHROUGH = "79927398713";
16
- declare const CARTAO_GOLDEN_VISA_MASKED = "4111 1111 1111 1111";
17
- declare const CARTAO_GOLDEN_MIN_LENGTH = "12345674";
18
- declare const CARTAO_OFFICIAL_SOURCE_URL = "https://www.iso.org/standard/70484.html";
19
- declare const CARTAO_IEC_SOURCE_URL = "https://webstore.iec.ch/en/publication/59763";
3
+ import { j as CardBrand } from './constants-BqegsAc2.js';
4
+ export { C as CARTAO_GOLDEN_AMEX, a as CARTAO_GOLDEN_LUHN_WALKTHROUGH, b as CARTAO_GOLDEN_MASTERCARD, c as CARTAO_GOLDEN_MIN_LENGTH, d as CARTAO_GOLDEN_VISA, e as CARTAO_GOLDEN_VISA_MASKED, f as CARTAO_IEC_SOURCE_URL, g as CARTAO_OFFICIAL_SOURCE_URL, h as CARTAO_PAN_MAX_LENGTH, i as CARTAO_PAN_MIN_LENGTH } from './constants-BqegsAc2.js';
20
5
 
21
6
  /**
22
7
  * Best-effort card brand from IIN prefix — non-authoritative (BR-LUHN-005).
@@ -44,4 +29,4 @@ declare function stripCartaoCredito(input: string): string;
44
29
 
45
30
  declare function formatCartaoCredito(input: string): FormatResult;
46
31
 
47
- 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, type CardBrand, CartaoCreditoValidationResult, FormatResult, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito };
32
+ export { CardBrand, CartaoCreditoValidationResult, FormatResult, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito };
@@ -1,6 +1,6 @@
1
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';
2
+ export { formatCartaoCredito } from './chunk-XW5G2RAL.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-AK5GVYQ5.js';
4
4
  import './chunk-MSLJF2FM.js';
5
5
  //# sourceMappingURL=cartao-credito.js.map
6
6
  //# sourceMappingURL=cartao-credito.js.map
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-7ULDLG4C.js.map
3
+ //# sourceMappingURL=chunk-7ULDLG4C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-7ULDLG4C.js"}
@@ -193,6 +193,6 @@ function validateCartaoCredito(input) {
193
193
  };
194
194
  }
195
195
 
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
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, ELO_IIN_PREFIXES, HIPERCARD_IIN_PREFIXES, applyCartaoCreditoMask, computeLuhnSum, detectCardBrand, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito };
197
+ //# sourceMappingURL=chunk-AK5GVYQ5.js.map
198
+ //# sourceMappingURL=chunk-AK5GVYQ5.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-AK5GVYQ5.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,13 +1,13 @@
1
1
  import { validateRenavam } from './chunk-WLE2ENQA.js';
2
- import { validateTituloEleitor } from './chunk-MLPXW7N2.js';
3
2
  import { validateTelefone, extractTelefoneDigits, normalizeTelefoneDigits } from './chunk-5UL3M7IU.js';
3
+ import { validateTituloEleitor } from './chunk-DJUANFIK.js';
4
4
  import { validateInscricaoEstadual } from './chunk-3QP6R46N.js';
5
5
  import { validateIeSpRural, stripIeSpRural } from './chunk-Y6IW2LMW.js';
6
6
  import { validateNfeChave } from './chunk-D36RM7OD.js';
7
7
  import { validatePisPasep } from './chunk-KH7DWOUA.js';
8
8
  import { validatePlaca } from './chunk-WPL47PWJ.js';
9
9
  import { validateBoleto } from './chunk-4W4OKLSZ.js';
10
- import { validateCartaoCredito } from './chunk-EPKHEW5V.js';
10
+ import { validateCartaoCredito } from './chunk-AK5GVYQ5.js';
11
11
  import { validateCep } from './chunk-2JJS46FM.js';
12
12
  import { validateCnh } from './chunk-US4OLTJ2.js';
13
13
  import { stripPlaca } from './chunk-YYHS5WQN.js';
@@ -183,5 +183,5 @@ function validateFixed(value, type, uf) {
183
183
  }
184
184
 
185
185
  export { sanitize };
186
- //# sourceMappingURL=chunk-7ZL7PZII.js.map
187
- //# sourceMappingURL=chunk-7ZL7PZII.js.map
186
+ //# sourceMappingURL=chunk-CSZCIOGA.js.map
187
+ //# sourceMappingURL=chunk-CSZCIOGA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sanitize/fixes.ts","../src/sanitize/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAkCA,SAAS,QAAQ,GAAA,EAAwB;AACvC,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,YAAY,GAAA,EAAK;AACnB,IAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AACjC;AAEA,SAAS,SAAA,CAAU,OAAe,KAAA,EAA4B;AAC5D,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtC,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAChC;AAEA,SAAS,uBAAA,CAAwB,OAAe,KAAA,EAA4B;AAC1E,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAC/C,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM;AAClC;AAEA,SAAS,QAAA,CAAS,OAAe,KAAA,EAA4B;AAC3D,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,EACzB;AACA,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG;AACzB,IAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,CAAW,KAAK,GAAG,KAAA,EAAM;AAC3C;AAEA,SAAS,WAAA,CAAY,OAAe,KAAA,EAA4B;AAC9D,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG;AACzB,IAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,EACjC;AACA,EAAA,MAAM,UAAA,GAAa,sBAAsB,KAAK,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,wBAAwB,KAAK,CAAA;AAChD,EAAA,IAAI,UAAA,KAAe,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACtD,IAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AACpC;AAEA,SAAS,kBAAA,CAAmB,OAAe,KAAA,EAA4B;AACrE,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,EACzB;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACvB,IAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,cAAA,CAAe,KAAK,GAAG,KAAA,EAAM;AAC/C;AAEO,SAAS,UAAA,CAAW,KAAa,IAAA,EAA0C;AAChF,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM,GAAI,QAAQ,GAAG,CAAA;AAE7C,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,oBAAA;AACH,MAAA,OAAO,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,uBAAA,CAAwB,SAAS,KAAK,CAAA;AAAA,IAC/C,KAAK,OAAA;AACH,MAAA,OAAO,QAAA,CAAS,SAAS,KAAK,CAAA;AAAA,IAChC,KAAK,UAAA;AACH,MAAA,OAAO,WAAA,CAAY,SAAS,KAAK,CAAA;AAAA,IACnC,KAAK,mCAAA;AACH,MAAA,OAAO,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAAA,IAC1C,SAAS;AACP,MAAA,MAAM,WAAA,GAAqB,IAAA;AAC3B,MAAA,OAAO,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAM;AAAA,IACrC;AAAA;AAEJ;;;AChEO,SAAS,QAAA,CACd,GAAA,EACA,IAAA,EACA,OAAA,GAA2B,EAAC,EACZ;AAChB,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,OAAM,GAAI,UAAA,CAAW,KAAK,IAAI,CAAA;AAEpD,EAAA,IAAI,IAAA,KAAS,oBAAA,IAAwB,CAAC,OAAA,CAAQ,EAAA,EAAI;AAChD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,IAAA,EAAM,oBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,KAAA,EAAO,IAAA,EAAM,QAAQ,EAAE,CAAA;AACxD,EAAA,IAAI,CAAC,WAAW,EAAA,EAAI;AAClB,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,WAAW,IAAA,EAAM,OAAA,EAAS,WAAW,OAAA,EAAQ;AAAA,EACzE;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,UAAA,CAAW,OAAO,KAAA,EAAM;AACpD;AAEA,SAAS,aAAA,CAAc,KAAA,EAAe,IAAA,EAA+B,EAAA,EAAkC;AACrG,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,MAAA,GAAS,gBAAgB,KAAK,CAAA;AACpC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,gBAAA,EAAkB;AACrB,MAAA,MAAM,MAAA,GAAS,sBAAsB,KAAK,CAAA;AAC1C,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,gBAAA,EAAkB;AACrB,MAAA,MAAM,MAAA,GAAS,sBAAsB,KAAK,CAAA;AAC1C,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,oBAAA,EAAsB;AACzB,MAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,KAAA,EAAO,EAAE,IAAkB,CAAA;AACpE,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,KAAK,mCAAA,EAAqC;AACxC,MAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,MAAA,OAAO,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI,MAAA;AAAA,IACzD;AAAA,IACA,SAAS;AACP,MAAA,MAAM,WAAA,GAAqB,IAAA;AAC3B,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,oBAAA,EAAsB,SAAS,CAAA,kBAAA,EAAqB,MAAA,CAAO,WAAW,CAAC,CAAA,CAAA,EAAG;AAAA,IACtG;AAAA;AAEJ","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"]}
1
+ {"version":3,"sources":["../src/sanitize/fixes.ts","../src/sanitize/index.ts"],"names":[],"mappings":"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","file":"chunk-CSZCIOGA.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"]}
@@ -221,6 +221,6 @@ function validateTituloEleitor(input) {
221
221
  return success;
222
222
  }
223
223
 
224
- export { TITULO_ELEITOR_ALGORITHM_REF_URL, TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL, TITULO_ELEITOR_DV1_WEIGHTS_8, TITULO_ELEITOR_DV1_WEIGHTS_9, TITULO_ELEITOR_DV2_WEIGHTS, TITULO_ELEITOR_ETITULO_URL, TITULO_ELEITOR_EXTERIOR_UF_CODE, TITULO_ELEITOR_GOLDEN_EXTERIOR, TITULO_ELEITOR_GOLDEN_MASKED_INPUT, TITULO_ELEITOR_GOLDEN_PRIMARY, TITULO_ELEITOR_GOLDEN_SP_EXTENDED, TITULO_ELEITOR_GOLDEN_SP_SPECIAL, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED, TITULO_ELEITOR_NORMATIVE_SECONDARY_URL, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_OFFICIAL_SOURCE_URL, TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED, TITULO_ELEITOR_SPECIAL_UF_CODES, TITULO_ELEITOR_TSE_PORTAL_URL, TITULO_ELEITOR_UF_BY_CODE, isValidTituloEleitor, validateTituloEleitor };
225
- //# sourceMappingURL=chunk-MLPXW7N2.js.map
226
- //# sourceMappingURL=chunk-MLPXW7N2.js.map
224
+ export { TITULO_ELEITOR_ALGORITHM_REF_URL, TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL, TITULO_ELEITOR_DV1_WEIGHTS_8, TITULO_ELEITOR_DV1_WEIGHTS_9, TITULO_ELEITOR_DV2_WEIGHTS, TITULO_ELEITOR_ETITULO_URL, TITULO_ELEITOR_EXTERIOR_UF_CODE, TITULO_ELEITOR_GOLDEN_EXTERIOR, TITULO_ELEITOR_GOLDEN_MASKED_INPUT, TITULO_ELEITOR_GOLDEN_PRIMARY, TITULO_ELEITOR_GOLDEN_SP_EXTENDED, TITULO_ELEITOR_GOLDEN_SP_SPECIAL, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED, TITULO_ELEITOR_NORMATIVE_SECONDARY_URL, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_OFFICIAL_SOURCE_URL, TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED, TITULO_ELEITOR_SPECIAL_UF_CODES, TITULO_ELEITOR_TSE_PORTAL_URL, TITULO_ELEITOR_UF_BY_CODE, computeTituloEleitorCheckDigits, isValidTituloEleitor, validateTituloEleitor };
225
+ //# sourceMappingURL=chunk-DJUANFIK.js.map
226
+ //# sourceMappingURL=chunk-DJUANFIK.js.map