validation-br 0.8.3 → 1.0.0-b

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 (109) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.js +76 -11
  3. package/.github/workflows/test.yml +39 -0
  4. package/.prettierignore +1 -0
  5. package/.prettierrc.js +7 -0
  6. package/dist/cnh.js +123 -0
  7. package/dist/cnh.js.map +1 -0
  8. package/dist/cnh.test.js +117 -0
  9. package/dist/cnh.test.js.map +1 -0
  10. package/dist/cnpj.js +112 -0
  11. package/dist/cnpj.js.map +1 -0
  12. package/dist/cnpj.test.js +141 -0
  13. package/dist/cnpj.test.js.map +1 -0
  14. package/dist/cpf.js +134 -0
  15. package/dist/cpf.js.map +1 -0
  16. package/dist/cpf.test.js +130 -0
  17. package/dist/cpf.test.js.map +1 -0
  18. package/dist/index.js +24 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/index.test.js +33 -0
  21. package/dist/index.test.js.map +1 -0
  22. package/dist/judicialProcess.js +153 -0
  23. package/dist/judicialProcess.js.map +1 -0
  24. package/dist/judicialProcess.test.js +123 -0
  25. package/dist/judicialProcess.test.js.map +1 -0
  26. package/dist/pisPasep.js +113 -0
  27. package/dist/pisPasep.js.map +1 -0
  28. package/dist/pisPasep.test.js +129 -0
  29. package/dist/pisPasep.test.js.map +1 -0
  30. package/dist/postalCode.js +150 -0
  31. package/dist/postalCode.js.map +1 -0
  32. package/dist/postalCode.test.js +135 -0
  33. package/dist/postalCode.test.js.map +1 -0
  34. package/dist/renavam.js +108 -0
  35. package/dist/renavam.js.map +1 -0
  36. package/dist/renavam.test.js +113 -0
  37. package/dist/renavam.test.js.map +1 -0
  38. package/dist/tituloEleitor.js +130 -0
  39. package/dist/tituloEleitor.js.map +1 -0
  40. package/dist/tituloEleitor.test.js +132 -0
  41. package/dist/tituloEleitor.test.js.map +1 -0
  42. package/dist/utils-applyMask.test.js +17 -0
  43. package/dist/utils-applyMask.test.js.map +1 -0
  44. package/dist/utils-clearValue.test.js +50 -0
  45. package/dist/utils-clearValue.test.js.map +1 -0
  46. package/dist/utils-fakeNumber.test.js +17 -0
  47. package/dist/utils-fakeNumber.test.js.map +1 -0
  48. package/dist/utils-insertAtPosition.test.js +16 -0
  49. package/dist/utils-insertAtPosition.test.js.map +1 -0
  50. package/dist/utils-invalidListGenerator.test.js +23 -0
  51. package/dist/utils-invalidListGenerator.test.js.map +1 -0
  52. package/dist/utils-removeFromPosition.test.js +16 -0
  53. package/dist/utils-removeFromPosition.test.js.map +1 -0
  54. package/dist/utils-sumElementsByMultipliers.test.js +32 -0
  55. package/dist/utils-sumElementsByMultipliers.test.js.map +1 -0
  56. package/dist/utils-sumToDV.test.js +16 -0
  57. package/dist/utils-sumToDV.test.js.map +1 -0
  58. package/dist/utils.js +167 -0
  59. package/dist/utils.js.map +1 -0
  60. package/jest.config.js +14 -0
  61. package/package.json +40 -48
  62. package/readme.md +243 -88
  63. package/src/cnh.test.ts +114 -0
  64. package/src/cnh.ts +140 -0
  65. package/src/cnpj.test.ts +136 -0
  66. package/{dist/documents/cnpj.js → src/cnpj.ts} +74 -21
  67. package/src/cpf.test.ts +125 -0
  68. package/src/cpf.ts +150 -0
  69. package/src/index.test.ts +35 -0
  70. package/src/index.ts +19 -0
  71. package/src/judicialProcess.test.ts +118 -0
  72. package/src/judicialProcess.ts +167 -0
  73. package/src/pisPasep.test.ts +124 -0
  74. package/src/pisPasep.ts +128 -0
  75. package/src/postalCode.test.ts +132 -0
  76. package/src/postalCode.ts +164 -0
  77. package/src/renavam.test.ts +110 -0
  78. package/src/renavam.ts +122 -0
  79. package/src/tituloEleitor.test.ts +129 -0
  80. package/src/tituloEleitor.ts +146 -0
  81. package/src/utils-applyMask.test.ts +17 -0
  82. package/src/utils-clearValue.test.ts +55 -0
  83. package/src/utils-fakeNumber.test.ts +19 -0
  84. package/src/utils-insertAtPosition.test.ts +15 -0
  85. package/src/utils-invalidListGenerator.test.ts +27 -0
  86. package/src/utils-removeFromPosition.test.ts +15 -0
  87. package/src/utils-sumElementsByMultipliers.test.ts +34 -0
  88. package/src/utils-sumToDV.test.ts +16 -0
  89. package/src/utils.ts +172 -0
  90. package/tsconfig.json +23 -0
  91. package/.babelrc +0 -15
  92. package/.prettierrc +0 -9
  93. package/dist/documents/cnh.js +0 -77
  94. package/dist/documents/cnh.js.map +0 -1
  95. package/dist/documents/cnpj.js.map +0 -1
  96. package/dist/documents/cpf.js +0 -83
  97. package/dist/documents/cpf.js.map +0 -1
  98. package/dist/documents/index.js +0 -23
  99. package/dist/documents/index.js.map +0 -1
  100. package/dist/documents/pis-pasep.js +0 -71
  101. package/dist/documents/pis-pasep.js.map +0 -1
  102. package/dist/documents/postal-code.js +0 -72
  103. package/dist/documents/postal-code.js.map +0 -1
  104. package/dist/documents/titulo-eleitor.js +0 -74
  105. package/dist/documents/titulo-eleitor.js.map +0 -1
  106. package/dist/lib/utils.js +0 -60
  107. package/dist/lib/utils.js.map +0 -1
  108. package/docs.md +0 -0
  109. package/index.js +0 -3
