@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.
Files changed (102) hide show
  1. package/README.md +639 -0
  2. package/architecture.md +193 -0
  3. package/assets/mongo-log.png +0 -0
  4. package/assets/pg-log.png +0 -0
  5. package/dist/application/factory/index.d.ts +1 -0
  6. package/dist/{config → application/factory}/index.js +1 -2
  7. package/dist/application/factory/logger.factory.d.ts +11 -0
  8. package/dist/application/factory/logger.factory.js +71 -0
  9. package/dist/application/index.d.ts +2 -0
  10. package/dist/{presentation → application}/index.js +1 -0
  11. package/dist/application/types/index.d.ts +1 -0
  12. package/dist/application/types/index.js +17 -0
  13. package/dist/application/types/logger-factory-config.type.d.ts +28 -0
  14. package/dist/{config/interfaces/index.js → application/types/logger-factory-config.type.js} +0 -1
  15. package/dist/application/use-cases/flush-buffers.use-case.d.ts +6 -0
  16. package/dist/application/use-cases/flush-buffers.use-case.js +13 -0
  17. package/dist/application/use-cases/get-logs.use-case.d.ts +8 -0
  18. package/dist/application/use-cases/get-logs.use-case.js +24 -0
  19. package/dist/application/use-cases/index.d.ts +3 -0
  20. package/dist/application/use-cases/index.js +19 -0
  21. package/dist/application/use-cases/save-log/index.d.ts +1 -0
  22. package/dist/application/use-cases/save-log/index.js +17 -0
  23. package/dist/application/use-cases/save-log/save-log.props.d.ts +7 -0
  24. package/dist/application/use-cases/save-log/save-log.props.js +2 -0
  25. package/dist/application/use-cases/save-log.use-case.d.ts +8 -0
  26. package/dist/application/use-cases/save-log.use-case.js +27 -0
  27. package/dist/domain/index.d.ts +7 -0
  28. package/dist/domain/index.js +7 -0
  29. package/dist/domain/model/index.d.ts +3 -0
  30. package/dist/domain/model/index.js +19 -0
  31. package/dist/domain/model/log-entry.model.d.ts +8 -0
  32. package/dist/domain/model/log-entry.model.js +2 -0
  33. package/dist/domain/model/pii-options.model.d.ts +8 -0
  34. package/dist/domain/model/pii-options.model.js +2 -0
  35. package/dist/domain/model/pii-replacement-rule.d.ts +5 -0
  36. package/dist/domain/model/pii-replacement-rule.js +2 -0
  37. package/dist/domain/ports/create-logger-options.port.d.ts +7 -0
  38. package/dist/domain/ports/create-logger-options.port.js +2 -0
  39. package/dist/domain/ports/index.d.ts +4 -0
  40. package/dist/domain/ports/index.js +20 -0
  41. package/dist/domain/ports/log-datasource.port.d.ts +10 -0
  42. package/dist/domain/ports/log-datasource.port.js +2 -0
  43. package/dist/domain/ports/logger.port.d.ts +15 -0
  44. package/dist/domain/ports/logger.port.js +2 -0
  45. package/dist/domain/ports/pii-redactor.port.d.ts +5 -0
  46. package/dist/domain/ports/pii-redactor.port.js +2 -0
  47. package/dist/domain/request/index.d.ts +1 -0
  48. package/dist/domain/request/index.js +17 -0
  49. package/dist/domain/request/log-filter.request.d.ts +9 -0
  50. package/dist/domain/request/log-filter.request.js +2 -0
  51. package/dist/domain/response/index.d.ts +1 -0
  52. package/dist/domain/response/index.js +17 -0
  53. package/dist/domain/response/log.response.d.ts +8 -0
  54. package/dist/domain/response/log.response.js +2 -0
  55. package/dist/domain/services/index.d.ts +1 -1
  56. package/dist/domain/services/index.js +1 -1
  57. package/dist/domain/services/pii-redactor.service.d.ts +10 -0
  58. package/dist/domain/services/pii-redactor.service.js +68 -0
  59. package/dist/domain/types/index.d.ts +1 -0
  60. package/dist/domain/types/index.js +17 -0
  61. package/dist/domain/types/log-message.type.d.ts +1 -0
  62. package/dist/domain/types/log-message.type.js +2 -0
  63. package/dist/domain/utils/index.d.ts +3 -0
  64. package/dist/domain/utils/index.js +19 -0
  65. package/dist/domain/utils/normalize-message.util.d.ts +3 -0
  66. package/dist/domain/utils/normalize-message.util.js +8 -0
  67. package/dist/domain/utils/parse-log-level.util.d.ts +2 -0
  68. package/dist/domain/utils/parse-log-level.util.js +27 -0
  69. package/dist/domain/utils/pii-regex.util.d.ts +2 -0
  70. package/dist/domain/utils/pii-regex.util.js +13 -0
  71. package/dist/domain/value-objects/index.d.ts +1 -0
  72. package/dist/domain/value-objects/index.js +17 -0
  73. package/dist/domain/value-objects/log-level.vo.d.ts +8 -0
  74. package/dist/domain/value-objects/log-level.vo.js +13 -0
  75. package/dist/index.d.ts +9 -4
  76. package/dist/index.js +32 -7
  77. package/dist/infrastructure/index.d.ts +1 -0
  78. package/dist/infrastructure/index.js +17 -0
  79. package/dist/infrastructure/services/datasource.service.d.ts +18 -0
  80. package/dist/infrastructure/services/datasource.service.js +102 -0
  81. package/dist/infrastructure/services/index.d.ts +1 -0
  82. package/dist/infrastructure/services/index.js +17 -0
  83. package/dist/infrastructure/types/index.d.ts +1 -0
  84. package/dist/infrastructure/types/index.js +17 -0
  85. package/dist/infrastructure/types/on-data-source-error.type.d.ts +5 -0
  86. package/dist/infrastructure/types/on-data-source-error.type.js +2 -0
  87. package/package.json +37 -11
  88. package/dist/Composite/index.d.ts +0 -9
  89. package/dist/Composite/index.js +0 -54
  90. package/dist/Factory/index.d.ts +0 -5
  91. package/dist/Factory/index.js +0 -23
  92. package/dist/config/index.d.ts +0 -2
  93. package/dist/config/interfaces/index.d.ts +0 -67
  94. package/dist/config/types/index.d.ts +0 -10
  95. package/dist/config/types/index.js +0 -13
  96. package/dist/domain/services/pii-redactor.d.ts +0 -27
  97. package/dist/domain/services/pii-redactor.js +0 -139
  98. package/dist/interfaces/index.d.ts +0 -35
  99. package/dist/interfaces/index.js +0 -13
  100. package/dist/presentation/factory/index.d.ts +0 -2
  101. package/dist/presentation/factory/index.js +0 -74
  102. package/dist/presentation/index.d.ts +0 -1
