@jmlq/logger 0.1.0-alpha.16 → 0.1.0-alpha.18

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 (56) hide show
  1. package/dist/application/factory/logger.factory.d.ts +1 -1
  2. package/dist/application/factory/logger.factory.js +10 -10
  3. package/dist/application/use-cases/get-logs.use-case.d.ts +2 -2
  4. package/dist/application/use-cases/save-log/index.d.ts +1 -0
  5. package/dist/application/use-cases/save-log/index.js +17 -0
  6. package/dist/application/use-cases/save-log/save-log.props.d.ts +7 -0
  7. package/dist/application/use-cases/save-log.use-case.d.ts +3 -3
  8. package/dist/application/use-cases/save-log.use-case.js +4 -3
  9. package/dist/domain/index.d.ts +2 -0
  10. package/dist/domain/index.js +2 -0
  11. package/dist/domain/model/index.d.ts +3 -0
  12. package/dist/domain/model/index.js +19 -0
  13. package/dist/domain/{request/log.props.d.ts → model/log-entry.model.d.ts} +2 -1
  14. package/dist/domain/model/pii-options.model.d.ts +8 -0
  15. package/dist/domain/{request/pii-replacement.props.d.ts → model/pii-replacement-rule.d.ts} +1 -1
  16. package/dist/domain/ports/create-logger-options.port.d.ts +2 -2
  17. package/dist/domain/ports/log-datasource.port.d.ts +4 -3
  18. package/dist/domain/ports/logger-factory-config.port.d.ts +2 -2
  19. package/dist/domain/ports/logger.port.d.ts +2 -2
  20. package/dist/domain/ports/pii-redactor.port.d.ts +2 -2
  21. package/dist/domain/request/index.d.ts +1 -5
  22. package/dist/domain/request/index.js +1 -5
  23. package/dist/domain/request/{get-logs-filter.props.d.ts → log-filter.request.d.ts} +1 -1
  24. package/dist/domain/response/log.response.d.ts +1 -0
  25. package/dist/domain/services/index.d.ts +0 -3
  26. package/dist/domain/services/index.js +0 -3
  27. package/dist/domain/services/pii-redactor.service.d.ts +3 -3
  28. package/dist/domain/services/pii-redactor.service.js +2 -2
  29. package/dist/domain/utils/index.d.ts +3 -0
  30. package/dist/domain/utils/index.js +19 -0
  31. package/dist/domain/utils/parse-log-level.util.d.ts +2 -0
  32. package/dist/domain/{services/log-level.service.js → utils/parse-log-level.util.js} +8 -8
  33. package/dist/domain/utils/pii-regex.util.d.ts +2 -0
  34. package/dist/index.d.ts +9 -3
  35. package/dist/index.js +36 -7
  36. package/dist/infrastructure/services/datasource.service.d.ts +8 -5
  37. package/dist/infrastructure/services/datasource.service.js +40 -29
  38. package/dist/infrastructure/services/index.d.ts +0 -1
  39. package/dist/infrastructure/services/index.js +0 -1
  40. package/dist/infrastructure/types/index.d.ts +1 -0
  41. package/dist/infrastructure/types/index.js +17 -0
  42. package/dist/infrastructure/{services/data-source-error-handler.type.d.ts → types/on-data-source-error.type.d.ts} +1 -1
  43. package/package.json +1 -1
  44. package/dist/domain/request/pii-options.props.d.ts +0 -8
  45. package/dist/domain/request/save-log.props.d.ts +0 -7
  46. package/dist/domain/services/log-level.service.d.ts +0 -2
  47. package/dist/domain/services/pii-pattern.service.d.ts +0 -2
  48. /package/dist/{domain/request → application/use-cases/save-log}/save-log.props.js +0 -0
  49. /package/dist/domain/{request/get-logs-filter.props.js → model/log-entry.model.js} +0 -0
  50. /package/dist/domain/{request/log.props.js → model/pii-options.model.js} +0 -0
  51. /package/dist/domain/{request/pii-options.props.js → model/pii-replacement-rule.js} +0 -0
  52. /package/dist/domain/request/{pii-replacement.props.js → log-filter.request.js} +0 -0
  53. /package/dist/domain/{services/message-normalizer.service.d.ts → utils/normalize-message.util.d.ts} +0 -0
  54. /package/dist/domain/{services/message-normalizer.service.js → utils/normalize-message.util.js} +0 -0
  55. /package/dist/domain/{services/pii-pattern.service.js → utils/pii-regex.util.js} +0 -0
  56. /package/dist/infrastructure/{services/data-source-error-handler.type.js → types/on-data-source-error.type.js} +0 -0
