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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +83 -12
  2. package/dist/batch.d.ts +28 -0
  3. package/dist/batch.js +29 -0
  4. package/dist/batch.js.map +1 -0
  5. package/dist/boleto.d.ts +58 -5
  6. package/dist/boleto.js +6 -3
  7. package/dist/brcode.d.ts +15 -3
  8. package/dist/brcode.js +8 -8
  9. package/dist/cartao-credito.d.ts +2 -2
  10. package/dist/cartao-credito.js +3 -3
  11. package/dist/cep.d.ts +2 -2
  12. package/dist/cep.js +4 -4
  13. package/dist/{chunk-WPL47PWJ.js → chunk-3LMDBXU6.js} +3 -3
  14. package/dist/{chunk-WPL47PWJ.js.map → chunk-3LMDBXU6.js.map} +1 -1
  15. package/dist/chunk-4J5IMD7B.js +3 -0
  16. package/dist/chunk-4J5IMD7B.js.map +1 -0
  17. package/dist/{chunk-BFZPCEYB.js → chunk-54UWHK5L.js} +3 -3
  18. package/dist/{chunk-BFZPCEYB.js.map → chunk-54UWHK5L.js.map} +1 -1
  19. package/dist/{chunk-F6PTZY4O.js → chunk-63G7QO73.js} +3 -3
  20. package/dist/{chunk-F6PTZY4O.js.map → chunk-63G7QO73.js.map} +1 -1
  21. package/dist/{chunk-3QP6R46N.js → chunk-665E36SC.js} +4 -4
  22. package/dist/{chunk-3QP6R46N.js.map → chunk-665E36SC.js.map} +1 -1
  23. package/dist/{chunk-AK5GVYQ5.js → chunk-ANWQBKGN.js} +3 -3
  24. package/dist/{chunk-AK5GVYQ5.js.map → chunk-ANWQBKGN.js.map} +1 -1
  25. package/dist/{chunk-D36RM7OD.js → chunk-AO6UTQ4A.js} +3 -3
  26. package/dist/{chunk-D36RM7OD.js.map → chunk-AO6UTQ4A.js.map} +1 -1
  27. package/dist/chunk-AU6TW3GH.js +136 -0
  28. package/dist/chunk-AU6TW3GH.js.map +1 -0
  29. package/dist/{chunk-XW5G2RAL.js → chunk-B6A7VF4R.js} +3 -3
  30. package/dist/{chunk-XW5G2RAL.js.map → chunk-B6A7VF4R.js.map} +1 -1
  31. package/dist/chunk-BFMRXXFE.js +99 -0
  32. package/dist/chunk-BFMRXXFE.js.map +1 -0
  33. package/dist/{chunk-Y6IW2LMW.js → chunk-CDNOUZEI.js} +3 -3
  34. package/dist/{chunk-Y6IW2LMW.js.map → chunk-CDNOUZEI.js.map} +1 -1
  35. package/dist/{chunk-XUO7FV6Z.js → chunk-CSRBRKXY.js} +3 -3
  36. package/dist/{chunk-XUO7FV6Z.js.map → chunk-CSRBRKXY.js.map} +1 -1
  37. package/dist/{chunk-DJUANFIK.js → chunk-CSVGWTCG.js} +3 -3
  38. package/dist/{chunk-DJUANFIK.js.map → chunk-CSVGWTCG.js.map} +1 -1
  39. package/dist/{chunk-5UL3M7IU.js → chunk-DAR6VOMT.js} +3 -3
  40. package/dist/{chunk-5UL3M7IU.js.map → chunk-DAR6VOMT.js.map} +1 -1
  41. package/dist/chunk-E2EFGMWA.js +200 -0
  42. package/dist/chunk-E2EFGMWA.js.map +1 -0
  43. package/dist/{chunk-KSLDM5AD.js → chunk-EVULAGR5.js} +3 -3
  44. package/dist/{chunk-KSLDM5AD.js.map → chunk-EVULAGR5.js.map} +1 -1
  45. package/dist/{chunk-YXELVV37.js → chunk-FBARVLLP.js} +4 -4
  46. package/dist/{chunk-YXELVV37.js.map → chunk-FBARVLLP.js.map} +1 -1
  47. package/dist/chunk-FKFRB3RJ.js +135 -0
  48. package/dist/chunk-FKFRB3RJ.js.map +1 -0
  49. package/dist/chunk-G6OBZRZM.js +131 -0
  50. package/dist/chunk-G6OBZRZM.js.map +1 -0
  51. package/dist/{chunk-MK7OJUF5.js → chunk-H3MLGGFI.js} +8 -8
  52. package/dist/{chunk-MK7OJUF5.js.map → chunk-H3MLGGFI.js.map} +1 -1
  53. package/dist/chunk-HUIMOB5E.js +41 -0
  54. package/dist/chunk-HUIMOB5E.js.map +1 -0
  55. package/dist/{chunk-WLE2ENQA.js → chunk-I66ZRSEN.js} +3 -3
  56. package/dist/{chunk-WLE2ENQA.js.map → chunk-I66ZRSEN.js.map} +1 -1
  57. package/dist/{chunk-Q7B5VOPW.js → chunk-I7DM47IR.js} +243 -37
  58. package/dist/chunk-I7DM47IR.js.map +1 -0
  59. package/dist/{chunk-GRDUTHNX.js → chunk-IYOPXJLY.js} +3 -3
  60. package/dist/{chunk-GRDUTHNX.js.map → chunk-IYOPXJLY.js.map} +1 -1
  61. package/dist/{chunk-4Y2FBO57.js → chunk-JKDU7QYP.js} +3 -3
  62. package/dist/{chunk-4Y2FBO57.js.map → chunk-JKDU7QYP.js.map} +1 -1
  63. package/dist/{chunk-KH7DWOUA.js → chunk-JLCQ7MGC.js} +3 -3
  64. package/dist/{chunk-KH7DWOUA.js.map → chunk-JLCQ7MGC.js.map} +1 -1
  65. package/dist/chunk-KBNWI6GE.js +3 -0
  66. package/dist/chunk-KBNWI6GE.js.map +1 -0
  67. package/dist/chunk-KLPONHBL.js +3 -0
  68. package/dist/chunk-KLPONHBL.js.map +1 -0
  69. package/dist/{chunk-CDGRHI7W.js → chunk-LAEUXOF6.js} +3 -3
  70. package/dist/{chunk-CDGRHI7W.js.map → chunk-LAEUXOF6.js.map} +1 -1
  71. package/dist/{chunk-ZAUZRIOU.js → chunk-MESOO5GZ.js} +3 -3
  72. package/dist/{chunk-ZAUZRIOU.js.map → chunk-MESOO5GZ.js.map} +1 -1
  73. package/dist/chunk-N2WVO3GF.js +128 -0
  74. package/dist/chunk-N2WVO3GF.js.map +1 -0
  75. package/dist/chunk-N6N5ATLY.js +93 -0
  76. package/dist/chunk-N6N5ATLY.js.map +1 -0
  77. package/dist/chunk-N6RQICAP.js +220 -0
  78. package/dist/chunk-N6RQICAP.js.map +1 -0
  79. package/dist/{chunk-MSLJF2FM.js → chunk-NUQSMT4Y.js} +2 -2
  80. package/dist/chunk-NUQSMT4Y.js.map +1 -0
  81. package/dist/{chunk-KQDLIGSG.js → chunk-P2KNN6ZR.js} +3 -3
  82. package/dist/{chunk-KQDLIGSG.js.map → chunk-P2KNN6ZR.js.map} +1 -1
  83. package/dist/{chunk-G2Y63PIF.js → chunk-PD7ZTWMM.js} +3 -3
  84. package/dist/{chunk-G2Y63PIF.js.map → chunk-PD7ZTWMM.js.map} +1 -1
  85. package/dist/{chunk-LYBFUKHR.js → chunk-RMTHCPIV.js} +4 -4
  86. package/dist/{chunk-LYBFUKHR.js.map → chunk-RMTHCPIV.js.map} +1 -1
  87. package/dist/chunk-SAZA3V2U.js +100 -0
  88. package/dist/chunk-SAZA3V2U.js.map +1 -0
  89. package/dist/{chunk-2JJS46FM.js → chunk-TE6NSONR.js} +3 -3
  90. package/dist/{chunk-2JJS46FM.js.map → chunk-TE6NSONR.js.map} +1 -1
  91. package/dist/{chunk-NHLLC6WH.js → chunk-TJCE4TVX.js} +4 -4
  92. package/dist/{chunk-NHLLC6WH.js.map → chunk-TJCE4TVX.js.map} +1 -1
  93. package/dist/{chunk-WCQUQ2WX.js → chunk-V7UJ55KW.js} +47 -5
  94. package/dist/chunk-V7UJ55KW.js.map +1 -0
  95. package/dist/{chunk-IQGRFAQV.js → chunk-VSW3NBJQ.js} +3 -3
  96. package/dist/{chunk-IQGRFAQV.js.map → chunk-VSW3NBJQ.js.map} +1 -1
  97. package/dist/{chunk-6QJFMOIX.js → chunk-VWVQWN2G.js} +3 -3
  98. package/dist/{chunk-6QJFMOIX.js.map → chunk-VWVQWN2G.js.map} +1 -1
  99. package/dist/{chunk-JZNTCZMV.js → chunk-WC6YYFWP.js} +34 -18
  100. package/dist/chunk-WC6YYFWP.js.map +1 -0
  101. package/dist/{chunk-FXLVNCG3.js → chunk-XWHGXSQV.js} +3 -3
  102. package/dist/{chunk-FXLVNCG3.js.map → chunk-XWHGXSQV.js.map} +1 -1
  103. package/dist/{chunk-G32U6YQ5.js → chunk-YD5MPZWY.js} +3 -3
  104. package/dist/{chunk-G32U6YQ5.js.map → chunk-YD5MPZWY.js.map} +1 -1
  105. package/dist/{chunk-US4OLTJ2.js → chunk-YNVMVDFN.js} +3 -3
  106. package/dist/{chunk-US4OLTJ2.js.map → chunk-YNVMVDFN.js.map} +1 -1
  107. package/dist/cnh.d.ts +2 -2
  108. package/dist/cnh.js +4 -4
  109. package/dist/cnpj.d.ts +2 -2
  110. package/dist/cnpj.js +5 -5
  111. package/dist/compare.d.ts +16 -0
  112. package/dist/compare.js +32 -0
  113. package/dist/compare.js.map +1 -0
  114. package/dist/cpf.d.ts +2 -2
  115. package/dist/cpf.js +4 -4
  116. package/dist/detect.d.ts +1 -1
  117. package/dist/detect.js +22 -20
  118. package/dist/diff.d.ts +16 -0
  119. package/dist/diff.js +32 -0
  120. package/dist/diff.js.map +1 -0
  121. package/dist/generate.d.ts +24 -3
  122. package/dist/generate.js +36 -27
  123. package/dist/{index-CZLo9YOT.d.ts → index-BEJFgDXj.d.ts} +1 -1
  124. package/dist/index.d.ts +13 -8
  125. package/dist/index.js +60 -49
  126. package/dist/index.js.map +1 -1
  127. package/dist/{inscricao-estadual-produtor-rural-CfWUaggb.d.ts → inscricao-estadual-produtor-rural-BXFVQscj.d.ts} +1 -1
  128. package/dist/inscricao-estadual-produtor-rural.d.ts +2 -2
  129. package/dist/inscricao-estadual-produtor-rural.js +3 -3
  130. package/dist/inscricao-estadual.d.ts +3 -3
  131. package/dist/inscricao-estadual.js +4 -4
  132. package/dist/mask.d.ts +13 -0
  133. package/dist/mask.js +40 -0
  134. package/dist/mask.js.map +1 -0
  135. package/dist/nfe-chave.d.ts +2 -2
  136. package/dist/nfe-chave.js +4 -3
  137. package/dist/pis-pasep.d.ts +2 -2
  138. package/dist/pis-pasep.js +3 -3
  139. package/dist/{pix-ddldLlb7.d.ts → pix-B4habHLG.d.ts} +1 -1
  140. package/dist/pix.d.ts +2 -2
  141. package/dist/pix.js +9 -8
  142. package/dist/placa.d.ts +2 -2
  143. package/dist/placa.js +4 -4
  144. package/dist/renavam.d.ts +2 -2
  145. package/dist/renavam.js +4 -4
  146. package/dist/sanitize.d.ts +2 -2
  147. package/dist/sanitize.js +20 -17
  148. package/dist/telefone.d.ts +2 -2
  149. package/dist/telefone.js +3 -3
  150. package/dist/titulo-eleitor.d.ts +2 -2
  151. package/dist/titulo-eleitor.js +4 -4
  152. package/dist/types-MXifBcV5.d.ts +10 -0
  153. package/dist/{validation-result-BhQE-1_O.d.ts → validation-result-BaI2Xder.d.ts} +24 -5
  154. package/package.json +21 -1
  155. package/dist/chunk-4W4OKLSZ.js +0 -366
  156. package/dist/chunk-4W4OKLSZ.js.map +0 -1
  157. package/dist/chunk-CSZCIOGA.js +0 -187
  158. package/dist/chunk-CSZCIOGA.js.map +0 -1
  159. package/dist/chunk-JZNTCZMV.js.map +0 -1
  160. package/dist/chunk-MSLJF2FM.js.map +0 -1
  161. package/dist/chunk-Q7B5VOPW.js.map +0 -1
  162. package/dist/chunk-WCQUQ2WX.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { computeCheckDigit } from './chunk-OTZHMJYE.js';