package/readme.md CHANGED
@@ -1,8 +1,12 @@
1
1
  # validation-br
2
2
 
3
- Biblioteca de validação de documentos pessoais do Brasil com suporte a CPF, CNPJ, Título Eleitoral, PIS/PASEP, CNH, e Objetos registrados de rastreamento dos Correios.
3
+ Biblioteca de validação de documentos pessoais do Brasil com suporte a CPF, CNPJ, Título Eleitoral, PIS/PASEP, CNH. Também valida numerações de outros tipos de registros como RENAVAM, Processos Judiciais e Objetos registrados de Rastreamento dos Correios.
4
4
 
5
- ## Instalação
5
+ Validation-BR também permite a criação de números fake das numerações acima para fins de teste de desenvolvimento, além de aplicação de máscaras e cálculo do dígito verificador.
6
+
7
+ Validation-BR também permite criação de números fake para facilitar o desenvolvimento e testes, além de aplicar máscaras e calcular somente os dígitos verificadores.
8
+
9
+ # Instalação
6
10
 
7
11
  ```sh
8
12
  # Usando yarn
@@ -14,174 +18,325 @@ npm install validation-br
14
18
 
15
19
  ```
16
20
 
17
- ## Importação
21
+ # Importação
18
22
 
19
- ```js
23
+ ## Importação direta
24
+
25
+ Permite realizar diretamente uma validação a partir do objeto principal
20
26
 
27
+ ```js
21
28
  // Modules
22
- const { isCPF, isCNPJ } = require('validation-br');
29
+ const { isCPF, isCNPJ } = require('validation-br')
23
30
 
24
31
  // ES6
25
- import { isCPF, isCNPJ } from ('validation-br');
32
+ import { isCPF, isCNPJ } from 'validation-br'
33
+ ```
34
+
35
+ ## Importação de submódulos
36
+
37
+ Importando os submódulos, é possível criar máscaras, números fake para testes de desenvolvimento e calcular dígitos verificadores.
38
+
39
+ ### Exemplos
40
+
41
+ ```js
42
+ // ES6
43
+ import { dv, fake, mask, validate } from 'validation-br/cpf'
44
+
45
+ // Modules
46
+ const cpf = require('validation-br/cpf')
47
+ const { dv, fake, mask, validate } = require('validation-br/cpf')
48
+
49
+ // Calculo do dígito verificador de um CPF. Os métodos aceitam inteiros e strings, inclusive com máscaras.
50
+ cpf.dv(906259666) // -> '51'
51
+ cpf.dv('906259666') // -> '51'
52
+ cpf.dv('906.259.666') // -> '51'
26
53
 
