@jmlq/logger 0.1.0-alpha.20 → 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/architecture.md CHANGED
@@ -2,69 +2,95 @@
2
2
 
3
3
  ## Visión General
4
4
 
5
- El paquete `@jmlq/logger` está diseñado siguiendo los principios de **Arquitectura Limpia**, proporcionando un sistema de logging extensible y desacoplado que permite registrar logs en múltiples destinos mediante plugins y soporta enmascarado de datos sensibles (PII - Personally Identifiable Information).
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
6
 
7
- ## Principios de Diseño
7
+ ### Principios Aplicados
8
8
 
9
- - **Separación de responsabilidades**: Cada capa tiene una responsabilidad específica
10
- - **Inversión de dependencias**: Las capas internas no dependen de las externas
11
- - **Extensibilidad**: Sistema de plugins para diferentes adaptadores de persistencia
12
- - **Testabilidad**: Arquitectura que facilita la creación de pruebas unitarias
13
- - **Configurabilidad**: Múltiples opciones de configuración mediante variables de entorno
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
+ ---
14
15
 
15
16
  ## Estructura de Capas
16
17
 
17
18
  ### 📁 Domain (Capa de Dominio)
18
19
 
19
- La capa más interna que contiene la lógica de negocio pura, sin dependencias externas.
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)
20
25
 
21
- #### **Entities & Value Objects**
26
+ #### **Models**
22
27
 
23
- - [`LogLevelVo`](src/domain/value-objects/log-level.vo.ts): Objeto de valor que representa los niveles de log
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
24
31
 
25
- #### **Ports (Interfaces)**
32
+ #### **Ports (Contratos)**
26
33
 
27
- - [`ILoggerPort`](src/domain/ports/logger.port.ts): Contrato principal del logger
28
- - [`ILogDatasourcePort`](src/domain/ports/log-datasource.port.ts): Contrato para fuentes de datos
29
- - [`ILoggerServicePort`](src/domain/ports/logger-service.port.ts): Contrato para servicios de logging
30
- - [`IPiiRedactorPort`](src/domain/ports/pii-redactor.port.ts): Contrato para enmascarado PII
31
- - [`ILoggerFactoryConfigPort`](src/domain/ports/logger-factory-config.port.ts): Contrato de configuración del factory
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
32
38
 
33
39
  #### **Services (Servicios de Dominio)**
34
40
 
35
- - [`LogLevelService`](src/domain/services/log-level.service.ts): Lógica para manejo de niveles de log
36
- - [`MessageNormalizerService`](src/domain/services/message-normalizer.service.ts): Normalización de mensajes
37
- - [`PiiPatternService`](src/domain/services/pii-pattern.service.ts): Gestión de patrones PII
38
- - [`PiiRedactorService`](src/domain/services/pii-redactor.service.ts): Enmascarado de datos sensibles
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`)
39
47
 
40
- #### **Types & DTOs**
48
+ #### **Types & Utils**
41
49
 
42
- - **Request**: [`SaveLogProps`](src/domain/request/save-log.props.ts), [`GetLogsFilterProps`](src/domain/request/get-logs-filter.props.ts), [`PiiOptionsProps`](src/domain/request/pii-options.props.ts)
43
- - **Response**: [`LogResponse`](src/domain/response/log.response.ts)
44
- - **Types**: [`LogMessageType`](src/domain/types/log-message.type.ts)
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
+ ---
45
56
 
46
57
  ### 📁 Application (Capa de Aplicación)
47
58
 
48
- Orquesta la lógica de negocio y coordina los casos de uso.
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
49
64
 
50
65
  #### **Use Cases**
51
66
 
52
- - [`SaveLogUseCase`](src/application/use-cases/save-log.use-case.ts): Guarda logs en los datasources configurados
53
- - [`GetLogsUseCase`](src/application/use-cases/get-logs.use-case.ts): Recupera logs con filtros
54
- - [`FlushBuffersUseCase`](src/application/use-cases/flush-buffers.use-case.ts): Vacía buffers de los datasources
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
55
70
 
56
- #### **Factory**
71
+ #### **Dependencies**
57
72
 
58
- - [`LoggerFactory`](src/application/factory/logger.factory.ts): Factory para crear instancias del logger
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
+ ---
59
80
 
60
81
  ### 📁 Infrastructure (Capa de Infraestructura)
61
82
 
62
- Implementaciones concretas de los contratos definidos en el dominio.
83
+ _Implementaciones concretas y adaptadores externos_
63
84
 
64
85
  #### **Services**
65
86
 
66
- - [`DatasourceService`](src/infrastructure/services/datasource.service.ts): Implementación del servicio de datasource
67
- - [`DataSourceErrorHandlerType`](src/infrastructure/services/data-source-error-handler.type.ts): Manejo de errores de datasources
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
+ ---
68
94
 
69
95
  ## Flujo de Dependencias
70
96
 
@@ -72,100 +98,96 @@ Implementaciones concretas de los contratos definidos en el dominio.
72
98
  Infrastructure → Application → Domain
73
99
  ```
