@jmlq/logger 0.1.0-alpha.1 → 0.1.0-alpha.10

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 (142) hide show
  1. package/README.md +307 -0
  2. package/architecture.md +171 -0
  3. package/dist/examples/data-source-service.example.d.ts +3 -0
  4. package/dist/examples/data-source-service.example.js +174 -0
  5. package/dist/examples/flush-buffers-use-case.example.d.ts +3 -0
  6. package/dist/examples/flush-buffers-use-case.example.js +60 -0
  7. package/dist/examples/get-logs-use-case.example.d.ts +3 -0
  8. package/dist/examples/get-logs-use-case.example.js +110 -0
  9. package/dist/examples/index.example.d.ts +8 -0
  10. package/dist/examples/index.example.js +116 -0
  11. package/dist/examples/logger-factory.example.d.ts +39 -0
  12. package/dist/examples/logger-factory.example.js +158 -0
  13. package/dist/examples/normalize-message.example.d.ts +3 -0
  14. package/dist/examples/normalize-message.example.js +80 -0
  15. package/dist/examples/pii-redactor.example.d.ts +3 -0
  16. package/dist/examples/pii-redactor.example.js +129 -0
  17. package/dist/examples/save-log-use-case.example.d.ts +3 -0
  18. package/dist/examples/save-log-use-case.example.js +150 -0
  19. package/dist/examples/to-log-level.example.d.ts +3 -0
  20. package/dist/examples/to-log-level.example.js +49 -0
  21. package/dist/examples/to-pii-regex.example.d.ts +3 -0
  22. package/dist/examples/to-pii-regex.example.js +75 -0
  23. package/dist/{presentation/factory/index.d.ts → src/application/factory/create-logger.d.ts} +1 -1
  24. package/dist/src/application/factory/create-logger.js +29 -0
  25. package/dist/src/application/factory/index.d.ts +1 -0
  26. package/dist/{config → src/application/factory}/index.js +1 -2
  27. package/dist/src/application/factory/logger.factory.d.ts +12 -0
  28. package/dist/src/application/factory/logger.factory.js +74 -0
  29. package/dist/src/application/index.d.ts +2 -0
  30. package/dist/{presentation → src/application}/index.js +1 -0
  31. package/dist/src/application/use-cases/flush-buffers.use-case.d.ts +6 -0
  32. package/dist/src/application/use-cases/flush-buffers.use-case.js +13 -0
  33. package/dist/src/application/use-cases/get-logs.use-case.d.ts +8 -0
  34. package/dist/src/application/use-cases/get-logs.use-case.js +24 -0
  35. package/dist/src/application/use-cases/index.d.ts +3 -0
  36. package/dist/src/application/use-cases/index.js +19 -0
  37. package/dist/src/application/use-cases/save-log.use-case.d.ts +8 -0
  38. package/dist/src/application/use-cases/save-log.use-case.js +26 -0
  39. package/dist/src/domain/index.d.ts +6 -0
  40. package/dist/src/domain/index.js +22 -0
  41. package/dist/src/domain/ports/create-logger-options.port.d.ts +7 -0
  42. package/dist/{config/interfaces/index.js → src/domain/ports/create-logger-options.port.js} +0 -1
  43. package/dist/src/domain/ports/index.d.ts +6 -0
  44. package/dist/src/domain/ports/index.js +22 -0
  45. package/dist/src/domain/ports/log-datasource.port.d.ts +9 -0
  46. package/dist/src/domain/ports/log-datasource.port.js +2 -0
  47. package/dist/src/domain/ports/logger-factory-config.port.d.ts +28 -0
  48. package/dist/src/domain/ports/logger-factory-config.port.js +2 -0
  49. package/dist/src/domain/ports/logger-service.port.d.ts +19 -0
  50. package/dist/src/domain/ports/logger-service.port.js +2 -0
  51. package/dist/src/domain/ports/logger.port.d.ts +10 -0
  52. package/dist/src/domain/ports/logger.port.js +2 -0
  53. package/dist/src/domain/ports/pii-redactor.port.d.ts +5 -0
  54. package/dist/src/domain/ports/pii-redactor.port.js +2 -0
  55. package/dist/src/domain/request/get-logs-filter.props.d.ts +9 -0
  56. package/dist/src/domain/request/get-logs-filter.props.js +2 -0
  57. package/dist/src/domain/request/index.d.ts +5 -0
  58. package/dist/src/domain/request/index.js +21 -0
  59. package/dist/src/domain/request/log.props.d.ts +7 -0
  60. package/dist/src/domain/request/log.props.js +2 -0
  61. package/dist/src/domain/request/pii-options.props.d.ts +8 -0
  62. package/dist/src/domain/request/pii-options.props.js +2 -0
  63. package/dist/src/domain/request/pii-replacement.props.d.ts +5 -0
  64. package/dist/src/domain/request/pii-replacement.props.js +2 -0
  65. package/dist/src/domain/request/save-log.props.d.ts +7 -0
  66. package/dist/src/domain/request/save-log.props.js +2 -0
  67. package/dist/src/domain/response/index.d.ts +1 -0
  68. package/dist/{domain/services → src/domain/response}/index.js +1 -1
  69. package/dist/src/domain/response/log.response.d.ts +7 -0
  70. package/dist/src/domain/response/log.response.js +2 -0
  71. package/dist/src/domain/services/index.d.ts +4 -0
  72. package/dist/{index.js → src/domain/services/index.js} +4 -4
  73. package/dist/src/domain/services/log-level.service.d.ts +2 -0
  74. package/dist/src/domain/services/log-level.service.js +27 -0
  75. package/dist/src/domain/services/message-normalizer.service.d.ts +3 -0
  76. package/dist/src/domain/services/message-normalizer.service.js +8 -0
  77. package/dist/src/domain/services/pii-pattern.service.d.ts +2 -0
  78. package/dist/src/domain/services/pii-pattern.service.js +13 -0
  79. package/dist/src/domain/services/pii-redactor.d.ts +10 -0
  80. package/dist/src/domain/services/pii-redactor.js +68 -0
  81. package/dist/src/domain/services/pii-redactor.service.d.ts +10 -0
  82. package/dist/src/domain/services/pii-redactor.service.js +68 -0
  83. package/dist/src/domain/types/index.d.ts +1 -0
  84. package/dist/src/domain/types/index.js +17 -0
  85. package/dist/src/domain/types/log-message.type.d.ts +1 -0
  86. package/dist/src/domain/types/log-message.type.js +2 -0
  87. package/dist/src/domain/value-objects/index.d.ts +1 -0
  88. package/dist/src/domain/value-objects/index.js +17 -0
  89. package/dist/src/domain/value-objects/log-level.vo.d.ts +8 -0
  90. package/dist/src/domain/value-objects/log-level.vo.js +13 -0
  91. package/dist/src/index.d.ts +6 -0
  92. package/dist/src/index.js +22 -0
  93. package/dist/src/infrastructure/datasources/in-memory-log.datasource.d.ts +1 -0
  94. package/dist/src/infrastructure/datasources/in-memory-log.datasource.js +2 -0
  95. package/dist/src/infrastructure/datasources/index.d.ts +1 -0
  96. package/dist/src/infrastructure/datasources/index.js +17 -0
  97. package/dist/src/infrastructure/services/data-source-error-handler.type.d.ts +5 -0
  98. package/dist/src/infrastructure/services/data-source-error-handler.type.js +2 -0
  99. package/dist/src/infrastructure/services/datasource.service.d.ts +15 -0
  100. package/dist/src/infrastructure/services/datasource.service.js +63 -0
  101. package/dist/src/infrastructure/services/index.d.ts +2 -0
  102. package/dist/src/infrastructure/services/index.js +18 -0
  103. package/dist/tests/application/factory/logger-factory.spec.d.ts +1 -0
  104. package/dist/tests/application/factory/logger-factory.spec.js +161 -0
  105. package/dist/tests/application/use-cases/flush-buffers.use-case.spec.d.ts +1 -0
  106. package/dist/tests/application/use-cases/flush-buffers.use-case.spec.js +38 -0
  107. package/dist/tests/application/use-cases/get-logs.use-case.spec.d.ts +1 -0
  108. package/dist/tests/application/use-cases/get-logs.use-case.spec.js +114 -0
  109. package/dist/tests/application/use-cases/save-log.use-case.spec.d.ts +1 -0
  110. package/dist/tests/application/use-cases/save-log.use-case.spec.js +138 -0
  111. package/dist/tests/domain/services/log-level.service.spec.d.ts +1 -0
  112. package/dist/tests/domain/services/log-level.service.spec.js +68 -0
  113. package/dist/tests/domain/services/normalize-message.spec.d.ts +1 -0
  114. package/dist/tests/domain/services/normalize-message.spec.js +83 -0
  115. package/dist/tests/domain/services/pii-redactor.spec.d.ts +1 -0
  116. package/dist/tests/domain/services/pii-redactor.spec.js +170 -0
  117. package/dist/tests/domain/services/to-pii-regex.spec.d.ts +1 -0
  118. package/dist/tests/domain/services/to-pii-regex.spec.js +82 -0
  119. package/dist/tests/infrastructure/services/datasource.service.spec.d.ts +1 -0
  120. package/dist/tests/infrastructure/services/datasource.service.spec.js +128 -0
  121. package/dist/tests/test-utils/create-pii-redactor-mock.d.ts +5 -0
  122. package/dist/tests/test-utils/create-pii-redactor-mock.js +10 -0
  123. package/install.md +367 -0
  124. package/package.json +33 -10
  125. package/dist/Composite/index.d.ts +0 -9
  126. package/dist/Composite/index.js +0 -23
  127. package/dist/Factory/index.d.ts +0 -5
  128. package/dist/Factory/index.js +0 -23
  129. package/dist/config/index.d.ts +0 -2
  130. package/dist/config/interfaces/index.d.ts +0 -67
  131. package/dist/config/types/index.d.ts +0 -10
  132. package/dist/config/types/index.js +0 -13
  133. package/dist/domain/services/index.d.ts +0 -1
  134. package/dist/domain/services/pii-redactor.d.ts +0 -27
  135. package/dist/domain/services/pii-redactor.js +0 -139
  136. package/dist/index.d.ts +0 -4
  137. package/dist/interfaces/index.d.ts +0 -35
  138. package/dist/interfaces/index.js +0 -13
  139. package/dist/presentation/factory/index.js +0 -74
  140. package/dist/presentation/index.d.ts +0 -1
  141. /package/dist/{domain → src/infrastructure}/index.d.ts +0 -0
  142. /package/dist/{domain → src/infrastructure}/index.js +0 -0
