@jmlq/logger 0.1.0-alpha.7 → 0.1.0-alpha.9

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 (147) hide show
  1. package/README.md +225 -733
  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 → src/application}/factory/create-logger.d.ts +1 -1
  24. package/dist/{presentation → src/application}/factory/create-logger.js +3 -3
  25. package/dist/src/application/factory/index.d.ts +1 -0
  26. package/dist/{presentation → src/application}/factory/index.js +1 -1
  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/src/application/index.js +18 -0
  31. package/dist/src/application/use-cases/flush-buffers.use-case.d.ts +6 -0
  32. package/dist/{application/use-cases/flush-buffers.js → src/application/use-cases/flush-buffers.use-case.js} +3 -3
  33. package/dist/src/application/use-cases/get-logs.use-case.d.ts +8 -0
  34. package/dist/{application/use-cases/get-logs.js → src/application/use-cases/get-logs.use-case.js} +3 -3
  35. package/dist/src/application/use-cases/index.d.ts +3 -0
  36. package/dist/{application → src/application}/use-cases/index.js +3 -3
  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/src/domain/ports/index.d.ts +6 -0
  43. package/dist/src/domain/ports/index.js +22 -0
  44. package/dist/src/domain/ports/log-datasource.port.d.ts +9 -0
  45. package/dist/src/domain/ports/logger-factory-config.port.d.ts +28 -0
  46. package/dist/src/domain/ports/logger-service.port.d.ts +19 -0
  47. package/dist/{domain/contracts/logger.d.ts → src/domain/ports/logger.port.d.ts} +0 -9
  48. package/dist/src/domain/ports/logger.port.js +2 -0
  49. package/dist/src/domain/ports/pii-redactor.port.d.ts +5 -0
  50. package/dist/src/domain/ports/pii-redactor.port.js +2 -0
  51. package/dist/src/domain/request/get-logs-filter.props.d.ts +9 -0
  52. package/dist/src/domain/request/get-logs-filter.props.js +2 -0
  53. package/dist/src/domain/request/index.d.ts +5 -0
  54. package/dist/src/domain/request/index.js +21 -0
  55. package/dist/src/domain/request/log.props.d.ts +7 -0
  56. package/dist/src/domain/request/log.props.js +2 -0
  57. package/dist/src/domain/request/pii-options.props.d.ts +8 -0
  58. package/dist/src/domain/request/pii-options.props.js +2 -0
  59. package/dist/src/domain/request/pii-replacement.props.d.ts +5 -0
  60. package/dist/src/domain/request/pii-replacement.props.js +2 -0
  61. package/dist/src/domain/request/save-log.props.d.ts +7 -0
  62. package/dist/src/domain/request/save-log.props.js +2 -0
  63. package/dist/src/domain/response/index.d.ts +1 -0
  64. package/dist/{domain/value-objects → src/domain/response}/index.js +1 -1
  65. package/dist/src/domain/response/log.response.d.ts +7 -0
  66. package/dist/src/domain/response/log.response.js +2 -0
  67. package/dist/src/domain/services/index.d.ts +4 -0
  68. package/dist/{domain/contracts → src/domain/services}/index.js +4 -3
  69. package/dist/src/domain/services/log-level.service.d.ts +2 -0
  70. package/dist/src/domain/services/log-level.service.js +27 -0
  71. package/dist/src/domain/services/message-normalizer.service.d.ts +3 -0
  72. package/dist/src/domain/services/message-normalizer.service.js +8 -0
  73. package/dist/src/domain/services/pii-pattern.service.d.ts +2 -0
  74. package/dist/src/domain/services/pii-pattern.service.js +13 -0
  75. package/dist/src/domain/services/pii-redactor.d.ts +10 -0
  76. package/dist/{domain → src/domain}/services/pii-redactor.js +8 -17
  77. package/dist/src/domain/services/pii-redactor.service.d.ts +10 -0
  78. package/dist/src/domain/services/pii-redactor.service.js +68 -0
  79. package/dist/src/domain/types/index.d.ts +1 -0
  80. package/dist/src/domain/types/index.js +17 -0
  81. package/dist/src/domain/types/log-message.type.d.ts +1 -0
  82. package/dist/src/domain/types/log-message.type.js +2 -0
  83. package/dist/src/domain/value-objects/index.d.ts +1 -0
  84. package/dist/{domain/services → src/domain/value-objects}/index.js +1 -1
  85. package/dist/{domain/value-objects/log-level.d.ts → src/domain/value-objects/log-level.vo.d.ts} +0 -1
  86. package/dist/src/domain/value-objects/log-level.vo.js +13 -0
  87. package/dist/src/index.d.ts +6 -0
  88. package/dist/src/index.js +22 -0
  89. package/dist/src/infrastructure/datasources/in-memory-log.datasource.d.ts +1 -0
  90. package/dist/src/infrastructure/datasources/in-memory-log.datasource.js +2 -0
  91. package/dist/src/infrastructure/datasources/index.d.ts +1 -0
  92. package/dist/{infrastructure/adapters → src/infrastructure/datasources}/index.js +1 -1
  93. package/dist/src/infrastructure/index.d.ts +1 -0
  94. package/dist/{domain/types → src/infrastructure}/index.js +1 -1
  95. package/dist/src/infrastructure/services/data-source-error-handler.type.d.ts +5 -0
  96. package/dist/src/infrastructure/services/data-source-error-handler.type.js +2 -0
  97. package/dist/src/infrastructure/services/datasource.service.d.ts +15 -0
  98. package/dist/src/infrastructure/services/datasource.service.js +63 -0
  99. package/dist/src/infrastructure/services/index.d.ts +2 -0
  100. package/dist/src/infrastructure/services/index.js +18 -0
  101. package/dist/tests/application/factory/logger-factory.spec.d.ts +1 -0
  102. package/dist/tests/application/factory/logger-factory.spec.js +161 -0
  103. package/dist/tests/application/use-cases/flush-buffers.use-case.spec.d.ts +1 -0
  104. package/dist/tests/application/use-cases/flush-buffers.use-case.spec.js +38 -0
  105. package/dist/tests/application/use-cases/get-logs.use-case.spec.d.ts +1 -0
  106. package/dist/tests/application/use-cases/get-logs.use-case.spec.js +114 -0
  107. package/dist/tests/application/use-cases/save-log.use-case.spec.d.ts +1 -0
  108. package/dist/tests/application/use-cases/save-log.use-case.spec.js +138 -0
  109. package/dist/tests/domain/services/log-level.service.spec.d.ts +1 -0
  110. package/dist/tests/domain/services/log-level.service.spec.js +68 -0
  111. package/dist/tests/domain/services/normalize-message.spec.d.ts +1 -0
  112. package/dist/tests/domain/services/normalize-message.spec.js +83 -0
  113. package/dist/tests/domain/services/pii-redactor.spec.d.ts +1 -0
  114. package/dist/tests/domain/services/pii-redactor.spec.js +170 -0
  115. package/dist/tests/domain/services/to-pii-regex.spec.d.ts +1 -0
  116. package/dist/tests/domain/services/to-pii-regex.spec.js +82 -0
  117. package/dist/tests/infrastructure/services/datasource.service.spec.d.ts +1 -0
  118. package/dist/tests/infrastructure/services/datasource.service.spec.js +128 -0
  119. package/dist/tests/test-utils/create-pii-redactor-mock.d.ts +5 -0
  120. package/dist/tests/test-utils/create-pii-redactor-mock.js +10 -0
  121. package/install.md +367 -0
  122. package/package.json +29 -19
  123. package/LICENSE +0 -21
  124. package/dist/application/use-cases/flush-buffers.d.ts +0 -6
  125. package/dist/application/use-cases/get-logs.d.ts +0 -7
  126. package/dist/application/use-cases/index.d.ts +0 -3
  127. package/dist/application/use-cases/save-log.d.ts +0 -13
  128. package/dist/application/use-cases/save-log.js +0 -30
  129. package/dist/domain/contracts/index.d.ts +0 -3
  130. package/dist/domain/contracts/log.datasource.d.ts +0 -8
  131. package/dist/domain/contracts/pii.d.ts +0 -5
  132. package/dist/domain/services/index.d.ts +0 -1
  133. package/dist/domain/services/pii-redactor.d.ts +0 -10
  134. package/dist/domain/types/index.d.ts +0 -1
  135. package/dist/domain/types/log.types.d.ts +0 -28
  136. package/dist/domain/value-objects/index.d.ts +0 -1
  137. package/dist/domain/value-objects/log-level.js +0 -37
  138. package/dist/index.d.ts +0 -5
  139. package/dist/index.js +0 -10
  140. package/dist/infrastructure/adapters/composite.datasource.d.ts +0 -11
  141. package/dist/infrastructure/adapters/composite.datasource.js +0 -46
  142. package/dist/infrastructure/adapters/index.d.ts +0 -1
  143. package/dist/presentation/factory/index.d.ts +0 -1
  144. /package/dist/{domain/contracts/log.datasource.js → src/domain/ports/create-logger-options.port.js} +0 -0
  145. /package/dist/{domain/contracts/logger.js → src/domain/ports/log-datasource.port.js} +0 -0
  146. /package/dist/{domain/contracts/pii.js → src/domain/ports/logger-factory-config.port.js} +0 -0
  147. /package/dist/{domain/types/log.types.js → src/domain/ports/logger-service.port.js} +0 -0