@@ -8,5 +8,5 @@ import { ILoggerFactoryConfig, ILogger } from "../../domain/ports";
8
8
  * - Exponer un servicio de logger de alto nivel
9
9
  */
10
10
  export declare class LoggerFactory {
11
- static create(config: ILoggerFactoryConfig): ILogger;
11
+ static create(config: ILoggerFactoryConfig, source?: string): ILogger;
12
12
  }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LoggerFactory = void 0;
4
4
  const value_objects_1 = require("../../domain/value-objects");
5
5
  const pii_redactor_service_1 = require("../../domain/services/pii-redactor.service");
6
- const datasource_service_1 = require("../../infrastructure/services/datasource.service");
6
+ const services_1 = require("../../infrastructure/services");
7
7
  const use_cases_1 = require("../use-cases");
8
8
  /**
9
9
  * Factory principal de @jmlq/logger.
@@ -14,7 +14,7 @@ const use_cases_1 = require("../use-cases");
14
14
  * - Exponer un servicio de logger de alto nivel
15
15
  */
16
16
  class LoggerFactory {
17
- static create(config) {
17
+ static create(config, source = "app-logger") {
18
18
  // 1) Normalizar config
19
19
  const minLevel = config.minLevel ?? value_objects_1.LogLevel.INFO;
20
20
  const datasources = Array.isArray(config.datasources)
@@ -23,7 +23,7 @@ class LoggerFactory {
23
23
  // 2) Componer datasource (si hay varios) con DataSourceService
24
24
  const ds = datasources.length === 1
25
25
  ? datasources[0]
26
- : new datasource_service_1.DataSourceService(datasources);
26
+ : new services_1.DataSourceService(datasources);
27
27
  // 3) Crear/usar redactor de PII
28
28
  const redactor = config.redactor ?? new pii_redactor_service_1.PiiRedactor(config.redactorOptions);
29
29
  // 4) Construir casos de uso de Application
@@ -38,26 +38,26 @@ class LoggerFactory {
38
38
  const service = {
39
39
  // Método genérico de logging
40
40
  async log(level, message, meta) {
41
- await saveLogUseCase.execute(level, message, meta);
41
+ await saveLogUseCase.execute("app-logger", level, message, meta);
42
42
  },
43
43
  // Helpers por nivel
44
44
  trace(message, meta) {
45
- return saveLogUseCase.execute(value_objects_1.LogLevel.TRACE, message, meta);
45
+ return saveLogUseCase.execute(source, value_objects_1.LogLevel.TRACE, message, meta);
46
46
  },
47
47
  debug(message, meta) {
48
- return saveLogUseCase.execute(value_objects_1.LogLevel.DEBUG, message, meta);
48
+ return saveLogUseCase.execute(source, value_objects_1.LogLevel.DEBUG, message, meta);
49
49
  },
50
50
  info(message, meta) {
51
- return saveLogUseCase.execute(value_objects_1.LogLevel.INFO, message, meta);
51
+ return saveLogUseCase.execute(source, value_objects_1.LogLevel.INFO, message, meta);
52
52
  },
53
53
  warn(message, meta) {
54
- return saveLogUseCase.execute(value_objects_1.LogLevel.WARN, message, meta);
54
+ return saveLogUseCase.execute(source, value_objects_1.LogLevel.WARN, message, meta);
55
55
  },
56
56
  error(message, meta) {
57
- return saveLogUseCase.execute(value_objects_1.LogLevel.ERROR, message, meta);
57
+ return saveLogUseCase.execute(source, value_objects_1.LogLevel.ERROR, message, meta);
58
58
  },
59
59
  fatal(message, meta) {
60
- return saveLogUseCase.execute(value_objects_1.LogLevel.FATAL, message, meta);
60
+ return saveLogUseCase.execute(source, value_objects_1.LogLevel.FATAL, message, meta);
61
61
  },
62
62
  // Lectura de logs con filtros
63
63
  async getLogs(filter) {
@@ -1,8 +1,8 @@
1
1
  import { ILogDatasource } from "../../domain/ports";
2
- import { IGetLogsFilterProps } from "../../domain/request";
2
+ import { LogFilterRequest } from "../../domain/request";
3
3
  import { ILogResponse } from "../../domain/response";
4
4
  export declare class GetLogsUseCase {
5
5
  private readonly ds;
6
6
  constructor(ds: ILogDatasource);
7
- execute(filter?: IGetLogsFilterProps): Promise<ILogResponse[]>;
7
+ execute(filter?: LogFilterRequest): Promise<ILogResponse[]>;
8
8
  }
@@ -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
+ }
@@ -1,8 +1,8 @@
1
- import { ISaveLogProps } from "../../domain/request";
2
1
  import { LogMessage } from "../../domain/types";
3
2
  import { LogLevel } from "../../domain/value-objects";
3
+ import { SaveLogDependencies } from "./save-log";
4
4
  export declare class SaveLogUseCase {
5
5
  private readonly props;
6
- constructor(props: ISaveLogProps);
7
- execute(level: LogLevel, message: LogMessage, meta?: unknown): Promise<void>;
6
+ constructor(props: SaveLogDependencies);
7
+ execute(source: string, level: LogLevel, message: LogMessage, meta?: unknown): Promise<void>;
8
8
  }
@@ -1,19 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SaveLogUseCase = void 0;
4
- const services_1 = require("../../domain/services");
4
+ const utils_1 = require("../../domain/utils");
5
5
  class SaveLogUseCase {
6
6
  constructor(props) {
7
7
  this.props = props;
8
8
  }
9
- async execute(level, message, meta) {
9
+ async execute(source, level, message, meta) {
10
10
  // 1) Filtro por nivel (evita hacer trabajo innecesario)
11
11
  if (level < this.props.minLevel)
12
12
  return; // no se loggea
13
13
  // 2) Normalización + PII
14
- const normalized = (0, services_1.normalizeMessage)(message, this.props.redactor);
14
+ const normalized = (0, utils_1.normalizeMessage)(message, this.props.redactor);
15
15
  // 3) Construcción del evento
16
16
  const log = {
17
+ source,
17
18
  level,
18
19
  message: normalized,
19
20
  meta: meta === undefined ? undefined : this.props.redactor.redact(meta),
@@ -4,3 +4,5 @@ export * from "./response";
4
4
  export * from "./services";
5
5
  export * from "./types";
6
6
  export * from "./value-objects";
7
+ export * from "./model";
8
+ export * from "./utils";
@@ -20,3 +20,5 @@ __exportStar(require("./response"), exports);
20
20
  __exportStar(require("./services"), exports);
21
21
  __exportStar(require("./types"), exports);
22
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);
@@ -1,5 +1,6 @@
1
1
  import { LogLevel } from "../value-objects";
2
- export interface ILogProps {
2
+ export interface LogEntry {
3
+ source: string;
3
4
  level: LogLevel;
4
5
  message: string | Record<string, unknown>;
5
6
  meta?: unknown;
@@ -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
+ }
@@ -1,4 +1,4 @@
1
- export interface IPiiReplacementProps {
1
+ export interface PiiReplacementRule {
2
2
  pattern: string;
3
3
  flags?: string;
4
4
  replaceWith: string;
@@ -1,7 +1,7 @@
1
- import { IPiiOptionsProps } from "../request";
1
+ import { PiiOptions } from "../model";
2
2
  import { LogLevel } from "../value-objects";
3
3
  export interface ICreateLoggerOptions {
4
4
  minLevel?: LogLevel;
5
5
  redactPII?: boolean;
6
- pii?: IPiiOptionsProps;
6
+ pii?: PiiOptions;
7
7
  }
@@ -1,8 +1,9 @@
1
- import { IGetLogsFilterProps, ILogProps } from "../request";
1
+ import { LogEntry } from "../model";
2
+ import { LogFilterRequest } from "../request";
2
3
  import { ILogResponse } from "../response";
3
4
  export interface ILogDatasource {
4
- save(log: ILogProps): Promise<void>;
5
- find?(filter?: IGetLogsFilterProps): Promise<ILogResponse[]>;
5
+ save(log: LogEntry): Promise<void>;
6
+ find?(filter?: LogFilterRequest): Promise<ILogResponse[]>;
6
7
  flush?(): Promise<void>;
7
8
  dispose?(): Promise<void>;
8
9
  readonly name?: string;
@@ -1,5 +1,5 @@
1
1
  import { ILogDatasource, IPiiRedactor } from ".";
2
- import { IPiiOptionsProps } from "../request";
2
+ import { PiiOptions } from "../model";
3
3
  import { LogLevel } from "../value-objects";
4
4
  /**
5
5
  * Configuración de alto nivel para construir el logger.
@@ -24,5 +24,5 @@ export interface ILoggerFactoryConfig {
24
24
  * Opciones para el redactor de PII interno.
25
25
  * Solo se usan si no se pasa `redactor` explícito.
26
26
  */
27
- redactorOptions?: IPiiOptionsProps;
27
+ redactorOptions?: PiiOptions;
28
28
  }
@@ -1,4 +1,4 @@
1
- import { IGetLogsFilterProps } from "../request";
1
+ import { LogFilterRequest } from "../request";
2
2
  import { ILogResponse } from "../response";
3
3
  import { LogMessage } from "../types";
4
4
  import { LogLevel } from "../value-objects";
@@ -10,6 +10,6 @@ export interface ILogger {
10
10
  warn(message: LogMessage, meta?: unknown): Promise<void>;
11
11
  error(message: LogMessage, meta?: unknown): Promise<void>;
12
12
  fatal(message: LogMessage, meta?: unknown): Promise<void>;
13
- getLogs(filter?: IGetLogsFilterProps): Promise<ILogResponse[]>;
13
+ getLogs(filter?: LogFilterRequest): Promise<ILogResponse[]>;
14
14
  flush(): Promise<void>;
15
15
  }
@@ -1,5 +1,5 @@
1
- import { IPiiOptionsProps } from "../request";
1
+ import { PiiOptions } from "../model";
2
2
  export interface IPiiRedactor {
3
3
  redact<T = unknown>(value: T): T;
4
- updateOptions?(opts: IPiiOptionsProps): void;
4
+ updateOptions?(opts: PiiOptions): void;
5
5
  }
@@ -1,5 +1 @@
1
- export * from "./save-log.props";
2
- export * from "./pii-options.props";
3
- export * from "./log.props";
4
- export * from "./get-logs-filter.props";
5
- export * from "./pii-replacement.props";
1
+ export * from "./log-filter.request";
@@ -14,8 +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("./save-log.props"), exports);
18
- __exportStar(require("./pii-options.props"), exports);
19
- __exportStar(require("./log.props"), exports);
20
- __exportStar(require("./get-logs-filter.props"), exports);
21
- __exportStar(require("./pii-replacement.props"), exports);
17
+ __exportStar(require("./log-filter.request"), exports);
@@ -1,5 +1,5 @@
1
1
  import { LogLevel } from "../value-objects";
2
- export interface IGetLogsFilterProps {
2
+ export interface LogFilterRequest {
3
3
  levelMin?: LogLevel;
4
4
  since?: number;
5
5
  until?: number;
@@ -1,5 +1,6 @@
1
1
  import { LogLevel } from "../value-objects";
2
2
  export interface ILogResponse {
3
+ source: string;
3
4
  level: LogLevel;
4
5
  message: string | Record<string, unknown>;
5
6
  meta?: unknown;
@@ -1,4 +1 @@
1
1
  export * from "./pii-redactor.service";
2
- export * from "./message-normalizer.service";
3
- export * from "./pii-pattern.service";
4
- export * from "./log-level.service";
@@ -15,6 +15,3 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./pii-redactor.service"), exports);
18
- __exportStar(require("./message-normalizer.service"), exports);
19
- __exportStar(require("./pii-pattern.service"), exports);
20
- __exportStar(require("./log-level.service"), exports);
@@ -1,9 +1,9 @@
1
1
  import { IPiiRedactor } from "../ports";
2
- import { IPiiOptionsProps } from "../request";
2
+ import { PiiOptions } from "../model";
3
3
  export declare class PiiRedactor implements IPiiRedactor {
4
4
  private props;
5
- constructor(props?: IPiiOptionsProps);
6
- updateOptions(opts: IPiiOptionsProps): void;
5
+ constructor(props?: PiiOptions);
6
+ updateOptions(opts: PiiOptions): void;
7
7
  redact<T = unknown>(value: T): T;
8
8
  private applyPatterns;
9
9
  private redactDeep;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PiiRedactor = void 0;
4
- const pii_pattern_service_1 = require("./pii-pattern.service");
4
+ const utils_1 = require("../utils");
5
5
  class PiiRedactor {
6
6
  constructor(props = {}) {
7
7
  this.props = props;
@@ -30,7 +30,7 @@ class PiiRedactor {
30
30
  const patterns = this.props.patterns ?? [];
31
31
  let out = input;
32
32
  for (const p of patterns) {
33
- const rx = (0, pii_pattern_service_1.toPiiRegex)(p);
33
+ const rx = (0, utils_1.toPiiRegex)(p);
34
34
  // replace con patrón RegExp
35
35
  out = out.replace(rx, p.replaceWith);
36
36
  }
@@ -0,0 +1,3 @@
1
+ export * from "./parse-log-level.util";
2
+ export * from "./normalize-message.util";
3
+ export * from "./pii-regex.util";
@@ -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("./parse-log-level.util"), exports);
18
+ __exportStar(require("./normalize-message.util"), exports);
19
+ __exportStar(require("./pii-regex.util"), exports);
@@ -0,0 +1,2 @@
1
+ import { LogLevel } from "../value-objects";
2
+ export declare function parseLogLevel(input: string | number | undefined, fallback?: LogLevel): LogLevel;
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toLogLevel = toLogLevel;
3
+ exports.parseLogLevel = parseLogLevel;
4
4
  const value_objects_1 = require("../value-objects");
5
5
  // Convierte string a LogLevel con fallback seguro
6
- function toLogLevel(level, def = value_objects_1.LogLevel.INFO) {
7
- if (typeof level === "number")
8
- return (Object.values(value_objects_1.LogLevel).includes(level) ? level : def);
9
- if (!level)
10
- return def;
11
- switch (String(level).toLowerCase()) {
6
+ function parseLogLevel(input, fallback = value_objects_1.LogLevel.INFO) {
7
+ if (typeof input === "number")
8
+ return (Object.values(value_objects_1.LogLevel).includes(input) ? input : fallback);
9
+ if (!input)
10
+ return fallback;
11
+ switch (String(input).toLowerCase()) {
12
12
  case "trace":
13
13
  return value_objects_1.LogLevel.TRACE;
14
14
  case "debug":
@@ -22,6 +22,6 @@ function toLogLevel(level, def = value_objects_1.LogLevel.INFO) {
22
22
  case "fatal":
23
23
  return value_objects_1.LogLevel.FATAL;
24
24
  default:
25
- return def; // evita lanzar excepción por valores inesperados
25
+ return fallback; // evita lanzar excepción por valores inesperados
26
26
  }
27
27
  }
@@ -0,0 +1,2 @@
1
+ import { PiiReplacementRule } from "../model";
2
+ export declare function toPiiRegex(props: PiiReplacementRule): RegExp;
package/dist/index.d.ts CHANGED
@@ -1,3 +1,9 @@
1
- export * from "./domain";
2
- export * from "./application";
3
- export * from "./infrastructure";
1
+ export declare function createLogger(config: import("./domain/ports").ILoggerFactoryConfig, source?: string): import("./domain/ports").ILogger;
2
+ export type { ILogger, ILoggerFactoryConfig, ILogDatasource, IPiiRedactor, } from "./domain/ports";
3
+ export { LogLevel } from "./domain/value-objects";
4
+ export type { LogMessage } from "./domain/types";
5
+ export type { LogFilterRequest as LogSearchRequest } from "./domain/request";
6
+ export type { ILogResponse as LogRecord } from "./domain/response";
7
+ export type { PiiOptions as PiiRedactorOptions, LogEntry, } from "./domain/model";
8
+ export { PiiRedactor } from "./domain/services/pii-redactor.service";
9
+ export * as LoggerUtils from "./domain/utils";
package/dist/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- // Re-exporta la API pública del paquete
3
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
3
  if (k2 === undefined) k2 = k;
5
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -11,10 +10,40 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
11
10
  if (k2 === undefined) k2 = k;
12
11
  o[k2] = m[k];
13
12
  }));
14
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
- };
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
17
35
  Object.defineProperty(exports, "__esModule", { value: true });
18
- __exportStar(require("./domain"), exports);
19
- __exportStar(require("./application"), exports);
20
- __exportStar(require("./infrastructure"), exports);
36
+ exports.LoggerUtils = exports.PiiRedactor = exports.LogLevel = void 0;
37
+ exports.createLogger = createLogger;
38
+ const factory_1 = require("./application/factory");
39
+ // 1) API principal de creación
40
+ function createLogger(config, source) {
41
+ return factory_1.LoggerFactory.create(config, source);
42
+ }
43
+ // 3) Tipos de dominio útiles
44
+ var value_objects_1 = require("./domain/value-objects");
45
+ Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return value_objects_1.LogLevel; } });
46
+ var pii_redactor_service_1 = require("./domain/services/pii-redactor.service");
47
+ Object.defineProperty(exports, "PiiRedactor", { enumerable: true, get: function () { return pii_redactor_service_1.PiiRedactor; } });
48
+ // 5) Utils públicos
49
+ exports.LoggerUtils = __importStar(require("./domain/utils"));
@@ -1,15 +1,18 @@
1
- import { DataSourceErrorHandler } from ".";
1
+ import { OnDataSourceError } from "../types";
2
2
  import { ILogDatasource } from "../../domain/ports";
3
- import { IGetLogsFilterProps, ILogProps } from "../../domain/request";
3
+ import { LogFilterRequest } from "../../domain/request";
4
4
  import { ILogResponse } from "../../domain/response";
5
+ import { LogEntry } from "../../domain/model";
5
6
  export declare class DataSourceService implements ILogDatasource {
6
7
  private readonly targets;
7
8
  private readonly onError?;
8
9
  readonly name = "composite";
9
- constructor(targets: ILogDatasource[], onError?: DataSourceErrorHandler | undefined);
10
+ private logs;
11
+ private nextId;
12
+ constructor(targets: ILogDatasource[], onError?: OnDataSourceError | undefined);
10
13
  private handleError;
11
- save(log: ILogProps): Promise<void>;
12
- find(filter?: IGetLogsFilterProps): Promise<ILogResponse[]>;
14
+ save(log: LogEntry): Promise<void>;
15
+ find(filter?: LogFilterRequest): Promise<ILogResponse[]>;
13
16
  flush(): Promise<void>;
14
17
  dispose(): Promise<void>;
15
18
  }
@@ -6,6 +6,8 @@ class DataSourceService {
6
6
  this.targets = targets;
7
7
  this.onError = onError;
8
8
  this.name = "composite";
9
+ this.logs = [];
10
+ this.nextId = 1;
9
11
  this.targets = (targets ?? []).filter(Boolean);
10
12
  }
11
13
  handleError(op, i, reason) {
@@ -22,14 +24,50 @@ class DataSourceService {
22
24
  console.warn(`[DataSourceService] ${op} error in ds#${i} (${datasourceName})`, reason);
23
25
  }
24
26
  async save(log) {
27
+ // 1) Fan-out a todos los datasources
25
28
  const results = await Promise.allSettled(this.targets.map((ds) => ds.save(log)));
26
29
  results.forEach((r, i) => {
27
30
  if (r.status === "rejected") {
28
31
  this.handleError("save", i, r.reason);
29
32
  }
30
33
  });
34
+ // 2) Indexar en memoria para soportar find() con filtros/paginación
35
+ this.logs.push({
36
+ ...log,
37
+ id: this.nextId++,
38
+ });
31
39
  }
32
40
  async find(filter) {
41
+ // Si hay logs indexados en memoria, usamos ese índice
42
+ if (this.logs.length > 0) {
43
+ let result = [...this.logs];
44
+ // Orden ASC por timestamp
45
+ result.sort((a, b) => a.timestamp - b.timestamp);
46
+ if (filter) {
47
+ const { levelMin, since, until, query, offset = 0, limit } = filter;
48
+ if (levelMin !== undefined) {
49
+ result = result.filter((l) => l.level >= levelMin);
50
+ }
51
+ if (since !== undefined) {
52
+ result = result.filter((l) => l.timestamp >= since);
53
+ }
54
+ if (until !== undefined) {
55
+ result = result.filter((l) => l.timestamp <= until);
56
+ }
57
+ if (query) {
58
+ const q = query.toLowerCase();
59
+ result = result.filter((l) => {
60
+ const msg = typeof l.message === "string" ? l.message.toLowerCase() : "";
61
+ return msg.includes(q);
62
+ });
63
+ }
64
+ const start = offset;
65
+ const end = limit != null ? start + limit : undefined;
66
+ result = result.slice(start, end);
67
+ }
68
+ return result;
69
+ }
70
+ // Si NO hay logs en memoria, delegamos en los datasources
33
71
  const results = await Promise.allSettled(this.targets.map((ds) => ds.find?.(filter)));
34
72
  const logs = [];
35
73
  results.forEach((r, i) => {
@@ -40,37 +78,10 @@ class DataSourceService {
40
78
  this.handleError("find", i, r.reason);
41
79
  }
42
80
  });
43
- logs.sort((a, b) => b.timestamp - a.timestamp);
81
+ // Orden ASC también aquí, para cumplir el test
82
+ logs.sort((a, b) => a.timestamp - b.timestamp);
44
83
  return logs;
45
84
  }
46
- // async find(filter?: IGetLogsFilterProps): Promise<ILogResponse[]> {
47
- // let results = [...this.logs];
48
- // if (filter?.levelMin !== undefined) {
49
- // results = results.filter((log) => log.level >= filter.levelMin!);
50
- // }
51
- // if (filter?.since !== undefined) {
52
- // results = results.filter((log) => log.timestamp >= filter.since!);
53
- // }
54
- // if (filter?.until !== undefined) {
55
- // results = results.filter((log) => log.timestamp <= filter.until!);
56
- // }
57
- // if (filter?.query) {
58
- // const q = filter.query.toLowerCase();
59
- // results = results.filter((log) => {
60
- // const msg =
61
- // typeof log.message === "string"
62
- // ? log.message.toLowerCase()
63
- // : JSON.stringify(log.message).toLowerCase();
64
- // return msg.includes(q);
65
- // });
66
- // }
67
- // // Ordenar por timestamp ascendente (opcional pero útil para visualizar)
68
- // results.sort((a, b) => a.timestamp - b.timestamp);
69
- // // Paginación
70
- // const offset = filter?.offset ?? 0;
71
- // const limit = filter?.limit ?? results.length;
72
- // return results.slice(offset, offset + limit);
73
- // }
74
85
  async flush() {
75
86
  const results = await Promise.allSettled(this.targets.map((ds) => ds.flush?.()));
76
87
  results.forEach((r, i) => {
@@ -1,2 +1 @@
1
1
  export * from "./datasource.service";
2
- export * from "./data-source-error-handler.type";
@@ -15,4 +15,3 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./datasource.service"), exports);
18
- __exportStar(require("./data-source-error-handler.type"), exports);
@@ -0,0 +1 @@
1
+ export * from "./on-data-source-error.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("./on-data-source-error.type"), exports);
@@ -1,4 +1,4 @@
1
- export type DataSourceErrorHandler = (info: {
1
+ export type OnDataSourceError = (info: {
2
2
  operation: "save" | "find" | "flush" | "dispose";
3
3
  datasourceName: string;
4
4
  reason: any;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jmlq/logger",
3
3
  "description": "logger package with clean architecture",
4
- "version": "0.1.0-alpha.16",
4
+ "version": "0.1.0-alpha.18",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
@@ -1,8 +0,0 @@
1
- import { IPiiReplacementProps } from ".";
2
- export interface IPiiOptionsProps {
3
- enabled?: boolean;
4
- whitelistKeys?: string[];
5
- blacklistKeys?: string[];
6
- patterns?: IPiiReplacementProps[];
7
- deep?: boolean;
8
- }
@@ -1,7 +0,0 @@
1
- import { ILogDatasource, IPiiRedactor } from "../ports";
2
- import { LogLevel } from "../value-objects";
3
- export interface ISaveLogProps {
4
- ds: ILogDatasource;
5
- minLevel: LogLevel;
6
- redactor: IPiiRedactor;
7
- }
@@ -1,2 +0,0 @@
1
- import { LogLevel } from "../value-objects";
2
- export declare function toLogLevel(level: string | number | undefined, def?: LogLevel): LogLevel;
@@ -1,2 +0,0 @@
1
- import { IPiiReplacementProps } from "../request";
2
- export declare function toPiiRegex(props: IPiiReplacementProps): RegExp;