@@ -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("./interfaces"), exports);
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,2 @@
1
+ export * from "./factory";
2
+ export * from "./use-cases";
@@ -15,3 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./factory"), exports);
18
+ __exportStar(require("./use-cases"), exports);
@@ -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
+ }
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
- // ---- Contratos ----
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import { ILogDatasource } from "../../domain/ports";
2
+ export declare class FlushBuffersUseCase {
3
+ private readonly ds;
4
+ constructor(ds: ILogDatasource);
5
+ execute(): Promise<void>;
6
+ }
@@ -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,3 @@
1
+ export * from "./save-log.use-case";
2
+ export * from "./get-logs.use-case";
3
+ export * from "./flush-buffers.use-case";
@@ -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,7 @@
1
+ import { LogLevel } from "../../../domain/value-objects";
2
+ import { ILogDatasource, IPiiRedactor } from "../../../domain/ports";
3
+ export interface SaveLogDependencies {
4
+ ds: ILogDatasource;
5
+ minLevel: LogLevel;
6
+ redactor: IPiiRedactor;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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;
@@ -1 +1,8 @@
1
+ export * from "./ports";
2
+ export * from "./request";
3
+ export * from "./response";
1
4
  export * from "./services";
5
+ export * from "./types";
6
+ export * from "./value-objects";
7
+ export * from "./model";
8
+ export * from "./utils";
@@ -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,3 @@
1
+ export * from "./log-entry.model";
2
+ export * from "./pii-options.model";
3
+ export * from "./pii-replacement-rule";
@@ -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,8 @@
1
+ import { LogLevel } from "../value-objects";
2
+ export interface LogEntry {
3
+ source: string;
4
+ level: LogLevel;
5
+ message: string | Record<string, unknown>;
6
+ meta?: unknown;
7
+ timestamp: number;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ import { PiiReplacementRule } from ".";
2
+ export interface PiiOptions {
3
+ enabled?: boolean;
4
+ whitelistKeys?: string[];
5
+ blacklistKeys?: string[];
6
+ patterns?: PiiReplacementRule[];
7
+ deep?: boolean;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ export interface PiiReplacementRule {
2
+ pattern: string;
3
+ flags?: string;
4
+ replaceWith: string;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ import { PiiOptions } from "../model";
2
+ import { LogLevel } from "../value-objects";
3
+ export interface ICreateLoggerOptions {
4
+ minLevel?: LogLevel;
5
+ redactPII?: boolean;
6
+ pii?: PiiOptions;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export * from "./log-datasource.port";
2
+ export * from "./logger.port";
3
+ export * from "./pii-redactor.port";
4
+ export * from "./create-logger-options.port";
@@ -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
+ }