54
+ // Cria um número fake de CPF para fins de testes.
55
+ cpf.fake() // -> 90625966651
56
+ // Passe um parâmetro true para gerar o número com máscara
57
+ cpf.fake(true) // -> 906.259.666-51
27
58
 
59
+ // Aplique uma máscara a um cpf
60
+ cpf.mask(90625966651) // -> 906.259.666-51
61
+
62
+ // Valida um número
63
+ cpf.validate('01234567890') // -> true
64
+
65
+ // Valida um número e retorna exceção se a validação falhar
66
+ cpf.validateOrFail('01234567890') // -> true
28
67
  ```
29
68
 
30
69
  ## Tabela de Conteúdo
31
70
 
32
- - [isCPF](#isCPF) - Validação do CPF
33
- - [isCNPJ](#isCNPJ) - Validação do CNPJ
34
- - [isTitulo](#isTitulo) - Validação do Título de Eleitor
35
- - [isCNH](#isCNH) - Validação do CNH
36
- - [isPostalCode](#isPostalCode) - Validação de Objetos Registrados dos Correios
37
- - [isPIS](#isPIS) - Validação de PIS, PASEP, NIS e NIT
71
+ - [isCNH](#isCNH-value-) - Validação do CNH
72
+ - [isCPF](#isCPF-value-) - Validação do CPF
73
+ - [isCNPJ](#isCNPJ-value-) - Validação do CNPJ
74
+ - [isPostalCode](#isPostalCode-value-) - Validação de Objetos Registrados dos Correios
75
+ - [isJudicialProcess](#isJudicialProcess-value-) - Validação de Números de Processos Judiciais
76
+ - [isPIS](#isPIS-value-) - Validação de PIS, PASEP, NIS e NIT
77
+ - [isPostalCode](#isPostalCode-value-) - Validação de Objetos Registrados dos Correios
78
+ - [isRenavam](#isRenavam-value-) - Validação de RENAVAM
79
+ - [isTituloEleitor](#isTituloEleitor-value-) - Validação do Título de Eleitor
38
80
 
39
- ### isCPF
81
+ ### isCNH( `value` )
40
82
 
41
- Valida um CPF
83
+ Valida o documento da carteira nacional de habilitação.
42
84
 
43
85
  ```js
44
- // Importação
45
- import { isCPF } from ('validation-br');
86
+ // Importação somente da validação
87
+ import { isCNH } from 'validation-br'
88
+ // ou
89
+ // Importação do submódulo
90
+ import cnh from 'validation-br/cnh'
46
91
 
47
92
  // Valida
48
- isCPF('01234567890')
49
- //-> true
93
+ isCNH('69044271146') //-> true
94
+ isCNH('62472927637') //-> true
95
+ isCNH('46190476839') //-> false
96
+ cnh.validate('62472927637') //-> true
97
+ cnh.validateOrFail('62472927637') //-> true
50
98
 
51
- // Valida
52
- isCPF('012.345.678-90')
53
- //-> true
99
+ // Número fake com e sem máscara
100
+ cnh.fake() // -> 62472927637
101
+ cnh.fake(true) // -> 624729276-37
54
102
 
55
- // Valida
56
- isCPF('01234567891')
57
- //-> false
103
+ // Aplica uma máscara
104
+ cnh.mask('62472927637') // -> 624729276-37
105
+
106
+ // Calcula o DV
107
+ cnh.dv('624729276') // -> '37'
58
108
  ```
59
109
 
60
- ### isCNPJ
110
+ ### isCNPJ( `value` )
61
111
 
62
112
  Valida um CNPJ
63
113
 
64
114
  ```js
65
- // Importação
66
- import { isCNPJ } from ('validation-br');
115
+ // Importação somente da validação
116
+ import { isCNPJ } from 'validation-br'
117
+ // ou
118
+ // Importação do submódulo
119
+ import cnpj from 'validation-br/cnpj'
67
120
 
68
121
  // Valida
69
- isCNPJ('73.797.980/0001-79')
70
- //-> true
122
+ isCNPJ('73.797.980/0001-79') //-> true
123
+ isCNPJ('55585709000198') //-> true
124
+ isCNPJ('99362238000180') //-> false
125
+ cnpj.validate('99362238000180') //-> true
126
+ cnpj.validateOrFail('99362238000180') //-> true
71
127
 
