@br-validators/core 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +57 -7
  2. package/dist/batch.d.ts +24 -3
  3. package/dist/batch.js +14 -13
  4. package/dist/brcode.js +6 -6
  5. package/dist/cep.js +6 -3
  6. package/dist/{chunk-F6LVFAJT.js → chunk-4NS47CJG.js} +3 -3
  7. package/dist/{chunk-F6LVFAJT.js.map → chunk-4NS47CJG.js.map} +1 -1
  8. package/dist/chunk-5V2TNYC7.js +3 -0
  9. package/dist/{chunk-KLPONHBL.js.map → chunk-5V2TNYC7.js.map} +1 -1
  10. package/dist/{chunk-YYHS5WQN.js → chunk-6BWOYNQD.js} +2 -2
  11. package/dist/{chunk-YYHS5WQN.js.map → chunk-6BWOYNQD.js.map} +1 -1
  12. package/dist/chunk-6LCZGDCZ.js +27862 -0
  13. package/dist/chunk-6LCZGDCZ.js.map +1 -0
  14. package/dist/{chunk-MSYTS5K7.js → chunk-6WBUKUHD.js} +3 -3
  15. package/dist/{chunk-MSYTS5K7.js.map → chunk-6WBUKUHD.js.map} +1 -1
  16. package/dist/{chunk-DS6MOO5K.js → chunk-7XVCTDJE.js} +6 -65
  17. package/dist/chunk-7XVCTDJE.js.map +1 -0
  18. package/dist/{chunk-4HQ4J2J5.js → chunk-A255RZZ7.js} +3 -3
  19. package/dist/{chunk-4HQ4J2J5.js.map → chunk-A255RZZ7.js.map} +1 -1
  20. package/dist/chunk-AOBSYTR2.js +31 -0
  21. package/dist/chunk-AOBSYTR2.js.map +1 -0
  22. package/dist/{chunk-JNAZI3HU.js → chunk-AZAZRJZC.js} +10 -9
  23. package/dist/chunk-AZAZRJZC.js.map +1 -0
  24. package/dist/{chunk-3FDHWX2H.js → chunk-BTRWDUZF.js} +3 -3
  25. package/dist/{chunk-3FDHWX2H.js.map → chunk-BTRWDUZF.js.map} +1 -1
  26. package/dist/{chunk-55IZCKNL.js → chunk-C4E2AE2A.js} +3 -3
  27. package/dist/{chunk-55IZCKNL.js.map → chunk-C4E2AE2A.js.map} +1 -1
  28. package/dist/{chunk-W5LOXC7J.js → chunk-DQQNXXGO.js} +12 -3
  29. package/dist/chunk-DQQNXXGO.js.map +1 -0
  30. package/dist/{chunk-56ZN3TBH.js → chunk-DXKHCIMV.js} +3 -3
  31. package/dist/{chunk-56ZN3TBH.js.map → chunk-DXKHCIMV.js.map} +1 -1
  32. package/dist/chunk-FA5ZM5UA.js +63 -0
  33. package/dist/chunk-FA5ZM5UA.js.map +1 -0
  34. package/dist/{chunk-N2MDJI4B.js → chunk-FTC4V5PN.js} +3 -3
  35. package/dist/{chunk-N2MDJI4B.js.map → chunk-FTC4V5PN.js.map} +1 -1
  36. package/dist/{chunk-7HEMXLDS.js → chunk-GQRHLW5W.js} +3 -4
  37. package/dist/chunk-GQRHLW5W.js.map +1 -0
  38. package/dist/{chunk-5IYHOWQU.js → chunk-GTEKDS6X.js} +98 -12
  39. package/dist/chunk-GTEKDS6X.js.map +1 -0
  40. package/dist/{chunk-ZL5RDZJM.js → chunk-HEPUV3XR.js} +3 -4
  41. package/dist/chunk-HEPUV3XR.js.map +1 -0
  42. package/dist/chunk-JUQMINSZ.js +52 -0
  43. package/dist/chunk-JUQMINSZ.js.map +1 -0
  44. package/dist/{chunk-CIOSYWV4.js → chunk-JZKKTVMO.js} +3 -3
  45. package/dist/{chunk-CIOSYWV4.js.map → chunk-JZKKTVMO.js.map} +1 -1
  46. package/dist/{chunk-DL4TSGE5.js → chunk-JZOS2MO7.js} +3 -3
  47. package/dist/{chunk-DL4TSGE5.js.map → chunk-JZOS2MO7.js.map} +1 -1
  48. package/dist/{chunk-2BNGYQFQ.js → chunk-KCRWHMDY.js} +3 -3
  49. package/dist/{chunk-2BNGYQFQ.js.map → chunk-KCRWHMDY.js.map} +1 -1
  50. package/dist/{chunk-UNBIJPJU.js → chunk-L3WG36Y4.js} +3 -3
  51. package/dist/{chunk-UNBIJPJU.js.map → chunk-L3WG36Y4.js.map} +1 -1
  52. package/dist/{chunk-NQIKXTMI.js → chunk-LKDZEPWZ.js} +3 -3
  53. package/dist/{chunk-NQIKXTMI.js.map → chunk-LKDZEPWZ.js.map} +1 -1
  54. package/dist/chunk-LLJSXMO2.js +32 -0
  55. package/dist/chunk-LLJSXMO2.js.map +1 -0
  56. package/dist/{chunk-2RZXK6C3.js → chunk-MGFDTECS.js} +13 -32
  57. package/dist/chunk-MGFDTECS.js.map +1 -0
  58. package/dist/{chunk-BLSDFC3C.js → chunk-NNMK3ZHS.js} +21 -3
  59. package/dist/chunk-NNMK3ZHS.js.map +1 -0
  60. package/dist/{chunk-SCBXZLZ5.js → chunk-OHGZOWUT.js} +19 -14
  61. package/dist/{chunk-SCBXZLZ5.js.map → chunk-OHGZOWUT.js.map} +1 -1
  62. package/dist/{chunk-KVJL4MTV.js → chunk-PRSHGHAS.js} +10 -9
  63. package/dist/chunk-PRSHGHAS.js.map +1 -0
  64. package/dist/{chunk-MOMQLTSD.js → chunk-QGL5YFPF.js} +10 -10
  65. package/dist/{chunk-MOMQLTSD.js.map → chunk-QGL5YFPF.js.map} +1 -1
  66. package/dist/{chunk-BDYNBRT7.js → chunk-UG2YICWH.js} +3 -3
  67. package/dist/{chunk-BDYNBRT7.js.map → chunk-UG2YICWH.js.map} +1 -1
  68. package/dist/{chunk-KSDAKRG5.js → chunk-UH6WIKOT.js} +15 -10
  69. package/dist/chunk-UH6WIKOT.js.map +1 -0
  70. package/dist/{chunk-N6CALNFU.js → chunk-YC4GZZJP.js} +3 -3
  71. package/dist/{chunk-N6CALNFU.js.map → chunk-YC4GZZJP.js.map} +1 -1
  72. package/dist/chunk-YQN6RNJN.js +30 -0
  73. package/dist/chunk-YQN6RNJN.js.map +1 -0
  74. package/dist/{chunk-62P6SKG3.js → chunk-ZJ2GD2GK.js} +21 -19
  75. package/dist/chunk-ZJ2GD2GK.js.map +1 -0
  76. package/dist/{chunk-DQPSNERX.js → chunk-ZODIHY33.js} +11 -10
  77. package/dist/chunk-ZODIHY33.js.map +1 -0
  78. package/dist/cnh.js +6 -3
  79. package/dist/cnpj.js +3 -3
  80. package/dist/compare.d.ts +2 -2
  81. package/dist/compare.js +16 -15
  82. package/dist/cpf.js +2 -3
  83. package/dist/csosn.d.ts +54 -0
  84. package/dist/csosn.js +96 -0
  85. package/dist/csosn.js.map +1 -0
  86. package/dist/data-catalog.js +32 -30
  87. package/dist/data-catalog.js.map +1 -1
  88. package/dist/detect.js +13 -12
  89. package/dist/diff.d.ts +2 -2
  90. package/dist/diff.js +16 -15
  91. package/dist/esocial.d.ts +29 -1
  92. package/dist/esocial.js +1720 -2
  93. package/dist/esocial.js.map +1 -1
  94. package/dist/generate.js +22 -21
  95. package/dist/ibge.js +1 -27859
  96. package/dist/ibge.js.map +1 -1
  97. package/dist/{index-CttohJuk.d.ts → index-CmpOAd8U.d.ts} +1 -1
  98. package/dist/index.d.ts +4 -4
  99. package/dist/index.js +38 -37
  100. package/dist/index.js.map +1 -1
  101. package/dist/iss-municipal.d.ts +71 -3
  102. package/dist/iss-municipal.js +45366 -235
  103. package/dist/iss-municipal.js.map +1 -1
  104. package/dist/mask.js +21 -20
  105. package/dist/{pix-B8_PfK2D.d.ts → pix-DhAb6Iho.d.ts} +3 -1
  106. package/dist/pix.d.ts +1 -1
  107. package/dist/pix.js +8 -7
  108. package/dist/placa.js +6 -3
  109. package/dist/ptax.d.ts +12 -4
  110. package/dist/ptax.js +8467 -252
  111. package/dist/ptax.js.map +1 -1
  112. package/dist/renavam.js +6 -3
  113. package/dist/sanitize.d.ts +1 -1
  114. package/dist/sanitize.js +14 -10
  115. package/dist/titulo-eleitor.js +6 -3
  116. package/dist/{types-CTLx5zMu.d.ts → types-DLuN-sEJ.d.ts} +1 -1
  117. package/package.json +5 -1
  118. package/dist/chunk-2RZXK6C3.js.map +0 -1
  119. package/dist/chunk-5IYHOWQU.js.map +0 -1
  120. package/dist/chunk-62P6SKG3.js.map +0 -1
  121. package/dist/chunk-7HEMXLDS.js.map +0 -1
  122. package/dist/chunk-BLSDFC3C.js.map +0 -1
  123. package/dist/chunk-DQPSNERX.js.map +0 -1
  124. package/dist/chunk-DS6MOO5K.js.map +0 -1
  125. package/dist/chunk-JNAZI3HU.js.map +0 -1
  126. package/dist/chunk-KLPONHBL.js +0 -3
  127. package/dist/chunk-KSDAKRG5.js.map +0 -1
  128. package/dist/chunk-KVJL4MTV.js.map +0 -1
  129. package/dist/chunk-RUQDVHR7.js +0 -14
  130. package/dist/chunk-RUQDVHR7.js.map +0 -1
  131. package/dist/chunk-VBFKN3NR.js +0 -14
  132. package/dist/chunk-VBFKN3NR.js.map +0 -1
  133. package/dist/chunk-W5LOXC7J.js.map +0 -1
  134. package/dist/chunk-YUAMWVIU.js +0 -30
  135. package/dist/chunk-YUAMWVIU.js.map +0 -1
  136. package/dist/chunk-ZL5RDZJM.js.map +0 -1