2
- import { brandPisPasep } from './chunk-MSLJF2FM.js';
2
+ import { brandPisPasep } from './chunk-NUQSMT4Y.js';
3
3
 
4
4
  // src/strip/pis-pasep.ts
5
5
  function stripPisPasep(input) {
@@ -69,5 +69,5 @@ function validatePisPasep(input) {
69
69
  }
70
70
 
71
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-KH7DWOUA.js.map
73
- //# sourceMappingURL=chunk-KH7DWOUA.js.map
72
+ //# sourceMappingURL=chunk-JLCQ7MGC.js.map
73
+ //# sourceMappingURL=chunk-JLCQ7MGC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/strip/pis-pasep.ts","../src/core/pis-pasep/constants.ts","../src/core/pis-pasep/index.ts"],"names":[],"mappings":"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","file":"chunk-KH7DWOUA.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/NIS/NIT constants — 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 *\n * PIS, PASEP, NIS, and NIT share the same 11-digit algorithm and check-digit weights.\n */\nexport const PIS_PASEP_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const PIS_PASEP_LENGTH = 11;\nexport const PIS_PASEP_BASE_LENGTH = 10;\nexport const PIS_PASEP_MASK_PATTERN = /^(\\d{3})(\\d{5})(\\d{2})(\\d{1})$/;\n\nexport const PIS_PASEP_GOLDEN_PRIMARY = '10027230888';\nexport const PIS_PASEP_GOLDEN_SECONDARY = '12056456402';\nexport const PIS_PASEP_GOLDEN_PRIMARY_MASKED = '100.27230.88-8';\nexport const PIS_PASEP_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf';\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"]}
1
+ {"version":3,"sources":["../src/strip/pis-pasep.ts","../src/core/pis-pasep/constants.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;;;ACCO,IAAM,oBAAA,GAAuB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC;AAC1D,IAAM,gBAAA,GAAmB,EAAA;AACzB,IAAM,qBAAA,GAAwB;AAC9B,IAAM,sBAAA,GAAyB;AAE/B,IAAM,wBAAA,GAA2B;AACjC,IAAM,0BAAA,GAA6B;AACnC,IAAM,+BAAA,GAAkC;AACxC,IAAM,6BAAA,GACX;;;ACQF,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-JLCQ7MGC.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/NIS/NIT constants — 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 *\n * PIS, PASEP, NIS, and NIT share the same 11-digit algorithm and check-digit weights.\n */\nexport const PIS_PASEP_DV_WEIGHTS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const PIS_PASEP_LENGTH = 11;\nexport const PIS_PASEP_BASE_LENGTH = 10;\nexport const PIS_PASEP_MASK_PATTERN = /^(\\d{3})(\\d{5})(\\d{2})(\\d{1})$/;\n\nexport const PIS_PASEP_GOLDEN_PRIMARY = '10027230888';\nexport const PIS_PASEP_GOLDEN_SECONDARY = '12056456402';\nexport const PIS_PASEP_GOLDEN_PRIMARY_MASKED = '100.27230.88-8';\nexport const PIS_PASEP_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/previdencia/pt-br/outros/imagens/2015/07/rgrva_RegrasValidacao.pdf';\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"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-KBNWI6GE.js.map
3
+ //# sourceMappingURL=chunk-KBNWI6GE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-KBNWI6GE.js"}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-KLPONHBL.js.map
3
+ //# sourceMappingURL=chunk-KLPONHBL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-KLPONHBL.js"}
@@ -1,4 +1,4 @@
1
- import { validateRenavam, RENAVAM_NUMERIC_PATTERN, RENAVAM_LENGTH } from './chunk-WLE2ENQA.js';
1
+ import { validateRenavam, RENAVAM_NUMERIC_PATTERN, RENAVAM_LENGTH } from './chunk-I66ZRSEN.js';
2
2
 
3
3
  // src/core/renavam/mask.ts
4
4
  function applyRenavamCanonicalFormat(canonical) {
@@ -18,5 +18,5 @@ function formatRenavam(input) {
18
18
  }
19
19
 
20
20
  export { formatRenavam };
21
- //# sourceMappingURL=chunk-CDGRHI7W.js.map
22
- //# sourceMappingURL=chunk-CDGRHI7W.js.map
21
+ //# sourceMappingURL=chunk-LAEUXOF6.js.map
22
+ //# sourceMappingURL=chunk-LAEUXOF6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/renavam/mask.ts","../src/format/renavam.ts"],"names":[],"mappings":";;;AAMO,SAAS,4BAA4B,SAAA,EAA2B;AACrE,EAAA,IAAI,CAAC,uBAAA,CAAwB,IAAA,CAAK,SAAS,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,cAAc,CAAA,iBAAA,CAAmB,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,SAAA;AACT;;;ACPO,SAAS,cAAc,KAAA,EAA6B;AACzD,EAAA,MAAM,MAAA,GAAS,gBAAgB,KAAK,CAAA;AACpC,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,2BAAA,CAA4B,MAAA,CAAO,KAAK,CAAA,EAAE;AAC1E","file":"chunk-CDGRHI7W.js","sourcesContent":["import { RENAVAM_LENGTH, RENAVAM_NUMERIC_PATTERN } from './constants.js';\n\n/**\n * Official system format — 11 contiguous digits (BR-RENAVAM-005).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n */\nexport function applyRenavamCanonicalFormat(canonical: string): string {\n if (!RENAVAM_NUMERIC_PATTERN.test(canonical)) {\n throw new Error(`RENAVAM must have exactly ${RENAVAM_LENGTH} digits to format`);\n }\n return canonical;\n}\n","import { applyRenavamCanonicalFormat } from '../core/renavam/mask.js';\nimport { validateRenavam } from '../core/renavam/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatRenavam(input: string): FormatResult {\n const result = validateRenavam(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyRenavamCanonicalFormat(result.value) };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/renavam/mask.ts","../src/format/renavam.ts"],"names":[],"mappings":";;;AAMO,SAAS,4BAA4B,SAAA,EAA2B;AACrE,EAAA,IAAI,CAAC,uBAAA,CAAwB,IAAA,CAAK,SAAS,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,cAAc,CAAA,iBAAA,CAAmB,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,SAAA;AACT;;;ACPO,SAAS,cAAc,KAAA,EAA6B;AACzD,EAAA,MAAM,MAAA,GAAS,gBAAgB,KAAK,CAAA;AACpC,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,2BAAA,CAA4B,MAAA,CAAO,KAAK,CAAA,EAAE;AAC1E","file":"chunk-LAEUXOF6.js","sourcesContent":["import { RENAVAM_LENGTH, RENAVAM_NUMERIC_PATTERN } from './constants.js';\n\n/**\n * Official system format — 11 contiguous digits (BR-RENAVAM-005).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/arquivos-senatran/portarias/2013/portaria0272013.pdf\n */\nexport function applyRenavamCanonicalFormat(canonical: string): string {\n if (!RENAVAM_NUMERIC_PATTERN.test(canonical)) {\n throw new Error(`RENAVAM must have exactly ${RENAVAM_LENGTH} digits to format`);\n }\n return canonical;\n}\n","import { applyRenavamCanonicalFormat } from '../core/renavam/mask.js';\nimport { validateRenavam } from '../core/renavam/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatRenavam(input: string): FormatResult {\n const result = validateRenavam(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyRenavamCanonicalFormat(result.value) };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { validateCep, CEP_MASK_PATTERN } from './chunk-2JJS46FM.js';
1
+ import { validateCep, CEP_MASK_PATTERN } from './chunk-TE6NSONR.js';
2
2
 
3
3
  // src/core/cep/mask.ts
4
4
  function applyCepMask(canonical) {
@@ -19,5 +19,5 @@ function formatCep(input) {
19
19
  }
20
20
 
21
21
  export { formatCep };
22
- //# sourceMappingURL=chunk-ZAUZRIOU.js.map
23
- //# sourceMappingURL=chunk-ZAUZRIOU.js.map
22
+ //# sourceMappingURL=chunk-MESOO5GZ.js.map
23
+ //# sourceMappingURL=chunk-MESOO5GZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/cep/mask.ts","../src/format/cep.ts"],"names":[],"mappings":";;;AAGO,SAAS,aAAa,SAAA,EAA2B;AACtD,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA;AAC7C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAChC;;;ACLO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3D","file":"chunk-ZAUZRIOU.js","sourcesContent":["import { CEP_MASK_PATTERN } from './constants.js';\n\n/** Mask XXXXX-XXX (BR-CEP-004). */\nexport function applyCepMask(canonical: string): string {\n const match = CEP_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CEP must have exactly 8 digits to apply mask');\n }\n return `${match[1]}-${match[2]}`;\n}\n","import { applyCepMask } from '../core/cep/mask.js';\nimport { validateCep } from '../core/cep/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCep(input: string): FormatResult {\n const result = validateCep(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCepMask(result.value) };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/cep/mask.ts","../src/format/cep.ts"],"names":[],"mappings":";;;AAGO,SAAS,aAAa,SAAA,EAA2B;AACtD,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA;AAC7C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAChC;;;ACLO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA,EAAE;AAC3D","file":"chunk-MESOO5GZ.js","sourcesContent":["import { CEP_MASK_PATTERN } from './constants.js';\n\n/** Mask XXXXX-XXX (BR-CEP-004). */\nexport function applyCepMask(canonical: string): string {\n const match = CEP_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CEP must have exactly 8 digits to apply mask');\n }\n return `${match[1]}-${match[2]}`;\n}\n","import { applyCepMask } from '../core/cep/mask.js';\nimport { validateCep } from '../core/cep/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatCep(input: string): FormatResult {\n const result = validateCep(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyCepMask(result.value) };\n}\n"]}
@@ -0,0 +1,128 @@
1
+ import { validateRenavam } from './chunk-I66ZRSEN.js';
2
+ import { validateNfeChave } from './chunk-AO6UTQ4A.js';
3
+ import { validatePisPasep } from './chunk-JLCQ7MGC.js';
4
+ import { validatePlaca } from './chunk-3LMDBXU6.js';
5
+ import { validateTelefone } from './chunk-DAR6VOMT.js';
6
+ import { validateTituloEleitor } from './chunk-CSVGWTCG.js';
7
+ import { validateInscricaoEstadual } from './chunk-665E36SC.js';
8
+ import { validateIeSpRural } from './chunk-CDNOUZEI.js';
9
+ import { validateBoleto } from './chunk-AU6TW3GH.js';
10
+ import { validateBrCode } from './chunk-V7UJ55KW.js';
11
+ import { validatePixKey } from './chunk-H3MLGGFI.js';
12
+ import { validateCpf } from './chunk-63G7QO73.js';
13
+ import { validateCartaoCredito } from './chunk-ANWQBKGN.js';
14
+ import { validateCep } from './chunk-TE6NSONR.js';
15
+ import { validateCnh } from './chunk-YNVMVDFN.js';
16
+ import { validateCnpj } from './chunk-FBARVLLP.js';
17
+
18
+ // src/platform/validate-dispatch.ts
19
+ function validateForPlatform(input, type, options = {}) {
20
+ if (type === "inscricao-estadual" && !options.uf) {
21
+ return {
22
+ ok: false,
23
+ code: "UNSUPPORTED_FORMAT",
24
+ message: "UF is required for inscricao-estadual validation"
25
+ };
26
+ }
27
+ switch (type) {
28
+ case "cpf": {
29
+ const result = validateCpf(input);
30
+ return result.ok ? { ok: true, value: result.value } : result;
31
+ }
32
+ case "cnpj": {
33
+ const result = validateCnpj(input);
34
+ return result.ok ? { ok: true, value: result.value } : result;
35
+ }
36
+ case "cep": {
37
+ const result = validateCep(input);
38
+ return result.ok ? { ok: true, value: result.value } : result;
39
+ }
40
+ case "placa": {
41
+ const result = validatePlaca(input);
42
+ return result.ok ? { ok: true, value: result.value } : result;
43
+ }
44
+ case "pis-pasep": {
45
+ const result = validatePisPasep(input);
46
+ return result.ok ? { ok: true, value: result.value } : result;
47
+ }
48
+ case "telefone": {
49
+ const result = validateTelefone(input);
50
+ return result.ok ? { ok: true, value: result.value } : result;
51
+ }
52
+ case "cnh": {
53
+ const result = validateCnh(input);
54
+ return result.ok ? { ok: true, value: result.value } : result;
55
+ }
56
+ case "renavam": {
57
+ const result = validateRenavam(input);
58
+ return result.ok ? { ok: true, value: result.value } : result;
59
+ }
60
+ case "titulo-eleitor": {
61
+ const result = validateTituloEleitor(input);
62
+ return result.ok ? { ok: true, value: result.value } : result;
63
+ }
64
+ case "nfe-chave": {
65
+ const result = validateNfeChave(input);
66
+ return result.ok ? { ok: true, value: result.value } : result;
67
+ }
68
+ case "boleto": {
69
+ const result = validateBoleto(input);
70
+ return result.ok ? { ok: true, value: result.value } : result;
71
+ }
72
+ case "cartao-credito": {
73
+ const result = validateCartaoCredito(input);
74
+ return result.ok ? { ok: true, value: result.value } : result;
75
+ }
76
+ case "inscricao-estadual": {
77
+ const result = validateInscricaoEstadual(input, { uf: options.uf });
78
+ return result.ok ? { ok: true, value: result.value } : result;
79
+ }
80
+ case "inscricao-estadual-produtor-rural": {
81
+ const result = validateIeSpRural(input);
82
+ return result.ok ? { ok: true, value: result.value } : result;
83
+ }
84
+ case "pix": {
85
+ const result = validatePixKey(input);
86
+ return result.ok ? { ok: true, value: result.value } : result;
87
+ }
88
+ case "brcode": {
89
+ const result = validateBrCode(input);
90
+ return result.ok ? { ok: true, value: result.value } : result;
91
+ }
92
+ default: {
93
+ const _exhaustive = type;
94
+ return {
95
+ ok: false,
96
+ code: "UNSUPPORTED_FORMAT",
97
+ message: `Unsupported type: ${String(_exhaustive)}`
98
+ };
99
+ }
100
+ }
101
+ }
102
+
103
+ // src/batch/index.ts
104
+ function batch(inputs, type, options = {}) {
105
+ const valid = [];
106
+ const invalid = [];
107
+ inputs.forEach((input, index) => {
108
+ const result = validateForPlatform(input, type, options);
109
+ if (result.ok) {
110
+ valid.push({ index, input, value: result.value });
111
+ } else {
112
+ invalid.push({ index, input, code: result.code, message: result.message });
113
+ }
114
+ });
115
+ return {
116
+ valid,
117
+ invalid,
118
+ summary: {
119
+ total: inputs.length,
120
+ valid: valid.length,
121
+ invalid: invalid.length
122
+ }
123
+ };
124
+ }
125
+
126
+ export { batch };
127
+ //# sourceMappingURL=chunk-N2WVO3GF.js.map
128
+ //# sourceMappingURL=chunk-N2WVO3GF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform/validate-dispatch.ts","../src/batch/index.ts"],"names":[],"mappings":"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","file":"chunk-N2WVO3GF.js","sourcesContent":["import { validateBrCode } from '../core/brcode/index.js';\nimport { validateBoleto } from '../core/boleto/index.js';\nimport { validateCartaoCredito } from '../core/cartao-credito/index.js';\nimport { validateCep } from '../core/cep/index.js';\nimport { validateCnh } from '../core/cnh/index.js';\nimport { validateCnpj } from '../core/cnpj/index.js';\nimport { validateCpf } from '../core/cpf/index.js';\nimport { validateInscricaoEstadual } from '../core/inscricao-estadual/index.js';\nimport { validateIeSpRural } from '../core/inscricao-estadual/sp-rural.js';\nimport { validateNfeChave } from '../core/nfe-chave/index.js';\nimport { validatePisPasep } from '../core/pis-pasep/index.js';\nimport { validatePlaca } from '../core/placa/index.js';\nimport { validatePixKey } from '../core/pix/index.js';\nimport { validateRenavam } from '../core/renavam/index.js';\nimport { validateTelefone } from '../core/telefone/index.js';\nimport { validateTituloEleitor } from '../core/titulo-eleitor/index.js';\nimport type { UfCode, ValidationErrorCode } from '../types/validation-result.js';\nimport type { PlatformDocumentType, PlatformOptions } from './types.js';\n\nexport type ValidateDispatchSuccess = { ok: true; value: string };\nexport type ValidateDispatchFailure = {\n ok: false;\n code: ValidationErrorCode;\n message: string;\n};\nexport type ValidateDispatchResult = ValidateDispatchSuccess | ValidateDispatchFailure;\n\nexport function validateForPlatform(\n input: string,\n type: PlatformDocumentType,\n options: PlatformOptions = {},\n): ValidateDispatchResult {\n if (type === 'inscricao-estadual' && !options.uf) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'UF is required for inscricao-estadual validation',\n };\n }\n\n switch (type) {\n case 'cpf': {\n const result = validateCpf(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'cnpj': {\n const result = validateCnpj(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'cep': {\n const result = validateCep(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'placa': {\n const result = validatePlaca(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'pis-pasep': {\n const result = validatePisPasep(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'telefone': {\n const result = validateTelefone(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'cnh': {\n const result = validateCnh(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'renavam': {\n const result = validateRenavam(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'titulo-eleitor': {\n const result = validateTituloEleitor(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'nfe-chave': {\n const result = validateNfeChave(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'boleto': {\n const result = validateBoleto(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'cartao-credito': {\n const result = validateCartaoCredito(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'inscricao-estadual': {\n const result = validateInscricaoEstadual(input, { uf: options.uf as UfCode });\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'inscricao-estadual-produtor-rural': {\n const result = validateIeSpRural(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'pix': {\n const result = validatePixKey(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\n case 'brcode': {\n const result = validateBrCode(input);\n return result.ok ? { ok: true, value: result.value } : result;\n }\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","/**\n * Batch validation — maps `validate*` per row, never throws (BR-BATCH-001).\n * @see docs/OFFICIAL-SOURCES.md\n */\nimport { validateForPlatform } from '../platform/validate-dispatch.js';\nimport type { PlatformDocumentType, PlatformOptions } from '../platform/types.js';\nimport type { ValidationErrorCode } from '../types/validation-result.js';\n\nexport type BatchValidEntry = {\n index: number;\n input: string;\n value: string;\n};\n\nexport type BatchInvalidEntry = {\n index: number;\n input: string;\n code: ValidationErrorCode;\n message: string;\n};\n\nexport type BatchSummary = {\n total: number;\n valid: number;\n invalid: number;\n};\n\nexport type BatchResult = {\n valid: BatchValidEntry[];\n invalid: BatchInvalidEntry[];\n summary: BatchSummary;\n};\n\nexport function batch(\n inputs: readonly string[],\n type: PlatformDocumentType,\n options: PlatformOptions = {},\n): BatchResult {\n const valid: BatchValidEntry[] = [];\n const invalid: BatchInvalidEntry[] = [];\n\n inputs.forEach((input, index) => {\n const result = validateForPlatform(input, type, options);\n if (result.ok) {\n valid.push({ index, input, value: result.value });\n } else {\n invalid.push({ index, input, code: result.code, message: result.message });\n }\n });\n\n return {\n valid,\n invalid,\n summary: {\n total: inputs.length,\n valid: valid.length,\n invalid: invalid.length,\n },\n };\n}\n"]}
@@ -0,0 +1,93 @@
1
+ import { normalizeForPlatform } from './chunk-G6OBZRZM.js';
2
+
3
+ // src/diff/index.ts
4
+ function diff(a, b, type, options = {}) {
5
+ const left = normalizeForPlatform(a, type, options);
6
+ const right = normalizeForPlatform(b, type, options);
7
+ if (left === right) {
8
+ return { changed: false, fields: [] };
9
+ }
10
+ const leftFields = splitFields(left, type);
11
+ const rightFields = splitFields(right, type);
12
+ const keys = /* @__PURE__ */ new Set([...Object.keys(leftFields), ...Object.keys(rightFields)]);
13
+ const fields = [];
14
+ for (const field of keys) {
15
+ const leftValue = leftFields[field];
16
+ const rightValue = rightFields[field];
17
+ if (leftValue !== rightValue) {
18
+ fields.push({ field, a: leftValue, b: rightValue });
19
+ }
20
+ }
21
+ return { changed: fields.length > 0, fields };
22
+ }
23
+ function splitFields(value, type) {
24
+ switch (type) {
25
+ case "cpf":
26
+ return {
27
+ base: value.slice(0, 9),
28
+ dv: value.slice(9, 11)
29
+ };
30
+ case "cnpj":
31
+ return {
32
+ base: value.slice(0, 12),
33
+ dv: value.slice(12, 14)
34
+ };
35
+ case "cep":
36
+ return {
37
+ prefix: value.slice(0, 5),
38
+ suffix: value.slice(5, 8)
39
+ };
40
+ case "telefone":
41
+ return { ddd: value.slice(0, 2), subscriber: value.slice(2) };
42
+ case "pis-pasep":
43
+ return {
44
+ base: value.slice(0, 10),
45
+ dv: value.slice(10, 11)
46
+ };
47
+ case "cnh":
48
+ return {
49
+ base: value.slice(0, 9),
50
+ dv1: value.slice(9, 10),
51
+ dv2: value.slice(10, 11)
52
+ };
53
+ case "renavam":
54
+ return {
55
+ base: value.slice(0, 10),
56
+ dv: value.slice(10, 11)
57
+ };
58
+ case "titulo-eleitor":
59
+ return {
60
+ sequential: value.slice(0, 8),
61
+ uf: value.slice(8, 10),
62
+ dv: value.slice(10, 12)
63
+ };
64
+ case "nfe-chave":
65
+ return {
66
+ cUF: value.slice(0, 2),
67
+ aamm: value.slice(2, 6),
68
+ cnpj: value.slice(6, 20),
69
+ mod: value.slice(20, 22),
70
+ serie: value.slice(22, 25),
71
+ nNF: value.slice(25, 34),
72
+ tpEmis: value.slice(34, 35),
73
+ cNF: value.slice(35, 43),
74
+ cDV: value.slice(43, 44)
75
+ };
76
+ case "placa":
77
+ return { value };
78
+ case "boleto":
79
+ case "cartao-credito":
80
+ case "inscricao-estadual":
81
+ case "inscricao-estadual-produtor-rural":
82
+ case "pix":
83
+ case "brcode":
84
+ return { value };
85
+ default: {
86
+ return { value };
87
+ }
88
+ }
89
+ }
90
+
91
+ export { diff };
92
+ //# sourceMappingURL=chunk-N6N5ATLY.js.map
93
+ //# sourceMappingURL=chunk-N6N5ATLY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/diff/index.ts"],"names":[],"mappings":"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","file":"chunk-N6N5ATLY.js","sourcesContent":["/**\n * Field-level document diff — per-type structural decomposition (BR-DIFF-001).\n * @see docs/OFFICIAL-SOURCES.md\n */\nimport { normalizeForPlatform } from '../platform/normalize.js';\nimport type { PlatformDocumentType, PlatformOptions } from '../platform/types.js';\n\nexport type DiffField = {\n field: string;\n a: string;\n b: string;\n};\n\nexport type DiffResult = {\n changed: boolean;\n fields: DiffField[];\n};\n\nexport function diff(\n a: string,\n b: string,\n type: PlatformDocumentType,\n options: PlatformOptions = {},\n): DiffResult {\n const left = normalizeForPlatform(a, type, options);\n const right = normalizeForPlatform(b, type, options);\n\n if (left === right) {\n return { changed: false, fields: [] };\n }\n\n const leftFields = splitFields(left, type);\n const rightFields = splitFields(right, type);\n const keys = new Set([...Object.keys(leftFields), ...Object.keys(rightFields)]);\n const fields: DiffField[] = [];\n\n for (const field of keys) {\n const leftValue = leftFields[field];\n const rightValue = rightFields[field];\n if (leftValue !== rightValue) {\n fields.push({ field, a: leftValue, b: rightValue });\n }\n }\n\n return { changed: fields.length > 0, fields };\n}\n\nfunction splitFields(value: string, type: PlatformDocumentType): Record<string, string> {\n switch (type) {\n case 'cpf':\n return {\n base: value.slice(0, 9),\n dv: value.slice(9, 11),\n };\n case 'cnpj':\n return {\n base: value.slice(0, 12),\n dv: value.slice(12, 14),\n };\n case 'cep':\n return {\n prefix: value.slice(0, 5),\n suffix: value.slice(5, 8),\n };\n case 'telefone':\n return { ddd: value.slice(0, 2), subscriber: value.slice(2) };\n case 'pis-pasep':\n return {\n base: value.slice(0, 10),\n dv: value.slice(10, 11),\n };\n case 'cnh':\n return {\n base: value.slice(0, 9),\n dv1: value.slice(9, 10),\n dv2: value.slice(10, 11),\n };\n case 'renavam':\n return {\n base: value.slice(0, 10),\n dv: value.slice(10, 11),\n };\n case 'titulo-eleitor':\n return {\n sequential: value.slice(0, 8),\n uf: value.slice(8, 10),\n dv: value.slice(10, 12),\n };\n case 'nfe-chave':\n return {\n cUF: value.slice(0, 2),\n aamm: value.slice(2, 6),\n cnpj: value.slice(6, 20),\n mod: value.slice(20, 22),\n serie: value.slice(22, 25),\n nNF: value.slice(25, 34),\n tpEmis: value.slice(34, 35),\n cNF: value.slice(35, 43),\n cDV: value.slice(43, 44),\n };\n case 'placa':\n return { value };\n case 'boleto':\n case 'cartao-credito':\n case 'inscricao-estadual':\n case 'inscricao-estadual-produtor-rural':\n case 'pix':\n case 'brcode':\n return { value };\n default: {\n const _exhaustive: never = type;\n void _exhaustive;\n return { value };\n }\n }\n}\n"]}
@@ -0,0 +1,220 @@
1
+ import { computeModulo10FieldDv, BOLETO_CODIGO_BARRAS_LENGTH, detectBoletoSituacao, BOLETO_CODE_ISPB_HOLDER, computeModulo11BarcodeDv, toBoletoSituacaoCode, BOLETO_ARRECADACAO_LINHA_LENGTH, BOLETO_ARRECADACAO_PRODUCT_ID, BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH } from './chunk-E2EFGMWA.js';
2
+ import { brandCodigoBarras } from './chunk-NUQSMT4Y.js';
3
+
4
+ // src/core/boleto/codigo-barras.ts
5
+ function failure(code, message) {
6
+ return { ok: false, code, message, inputKind: "codigo-barras" };
7
+ }
8
+ function stripCodigoBarras(input) {
9
+ return input.replace(/\D/g, "");
10
+ }
11
+ function validateCodigoBarras(input) {
12
+ const trimmed = input.trim();
13
+ if (trimmed.length === 0) {
14
+ return { ok: false, code: "EMPTY_INPUT", message: "C\xF3digo de barras input is empty" };
15
+ }
16
+ if (/[^0-9]/.test(trimmed)) {
17
+ return failure("INVALID_CHARACTER", "C\xF3digo de barras contains invalid characters");
18
+ }
19
+ if (trimmed.length !== BOLETO_CODIGO_BARRAS_LENGTH) {
20
+ return failure("INVALID_LENGTH", `C\xF3digo de barras must have ${BOLETO_CODIGO_BARRAS_LENGTH} digits`);
21
+ }
22
+ const situacaoKind = detectBoletoSituacao(trimmed);
23
+ if (situacaoKind === "unknown") {
24
+ const isIspbHolder = trimmed.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;
25
+ const message = isIspbHolder ? "ISPB holder boleto (code 988) requires currency indicator 0 (Situa\xE7\xE3o 2)" : "Bank boleto currency code must be 9 (Real) for Situa\xE7\xE3o 1";
26
+ return failure("UNSUPPORTED_FORMAT", message);
27
+ }
28
+ if (trimmed.charAt(4) === "0") {
29
+ return failure("INVALID_CHECK_DIGIT", "Barcode DV cannot be 0");
30
+ }
31
+ const expectedDv = String(computeModulo11BarcodeDv(trimmed.slice(0, 4) + trimmed.slice(5)));
32
+ if (trimmed.charAt(4) !== expectedDv) {
33
+ return failure("INVALID_CHECK_DIGIT", "C\xF3digo de barras check digit is invalid");
34
+ }
35
+ const situacao = toBoletoSituacaoCode(situacaoKind);
36
+ return {
37
+ ok: true,
38
+ value: brandCodigoBarras(trimmed),
39
+ inputKind: "codigo-barras",
40
+ format: "codigo-barras",
41
+ situacao
42
+ };
43
+ }
44
+
45
+ // src/core/boleto/arrecadacao-modulo.ts
46
+ function computeArrecadacaoModulo11Dv(digits) {
47
+ const multipliers = [2, 3, 4, 5, 6, 7, 8, 9];
48
+ let sum = 0;
49
+ for (let i = digits.length - 1, m = 0; i >= 0; i--, m++) {
50
+ sum += Number(digits[i]) * multipliers[m % multipliers.length];
51
+ }
52
+ const remainder = sum % 11;
53
+ if (remainder === 0 || remainder === 1) {
54
+ return 0;
55
+ }
56
+ if (remainder === 10) {
57
+ return 1;
58
+ }
59
+ return 11 - remainder;
60
+ }
61
+ function isArrecadacaoValueType(valueType) {
62
+ return valueType === "6" || valueType === "7" || valueType === "8" || valueType === "9";
63
+ }
64
+ function getArrecadacaoDvCalculator(valueType) {
65
+ if (valueType === "6" || valueType === "7") {
66
+ return computeModulo10FieldDv;
67
+ }
68
+ if (valueType === "8" || valueType === "9") {
69
+ return computeArrecadacaoModulo11Dv;
70
+ }
71
+ throw new Error(`Unsupported arrecada\xE7\xE3o value type: ${valueType}`);
72
+ }
73
+
74
+ // src/core/boleto/arrecadacao.ts
75
+ function failure2(code, message, inputKind) {
76
+ return { ok: false, code, message, ...inputKind ? { inputKind } : {} };
77
+ }
78
+ function stripArrecadacao(input) {
79
+ return input.replace(/\D/g, "");
80
+ }
81
+ function validateGeneralDv(barcode) {
82
+ const valueType = barcode.charAt(2);
83
+ const withoutDv = barcode.slice(0, 3) + barcode.slice(4);
84
+ const expected = String(getArrecadacaoDvCalculator(valueType)(withoutDv));
85
+ if (barcode.charAt(3) !== expected) {
86
+ return failure2("INVALID_CHECK_DIGIT", "Arrecada\xE7\xE3o general check digit is invalid");
87
+ }
88
+ return null;
89
+ }
90
+ function validateLinhaFieldDvs(linha, valueType) {
91
+ const dv = getArrecadacaoDvCalculator(valueType);
92
+ const blocks = [
93
+ [0, 11, 1],
94
+ [12, 23, 2],
95
+ [24, 35, 3],
96
+ [36, 47, 4]
97
+ ];
98
+ for (const [start, dvIndex, blockNumber] of blocks) {
99
+ const field = linha.slice(start, start + 11);
100
+ const expected = String(dv(field));
101
+ if (linha.charAt(dvIndex) !== expected) {
102
+ return failure2(
103
+ "INVALID_CHECK_DIGIT",
104
+ `Arrecada\xE7\xE3o linha block ${String(blockNumber)} check digit is invalid`,
105
+ "arrecadacao-linha"
106
+ );
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+ function linhaArrecadacaoToCodigoBarras(linha) {
112
+ return [0, 12, 24, 36].map((start) => linha.slice(start, start + 11)).join("");
113
+ }
114
+ function validateArrecadacaoLinha(input) {
115
+ const trimmed = input.trim();
116
+ if (trimmed.length === 0) {
117
+ return failure2("EMPTY_INPUT", "Arrecada\xE7\xE3o input is empty");
118
+ }
119
+ if (/[^0-9.\s]/.test(trimmed)) {
120
+ return failure2("INVALID_CHARACTER", "Arrecada\xE7\xE3o linha contains invalid characters", "arrecadacao-linha");
121
+ }
122
+ const stripped = stripArrecadacao(trimmed);
123
+ if (stripped.length !== BOLETO_ARRECADACAO_LINHA_LENGTH) {
124
+ return failure2(
125
+ "INVALID_LENGTH",
126
+ `Arrecada\xE7\xE3o linha must have ${String(BOLETO_ARRECADACAO_LINHA_LENGTH)} digits`,
127
+ "arrecadacao-linha"
128
+ );
129
+ }
130
+ if (!stripped.startsWith(BOLETO_ARRECADACAO_PRODUCT_ID)) {
131
+ return failure2("UNSUPPORTED_FORMAT", "Arrecada\xE7\xE3o linha must start with 8", "arrecadacao-linha");
132
+ }
133
+ const valueType = stripped.charAt(2);
134
+ if (!isArrecadacaoValueType(valueType)) {
135
+ return failure2("UNSUPPORTED_FORMAT", "Arrecada\xE7\xE3o value type must be 6, 7, 8, or 9", "arrecadacao-linha");
136
+ }
137
+ const fieldError = validateLinhaFieldDvs(stripped, valueType);
138
+ if (fieldError) {
139
+ return fieldError;
140
+ }
141
+ const barcode = linhaArrecadacaoToCodigoBarras(stripped);
142
+ const generalError = validateGeneralDv(barcode);
143
+ if (generalError) {
144
+ return { ...generalError, inputKind: "arrecadacao-linha" };
145
+ }
146
+ return {
147
+ ok: true,
148
+ value: stripped,
149
+ inputKind: "arrecadacao-linha",
150
+ format: "arrecadacao",
151
+ segment: stripped.charAt(1),
152
+ valueType
153
+ };
154
+ }
155
+ function validateArrecadacaoCodigoBarras(input) {
156
+ const trimmed = input.trim();
157
+ if (trimmed.length === 0) {
158
+ return failure2("EMPTY_INPUT", "Arrecada\xE7\xE3o input is empty");
159
+ }
160
+ if (/[^0-9]/.test(trimmed)) {
161
+ return failure2("INVALID_CHARACTER", "Arrecada\xE7\xE3o c\xF3digo de barras contains invalid characters", "arrecadacao-codigo-barras");
162
+ }
163
+ if (trimmed.length !== BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH) {
164
+ return failure2(
165
+ "INVALID_LENGTH",
166
+ `Arrecada\xE7\xE3o c\xF3digo de barras must have ${String(BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH)} digits`,
167
+ "arrecadacao-codigo-barras"
168
+ );
169
+ }
170
+ if (!trimmed.startsWith(BOLETO_ARRECADACAO_PRODUCT_ID)) {
171
+ return failure2("UNSUPPORTED_FORMAT", "Arrecada\xE7\xE3o c\xF3digo de barras must start with 8", "arrecadacao-codigo-barras");
172
+ }
173
+ const valueType = trimmed.charAt(2);
174
+ if (!isArrecadacaoValueType(valueType)) {
175
+ return failure2("UNSUPPORTED_FORMAT", "Arrecada\xE7\xE3o value type must be 6, 7, 8, or 9", "arrecadacao-codigo-barras");
176
+ }
177
+ const generalError = validateGeneralDv(trimmed);
178
+ if (generalError) {
179
+ return generalError;
180
+ }
181
+ return {
182
+ ok: true,
183
+ value: trimmed,
184
+ inputKind: "arrecadacao-codigo-barras",
185
+ format: "arrecadacao",
186
+ segment: trimmed.charAt(1),
187
+ valueType
188
+ };
189
+ }
190
+ function validateArrecadacao(input) {
191
+ const stripped = stripArrecadacao(input.trim());
192
+ if (stripped.length === 0) {
193
+ return failure2("EMPTY_INPUT", "Arrecada\xE7\xE3o input is empty");
194
+ }
195
+ if (stripped.length === BOLETO_ARRECADACAO_LINHA_LENGTH) {
196
+ return validateArrecadacaoLinha(input);
197
+ }
198
+ if (stripped.length === BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH) {
199
+ return validateArrecadacaoCodigoBarras(input);
200
+ }
201
+ return failure2("INVALID_LENGTH", "Arrecada\xE7\xE3o input must have 44 or 48 digits");
202
+ }
203
+ function isValidArrecadacao(input) {
204
+ return validateArrecadacao(input).ok;
205
+ }
206
+ function buildArrecadacaoGoldenPair(options) {
207
+ const head = BOLETO_ARRECADACAO_PRODUCT_ID + options.segment + options.valueType;
208
+ const body = options.value.padStart(11, "0") + options.company.padStart(4, "0") + options.free.padEnd(25, "0").slice(0, 25);
209
+ const withoutDv = head + body;
210
+ const dvFn = getArrecadacaoDvCalculator(options.valueType);
211
+ const barcode = head + String(dvFn(withoutDv)) + body;
212
+ const linha = [0, 11, 22, 33].map((start) => barcode.slice(start, start + 11) + String(dvFn(barcode.slice(start, start + 11)))).join("");
213
+ return { barcode, linha };
214
+ }
215
+ var ARRECADACAO_MOD10_GOLDEN_SEQUENCE = "01230067896";
216
+ computeModulo10FieldDv(ARRECADACAO_MOD10_GOLDEN_SEQUENCE);
217
+
218
+ export { buildArrecadacaoGoldenPair, computeArrecadacaoModulo11Dv, getArrecadacaoDvCalculator, isArrecadacaoValueType, isValidArrecadacao, linhaArrecadacaoToCodigoBarras, stripArrecadacao, stripCodigoBarras, validateArrecadacao, validateArrecadacaoCodigoBarras, validateArrecadacaoLinha, validateCodigoBarras };
219
+ //# sourceMappingURL=chunk-N6RQICAP.js.map
220
+ //# sourceMappingURL=chunk-N6RQICAP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/boleto/codigo-barras.ts","../src/core/boleto/arrecadacao-modulo.ts","../src/core/boleto/arrecadacao.ts"],"names":["failure"],"mappings":"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","file":"chunk-N6RQICAP.js","sourcesContent":["/**\n * Código de barras validation — modulo 11 general DV (Anexo X).\n * @see BR-BOLETO-003, BR-BOLETO-004, BR-BOLETO-010\n */\nimport type { BoletoSituacao, CobrancaBoletoValidationResult } from '../../types/validation-result.js';\nimport { brandCodigoBarras } from '../../types/validation-result.js';\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n} from './constants.js';\nimport { detectBoletoSituacao, toBoletoSituacaoCode } from './detect-situacao.js';\nimport { computeModulo11BarcodeDv } from './modulo11.js';\n\ntype FailedResult = Extract<CobrancaBoletoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, inputKind: 'codigo-barras' };\n}\n\nexport function stripCodigoBarras(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nexport function validateCodigoBarras(input: string): CobrancaBoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Código de barras input is empty' };\n }\n\n if (/[^0-9]/.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Código de barras contains invalid characters');\n }\n\n if (trimmed.length !== BOLETO_CODIGO_BARRAS_LENGTH) {\n return failure('INVALID_LENGTH', `Código de barras must have ${BOLETO_CODIGO_BARRAS_LENGTH} digits`);\n }\n\n const situacaoKind = detectBoletoSituacao(trimmed);\n if (situacaoKind === 'unknown') {\n const isIspbHolder = trimmed.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;\n const message = isIspbHolder\n ? 'ISPB holder boleto (code 988) requires currency indicator 0 (Situação 2)'\n : 'Bank boleto currency code must be 9 (Real) for Situação 1';\n return failure('UNSUPPORTED_FORMAT', message);\n }\n\n if (trimmed.charAt(4) === '0') {\n return failure('INVALID_CHECK_DIGIT', 'Barcode DV cannot be 0');\n }\n\n const expectedDv = String(computeModulo11BarcodeDv(trimmed.slice(0, 4) + trimmed.slice(5)));\n if (trimmed.charAt(4) !== expectedDv) {\n return failure('INVALID_CHECK_DIGIT', 'Código de barras check digit is invalid');\n }\n\n const situacao = toBoletoSituacaoCode(situacaoKind) as BoletoSituacao;\n return {\n ok: true,\n value: brandCodigoBarras(trimmed),\n inputKind: 'codigo-barras',\n format: 'codigo-barras',\n situacao,\n };\n}\n","import { computeModulo10FieldDv } from './modulo10.js';\n\n/**\n * FEBRABAN arrecadação modulo 11 — Layout v7 §09–10.\n * @see BOLETO_ARRECADACAO_OFFICIAL_SOURCE_URL\n *\n * Multipliers 2,3,4,5,6,7,8,9,2,3,4… from right; remainder 0|1 → DV 0; remainder 10 → DV 1.\n */\nexport function computeArrecadacaoModulo11Dv(digits: string): number {\n const multipliers = [2, 3, 4, 5, 6, 7, 8, 9];\n let sum = 0;\n\n for (let i = digits.length - 1, m = 0; i >= 0; i--, m++) {\n sum += Number(digits[i]) * multipliers[m % multipliers.length];\n }\n\n const remainder = sum % 11;\n if (remainder === 0 || remainder === 1) {\n return 0;\n }\n if (remainder === 10) {\n return 1;\n }\n return 11 - remainder;\n}\n\nexport function isArrecadacaoValueType(valueType: string): valueType is ArrecadacaoValueType {\n return valueType === '6' || valueType === '7' || valueType === '8' || valueType === '9';\n}\n\nexport type ArrecadacaoValueType = '6' | '7' | '8' | '9';\n\nexport function getArrecadacaoDvCalculator(\n valueType: string,\n): (digits: string) => number {\n if (valueType === '6' || valueType === '7') {\n return computeModulo10FieldDv;\n }\n if (valueType === '8' || valueType === '9') {\n return computeArrecadacaoModulo11Dv;\n }\n throw new Error(`Unsupported arrecadação value type: ${valueType}`);\n}\n\n/** Re-export cobrança-compatible modulo 10 (Layout v7 §07 — same algorithm). */\nexport { computeModulo10FieldDv as computeArrecadacaoModulo10Dv } from './modulo10.js';\n","/**\n * Boleto arrecadação — FEBRABAN Layout v7 (48-digit linha + 44-digit código de barras).\n * @see docs/use-cases/UC-007-validate-boleto.md\n * @see BOLETO_ARRECADACAO_OFFICIAL_SOURCE_URL\n */\nimport type { ValidationErrorCode } from '../../types/validation-result.js';\nimport {\n BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH,\n BOLETO_ARRECADACAO_LINHA_LENGTH,\n BOLETO_ARRECADACAO_PRODUCT_ID,\n} from './constants.js';\nimport {\n computeArrecadacaoModulo10Dv,\n getArrecadacaoDvCalculator,\n isArrecadacaoValueType,\n type ArrecadacaoValueType,\n} from './arrecadacao-modulo.js';\n\nexport type ArrecadacaoInputKind = 'arrecadacao-linha' | 'arrecadacao-codigo-barras';\n\nexport type ArrecadacaoValidationResult =\n | {\n ok: true;\n value: string;\n inputKind: ArrecadacaoInputKind;\n format: 'arrecadacao';\n segment: string;\n valueType: ArrecadacaoValueType;\n }\n | { ok: false; code: ValidationErrorCode; message: string; inputKind?: ArrecadacaoInputKind };\n\ntype Failure = Extract<ArrecadacaoValidationResult, { ok: false }>;\n\nfunction failure(\n code: Failure['code'],\n message: string,\n inputKind?: ArrecadacaoInputKind,\n): Failure {\n return { ok: false, code, message, ...(inputKind ? { inputKind } : {}) };\n}\n\nexport function stripArrecadacao(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nfunction validateGeneralDv(barcode: string): Failure | null {\n const valueType = barcode.charAt(2) as ArrecadacaoValueType;\n const withoutDv = barcode.slice(0, 3) + barcode.slice(4);\n const expected = String(getArrecadacaoDvCalculator(valueType)(withoutDv));\n if (barcode.charAt(3) !== expected) {\n return failure('INVALID_CHECK_DIGIT', 'Arrecadação general check digit is invalid');\n }\n return null;\n}\n\nfunction validateLinhaFieldDvs(linha: string, valueType: ArrecadacaoValueType): Failure | null {\n const dv = getArrecadacaoDvCalculator(valueType);\n const blocks: Array<[number, number, number]> = [\n [0, 11, 1],\n [12, 23, 2],\n [24, 35, 3],\n [36, 47, 4],\n ];\n\n for (const [start, dvIndex, blockNumber] of blocks) {\n const field = linha.slice(start, start + 11);\n const expected = String(dv(field));\n if (linha.charAt(dvIndex) !== expected) {\n return failure(\n 'INVALID_CHECK_DIGIT',\n `Arrecadação linha block ${String(blockNumber)} check digit is invalid`,\n 'arrecadacao-linha',\n );\n }\n }\n return null;\n}\n\nexport function linhaArrecadacaoToCodigoBarras(linha: string): string {\n return [0, 12, 24, 36].map((start) => linha.slice(start, start + 11)).join('');\n}\n\nexport function validateArrecadacaoLinha(input: string): ArrecadacaoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'Arrecadação input is empty');\n }\n\n if (/[^0-9.\\s]/.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Arrecadação linha contains invalid characters', 'arrecadacao-linha');\n }\n\n const stripped = stripArrecadacao(trimmed);\n if (stripped.length !== BOLETO_ARRECADACAO_LINHA_LENGTH) {\n return failure(\n 'INVALID_LENGTH',\n `Arrecadação linha must have ${String(BOLETO_ARRECADACAO_LINHA_LENGTH)} digits`,\n 'arrecadacao-linha',\n );\n }\n\n if (!stripped.startsWith(BOLETO_ARRECADACAO_PRODUCT_ID)) {\n return failure('UNSUPPORTED_FORMAT', 'Arrecadação linha must start with 8', 'arrecadacao-linha');\n }\n\n const valueType = stripped.charAt(2);\n if (!isArrecadacaoValueType(valueType)) {\n return failure('UNSUPPORTED_FORMAT', 'Arrecadação value type must be 6, 7, 8, or 9', 'arrecadacao-linha');\n }\n\n const fieldError = validateLinhaFieldDvs(stripped, valueType);\n if (fieldError) {\n return fieldError;\n }\n\n const barcode = linhaArrecadacaoToCodigoBarras(stripped);\n const generalError = validateGeneralDv(barcode);\n if (generalError) {\n return { ...generalError, inputKind: 'arrecadacao-linha' };\n }\n\n return {\n ok: true,\n value: stripped,\n inputKind: 'arrecadacao-linha',\n format: 'arrecadacao',\n segment: stripped.charAt(1),\n valueType,\n };\n}\n\nexport function validateArrecadacaoCodigoBarras(input: string): ArrecadacaoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'Arrecadação input is empty');\n }\n\n if (/[^0-9]/.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Arrecadação código de barras contains invalid characters', 'arrecadacao-codigo-barras');\n }\n\n if (trimmed.length !== BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH) {\n return failure(\n 'INVALID_LENGTH',\n `Arrecadação código de barras must have ${String(BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH)} digits`,\n 'arrecadacao-codigo-barras',\n );\n }\n\n if (!trimmed.startsWith(BOLETO_ARRECADACAO_PRODUCT_ID)) {\n return failure('UNSUPPORTED_FORMAT', 'Arrecadação código de barras must start with 8', 'arrecadacao-codigo-barras');\n }\n\n const valueType = trimmed.charAt(2);\n if (!isArrecadacaoValueType(valueType)) {\n return failure('UNSUPPORTED_FORMAT', 'Arrecadação value type must be 6, 7, 8, or 9', 'arrecadacao-codigo-barras');\n }\n\n const generalError = validateGeneralDv(trimmed);\n if (generalError) {\n return generalError;\n }\n\n return {\n ok: true,\n value: trimmed,\n inputKind: 'arrecadacao-codigo-barras',\n format: 'arrecadacao',\n segment: trimmed.charAt(1),\n valueType,\n };\n}\n\nexport function validateArrecadacao(input: string): ArrecadacaoValidationResult {\n const stripped = stripArrecadacao(input.trim());\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Arrecadação input is empty');\n }\n\n if (stripped.length === BOLETO_ARRECADACAO_LINHA_LENGTH) {\n return validateArrecadacaoLinha(input);\n }\n\n if (stripped.length === BOLETO_ARRECADACAO_CODIGO_BARRAS_LENGTH) {\n return validateArrecadacaoCodigoBarras(input);\n }\n\n return failure('INVALID_LENGTH', 'Arrecadação input must have 44 or 48 digits');\n}\n\nexport function isValidArrecadacao(input: string): boolean {\n return validateArrecadacao(input).ok;\n}\n\n/** @internal Golden vector helper — builds valid barcode then linha. */\nexport function buildArrecadacaoGoldenPair(options: {\n segment: string;\n valueType: ArrecadacaoValueType;\n value: string;\n company: string;\n free: string;\n}): { barcode: string; linha: string } {\n const head = BOLETO_ARRECADACAO_PRODUCT_ID + options.segment + options.valueType;\n const body =\n options.value.padStart(11, '0') +\n options.company.padStart(4, '0') +\n options.free.padEnd(25, '0').slice(0, 25);\n const withoutDv = head + body;\n const dvFn = getArrecadacaoDvCalculator(options.valueType);\n const barcode = head + String(dvFn(withoutDv)) + body;\n const linha = [0, 11, 22, 33]\n .map((start) => barcode.slice(start, start + 11) + String(dvFn(barcode.slice(start, start + 11))))\n .join('');\n return { barcode, linha };\n}\n\n// verify mod10 example from FEBRABAN §07\nexport const ARRECADACAO_MOD10_GOLDEN_SEQUENCE = '01230067896';\nexport const ARRECADACAO_MOD10_GOLDEN_DV = computeArrecadacaoModulo10Dv(ARRECADACAO_MOD10_GOLDEN_SEQUENCE);\n"]}