72
- // Valida
73
- isCNPJ('55585709000198')
74
- //-> true
128
+ // Número fake com e sem máscara
129
+ cnpj.fake() // -> 55585709000198
130
+ cnpj.fake(true) // -> 55.585.709/0001-98
75
131
 
76
- // Valida
77
- isCNPJ('99362238000180')
78
- //-> false
132
+ // Aplica uma máscara
133
+ cnpj.mask('99362238000180') // -> 99.362.238/0001-80
134
+
135
+ // Calcula o DV
136
+ cnpj.dv('993622380001') // -> '80'
79
137
  ```
80
138
 
81
- ### isTitulo
139
+ ### isCPF( `value` )
82
140
 
83
- Valida um título eleitoral
141
+ Valida um CPF
84
142
 
85
143
  ```js
86
- // Importação
87
- import { isTitulo } from ('validation-br');
144
+ // Importação somente da validação
145
+ import { isCPF } from 'validation-br'
146
+ // ou
147
+ // Importação do submódulo
148
+ import cpf from 'validation-br/cpf'
88
149
 
89
150
  // Valida
90
- isTitulo('743650641660')
91
- //-> true
151
+ isCPF('01234567890') //-> true
152
+ isCPF('012.345.678-90') //-> true
153
+ isCPF('01234567891') //-> false
154
+ cpf.validate('01234567890') //-> true
155
+ cpf.validateOrFail('01234567890') //-> true
92
156
 
93
- // Valida
94
- isTitulo('525028881694')
95
- //-> true
157
+ // Número fake com e sem máscara
158
+ cpf.fake() // -> 01234567891
159
+ cpf.fake(true) // -> 012.345.678-91
96
160
 
97
- // Valida
98
- isTitulo('153016161686')
99
- //-> false
161
+ // Aplica uma máscara
162
+ cpf.mask('01234567890') // -> 012.345.678-90
163
+
164
+ // Calcula o DV
165
+ cpf.dv('012345678') // -> '90'
100
166
  ```
101
167
 
102
- ### isCNH
168
+ ### isJudicialProcess( `value` )
103
169
 
104
- Valida o documento da carteira nacional de habilitação.
170
+ Valida códigos PIS, PASEP, NIS e NIT, que usam o mesmo algoritmo. Aceita números com e sem pontos e traços.
105
171
 
106
172
  ```js
107
- // Importação
108
- import { isCNH } from ('validation-br');
173
+ // Importação somente da validação
174
+ import { isJudicialProcess } from 'validation-br'
175
+ // ou
176
+ // Importação do submódulo
177
+ import judicialProcess from 'validation-br/judicial-process'
109
178
 
110
179
  // Valida
111
- isCNH('69044271146')
112
- //-> true
180
+ isJudicialProcess('71282677380') //-> true
181
+ isJudicialProcess('237.95126.95-5') //-> true
182
+ isJudicialProcess('500.12973.80-1') //-> false
183
+ judicialProcess.validate('71282677380') //-> true
184
+ judicialProcess.validateOrFail('71282677380') //-> true
113
185
 
114
- // Valida
115
- isCNH('62472927637')
116
- //-> true
186
+ // Número fake com e sem máscara
187
+ judicialProcess.fake() // -> 71282677380
188
+ judicialProcess.fake(true) // -> 712.82677.38-0
189
+
190
+ // Aplica uma máscara
191
+ judicialProcess.mask('71282677380') // -> 712.82677.38-0
192
+
193
+ // Calcula o DV
194
+ judicialProcess.dv('7128267738') // -> '0'
195
+ ```
196
+
197
+ ### isPIS( `value` )
198
+
199
+ Valida códigos PIS, PASEP, NIS e NIT, que usam o mesmo algoritmo. Aceita números com e sem pontos e traços.
200
+
201
+ ```js
202
+ // Importação somente da validação
203
+ import { isPIS } from 'validation-br'
204
+ // ou
205
+ // Importação do submódulo
206
+ import pis from 'validation-br/pis'
117
207
 
118
208
  // Valida
