@br-validators/core 1.7.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/README.md +32 -9
  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
@@ -0,0 +1,125 @@
1
+ import { brandEan } from './chunk-EMZCVV5Y.js';
2
+
3
+ // src/strip/ean.ts
4
+ function stripEan(input) {
5
+ return input.replace(/\D/g, "");
6
+ }
7
+
8
+ // src/core/ean/constants.ts
9
+ var EAN_OFFICIAL_SOURCE_URL = "https://www.gs1.org/standards/barcodes/ean-upc";
10
+ var EAN_8_LENGTH = 8;
11
+ var EAN_13_LENGTH = 13;
12
+ var EAN_GOLDEN_13 = "4006381333931";
13
+ var EAN_GOLDEN_13_MASKED = "4 006381 333931";
14
+ var EAN_GOLDEN_8 = "96385074";
15
+ var EAN_GOLDEN_8_MASKED = "9638 5074";
16
+
17
+ // src/core/ean/modulo10.ts
18
+ function computeGs1Modulo10Sum(digitsWithoutCheck) {
19
+ let sum = 0;
20
+ for (let i = 0; i < digitsWithoutCheck.length; i++) {
21
+ const digit = Number(digitsWithoutCheck.charAt(i));
22
+ const weight = i % 2 === 0 ? 1 : 3;
23
+ sum += digit * weight;
24
+ }
25
+ return sum;
26
+ }
27
+ function computeGs1Modulo10CheckDigit(digitsWithoutCheck) {
28
+ const remainder = computeGs1Modulo10Sum(digitsWithoutCheck) % 10;
29
+ return remainder === 0 ? 0 : 10 - remainder;
30
+ }
31
+ function passesGs1Modulo10(digits) {
32
+ const body = digits.slice(0, -1);
33
+ const expected = computeGs1Modulo10CheckDigit(body);
34
+ return expected === Number(digits.charAt(digits.length - 1));
35
+ }
36
+
37
+ // src/core/ean/detect-format.ts
38
+ function detectEanFormat(input) {
39
+ const stripped = stripEan(input);
40
+ if (stripped.length === EAN_13_LENGTH) {
41
+ return "ean-13";
42
+ }
43
+ if (stripped.length === EAN_8_LENGTH) {
44
+ return "ean-8";
45
+ }
46
+ return null;
47
+ }
48
+
49
+ // src/core/ean/mask.ts
50
+ function applyEanMask(canonical) {
51
+ if (canonical.length === EAN_13_LENGTH) {
52
+ return `${canonical.slice(0, 1)} ${canonical.slice(1, 7)} ${canonical.slice(7)}`;
53
+ }
54
+ if (canonical.length === EAN_8_LENGTH) {
55
+ return `${canonical.slice(0, 4)} ${canonical.slice(4)}`;
56
+ }
57
+ throw new Error(`EAN must have ${EAN_8_LENGTH} or ${EAN_13_LENGTH} digits to apply mask`);
58
+ }
59
+
60
+ // src/core/ean/index.ts
61
+ function failure(code, message) {
62
+ return { ok: false, code, message };
63
+ }
64
+ function hasRepeatedDigits(value) {
65
+ const first = value[0];
66
+ for (let i = 1; i < value.length; i++) {
67
+ if (value[i] !== first) {
68
+ return false;
69
+ }
70
+ }
71
+ return true;
72
+ }
73
+ function validateStructure(input, stripped) {
74
+ if (stripped.length === 0) {
75
+ return failure("EMPTY_INPUT", "EAN input is empty");
76
+ }
77
+ const withoutMask = input.replace(/[\s-]/g, "");
78
+ if (/[^0-9]/.test(withoutMask)) {
79
+ return failure("INVALID_CHARACTER", "EAN contains invalid characters");
80
+ }
81
+ if (stripped.length !== EAN_8_LENGTH && stripped.length !== EAN_13_LENGTH) {
82
+ return failure(
83
+ "INVALID_LENGTH",
84
+ `EAN must have ${EAN_8_LENGTH} (EAN-8) or ${EAN_13_LENGTH} (EAN-13) digits after normalization`
85
+ );
86
+ }
87
+ if (hasRepeatedDigits(stripped)) {
88
+ return failure("KNOWN_INVALID_PATTERN", "EAN with all identical digits is invalid");
89
+ }
90
+ return null;
91
+ }
92
+ function isValidGs1Modulo10(input) {
93
+ const stripped = stripEan(input);
94
+ if (stripped.length !== EAN_8_LENGTH && stripped.length !== EAN_13_LENGTH) {
95
+ return false;
96
+ }
97
+ const withoutMask = input.replace(/[\s-]/g, "");
98
+ if (/[^0-9]/.test(withoutMask)) {
99
+ return false;
100
+ }
101
+ return passesGs1Modulo10(stripped);
102
+ }
103
+ function isValidEan(input) {
104
+ return validateEan(input).ok;
105
+ }
106
+ function validateEan(input) {
107
+ const stripped = stripEan(input);
108
+ const structural = validateStructure(input, stripped);
109
+ if (structural) {
110
+ return structural;
111
+ }
112
+ if (!passesGs1Modulo10(stripped)) {
113
+ return failure("INVALID_CHECK_DIGIT", "EAN check digit is invalid");
114
+ }
115
+ const format = stripped.length === EAN_13_LENGTH ? "ean-13" : "ean-8";
116
+ return {
117
+ ok: true,
118
+ value: brandEan(stripped),
119
+ format
120
+ };
121
+ }
122
+
123
+ export { EAN_13_LENGTH, EAN_8_LENGTH, EAN_GOLDEN_13, EAN_GOLDEN_13_MASKED, EAN_GOLDEN_8, EAN_GOLDEN_8_MASKED, EAN_OFFICIAL_SOURCE_URL, applyEanMask, computeGs1Modulo10CheckDigit, computeGs1Modulo10Sum, detectEanFormat, isValidEan, isValidGs1Modulo10, passesGs1Modulo10, stripEan, validateEan };
124
+ //# sourceMappingURL=chunk-2NSBFMTP.js.map
125
+ //# sourceMappingURL=chunk-2NSBFMTP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/strip/ean.ts","../src/core/ean/constants.ts","../src/core/ean/modulo10.ts","../src/core/ean/detect-format.ts","../src/core/ean/mask.ts","../src/core/ean/index.ts"],"names":[],"mappings":"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","file":"chunk-2NSBFMTP.js","sourcesContent":["/**\n * Strip EAN mask — digits only.\n * @see https://www.gs1.org/standards/barcodes/ean-upc\n */\nexport function stripEan(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/** GS1 EAN/UPC — official reference for check-digit algorithm. */\nexport const EAN_OFFICIAL_SOURCE_URL = 'https://www.gs1.org/standards/barcodes/ean-upc' as const;\n\nexport const EAN_8_LENGTH = 8 as const;\nexport const EAN_13_LENGTH = 13 as const;\n\n/** Golden EAN-13 from GS1 examples (modulo-10 weights 1/3). */\nexport const EAN_GOLDEN_13 = '4006381333931' as const;\nexport const EAN_GOLDEN_13_MASKED = '4 006381 333931' as const;\n\n/** Golden EAN-8 from GS1 examples. */\nexport const EAN_GOLDEN_8 = '96385074' as const;\nexport const EAN_GOLDEN_8_MASKED = '9638 5074' as const;\n\nexport type EanFormat = 'ean-8' | 'ean-13';\n","/**\n * GS1 modulo-10 check digit — alternating weights 1 and 3 from the left (excluding check digit).\n * @see https://www.gs1.org/standards/barcodes/ean-upc\n */\n\nexport function computeGs1Modulo10Sum(digitsWithoutCheck: string): number {\n let sum = 0;\n for (let i = 0; i < digitsWithoutCheck.length; i++) {\n const digit = Number(digitsWithoutCheck.charAt(i));\n const weight = i % 2 === 0 ? 1 : 3;\n sum += digit * weight;\n }\n return sum;\n}\n\nexport function computeGs1Modulo10CheckDigit(digitsWithoutCheck: string): number {\n const remainder = computeGs1Modulo10Sum(digitsWithoutCheck) % 10;\n return remainder === 0 ? 0 : 10 - remainder;\n}\n\n/** Returns true when the full digit string passes GS1 modulo-10. */\nexport function passesGs1Modulo10(digits: string): boolean {\n const body = digits.slice(0, -1);\n const expected = computeGs1Modulo10CheckDigit(body);\n return expected === Number(digits.charAt(digits.length - 1));\n}\n","import { stripEan } from '../../strip/ean.js';\nimport { EAN_13_LENGTH, EAN_8_LENGTH, type EanFormat } from './constants.js';\n\n/** Best-effort format detection from stripped length (8 or 13 digits only). */\nexport function detectEanFormat(input: string): EanFormat | null {\n const stripped = stripEan(input);\n if (stripped.length === EAN_13_LENGTH) {\n return 'ean-13';\n }\n if (stripped.length === EAN_8_LENGTH) {\n return 'ean-8';\n }\n return null;\n}\n","import { EAN_13_LENGTH, EAN_8_LENGTH } from './constants.js';\n\n/** GS1 human-readable grouping — EAN-13: 1-6-6, EAN-8: 4-4. */\nexport function applyEanMask(canonical: string): string {\n if (canonical.length === EAN_13_LENGTH) {\n return `${canonical.slice(0, 1)} ${canonical.slice(1, 7)} ${canonical.slice(7)}`;\n }\n if (canonical.length === EAN_8_LENGTH) {\n return `${canonical.slice(0, 4)} ${canonical.slice(4)}`;\n }\n throw new Error(`EAN must have ${EAN_8_LENGTH} or ${EAN_13_LENGTH} digits to apply mask`);\n}\n","/**\n * GS1 EAN-8 / EAN-13 product barcode validation — modulo-10 weights 1 and 3.\n * @see docs/use-cases/UC-009-validate-ean.md\n */\nimport { stripEan } from '../../strip/ean.js';\nimport type { EanValidationResult } from '../../types/validation-result.js';\nimport { brandEan } from '../../types/validation-result.js';\nimport { EAN_13_LENGTH, EAN_8_LENGTH, type EanFormat } from './constants.js';\nimport { passesGs1Modulo10 } from './modulo10.js';\n\nexport {\n EAN_8_LENGTH,\n EAN_13_LENGTH,\n EAN_GOLDEN_13,\n EAN_GOLDEN_13_MASKED,\n EAN_GOLDEN_8,\n EAN_GOLDEN_8_MASKED,\n EAN_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport type { EanFormat } from './constants.js';\nexport { detectEanFormat } from './detect-format.js';\nexport { applyEanMask } from './mask.js';\nexport { computeGs1Modulo10CheckDigit, computeGs1Modulo10Sum, passesGs1Modulo10 } from './modulo10.js';\n\ntype FailedResult = Extract<EanValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'EAN input is empty');\n }\n\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'EAN contains invalid characters');\n }\n\n if (stripped.length !== EAN_8_LENGTH && stripped.length !== EAN_13_LENGTH) {\n return failure(\n 'INVALID_LENGTH',\n `EAN must have ${EAN_8_LENGTH} (EAN-8) or ${EAN_13_LENGTH} (EAN-13) digits after normalization`,\n );\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'EAN with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidGs1Modulo10(input: string): boolean {\n const stripped = stripEan(input);\n if (stripped.length !== EAN_8_LENGTH && stripped.length !== EAN_13_LENGTH) {\n return false;\n }\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return false;\n }\n return passesGs1Modulo10(stripped);\n}\n\nexport function isValidEan(input: string): boolean {\n return validateEan(input).ok;\n}\n\nexport function validateEan(input: string): EanValidationResult {\n const stripped = stripEan(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (!passesGs1Modulo10(stripped)) {\n return failure('INVALID_CHECK_DIGIT', 'EAN check digit is invalid');\n }\n\n const format: EanFormat = stripped.length === EAN_13_LENGTH ? 'ean-13' : 'ean-8';\n\n return {\n ok: true,\n value: brandEan(stripped),\n format,\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { brandCartaoCredito } from './chunk-4NFEM2SU.js';
1
+ import { brandCartaoCredito } from './chunk-EMZCVV5Y.js';
2
2
 