package/README.md CHANGED
@@ -31,7 +31,7 @@ Every Brazilian SaaS eventually reinvents CPF validation — usually wrong.
31
31
  - ✅ **Zero runtime dependencies** — pure TypeScript logic, no HTTP calls
32
32
  - ✅ **Never throws** — every function returns `{ ok: true, value } | { ok: false, message, code }`
33
33
  - ✅ **Tree-shakeable** — subpath imports per document type
34
- - ✅ **Reference data** — IBGE (municipalities + NF-e `cMunFG`), Bacen banks, DDD lookup, national holidays, CNAE, CFOP, CST, LC 116, NCM, IBPT tax burden, Simples Nacional, CBO, natureza jurídica, NBS, CEST, eSocial categorias, CNPJ motivos, moedas, PTAX cotações, países Bacen, NF-e cUF, IRPF / INSS tables, SELIC meta, ISS municipal (sample), Incoterms, portos, aeroportos, **ANP fuel prices (LPC)** — embedded offline with daily freshness ([DATA-FRESHNESS.md](../../docs/DATA-FRESHNESS.md); ANP weekly)
34
+ - ✅ **Reference data** — IBGE (municipalities + NF-e `cMunFG`), Bacen banks, DDD lookup, national holidays, CNAE, CFOP, CST, LC 116, NCM, IBPT tax burden, Simples Nacional, CBO, natureza jurídica, NBS, CEST, eSocial categorias, CNPJ motivos, moedas, PTAX cotações, países Bacen, NF-e cUF, IRPF / INSS tables, SELIC meta, ISS municipal (top 500 PIB), Incoterms, portos, aeroportos, **ANP fuel prices (LPC)** — embedded offline with daily freshness ([DATA-FRESHNESS.md](../../docs/DATA-FRESHNESS.md); ANP weekly)
35
35
  - ✅ **ESM only**, Node ≥ 18, works in browser, Bun, Deno