@@ -1,7 +0,0 @@
1
- import { ILogDatasource } from "../../domain/contracts";
2
- import { IGetLogsFilter, ILog } from "../../domain/types";
3
- export declare class GetLogs {
4
- private readonly ds;
5
- constructor(ds: ILogDatasource);
6
- execute(filter?: IGetLogsFilter): Promise<ILog[]>;
7
- }
@@ -1,3 +0,0 @@
1
- export * from "./save-log";
2
- export * from "./get-logs";
3
- export * from "./flush-buffers";
@@ -1,13 +0,0 @@
1
- import { ILogDatasource, IPiiRedactor } from "../../domain/contracts";
2
- import { LogMessage } from "../../domain/types";
3
- import { LogLevel } from "../../domain/value-objects";
4
- export interface SaveLogDeps {
5
- ds: ILogDatasource;
6
- minLevel: LogLevel;
7
- redactor: IPiiRedactor;
8
- }
9
- export declare class SaveLog {
10
- private readonly deps;
11
- constructor(deps: SaveLogDeps);
12
- execute(level: LogLevel, message: LogMessage, meta?: unknown): Promise<void>;
13
- }
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SaveLog = void 0;
4
- // Normaliza el mensaje: si es función, la evalúa; si es objeto, se redacta; si es string, se redacta
5
- function normalizeMessage(message, redactor) {
6
- const resolved = typeof message === "function" ? message() : message; // eval laziness
7
- return redactor.redact(resolved);
8
- }
9
- class SaveLog {
10
- constructor(deps) {
11
- this.deps = deps;
12
- }
13
- async execute(level, message, meta) {
14
- // 1) Filtro por nivel (evita hacer trabajo innecesario)
15
- if (level < this.deps.minLevel)
16
- return; // no se loggea
17
- // 2) Normalización + PII
18
- const normalized = normalizeMessage(message, this.deps.redactor);
19
- // 3) Construcción del evento
20
- const log = {
21
- level,
22
- message: normalized,
23
- meta: meta === undefined ? undefined : this.deps.redactor.redact(meta),
24
- timestamp: Date.now(),
25
- };
26
- // 4) Persistencia (fan-out lo maneja el ds si es composite)
27
- await this.deps.ds.save(log);
28
- }
29
- }
30
- exports.SaveLog = SaveLog;
@@ -1,3 +0,0 @@
1
- export * from "./log.datasource";
2
- export * from "./logger";
3
- export * from "./pii";
@@ -1,8 +0,0 @@
1
- import { IGetLogsFilter, ILog } from "../types";
2
- export interface ILogDatasource {
3
- save(log: ILog): Promise<void>;
4
- find?(filter?: IGetLogsFilter): Promise<ILog[]>;
5
- flush?(): Promise<void>;
6
- dispose?(): Promise<void>;
7
- readonly name?: string;
8
- }
@@ -1,5 +0,0 @@
1
- import { PiiOptions } from "../types";
2
- export interface IPiiRedactor {
3
- redact<T = unknown>(value: T): T;
4
- updateOptions?(opts: PiiOptions): void;
5
- }
@@ -1 +0,0 @@
1
- export * from "./pii-redactor";
@@ -1,10 +0,0 @@
1
- import { IPiiRedactor } from "../contracts";
2
- import { PiiOptions } from "../types";
3
- export declare class PiiRedactor implements IPiiRedactor {
4
- private options;
5
- constructor(options?: PiiOptions);
6
- updateOptions(opts: PiiOptions): void;
7
- redact<T = unknown>(value: T): T;
8
- private applyPatterns;
9
- private redactDeep;
10
- }
@@ -1 +0,0 @@
1
- export * from "./log.types";
@@ -1,28 +0,0 @@
1
- import { LogLevel } from "../value-objects";
2
- export type LogMessage = string | Record<string, unknown> | (() => string | Record<string, unknown>);
3
- export interface ILog {
4
- level: LogLevel;
5
- message: string | Record<string, unknown>;
6
- meta?: unknown;
7
- timestamp: number;
8
- }
9
- export interface IGetLogsFilter {
10
- levelMin?: LogLevel;
11
- since?: number;
12
- until?: number;
13
- limit?: number;
14
- offset?: number;
15
- query?: string;
16
- }
17
- export interface PiiReplacement {
18
- pattern: string;
19
- flags?: string;
20
- replaceWith: string;
21
- }
22
- export interface PiiOptions {
23
- enabled?: boolean;
24
- whitelistKeys?: string[];
25
- blacklistKeys?: string[];
26
- patterns?: PiiReplacement[];
27
- deep?: boolean;
28
- }
@@ -1 +0,0 @@
1
- export * from "./log-level";
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LogLevel = void 0;
4
- exports.toLogLevel = toLogLevel;
5
- var LogLevel;
6
- (function (LogLevel) {
7
- // Orden creciente permite comparar por severidad (trace < debug < ...)
8
- LogLevel[LogLevel["TRACE"] = 10] = "TRACE";
9
- LogLevel[LogLevel["DEBUG"] = 20] = "DEBUG";
10
- LogLevel[LogLevel["INFO"] = 30] = "INFO";
11
- LogLevel[LogLevel["WARN"] = 40] = "WARN";
12
- LogLevel[LogLevel["ERROR"] = 50] = "ERROR";
13
- LogLevel[LogLevel["FATAL"] = 60] = "FATAL";
14
- })(LogLevel || (exports.LogLevel = LogLevel = {}));
15
- // Convierte string a LogLevel con fallback seguro
16
- function toLogLevel(level, def = LogLevel.INFO) {
17
- if (typeof level === "number")
18
- return (Object.values(LogLevel).includes(level) ? level : def);
19
- if (!level)
20
- return def;
21
- switch (String(level).toLowerCase()) {
22
- case "trace":
23
- return LogLevel.TRACE;
24
- case "debug":
25
- return LogLevel.DEBUG;
26
- case "info":
27
- return LogLevel.INFO;
28
- case "warn":
29
- return LogLevel.WARN;
30
- case "error":
31
- return LogLevel.ERROR;
32
- case "fatal":
33
- return LogLevel.FATAL;
34
- default:
35
- return def; // evita lanzar excepción por valores inesperados
36
- }
37
- }
package/dist/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export { LogLevel, toLogLevel } from "./domain/value-objects";
2
- export type { LogMessage, ILog, IGetLogsFilter, PiiOptions, PiiReplacement, } from "./domain/types";
3
- export type { LogDatasourcePort, ILogger, ICreateLoggerOptions, ILogDatasource, } from "./domain/contracts";
4
- export { createLogger } from "./presentation/factory";
5
- export { CompositeDatasource } from "./infrastructure/adapters";
package/dist/index.js DELETED
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CompositeDatasource = exports.createLogger = exports.toLogLevel = exports.LogLevel = void 0;
4
- var value_objects_1 = require("./domain/value-objects");
5
- Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return value_objects_1.LogLevel; } });
6
- Object.defineProperty(exports, "toLogLevel", { enumerable: true, get: function () { return value_objects_1.toLogLevel; } });
7
- var factory_1 = require("./presentation/factory");
8
- Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return factory_1.createLogger; } });
9
- var adapters_1 = require("./infrastructure/adapters");
10
- Object.defineProperty(exports, "CompositeDatasource", { enumerable: true, get: function () { return adapters_1.CompositeDatasource; } });
@@ -1,11 +0,0 @@
1
- import { ILogDatasource } from "../../domain/contracts";
2
- import { IGetLogsFilter, ILog } from "../../domain/types";
3
- export declare class CompositeDatasource implements ILogDatasource {
4
- private readonly targets;
5
- readonly name = "composite";
6
- constructor(targets: ILogDatasource[]);
7
- save(log: ILog): Promise<void>;
8
- find(filter?: IGetLogsFilter): Promise<ILog[]>;
9
- flush(): Promise<void>;
10
- dispose(): Promise<void>;
11
- }
@@ -1,46 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CompositeDatasource = void 0;
4
- // CompositeDatasource: fan-out hacia múltiples datasources
5
- class CompositeDatasource {
6
- constructor(targets) {
7
- this.targets = targets;
8
- this.name = "composite";
9
- // Filtro targets válidos (defensivo). Evita null/undefined
10
- this.targets = (targets ?? []).filter(Boolean);
11
- }
12
- async save(log) {
13
- // Ejecuta todos en paralelo y NO falla el todo si uno falla
14
- const results = await Promise.allSettled(this.targets.map((ds) => ds.save(log)));
15
- // Log de errores silencioso (el logger real no debe auto-dependerse)
16
- for (let i = 0; i < results.length; i++) {
17
- const r = results[i];
18
- if (r.status === "rejected") {
19
- // Preferible: exponer un hook externo; aquí solo console.warn por simplicidad
20
- // eslint-disable-next-line no-console
21
- console.warn(`[CompositeDatasource] save error in ds#${i} (${this.targets[i]?.name ?? "unknown"})`, r.reason);
22
- }
23
- }
24
- }
25
- async find(filter) {
26
- // Si varios ds soportan find, se concatena y ordena por timestamp desc
27
- const results = await Promise.allSettled(this.targets.map((ds) => ds.find?.(filter)));
28
- const logs = [];
29
- for (const r of results) {
30
- if (r.status === "fulfilled" && Array.isArray(r.value))
31
- logs.push(...r.value);
32
- }
33
- // Orden descendente por timestamp (más recientes primero)
34
- logs.sort((a, b) => b.timestamp - a.timestamp);
35
- return logs;
36
- }
37
- async flush() {
38
- // Ejecuta flush donde esté disponible
39
- await Promise.allSettled(this.targets.map((ds) => ds.flush?.()));
40
- }
41
- async dispose() {
42
- // Libera recursos en todos los ds
43
- await Promise.allSettled(this.targets.map((ds) => ds.dispose?.()));
44
- }
45
- }
46
- exports.CompositeDatasource = CompositeDatasource;
@@ -1 +0,0 @@
1
- export * from "./composite.datasource";
@@ -1 +0,0 @@
1
- export * from "./create-logger";