3
3
  // src/strip/cartao-credito.ts
4
4
  function stripCartaoCredito(input) {
@@ -194,5 +194,5 @@ function validateCartaoCredito(input) {
194
194
  }
195
195
 
196
196
  export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, ELO_IIN_PREFIXES, HIPERCARD_IIN_PREFIXES, applyCartaoCreditoMask, computeLuhnSum, detectCardBrand, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito };
197
- //# sourceMappingURL=chunk-VDCITFZG.js.map
198
- //# sourceMappingURL=chunk-VDCITFZG.js.map
197
+ //# sourceMappingURL=chunk-2ZWBFVYY.js.map
198
+ //# sourceMappingURL=chunk-2ZWBFVYY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/strip/cartao-credito.ts","../src/core/cartao-credito/constants.ts","../src/core/cartao-credito/detect-brand.ts","../src/core/cartao-credito/luhn.ts","../src/core/cartao-credito/mask.ts","../src/core/cartao-credito/index.ts"],"names":[],"mappings":"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","file":"chunk-VDCITFZG.js","sourcesContent":["/**\n * Strip credit card PAN mask — digits only (BR-LUHN-001).\n * @see https://www.iso.org/standard/70484.html\n */\nexport function stripCartaoCredito(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Credit card PAN constants — ISO/IEC 7812-1 Annex B (Luhn).\n * @see https://www.iso.org/standard/70484.html\n * @see docs/use-cases/UC-008-validate-cartao-credito.md\n */\nexport type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown';\n\nexport const CARTAO_PAN_MIN_LENGTH = 8;\nexport const CARTAO_PAN_MAX_LENGTH = 19;\n\nexport const CARTAO_GOLDEN_VISA = '4111111111111111';\nexport const CARTAO_GOLDEN_MASTERCARD = '5555555555554444';\nexport const CARTAO_GOLDEN_AMEX = '378282246310005';\nexport const CARTAO_GOLDEN_LUHN_WALKTHROUGH = '79927398713';\nexport const CARTAO_GOLDEN_VISA_MASKED = '4111 1111 1111 1111';\nexport const CARTAO_GOLDEN_MIN_LENGTH = '12345674';\n\nexport const CARTAO_OFFICIAL_SOURCE_URL = 'https://www.iso.org/standard/70484.html';\nexport const CARTAO_IEC_SOURCE_URL = 'https://webstore.iec.ch/en/publication/59763';\n\n/** Best-effort IIN prefixes — longest match first (BR-LUHN-005, non-authoritative). */\nexport const ELO_IIN_PREFIXES = [\n '401178',\n '401179',\n '431274',\n '438935',\n '451416',\n '457393',\n '457631',\n '457632',\n '504175',\n '506699',\n '506770',\n '509048',\n '509049',\n '627780',\n '636297',\n '636368',\n '650031',\n '650032',\n '650033',\n '650035',\n '650051',\n '650405',\n '650439',\n '650485',\n '650486',\n '650487',\n '650488',\n '650489',\n '650490',\n '650491',\n '650492',\n '650493',\n '650494',\n '650495',\n '650496',\n '650497',\n '650498',\n '650499',\n '651652',\n '651653',\n '651654',\n '651655',\n '651656',\n '651657',\n '651658',\n '651659',\n '651660',\n '655000',\n '655001',\n] as const;\n\nexport const HIPERCARD_IIN_PREFIXES = ['606282', '384100'] as const;\n","/**\n * Best-effort card brand from IIN prefix — non-authoritative (BR-LUHN-005).\n */\nimport type { CardBrand } from './constants.js';\nimport { ELO_IIN_PREFIXES, HIPERCARD_IIN_PREFIXES } from './constants.js';\n\nexport type { CardBrand };\n\nexport function detectCardBrand(strippedPan: string): CardBrand {\n for (const prefix of ELO_IIN_PREFIXES) {\n if (strippedPan.startsWith(prefix)) {\n return 'elo';\n }\n }\n\n for (const prefix of HIPERCARD_IIN_PREFIXES) {\n if (strippedPan.startsWith(prefix)) {\n return 'hipercard';\n }\n }\n\n if (/^3[47]/.test(strippedPan)) {\n return 'amex';\n }\n\n if (/^5[1-5]/.test(strippedPan) || /^2[2-7]/.test(strippedPan)) {\n return 'mastercard';\n }\n\n if (strippedPan.startsWith('4')) {\n return 'visa';\n }\n\n return 'unknown';\n}\n","/**\n * Luhn checksum — ISO/IEC 7812-1 Annex B (modulus-10 double-add-double).\n * @see BR-LUHN-003\n */\n\nexport function computeLuhnSum(pan: string): number {\n let sum = 0;\n let double = false;\n for (let i = pan.length - 1; i >= 0; i--) {\n let digit = Number(pan.charAt(i));\n if (double) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n sum += digit;\n double = !double;\n }\n return sum;\n}\n\n/** ISO/IEC 7812-1 Annex B — returns true when PAN passes Luhn. */\nexport function passesLuhn(pan: string): boolean {\n return computeLuhnSum(pan) % 10 === 0;\n}\n","import { CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH } from './constants.js';\n\n/** Grouped display mask (BR-LUHN-007). */\nexport function applyCartaoCreditoMask(canonical: string): string {\n if (canonical.length < CARTAO_PAN_MIN_LENGTH || canonical.length > CARTAO_PAN_MAX_LENGTH) {\n throw new Error(`PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits to apply mask`);\n }\n\n if (canonical.length === 15) {\n return `${canonical.slice(0, 4)} ${canonical.slice(4, 10)} ${canonical.slice(10)}`;\n }\n\n const groups: string[] = [];\n for (let i = 0; i < canonical.length; i += 4) {\n groups.push(canonical.slice(i, i + 4));\n }\n return groups.join(' ');\n}\n","/**\n * Credit card PAN validation — Luhn / ISO/IEC 7812-1 Annex B.\n * @see docs/use-cases/UC-008-validate-cartao-credito.md\n */\nimport { stripCartaoCredito } from '../../strip/cartao-credito.js';\nimport type { CartaoCreditoValidationResult } from '../../types/validation-result.js';\nimport { brandCartaoCredito } from '../../types/validation-result.js';\nimport { detectCardBrand } from './detect-brand.js';\nimport { CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH } from './constants.js';\nimport { passesLuhn } from './luhn.js';\n\nexport {\n CARTAO_GOLDEN_AMEX,\n CARTAO_GOLDEN_LUHN_WALKTHROUGH,\n CARTAO_GOLDEN_MASTERCARD,\n CARTAO_GOLDEN_MIN_LENGTH,\n CARTAO_GOLDEN_VISA,\n CARTAO_GOLDEN_VISA_MASKED,\n CARTAO_IEC_SOURCE_URL,\n CARTAO_OFFICIAL_SOURCE_URL,\n CARTAO_PAN_MAX_LENGTH,\n CARTAO_PAN_MIN_LENGTH,\n} from './constants.js';\nexport type { CardBrand } from './constants.js';\nexport { detectCardBrand } from './detect-brand.js';\nexport { computeLuhnSum, passesLuhn } from './luhn.js';\nexport { applyCartaoCreditoMask } from './mask.js';\n\ntype FailedResult = Extract<CartaoCreditoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Credit card PAN input is empty');\n }\n\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'Credit card PAN contains invalid characters');\n }\n\n if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) {\n return failure(\n 'INVALID_LENGTH',\n `Credit card PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits after normalization`,\n );\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'Credit card PAN with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidLuhn(input: string): boolean {\n const stripped = stripCartaoCredito(input);\n if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) {\n return false;\n }\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return false;\n }\n return passesLuhn(stripped);\n}\n\nexport function isValidCartaoCredito(input: string): boolean {\n return validateCartaoCredito(input).ok;\n}\n\nexport function validateCartaoCredito(input: string): CartaoCreditoValidationResult {\n const stripped = stripCartaoCredito(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (!passesLuhn(stripped)) {\n return failure('INVALID_CHECK_DIGIT', 'Credit card PAN check digit is invalid');\n }\n\n const brand = detectCardBrand(stripped);\n return {\n ok: true,\n value: brandCartaoCredito(stripped),\n format: 'cartao-credito',\n brand,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/strip/cartao-credito.ts","../src/core/cartao-credito/constants.ts","../src/core/cartao-credito/detect-brand.ts","../src/core/cartao-credito/luhn.ts","../src/core/cartao-credito/mask.ts","../src/core/cartao-credito/index.ts"],"names":[],"mappings":"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","file":"chunk-2ZWBFVYY.js","sourcesContent":["/**\n * Strip credit card PAN mask — digits only (BR-LUHN-001).\n * @see https://www.iso.org/standard/70484.html\n */\nexport function stripCartaoCredito(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * Credit card PAN constants — ISO/IEC 7812-1 Annex B (Luhn).\n * @see https://www.iso.org/standard/70484.html\n * @see docs/use-cases/UC-008-validate-cartao-credito.md\n */\nexport type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown';\n\nexport const CARTAO_PAN_MIN_LENGTH = 8;\nexport const CARTAO_PAN_MAX_LENGTH = 19;\n\nexport const CARTAO_GOLDEN_VISA = '4111111111111111';\nexport const CARTAO_GOLDEN_MASTERCARD = '5555555555554444';\nexport const CARTAO_GOLDEN_AMEX = '378282246310005';\nexport const CARTAO_GOLDEN_LUHN_WALKTHROUGH = '79927398713';\nexport const CARTAO_GOLDEN_VISA_MASKED = '4111 1111 1111 1111';\nexport const CARTAO_GOLDEN_MIN_LENGTH = '12345674';\n\nexport const CARTAO_OFFICIAL_SOURCE_URL = 'https://www.iso.org/standard/70484.html';\nexport const CARTAO_IEC_SOURCE_URL = 'https://webstore.iec.ch/en/publication/59763';\n\n/** Best-effort IIN prefixes — longest match first (BR-LUHN-005, non-authoritative). */\nexport const ELO_IIN_PREFIXES = [\n '401178',\n '401179',\n '431274',\n '438935',\n '451416',\n '457393',\n '457631',\n '457632',\n '504175',\n '506699',\n '506770',\n '509048',\n '509049',\n '627780',\n '636297',\n '636368',\n '650031',\n '650032',\n '650033',\n '650035',\n '650051',\n '650405',\n '650439',\n '650485',\n '650486',\n '650487',\n '650488',\n '650489',\n '650490',\n '650491',\n '650492',\n '650493',\n '650494',\n '650495',\n '650496',\n '650497',\n '650498',\n '650499',\n '651652',\n '651653',\n '651654',\n '651655',\n '651656',\n '651657',\n '651658',\n '651659',\n '651660',\n '655000',\n '655001',\n] as const;\n\nexport const HIPERCARD_IIN_PREFIXES = ['606282', '384100'] as const;\n","/**\n * Best-effort card brand from IIN prefix — non-authoritative (BR-LUHN-005).\n */\nimport type { CardBrand } from './constants.js';\nimport { ELO_IIN_PREFIXES, HIPERCARD_IIN_PREFIXES } from './constants.js';\n\nexport type { CardBrand };\n\nexport function detectCardBrand(strippedPan: string): CardBrand {\n for (const prefix of ELO_IIN_PREFIXES) {\n if (strippedPan.startsWith(prefix)) {\n return 'elo';\n }\n }\n\n for (const prefix of HIPERCARD_IIN_PREFIXES) {\n if (strippedPan.startsWith(prefix)) {\n return 'hipercard';\n }\n }\n\n if (/^3[47]/.test(strippedPan)) {\n return 'amex';\n }\n\n if (/^5[1-5]/.test(strippedPan) || /^2[2-7]/.test(strippedPan)) {\n return 'mastercard';\n }\n\n if (strippedPan.startsWith('4')) {\n return 'visa';\n }\n\n return 'unknown';\n}\n","/**\n * Luhn checksum — ISO/IEC 7812-1 Annex B (modulus-10 double-add-double).\n * @see BR-LUHN-003\n */\n\nexport function computeLuhnSum(pan: string): number {\n let sum = 0;\n let double = false;\n for (let i = pan.length - 1; i >= 0; i--) {\n let digit = Number(pan.charAt(i));\n if (double) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n sum += digit;\n double = !double;\n }\n return sum;\n}\n\n/** ISO/IEC 7812-1 Annex B — returns true when PAN passes Luhn. */\nexport function passesLuhn(pan: string): boolean {\n return computeLuhnSum(pan) % 10 === 0;\n}\n","import { CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH } from './constants.js';\n\n/** Grouped display mask (BR-LUHN-007). */\nexport function applyCartaoCreditoMask(canonical: string): string {\n if (canonical.length < CARTAO_PAN_MIN_LENGTH || canonical.length > CARTAO_PAN_MAX_LENGTH) {\n throw new Error(`PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits to apply mask`);\n }\n\n if (canonical.length === 15) {\n return `${canonical.slice(0, 4)} ${canonical.slice(4, 10)} ${canonical.slice(10)}`;\n }\n\n const groups: string[] = [];\n for (let i = 0; i < canonical.length; i += 4) {\n groups.push(canonical.slice(i, i + 4));\n }\n return groups.join(' ');\n}\n","/**\n * Credit card PAN validation — Luhn / ISO/IEC 7812-1 Annex B.\n * @see docs/use-cases/UC-008-validate-cartao-credito.md\n */\nimport { stripCartaoCredito } from '../../strip/cartao-credito.js';\nimport type { CartaoCreditoValidationResult } from '../../types/validation-result.js';\nimport { brandCartaoCredito } from '../../types/validation-result.js';\nimport { detectCardBrand } from './detect-brand.js';\nimport { CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH } from './constants.js';\nimport { passesLuhn } from './luhn.js';\n\nexport {\n CARTAO_GOLDEN_AMEX,\n CARTAO_GOLDEN_LUHN_WALKTHROUGH,\n CARTAO_GOLDEN_MASTERCARD,\n CARTAO_GOLDEN_MIN_LENGTH,\n CARTAO_GOLDEN_VISA,\n CARTAO_GOLDEN_VISA_MASKED,\n CARTAO_IEC_SOURCE_URL,\n CARTAO_OFFICIAL_SOURCE_URL,\n CARTAO_PAN_MAX_LENGTH,\n CARTAO_PAN_MIN_LENGTH,\n} from './constants.js';\nexport type { CardBrand } from './constants.js';\nexport { detectCardBrand } from './detect-brand.js';\nexport { computeLuhnSum, passesLuhn } from './luhn.js';\nexport { applyCartaoCreditoMask } from './mask.js';\n\ntype FailedResult = Extract<CartaoCreditoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction hasRepeatedDigits(value: string): boolean {\n const first = value[0];\n for (let i = 1; i < value.length; i++) {\n if (value[i] !== first) {\n return false;\n }\n }\n return true;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Credit card PAN input is empty');\n }\n\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'Credit card PAN contains invalid characters');\n }\n\n if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) {\n return failure(\n 'INVALID_LENGTH',\n `Credit card PAN must have between ${CARTAO_PAN_MIN_LENGTH} and ${CARTAO_PAN_MAX_LENGTH} digits after normalization`,\n );\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'Credit card PAN with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidLuhn(input: string): boolean {\n const stripped = stripCartaoCredito(input);\n if (stripped.length < CARTAO_PAN_MIN_LENGTH || stripped.length > CARTAO_PAN_MAX_LENGTH) {\n return false;\n }\n const withoutMask = input.replace(/[\\s-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return false;\n }\n return passesLuhn(stripped);\n}\n\nexport function isValidCartaoCredito(input: string): boolean {\n return validateCartaoCredito(input).ok;\n}\n\nexport function validateCartaoCredito(input: string): CartaoCreditoValidationResult {\n const stripped = stripCartaoCredito(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (!passesLuhn(stripped)) {\n return failure('INVALID_CHECK_DIGIT', 'Credit card PAN check digit is invalid');\n }\n\n const brand = detectCardBrand(stripped);\n return {\n ok: true,\n value: brandCartaoCredito(stripped),\n format: 'cartao-credito',\n brand,\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { validateIeSpRural, applyIeSpRuralMask } from './chunk-TAOFFAG3.js';
1
+ import { validateIeSpRural, applyIeSpRuralMask } from './chunk-UJXGDUKJ.js';
2
2
 
