@artrsousa/cpf-cnpj-validator 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,204 @@
1
+ # cpf-cnpj-validator
2
+
3
+ Biblioteca leve e tipada para **validação, geração e formatação** de **CPF** e **CNPJ** válidos (Brasil), utilizando o algoritmo oficial de dígitos verificadores da Receita Federal.
4
+
5
+ ## Características
6
+
7
+ * Validação de CPF numérico
8
+ * Validação de CNPJ numérico
9
+ * Suporte a CNPJ alfanumérico (formato futuro da Receita Federal)
10
+ * Escrita em TypeScript
11
+ * ESM-only (Node.js 18+)
12
+ * Sem dependências externas
13
+
14
+ ---
15
+
16
+ ## Instalação
17
+
18
+ ```bash
19
+ npm install cpf-cnpj-validator
20
+ ```
21
+
22
+ ---
23
+
24
+ ## Uso
25
+
26
+ A biblioteca é ESM-only (`"type": "module"`).
27
+ Utilize `import` em Node.js 18+ ou bundlers modernos (Vite, Webpack, etc).
28
+
29
+ ---
30
+
31
+ ## Uso com JavaScript (ES Modules)
32
+
33
+ ```javascript
34
+ import { cpf, cnpj } from 'cpf-cnpj-validator';
35
+
36
+ // CPF
37
+ cpf.isValid('313.402.809-30');
38
+ cpf.isValid('31340280930');
39
+
40
+ cpf.generate();
41
+ cpf.generate({ formatted: false });
42
+
43
+ cpf.format('31340280930');
44
+
45
+ // CNPJ numérico
46
+ cnpj.isValid('11.222.333/0001-81');
47
+ cnpj.isValid('11222333000181');
48
+
49
+ cnpj.generate();
50
+ cnpj.generate({ formatted: false });
51
+
52
+ cnpj.format('11222333000181');
53
+
54
+ // CNPJ alfanumérico
55
+ cnpj.generate({ type: 'alphanumeric' });
56
+ cnpj.generate({ type: 'alphanumeric', formatted: false });
57
+ ```
58
+
59
+ ---
60
+
61
+ ## Uso com TypeScript
62
+
63
+ A biblioteca inclui definições de tipos (`.d.ts`).
64
+
65
+ ```typescript
66
+ import {
67
+ cpf,
68
+ cnpj,
69
+ type CPF,
70
+ type CNPJ,
71
+ type CpfGenerateOptions,
72
+ type CnpjGenerateOptions
73
+ } from 'cpf-cnpj-validator';
74
+
75
+ const cpfValue: string = '313.402.809-30';
76
+
77
+ if (cpf.isValid(cpfValue)) {
78
+ const formatted: string | null = cpf.format(cpfValue);
79
+ console.log(formatted);
80
+ }
81
+
82
+ const options: CnpjGenerateOptions = {
83
+ type: 'alphanumeric',
84
+ formatted: true,
85
+ };
86
+
87
+ const novoCnpj: string = cnpj.generate(options);
88
+ ```
89
+
90
+ ---
91
+
92
+ ## Tipos Exportados
93
+
94
+ | Tipo | Descrição |
95
+ | --------------------- | ----------------------------- |
96
+ | `CPF` | Interface da API de CPF |
97
+ | `CNPJ` | Interface da API de CNPJ |
98
+ | `CpfGenerateOptions` | Opções para `cpf.generate()` |
99
+ | `CnpjGenerateOptions` | Opções para `cnpj.generate()` |
100
+
101
+ ---
102
+
103
+ # API
104
+
105
+ ## CPF
106
+
107
+ ### `cpf.isValid(value: string): boolean`
108
+
109
+ Valida um CPF.
110
+
111
+ * Aceita com ou sem formatação
112
+ * Rejeita sequências repetidas (ex: `111.111.111-11`)
113
+ * Valida os dígitos verificadores
114
+
115
+ ---
116
+
117
+ ### `cpf.generate(options?: CpfGenerateOptions): string`
118
+
119
+ Gera um CPF válido aleatoriamente.
120
+
121
+ | Opção | Tipo | Padrão |
122
+ | ----------- | --------- | ------ |
123
+ | `formatted` | `boolean` | `true` |
124
+
125
+ Exemplo:
126
+
127
+ ```typescript
128
+ cpf.generate();
129
+ cpf.generate({ formatted: false });
130
+ ```
131
+
132
+ ---
133
+
134
+ ### `cpf.format(value: string): string | null`
135
+
136
+ Formata para o padrão:
137
+
138
+ ```
139
+ 000.000.000-00
140
+ ```
141
+
142
+ Retorna `null` caso não possua 11 dígitos válidos.
143
+
144
+ ---
145
+
146
+ ## CNPJ
147
+
148
+ ### `cnpj.isValid(value: string): boolean`
149
+
150
+ Valida CNPJ numérico.
151
+
152
+ * Aceita com ou sem formatação
153
+ * Rejeita sequências repetidas
154
+ * Valida os dígitos verificadores
155
+
156
+ ---
157
+
158
+ ### `cnpj.generate(options?: CnpjGenerateOptions): string`
159
+
160
+ Gera um CNPJ válido.
161
+
162
+ | Opção | Tipo | Padrão |
163
+ | ----------- | ----------------------------- | ----------- |
164
+ | `type` | `'numeric' \| 'alphanumeric'` | `'numeric'` |
165
+ | `formatted` | `boolean` | `true` |
166
+
167
+ Exemplo:
168
+
169
+ ```typescript
170
+ cnpj.generate();
171
+
172
+ cnpj.generate({
173
+ type: 'alphanumeric',
174
+ formatted: false
175
+ });
176
+ ```
177
+
178
+ ---
179
+
180
+ ### `cnpj.format(value: string): string | null`
181
+
182
+ Formata para o padrão:
183
+
184
+ ```
185
+ 00.000.000/0000-00
186
+ ```
187
+
188
+ * Funciona para CNPJ numérico
189
+ * Funciona para CNPJ alfanumérico
190
+ * Retorna `null` se não possuir 14 caracteres
191
+
192
+ ---
193
+
194
+ ## Requisitos
195
+
196
+ * Node.js 18+
197
+ * Ambiente com suporte a ES Modules
198
+
199
+ ---
200
+
201
+ ## Licença
202
+
203
+ MIT
204
+
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Converte uma letra em seu valor numérico conforme tabela da Receita Federal (A=17 até Z=42).
3
+ *
4
+ * Usado no cálculo dos dígitos verificadores do CNPJ alfanumérico.
5
+ *
6
+ * @param letter - Uma letra maiúscula (A–Z)
7
+ * @returns Valor numérico de 17 (A) a 42 (Z), ou 0 se inválido
8
+ *
9
+ * @example
10
+ * convertLetterToNumber('A') // 17
11
+ * convertLetterToNumber('Z') // 42
12
+ */
13
+ export declare function convertLetterToNumber(letter: string): number;
14
+ /**
15
+ * Converte um CNPJ alfanumérico em array de números para cálculo dos dígitos verificadores.
16
+ *
17
+ * Letras A–Z são mapeadas para 17–42 conforme tabela da Receita Federal;
18
+ * dígitos 0–9 permanecem como números.
19
+ *
20
+ * @param value - CNPJ alfanumérico (ex.: "AB123CDE000142")
21
+ * @returns Array de números onde letras foram convertidas (17–42) e dígitos mantidos
22
+ *
23
+ * @example
24
+ * convertCnpjToNumbers("AB12") // [17, 18, 1, 2]
25
+ */
26
+ export declare function convertCnpjToNumbers(value: string): number[];
27
+ /**
28
+ * Gera a base alfanumérica do CNPJ (12 caracteres aleatórios: dígitos 0–9 ou letras A–Z).
29
+ *
30
+ * Cada posição tem 50% de chance de ser dígito e 50% de ser letra.
31
+ *
32
+ * @returns Array com 12 caracteres (números ou letras) que será usada para calcular os dígitos verificadores
33
+ */
34
+ export declare function generateBaseAlphanumeric(): (number | string)[];
35
+ /**
36
+ * Calcula os dois dígitos verificadores do CNPJ alfanumérico.
37
+ *
38
+ * O primeiro dígito é calculado sobre a base de 12 caracteres; o segundo,
39
+ * sobre a base mais o primeiro dígito.
40
+ *
41
+ * @param baseCNPJ - Array com os 12 caracteres da base (números ou letras)
42
+ * @returns Tupla [primeiro_dígito, segundo_dígito]
43
+ */
44
+ export declare function calculateCheckDigits(baseCNPJ: (number | string)[]): [number, number];
45
+ /**
46
+ * Gera um CNPJ alfanumérico válido (14 caracteres, sem formatação).
47
+ *
48
+ * A base (12 caracteres) combina letras A–Z e dígitos 0–9 aleatoriamente.
49
+ * Os dois últimos caracteres são os dígitos verificadores calculados pelo algoritmo mod 11.
50
+ *
51
+ * @returns String com 14 caracteres (letras e números), sem formatação
52
+ *
53
+ * @example
54
+ * generateAlphanumeric() // ex: "AB123CDE000142"
55
+ */
56
+ export declare function generateAlphanumeric(): string;
57
+ /**
58
+ * Valida um CNPJ alfanumérico verificando se os dígitos verificadores estão corretos.
59
+ *
60
+ * Remove formatação (. / -) antes de validar. O valor deve ter exatamente 14 caracteres
61
+ * (letras e dígitos) e os dois últimos devem corresponder ao cálculo mod 11 da base.
62
+ *
63
+ * @param value - CNPJ alfanumérico com ou sem formatação (ex.: "AB.123.CDE/0001-42")
64
+ * @returns `true` se o CNPJ alfanumérico for válido
65
+ */
66
+ export declare function validateAlphanumeric(value: string): boolean;
67
+ /**
68
+ * Formata CNPJ alfanumérico no padrão oficial: XX.XXX.XXX/XXXX-XX.
69
+ *
70
+ * Remove formatação (. / -) antes de aplicar a máscara.
71
+ * Funciona igual ao CNPJ numérico, mas aceita letras nas posições da base.
72
+ *
73
+ * @param value - CNPJ alfanumérico com ou sem formatação (ex.: "AB123CDE000142")
74
+ * @returns String no formato XX.XXX.XXX/XXXX-XX, ou `null` se não houver 14 caracteres
75
+ *
76
+ * @example
77
+ * formatAlphanumeric('AB123CDE000142') // "AB.123.CDE/0001-42"
78
+ */
79
+ export declare function formatAlphanumeric(value: string): string | null;
80
+ //# sourceMappingURL=alphanumeric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alphanumeric.d.ts","sourceRoot":"","sources":["../../src/cnpj/alphanumeric.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAI5D;AASD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAU9D;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAC5B,CAAC,MAAM,EAAE,MAAM,CAAC,CAIlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAK7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAU3D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO/D"}
@@ -0,0 +1,150 @@
1
+ import { ALPHABET, CNPJ_LENGTH } from '../constants.js';
2
+ /**
3
+ * Converte uma letra em seu valor numérico conforme tabela da Receita Federal (A=17 até Z=42).
4
+ *
5
+ * Usado no cálculo dos dígitos verificadores do CNPJ alfanumérico.
6
+ *
7
+ * @param letter - Uma letra maiúscula (A–Z)
8
+ * @returns Valor numérico de 17 (A) a 42 (Z), ou 0 se inválido
9
+ *
10
+ * @example
11
+ * convertLetterToNumber('A') // 17
12
+ * convertLetterToNumber('Z') // 42
13
+ */
14
+ export function convertLetterToNumber(letter) {
15
+ const letterMap = {
16
+ A: 17, B: 18, C: 19, D: 20, E: 21, F: 22, G: 23, H: 24, I: 25,
17
+ J: 26, K: 27, L: 28, M: 29, N: 30, O: 31, P: 32, Q: 33, R: 34,
18
+ S: 35, T: 36, U: 37, V: 38, W: 39, X: 40, Y: 41, Z: 42,
19
+ };
20
+ return letterMap[letter] ?? 0;
21
+ }
22
+ /**
23
+ * Converte um CNPJ alfanumérico em array de números para cálculo dos dígitos verificadores.
24
+ *
25
+ * Letras A–Z são mapeadas para 17–42 conforme tabela da Receita Federal;
26
+ * dígitos 0–9 permanecem como números.
27
+ *
28
+ * @param value - CNPJ alfanumérico (ex.: "AB123CDE000142")
29
+ * @returns Array de números onde letras foram convertidas (17–42) e dígitos mantidos
30
+ *
31
+ * @example
32
+ * convertCnpjToNumbers("AB12") // [17, 18, 1, 2]
33
+ */
34
+ export function convertCnpjToNumbers(value) {
35
+ return Array.from(value).map((char) => isNaN(Number(char)) ? convertLetterToNumber(char) : Number(char));
36
+ }
37
+ /**
38
+ * Remove formatação (. / -) de um CNPJ alfanumérico.
39
+ */
40
+ function stripFormatting(value) {
41
+ return value.replace(/[.\/\-]/g, '');
42
+ }
43
+ /**
44
+ * Gera a base alfanumérica do CNPJ (12 caracteres aleatórios: dígitos 0–9 ou letras A–Z).
45
+ *
46
+ * Cada posição tem 50% de chance de ser dígito e 50% de ser letra.
47
+ *
48
+ * @returns Array com 12 caracteres (números ou letras) que será usada para calcular os dígitos verificadores
49
+ */
50
+ export function generateBaseAlphanumeric() {
51
+ const base = [];
52
+ for (let i = 0; i < 12; i++) {
53
+ if (Math.random() < 0.5) {
54
+ base.push(Math.floor(Math.random() * 10));
55
+ }
56
+ else {
57
+ base.push(ALPHABET.charAt(Math.floor(Math.random() * ALPHABET.length)));
58
+ }
59
+ }
60
+ return base;
61
+ }
62
+ /**
63
+ * Calcula um dígito verificador para a base usando pesos 2–9 (da direita para esquerda).
64
+ *
65
+ * Algoritmo mod 11 conforme especificação do CNPJ alfanumérico da Receita Federal.
66
+ *
67
+ * @param digits - Array com a base (12 caracteres numéricos ou letras convertidas)
68
+ * @returns Dígito verificador (0–9)
69
+ */
70
+ function calculateCheckDigit(digits) {
71
+ let sum = 0;
72
+ let weight = 2;
73
+ for (let i = digits.length - 1; i >= 0; i--) {
74
+ const digit = digits[i];
75
+ const numericValue = typeof digit === 'string' ? convertLetterToNumber(digit) : digit;
76
+ sum += numericValue * weight;
77
+ weight = weight === 9 ? 2 : weight + 1;
78
+ }
79
+ const rest = sum % 11;
80
+ return rest < 2 ? 0 : 11 - rest;
81
+ }
82
+ /**
83
+ * Calcula os dois dígitos verificadores do CNPJ alfanumérico.
84
+ *
85
+ * O primeiro dígito é calculado sobre a base de 12 caracteres; o segundo,
86
+ * sobre a base mais o primeiro dígito.
87
+ *
88
+ * @param baseCNPJ - Array com os 12 caracteres da base (números ou letras)
89
+ * @returns Tupla [primeiro_dígito, segundo_dígito]
90
+ */
91
+ export function calculateCheckDigits(baseCNPJ) {
92
+ const firstDigit = calculateCheckDigit(baseCNPJ);
93
+ const secondDigit = calculateCheckDigit([...baseCNPJ, firstDigit]);
94
+ return [firstDigit, secondDigit];
95
+ }
96
+ /**
97
+ * Gera um CNPJ alfanumérico válido (14 caracteres, sem formatação).
98
+ *
99
+ * A base (12 caracteres) combina letras A–Z e dígitos 0–9 aleatoriamente.
100
+ * Os dois últimos caracteres são os dígitos verificadores calculados pelo algoritmo mod 11.
101
+ *
102
+ * @returns String com 14 caracteres (letras e números), sem formatação
103
+ *
104
+ * @example
105
+ * generateAlphanumeric() // ex: "AB123CDE000142"
106
+ */
107
+ export function generateAlphanumeric() {
108
+ const base = generateBaseAlphanumeric();
109
+ const [d1, d2] = calculateCheckDigits(base);
110
+ const chars = base.map((c) => String(c));
111
+ return [...chars, String(d1), String(d2)].join('');
112
+ }
113
+ /**
114
+ * Valida um CNPJ alfanumérico verificando se os dígitos verificadores estão corretos.
115
+ *
116
+ * Remove formatação (. / -) antes de validar. O valor deve ter exatamente 14 caracteres
117
+ * (letras e dígitos) e os dois últimos devem corresponder ao cálculo mod 11 da base.
118
+ *
119
+ * @param value - CNPJ alfanumérico com ou sem formatação (ex.: "AB.123.CDE/0001-42")
120
+ * @returns `true` se o CNPJ alfanumérico for válido
121
+ */
122
+ export function validateAlphanumeric(value) {
123
+ const raw = stripFormatting(value);
124
+ if (raw.length !== CNPJ_LENGTH)
125
+ return false;
126
+ const base = raw.slice(0, 12);
127
+ const digits = convertCnpjToNumbers(base);
128
+ const [dv1, dv2] = calculateCheckDigits(digits);
129
+ const originalDv = parseInt(raw.slice(-2), 10);
130
+ const calculatedDv = dv1 * 10 + dv2;
131
+ return originalDv === calculatedDv;
132
+ }
133
+ /**
134
+ * Formata CNPJ alfanumérico no padrão oficial: XX.XXX.XXX/XXXX-XX.
135
+ *
136
+ * Remove formatação (. / -) antes de aplicar a máscara.
137
+ * Funciona igual ao CNPJ numérico, mas aceita letras nas posições da base.
138
+ *
139
+ * @param value - CNPJ alfanumérico com ou sem formatação (ex.: "AB123CDE000142")
140
+ * @returns String no formato XX.XXX.XXX/XXXX-XX, ou `null` se não houver 14 caracteres
141
+ *
142
+ * @example
143
+ * formatAlphanumeric('AB123CDE000142') // "AB.123.CDE/0001-42"
144
+ */
145
+ export function formatAlphanumeric(value) {
146
+ const raw = stripFormatting(value);
147
+ if (raw.length !== CNPJ_LENGTH)
148
+ return null;
149
+ return raw.replace(/^(.{2})(.{3})(.{3})(.{4})(.{2})$/, '$1.$2.$3/$4-$5');
150
+ }
@@ -0,0 +1,39 @@
1
+ /** Opções para geração de CNPJ. */
2
+ export type CnpjGenerateOptions = {
3
+ /**
4
+ * Tipo de CNPJ a gerar:
5
+ * - `'numeric'` (padrão): apenas dígitos 0–9
6
+ * - `'alphanumeric'`: letras A–Z e dígitos (formato futuro da Receita Federal)
7
+ */
8
+ type?: 'numeric' | 'alphanumeric';
9
+ /** Se `true` (padrão), retorna formatado como 00.000.000/0000-00; se `false`, retorna apenas os 14 caracteres. */
10
+ formatted?: boolean;
11
+ };
12
+ /**
13
+ * API para validação, geração e formatação de CNPJ (Cadastro Nacional da Pessoa Jurídica).
14
+ *
15
+ * Suporta CNPJ numérico (padrão atual) e alfanumérico (formato futuro da Receita Federal).
16
+ * Todas as funções aceitam CNPJ com ou sem formatação.
17
+ */
18
+ export interface CNPJ {
19
+ /**
20
+ * Verifica se o CNPJ é válido (14 caracteres, dígitos verificadores corretos, não sequência repetida).
21
+ * @param value - CNPJ com ou sem máscara (numérico ou alfanumérico)
22
+ * @returns `true` se válido
23
+ */
24
+ isValid(value: string): boolean;
25
+ /**
26
+ * Gera um CNPJ válido aleatoriamente (numérico ou alfanumérico).
27
+ * @param options - `type` ('numeric' | 'alphanumeric'), `formatted` (default: true)
28
+ * @returns CNPJ válido
29
+ */
30
+ generate(options?: CnpjGenerateOptions): string;
31
+ /**
32
+ * Formata o CNPJ no padrão 00.000.000/0000-00.
33
+ * @param value - CNPJ com ou sem formatação
34
+ * @returns String formatada ou `null` se não houver 14 caracteres
35
+ */
36
+ format(value: string): string | null;
37
+ }
38
+ export declare const cnpj: CNPJ;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cnpj/index.ts"],"names":[],"mappings":"AAoDA,mCAAmC;AACnC,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IAClC,kHAAkH;IAClH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AA0DF;;;;;GAKG;AACH,MAAM,WAAW,IAAI;IACnB;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC;IAChD;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,eAAO,MAAM,IAAI,EAAE,IAIlB,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { generateAlphanumeric, formatAlphanumeric, } from './alphanumeric.js';
2
+ function onlyDigits(str) {
3
+ return String(str).replace(/\D/g, '');
4
+ }
5
+ function cnpjFirstDigit(digits) {
6
+ const weights = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
7
+ const sum = digits.reduce((acc, d, i) => acc + d * weights[i], 0);
8
+ const rest = sum % 11;
9
+ return rest < 2 ? 0 : 11 - rest;
10
+ }
11
+ function cnpjSecondDigit(digits) {
12
+ const weights = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
13
+ const sum = digits.reduce((acc, d, i) => acc + d * weights[i], 0);
14
+ const rest = sum % 11;
15
+ return rest < 2 ? 0 : 11 - rest;
16
+ }
17
+ /**
18
+ * Verifica se um CNPJ numérico é válido conforme algoritmo oficial da Receita Federal.
19
+ *
20
+ * Realiza a validação dos dois dígitos verificadores calculados com pesos
21
+ * mod 11. Rejeita CNPJs inválidos como sequências repetidas (11.111.111/1111-11,
22
+ * 00.000.000/0000-00, etc.). Aceita o valor com ou sem máscara (pontos, barra e traço).
23
+ *
24
+ * Nota: Esta função valida apenas CNPJs numéricos. CNPJs alfanuméricos usam outro algoritmo
25
+ * e são gerados com `generate({ type: 'alphanumeric' })`.
26
+ *
27
+ * @param value - CNPJ numérico em qualquer formato (ex.: "11.222.333/0001-81" ou "11222333000181")
28
+ * @returns `true` se o CNPJ tiver 14 dígitos, dígitos verificadores corretos e não for sequência repetida
29
+ *
30
+ * @example
31
+ * isValid('11.222.333/0001-81') // true
32
+ * isValid('11222333000181') // true
33
+ * isValid('11.111.111/1111-11') // false (sequência inválida)
34
+ * isValid('12345') // false (incompleto)
35
+ */
36
+ function isValid(value) {
37
+ const digits = onlyDigits(value).split('').map(Number);
38
+ if (digits.length !== 14)
39
+ return false;
40
+ if (new Set(digits).size === 1)
41
+ return false;
42
+ const base = digits.slice(0, 12);
43
+ const d1 = cnpjFirstDigit(base);
44
+ const d2 = cnpjSecondDigit([...base, d1]);
45
+ return digits[12] === d1 && digits[13] === d2;
46
+ }
47
+ /**
48
+ * Gera um CNPJ válido aleatoriamente, com dígitos verificadores calculados corretamente.
49
+ *
50
+ * Para `type: 'numeric'`, a base (12 primeiros dígitos) é sorteada; os dois últimos
51
+ * são calculados pelo algoritmo mod 11. Para `type: 'alphanumeric'`, usa letras A–Z
52
+ * e dígitos conforme especificação futura da Receita Federal.
53
+ *
54
+ * @param options - Opções de geração
55
+ * @param options.type - `'numeric'` (padrão) ou `'alphanumeric'`
56
+ * @param options.formatted - Se `true` (padrão), retorna formatado; se `false`, retorna sem formatação
57
+ * @returns CNPJ válido, com ou sem formatação conforme as opções
58
+ *
59
+ * @example
60
+ * generate() // ex: "11.222.333/0001-81"
61
+ * generate({ formatted: false }) // ex: "11222333000181"
62
+ * generate({ type: 'alphanumeric' }) // ex: "AB.123.CDE/0001-42"
63
+ * generate({ type: 'alphanumeric', formatted: false }) // ex: "AB123CDE000142"
64
+ */
65
+ function generate(options) {
66
+ const { type = 'numeric', formatted = true } = options ?? {};
67
+ let raw;
68
+ if (type === 'alphanumeric') {
69
+ raw = generateAlphanumeric();
70
+ return formatted ? (formatAlphanumeric(raw) ?? raw) : raw;
71
+ }
72
+ const base = Array.from({ length: 12 }, () => Math.floor(Math.random() * 10));
73
+ const d1 = cnpjFirstDigit(base);
74
+ const d2 = cnpjSecondDigit([...base, d1]);
75
+ raw = [...base, d1, d2].join('');
76
+ return formatted ? (format(raw) ?? raw) : raw;
77
+ }
78
+ /**
79
+ * Formata o CNPJ no padrão oficial brasileiro: 00.000.000/0000-00.
80
+ *
81
+ * Remove caracteres de formatação (. / -) antes de formatar.
82
+ * Funciona tanto para CNPJ numérico quanto alfanumérico.
83
+ * Se o valor não tiver exatamente 14 caracteres, retorna `null`.
84
+ *
85
+ * @param value - CNPJ com ou sem formatação (pontos, barra, traço são ignorados)
86
+ * @returns String no formato 00.000.000/0000-00, ou `null` se não houver 14 caracteres
87
+ *
88
+ * @example
89
+ * format('11222333000181') // "11.222.333/0001-81"
90
+ * format('11.222.333/0001-81') // "11.222.333/0001-81"
91
+ * format('AB123CDE000142') // "AB.123.CDE/0001-42"
92
+ * format('123') // null
93
+ */
94
+ function format(value) {
95
+ const digits = onlyDigits(value);
96
+ if (digits.length !== 14)
97
+ return null;
98
+ return digits.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, '$1.$2.$3/$4-$5');
99
+ }
100
+ export const cnpj = {
101
+ isValid,
102
+ generate,
103
+ format,
104
+ };
@@ -0,0 +1,7 @@
1
+ /** Alfabeto utilizado para geração de CNPJ alfanumérico (letras A–Z conforme Receita Federal). */
2
+ export declare const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
3
+ /** Quantidade de caracteres de um CNPJ (numérico ou alfanumérico), incluindo dígitos verificadores. */
4
+ export declare const CNPJ_LENGTH = 14;
5
+ /** Quantidade de dígitos de um CPF (9 base + 2 verificadores). */
6
+ export declare const CPF_LENGTH = 11;
7
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,eAAO,MAAM,QAAQ,+BAA+B,CAAC;AAErD,uGAAuG;AACvG,eAAO,MAAM,WAAW,KAAK,CAAC;AAE9B,kEAAkE;AAClE,eAAO,MAAM,UAAU,KAAK,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Alfabeto utilizado para geração de CNPJ alfanumérico (letras A–Z conforme Receita Federal). */
2
+ export const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
3
+ /** Quantidade de caracteres de um CNPJ (numérico ou alfanumérico), incluindo dígitos verificadores. */
4
+ export const CNPJ_LENGTH = 14;
5
+ /** Quantidade de dígitos de um CPF (9 base + 2 verificadores). */
6
+ export const CPF_LENGTH = 11;
@@ -0,0 +1,33 @@
1
+ /** Opções para geração de CPF. */
2
+ export type CpfGenerateOptions = {
3
+ /** Se `true` (padrão), retorna formatado como 000.000.000-00; se `false`, retorna apenas os 11 dígitos. */
4
+ formatted?: boolean;
5
+ };
6
+ /**
7
+ * API para validação, geração e formatação de CPF (Cadastro de Pessoa Física).
8
+ *
9
+ * Todas as funções aceitam CPF com ou sem formatação. O algoritmo de validação
10
+ * segue a especificação oficial da Receita Federal (dígitos verificadores mod 11).
11
+ */
12
+ export interface CPF {
13
+ /**
14
+ * Verifica se o CPF é válido (11 dígitos, dígitos verificadores corretos, não sequência repetida).
15
+ * @param value - CPF com ou sem máscara
16
+ * @returns `true` se válido
17
+ */
18
+ isValid(value: string): boolean;
19
+ /**
20
+ * Gera um CPF válido aleatoriamente.
21
+ * @param options - `formatted` (default: true) — retorna formatado ou apenas dígitos
22
+ * @returns CPF válido
23
+ */
24
+ generate(options?: CpfGenerateOptions): string;
25
+ /**
26
+ * Formata o CPF no padrão 000.000.000-00.
27
+ * @param value - CPF com ou sem formatação
28
+ * @returns String formatada ou `null` se não houver 11 dígitos
29
+ */
30
+ format(value: string): string | null;
31
+ }
32
+ export declare const cpf: CPF;
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cpf/index.ts"],"names":[],"mappings":"AA4CA,kCAAkC;AAClC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,2GAA2G;IAC3G,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AA6CF;;;;;GAKG;AACH,MAAM,WAAW,GAAG;IAClB;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC;IAC/C;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,eAAO,MAAM,GAAG,EAAE,GAIjB,CAAC"}
@@ -0,0 +1,89 @@
1
+ function onlyDigits(str) {
2
+ return String(str).replace(/\D/g, '');
3
+ }
4
+ function cpfFirstDigit(digits) {
5
+ const weights = [10, 9, 8, 7, 6, 5, 4, 3, 2];
6
+ const sum = digits.reduce((acc, d, i) => acc + d * weights[i], 0);
7
+ const rest = sum % 11;
8
+ return rest < 2 ? 0 : 11 - rest;
9
+ }
10
+ function cpfSecondDigit(digits) {
11
+ const weights = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2];
12
+ const sum = digits.reduce((acc, d, i) => acc + d * weights[i], 0);
13
+ const rest = sum % 11;
14
+ return rest < 2 ? 0 : 11 - rest;
15
+ }
16
+ /**
17
+ * Verifica se um CPF é válido conforme algoritmo oficial da Receita Federal.
18
+ *
19
+ * Realiza a validação dos dois dígitos verificadores calculados com pesos
20
+ * mod 11. Rejeita CPFs inválidos como sequências repetidas (111.111.111-11,
21
+ * 000.000.000-00, etc.). Aceita o valor com ou sem máscara (pontos e traço).
22
+ *
23
+ * @param value - CPF em qualquer formato (ex.: "313.402.809-30" ou "31340280930")
24
+ * @returns `true` se o CPF tiver 11 dígitos, dígitos verificadores corretos e não for sequência repetida
25
+ *
26
+ * @example
27
+ * isValid('313.402.809-30') // true
28
+ * isValid('31340280930') // true
29
+ * isValid('111.111.111-11') // false (sequência inválida)
30
+ * isValid('123') // false (incompleto)
31
+ */
32
+ function isValid(value) {
33
+ const digits = onlyDigits(value).split('').map(Number);
34
+ if (digits.length !== 11)
35
+ return false;
36
+ if (new Set(digits).size === 1)
37
+ return false;
38
+ const base = digits.slice(0, 9);
39
+ const d1 = cpfFirstDigit(base);
40
+ const d2 = cpfSecondDigit([...base, d1]);
41
+ return digits[9] === d1 && digits[10] === d2;
42
+ }
43
+ /**
44
+ * Gera um CPF válido aleatoriamente, com dígitos verificadores calculados corretamente.
45
+ *
46
+ * A base (9 primeiros dígitos) é sorteada; os dois últimos são calculados pelo
47
+ * algoritmo mod 11. O resultado nunca será sequência repetida.
48
+ *
49
+ * @param options - Opções de geração
50
+ * @param options.formatted - Se `true` (padrão), retorna no padrão 000.000.000-00; se `false`, retorna apenas os 11 dígitos
51
+ * @returns CPF válido, com ou sem formatação conforme as opções
52
+ *
53
+ * @example
54
+ * generate() // ex: "313.402.809-30"
55
+ * generate({ formatted: false }) // ex: "31340280930"
56
+ */
57
+ function generate(options) {
58
+ const { formatted = true } = options ?? {};
59
+ const base = Array.from({ length: 9 }, () => Math.floor(Math.random() * 10));
60
+ const d1 = cpfFirstDigit(base);
61
+ const d2 = cpfSecondDigit([...base, d1]);
62
+ const raw = [...base, d1, d2].join('');
63
+ return formatted ? (format(raw) ?? raw) : raw;
64
+ }
65
+ /**
66
+ * Formata o CPF no padrão oficial brasileiro: 000.000.000-00.
67
+ *
68
+ * Remove qualquer caractere que não seja dígito antes de formatar.
69
+ * Se o valor não tiver exatamente 11 dígitos, retorna `null`.
70
+ *
71
+ * @param value - CPF com ou sem formatação (pontos, traço, espaços são ignorados)
72
+ * @returns String no formato 000.000.000-00, ou `null` se não houver 11 dígitos
73
+ *
74
+ * @example
75
+ * format('31340280930') // "313.402.809-30"
76
+ * format('313.402.809-30') // "313.402.809-30"
77
+ * format('123') // null
78
+ */
79
+ function format(value) {
80
+ const digits = onlyDigits(value);
81
+ if (digits.length !== 11)
82
+ return null;
83
+ return digits.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4');
84
+ }
85
+ export const cpf = {
86
+ isValid,
87
+ generate,
88
+ format,
89
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Biblioteca para validação, geração e formatação de CPF e CNPJ (Brasil).
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export { cpf, type CPF, type CpfGenerateOptions } from './cpf/index.js';
7
+ export { cnpj, type CNPJ, type CnpjGenerateOptions } from './cnpj/index.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Biblioteca para validação, geração e formatação de CPF e CNPJ (Brasil).
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export { cpf } from './cpf/index.js';
7
+ export { cnpj } from './cnpj/index.js';
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@artrsousa/cpf-cnpj-validator",
3
+ "version": "1.0.0",
4
+ "description": "Valida e gera CPF e CNPJ válidos (Brasil)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "test": "npm run build && node --test test/cpf.test.js test/cnpj.test.js"
22
+ },
23
+ "keywords": [
24
+ "cpf",
25
+ "cnpj",
26
+ "brasil",
27
+ "validator",
28
+ "generator",
29
+ "cadastro",
30
+ "pessoa física",
31
+ "pessoa jurídica"
32
+ ],
33
+ "author": "",
34
+ "license": "MIT",
35
+ "devDependencies": {
36
+ "typescript": "^5.7.2"
37
+ }
38
+ }