119
- isCNH('46190476839')
120
- //-> false
209
+ isPIS('71282677380') //-> true
210
+ isPIS('237.95126.95-5') //-> true
211
+ isPIS('500.12973.80-1') //-> false
212
+ pis.validate('71282677380') //-> true
213
+ pis.validateOrFail('71282677380') //-> true
214
+
215
+ // Número fake com e sem máscara
216
+ pis.fake() // -> 71282677380
217
+ pis.fake(true) // -> 712.82677.38-0
218
+
219
+ // Aplica uma máscara
220
+ pis.mask('71282677380') // -> 712.82677.38-0
221
+
222
+ // Calcula o DV
223
+ pis.dv('7128267738') // -> '0'
121
224
  ```
122
225
 
123
- ### isPostalCode
226
+ ### isPostalCode( `value` )
124
227
 
125
- Valida um código de rastreamento de objetos postais no formato XX000000000YY, onde:
228
+ Valida um código de rastreamento de objetos postais no formato XX00000000DYY, onde:
126
229
 
127
230
  - XX: O código do objeto postal com 2 dígitos;
128
- - 000000000: Número sequencial do objeto com 9 dígitos;
231
+ - 00000000: Número sequencial do objeto com 8 dígitos;
232
+ - D: Dígito Verificador
129
233
  - YY: País de origem do objeto com 2 dígitos.
130
234
 
131
235
  ```js
132
- // Importação
133
- import { isPostalCode } from ('validation-br');
236
+ // Importação somente da validação
237
+ import { isPostalCode } from 'validation-br'
238
+ // ou
239
+ // Importação do submódulo
240
+ import postalCode from 'validation-br/postal-code'
134
241
 
135
242
  // Valida
136
- isPostalCode('PN718252423BR')
137
- //-> true
243
+ isPostalCode('PN718252423BR') //-> true
244
+ isPostalCode('RY728187035CN') //-> true
245
+ isPostalCode('JT194624698BR') //-> false
246
+ postalCode.validate('PN718252423BR') //-> true
247
+ postalCode.validateOrFail('PN718252423BR') //-> true
248
+
249
+ // Número fake com e sem máscara.
250
+ postalCode.fake() // -> PN718252423BR
251
+ postalCode.fake(true) // -> PN718252423BR
252
+
253
+ // Aplica uma máscara
254
+ // No caso de PostalCode, a máscara apenas coloca as letras em maiúsculas
255
+ postalCode.mask('pn718252423br') // -> PN718252423BR
256
+
257
+ // Calcula o DV
258
+ postalCode.dv('PN718252423BR') // -> '3'
259
+ ```
138
260
 
139
- // Valida
140
- isPostalCode('RY728187035CN')
141
- //-> true
261
+ ### isRenavam( `value` )
262
+
263
+ Valida o número de um RENAVAM de 11 dígitos
264
+
265
+ ```js
266
+ // Importação somente da validação
267
+ import { isRenavam } from 'validation-br'
268
+ // ou
269
+ // Importação do submódulo
270
+ import renavam from 'validation-br/renavam'
142
271
 
143
272
  // Valida
144
- isPostalCode('JT194624698BR')
145
- //-> false
273
+ isRenavam('14283256656') //-> true
274
+ isRenavam('95059845976') //-> true
275
+ isRenavam('67747331626') //-> false
276
+ renavam.validate('95059845976') //-> true
277
+ renavam.validateOrFail('95059845976') //-> true
278
+
279
+ // Número fake com e sem máscara
280
+ renavam.fake() // -> 95059845976
281
+ renavam.fake(true) // -> 9505984597-6
282
+
283
+ // Aplica uma máscara
284
+ renavam.mask('95059845976') // -> 9505984597-6
285
+
286
+ // Calcula o DV
287
+ renavam.dv('950598459') // -> '76'
146
288
  ```
147
289
 
148
- ### isPIS
290
+ ### isTituloEleitor( `value` )
149
291
 
150
- Valida códigos PIS, PASEP, NIS e NIT, que usam o mesmo algoritmo. Aceita números com e sem pontos e traços.
292
+ Valida um título eleitoral
151
293
 
152
294
  ```js
153
- // Importação
154
- import { isPIS } from ('validation-br');
295
+ // Importação somente da validação
296
+ import { isTituloEleitor } from 'validation-br'
297
+ // ou
298
+ // Importação do submódulo
299
+ import titulo from 'validation-br/titulo'
155
300
 
156
301
  // Valida