3
3
  // src/format/inscricao-estadual-produtor-rural.ts
4
4
  function formatIeProdutorRural(input) {
@@ -10,5 +10,5 @@ function formatIeProdutorRural(input) {
10
10
  }
11
11
 
12
12
  export { formatIeProdutorRural };
13
- //# sourceMappingURL=chunk-EGDZGSHA.js.map
14
- //# sourceMappingURL=chunk-EGDZGSHA.js.map
13
+ //# sourceMappingURL=chunk-3EVLQVBC.js.map
14
+ //# sourceMappingURL=chunk-3EVLQVBC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/format/inscricao-estadual-produtor-rural.ts"],"names":[],"mappings":";;;AAIO,SAAS,sBAAsB,KAAA,EAA6B;AACjE,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,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,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA,EAAE;AACjE","file":"chunk-EGDZGSHA.js","sourcesContent":["import { applyIeSpRuralMask } from '../core/inscricao-estadual/mask.js';\nimport { validateIeSpRural } from '../core/inscricao-estadual/sp-rural.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatIeProdutorRural(input: string): FormatResult {\n const result = validateIeSpRural(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyIeSpRuralMask(result.value) };\n}\n"]}
1
+ {"version":3,"sources":["../src/format/inscricao-estadual-produtor-rural.ts"],"names":[],"mappings":";;;AAIO,SAAS,sBAAsB,KAAA,EAA6B;AACjE,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,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,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA,EAAE;AACjE","file":"chunk-3EVLQVBC.js","sourcesContent":["import { applyIeSpRuralMask } from '../core/inscricao-estadual/mask.js';\nimport { validateIeSpRural } from '../core/inscricao-estadual/sp-rural.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatIeProdutorRural(input: string): FormatResult {\n const result = validateIeSpRural(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyIeSpRuralMask(result.value) };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { normalizeForPlatform } from './chunk-GVQMJ45R.js';
1
+ import { normalizeForPlatform } from './chunk-MZZNNXAB.js';
2
2
 
3
3
  // src/platform/types.ts
4
4
  var PLATFORM_DOCUMENT_TYPES = [
@@ -16,6 +16,7 @@ var PLATFORM_DOCUMENT_TYPES = [
16
16
  "nfe-chave",
17
17
  "boleto",
18
18
  "cartao-credito",
19
+ "ean",
19
20
  "inscricao-estadual",
20
21
  "inscricao-estadual-produtor-rural",
21
22
  "pix",
@@ -39,5 +40,5 @@ function compareRuntime(a, b, type, options = {}) {
39
40
  }
40
41
 
41
42
  export { compare, compareRuntime };
42
- //# sourceMappingURL=chunk-A2JXKXPS.js.map
43
- //# sourceMappingURL=chunk-A2JXKXPS.js.map
43
+ //# sourceMappingURL=chunk-3ZIXLRXZ.js.map
44
+ //# sourceMappingURL=chunk-3ZIXLRXZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform/types.ts","../src/compare/index.ts"],"names":[],"mappings":";;;AAKO,IAAM,uBAAA,GAA0B;AAAA,EACrC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA;AAAA,EACA,oBAAA;AAAA,EACA,mCAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;AAMO,SAAS,uBAAuB,IAAA,EAA4C;AACjF,EAAA,OAAQ,uBAAA,CAA8C,SAAS,IAAI,CAAA;AACrE;;;ACrBO,SAAS,QACd,CAAA,EACA,CAAA,EACA,IAAA,EACA,OAAA,GAA2B,EAAC,EACb;AACf,EAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,CAAA,EAAG,IAAA,EAAM,OAAO,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,CAAA,EAAG,IAAA,EAAM,OAAO,CAAA;AACnD,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,KAAS,KAAA,EAAM;AACjC;AAGO,SAAS,eACd,CAAA,EACA,CAAA,EACA,IAAA,EACA,OAAA,GAA2B,EAAC,EACmD;AAC/E,EAAA,IAAI,CAAC,sBAAA,CAAuB,IAAI,CAAA,EAAG;AACjC,IAAA,OAAO,EAAE,OAAO,KAAA,EAAO,IAAA,EAAM,sBAAsB,OAAA,EAAS,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAA,EAAG;AAAA,EAC/F;AACA,EAAA,OAAO,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,OAAO,CAAA;AACpC","file":"chunk-3ZIXLRXZ.js","sourcesContent":["import type { SanitizableDocumentType } from '../sanitize/index.js';\n\n/** Document types supported by compare, batch, and diff platform APIs. */\nexport type PlatformDocumentType = SanitizableDocumentType | 'pix' | 'brcode';\n\nexport const PLATFORM_DOCUMENT_TYPES = [\n 'cpf',\n 'cnpj',\n 'cep',\n 'placa',\n 'pis-pasep',\n 'telefone',\n 'cnh',\n 'renavam',\n 'titulo-eleitor',\n 'processo-judicial',\n 'rg',\n 'nfe-chave',\n 'boleto',\n 'cartao-credito',\n 'ean',\n 'inscricao-estadual',\n 'inscricao-estadual-produtor-rural',\n 'pix',\n 'brcode',\n] as const satisfies readonly PlatformDocumentType[];\n\nexport type PlatformOptions = {\n uf?: import('../types/validation-result.js').UfCode;\n};\n\nexport function isPlatformDocumentType(type: string): type is PlatformDocumentType {\n return (PLATFORM_DOCUMENT_TYPES as readonly string[]).includes(type);\n}\n","/**\n * Unified equality check — normalizes via strip/validate canonical (BR-COMPARE-001).\n * @see docs/OFFICIAL-SOURCES.md\n */\nimport { normalizeForPlatform } from '../platform/normalize.js';\nimport { isPlatformDocumentType } from '../platform/types.js';\nimport type { PlatformDocumentType, PlatformOptions } from '../platform/types.js';\n\nexport type CompareResult = {\n equal: boolean;\n};\n\nexport function compare(\n a: string,\n b: string,\n type: PlatformDocumentType,\n options: PlatformOptions = {},\n): CompareResult {\n const left = normalizeForPlatform(a, type, options);\n const right = normalizeForPlatform(b, type, options);\n return { equal: left === right };\n}\n\n/** Runtime guard for dynamic callers (non-exhaustive type string). */\nexport function compareRuntime(\n a: string,\n b: string,\n type: string,\n options: PlatformOptions = {},\n): CompareResult | { equal: false; code: 'UNSUPPORTED_FORMAT'; message: string } {\n if (!isPlatformDocumentType(type)) {\n return { equal: false, code: 'UNSUPPORTED_FORMAT', message: `Unknown document type: ${type}` };\n }\n return compare(a, b, type, options);\n}\n"]}
@@ -1,20 +1,21 @@
1
- import { formatProcessoJudicial } from './chunk-DVA6QQUF.js';
2
- import { formatTelefone } from './chunk-FL4UUTAC.js';
3
- import { formatTituloEleitor } from './chunk-4GMBZLAS.js';
4
- import { formatPisPasep } from './chunk-WAYYRZ2L.js';
5
- import { formatPixKey } from './chunk-274K6AOM.js';
6
- import { formatPlaca } from './chunk-TTDHGQEC.js';
7
- import { formatRenavam } from './chunk-43FQHKCC.js';
8
- import { formatIeProdutorRural } from './chunk-EGDZGSHA.js';
9
- import { formatNfeChave } from './chunk-Z7KH65RZ.js';
10
- import { formatCep } from './chunk-UXH6EHK6.js';
11
- import { formatCnh } from './chunk-MXOYICSK.js';
12
- import { formatCnpj } from './chunk-URNYB2CC.js';
13
- import { formatCpf } from './chunk-MNBNKSMF.js';
14
- import { formatRg } from './chunk-G557DGIX.js';
15
- import { formatInscricaoEstadual } from './chunk-P3EJRH4P.js';
16
- import { formatBoleto } from './chunk-LPGSPM53.js';
17
- import { formatCartaoCredito } from './chunk-OWD47AWI.js';
1
+ import { formatProcessoJudicial } from './chunk-O3HZW2GM.js';
2
+ import { formatTelefone } from './chunk-26HMLR4Y.js';
3
+ import { formatTituloEleitor } from './chunk-5I6WYO5R.js';
4
+ import { formatPisPasep } from './chunk-FI2JE6AS.js';
5
+ import { formatPixKey } from './chunk-RP5UWF2G.js';
6
+ import { formatPlaca } from './chunk-SQO7BO3Y.js';
7
+ import { formatRenavam } from './chunk-DMUWIPJR.js';
8
+ import { formatNfeChave } from './chunk-WKDCI3NI.js';
9
+ import { formatIeProdutorRural } from './chunk-3EVLQVBC.js';
10
+ import { formatCpf } from './chunk-WAVBQYPE.js';
11
+ import { formatEan } from './chunk-BSSRVJ2C.js';
12
+ import { formatCep } from './chunk-EDJC6HIP.js';
13
+ import { formatCnh } from './chunk-SXPLYH4N.js';
14
+ import { formatCnpj } from './chunk-RNI5G42M.js';
15
+ import { formatRg } from './chunk-E2BVDZKJ.js';
16
+ import { formatInscricaoEstadual } from './chunk-LXB5FIAQ.js';
17
+ import { formatBoleto } from './chunk-2EYJMAE2.js';
18
+ import { formatCartaoCredito } from './chunk-QZPKTG4A.js';
18
19
 
19
20
  // src/format/rg.ts
20
21
  function formatRg2(input, options) {
@@ -37,6 +38,7 @@ var MASKABLE_DOCUMENT_TYPES = [
37
38
  "nfe-chave",
38
39
  "boleto",
39
40
  "cartao-credito",
41
+ "ean",
40
42
  "inscricao-estadual",
41
43
  "inscricao-estadual-produtor-rural",
42
44
  "pix"
@@ -97,6 +99,8 @@ function dispatchMask(raw, type, options) {
97
99
  return formatBoleto(raw);
98
100
  case "cartao-credito":
99
101
  return formatCartaoCredito(raw);
102
+ case "ean":
103
+ return formatEan(raw);
100
104
  case "inscricao-estadual":
101
105
  return formatInscricaoEstadual(raw, { uf: options.uf });
102
106
  case "inscricao-estadual-produtor-rural":
@@ -115,5 +119,5 @@ function dispatchMask(raw, type, options) {
115
119
  }
116
120
 
117
121
  export { MASKABLE_DOCUMENT_TYPES, isMaskableDocumentType, mask, maskRuntime };
118
- //# sourceMappingURL=chunk-MXWI7LLA.js.map
119
- //# sourceMappingURL=chunk-MXWI7LLA.js.map
122
+ //# sourceMappingURL=chunk-47PZ7WGA.js.map
123
+ //# sourceMappingURL=chunk-47PZ7WGA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/format/rg.ts","../src/mask/index.ts"],"names":["formatRg"],"mappings":"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","file":"chunk-47PZ7WGA.js","sourcesContent":["import type { ValidateRgOptions } from '../core/rg/index.js';\nimport { formatRg as formatRgCore } from '../core/rg/index.js';\n\nexport function formatRg(input: string, options: ValidateRgOptions): ReturnType<typeof formatRgCore> {\n return formatRgCore(input, options);\n}\n","/**\n * Unified display mask — delegates to existing `format*` (BR-MASK-001).\n * @see docs/use-cases/UC-003-format-document.md\n * @see docs/OFFICIAL-SOURCES.md\n */\nimport { formatInscricaoEstadual } from '../core/inscricao-estadual/index.js';\nimport { formatBoleto } from '../format/boleto.js';\nimport { formatCartaoCredito } from '../format/cartao-credito.js';\nimport { formatEan } from '../format/ean.js';\nimport { formatCep } from '../format/cep.js';\nimport { formatCnh } from '../format/cnh.js';\nimport { formatCnpj } from '../format/cnpj.js';\nimport { formatCpf } from '../format/cpf.js';\nimport { formatIeProdutorRural } from '../format/inscricao-estadual-produtor-rural.js';\nimport { formatNfeChave } from '../format/nfe-chave.js';\nimport { formatPisPasep } from '../format/pis-pasep.js';\nimport { formatPixKey } from '../format/pix.js';\nimport { formatPlaca } from '../format/placa.js';\nimport { formatProcessoJudicial } from '../format/processo-judicial.js';\nimport { formatRg } from '../format/rg.js';\nimport { formatRenavam } from '../format/renavam.js';\nimport { formatTelefone } from '../format/telefone.js';\nimport { formatTituloEleitor } from '../format/titulo-eleitor.js';\nimport type { FormatResult, RgUfCode, UfCode } from '../types/validation-result.js';\n\nexport type MaskableDocumentType =\n | 'cpf'\n | 'cnpj'\n | 'cep'\n | 'placa'\n | 'pis-pasep'\n | 'telefone'\n | 'cnh'\n | 'renavam'\n | 'titulo-eleitor'\n | 'processo-judicial'\n | 'rg'\n | 'nfe-chave'\n | 'boleto'\n | 'cartao-credito'\n | 'ean'\n | 'inscricao-estadual'\n | 'inscricao-estadual-produtor-rural'\n | 'pix';\n\nexport const MASKABLE_DOCUMENT_TYPES = [\n 'cpf',\n 'cnpj',\n 'cep',\n 'placa',\n 'pis-pasep',\n 'telefone',\n 'cnh',\n 'renavam',\n 'titulo-eleitor',\n 'processo-judicial',\n 'rg',\n 'nfe-chave',\n 'boleto',\n 'cartao-credito',\n 'ean',\n 'inscricao-estadual',\n 'inscricao-estadual-produtor-rural',\n 'pix',\n] as const satisfies readonly MaskableDocumentType[];\n\nexport type MaskOptions = {\n uf?: UfCode;\n};\n\nexport function isMaskableDocumentType(type: string): type is MaskableDocumentType {\n return (MASKABLE_DOCUMENT_TYPES as readonly string[]).includes(type);\n}\n\nexport function mask(\n raw: string,\n type: MaskableDocumentType,\n options: MaskOptions = {},\n): FormatResult {\n if (type === 'inscricao-estadual' && !options.uf) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'UF is required for inscricao-estadual masking',\n };\n }\n\n if (type === 'rg' && !options.uf) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'UF is required for RG masking',\n };\n }\n\n return dispatchMask(raw, type, options);\n}\n\n/** Runtime guard for dynamic callers (non-exhaustive type string). */\nexport function maskRuntime(\n type: string,\n raw: string,\n options: MaskOptions = {},\n): FormatResult {\n if (!isMaskableDocumentType(type)) {\n return { ok: false, code: 'UNSUPPORTED_FORMAT', message: `Unknown document type: ${type}` };\n }\n return mask(raw, type, options);\n}\n\nfunction dispatchMask(raw: string, type: MaskableDocumentType, options: MaskOptions): FormatResult {\n switch (type) {\n case 'cpf':\n return formatCpf(raw);\n case 'cnpj':\n return formatCnpj(raw);\n case 'cep':\n return formatCep(raw);\n case 'placa':\n return formatPlaca(raw);\n case 'pis-pasep':\n return formatPisPasep(raw);\n case 'telefone':\n return formatTelefone(raw);\n case 'cnh':\n return formatCnh(raw);\n case 'renavam':\n return formatRenavam(raw);\n case 'titulo-eleitor':\n return formatTituloEleitor(raw);\n case 'processo-judicial':\n return formatProcessoJudicial(raw);\n case 'rg':\n return formatRg(raw, { uf: options.uf as RgUfCode });\n case 'nfe-chave':\n return formatNfeChave(raw);\n case 'boleto':\n return formatBoleto(raw);\n case 'cartao-credito':\n return formatCartaoCredito(raw);\n case 'ean':\n return formatEan(raw);\n case 'inscricao-estadual':\n return formatInscricaoEstadual(raw, { uf: options.uf as UfCode });\n case 'inscricao-estadual-produtor-rural':\n return formatIeProdutorRural(raw);\n case 'pix':\n return formatPixKey(raw);\n default: {\n const _exhaustive: never = type;\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: `Unsupported type: ${String(_exhaustive)}`,\n };\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { CNPJ_MASK_PATTERN } from './chunk-2M4RVHRO.js';
1
+ import { CNPJ_MASK_PATTERN } from './chunk-MLUDCL3P.js';
2
2
 
3
3
  // src/core/cnpj/mask.ts
4
4
  function applyCnpjMask(canonical) {
@@ -10,5 +10,5 @@ function applyCnpjMask(canonical) {
10
10
  }
11
11
 
12
12
  export { applyCnpjMask };
13
- //# sourceMappingURL=chunk-3OTYX7QX.js.map
14
- //# sourceMappingURL=chunk-3OTYX7QX.js.map
13
+ //# sourceMappingURL=chunk-4T2ZBJFM.js.map
14
+ //# sourceMappingURL=chunk-4T2ZBJFM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/cnpj/mask.ts"],"names":[],"mappings":";;;AAGO,SAAS,cAAc,SAAA,EAA2B;AACvD,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAA;AAC9C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,IAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE","file":"chunk-3OTYX7QX.js","sourcesContent":["import { CNPJ_MASK_PATTERN } from './constants.js';\n\n/** Mask XX.XXX.XXX/XXXX-DD — same for numeric and alphanumeric (RFB Q21). */\nexport function applyCnpjMask(canonical: string): string {\n const match = CNPJ_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CNPJ must have exactly 14 characters to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}/${match[4]}-${match[5]}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/cnpj/mask.ts"],"names":[],"mappings":";;;AAGO,SAAS,cAAc,SAAA,EAA2B;AACvD,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAA;AAC9C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,IAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE","file":"chunk-4T2ZBJFM.js","sourcesContent":["import { CNPJ_MASK_PATTERN } from './constants.js';\n\n/** Mask XX.XXX.XXX/XXXX-DD — same for numeric and alphanumeric (RFB Q21). */\nexport function applyCnpjMask(canonical: string): string {\n const match = CNPJ_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CNPJ must have exactly 14 characters to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}/${match[4]}-${match[5]}`;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { validateTituloEleitor, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED } from './chunk-PN4XUBLV.js';
1
+ import { validateTituloEleitor, TITULO_ELEITOR_NUMERIC_PATTERN_12, TITULO_ELEITOR_NUMERIC_PATTERN_13, TITULO_ELEITOR_LENGTH, TITULO_ELEITOR_LENGTH_EXTENDED } from './chunk-Q2CFVQ2U.js';
2
2
 
3
3
  // src/core/titulo-eleitor/mask.ts
4
4
  function applyTituloEleitorMask(canonical) {
@@ -23,5 +23,5 @@ function formatTituloEleitor(input) {
23
23
  }
24
24
 
25
25
  export { formatTituloEleitor };
26
- //# sourceMappingURL=chunk-4GMBZLAS.js.map
27
- //# sourceMappingURL=chunk-4GMBZLAS.js.map
26
+ //# sourceMappingURL=chunk-5I6WYO5R.js.map
27
+ //# sourceMappingURL=chunk-5I6WYO5R.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/titulo-eleitor/mask.ts","../src/format/titulo-eleitor.ts"],"names":[],"mappings":";;;AAWO,SAAS,uBAAuB,SAAA,EAA2B;AAChE,EAAA,IAAI,iCAAA,CAAkC,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,GAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,iCAAA,CAAkC,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,GAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,uCAAA,EAAuC,qBAAqB,CAAA,IAAA,EAAO,8BAA8B,CAAA,iBAAA;AAAA,GACnG;AACF;;;ACjBO,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-4GMBZLAS.js","sourcesContent":["import {\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_NUMERIC_PATTERN_12,\n TITULO_ELEITOR_NUMERIC_PATTERN_13,\n} from './constants.js';\n\n/**\n * Display mask — `XXXX XXXX XXXX` (BR-TITULO-005).\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n */\nexport function applyTituloEleitorMask(canonical: string): string {\n if (TITULO_ELEITOR_NUMERIC_PATTERN_12.test(canonical)) {\n return `${canonical.slice(0, 4)} ${canonical.slice(4, 8)} ${canonical.slice(8)}`;\n }\n if (TITULO_ELEITOR_NUMERIC_PATTERN_13.test(canonical)) {\n return `${canonical.slice(0, 5)} ${canonical.slice(5, 9)} ${canonical.slice(9)}`;\n }\n throw new Error(\n `Título de Eleitor must have exactly ${TITULO_ELEITOR_LENGTH} or ${TITULO_ELEITOR_LENGTH_EXTENDED} digits to format`,\n );\n}\n","import { applyTituloEleitorMask } from '../core/titulo-eleitor/mask.js';\nimport { validateTituloEleitor } from '../core/titulo-eleitor/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatTituloEleitor(input: string): FormatResult {\n const result = validateTituloEleitor(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyTituloEleitorMask(result.value) };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/titulo-eleitor/mask.ts","../src/format/titulo-eleitor.ts"],"names":[],"mappings":";;;AAWO,SAAS,uBAAuB,SAAA,EAA2B;AAChE,EAAA,IAAI,iCAAA,CAAkC,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,GAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,iCAAA,CAAkC,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,GAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,uCAAA,EAAuC,qBAAqB,CAAA,IAAA,EAAO,8BAA8B,CAAA,iBAAA;AAAA,GACnG;AACF;;;ACjBO,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-5I6WYO5R.js","sourcesContent":["import {\n TITULO_ELEITOR_LENGTH,\n TITULO_ELEITOR_LENGTH_EXTENDED,\n TITULO_ELEITOR_NUMERIC_PATTERN_12,\n TITULO_ELEITOR_NUMERIC_PATTERN_13,\n} from './constants.js';\n\n/**\n * Display mask — `XXXX XXXX XXXX` (BR-TITULO-005).\n * @see https://pt.wikipedia.org/wiki/T%C3%ADtulo_eleitoral#C%C3%A1lculo_do_d%C3%ADgito_verificador\n */\nexport function applyTituloEleitorMask(canonical: string): string {\n if (TITULO_ELEITOR_NUMERIC_PATTERN_12.test(canonical)) {\n return `${canonical.slice(0, 4)} ${canonical.slice(4, 8)} ${canonical.slice(8)}`;\n }\n if (TITULO_ELEITOR_NUMERIC_PATTERN_13.test(canonical)) {\n return `${canonical.slice(0, 5)} ${canonical.slice(5, 9)} ${canonical.slice(9)}`;\n }\n throw new Error(\n `Título de Eleitor must have exactly ${TITULO_ELEITOR_LENGTH} or ${TITULO_ELEITOR_LENGTH_EXTENDED} digits to format`,\n );\n}\n","import { applyTituloEleitorMask } from '../core/titulo-eleitor/mask.js';\nimport { validateTituloEleitor } from '../core/titulo-eleitor/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatTituloEleitor(input: string): FormatResult {\n const result = validateTituloEleitor(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyTituloEleitorMask(result.value) };\n}\n"]}
@@ -1,10 +1,10 @@
1
- import { applyCnpjMask } from './chunk-3OTYX7QX.js';
2
- import { validateCnpj, detectCnpjFormat } from './chunk-2M4RVHRO.js';
3
- import { stripCnpj } from './chunk-EB3G4IG6.js';
4
- import { applyCpfMask } from './chunk-5S3IURHL.js';
5
- import { validateCpf } from './chunk-HCH6G5XY.js';
1
+ import { applyCpfMask } from './chunk-O7RJQUAJ.js';
2
+ import { validateCpf } from './chunk-PUTVO6HG.js';
6
3
  import { stripCpf } from './chunk-UCJPSJN5.js';
7
- import { brandPixKey } from './chunk-4NFEM2SU.js';
4
+ import { applyCnpjMask } from './chunk-4T2ZBJFM.js';
5
+ import { validateCnpj, detectCnpjFormat } from './chunk-MLUDCL3P.js';
6
+ import { stripCnpj } from './chunk-EB3G4IG6.js';
7
+ import { brandPixKey } from './chunk-EMZCVV5Y.js';
8
8
 
9
9
  // src/core/pix/cnpj.ts
10
10
  function failure(code, message) {
@@ -251,5 +251,5 @@ function validatePixKey(input, options) {
251
251
  }
252
252
 
253
253
  export { PIX_DICT_API_SOURCE_URL, PIX_GOLDEN_CNPJ_ALPHANUMERIC, PIX_GOLDEN_CNPJ_NUMERIC, PIX_GOLDEN_CPF, PIX_GOLDEN_EMAIL, PIX_GOLDEN_EVP, PIX_GOLDEN_PHONE, PIX_OFFICIAL_SOURCE_URL, applyPixCnpjKeyMask, applyPixCpfKeyMask, applyPixEmailKeyMask, applyPixEvpKeyMask, applyPixPhoneKeyMask, detectPixKeyType, isValidPixKey, validatePixCnpjKey, validatePixCpfKey, validatePixEmailKey, validatePixEvpKey, validatePixKey, validatePixPhoneKey };
254
- //# sourceMappingURL=chunk-ZZN5JNVJ.js.map
255
- //# sourceMappingURL=chunk-ZZN5JNVJ.js.map
254
+ //# sourceMappingURL=chunk-7EMUKPPG.js.map
255
+ //# sourceMappingURL=chunk-7EMUKPPG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/pix/cnpj.ts","../src/core/pix/cpf.ts","../src/core/pix/constants.ts","../src/core/pix/detect.ts","../src/core/pix/email.ts","../src/core/pix/evp.ts","../src/core/pix/phone.ts","../src/core/pix/mask.ts","../src/core/pix/index.ts"],"names":["failure"],"mappings":"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","file":"chunk-ZZN5JNVJ.js","sourcesContent":["import { validateCnpj } from '../cnpj/index.js';\nimport type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'cnpj' };\n}\n\nexport function validatePixCnpjKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX CNPJ key input is empty');\n }\n\n const result = validateCnpj(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message, keyType: 'cnpj' };\n }\n\n return {\n ok: true,\n value: brandPixKey(result.value),\n keyType: 'cnpj',\n format: result.format,\n };\n}\n","import { validateCpf } from '../cpf/index.js';\nimport type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'cpf' };\n}\n\nexport function validatePixCpfKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX CPF key input is empty');\n }\n\n const result = validateCpf(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message, keyType: 'cpf' };\n }\n\n return {\n ok: true,\n value: brandPixKey(result.value),\n keyType: 'cpf',\n format: result.format,\n };\n}\n","/**\n * PIX key constants — Bacen DICT API + Manual de Iniciação do Pix.\n * @see https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html\n * @see https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf\n * @see docs/use-cases/UC-005-validate-pix-key.md\n */\nexport const PIX_EMAIL_MAX_LENGTH = 77;\nexport const PIX_EMAIL_PATTERN =\n /^[a-z0-9.!#$'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/;\n\nexport const PIX_PHONE_E164_PATTERN = /^\\+[1-9]\\d{1,14}$/;\nexport const PIX_PHONE_BR_MOBILE_PATTERN = /^\\+55\\d{2}9\\d{8}$/;\n\nexport const PIX_EVP_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport const PIX_CPF_DIGITS_PATTERN = /^[0-9]{11}$/;\n\nexport const PIX_GOLDEN_CPF = '12345678909';\nexport const PIX_GOLDEN_CNPJ_NUMERIC = '11222333000181';\nexport const PIX_GOLDEN_CNPJ_ALPHANUMERIC = '12ABC34501DE35';\nexport const PIX_GOLDEN_EMAIL = 'pix@bcb.gov.br';\nexport const PIX_GOLDEN_PHONE = '+5510998765432';\nexport const PIX_GOLDEN_PHONE_SECONDARY = '+5561912345678';\nexport const PIX_GOLDEN_EVP = '123e4567-e89b-12d3-a456-426655440000';\nexport const PIX_GOLDEN_EMAIL_SECONDARY = 'fulano_da_silva.recebedor@example.com';\n\nexport const PIX_OFFICIAL_SOURCE_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf';\n\nexport const PIX_DICT_API_SOURCE_URL =\n 'https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html';\n","import { stripCnpj } from '../../strip/cnpj.js';\nimport { stripCpf } from '../../strip/cpf.js';\nimport type { PixKeyType } from '../../types/validation-result.js';\nimport { detectCnpjFormat } from '../cnpj/detect.js';\nimport {\n PIX_CPF_DIGITS_PATTERN,\n PIX_EVP_PATTERN,\n} from './constants.js';\n\nexport type DetectedPixKeyType = PixKeyType | 'unknown';\n\nfunction isCpfShapedInput(input: string): boolean {\n const trimmed = input.trim();\n const stripped = stripCpf(trimmed);\n if (!PIX_CPF_DIGITS_PATTERN.test(stripped)) {\n return false;\n }\n return /^[\\d.\\-\\s]+$/.test(trimmed);\n}\n\nfunction isCnpjShapedInput(input: string): boolean {\n const trimmed = input.trim();\n const stripped = stripCnpj(trimmed);\n if (detectCnpjFormat(stripped) === 'unknown') {\n return false;\n }\n return /^[A-Za-z0-9./\\-\\s]+$/.test(trimmed);\n}\n\nexport function detectPixKeyType(input: string): DetectedPixKeyType {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return 'unknown';\n }\n\n if (trimmed.includes('@')) {\n return 'email';\n }\n\n if (trimmed.startsWith('+')) {\n return 'phone';\n }\n\n if (PIX_EVP_PATTERN.test(trimmed)) {\n return 'evp';\n }\n\n if (isCpfShapedInput(trimmed)) {\n return 'cpf';\n }\n\n if (isCnpjShapedInput(trimmed)) {\n return 'cnpj';\n }\n\n return 'unknown';\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_EMAIL_MAX_LENGTH, PIX_EMAIL_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'email' };\n}\n\nexport function validatePixEmailKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX email key input is empty');\n }\n\n if (trimmed !== trimmed.toLowerCase()) {\n return failure('INVALID_CHARACTER', 'PIX email key must be lowercase');\n }\n\n if (trimmed.length > PIX_EMAIL_MAX_LENGTH) {\n return failure('INVALID_LENGTH', `PIX email key must have at most ${PIX_EMAIL_MAX_LENGTH} characters`);\n }\n\n if (!trimmed.includes('@') || !PIX_EMAIL_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX email key format is invalid');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'email',\n format: 'email',\n };\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_EVP_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'evp' };\n}\n\nexport function validatePixEvpKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX EVP key input is empty');\n }\n\n if (trimmed !== trimmed.toLowerCase()) {\n return failure('INVALID_CHARACTER', 'PIX EVP key must be lowercase');\n }\n\n if (!PIX_EVP_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX EVP key must be a lowercase UUID with hyphens');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'evp',\n format: 'evp',\n };\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_PHONE_BR_MOBILE_PATTERN, PIX_PHONE_E164_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'phone' };\n}\n\nexport function validatePixPhoneKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX phone key input is empty');\n }\n\n if (!trimmed.startsWith('+')) {\n return failure('INVALID_CHARACTER', 'PIX phone key must start with + (E.164)');\n }\n\n if (!PIX_PHONE_E164_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'PIX phone key contains invalid characters');\n }\n\n if (!trimmed.startsWith('+55')) {\n return failure('UNSUPPORTED_FORMAT', 'PIX phone key must use Brazilian country code +55');\n }\n\n if (!PIX_PHONE_BR_MOBILE_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX phone key must match Brazilian mobile format +55DD9XXXXXXXX');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'phone',\n format: 'phone',\n };\n}\n","/**\n * PIX key display masks — delegates to parent validators where applicable (BR-PIX-001…005).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport { applyCnpjMask } from '../cnpj/mask.js';\nimport { applyCpfMask } from '../cpf/mask.js';\n\nexport function applyPixCpfKeyMask(canonical: string): string {\n return applyCpfMask(canonical);\n}\n\nexport function applyPixCnpjKeyMask(canonical: string): string {\n return applyCnpjMask(canonical);\n}\n\n/** Brazilian mobile E.164 → +55 (DD) 9XXXX-XXXX display. */\nexport function applyPixPhoneKeyMask(e164: string): string {\n const match = /^\\+55(\\d{2})(9\\d{4})(\\d{4})$/.exec(e164);\n if (!match) {\n throw new Error('PIX phone key must be a validated Brazilian mobile E.164 number');\n }\n return `+55 (${match[1]}) ${match[2]}-${match[3]}`;\n}\n\nexport function applyPixEmailKeyMask(email: string): string {\n return email.toLowerCase().trim();\n}\n\nexport function applyPixEvpKeyMask(uuid: string): string {\n return uuid.toLowerCase();\n}\n","/**\n * PIX key validation — five Bacen types (CPF, CNPJ, email, phone, EVP).\n * @see docs/use-cases/UC-005-validate-pix-key.md\n */\nimport type { PixKeyType, PixValidationResult } from '../../types/validation-result.js';\nimport { validatePixCnpjKey } from './cnpj.js';\nimport { validatePixCpfKey } from './cpf.js';\nimport { detectPixKeyType } from './detect.js';\nimport { validatePixEmailKey } from './email.js';\nimport { validatePixEvpKey } from './evp.js';\nimport { validatePixPhoneKey } from './phone.js';\n\nexport {\n PIX_DICT_API_SOURCE_URL,\n PIX_GOLDEN_CNPJ_ALPHANUMERIC,\n PIX_GOLDEN_CNPJ_NUMERIC,\n PIX_GOLDEN_CPF,\n PIX_GOLDEN_EMAIL,\n PIX_GOLDEN_EMAIL_SECONDARY,\n PIX_GOLDEN_EVP,\n PIX_GOLDEN_PHONE,\n PIX_GOLDEN_PHONE_SECONDARY,\n PIX_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { detectPixKeyType, type DetectedPixKeyType } from './detect.js';\nexport { validatePixCpfKey } from './cpf.js';\nexport { validatePixCnpjKey } from './cnpj.js';\nexport { validatePixEmailKey } from './email.js';\nexport { validatePixPhoneKey } from './phone.js';\nexport { validatePixEvpKey } from './evp.js';\nexport {\n applyPixCnpjKeyMask,\n applyPixCpfKeyMask,\n applyPixEmailKeyMask,\n applyPixEvpKeyMask,\n applyPixPhoneKeyMask,\n} from './mask.js';\n\nexport type ValidatePixKeyOptions = {\n type?: PixKeyType;\n};\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, keyType?: PixKeyType): FailedResult {\n return { ok: false, code, message, ...(keyType ? { keyType } : {}) };\n}\n\nfunction validateByType(input: string, keyType: PixKeyType): PixValidationResult {\n switch (keyType) {\n case 'cpf':\n return validatePixCpfKey(input);\n case 'cnpj':\n return validatePixCnpjKey(input);\n case 'email':\n return validatePixEmailKey(input);\n case 'phone':\n return validatePixPhoneKey(input);\n case 'evp':\n return validatePixEvpKey(input);\n default: {\n const _exhaustive: never = keyType;\n return failure('UNSUPPORTED_FORMAT', `Unknown PIX key type: ${_exhaustive}`);\n }\n }\n}\n\nexport function isValidPixKey(input: string, options?: ValidatePixKeyOptions): boolean {\n return validatePixKey(input, options).ok;\n}\n\nexport function validatePixKey(input: string, options?: ValidatePixKeyOptions): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX key input is empty');\n }\n\n const detected = detectPixKeyType(trimmed);\n\n if (options?.type !== undefined) {\n if (detected !== 'unknown' && detected !== options.type) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `PIX key detected as ${detected} but forced type is ${options.type}`,\n options.type,\n );\n }\n return validateByType(trimmed, options.type);\n }\n\n if (detected === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'PIX key type could not be determined');\n }\n\n return validateByType(trimmed, detected);\n}\n"]}
1
+ {"version":3,"sources":["../src/core/pix/cnpj.ts","../src/core/pix/cpf.ts","../src/core/pix/constants.ts","../src/core/pix/detect.ts","../src/core/pix/email.ts","../src/core/pix/evp.ts","../src/core/pix/phone.ts","../src/core/pix/mask.ts","../src/core/pix/index.ts"],"names":["failure"],"mappings":"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","file":"chunk-7EMUKPPG.js","sourcesContent":["import { validateCnpj } from '../cnpj/index.js';\nimport type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'cnpj' };\n}\n\nexport function validatePixCnpjKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX CNPJ key input is empty');\n }\n\n const result = validateCnpj(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message, keyType: 'cnpj' };\n }\n\n return {\n ok: true,\n value: brandPixKey(result.value),\n keyType: 'cnpj',\n format: result.format,\n };\n}\n","import { validateCpf } from '../cpf/index.js';\nimport type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'cpf' };\n}\n\nexport function validatePixCpfKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX CPF key input is empty');\n }\n\n const result = validateCpf(trimmed);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message, keyType: 'cpf' };\n }\n\n return {\n ok: true,\n value: brandPixKey(result.value),\n keyType: 'cpf',\n format: result.format,\n };\n}\n","/**\n * PIX key constants — Bacen DICT API + Manual de Iniciação do Pix.\n * @see https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html\n * @see https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf\n * @see docs/use-cases/UC-005-validate-pix-key.md\n */\nexport const PIX_EMAIL_MAX_LENGTH = 77;\nexport const PIX_EMAIL_PATTERN =\n /^[a-z0-9.!#$'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/;\n\nexport const PIX_PHONE_E164_PATTERN = /^\\+[1-9]\\d{1,14}$/;\nexport const PIX_PHONE_BR_MOBILE_PATTERN = /^\\+55\\d{2}9\\d{8}$/;\n\nexport const PIX_EVP_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport const PIX_CPF_DIGITS_PATTERN = /^[0-9]{11}$/;\n\nexport const PIX_GOLDEN_CPF = '12345678909';\nexport const PIX_GOLDEN_CNPJ_NUMERIC = '11222333000181';\nexport const PIX_GOLDEN_CNPJ_ALPHANUMERIC = '12ABC34501DE35';\nexport const PIX_GOLDEN_EMAIL = 'pix@bcb.gov.br';\nexport const PIX_GOLDEN_PHONE = '+5510998765432';\nexport const PIX_GOLDEN_PHONE_SECONDARY = '+5561912345678';\nexport const PIX_GOLDEN_EVP = '123e4567-e89b-12d3-a456-426655440000';\nexport const PIX_GOLDEN_EMAIL_SECONDARY = 'fulano_da_silva.recebedor@example.com';\n\nexport const PIX_OFFICIAL_SOURCE_URL =\n 'https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf';\n\nexport const PIX_DICT_API_SOURCE_URL =\n 'https://aprendervalor.bcb.gov.br/content/estabilidadefinanceira/pix/API-DICT_v2-9-0.html';\n","import { stripCnpj } from '../../strip/cnpj.js';\nimport { stripCpf } from '../../strip/cpf.js';\nimport type { PixKeyType } from '../../types/validation-result.js';\nimport { detectCnpjFormat } from '../cnpj/detect.js';\nimport {\n PIX_CPF_DIGITS_PATTERN,\n PIX_EVP_PATTERN,\n} from './constants.js';\n\nexport type DetectedPixKeyType = PixKeyType | 'unknown';\n\nfunction isCpfShapedInput(input: string): boolean {\n const trimmed = input.trim();\n const stripped = stripCpf(trimmed);\n if (!PIX_CPF_DIGITS_PATTERN.test(stripped)) {\n return false;\n }\n return /^[\\d.\\-\\s]+$/.test(trimmed);\n}\n\nfunction isCnpjShapedInput(input: string): boolean {\n const trimmed = input.trim();\n const stripped = stripCnpj(trimmed);\n if (detectCnpjFormat(stripped) === 'unknown') {\n return false;\n }\n return /^[A-Za-z0-9./\\-\\s]+$/.test(trimmed);\n}\n\nexport function detectPixKeyType(input: string): DetectedPixKeyType {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return 'unknown';\n }\n\n if (trimmed.includes('@')) {\n return 'email';\n }\n\n if (trimmed.startsWith('+')) {\n return 'phone';\n }\n\n if (PIX_EVP_PATTERN.test(trimmed)) {\n return 'evp';\n }\n\n if (isCpfShapedInput(trimmed)) {\n return 'cpf';\n }\n\n if (isCnpjShapedInput(trimmed)) {\n return 'cnpj';\n }\n\n return 'unknown';\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_EMAIL_MAX_LENGTH, PIX_EMAIL_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'email' };\n}\n\nexport function validatePixEmailKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX email key input is empty');\n }\n\n if (trimmed !== trimmed.toLowerCase()) {\n return failure('INVALID_CHARACTER', 'PIX email key must be lowercase');\n }\n\n if (trimmed.length > PIX_EMAIL_MAX_LENGTH) {\n return failure('INVALID_LENGTH', `PIX email key must have at most ${PIX_EMAIL_MAX_LENGTH} characters`);\n }\n\n if (!trimmed.includes('@') || !PIX_EMAIL_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX email key format is invalid');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'email',\n format: 'email',\n };\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_EVP_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'evp' };\n}\n\nexport function validatePixEvpKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX EVP key input is empty');\n }\n\n if (trimmed !== trimmed.toLowerCase()) {\n return failure('INVALID_CHARACTER', 'PIX EVP key must be lowercase');\n }\n\n if (!PIX_EVP_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX EVP key must be a lowercase UUID with hyphens');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'evp',\n format: 'evp',\n };\n}\n","import type { PixValidationResult } from '../../types/validation-result.js';\nimport { brandPixKey } from '../../types/validation-result.js';\nimport { PIX_PHONE_BR_MOBILE_PATTERN, PIX_PHONE_E164_PATTERN } from './constants.js';\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, keyType: 'phone' };\n}\n\nexport function validatePixPhoneKey(input: string): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX phone key input is empty');\n }\n\n if (!trimmed.startsWith('+')) {\n return failure('INVALID_CHARACTER', 'PIX phone key must start with + (E.164)');\n }\n\n if (!PIX_PHONE_E164_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'PIX phone key contains invalid characters');\n }\n\n if (!trimmed.startsWith('+55')) {\n return failure('UNSUPPORTED_FORMAT', 'PIX phone key must use Brazilian country code +55');\n }\n\n if (!PIX_PHONE_BR_MOBILE_PATTERN.test(trimmed)) {\n return failure('UNSUPPORTED_FORMAT', 'PIX phone key must match Brazilian mobile format +55DD9XXXXXXXX');\n }\n\n return {\n ok: true,\n value: brandPixKey(trimmed),\n keyType: 'phone',\n format: 'phone',\n };\n}\n","/**\n * PIX key display masks — delegates to parent validators where applicable (BR-PIX-001…005).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport { applyCnpjMask } from '../cnpj/mask.js';\nimport { applyCpfMask } from '../cpf/mask.js';\n\nexport function applyPixCpfKeyMask(canonical: string): string {\n return applyCpfMask(canonical);\n}\n\nexport function applyPixCnpjKeyMask(canonical: string): string {\n return applyCnpjMask(canonical);\n}\n\n/** Brazilian mobile E.164 → +55 (DD) 9XXXX-XXXX display. */\nexport function applyPixPhoneKeyMask(e164: string): string {\n const match = /^\\+55(\\d{2})(9\\d{4})(\\d{4})$/.exec(e164);\n if (!match) {\n throw new Error('PIX phone key must be a validated Brazilian mobile E.164 number');\n }\n return `+55 (${match[1]}) ${match[2]}-${match[3]}`;\n}\n\nexport function applyPixEmailKeyMask(email: string): string {\n return email.toLowerCase().trim();\n}\n\nexport function applyPixEvpKeyMask(uuid: string): string {\n return uuid.toLowerCase();\n}\n","/**\n * PIX key validation — five Bacen types (CPF, CNPJ, email, phone, EVP).\n * @see docs/use-cases/UC-005-validate-pix-key.md\n */\nimport type { PixKeyType, PixValidationResult } from '../../types/validation-result.js';\nimport { validatePixCnpjKey } from './cnpj.js';\nimport { validatePixCpfKey } from './cpf.js';\nimport { detectPixKeyType } from './detect.js';\nimport { validatePixEmailKey } from './email.js';\nimport { validatePixEvpKey } from './evp.js';\nimport { validatePixPhoneKey } from './phone.js';\n\nexport {\n PIX_DICT_API_SOURCE_URL,\n PIX_GOLDEN_CNPJ_ALPHANUMERIC,\n PIX_GOLDEN_CNPJ_NUMERIC,\n PIX_GOLDEN_CPF,\n PIX_GOLDEN_EMAIL,\n PIX_GOLDEN_EMAIL_SECONDARY,\n PIX_GOLDEN_EVP,\n PIX_GOLDEN_PHONE,\n PIX_GOLDEN_PHONE_SECONDARY,\n PIX_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { detectPixKeyType, type DetectedPixKeyType } from './detect.js';\nexport { validatePixCpfKey } from './cpf.js';\nexport { validatePixCnpjKey } from './cnpj.js';\nexport { validatePixEmailKey } from './email.js';\nexport { validatePixPhoneKey } from './phone.js';\nexport { validatePixEvpKey } from './evp.js';\nexport {\n applyPixCnpjKeyMask,\n applyPixCpfKeyMask,\n applyPixEmailKeyMask,\n applyPixEvpKeyMask,\n applyPixPhoneKeyMask,\n} from './mask.js';\n\nexport type ValidatePixKeyOptions = {\n type?: PixKeyType;\n};\n\ntype FailedResult = Extract<PixValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, keyType?: PixKeyType): FailedResult {\n return { ok: false, code, message, ...(keyType ? { keyType } : {}) };\n}\n\nfunction validateByType(input: string, keyType: PixKeyType): PixValidationResult {\n switch (keyType) {\n case 'cpf':\n return validatePixCpfKey(input);\n case 'cnpj':\n return validatePixCnpjKey(input);\n case 'email':\n return validatePixEmailKey(input);\n case 'phone':\n return validatePixPhoneKey(input);\n case 'evp':\n return validatePixEvpKey(input);\n default: {\n const _exhaustive: never = keyType;\n return failure('UNSUPPORTED_FORMAT', `Unknown PIX key type: ${_exhaustive}`);\n }\n }\n}\n\nexport function isValidPixKey(input: string, options?: ValidatePixKeyOptions): boolean {\n return validatePixKey(input, options).ok;\n}\n\nexport function validatePixKey(input: string, options?: ValidatePixKeyOptions): PixValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'PIX key input is empty');\n }\n\n const detected = detectPixKeyType(trimmed);\n\n if (options?.type !== undefined) {\n if (detected !== 'unknown' && detected !== options.type) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `PIX key detected as ${detected} but forced type is ${options.type}`,\n options.type,\n );\n }\n return validateByType(trimmed, options.type);\n }\n\n if (detected === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'PIX key type could not be determined');\n }\n\n return validateByType(trimmed, detected);\n}\n"]}
@@ -1,21 +1,12 @@
1
+ import { PIS_PASEP_LENGTH, PIS_PASEP_BASE_LENGTH, PIS_PASEP_DV_WEIGHTS } from './chunk-W64OQYC4.js';
1
2
  import { computeCheckDigit } from './chunk-OTZHMJYE.js';
2
- import { brandPisPasep } from './chunk-4NFEM2SU.js';
3
+ import { brandPisPasep } from './chunk-EMZCVV5Y.js';
3
4
 
4
5
  // src/strip/pis-pasep.ts
5
6
  function stripPisPasep(input) {
6
7
  return input.replace(/\D/g, "");
7
8
  }
8
9
 
9
- // src/core/pis-pasep/constants.ts
10
- var PIS_PASEP_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
11
- var PIS_PASEP_LENGTH = 11;
12
- var PIS_PASEP_BASE_LENGTH = 10;
13
- var PIS_PASEP_MASK_PATTERN = /^(\d{3})(\d{5})(\d{2})(\d{1})$/;
14
- var PIS_PASEP_GOLDEN_PRIMARY = "10027230888";
15
- var PIS_PASEP_GOLDEN_SECONDARY = "12056456402";
16
- var PIS_PASEP_GOLDEN_PRIMARY_MASKED = "100.27230.88-8";
17
- var PIS_PASEP_OFFICIAL_SOURCE_URL = "https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf";
18
-
19
10
  // src/core/pis-pasep/index.ts
20
11
  function failure(code, message) {
21
12
  return { ok: false, code, message };
@@ -68,6 +59,6 @@ function validatePisPasep(input) {
68
59
  return failure("INVALID_CHECK_DIGIT", "PIS/PASEP check digit is invalid");
69
60
  }
70
61
 
71
- export { PIS_PASEP_BASE_LENGTH, PIS_PASEP_DV_WEIGHTS, PIS_PASEP_GOLDEN_PRIMARY, PIS_PASEP_GOLDEN_PRIMARY_MASKED, PIS_PASEP_GOLDEN_SECONDARY, PIS_PASEP_MASK_PATTERN, PIS_PASEP_OFFICIAL_SOURCE_URL, isValidPisPasep, stripPisPasep, validatePisPasep };
72
- //# sourceMappingURL=chunk-ULNZHOMA.js.map
73
- //# sourceMappingURL=chunk-ULNZHOMA.js.map
62
+ export { isValidPisPasep, stripPisPasep, validatePisPasep };
63
+ //# sourceMappingURL=chunk-AG3VELYX.js.map
64
+ //# sourceMappingURL=chunk-AG3VELYX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/strip/pis-pasep.ts","../src/core/pis-pasep/index.ts"],"names":[],"mappings":";;;;;AAIO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;;;ACkBA,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,OAAO,IAAI,CAAA;AACpB;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,wBAAwB,QAAA,EAA2B;AAC1D,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,qBAAqB,CAAA;AACpD,EAAA,MAAM,aAAa,MAAA,CAAO,iBAAA,CAAkB,IAAA,EAAM,oBAAA,EAAsB,UAAU,CAAC,CAAA;AACnF,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,qBAAqB,CAAA,KAAM,UAAA;AACpD;AAEA,SAAS,iBAAA,CAAkB,OAAe,QAAA,EAAuC;AAC/E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,eAAe,0BAA0B,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAC7C,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,OAAA,CAAQ,qBAAqB,uCAAuC,CAAA;AAAA,EAC7E;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,gBAAA,EAAkB;AACxC,IAAA,OAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAA,oBAAA,EAAuB,gBAAgB,CAAA,2BAAA,CAA6B,CAAA;AAAA,EACvG;AAEA,EAAA,IAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAC/B,IAAA,OAAO,OAAA,CAAQ,yBAAyB,gDAAgD,CAAA;AAAA,EAC1F;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,gBAAgB,KAAA,EAAwB;AACtD,EAAA,OAAO,gBAAA,CAAiB,KAAK,CAAA,CAAE,EAAA;AACjC;AAEO,SAAS,iBAAiB,KAAA,EAAiC;AAChE,EAAA,MAAM,QAAA,GAAW,cAAc,KAAK,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AACpD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,IAAI,uBAAA,CAAwB,QAAQ,CAAA,EAAG;AACrC,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,cAAc,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAAA,EACvE;AAEA,EAAA,OAAO,OAAA,CAAQ,uBAAuB,kCAAkC,CAAA;AAC1E","file":"chunk-AG3VELYX.js","sourcesContent":["/**\n * Strip PIS/PASEP mask — digits only (BR-PIS-002).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n */\nexport function stripPisPasep(input: string): string {\n return input.replace(/\\D/g, '');\n}\n","/**\n * PIS/PASEP validation — modulo 11 (CNIS unified registry).\n * @see https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf — RV_03\n * @see docs/use-cases/UC-006-validate-pis-pasep.md — golden vector 10027230888\n */\nimport { stripPisPasep } from '../../strip/pis-pasep.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandPisPasep } from '../../types/validation-result.js';\nimport { computeCheckDigit } from '../cnpj/modulo11.js';\nimport {\n PIS_PASEP_BASE_LENGTH,\n PIS_PASEP_DV_WEIGHTS,\n PIS_PASEP_LENGTH,\n} from './constants.js';\n\nexport {\n PIS_PASEP_GOLDEN_PRIMARY,\n PIS_PASEP_GOLDEN_PRIMARY_MASKED,\n PIS_PASEP_GOLDEN_SECONDARY,\n PIS_PASEP_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction digitValue(char: string): number {\n return Number(char);\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 isValidPisPasepChecksum(stripped: string): boolean {\n const base = stripped.slice(0, PIS_PASEP_BASE_LENGTH);\n const dvExpected = String(computeCheckDigit(base, PIS_PASEP_DV_WEIGHTS, digitValue));\n return stripped.charAt(PIS_PASEP_BASE_LENGTH) === dvExpected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'PIS/PASEP input is empty');\n }\n\n const withoutMask = input.replace(/[.-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'PIS/PASEP contains invalid characters');\n }\n\n if (stripped.length !== PIS_PASEP_LENGTH) {\n return failure('INVALID_LENGTH', `PIS/PASEP must have ${PIS_PASEP_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'PIS/PASEP with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidPisPasep(input: string): boolean {\n return validatePisPasep(input).ok;\n}\n\nexport function validatePisPasep(input: string): ValidationResult {\n const stripped = stripPisPasep(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidPisPasepChecksum(stripped)) {\n return { ok: true, value: brandPisPasep(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'PIS/PASEP check digit is invalid');\n}\n"]}