@@ -1,139 +0,0 @@
1
- "use strict";
2
- /**
3
- * Domain Service: PiiRedactor
4
- *
5
- * Propósito:
6
- * - Redactar/anonimizar PII en strings, objetos y arrays (deep).
7
- * - Permitir que el cliente pase patrones adicionales/propios.
8
- * - Controlar redacción por nombre de clave (whitelist/blacklist).
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.PiiRedactor = void 0;
12
- class PiiRedactor {
13
- constructor(opts = {}) {
14
- const { enabled = true, includeDefaultPatterns = true, patterns = [], redactKeys = [], preserveKeys = [], } = opts;
15
- this.enabled = enabled;
16
- this.patterns = includeDefaultPatterns
17
- ? [...PiiRedactor.defaultPatterns(), ...patterns]
18
- : [...patterns];
19
- this.redactKeys = redactKeys;
20
- this.preserveKeys = preserveKeys;
21
- }
22
- /** Patrones por defecto (seguros y genéricos). Ajusta según tu dominio/región si lo deseas. */
23
- static defaultPatterns() {
24
- return [
25
- // Tarjetas (13–19 dígitos con espacios o guiones) — patrón simple
26
- {
27
- name: "credit_card",
28
- regex: /\b(?:\d[ -]*?){13,19}\b/g,
29
- replacement: "[REDACTED_CARD]",
30
- },
31
- // Emails
32
- {
33
- name: "email",
34
- regex: /\b[\w._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g,
35
- replacement: "[REDACTED_EMAIL]",
36
- },
37
- // Teléfonos: 10+ dígitos (ajusta a tu región si hace falta)
38
- {
39
- name: "phone",
40
- regex: /\b\d{10,}\b/g,
41
- replacement: "[REDACTED_PHONE]",
42
- },
43
- // Documento genérico: ABC-123456… o similar
44
- {
45
- name: "document_id",
46
- regex: /\b[A-Z]{1,3}-?\d{6,10}\b/g,
47
- replacement: "[REDACTED_ID]",
48
- },
49
- // IPv4
50
- {
51
- name: "ipv4",
52
- regex: /\b(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.|$)){4}\b/g,
53
- replacement: "[REDACTED_IP]",
54
- },
55
- ];
56
- }
57
- /** Punto de entrada público: redacción deep de cualquier estructura */
58
- redact(value) {
59
- if (!this.enabled)
60
- return value;
61
- return this.redactValue(value, []);
62
- }
63
- /** === Internos === */
64
- redactValue(value, keyPath) {
65
- // Strings → aplicar patrones
66
- if (typeof value === "string") {
67
- return this.applyPatterns(value, keyPath);
68
- }
69
- // Números / boolean / null / undefined → retornar tal cual
70
- if (typeof value === "number" ||
71
- typeof value === "boolean" ||
72
- value === null ||
73
- typeof value === "undefined") {
74
- return value;
75
- }
76
- // Arrays → deep
77
- if (Array.isArray(value)) {
78
- return value.map((v, i) => this.redactValue(v, [...keyPath, String(i)]));
79
- }
80
- // Objetos → deep + reglas por nombre de clave
81
- if (typeof value === "object") {
82
- const src = value;
83
- const out = {};
84
- for (const [k, v] of Object.entries(src)) {
85
- const path = [...keyPath, k];
86
- if (this.isPreservedKey(k)) {
87
- out[k] = this.clone(v); // explícitamente preservado
88
- continue;
89
- }
90
- if (this.isRedactedKey(k)) {
91
- out[k] = this.keyRedactionReplacement(k, path);
92
- continue;
93
- }
94
- out[k] = this.redactValue(v, path);
95
- }
96
- return out;
97
- }
98
- // funciones, símbolos, etc.
99
- return value;
100
- }
101
- applyPatterns(text, keyPath) {
102
- let result = text;
103
- for (const p of this.patterns) {
104
- const replacement = p.replacement ?? "[REDACTED]";
105
- // Soporta función de reemplazo con contexto (ruta de claves)
106
- if (typeof replacement === "function") {
107
- result = result.replace(p.regex, (m) => replacement(m, keyPath));
108
- }
109
- else {
110
- result = result.replace(p.regex, replacement);
111
- }
112
- }
113
- return result;
114
- }
115
- isRedactedKey(key) {
116
- return this.redactKeys.some((r) => typeof r === "string" ? r === key : r.test(key));
117
- }
118
- isPreservedKey(key) {
119
- return this.preserveKeys.some((r) => typeof r === "string" ? r === key : r.test(key));
120
- }
121
- keyRedactionReplacement(_key, _path) {
122
- return "[REDACTED]";
123
- }
124
- clone(v) {
125
- if (v && typeof v === "object") {
126
- try {
127
- return JSON.parse(JSON.stringify(v));
128
- }
129
- catch {
130
- // fallback shallow
131
- if (Array.isArray(v))
132
- return [...v];
133
- return { ...v };
134
- }
135
- }
136
- return v;
137
- }
138
- }
139
- exports.PiiRedactor = PiiRedactor;
package/dist/index.d.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from "./composite";
2
- export * from "./domain";
3
- export * from "./presentation";
4
- export * from "./config";
@@ -1,35 +0,0 @@
1
- export declare enum LogLevel {
2
- TRACE = 0,
3
- DEBUG = 1,
4
- INFO = 2,
5
- WARN = 3,
6
- ERROR = 4,
7
- FATAL = 5
8
- }
9
- export interface Log {
10
- level: LogLevel;
11
- message: string;
12
- meta?: unknown;
13
- timestamp: number;
14
- }
15
- export interface GetLogsFilter {
16
- levelMin?: LogLevel;
17
- since?: number;
18
- until?: number;
19
- }
20
- export interface ILogDatasource {
21
- save(log: Log): Promise<void>;
22
- find?(filter?: GetLogsFilter): Promise<Log[]>;
23
- flush?(): Promise<void>;
24
- dispose?(): Promise<void>;
25
- }
26
- export interface Logger {
27
- trace: (msg: string, meta?: unknown) => Promise<void>;
28
- debug: (msg: string, meta?: unknown) => Promise<void>;
29
- info: (msg: string, meta?: unknown) => Promise<void>;
30
- warn: (msg: string, meta?: unknown) => Promise<void>;
31
- error: (msg: string, meta?: unknown) => Promise<void>;
32
- fatal: (msg: string, meta?: unknown) => Promise<void>;
33
- flush?: () => Promise<void>;
34
- dispose?: () => Promise<void>;
35
- }
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LogLevel = void 0;
4
- // ---- Types & contratos ----
5
- var LogLevel;
6
- (function (LogLevel) {
7
- LogLevel[LogLevel["TRACE"] = 0] = "TRACE";
8
- LogLevel[LogLevel["DEBUG"] = 1] = "DEBUG";
9
- LogLevel[LogLevel["INFO"] = 2] = "INFO";
10
- LogLevel[LogLevel["WARN"] = 3] = "WARN";
11
- LogLevel[LogLevel["ERROR"] = 4] = "ERROR";
12
- LogLevel[LogLevel["FATAL"] = 5] = "FATAL";
13
- })(LogLevel || (exports.LogLevel = LogLevel = {}));
@@ -1,74 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createLogger = createLogger;
4
- const __1 = require("../..");
5
- /**
6
- * Normaliza cualquier LogMessage a string, aplicando PII (si procede) ANTES de serializar.
7
- */
8
- function normalizeLogMessage(value, redactEnabled, redactor) {
9
- const v = redactEnabled ? redactor.redact(value) : value;
10
- if (typeof v === "string")
11
- return v;
12
- // Si soportas Error en LogMessage, lo serializamos “bonito”
13
- if (v instanceof Error) {
14
- const err = v;
15
- const obj = {
16
- error: err.name || "Error",
17
- message: err.message,
18
- stack: err.stack,
19
- code: err.code,
20
- cause: err.cause,
21
- };
22
- try {
23
- return JSON.stringify(obj);
24
- }
25
- catch {
26
- return `${obj.error}: ${obj.message}`;
27
- }
28
- }
29
- // Objeto → JSON
30
- try {
31
- return JSON.stringify(v);
32
- }
33
- catch {
34
- // fallback ultra defensivo
35
- return String(v);
36
- }
37
- }
38
- function createLogger(ds, opts = {}) {
39
- const minLevel = opts.minLevel ?? __1.LogLevel.INFO;
40
- // Compatibilidad: redactPII (boolean) o pii.enabled
41
- const redactEnabled = (opts.redactPII ?? false) || (opts.pii?.enabled ?? false);
42
- // Inicializa redactor con opciones del cliente (incluye defaults por defecto)
43
- const redactor = new __1.PiiRedactor({
44
- enabled: redactEnabled,
45
- includeDefaultPatterns: opts.pii?.includeDefaultPatterns ?? true,
46
- patterns: opts.pii?.patterns,
47
- redactKeys: opts.pii?.redactKeys,
48
- preserveKeys: opts.pii?.preserveKeys,
49
- });
50
- const emit = async (level, message, meta) => {
51
- if (level < minLevel)
52
- return;
53
- const msgStr = normalizeLogMessage(message, redactEnabled, redactor);
54
- const metaVal = redactEnabled ? redactor.redact(meta) : meta;
55
- const payload = {
56
- level,
57
- timestamp: Date.now(),
58
- message: msgStr, // <- garantizamos string
59
- meta: metaVal,
60
- };
61
- await ds.save(payload);
62
- };
63
- const logger = {
64
- trace: (m, meta) => emit(__1.LogLevel.TRACE, m, meta),
65
- debug: (m, meta) => emit(__1.LogLevel.DEBUG, m, meta),
66
- info: (m, meta) => emit(__1.LogLevel.INFO, m, meta),
67
- warn: (m, meta) => emit(__1.LogLevel.WARN, m, meta),
68
- error: (m, meta) => emit(__1.LogLevel.ERROR, m, meta),
69
- fatal: (m, meta) => emit(__1.LogLevel.FATAL, m, meta),
70
- flush: () => ds.flush?.() ?? Promise.resolve(),
71
- dispose: () => ds.dispose?.() ?? Promise.resolve(),
72
- };
73
- return logger;
74
- }
@@ -1 +0,0 @@
1
- export * from "./factory";
File without changes
File without changes