@br-validators/core 0.10.0-alpha.0 → 0.11.0-alpha.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 (63) hide show
  1. package/README.md +3 -3
  2. package/dist/boleto.d.ts +2 -2
  3. package/dist/boleto.js +2 -2
  4. package/dist/brcode.d.ts +79 -0
  5. package/dist/brcode.js +10 -0
  6. package/dist/brcode.js.map +1 -0
  7. package/dist/cartao-credito.d.ts +2 -2
  8. package/dist/cartao-credito.js +2 -2
  9. package/dist/cep.d.ts +2 -2
  10. package/dist/cep.js +2 -2
  11. package/dist/{chunk-YY4M2YS6.js → chunk-2KTD23PD.js} +3 -3
  12. package/dist/{chunk-YY4M2YS6.js.map → chunk-2KTD23PD.js.map} +1 -1
  13. package/dist/chunk-465IC76U.js +211 -0
  14. package/dist/chunk-465IC76U.js.map +1 -0
  15. package/dist/{chunk-PBNVKDCF.js → chunk-5BBNLRZP.js} +3 -3
  16. package/dist/{chunk-PBNVKDCF.js.map → chunk-5BBNLRZP.js.map} +1 -1
  17. package/dist/{chunk-DKRM66US.js → chunk-BBL6ZPXH.js} +9 -3
  18. package/dist/chunk-BBL6ZPXH.js.map +1 -0
  19. package/dist/{chunk-54DTXC6V.js → chunk-CR45BOLS.js} +3 -3
  20. package/dist/{chunk-54DTXC6V.js.map → chunk-CR45BOLS.js.map} +1 -1
  21. package/dist/{chunk-SE33CFGM.js → chunk-D5JMGN7U.js} +6 -29
  22. package/dist/chunk-D5JMGN7U.js.map +1 -0
  23. package/dist/{chunk-Z4F75QEC.js → chunk-FLZ6IHOD.js} +3 -3
  24. package/dist/{chunk-Z4F75QEC.js.map → chunk-FLZ6IHOD.js.map} +1 -1
  25. package/dist/chunk-GEHAH4OH.js +241 -0
  26. package/dist/chunk-GEHAH4OH.js.map +1 -0
  27. package/dist/{chunk-RMKTJQBB.js → chunk-GLKGX552.js} +3 -3
  28. package/dist/{chunk-RMKTJQBB.js.map → chunk-GLKGX552.js.map} +1 -1
  29. package/dist/{chunk-OWJ5HN4T.js → chunk-GN7QIQE6.js} +3 -3
  30. package/dist/{chunk-OWJ5HN4T.js.map → chunk-GN7QIQE6.js.map} +1 -1
  31. package/dist/{chunk-AKJHIJ5E.js → chunk-IW3ESGWH.js} +3 -3
  32. package/dist/{chunk-AKJHIJ5E.js.map → chunk-IW3ESGWH.js.map} +1 -1
  33. package/dist/{chunk-7FOWIH6F.js → chunk-MQT25QN7.js} +3 -3
  34. package/dist/{chunk-7FOWIH6F.js.map → chunk-MQT25QN7.js.map} +1 -1
  35. package/dist/chunk-TVVNTLIH.js +28 -0
  36. package/dist/chunk-TVVNTLIH.js.map +1 -0
  37. package/dist/{chunk-M66MGLHE.js → chunk-UE4PVN6Y.js} +3 -3
  38. package/dist/{chunk-M66MGLHE.js.map → chunk-UE4PVN6Y.js.map} +1 -1
  39. package/dist/{chunk-RZ2JG5PP.js → chunk-V3OWDXRU.js} +3 -3
  40. package/dist/{chunk-RZ2JG5PP.js.map → chunk-V3OWDXRU.js.map} +1 -1
  41. package/dist/cnpj.d.ts +2 -2
  42. package/dist/cnpj.js +3 -3
  43. package/dist/cpf.d.ts +2 -2
  44. package/dist/cpf.js +3 -3
  45. package/dist/index.d.ts +5 -3
  46. package/dist/index.js +23 -20
  47. package/dist/index.js.map +1 -1
  48. package/dist/inscricao-estadual.d.ts +2 -2
  49. package/dist/inscricao-estadual.js +2 -2
  50. package/dist/pis-pasep.d.ts +2 -2
  51. package/dist/pis-pasep.js +2 -2
  52. package/dist/{pix-DP6jnwpN.d.ts → pix-BtTx04Si.d.ts} +1 -1
  53. package/dist/pix.d.ts +2 -2
  54. package/dist/pix.js +5 -4
  55. package/dist/placa.d.ts +2 -2
  56. package/dist/placa.js +2 -2
  57. package/dist/telefone.d.ts +29 -0
  58. package/dist/telefone.js +4 -0
  59. package/dist/telefone.js.map +1 -0
  60. package/dist/{validation-result-BK4qJuei.d.ts → validation-result-C-Ei-lZH.d.ts} +35 -2
  61. package/package.json +14 -5
  62. package/dist/chunk-DKRM66US.js.map +0 -1
  63. package/dist/chunk-SE33CFGM.js.map +0 -1
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  100% open-source Brazilian document validators (MIT).
4
4
 
