@jmlq/logger 0.1.0-alpha.11 → 0.1.0-alpha.12

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 (125) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.js +20 -0
  3. package/package.json +5 -2
  4. package/dist/examples/data-source-service.example.d.ts +0 -3
  5. package/dist/examples/data-source-service.example.js +0 -174
  6. package/dist/examples/flush-buffers-use-case.example.d.ts +0 -3
  7. package/dist/examples/flush-buffers-use-case.example.js +0 -60
  8. package/dist/examples/get-logs-use-case.example.d.ts +0 -3
  9. package/dist/examples/get-logs-use-case.example.js +0 -110
  10. package/dist/examples/index.example.d.ts +0 -8
  11. package/dist/examples/index.example.js +0 -116
  12. package/dist/examples/logger-factory.example.d.ts +0 -39
  13. package/dist/examples/logger-factory.example.js +0 -158
  14. package/dist/examples/normalize-message.example.d.ts +0 -3
  15. package/dist/examples/normalize-message.example.js +0 -80
  16. package/dist/examples/pii-redactor.example.d.ts +0 -3
  17. package/dist/examples/pii-redactor.example.js +0 -129
  18. package/dist/examples/save-log-use-case.example.d.ts +0 -3
  19. package/dist/examples/save-log-use-case.example.js +0 -150
  20. package/dist/examples/to-log-level.example.d.ts +0 -3
  21. package/dist/examples/to-log-level.example.js +0 -49
  22. package/dist/examples/to-pii-regex.example.d.ts +0 -3
  23. package/dist/examples/to-pii-regex.example.js +0 -75
  24. package/dist/src/application/factory/create-logger.d.ts +0 -2
  25. package/dist/src/application/factory/create-logger.js +0 -29
  26. package/dist/src/domain/services/pii-redactor.d.ts +0 -10
  27. package/dist/src/domain/services/pii-redactor.js +0 -68
  28. package/dist/src/index.d.ts +0 -6
  29. package/dist/src/index.js +0 -22
  30. package/dist/src/infrastructure/datasources/in-memory-log.datasource.d.ts +0 -1
  31. package/dist/src/infrastructure/datasources/in-memory-log.datasource.js +0 -2
  32. package/dist/src/infrastructure/datasources/index.d.ts +0 -1
  33. package/dist/src/infrastructure/datasources/index.js +0 -17
  34. package/dist/tests/application/factory/logger-factory.spec.d.ts +0 -1
  35. package/dist/tests/application/factory/logger-factory.spec.js +0 -161
  36. package/dist/tests/application/use-cases/flush-buffers.use-case.spec.d.ts +0 -1
  37. package/dist/tests/application/use-cases/flush-buffers.use-case.spec.js +0 -38
  38. package/dist/tests/application/use-cases/get-logs.use-case.spec.d.ts +0 -1
  39. package/dist/tests/application/use-cases/get-logs.use-case.spec.js +0 -114
  40. package/dist/tests/application/use-cases/save-log.use-case.spec.d.ts +0 -1
  41. package/dist/tests/application/use-cases/save-log.use-case.spec.js +0 -138
  42. package/dist/tests/domain/services/log-level.service.spec.d.ts +0 -1
  43. package/dist/tests/domain/services/log-level.service.spec.js +0 -68
  44. package/dist/tests/domain/services/normalize-message.spec.d.ts +0 -1
  45. package/dist/tests/domain/services/normalize-message.spec.js +0 -83
  46. package/dist/tests/domain/services/pii-redactor.spec.d.ts +0 -1
  47. package/dist/tests/domain/services/pii-redactor.spec.js +0 -170
  48. package/dist/tests/domain/services/to-pii-regex.spec.d.ts +0 -1
  49. package/dist/tests/domain/services/to-pii-regex.spec.js +0 -82
  50. package/dist/tests/infrastructure/services/datasource.service.spec.d.ts +0 -1
  51. package/dist/tests/infrastructure/services/datasource.service.spec.js +0 -128
  52. package/dist/tests/test-utils/create-pii-redactor-mock.d.ts +0 -5
  53. package/dist/tests/test-utils/create-pii-redactor-mock.js +0 -10
  54. /package/dist/{src/application → application}/factory/index.d.ts +0 -0
  55. /package/dist/{src/application → application}/factory/index.js +0 -0
  56. /package/dist/{src/application → application}/factory/logger.factory.d.ts +0 -0
  57. /package/dist/{src/application → application}/factory/logger.factory.js +0 -0
  58. /package/dist/{src/application → application}/index.d.ts +0 -0
  59. /package/dist/{src/application → application}/index.js +0 -0
  60. /package/dist/{src/application → application}/use-cases/flush-buffers.use-case.d.ts +0 -0
  61. /package/dist/{src/application → application}/use-cases/flush-buffers.use-case.js +0 -0
  62. /package/dist/{src/application → application}/use-cases/get-logs.use-case.d.ts +0 -0
  63. /package/dist/{src/application → application}/use-cases/get-logs.use-case.js +0 -0
  64. /package/dist/{src/application → application}/use-cases/index.d.ts +0 -0
  65. /package/dist/{src/application → application}/use-cases/index.js +0 -0
  66. /package/dist/{src/application → application}/use-cases/save-log.use-case.d.ts +0 -0
  67. /package/dist/{src/application → application}/use-cases/save-log.use-case.js +0 -0
  68. /package/dist/{src/domain → domain}/index.d.ts +0 -0
  69. /package/dist/{src/domain → domain}/index.js +0 -0
  70. /package/dist/{src/domain → domain}/ports/create-logger-options.port.d.ts +0 -0
  71. /package/dist/{src/domain → domain}/ports/create-logger-options.port.js +0 -0
  72. /package/dist/{src/domain → domain}/ports/index.d.ts +0 -0
  73. /package/dist/{src/domain → domain}/ports/index.js +0 -0
  74. /package/dist/{src/domain → domain}/ports/log-datasource.port.d.ts +0 -0
  75. /package/dist/{src/domain → domain}/ports/log-datasource.port.js +0 -0
  76. /package/dist/{src/domain → domain}/ports/logger-factory-config.port.d.ts +0 -0
  77. /package/dist/{src/domain → domain}/ports/logger-factory-config.port.js +0 -0
  78. /package/dist/{src/domain → domain}/ports/logger-service.port.d.ts +0 -0
  79. /package/dist/{src/domain → domain}/ports/logger-service.port.js +0 -0
  80. /package/dist/{src/domain → domain}/ports/logger.port.d.ts +0 -0
  81. /package/dist/{src/domain → domain}/ports/logger.port.js +0 -0
  82. /package/dist/{src/domain → domain}/ports/pii-redactor.port.d.ts +0 -0
  83. /package/dist/{src/domain → domain}/ports/pii-redactor.port.js +0 -0
  84. /package/dist/{src/domain → domain}/request/get-logs-filter.props.d.ts +0 -0
  85. /package/dist/{src/domain → domain}/request/get-logs-filter.props.js +0 -0
  86. /package/dist/{src/domain → domain}/request/index.d.ts +0 -0
  87. /package/dist/{src/domain → domain}/request/index.js +0 -0
  88. /package/dist/{src/domain → domain}/request/log.props.d.ts +0 -0
  89. /package/dist/{src/domain → domain}/request/log.props.js +0 -0
  90. /package/dist/{src/domain → domain}/request/pii-options.props.d.ts +0 -0
  91. /package/dist/{src/domain → domain}/request/pii-options.props.js +0 -0
  92. /package/dist/{src/domain → domain}/request/pii-replacement.props.d.ts +0 -0
  93. /package/dist/{src/domain → domain}/request/pii-replacement.props.js +0 -0
  94. /package/dist/{src/domain → domain}/request/save-log.props.d.ts +0 -0
  95. /package/dist/{src/domain → domain}/request/save-log.props.js +0 -0
  96. /package/dist/{src/domain → domain}/response/index.d.ts +0 -0
  97. /package/dist/{src/domain → domain}/response/index.js +0 -0
  98. /package/dist/{src/domain → domain}/response/log.response.d.ts +0 -0
  99. /package/dist/{src/domain → domain}/response/log.response.js +0 -0
  100. /package/dist/{src/domain → domain}/services/index.d.ts +0 -0
  101. /package/dist/{src/domain → domain}/services/index.js +0 -0
  102. /package/dist/{src/domain → domain}/services/log-level.service.d.ts +0 -0
  103. /package/dist/{src/domain → domain}/services/log-level.service.js +0 -0
  104. /package/dist/{src/domain → domain}/services/message-normalizer.service.d.ts +0 -0
  105. /package/dist/{src/domain → domain}/services/message-normalizer.service.js +0 -0
  106. /package/dist/{src/domain → domain}/services/pii-pattern.service.d.ts +0 -0
  107. /package/dist/{src/domain → domain}/services/pii-pattern.service.js +0 -0
  108. /package/dist/{src/domain → domain}/services/pii-redactor.service.d.ts +0 -0
  109. /package/dist/{src/domain → domain}/services/pii-redactor.service.js +0 -0
  110. /package/dist/{src/domain → domain}/types/index.d.ts +0 -0
  111. /package/dist/{src/domain → domain}/types/index.js +0 -0
  112. /package/dist/{src/domain → domain}/types/log-message.type.d.ts +0 -0
  113. /package/dist/{src/domain → domain}/types/log-message.type.js +0 -0
  114. /package/dist/{src/domain → domain}/value-objects/index.d.ts +0 -0
  115. /package/dist/{src/domain → domain}/value-objects/index.js +0 -0
  116. /package/dist/{src/domain → domain}/value-objects/log-level.vo.d.ts +0 -0
  117. /package/dist/{src/domain → domain}/value-objects/log-level.vo.js +0 -0
  118. /package/dist/{src/infrastructure → infrastructure}/index.d.ts +0 -0
  119. /package/dist/{src/infrastructure → infrastructure}/index.js +0 -0
  120. /package/dist/{src/infrastructure → infrastructure}/services/data-source-error-handler.type.d.ts +0 -0
  121. /package/dist/{src/infrastructure → infrastructure}/services/data-source-error-handler.type.js +0 -0
  122. /package/dist/{src/infrastructure → infrastructure}/services/datasource.service.d.ts +0 -0
  123. /package/dist/{src/infrastructure → infrastructure}/services/datasource.service.js +0 -0
  124. /package/dist/{src/infrastructure → infrastructure}/services/index.d.ts +0 -0
  125. /package/dist/{src/infrastructure → infrastructure}/services/index.js +0 -0
