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.
- package/.eslintignore +2 -0
- package/.eslintrc.js +76 -11
- package/.github/workflows/test.yml +39 -0
- package/.prettierignore +1 -0
- package/.prettierrc.js +7 -0
- package/dist/cnh.js +123 -0
- package/dist/cnh.js.map +1 -0
- package/dist/cnh.test.js +117 -0
- package/dist/cnh.test.js.map +1 -0
- package/dist/cnpj.js +112 -0
- package/dist/cnpj.js.map +1 -0
- package/dist/cnpj.test.js +141 -0
- package/dist/cnpj.test.js.map +1 -0
- package/dist/cpf.js +134 -0
- package/dist/cpf.js.map +1 -0
- package/dist/cpf.test.js +130 -0
- package/dist/cpf.test.js.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.js +33 -0
- package/dist/index.test.js.map +1 -0
- package/dist/judicialProcess.js +153 -0
- package/dist/judicialProcess.js.map +1 -0
- package/dist/judicialProcess.test.js +123 -0
- package/dist/judicialProcess.test.js.map +1 -0
- package/dist/pisPasep.js +113 -0
- package/dist/pisPasep.js.map +1 -0
- package/dist/pisPasep.test.js +129 -0
- package/dist/pisPasep.test.js.map +1 -0
- package/dist/postalCode.js +150 -0
- package/dist/postalCode.js.map +1 -0
- package/dist/postalCode.test.js +135 -0
- package/dist/postalCode.test.js.map +1 -0
- package/dist/renavam.js +108 -0
- package/dist/renavam.js.map +1 -0
- package/dist/renavam.test.js +113 -0
- package/dist/renavam.test.js.map +1 -0
- package/dist/tituloEleitor.js +130 -0
- package/dist/tituloEleitor.js.map +1 -0
- package/dist/tituloEleitor.test.js +132 -0
- package/dist/tituloEleitor.test.js.map +1 -0
- package/dist/utils-applyMask.test.js +17 -0
- package/dist/utils-applyMask.test.js.map +1 -0
- package/dist/utils-clearValue.test.js +50 -0
- package/dist/utils-clearValue.test.js.map +1 -0
- package/dist/utils-fakeNumber.test.js +17 -0
- package/dist/utils-fakeNumber.test.js.map +1 -0
- package/dist/utils-insertAtPosition.test.js +16 -0
- package/dist/utils-insertAtPosition.test.js.map +1 -0
- package/dist/utils-invalidListGenerator.test.js +23 -0
- package/dist/utils-invalidListGenerator.test.js.map +1 -0
- package/dist/utils-removeFromPosition.test.js +16 -0
- package/dist/utils-removeFromPosition.test.js.map +1 -0
- package/dist/utils-sumElementsByMultipliers.test.js +32 -0
- package/dist/utils-sumElementsByMultipliers.test.js.map +1 -0
- package/dist/utils-sumToDV.test.js +16 -0
- package/dist/utils-sumToDV.test.js.map +1 -0
- package/dist/utils.js +167 -0
- package/dist/utils.js.map +1 -0
- package/jest.config.js +14 -0
- package/package.json +40 -48
- package/readme.md +243 -88
- package/src/cnh.test.ts +114 -0
- package/src/cnh.ts +140 -0
- package/src/cnpj.test.ts +136 -0
- package/{dist/documents/cnpj.js → src/cnpj.ts} +74 -21
- package/src/cpf.test.ts +125 -0
- package/src/cpf.ts +150 -0
- package/src/index.test.ts +35 -0
- package/src/index.ts +19 -0
- package/src/judicialProcess.test.ts +118 -0
- package/src/judicialProcess.ts +167 -0
- package/src/pisPasep.test.ts +124 -0
- package/src/pisPasep.ts +128 -0
- package/src/postalCode.test.ts +132 -0
- package/src/postalCode.ts +164 -0
- package/src/renavam.test.ts +110 -0
- package/src/renavam.ts +122 -0
- package/src/tituloEleitor.test.ts +129 -0
- package/src/tituloEleitor.ts +146 -0
- package/src/utils-applyMask.test.ts +17 -0
- package/src/utils-clearValue.test.ts +55 -0
- package/src/utils-fakeNumber.test.ts +19 -0
- package/src/utils-insertAtPosition.test.ts +15 -0
- package/src/utils-invalidListGenerator.test.ts +27 -0
- package/src/utils-removeFromPosition.test.ts +15 -0
- package/src/utils-sumElementsByMultipliers.test.ts +34 -0
- package/src/utils-sumToDV.test.ts +16 -0
- package/src/utils.ts +172 -0
- package/tsconfig.json +23 -0
- package/.babelrc +0 -15
- package/.prettierrc +0 -9
- package/dist/documents/cnh.js +0 -77
- package/dist/documents/cnh.js.map +0 -1
- package/dist/documents/cnpj.js.map +0 -1
- package/dist/documents/cpf.js +0 -83
- package/dist/documents/cpf.js.map +0 -1
- package/dist/documents/index.js +0 -23
- package/dist/documents/index.js.map +0 -1
- package/dist/documents/pis-pasep.js +0 -71
- package/dist/documents/pis-pasep.js.map +0 -1
- package/dist/documents/postal-code.js +0 -72
- package/dist/documents/postal-code.js.map +0 -1
- package/dist/documents/titulo-eleitor.js +0 -74
- package/dist/documents/titulo-eleitor.js.map +0 -1
- package/dist/lib/utils.js +0 -60
- package/dist/lib/utils.js.map +0 -1
- package/docs.md +0 -0
- 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
|
|
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
|
-
|
|
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
|
-
|
|
21
|
+
# Importação
|
|
18
22
|
|
|
19
|
-
|
|
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
|
|
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
|
-
- [
|
|
33
|
-
- [
|
|
34
|
-
- [
|
|
35
|
-
- [
|
|
36
|
-
- [
|
|
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
|
-
###
|
|
81
|
+
### isCNH( `value` )
|
|
40
82
|
|
|
41
|
-
Valida
|
|
83
|
+
Valida o documento da carteira nacional de habilitação.
|
|
42
84
|
|
|
43
85
|
```js
|
|
44
|
-
// Importação
|
|
45
|
-
import {
|
|
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
|
-
|
|
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
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
99
|
+
// Número fake com e sem máscara
|
|
100
|
+
cnh.fake() // -> 62472927637
|
|
101
|
+
cnh.fake(true) // -> 624729276-37
|
|
54
102
|
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
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
|
|
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
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
//
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
###
|
|
139
|
+
### isCPF( `value` )
|
|
82
140
|
|
|
83
|
-
Valida um
|
|
141
|
+
Valida um CPF
|
|
84
142
|
|
|
85
143
|
```js
|
|
86
|
-
// Importação
|
|
87
|
-
import {
|
|
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
|
-
|
|
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
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
157
|
+
// Número fake com e sem máscara
|
|
158
|
+
cpf.fake() // -> 01234567891
|
|
159
|
+
cpf.fake(true) // -> 012.345.678-91
|
|
96
160
|
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
###
|
|
168
|
+
### isJudicialProcess( `value` )
|
|
103
169
|
|
|
104
|
-
Valida 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 {
|
|
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
|
-
|
|
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
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
120
|
-
//->
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
145
|
-
//->
|
|
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
|
-
###
|
|
290
|
+
### isTituloEleitor( `value` )
|
|
149
291
|
|
|
150
|
-
Valida
|
|
292
|
+
Valida um título eleitoral
|
|
151
293
|
|
|
152
294
|
```js
|
|
153
|
-
// Importação
|
|
154
|
-
import {
|
|
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
|
-
|
|
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
|
-
//
|
|
161
|
-
|
|
162
|
-
|
|
308
|
+
// Número fake com e sem máscara
|
|
309
|
+
titulo.fake() // -> 153016161686
|
|
310
|
+
titulo.fake(true) // -> 1530.1616.1686
|
|
163
311
|
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
//-> false
|
|
167
|
-
```
|
|
312
|
+
// Aplica uma máscara
|
|
313
|
+
titulo.mask('525028881694') // -> 5250.2888.1694
|
|
168
314
|
|
|
169
|
-
|
|
170
|
-
|
|
315
|
+
// Calcula o DV
|
|
316
|
+
titulo.dv('5250288816') // -> '94'
|
|
317
|
+
```
|
|
171
318
|
|
|
319
|
+
# Tests
|
|
172
320
|
|
|
321
|
+

|
|
173
322
|
|
|
174
|
-
|
|
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
|
|
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
|
-
|
|
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)
|
package/src/cnh.test.ts
ADDED
|
@@ -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
|