5
5
  **npm:** [`@br-validators/core`](https://www.npmjs.com/package/@br-validators/core)
6
- **Repo:** [github.com/AlexandreZanata/doc-raiz](https://github.com/AlexandreZanata/doc-raiz)
6
+ **Repo:** [github.com/AlexandreZanata/br-validators](https://github.com/AlexandreZanata/br-validators)
7
7
 
8
8
  > The unscoped name `br-validators` on npm is a different package. Use **`@br-validators/core`**.
9
9
 
@@ -65,7 +65,7 @@ validateInscricaoEstadual('0730000100109', { uf: 'DF' });
65
65
 
66
66
  ## Official sources
67
67
 
68
- Every algorithm cites a primary government source. Full table: [OFFICIAL-SOURCES.md](https://github.com/AlexandreZanata/doc-raiz/blob/main/docs/OFFICIAL-SOURCES.md)
68
+ Every algorithm cites a primary government source. Full table: [OFFICIAL-SOURCES.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/OFFICIAL-SOURCES.md)
69
69
 
70
70
  Per-type URLs also available via constants (`CNPJ_OFFICIAL_SOURCE_URL`, `IE_OFFICIAL_SOURCE_URLS`, etc.).
71
71
 
@@ -73,7 +73,7 @@ Per-type URLs also available via constants (`CNPJ_OFFICIAL_SOURCE_URL`, `IE_OFFI
73
73
 
74
74
  ## API reference
75
75
 
76
- [docs/LIBRARY-API.md](https://github.com/AlexandreZanata/doc-raiz/blob/main/docs/LIBRARY-API.md)
76
+ [docs/LIBRARY-API.md](https://github.com/AlexandreZanata/br-validators/blob/main/docs/LIBRARY-API.md)
77
77
 
78
78
  ---
79
79
 
package/dist/boleto.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { b as BoletoValidationResult, V as ValidationErrorCode, B as BoletoInputKind, F as FormatResult } from './validation-result-BK4qJuei.js';
2
- export { a as BoletoSituacao, f as CodigoBarras, D as DocumentFormat, L as LinhaDigitavel } from './validation-result-BK4qJuei.js';
1
+ import { b as BoletoValidationResult, V as ValidationErrorCode, B as BoletoInputKind, F as FormatResult } from './validation-result-C-Ei-lZH.js';
2
+ export { a as BoletoSituacao, h as CodigoBarras, D as DocumentFormat, L as LinhaDigitavel } from './validation-result-C-Ei-lZH.js';
3
3
 
4
4
  /**
5
5
  * FEBRABAN bank boleto (cobrança) — linha digitável + código de barras.
package/dist/boleto.js CHANGED
@@ -1,4 +1,4 @@
1
- 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, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-AKJHIJ5E.js';
2
- import './chunk-DKRM66US.js';
1
+ 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, formatBoleto, formatLinhaDigitavel, isValidBoleto, stripCodigoBarras, stripLinhaDigitavel, validateBoleto, validateCodigoBarras, validateFatorVencimento, validateLinhaDigitavel, validateValorDocumento } from './chunk-IW3ESGWH.js';
2
+ import './chunk-BBL6ZPXH.js';
3
3
  //# sourceMappingURL=boleto.js.map
4
4
  //# sourceMappingURL=boleto.js.map
@@ -0,0 +1,79 @@
1
+ import { k as PixKey, l as PixKeyType, V as ValidationErrorCode, d as BrCodeValidationResult } from './validation-result-C-Ei-lZH.js';
2
+ export { c as BrCodePayload } from './validation-result-C-Ei-lZH.js';
3
+
4
+ /** Bacen Manual BR Code — EMV-QRCPS-MPM TLV + CRC16-CCITT */
5
+ declare const BRCODE_OFFICIAL_SOURCE_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf";
6
+ declare const BRCODE_PIX_INITIATION_MANUAL_URL = "https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix.pdf";
7
+ /** Manual de Padrões PIX — static QR, EVP key (CRC 1D3D). */
8
+ declare const BRCODE_GOLDEN_STATIC_EVP = "00020126580014br.gov.bcb.pix0136123e4567-e12b-12d1-a456-4266554400005204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***63041D3D";
9
+ /** Manual de Padrões PIX — dynamic QR with amount (CRC 7309). */
10
+ declare const BRCODE_GOLDEN_DYNAMIC_URL = "00020101021226730014br.gov.bcb.pix2551pix.example.com/v2/8b3da2f39a4140d1a91abd93113bd4415204000053039865406123.455802BR5913Fulano de Tal6008BRASILIA62190515RP12345678-201963047309";
11
+ /** Manual BR Code — composite payload with PIX + other arranjos (CRC AD38). */
12
+ declare const BRCODE_GOLDEN_COMPOSITE = "00020104141234567890123426580014BR.GOV.BCB.PIX0136123e4567-e12b-12d1-a456-42665544000027300012BR.COM.OUTRO011001234567895204000053039865406123.455802BR5917NOME DO RECEBEDOR6008BRASILIA61087007490062190515RP12345678-201980390012BR.COM.OUTRO01190123.ABCD.3456.WXYZ6304AD38";
13
+ /** Golden CPF PIX key 12345678909 — CRC computed per manual algorithm. */
14
+ declare const BRCODE_GOLDEN_STATIC_CPF = "00020126330014br.gov.bcb.pix0111123456789095204000053039865802BR5917NOME DO RECEBEDOR6009SAO PAULO62070503***6304258E";
15
+ /** Golden email pix@bcb.gov.br — CRC computed per manual algorithm. */
16
+ declare const BRCODE_GOLDEN_STATIC_EMAIL = "00020126360014br.gov.bcb.pix0114pix@bcb.gov.br5204000053039865802BR5913Fulano de Tal6008BRASILIA62070503***6304A7E9";
17
+
18
+ /** CRC16-CCITT-FALSE — polynomial 0x1021, initial 0xFFFF (Bacen Manual BR Code). */
19
+ declare function computeCrc16Ccitt(payload: string): string;
20
+ declare function verifyBrCodeCrc(payload: string): {
21
+ ok: true;
22
+ } | {
23
+ ok: false;
24
+ message: string;
25
+ };
26
+
27
+ type BrCodeParsedFields = {
28
+ merchantName: string;
29
+ merchantCity: string;
30
+ amount?: string;
31
+ txid?: string;
32
+ pixKey?: PixKey;
33
+ pixKeyType?: PixKeyType;
34
+ pixInitiationUrl?: string;
35
+ };
36
+ type BrCodeParseFailure = {
37
+ ok: false;
38
+ code: ValidationErrorCode;
39
+ message: string;
40
+ };
41
+ type BrCodeParseSuccess = {
42
+ ok: true;
43
+ payload: string;
44
+ fields: BrCodeParsedFields;
45
+ };
46
+ type BrCodeParseResult = BrCodeParseSuccess | BrCodeParseFailure;
47
+ declare function normalizeBrCodePayload(input: string): string;
48
+ declare function parseBrCodePayload(input: string): BrCodeParseResult;
49
+
50
+ type TlvField = {
51
+ id: string;
52
+ value: string;
53
+ };
54
+ type TlvParseFailure = {
55
+ ok: false;
56
+ message: string;
57
+ };
58
+ type TlvParseSuccess = {
59
+ ok: true;
60
+ fields: TlvField[];
61
+ };
62
+ type TlvParseResult = TlvParseSuccess | TlvParseFailure;
63
+ declare function parseTlvSequence(data: string): TlvParseResult;
64
+ declare function findTlvField(fields: TlvField[], id: string): string | undefined;
65
+ declare function findPixMerchantAccount(fields: TlvField[]): {
66
+ value: string;
67
+ nestedFields: TlvField[];
68
+ } | undefined;
69
+
70
+ /**
71
+ * BR Code (PIX QR) payload parsing — EMV TLV + CRC16-CCITT.
72
+ * @see https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf
73
+ */
74
+
75
+ declare function isValidBrCode(input: string): boolean;
76
+ declare function parseBrCode(input: string): BrCodeValidationResult;
77
+ declare function validateBrCode(input: string): BrCodeValidationResult;
78
+
79
+ export { BRCODE_GOLDEN_COMPOSITE, BRCODE_GOLDEN_DYNAMIC_URL, BRCODE_GOLDEN_STATIC_CPF, BRCODE_GOLDEN_STATIC_EMAIL, BRCODE_GOLDEN_STATIC_EVP, BRCODE_OFFICIAL_SOURCE_URL, BRCODE_PIX_INITIATION_MANUAL_URL, type BrCodeParseResult, type BrCodeParsedFields, BrCodeValidationResult, PixKeyType, type TlvField, type TlvParseResult, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc };
package/dist/brcode.js ADDED
@@ -0,0 +1,10 @@
1
+ export { BRCODE_GOLDEN_COMPOSITE, BRCODE_GOLDEN_DYNAMIC_URL, BRCODE_GOLDEN_STATIC_CPF, BRCODE_GOLDEN_STATIC_EMAIL, BRCODE_GOLDEN_STATIC_EVP, BRCODE_OFFICIAL_SOURCE_URL, BRCODE_PIX_INITIATION_MANUAL_URL, computeCrc16Ccitt, findPixMerchantAccount, findTlvField, isValidBrCode, normalizeBrCodePayload, parseBrCode, parseBrCodePayload, parseTlvSequence, validateBrCode, verifyBrCodeCrc } from './chunk-GEHAH4OH.js';
2
+ import './chunk-D5JMGN7U.js';
3
+ import './chunk-UE4PVN6Y.js';
4
+ import './chunk-EB3G4IG6.js';
5
+ import './chunk-5BBNLRZP.js';
6
+ import './chunk-UCJPSJN5.js';
7
+ import './chunk-B2TDI3YS.js';
8
+ import './chunk-BBL6ZPXH.js';
9
+ //# sourceMappingURL=brcode.js.map
10
+ //# sourceMappingURL=brcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"brcode.js"}
@@ -1,5 +1,5 @@
1
- import { c as CartaoCreditoValidationResult, F as FormatResult } from './validation-result-BK4qJuei.js';
2
- export { C as CartaoCredito, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BK4qJuei.js';
1
+ import { e as CartaoCreditoValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js';
2
+ export { C as CartaoCredito, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js';
3
3
 
4
4
  /**
5
5
  * Credit card PAN constants — ISO/IEC 7812-1 Annex B (Luhn).
@@ -1,4 +1,4 @@
1
- export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-54DTXC6V.js';
2
- import './chunk-DKRM66US.js';
1
+ export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito } from './chunk-CR45BOLS.js';
2
+ import './chunk-BBL6ZPXH.js';
3
3
  //# sourceMappingURL=cartao-credito.js.map
4
4
  //# sourceMappingURL=cartao-credito.js.map
package/dist/cep.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { m as ValidationResult, F as FormatResult } from './validation-result-BK4qJuei.js';
2
- export { d as Cep, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-BK4qJuei.js';
1
+ import { q as ValidationResult, F as FormatResult } from './validation-result-C-Ei-lZH.js';
2
+ export { f as Cep, D as DocumentFormat, V as ValidationErrorCode } from './validation-result-C-Ei-lZH.js';
3
3
 
4
4
  declare const CEP_GOLDEN_PRIMARY = "01310100";
5
5
  declare const CEP_GOLDEN_SECONDARY = "20040020";
package/dist/cep.js CHANGED
@@ -1,7 +1,7 @@
1
- export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep } from './chunk-RMKTJQBB.js';
1
+ export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_OFFICIAL_SOURCE_URL, formatCep, isValidCep, validateCep } from './chunk-GLKGX552.js';
2
2
  export { stripCep } from './chunk-W6UXVWSR.js';
3
3
  import './chunk-EB3G4IG6.js';
4
4
  import './chunk-UCJPSJN5.js';
5
- import './chunk-DKRM66US.js';
5
+ import './chunk-BBL6ZPXH.js';
6
6
  //# sourceMappingURL=cep.js.map
7
7
  //# sourceMappingURL=cep.js.map
@@ -1,5 +1,5 @@
1
1
  import { stripPlaca } from './chunk-W6UXVWSR.js';
2
- import { brandPlaca } from './chunk-DKRM66US.js';
2
+ import { brandPlaca } from './chunk-BBL6ZPXH.js';
3
3
 
4
4
  // src/core/placa/constants.ts
5
5
  var PLACA_LENGTH = 7;
@@ -111,5 +111,5 @@ function formatPlaca(input) {
111
111
  }
112
112
 
113
113
  export { PLACA_GOLDEN_CONVERSION_FROM, PLACA_GOLDEN_CONVERSION_TO, PLACA_GOLDEN_LEGACY, PLACA_GOLDEN_MERCOSUL, PLACA_OFFICIAL_SOURCE_URL, convertPlacaToMercosul, detectPlacaFormat, formatPlaca, isValidPlaca, isValidPlacaLegacy, isValidPlacaMercosul, validatePlaca };
114
- //# sourceMappingURL=chunk-YY4M2YS6.js.map
115
- //# sourceMappingURL=chunk-YY4M2YS6.js.map
114
+ //# sourceMappingURL=chunk-2KTD23PD.js.map
115
+ //# sourceMappingURL=chunk-2KTD23PD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/placa/constants.ts","../src/core/placa/detect.ts","../src/core/placa/legacy.ts","../src/core/placa/mercosul.ts","../src/core/placa/convert.ts","../src/core/placa/index.ts","../src/format/placa.ts"],"names":["failure"],"mappings":"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","file":"chunk-YY4M2YS6.js","sourcesContent":["/**\n * License plate patterns — CONTRAN 729/2018 (legacy + Mercosul).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n * @see docs/use-cases/UC-004-validate-placa.md — golden vectors ABC1D23, ABC1234\n */\nexport const PLACA_LENGTH = 7;\nexport const PLACA_LEGACY_PATTERN = /^[A-Z]{3}[0-9]{4}$/;\nexport const PLACA_MERCOSUL_PATTERN = /^[A-Z]{3}[0-9][A-Z0-9][0-9]{2}$/;\nexport const PLACA_LEGACY_TO_MERCOSUL_MAP: Record<string, string> = {\n '0': 'A',\n '1': 'B',\n '2': 'C',\n '3': 'D',\n '4': 'E',\n '5': 'F',\n '6': 'G',\n '7': 'H',\n '8': 'I',\n '9': 'J',\n};\nexport const PLACA_GOLDEN_MERCOSUL = 'ABC1D23';\nexport const PLACA_GOLDEN_LEGACY = 'ABC1234';\nexport const PLACA_GOLDEN_CONVERSION_FROM = 'ABC1234';\nexport const PLACA_GOLDEN_CONVERSION_TO = 'ABC1C34';\nexport const PLACA_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf';\n","/**\n * License plate format detection — legacy vs Mercosul (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LENGTH, PLACA_LEGACY_PATTERN, PLACA_MERCOSUL_PATTERN } from './constants.js';\n\nexport type PlacaFormat = 'legacy' | 'mercosul' | 'unknown';\n\nexport function detectPlacaFormat(input: string): PlacaFormat {\n const stripped = stripPlaca(input);\n if (stripped.length !== PLACA_LENGTH) {\n return 'unknown';\n }\n if (PLACA_LEGACY_PATTERN.test(stripped)) {\n return 'legacy';\n }\n if (PLACA_MERCOSUL_PATTERN.test(stripped)) {\n return 'mercosul';\n }\n return 'unknown';\n}\n","/**\n * License plate — legacy format LLLNNNN (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LEGACY_PATTERN } from './constants.js';\n\nexport function isValidPlacaLegacy(input: string): boolean {\n const stripped = stripPlaca(input);\n return PLACA_LEGACY_PATTERN.test(stripped);\n}\n","/**\n * License plate — Mercosul format LLLNLNN (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_MERCOSUL_PATTERN } from './constants.js';\n\nexport function isValidPlacaMercosul(input: string): boolean {\n const stripped = stripPlaca(input);\n return PLACA_MERCOSUL_PATTERN.test(stripped);\n}\n","/**\n * Legacy → Mercosul plate conversion (CONTRAN digit-to-letter table).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport type { FormatResult } from '../../types/validation-result.js';\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LEGACY_TO_MERCOSUL_MAP } from './constants.js';\nimport { detectPlacaFormat } from './detect.js';\n\ntype FailedResult = Extract<FormatResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nexport function convertPlacaToMercosul(input: string): FormatResult {\n const stripped = stripPlaca(input);\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Placa input is empty');\n }\n\n if (detectPlacaFormat(input) !== 'legacy') {\n return failure('UNSUPPORTED_FORMAT', 'Conversion requires a valid legacy plate (LLLNNNN)');\n }\n\n const prefix = stripped.slice(0, 4);\n const mapped = PLACA_LEGACY_TO_MERCOSUL_MAP[stripped.charAt(4)];\n const suffix = stripped.slice(5);\n return { ok: true, formatted: `${prefix}${mapped}${suffix}` };\n}\n","/**\n * License plate validation — legacy (LLLNNNN) + Mercosul (LLLNLNN). CONTRAN 729/2018.\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n * @see docs/use-cases/UC-004-validate-placa.md — golden vectors ABC1D23, ABC1234\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport type { DocumentFormat, Placa, ValidationResult } from '../../types/validation-result.js';\nimport { brandPlaca } from '../../types/validation-result.js';\nimport { detectPlacaFormat } from './detect.js';\nimport { PLACA_LENGTH } from './constants.js';\n\nexport {\n PLACA_GOLDEN_CONVERSION_FROM,\n PLACA_GOLDEN_CONVERSION_TO,\n PLACA_GOLDEN_LEGACY,\n PLACA_GOLDEN_MERCOSUL,\n PLACA_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { detectPlacaFormat, type PlacaFormat } from './detect.js';\nexport { isValidPlacaLegacy } from './legacy.js';\nexport { isValidPlacaMercosul } from './mercosul.js';\nexport { convertPlacaToMercosul } from './convert.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 validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Placa input is empty');\n }\n\n const withoutSeparators = input.replace(/[-\\s]/g, '');\n if (/[^A-Za-z0-9]/.test(withoutSeparators)) {\n return failure('INVALID_CHARACTER', 'Placa contains invalid characters');\n }\n\n if (stripped.length !== PLACA_LENGTH) {\n return failure('INVALID_LENGTH', `Placa must have ${PLACA_LENGTH} characters after normalization`);\n }\n\n return null;\n}\n\nexport function isValidPlaca(input: string): boolean {\n return validatePlaca(input).ok;\n}\n\nexport function validatePlaca(input: string): ValidationResult<Placa> {\n const stripped = stripPlaca(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n const format = detectPlacaFormat(input);\n if (format === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'Placa does not match legacy or Mercosul format');\n }\n\n return { ok: true, value: brandPlaca(stripped), format: format as DocumentFormat };\n}\n","import { validatePlaca } from '../core/placa/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatPlaca(input: string): FormatResult {\n const result = validatePlaca(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: result.value };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/placa/constants.ts","../src/core/placa/detect.ts","../src/core/placa/legacy.ts","../src/core/placa/mercosul.ts","../src/core/placa/convert.ts","../src/core/placa/index.ts","../src/format/placa.ts"],"names":["failure"],"mappings":"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","file":"chunk-2KTD23PD.js","sourcesContent":["/**\n * License plate patterns — CONTRAN 729/2018 (legacy + Mercosul).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n * @see docs/use-cases/UC-004-validate-placa.md — golden vectors ABC1D23, ABC1234\n */\nexport const PLACA_LENGTH = 7;\nexport const PLACA_LEGACY_PATTERN = /^[A-Z]{3}[0-9]{4}$/;\nexport const PLACA_MERCOSUL_PATTERN = /^[A-Z]{3}[0-9][A-Z0-9][0-9]{2}$/;\nexport const PLACA_LEGACY_TO_MERCOSUL_MAP: Record<string, string> = {\n '0': 'A',\n '1': 'B',\n '2': 'C',\n '3': 'D',\n '4': 'E',\n '5': 'F',\n '6': 'G',\n '7': 'H',\n '8': 'I',\n '9': 'J',\n};\nexport const PLACA_GOLDEN_MERCOSUL = 'ABC1D23';\nexport const PLACA_GOLDEN_LEGACY = 'ABC1234';\nexport const PLACA_GOLDEN_CONVERSION_FROM = 'ABC1234';\nexport const PLACA_GOLDEN_CONVERSION_TO = 'ABC1C34';\nexport const PLACA_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf';\n","/**\n * License plate format detection — legacy vs Mercosul (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LENGTH, PLACA_LEGACY_PATTERN, PLACA_MERCOSUL_PATTERN } from './constants.js';\n\nexport type PlacaFormat = 'legacy' | 'mercosul' | 'unknown';\n\nexport function detectPlacaFormat(input: string): PlacaFormat {\n const stripped = stripPlaca(input);\n if (stripped.length !== PLACA_LENGTH) {\n return 'unknown';\n }\n if (PLACA_LEGACY_PATTERN.test(stripped)) {\n return 'legacy';\n }\n if (PLACA_MERCOSUL_PATTERN.test(stripped)) {\n return 'mercosul';\n }\n return 'unknown';\n}\n","/**\n * License plate — legacy format LLLNNNN (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LEGACY_PATTERN } from './constants.js';\n\nexport function isValidPlacaLegacy(input: string): boolean {\n const stripped = stripPlaca(input);\n return PLACA_LEGACY_PATTERN.test(stripped);\n}\n","/**\n * License plate — Mercosul format LLLNLNN (CONTRAN).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_MERCOSUL_PATTERN } from './constants.js';\n\nexport function isValidPlacaMercosul(input: string): boolean {\n const stripped = stripPlaca(input);\n return PLACA_MERCOSUL_PATTERN.test(stripped);\n}\n","/**\n * Legacy → Mercosul plate conversion (CONTRAN digit-to-letter table).\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n */\nimport type { FormatResult } from '../../types/validation-result.js';\nimport { stripPlaca } from '../../strip/index.js';\nimport { PLACA_LEGACY_TO_MERCOSUL_MAP } from './constants.js';\nimport { detectPlacaFormat } from './detect.js';\n\ntype FailedResult = Extract<FormatResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nexport function convertPlacaToMercosul(input: string): FormatResult {\n const stripped = stripPlaca(input);\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Placa input is empty');\n }\n\n if (detectPlacaFormat(input) !== 'legacy') {\n return failure('UNSUPPORTED_FORMAT', 'Conversion requires a valid legacy plate (LLLNNNN)');\n }\n\n const prefix = stripped.slice(0, 4);\n const mapped = PLACA_LEGACY_TO_MERCOSUL_MAP[stripped.charAt(4)];\n const suffix = stripped.slice(5);\n return { ok: true, formatted: `${prefix}${mapped}${suffix}` };\n}\n","/**\n * License plate validation — legacy (LLLNNNN) + Mercosul (LLLNLNN). CONTRAN 729/2018.\n * @see https://www.gov.br/transportes/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7292018consolidada.pdf\n * @see docs/use-cases/UC-004-validate-placa.md — golden vectors ABC1D23, ABC1234\n */\nimport { stripPlaca } from '../../strip/index.js';\nimport type { DocumentFormat, Placa, ValidationResult } from '../../types/validation-result.js';\nimport { brandPlaca } from '../../types/validation-result.js';\nimport { detectPlacaFormat } from './detect.js';\nimport { PLACA_LENGTH } from './constants.js';\n\nexport {\n PLACA_GOLDEN_CONVERSION_FROM,\n PLACA_GOLDEN_CONVERSION_TO,\n PLACA_GOLDEN_LEGACY,\n PLACA_GOLDEN_MERCOSUL,\n PLACA_OFFICIAL_SOURCE_URL,\n} from './constants.js';\nexport { detectPlacaFormat, type PlacaFormat } from './detect.js';\nexport { isValidPlacaLegacy } from './legacy.js';\nexport { isValidPlacaMercosul } from './mercosul.js';\nexport { convertPlacaToMercosul } from './convert.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 validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'Placa input is empty');\n }\n\n const withoutSeparators = input.replace(/[-\\s]/g, '');\n if (/[^A-Za-z0-9]/.test(withoutSeparators)) {\n return failure('INVALID_CHARACTER', 'Placa contains invalid characters');\n }\n\n if (stripped.length !== PLACA_LENGTH) {\n return failure('INVALID_LENGTH', `Placa must have ${PLACA_LENGTH} characters after normalization`);\n }\n\n return null;\n}\n\nexport function isValidPlaca(input: string): boolean {\n return validatePlaca(input).ok;\n}\n\nexport function validatePlaca(input: string): ValidationResult<Placa> {\n const stripped = stripPlaca(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n const format = detectPlacaFormat(input);\n if (format === 'unknown') {\n return failure('UNSUPPORTED_FORMAT', 'Placa does not match legacy or Mercosul format');\n }\n\n return { ok: true, value: brandPlaca(stripped), format: format as DocumentFormat };\n}\n","import { validatePlaca } from '../core/placa/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatPlaca(input: string): FormatResult {\n const result = validatePlaca(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: result.value };\n}\n"]}
@@ -0,0 +1,211 @@
1
+ import { brandTelefone } from './chunk-BBL6ZPXH.js';
2
+
3
+ // src/core/telefone/constants.ts
4
+ var TELEFONE_COUNTRY_CODE = "55";
5
+ var ANATEL_DDDS = [
6
+ "11",
7
+ "12",
8
+ "13",
9
+ "14",
10
+ "15",
11
+ "16",
12
+ "17",
13
+ "18",
14
+ "19",
15
+ "21",
16
+ "22",
17
+ "24",
18
+ "27",
19
+ "28",
20
+ "31",
21
+ "32",
22
+ "33",
23
+ "34",
24
+ "35",
25
+ "37",
26
+ "38",
27
+ "41",
28
+ "42",
29
+ "43",
30
+ "44",
31
+ "45",
32
+ "46",
33
+ "47",
34
+ "48",
35
+ "49",
36
+ "51",
37
+ "53",
38
+ "54",
39
+ "55",
40
+ "61",
41
+ "62",
42
+ "64",
43
+ "63",
44
+ "65",
45
+ "66",
46
+ "67",
47
+ "68",
48
+ "69",
49
+ "71",
50
+ "73",
51
+ "74",
52
+ "75",
53
+ "77",
54
+ "79",
55
+ "81",
56
+ "87",
57
+ "82",
58
+ "83",
59
+ "84",
60
+ "85",
61
+ "88",
62
+ "86",
63
+ "89",
64
+ "91",
65
+ "93",
66
+ "94",
67
+ "92",
68
+ "97",
69
+ "95",
70
+ "96",
71
+ "98",
72
+ "99"
73
+ ];
74
+ var ANATEL_DDD_SET = new Set(ANATEL_DDDS);
75
+ var TELEFONE_DDD_LENGTH = 2;
76
+ var TELEFONE_CELULAR_MASK_PATTERN = /^(\d{2})(\d{5})(\d{4})$/;
77
+ var TELEFONE_FIXO_MASK_PATTERN = /^(\d{2})(\d{4})(\d{4})$/;
78
+ var TELEFONE_EMERGENCY_CODES = /* @__PURE__ */ new Set(["190", "192", "193", "197", "198", "199"]);
79
+ var TELEFONE_GOLDEN_CELULAR = "11999999999";
80
+ var TELEFONE_GOLDEN_CELULAR_MASKED = "(11) 99999-9999";
81
+ var TELEFONE_GOLDEN_FIXO = "1133333333";
82
+ var TELEFONE_GOLDEN_FIXO_MASKED = "(11) 3333-3333";
83
+ var TELEFONE_OFFICIAL_SOURCE_URL = "https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro";
84
+ var TELEFONE_ANATEL_DDD_PANEL_URL = "https://informacoes.anatel.gov.br/paineis/areas-tarifarias/codigos-nacionais";
85
+
86
+ // src/strip/telefone.ts
87
+ function extractTelefoneDigits(input) {
88
+ return input.replace(/\D/g, "");
89
+ }
90
+ function normalizeTelefoneDigits(input) {
91
+ let digits = extractTelefoneDigits(input);
92
+ if (digits.length === 0) {
93
+ return "";
94
+ }
95
+ if (digits.startsWith(TELEFONE_COUNTRY_CODE) && (digits.length === 12 || digits.length === 13)) {
96
+ digits = digits.slice(TELEFONE_COUNTRY_CODE.length);
97
+ }
98
+ if (digits.startsWith("0") && (digits.length === 11 || digits.length === 12)) {
99
+ digits = digits.slice(1);
100
+ }
101
+ return digits;
102
+ }
103
+ function stripTelefone(input) {
104
+ return normalizeTelefoneDigits(input);
105
+ }
106
+
107
+ // src/core/telefone/index.ts
108
+ var MASK_CHARS_PATTERN = /[\s().+-]/g;
109
+ function failure(code, message) {
110
+ return { ok: false, code, message };
111
+ }
112
+ function hasInvalidCharacters(input) {
113
+ const withoutMask = input.replace(MASK_CHARS_PATTERN, "");
114
+ return /[^0-9]/.test(withoutMask);
115
+ }
116
+ function detectTipo(local) {
117
+ if (local.length === 9 && local[0] === "9") {
118
+ return "celular";
119
+ }
120
+ if (local.length === 8 && /^[2345]/.test(local)) {
121
+ return "fixo";
122
+ }
123
+ return null;
124
+ }
125
+ function rejectLocalPattern(local, nationalLength) {
126
+ if (nationalLength === 11) {
127
+ return failure(
128
+ "KNOWN_INVALID_PATTERN",
129
+ "Mobile numbers must have 9 digits starting with 9 after DDD (Anatel nono d\xEDgito)"
130
+ );
131
+ }
132
+ if (nationalLength === 10 && /^[6789]/.test(local)) {
133
+ return failure(
134
+ "KNOWN_INVALID_PATTERN",
135
+ "Mobile numbers require 9 digits starting with 9; numbers starting with 6\u20139 without the 9th digit are invalid"
136
+ );
137
+ }
138
+ return failure(
139
+ "KNOWN_INVALID_PATTERN",
140
+ "Landline numbers must have 8 digits starting with 2, 3, 4, or 5 after DDD"
141
+ );
142
+ }
143
+ function validateStructure(input, normalized) {
144
+ if (input.trim().length === 0) {
145
+ return failure("EMPTY_INPUT", "Telephone input is empty");
146
+ }
147
+ if (hasInvalidCharacters(input)) {
148
+ return failure("INVALID_CHARACTER", "Telephone contains invalid characters");
149
+ }
150
+ if (normalized.length === 0) {
151
+ return failure("EMPTY_INPUT", "Telephone input is empty");
152
+ }
153
+ if (TELEFONE_EMERGENCY_CODES.has(normalized)) {
154
+ return failure("UNSUPPORTED_FORMAT", "Emergency short codes are not subscriber telephone numbers");
155
+ }
156
+ if (normalized.length !== 10 && normalized.length !== 11) {
157
+ return failure(
158
+ "INVALID_LENGTH",
159
+ "Telephone must have 10 digits (fixo) or 11 digits (celular) after normalization"
160
+ );
161
+ }
162
+ const ddd = normalized.slice(0, TELEFONE_DDD_LENGTH);
163
+ if (!ANATEL_DDD_SET.has(ddd)) {
164
+ return failure("KNOWN_INVALID_PATTERN", `Area code ${ddd} is not a valid Anatel DDD`);
165
+ }
166
+ const local = normalized.slice(TELEFONE_DDD_LENGTH);
167
+ const tipo = detectTipo(local);
168
+ if (!tipo) {
169
+ return rejectLocalPattern(local, normalized.length);
170
+ }
171
+ return { tipo };
172
+ }
173
+ function isValidTelefone(input) {
174
+ return validateTelefone(input).ok;
175
+ }
176
+ function validateTelefone(input) {
177
+ const normalized = normalizeTelefoneDigits(input);
178
+ const structural = validateStructure(input, normalized);
179
+ if ("ok" in structural) {
180
+ return structural;
181
+ }
182
+ return {
183
+ ok: true,
184
+ value: brandTelefone(normalized),
185
+ tipo: structural.tipo,
186
+ format: "telefone"
187
+ };
188
+ }
189
+
190
+ // src/core/telefone/mask.ts
191
+ function applyTelefoneMask(canonical, tipo) {
192
+ const pattern = tipo === "celular" ? TELEFONE_CELULAR_MASK_PATTERN : TELEFONE_FIXO_MASK_PATTERN;
193
+ const match = pattern.exec(canonical);
194
+ if (!match) {
195
+ throw new Error(`Telephone must have valid ${tipo} length to apply mask`);
196
+ }
197
+ return `(${match[1]}) ${match[2]}-${match[3]}`;
198
+ }
199
+
200
+ // src/format/telefone.ts
201
+ function formatTelefone(input) {
202
+ const result = validateTelefone(input);
203
+ if (!result.ok) {
204
+ return { ok: false, code: result.code, message: result.message };
205
+ }
206
+ return { ok: true, formatted: applyTelefoneMask(result.value, result.tipo) };
207
+ }
208
+
209
+ export { ANATEL_DDDS, ANATEL_DDD_SET, TELEFONE_ANATEL_DDD_PANEL_URL, TELEFONE_GOLDEN_CELULAR, TELEFONE_GOLDEN_CELULAR_MASKED, TELEFONE_GOLDEN_FIXO, TELEFONE_GOLDEN_FIXO_MASKED, TELEFONE_OFFICIAL_SOURCE_URL, extractTelefoneDigits, formatTelefone, isValidTelefone, normalizeTelefoneDigits, stripTelefone, validateTelefone };
210
+ //# sourceMappingURL=chunk-465IC76U.js.map
211
+ //# sourceMappingURL=chunk-465IC76U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/telefone/constants.ts","../src/strip/telefone.ts","../src/core/telefone/index.ts","../src/core/telefone/mask.ts","../src/format/telefone.ts"],"names":[],"mappings":"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","file":"chunk-465IC76U.js","sourcesContent":["/**\n * Brazilian telephone constants — Anatel national area codes (CN/DDD).\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro\n * @see https://informacoes.anatel.gov.br/paineis/areas-tarifarias/codigos-nacionais\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/nono-digito\n */\nexport const TELEFONE_COUNTRY_CODE = '55';\n\n/** 67 official Anatel national area codes (CN / DDD). */\nexport const ANATEL_DDDS = [\n '11', '12', '13', '14', '15', '16', '17', '18', '19',\n '21', '22', '24',\n '27', '28',\n '31', '32', '33', '34', '35', '37', '38',\n '41', '42', '43', '44', '45', '46',\n '47', '48', '49',\n '51', '53', '54', '55',\n '61',\n '62', '64',\n '63',\n '65', '66',\n '67',\n '68',\n '69',\n '71', '73', '74', '75', '77',\n '79',\n '81', '87',\n '82',\n '83',\n '84',\n '85', '88',\n '86', '89',\n '91', '93', '94',\n '92', '97',\n '95',\n '96',\n '98', '99',\n] as const;\n\nexport const ANATEL_DDD_SET: ReadonlySet<string> = new Set(ANATEL_DDDS);\n\nexport const TELEFONE_CELULAR_LOCAL_LENGTH = 9;\nexport const TELEFONE_FIXO_LOCAL_LENGTH = 8;\nexport const TELEFONE_DDD_LENGTH = 2;\n\nexport const TELEFONE_CELULAR_MASK_PATTERN = /^(\\d{2})(\\d{5})(\\d{4})$/;\nexport const TELEFONE_FIXO_MASK_PATTERN = /^(\\d{2})(\\d{4})(\\d{4})$/;\n\n/** Emergency / public utility short codes — out of subscriber scope (BR-TEL-007). */\nexport const TELEFONE_EMERGENCY_CODES = new Set(['190', '192', '193', '197', '198', '199']);\n\nexport const TELEFONE_GOLDEN_CELULAR = '11999999999';\nexport const TELEFONE_GOLDEN_CELULAR_MASKED = '(11) 99999-9999';\nexport const TELEFONE_GOLDEN_FIXO = '1133333333';\nexport const TELEFONE_GOLDEN_FIXO_MASKED = '(11) 3333-3333';\n\nexport const TELEFONE_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro';\n\nexport const TELEFONE_ANATEL_DDD_PANEL_URL =\n 'https://informacoes.anatel.gov.br/paineis/areas-tarifarias/codigos-nacionais';\n","/**\n * Strip and normalize Brazilian telephone numbers (BR-TEL-001).\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro\n */\nimport { TELEFONE_COUNTRY_CODE } from '../core/telefone/constants.js';\n\n/** Digits only from input (no country/trunk normalization). */\nexport function extractTelefoneDigits(input: string): string {\n return input.replace(/\\D/g, '');\n}\n\n/**\n * National canonical form: DDD + local digits (10 or 11 digits).\n * Strips +55 country code and leading domestic trunk `0` when present.\n */\nexport function normalizeTelefoneDigits(input: string): string {\n let digits = extractTelefoneDigits(input);\n if (digits.length === 0) {\n return '';\n }\n\n if (digits.startsWith(TELEFONE_COUNTRY_CODE) && (digits.length === 12 || digits.length === 13)) {\n digits = digits.slice(TELEFONE_COUNTRY_CODE.length);\n }\n\n if (digits.startsWith('0') && (digits.length === 11 || digits.length === 12)) {\n digits = digits.slice(1);\n }\n\n return digits;\n}\n\n/** @see normalizeTelefoneDigits */\nexport function stripTelefone(input: string): string {\n return normalizeTelefoneDigits(input);\n}\n","/**\n * Brazilian telephone validation — Anatel DDD + fixo/celular structure.\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro\n * @see https://www.gov.br/anatel/pt-br/regulado/numeracao/nono-digito\n */\nimport { normalizeTelefoneDigits } from '../../strip/telefone.js';\nimport type { TelefoneTipo, TelefoneValidationResult } from '../../types/validation-result.js';\nimport { brandTelefone } from '../../types/validation-result.js';\nimport {\n ANATEL_DDD_SET,\n TELEFONE_DDD_LENGTH,\n TELEFONE_EMERGENCY_CODES,\n} from './constants.js';\n\nexport {\n ANATEL_DDDS,\n ANATEL_DDD_SET,\n TELEFONE_ANATEL_DDD_PANEL_URL,\n TELEFONE_GOLDEN_CELULAR,\n TELEFONE_GOLDEN_CELULAR_MASKED,\n TELEFONE_GOLDEN_FIXO,\n TELEFONE_GOLDEN_FIXO_MASKED,\n TELEFONE_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<TelefoneValidationResult, { ok: false }>;\n\nconst MASK_CHARS_PATTERN = /[\\s().+-]/g;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction hasInvalidCharacters(input: string): boolean {\n const withoutMask = input.replace(MASK_CHARS_PATTERN, '');\n return /[^0-9]/.test(withoutMask);\n}\n\nfunction detectTipo(local: string): TelefoneTipo | null {\n if (local.length === 9 && local[0] === '9') {\n return 'celular';\n }\n if (local.length === 8 && /^[2345]/.test(local)) {\n return 'fixo';\n }\n return null;\n}\n\nfunction rejectLocalPattern(local: string, nationalLength: number): FailedResult {\n if (nationalLength === 11) {\n return failure(\n 'KNOWN_INVALID_PATTERN',\n 'Mobile numbers must have 9 digits starting with 9 after DDD (Anatel nono dígito)',\n );\n }\n\n if (nationalLength === 10 && /^[6789]/.test(local)) {\n return failure(\n 'KNOWN_INVALID_PATTERN',\n 'Mobile numbers require 9 digits starting with 9; numbers starting with 6–9 without the 9th digit are invalid',\n );\n }\n\n return failure(\n 'KNOWN_INVALID_PATTERN',\n 'Landline numbers must have 8 digits starting with 2, 3, 4, or 5 after DDD',\n );\n}\n\nfunction validateStructure(\n input: string,\n normalized: string,\n): FailedResult | { tipo: TelefoneTipo } {\n if (input.trim().length === 0) {\n return failure('EMPTY_INPUT', 'Telephone input is empty');\n }\n\n if (hasInvalidCharacters(input)) {\n return failure('INVALID_CHARACTER', 'Telephone contains invalid characters');\n }\n\n if (normalized.length === 0) {\n return failure('EMPTY_INPUT', 'Telephone input is empty');\n }\n\n if (TELEFONE_EMERGENCY_CODES.has(normalized)) {\n return failure('UNSUPPORTED_FORMAT', 'Emergency short codes are not subscriber telephone numbers');\n }\n\n if (normalized.length !== 10 && normalized.length !== 11) {\n return failure(\n 'INVALID_LENGTH',\n 'Telephone must have 10 digits (fixo) or 11 digits (celular) after normalization',\n );\n }\n\n const ddd = normalized.slice(0, TELEFONE_DDD_LENGTH);\n if (!ANATEL_DDD_SET.has(ddd)) {\n return failure('KNOWN_INVALID_PATTERN', `Area code ${ddd} is not a valid Anatel DDD`);\n }\n\n const local = normalized.slice(TELEFONE_DDD_LENGTH);\n const tipo = detectTipo(local);\n if (!tipo) {\n return rejectLocalPattern(local, normalized.length);\n }\n\n return { tipo };\n}\n\nexport function isValidTelefone(input: string): boolean {\n return validateTelefone(input).ok;\n}\n\nexport function validateTelefone(input: string): TelefoneValidationResult {\n const normalized = normalizeTelefoneDigits(input);\n const structural = validateStructure(input, normalized);\n if ('ok' in structural) {\n return structural;\n }\n\n return {\n ok: true,\n value: brandTelefone(normalized),\n tipo: structural.tipo,\n format: 'telefone',\n };\n}\n","import {\n TELEFONE_CELULAR_MASK_PATTERN,\n TELEFONE_FIXO_MASK_PATTERN,\n} from './constants.js';\nimport type { TelefoneTipo } from '../../types/validation-result.js';\n\n/** Mask (DD) 9XXXX-XXXX or (DD) XXXX-XXXX per Anatel E.164 layout. */\nexport function applyTelefoneMask(canonical: string, tipo: TelefoneTipo): string {\n const pattern = tipo === 'celular' ? TELEFONE_CELULAR_MASK_PATTERN : TELEFONE_FIXO_MASK_PATTERN;\n const match = pattern.exec(canonical);\n if (!match) {\n throw new Error(`Telephone must have valid ${tipo} length to apply mask`);\n }\n return `(${match[1]}) ${match[2]}-${match[3]}`;\n}\n","import { applyTelefoneMask } from '../core/telefone/mask.js';\nimport { validateTelefone } from '../core/telefone/index.js';\nimport type { FormatResult } from '../types/validation-result.js';\n\nexport function formatTelefone(input: string): FormatResult {\n const result = validateTelefone(input);\n if (!result.ok) {\n return { ok: false, code: result.code, message: result.message };\n }\n return { ok: true, formatted: applyTelefoneMask(result.value, result.tipo) };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { stripCpf } from './chunk-UCJPSJN5.js';
2
2
  import { computeCheckDigit } from './chunk-B2TDI3YS.js';
3
- import { brandCpf } from './chunk-DKRM66US.js';
3
+ import { brandCpf } from './chunk-BBL6ZPXH.js';
4
4
 
5
5
  // src/core/cpf/constants.ts
6
6
  var CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2];
@@ -78,5 +78,5 @@ function applyCpfMask(canonical) {
78
78
  }
79
79
 
80
80
  export { CPF_GOLDEN_PRIMARY, CPF_GOLDEN_PRIMARY_MASKED, CPF_GOLDEN_SECONDARY, CPF_OFFICIAL_SOURCE_URL, applyCpfMask, isValidCpf, validateCpf };
81
- //# sourceMappingURL=chunk-PBNVKDCF.js.map
82
- //# sourceMappingURL=chunk-PBNVKDCF.js.map
81
+ //# sourceMappingURL=chunk-5BBNLRZP.js.map
82
+ //# sourceMappingURL=chunk-5BBNLRZP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/cpf/constants.ts","../src/core/cpf/index.ts","../src/core/cpf/mask.ts"],"names":[],"mappings":"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","file":"chunk-PBNVKDCF.js","sourcesContent":["/**\n * CPF constants — modulo 11 weights (RFB standard).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nexport const CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_DV2_WEIGHTS = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_LENGTH = 11;\nexport const CPF_BASE_LENGTH = 9;\nexport const CPF_NUMERIC_PATTERN = /^\\d{11}$/;\nexport const CPF_MASK_PATTERN = /^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/;\n\nexport const CPF_GOLDEN_PRIMARY = '12345678909';\nexport const CPF_GOLDEN_SECONDARY = '11144477735';\nexport const CPF_GOLDEN_PRIMARY_MASKED = '123.456.789-09';\nexport const CPF_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/receitafederal/pt-br/assuntos/cpf';\n","/**\n * CPF validation — modulo 11 (RFB standard weights).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nimport { stripCpf } from '../../strip/cpf.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCpf } from '../../types/validation-result.js';\nimport { computeCheckDigit } from '../cnpj/modulo11.js';\nimport {\n CPF_BASE_LENGTH,\n CPF_DV1_WEIGHTS,\n CPF_DV2_WEIGHTS,\n CPF_LENGTH,\n} from './constants.js';\n\nexport {\n CPF_GOLDEN_PRIMARY,\n CPF_GOLDEN_PRIMARY_MASKED,\n CPF_GOLDEN_SECONDARY,\n CPF_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 isValidCpfChecksum(stripped: string): boolean {\n const base = stripped.slice(0, CPF_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CPF_DV2_WEIGHTS, digitValue),\n );\n\n return stripped.slice(CPF_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CPF input is empty');\n }\n\n const withoutMask = input.replace(/[.-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CPF contains invalid characters');\n }\n\n if (stripped.length !== CPF_LENGTH) {\n return failure('INVALID_LENGTH', `CPF must have ${CPF_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'CPF with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidCpf(input: string): boolean {\n return validateCpf(input).ok;\n}\n\nexport function validateCpf(input: string): ValidationResult {\n const stripped = stripCpf(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidCpfChecksum(stripped)) {\n return { ok: true, value: brandCpf(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'CPF check digits are invalid');\n}\n","import { CPF_MASK_PATTERN } from './constants.js';\n\n/** Mask XXX.XXX.XXX-DD (BR-CPF-005). */\nexport function applyCpfMask(canonical: string): string {\n const match = CPF_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CPF must have exactly 11 digits to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/cpf/constants.ts","../src/core/cpf/index.ts","../src/core/cpf/mask.ts"],"names":[],"mappings":"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","file":"chunk-5BBNLRZP.js","sourcesContent":["/**\n * CPF constants — modulo 11 weights (RFB standard).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nexport const CPF_DV1_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_DV2_WEIGHTS = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2] as const;\nexport const CPF_LENGTH = 11;\nexport const CPF_BASE_LENGTH = 9;\nexport const CPF_NUMERIC_PATTERN = /^\\d{11}$/;\nexport const CPF_MASK_PATTERN = /^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/;\n\nexport const CPF_GOLDEN_PRIMARY = '12345678909';\nexport const CPF_GOLDEN_SECONDARY = '11144477735';\nexport const CPF_GOLDEN_PRIMARY_MASKED = '123.456.789-09';\nexport const CPF_OFFICIAL_SOURCE_URL =\n 'https://www.gov.br/receitafederal/pt-br/assuntos/cpf';\n","/**\n * CPF validation — modulo 11 (RFB standard weights).\n * @see https://www.gov.br/receitafederal/pt-br/assuntos/cpf\n * @see docs/use-cases/UC-001-validate-cpf.md — golden vector 12345678909\n */\nimport { stripCpf } from '../../strip/cpf.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCpf } from '../../types/validation-result.js';\nimport { computeCheckDigit } from '../cnpj/modulo11.js';\nimport {\n CPF_BASE_LENGTH,\n CPF_DV1_WEIGHTS,\n CPF_DV2_WEIGHTS,\n CPF_LENGTH,\n} from './constants.js';\n\nexport {\n CPF_GOLDEN_PRIMARY,\n CPF_GOLDEN_PRIMARY_MASKED,\n CPF_GOLDEN_SECONDARY,\n CPF_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 isValidCpfChecksum(stripped: string): boolean {\n const base = stripped.slice(0, CPF_BASE_LENGTH);\n const dv1Expected = String(computeCheckDigit(base, CPF_DV1_WEIGHTS, digitValue));\n const dv2Expected = String(\n computeCheckDigit(base + dv1Expected, CPF_DV2_WEIGHTS, digitValue),\n );\n\n return stripped.slice(CPF_BASE_LENGTH) === dv1Expected + dv2Expected;\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CPF input is empty');\n }\n\n const withoutMask = input.replace(/[.-]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CPF contains invalid characters');\n }\n\n if (stripped.length !== CPF_LENGTH) {\n return failure('INVALID_LENGTH', `CPF must have ${CPF_LENGTH} digits after normalization`);\n }\n\n if (hasRepeatedDigits(stripped)) {\n return failure('KNOWN_INVALID_PATTERN', 'CPF with all identical digits is invalid');\n }\n\n return null;\n}\n\nexport function isValidCpf(input: string): boolean {\n return validateCpf(input).ok;\n}\n\nexport function validateCpf(input: string): ValidationResult {\n const stripped = stripCpf(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n if (isValidCpfChecksum(stripped)) {\n return { ok: true, value: brandCpf(stripped), format: 'numeric' };\n }\n\n return failure('INVALID_CHECK_DIGIT', 'CPF check digits are invalid');\n}\n","import { CPF_MASK_PATTERN } from './constants.js';\n\n/** Mask XXX.XXX.XXX-DD (BR-CPF-005). */\nexport function applyCpfMask(canonical: string): string {\n const match = CPF_MASK_PATTERN.exec(canonical);\n if (!match) {\n throw new Error('CPF must have exactly 11 digits to apply mask');\n }\n return `${match[1]}.${match[2]}.${match[3]}-${match[4]}`;\n}\n"]}
@@ -29,7 +29,13 @@ function brandCartaoCredito(value) {
29
29
  function brandInscricaoEstadual(value) {
30
30
  return value;
31
31
  }
32
+ function brandTelefone(value) {
33
+ return value;
34
+ }
35
+ function brandBrCodePayload(value) {
36
+ return value;
37
+ }
32
38
 
33
- export { brandCartaoCredito, brandCep, brandCnpj, brandCodigoBarras, brandCpf, brandInscricaoEstadual, brandLinhaDigitavel, brandPisPasep, brandPixKey, brandPlaca };
34
- //# sourceMappingURL=chunk-DKRM66US.js.map
35
- //# sourceMappingURL=chunk-DKRM66US.js.map
39
+ export { brandBrCodePayload, brandCartaoCredito, brandCep, brandCnpj, brandCodigoBarras, brandCpf, brandInscricaoEstadual, brandLinhaDigitavel, brandPisPasep, brandPixKey, brandPlaca, brandTelefone };
40
+ //# sourceMappingURL=chunk-BBL6ZPXH.js.map
41
+ //# sourceMappingURL=chunk-BBL6ZPXH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/validation-result.ts"],"names":[],"mappings":";AAmGO,SAAS,UAAU,KAAA,EAAqB;AAC7C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAoB;AAC3C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAoB;AAC3C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAAsB;AAC/C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,KAAA,EAAyB;AACrD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,oBAAoB,KAAA,EAA+B;AACjE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAkB,KAAA,EAA6B;AAC7D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,mBAAmB,KAAA,EAA8B;AAC/D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,uBAAuB,KAAA,EAAkC;AACvE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,KAAA,EAAyB;AACrD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,mBAAmB,KAAA,EAA8B;AAC/D,EAAA,OAAO,KAAA;AACT","file":"chunk-BBL6ZPXH.js","sourcesContent":["export type DocumentFormat =\n | 'numeric'\n | 'alphanumeric'\n | 'legacy'\n | 'mercosul'\n | 'email'\n | 'phone'\n | 'evp'\n | 'linha-digitavel'\n | 'codigo-barras'\n | 'cartao-credito'\n | 'inscricao-estadual'\n | 'telefone'\n | 'brcode';\n\nexport type PixKeyType = 'cpf' | 'cnpj' | 'email' | 'phone' | 'evp';\n\nexport type TelefoneTipo = 'celular' | 'fixo';\n\nexport type BoletoInputKind = 'linha-digitavel' | 'codigo-barras';\n\nexport type ValidationErrorCode =\n | 'INVALID_LENGTH'\n | 'INVALID_CHARACTER'\n | 'INVALID_CHECK_DIGIT'\n | 'KNOWN_INVALID_PATTERN'\n | 'UNSUPPORTED_FORMAT'\n | 'EMPTY_INPUT';\n\nexport type ValidationResult<T extends string = string> =\n | { ok: true; value: T; format: DocumentFormat }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport type FormatResult =\n | { ok: true; formatted: string }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport type Cnpj = string & { readonly __brand: 'Cnpj' };\nexport type Cpf = string & { readonly __brand: 'Cpf' };\nexport type Cep = string & { readonly __brand: 'Cep' };\nexport type Placa = string & { readonly __brand: 'Placa' };\nexport type PisPasep = string & { readonly __brand: 'PisPasep' };\nexport type PixKey = string & { readonly __brand: 'PixKey' };\nexport type LinhaDigitavel = string & { readonly __brand: 'LinhaDigitavel' };\nexport type CodigoBarras = string & { readonly __brand: 'CodigoBarras' };\nexport type CartaoCredito = string & { readonly __brand: 'CartaoCredito' };\nexport type InscricaoEstadual = string & { readonly __brand: 'InscricaoEstadual' };\nexport type Telefone = string & { readonly __brand: 'Telefone' };\nexport type BrCodePayload = string & { readonly __brand: 'BrCodePayload' };\n\nexport type UfCode =\n | 'AC' | 'AL' | 'AM' | 'AP' | 'BA' | 'CE' | 'DF' | 'ES' | 'GO' | 'MA' | 'MG' | 'MS' | 'MT'\n | 'PA' | 'PB' | 'PE' | 'PI' | 'PR' | 'RJ' | 'RN' | 'RO' | 'RR' | 'RS' | 'SC' | 'SE' | 'SP' | 'TO';\n\nexport type CardBrand = 'visa' | 'mastercard' | 'amex' | 'elo' | 'hipercard' | 'unknown';\n\nexport type CartaoCreditoValidationResult =\n | { ok: true; value: CartaoCredito; format: 'cartao-credito'; brand: CardBrand }\n | { ok: false; code: ValidationErrorCode; message: string; brand?: CardBrand };\n\nexport type PixValidationResult =\n | { ok: true; value: PixKey; keyType: PixKeyType; format: DocumentFormat }\n | { ok: false; code: ValidationErrorCode; message: string; keyType?: PixKeyType };\n\nexport type BoletoSituacao = '1' | '2';\n\nexport type BoletoValidationResult =\n | {\n ok: true;\n value: LinhaDigitavel | CodigoBarras;\n inputKind: BoletoInputKind;\n format: DocumentFormat;\n situacao: BoletoSituacao;\n }\n | { ok: false; code: ValidationErrorCode; message: string; inputKind?: BoletoInputKind };\n\nexport type InscricaoEstadualValidationResult =\n | { ok: true; value: InscricaoEstadual; uf: UfCode; format: 'inscricao-estadual' }\n | { ok: false; code: ValidationErrorCode; message: string; uf?: UfCode };\n\nexport type TelefoneValidationResult =\n | { ok: true; value: Telefone; tipo: TelefoneTipo; format: 'telefone' }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport type BrCodeValidationResult =\n | {\n ok: true;\n value: BrCodePayload;\n format: 'brcode';\n merchantName: string;\n merchantCity: string;\n amount?: string;\n txid?: string;\n pixKey?: PixKey;\n pixKeyType?: PixKeyType;\n pixInitiationUrl?: string;\n }\n | { ok: false; code: ValidationErrorCode; message: string };\n\nexport function brandCnpj(value: string): Cnpj {\n return value as Cnpj;\n}\n\nexport function brandCpf(value: string): Cpf {\n return value as Cpf;\n}\n\nexport function brandCep(value: string): Cep {\n return value as Cep;\n}\n\nexport function brandPlaca(value: string): Placa {\n return value as Placa;\n}\n\nexport function brandPisPasep(value: string): PisPasep {\n return value as PisPasep;\n}\n\nexport function brandPixKey(value: string): PixKey {\n return value as PixKey;\n}\n\nexport function brandLinhaDigitavel(value: string): LinhaDigitavel {\n return value as LinhaDigitavel;\n}\n\nexport function brandCodigoBarras(value: string): CodigoBarras {\n return value as CodigoBarras;\n}\n\nexport function brandCartaoCredito(value: string): CartaoCredito {\n return value as CartaoCredito;\n}\n\nexport function brandInscricaoEstadual(value: string): InscricaoEstadual {\n return value as InscricaoEstadual;\n}\n\nexport function brandTelefone(value: string): Telefone {\n return value as Telefone;\n}\n\nexport function brandBrCodePayload(value: string): BrCodePayload {\n return value as BrCodePayload;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { brandCartaoCredito } from './chunk-DKRM66US.js';
1
+ import { brandCartaoCredito } from './chunk-BBL6ZPXH.js';
2
2
 
3
3
  // src/strip/cartao-credito.ts
4
4
  function stripCartaoCredito(input) {
@@ -203,5 +203,5 @@ function formatCartaoCredito(input) {
203
203
  }
204
204
 
205
205
  export { CARTAO_GOLDEN_AMEX, CARTAO_GOLDEN_LUHN_WALKTHROUGH, CARTAO_GOLDEN_MASTERCARD, CARTAO_GOLDEN_MIN_LENGTH, CARTAO_GOLDEN_VISA, CARTAO_GOLDEN_VISA_MASKED, CARTAO_IEC_SOURCE_URL, CARTAO_OFFICIAL_SOURCE_URL, CARTAO_PAN_MAX_LENGTH, CARTAO_PAN_MIN_LENGTH, computeLuhnSum, detectCardBrand, formatCartaoCredito, isValidCartaoCredito, isValidLuhn, passesLuhn, stripCartaoCredito, validateCartaoCredito };
206
- //# sourceMappingURL=chunk-54DTXC6V.js.map
207
- //# sourceMappingURL=chunk-54DTXC6V.js.map
206
+ //# sourceMappingURL=chunk-CR45BOLS.js.map
207
+ //# sourceMappingURL=chunk-CR45BOLS.js.map