157
- isPIS('71282677380')
158
- //-> true
302
+ isTituloEleitor('743650641660') //-> true
303
+ isTituloEleitor('525028881694') //-> true
304
+ isTituloEleitor('153016161686') //-> false
305
+ titulo.validate('01234567890') //-> true
306
+ titulo.validateOrFail('01234567890') //-> true
159
307
 
160
- // Valida
161
- isPIS('237.95126.95-5')
162
- //-> true
308
+ // Número fake com e sem máscara
309
+ titulo.fake() // -> 153016161686
310
+ titulo.fake(true) // -> 1530.1616.1686
163
311
 
164
- // Valida
165
- isPIS('500.12973.80-1')
166
- //-> false
167
- ```
312
+ // Aplica uma máscara
313
+ titulo.mask('525028881694') // -> 5250.2888.1694
168
314
 
169
- ## Tests
170
- ![image](https://user-images.githubusercontent.com/100168/133695302-17744b22-2bf0-41e8-8907-58ea4770be3c.png)
315
+ // Calcula o DV
316
+ titulo.dv('5250288816') // -> '94'
317
+ ```
171
318
 
319
+ # Tests
172
320
 
321
+ ![image](https://user-images.githubusercontent.com/100168/148705528-7c810b3c-851a-49c4-bc08-f9631498d526.png)
173
322
 
174
- ## Changelog
323
+ # Changelog
175
324
 
325
+ - **09/01/2022**:
326
+ - 1.0.0 - Biblioteca convertida para Typescript e testes convertidos para Jest
327
+ - **08/01/2022**:
328
+ - 0.21.1 - Adicionadas as funções isRenavam e isJudicialProcess
176
329
  - **16/09/2021**:
177
- - 0.5.0 - Adicionadas as funções isCPF, isCNPJ e isTitulo
330
+ - 0.5.0 - Adicionadas as funções isCPF, isCNPJ e isTituloEleitor
178
331
  - 0.7.0 - Adicionadas as funções isPostalCode e isCNH
179
332
  - 0.8.0 - Adicionada a função isPIS
180
333
 
181
- ## Referências
334
+ # Referências
182
335
 
183
336
  - [Cálculo do DV do CPF](http://clubes.obmep.org.br/blog/a-matematica-nos-documentos-cpf/)
184
337
  - [Cálculo do DV do CNPJ](http://www.macoratti.net/alg_cnpj.htm)
185
338
  - [Cálculo do DV do Título Eleitoral](http://clubes.obmep.org.br/blog/a-matematica-nos-documentos-titulo-de-eleitor/)
186
339
  - [Cálculo do PIS](http://www.macoratti.net/alg_pis.htm)
187
340
  - [Diferença entre PIS, PASEP, NIS e NIT](https://www.jornalcontabil.com.br/entenda-de-uma-vez-a-diferenca-entre-pis-pasep-nit-e-nis/#:~:text=NIS%20%E2%80%93%20N%C3%BAmero%20de%20Identifica%C3%A7%C3%A3o%20Social,do%20Patrim%C3%B4nio%20do%20Servidor%20P%C3%BAblico)
341
+ - [Documentação Oficial de Numeração de Processos Judiciais](https://juslaboris.tst.jus.br/bitstream/handle/20.500.12178/30318/2008_res0065_cnj_rep01.pdf?sequence=2)
342
+ - [Cálculos de DV](http://ghiorzi.org/DVnew.htm)
@@ -0,0 +1,114 @@
1
+ // import { isCNH } from './cnh'
2
+ import isCNH, { dv, fake, mask, validate, validateOrFail } from './cnh'
3
+
4
+ describe('CNH', () => {
5
+ test('isCNH() - Números válidos', () => {
6
+ const list = [
7
+ // como inteiro
8
+ 50195131143,
9
+ 58316794534,
10
+ 50195471165,
11
+ // como string
12
+ '69044271146',
13
+ '46190906839',
14
+ // com máscara
15
+ '624729276-37',
16
+ ]
17
+
18
+ list.forEach((cnh) => {
19
+ // t.true(isCNH(cnh), `CNH ${cnh} deve ser válida`)
20
+ expect(isCNH(cnh)).toBeTruthy()
21
+ })
22
+
23
+ // t.end()
24
+ })
25
+
26
+ test('validate() - Números válidos', () => {
27
+ const list = [
28
+ // como inteiro
29
+ 50195131143,
30
+ 58316794534,
31
+ // como string
32
+ '69044271146',
33
+ '46190906839',
34
+ // com máscara
35
+ '624729276-37',
36
+ ]
37
+
38
+ list.forEach((cnh) => {
39
+ // t.true(isCNH(cnh), `CNH ${cnh} deve ser válida`)
40
+ expect(validate(cnh)).toBeTruthy()
41
+ })
42
+ })
43
+
44
+ test('validate() - Números inválidos', () => {
45
+ const list = ['50195471143', '58316474534', '69044471146', '33333333333', '88888888888']
46
+
47
+ list.forEach((cnh) => {
48
+ expect(validate(cnh)).toBeFalsy()
49
+ })
50
+ })
51
+
52
+ test('validateOrFail() - Números inválidos', () => {
53
+ const list = ['50195471143', '58316474534', '69044471146', '33333333333', '88888888888']
54
+
55
+ list.forEach((cnh) => {
56
+ expect(() => validateOrFail(cnh)).toThrow()
57
+ })
58
+ })
59
+
60
+ test('Parâmetro não informado', () => {
61
+ expect(isCNH('')).toBeFalsy()
62
+ expect(validate('')).toBeFalsy()
63
+ expect(() => validateOrFail('')).toThrow()
64
+ expect(() => dv('')).toThrow()
65
+ })
66
+
67
+ test('fake() - Gera fakes sem máscara', () => {
68
+ for (let i = 0; i < 5; i += 1) {
69
+ const cnh = fake()
70
+ expect(validate(cnh)).toBeTruthy()
71
+ expect(cnh).toHaveLength(11)
72
+ }
73
+ })
74
+
75
+ test('fake() - Gera fakes com máscara', () => {
76
+ for (let i = 0; i < 5; i += 1) {
77
+ const cnh = fake(true)
78
+ expect(validate(cnh)).toBeTruthy()
79
+ expect(cnh).toHaveLength(12)
80
+ }
81
+
82
+ // t.end()
83
+ })
84
+
85
+ test('dv() - Verificando se o DV gerado está correto', () => {
86
+ const list = [
87
+ { num: '501954711', expected: '65' },
88
+ { num: 583164745, expected: '75' },
89
+ { num: 690444711, expected: '17' },
90
+ ]
91
+
92
+ list.forEach((item) => {
93
+ const calcDv = dv(item.num)
94
+
95
+ expect(calcDv).toBe(item.expected)
96
+ expect(typeof calcDv).toBe('string')
97
+ })
98
+ })
99
+
100
+ test('mask() - Testando se a máscara foi gerada corretamente', () => {
101
+ const list = [
102
+ { value: 50195471143, expected: '501954711-43' },
103
+ { value: 58316474534, expected: '583164745-34' },
104
+ { value: 69044471146, expected: '690444711-46' },
105
+ ]
106
+
107
+ list.forEach((item) => {
108
+ const masked = mask(item.value)
109
+
110
+ expect(masked).toBe(item.expected)
111
+ expect(masked).toHaveLength(12)
112
+ })
113
+ })
114
+ })
package/src/cnh.ts ADDED
@@ -0,0 +1,140 @@
1
+ /**
2
+ * isCNH()
3
+ * Calcula se uma CNH é válida
4
+ *
5
+ * @doc
6
+ * CNH deve possuir 11 caracteres
7
+ *
8
+ * - Os caracteres 1 a 9 são números sequenciais.
9
+ *
10
+ *
11
+ * - Os caracteres 10 e 11 são dígitos verificadores.
12
+ *
13
+ * 1) Partes do número
14
+ * ____________________________ ______
15
+ * | Número | D V |
16
+ * | 5 8 3 1 6 7 9 4 5 3 4 |
17
+ * |____________________________|_____|
18
+ *
19
+ * 2) Cálculo do primeiro DV.
20
+ *
21
+ * - Soma-se o produto das algarismos 1 a 9 pelos números 2, 3, 4, 5, 6, 7, 8, 9, 10.
22
+ *
23
+ * 5 8 3 1 6 7 9 4 5
24
+ * x x x x x x x x x
25
+ * 2 3 4 5 6 7 8 9 10
26
+ * = 10 +24 +12 +5 +36 +49 +72 +36 +50 = 294
27
+ *
28
+ * - O somatório encontrado é dividido por 11. O DV1 é 11 subtraído do resto da divisão. Se o
29
+ * resto for 10, o DV1 é 0.
30
+ *
31
+ * 2.1) 294 / 11 tem resto igual a 8. 11-7 = 3
32
+ * DV1 = 3
33
+ *
34
+ * 3) Cálculo do segundo DV
35
+ *
36
+ * - Soma-se o produto das algarismos 1 a 9 juntamente com o 10 caractere
37
+ * que é o DV1, pelos números 3, 4, 5, 6, 7, 8, 9, 10, 11, 2. O DV1 será
38
+ * multiplicado por 2 e ficará no final.
39
+ *
40
+ * 5 8 3 1 6 7 9 4 5 3
41
+ * x x x x x x x x x x
42
+ * 3 4 5 6 7 8 9 10 11 2
43
+ * = 10 +24 +12 +5 +36 +49 +72 +36 +50 +6 = 348
44
+ *
45
+ * 3.1) 348 / 11 tem resto igual a 7. 11 - 7 = 4.
46
+ * DV2 = 4
47
+ *
48
+ * - O somatório encontrado é dividido por 11. O DV2 é 11 subtraído do resto da divisão. Se o
49
+ * resto for 10, o DV2 é 0.
50
+ *
51
+ * Fonte: https://www.devmedia.com.br/forum/validacao-de-cnh/372972
52
+ *
53
+ * @param {String} value Título eleitoral
54
+ * @returns {Boolean}
55
+ */
56
+
57
+ import {
58
+ sumElementsByMultipliers,
59
+ sumToDV,
60
+ invalidListGenerator,
61
+ clearValue,
62
+ applyMask,
63
+ fakeNumber,
64
+ } from './utils'
65
+
66
+ /**
67
+ * Calcula o Dígito Verificador de um RENAVAM informado
68
+ *
69
+ * @returns String Número fake de um cnh válido
70
+ */
71
+ export const dv = (value: string | number): string => {
72
+ if (!value) throw new Error('CNH não informado')
73
+
74
+ const cnh = clearValue(value, 9)
75
+
76
+ const invalidList = invalidListGenerator(9)
77
+ if (invalidList.includes(cnh)) {
78
+ throw new Error('CNH não pode ser uma sequência de números iguais')
79
+ }
80
+
81
+ const sum1 = sumElementsByMultipliers(cnh.substring(0, 9), [2, 3, 4, 5, 6, 7, 8, 9, 10])
82
+ const dv1 = sumToDV(sum1)
83
+
84
+ const sum2 = sumElementsByMultipliers(cnh.substring(0, 9) + dv1, [3, 4, 5, 6, 7, 8, 9, 10, 11, 2])
85
+ const dv2 = sumToDV(sum2)
86
+
87
+ return `${dv1}${dv2}`
88
+ }
89
+
90
+ /**
91
+ * Valida um número de cnh e retorna uma exceção caso seja inválido
92
+ *
93
+ * @returns String Número fake de um cnh válido
94
+ */
95
+ export const validateOrFail = (value: string | number): boolean => {
96
+ const cnh = clearValue(value, 11)
97
+
98
+ if (dv(cnh) !== cnh.substring(9, 11)) {
99
+ throw new Error('Dígito verificador inválido')
100
+ }
101
+
102
+ return true
103
+ }
104
+
105
+ /**
106
+ * Valida um número de cnh
107
+ *
108
+ * @returns String Valor a ser validado
109
+ */
110
+ export const validate = (value: string | number): boolean => {
111
+ try {
112
+ return validateOrFail(value)
113
+ } catch (error) {
114
+ return false
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Aplica uma máscara a uma string
120
+ *
121
+ * @returns String string com a máscara aplicada
122
+ */
123
+ export const mask = (value: string | number): string => applyMask(value, '000000000-00')
124
+
125
+ /**
126
+ * Cria um número fake
127
+ *
128
+ * @returns String Número fake porém válido
129
+ */
130
+ export const fake = (withMask: boolean = false): string => {
131
+ const value = fakeNumber(9, true)
132
+
133
+ const cnh = `${value}${dv(value)}`
134
+
135
+ if (withMask) return mask(cnh)
136
+
137
+ return cnh
138
+ }
139
+
140
+ export default validate