exodus-framework 2.1.1031 → 2.1.1033
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/lib/app/classes/broadcast.d.ts +6 -0
- package/lib/app/classes/broadcast.d.ts.map +1 -1
- package/lib/app/classes/broadcast.js +1 -3
- package/lib/app/classes/communication.d.ts +17 -0
- package/lib/app/classes/communication.d.ts.map +1 -1
- package/lib/app/classes/communication.js +0 -8
- package/lib/app/classes/event.d.ts +6 -0
- package/lib/app/classes/event.d.ts.map +1 -1
- package/lib/app/classes/managed.d.ts +7 -0
- package/lib/app/classes/managed.d.ts.map +1 -1
- package/lib/app/classes/managed.js +0 -20
- package/lib/app/classes/service.d.ts +126 -0
- package/lib/app/classes/service.d.ts.map +1 -1
- package/lib/app/classes/service.js +4 -9
- package/lib/app/classes/servicemodel.d.ts +7 -0
- package/lib/app/classes/servicemodel.d.ts.map +1 -1
- package/lib/app/classes/singleton.d.ts +9 -0
- package/lib/app/classes/singleton.d.ts.map +1 -1
- package/lib/app/classes/singleton.js +0 -1
- package/lib/app/classes/socket/clienthandler.js +0 -6
- package/lib/app/classes/socket/eventhandler.js +0 -6
- package/lib/app/classes/socket/ssehandler.d.ts +1 -1
- package/lib/app/classes/socket/ssehandler.d.ts.map +1 -1
- package/lib/app/classes/socket/ssehandler.js +19 -22
- package/lib/app/classes/system.d.ts +6 -0
- package/lib/app/classes/system.d.ts.map +1 -1
- package/lib/app/controller.d.ts +25 -0
- package/lib/app/controller.d.ts.map +1 -1
- package/lib/app/core.d.ts +9 -0
- package/lib/app/core.d.ts.map +1 -1
- package/lib/app/core.js +0 -6
- package/lib/app/error.js +0 -1
- package/lib/app/exodus.d.ts +7 -0
- package/lib/app/exodus.d.ts.map +1 -1
- package/lib/app/exodus.js +1 -30
- package/lib/app/settings.js +3 -14
- package/lib/contracts/communication/communication.js +4 -4
- package/lib/contracts/contansts.js +2 -2
- package/lib/contracts/core.js +1 -1
- package/lib/contracts/entity.js +2 -4
- package/lib/contracts/http.d.ts +17 -1
- package/lib/contracts/http.d.ts.map +1 -1
- package/lib/contracts/http.js +2 -2
- package/lib/contracts/messaging.d.ts +1 -1
- package/lib/contracts/messaging.d.ts.map +1 -1
- package/lib/contracts/messaging.js +2 -2
- package/lib/contracts/service.js +1 -1
- package/lib/contracts/socket.js +2 -2
- package/lib/controllers/api/file.js +0 -4
- package/lib/controllers/api/log.js +0 -1
- package/lib/controllers/api/report.js +0 -1
- package/lib/controllers/messaging/application.js +0 -10
- package/lib/controllers/messaging/environment.js +0 -11
- package/lib/middlewares/access.d.ts +6 -0
- package/lib/middlewares/access.d.ts.map +1 -1
- package/lib/middlewares/access.js +0 -5
- package/lib/middlewares/authentication.d.ts +7 -0
- package/lib/middlewares/authentication.d.ts.map +1 -1
- package/lib/middlewares/authentication.js +2 -5
- package/lib/middlewares/file.js +0 -1
- package/lib/routes/api/v1/logs.js +0 -7
- package/lib/routes/api/v1/report.js +0 -7
- package/lib/routes/api/v1/sse.js +2 -11
- package/lib/routes/messaging/index.js +0 -6
- package/lib/services/database.d.ts +17 -0
- package/lib/services/database.d.ts.map +1 -1
- package/lib/services/database.js +5 -19
- package/lib/services/express.js +1 -7
- package/lib/services/file/FileLibrary.d.ts +8 -0
- package/lib/services/file/FileLibrary.d.ts.map +1 -1
- package/lib/services/file/FileLibrary.js +0 -2
- package/lib/services/file/classes/Mimetyp.d.ts +12 -0
- package/lib/services/file/classes/Mimetyp.d.ts.map +1 -1
- package/lib/services/file/classes/Mimetyp.js +0 -41
- package/lib/services/file/constants/mimes.js +0 -1
- package/lib/services/logger.js +0 -5
- package/lib/services/rabitmq.d.ts +26 -0
- package/lib/services/rabitmq.d.ts.map +1 -1
- package/lib/services/rabitmq.js +7 -13
- package/lib/services/redis.d.ts +7 -0
- package/lib/services/redis.d.ts.map +1 -1
- package/lib/services/redis.js +2 -5
- package/lib/services/security.d.ts +52 -0
- package/lib/services/security.d.ts.map +1 -1
- package/lib/services/security.js +0 -3
- package/lib/services/sequelize.d.ts +8 -0
- package/lib/services/sequelize.d.ts.map +1 -1
- package/lib/services/sequelize.js +3 -16
- package/lib/services/socket.d.ts +7 -0
- package/lib/services/socket.d.ts.map +1 -1
- package/lib/services/socket.js +1 -4
- package/lib/services/task/queue/QueueService.js +0 -1
- package/lib/services/task/queue/QueueTask.js +0 -16
- package/lib/services/task/scheduler/SchedulerTask.d.ts +16 -0
- package/lib/services/task/scheduler/SchedulerTask.d.ts.map +1 -1
- package/lib/services/task/scheduler/SchedulerTask.js +0 -9
- package/lib/services/test.js +0 -2
- package/lib/tasks/queue/teste.js +0 -20
- package/lib/tasks/schedule/teste.js +0 -16
- package/lib/utils/api.d.ts +157 -0
- package/lib/utils/api.d.ts.map +1 -1
- package/lib/utils/api.js +0 -10
- package/lib/utils/database.js +0 -18
- package/lib/utils/logger-transport.js +0 -7
- package/lib/utils/phone.d.ts +171 -0
- package/lib/utils/phone.d.ts.map +1 -1
- package/lib/utils/phone.js +0 -27
- package/package.json +1 -1
package/lib/utils/api.d.ts
CHANGED
@@ -1,15 +1,172 @@
|
|
1
1
|
import { AxiosHeaders, AxiosInstance, Method } from 'axios';
|
2
2
|
import { IApiResponse } from '../contracts/http';
|
3
|
+
/**
|
4
|
+
* Classe abstrata base para criação de clientes HTTP usando Axios.
|
5
|
+
*
|
6
|
+
* Esta classe fornece uma estrutura comum para realizar requisições HTTP
|
7
|
+
* com tratamento de erros padronizado, validação de status customizável
|
8
|
+
* e diferentes tipos de requisições (interna, externa, direta).
|
9
|
+
*
|
10
|
+
* @example
|
11
|
+
* ```typescript
|
12
|
+
* class MyApiClient extends Api {
|
13
|
+
* host = 'https://api.example.com';
|
14
|
+
* headers = { 'Authorization': 'Bearer token' };
|
15
|
+
*
|
16
|
+
* validateStatus(status: number): boolean {
|
17
|
+
* return status >= 200 && status < 300;
|
18
|
+
* }
|
19
|
+
* }
|
20
|
+
*
|
21
|
+
* const client = new MyApiClient();
|
22
|
+
* const response = await client.request('/users', 'GET');
|
23
|
+
* ```
|
24
|
+
*
|
25
|
+
* @abstract
|
26
|
+
* @class Api
|
27
|
+
* @version 1.0.0
|
28
|
+
* @author Exodus Framework
|
29
|
+
*/
|
3
30
|
declare abstract class Api {
|
31
|
+
/** Instância do Axios configurada */
|
4
32
|
axios: AxiosInstance;
|
33
|
+
/** URL base para as requisições (deve ser implementado nas classes filhas) */
|
5
34
|
abstract host: string;
|
35
|
+
/** Headers padrão para as requisições (deve ser implementado nas classes filhas) */
|
6
36
|
abstract headers: Record<string, any>;
|
37
|
+
/**
|
38
|
+
* Construtor da classe Api.
|
39
|
+
* Inicializa automaticamente a instância do Axios.
|
40
|
+
*/
|
7
41
|
constructor();
|
42
|
+
/**
|
43
|
+
* Inicializa a instância do Axios com configurações padrão.
|
44
|
+
*
|
45
|
+
* @protected
|
46
|
+
* @async
|
47
|
+
* @returns Promise<void>
|
48
|
+
*
|
49
|
+
* @example
|
50
|
+
* ```typescript
|
51
|
+
* // Chamado automaticamente no constructor
|
52
|
+
* await this.init();
|
53
|
+
* ```
|
54
|
+
*/
|
8
55
|
init(): Promise<void>;
|
56
|
+
/**
|
57
|
+
* Método abstrato para validação de status HTTP.
|
58
|
+
* Deve ser implementado nas classes filhas para definir quais status são considerados válidos.
|
59
|
+
*
|
60
|
+
* @abstract
|
61
|
+
* @param status - Código de status HTTP da resposta
|
62
|
+
* @returns true se o status é válido, false caso contrário
|
63
|
+
*
|
64
|
+
* @example
|
65
|
+
* ```typescript
|
66
|
+
* validateStatus(status: number): boolean {
|
67
|
+
* return status >= 200 && status < 400; // Aceita 2xx e 3xx
|
68
|
+
* }
|
69
|
+
* ```
|
70
|
+
*/
|
9
71
|
abstract validateStatus(status: number): boolean;
|
72
|
+
/**
|
73
|
+
* Realiza uma requisição HTTP e retorna apenas os dados da resposta.
|
74
|
+
*
|
75
|
+
* @template T - Tipo dos dados esperados na resposta
|
76
|
+
* @param endpoint - Endpoint da API (será concatenado com host)
|
77
|
+
* @param method - Método HTTP (GET, POST, PUT, DELETE, etc.)
|
78
|
+
* @param data - Dados para envio no corpo da requisição (opcional)
|
79
|
+
* @param params - Parâmetros de query string (opcional)
|
80
|
+
* @param headers - Headers adicionais para a requisição (opcional)
|
81
|
+
* @returns Promise com os dados da resposta ou undefined em caso de erro
|
82
|
+
*
|
83
|
+
* @example
|
84
|
+
* ```typescript
|
85
|
+
* // GET request
|
86
|
+
* const users = await this.request<User[]>('/users', 'GET');
|
87
|
+
*
|
88
|
+
* // POST request com dados
|
89
|
+
* const newUser = await this.request<User>('/users', 'POST', {
|
90
|
+
* name: 'João',
|
91
|
+
* email: 'joao@example.com'
|
92
|
+
* });
|
93
|
+
*
|
94
|
+
* // GET com parâmetros
|
95
|
+
* const user = await this.request<User>('/users', 'GET', null, { id: 123 });
|
96
|
+
* ```
|
97
|
+
*/
|
10
98
|
request<T>(endpoint: string, method: Method, data?: any, params?: any, headers?: AxiosHeaders): Promise<IApiResponse<T> | import("axios").AxiosResponse<T, any, {}>>;
|
99
|
+
/**
|
100
|
+
* Realiza uma requisição HTTP e retorna a resposta completa do Axios.
|
101
|
+
*
|
102
|
+
* Este método é útil quando você precisa acessar headers, status code,
|
103
|
+
* ou outras propriedades da resposta além dos dados.
|
104
|
+
*
|
105
|
+
* @template T - Tipo dos dados esperados na resposta
|
106
|
+
* @param endpoint - Endpoint da API (será concatenado com host)
|
107
|
+
* @param method - Método HTTP (GET, POST, PUT, DELETE, etc.)
|
108
|
+
* @param data - Dados para envio no corpo da requisição (opcional)
|
109
|
+
* @param params - Parâmetros de query string (opcional)
|
110
|
+
* @param headers - Headers adicionais para a requisição (opcional)
|
111
|
+
* @returns Promise com a resposta completa do Axios ou undefined em caso de erro
|
112
|
+
*
|
113
|
+
* @example
|
114
|
+
* ```typescript
|
115
|
+
* const response = await this.requestDirect<User>('/users/1', 'GET');
|
116
|
+
* console.log(response.status); // 200
|
117
|
+
* console.log(response.headers); // Headers da resposta
|
118
|
+
* console.log(response.data); // Dados do usuário
|
119
|
+
* ```
|
120
|
+
*/
|
11
121
|
requestDirect<T>(endpoint: string, method: Method, data?: any, params?: any, headers?: AxiosHeaders): Promise<import("axios").AxiosResponse<IApiResponse<T>, any, {}> | import("axios").AxiosResponse<T, any, {}>>;
|
122
|
+
/**
|
123
|
+
* Realiza uma requisição HTTP para APIs externas.
|
124
|
+
*
|
125
|
+
* Este método é otimizado para chamadas a APIs de terceiros,
|
126
|
+
* não utilizando a interface IApiResponse padrão do framework.
|
127
|
+
*
|
128
|
+
* @template T - Tipo dos dados esperados na resposta
|
129
|
+
* @param endpoint - Endpoint da API (será concatenado com host)
|
130
|
+
* @param method - Método HTTP (GET, POST, PUT, DELETE, etc.)
|
131
|
+
* @param data - Dados para envio no corpo da requisição (opcional)
|
132
|
+
* @param params - Parâmetros de query string (opcional)
|
133
|
+
* @param headers - Headers adicionais para a requisição (opcional)
|
134
|
+
* @returns Promise com a resposta da API externa ou undefined em caso de erro
|
135
|
+
*
|
136
|
+
* @example
|
137
|
+
* ```typescript
|
138
|
+
* // Chamada para API externa (ex: GitHub)
|
139
|
+
* const githubUser = await this.requestExternal<GitHubUser>(
|
140
|
+
* '/users/octocat',
|
141
|
+
* 'GET'
|
142
|
+
* );
|
143
|
+
*
|
144
|
+
* // API externa com autenticação
|
145
|
+
* const data = await this.requestExternal<ExternalData>(
|
146
|
+
* '/api/data',
|
147
|
+
* 'GET',
|
148
|
+
* null,
|
149
|
+
* null,
|
150
|
+
* { 'X-API-Key': 'external-api-key' }
|
151
|
+
* );
|
152
|
+
* ```
|
153
|
+
*/
|
12
154
|
requestExternal<T>(endpoint: string, method: Method, data?: any, params?: any, headers?: AxiosHeaders): Promise<import("axios").AxiosResponse<T, any, {}>>;
|
155
|
+
/**
|
156
|
+
* Gera um ID de segurança lógica baseado na data atual.
|
157
|
+
*
|
158
|
+
* Este método cria um identificador único baseado na data atual,
|
159
|
+
* útil para implementações de segurança ou cache temporal.
|
160
|
+
*
|
161
|
+
* @protected
|
162
|
+
* @returns String contendo o ID de segurança lógica
|
163
|
+
*
|
164
|
+
* @example
|
165
|
+
* ```typescript
|
166
|
+
* const securityId = this.getLogicalSecurityId();
|
167
|
+
* console.log(securityId); // "1695513600000" (exemplo)
|
168
|
+
* ```
|
169
|
+
*/
|
13
170
|
protected getLogicalSecurityId(): string;
|
14
171
|
}
|
15
172
|
export default Api;
|
package/lib/utils/api.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAc,MAAM,OAAO,CAAC;AAG/E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAc,MAAM,OAAO,CAAC;AAG/E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,uBAAe,GAAG;IAChB,qCAAqC;IACrC,KAAK,EAAE,aAAa,CAAC;IAErB,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,oFAAoF;IACpF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEtC;;;OAGG;;IAKH;;;;;;;;;;;;OAYG;IACG,IAAI;IAWV;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAEhD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,OAAO,CAAC,CAAC,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,GAAG,EACV,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,YAAY;IAkBxB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,aAAa,CAAC,CAAC,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,GAAG,EACV,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,YAAY;IAkBxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACG,eAAe,CAAC,CAAC,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,GAAG,EACV,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,YAAY;IAkBxB;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,oBAAoB;CAI/B;AAED,eAAe,GAAG,CAAC"}
|
package/lib/utils/api.js
CHANGED
@@ -36,17 +36,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
36
36
|
* @author Exodus Framework
|
37
37
|
*/
|
38
38
|
class Api {
|
39
|
-
/** Instância do Axios configurada */
|
40
39
|
axios;
|
41
|
-
|
42
|
-
/** URL base para as requisições (deve ser implementado nas classes filhas) */
|
43
|
-
|
44
|
-
/** Headers padrão para as requisições (deve ser implementado nas classes filhas) */
|
45
|
-
|
46
|
-
/**
|
47
|
-
* Construtor da classe Api.
|
48
|
-
* Inicializa automaticamente a instância do Axios.
|
49
|
-
*/
|
50
40
|
constructor() {
|
51
41
|
this.init();
|
52
42
|
}
|
package/lib/utils/database.js
CHANGED
@@ -57,7 +57,6 @@ function processCondition(cond, fieldName) {
|
|
57
57
|
if (dialect === 'postgres') {
|
58
58
|
simpleWhere[_sequelize.Op.iLike] = value;
|
59
59
|
} else {
|
60
|
-
// Para MariaDB/MySQL, usamos Sequelize.where com função LOWER
|
61
60
|
return _sequelize.Sequelize.where(_sequelize.Sequelize.fn('LOWER', _sequelize.Sequelize.col(fieldName)), _sequelize.Op.like, `${value}`.toLowerCase());
|
62
61
|
}
|
63
62
|
} else {
|
@@ -71,7 +70,6 @@ function processCondition(cond, fieldName) {
|
|
71
70
|
if (dialect === 'postgres') {
|
72
71
|
simpleWhere[_sequelize.Op.notILike] = value;
|
73
72
|
} else {
|
74
|
-
// Para MariaDB/MySQL, usamos Sequelize.where com função LOWER
|
75
73
|
return _sequelize.Sequelize.where(_sequelize.Sequelize.fn('LOWER', _sequelize.Sequelize.col(fieldName)), _sequelize.Op.notLike, `${value}`.toLowerCase());
|
76
74
|
}
|
77
75
|
} else {
|
@@ -103,24 +101,17 @@ function processDateCondition(key, cond) {
|
|
103
101
|
if (cond.between !== undefined) {
|
104
102
|
const start = cond.between[0];
|
105
103
|
const end = cond.between[1];
|
106
|
-
|
107
|
-
// console.log(start, end);
|
108
|
-
|
109
104
|
let startDate = (0, _dateFns.parseISO)(start);
|
110
105
|
if ((0, _dateFns.isValid)(startDate) && !hasTime(start)) {
|
111
|
-
// console.log('Ajustando início do dia');
|
112
106
|
startDate = (0, _dateFns.startOfDay)(startDate);
|
113
107
|
}
|
114
108
|
let endDate = (0, _dateFns.parseISO)(end);
|
115
109
|
if ((0, _dateFns.isValid)(endDate) && !hasTime(end)) {
|
116
|
-
// console.log('Ajustando fim do dia');
|
117
110
|
endDate = (0, _dateFns.endOfDay)(endDate);
|
118
111
|
}
|
119
112
|
simpleWhere[1] = {
|
120
113
|
[_sequelize.Op.between]: [startDate, endDate]
|
121
114
|
};
|
122
|
-
|
123
|
-
// console.log('Condição entre processada:', simpleWhere[1]);
|
124
115
|
}
|
125
116
|
if (cond.notBetween !== undefined) {
|
126
117
|
simpleWhere[1] = {
|
@@ -139,8 +130,6 @@ function processDateCondition(key, cond) {
|
|
139
130
|
}
|
140
131
|
return simpleWhere;
|
141
132
|
}
|
142
|
-
|
143
|
-
// Função Principal para Processar Filtros
|
144
133
|
function processFilters(filters) {
|
145
134
|
if (!filters) return {};
|
146
135
|
const where = {};
|
@@ -161,22 +150,15 @@ function processFilters(filters) {
|
|
161
150
|
} else {
|
162
151
|
const field = key;
|
163
152
|
const isDate = condition.type && condition.type === 'DATE';
|
164
|
-
// const isTime = condition.type && condition.type === 'TIME';
|
165
|
-
// const isDateTime = condition.type && condition.type === 'DATETIME';
|
166
|
-
|
167
153
|
if (isDate) {
|
168
154
|
const [k, c] = processDateCondition(key, condition);
|
169
155
|
where[k] = c;
|
170
156
|
} else {
|
171
157
|
const processedCondition = processCondition(condition, key);
|
172
|
-
|
173
|
-
// Se retornar um Sequelize.where (case insensitive para MariaDB), precisamos tratar diferente
|
174
158
|
if (processedCondition && typeof processedCondition === 'object' && processedCondition.comparator) {
|
175
|
-
// É um Sequelize.where
|
176
159
|
where[_sequelize.Op.and] = where[_sequelize.Op.and] || [];
|
177
160
|
where[_sequelize.Op.and].push(processedCondition);
|
178
161
|
} else {
|
179
|
-
// Condição normal
|
180
162
|
if (where[field]) {
|
181
163
|
where[field] = {
|
182
164
|
...where[field],
|
@@ -9,18 +9,13 @@ var _path = _interopRequireDefault(require("path"));
|
|
9
9
|
var _stream = require("stream");
|
10
10
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
11
11
|
function _default(opts) {
|
12
|
-
// garante a pasta existir
|
13
12
|
const dir = _path.default.dirname(opts.destination);
|
14
13
|
(0, _fs.mkdirSync)(dir, {
|
15
14
|
recursive: true
|
16
15
|
});
|
17
|
-
|
18
|
-
// abre o arquivo em modo append
|
19
16
|
const stream = (0, _fs.createWriteStream)(opts.destination, {
|
20
17
|
flags: 'a'
|
21
18
|
});
|
22
|
-
|
23
|
-
// map dos níveis numéricos do pino
|
24
19
|
const levelMap = {
|
25
20
|
trace: 10,
|
26
21
|
debug: 20,
|
@@ -35,12 +30,10 @@ function _default(opts) {
|
|
35
30
|
write(chunk, _enc, cb) {
|
36
31
|
chunk = JSON.parse(chunk);
|
37
32
|
try {
|
38
|
-
// só grava se exatamente o nível desejado
|
39
33
|
if (chunk.level === onlyLevel) {
|
40
34
|
stream.write(JSON.stringify(chunk) + '\n');
|
41
35
|
}
|
42
36
|
} catch (e) {
|
43
|
-
// não atrapalha o fluxo de log
|
44
37
|
console.error('custom-target write error', e);
|
45
38
|
} finally {
|
46
39
|
cb();
|
package/lib/utils/phone.d.ts
CHANGED
@@ -1,22 +1,193 @@
|
|
1
|
+
/**
|
2
|
+
* Classe utilitária para manipulação e validação de números de telefone brasileiros.
|
3
|
+
*
|
4
|
+
* Esta classe utiliza a biblioteca `libphonenumber-js` para parsing e validação,
|
5
|
+
* oferecendo métodos para extrair componentes do telefone (DDI, DDD, nono dígito)
|
6
|
+
* e formatação em diferentes padrões.
|
7
|
+
*
|
8
|
+
* @example
|
9
|
+
* ```typescript
|
10
|
+
* // Criando uma instância com número brasileiro
|
11
|
+
* const phone = new Phone('(11) 99999-8888');
|
12
|
+
*
|
13
|
+
* // Verificando se é válido
|
14
|
+
* console.log(phone.isValidPhone()); // true
|
15
|
+
*
|
16
|
+
* // Obtendo componentes
|
17
|
+
* console.log(phone.getDDD()); // '11'
|
18
|
+
* console.log(phone.hasNine()); // true
|
19
|
+
*
|
20
|
+
* // Formatação
|
21
|
+
* console.log(phone.getMaskedPhone()); // '+55 (11) 9 9999-8888'
|
22
|
+
* console.log(phone.getPhone(false, true, true)); // '1199999888'
|
23
|
+
* ```
|
24
|
+
*
|
25
|
+
* @class Phone
|
26
|
+
* @version 1.0.0
|
27
|
+
* @author Exodus Framework
|
28
|
+
*/
|
1
29
|
declare class Phone {
|
2
30
|
private phone;
|
31
|
+
/** Código do país (DDI) */
|
3
32
|
private ddi;
|
33
|
+
/** Código de área (DDD) */
|
4
34
|
private ddd;
|
35
|
+
/** Nono dígito para celulares */
|
5
36
|
private nine;
|
37
|
+
/** Primeira parte do número (4 primeiros dígitos) */
|
6
38
|
private phonePart1;
|
39
|
+
/** Segunda parte do número (4 últimos dígitos) */
|
7
40
|
private phonePart2;
|
41
|
+
/** Indica se o número é válido */
|
8
42
|
private isValid;
|
43
|
+
/** Número limpo (apenas dígitos) */
|
9
44
|
private number;
|
45
|
+
/**
|
46
|
+
* Cria uma nova instância da classe Phone.
|
47
|
+
*
|
48
|
+
* @param phone - Número de telefone em qualquer formato (com ou sem máscara)
|
49
|
+
*
|
50
|
+
* @example
|
51
|
+
* ```typescript
|
52
|
+
* const phone1 = new Phone('11999998888');
|
53
|
+
* const phone2 = new Phone('(11) 99999-8888');
|
54
|
+
* const phone3 = new Phone('+55 11 99999-8888');
|
55
|
+
* ```
|
56
|
+
*/
|
10
57
|
constructor(phone: string);
|
58
|
+
/**
|
59
|
+
* Retorna o código do país (DDI).
|
60
|
+
*
|
61
|
+
* @returns O DDI do número (ex: '55' para Brasil)
|
62
|
+
*
|
63
|
+
* @example
|
64
|
+
* ```typescript
|
65
|
+
* const phone = new Phone('+55 11 99999-8888');
|
66
|
+
* console.log(phone.getDDI()); // '55'
|
67
|
+
* ```
|
68
|
+
*/
|
11
69
|
getDDI(): string;
|
70
|
+
/**
|
71
|
+
* Retorna o código de área (DDD).
|
72
|
+
*
|
73
|
+
* @returns O DDD do número (ex: '11' para São Paulo)
|
74
|
+
*
|
75
|
+
* @example
|
76
|
+
* ```typescript
|
77
|
+
* const phone = new Phone('(11) 99999-8888');
|
78
|
+
* console.log(phone.getDDD()); // '11'
|
79
|
+
* ```
|
80
|
+
*/
|
12
81
|
getDDD(): string;
|
82
|
+
/**
|
83
|
+
* Verifica se o número possui o nono dígito (celular).
|
84
|
+
*
|
85
|
+
* @returns true se possui o nono dígito, false caso contrário
|
86
|
+
*
|
87
|
+
* @example
|
88
|
+
* ```typescript
|
89
|
+
* const celular = new Phone('11999998888');
|
90
|
+
* const fixo = new Phone('1133334444');
|
91
|
+
* console.log(celular.hasNine()); // true
|
92
|
+
* console.log(fixo.hasNine()); // false
|
93
|
+
* ```
|
94
|
+
*/
|
13
95
|
hasNine(): boolean;
|
96
|
+
/**
|
97
|
+
* Retorna o número limpo (apenas dígitos).
|
98
|
+
*
|
99
|
+
* @returns Número sem formatação, apenas dígitos
|
100
|
+
*
|
101
|
+
* @example
|
102
|
+
* ```typescript
|
103
|
+
* const phone = new Phone('(11) 99999-8888');
|
104
|
+
* console.log(phone.getNumber()); // '11999998888'
|
105
|
+
* ```
|
106
|
+
*/
|
14
107
|
getNumber(): string;
|
108
|
+
/**
|
109
|
+
* Retorna o número formatado com máscara.
|
110
|
+
*
|
111
|
+
* @param ddi - Incluir DDI na formatação (padrão: true)
|
112
|
+
* @param ddd - Incluir DDD na formatação (padrão: true)
|
113
|
+
* @param nine - Incluir nono dígito na formatação (padrão: true)
|
114
|
+
* @returns Número formatado com máscara
|
115
|
+
*
|
116
|
+
* @example
|
117
|
+
* ```typescript
|
118
|
+
* const phone = new Phone('5511999998888');
|
119
|
+
* console.log(phone.getMaskedPhone()); // '+55 (11) 9 9999-8888'
|
120
|
+
* console.log(phone.getMaskedPhone(false)); // '(11) 9 9999-8888'
|
121
|
+
* console.log(phone.getMaskedPhone(true, false)); // '+55 9 9999-8888'
|
122
|
+
* ```
|
123
|
+
*/
|
15
124
|
getMaskedPhone(ddi?: boolean, ddd?: boolean, nine?: boolean): string;
|
125
|
+
/**
|
126
|
+
* Retorna o número sem formatação, incluindo apenas os componentes selecionados.
|
127
|
+
*
|
128
|
+
* @param ddi - Incluir DDI no resultado (padrão: true)
|
129
|
+
* @param ddd - Incluir DDD no resultado (padrão: true)
|
130
|
+
* @param nine - Incluir nono dígito no resultado (padrão: true)
|
131
|
+
* @returns Número sem formatação
|
132
|
+
*
|
133
|
+
* @example
|
134
|
+
* ```typescript
|
135
|
+
* const phone = new Phone('5511999998888');
|
136
|
+
* console.log(phone.getPhone()); // '5511999998888'
|
137
|
+
* console.log(phone.getPhone(false)); // '11999998888'
|
138
|
+
* console.log(phone.getPhone(false, true, false)); // '1199998888'
|
139
|
+
* ```
|
140
|
+
*/
|
16
141
|
getPhone(ddi?: boolean, ddd?: boolean, nine?: boolean): string;
|
142
|
+
/**
|
143
|
+
* Retorna a primeira parte do número (primeiros 4 dígitos após DDD/nono dígito).
|
144
|
+
*
|
145
|
+
* @returns Primeira parte do número
|
146
|
+
*
|
147
|
+
* @example
|
148
|
+
* ```typescript
|
149
|
+
* const phone = new Phone('11999998888');
|
150
|
+
* console.log(phone.getPhonePart1()); // '9999'
|
151
|
+
* ```
|
152
|
+
*/
|
17
153
|
getPhonePart1(): string;
|
154
|
+
/**
|
155
|
+
* Retorna a segunda parte do número (últimos 4 dígitos).
|
156
|
+
*
|
157
|
+
* @returns Segunda parte do número
|
158
|
+
*
|
159
|
+
* @example
|
160
|
+
* ```typescript
|
161
|
+
* const phone = new Phone('11999998888');
|
162
|
+
* console.log(phone.getPhonePart2()); // '8888'
|
163
|
+
* ```
|
164
|
+
*/
|
18
165
|
getPhonePart2(): string;
|
166
|
+
/**
|
167
|
+
* Retorna o número original fornecido no construtor.
|
168
|
+
*
|
169
|
+
* @returns Número original sem alterações
|
170
|
+
*
|
171
|
+
* @example
|
172
|
+
* ```typescript
|
173
|
+
* const phone = new Phone('(11) 99999-8888');
|
174
|
+
* console.log(phone.getOriginalPhone()); // '(11) 99999-8888'
|
175
|
+
* ```
|
176
|
+
*/
|
19
177
|
getOriginalPhone(): string;
|
178
|
+
/**
|
179
|
+
* Verifica se o número de telefone é válido.
|
180
|
+
*
|
181
|
+
* @returns true se o número é válido, false caso contrário
|
182
|
+
*
|
183
|
+
* @example
|
184
|
+
* ```typescript
|
185
|
+
* const validPhone = new Phone('11999998888');
|
186
|
+
* const invalidPhone = new Phone('123');
|
187
|
+
* console.log(validPhone.isValidPhone()); // true
|
188
|
+
* console.log(invalidPhone.isValidPhone()); // false
|
189
|
+
* ```
|
190
|
+
*/
|
20
191
|
isValidPhone(): boolean;
|
21
192
|
}
|
22
193
|
export default Phone;
|
package/lib/utils/phone.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"phone.d.ts","sourceRoot":"","sources":["../../src/utils/phone.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"phone.d.ts","sourceRoot":"","sources":["../../src/utils/phone.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,cAAM,KAAK;IAkCG,OAAO,CAAC,KAAK;IAjCzB,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAS;IAEpB,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAS;IAEpB,iCAAiC;IACjC,OAAO,CAAC,IAAI,CAAS;IAErB,qDAAqD;IACrD,OAAO,CAAC,UAAU,CAAS;IAE3B,kDAAkD;IAClD,OAAO,CAAC,UAAU,CAAS;IAE3B,kCAAkC;IAClC,OAAO,CAAC,OAAO,CAAU;IAEzB,oCAAoC;IACpC,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;;;;;;;;OAWG;gBACiB,KAAK,EAAE,MAAM;IA4CjC;;;;;;;;;;OAUG;IACI,MAAM;IAIb;;;;;;;;;;OAUG;IACI,MAAM;IAIb;;;;;;;;;;;;OAYG;IACI,OAAO;IAId;;;;;;;;;;OAUG;IACI,SAAS;IAIhB;;;;;;;;;;;;;;;OAeG;IACI,cAAc,CAAC,GAAG,UAAO,EAAE,GAAG,UAAO,EAAE,IAAI,UAAO;IAWzD;;;;;;;;;;;;;;;OAeG;IACI,QAAQ,CAAC,GAAG,UAAO,EAAE,GAAG,UAAO,EAAE,IAAI,UAAO;IAUnD;;;;;;;;;;OAUG;IACI,aAAa;IAIpB;;;;;;;;;;OAUG;IACI,aAAa;IAIpB;;;;;;;;;;OAUG;IACI,gBAAgB;IAIvB;;;;;;;;;;;;OAYG;IACI,YAAY,IAAI,OAAO;CAG/B;AAED,eAAe,KAAK,CAAC"}
|
package/lib/utils/phone.js
CHANGED
@@ -34,25 +34,12 @@ var _libphonenumberJs = require("libphonenumber-js");
|
|
34
34
|
* @author Exodus Framework
|
35
35
|
*/
|
36
36
|
class Phone {
|
37
|
-
/** Código do país (DDI) */
|
38
37
|
ddi;
|
39
|
-
|
40
|
-
/** Código de área (DDD) */
|
41
38
|
ddd;
|
42
|
-
|
43
|
-
/** Nono dígito para celulares */
|
44
39
|
nine;
|
45
|
-
|
46
|
-
/** Primeira parte do número (4 primeiros dígitos) */
|
47
40
|
phonePart1;
|
48
|
-
|
49
|
-
/** Segunda parte do número (4 últimos dígitos) */
|
50
41
|
phonePart2;
|
51
|
-
|
52
|
-
/** Indica se o número é válido */
|
53
42
|
isValid;
|
54
|
-
|
55
|
-
/** Número limpo (apenas dígitos) */
|
56
43
|
number;
|
57
44
|
|
58
45
|
/**
|
@@ -69,45 +56,31 @@ class Phone {
|
|
69
56
|
*/
|
70
57
|
constructor(phone) {
|
71
58
|
this.phone = phone;
|
72
|
-
// Remove todos os caracteres não numéricos
|
73
59
|
this.number = phone.replace(/\D/g, '');
|
74
|
-
|
75
|
-
// Utiliza libphonenumber-js para parsing do número brasileiro
|
76
60
|
const parsed = (0, _libphonenumberJs.parsePhoneNumberFromString)(this.number, 'BR');
|
77
61
|
this.isValid = !!parsed;
|
78
|
-
|
79
|
-
// Se não foi possível fazer o parse, marca como inválido
|
80
62
|
if (!parsed) {
|
81
63
|
this.isValid = false;
|
82
64
|
return;
|
83
65
|
}
|
84
|
-
|
85
|
-
// Extrai o DDI (código do país)
|
86
66
|
this.ddi = parsed.countryCallingCode;
|
87
|
-
|
88
|
-
// Processa baseado no tamanho do número nacional
|
89
67
|
if (parsed.nationalNumber.length > 10) {
|
90
|
-
// Celular com DDD e nono dígito (11 dígitos)
|
91
68
|
this.ddd = parsed.nationalNumber.slice(0, 2);
|
92
69
|
this.nine = parsed.nationalNumber[2];
|
93
70
|
this.phonePart1 = parsed.nationalNumber.slice(3, 7);
|
94
71
|
this.phonePart2 = parsed.nationalNumber.slice(7, parsed.nationalNumber.length);
|
95
72
|
} else if (parsed.nationalNumber.length == 10) {
|
96
|
-
// Telefone fixo com DDD (10 dígitos)
|
97
73
|
this.ddd = parsed.nationalNumber.slice(0, 2);
|
98
74
|
this.phonePart1 = parsed.nationalNumber.slice(2, 6);
|
99
75
|
this.phonePart2 = parsed.nationalNumber.slice(6, parsed.nationalNumber.length);
|
100
76
|
} else if (parsed.nationalNumber.length >= 9) {
|
101
|
-
// Celular sem DDD mas com nono dígito (9 dígitos)
|
102
77
|
this.nine = parsed.nationalNumber[0];
|
103
78
|
this.phonePart1 = parsed.nationalNumber.slice(1, 5);
|
104
79
|
this.phonePart2 = parsed.nationalNumber.slice(5, parsed.nationalNumber.length);
|
105
80
|
} else if (parsed.nationalNumber.length == 8) {
|
106
|
-
// Telefone fixo sem DDD (8 dígitos)
|
107
81
|
this.phonePart1 = parsed.nationalNumber.slice(0, 4);
|
108
82
|
this.phonePart2 = parsed.nationalNumber.slice(4, parsed.nationalNumber.length);
|
109
83
|
} else {
|
110
|
-
// Número inválido
|
111
84
|
this.isValid = false;
|
112
85
|
}
|
113
86
|
}
|