@br-validators/core 1.7.0 → 1.8.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 (247) hide show
  1. package/README.md +25 -7
  2. package/dist/aeroportos.d.ts +1 -1
  3. package/dist/anp-combustiveis.d.ts +1 -1
  4. package/dist/bancos.d.ts +1 -1
  5. package/dist/batch.d.ts +3 -3
  6. package/dist/batch.js +27 -25
  7. package/dist/boleto.d.ts +2 -2
  8. package/dist/boleto.js +5 -5
  9. package/dist/brcode.d.ts +2 -2
  10. package/dist/brcode.js +8 -8
  11. package/dist/cartao-credito.d.ts +2 -2
  12. package/dist/cartao-credito.js +3 -3
  13. package/dist/cbo.d.ts +1 -1
  14. package/dist/cep.d.ts +3 -3
  15. package/dist/cep.js +4 -4
  16. package/dist/cest.d.ts +1 -1
  17. package/dist/cfop.d.ts +1 -1
  18. package/dist/{chunk-FL4UUTAC.js → chunk-26HMLR4Y.js} +3 -3
  19. package/dist/{chunk-FL4UUTAC.js.map → chunk-26HMLR4Y.js.map} +1 -1
  20. package/dist/{chunk-LPGSPM53.js → chunk-2EYJMAE2.js} +3 -3
  21. package/dist/{chunk-LPGSPM53.js.map → chunk-2EYJMAE2.js.map} +1 -1
  22. package/dist/{chunk-NWXFSSGF.js → chunk-2HD6TA3O.js} +3 -3
  23. package/dist/{chunk-NWXFSSGF.js.map → chunk-2HD6TA3O.js.map} +1 -1
  24. package/dist/chunk-2NSBFMTP.js +125 -0
  25. package/dist/chunk-2NSBFMTP.js.map +1 -0
  26. package/dist/{chunk-VDCITFZG.js → chunk-2ZWBFVYY.js} +3 -3
  27. package/dist/{chunk-VDCITFZG.js.map → chunk-2ZWBFVYY.js.map} +1 -1
  28. package/dist/{chunk-EGDZGSHA.js → chunk-3EVLQVBC.js} +3 -3
  29. package/dist/{chunk-EGDZGSHA.js.map → chunk-3EVLQVBC.js.map} +1 -1
  30. package/dist/{chunk-A2JXKXPS.js → chunk-3ZIXLRXZ.js} +4 -3
  31. package/dist/chunk-3ZIXLRXZ.js.map +1 -0
  32. package/dist/{chunk-MXWI7LLA.js → chunk-47PZ7WGA.js} +23 -19
  33. package/dist/chunk-47PZ7WGA.js.map +1 -0
  34. package/dist/{chunk-3OTYX7QX.js → chunk-4T2ZBJFM.js} +3 -3
  35. package/dist/{chunk-3OTYX7QX.js.map → chunk-4T2ZBJFM.js.map} +1 -1
  36. package/dist/{chunk-4GMBZLAS.js → chunk-5I6WYO5R.js} +3 -3
  37. package/dist/{chunk-4GMBZLAS.js.map → chunk-5I6WYO5R.js.map} +1 -1
  38. package/dist/{chunk-ZZN5JNVJ.js → chunk-7EMUKPPG.js} +8 -8
  39. package/dist/{chunk-ZZN5JNVJ.js.map → chunk-7EMUKPPG.js.map} +1 -1
  40. package/dist/{chunk-ULNZHOMA.js → chunk-AG3VELYX.js} +5 -14
  41. package/dist/chunk-AG3VELYX.js.map +1 -0
  42. package/dist/chunk-BG72VA7O.js +33 -0
  43. package/dist/chunk-BG72VA7O.js.map +1 -0
  44. package/dist/{chunk-4TOP3CZQ.js → chunk-BNM3RSDY.js} +24 -19
  45. package/dist/chunk-BNM3RSDY.js.map +1 -0
  46. package/dist/{chunk-RNT4GCP3.js → chunk-BSNVQQTV.js} +25 -20
  47. package/dist/chunk-BSNVQQTV.js.map +1 -0
  48. package/dist/chunk-BSSRVJ2C.js +14 -0
  49. package/dist/chunk-BSSRVJ2C.js.map +1 -0
  50. package/dist/{chunk-YEVKV2NP.js → chunk-DAX5PVBJ.js} +10 -8
  51. package/dist/chunk-DAX5PVBJ.js.map +1 -0
  52. package/dist/{chunk-43FQHKCC.js → chunk-DMUWIPJR.js} +3 -3
  53. package/dist/{chunk-43FQHKCC.js.map → chunk-DMUWIPJR.js.map} +1 -1
  54. package/dist/{chunk-G557DGIX.js → chunk-E2BVDZKJ.js} +3 -3
  55. package/dist/{chunk-G557DGIX.js.map → chunk-E2BVDZKJ.js.map} +1 -1
  56. package/dist/{chunk-UXH6EHK6.js → chunk-EDJC6HIP.js} +3 -3
  57. package/dist/{chunk-UXH6EHK6.js.map → chunk-EDJC6HIP.js.map} +1 -1
  58. package/dist/{chunk-4NFEM2SU.js → chunk-EMZCVV5Y.js} +9 -3
  59. package/dist/chunk-EMZCVV5Y.js.map +1 -0
  60. package/dist/chunk-FI2JE6AS.js +15 -0
  61. package/dist/chunk-FI2JE6AS.js.map +1 -0
  62. package/dist/{chunk-EOXFX7MM.js → chunk-G4YT6X7N.js} +3 -3
  63. package/dist/{chunk-EOXFX7MM.js.map → chunk-G4YT6X7N.js.map} +1 -1
  64. package/dist/chunk-G65WTGYO.js +31 -0
  65. package/dist/chunk-G65WTGYO.js.map +1 -0
  66. package/dist/chunk-HIWHBRFG.js +30 -0
  67. package/dist/chunk-HIWHBRFG.js.map +1 -0
  68. package/dist/{chunk-SCCMKFSR.js → chunk-J3QGK6MX.js} +33 -33
  69. package/dist/{chunk-SCCMKFSR.js.map → chunk-J3QGK6MX.js.map} +1 -1
  70. package/dist/{chunk-P3EJRH4P.js → chunk-LXB5FIAQ.js} +4 -4
  71. package/dist/{chunk-P3EJRH4P.js.map → chunk-LXB5FIAQ.js.map} +1 -1
  72. package/dist/{chunk-B4LJI7EP.js → chunk-M3RBXFYG.js} +39 -20
  73. package/dist/chunk-M3RBXFYG.js.map +1 -0
  74. package/dist/{chunk-3DLNIUBY.js → chunk-M6VUQK73.js} +5 -5
  75. package/dist/{chunk-3DLNIUBY.js.map → chunk-M6VUQK73.js.map} +1 -1
  76. package/dist/{chunk-2M4RVHRO.js → chunk-MLUDCL3P.js} +3 -3
  77. package/dist/{chunk-2M4RVHRO.js.map → chunk-MLUDCL3P.js.map} +1 -1
  78. package/dist/{chunk-GVQMJ45R.js → chunk-MZZNNXAB.js} +27 -21
  79. package/dist/chunk-MZZNNXAB.js.map +1 -0
  80. package/dist/{chunk-DVA6QQUF.js → chunk-O3HZW2GM.js} +3 -3
  81. package/dist/{chunk-DVA6QQUF.js.map → chunk-O3HZW2GM.js.map} +1 -1
  82. package/dist/{chunk-5S3IURHL.js → chunk-O7RJQUAJ.js} +3 -3
  83. package/dist/{chunk-5S3IURHL.js.map → chunk-O7RJQUAJ.js.map} +1 -1
  84. package/dist/{chunk-IJ2DAVSD.js → chunk-OM5ELPM6.js} +3 -3
  85. package/dist/{chunk-IJ2DAVSD.js.map → chunk-OM5ELPM6.js.map} +1 -1
  86. package/dist/chunk-OPFCKUFX.js +31 -0
  87. package/dist/chunk-OPFCKUFX.js.map +1 -0
  88. package/dist/{chunk-2JSOXG2M.js → chunk-P37C3MVF.js} +3 -3
  89. package/dist/{chunk-2JSOXG2M.js.map → chunk-P37C3MVF.js.map} +1 -1
  90. package/dist/chunk-P5BDKYBC.js +3 -0
  91. package/dist/chunk-P5BDKYBC.js.map +1 -0
  92. package/dist/{chunk-HCH6G5XY.js → chunk-PUTVO6HG.js} +3 -3
  93. package/dist/{chunk-HCH6G5XY.js.map → chunk-PUTVO6HG.js.map} +1 -1
  94. package/dist/{chunk-PN4XUBLV.js → chunk-Q2CFVQ2U.js} +3 -3
  95. package/dist/{chunk-PN4XUBLV.js.map → chunk-Q2CFVQ2U.js.map} +1 -1
  96. package/dist/{chunk-GAU2MGUQ.js → chunk-QKAXRXU5.js} +3 -3
  97. package/dist/{chunk-GAU2MGUQ.js.map → chunk-QKAXRXU5.js.map} +1 -1
  98. package/dist/{chunk-OWD47AWI.js → chunk-QZPKTG4A.js} +3 -3
  99. package/dist/{chunk-OWD47AWI.js.map → chunk-QZPKTG4A.js.map} +1 -1
  100. package/dist/{chunk-URNYB2CC.js → chunk-RNI5G42M.js} +4 -4
  101. package/dist/{chunk-URNYB2CC.js.map → chunk-RNI5G42M.js.map} +1 -1
  102. package/dist/{chunk-37IHHQKK.js → chunk-ROU5ZHN7.js} +4 -4
  103. package/dist/{chunk-37IHHQKK.js.map → chunk-ROU5ZHN7.js.map} +1 -1
  104. package/dist/{chunk-274K6AOM.js → chunk-RP5UWF2G.js} +3 -3
  105. package/dist/{chunk-274K6AOM.js.map → chunk-RP5UWF2G.js.map} +1 -1
  106. package/dist/{chunk-QSSKPIG5.js → chunk-SIMI5XYE.js} +3 -3
  107. package/dist/{chunk-QSSKPIG5.js.map → chunk-SIMI5XYE.js.map} +1 -1
  108. package/dist/{chunk-TTDHGQEC.js → chunk-SQO7BO3Y.js} +3 -3
  109. package/dist/{chunk-TTDHGQEC.js.map → chunk-SQO7BO3Y.js.map} +1 -1
  110. package/dist/{chunk-MXOYICSK.js → chunk-SXPLYH4N.js} +3 -3
  111. package/dist/{chunk-MXOYICSK.js.map → chunk-SXPLYH4N.js.map} +1 -1
  112. package/dist/{chunk-F7G4ISQB.js → chunk-UANHHEWY.js} +3 -3
  113. package/dist/{chunk-F7G4ISQB.js.map → chunk-UANHHEWY.js.map} +1 -1
  114. package/dist/{chunk-TAOFFAG3.js → chunk-UJXGDUKJ.js} +3 -3
  115. package/dist/{chunk-TAOFFAG3.js.map → chunk-UJXGDUKJ.js.map} +1 -1
  116. package/dist/chunk-VXHJLWMA.js +115 -0
  117. package/dist/chunk-VXHJLWMA.js.map +1 -0
  118. package/dist/chunk-W64OQYC4.js +13 -0
  119. package/dist/chunk-W64OQYC4.js.map +1 -0
  120. package/dist/{chunk-MNBNKSMF.js → chunk-WAVBQYPE.js} +4 -4
  121. package/dist/{chunk-MNBNKSMF.js.map → chunk-WAVBQYPE.js.map} +1 -1
  122. package/dist/{chunk-CYBWPBXJ.js → chunk-WE6RG6OC.js} +4 -4
  123. package/dist/{chunk-CYBWPBXJ.js.map → chunk-WE6RG6OC.js.map} +1 -1
  124. package/dist/{chunk-Z7KH65RZ.js → chunk-WKDCI3NI.js} +3 -3
  125. package/dist/{chunk-Z7KH65RZ.js.map → chunk-WKDCI3NI.js.map} +1 -1
  126. package/dist/chunk-XFKSJRWM.js +14 -0
  127. package/dist/chunk-XFKSJRWM.js.map +1 -0
  128. package/dist/chunk-XHHJTKSP.js +33 -0
  129. package/dist/chunk-XHHJTKSP.js.map +1 -0
  130. package/dist/chunk-XVT5QOAL.js +30 -0
  131. package/dist/chunk-XVT5QOAL.js.map +1 -0
  132. package/dist/{chunk-VE2XZSKP.js → chunk-YA7RWTAE.js} +3 -3
  133. package/dist/{chunk-VE2XZSKP.js.map → chunk-YA7RWTAE.js.map} +1 -1
  134. package/dist/chunk-YAHKWOSP.js +35 -0
  135. package/dist/chunk-YAHKWOSP.js.map +1 -0
  136. package/dist/{chunk-3ZALSJZT.js → chunk-YJBKWUCE.js} +4 -3
  137. package/dist/chunk-YJBKWUCE.js.map +1 -0
  138. package/dist/cnaes.d.ts +4 -2
  139. package/dist/cnaes.js +2 -1
  140. package/dist/cnaes.js.map +1 -1
  141. package/dist/cnh.d.ts +2 -2
  142. package/dist/cnh.js +4 -4
  143. package/dist/cnis.d.ts +50 -0
  144. package/dist/cnis.js +7 -0
  145. package/dist/cnis.js.map +1 -0
  146. package/dist/cnpj-motivos.d.ts +52 -0
  147. package/dist/cnpj-motivos.js +292 -0
  148. package/dist/cnpj-motivos.js.map +1 -0
  149. package/dist/cnpj.d.ts +2 -2
  150. package/dist/cnpj.js +4 -4
  151. package/dist/compare.d.ts +3 -3
  152. package/dist/compare.js +29 -27
  153. package/dist/cpf.d.ts +2 -2
  154. package/dist/cpf.js +4 -4
  155. package/dist/cst.d.ts +73 -0
  156. package/dist/cst.js +482 -0
  157. package/dist/cst.js.map +1 -0
  158. package/dist/data-catalog.d.ts +2 -2
  159. package/dist/data-catalog.js +42 -28
  160. package/dist/data-catalog.js.map +1 -1
  161. package/dist/detect.d.ts +2 -2
  162. package/dist/detect.js +25 -23
  163. package/dist/diff.d.ts +3 -3
  164. package/dist/diff.js +29 -27
  165. package/dist/ean.d.ts +43 -0
  166. package/dist/ean.js +6 -0
  167. package/dist/ean.js.map +1 -0
  168. package/dist/esocial.d.ts +45 -0
  169. package/dist/esocial.js +387 -0
  170. package/dist/esocial.js.map +1 -0
  171. package/dist/feriados.d.ts +1 -1
  172. package/dist/generate.d.ts +1 -1
  173. package/dist/generate.js +38 -36
  174. package/dist/ibge.d.ts +34 -2
  175. package/dist/ibge.js +109 -1
  176. package/dist/ibge.js.map +1 -1
  177. package/dist/ibpt.d.ts +74 -0
  178. package/dist/ibpt.js +166 -0
  179. package/dist/ibpt.js.map +1 -0
  180. package/dist/incoterms.d.ts +1 -1
  181. package/dist/{index-CJ5ACErT.d.ts → index-BmoilwS2.d.ts} +2 -2
  182. package/dist/index.d.ts +11 -9
  183. package/dist/index.js +70 -60
  184. package/dist/index.js.map +1 -1
  185. package/dist/{inscricao-estadual-produtor-rural-BNAyLQPY.d.ts → inscricao-estadual-produtor-rural-Hfq6jN1n.d.ts} +1 -1
  186. package/dist/inscricao-estadual-produtor-rural.d.ts +2 -2
  187. package/dist/inscricao-estadual-produtor-rural.js +3 -3
  188. package/dist/inscricao-estadual.d.ts +3 -3
  189. package/dist/inscricao-estadual.js +4 -4
  190. package/dist/lc116.d.ts +42 -0
  191. package/dist/lc116.js +866 -0
  192. package/dist/lc116.js.map +1 -0
  193. package/dist/mask.d.ts +3 -3
  194. package/dist/mask.js +41 -37
  195. package/dist/moedas.d.ts +1 -1
  196. package/dist/natureza-juridica.d.ts +1 -1
  197. package/dist/nbs.d.ts +1 -1
  198. package/dist/ncm.d.ts +1 -1
  199. package/dist/nfe-chave.d.ts +2 -2
  200. package/dist/nfe-chave.js +3 -3
  201. package/dist/paises-bacen.d.ts +1 -1
  202. package/dist/pis-pasep.d.ts +2 -2
  203. package/dist/pis-pasep.js +5 -3
  204. package/dist/{pix-QsM0lMas.d.ts → pix-BcPQzXRx.d.ts} +1 -1
  205. package/dist/pix.d.ts +2 -2
  206. package/dist/pix.js +8 -8
  207. package/dist/placa.d.ts +2 -2
  208. package/dist/placa.js +4 -4
  209. package/dist/pncp-reference.d.ts +1 -1
  210. package/dist/portos.d.ts +1 -1
  211. package/dist/processo-judicial.d.ts +2 -2
  212. package/dist/processo-judicial.js +3 -3
  213. package/dist/ptax.d.ts +53 -0
  214. package/dist/ptax.js +485 -0
  215. package/dist/ptax.js.map +1 -0
  216. package/dist/renavam.d.ts +2 -2
  217. package/dist/renavam.js +4 -4
  218. package/dist/rg.d.ts +2 -2
  219. package/dist/rg.js +2 -2
  220. package/dist/sanitize.d.ts +2 -2
  221. package/dist/sanitize.js +24 -22
  222. package/dist/simples-nacional.d.ts +67 -0
  223. package/dist/simples-nacional.js +178 -0
  224. package/dist/simples-nacional.js.map +1 -0
  225. package/dist/telefone.d.ts +3 -3
  226. package/dist/telefone.js +3 -3
  227. package/dist/titulo-eleitor.d.ts +2 -2
  228. package/dist/titulo-eleitor.js +4 -4
  229. package/dist/transparencia-snapshots.d.ts +1 -1
  230. package/dist/transparencia-snapshots.js +1 -1
  231. package/dist/tse-municipios.d.ts +1 -1
  232. package/dist/{types-CCKLomYy.d.ts → types-CnePu8im.d.ts} +1 -1
  233. package/dist/{types-CQvCmvGu.d.ts → types-DTtrW1Km.d.ts} +2 -2
  234. package/dist/{validation-result-hfVg2-Mc.d.ts → validation-result-Rb7C0_xj.d.ts} +30 -2
  235. package/package.json +47 -2
  236. package/dist/chunk-3ZALSJZT.js.map +0 -1
  237. package/dist/chunk-4NFEM2SU.js.map +0 -1
  238. package/dist/chunk-4TOP3CZQ.js.map +0 -1
  239. package/dist/chunk-A2JXKXPS.js.map +0 -1
  240. package/dist/chunk-B4LJI7EP.js.map +0 -1
  241. package/dist/chunk-GVQMJ45R.js.map +0 -1
  242. package/dist/chunk-MXWI7LLA.js.map +0 -1
  243. package/dist/chunk-RNT4GCP3.js.map +0 -1
  244. package/dist/chunk-ULNZHOMA.js.map +0 -1
  245. package/dist/chunk-WAYYRZ2L.js +0 -23
  246. package/dist/chunk-WAYYRZ2L.js.map +0 -1
  247. package/dist/chunk-YEVKV2NP.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/titulo-eleitor/constants.ts","../src/core/titulo-eleitor/check-digits.ts","../src/core/titulo-eleitor/parse.ts","../src/core/titulo-eleitor/index.ts"],"names":[],"mappings":"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","file":"chunk-PN4XUBLV.js","sourcesContent":["/**\n * Título de Eleitor constants — modulo 11 (TSE Res. 20.132/1998 + algorithm cross-checks).\n * @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998 — Art. 10 (structure, mod 11)\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador — weights + SP/MG rule\n * @see http://ghiorzi.org/DVnew.htm#e — algorithm cross-check\n */\nimport type { UfCode } from '../../types/validation-result.js';\n\nexport const TITULO_ELEITOR_DV1_WEIGHTS_8 = [2, 3, 4, 5, 6, 7, 8, 9] as const;\nexport const TITULO_ELEITOR_DV1_WEIGHTS_9 = [9, 2, 3, 4, 5, 6, 7, 8, 9] as const;\nexport const TITULO_ELEITOR_DV2_WEIGHTS = [7, 8, 9] as const;\nexport const TITULO_ELEITOR_SEQUENTIAL_LENGTH = 8;\nexport const TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED = 9;\nexport const TITULO_ELEITOR_LENGTH = 12;\nexport const TITULO_ELEITOR_LENGTH_EXTENDED = 13;\nexport const TITULO_ELEITOR_UF_LENGTH = 2;\nexport const TITULO_ELEITOR_DV_LENGTH = 2;\nexport const TITULO_ELEITOR_MIN_UF_CODE = 1;\nexport const TITULO_ELEITOR_MAX_UF_CODE = 28;\nexport const TITULO_ELEITOR_NUMERIC_PATTERN_12 = /^\\d{12}$/;\nexport const TITULO_ELEITOR_NUMERIC_PATTERN_13 = /^\\d{13}$/;\n\n/** TSE UF codes where remainder 0 maps DV to 1 instead of 0. */\nexport const TITULO_ELEITOR_SPECIAL_UF_CODES = [1, 2] as const;\n\n/** Golden primary — SC (UF=09), Wikipedia PT walkthrough. */\nexport const TITULO_ELEITOR_GOLDEN_PRIMARY = '004356870906';\nexport const TITULO_ELEITOR_GOLDEN_SP_SPECIAL = '000000000116';\nexport const TITULO_ELEITOR_GOLDEN_SP_EXTENDED = '1234567890175';\nexport const TITULO_ELEITOR_GOLDEN_EXTERIOR = '000000012895';\nexport const TITULO_ELEITOR_GOLDEN_MASKED_INPUT = '0043 5687 0906';\n\n/** Normative — Resolução TSE 20.132/1998, Art. 10 (8 seq + 2 UF + 2 DV, mod 11). */\nexport const TITULO_ELEITOR_OFFICIAL_SOURCE_URL =\n 'https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998';\n\n/** Normative — Resolução TSE 23.659/2021 (Cadastro Eleitoral; confirms UF + DV structure). */\nexport const TITULO_ELEITOR_NORMATIVE_SECONDARY_URL =\n 'https://www.tse.jus.br/legislacao/compilada/res/2021/resolucao-no-23-659-de-26-de-outubro-de-2021';\n\n/**\n * Algorithm weights + SP/MG remainder-zero rule — not in TSE resolution text.\n * Community consensus validated empirically (Wikipedia PT worked example).\n */\nexport const TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL =\n 'https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador';\n\n/** Algorithm cross-check — Ghiorzi DV table. */\nexport const TITULO_ELEITOR_ALGORITHM_REF_URL = 'http://ghiorzi.org/DVnew.htm#e';\n\nexport const TITULO_ELEITOR_TSE_PORTAL_URL = 'https://www.tse.jus.br/';\n\nexport const TITULO_ELEITOR_ETITULO_URL =\n 'https://www.tse.jus.br/eleitor/servicos/aplicativo-e-titulo';\n\n/** TSE electoral UF code → Brazilian UF (28 = exterior / ZZ). */\nexport const TITULO_ELEITOR_UF_BY_CODE: Readonly<Record<number, UfCode>> = {\n 1: 'SP',\n 2: 'MG',\n 3: 'RJ',\n 4: 'RS',\n 5: 'BA',\n 6: 'PR',\n 7: 'CE',\n 8: 'PE',\n 9: 'SC',\n 10: 'GO',\n 11: 'MA',\n 12: 'PB',\n 13: 'PA',\n 14: 'ES',\n 15: 'PI',\n 16: 'RN',\n 17: 'AL',\n 18: 'MT',\n 19: 'MS',\n 20: 'DF',\n 21: 'SE',\n 22: 'AM',\n 23: 'RO',\n 24: 'AC',\n 25: 'AP',\n 26: 'RR',\n 27: 'TO',\n};\n\nexport const TITULO_ELEITOR_EXTERIOR_UF_CODE = 28;\n","/**\n * Título de Eleitor check digits — modulo 11 (TSE / Wikipedia PT + Ghiorzi).\n * @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n * @see http://ghiorzi.org/DVnew.htm#e\n */\nimport { weightedSum } from '../cnpj/modulo11.js';\nimport {\n TITULO_ELEITOR_DV1_WEIGHTS_8,\n TITULO_ELEITOR_DV1_WEIGHTS_9,\n TITULO_ELEITOR_DV2_WEIGHTS,\n TITULO_ELEITOR_SPECIAL_UF_CODES,\n} from './constants.js';\n\nfunction digitValues(chars: string): number[] {\n const values: number[] = [];\n for (let i = 0; i < chars.length; i++) {\n values.push(Number(chars.charAt(i)));\n }\n return values;\n}\n\nfunction isSpecialUf(ufCode: number): boolean {\n return (TITULO_ELEITOR_SPECIAL_UF_CODES as readonly number[]).includes(ufCode);\n}\n\nexport function resolveTituloEleitorCheckDigit(remainder: number, ufCode: number): number {\n if (remainder >= 10) {\n return 0;\n }\n if (remainder === 0 && isSpecialUf(ufCode)) {\n return 1;\n }\n return remainder;\n}\n\nexport function computeTituloEleitorFirstCheckDigit(sequential: string, ufCode: number): number {\n const weights =\n sequential.length === 8 ? TITULO_ELEITOR_DV1_WEIGHTS_8 : TITULO_ELEITOR_DV1_WEIGHTS_9;\n const remainder = weightedSum(digitValues(sequential), weights) % 11;\n return resolveTituloEleitorCheckDigit(remainder, ufCode);\n}\n\nexport function computeTituloEleitorSecondCheckDigit(\n ufDigits: string,\n firstDv: number,\n ufCode: number,\n): number {\n const uf1 = Number(ufDigits.charAt(0));\n const uf2 = Number(ufDigits.charAt(1));\n const remainder = weightedSum([uf1, uf2, firstDv], TITULO_ELEITOR_DV2_WEIGHTS) % 11;\n return resolveTituloEleitorCheckDigit(remainder, ufCode);\n}\n\nexport function computeTituloEleitorCheckDigits(\n sequential: string,\n ufDigits: string,\n ufCode: number,\n): string {\n const dv1 = computeTituloEleitorFirstCheckDigit(sequential, ufCode);\n const dv2 = computeTituloEleitorSecondCheckDigit(ufDigits, dv1, ufCode);\n return `${String(dv1)}${String(dv2)}`;\n}\n","import {\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,\n TITULO_ELEITOR_SPECIAL_UF_CODES,\n} from './constants.js';\n\nexport type TituloEleitorParts = {\n sequential: string;\n ufDigits: string;\n ufCode: number;\n checkDigits: string;\n};\n\nexport function parseTituloEleitorParts(stripped: string): TituloEleitorParts | null {\n if (stripped.length === TITULO_ELEITOR_LENGTH) {\n return {\n sequential: stripped.slice(0, TITULO_ELEITOR_SEQUENTIAL_LENGTH),\n ufDigits: stripped.slice(TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_LENGTH - 2),\n ufCode: Number(stripped.slice(TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_LENGTH - 2)),\n checkDigits: stripped.slice(TITULO_ELEITOR_LENGTH - 2),\n };\n }\n\n if (stripped.length === TITULO_ELEITOR_LENGTH_EXTENDED) {\n const ufDigits = stripped.slice(\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED + 2,\n );\n const ufCode = Number(ufDigits);\n if (!(TITULO_ELEITOR_SPECIAL_UF_CODES as readonly number[]).includes(ufCode)) {\n return null;\n }\n return {\n sequential: stripped.slice(0, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED),\n ufDigits,\n ufCode,\n checkDigits: stripped.slice(TITULO_ELEITOR_LENGTH_EXTENDED - 2),\n };\n }\n\n return null;\n}\n","/**\n * Título de Eleitor validation — modulo 11 (TSE Res. 20.132/1998 + algorithm cross-checks).\n * @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n * @see http://ghiorzi.org/DVnew.htm#e\n */\nimport { stripTituloEleitor } from '../../strip/index.js';\nimport type { TituloEleitorValidationResult, UfCode } from '../../types/validation-result.js';\nimport { brandTituloEleitor } from '../../types/validation-result.js';\nimport { computeTituloEleitorCheckDigits } from './check-digits.js';\nimport {\n TITULO_ELEITOR_EXTERIOR_UF_CODE,\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_MAX_UF_CODE,\n TITULO_ELEITOR_MIN_UF_CODE,\n TITULO_ELEITOR_UF_BY_CODE,\n} from './constants.js';\nimport { parseTituloEleitorParts } from './parse.js';\n\nexport {\n TITULO_ELEITOR_ALGORITHM_REF_URL,\n TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL,\n TITULO_ELEITOR_DV1_WEIGHTS_8,\n TITULO_ELEITOR_DV1_WEIGHTS_9,\n TITULO_ELEITOR_DV2_WEIGHTS,\n TITULO_ELEITOR_ETITULO_URL,\n TITULO_ELEITOR_EXTERIOR_UF_CODE,\n TITULO_ELEITOR_GOLDEN_EXTERIOR,\n TITULO_ELEITOR_GOLDEN_MASKED_INPUT,\n TITULO_ELEITOR_GOLDEN_PRIMARY,\n TITULO_ELEITOR_GOLDEN_SP_EXTENDED,\n TITULO_ELEITOR_GOLDEN_SP_SPECIAL,\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_NORMATIVE_SECONDARY_URL,\n TITULO_ELEITOR_NUMERIC_PATTERN_12,\n TITULO_ELEITOR_NUMERIC_PATTERN_13,\n TITULO_ELEITOR_OFFICIAL_SOURCE_URL,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,\n TITULO_ELEITOR_SPECIAL_UF_CODES,\n TITULO_ELEITOR_TSE_PORTAL_URL,\n TITULO_ELEITOR_UF_BY_CODE,\n} from './constants.js';\n\ntype FailedResult = Extract<TituloEleitorValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, ufCode?: number): FailedResult {\n if (ufCode === undefined) {\n return { ok: false, code, message };\n }\n return { ok: false, code, message, ufCode };\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 isValidUfCode(ufCode: number): boolean {\n return ufCode >= TITULO_ELEITOR_MIN_UF_CODE && ufCode <= TITULO_ELEITOR_MAX_UF_CODE;\n}\n\nfunction resolveUf(ufCode: number): UfCode | undefined {\n return TITULO_ELEITOR_UF_BY_CODE[ufCode];\n}\n\ntype StructureResult =\n | { ok: false; error: FailedResult }\n | { ok: true; parts: NonNullable<ReturnType<typeof parseTituloEleitorParts>> };\n\nfunction validateStructure(input: string, stripped: string): StructureResult {\n if (stripped.length === 0) {\n return { ok: false, error: failure('EMPTY_INPUT', 'Título de Eleitor input is empty') };\n }\n\n if (/[^0-9\\s]/.test(input.replace(/\\s/g, ''))) {\n return { ok: false, error: failure('INVALID_CHARACTER', 'Título de Eleitor contains invalid characters') };\n }\n\n if (stripped.length !== TITULO_ELEITOR_LENGTH && stripped.length !== TITULO_ELEITOR_LENGTH_EXTENDED) {\n return {\n ok: false,\n error: failure(\n 'INVALID_LENGTH',\n `Título de Eleitor must have ${TITULO_ELEITOR_LENGTH} or ${TITULO_ELEITOR_LENGTH_EXTENDED} digits after normalization`,\n ),\n };\n }\n\n const parts = parseTituloEleitorParts(stripped);\n if (!parts) {\n return {\n ok: false,\n error: failure(\n 'UNSUPPORTED_FORMAT',\n `13-digit Título de Eleitor is only valid for SP (01) or MG (02)`,\n ),\n };\n }\n\n if (!isValidUfCode(parts.ufCode)) {\n return {\n ok: false,\n error: failure(\n 'KNOWN_INVALID_PATTERN',\n `Título de Eleitor UF code ${parts.ufDigits} is not a valid TSE electoral code`,\n parts.ufCode,\n ),\n };\n }\n\n if (hasRepeatedDigits(stripped)) {\n return {\n ok: false,\n error: failure('KNOWN_INVALID_PATTERN', 'Título de Eleitor with all identical digits is invalid'),\n };\n }\n\n return { ok: true, parts };\n}\n\nfunction isValidTituloEleitorChecksum(parts: {\n sequential: string;\n ufDigits: string;\n ufCode: number;\n checkDigits: string;\n}): boolean {\n const expected = computeTituloEleitorCheckDigits(parts.sequential, parts.ufDigits, parts.ufCode);\n return parts.checkDigits === expected;\n}\n\nexport function isValidTituloEleitor(input: string): boolean {\n return validateTituloEleitor(input).ok;\n}\n\nexport function validateTituloEleitor(input: string): TituloEleitorValidationResult {\n const stripped = stripTituloEleitor(input);\n const structure = validateStructure(input, stripped);\n if (!structure.ok) {\n return structure.error;\n }\n\n const { parts } = structure;\n\n if (!isValidTituloEleitorChecksum(parts)) {\n return failure('INVALID_CHECK_DIGIT', 'Título de Eleitor check digits are invalid', parts.ufCode);\n }\n\n const uf = resolveUf(parts.ufCode);\n const success: Extract<TituloEleitorValidationResult, { ok: true }> = {\n ok: true,\n value: brandTituloEleitor(stripped),\n format: 'numeric',\n ufCode: parts.ufCode,\n };\n if (uf !== undefined) {\n success.uf = uf;\n } else if (parts.ufCode === TITULO_ELEITOR_EXTERIOR_UF_CODE) {\n success.exterior = true;\n }\n return success;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/titulo-eleitor/constants.ts","../src/core/titulo-eleitor/check-digits.ts","../src/core/titulo-eleitor/parse.ts","../src/core/titulo-eleitor/index.ts"],"names":[],"mappings":"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","file":"chunk-Q2CFVQ2U.js","sourcesContent":["/**\n * Título de Eleitor constants — modulo 11 (TSE Res. 20.132/1998 + algorithm cross-checks).\n * @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998 — Art. 10 (structure, mod 11)\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador — weights + SP/MG rule\n * @see http://ghiorzi.org/DVnew.htm#e — algorithm cross-check\n */\nimport type { UfCode } from '../../types/validation-result.js';\n\nexport const TITULO_ELEITOR_DV1_WEIGHTS_8 = [2, 3, 4, 5, 6, 7, 8, 9] as const;\nexport const TITULO_ELEITOR_DV1_WEIGHTS_9 = [9, 2, 3, 4, 5, 6, 7, 8, 9] as const;\nexport const TITULO_ELEITOR_DV2_WEIGHTS = [7, 8, 9] as const;\nexport const TITULO_ELEITOR_SEQUENTIAL_LENGTH = 8;\nexport const TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED = 9;\nexport const TITULO_ELEITOR_LENGTH = 12;\nexport const TITULO_ELEITOR_LENGTH_EXTENDED = 13;\nexport const TITULO_ELEITOR_UF_LENGTH = 2;\nexport const TITULO_ELEITOR_DV_LENGTH = 2;\nexport const TITULO_ELEITOR_MIN_UF_CODE = 1;\nexport const TITULO_ELEITOR_MAX_UF_CODE = 28;\nexport const TITULO_ELEITOR_NUMERIC_PATTERN_12 = /^\\d{12}$/;\nexport const TITULO_ELEITOR_NUMERIC_PATTERN_13 = /^\\d{13}$/;\n\n/** TSE UF codes where remainder 0 maps DV to 1 instead of 0. */\nexport const TITULO_ELEITOR_SPECIAL_UF_CODES = [1, 2] as const;\n\n/** Golden primary — SC (UF=09), Wikipedia PT walkthrough. */\nexport const TITULO_ELEITOR_GOLDEN_PRIMARY = '004356870906';\nexport const TITULO_ELEITOR_GOLDEN_SP_SPECIAL = '000000000116';\nexport const TITULO_ELEITOR_GOLDEN_SP_EXTENDED = '1234567890175';\nexport const TITULO_ELEITOR_GOLDEN_EXTERIOR = '000000012895';\nexport const TITULO_ELEITOR_GOLDEN_MASKED_INPUT = '0043 5687 0906';\n\n/** Normative — Resolução TSE 20.132/1998, Art. 10 (8 seq + 2 UF + 2 DV, mod 11). */\nexport const TITULO_ELEITOR_OFFICIAL_SOURCE_URL =\n 'https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998';\n\n/** Normative — Resolução TSE 23.659/2021 (Cadastro Eleitoral; confirms UF + DV structure). */\nexport const TITULO_ELEITOR_NORMATIVE_SECONDARY_URL =\n 'https://www.tse.jus.br/legislacao/compilada/res/2021/resolucao-no-23-659-de-26-de-outubro-de-2021';\n\n/**\n * Algorithm weights + SP/MG remainder-zero rule — not in TSE resolution text.\n * Community consensus validated empirically (Wikipedia PT worked example).\n */\nexport const TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL =\n 'https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador';\n\n/** Algorithm cross-check — Ghiorzi DV table. */\nexport const TITULO_ELEITOR_ALGORITHM_REF_URL = 'http://ghiorzi.org/DVnew.htm#e';\n\nexport const TITULO_ELEITOR_TSE_PORTAL_URL = 'https://www.tse.jus.br/';\n\nexport const TITULO_ELEITOR_ETITULO_URL =\n 'https://www.tse.jus.br/eleitor/servicos/aplicativo-e-titulo';\n\n/** TSE electoral UF code → Brazilian UF (28 = exterior / ZZ). */\nexport const TITULO_ELEITOR_UF_BY_CODE: Readonly<Record<number, UfCode>> = {\n 1: 'SP',\n 2: 'MG',\n 3: 'RJ',\n 4: 'RS',\n 5: 'BA',\n 6: 'PR',\n 7: 'CE',\n 8: 'PE',\n 9: 'SC',\n 10: 'GO',\n 11: 'MA',\n 12: 'PB',\n 13: 'PA',\n 14: 'ES',\n 15: 'PI',\n 16: 'RN',\n 17: 'AL',\n 18: 'MT',\n 19: 'MS',\n 20: 'DF',\n 21: 'SE',\n 22: 'AM',\n 23: 'RO',\n 24: 'AC',\n 25: 'AP',\n 26: 'RR',\n 27: 'TO',\n};\n\nexport const TITULO_ELEITOR_EXTERIOR_UF_CODE = 28;\n","/**\n * Título de Eleitor check digits — modulo 11 (TSE / Wikipedia PT + Ghiorzi).\n * @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n * @see http://ghiorzi.org/DVnew.htm#e\n */\nimport { weightedSum } from '../cnpj/modulo11.js';\nimport {\n TITULO_ELEITOR_DV1_WEIGHTS_8,\n TITULO_ELEITOR_DV1_WEIGHTS_9,\n TITULO_ELEITOR_DV2_WEIGHTS,\n TITULO_ELEITOR_SPECIAL_UF_CODES,\n} from './constants.js';\n\nfunction digitValues(chars: string): number[] {\n const values: number[] = [];\n for (let i = 0; i < chars.length; i++) {\n values.push(Number(chars.charAt(i)));\n }\n return values;\n}\n\nfunction isSpecialUf(ufCode: number): boolean {\n return (TITULO_ELEITOR_SPECIAL_UF_CODES as readonly number[]).includes(ufCode);\n}\n\nexport function resolveTituloEleitorCheckDigit(remainder: number, ufCode: number): number {\n if (remainder >= 10) {\n return 0;\n }\n if (remainder === 0 && isSpecialUf(ufCode)) {\n return 1;\n }\n return remainder;\n}\n\nexport function computeTituloEleitorFirstCheckDigit(sequential: string, ufCode: number): number {\n const weights =\n sequential.length === 8 ? TITULO_ELEITOR_DV1_WEIGHTS_8 : TITULO_ELEITOR_DV1_WEIGHTS_9;\n const remainder = weightedSum(digitValues(sequential), weights) % 11;\n return resolveTituloEleitorCheckDigit(remainder, ufCode);\n}\n\nexport function computeTituloEleitorSecondCheckDigit(\n ufDigits: string,\n firstDv: number,\n ufCode: number,\n): number {\n const uf1 = Number(ufDigits.charAt(0));\n const uf2 = Number(ufDigits.charAt(1));\n const remainder = weightedSum([uf1, uf2, firstDv], TITULO_ELEITOR_DV2_WEIGHTS) % 11;\n return resolveTituloEleitorCheckDigit(remainder, ufCode);\n}\n\nexport function computeTituloEleitorCheckDigits(\n sequential: string,\n ufDigits: string,\n ufCode: number,\n): string {\n const dv1 = computeTituloEleitorFirstCheckDigit(sequential, ufCode);\n const dv2 = computeTituloEleitorSecondCheckDigit(ufDigits, dv1, ufCode);\n return `${String(dv1)}${String(dv2)}`;\n}\n","import {\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,\n TITULO_ELEITOR_SPECIAL_UF_CODES,\n} from './constants.js';\n\nexport type TituloEleitorParts = {\n sequential: string;\n ufDigits: string;\n ufCode: number;\n checkDigits: string;\n};\n\nexport function parseTituloEleitorParts(stripped: string): TituloEleitorParts | null {\n if (stripped.length === TITULO_ELEITOR_LENGTH) {\n return {\n sequential: stripped.slice(0, TITULO_ELEITOR_SEQUENTIAL_LENGTH),\n ufDigits: stripped.slice(TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_LENGTH - 2),\n ufCode: Number(stripped.slice(TITULO_ELEITOR_SEQUENTIAL_LENGTH, TITULO_ELEITOR_LENGTH - 2)),\n checkDigits: stripped.slice(TITULO_ELEITOR_LENGTH - 2),\n };\n }\n\n if (stripped.length === TITULO_ELEITOR_LENGTH_EXTENDED) {\n const ufDigits = stripped.slice(\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED + 2,\n );\n const ufCode = Number(ufDigits);\n if (!(TITULO_ELEITOR_SPECIAL_UF_CODES as readonly number[]).includes(ufCode)) {\n return null;\n }\n return {\n sequential: stripped.slice(0, TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED),\n ufDigits,\n ufCode,\n checkDigits: stripped.slice(TITULO_ELEITOR_LENGTH_EXTENDED - 2),\n };\n }\n\n return null;\n}\n","/**\n * Título de Eleitor validation — modulo 11 (TSE Res. 20.132/1998 + algorithm cross-checks).\n * @see https://www.tse.jus.br/legislacao/compilada/res/1998/resolucao-no-20-132-de-19-de-marco-de-1998\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n * @see http://ghiorzi.org/DVnew.htm#e\n */\nimport { stripTituloEleitor } from '../../strip/index.js';\nimport type { TituloEleitorValidationResult, UfCode } from '../../types/validation-result.js';\nimport { brandTituloEleitor } from '../../types/validation-result.js';\nimport { computeTituloEleitorCheckDigits } from './check-digits.js';\nimport {\n TITULO_ELEITOR_EXTERIOR_UF_CODE,\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_MAX_UF_CODE,\n TITULO_ELEITOR_MIN_UF_CODE,\n TITULO_ELEITOR_UF_BY_CODE,\n} from './constants.js';\nimport { parseTituloEleitorParts } from './parse.js';\n\nexport {\n TITULO_ELEITOR_ALGORITHM_REF_URL,\n TITULO_ELEITOR_ALGORITHM_WEIGHTS_REF_URL,\n TITULO_ELEITOR_DV1_WEIGHTS_8,\n TITULO_ELEITOR_DV1_WEIGHTS_9,\n TITULO_ELEITOR_DV2_WEIGHTS,\n TITULO_ELEITOR_ETITULO_URL,\n TITULO_ELEITOR_EXTERIOR_UF_CODE,\n TITULO_ELEITOR_GOLDEN_EXTERIOR,\n TITULO_ELEITOR_GOLDEN_MASKED_INPUT,\n TITULO_ELEITOR_GOLDEN_PRIMARY,\n TITULO_ELEITOR_GOLDEN_SP_EXTENDED,\n TITULO_ELEITOR_GOLDEN_SP_SPECIAL,\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_NORMATIVE_SECONDARY_URL,\n TITULO_ELEITOR_NUMERIC_PATTERN_12,\n TITULO_ELEITOR_NUMERIC_PATTERN_13,\n TITULO_ELEITOR_OFFICIAL_SOURCE_URL,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH,\n TITULO_ELEITOR_SEQUENTIAL_LENGTH_EXTENDED,\n TITULO_ELEITOR_SPECIAL_UF_CODES,\n TITULO_ELEITOR_TSE_PORTAL_URL,\n TITULO_ELEITOR_UF_BY_CODE,\n} from './constants.js';\n\ntype FailedResult = Extract<TituloEleitorValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, ufCode?: number): FailedResult {\n if (ufCode === undefined) {\n return { ok: false, code, message };\n }\n return { ok: false, code, message, ufCode };\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 isValidUfCode(ufCode: number): boolean {\n return ufCode >= TITULO_ELEITOR_MIN_UF_CODE && ufCode <= TITULO_ELEITOR_MAX_UF_CODE;\n}\n\nfunction resolveUf(ufCode: number): UfCode | undefined {\n return TITULO_ELEITOR_UF_BY_CODE[ufCode];\n}\n\ntype StructureResult =\n | { ok: false; error: FailedResult }\n | { ok: true; parts: NonNullable<ReturnType<typeof parseTituloEleitorParts>> };\n\nfunction validateStructure(input: string, stripped: string): StructureResult {\n if (stripped.length === 0) {\n return { ok: false, error: failure('EMPTY_INPUT', 'Título de Eleitor input is empty') };\n }\n\n if (/[^0-9\\s]/.test(input.replace(/\\s/g, ''))) {\n return { ok: false, error: failure('INVALID_CHARACTER', 'Título de Eleitor contains invalid characters') };\n }\n\n if (stripped.length !== TITULO_ELEITOR_LENGTH && stripped.length !== TITULO_ELEITOR_LENGTH_EXTENDED) {\n return {\n ok: false,\n error: failure(\n 'INVALID_LENGTH',\n `Título de Eleitor must have ${TITULO_ELEITOR_LENGTH} or ${TITULO_ELEITOR_LENGTH_EXTENDED} digits after normalization`,\n ),\n };\n }\n\n const parts = parseTituloEleitorParts(stripped);\n if (!parts) {\n return {\n ok: false,\n error: failure(\n 'UNSUPPORTED_FORMAT',\n `13-digit Título de Eleitor is only valid for SP (01) or MG (02)`,\n ),\n };\n }\n\n if (!isValidUfCode(parts.ufCode)) {\n return {\n ok: false,\n error: failure(\n 'KNOWN_INVALID_PATTERN',\n `Título de Eleitor UF code ${parts.ufDigits} is not a valid TSE electoral code`,\n parts.ufCode,\n ),\n };\n }\n\n if (hasRepeatedDigits(stripped)) {\n return {\n ok: false,\n error: failure('KNOWN_INVALID_PATTERN', 'Título de Eleitor with all identical digits is invalid'),\n };\n }\n\n return { ok: true, parts };\n}\n\nfunction isValidTituloEleitorChecksum(parts: {\n sequential: string;\n ufDigits: string;\n ufCode: number;\n checkDigits: string;\n}): boolean {\n const expected = computeTituloEleitorCheckDigits(parts.sequential, parts.ufDigits, parts.ufCode);\n return parts.checkDigits === expected;\n}\n\nexport function isValidTituloEleitor(input: string): boolean {\n return validateTituloEleitor(input).ok;\n}\n\nexport function validateTituloEleitor(input: string): TituloEleitorValidationResult {\n const stripped = stripTituloEleitor(input);\n const structure = validateStructure(input, stripped);\n if (!structure.ok) {\n return structure.error;\n }\n\n const { parts } = structure;\n\n if (!isValidTituloEleitorChecksum(parts)) {\n return failure('INVALID_CHECK_DIGIT', 'Título de Eleitor check digits are invalid', parts.ufCode);\n }\n\n const uf = resolveUf(parts.ufCode);\n const success: Extract<TituloEleitorValidationResult, { ok: true }> = {\n ok: true,\n value: brandTituloEleitor(stripped),\n format: 'numeric',\n ufCode: parts.ufCode,\n };\n if (uf !== undefined) {\n success.uf = uf;\n } else if (parts.ufCode === TITULO_ELEITOR_EXTERIOR_UF_CODE) {\n success.exterior = true;\n }\n return success;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { stripRenavam } from './chunk-YYHS5WQN.js';
2
2
  import { weightedSum } from './chunk-OTZHMJYE.js';
3
- import { brandRenavam } from './chunk-4NFEM2SU.js';
3
+ import { brandRenavam } from './chunk-EMZCVV5Y.js';
4
4
 
5
5
  // src/core/renavam/constants.ts
6
6
  var RENAVAM_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
@@ -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-GAU2MGUQ.js.map
86
- //# sourceMappingURL=chunk-GAU2MGUQ.js.map
85
+ //# sourceMappingURL=chunk-QKAXRXU5.js.map
86
+ //# sourceMappingURL=chunk-QKAXRXU5.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":";;;;;AAQO,IAAM,kBAAA,GAAqB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC;AACxD,IAAM,cAAA,GAAiB;AACvB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,uBAAA,GAA0B;AAGhC,IAAM,sBAAA,GAAyB;AAC/B,IAAM,wBAAA,GAA2B;AACjC,IAAM,4BAAA,GAA+B;AACrC,IAAM,sBAAA,GAAyB;AAG/B,IAAM,yBAAA,GAA4B;AAElC,IAAM,2BAAA,GACX;AAGK,IAAM,6BAAA,GACX;;;ACnBF,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,OAAO,IAAI,CAAA;AACpB;AAEO,SAAS,0BAA0B,IAAA,EAAsB;AAC9D,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,CAAE,IAAI,UAAU,CAAA;AAC5C,EAAA,OAAO,WAAA,CAAY,QAAQ,kBAAkB,CAAA;AAC/C;AAEO,SAAS,yBAAyB,IAAA,EAAsB;AAC7D,EAAA,MAAM,SAAA,GAAY,yBAAA,CAA0B,IAAI,CAAA,GAAI,EAAA;AACpD,EAAA,IAAI,KAAK,EAAA,GAAK,SAAA;AACd,EAAA,IAAI,KAAK,CAAA,EAAG;AACV,IAAA,EAAA,GAAK,CAAA;AAAA,EACP;AACA,EAAA,OAAO,EAAA;AACT;;;ACGA,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,KAAA,EAAO;AACtB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,uBAAuB,QAAA,EAA2B;AACzD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,mBAAmB,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,wBAAA,CAAyB,IAAI,CAAC,CAAA;AACtD,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,mBAAmB,CAAA,KAAM,QAAA;AAClD;AAEA,SAAS,iBAAA,CAAkB,OAAe,QAAA,EAAuC;AAC/E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,eAAe,wBAAwB,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,OAAA,CAAQ,qBAAqB,qCAAqC,CAAA;AAAA,EAC3E;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,cAAA,EAAgB;AACtC,IAAA,OAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAA,kBAAA,EAAqB,cAAc,CAAA,2BAAA,CAA6B,CAAA;AAAA,EACnG;AAEA,EAAA,IAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAC/B,IAAA,OAAO,OAAA,CAAQ,yBAAyB,8CAA8C,CAAA;AAAA,EACxF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,CAAE,EAAA;AAChC;AAEO,SAAS,gBAAgB,KAAA,EAA0C;AACxE,EAAA,MAAM,QAAA,GAAW,aAAa,KAAK,CAAA;AACnC,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AACpD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,IAAI,sBAAA,CAAuB,QAAQ,CAAA,EAAG;AACpC,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,aAAa,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAAA,EACtE;AAEA,EAAA,OAAO,OAAA,CAAQ,uBAAuB,gCAAgC,CAAA;AACxE","file":"chunk-GAU2MGUQ.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-QKAXRXU5.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,4 +1,4 @@
1
- import { validateCartaoCredito, applyCartaoCreditoMask } from './chunk-VDCITFZG.js';
1
+ import { validateCartaoCredito, applyCartaoCreditoMask } from './chunk-2ZWBFVYY.js';
2
2
 
3
3
  // src/format/cartao-credito.ts
4
4
  function formatCartaoCredito(input) {
@@ -10,5 +10,5 @@ function formatCartaoCredito(input) {
10
10
  }
11
11
 
12
12
  export { formatCartaoCredito };
13
- //# sourceMappingURL=chunk-OWD47AWI.js.map
14
- //# sourceMappingURL=chunk-OWD47AWI.js.map
13
+ //# sourceMappingURL=chunk-QZPKTG4A.js.map
14
+ //# sourceMappingURL=chunk-QZPKTG4A.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/format/cartao-credito.ts"],"names":[],"mappings":";;;AAIO,SAAS,oBAAoB,KAAA,EAA6B;AAC/D,EAAA,MAAM,MAAA,GAAS,sBAAsB,KAAK,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,sBAAA,CAAuB,MAAA,CAAO,KAAK,CAAA,EAAE;AACrE","file":"chunk-OWD47AWI.js","sourcesContent":["import { applyCartaoCreditoMask } from '../core/cartao-credito/mask.js';\nimport { validateCartaoCredito } from '../core/cartao-credito/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCartaoCredito(input: string): FormatResult {\n const result = validateCartaoCredito(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCartaoCreditoMask(result.value) };\n}\n"]}
1
+ {"version":3,"sources":["../src/format/cartao-credito.ts"],"names":[],"mappings":";;;AAIO,SAAS,oBAAoB,KAAA,EAA6B;AAC/D,EAAA,MAAM,MAAA,GAAS,sBAAsB,KAAK,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,sBAAA,CAAuB,MAAA,CAAO,KAAK,CAAA,EAAE;AACrE","file":"chunk-QZPKTG4A.js","sourcesContent":["import { applyCartaoCreditoMask } from '../core/cartao-credito/mask.js';\nimport { validateCartaoCredito } from '../core/cartao-credito/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCartaoCredito(input: string): FormatResult {\n const result = validateCartaoCredito(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCartaoCreditoMask(result.value) };\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { applyCnpjMask } from './chunk-3OTYX7QX.js';
2
- import { validateCnpj } from './chunk-2M4RVHRO.js';
1
+ import { applyCnpjMask } from './chunk-4T2ZBJFM.js';
2
+ import { validateCnpj } from './chunk-MLUDCL3P.js';
3
3
 
4
4
  // src/format/cnpj.ts
5
5
  function formatCnpj(input) {
@@ -17,5 +17,5 @@ function formatCnpjAlphanumeric(input) {
17
17
  }
18
18
 
19
19
  export { formatCnpj, formatCnpjAlphanumeric, formatCnpjNumeric };
20
- //# sourceMappingURL=chunk-URNYB2CC.js.map
21
- //# sourceMappingURL=chunk-URNYB2CC.js.map
20
+ //# sourceMappingURL=chunk-RNI5G42M.js.map
21
+ //# sourceMappingURL=chunk-RNI5G42M.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/format/cnpj.ts"],"names":[],"mappings":";;;;AAIO,SAAS,WAAW,KAAA,EAA6B;AACtD,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,aAAA,CAAc,MAAA,CAAO,KAAK,CAAA,EAAE;AAC5D;AAEO,SAAS,kBAAkB,KAAA,EAA6B;AAC7D,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;AAEO,SAAS,uBAAuB,KAAA,EAA6B;AAClE,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB","file":"chunk-URNYB2CC.js","sourcesContent":["import { applyCnpjMask } from '../core/cnpj/mask.js';\nimport { validateCnpj } from '../core/cnpj/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCnpj(input: string): FormatResult {\n const result = validateCnpj(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCnpjMask(result.value) };\n}\n\nexport function formatCnpjNumeric(input: string): FormatResult {\n return formatCnpj(input);\n}\n\nexport function formatCnpjAlphanumeric(input: string): FormatResult {\n return formatCnpj(input);\n}\n"]}
1
+ {"version":3,"sources":["../src/format/cnpj.ts"],"names":[],"mappings":";;;;AAIO,SAAS,WAAW,KAAA,EAA6B;AACtD,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,aAAA,CAAc,MAAA,CAAO,KAAK,CAAA,EAAE;AAC5D;AAEO,SAAS,kBAAkB,KAAA,EAA6B;AAC7D,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;AAEO,SAAS,uBAAuB,KAAA,EAA6B;AAClE,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB","file":"chunk-RNI5G42M.js","sourcesContent":["import { applyCnpjMask } from '../core/cnpj/mask.js';\nimport { validateCnpj } from '../core/cnpj/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCnpj(input: string): FormatResult {\n const result = validateCnpj(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCnpjMask(result.value) };\n}\n\nexport function formatCnpjNumeric(input: string): FormatResult {\n return formatCnpj(input);\n}\n\nexport function formatCnpjAlphanumeric(input: string): FormatResult {\n return formatCnpj(input);\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { validatePixKey } from './chunk-ZZN5JNVJ.js';
2
- import { brandBrCodePayload } from './chunk-4NFEM2SU.js';
1
+ import { validatePixKey } from './chunk-7EMUKPPG.js';
2
+ import { brandBrCodePayload } from './chunk-EMZCVV5Y.js';
3
3
 
4
4
  // src/core/brcode/constants.ts
5
5
  var BRCODE_OFFICIAL_SOURCE_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf";
@@ -279,5 +279,5 @@ function validateBrCode(input) {
279
279
  }
280
280
 
281
281
  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 };
282
- //# sourceMappingURL=chunk-37IHHQKK.js.map
283
- //# sourceMappingURL=chunk-37IHHQKK.js.map
282
+ //# sourceMappingURL=chunk-ROU5ZHN7.js.map
283
+ //# sourceMappingURL=chunk-ROU5ZHN7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/brcode/constants.ts","../src/core/brcode/crc16.ts","../src/core/brcode/tlv.ts","../src/core/brcode/parse.ts","../src/core/brcode/build-static.ts","../src/core/brcode/index.ts"],"names":[],"mappings":"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","file":"chunk-37IHHQKK.js","sourcesContent":["/** Bacen Manual BR Code — EMV-QRCPS-MPM TLV + CRC16-CCITT */\nexport const BRCODE_OFFICIAL_SOURCE_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf';\n\nexport const BRCODE_PIX_INITIATION_MANUAL_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf';\n\nexport const BRCODE_PAYLOAD_FORMAT_INDICATOR = '01';\n\nexport const BRCODE_PIX_GUI = 'br.gov.bcb.pix';\n\nexport const BRCODE_COUNTRY_CODE = 'BR';\n\nexport const BRCODE_CURRENCY_BRL = '986';\n\nexport const BRCODE_CRC_TAG = '63';\n\nexport const BRCODE_CRC_LENGTH = 4;\n\n/** Manual de Padrões PIX — static QR, EVP key (CRC 1D3D). */\nexport const BRCODE_GOLDEN_STATIC_EVP =\n '00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-4266554400005204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***63041D3D';\n\n/** Manual de Padrões PIX — dynamic QR with amount (CRC 7309). */\nexport const BRCODE_GOLDEN_DYNAMIC_URL =\n '00020101021226730014br.gov.bcb.pix2551pix.example.com/v2/8b3da2f39a4140d1a91abd93113bd4415204000053039865406123.455802BR5913Fulano de Tal6008BRASILIA62190515RP12345678-201963047309';\n\n/** Manual BR Code — composite payload with PIX + other arranjos (CRC AD38). */\nexport const BRCODE_GOLDEN_COMPOSITE =\n '00020104141234567890123426580014BR.GOV.BCB.PIX0136123e4567-e12b-12d1-a456-42665544000027300012BR.COM.OUTRO011001234567895204000053039865406123.455802BR5917NOME DO RECEBEDOR6008BRASILIA61087007490062190515RP12345678-201980390012BR.COM.OUTRO01190123.ABCD.3456.WXYZ6304AD38';\n\n/** Golden CPF PIX key 12345678909 — CRC computed per manual algorithm. */\nexport const BRCODE_GOLDEN_STATIC_CPF =\n '00020126330014br.gov.bcb.pix0111123456789095204000053039865802BR5917NOME DO RECEBEDOR6009SAO PAULO62070503***6304258E';\n\n/** Golden email pix@bcb.gov.br — CRC computed per manual algorithm. */\nexport const BRCODE_GOLDEN_STATIC_EMAIL =\n '00020126360014br.gov.bcb.pix0114pix@bcb.gov.br5204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***6304A7E9';\n","import { BRCODE_CRC_LENGTH, BRCODE_CRC_TAG } from './constants.js';\n\n/** CRC16-CCITT-FALSE — polynomial 0x1021, initial 0xFFFF (Bacen Manual BR Code). */\nexport function computeCrc16Ccitt(payload: string): string {\n let crc = 0xffff;\n\n for (let i = 0; i < payload.length; i++) {\n crc ^= payload.charCodeAt(i) << 8;\n for (let bit = 0; bit < 8; bit++) {\n if ((crc & 0x8000) !== 0) {\n crc = ((crc << 1) ^ 0x1021) & 0xffff;\n } else {\n crc = (crc << 1) & 0xffff;\n }\n }\n }\n\n return crc.toString(16).toUpperCase().padStart(BRCODE_CRC_LENGTH, '0');\n}\n\nexport function verifyBrCodeCrc(payload: string): { ok: true } | { ok: false; message: string } {\n if (payload.length < BRCODE_CRC_LENGTH + 4) {\n return { ok: false, message: 'BR Code payload is too short for CRC validation' };\n }\n\n const providedCrc = payload.slice(-BRCODE_CRC_LENGTH);\n if (!/^[0-9A-Fa-f]{4}$/.test(providedCrc)) {\n return { ok: false, message: 'BR Code CRC must be 4 hexadecimal characters' };\n }\n\n const body = payload.slice(0, -BRCODE_CRC_LENGTH);\n if (!body.endsWith(`${BRCODE_CRC_TAG}${String(BRCODE_CRC_LENGTH).padStart(2, '0')}`)) {\n return { ok: false, message: 'BR Code payload must end with CRC tag 63 before checksum' };\n }\n\n const expected = computeCrc16Ccitt(body);\n if (providedCrc.toUpperCase() !== expected) {\n return { ok: false, message: 'BR Code CRC16-CCITT checksum is invalid' };\n }\n\n return { ok: true };\n}\n","export type TlvField = {\n id: string;\n value: string;\n};\n\nexport type TlvParseFailure = {\n ok: false;\n message: string;\n};\n\nexport type TlvParseSuccess = {\n ok: true;\n fields: TlvField[];\n};\n\nexport type TlvParseResult = TlvParseSuccess | TlvParseFailure;\n\nfunction tlvFailure(message: string): TlvParseFailure {\n return { ok: false, message };\n}\n\nexport function parseTlvSequence(data: string): TlvParseResult {\n const fields: TlvField[] = [];\n let offset = 0;\n\n while (offset < data.length) {\n if (data.length - offset < 4) {\n return tlvFailure('TLV sequence is incomplete');\n }\n\n const id = data.slice(offset, offset + 2);\n const lengthRaw = data.slice(offset + 2, offset + 4);\n const length = Number.parseInt(lengthRaw, 10);\n\n if (!/^\\d{2}$/.test(lengthRaw) || Number.isNaN(length)) {\n return tlvFailure(`TLV length is not numeric for id ${id}`);\n }\n\n offset += 4;\n\n if (data.length - offset < length) {\n return tlvFailure(`TLV value for id ${id} exceeds payload length`);\n }\n\n const value = data.slice(offset, offset + length);\n offset += length;\n fields.push({ id, value });\n }\n\n return { ok: true, fields };\n}\n\nexport function findTlvField(fields: TlvField[], id: string): string | undefined {\n return fields.find((field) => field.id === id)?.value;\n}\n\nexport function findPixMerchantAccount(\n fields: TlvField[],\n): { value: string; nestedFields: TlvField[] } | undefined {\n for (const field of fields) {\n if (field.id !== '26') {\n continue;\n }\n const nested = parseTlvSequence(field.value);\n if (!nested.ok) {\n continue;\n }\n const gui = findTlvField(nested.fields, '00');\n if (gui?.toLowerCase() === 'br.gov.bcb.pix') {\n return { value: field.value, nestedFields: nested.fields };\n }\n }\n return undefined;\n}\n","import { validatePixKey } from '../pix/index.js';\nimport type { PixKey, PixKeyType, ValidationErrorCode } from '../../types/validation-result.js';\nimport { BRCODE_COUNTRY_CODE, BRCODE_CRC_LENGTH, BRCODE_CRC_TAG, BRCODE_PAYLOAD_FORMAT_INDICATOR } from './constants.js';\nimport { verifyBrCodeCrc } from './crc16.js';\nimport { findPixMerchantAccount, findTlvField, parseTlvSequence, type TlvField } from './tlv.js';\n\nexport type BrCodeParsedFields = {\n merchantName: string;\n merchantCity: string;\n amount?: string;\n txid?: string;\n pixKey?: PixKey;\n pixKeyType?: PixKeyType;\n pixInitiationUrl?: string;\n};\n\nexport type BrCodeParseFailure = {\n ok: false;\n code: ValidationErrorCode;\n message: string;\n};\n\nexport type BrCodeParseSuccess = {\n ok: true;\n payload: string;\n fields: BrCodeParsedFields;\n};\n\nexport type BrCodeParseResult = BrCodeParseSuccess | BrCodeParseFailure;\n\nfunction failure(\n code: BrCodeParseFailure['code'],\n message: string,\n): BrCodeParseFailure {\n return { ok: false, code, message };\n}\n\nexport function normalizeBrCodePayload(input: string): string {\n return input.trim();\n}\n\nfunction extractPixAccount(\n nestedFields: TlvField[],\n): { ok: true; pixKey?: string; pixInitiationUrl?: string } | BrCodeParseFailure {\n const pixKey = findTlvField(nestedFields, '01');\n const pixInitiationUrl = findTlvField(nestedFields, '25');\n\n if (!pixKey && !pixInitiationUrl) {\n return failure('UNSUPPORTED_FORMAT', 'PIX merchant account must include key (01) or initiation URL (25)');\n }\n\n return { ok: true, pixKey, pixInitiationUrl };\n}\n\nfunction extractTxid(tag62: string | undefined): string | undefined {\n if (!tag62) {\n return undefined;\n }\n const nested = parseTlvSequence(tag62);\n if (!nested.ok) {\n return undefined;\n }\n return findTlvField(nested.fields, '05');\n}\n\nfunction parseFields(rootFields: TlvField[]): BrCodeParseSuccess | BrCodeParseFailure {\n const formatIndicator = findTlvField(rootFields, '00');\n if (formatIndicator !== BRCODE_PAYLOAD_FORMAT_INDICATOR) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `BR Code payload format indicator must be ${BRCODE_PAYLOAD_FORMAT_INDICATOR}`,\n );\n }\n\n const merchantAccount = findPixMerchantAccount(rootFields);\n if (!merchantAccount) {\n return failure('UNSUPPORTED_FORMAT', 'BR Code payload must include PIX merchant account (tag 26)');\n }\n\n const pixAccount = extractPixAccount(merchantAccount.nestedFields);\n if (!pixAccount.ok) {\n return pixAccount;\n }\n\n const countryCode = findTlvField(rootFields, '58');\n if (countryCode !== BRCODE_COUNTRY_CODE) {\n return failure('UNSUPPORTED_FORMAT', `BR Code country code must be ${BRCODE_COUNTRY_CODE}`);\n }\n\n const merchantName = findTlvField(rootFields, '59');\n const merchantCity = findTlvField(rootFields, '60');\n if (!merchantName || !merchantCity) {\n return failure('UNSUPPORTED_FORMAT', 'BR Code payload must include merchant name (59) and city (60)');\n }\n\n const amount = findTlvField(rootFields, '54');\n const txid = extractTxid(findTlvField(rootFields, '62'));\n\n let pixKeyType: PixKeyType | undefined;\n let pixKey: PixKey | undefined;\n\n if (pixAccount.pixKey) {\n const keyResult = validatePixKey(pixAccount.pixKey);\n if (!keyResult.ok) {\n return failure(keyResult.code, keyResult.message);\n }\n pixKey = keyResult.value;\n pixKeyType = keyResult.keyType;\n }\n\n return {\n ok: true,\n payload: '',\n fields: {\n merchantName,\n merchantCity,\n ...(amount ? { amount } : {}),\n ...(txid ? { txid } : {}),\n ...(pixKey ? { pixKey, pixKeyType } : {}),\n ...(pixAccount.pixInitiationUrl ? { pixInitiationUrl: pixAccount.pixInitiationUrl } : {}),\n },\n };\n}\n\nexport function parseBrCodePayload(input: string): BrCodeParseResult {\n const normalized = normalizeBrCodePayload(input);\n\n if (normalized.length === 0) {\n return failure('EMPTY_INPUT', 'BR Code payload is empty');\n }\n\n if (!/^[\\x20-\\x7E]+$/.test(normalized)) {\n return failure('INVALID_CHARACTER', 'BR Code payload contains invalid characters');\n }\n\n const crc = verifyBrCodeCrc(normalized);\n if (!crc.ok) {\n return failure('INVALID_CHECK_DIGIT', crc.message);\n }\n\n const withoutCrc = normalized.slice(0, -BRCODE_CRC_LENGTH);\n const crcTagHeader = `${BRCODE_CRC_TAG}${String(BRCODE_CRC_LENGTH).padStart(2, '0')}`;\n const tlv = parseTlvSequence(withoutCrc.slice(0, -crcTagHeader.length));\n if (!tlv.ok) {\n return failure('UNSUPPORTED_FORMAT', tlv.message);\n }\n\n const parsed = parseFields(tlv.fields);\n if (!parsed.ok) {\n return parsed;\n }\n\n return {\n ok: true,\n payload: normalized,\n fields: parsed.fields,\n };\n}\n","/**\n * Static PIX BR Code builder — EMV TLV + CRC16-CCITT (Bacen Manual BR Code).\n * @see BRCODE_OFFICIAL_SOURCE_URL\n * @see BRCODE_PIX_INITIATION_MANUAL_URL\n */\nimport {\n BRCODE_COUNTRY_CODE,\n BRCODE_CURRENCY_BRL,\n BRCODE_PAYLOAD_FORMAT_INDICATOR,\n BRCODE_PIX_GUI,\n} from './constants.js';\nimport { computeCrc16Ccitt } from './crc16.js';\n\nexport type StaticPixBrCodeInput = {\n pixKey: string;\n merchantName: string;\n merchantCity: string;\n /** Omit for permanent static QR (payer sets amount). Decimal with up to 2 fraction digits. */\n amount?: string;\n /** Defaults to `***` per Manual de Padrões PIX static QR. */\n txid?: string;\n};\n\nfunction encodeTlv(tag: string, value: string): string {\n return `${tag}${value.length.toString().padStart(2, '0')}${value}`;\n}\n\nfunction normalizeAmount(raw: string): string | undefined {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const normalized = trimmed.replace(',', '.');\n if (!/^\\d+(\\.\\d{1,2})?$/.test(normalized)) {\n return undefined;\n }\n return normalized;\n}\n\n/** Build static PIX BR Code EMV payload. Validate output with `validateBrCode`. */\nexport function buildStaticPixBrCode(input: StaticPixBrCodeInput): string {\n const key = input.pixKey.trim();\n const merchantName = input.merchantName.trim().slice(0, 25);\n const merchantCity = input.merchantCity.trim().slice(0, 15).toUpperCase();\n const txid = (input.txid?.trim() || '***').slice(0, 25);\n const amount = input.amount ? normalizeAmount(input.amount) : undefined;\n\n const pixGui = encodeTlv('00', BRCODE_PIX_GUI);\n const pixKeyField = encodeTlv('01', key);\n const merchantAccount = encodeTlv('26', `${pixGui}${pixKeyField}`);\n\n let payload = '';\n payload += encodeTlv('00', BRCODE_PAYLOAD_FORMAT_INDICATOR);\n payload += merchantAccount;\n payload += encodeTlv('52', '0000');\n payload += encodeTlv('53', BRCODE_CURRENCY_BRL);\n if (amount) {\n payload += encodeTlv('54', amount);\n }\n payload += encodeTlv('58', BRCODE_COUNTRY_CODE);\n payload += encodeTlv('59', merchantName);\n payload += encodeTlv('60', merchantCity);\n payload += encodeTlv('62', encodeTlv('05', txid));\n payload += '6304';\n\n return payload + computeCrc16Ccitt(payload);\n}\n","/**\n * BR Code (PIX QR) payload parsing — EMV TLV + CRC16-CCITT.\n * @see https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf\n */\nimport type { BrCodeValidationResult } from '../../types/validation-result.js';\nimport { brandBrCodePayload } from '../../types/validation-result.js';\nimport { parseBrCodePayload } from './parse.js';\n\nexport {\n BRCODE_COUNTRY_CODE,\n BRCODE_CURRENCY_BRL,\n BRCODE_GOLDEN_COMPOSITE,\n BRCODE_GOLDEN_DYNAMIC_URL,\n BRCODE_GOLDEN_STATIC_CPF,\n BRCODE_GOLDEN_STATIC_EMAIL,\n BRCODE_GOLDEN_STATIC_EVP,\n BRCODE_OFFICIAL_SOURCE_URL,\n BRCODE_PAYLOAD_FORMAT_INDICATOR,\n BRCODE_PIX_GUI,\n BRCODE_PIX_INITIATION_MANUAL_URL,\n} from './constants.js';\nexport { computeCrc16Ccitt, verifyBrCodeCrc } from './crc16.js';\nexport { buildStaticPixBrCode } from './build-static.js';\nexport type { StaticPixBrCodeInput } from './build-static.js';\nexport { normalizeBrCodePayload, parseBrCodePayload } from './parse.js';\nexport { findPixMerchantAccount, findTlvField, parseTlvSequence } from './tlv.js';\nexport type { TlvField, TlvParseResult } from './tlv.js';\nexport type { BrCodeParseResult, BrCodeParsedFields } from './parse.js';\n\nexport function isValidBrCode(input: string): boolean {\n return validateBrCode(input).ok;\n}\n\nexport function parseBrCode(input: string): BrCodeValidationResult {\n const parsed = parseBrCodePayload(input);\n if (!parsed.ok) {\n return { ok: false, code: parsed.code, message: parsed.message };\n }\n\n const { fields, payload } = parsed;\n\n return {\n ok: true,\n value: brandBrCodePayload(payload),\n format: 'brcode',\n merchantName: fields.merchantName,\n merchantCity: fields.merchantCity,\n ...(fields.amount ? { amount: fields.amount } : {}),\n ...(fields.txid ? { txid: fields.txid } : {}),\n ...(fields.pixKey && fields.pixKeyType\n ? { pixKey: fields.pixKey, pixKeyType: fields.pixKeyType }\n : {}),\n ...(fields.pixInitiationUrl ? { pixInitiationUrl: fields.pixInitiationUrl } : {}),\n };\n}\n\nexport function validateBrCode(input: string): BrCodeValidationResult {\n const parsed = parseBrCode(input);\n if (!parsed.ok) {\n return parsed;\n }\n\n if (!parsed.pixKey || !parsed.pixKeyType) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'BR Code validation requires a static PIX key (merchant account subfield 01)',\n };\n }\n\n return parsed;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/brcode/constants.ts","../src/core/brcode/crc16.ts","../src/core/brcode/tlv.ts","../src/core/brcode/parse.ts","../src/core/brcode/build-static.ts","../src/core/brcode/index.ts"],"names":[],"mappings":"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","file":"chunk-ROU5ZHN7.js","sourcesContent":["/** Bacen Manual BR Code — EMV-QRCPS-MPM TLV + CRC16-CCITT */\nexport const BRCODE_OFFICIAL_SOURCE_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf';\n\nexport const BRCODE_PIX_INITIATION_MANUAL_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf';\n\nexport const BRCODE_PAYLOAD_FORMAT_INDICATOR = '01';\n\nexport const BRCODE_PIX_GUI = 'br.gov.bcb.pix';\n\nexport const BRCODE_COUNTRY_CODE = 'BR';\n\nexport const BRCODE_CURRENCY_BRL = '986';\n\nexport const BRCODE_CRC_TAG = '63';\n\nexport const BRCODE_CRC_LENGTH = 4;\n\n/** Manual de Padrões PIX — static QR, EVP key (CRC 1D3D). */\nexport const BRCODE_GOLDEN_STATIC_EVP =\n '00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-4266554400005204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***63041D3D';\n\n/** Manual de Padrões PIX — dynamic QR with amount (CRC 7309). */\nexport const BRCODE_GOLDEN_DYNAMIC_URL =\n '00020101021226730014br.gov.bcb.pix2551pix.example.com/v2/8b3da2f39a4140d1a91abd93113bd4415204000053039865406123.455802BR5913Fulano de Tal6008BRASILIA62190515RP12345678-201963047309';\n\n/** Manual BR Code — composite payload with PIX + other arranjos (CRC AD38). */\nexport const BRCODE_GOLDEN_COMPOSITE =\n '00020104141234567890123426580014BR.GOV.BCB.PIX0136123e4567-e12b-12d1-a456-42665544000027300012BR.COM.OUTRO011001234567895204000053039865406123.455802BR5917NOME DO RECEBEDOR6008BRASILIA61087007490062190515RP12345678-201980390012BR.COM.OUTRO01190123.ABCD.3456.WXYZ6304AD38';\n\n/** Golden CPF PIX key 12345678909 — CRC computed per manual algorithm. */\nexport const BRCODE_GOLDEN_STATIC_CPF =\n '00020126330014br.gov.bcb.pix0111123456789095204000053039865802BR5917NOME DO RECEBEDOR6009SAO PAULO62070503***6304258E';\n\n/** Golden email pix@bcb.gov.br — CRC computed per manual algorithm. */\nexport const BRCODE_GOLDEN_STATIC_EMAIL =\n '00020126360014br.gov.bcb.pix0114pix@bcb.gov.br5204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***6304A7E9';\n","import { BRCODE_CRC_LENGTH, BRCODE_CRC_TAG } from './constants.js';\n\n/** CRC16-CCITT-FALSE — polynomial 0x1021, initial 0xFFFF (Bacen Manual BR Code). */\nexport function computeCrc16Ccitt(payload: string): string {\n let crc = 0xffff;\n\n for (let i = 0; i < payload.length; i++) {\n crc ^= payload.charCodeAt(i) << 8;\n for (let bit = 0; bit < 8; bit++) {\n if ((crc & 0x8000) !== 0) {\n crc = ((crc << 1) ^ 0x1021) & 0xffff;\n } else {\n crc = (crc << 1) & 0xffff;\n }\n }\n }\n\n return crc.toString(16).toUpperCase().padStart(BRCODE_CRC_LENGTH, '0');\n}\n\nexport function verifyBrCodeCrc(payload: string): { ok: true } | { ok: false; message: string } {\n if (payload.length < BRCODE_CRC_LENGTH + 4) {\n return { ok: false, message: 'BR Code payload is too short for CRC validation' };\n }\n\n const providedCrc = payload.slice(-BRCODE_CRC_LENGTH);\n if (!/^[0-9A-Fa-f]{4}$/.test(providedCrc)) {\n return { ok: false, message: 'BR Code CRC must be 4 hexadecimal characters' };\n }\n\n const body = payload.slice(0, -BRCODE_CRC_LENGTH);\n if (!body.endsWith(`${BRCODE_CRC_TAG}${String(BRCODE_CRC_LENGTH).padStart(2, '0')}`)) {\n return { ok: false, message: 'BR Code payload must end with CRC tag 63 before checksum' };\n }\n\n const expected = computeCrc16Ccitt(body);\n if (providedCrc.toUpperCase() !== expected) {\n return { ok: false, message: 'BR Code CRC16-CCITT checksum is invalid' };\n }\n\n return { ok: true };\n}\n","export type TlvField = {\n id: string;\n value: string;\n};\n\nexport type TlvParseFailure = {\n ok: false;\n message: string;\n};\n\nexport type TlvParseSuccess = {\n ok: true;\n fields: TlvField[];\n};\n\nexport type TlvParseResult = TlvParseSuccess | TlvParseFailure;\n\nfunction tlvFailure(message: string): TlvParseFailure {\n return { ok: false, message };\n}\n\nexport function parseTlvSequence(data: string): TlvParseResult {\n const fields: TlvField[] = [];\n let offset = 0;\n\n while (offset < data.length) {\n if (data.length - offset < 4) {\n return tlvFailure('TLV sequence is incomplete');\n }\n\n const id = data.slice(offset, offset + 2);\n const lengthRaw = data.slice(offset + 2, offset + 4);\n const length = Number.parseInt(lengthRaw, 10);\n\n if (!/^\\d{2}$/.test(lengthRaw) || Number.isNaN(length)) {\n return tlvFailure(`TLV length is not numeric for id ${id}`);\n }\n\n offset += 4;\n\n if (data.length - offset < length) {\n return tlvFailure(`TLV value for id ${id} exceeds payload length`);\n }\n\n const value = data.slice(offset, offset + length);\n offset += length;\n fields.push({ id, value });\n }\n\n return { ok: true, fields };\n}\n\nexport function findTlvField(fields: TlvField[], id: string): string | undefined {\n return fields.find((field) => field.id === id)?.value;\n}\n\nexport function findPixMerchantAccount(\n fields: TlvField[],\n): { value: string; nestedFields: TlvField[] } | undefined {\n for (const field of fields) {\n if (field.id !== '26') {\n continue;\n }\n const nested = parseTlvSequence(field.value);\n if (!nested.ok) {\n continue;\n }\n const gui = findTlvField(nested.fields, '00');\n if (gui?.toLowerCase() === 'br.gov.bcb.pix') {\n return { value: field.value, nestedFields: nested.fields };\n }\n }\n return undefined;\n}\n","import { validatePixKey } from '../pix/index.js';\nimport type { PixKey, PixKeyType, ValidationErrorCode } from '../../types/validation-result.js';\nimport { BRCODE_COUNTRY_CODE, BRCODE_CRC_LENGTH, BRCODE_CRC_TAG, BRCODE_PAYLOAD_FORMAT_INDICATOR } from './constants.js';\nimport { verifyBrCodeCrc } from './crc16.js';\nimport { findPixMerchantAccount, findTlvField, parseTlvSequence, type TlvField } from './tlv.js';\n\nexport type BrCodeParsedFields = {\n merchantName: string;\n merchantCity: string;\n amount?: string;\n txid?: string;\n pixKey?: PixKey;\n pixKeyType?: PixKeyType;\n pixInitiationUrl?: string;\n};\n\nexport type BrCodeParseFailure = {\n ok: false;\n code: ValidationErrorCode;\n message: string;\n};\n\nexport type BrCodeParseSuccess = {\n ok: true;\n payload: string;\n fields: BrCodeParsedFields;\n};\n\nexport type BrCodeParseResult = BrCodeParseSuccess | BrCodeParseFailure;\n\nfunction failure(\n code: BrCodeParseFailure['code'],\n message: string,\n): BrCodeParseFailure {\n return { ok: false, code, message };\n}\n\nexport function normalizeBrCodePayload(input: string): string {\n return input.trim();\n}\n\nfunction extractPixAccount(\n nestedFields: TlvField[],\n): { ok: true; pixKey?: string; pixInitiationUrl?: string } | BrCodeParseFailure {\n const pixKey = findTlvField(nestedFields, '01');\n const pixInitiationUrl = findTlvField(nestedFields, '25');\n\n if (!pixKey && !pixInitiationUrl) {\n return failure('UNSUPPORTED_FORMAT', 'PIX merchant account must include key (01) or initiation URL (25)');\n }\n\n return { ok: true, pixKey, pixInitiationUrl };\n}\n\nfunction extractTxid(tag62: string | undefined): string | undefined {\n if (!tag62) {\n return undefined;\n }\n const nested = parseTlvSequence(tag62);\n if (!nested.ok) {\n return undefined;\n }\n return findTlvField(nested.fields, '05');\n}\n\nfunction parseFields(rootFields: TlvField[]): BrCodeParseSuccess | BrCodeParseFailure {\n const formatIndicator = findTlvField(rootFields, '00');\n if (formatIndicator !== BRCODE_PAYLOAD_FORMAT_INDICATOR) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `BR Code payload format indicator must be ${BRCODE_PAYLOAD_FORMAT_INDICATOR}`,\n );\n }\n\n const merchantAccount = findPixMerchantAccount(rootFields);\n if (!merchantAccount) {\n return failure('UNSUPPORTED_FORMAT', 'BR Code payload must include PIX merchant account (tag 26)');\n }\n\n const pixAccount = extractPixAccount(merchantAccount.nestedFields);\n if (!pixAccount.ok) {\n return pixAccount;\n }\n\n const countryCode = findTlvField(rootFields, '58');\n if (countryCode !== BRCODE_COUNTRY_CODE) {\n return failure('UNSUPPORTED_FORMAT', `BR Code country code must be ${BRCODE_COUNTRY_CODE}`);\n }\n\n const merchantName = findTlvField(rootFields, '59');\n const merchantCity = findTlvField(rootFields, '60');\n if (!merchantName || !merchantCity) {\n return failure('UNSUPPORTED_FORMAT', 'BR Code payload must include merchant name (59) and city (60)');\n }\n\n const amount = findTlvField(rootFields, '54');\n const txid = extractTxid(findTlvField(rootFields, '62'));\n\n let pixKeyType: PixKeyType | undefined;\n let pixKey: PixKey | undefined;\n\n if (pixAccount.pixKey) {\n const keyResult = validatePixKey(pixAccount.pixKey);\n if (!keyResult.ok) {\n return failure(keyResult.code, keyResult.message);\n }\n pixKey = keyResult.value;\n pixKeyType = keyResult.keyType;\n }\n\n return {\n ok: true,\n payload: '',\n fields: {\n merchantName,\n merchantCity,\n ...(amount ? { amount } : {}),\n ...(txid ? { txid } : {}),\n ...(pixKey ? { pixKey, pixKeyType } : {}),\n ...(pixAccount.pixInitiationUrl ? { pixInitiationUrl: pixAccount.pixInitiationUrl } : {}),\n },\n };\n}\n\nexport function parseBrCodePayload(input: string): BrCodeParseResult {\n const normalized = normalizeBrCodePayload(input);\n\n if (normalized.length === 0) {\n return failure('EMPTY_INPUT', 'BR Code payload is empty');\n }\n\n if (!/^[\\x20-\\x7E]+$/.test(normalized)) {\n return failure('INVALID_CHARACTER', 'BR Code payload contains invalid characters');\n }\n\n const crc = verifyBrCodeCrc(normalized);\n if (!crc.ok) {\n return failure('INVALID_CHECK_DIGIT', crc.message);\n }\n\n const withoutCrc = normalized.slice(0, -BRCODE_CRC_LENGTH);\n const crcTagHeader = `${BRCODE_CRC_TAG}${String(BRCODE_CRC_LENGTH).padStart(2, '0')}`;\n const tlv = parseTlvSequence(withoutCrc.slice(0, -crcTagHeader.length));\n if (!tlv.ok) {\n return failure('UNSUPPORTED_FORMAT', tlv.message);\n }\n\n const parsed = parseFields(tlv.fields);\n if (!parsed.ok) {\n return parsed;\n }\n\n return {\n ok: true,\n payload: normalized,\n fields: parsed.fields,\n };\n}\n","/**\n * Static PIX BR Code builder — EMV TLV + CRC16-CCITT (Bacen Manual BR Code).\n * @see BRCODE_OFFICIAL_SOURCE_URL\n * @see BRCODE_PIX_INITIATION_MANUAL_URL\n */\nimport {\n BRCODE_COUNTRY_CODE,\n BRCODE_CURRENCY_BRL,\n BRCODE_PAYLOAD_FORMAT_INDICATOR,\n BRCODE_PIX_GUI,\n} from './constants.js';\nimport { computeCrc16Ccitt } from './crc16.js';\n\nexport type StaticPixBrCodeInput = {\n pixKey: string;\n merchantName: string;\n merchantCity: string;\n /** Omit for permanent static QR (payer sets amount). Decimal with up to 2 fraction digits. */\n amount?: string;\n /** Defaults to `***` per Manual de Padrões PIX static QR. */\n txid?: string;\n};\n\nfunction encodeTlv(tag: string, value: string): string {\n return `${tag}${value.length.toString().padStart(2, '0')}${value}`;\n}\n\nfunction normalizeAmount(raw: string): string | undefined {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const normalized = trimmed.replace(',', '.');\n if (!/^\\d+(\\.\\d{1,2})?$/.test(normalized)) {\n return undefined;\n }\n return normalized;\n}\n\n/** Build static PIX BR Code EMV payload. Validate output with `validateBrCode`. */\nexport function buildStaticPixBrCode(input: StaticPixBrCodeInput): string {\n const key = input.pixKey.trim();\n const merchantName = input.merchantName.trim().slice(0, 25);\n const merchantCity = input.merchantCity.trim().slice(0, 15).toUpperCase();\n const txid = (input.txid?.trim() || '***').slice(0, 25);\n const amount = input.amount ? normalizeAmount(input.amount) : undefined;\n\n const pixGui = encodeTlv('00', BRCODE_PIX_GUI);\n const pixKeyField = encodeTlv('01', key);\n const merchantAccount = encodeTlv('26', `${pixGui}${pixKeyField}`);\n\n let payload = '';\n payload += encodeTlv('00', BRCODE_PAYLOAD_FORMAT_INDICATOR);\n payload += merchantAccount;\n payload += encodeTlv('52', '0000');\n payload += encodeTlv('53', BRCODE_CURRENCY_BRL);\n if (amount) {\n payload += encodeTlv('54', amount);\n }\n payload += encodeTlv('58', BRCODE_COUNTRY_CODE);\n payload += encodeTlv('59', merchantName);\n payload += encodeTlv('60', merchantCity);\n payload += encodeTlv('62', encodeTlv('05', txid));\n payload += '6304';\n\n return payload + computeCrc16Ccitt(payload);\n}\n","/**\n * BR Code (PIX QR) payload parsing — EMV TLV + CRC16-CCITT.\n * @see https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf\n */\nimport type { BrCodeValidationResult } from '../../types/validation-result.js';\nimport { brandBrCodePayload } from '../../types/validation-result.js';\nimport { parseBrCodePayload } from './parse.js';\n\nexport {\n BRCODE_COUNTRY_CODE,\n BRCODE_CURRENCY_BRL,\n BRCODE_GOLDEN_COMPOSITE,\n BRCODE_GOLDEN_DYNAMIC_URL,\n BRCODE_GOLDEN_STATIC_CPF,\n BRCODE_GOLDEN_STATIC_EMAIL,\n BRCODE_GOLDEN_STATIC_EVP,\n BRCODE_OFFICIAL_SOURCE_URL,\n BRCODE_PAYLOAD_FORMAT_INDICATOR,\n BRCODE_PIX_GUI,\n BRCODE_PIX_INITIATION_MANUAL_URL,\n} from './constants.js';\nexport { computeCrc16Ccitt, verifyBrCodeCrc } from './crc16.js';\nexport { buildStaticPixBrCode } from './build-static.js';\nexport type { StaticPixBrCodeInput } from './build-static.js';\nexport { normalizeBrCodePayload, parseBrCodePayload } from './parse.js';\nexport { findPixMerchantAccount, findTlvField, parseTlvSequence } from './tlv.js';\nexport type { TlvField, TlvParseResult } from './tlv.js';\nexport type { BrCodeParseResult, BrCodeParsedFields } from './parse.js';\n\nexport function isValidBrCode(input: string): boolean {\n return validateBrCode(input).ok;\n}\n\nexport function parseBrCode(input: string): BrCodeValidationResult {\n const parsed = parseBrCodePayload(input);\n if (!parsed.ok) {\n return { ok: false, code: parsed.code, message: parsed.message };\n }\n\n const { fields, payload } = parsed;\n\n return {\n ok: true,\n value: brandBrCodePayload(payload),\n format: 'brcode',\n merchantName: fields.merchantName,\n merchantCity: fields.merchantCity,\n ...(fields.amount ? { amount: fields.amount } : {}),\n ...(fields.txid ? { txid: fields.txid } : {}),\n ...(fields.pixKey && fields.pixKeyType\n ? { pixKey: fields.pixKey, pixKeyType: fields.pixKeyType }\n : {}),\n ...(fields.pixInitiationUrl ? { pixInitiationUrl: fields.pixInitiationUrl } : {}),\n };\n}\n\nexport function validateBrCode(input: string): BrCodeValidationResult {\n const parsed = parseBrCode(input);\n if (!parsed.ok) {\n return parsed;\n }\n\n if (!parsed.pixKey || !parsed.pixKeyType) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'BR Code validation requires a static PIX key (merchant account subfield 01)',\n };\n }\n\n return parsed;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { validatePixKey, applyPixEvpKeyMask, applyPixEmailKeyMask, applyPixPhoneKeyMask, applyPixCnpjKeyMask, applyPixCpfKeyMask } from './chunk-ZZN5JNVJ.js';
1
+ import { validatePixKey, applyPixEvpKeyMask, applyPixEmailKeyMask, applyPixPhoneKeyMask, applyPixCnpjKeyMask, applyPixCpfKeyMask } from './chunk-7EMUKPPG.js';
2
2
 
3
3
  // src/format/pix.ts
4
4
  function applyPixMask(keyType, value) {
@@ -24,5 +24,5 @@ function formatPixKey(input, options) {
24
24
  }
25
25
 
26
26
  export { formatPixKey };
27
- //# sourceMappingURL=chunk-274K6AOM.js.map
28
- //# sourceMappingURL=chunk-274K6AOM.js.map
27
+ //# sourceMappingURL=chunk-RP5UWF2G.js.map
28
+ //# sourceMappingURL=chunk-RP5UWF2G.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/format/pix.ts"],"names":[],"mappings":";;;AAgBA,SAAS,YAAA,CAAa,SAAqB,KAAA,EAAuB;AAChE,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,KAAA;AACH,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA,IAClC,KAAK,OAAA;AACH,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC,KAAK,OAAA;AACH,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC,KAAK,KAAA;AACH,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA;AAErC;AAEO,SAAS,YAAA,CAAa,OAAe,OAAA,EAA+C;AACzF,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,OAAO,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,SAAA,EAAW,aAAa,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3E","file":"chunk-274K6AOM.js","sourcesContent":["/**\n * Format decorator — strip → validate → apply official mask (UC-003).\n * @see docs/use-cases/UC-003-format-document.md\n * @see docs/VALIDATION-RULES.md BR-GLOBAL-002\n */\nimport type { ValidatePixKeyOptions } from '../core/pix/index.js';\nimport { validatePixKey } from '../core/pix/index.js';\nimport {\n applyPixCnpjKeyMask,\n applyPixCpfKeyMask,\n applyPixEmailKeyMask,\n applyPixEvpKeyMask,\n applyPixPhoneKeyMask,\n} from '../core/pix/mask.js';\nimport type { FormatResult, PixKeyType } from '../types/validation-result.js';\n\nfunction applyPixMask(keyType: PixKeyType, value: string): string {\n switch (keyType) {\n case 'cpf':\n return applyPixCpfKeyMask(value);\n case 'cnpj':\n return applyPixCnpjKeyMask(value);\n case 'phone':\n return applyPixPhoneKeyMask(value);\n case 'email':\n return applyPixEmailKeyMask(value);\n case 'evp':\n return applyPixEvpKeyMask(value);\n }\n}\n\nexport function formatPixKey(input: string, options?: ValidatePixKeyOptions): FormatResult {\n const result = validatePixKey(input, options);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n\n return { ok: true, formatted: applyPixMask(result.keyType, result.value) };\n}\n"]}
1
+ {"version":3,"sources":["../src/format/pix.ts"],"names":[],"mappings":";;;AAgBA,SAAS,YAAA,CAAa,SAAqB,KAAA,EAAuB;AAChE,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,KAAA;AACH,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA,IAClC,KAAK,OAAA;AACH,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC,KAAK,OAAA;AACH,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC,KAAK,KAAA;AACH,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA;AAErC;AAEO,SAAS,YAAA,CAAa,OAAe,OAAA,EAA+C;AACzF,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,OAAO,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,SAAA,EAAW,aAAa,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3E","file":"chunk-RP5UWF2G.js","sourcesContent":["/**\n * Format decorator — strip → validate → apply official mask (UC-003).\n * @see docs/use-cases/UC-003-format-document.md\n * @see docs/VALIDATION-RULES.md BR-GLOBAL-002\n */\nimport type { ValidatePixKeyOptions } from '../core/pix/index.js';\nimport { validatePixKey } from '../core/pix/index.js';\nimport {\n applyPixCnpjKeyMask,\n applyPixCpfKeyMask,\n applyPixEmailKeyMask,\n applyPixEvpKeyMask,\n applyPixPhoneKeyMask,\n} from '../core/pix/mask.js';\nimport type { FormatResult, PixKeyType } from '../types/validation-result.js';\n\nfunction applyPixMask(keyType: PixKeyType, value: string): string {\n switch (keyType) {\n case 'cpf':\n return applyPixCpfKeyMask(value);\n case 'cnpj':\n return applyPixCnpjKeyMask(value);\n case 'phone':\n return applyPixPhoneKeyMask(value);\n case 'email':\n return applyPixEmailKeyMask(value);\n case 'evp':\n return applyPixEvpKeyMask(value);\n }\n}\n\nexport function formatPixKey(input: string, options?: ValidatePixKeyOptions): FormatResult {\n const result = validatePixKey(input, options);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n\n return { ok: true, formatted: applyPixMask(result.keyType, result.value) };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { brandLinhaDigitavel } from './chunk-4NFEM2SU.js';
1
+ import { brandLinhaDigitavel } from './chunk-EMZCVV5Y.js';
2
2
 
3
3
  // src/core/boleto/constants.ts
4
4
  var BOLETO_LINHA_LENGTH = 47;
@@ -196,5 +196,5 @@ function validateLinhaDigitavel(input) {
196
196
  }
197
197
 
198
198
  export { BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH, BOLETO_ARRECADACAO_LINHA_LENGTH, BOLETO_ARRECADACAO_OFFICIAL_SOURCE_URL, BOLETO_ARRECADACAO_PRODUCT_ID, BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatLinhaDigitavel, stripLinhaDigitavel, toBoletoSituacaoCode, validateLinhaDigitavel };
199
- //# sourceMappingURL=chunk-QSSKPIG5.js.map
200
- //# sourceMappingURL=chunk-QSSKPIG5.js.map
199
+ //# sourceMappingURL=chunk-SIMI5XYE.js.map
200
+ //# sourceMappingURL=chunk-SIMI5XYE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/boleto/constants.ts","../src/core/boleto/detect-situacao.ts","../src/core/boleto/modulo11.ts","../src/core/boleto/modulo10.ts","../src/core/boleto/convert.ts","../src/core/boleto/detect.ts","../src/core/boleto/mask.ts","../src/core/boleto/linha-digitavel.ts"],"names":["LINHA_MASK_PATTERN"],"mappings":"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","file":"chunk-QSSKPIG5.js","sourcesContent":["/**\n * FEBRABAN bank boleto (cobrança) — linha digitável + código de barras.\n * @see Convenção da Cobrança FB-0061/2021 — Anexos V, VI, IX, X\n * @see https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf\n */\n\nexport const BOLETO_LINHA_LENGTH = 47;\nexport const BOLETO_CODIGO_BARRAS_LENGTH = 44;\nexport const BOLETO_CURRENCY_REAL = '9';\nexport const BOLETO_CODE_ISPB_HOLDER = '988';\nexport const BOLETO_CURRENCY_ISPB = '0';\n\nexport const BOLETO_GOLDEN_LINHA_MASKED =\n '03399.02579 08991.834006 71742.301014 6 14500000099668';\nexport const BOLETO_GOLDEN_LINHA_STRIPPED =\n '03399025790899183400671742301014614500000099668';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS =\n '03396145000000996689025708991834007174230101';\n\nexport const BOLETO_GOLDEN_LINHA_BB_STRIPPED =\n '00191234546789012345767890123457112340000001500';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_BB =\n '00191123400000015001234567890123456789012345';\n\nexport const BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED =\n '98801234516789012345767890123457760746948000112';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2 =\n '98807607469480001121234567890123456789012345';\n\nexport const BOLETO_OFFICIAL_SOURCE_URL =\n 'https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf';\n\nexport const BOLETO_LAYOUTS_PORTAL_URL =\n 'https://portal.febraban.org.br/pagina/3425/33/pt-br/layout-febraban';\n\nexport const BOLETO_ARRECADACAO_LINHA_LENGTH = 48;\nexport const BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH = 44;\nexport const BOLETO_ARRECADACAO_PRODUCT_ID = '8';\n\nexport const BOLETO_ARRECADACAO_OFFICIAL_SOURCE_URL =\n 'https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Layout%20-%20C%C3%B3digo%20de%20Barras%20-%20Vers%C3%A3o%207%20-%2001_03_2023_mn.pdf';\n","/**\n * Situação 1 vs Situação 2 detection (Anexo V §2.3.2).\n * @see BR-BOLETO-011\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_CURRENCY_ISPB,\n BOLETO_CURRENCY_REAL,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type BoletoSituacaoKind = 'situacao-1' | 'situacao-2' | 'unknown';\n\nexport type BoletoSituacaoCode = '1' | '2';\n\nexport function toBoletoSituacaoCode(kind: BoletoSituacaoKind): BoletoSituacaoCode | undefined {\n if (kind === 'situacao-1') {\n return '1';\n }\n if (kind === 'situacao-2') {\n return '2';\n }\n return undefined;\n}\n\nexport function detectBoletoSituacao(stripped: string): BoletoSituacaoKind {\n if (\n stripped.length !== BOLETO_LINHA_LENGTH &&\n stripped.length !== BOLETO_CODIGO_BARRAS_LENGTH\n ) {\n return 'unknown';\n }\n\n if (stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER) {\n if (stripped.charAt(3) === BOLETO_CURRENCY_ISPB) {\n return 'situacao-2';\n }\n return 'unknown';\n }\n\n if (stripped.charAt(3) === BOLETO_CURRENCY_REAL) {\n return 'situacao-1';\n }\n\n return 'unknown';\n}\n","/**\n * Modulo 11 — código de barras general DV (Anexo X).\n */\nexport function computeModulo11BarcodeDv(barcodeWithoutDv: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = barcodeWithoutDv.length - 1; i >= 0; i--) {\n sum += Number(barcodeWithoutDv[i]) * multiplier;\n multiplier = multiplier >= 9 ? 2 : multiplier + 1;\n }\n\n const remainder = sum % 11;\n let dv = 11 - remainder;\n if (dv === 0 || dv === 10 || dv === 11) {\n dv = 1;\n }\n return dv;\n}\n","/**\n * Modulo 10 — linha digitável field DVs (Anexo IX).\n */\nexport function computeModulo10FieldDv(digits: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let product = Number(digits[i]) * multiplier;\n if (product > 9) {\n product = Math.floor(product / 10) + (product % 10);\n }\n sum += product;\n multiplier = multiplier === 2 ? 1 : 2;\n }\n\n const remainder = sum % 10;\n return remainder === 0 ? 0 : 10 - remainder;\n}\n","/**\n * Linha digitável ↔ código de barras conversion (Anexo V §2.3.4).\n * Situação 1 and Situação 2 share the same field permutation; campo 5 semantics differ\n * (fator+valor vs ISPB 14 digits).\n * @see BR-BOLETO-006\n */\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport function convertLinhaToCodigoBarrasDigits(strippedLinha: string): string {\n return (\n strippedLinha.slice(0, 4) +\n strippedLinha[32] +\n strippedLinha.slice(33, BOLETO_LINHA_LENGTH) +\n strippedLinha.slice(4, 9) +\n strippedLinha.slice(10, 20) +\n strippedLinha.slice(21, 31)\n );\n}\n\nexport function convertCodigoBarrasToLinhaDigits(barcode: string): string {\n const field1 = barcode.slice(0, 4) + barcode.slice(19, 24);\n const field2 = barcode.slice(24, 34);\n const field3 = barcode.slice(34, BOLETO_CODIGO_BARRAS_LENGTH);\n const field5 = barcode.slice(5, 9) + barcode.slice(9, 19);\n const dv1 = String(computeModulo10FieldDv(field1));\n const dv2 = String(computeModulo10FieldDv(field2));\n const dv3 = String(computeModulo10FieldDv(field3));\n return field1 + dv1 + field2 + dv2 + field3 + dv3 + barcode[4] + field5;\n}\n","/**\n * Boleto input kind detection — linha digitável (47) vs código de barras (44).\n * @see BR-BOLETO-001\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type DetectedBoletoInputKind = 'linha-digitavel' | 'codigo-barras' | 'arrecadacao' | 'unknown';\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction stripDigits(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nexport function detectBoletoInputKind(input: string): DetectedBoletoInputKind {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return 'unknown';\n }\n\n const digits = stripDigits(trimmed);\n\n if (digits.length === 48 && digits.startsWith('8')) {\n return 'arrecadacao';\n }\n\n if (digits.length === BOLETO_CODIGO_BARRAS_LENGTH && /^\\d+$/.test(digits)) {\n return 'codigo-barras';\n }\n\n if (digits.length === BOLETO_LINHA_LENGTH) {\n if (/^\\d+$/.test(trimmed)) {\n return 'linha-digitavel';\n }\n if (LINHA_MASK_PATTERN.test(trimmed)) {\n return 'linha-digitavel';\n }\n return 'unknown';\n }\n\n return 'unknown';\n}\n","/**\n * Linha digitável display mask — FEBRABAN Anexo IX (BR-BOLETO-008).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport { BOLETO_LINHA_LENGTH } from './constants.js';\n\n/** FEBRABAN typable linha digitável mask (47 digits). */\nexport function applyLinhaDigitavelMask(stripped47: string): string {\n if (stripped47.length !== BOLETO_LINHA_LENGTH) {\n throw new Error(`Linha digitável must have exactly ${BOLETO_LINHA_LENGTH} digits to apply mask`);\n }\n return (\n `${stripped47.slice(0, 5)}.${stripped47.slice(5, 10)} ` +\n `${stripped47.slice(10, 15)}.${stripped47.slice(15, 21)} ` +\n `${stripped47.slice(21, 26)}.${stripped47.slice(26, 32)} ` +\n `${stripped47[32]} ${stripped47.slice(33)}`\n );\n}\n\n/** Backward-compatible alias for applyLinhaDigitavelMask. */\nexport function formatLinhaDigitavel(stripped: string): string {\n return applyLinhaDigitavelMask(stripped);\n}\n","/**\n * Linha digitável validation — modulo 10 field DVs (Anexo IX).\n * @see BR-BOLETO-002, BR-BOLETO-008\n */\nimport type { BoletoSituacao, CobrancaBoletoValidationResult } from '../../types/validation-result.js';\nimport { brandLinhaDigitavel } from '../../types/validation-result.js';\nimport {\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\nimport { convertLinhaToCodigoBarrasDigits } from './convert.js';\nimport { detectBoletoSituacao, toBoletoSituacaoCode } from './detect-situacao.js';\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport { computeModulo11BarcodeDv } from './modulo11.js';\n\nexport { applyLinhaDigitavelMask, formatLinhaDigitavel } from './mask.js';\n\ntype FailedResult = Extract<CobrancaBoletoValidationResult, { ok: false }>;\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, inputKind: 'linha-digitavel' };\n}\n\nexport function stripLinhaDigitavel(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nfunction validateFieldDv(\n fieldDigits: string,\n actualDv: string,\n fieldNumber: 1 | 2 | 3,\n): FailedResult | null {\n const expected = String(computeModulo10FieldDv(fieldDigits));\n if (actualDv !== expected) {\n return failure('INVALID_CHECK_DIGIT', `Linha digitável field ${fieldNumber} check digit is invalid`);\n }\n return null;\n}\n\nexport function validateLinhaDigitavel(input: string): CobrancaBoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Linha digitável input is empty' };\n }\n\n if (!LINHA_MASK_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Linha digitável contains invalid characters');\n }\n\n const stripped = stripLinhaDigitavel(trimmed);\n if (stripped.length !== BOLETO_LINHA_LENGTH) {\n return failure('INVALID_LENGTH', `Linha digitável must have ${BOLETO_LINHA_LENGTH} digits after normalization`);\n }\n\n const situacaoKind = detectBoletoSituacao(stripped);\n if (situacaoKind === 'unknown') {\n const isIspbHolder = stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;\n const message = isIspbHolder\n ? 'ISPB holder boleto (code 988) requires currency indicator 0 (Situação 2)'\n : 'Bank boleto currency code must be 9 (Real) for Situação 1';\n return failure('UNSUPPORTED_FORMAT', message);\n }\n\n const field1Error = validateFieldDv(stripped.slice(0, 9), stripped.charAt(9), 1);\n if (field1Error) {\n return field1Error;\n }\n\n const field2Error = validateFieldDv(stripped.slice(10, 20), stripped.charAt(20), 2);\n if (field2Error) {\n return field2Error;\n }\n\n const field3Error = validateFieldDv(stripped.slice(21, 31), stripped.charAt(31), 3);\n if (field3Error) {\n return field3Error;\n }\n\n const barcode = convertLinhaToCodigoBarrasDigits(stripped);\n const barcodeDvFromMod11 = String(\n computeModulo11BarcodeDv(barcode.slice(0, 4) + barcode.slice(5)),\n );\n\n if (stripped.charAt(32) !== barcodeDvFromMod11) {\n return failure('INVALID_CHECK_DIGIT', 'Linha digitável field 4 (barcode DV) is invalid');\n }\n\n const situacao = toBoletoSituacaoCode(situacaoKind) as BoletoSituacao;\n return {\n ok: true,\n value: brandLinhaDigitavel(stripped),\n inputKind: 'linha-digitavel',\n format: 'linha-digitavel',\n situacao,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/boleto/constants.ts","../src/core/boleto/detect-situacao.ts","../src/core/boleto/modulo11.ts","../src/core/boleto/modulo10.ts","../src/core/boleto/convert.ts","../src/core/boleto/detect.ts","../src/core/boleto/mask.ts","../src/core/boleto/linha-digitavel.ts"],"names":["LINHA_MASK_PATTERN"],"mappings":"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","file":"chunk-SIMI5XYE.js","sourcesContent":["/**\n * FEBRABAN bank boleto (cobrança) — linha digitável + código de barras.\n * @see Convenção da Cobrança FB-0061/2021 — Anexos V, VI, IX, X\n * @see https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf\n */\n\nexport const BOLETO_LINHA_LENGTH = 47;\nexport const BOLETO_CODIGO_BARRAS_LENGTH = 44;\nexport const BOLETO_CURRENCY_REAL = '9';\nexport const BOLETO_CODE_ISPB_HOLDER = '988';\nexport const BOLETO_CURRENCY_ISPB = '0';\n\nexport const BOLETO_GOLDEN_LINHA_MASKED =\n '03399.02579 08991.834006 71742.301014 6 14500000099668';\nexport const BOLETO_GOLDEN_LINHA_STRIPPED =\n '03399025790899183400671742301014614500000099668';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS =\n '03396145000000996689025708991834007174230101';\n\nexport const BOLETO_GOLDEN_LINHA_BB_STRIPPED =\n '00191234546789012345767890123457112340000001500';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_BB =\n '00191123400000015001234567890123456789012345';\n\nexport const BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED =\n '98801234516789012345767890123457760746948000112';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2 =\n '98807607469480001121234567890123456789012345';\n\nexport const BOLETO_OFFICIAL_SOURCE_URL =\n 'https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf';\n\nexport const BOLETO_LAYOUTS_PORTAL_URL =\n 'https://portal.febraban.org.br/pagina/3425/33/pt-br/layout-febraban';\n\nexport const BOLETO_ARRECADACAO_LINHA_LENGTH = 48;\nexport const BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH = 44;\nexport const BOLETO_ARRECADACAO_PRODUCT_ID = '8';\n\nexport const BOLETO_ARRECADACAO_OFFICIAL_SOURCE_URL =\n 'https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Layout%20-%20C%C3%B3digo%20de%20Barras%20-%20Vers%C3%A3o%207%20-%2001_03_2023_mn.pdf';\n","/**\n * Situação 1 vs Situação 2 detection (Anexo V §2.3.2).\n * @see BR-BOLETO-011\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_CURRENCY_ISPB,\n BOLETO_CURRENCY_REAL,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type BoletoSituacaoKind = 'situacao-1' | 'situacao-2' | 'unknown';\n\nexport type BoletoSituacaoCode = '1' | '2';\n\nexport function toBoletoSituacaoCode(kind: BoletoSituacaoKind): BoletoSituacaoCode | undefined {\n if (kind === 'situacao-1') {\n return '1';\n }\n if (kind === 'situacao-2') {\n return '2';\n }\n return undefined;\n}\n\nexport function detectBoletoSituacao(stripped: string): BoletoSituacaoKind {\n if (\n stripped.length !== BOLETO_LINHA_LENGTH &&\n stripped.length !== BOLETO_CODIGO_BARRAS_LENGTH\n ) {\n return 'unknown';\n }\n\n if (stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER) {\n if (stripped.charAt(3) === BOLETO_CURRENCY_ISPB) {\n return 'situacao-2';\n }\n return 'unknown';\n }\n\n if (stripped.charAt(3) === BOLETO_CURRENCY_REAL) {\n return 'situacao-1';\n }\n\n return 'unknown';\n}\n","/**\n * Modulo 11 — código de barras general DV (Anexo X).\n */\nexport function computeModulo11BarcodeDv(barcodeWithoutDv: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = barcodeWithoutDv.length - 1; i >= 0; i--) {\n sum += Number(barcodeWithoutDv[i]) * multiplier;\n multiplier = multiplier >= 9 ? 2 : multiplier + 1;\n }\n\n const remainder = sum % 11;\n let dv = 11 - remainder;\n if (dv === 0 || dv === 10 || dv === 11) {\n dv = 1;\n }\n return dv;\n}\n","/**\n * Modulo 10 — linha digitável field DVs (Anexo IX).\n */\nexport function computeModulo10FieldDv(digits: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let product = Number(digits[i]) * multiplier;\n if (product > 9) {\n product = Math.floor(product / 10) + (product % 10);\n }\n sum += product;\n multiplier = multiplier === 2 ? 1 : 2;\n }\n\n const remainder = sum % 10;\n return remainder === 0 ? 0 : 10 - remainder;\n}\n","/**\n * Linha digitável ↔ código de barras conversion (Anexo V §2.3.4).\n * Situação 1 and Situação 2 share the same field permutation; campo 5 semantics differ\n * (fator+valor vs ISPB 14 digits).\n * @see BR-BOLETO-006\n */\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport function convertLinhaToCodigoBarrasDigits(strippedLinha: string): string {\n return (\n strippedLinha.slice(0, 4) +\n strippedLinha[32] +\n strippedLinha.slice(33, BOLETO_LINHA_LENGTH) +\n strippedLinha.slice(4, 9) +\n strippedLinha.slice(10, 20) +\n strippedLinha.slice(21, 31)\n );\n}\n\nexport function convertCodigoBarrasToLinhaDigits(barcode: string): string {\n const field1 = barcode.slice(0, 4) + barcode.slice(19, 24);\n const field2 = barcode.slice(24, 34);\n const field3 = barcode.slice(34, BOLETO_CODIGO_BARRAS_LENGTH);\n const field5 = barcode.slice(5, 9) + barcode.slice(9, 19);\n const dv1 = String(computeModulo10FieldDv(field1));\n const dv2 = String(computeModulo10FieldDv(field2));\n const dv3 = String(computeModulo10FieldDv(field3));\n return field1 + dv1 + field2 + dv2 + field3 + dv3 + barcode[4] + field5;\n}\n","/**\n * Boleto input kind detection — linha digitável (47) vs código de barras (44).\n * @see BR-BOLETO-001\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type DetectedBoletoInputKind = 'linha-digitavel' | 'codigo-barras' | 'arrecadacao' | 'unknown';\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction stripDigits(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nexport function detectBoletoInputKind(input: string): DetectedBoletoInputKind {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return 'unknown';\n }\n\n const digits = stripDigits(trimmed);\n\n if (digits.length === 48 && digits.startsWith('8')) {\n return 'arrecadacao';\n }\n\n if (digits.length === BOLETO_CODIGO_BARRAS_LENGTH && /^\\d+$/.test(digits)) {\n return 'codigo-barras';\n }\n\n if (digits.length === BOLETO_LINHA_LENGTH) {\n if (/^\\d+$/.test(trimmed)) {\n return 'linha-digitavel';\n }\n if (LINHA_MASK_PATTERN.test(trimmed)) {\n return 'linha-digitavel';\n }\n return 'unknown';\n }\n\n return 'unknown';\n}\n","/**\n * Linha digitável display mask — FEBRABAN Anexo IX (BR-BOLETO-008).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport { BOLETO_LINHA_LENGTH } from './constants.js';\n\n/** FEBRABAN typable linha digitável mask (47 digits). */\nexport function applyLinhaDigitavelMask(stripped47: string): string {\n if (stripped47.length !== BOLETO_LINHA_LENGTH) {\n throw new Error(`Linha digitável must have exactly ${BOLETO_LINHA_LENGTH} digits to apply mask`);\n }\n return (\n `${stripped47.slice(0, 5)}.${stripped47.slice(5, 10)} ` +\n `${stripped47.slice(10, 15)}.${stripped47.slice(15, 21)} ` +\n `${stripped47.slice(21, 26)}.${stripped47.slice(26, 32)} ` +\n `${stripped47[32]} ${stripped47.slice(33)}`\n );\n}\n\n/** Backward-compatible alias for applyLinhaDigitavelMask. */\nexport function formatLinhaDigitavel(stripped: string): string {\n return applyLinhaDigitavelMask(stripped);\n}\n","/**\n * Linha digitável validation — modulo 10 field DVs (Anexo IX).\n * @see BR-BOLETO-002, BR-BOLETO-008\n */\nimport type { BoletoSituacao, CobrancaBoletoValidationResult } from '../../types/validation-result.js';\nimport { brandLinhaDigitavel } from '../../types/validation-result.js';\nimport {\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\nimport { convertLinhaToCodigoBarrasDigits } from './convert.js';\nimport { detectBoletoSituacao, toBoletoSituacaoCode } from './detect-situacao.js';\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport { computeModulo11BarcodeDv } from './modulo11.js';\n\nexport { applyLinhaDigitavelMask, formatLinhaDigitavel } from './mask.js';\n\ntype FailedResult = Extract<CobrancaBoletoValidationResult, { ok: false }>;\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, inputKind: 'linha-digitavel' };\n}\n\nexport function stripLinhaDigitavel(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nfunction validateFieldDv(\n fieldDigits: string,\n actualDv: string,\n fieldNumber: 1 | 2 | 3,\n): FailedResult | null {\n const expected = String(computeModulo10FieldDv(fieldDigits));\n if (actualDv !== expected) {\n return failure('INVALID_CHECK_DIGIT', `Linha digitável field ${fieldNumber} check digit is invalid`);\n }\n return null;\n}\n\nexport function validateLinhaDigitavel(input: string): CobrancaBoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Linha digitável input is empty' };\n }\n\n if (!LINHA_MASK_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Linha digitável contains invalid characters');\n }\n\n const stripped = stripLinhaDigitavel(trimmed);\n if (stripped.length !== BOLETO_LINHA_LENGTH) {\n return failure('INVALID_LENGTH', `Linha digitável must have ${BOLETO_LINHA_LENGTH} digits after normalization`);\n }\n\n const situacaoKind = detectBoletoSituacao(stripped);\n if (situacaoKind === 'unknown') {\n const isIspbHolder = stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;\n const message = isIspbHolder\n ? 'ISPB holder boleto (code 988) requires currency indicator 0 (Situação 2)'\n : 'Bank boleto currency code must be 9 (Real) for Situação 1';\n return failure('UNSUPPORTED_FORMAT', message);\n }\n\n const field1Error = validateFieldDv(stripped.slice(0, 9), stripped.charAt(9), 1);\n if (field1Error) {\n return field1Error;\n }\n\n const field2Error = validateFieldDv(stripped.slice(10, 20), stripped.charAt(20), 2);\n if (field2Error) {\n return field2Error;\n }\n\n const field3Error = validateFieldDv(stripped.slice(21, 31), stripped.charAt(31), 3);\n if (field3Error) {\n return field3Error;\n }\n\n const barcode = convertLinhaToCodigoBarrasDigits(stripped);\n const barcodeDvFromMod11 = String(\n computeModulo11BarcodeDv(barcode.slice(0, 4) + barcode.slice(5)),\n );\n\n if (stripped.charAt(32) !== barcodeDvFromMod11) {\n return failure('INVALID_CHECK_DIGIT', 'Linha digitável field 4 (barcode DV) is invalid');\n }\n\n const situacao = toBoletoSituacaoCode(situacaoKind) as BoletoSituacao;\n return {\n ok: true,\n value: brandLinhaDigitavel(stripped),\n inputKind: 'linha-digitavel',\n format: 'linha-digitavel',\n situacao,\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { validatePlaca } from './chunk-2JSOXG2M.js';
1
+ import { validatePlaca } from './chunk-P37C3MVF.js';
2
2
 
3
3
  // src/format/placa.ts
4
4
  function formatPlaca(input) {
@@ -10,5 +10,5 @@ function formatPlaca(input) {
10
10
  }
11
11
 
12
12
  export { formatPlaca };
13
- //# sourceMappingURL=chunk-TTDHGQEC.js.map
14
- //# sourceMappingURL=chunk-TTDHGQEC.js.map
13
+ //# sourceMappingURL=chunk-SQO7BO3Y.js.map
14
+ //# sourceMappingURL=chunk-SQO7BO3Y.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/format/placa.ts"],"names":[],"mappings":";;;AAGO,SAAS,YAAY,KAAA,EAA6B;AACvD,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,OAAO,KAAA,EAAM;AAC7C","file":"chunk-TTDHGQEC.js","sourcesContent":["import { validatePlaca } from '../core/placa/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatPlaca(input: string): FormatResult {\n const result = validatePlaca(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: result.value };\n}\n"]}
1
+ {"version":3,"sources":["../src/format/placa.ts"],"names":[],"mappings":";;;AAGO,SAAS,YAAY,KAAA,EAA6B;AACvD,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,OAAO,KAAA,EAAM;AAC7C","file":"chunk-SQO7BO3Y.js","sourcesContent":["import { validatePlaca } from '../core/placa/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatPlaca(input: string): FormatResult {\n const result = validatePlaca(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: result.value };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { validateCnh, CNH_NUMERIC_PATTERN, CNH_LENGTH } from './chunk-EOXFX7MM.js';
1
+ import { validateCnh, CNH_NUMERIC_PATTERN, CNH_LENGTH } from './chunk-G4YT6X7N.js';
2
2
 
3
3
  // src/core/cnh/mask.ts
4
4
  function applyCnhCanonicalFormat(canonical) {
@@ -18,5 +18,5 @@ function formatCnh(input) {
18
18
  }
19
19
 
20
20
  export { formatCnh };
21
- //# sourceMappingURL=chunk-MXOYICSK.js.map
22
- //# sourceMappingURL=chunk-MXOYICSK.js.map
21
+ //# sourceMappingURL=chunk-SXPLYH4N.js.map
22
+ //# sourceMappingURL=chunk-SXPLYH4N.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/cnh/mask.ts","../src/format/cnh.ts"],"names":[],"mappings":";;;AAQO,SAAS,wBAAwB,SAAA,EAA2B;AACjE,EAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,UAAU,CAAA,iBAAA,CAAmB,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,SAAA;AACT;;;ACTO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,uBAAA,CAAwB,MAAA,CAAO,KAAK,CAAA,EAAE;AACtE","file":"chunk-MXOYICSK.js","sourcesContent":["import { CNH_LENGTH, CNH_NUMERIC_PATTERN } from './constants.js';\n\n/**\n * Official system format — 11 contiguous digits (BR-CNH-005).\n * Unlike CPF, CONTRAN/SENATRAN systems do not use dot/dash decoration.\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 applyCnhCanonicalFormat(canonical: string): string {\n if (!CNH_NUMERIC_PATTERN.test(canonical)) {\n throw new Error(`CNH must have exactly ${CNH_LENGTH} digits to format`);\n }\n return canonical;\n}\n","import { applyCnhCanonicalFormat } from '../core/cnh/mask.js';\nimport { validateCnh } from '../core/cnh/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCnh(input: string): FormatResult {\n const result = validateCnh(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCnhCanonicalFormat(result.value) };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/cnh/mask.ts","../src/format/cnh.ts"],"names":[],"mappings":";;;AAQO,SAAS,wBAAwB,SAAA,EAA2B;AACjE,EAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,UAAU,CAAA,iBAAA,CAAmB,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,SAAA;AACT;;;ACTO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,uBAAA,CAAwB,MAAA,CAAO,KAAK,CAAA,EAAE;AACtE","file":"chunk-SXPLYH4N.js","sourcesContent":["import { CNH_LENGTH, CNH_NUMERIC_PATTERN } from './constants.js';\n\n/**\n * Official system format — 11 contiguous digits (BR-CNH-005).\n * Unlike CPF, CONTRAN/SENATRAN systems do not use dot/dash decoration.\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 applyCnhCanonicalFormat(canonical: string): string {\n if (!CNH_NUMERIC_PATTERN.test(canonical)) {\n throw new Error(`CNH must have exactly ${CNH_LENGTH} digits to format`);\n }\n return canonical;\n}\n","import { applyCnhCanonicalFormat } from '../core/cnh/mask.js';\nimport { validateCnh } from '../core/cnh/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCnh(input: string): FormatResult {\n const result = validateCnh(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCnhCanonicalFormat(result.value) };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { faixa_metadata_default } from './chunk-RY2BSDOR.js';
2
2
  import { stripCep } from './chunk-YYHS5WQN.js';
3
- import { brandCep } from './chunk-4NFEM2SU.js';
3
+ import { brandCep } from './chunk-EMZCVV5Y.js';
4
4
 
5
5
  // src/core/cep/constants.ts
6
6
  var CEP_LENGTH = 8;
@@ -147969,5 +147969,5 @@ function validateCep(input) {
147969
147969
  }
147970
147970
 
147971
147971
  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_MASK_PATTERN, CEP_OFFICIAL_SOURCE_URL, getCepFaixaInfo, getCepFaixas, isValidCep, validateCep };
147972
- //# sourceMappingURL=chunk-F7G4ISQB.js.map
147973
- //# sourceMappingURL=chunk-F7G4ISQB.js.map
147972
+ //# sourceMappingURL=chunk-UANHHEWY.js.map
147973
+ //# sourceMappingURL=chunk-UANHHEWY.js.map