36
36
 
37
37
  ---
@@ -299,7 +299,7 @@ Embedded JSON from official `.gov.br` sources — **no runtime HTTP**. Each modu
299
299
  | CFOP fiscal operations | `@br-validators/core/cfop` | `cfop lookup` · `search` | `/data/fiscal` | `getCfopPorCodigo`, `searchCfop` | [CONFAZ CFOP SINIEF](https://www.confaz.fazenda.gov.br/legislacao/ajustes/sinief/cfop_cvsn_70_vigente) |
300
300
  | CST (ICMS, IPI, PIS, COFINS) | `@br-validators/core/cst` | — | `/data/fiscal` | `getCstIcmsPorCodigo`, `getCstIpiPorCodigo`, `searchCstIcms` | [RFB SPED CST tables](http://www.sped.fazenda.gov.br/spedtabelas/AppConsulta/publico/aspx/ConsultaTabelasExternas.aspx?CodSistema=SpedFiscal) |
301
301
  | LC 116 ISS services | `@br-validators/core/lc116` | — | `/data/fiscal` | `getLc116PorCodigo`, `searchLc116` | [LC 116/2003 Planalto](https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp116.htm) |
302
- | eSocial worker categories | `@br-validators/core/esocial` | — | `/data/fiscal` | `getEsocialCategoriaPorCodigo`, `searchEsocialCategorias` | [eSocial S-1.3 Tabelas](https://www.gov.br/esocial/pt-br/documentacao-tecnica/leiautes-esocial-versao-s-1-3-nt-06-2026/tabelas.html) |
302
+ | eSocial (categorias + rubricas) | `@br-validators/core/esocial` | — | `/data/payroll` | `getEsocialCategoriaPorCodigo`, `getEsocialRubricaPorCodigo`, `searchEsocialRubricas` | [eSocial S-1.3 Tabelas](https://www.gov.br/esocial/pt-br/documentacao-tecnica/leiautes-esocial-versao-s-1-3-nt-06-2026/tabelas.html) |
303
303
  | NCM Mercosur nomenclature | `@br-validators/core/ncm` | `ncm lookup` · `search` | `/data/fiscal` | `getNcmPorCodigo`, `searchNcm` | [Siscomex NCM JSON](https://portalunico.siscomex.gov.br/classif/api/publico/nomenclatura/download/json) |
304
304
  | IBPT approximate NCM tax burden | `@br-validators/core/ibpt` | — | `/data/fiscal` | `getIbptCargaPorNcmUf`, `computeIbptCargaTotal` | [IBPT Lei 12.741/2012](https://www.planalto.gov.br/ccivil_03/_ato2011-2014/2012/lei/l12741.htm) |
305
305
  | Simples Nacional annex tables | `@br-validators/core/simples-nacional` | — | `/data/fiscal` | `getSimplesAnexo`, `getSimplesFaixa`, `computeSimplesAliquotaEfetiva` | [LC 123/2006 Planalto](https://www.planalto.gov.br/ccivil_03/_ato2007-2010/2006/lei/l123.htm) |
@@ -308,18 +308,22 @@ Embedded JSON from official `.gov.br` sources — **no runtime HTTP**. Each modu
308
308
  | NBS (NFSe Nacional) | `@br-validators/core/nbs` | `nbs lookup` | `/data/fiscal` | `getNbsPorCodigo`, `searchNbs` | [NFSe Anexo B NBS2 xlsx](https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual/anexo_b-nbs2-lista_servico_nacional-snnfse.xlsx) |
309
309
  | CEST (substituição tributária) | `@br-validators/core/cest` | `cest lookup` | `/data/fiscal` | `getCestPorCodigo`, `getCestPorNcm`, `searchCest` | [CONFAZ ICMS 142/2018](https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18) |
310
310
  | ISO 4217 + Bacen PTAX moedas | `@br-validators/core/moedas` | `moedas lookup` | `/data/trade` | `getMoedaPorCodigo`, `searchMoedas` | [Bacen PTAX Moedas API](https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/Moedas) |
311
- | Bacen PTAX Fechamento | `@br-validators/core/ptax` | | `/data/trade` | `getPtaxCotacao`, `getPtaxUltimoDiaUtil` | [Bacen Olinda PTAX API](https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/swagger-ui3) |
311
+ | Bacen PTAX Fechamento | `@br-validators/core/ptax` | `ptax lookup` · `ptax historico` | `/data/trade` | `getPtaxCotacao`, `getPtaxHistorico`, `getPtaxUltimoDiaUtil` (+ `dataReferencia`, `isStale`) | [Bacen Olinda PTAX API](https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/swagger-ui3) |
312
312
  | NF-e Bacen country codes | `@br-validators/core/paises-bacen` | `paises-bacen lookup` | `/data/trade` | `getPaisPorCodigoBacen`, `getPaisesBacen` | [NF-e country table](http://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=FOXZNFX/p50=) |
313
313
  | NF-e cUF (IBGE state codes) | `@br-validators/core/nfe-cuf` | `nfe-cuf lookup` | `/data/fiscal` | `getCufPorCodigo`, `lookupCufPorCodigo` | [NF-e cUF table](http://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=FOXZNFX/p50=) |
314
314
  | IRPF progressive brackets | `@br-validators/core/irpf` | `irpf tabela` · `irpf calc` | `/data/payroll` | `getIrpfTabelaProgressiva`, `calcularIrpfMensal` | [RFB IRPF tables](https://www.gov.br/receitafederal/pt-br/assuntos/meu-imposto-de-renda/tabelas) |
315
315
  | INSS contribution brackets | `@br-validators/core/inss` | `inss tabela` · `inss calc` | `/data/payroll` | `getInssTabelaContribuicao`, `calcularInssMensal` | [INSS contribution rates](https://www.gov.br/inss/pt-br/direitos-e-deveres/inscricao-e-contribuicao/tabelas-de-contribuicao) |
316
316
  | Bacen SELIC meta | `@br-validators/core/selic` | `selic` | `/data/finance` | `getSelicMeta`, `getSelicMetaPorData` | [Bacen SGS série 432](https://www3.bcb.gov.br/sgspub/localizarseries/localizarSeries.do?method=prepararTelaLocalizarSeries) |
317
- | ISS municipal rates (sample) | `@br-validators/core/iss-municipal` | `iss-municipal lookup` · `search` | `/data/fiscal` | `getIssMunicipalPorIbge`, `searchIssMunicipal` | [IBGE PIB municipal 2022](https://www.ibge.gov.br/estatisticas/economicas/contas-nacionais/19567-pib-dos-municipios.html) |
317
+ | ISS municipal rates (top 500 PIB + MUNIC/IBGE fallback) | `@br-validators/core/iss-municipal` | `iss-municipal lookup` · `list` · `search [--uf]` | `/data/fiscal` | `lookupIssMunicipalPorIbge` (500 → `munic-ibge` → LC 116), `getIssMunicipalPorIbge`, `getAllIssMunicipal` — check `fonte` + `warning` | [IBGE SIDRA PIB 5938](https://apisidra.ibge.gov.br/values/t/5938/n6/all/v/37/p/2022) · [MUNIC 2024](https://www.ibge.gov.br/estatisticas/economicas/contabilidade/9078-pesquisa-de-informacoes-municipais.html) |
318
318
  | ICC Incoterms 2020 | `@br-validators/core/incoterms` | `incoterms lookup` | `/data/trade` | `getIncotermPorCodigo`, `getIncoterms` | [ICC Incoterms rules](https://iccwbo.org/resources-for-business/incoterms-rules/) |
319
319
  | CBO 2002 occupations | `@br-validators/core/cbo` | `cbo lookup` · `search` | `/data/fiscal` | `getCboPorCodigo`, `searchCbo` | [MTE CBO downloads](https://www.gov.br/trabalho-e-emprego/pt-br/assuntos/cbo/servicos/downloads) |
320
320
  | CEP prefix lookup | `@br-validators/core/cep` | `cep faixa` | — | `getCepFaixaInfo`, `getCepFaixas` | [IBGE CNEFE 2022](https://www.ibge.gov.br/estatisticas/sociais/populacao/38734-cadastro-nacional-de-enderecos-para-fins-estatisticos.html) |
321
321
  | Data transparency catalog | `@br-validators/core/data-catalog` | — | `/data/catalog` | `getDataCatalog`, `getDatasetMetadata` | Aggregates all `metadata.json` entries |
322
322
 
323
+ > **PTAX embed:** last **90 business days** (`janelaDiasUteis: 90`) — not live Bacen. Every cotacao includes `dataReferencia` and `isStale`. Use `getPtaxHistorico(moeda, { desde, ate })` for contract-period FX variation. See [DATA-FRESHNESS.md](https://github.com/open-data-brazil/br-validators/blob/main/docs/DATA-FRESHNESS.md).
324
+ >
325
+ > **`getAll*()`:** each lookup row above has a matching `getAll*()` export — see [Listing reference data](#listing-reference-data-getall) below.
326
+
323
327
  ```typescript
324
328
  import { getMunicipioPorCodigo } from '@br-validators/core/ibge';
325
329
  import { getBancoPorCodigo } from '@br-validators/core/bancos';
@@ -335,6 +339,7 @@ import { getNaturezaJuridicaPorCodigo } from '@br-validators/core/natureza-jurid
335
339
  import { getNbsPorCodigo } from '@br-validators/core/nbs';
336
340
  import { getCestPorCodigo } from '@br-validators/core/cest';
337
341
  import { getMoedaPorCodigo } from '@br-validators/core/moedas';
342
+ import { getPtaxUltimoDiaUtil, getPtaxHistorico } from '@br-validators/core/ptax';
338
343
  import { getPaisPorCodigoBacen } from '@br-validators/core/paises-bacen';
339
344
  import { getIncotermPorCodigo } from '@br-validators/core/incoterms';
340
345
  import { getAeroportoPorIata } from '@br-validators/core/aeroportos';
@@ -344,7 +349,7 @@ import { getSelicMeta } from '@br-validators/core/selic';
344
349
  import { getIrpfTabelaProgressiva } from '@br-validators/core/irpf';
345
350
  import { getInssTabelaContribuicao } from '@br-validators/core/inss';
346
351
  import { getCufPorCodigo } from '@br-validators/core/nfe-cuf';
347
- import { getIssMunicipalPorIbge } from '@br-validators/core/iss-municipal';
352
+ import { lookupIssMunicipalPorIbge } from '@br-validators/core/iss-municipal';
348
353
  import { getDataCatalog } from '@br-validators/core/data-catalog';
349
354
 
350
355
  getMunicipioPorCodigo(3550308)?.nome; // São Paulo
@@ -359,6 +364,15 @@ getNaturezaJuridicaPorCodigo('2062'); // Sociedade Empresária Limitada
359
364
  getNbsPorCodigo('1.1502.50.00'); // TI systems integration (NFSe)
360
365
  getCestPorCodigo('0302100'); // returnable beer bottle (ST)
361
366
  getMoedaPorCodigo('BRL')?.nome; // Real Brasileiro
367
+
368
+ const ptax = getPtaxUltimoDiaUtil('USD');
369
+ ptax.dataReferencia; // always expose to callers
370
+ ptax.isStale; // true when embed > 1 business day old
371
+ ptax.warning; // present when stale
372
+
373
+ getPtaxHistorico('USD', { desde: '2026-06-01', ate: '2026-06-26' });
374
+ // each row: dataReferencia, isStale, warning
375
+
362
376
  getPaisPorCodigoBacen('1058')?.nome; // Brasil (NF-e cPais)
363
377
  getIncotermPorCodigo('FOB')?.nome; // Free On Board
364
378
  getAeroportoPorIata('GRU')?.nome; // Guarulhos — SP
@@ -368,17 +382,34 @@ getSelicMeta()?.valor; // latest Bacen SELIC meta (% a.a.)
368
382
  getIrpfTabelaProgressiva(2026); // progressive monthly brackets
369
383
  getInssTabelaContribuicao(2026); // INSS contribution table
370
384
  getCufPorCodigo('35')?.uf; // SP (NF-e cUF)
371
- getIssMunicipalPorIbge(3550308); // São Paulo ISS sample row
385
+ const iss = getIssMunicipalPorIbge(3509502); // Campinas estimativa row
386
+ if (iss?.fonte === 'estimativa') {
387
+ console.warn(iss.warning); // not for NFSe emission
388
+ }
372
389
  getDataCatalog().length; // registered datasets
373
390
  ```
374
391
 
392
+ ### Listing reference data (`getAll*`)
393
+
394
+ ```typescript
395
+ import { getAllNcm } from '@br-validators/core/ncm';
396
+ import { getAllCfop } from '@br-validators/core/cfop';
397
+ import { getAllCstIcms } from '@br-validators/core/cst';
398
+
399
+ getAllNcm().length; // full NCM embed
400
+ getAllCfop().length; // full CFOP embed
401
+ getAllCstIcms(); // ICMS CST rows
402
+ ```
403
+
404
+ Also: `getAllBancos`, `getAllEsocialCategorias`, `getAllIssMunicipal`, `getAllAeroportos`. Deprecated names (`getNcms`, `getCfops`) — [MIGRATION.md](https://github.com/open-data-brazil/br-validators/blob/main/MIGRATION.md).
405
+
375
406
  Freshness table (auto-updated daily; ANP weekly): [docs/DATA-FRESHNESS.md](https://github.com/open-data-brazil/br-validators/blob/main/docs/DATA-FRESHNESS.md) · Per-type official URLs: [docs/OFFICIAL-SOURCES.md](https://github.com/open-data-brazil/br-validators/blob/main/docs/OFFICIAL-SOURCES.md)
376
407
 
377
408
  ---
378
409
 
379
410
  ## Current release
380
411
 
381
- **v1.9.0** — Phase 33 maturity: `LookupResult` API, fiscal validators, IRPF / INSS / SELIC / ISS municipal / NF-e cUF datasets, platform CLI (`compare` / `batch` / `diff` / `mask`), RG 27/27 UFs, `MIGRATION.md`, TypeDoc API reference. [CHANGELOG](https://github.com/open-data-brazil/br-validators/blob/main/CHANGELOG.md#190---2026-06-26)
412
+ **v1.10.0** — Phase 35 (EXP-35): CSOSN, eSocial rubricas, PTAX 90d + `getPtaxHistorico`, ISS MUNIC/IBGE cascade, batch CSV, PIX sanitize, bundle size docs, ISS `fonte`. [CHANGELOG](https://github.com/open-data-brazil/br-validators/blob/main/CHANGELOG.md#1100---2026-06-27)
382
413
 
383
414
  ---
384
415
 
@@ -392,6 +423,25 @@ import { validateCpf } from '@br-validators/core/cpf';
392
423
  import { parseNfeChave } from '@br-validators/core/nfe-chave';
393
424
  ```
394
425
 
426
+ ## Bundle size (gzipped)
427
+
428
+ Measured `@br-validators/core@1.10.0` with `pnpm measure:bundle-sizes` (esbuild ESM bundle per subpath). **Reference-data subpaths include embedded JSON**; some validators (e.g. `cep`, `sanitize`) also bundle shared core dependencies when imported alone.
429
+
430
+ | Subpath | Raw (esbuild) | Gzip | Notes |
431
+ |---------|---------------|------|-------|
432
+ | `@br-validators/core/cpf` | 4.0 KB | 1.5 KB | validator only |
433
+ | `@br-validators/core/cnpj` | 6.8 KB | 2.0 KB | validator only |
434
+ | `@br-validators/core/cep` | 2340.8 KB | 161.8 KB | validator only |
435
+ | `@br-validators/core/ncm` | 914.6 KB | 142.2 KB | includes embed |
436
+ | `@br-validators/core/cfop` | 100.3 KB | 9.4 KB | includes embed |
437
+ | `@br-validators/core/cst` | 19.1 KB | 3.4 KB | includes embed |
438
+ | `@br-validators/core/pix` | 17.6 KB | 3.9 KB | validator only |
439
+ | `@br-validators/core/ptax` | 214.2 KB | 22.4 KB | includes embed |
440
+ | `@br-validators/core/ibge` | 392.6 KB | 60.5 KB | includes embed |
441
+ | `@br-validators/core/sanitize` | 2995.5 KB | 219.4 KB | platform utilities |
442
+
443
+ Full table (62 subpaths): [data/bundle-sizes/subpath-sizes.md](../../data/bundle-sizes/subpath-sizes.md).
444
+
395
445
  ---
396
446
 
397
447
  ## Related packages
package/dist/batch.d.ts CHANGED
@@ -1,6 +1,26 @@
1
- import { P as PlatformDocumentType, a as PlatformOptions } from './types-CTLx5zMu.js';
1
+ import { P as PlatformDocumentType, a as PlatformOptions } from './types-DLuN-sEJ.js';
2
2
  import { V as ValidationErrorCode } from './validation-result-D4Wrxl7j.js';
3
- import './index-CttohJuk.js';
3
+ import './index-CmpOAd8U.js';
4
+
5
+ /**
6
+ * Minimal RFC 4180 CSV column extractor for batch ETL (zero runtime deps).
7
+ * @see docs/OFFICIAL-SOURCES.md
8
+ */
9
+ type ParseBatchCsvOptions = {
10
+ col: string;
11
+ delimiter?: string;
12
+ skipHeader?: boolean;
13
+ };
14
+ type ParseBatchCsvSuccess = {
15
+ ok: true;
16
+ values: string[];
17
+ };
18
+ type ParseBatchCsvFailure = {
19
+ ok: false;
20
+ message: string;
21
+ };
22
+ type ParseBatchCsvResult = ParseBatchCsvSuccess | ParseBatchCsvFailure;
23
+ declare function parseBatchCsv(raw: string, options: ParseBatchCsvOptions): ParseBatchCsvResult;
4
24
 
5
25
  type BatchValidEntry = {
6
26
  index: number;
@@ -23,6 +43,7 @@ type BatchResult = {
23
43
  invalid: BatchInvalidEntry[];
24
44
  summary: BatchSummary;
25
45
  };
46
+
26
47
  declare function batch(inputs: readonly string[], type: PlatformDocumentType, options?: PlatformOptions): BatchResult;
27
48
 
28
- export { type BatchInvalidEntry, type BatchResult, type BatchSummary, type BatchValidEntry, batch };
49
+ export { type BatchInvalidEntry, type BatchResult, type BatchSummary, type BatchValidEntry, type ParseBatchCsvFailure, type ParseBatchCsvOptions, type ParseBatchCsvResult, type ParseBatchCsvSuccess, batch, parseBatchCsv };
package/dist/batch.js CHANGED
@@ -1,32 +1,33 @@
1
- export { batch } from './chunk-5IYHOWQU.js';
1
+ export { batch, parseBatchCsv } from './chunk-GTEKDS6X.js';
2
2
  import './chunk-6F3A3NT4.js';
3
- import './chunk-F6LVFAJT.js';
3
+ import './chunk-4NS47CJG.js';
4
4
  import './chunk-A4QBLVVO.js';
5
5
  import './chunk-HZ4UGWFE.js';
6
- import './chunk-MSYTS5K7.js';
6
+ import './chunk-6WBUKUHD.js';
7
+ import './chunk-UG2YICWH.js';
7
8
  import './chunk-XRT44FMY.js';
8
9
  import './chunk-HORKZQIH.js';
9
- import './chunk-BDYNBRT7.js';
10
10
  import './chunk-OHBSYBG7.js';
11
11
  import './chunk-FGOPYU2L.js';
12
12
  import './chunk-GFRG6ZPY.js';
13
13
  import './chunk-OFAU4VTU.js';
14
- import './chunk-55IZCKNL.js';
14
+ import './chunk-C4E2AE2A.js';
15
15
  import './chunk-RY2BSDOR.js';
16
- import './chunk-DL4TSGE5.js';
17
- import './chunk-YYHS5WQN.js';
16
+ import './chunk-JZOS2MO7.js';
17
+ import './chunk-6BWOYNQD.js';
18
18
  import './chunk-4SNBZFS5.js';
19
+ import './chunk-JUQMINSZ.js';
19
20
  import './chunk-W64OQYC4.js';
20
21
  import './chunk-JOBIJQGE.js';
21
22
  import './chunk-UB2ZUHQZ.js';
22
23
  import './chunk-7U64V3YD.js';
23
- import './chunk-UNBIJPJU.js';
24
- import './chunk-DS6MOO5K.js';
25
- import './chunk-VBFKN3NR.js';
26
- import './chunk-W5LOXC7J.js';
24
+ import './chunk-L3WG36Y4.js';
25
+ import './chunk-7XVCTDJE.js';
26
+ import './chunk-DQQNXXGO.js';
27
+ import './chunk-FA5ZM5UA.js';
27
28
  import './chunk-UCJPSJN5.js';
28
- import './chunk-RUQDVHR7.js';
29
- import './chunk-2RZXK6C3.js';
29
+ import './chunk-MGFDTECS.js';
30
+ import './chunk-LLJSXMO2.js';
30
31
  import './chunk-EB3G4IG6.js';
31
32
  import './chunk-OTZHMJYE.js';
32
33
  import './chunk-PU5TKJZI.js';
package/dist/brcode.js CHANGED
@@ -1,11 +1,11 @@
1
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, buildStaticPixBrCode, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc } from './chunk-UNBIJPJU.js';
3
- import './chunk-DS6MOO5K.js';
4
- import './chunk-VBFKN3NR.js';
5
- import './chunk-W5LOXC7J.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, buildStaticPixBrCode, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc } from './chunk-L3WG36Y4.js';
3
+ import './chunk-7XVCTDJE.js';
4
+ import './chunk-DQQNXXGO.js';
5
+ import './chunk-FA5ZM5UA.js';
6
6
  import './chunk-UCJPSJN5.js';
7
- import './chunk-RUQDVHR7.js';
8
- import './chunk-2RZXK6C3.js';
7
+ import './chunk-MGFDTECS.js';
8
+ import './chunk-LLJSXMO2.js';
9
9
  import './chunk-EB3G4IG6.js';
10
10
  import './chunk-OTZHMJYE.js';
11
11
  import './chunk-BVMY4IWB.js';
package/dist/cep.js CHANGED
@@ -1,10 +1,13 @@
1
1
  import './chunk-2CNYSY3Z.js';
2
- export { formatCep } from './chunk-56ZN3TBH.js';
3
- export { CEP_FAIXA_CNEFE_BASE_URL, CEP_FAIXA_DATA_VERSION, CEP_FAIXA_GOLDEN_PREFIX_RJ, CEP_FAIXA_GOLDEN_PREFIX_SP, CEP_FAIXA_MAX_PREFIXES, CEP_FAIXA_MIN_PREFIXES, CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, getCepFaixaInfo, getCepFaixas, isValidCep, validateCep } from './chunk-55IZCKNL.js';
2
+ export { formatCep } from './chunk-DXKHCIMV.js';
3
+ export { CEP_FAIXA_CNEFE_BASE_URL, CEP_FAIXA_DATA_VERSION, CEP_FAIXA_GOLDEN_PREFIX_RJ, CEP_FAIXA_GOLDEN_PREFIX_SP, CEP_FAIXA_MAX_PREFIXES, CEP_FAIXA_MIN_PREFIXES, CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, getCepFaixaInfo, getCepFaixas, isValidCep, validateCep } from './chunk-C4E2AE2A.js';
4
4
  import './chunk-RY2BSDOR.js';
5
- export { stripCep } from './chunk-YYHS5WQN.js';
5
+ export { stripCep } from './chunk-6BWOYNQD.js';
6
6
  import './chunk-4SNBZFS5.js';
7
+ import './chunk-JUQMINSZ.js';
8
+ import './chunk-FA5ZM5UA.js';
7
9
  import './chunk-UCJPSJN5.js';
10
+ import './chunk-LLJSXMO2.js';
8
11
  import './chunk-EB3G4IG6.js';
9
12
  import './chunk-BVMY4IWB.js';
10
13
  //# sourceMappingURL=cep.js.map
@@ -1,4 +1,4 @@
1
- import { stripRenavam } from './chunk-YYHS5WQN.js';
1
+ import { stripRenavam } from './chunk-6BWOYNQD.js';
2
2
  import { weightedSum } from './chunk-OTZHMJYE.js';
3
3
  import { brandRenavam } from './chunk-BVMY4IWB.js';
4
4
 
@@ -82,5 +82,5 @@ function validateRenavam(input) {
82
82
  }
83
83
 
84
84
  export { RENAVAM_BASE_LENGTH, RENAVAM_DV_WEIGHTS, RENAVAM_GOLDEN_DASH_INPUT, RENAVAM_GOLDEN_DV_ZERO, RENAVAM_GOLDEN_LEADING_ZEROS, RENAVAM_GOLDEN_PRIMARY, RENAVAM_GOLDEN_SECONDARY, RENAVAM_LENGTH, RENAVAM_NUMERIC_PATTERN, RENAVAM_OFFICIAL_SOURCE_URL, RENAVAM_SENATRAN_CONSULTA_URL, computeRenavamCheckDigit, isValidRenavam, validateRenavam };
85
- //# sourceMappingURL=chunk-F6LVFAJT.js.map
86
- //# sourceMappingURL=chunk-F6LVFAJT.js.map
85
+ //# sourceMappingURL=chunk-4NS47CJG.js.map
86
+ //# sourceMappingURL=chunk-4NS47CJG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/renavam/constants.ts","../src/core/renavam/check-digits.ts","../src/core/renavam/index.ts"],"names":[],"mappings":"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","file":"chunk-F6LVFAJT.js","sourcesContent":["/**\n * RENAVAM constants — modulo 11, peso 9 (DENATRAN / SENATRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n * @see https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam\n * @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-renavam/ — algorithm cross-check (AdvPL)\n * @see https://www.geravalida.com.br/gerador-de-renavam — implementation cross-check\n * @see https://geradorfacil.com/geradores/renavam — implementation cross-check\n */\nexport const RENAVAM_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const RENAVAM_LENGTH = 11;\nexport const RENAVAM_BASE_LENGTH = 10;\nexport const RENAVAM_NUMERIC_PATTERN = /^\\d{11}$/;\n\n/** Golden primary — DV walkthrough: base `6397779110` → DV `4`. */\nexport const RENAVAM_GOLDEN_PRIMARY = '63977791104';\nexport const RENAVAM_GOLDEN_SECONDARY = '72176426415';\nexport const RENAVAM_GOLDEN_LEADING_ZEROS = '00207104255';\nexport const RENAVAM_GOLDEN_DV_ZERO = '12345678900';\n\n/** Optional dash before check digit — accepted on input via strip, never emitted by format. */\nexport const RENAVAM_GOLDEN_DASH_INPUT = '7217642641-5';\n\nexport const RENAVAM_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf';\n\n/** SENATRAN online vehicle lookup — requires RENAVAM + plate + owner CPF/CNPJ. */\nexport const RENAVAM_SENATRAN_CONSULTA_URL =\n 'https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam';\n","/**\n * RENAVAM check digit — modulo 11, peso 9 (Portaria DENATRAN 27/2013).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n * @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-renavam/ — algorithm cross-check (AdvPL)\n */\nimport { weightedSum } from '../cnpj/modulo11.js';\nimport { RENAVAM_DV_WEIGHTS } from './constants.js';\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nexport function computeRenavamWeightedSum(base: string): number {\n const values = base.split('').map(digitValue);\n return weightedSum(values, RENAVAM_DV_WEIGHTS);\n}\n\nexport function computeRenavamCheckDigit(base: string): number {\n const remainder = computeRenavamWeightedSum(base) % 11;\n let dv = 11 - remainder;\n if (dv > 9) {\n dv = 0;\n }\n return dv;\n}\n","/**\n * RENAVAM validation — modulo 11, peso 9 (DENATRAN / SENATRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n * @see https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam\n */\nimport { stripRenavam } from '../../strip/index.js';\nimport type { Renavam, ValidationResult } from '../../types/validation-result.js';\nimport { brandRenavam } from '../../types/validation-result.js';\nimport { computeRenavamCheckDigit } from './check-digits.js';\nimport { RENAVAM_BASE_LENGTH, RENAVAM_LENGTH } from './constants.js';\n\nexport {\n RENAVAM_BASE_LENGTH,\n RENAVAM_DV_WEIGHTS,\n RENAVAM_GOLDEN_DASH_INPUT,\n RENAVAM_GOLDEN_DV_ZERO,\n RENAVAM_GOLDEN_LEADING_ZEROS,\n RENAVAM_GOLDEN_PRIMARY,\n RENAVAM_GOLDEN_SECONDARY,\n RENAVAM_LENGTH,\n RENAVAM_NUMERIC_PATTERN,\n RENAVAM_OFFICIAL_SOURCE_URL,\n RENAVAM_SENATRAN_CONSULTA_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 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 isValidRenavamChecksum(stripped: string): boolean {\n const base = stripped.slice(0, RENAVAM_BASE_LENGTH);\n const expected = String(computeRenavamCheckDigit(base));\n return stripped.charAt(RENAVAM_BASE_LENGTH) === expected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'RENAVAM input is empty');\n }\n\n const withoutMask = input.replace(/-/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'RENAVAM contains invalid characters');\n }\n\n if (stripped.length !== RENAVAM_LENGTH) {\n return failure('INVALID_LENGTH', `RENAVAM must have ${RENAVAM_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'RENAVAM with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidRenavam(input: string): boolean {\n return validateRenavam(input).ok;\n}\n\nexport function validateRenavam(input: string): ValidationResult<Renavam> {\n const stripped = stripRenavam(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidRenavamChecksum(stripped)) {\n return { ok: true, value: brandRenavam(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'RENAVAM check digit is invalid');\n}\n"]}
1
+ {"version":3,"sources":["../src/core/renavam/constants.ts","../src/core/renavam/check-digits.ts","../src/core/renavam/index.ts"],"names":[],"mappings":"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","file":"chunk-4NS47CJG.js","sourcesContent":["/**\n * RENAVAM constants — modulo 11, peso 9 (DENATRAN / SENATRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n * @see https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam\n * @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-renavam/ — algorithm cross-check (AdvPL)\n * @see https://www.geravalida.com.br/gerador-de-renavam — implementation cross-check\n * @see https://geradorfacil.com/geradores/renavam — implementation cross-check\n */\nexport const RENAVAM_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const RENAVAM_LENGTH = 11;\nexport const RENAVAM_BASE_LENGTH = 10;\nexport const RENAVAM_NUMERIC_PATTERN = /^\\d{11}$/;\n\n/** Golden primary — DV walkthrough: base `6397779110` → DV `4`. */\nexport const RENAVAM_GOLDEN_PRIMARY = '63977791104';\nexport const RENAVAM_GOLDEN_SECONDARY = '72176426415';\nexport const RENAVAM_GOLDEN_LEADING_ZEROS = '00207104255';\nexport const RENAVAM_GOLDEN_DV_ZERO = '12345678900';\n\n/** Optional dash before check digit — accepted on input via strip, never emitted by format. */\nexport const RENAVAM_GOLDEN_DASH_INPUT = '7217642641-5';\n\nexport const RENAVAM_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf';\n\n/** SENATRAN online vehicle lookup — requires RENAVAM + plate + owner CPF/CNPJ. */\nexport const RENAVAM_SENATRAN_CONSULTA_URL =\n 'https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam';\n","/**\n * RENAVAM check digit — modulo 11, peso 9 (Portaria DENATRAN 27/2013).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n * @see https://siga0984.wordpress.com/2019/05/01/algoritmos-validacao-de-renavam/ — algorithm cross-check (AdvPL)\n */\nimport { weightedSum } from '../cnpj/modulo11.js';\nimport { RENAVAM_DV_WEIGHTS } from './constants.js';\n\nfunction digitValue(char: string): number {\n return Number(char);\n}\n\nexport function computeRenavamWeightedSum(base: string): number {\n const values = base.split('').map(digitValue);\n return weightedSum(values, RENAVAM_DV_WEIGHTS);\n}\n\nexport function computeRenavamCheckDigit(base: string): number {\n const remainder = computeRenavamWeightedSum(base) % 11;\n let dv = 11 - remainder;\n if (dv > 9) {\n dv = 0;\n }\n return dv;\n}\n","/**\n * RENAVAM validation — modulo 11, peso 9 (DENATRAN / SENATRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n * @see https://www.gov.br/pt-br/servicos/consultar-dados-de-veiculo-na-base-renavam\n */\nimport { stripRenavam } from '../../strip/index.js';\nimport type { Renavam, ValidationResult } from '../../types/validation-result.js';\nimport { brandRenavam } from '../../types/validation-result.js';\nimport { computeRenavamCheckDigit } from './check-digits.js';\nimport { RENAVAM_BASE_LENGTH, RENAVAM_LENGTH } from './constants.js';\n\nexport {\n RENAVAM_BASE_LENGTH,\n RENAVAM_DV_WEIGHTS,\n RENAVAM_GOLDEN_DASH_INPUT,\n RENAVAM_GOLDEN_DV_ZERO,\n RENAVAM_GOLDEN_LEADING_ZEROS,\n RENAVAM_GOLDEN_PRIMARY,\n RENAVAM_GOLDEN_SECONDARY,\n RENAVAM_LENGTH,\n RENAVAM_NUMERIC_PATTERN,\n RENAVAM_OFFICIAL_SOURCE_URL,\n RENAVAM_SENATRAN_CONSULTA_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 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 isValidRenavamChecksum(stripped: string): boolean {\n const base = stripped.slice(0, RENAVAM_BASE_LENGTH);\n const expected = String(computeRenavamCheckDigit(base));\n return stripped.charAt(RENAVAM_BASE_LENGTH) === expected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'RENAVAM input is empty');\n }\n\n const withoutMask = input.replace(/-/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'RENAVAM contains invalid characters');\n }\n\n if (stripped.length !== RENAVAM_LENGTH) {\n return failure('INVALID_LENGTH', `RENAVAM must have ${RENAVAM_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'RENAVAM with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidRenavam(input: string): boolean {\n return validateRenavam(input).ok;\n}\n\nexport function validateRenavam(input: string): ValidationResult<Renavam> {\n const stripped = stripRenavam(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidRenavamChecksum(stripped)) {\n return { ok: true, value: brandRenavam(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'RENAVAM check digit is invalid');\n}\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-5V2TNYC7.js.map
3
+ //# sourceMappingURL=chunk-5V2TNYC7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-KLPONHBL.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-5V2TNYC7.js"}
@@ -24,5 +24,5 @@ function stripPlaca(input) {
24
24
  }
25
25
 
26
26
  export { stripCep, stripCnh, stripPlaca, stripRenavam, stripTituloEleitor };
27
- //# sourceMappingURL=chunk-YYHS5WQN.js.map
28
- //# sourceMappingURL=chunk-YYHS5WQN.js.map
27
+ //# sourceMappingURL=chunk-6BWOYNQD.js.map
28
+ //# sourceMappingURL=chunk-6BWOYNQD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/strip/cep.ts","../src/strip/cnh.ts","../src/strip/renavam.ts","../src/strip/titulo-eleitor.ts","../src/strip/placa.ts"],"names":[],"mappings":";AAIO,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACDO,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACHO,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACFO,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACFO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,eAAA,EAAiB,EAAE,EAAE,WAAA,EAAY;AACxD","file":"chunk-YYHS5WQN.js","sourcesContent":["/**\n * Strip CEP mask — digits only (BR-CEP-001).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n */\nexport function stripCep(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip CNH — digits only (BR-CNH-002). Removes non-official decoration (e.g. CPF-style dots).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf\n * @see https://www.gov.br/pt-br/servicos/validar-cnh\n */\nexport function stripCnh(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip RENAVAM — digits only (BR-RENAVAM-002).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n */\nexport function stripRenavam(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip Título de Eleitor — digits only (BR-TITULO-002).\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n */\nexport function stripTituloEleitor(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip placa mask — preserve A-Z0-9, uppercase (BR-PLACA-004).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nexport function stripPlaca(input: string): string {\n return input.replace(/[^A-Za-z0-9]/g, '').toUpperCase();\n}\n"]}
1
+ {"version":3,"sources":["../src/strip/cep.ts","../src/strip/cnh.ts","../src/strip/renavam.ts","../src/strip/titulo-eleitor.ts","../src/strip/placa.ts"],"names":[],"mappings":";AAIO,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACDO,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACHO,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACFO,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACFO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,eAAA,EAAiB,EAAE,EAAE,WAAA,EAAY;AACxD","file":"chunk-6BWOYNQD.js","sourcesContent":["/**\n * Strip CEP mask — digits only (BR-CEP-001).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n */\nexport function stripCep(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip CNH — digits only (BR-CNH-002). Removes non-official decoration (e.g. CPF-style dots).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf\n * @see https://www.gov.br/pt-br/servicos/validar-cnh\n */\nexport function stripCnh(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip RENAVAM — digits only (BR-RENAVAM-002).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n */\nexport function stripRenavam(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip Título de Eleitor — digits only (BR-TITULO-002).\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n */\nexport function stripTituloEleitor(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Strip placa mask — preserve A-Z0-9, uppercase (BR-PLACA-004).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nexport function stripPlaca(input: string): string {\n return input.replace(/[^A-Za-z0-9]/g, '').toUpperCase();\n}\n"]}