74
100
 
75
- - **Domain**: No depende de nada, contiene la lógica de negocio pura
76
- - **Application**: Depende solo del Domain, orquesta los casos de uso
77
- - **Infrastructure**: Depende del Domain y Application, implementa los contratos
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
+ ---
78
106
 
79
107
  ## Patrones Implementados
80
108
 
81
109
  ### **Factory Pattern**
82
110
 
83
- El [`LoggerFactory`](src/application/factory/logger.factory.ts) centraliza la creación de instancias del logger con las configuraciones apropiadas.
111
+ [`logger.factory.ts`](src/application/factory/logger.factory.ts) centraliza la creación del logger y sus dependencias.
84
112
 
85
113
  ### **Port-Adapter Pattern**
86
114
 
87
- Los ports en el domain definen contratos que son implementados por adaptadores en infrastructure.
115
+ Los ports en Domain definen contratos implementados por adaptadores externos (plugins).
88
116
 
89
117
  ### **Use Case Pattern**
90
118
 
91
- Cada operación principal está encapsulada en un caso de uso específico con un método `execute()`.
119
+ Cada operación principal tiene un caso de uso con método `execute()`.
92
120
 
93
- ### **Dependency Injection**
121
+ ### **Composite Pattern**
94
122
 
95
- Las dependencias se inyectan a través de constructores, facilitando el testing y la flexibilidad.
123
+ [`datasource.service.ts`](src/infrastructure/services/datasource.service.ts) maneja múltiples datasources como uno solo.
96
124
 
97
- ## Sistema de Plugins
98
-
99
- El logger soporta múltiples adaptadores de persistencia:
100
-
101
- - **Filesystem**: `@jmlq/logger-plugin-fs`
102
- - **MongoDB**: `@jmlq/logger-plugin-mongo`
103
- - **PostgreSQL**: `@jmlq/logger-plugin-postgresql`
104
-
105
- Cada plugin implementa los ports definidos en el domain.
125
+ ---
106
126
 
107
127
  ## Características Principales
108
128
 
109
- ### **PII (Personally Identifiable Information)**
110
-
111
- - Enmascarado automático de datos sensibles
112
- - Patrones configurables y extensibles
113
- - Soporte para patrones por defecto y personalizados
114
-
115
129
  ### **Niveles de Log**
116
130
 
117
- - debug, info, warn, error, fatal
131
+ - `TRACE` (10), `DEBUG` (20), `INFO` (30), `WARN` (40), `ERROR` (50), `FATAL` (60)
118
132
  - Configuración de nivel mínimo por entorno
119
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
+
120
140
  ### **Múltiples Datasources**
121
141
 
122
- - Soporte simultáneo para múltiples backends
123
- - Configuración opcional de cada adaptador
142
+ - Soporte simultáneo para archivos, MongoDB, PostgreSQL
143
+ - Fan-out automático a todos los datasources configurados
144
+
145
+ ### **Sistema de Plugins**
124
146
 
125
- ### **Configuración Flexible**
147
+ - **Filesystem**: `@jmlq/logger-plugin-fs`
148
+ - **MongoDB**: `@jmlq/logger-plugin-mongo`
149
+ - **PostgreSQL**: `@jmlq/logger-plugin-postgresql`
126
150
 
127
- - Variables de entorno
128
- - Configuración programática
129
- - Políticas de retención de datos
151
+ ---
130
152
 
131
- ## Ejemplo de Uso
153
+ ## Punto de Entrada
132
154
 
