@jmlq/logger 0.1.0-alpha.2 → 0.1.0-alpha.21
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 +639 -0
- package/architecture.md +193 -0
- package/assets/mongo-log.png +0 -0
- package/assets/pg-log.png +0 -0
- package/dist/application/factory/index.d.ts +1 -0
- package/dist/{config → application/factory}/index.js +1 -2
- package/dist/application/factory/logger.factory.d.ts +11 -0
- package/dist/application/factory/logger.factory.js +71 -0
- package/dist/application/index.d.ts +2 -0
- package/dist/{presentation → application}/index.js +1 -0
- package/dist/application/types/index.d.ts +1 -0
- package/dist/application/types/index.js +17 -0
- package/dist/application/types/logger-factory-config.type.d.ts +28 -0
- package/dist/{config/interfaces/index.js → application/types/logger-factory-config.type.js} +0 -1
- package/dist/application/use-cases/flush-buffers.use-case.d.ts +6 -0
- package/dist/application/use-cases/flush-buffers.use-case.js +13 -0
- package/dist/application/use-cases/get-logs.use-case.d.ts +8 -0
- package/dist/application/use-cases/get-logs.use-case.js +24 -0
- package/dist/application/use-cases/index.d.ts +3 -0
- package/dist/application/use-cases/index.js +19 -0
- package/dist/application/use-cases/save-log/index.d.ts +1 -0
- package/dist/application/use-cases/save-log/index.js +17 -0
- package/dist/application/use-cases/save-log/save-log.props.d.ts +7 -0
- package/dist/application/use-cases/save-log/save-log.props.js +2 -0
- package/dist/application/use-cases/save-log.use-case.d.ts +8 -0
- package/dist/application/use-cases/save-log.use-case.js +27 -0
- package/dist/domain/index.d.ts +7 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/model/index.d.ts +3 -0
- package/dist/domain/model/index.js +19 -0
- package/dist/domain/model/log-entry.model.d.ts +8 -0
- package/dist/domain/model/log-entry.model.js +2 -0
- package/dist/domain/model/pii-options.model.d.ts +8 -0
- package/dist/domain/model/pii-options.model.js +2 -0
- package/dist/domain/model/pii-replacement-rule.d.ts +5 -0
- package/dist/domain/model/pii-replacement-rule.js +2 -0
- package/dist/domain/ports/create-logger-options.port.d.ts +7 -0
- package/dist/domain/ports/create-logger-options.port.js +2 -0
- package/dist/domain/ports/index.d.ts +4 -0
- package/dist/domain/ports/index.js +20 -0
- package/dist/domain/ports/log-datasource.port.d.ts +10 -0
- package/dist/domain/ports/log-datasource.port.js +2 -0
- package/dist/domain/ports/logger.port.d.ts +15 -0
- package/dist/domain/ports/logger.port.js +2 -0
- package/dist/domain/ports/pii-redactor.port.d.ts +5 -0
- package/dist/domain/ports/pii-redactor.port.js +2 -0
- package/dist/domain/request/index.d.ts +1 -0
- package/dist/domain/request/index.js +17 -0
- package/dist/domain/request/log-filter.request.d.ts +9 -0
- package/dist/domain/request/log-filter.request.js +2 -0
- package/dist/domain/response/index.d.ts +1 -0
- package/dist/domain/response/index.js +17 -0
- package/dist/domain/response/log.response.d.ts +8 -0
- package/dist/domain/response/log.response.js +2 -0
- package/dist/domain/services/index.d.ts +1 -1
- package/dist/domain/services/index.js +1 -1
- package/dist/domain/services/pii-redactor.service.d.ts +10 -0
- package/dist/domain/services/pii-redactor.service.js +68 -0
- package/dist/domain/types/index.d.ts +1 -0
- package/dist/domain/types/index.js +17 -0
- package/dist/domain/types/log-message.type.d.ts +1 -0
- package/dist/domain/types/log-message.type.js +2 -0
- package/dist/domain/utils/index.d.ts +3 -0
- package/dist/domain/utils/index.js +19 -0
- package/dist/domain/utils/normalize-message.util.d.ts +3 -0
- package/dist/domain/utils/normalize-message.util.js +8 -0
- package/dist/domain/utils/parse-log-level.util.d.ts +2 -0
- package/dist/domain/utils/parse-log-level.util.js +27 -0
- package/dist/domain/utils/pii-regex.util.d.ts +2 -0
- package/dist/domain/utils/pii-regex.util.js +13 -0
- package/dist/domain/value-objects/index.d.ts +1 -0
- package/dist/domain/value-objects/index.js +17 -0
- package/dist/domain/value-objects/log-level.vo.d.ts +8 -0
- package/dist/domain/value-objects/log-level.vo.js +13 -0
- package/dist/index.d.ts +9 -4
- package/dist/index.js +32 -7
- package/dist/infrastructure/index.d.ts +1 -0
- package/dist/infrastructure/index.js +17 -0
- package/dist/infrastructure/services/datasource.service.d.ts +18 -0
- package/dist/infrastructure/services/datasource.service.js +102 -0
- package/dist/infrastructure/services/index.d.ts +1 -0
- package/dist/infrastructure/services/index.js +17 -0
- package/dist/infrastructure/types/index.d.ts +1 -0
- package/dist/infrastructure/types/index.js +17 -0
- package/dist/infrastructure/types/on-data-source-error.type.d.ts +5 -0
- package/dist/infrastructure/types/on-data-source-error.type.js +2 -0
- package/package.json +37 -11
- package/dist/Composite/index.d.ts +0 -9
- package/dist/Composite/index.js +0 -54
- package/dist/Factory/index.d.ts +0 -5
- package/dist/Factory/index.js +0 -23
- package/dist/config/index.d.ts +0 -2
- package/dist/config/interfaces/index.d.ts +0 -67
- package/dist/config/types/index.d.ts +0 -10
- package/dist/config/types/index.js +0 -13
- package/dist/domain/services/pii-redactor.d.ts +0 -27
- package/dist/domain/services/pii-redactor.js +0 -139
- package/dist/interfaces/index.d.ts +0 -35
- package/dist/interfaces/index.js +0 -13
- package/dist/presentation/factory/index.d.ts +0 -2
- package/dist/presentation/factory/index.js +0 -74
- package/dist/presentation/index.d.ts +0 -1
package/architecture.md
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Arquitectura del Paquete @jmlq/logger
|
|
2
|
+
|
|
3
|
+
## Visión General
|
|
4
|
+
|
|
5
|
+
El paquete `@jmlq/logger` implementa **Clean Architecture** (Arquitectura Limpia), proporcionando un sistema de logging modular que permite registrar logs en múltiples destinos y enmascarar datos sensibles (PII).
|
|
6
|
+
|
|
7
|
+
### Principios Aplicados
|
|
8
|
+
|
|
9
|
+
- **Separación de responsabilidades**: Cada capa tiene una función específica
|
|
10
|
+
- **Inversión de dependencias**: Las capas internas no conocen las externas
|
|
11
|
+
- **Extensibilidad**: Sistema de plugins para diferentes adaptadores
|
|
12
|
+
- **Testabilidad**: Contratos claros facilitan las pruebas
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Estructura de Capas
|
|
17
|
+
|
|
18
|
+
### 📁 Domain (Capa de Dominio)
|
|
19
|
+
|
|
20
|
+
_La capa más interna - lógica de negocio pura_
|
|
21
|
+
|
|
22
|
+
#### **Value Objects**
|
|
23
|
+
|
|
24
|
+
- [`log-level.vo.ts`](src/domain/value-objects/log-level.vo.ts): Enumeración de niveles de logging (TRACE, DEBUG, INFO, WARN, ERROR, FATAL)
|
|
25
|
+
|
|
26
|
+
#### **Models**
|
|
27
|
+
|
|
28
|
+
- [`log-entry.model.ts`](src/domain/model/log-entry.model.ts): Estructura de datos de un log
|
|
29
|
+
- [`pii-options.model.ts`](src/domain/model/pii-options.model.ts): Configuración para enmascarado PII
|
|
30
|
+
- [`pii-replacement-rule.ts`](src/domain/model/pii-replacement-rule.ts): Reglas de reemplazo para datos sensibles
|
|
31
|
+
|
|
32
|
+
#### **Ports (Contratos)**
|
|
33
|
+
|
|
34
|
+
- [`logger.port.ts`](src/domain/ports/logger.port.ts): Interfaz principal del logger (`ILogger`)
|
|
35
|
+
- [`log-datasource.port.ts`](src/domain/ports/log-datasource.port.ts): Contrato para persistencia (`ILogDatasource`)
|
|
36
|
+
- [`pii-redactor.port.ts`](src/domain/ports/pii-redactor.port.ts): Contrato para enmascarado (`IPiiRedactor`)
|
|
37
|
+
- [`create-logger-options.port.ts`](src/domain/ports/create-logger-options.port.ts): Configuración del factory
|
|
38
|
+
|
|
39
|
+
#### **Services (Servicios de Dominio)**
|
|
40
|
+
|
|
41
|
+
- [`pii-redactor.service.ts`](src/domain/services/pii-redactor.service.ts): Implementación del enmascarado de datos sensibles
|
|
42
|
+
|
|
43
|
+
#### **Request/Response**
|
|
44
|
+
|
|
45
|
+
- [`log-filter.request.ts`](src/domain/request/log-filter.request.ts): Filtros para consultas (`LogFilterRequest`)
|
|
46
|
+
- [`log.response.ts`](src/domain/response/log.response.ts): Formato de respuesta (`ILogResponse`)
|
|
47
|
+
|
|
48
|
+
#### **Types & Utils**
|
|
49
|
+
|
|
50
|
+
- [`log-message.type.ts`](src/domain/types/log-message.type.ts): Tipo para mensajes de log
|
|
51
|
+
- [`normalize-message.util.ts`](src/domain/utils/normalize-message.util.ts): Normalización de mensajes
|
|
52
|
+
- [`parse-log-level.util.ts`](src/domain/utils/parse-log-level.util.ts): Conversión de strings a LogLevel
|
|
53
|
+
- [`pii-regex.util.ts`](src/domain/utils/pii-regex.util.ts): Generación de expresiones regulares para PII
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### 📁 Application (Capa de Aplicación)
|
|
58
|
+
|
|
59
|
+
_Orquesta casos de uso y coordina la lógica de negocio_
|
|
60
|
+
|
|
61
|
+
#### **Factory**
|
|
62
|
+
|
|
63
|
+
- [`logger.factory.ts`](src/application/factory/logger.factory.ts): **Punto de entrada principal** - crea instancias del logger con configuración completa
|
|
64
|
+
|
|
65
|
+
#### **Use Cases**
|
|
66
|
+
|
|
67
|
+
- [`save-log.use-case.ts`](src/application/use-cases/save-log.use-case.ts): Guarda logs aplicando filtros y PII
|
|
68
|
+
- [`get-logs.use-case.ts`](src/application/use-cases/get-logs.use-case.ts): Recupera logs con filtros avanzados
|
|
69
|
+
- [`flush-buffers.use-case.ts`](src/application/use-cases/flush-buffers.use-case.ts): Vacía buffers de los datasources
|
|
70
|
+
|
|
71
|
+
#### **Dependencies**
|
|
72
|
+
|
|
73
|
+
- [`save-log.props.ts`](src/application/use-cases/save-log/save-log.props.ts): Dependencias para SaveLogUseCase
|
|
74
|
+
|
|
75
|
+
#### **Types**
|
|
76
|
+
|
|
77
|
+
- [`logger-factory-config.type.ts`](src/application/types/logger-factory-config.type.ts): Configuración del factory (`ILoggerFactoryConfig`)
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### 📁 Infrastructure (Capa de Infraestructura)
|
|
82
|
+
|
|
83
|
+
_Implementaciones concretas y adaptadores externos_
|
|
84
|
+
|
|
85
|
+
#### **Services**
|
|
86
|
+
|
|
87
|
+
- [`datasource.service.ts`](src/infrastructure/services/datasource.service.ts): Implementación del patrón Composite para múltiples datasources
|
|
88
|
+
|
|
89
|
+
#### **Types**
|
|
90
|
+
|
|
91
|
+
- [`on-data-source-error.type.ts`](src/infrastructure/types/on-data-source-error.type.ts): Manejo de errores de datasources
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Flujo de Dependencias
|
|
96
|
+
|
|
97
|
+
```txt
|
|
98
|
+
Infrastructure → Application → Domain
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
- **Domain**: Contiene la lógica pura, sin dependencias externas
|
|
102
|
+
- **Application**: Usa el Domain, coordina casos de uso
|
|
103
|
+
- **Infrastructure**: Implementa contratos del Domain
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Patrones Implementados
|
|
108
|
+
|
|
109
|
+
### **Factory Pattern**
|
|
110
|
+
|
|
111
|
+
[`logger.factory.ts`](src/application/factory/logger.factory.ts) centraliza la creación del logger y sus dependencias.
|
|
112
|
+
|
|
113
|
+
### **Port-Adapter Pattern**
|
|
114
|
+
|
|
115
|
+
Los ports en Domain definen contratos implementados por adaptadores externos (plugins).
|
|
116
|
+
|
|
117
|
+
### **Use Case Pattern**
|
|
118
|
+
|
|
119
|
+
Cada operación principal tiene un caso de uso con método `execute()`.
|
|
120
|
+
|
|
121
|
+
### **Composite Pattern**
|
|
122
|
+
|
|
123
|
+
[`datasource.service.ts`](src/infrastructure/services/datasource.service.ts) maneja múltiples datasources como uno solo.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Características Principales
|
|
128
|
+
|
|
129
|
+
### **Niveles de Log**
|
|
130
|
+
|
|
131
|
+
- `TRACE` (10), `DEBUG` (20), `INFO` (30), `WARN` (40), `ERROR` (50), `FATAL` (60)
|
|
132
|
+
- Configuración de nivel mínimo por entorno
|
|
133
|
+
|
|
134
|
+
### **Enmascarado PII**
|
|
135
|
+
|
|
136
|
+
- Patrones configurables para emails, tarjetas, teléfonos, etc.
|
|
137
|
+
- Procesamiento profundo en objetos anidados
|
|
138
|
+
- Whitelist/blacklist de campos
|
|
139
|
+
|
|
140
|
+
### **Múltiples Datasources**
|
|
141
|
+
|
|
142
|
+
- Soporte simultáneo para archivos, MongoDB, PostgreSQL
|
|
143
|
+
- Fan-out automático a todos los datasources configurados
|
|
144
|
+
|
|
145
|
+
### **Sistema de Plugins**
|
|
146
|
+
|
|
147
|
+
- **Filesystem**: `@jmlq/logger-plugin-fs`
|
|
148
|
+
- **MongoDB**: `@jmlq/logger-plugin-mongo`
|
|
149
|
+
- **PostgreSQL**: `@jmlq/logger-plugin-postgresql`
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Punto de Entrada
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
import { createLogger } from "@jmlq/logger";
|
|
157
|
+
|
|
158
|
+
const logger = createLogger({
|
|
159
|
+
datasources: [fsAdapter, mongoAdapter],
|
|
160
|
+
minLevel: LogLevel.INFO,
|
|
161
|
+
redactorOptions: {
|
|
162
|
+
enabled: true,
|
|
163
|
+
patterns: [
|
|
164
|
+
/* reglas PII */
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
await logger.info("User logged in", { userId: "123" });
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Flujo de Datos
|
|
175
|
+
|
|
176
|
+
1. **Cliente** → llama método del logger (`info`, `error`, etc.)
|
|
177
|
+
2. **Factory** → crea logger con casos de uso configurados
|
|
178
|
+
3. **SaveLogUseCase** → aplica filtros de nivel y PII
|
|
179
|
+
4. **DataSourceService** → distribuye a múltiples datasources
|
|
180
|
+
5. **Plugins** → persisten en destino final (archivo, BD, etc.)
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Testing
|
|
185
|
+
|
|
186
|
+
La arquitectura facilita testing mediante:
|
|
187
|
+
|
|
188
|
+
- Interfaces bien definidas para mocking
|
|
189
|
+
- Casos de uso aislados
|
|
190
|
+
- Servicios desacoplados
|
|
191
|
+
- Inyección de dependencias explícita
|
|
192
|
+
|
|
193
|
+
Esta arquitectura asegura **mantenibilidad**, **extensibilidad** y **testabilidad** siguiendo principios SOLID y Clean Architecture.
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./logger.factory";
|
|
@@ -14,5 +14,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
18
|
-
__exportStar(require("./types"), exports);
|
|
17
|
+
__exportStar(require("./logger.factory"), exports);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ILogger } from "../../domain/ports";
|
|
2
|
+
import { ILoggerFactoryConfig } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Factory principal de @jmlq/logger.
|
|
5
|
+
* Se encarga de:
|
|
6
|
+
* - Componer datasources (fan-out si hay varios)
|
|
7
|
+
* - Construir el redactor de PII
|
|
8
|
+
* - Instanciar y conectar los casos de uso
|
|
9
|
+
* - Exponer un servicio de logger de alto nivel
|
|
10
|
+
*/
|
|
11
|
+
export declare function createLogger(config: ILoggerFactoryConfig, source?: string): ILogger;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLogger = createLogger;
|
|
4
|
+
const value_objects_1 = require("../../domain/value-objects");
|
|
5
|
+
const pii_redactor_service_1 = require("../../domain/services/pii-redactor.service");
|
|
6
|
+
const services_1 = require("../../infrastructure/services");
|
|
7
|
+
const use_cases_1 = require("../use-cases");
|
|
8
|
+
/**
|
|
9
|
+
* Factory principal de @jmlq/logger.
|
|
10
|
+
* Se encarga de:
|
|
11
|
+
* - Componer datasources (fan-out si hay varios)
|
|
12
|
+
* - Construir el redactor de PII
|
|
13
|
+
* - Instanciar y conectar los casos de uso
|
|
14
|
+
* - Exponer un servicio de logger de alto nivel
|
|
15
|
+
*/
|
|
16
|
+
function createLogger(config, source = "app-logger") {
|
|
17
|
+
// 1) Normalizar config
|
|
18
|
+
const minLevel = config.minLevel ?? value_objects_1.LogLevel.INFO;
|
|
19
|
+
const datasources = Array.isArray(config.datasources)
|
|
20
|
+
? config.datasources
|
|
21
|
+
: [config.datasources];
|
|
22
|
+
// 2) Componer datasource (si hay varios) con DataSourceService
|
|
23
|
+
const ds = datasources.length === 1
|
|
24
|
+
? datasources[0]
|
|
25
|
+
: new services_1.DataSourceService(datasources);
|
|
26
|
+
// 3) Crear/usar redactor de PII
|
|
27
|
+
const redactor = config.redactor ?? new pii_redactor_service_1.PiiRedactor(config.redactorOptions);
|
|
28
|
+
// 4) Construir casos de uso de Application
|
|
29
|
+
const saveLogUseCase = new use_cases_1.SaveLogUseCase({
|
|
30
|
+
ds,
|
|
31
|
+
minLevel,
|
|
32
|
+
redactor,
|
|
33
|
+
});
|
|
34
|
+
const getLogsUseCase = new use_cases_1.GetLogsUseCase(ds);
|
|
35
|
+
const flushBuffersUseCase = new use_cases_1.FlushBuffersUseCase(ds);
|
|
36
|
+
// 5) Construir facade de servicio de logging
|
|
37
|
+
const service = {
|
|
38
|
+
// Método genérico de logging
|
|
39
|
+
async log(level, message, meta) {
|
|
40
|
+
await saveLogUseCase.execute("app-logger", level, message, meta);
|
|
41
|
+
},
|
|
42
|
+
// Helpers por nivel
|
|
43
|
+
trace(message, meta) {
|
|
44
|
+
return saveLogUseCase.execute(source, value_objects_1.LogLevel.TRACE, message, meta);
|
|
45
|
+
},
|
|
46
|
+
debug(message, meta) {
|
|
47
|
+
return saveLogUseCase.execute(source, value_objects_1.LogLevel.DEBUG, message, meta);
|
|
48
|
+
},
|
|
49
|
+
info(message, meta) {
|
|
50
|
+
return saveLogUseCase.execute(source, value_objects_1.LogLevel.INFO, message, meta);
|
|
51
|
+
},
|
|
52
|
+
warn(message, meta) {
|
|
53
|
+
return saveLogUseCase.execute(source, value_objects_1.LogLevel.WARN, message, meta);
|
|
54
|
+
},
|
|
55
|
+
error(message, meta) {
|
|
56
|
+
return saveLogUseCase.execute(source, value_objects_1.LogLevel.ERROR, message, meta);
|
|
57
|
+
},
|
|
58
|
+
fatal(message, meta) {
|
|
59
|
+
return saveLogUseCase.execute(source, value_objects_1.LogLevel.FATAL, message, meta);
|
|
60
|
+
},
|
|
61
|
+
// Lectura de logs con filtros
|
|
62
|
+
async getLogs(filter) {
|
|
63
|
+
return getLogsUseCase.execute(filter);
|
|
64
|
+
},
|
|
65
|
+
// Flush explícito (si el datasource lo soporta)
|
|
66
|
+
async flush() {
|
|
67
|
+
await flushBuffersUseCase.execute();
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
return service;
|
|
71
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./logger-factory-config.type";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./logger-factory-config.type"), exports);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ILogDatasource, IPiiRedactor } from "../../domain/ports";
|
|
2
|
+
import { PiiOptions } from "../../domain/model";
|
|
3
|
+
import { LogLevel } from "../../domain/value-objects";
|
|
4
|
+
/**
|
|
5
|
+
* Configuración de alto nivel para construir el logger.
|
|
6
|
+
* Es lo que recibe el usuario del paquete npm.
|
|
7
|
+
*/
|
|
8
|
+
export interface ILoggerFactoryConfig {
|
|
9
|
+
/**
|
|
10
|
+
* Datasource(s) concretos donde se van a persistir los logs.
|
|
11
|
+
* Pueden venir uno o varios; si hay más de uno se compone con DataSourceService (fan-out).
|
|
12
|
+
*/
|
|
13
|
+
datasources: ILogDatasource | ILogDatasource[];
|
|
14
|
+
/**
|
|
15
|
+
* Nivel mínimo de logging. Por defecto: INFO.
|
|
16
|
+
*/
|
|
17
|
+
minLevel?: LogLevel;
|
|
18
|
+
/**
|
|
19
|
+
* Instancia de redactor de PII personalizada.
|
|
20
|
+
* Si no se proporciona, se creará internamente un PiiRedactor con las opciones dadas.
|
|
21
|
+
*/
|
|
22
|
+
redactor?: IPiiRedactor;
|
|
23
|
+
/**
|
|
24
|
+
* Opciones para el redactor de PII interno.
|
|
25
|
+
* Solo se usan si no se pasa `redactor` explícito.
|
|
26
|
+
*/
|
|
27
|
+
redactorOptions?: PiiOptions;
|
|
28
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FlushBuffersUseCase = void 0;
|
|
4
|
+
class FlushBuffersUseCase {
|
|
5
|
+
constructor(ds) {
|
|
6
|
+
this.ds = ds;
|
|
7
|
+
}
|
|
8
|
+
async execute() {
|
|
9
|
+
// flush es opcional; si no está implementado, no hace nada
|
|
10
|
+
await this.ds.flush?.();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.FlushBuffersUseCase = FlushBuffersUseCase;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ILogDatasource } from "../../domain/ports";
|
|
2
|
+
import { LogFilterRequest } from "../../domain/request";
|
|
3
|
+
import { ILogResponse } from "../../domain/response";
|
|
4
|
+
export declare class GetLogsUseCase {
|
|
5
|
+
private readonly ds;
|
|
6
|
+
constructor(ds: ILogDatasource);
|
|
7
|
+
execute(filter?: LogFilterRequest): Promise<ILogResponse[]>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GetLogsUseCase = void 0;
|
|
4
|
+
class GetLogsUseCase {
|
|
5
|
+
constructor(ds) {
|
|
6
|
+
this.ds = ds;
|
|
7
|
+
}
|
|
8
|
+
async execute(filter) {
|
|
9
|
+
if (!this.ds.find)
|
|
10
|
+
return []; // si el datasource no lo soporta, retorna vacío
|
|
11
|
+
// Sanitiza límites (evita valores negativos o absurdos)
|
|
12
|
+
const safe = filter
|
|
13
|
+
? {
|
|
14
|
+
...filter,
|
|
15
|
+
limit: filter.limit && filter.limit > 0
|
|
16
|
+
? Math.min(filter.limit, 5000)
|
|
17
|
+
: undefined,
|
|
18
|
+
offset: filter.offset && filter.offset >= 0 ? filter.offset : undefined,
|
|
19
|
+
}
|
|
20
|
+
: undefined;
|
|
21
|
+
return this.ds.find(safe);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.GetLogsUseCase = GetLogsUseCase;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./save-log.use-case"), exports);
|
|
18
|
+
__exportStar(require("./get-logs.use-case"), exports);
|
|
19
|
+
__exportStar(require("./flush-buffers.use-case"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./save-log.props";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./save-log.props"), exports);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LogMessage } from "../../domain/types";
|
|
2
|
+
import { LogLevel } from "../../domain/value-objects";
|
|
3
|
+
import { SaveLogDependencies } from "./save-log";
|
|
4
|
+
export declare class SaveLogUseCase {
|
|
5
|
+
private readonly props;
|
|
6
|
+
constructor(props: SaveLogDependencies);
|
|
7
|
+
execute(source: string, level: LogLevel, message: LogMessage, meta?: unknown): Promise<void>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SaveLogUseCase = void 0;
|
|
4
|
+
const utils_1 = require("../../domain/utils");
|
|
5
|
+
class SaveLogUseCase {
|
|
6
|
+
constructor(props) {
|
|
7
|
+
this.props = props;
|
|
8
|
+
}
|
|
9
|
+
async execute(source, level, message, meta) {
|
|
10
|
+
// 1) Filtro por nivel (evita hacer trabajo innecesario)
|
|
11
|
+
if (level < this.props.minLevel)
|
|
12
|
+
return; // no se loggea
|
|
13
|
+
// 2) Normalización + PII
|
|
14
|
+
const normalized = (0, utils_1.normalizeMessage)(message, this.props.redactor);
|
|
15
|
+
// 3) Construcción del evento
|
|
16
|
+
const log = {
|
|
17
|
+
source,
|
|
18
|
+
level,
|
|
19
|
+
message: normalized,
|
|
20
|
+
meta: meta === undefined ? undefined : this.props.redactor.redact(meta),
|
|
21
|
+
timestamp: Date.now(),
|
|
22
|
+
};
|
|
23
|
+
// 4) Persistencia (fan-out lo maneja el ds si es composite)
|
|
24
|
+
await this.props.ds.save(log);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.SaveLogUseCase = SaveLogUseCase;
|
package/dist/domain/index.d.ts
CHANGED
package/dist/domain/index.js
CHANGED
|
@@ -14,4 +14,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./ports"), exports);
|
|
18
|
+
__exportStar(require("./request"), exports);
|
|
19
|
+
__exportStar(require("./response"), exports);
|
|
17
20
|
__exportStar(require("./services"), exports);
|
|
21
|
+
__exportStar(require("./types"), exports);
|
|
22
|
+
__exportStar(require("./value-objects"), exports);
|
|
23
|
+
__exportStar(require("./model"), exports);
|
|
24
|
+
__exportStar(require("./utils"), exports);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./log-entry.model"), exports);
|
|
18
|
+
__exportStar(require("./pii-options.model"), exports);
|
|
19
|
+
__exportStar(require("./pii-replacement-rule"), exports);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./log-datasource.port"), exports);
|
|
18
|
+
__exportStar(require("./logger.port"), exports);
|
|
19
|
+
__exportStar(require("./pii-redactor.port"), exports);
|
|
20
|
+
__exportStar(require("./create-logger-options.port"), exports);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LogEntry } from "../model";
|
|
2
|
+
import { LogFilterRequest } from "../request";
|
|
3
|
+
import { ILogResponse } from "../response";
|
|
4
|
+
export interface ILogDatasource {
|
|
5
|
+
save(log: LogEntry): Promise<void>;
|
|
6
|
+
find?(filter?: LogFilterRequest): Promise<ILogResponse[]>;
|
|
7
|
+
flush?(): Promise<void>;
|
|
8
|
+
dispose?(): Promise<void>;
|
|
9
|
+
readonly name?: string;
|
|
10
|
+
}
|