@@ -1,158 +0,0 @@
1
- "use strict";
2
- // examples/logger-factory.example.ts
3
- // Ajusta los imports según tu estructura real
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.LoggerFactoryExample = exports.InMemoryLogDatasource = void 0;
6
- const logger_factory_1 = require("../src/application/factory/logger.factory");
7
- const value_objects_1 = require("../src/domain/value-objects");
8
- /**
9
- * InMemoryLogDatasource
10
- *
11
- * Implementación **completa** y **visual** para demos, tests e integración.
12
- * Aplica todos los filtros definidos en IGetLogsFilterProps.
13
- */
14
- class InMemoryLogDatasource {
15
- constructor(name = "in-memory") {
16
- this.logs = [];
17
- this.idCounter = 1;
18
- this.name = name;
19
- }
20
- /**
21
- * 🔵 Guarda un log en memoria con un ID incremental.
22
- */
23
- async save(log) {
24
- this.logs.push({
25
- id: this.idCounter++,
26
- ...log,
27
- });
28
- }
29
- /**
30
- * 🔍 Aplica todos los filtros para recuperar logs:
31
- * - levelMin
32
- * - since / until
33
- * - query
34
- * - limit
35
- * - offset
36
- */
37
- async find(filter) {
38
- let results = [...this.logs];
39
- if (filter?.levelMin !== undefined) {
40
- results = results.filter((log) => log.level >= filter.levelMin);
41
- }
42
- if (filter?.since !== undefined) {
43
- results = results.filter((log) => log.timestamp >= filter.since);
44
- }
45
- if (filter?.until !== undefined) {
46
- results = results.filter((log) => log.timestamp <= filter.until);
47
- }
48
- if (filter?.query) {
49
- const q = filter.query.toLowerCase();
50
- results = results.filter((log) => {
51
- const msg = typeof log.message === "string"
52
- ? log.message.toLowerCase()
53
- : JSON.stringify(log.message).toLowerCase();
54
- return msg.includes(q);
55
- });
56
- }
57
- // Ordenar por timestamp ascendente (opcional pero útil para visualizar)
58
- results.sort((a, b) => a.timestamp - b.timestamp);
59
- // Paginación
60
- const offset = filter?.offset ?? 0;
61
- const limit = filter?.limit ?? results.length;
62
- return results.slice(offset, offset + limit);
63
- }
64
- /**
65
- * 🧹 Limpia todos los logs almacenados.
66
- */
67
- async flush() {
68
- this.logs = [];
69
- this.idCounter = 1;
70
- }
71
- /**
72
- * 🗑 Libera recursos (igual que flush, pero preparado para crecer).
73
- */
74
- async dispose() {
75
- await this.flush();
76
- }
77
- }
78
- exports.InMemoryLogDatasource = InMemoryLogDatasource;
79
- class LoggerFactoryExample {
80
- static async Main() {
81
- console.log("=== 🧪 Ejemplo real de uso: LoggerFactory ===\n");
82
- // -------------------------------------------------------------------------
83
- // 1️⃣ Crear datasources
84
- // -------------------------------------------------------------------------
85
- const dsA = new InMemoryLogDatasource();
86
- const dsB = new InMemoryLogDatasource();
87
- // -------------------------------------------------------------------------
88
- // 2️⃣ Construir logger vía Factory
89
- // -------------------------------------------------------------------------
90
- const logger = logger_factory_1.LoggerFactory.create({
91
- datasources: [dsA, dsB], // fan-out
92
- minLevel: value_objects_1.LogLevel.INFO, // DEBUG/TRACE serán ignorados
93
- redactorOptions: {
94
- enabled: true,
95
- deep: true,
96
- patterns: [
97
- {
98
- pattern: "\\b\\d{4}-\\d{4}-\\d{4}-\\d{4}\\b",
99
- replaceWith: "****-****-****-****",
100
- },
101
- {
102
- pattern: "[\\w.-]+@[\\w.-]+",
103
- replaceWith: "***@***",
104
- },
105
- ],
106
- },
107
- });
108
- console.log("✅ Logger creado correctamente.\n");
109
- // -------------------------------------------------------------------------
110
- // 3️⃣ Generar algunos logs de ejemplo
111
- // -------------------------------------------------------------------------
112
- console.log("→ DEBUG (no debe persistirse por minLevel=INFO)");
113
- await logger.debug("Debug interno que NO debería guardarse");
114
- console.log("→ INFO");
115
- await logger.info("Servicio iniciado correctamente");
116
- console.log("→ WARN");
117
- await logger.warn("Latencia alta en /api/orders", {
118
- endpoint: "/api/orders",
119
- durationMs: 987,
120
- });
121
- console.log("→ ERROR con PII en message + meta");
122
- await logger.error("Error al procesar tarjeta 4111-1111-1111-1111 para john.doe@example.com", {
123
- userId: "u-123",
124
- email: "john.doe@example.com",
125
- card: "4111-1111-1111-1111",
126
- nested: {
127
- phone: "0999999999",
128
- },
129
- });
130
- // -------------------------------------------------------------------------
131
- // 4️⃣ Consultar logs usando getLogs
132
- // -------------------------------------------------------------------------
133
- console.log("\n=== 📄 getLogs(): todos los logs ===");
134
- const all = await logger.getLogs();
135
- console.dir(all, { depth: 10 });
136
- console.log("\n=== 📄 getLogs({ levelMin: ERROR }) ===");
137
- const errors = await logger.getLogs({ levelMin: value_objects_1.LogLevel.ERROR });
138
- console.dir(errors, { depth: 10 });
139
- console.log("\n=== 📄 getLogs({ query: 'tarjeta' }) ===");
140
- const tarjeta = await logger.getLogs({ query: "tarjeta" });
141
- console.dir(tarjeta, { depth: 10 });
142
- // -------------------------------------------------------------------------
143
- // 5️⃣ Flush explícito (útil si algún datasource usa buffers / batch)
144
- // -------------------------------------------------------------------------
145
- console.log("\n=== 🧹 flush() ===");
146
- await logger.flush();
147
- console.log("Flush completado.\n");
148
- // -------------------------------------------------------------------------
149
- // 6️⃣ Ver estado interno de cada datasource (fan-out)
150
- // -------------------------------------------------------------------------
151
- console.log("\n=== 🗂 Logs en dsA (memory-A) ===");
152
- console.dir(await dsA.find(), { depth: 10 });
153
- console.log("\n=== 🗂 Logs en dsB (memory-B) ===");
154
- console.dir(await dsB.find(), { depth: 10 });
155
- console.log("\n✔ LoggerFactoryExample finalizado.\n");
156
- }
157
- }
158
- exports.LoggerFactoryExample = LoggerFactoryExample;
@@ -1,3 +0,0 @@
1
- export declare class NormalizeMessageExample {
2
- static Main(): void;
3
- }
@@ -1,80 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NormalizeMessageExample = void 0;
4
- const services_1 = require("src/domain/services");
5
- // -----------------------------------------------------------------------------
6
- // Mock simple de redactor PII para demostrar comportamiento real
7
- // En una aplicación real este sería reemplazado por un redactor robusto.
8
- // -----------------------------------------------------------------------------
9
- class SimplePiiRedactor {
10
- redact(value) {
11
- if (typeof value === "string") {
12
- // Ejemplo tonto: censura emails y números
13
- return value
14
- .replace(/\b[\w.-]+@[\w.-]+\.\w+\b/g, "[REDACTED_EMAIL]")
15
- .replace(/\d+/g, "[NUM]");
16
- }
17
- if (typeof value === "object" && value !== null) {
18
- const clone = {};
19
- for (const key of Object.keys(value)) {
20
- const v = value[key];
21
- clone[key] = typeof v === "string" ? v.replace(/\d+/g, "[NUM]") : v;
22
- }
23
- return clone;
24
- }
25
- return value;
26
- }
27
- }
28
- // -----------------------------------------------------------------------------
29
- // Clase Example tal como lo haría un cliente del paquete
30
- // -----------------------------------------------------------------------------
31
- class NormalizeMessageExample {
32
- static Main() {
33
- console.log("=== 🧩 Ejemplo de uso: normalizeMessage ===\n");
34
- const redactor = new SimplePiiRedactor();
35
- // -------------------------------------------------------------------------
36
- // 1️⃣ Mensaje de tipo string
37
- // -------------------------------------------------------------------------
38
- const msg1 = "Usuario juan@example.com realizó pago 12345";
39
- const norm1 = (0, services_1.normalizeMessage)(msg1, redactor);
40
- console.log("→ String redactado:");
41
- console.log(" Entrada:", msg1);
42
- console.log(" Salida:", norm1, "\n");
43
- // -------------------------------------------------------------------------
44
- // 2️⃣ Mensaje de tipo objeto
45
- // -------------------------------------------------------------------------
46
- const msg2 = {
47
- user: "john@example.com",
48
- amount: "1500",
49
- action: "login",
50
- };
51
- const norm2 = (0, services_1.normalizeMessage)(msg2, redactor);
52
- console.log("→ Objeto redactado:");
53
- console.log(" Entrada:", msg2);
54
- console.log(" Salida:", norm2, "\n");
55
- // -------------------------------------------------------------------------
56
- // 3️⃣ Mensaje como función (lazy evaluation)
57
- // -------------------------------------------------------------------------
58
- const msg3 = () => ({
59
- email: "cliente@test.com",
60
- phone: "0987654321",
61
- });
62
- const norm3 = (0, services_1.normalizeMessage)(msg3, redactor);
63
- console.log("→ Función perezosa redactada:");
64
- console.log(" Entrada: función que retorna datos sensibles");
65
- console.log(" Salida:", norm3, "\n");
66
- // -------------------------------------------------------------------------
67
- // 4️⃣ Escenario real de logging
68
- // -------------------------------------------------------------------------
69
- const logMessage = () => `Intento de acceso por usuario admin@example.com desde IP 192.168.50.10`;
70
- const result = (0, services_1.normalizeMessage)(logMessage, redactor);
71
- console.log("→ Caso real de logging:");
72
- console.log(" Log con PII:", result, "\n");
73
- console.log("=== ✔ Fin del ejemplo normalizeMessage ===");
74
- }
75
- }
76
- exports.NormalizeMessageExample = NormalizeMessageExample;
77
- // Ejecutar directamente: ts-node src/examples/normalize-message.example.ts
78
- if (require.main === module) {
79
- NormalizeMessageExample.Main();
80
- }
@@ -1,3 +0,0 @@
1
- export declare class PiiRedactorExample {
2
- static Main(): void;
3
- }
@@ -1,129 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PiiRedactorExample = void 0;
4
- const services_1 = require("../src/domain/services");
5
- class PiiRedactorExample {
6
- static Main() {
7
- console.log("=== 🔐 Ejemplo de uso: PiiRedactor ===\n");
8
- // -----------------------------------------------------------------------
9
- // 1️⃣ Definir patrones PII (emails, teléfonos, tarjetas)
10
- // -----------------------------------------------------------------------
11
- const patterns = [
12
- {
13
- pattern: "[\\w.-]+@[\\w.-]+\\.[A-Za-z]{2,}",
14
- replaceWith: "[EMAIL]",
15
- },
16
- {
17
- pattern: "\\b\\d{10}\\b", // teléfonos de 10 dígitos
18
- replaceWith: "[PHONE]",
19
- },
20
- {
21
- pattern: "\\b\\d{4}-\\d{4}-\\d{4}-\\d{4}\\b", // tarjeta simple
22
- replaceWith: "[CARD]",
23
- },
24
- ];
25
- const options = {
26
- enabled: true,
27
- deep: true,
28
- patterns,
29
- whitelistKeys: ["publicInfo"],
30
- blacklistKeys: ["password", "token"],
31
- };
32
- const redactor = new services_1.PiiRedactor(options);
33
- // -----------------------------------------------------------------------
34
- // 2️⃣ Redactar un string plano
35
- // -----------------------------------------------------------------------
36
- const rawText = "Usuario juan@example.com pagó con tarjeta 4111-1111-1111-1111 y llamó desde 0987654321";
37
- const redactedText = redactor.redact(rawText);
38
- console.log("→ String con PII:");
39
- console.log(" Entrada :", rawText);
40
- console.log(" Salida :", redactedText, "\n");
41
- // -----------------------------------------------------------------------
42
- // 3️⃣ Redactar un objeto anidado (deep=true)
43
- // -----------------------------------------------------------------------
44
- const rawObject = {
45
- userId: 123,
46
- email: "cliente@test.com",
47
- phone: "0987654321",
48
- password: "super-secret-password",
49
- token: "eyJhbGciOi...",
50
- publicInfo: "Este campo debe permanecer intacto 12345",
51
- profile: {
52
- address: "Calle Falsa 123",
53
- contact: {
54
- altEmail: "otro@test.com",
55
- altPhone: "0999999999",
56
- },
57
- },
58
- payments: [
59
- {
60
- card: "4111-1111-1111-1111",
61
- amount: "150",
62
- },
63
- ],
64
- };
65
- const clonedForComparison = JSON.parse(JSON.stringify(rawObject));
66
- const redactedObject = redactor.redact(rawObject);
67
- console.log("→ Objeto con PII (deep=true):");
68
- console.log(" Entrada (original):");
69
- console.log(JSON.stringify(clonedForComparison, null, 2));
70
- console.log("\n Salida (redactado):");
71
- console.log(JSON.stringify(redactedObject, null, 2));
72
- console.log("\n Verificación (no mutado):");
73
- console.log(" ¿Original === Clonado? ", JSON.stringify(rawObject) === JSON.stringify(clonedForComparison)
74
- ? "✅ Sin mutación visible"
75
- : "⚠ Cambió (revisar implementación)");
76
- console.log();
77
- // -----------------------------------------------------------------------
78
- // 4️⃣ Demostración de whitelistKeys y blacklistKeys
79
- // -----------------------------------------------------------------------
80
- console.log("→ Comportamiento con whitelist / blacklist:\n");
81
- console.log(" - whitelistKeys: publicInfo (no se toca)");
82
- console.log(" - blacklistKeys: password, token (se fuerza [REDACTED])\n");
83
- console.log(" Campo publicInfo :", redactedObject.publicInfo);
84
- console.log(" Campo password :", redactedObject.password);
85
- console.log(" Campo token :", redactedObject.token, "\n");
86
- // -----------------------------------------------------------------------
87
- // 5️⃣ Actualizar opciones en caliente (updateOptions)
88
- // -----------------------------------------------------------------------
89
- console.log("→ Actualizando opciones en caliente (updateOptions):\n");
90
- redactor.updateOptions({
91
- enabled: true,
92
- deep: false, // ahora no bajamos a objetos anidados
93
- patterns: [
94
- {
95
- pattern: "\\d+",
96
- replaceWith: "[NUM]",
97
- },
98
- ],
99
- });
100
- const afterUpdate = redactor.redact({
101
- level1: {
102
- innerCode: "12345",
103
- },
104
- topLevel: "Código 999",
105
- });
106
- console.log(" Entrada:");
107
- console.log(JSON.stringify({
108
- level1: { innerCode: "12345" },
109
- topLevel: "Código 999",
110
- }, null, 2));
111
- console.log("\n Salida con deep=false y patrón \\d+ → [NUM]:");
112
- console.log(JSON.stringify(afterUpdate, null, 2));
113
- console.log("\n Observa que 'topLevel' se redactor, pero 'level1.innerCode' no.");
114
- // -----------------------------------------------------------------------
115
- // 6️⃣ Desactivar el redactor (enabled=false)
116
- // -----------------------------------------------------------------------
117
- redactor.updateOptions({ enabled: false });
118
- const disabledResult = redactor.redact("Email test2@example.com y teléfono 0912345678");
119
- console.log("\n→ Redactor desactivado (enabled=false):");
120
- console.log(" Salida debe ser igual a la entrada:");
121
- console.log(" Resultado:", disabledResult, "\n");
122
- console.log("=== ✔ Fin del ejemplo PiiRedactor ===");
123
- }
124
- }
125
- exports.PiiRedactorExample = PiiRedactorExample;
126
- // Ejecución directa: ts-node / tsx examples/pii-redactor.example.ts
127
- if (require.main === module) {
128
- PiiRedactorExample.Main();
129
- }
@@ -1,3 +0,0 @@
1
- export declare class SaveLogUseCaseExample {
2
- static Main(): Promise<void>;
3
- }
@@ -1,150 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SaveLogUseCaseExample = void 0;
4
- const use_cases_1 = require("../src/application/use-cases");
5
- const value_objects_1 = require("../src/domain/value-objects");
6
- // -----------------------------------------------------------------------------
7
- // 1️⃣ Implementación simple de un IPiiRedactor con PII de ejemplo
8
- // - Redacta emails, tarjetas y teléfonos en strings
9
- // - Aplica redacción a strings dentro de objetos (meta) de forma superficial
10
- // -----------------------------------------------------------------------------
11
- class SimplePiiRedactor {
12
- redact(value) {
13
- if (typeof value === "string") {
14
- return this.redactString(value);
15
- }
16
- if (value && typeof value === "object") {
17
- // redacción superficial de propiedades string
18
- const clone = Array.isArray(value)
19
- ? [...value]
20
- : { ...value };
21
- for (const key of Object.keys(clone)) {
22
- const v = clone[key];
23
- if (typeof v === "string") {
24
- clone[key] = this.redactString(v);
25
- }
26
- }
27
- return clone;
28
- }
29
- // otros tipos se devuelven tal cual
30
- return value;
31
- }
32
- // Opcional: podrías implementar updateOptions si quieres hacerla configurable
33
- updateOptions() { }
34
- redactString(input) {
35
- return (input
36
- // tarjetas de crédito (muy simple)
37
- .replace(/\b\d{4}-\d{4}-\d{4}-\d{4}\b/g, "****-****-****-****")
38
- // emails
39
- .replace(/[\w.-]+@[\w.-]+/g, "***@***")
40
- // teléfonos simples (10 dígitos)
41
- .replace(/\b\d{10}\b/g, "**********"));
42
- }
43
- }
44
- // -----------------------------------------------------------------------------
45
- // 2️⃣ Implementación de un ILogDatasource en memoria con soporte de filtros
46
- // - save: guarda en un array interno
47
- // - find: aplica IGetLogsFilterProps (levelMin, since, until, query, limit, offset)
48
- // -----------------------------------------------------------------------------
49
- class InMemoryLogDatasource {
50
- constructor() {
51
- this.name = "in-memory";
52
- this.store = [];
53
- }
54
- async save(log) {
55
- this.store.push(log);
56
- }
57
- async find(filter) {
58
- let results = [...this.store];
59
- if (filter?.levelMin !== undefined) {
60
- results = results.filter((log) => log.level >= filter.levelMin);
61
- }
62
- if (filter?.since !== undefined) {
63
- results = results.filter((log) => log.timestamp >= filter.since);
64
- }
65
- if (filter?.until !== undefined) {
66
- results = results.filter((log) => log.timestamp <= filter.until);
67
- }
68
- if (filter?.query) {
69
- const q = filter.query.toLowerCase();
70
- results = results.filter((log) => {
71
- if (typeof log.message === "string") {
72
- return log.message.toLowerCase().includes(q);
73
- }
74
- return false;
75
- });
76
- }
77
- // paginación simple
78
- const offset = filter?.offset ?? 0;
79
- const limit = filter?.limit ?? results.length;
80
- return results.slice(offset, offset + limit);
81
- }
82
- }
83
- // -----------------------------------------------------------------------------
84
- // 3️⃣ Ejemplo de uso real de SaveLogUseCase
85
- // - Configura minLevel (filtro de entrada)
86
- // - Usa PII redactor en message + meta
87
- // - Demuestra búsquedas filtradas
88
- // -----------------------------------------------------------------------------
89
- class SaveLogUseCaseExample {
90
- static async Main() {
91
- console.log("\n=== 🧪 Ejemplo de uso: SaveLogUseCase ===\n");
92
- // 1) Creamos datasource + redactor
93
- const ds = new InMemoryLogDatasource();
94
- const redactor = new SimplePiiRedactor();
95
- // 2) Configuramos el caso de uso con un minLevel = INFO
96
- const useCase = new use_cases_1.SaveLogUseCase({
97
- ds,
98
- minLevel: value_objects_1.LogLevel.INFO,
99
- redactor,
100
- });
101
- console.log("📌 minLevel configurado en:", value_objects_1.LogLevel[value_objects_1.LogLevel.INFO], "\n");
102
- // 3) Intentamos loggear algo por debajo del umbral (DEBUG → debe ser ignorado)
103
- console.log("➖ Log DEBUG (debe SER IGNORADO por el filtro):");
104
- await useCase.execute(value_objects_1.LogLevel.DEBUG, "Debug interno con detalles que no queremos en producción");
105
- // 4) Log INFO simple, sin PII
106
- console.log("\n➕ Log INFO (debe SER GUARDADO):");
107
- await useCase.execute(value_objects_1.LogLevel.INFO, "Servicio iniciado correctamente");
108
- // 5) Log ERROR con PII en message y meta
109
- console.log("\n❌ Log ERROR con PII en message y meta (debe ser REDACTADO):");
110
- const rawMessage = "Error al procesar pago con tarjeta 4111-1111-1111-1111 del usuario john.doe@example.com";
111
- const metaConPii = {
112
- userId: "123",
113
- email: "john.doe@example.com",
114
- card: "4111-1111-1111-1111",
115
- phone: "0998765432",
116
- };
117
- await useCase.execute(value_objects_1.LogLevel.ERROR, rawMessage, metaConPii);
118
- // 6) Log WARN con PII solo en meta
119
- console.log("\n⚠ Log WARN con PII solo en meta:");
120
- await useCase.execute(value_objects_1.LogLevel.WARN, "Intento de acceso sospechoso", {
121
- ip: "192.168.0.10",
122
- email: "evil.hacker@example.com",
123
- });
124
- // 7) Consultamos todos los logs con level >= INFO
125
- console.log("\n📂 Recuperando logs con filtro: levelMin = INFO\n");
126
- const allInfoOrHigher = await ds.find({
127
- levelMin: value_objects_1.LogLevel.INFO,
128
- });
129
- console.log("➡ Resultado (level >= INFO):");
130
- console.dir(allInfoOrHigher, { depth: 5 });
131
- // 8) Consultamos solo errores que contengan la palabra "pago"
132
- console.log("\n📂 Recuperando logs con filtro: levelMin = ERROR, query = 'pago'\n");
133
- const errorPayments = await ds.find({
134
- levelMin: value_objects_1.LogLevel.ERROR,
135
- query: "pago",
136
- });
137
- console.log("➡ Resultado (ERROR + 'pago'):");
138
- console.dir(errorPayments, { depth: 5 });
139
- // 9) Consultamos logs con límite/paginación
140
- console.log("\n📂 Recuperando máximo 2 logs (limit = 2):\n");
141
- const limited = await ds.find({
142
- levelMin: value_objects_1.LogLevel.INFO,
143
- limit: 2,
144
- });
145
- console.log("➡ Resultado (primeros 2 logs):");
146
- console.dir(limited, { depth: 5 });
147
- console.log("\n✅ Ejemplo SaveLogUseCase finalizado.\n");
148
- }
149
- }
150
- exports.SaveLogUseCaseExample = SaveLogUseCaseExample;
@@ -1,3 +0,0 @@
1
- export declare class ToLogLevelExample {
2
- static Main(): void;
3
- }
@@ -1,49 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ToLogLevelExample = void 0;
4
- const domain_1 = require("src/domain");
5
- class ToLogLevelExample {
6
- static Main() {
7
- console.log("=== 🔎 Ejemplo de uso: toLogLevel ===\n");
8
- // ------------------------------------------------------------------------
9
- // 1️⃣ Conversión básica desde string
10
- // ------------------------------------------------------------------------
11
- console.log("→ Conversión desde strings:");
12
- const str1 = (0, domain_1.toLogLevel)("debug");
13
- const str2 = (0, domain_1.toLogLevel)("ERROR");
14
- const str3 = (0, domain_1.toLogLevel)("unknown"); // fallback
15
- console.log(` "debug" → ${str1}`);
16
- console.log(` "ERROR" → ${str2}`);
17
- console.log(` "unknown" → ${str3} (fallback)\n`);
18
- // ------------------------------------------------------------------------
19
- // 2️⃣ Conversión desde números
20
- // ------------------------------------------------------------------------
21
- console.log("→ Conversión desde números:");
22
- const num1 = (0, domain_1.toLogLevel)(domain_1.LogLevel.WARN);
23
- const num2 = (0, domain_1.toLogLevel)(999); // no existe → fallback
24
- console.log(` LogLevel.WARN → ${num1}`);
25
- console.log(` 999 → ${num2} (fallback)\n`);
26
- // ------------------------------------------------------------------------
27
- // 3️⃣ Uso del parámetro 'default'
28
- // ------------------------------------------------------------------------
29
- console.log("→ Uso de valor por defecto personalizado:");
30
- const def1 = (0, domain_1.toLogLevel)(undefined, domain_1.LogLevel.FATAL);
31
- const def2 = (0, domain_1.toLogLevel)("invalid", domain_1.LogLevel.DEBUG);
32
- console.log(` undefined, default FATAL → ${def1}`);
33
- console.log(` "invalid", default DEBUG → ${def2}\n`);
34
- // ------------------------------------------------------------------------
35
- // 4️⃣ Uso en un caso real (ejemplo típico)
36
- // ------------------------------------------------------------------------
37
- console.log("→ Caso real: leer LOG_LEVEL desde variables de entorno");
38
- const rawEnvLogLevel = process.env.LOG_LEVEL; // ej: "warn"
39
- const resolvedLevel = (0, domain_1.toLogLevel)(rawEnvLogLevel, domain_1.LogLevel.INFO);
40
- console.log(` LOG_LEVEL raw: ${rawEnvLogLevel}`);
41
- console.log(` LOG_LEVEL resolved: ${resolvedLevel}\n`);
42
- console.log("=== ✔ Fin del ejemplo toLogLevel ===");
43
- }
44
- }
45
- exports.ToLogLevelExample = ToLogLevelExample;
46
- // Ejecutar si se ejecuta directamente con ts-node/tsx
47
- if (require.main === module) {
48
- ToLogLevelExample.Main();
49
- }
@@ -1,3 +0,0 @@
1
- export declare class ToPiiRegexExample {
2
- static Main(): void;
3
- }
@@ -1,75 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ToPiiRegexExample = void 0;
4
- const services_1 = require("../src/domain/services");
5
- class ToPiiRegexExample {
6
- static Main() {
7
- console.log("=== 🔍 Ejemplo de uso: toPiiRegex ===\n");
8
- // -----------------------------------------------------------------------
9
- // 1️⃣ Crear un regex para detectar números (por ejemplo montos o IDs)
10
- // -----------------------------------------------------------------------
11
- const digitsRule = {
12
- pattern: "\\d+",
13
- replaceWith: "[NUM]",
14
- };
15
- const digitsRegex = (0, services_1.toPiiRegex)(digitsRule);
16
- console.log("→ Regla para números:");
17
- console.log(" Pattern:", digitsRule.pattern);
18
- console.log(" Flags:", digitsRegex.flags);
19
- console.log(" Regex generado:", digitsRegex);
20
- console.log(" Aplicación:", "Pedido 12345 procesado".replace(digitsRegex, digitsRule.replaceWith), "\n");
21
- // -----------------------------------------------------------------------
22
- // 2️⃣ Crear un regex para emails con flags personalizados
23
- // -----------------------------------------------------------------------
24
- const emailRule = {
25
- pattern: "[\\w.-]+@[\\w.-]+\\.[A-Za-z]{2,}",
26
- flags: "gi",
27
- replaceWith: "[EMAIL]",
28
- };
29
- const emailRegex = (0, services_1.toPiiRegex)(emailRule);
30
- console.log("→ Regla para emails:");
31
- console.log(" Pattern:", emailRule.pattern);
32
- console.log(" Flags:", emailRegex.flags);
33
- console.log(" Regex generado:", emailRegex);
34
- console.log(" Aplicación:", "Usuario juan@example.com inició sesión".replace(emailRegex, emailRule.replaceWith), "\n");
35
- // -----------------------------------------------------------------------
36
- // 3️⃣ Caso real: varias reglas aplicadas para redactor PII
37
- // -----------------------------------------------------------------------
38
- const rules = [
39
- {
40
- pattern: "\\d{10}", // teléfonos
41
- replaceWith: "[PHONE]",
42
- },
43
- {
44
- pattern: "[\\w.-]+@[\\w.-]+\\.[A-Za-z]{2,}",
45
- replaceWith: "[EMAIL]",
46
- },
47
- ];
48
- const sampleLog = "Cliente mario@test.com llamó desde 0987654321 para confirmar su pedido.";
49
- let redacted = sampleLog;
50
- for (const rule of rules) {
51
- const regex = (0, services_1.toPiiRegex)(rule);
52
- redacted = redacted.replace(regex, rule.replaceWith);
53
- }
54
- console.log("→ Caso real con múltiples reglas:");
55
- console.log(" Entrada:", sampleLog);
56
- console.log(" Salida:", redacted, "\n");
57
- // -----------------------------------------------------------------------
58
- // 4️⃣ Caso con patrón inválido (fallback seguro /$a/)
59
- // -----------------------------------------------------------------------
60
- const invalidRule = {
61
- pattern: "[unclosed", // inválido
62
- replaceWith: "***",
63
- };
64
- const invalidRegex = (0, services_1.toPiiRegex)(invalidRule);
65
- console.log("→ Patrón inválido, debería producir fallback /$a/:");
66
- console.log(" Regex generado:", invalidRegex);
67
- console.log(" Hace match?:", invalidRegex.test("cualquier cosa"), "\n");
68
- console.log("=== ✔ Fin del ejemplo toPiiRegex ===");
69
- }
70
- }
71
- exports.ToPiiRegexExample = ToPiiRegexExample;
72
- // Permite ejecución directa con ts-node / tsx
73
- if (require.main === module) {
74
- ToPiiRegexExample.Main();
75
- }