133
155
  ```typescript
134
- import { LoggerBootstrap } from "@jmlq/logger";
156
+ import { createLogger } from "@jmlq/logger";
135
157
 
136
- const logger = await LoggerBootstrap.create({
137
- minLevel: "debug",
138
- pii: {
158
+ const logger = createLogger({
159
+ datasources: [fsAdapter, mongoAdapter],
160
+ minLevel: LogLevel.INFO,
161
+ redactorOptions: {
139
162
  enabled: true,
140
- includeDefaults: true,
141
- deep: true,
142
- },
143
- adapters: {
144
- fs: { basePath: "./logs" },
145
- mongo: { url: "mongodb://localhost:27017", dbName: "logs" },
163
+ patterns: [
164
+ /* reglas PII */
165
+ ],
146
166
  },
147
167
  });
148
168
 
149
- await logger.info("User logged in", {
150
- userId: "12345",
151
- email: "user@example.com",
152
- });
169
+ await logger.info("User logged in", { userId: "123" });
153
170
  ```
154
171
 
155
- ## Testing
172
+ ---
173
+
174
+ ## Flujo de Datos
156
175
 
157
- La arquitectura facilita el testing mediante:
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.)
158
181
 
159
- > - Interfaces claramente definidas
160
- > - Servicios desacoplados
161
- > - Casos de uso aislados
162
- > - Mocks sencillos de implementar
182
+ ---
183
+
184
+ ## Testing
163
185
 
164
- ## Consideraciones de Rendimiento
186
+ La arquitectura facilita testing mediante:
165
187
 
166
- > - Buffers para escritura asíncrona
167
- > - Políticas de rotación de archivos
168
- > - Retención configurable de datos
169
- > - Procesamiento asíncrono de logs
188
+ - Interfaces bien definidas para mocking
189
+ - Casos de uso aislados
190
+ - Servicios desacoplados
191
+ - Inyección de dependencias explícita
170
192
 
171
- Esta arquitectura asegura mantenibilidad, extensibilidad y testabilidad del sistema de logging, siguiendo las mejores prácticas de clean architecture.
193
+ Esta arquitectura asegura **mantenibilidad**, **extensibilidad** y **testabilidad** siguiendo principios SOLID y Clean Architecture.
Binary file
Binary file
@@ -1,4 +1,5 @@
1
- import { ILoggerFactoryConfig, ILogger } from "../../domain/ports";
1
+ import { ILogger } from "../../domain/ports";
2
+ import { ILoggerFactoryConfig } from "../types";
2
3
  /**
3
4
  * Factory principal de @jmlq/logger.
4
5
  * Se encarga de:
@@ -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);
@@ -1,6 +1,6 @@
1
- import { ILogDatasource, IPiiRedactor } from ".";
2
- import { PiiOptions } from "../model";
3
- import { LogLevel } from "../value-objects";
1
+ import { ILogDatasource, IPiiRedactor } from "../../domain/ports";
2
+ import { PiiOptions } from "../../domain/model";
3
+ import { LogLevel } from "../../domain/value-objects";
4
4
  /**
5
5
  * Configuración de alto nivel para construir el logger.
6
6
  * Es lo que recibe el usuario del paquete npm.
@@ -2,4 +2,3 @@ export * from "./log-datasource.port";
2
2
  export * from "./logger.port";
3
3
  export * from "./pii-redactor.port";
4
4
  export * from "./create-logger-options.port";
5
- export * from "./logger-factory-config.port";
@@ -18,5 +18,3 @@ __exportStar(require("./log-datasource.port"), exports);
18
18
  __exportStar(require("./logger.port"), exports);
19
19
  __exportStar(require("./pii-redactor.port"), exports);
20
20
  __exportStar(require("./create-logger-options.port"), exports);
21
- __exportStar(require("./logger-factory-config.port"), exports);
22
- // export * from "./logger-service.port";
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { createLogger } from "./application/factory";
2
- export type { ILogger, ILoggerFactoryConfig, ILogDatasource, } from "./domain/ports";
2
+ export type { ILoggerFactoryConfig } from "./application/types";
3
+ export type { ILogger, ILogDatasource } from "./domain/ports";
3
4
  export { LogLevel } from "./domain/value-objects";
4
5
  export type { LogFilterRequest as LogSearchRequest } from "./domain/request";
5
6
  export type { ILogResponse as LogRecord } from "./domain/response";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jmlq/logger",
3
3
  "description": "logger package with clean architecture",
4
- "version": "0.1.0-alpha.20",
4
+ "version": "0.1.0-alpha.21",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
@@ -40,6 +40,6 @@
40
40
  "dist",
41
41
  "README.md",
42
42
  "architecture.md",
43
- "install.md"
43
+ "assets"
44
44
  ]
45
45
  }