@br-validators/core 0.12.0-alpha.2 → 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.
- package/README.md +210 -131
- package/dist/batch.d.ts +28 -0
- package/dist/batch.js +29 -0
- package/dist/batch.js.map +1 -0
- package/dist/boleto.d.ts +58 -5
- package/dist/boleto.js +6 -3
- package/dist/brcode.d.ts +15 -3
- package/dist/brcode.js +8 -8
- package/dist/cartao-credito.d.ts +2 -2
- package/dist/cartao-credito.js +3 -3
- package/dist/cep.d.ts +2 -2
- package/dist/cep.js +4 -4
- package/dist/{chunk-WPL47PWJ.js → chunk-3LMDBXU6.js} +3 -3
- package/dist/{chunk-WPL47PWJ.js.map → chunk-3LMDBXU6.js.map} +1 -1
- package/dist/chunk-4J5IMD7B.js +3 -0
- package/dist/chunk-4J5IMD7B.js.map +1 -0
- package/dist/{chunk-BFZPCEYB.js → chunk-54UWHK5L.js} +3 -3
- package/dist/{chunk-BFZPCEYB.js.map → chunk-54UWHK5L.js.map} +1 -1
- package/dist/{chunk-F6PTZY4O.js → chunk-63G7QO73.js} +3 -3
- package/dist/{chunk-F6PTZY4O.js.map → chunk-63G7QO73.js.map} +1 -1
- package/dist/{chunk-3QP6R46N.js → chunk-665E36SC.js} +4 -4
- package/dist/{chunk-3QP6R46N.js.map → chunk-665E36SC.js.map} +1 -1
- package/dist/{chunk-AK5GVYQ5.js → chunk-ANWQBKGN.js} +3 -3
- package/dist/{chunk-AK5GVYQ5.js.map → chunk-ANWQBKGN.js.map} +1 -1
- package/dist/{chunk-D36RM7OD.js → chunk-AO6UTQ4A.js} +3 -3
- package/dist/{chunk-D36RM7OD.js.map → chunk-AO6UTQ4A.js.map} +1 -1
- package/dist/chunk-AU6TW3GH.js +136 -0
- package/dist/chunk-AU6TW3GH.js.map +1 -0
- package/dist/{chunk-XW5G2RAL.js → chunk-B6A7VF4R.js} +3 -3
- package/dist/{chunk-XW5G2RAL.js.map → chunk-B6A7VF4R.js.map} +1 -1
- package/dist/chunk-BFMRXXFE.js +99 -0
- package/dist/chunk-BFMRXXFE.js.map +1 -0
- package/dist/{chunk-Y6IW2LMW.js → chunk-CDNOUZEI.js} +3 -3
- package/dist/{chunk-Y6IW2LMW.js.map → chunk-CDNOUZEI.js.map} +1 -1
- package/dist/{chunk-XUO7FV6Z.js → chunk-CSRBRKXY.js} +3 -3
- package/dist/{chunk-XUO7FV6Z.js.map → chunk-CSRBRKXY.js.map} +1 -1
- package/dist/{chunk-DJUANFIK.js → chunk-CSVGWTCG.js} +3 -3
- package/dist/{chunk-DJUANFIK.js.map → chunk-CSVGWTCG.js.map} +1 -1
- package/dist/{chunk-5UL3M7IU.js → chunk-DAR6VOMT.js} +3 -3
- package/dist/{chunk-5UL3M7IU.js.map → chunk-DAR6VOMT.js.map} +1 -1
- package/dist/chunk-E2EFGMWA.js +200 -0
- package/dist/chunk-E2EFGMWA.js.map +1 -0
- package/dist/{chunk-KSLDM5AD.js → chunk-EVULAGR5.js} +3 -3
- package/dist/{chunk-KSLDM5AD.js.map → chunk-EVULAGR5.js.map} +1 -1
- package/dist/{chunk-YXELVV37.js → chunk-FBARVLLP.js} +4 -4
- package/dist/{chunk-YXELVV37.js.map → chunk-FBARVLLP.js.map} +1 -1
- package/dist/chunk-FKFRB3RJ.js +135 -0
- package/dist/chunk-FKFRB3RJ.js.map +1 -0
- package/dist/chunk-G6OBZRZM.js +131 -0
- package/dist/chunk-G6OBZRZM.js.map +1 -0
- package/dist/{chunk-MK7OJUF5.js → chunk-H3MLGGFI.js} +8 -8
- package/dist/{chunk-MK7OJUF5.js.map → chunk-H3MLGGFI.js.map} +1 -1
- package/dist/chunk-HUIMOB5E.js +41 -0
- package/dist/chunk-HUIMOB5E.js.map +1 -0
- package/dist/{chunk-WLE2ENQA.js → chunk-I66ZRSEN.js} +3 -3
- package/dist/{chunk-WLE2ENQA.js.map → chunk-I66ZRSEN.js.map} +1 -1
- package/dist/{chunk-Q7B5VOPW.js → chunk-I7DM47IR.js} +243 -37
- package/dist/chunk-I7DM47IR.js.map +1 -0
- package/dist/{chunk-GRDUTHNX.js → chunk-IYOPXJLY.js} +3 -3
- package/dist/{chunk-GRDUTHNX.js.map → chunk-IYOPXJLY.js.map} +1 -1
- package/dist/{chunk-4Y2FBO57.js → chunk-JKDU7QYP.js} +3 -3
- package/dist/{chunk-4Y2FBO57.js.map → chunk-JKDU7QYP.js.map} +1 -1
- package/dist/{chunk-KH7DWOUA.js → chunk-JLCQ7MGC.js} +3 -3
- package/dist/{chunk-KH7DWOUA.js.map → chunk-JLCQ7MGC.js.map} +1 -1
- package/dist/chunk-KBNWI6GE.js +3 -0
- package/dist/chunk-KBNWI6GE.js.map +1 -0
- package/dist/chunk-KLPONHBL.js +3 -0
- package/dist/chunk-KLPONHBL.js.map +1 -0
- package/dist/{chunk-CDGRHI7W.js → chunk-LAEUXOF6.js} +3 -3
- package/dist/{chunk-CDGRHI7W.js.map → chunk-LAEUXOF6.js.map} +1 -1
- package/dist/{chunk-ZAUZRIOU.js → chunk-MESOO5GZ.js} +3 -3
- package/dist/{chunk-ZAUZRIOU.js.map → chunk-MESOO5GZ.js.map} +1 -1
- package/dist/chunk-N2WVO3GF.js +128 -0
- package/dist/chunk-N2WVO3GF.js.map +1 -0
- package/dist/chunk-N6N5ATLY.js +93 -0
- package/dist/chunk-N6N5ATLY.js.map +1 -0
- package/dist/chunk-N6RQICAP.js +220 -0
- package/dist/chunk-N6RQICAP.js.map +1 -0
- package/dist/{chunk-MSLJF2FM.js → chunk-NUQSMT4Y.js} +2 -2
- package/dist/chunk-NUQSMT4Y.js.map +1 -0
- package/dist/{chunk-KQDLIGSG.js → chunk-P2KNN6ZR.js} +3 -3
- package/dist/{chunk-KQDLIGSG.js.map → chunk-P2KNN6ZR.js.map} +1 -1
- package/dist/{chunk-G2Y63PIF.js → chunk-PD7ZTWMM.js} +3 -3
- package/dist/{chunk-G2Y63PIF.js.map → chunk-PD7ZTWMM.js.map} +1 -1
- package/dist/{chunk-LYBFUKHR.js → chunk-RMTHCPIV.js} +4 -4
- package/dist/{chunk-LYBFUKHR.js.map → chunk-RMTHCPIV.js.map} +1 -1
- package/dist/chunk-SAZA3V2U.js +100 -0
- package/dist/chunk-SAZA3V2U.js.map +1 -0
- package/dist/{chunk-2JJS46FM.js → chunk-TE6NSONR.js} +3 -3
- package/dist/{chunk-2JJS46FM.js.map → chunk-TE6NSONR.js.map} +1 -1
- package/dist/{chunk-NHLLC6WH.js → chunk-TJCE4TVX.js} +4 -4
- package/dist/{chunk-NHLLC6WH.js.map → chunk-TJCE4TVX.js.map} +1 -1
- package/dist/{chunk-WCQUQ2WX.js → chunk-V7UJ55KW.js} +47 -5
- package/dist/chunk-V7UJ55KW.js.map +1 -0
- package/dist/{chunk-IQGRFAQV.js → chunk-VSW3NBJQ.js} +3 -3
- package/dist/{chunk-IQGRFAQV.js.map → chunk-VSW3NBJQ.js.map} +1 -1
- package/dist/{chunk-6QJFMOIX.js → chunk-VWVQWN2G.js} +3 -3
- package/dist/{chunk-6QJFMOIX.js.map → chunk-VWVQWN2G.js.map} +1 -1
- package/dist/{chunk-JZNTCZMV.js → chunk-WC6YYFWP.js} +34 -18
- package/dist/chunk-WC6YYFWP.js.map +1 -0
- package/dist/{chunk-FXLVNCG3.js → chunk-XWHGXSQV.js} +3 -3
- package/dist/{chunk-FXLVNCG3.js.map → chunk-XWHGXSQV.js.map} +1 -1
- package/dist/{chunk-G32U6YQ5.js → chunk-YD5MPZWY.js} +3 -3
- package/dist/{chunk-G32U6YQ5.js.map → chunk-YD5MPZWY.js.map} +1 -1
- package/dist/{chunk-US4OLTJ2.js → chunk-YNVMVDFN.js} +3 -3
- package/dist/{chunk-US4OLTJ2.js.map → chunk-YNVMVDFN.js.map} +1 -1
- package/dist/cnh.d.ts +2 -2
- package/dist/cnh.js +4 -4
- package/dist/cnpj.d.ts +2 -2
- package/dist/cnpj.js +5 -5
- package/dist/compare.d.ts +16 -0
- package/dist/compare.js +32 -0
- package/dist/compare.js.map +1 -0
- package/dist/cpf.d.ts +2 -2
- package/dist/cpf.js +4 -4
- package/dist/detect.d.ts +1 -1
- package/dist/detect.js +22 -20
- package/dist/diff.d.ts +16 -0
- package/dist/diff.js +32 -0
- package/dist/diff.js.map +1 -0
- package/dist/generate.d.ts +24 -3
- package/dist/generate.js +36 -27
- package/dist/{index-CZLo9YOT.d.ts → index-BEJFgDXj.d.ts} +1 -1
- package/dist/index.d.ts +13 -8
- package/dist/index.js +60 -49
- package/dist/index.js.map +1 -1
- package/dist/{inscricao-estadual-produtor-rural-CfWUaggb.d.ts → inscricao-estadual-produtor-rural-BXFVQscj.d.ts} +1 -1
- package/dist/inscricao-estadual-produtor-rural.d.ts +2 -2
- package/dist/inscricao-estadual-produtor-rural.js +3 -3
- package/dist/inscricao-estadual.d.ts +3 -3
- package/dist/inscricao-estadual.js +4 -4
- package/dist/mask.d.ts +13 -0
- package/dist/mask.js +40 -0
- package/dist/mask.js.map +1 -0
- package/dist/nfe-chave.d.ts +2 -2
- package/dist/nfe-chave.js +4 -3
- package/dist/pis-pasep.d.ts +2 -2
- package/dist/pis-pasep.js +3 -3
- package/dist/{pix-ddldLlb7.d.ts → pix-B4habHLG.d.ts} +1 -1
- package/dist/pix.d.ts +2 -2
- package/dist/pix.js +9 -8
- package/dist/placa.d.ts +2 -2
- package/dist/placa.js +4 -4
- package/dist/renavam.d.ts +2 -2
- package/dist/renavam.js +4 -4
- package/dist/sanitize.d.ts +2 -2
- package/dist/sanitize.js +20 -17
- package/dist/telefone.d.ts +2 -2
- package/dist/telefone.js +3 -3
- package/dist/titulo-eleitor.d.ts +2 -2
- package/dist/titulo-eleitor.js +4 -4
- package/dist/types-MXifBcV5.d.ts +10 -0
- package/dist/{validation-result-BhQE-1_O.d.ts → validation-result-BaI2Xder.d.ts} +24 -5
- package/package.json +23 -3
- package/dist/chunk-4W4OKLSZ.js +0 -366
- package/dist/chunk-4W4OKLSZ.js.map +0 -1
- package/dist/chunk-CSZCIOGA.js +0 -187
- package/dist/chunk-CSZCIOGA.js.map +0 -1
- package/dist/chunk-JZNTCZMV.js.map +0 -1
- package/dist/chunk-MSLJF2FM.js.map +0 -1
- package/dist/chunk-Q7B5VOPW.js.map +0 -1
- package/dist/chunk-WCQUQ2WX.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
type DocumentFormat = 'numeric' | 'alphanumeric' | 'legacy' | 'mercosul' | 'email' | 'phone' | 'evp' | 'linha-digitavel' | 'codigo-barras' | 'cartao-credito' | 'inscricao-estadual' | 'inscricao-estadual-produtor-rural' | 'telefone' | 'brcode';
|
|
1
|
+
type DocumentFormat = 'numeric' | 'alphanumeric' | 'legacy' | 'mercosul' | 'email' | 'phone' | 'evp' | 'linha-digitavel' | 'codigo-barras' | 'cartao-credito' | 'inscricao-estadual' | 'inscricao-estadual-produtor-rural' | 'telefone' | 'brcode' | 'arrecadacao';
|
|
2
2
|
type PixKeyType = 'cpf' | 'cnpj' | 'email' | 'phone' | 'evp';
|
|
3
3
|
type TelefoneTipo = 'celular' | 'fixo';
|
|
4
|
-
type BoletoInputKind = 'linha-digitavel' | 'codigo-barras';
|
|
4
|
+
type BoletoInputKind = 'linha-digitavel' | 'codigo-barras' | 'arrecadacao-linha' | 'arrecadacao-codigo-barras';
|
|
5
5
|
type ValidationErrorCode = 'INVALID_LENGTH' | 'INVALID_CHARACTER' | 'INVALID_CHECK_DIGIT' | 'KNOWN_INVALID_PATTERN' | 'UNSUPPORTED_FORMAT' | 'EMPTY_INPUT';
|
|
6
6
|
type ValidationResult<T extends string = string> = {
|
|
7
7
|
ok: true;
|
|
@@ -96,12 +96,31 @@ type PixValidationResult = {
|
|
|
96
96
|
keyType?: PixKeyType;
|
|
97
97
|
};
|
|
98
98
|
type BoletoSituacao = '1' | '2';
|
|
99
|
+
type CobrancaBoletoValidationResult = {
|
|
100
|
+
ok: true;
|
|
101
|
+
value: LinhaDigitavel | CodigoBarras;
|
|
102
|
+
inputKind: 'linha-digitavel' | 'codigo-barras';
|
|
103
|
+
format: 'linha-digitavel' | 'codigo-barras';
|
|
104
|
+
situacao: BoletoSituacao;
|
|
105
|
+
} | {
|
|
106
|
+
ok: false;
|
|
107
|
+
code: ValidationErrorCode;
|
|
108
|
+
message: string;
|
|
109
|
+
inputKind?: BoletoInputKind;
|
|
110
|
+
};
|
|
99
111
|
type BoletoValidationResult = {
|
|
100
112
|
ok: true;
|
|
101
113
|
value: LinhaDigitavel | CodigoBarras;
|
|
102
|
-
inputKind:
|
|
103
|
-
format:
|
|
114
|
+
inputKind: 'linha-digitavel' | 'codigo-barras';
|
|
115
|
+
format: 'linha-digitavel' | 'codigo-barras';
|
|
104
116
|
situacao: BoletoSituacao;
|
|
117
|
+
} | {
|
|
118
|
+
ok: true;
|
|
119
|
+
value: string;
|
|
120
|
+
inputKind: 'arrecadacao-linha' | 'arrecadacao-codigo-barras';
|
|
121
|
+
format: 'arrecadacao';
|
|
122
|
+
segment: string;
|
|
123
|
+
valueType: '6' | '7' | '8' | '9';
|
|
105
124
|
} | {
|
|
106
125
|
ok: false;
|
|
107
126
|
code: ValidationErrorCode;
|
|
@@ -193,4 +212,4 @@ type BrCodeValidationResult = {
|
|
|
193
212
|
message: string;
|
|
194
213
|
};
|
|
195
214
|
|
|
196
|
-
export type { BoletoInputKind as B, CartaoCredito as C, DocumentFormat as D, FormatResult as F, IeProdutorRuralValidationResult as I, LinhaDigitavel as L, NfeChave as N, PisPasep as P, Renavam as R, Telefone as T, UfCode as U, ValidationErrorCode as V, BoletoSituacao as a, BoletoValidationResult as b, BrCodePayload as c, BrCodeValidationResult as d, CartaoCreditoValidationResult as e, Cep as f, Cnh as g, Cnpj as h, CodigoBarras as i, Cpf as j, InscricaoEstadual as k, InscricaoEstadualProdutorRural as l, InscricaoEstadualValidationResult as m, NfeChaveParsed as n, NfeChaveValidationResult as o, PixKey as p, PixKeyType as q, PixValidationResult as r, Placa as s, TelefoneTipo as t, TelefoneValidationResult as u, TituloEleitor as v, TituloEleitorValidationResult as w, ValidationResult as x };
|
|
215
|
+
export type { BoletoInputKind as B, CartaoCredito as C, DocumentFormat as D, FormatResult as F, IeProdutorRuralValidationResult as I, LinhaDigitavel as L, NfeChave as N, PisPasep as P, Renavam as R, Telefone as T, UfCode as U, ValidationErrorCode as V, BoletoSituacao as a, BoletoValidationResult as b, BrCodePayload as c, BrCodeValidationResult as d, CartaoCreditoValidationResult as e, Cep as f, Cnh as g, Cnpj as h, CodigoBarras as i, Cpf as j, InscricaoEstadual as k, InscricaoEstadualProdutorRural as l, InscricaoEstadualValidationResult as m, NfeChaveParsed as n, NfeChaveValidationResult as o, PixKey as p, PixKeyType as q, PixValidationResult as r, Placa as s, TelefoneTipo as t, TelefoneValidationResult as u, TituloEleitor as v, TituloEleitorValidationResult as w, ValidationResult as x, CobrancaBoletoValidationResult as y };
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@br-validators/core",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Brazilian document
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "The Brazilian document validation library for TypeScript — CPF, CNPJ (alphanumeric), NF-e, PIX, boleto, IE (27 UFs), and 15+ more. Zero deps, fully typed, never throws.",
|
|
5
|
+
"homepage": "https://www.npmjs.com/package/@br-validators/core",
|
|
5
6
|
"license": "MIT",
|
|
6
7
|
"type": "module",
|
|
7
8
|
"repository": {
|
|
@@ -9,7 +10,6 @@
|
|
|
9
10
|
"url": "git+https://github.com/AlexandreZanata/br-validators.git",
|
|
10
11
|
"directory": "packages/br-validators"
|
|
11
12
|
},
|
|
12
|
-
"homepage": "https://github.com/AlexandreZanata/br-validators/tree/main/packages/br-validators#readme",
|
|
13
13
|
"bugs": {
|
|
14
14
|
"url": "https://github.com/AlexandreZanata/br-validators/issues"
|
|
15
15
|
},
|
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
"detect",
|
|
35
35
|
"sanitize",
|
|
36
36
|
"generate",
|
|
37
|
+
"mask",
|
|
38
|
+
"compare",
|
|
39
|
+
"batch",
|
|
40
|
+
"diff",
|
|
37
41
|
"typescript"
|
|
38
42
|
],
|
|
39
43
|
"publishConfig": {
|
|
@@ -122,6 +126,22 @@
|
|
|
122
126
|
"./generate": {
|
|
123
127
|
"types": "./dist/generate.d.ts",
|
|
124
128
|
"import": "./dist/generate.js"
|
|
129
|
+
},
|
|
130
|
+
"./mask": {
|
|
131
|
+
"types": "./dist/mask.d.ts",
|
|
132
|
+
"import": "./dist/mask.js"
|
|
133
|
+
},
|
|
134
|
+
"./compare": {
|
|
135
|
+
"types": "./dist/compare.d.ts",
|
|
136
|
+
"import": "./dist/compare.js"
|
|
137
|
+
},
|
|
138
|
+
"./batch": {
|
|
139
|
+
"types": "./dist/batch.d.ts",
|
|
140
|
+
"import": "./dist/batch.js"
|
|
141
|
+
},
|
|
142
|
+
"./diff": {
|
|
143
|
+
"types": "./dist/diff.d.ts",
|
|
144
|
+
"import": "./dist/diff.js"
|
|
125
145
|
}
|
|
126
146
|
},
|
|
127
147
|
"files": [
|
package/dist/chunk-4W4OKLSZ.js
DELETED
|
@@ -1,366 +0,0 @@
|
|
|
1
|
-
import { brandCodigoBarras, brandLinhaDigitavel } from './chunk-MSLJF2FM.js';
|
|
2
|
-
|
|
3
|
-
// src/core/boleto/constants.ts
|
|
4
|
-
var BOLETO_LINHA_LENGTH = 47;
|
|
5
|
-
var BOLETO_CODIGO_BARRAS_LENGTH = 44;
|
|
6
|
-
var BOLETO_CURRENCY_REAL = "9";
|
|
7
|
-
var BOLETO_CODE_ISPB_HOLDER = "988";
|
|
8
|
-
var BOLETO_CURRENCY_ISPB = "0";
|
|
9
|
-
var BOLETO_GOLDEN_LINHA_MASKED = "03399.02579 08991.834006 71742.301014 6 14500000099668";
|
|
10
|
-
var BOLETO_GOLDEN_LINHA_STRIPPED = "03399025790899183400671742301014614500000099668";
|
|
11
|
-
var BOLETO_GOLDEN_CODIGO_BARRAS = "03396145000000996689025708991834007174230101";
|
|
12
|
-
var BOLETO_GOLDEN_LINHA_BB_STRIPPED = "00191234546789012345767890123457112340000001500";
|
|
13
|
-
var BOLETO_GOLDEN_CODIGO_BARRAS_BB = "00191123400000015001234567890123456789012345";
|
|
14
|
-
var BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED = "98801234516789012345767890123457760746948000112";
|
|
15
|
-
var BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2 = "98807607469480001121234567890123456789012345";
|
|
16
|
-
var BOLETO_OFFICIAL_SOURCE_URL = "https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf";
|
|
17
|
-
var BOLETO_LAYOUTS_PORTAL_URL = "https://portal.febraban.org.br/pagina/3425/33/pt-br/layout-febraban";
|
|
18
|
-
|
|
19
|
-
// src/core/boleto/detect-situacao.ts
|
|
20
|
-
function toBoletoSituacaoCode(kind) {
|
|
21
|
-
if (kind === "situacao-1") {
|
|
22
|
-
return "1";
|
|
23
|
-
}
|
|
24
|
-
if (kind === "situacao-2") {
|
|
25
|
-
return "2";
|
|
26
|
-
}
|
|
27
|
-
return void 0;
|
|
28
|
-
}
|
|
29
|
-
function detectBoletoSituacao(stripped) {
|
|
30
|
-
if (stripped.length !== BOLETO_LINHA_LENGTH && stripped.length !== BOLETO_CODIGO_BARRAS_LENGTH) {
|
|
31
|
-
return "unknown";
|
|
32
|
-
}
|
|
33
|
-
if (stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER) {
|
|
34
|
-
if (stripped.charAt(3) === BOLETO_CURRENCY_ISPB) {
|
|
35
|
-
return "situacao-2";
|
|
36
|
-
}
|
|
37
|
-
return "unknown";
|
|
38
|
-
}
|
|
39
|
-
if (stripped.charAt(3) === BOLETO_CURRENCY_REAL) {
|
|
40
|
-
return "situacao-1";
|
|
41
|
-
}
|
|
42
|
-
return "unknown";
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// src/core/boleto/modulo11.ts
|
|
46
|
-
function computeModulo11BarcodeDv(barcodeWithoutDv) {
|
|
47
|
-
let multiplier = 2;
|
|
48
|
-
let sum = 0;
|
|
49
|
-
for (let i = barcodeWithoutDv.length - 1; i >= 0; i--) {
|
|
50
|
-
sum += Number(barcodeWithoutDv[i]) * multiplier;
|
|
51
|
-
multiplier = multiplier >= 9 ? 2 : multiplier + 1;
|
|
52
|
-
}
|
|
53
|
-
const remainder = sum % 11;
|
|
54
|
-
let dv = 11 - remainder;
|
|
55
|
-
if (dv === 0 || dv === 10 || dv === 11) {
|
|
56
|
-
dv = 1;
|
|
57
|
-
}
|
|
58
|
-
return dv;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// src/core/boleto/codigo-barras.ts
|
|
62
|
-
function failure(code, message) {
|
|
63
|
-
return { ok: false, code, message, inputKind: "codigo-barras" };
|
|
64
|
-
}
|
|
65
|
-
function stripCodigoBarras(input) {
|
|
66
|
-
return input.replace(/\D/g, "");
|
|
67
|
-
}
|
|
68
|
-
function validateCodigoBarras(input) {
|
|
69
|
-
const trimmed = input.trim();
|
|
70
|
-
if (trimmed.length === 0) {
|
|
71
|
-
return { ok: false, code: "EMPTY_INPUT", message: "C\xF3digo de barras input is empty" };
|
|
72
|
-
}
|
|
73
|
-
if (/[^0-9]/.test(trimmed)) {
|
|
74
|
-
return failure("INVALID_CHARACTER", "C\xF3digo de barras contains invalid characters");
|
|
75
|
-
}
|
|
76
|
-
if (trimmed.length !== BOLETO_CODIGO_BARRAS_LENGTH) {
|
|
77
|
-
return failure("INVALID_LENGTH", `C\xF3digo de barras must have ${BOLETO_CODIGO_BARRAS_LENGTH} digits`);
|
|
78
|
-
}
|
|
79
|
-
const situacaoKind = detectBoletoSituacao(trimmed);
|
|
80
|
-
if (situacaoKind === "unknown") {
|
|
81
|
-
const isIspbHolder = trimmed.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;
|
|
82
|
-
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";
|
|
83
|
-
return failure("UNSUPPORTED_FORMAT", message);
|
|
84
|
-
}
|
|
85
|
-
if (trimmed.charAt(4) === "0") {
|
|
86
|
-
return failure("INVALID_CHECK_DIGIT", "Barcode DV cannot be 0");
|
|
87
|
-
}
|
|
88
|
-
const expectedDv = String(computeModulo11BarcodeDv(trimmed.slice(0, 4) + trimmed.slice(5)));
|
|
89
|
-
if (trimmed.charAt(4) !== expectedDv) {
|
|
90
|
-
return failure("INVALID_CHECK_DIGIT", "C\xF3digo de barras check digit is invalid");
|
|
91
|
-
}
|
|
92
|
-
const situacao = toBoletoSituacaoCode(situacaoKind);
|
|
93
|
-
return {
|
|
94
|
-
ok: true,
|
|
95
|
-
value: brandCodigoBarras(trimmed),
|
|
96
|
-
inputKind: "codigo-barras",
|
|
97
|
-
format: "codigo-barras",
|
|
98
|
-
situacao
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// src/core/boleto/modulo10.ts
|
|
103
|
-
function computeModulo10FieldDv(digits) {
|
|
104
|
-
let multiplier = 2;
|
|
105
|
-
let sum = 0;
|
|
106
|
-
for (let i = digits.length - 1; i >= 0; i--) {
|
|
107
|
-
let product = Number(digits[i]) * multiplier;
|
|
108
|
-
if (product > 9) {
|
|
109
|
-
product = Math.floor(product / 10) + product % 10;
|
|
110
|
-
}
|
|
111
|
-
sum += product;
|
|
112
|
-
multiplier = multiplier === 2 ? 1 : 2;
|
|
113
|
-
}
|
|
114
|
-
const remainder = sum % 10;
|
|
115
|
-
return remainder === 0 ? 0 : 10 - remainder;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// src/core/boleto/convert.ts
|
|
119
|
-
function convertLinhaToCodigoBarrasDigits(strippedLinha) {
|
|
120
|
-
return strippedLinha.slice(0, 4) + strippedLinha[32] + strippedLinha.slice(33, BOLETO_LINHA_LENGTH) + strippedLinha.slice(4, 9) + strippedLinha.slice(10, 20) + strippedLinha.slice(21, 31);
|
|
121
|
-
}
|
|
122
|
-
function convertCodigoBarrasToLinhaDigits(barcode) {
|
|
123
|
-
const field1 = barcode.slice(0, 4) + barcode.slice(19, 24);
|
|
124
|
-
const field2 = barcode.slice(24, 34);
|
|
125
|
-
const field3 = barcode.slice(34, BOLETO_CODIGO_BARRAS_LENGTH);
|
|
126
|
-
const field5 = barcode.slice(5, 9) + barcode.slice(9, 19);
|
|
127
|
-
const dv1 = String(computeModulo10FieldDv(field1));
|
|
128
|
-
const dv2 = String(computeModulo10FieldDv(field2));
|
|
129
|
-
const dv3 = String(computeModulo10FieldDv(field3));
|
|
130
|
-
return field1 + dv1 + field2 + dv2 + field3 + dv3 + barcode[4] + field5;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// src/core/boleto/detect.ts
|
|
134
|
-
var LINHA_MASK_PATTERN = /^[0-9.\s]+$/;
|
|
135
|
-
function stripDigits(input) {
|
|
136
|
-
return input.replace(/\D/g, "");
|
|
137
|
-
}
|
|
138
|
-
function detectBoletoInputKind(input) {
|
|
139
|
-
const trimmed = input.trim();
|
|
140
|
-
if (trimmed.length === 0) {
|
|
141
|
-
return "unknown";
|
|
142
|
-
}
|
|
143
|
-
const digits = stripDigits(trimmed);
|
|
144
|
-
if (digits.length === 48 && digits.startsWith("8")) {
|
|
145
|
-
return "arrecadacao";
|
|
146
|
-
}
|
|
147
|
-
if (digits.length === BOLETO_CODIGO_BARRAS_LENGTH && /^\d+$/.test(digits)) {
|
|
148
|
-
return "codigo-barras";
|
|
149
|
-
}
|
|
150
|
-
if (digits.length === BOLETO_LINHA_LENGTH) {
|
|
151
|
-
if (/^\d+$/.test(trimmed)) {
|
|
152
|
-
return "linha-digitavel";
|
|
153
|
-
}
|
|
154
|
-
if (LINHA_MASK_PATTERN.test(trimmed)) {
|
|
155
|
-
return "linha-digitavel";
|
|
156
|
-
}
|
|
157
|
-
return "unknown";
|
|
158
|
-
}
|
|
159
|
-
return "unknown";
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// src/core/boleto/mask.ts
|
|
163
|
-
function applyLinhaDigitavelMask(stripped47) {
|
|
164
|
-
if (stripped47.length !== BOLETO_LINHA_LENGTH) {
|
|
165
|
-
throw new Error(`Linha digit\xE1vel must have exactly ${BOLETO_LINHA_LENGTH} digits to apply mask`);
|
|
166
|
-
}
|
|
167
|
-
return `${stripped47.slice(0, 5)}.${stripped47.slice(5, 10)} ${stripped47.slice(10, 15)}.${stripped47.slice(15, 21)} ${stripped47.slice(21, 26)}.${stripped47.slice(26, 32)} ${stripped47[32]} ${stripped47.slice(33)}`;
|
|
168
|
-
}
|
|
169
|
-
function formatLinhaDigitavel(stripped) {
|
|
170
|
-
return applyLinhaDigitavelMask(stripped);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// src/core/boleto/linha-digitavel.ts
|
|
174
|
-
var LINHA_MASK_PATTERN2 = /^[0-9.\s]+$/;
|
|
175
|
-
function failure2(code, message) {
|
|
176
|
-
return { ok: false, code, message, inputKind: "linha-digitavel" };
|
|
177
|
-
}
|
|
178
|
-
function stripLinhaDigitavel(input) {
|
|
179
|
-
return input.replace(/\D/g, "");
|
|
180
|
-
}
|
|
181
|
-
function validateFieldDv(fieldDigits, actualDv, fieldNumber) {
|
|
182
|
-
const expected = String(computeModulo10FieldDv(fieldDigits));
|
|
183
|
-
if (actualDv !== expected) {
|
|
184
|
-
return failure2("INVALID_CHECK_DIGIT", `Linha digit\xE1vel field ${fieldNumber} check digit is invalid`);
|
|
185
|
-
}
|
|
186
|
-
return null;
|
|
187
|
-
}
|
|
188
|
-
function validateLinhaDigitavel(input) {
|
|
189
|
-
const trimmed = input.trim();
|
|
190
|
-
if (trimmed.length === 0) {
|
|
191
|
-
return { ok: false, code: "EMPTY_INPUT", message: "Linha digit\xE1vel input is empty" };
|
|
192
|
-
}
|
|
193
|
-
if (!LINHA_MASK_PATTERN2.test(trimmed)) {
|
|
194
|
-
return failure2("INVALID_CHARACTER", "Linha digit\xE1vel contains invalid characters");
|
|
195
|
-
}
|
|
196
|
-
const stripped = stripLinhaDigitavel(trimmed);
|
|
197
|
-
if (stripped.length !== BOLETO_LINHA_LENGTH) {
|
|
198
|
-
return failure2("INVALID_LENGTH", `Linha digit\xE1vel must have ${BOLETO_LINHA_LENGTH} digits after normalization`);
|
|
199
|
-
}
|
|
200
|
-
const situacaoKind = detectBoletoSituacao(stripped);
|
|
201
|
-
if (situacaoKind === "unknown") {
|
|
202
|
-
const isIspbHolder = stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;
|
|
203
|
-
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";
|
|
204
|
-
return failure2("UNSUPPORTED_FORMAT", message);
|
|
205
|
-
}
|
|
206
|
-
const field1Error = validateFieldDv(stripped.slice(0, 9), stripped.charAt(9), 1);
|
|
207
|
-
if (field1Error) {
|
|
208
|
-
return field1Error;
|
|
209
|
-
}
|
|
210
|
-
const field2Error = validateFieldDv(stripped.slice(10, 20), stripped.charAt(20), 2);
|
|
211
|
-
if (field2Error) {
|
|
212
|
-
return field2Error;
|
|
213
|
-
}
|
|
214
|
-
const field3Error = validateFieldDv(stripped.slice(21, 31), stripped.charAt(31), 3);
|
|
215
|
-
if (field3Error) {
|
|
216
|
-
return field3Error;
|
|
217
|
-
}
|
|
218
|
-
const barcode = convertLinhaToCodigoBarrasDigits(stripped);
|
|
219
|
-
const barcodeDvFromMod11 = String(
|
|
220
|
-
computeModulo11BarcodeDv(barcode.slice(0, 4) + barcode.slice(5))
|
|
221
|
-
);
|
|
222
|
-
if (stripped.charAt(32) !== barcodeDvFromMod11) {
|
|
223
|
-
return failure2("INVALID_CHECK_DIGIT", "Linha digit\xE1vel field 4 (barcode DV) is invalid");
|
|
224
|
-
}
|
|
225
|
-
const situacao = toBoletoSituacaoCode(situacaoKind);
|
|
226
|
-
return {
|
|
227
|
-
ok: true,
|
|
228
|
-
value: brandLinhaDigitavel(stripped),
|
|
229
|
-
inputKind: "linha-digitavel",
|
|
230
|
-
format: "linha-digitavel",
|
|
231
|
-
situacao
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// src/core/boleto/fator-vencimento.ts
|
|
236
|
-
var FATOR_MIN = 1;
|
|
237
|
-
var FATOR_SEMANTIC_MAX = 9997;
|
|
238
|
-
function validateFatorVencimento(factor) {
|
|
239
|
-
if (!/^\d{4}$/.test(factor)) {
|
|
240
|
-
return {
|
|
241
|
-
ok: false,
|
|
242
|
-
code: "INVALID_LENGTH",
|
|
243
|
-
message: "Due-date factor must have exactly 4 digits"
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
if (factor === "0000") {
|
|
247
|
-
return { ok: true, factor, hasDueDate: false };
|
|
248
|
-
}
|
|
249
|
-
const days = Number(factor);
|
|
250
|
-
if (days < FATOR_MIN || days > FATOR_SEMANTIC_MAX) {
|
|
251
|
-
return {
|
|
252
|
-
ok: false,
|
|
253
|
-
code: "UNSUPPORTED_FORMAT",
|
|
254
|
-
message: "Due-date factor is out of the supported range"
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
return { ok: true, factor, hasDueDate: true };
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// src/core/boleto/valor-documento.ts
|
|
261
|
-
function validateValorDocumento(value) {
|
|
262
|
-
if (!/^\d{10}$/.test(value)) {
|
|
263
|
-
return {
|
|
264
|
-
ok: false,
|
|
265
|
-
code: "INVALID_LENGTH",
|
|
266
|
-
message: "Document amount must have exactly 10 digits (centavos)"
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
return { ok: true, amountCents: Number(value) };
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// src/core/boleto/semantic.ts
|
|
273
|
-
function failure3(code, message, inputKind) {
|
|
274
|
-
return { ok: false, code, message, inputKind };
|
|
275
|
-
}
|
|
276
|
-
function validateSemanticFields(barcode, options, inputKind) {
|
|
277
|
-
if (detectBoletoSituacao(barcode) !== "situacao-1") {
|
|
278
|
-
return null;
|
|
279
|
-
}
|
|
280
|
-
if (options.validateDueFactor) {
|
|
281
|
-
const factorResult = validateFatorVencimento(barcode.slice(5, 9));
|
|
282
|
-
if (!factorResult.ok) {
|
|
283
|
-
return failure3(factorResult.code, factorResult.message, inputKind);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
if (options.validateAmount && detectBoletoSituacao(barcode) === "situacao-1") {
|
|
287
|
-
validateValorDocumento(barcode.slice(9, 19));
|
|
288
|
-
}
|
|
289
|
-
return null;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// src/core/boleto/index.ts
|
|
293
|
-
function failure4(code, message, inputKind) {
|
|
294
|
-
return { ok: false, code, message, ...inputKind ? { inputKind } : {} };
|
|
295
|
-
}
|
|
296
|
-
function validateByKind(input, kind, options) {
|
|
297
|
-
const result = kind === "linha-digitavel" ? validateLinhaDigitavel(input) : validateCodigoBarras(input);
|
|
298
|
-
if (!result.ok) {
|
|
299
|
-
return result;
|
|
300
|
-
}
|
|
301
|
-
const barcode = kind === "linha-digitavel" ? convertLinhaToCodigoBarrasDigits(result.value) : result.value;
|
|
302
|
-
const semanticError = validateSemanticFields(barcode, options ?? {}, kind);
|
|
303
|
-
if (semanticError) {
|
|
304
|
-
return semanticError;
|
|
305
|
-
}
|
|
306
|
-
return result;
|
|
307
|
-
}
|
|
308
|
-
function isValidBoleto(input, options) {
|
|
309
|
-
return validateBoleto(input, options).ok;
|
|
310
|
-
}
|
|
311
|
-
function validateBoleto(input, options) {
|
|
312
|
-
const trimmed = input.trim();
|
|
313
|
-
if (trimmed.length === 0) {
|
|
314
|
-
return failure4("EMPTY_INPUT", "Boleto input is empty");
|
|
315
|
-
}
|
|
316
|
-
const detected = detectBoletoInputKind(trimmed);
|
|
317
|
-
if (detected === "arrecadacao") {
|
|
318
|
-
return failure4("UNSUPPORTED_FORMAT", "48-digit arrecada\xE7\xE3o slips are not supported");
|
|
319
|
-
}
|
|
320
|
-
if (options?.kind !== void 0) {
|
|
321
|
-
if (detected !== "unknown" && detected !== options.kind) {
|
|
322
|
-
return failure4(
|
|
323
|
-
"UNSUPPORTED_FORMAT",
|
|
324
|
-
`Boleto detected as ${detected} but forced kind is ${options.kind}`,
|
|
325
|
-
options.kind
|
|
326
|
-
);
|
|
327
|
-
}
|
|
328
|
-
return validateByKind(trimmed, options.kind, options);
|
|
329
|
-
}
|
|
330
|
-
if (detected === "unknown") {
|
|
331
|
-
return failure4("UNSUPPORTED_FORMAT", "Boleto input kind could not be determined");
|
|
332
|
-
}
|
|
333
|
-
return validateByKind(trimmed, detected, options);
|
|
334
|
-
}
|
|
335
|
-
function convertLinhaToCodigoBarras(input) {
|
|
336
|
-
const result = validateLinhaDigitavel(input);
|
|
337
|
-
if (!result.ok) {
|
|
338
|
-
return result;
|
|
339
|
-
}
|
|
340
|
-
const barcode = convertLinhaToCodigoBarrasDigits(result.value);
|
|
341
|
-
return {
|
|
342
|
-
ok: true,
|
|
343
|
-
value: brandCodigoBarras(barcode),
|
|
344
|
-
inputKind: "codigo-barras",
|
|
345
|
-
format: "codigo-barras",
|
|
346
|
-
situacao: result.situacao
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
function convertCodigoBarrasToLinhaDigitavel(input) {
|
|
350
|
-
const result = validateCodigoBarras(input);
|
|
351
|
-
if (!result.ok) {
|
|
352
|
-
return result;
|
|
353
|
-
}
|
|
354
|
-
const linha = convertCodigoBarrasToLinhaDigits(result.value);
|
|
355
|
-
return {
|
|
356
|
-
ok: true,
|
|
357
|
-
value: brandLinhaDigitavel(linha),
|
|
358
|
-
inputKind: "linha-digitavel",
|
|
359
|
-
format: "linha-digitavel",
|
|
360
|
-
situacao: result.situacao
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
export { BOLETO_CODE_ISPB_HOLDER, BOLETO_CODIGO_BARRAS_LENGTH, BOLETO_CURRENCY_ISPB, BOLETO_CURRENCY_REAL, BOLETO_GOLDEN_CODIGO_BARRAS, BOLETO_GOLDEN_CODIGO_BARRAS_BB, BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2, BOLETO_GOLDEN_LINHA_BB_STRIPPED, BOLETO_GOLDEN_LINHA_MASKED, BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED, BOLETO_GOLDEN_LINHA_STRIPPED, BOLETO_LAYOUTS_PORTAL_URL, BOLETO_LINHA_LENGTH, BOLETO_OFFICIAL_SOURCE_URL, applyLinhaDigitavelMask, computeModulo10FieldDv, computeModulo11BarcodeDv, convertCodigoBarrasToLinhaDigitavel, convertCodigoBarrasToLinhaDigits, convertLinhaToCodigoBarras, convertLinhaToCodigoBarrasDigits, detectBoletoInputKind, detectBoletoSituacao, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento };
|
|
365
|
-
//# sourceMappingURL=chunk-4W4OKLSZ.js.map
|
|
366
|
-
//# sourceMappingURL=chunk-4W4OKLSZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/boleto/constants.ts","../src/core/boleto/detect-situacao.ts","../src/core/boleto/modulo11.ts","../src/core/boleto/codigo-barras.ts","../src/core/boleto/modulo10.ts","../src/core/boleto/convert.ts","../src/core/boleto/detect.ts","../src/core/boleto/mask.ts","../src/core/boleto/linha-digitavel.ts","../src/core/boleto/fator-vencimento.ts","../src/core/boleto/valor-documento.ts","../src/core/boleto/semantic.ts","../src/core/boleto/index.ts"],"names":["LINHA_MASK_PATTERN","failure"],"mappings":"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","file":"chunk-4W4OKLSZ.js","sourcesContent":["/**\n * FEBRABAN bank boleto (cobrança) — linha digitável + código de barras.\n * @see Convenção da Cobrança FB-0061/2021 — Anexos V, VI, IX, X\n * @see https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf\n */\n\nexport const BOLETO_LINHA_LENGTH = 47;\nexport const BOLETO_CODIGO_BARRAS_LENGTH = 44;\nexport const BOLETO_CURRENCY_REAL = '9';\nexport const BOLETO_CODE_ISPB_HOLDER = '988';\nexport const BOLETO_CURRENCY_ISPB = '0';\n\nexport const BOLETO_GOLDEN_LINHA_MASKED =\n '03399.02579 08991.834006 71742.301014 6 14500000099668';\nexport const BOLETO_GOLDEN_LINHA_STRIPPED =\n '03399025790899183400671742301014614500000099668';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS =\n '03396145000000996689025708991834007174230101';\n\nexport const BOLETO_GOLDEN_LINHA_BB_STRIPPED =\n '00191234546789012345767890123457112340000001500';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_BB =\n '00191123400000015001234567890123456789012345';\n\nexport const BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED =\n '98801234516789012345767890123457760746948000112';\nexport const BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2 =\n '98807607469480001121234567890123456789012345';\n\nexport const BOLETO_OFFICIAL_SOURCE_URL =\n 'https://cmsarquivos.febraban.org.br/Arquivos/documentos/PDF/Conven%C3%A7%C3%A3o%20da%20Cobran%C3%A7a%20-%2005_02_2021_f.pdf';\n\nexport const BOLETO_LAYOUTS_PORTAL_URL =\n 'https://portal.febraban.org.br/pagina/3425/33/pt-br/layout-febraban';\n","/**\n * Situação 1 vs Situação 2 detection (Anexo V §2.3.2).\n * @see BR-BOLETO-011\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_CURRENCY_ISPB,\n BOLETO_CURRENCY_REAL,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type BoletoSituacaoKind = 'situacao-1' | 'situacao-2' | 'unknown';\n\nexport type BoletoSituacaoCode = '1' | '2';\n\nexport function toBoletoSituacaoCode(kind: BoletoSituacaoKind): BoletoSituacaoCode | undefined {\n if (kind === 'situacao-1') {\n return '1';\n }\n if (kind === 'situacao-2') {\n return '2';\n }\n return undefined;\n}\n\nexport function detectBoletoSituacao(stripped: string): BoletoSituacaoKind {\n if (\n stripped.length !== BOLETO_LINHA_LENGTH &&\n stripped.length !== BOLETO_CODIGO_BARRAS_LENGTH\n ) {\n return 'unknown';\n }\n\n if (stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER) {\n if (stripped.charAt(3) === BOLETO_CURRENCY_ISPB) {\n return 'situacao-2';\n }\n return 'unknown';\n }\n\n if (stripped.charAt(3) === BOLETO_CURRENCY_REAL) {\n return 'situacao-1';\n }\n\n return 'unknown';\n}\n","/**\n * Modulo 11 — código de barras general DV (Anexo X).\n */\nexport function computeModulo11BarcodeDv(barcodeWithoutDv: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = barcodeWithoutDv.length - 1; i >= 0; i--) {\n sum += Number(barcodeWithoutDv[i]) * multiplier;\n multiplier = multiplier >= 9 ? 2 : multiplier + 1;\n }\n\n const remainder = sum % 11;\n let dv = 11 - remainder;\n if (dv === 0 || dv === 10 || dv === 11) {\n dv = 1;\n }\n return dv;\n}\n","/**\n * 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, BoletoValidationResult } 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<BoletoValidationResult, { 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): BoletoValidationResult {\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","/**\n * Modulo 10 — linha digitável field DVs (Anexo IX).\n */\nexport function computeModulo10FieldDv(digits: string): number {\n let multiplier = 2;\n let sum = 0;\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let product = Number(digits[i]) * multiplier;\n if (product > 9) {\n product = Math.floor(product / 10) + (product % 10);\n }\n sum += product;\n multiplier = multiplier === 2 ? 1 : 2;\n }\n\n const remainder = sum % 10;\n return remainder === 0 ? 0 : 10 - remainder;\n}\n","/**\n * Linha digitável ↔ código de barras conversion (Anexo V §2.3.4).\n * Situação 1 and Situação 2 share the same field permutation; campo 5 semantics differ\n * (fator+valor vs ISPB 14 digits).\n * @see BR-BOLETO-006\n */\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport function convertLinhaToCodigoBarrasDigits(strippedLinha: string): string {\n return (\n strippedLinha.slice(0, 4) +\n strippedLinha[32] +\n strippedLinha.slice(33, BOLETO_LINHA_LENGTH) +\n strippedLinha.slice(4, 9) +\n strippedLinha.slice(10, 20) +\n strippedLinha.slice(21, 31)\n );\n}\n\nexport function convertCodigoBarrasToLinhaDigits(barcode: string): string {\n const field1 = barcode.slice(0, 4) + barcode.slice(19, 24);\n const field2 = barcode.slice(24, 34);\n const field3 = barcode.slice(34, BOLETO_CODIGO_BARRAS_LENGTH);\n const field5 = barcode.slice(5, 9) + barcode.slice(9, 19);\n const dv1 = String(computeModulo10FieldDv(field1));\n const dv2 = String(computeModulo10FieldDv(field2));\n const dv3 = String(computeModulo10FieldDv(field3));\n return field1 + dv1 + field2 + dv2 + field3 + dv3 + barcode[4] + field5;\n}\n","/**\n * Boleto input kind detection — linha digitável (47) vs código de barras (44).\n * @see BR-BOLETO-001\n */\nimport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\n\nexport type DetectedBoletoInputKind = 'linha-digitavel' | 'codigo-barras' | 'arrecadacao' | 'unknown';\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction stripDigits(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nexport function detectBoletoInputKind(input: string): DetectedBoletoInputKind {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return 'unknown';\n }\n\n const digits = stripDigits(trimmed);\n\n if (digits.length === 48 && digits.startsWith('8')) {\n return 'arrecadacao';\n }\n\n if (digits.length === BOLETO_CODIGO_BARRAS_LENGTH && /^\\d+$/.test(digits)) {\n return 'codigo-barras';\n }\n\n if (digits.length === BOLETO_LINHA_LENGTH) {\n if (/^\\d+$/.test(trimmed)) {\n return 'linha-digitavel';\n }\n if (LINHA_MASK_PATTERN.test(trimmed)) {\n return 'linha-digitavel';\n }\n return 'unknown';\n }\n\n return 'unknown';\n}\n","/**\n * Linha digitável display mask — FEBRABAN Anexo IX (BR-BOLETO-008).\n * @see docs/use-cases/UC-003-format-document.md\n */\nimport { BOLETO_LINHA_LENGTH } from './constants.js';\n\n/** FEBRABAN typable linha digitável mask (47 digits). */\nexport function applyLinhaDigitavelMask(stripped47: string): string {\n if (stripped47.length !== BOLETO_LINHA_LENGTH) {\n throw new Error(`Linha digitável must have exactly ${BOLETO_LINHA_LENGTH} digits to apply mask`);\n }\n return (\n `${stripped47.slice(0, 5)}.${stripped47.slice(5, 10)} ` +\n `${stripped47.slice(10, 15)}.${stripped47.slice(15, 21)} ` +\n `${stripped47.slice(21, 26)}.${stripped47.slice(26, 32)} ` +\n `${stripped47[32]} ${stripped47.slice(33)}`\n );\n}\n\n/** Backward-compatible alias for applyLinhaDigitavelMask. */\nexport function formatLinhaDigitavel(stripped: string): string {\n return applyLinhaDigitavelMask(stripped);\n}\n","/**\n * Linha digitável validation — modulo 10 field DVs (Anexo IX).\n * @see BR-BOLETO-002, BR-BOLETO-008\n */\nimport type { BoletoSituacao, BoletoValidationResult } from '../../types/validation-result.js';\nimport { brandLinhaDigitavel } from '../../types/validation-result.js';\nimport {\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_LINHA_LENGTH,\n} from './constants.js';\nimport { convertLinhaToCodigoBarrasDigits } from './convert.js';\nimport { detectBoletoSituacao, toBoletoSituacaoCode } from './detect-situacao.js';\nimport { computeModulo10FieldDv } from './modulo10.js';\nimport { computeModulo11BarcodeDv } from './modulo11.js';\n\nexport { applyLinhaDigitavelMask, formatLinhaDigitavel } from './mask.js';\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nconst LINHA_MASK_PATTERN = /^[0-9.\\s]+$/;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message, inputKind: 'linha-digitavel' };\n}\n\nexport function stripLinhaDigitavel(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\nfunction validateFieldDv(\n fieldDigits: string,\n actualDv: string,\n fieldNumber: 1 | 2 | 3,\n): FailedResult | null {\n const expected = String(computeModulo10FieldDv(fieldDigits));\n if (actualDv !== expected) {\n return failure('INVALID_CHECK_DIGIT', `Linha digitável field ${fieldNumber} check digit is invalid`);\n }\n return null;\n}\n\nexport function validateLinhaDigitavel(input: string): BoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return { ok: false, code: 'EMPTY_INPUT', message: 'Linha digitável input is empty' };\n }\n\n if (!LINHA_MASK_PATTERN.test(trimmed)) {\n return failure('INVALID_CHARACTER', 'Linha digitável contains invalid characters');\n }\n\n const stripped = stripLinhaDigitavel(trimmed);\n if (stripped.length !== BOLETO_LINHA_LENGTH) {\n return failure('INVALID_LENGTH', `Linha digitável must have ${BOLETO_LINHA_LENGTH} digits after normalization`);\n }\n\n const situacaoKind = detectBoletoSituacao(stripped);\n if (situacaoKind === 'unknown') {\n const isIspbHolder = stripped.slice(0, 3) === BOLETO_CODE_ISPB_HOLDER;\n const message = isIspbHolder\n ? 'ISPB holder boleto (code 988) requires currency indicator 0 (Situação 2)'\n : 'Bank boleto currency code must be 9 (Real) for Situação 1';\n return failure('UNSUPPORTED_FORMAT', message);\n }\n\n const field1Error = validateFieldDv(stripped.slice(0, 9), stripped.charAt(9), 1);\n if (field1Error) {\n return field1Error;\n }\n\n const field2Error = validateFieldDv(stripped.slice(10, 20), stripped.charAt(20), 2);\n if (field2Error) {\n return field2Error;\n }\n\n const field3Error = validateFieldDv(stripped.slice(21, 31), stripped.charAt(31), 3);\n if (field3Error) {\n return field3Error;\n }\n\n const barcode = convertLinhaToCodigoBarrasDigits(stripped);\n const barcodeDvFromMod11 = String(\n computeModulo11BarcodeDv(barcode.slice(0, 4) + barcode.slice(5)),\n );\n\n if (stripped.charAt(32) !== barcodeDvFromMod11) {\n return failure('INVALID_CHECK_DIGIT', 'Linha digitável field 4 (barcode DV) is invalid');\n }\n\n const situacao = toBoletoSituacaoCode(situacaoKind) as BoletoSituacao;\n return {\n ok: true,\n value: brandLinhaDigitavel(stripped),\n inputKind: 'linha-digitavel',\n format: 'linha-digitavel',\n situacao,\n };\n}\n","/**\n * Due-date factor semantic validation (Situação 1 only).\n * @see BR-BOLETO-012\n */\nimport type { ValidationErrorCode } from '../../types/validation-result.js';\n\nconst FATOR_MIN = 1;\n/** FEBRABAN factor space; values above this fail optional semantic validation. */\nconst FATOR_SEMANTIC_MAX = 9997;\n\nexport type FatorVencimentoValidationResult =\n | { ok: true; factor: string; hasDueDate: boolean }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport function validateFatorVencimento(factor: string): FatorVencimentoValidationResult {\n if (!/^\\d{4}$/.test(factor)) {\n return {\n ok: false,\n code: 'INVALID_LENGTH',\n message: 'Due-date factor must have exactly 4 digits',\n };\n }\n\n if (factor === '0000') {\n return { ok: true, factor, hasDueDate: false };\n }\n\n const days = Number(factor);\n if (days < FATOR_MIN || days > FATOR_SEMANTIC_MAX) {\n return {\n ok: false,\n code: 'UNSUPPORTED_FORMAT',\n message: 'Due-date factor is out of the supported range',\n };\n }\n\n return { ok: true, factor, hasDueDate: true };\n}\n","/**\n * Document amount semantic validation (Situação 1 only).\n * @see BR-BOLETO-013\n */\nimport type { ValidationErrorCode } from '../../types/validation-result.js';\n\nexport type ValorDocumentoValidationResult =\n | { ok: true; amountCents: number }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport function validateValorDocumento(value: string): ValorDocumentoValidationResult {\n if (!/^\\d{10}$/.test(value)) {\n return {\n ok: false,\n code: 'INVALID_LENGTH',\n message: 'Document amount must have exactly 10 digits (centavos)',\n };\n }\n\n return { ok: true, amountCents: Number(value) };\n}\n","/**\n * Optional semantic checks for Situação 1 cobrança fields.\n * @see BR-BOLETO-012, BR-BOLETO-013\n */\nimport type { BoletoInputKind, BoletoValidationResult } from '../../types/validation-result.js';\nimport { detectBoletoSituacao } from './detect-situacao.js';\nimport { validateFatorVencimento } from './fator-vencimento.js';\nimport { validateValorDocumento } from './valor-documento.js';\n\nexport type SemanticValidationOptions = {\n validateDueFactor?: boolean;\n validateAmount?: boolean;\n};\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, inputKind: BoletoInputKind): FailedResult {\n return { ok: false, code, message, inputKind };\n}\n\nexport function validateSemanticFields(\n barcode: string,\n options: SemanticValidationOptions,\n inputKind: BoletoInputKind,\n): FailedResult | null {\n if (detectBoletoSituacao(barcode) !== 'situacao-1') {\n return null;\n }\n\n if (options.validateDueFactor) {\n const factorResult = validateFatorVencimento(barcode.slice(5, 9));\n if (!factorResult.ok) {\n return failure(factorResult.code, factorResult.message, inputKind);\n }\n }\n\n if (options.validateAmount && detectBoletoSituacao(barcode) === 'situacao-1') {\n validateValorDocumento(barcode.slice(9, 19));\n }\n\n return null;\n}\n","/**\n * Boleto validation — linha digitável + código de barras (FEBRABAN cobrança).\n * @see docs/use-cases/UC-007-validate-boleto.md\n */\nimport type { BoletoInputKind, BoletoValidationResult } from '../../types/validation-result.js';\nimport { brandCodigoBarras, brandLinhaDigitavel } from '../../types/validation-result.js';\nimport { validateCodigoBarras } from './codigo-barras.js';\nimport {\n convertCodigoBarrasToLinhaDigits,\n convertLinhaToCodigoBarrasDigits,\n} from './convert.js';\nimport { detectBoletoInputKind } from './detect.js';\nimport { validateLinhaDigitavel } from './linha-digitavel.js';\nimport { validateSemanticFields } from './semantic.js';\n\nexport {\n BOLETO_CODIGO_BARRAS_LENGTH,\n BOLETO_CODE_ISPB_HOLDER,\n BOLETO_CURRENCY_ISPB,\n BOLETO_CURRENCY_REAL,\n BOLETO_GOLDEN_CODIGO_BARRAS,\n BOLETO_GOLDEN_CODIGO_BARRAS_BB,\n BOLETO_GOLDEN_CODIGO_BARRAS_SITUACAO2,\n BOLETO_GOLDEN_LINHA_BB_STRIPPED,\n BOLETO_GOLDEN_LINHA_MASKED,\n BOLETO_GOLDEN_LINHA_SITUACAO2_STRIPPED,\n BOLETO_GOLDEN_LINHA_STRIPPED,\n BOLETO_LAYOUTS_PORTAL_URL,\n BOLETO_LINHA_LENGTH,\n BOLETO_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { computeModulo10FieldDv } from './modulo10.js';\nexport { computeModulo11BarcodeDv } from './modulo11.js';\nexport { detectBoletoInputKind, type DetectedBoletoInputKind } from './detect.js';\nexport {\n detectBoletoSituacao,\n toBoletoSituacaoCode,\n type BoletoSituacaoCode,\n type BoletoSituacaoKind,\n} from './detect-situacao.js';\nexport {\n convertCodigoBarrasToLinhaDigits,\n convertLinhaToCodigoBarrasDigits,\n} from './convert.js';\nexport {\n formatLinhaDigitavel,\n stripLinhaDigitavel,\n validateLinhaDigitavel,\n} from './linha-digitavel.js';\nexport { applyLinhaDigitavelMask } from './mask.js';\nexport { stripCodigoBarras, validateCodigoBarras } from './codigo-barras.js';\nexport { validateFatorVencimento, type FatorVencimentoValidationResult } from './fator-vencimento.js';\nexport { validateValorDocumento, type ValorDocumentoValidationResult } from './valor-documento.js';\nexport { validateSemanticFields } from './semantic.js';\n\nexport type ValidateBoletoOptions = {\n kind?: BoletoInputKind;\n validateDueFactor?: boolean;\n validateAmount?: boolean;\n};\n\ntype FailedResult = Extract<BoletoValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string, inputKind?: BoletoInputKind): FailedResult {\n return { ok: false, code, message, ...(inputKind ? { inputKind } : {}) };\n}\n\nfunction validateByKind(input: string, kind: BoletoInputKind, options?: ValidateBoletoOptions): BoletoValidationResult {\n const result = kind === 'linha-digitavel' ? validateLinhaDigitavel(input) : validateCodigoBarras(input);\n if (!result.ok) {\n return result;\n }\n\n const barcode =\n kind === 'linha-digitavel'\n ? convertLinhaToCodigoBarrasDigits(result.value)\n : result.value;\n\n const semanticError = validateSemanticFields(barcode, options ?? {}, kind);\n if (semanticError) {\n return semanticError;\n }\n\n return result;\n}\n\nexport function isValidBoleto(input: string, options?: ValidateBoletoOptions): boolean {\n return validateBoleto(input, options).ok;\n}\n\nexport function validateBoleto(input: string, options?: ValidateBoletoOptions): BoletoValidationResult {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return failure('EMPTY_INPUT', 'Boleto input is empty');\n }\n\n const detected = detectBoletoInputKind(trimmed);\n\n if (detected === 'arrecadacao') {\n return failure('UNSUPPORTED_FORMAT', '48-digit arrecadação slips are not supported');\n }\n\n if (options?.kind !== undefined) {\n if (detected !== 'unknown' && detected !== options.kind) {\n return failure(\n 'UNSUPPORTED_FORMAT',\n `Boleto detected as ${detected} but forced kind is ${options.kind}`,\n options.kind,\n );\n }\n return validateByKind(trimmed, options.kind, options);\n }\n\n if (detected === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'Boleto input kind could not be determined');\n }\n\n return validateByKind(trimmed, detected, options);\n}\n\nexport function convertLinhaToCodigoBarras(input: string): BoletoValidationResult {\n const result = validateLinhaDigitavel(input);\n if (!result.ok) {\n return result;\n }\n const barcode = convertLinhaToCodigoBarrasDigits(result.value);\n return {\n ok: true,\n value: brandCodigoBarras(barcode),\n inputKind: 'codigo-barras',\n format: 'codigo-barras',\n situacao: result.situacao,\n };\n}\n\nexport function convertCodigoBarrasToLinhaDigitavel(input: string): BoletoValidationResult {\n const result = validateCodigoBarras(input);\n if (!result.ok) {\n return result;\n }\n const linha = convertCodigoBarrasToLinhaDigits(result.value);\n return {\n ok: true,\n value: brandLinhaDigitavel(linha),\n inputKind: 'linha-digitavel',\n format: 'linha-digitavel',\n situacao: result.situacao,\n };\n}\n"]}
|