@jmlq/logger-plugin-fs 0.1.0-alpha.0 → 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 (118) hide show
  1. package/README.md +229 -0
  2. package/architecture.md +426 -0
  3. package/dist/application/dto/index.d.ts +1 -0
  4. package/dist/application/dto/index.js +17 -0
  5. package/dist/application/dto/rotate-if-needed.request.d.ts +10 -0
  6. package/dist/application/dto/rotate-if-needed.request.js +2 -0
  7. package/dist/application/factory/create-fs-datasource.factory.d.ts +16 -0
  8. package/dist/application/factory/create-fs-datasource.factory.js +51 -0
  9. package/dist/application/factory/index.d.ts +1 -0
  10. package/dist/application/factory/index.js +17 -0
  11. package/dist/application/use-cases/append-log.use-case.d.ts +30 -0
  12. package/dist/application/use-cases/append-log.use-case.js +39 -0
  13. package/dist/application/use-cases/ensure-directory.use-case.d.ts +58 -0
  14. package/dist/application/use-cases/ensure-directory.use-case.js +64 -0
  15. package/dist/application/use-cases/find-logs-use-case.d.ts +17 -0
  16. package/dist/application/use-cases/find-logs-use-case.js +64 -0
  17. package/dist/application/use-cases/index.d.ts +5 -0
  18. package/dist/application/use-cases/index.js +21 -0
  19. package/dist/application/use-cases/persist-log.use-case.d.ts +96 -0
  20. package/dist/application/use-cases/persist-log.use-case.js +105 -0
  21. package/dist/application/use-cases/rotate-if-needed.use-case.d.ts +55 -0
  22. package/dist/application/use-cases/rotate-if-needed.use-case.js +61 -0
  23. package/dist/domain/model/index.d.ts +1 -0
  24. package/dist/domain/model/index.js +17 -0
  25. package/dist/domain/model/log-entry.model.d.ts +8 -0
  26. package/dist/domain/model/log-entry.model.js +2 -0
  27. package/dist/domain/ports/file/file-path.port.d.ts +38 -0
  28. package/dist/domain/ports/file/file-path.port.js +2 -0
  29. package/dist/domain/ports/file/file-rotator.port.d.ts +42 -0
  30. package/dist/domain/ports/file/file-rotator.port.js +2 -0
  31. package/dist/domain/ports/file/index.d.ts +2 -0
  32. package/dist/domain/ports/file/index.js +18 -0
  33. package/dist/domain/ports/file/log-stream-writer.port.d.ts +70 -0
  34. package/dist/domain/ports/file/log-stream-writer.port.js +2 -0
  35. package/dist/domain/ports/filesystem-provider.port.d.ts +61 -0
  36. package/dist/domain/ports/filesystem-provider.port.js +2 -0
  37. package/dist/domain/ports/index.d.ts +5 -0
  38. package/dist/domain/ports/index.js +21 -0
  39. package/dist/domain/ports/logs/find/index.d.ts +2 -0
  40. package/dist/domain/ports/logs/find/index.js +18 -0
  41. package/dist/domain/ports/logs/find/log-file-line-reader.port.d.ts +3 -0
  42. package/dist/domain/ports/logs/find/log-file-line-reader.port.js +2 -0
  43. package/dist/domain/ports/logs/find/log-file-numerator.port.d.ts +3 -0
  44. package/dist/domain/ports/logs/find/log-file-numerator.port.js +2 -0
  45. package/dist/domain/ports/logs/index.d.ts +2 -0
  46. package/dist/domain/ports/logs/index.js +18 -0
  47. package/dist/domain/ports/logs/log-datasource.port.d.ts +10 -0
  48. package/dist/domain/ports/logs/log-datasource.port.js +2 -0
  49. package/dist/domain/ports/system-clock.port.d.ts +8 -0
  50. package/dist/domain/ports/system-clock.port.js +2 -0
  51. package/dist/domain/request/index.d.ts +2 -0
  52. package/dist/domain/request/index.js +18 -0
  53. package/dist/domain/request/log-filter.request.d.ts +9 -0
  54. package/dist/domain/request/log-filter.request.js +2 -0
  55. package/dist/domain/request/save-log.request.d.ts +7 -0
  56. package/dist/domain/request/save-log.request.js +2 -0
  57. package/dist/domain/response/index.d.ts +1 -0
  58. package/dist/domain/response/index.js +17 -0
  59. package/dist/domain/response/log.response.d.ts +8 -0
  60. package/dist/domain/response/log.response.js +2 -0
  61. package/dist/domain/types/fs-rotation-by.type.d.ts +8 -0
  62. package/dist/domain/types/fs-rotation-by.type.js +2 -0
  63. package/dist/domain/types/index.d.ts +1 -0
  64. package/dist/domain/types/index.js +17 -0
  65. package/dist/domain/value-objects/file-name-pattern.vo.d.ts +36 -0
  66. package/dist/domain/value-objects/file-name-pattern.vo.js +53 -0
  67. package/dist/domain/value-objects/file-path.vo.d.ts +91 -0
  68. package/dist/domain/value-objects/file-path.vo.js +100 -0
  69. package/dist/domain/value-objects/file-rotation-policy.vo.d.ts +51 -0
  70. package/dist/domain/value-objects/file-rotation-policy.vo.js +76 -0
  71. package/dist/domain/value-objects/file-size.vo.d.ts +75 -0
  72. package/dist/domain/value-objects/file-size.vo.js +114 -0
  73. package/dist/domain/value-objects/index.d.ts +5 -0
  74. package/dist/domain/value-objects/index.js +21 -0
  75. package/dist/domain/value-objects/log-level.vo.d.ts +8 -0
  76. package/dist/domain/value-objects/log-level.vo.js +13 -0
  77. package/dist/index.d.ts +3 -11
  78. package/dist/index.js +10 -61
  79. package/dist/infrastructure/adapters/file-rotator.adapter.d.ts +79 -0
  80. package/dist/infrastructure/adapters/file-rotator.adapter.js +171 -0
  81. package/dist/infrastructure/adapters/fileSystem-datasource.adapter.d.ts +26 -0
  82. package/dist/infrastructure/adapters/fileSystem-datasource.adapter.js +45 -0
  83. package/dist/infrastructure/adapters/filesystem-log-file-enumerator.adapter.d.ts +6 -0
  84. package/dist/infrastructure/adapters/filesystem-log-file-enumerator.adapter.js +54 -0
  85. package/dist/infrastructure/adapters/filesystem-log-file-line-reader.adapter.d.ts +4 -0
  86. package/dist/infrastructure/adapters/filesystem-log-file-line-reader.adapter.js +53 -0
  87. package/dist/infrastructure/adapters/filesystem-provider.adapter.d.ts +122 -0
  88. package/dist/infrastructure/adapters/filesystem-provider.adapter.js +182 -0
  89. package/dist/infrastructure/adapters/index.d.ts +8 -0
  90. package/dist/infrastructure/adapters/index.js +24 -0
  91. package/dist/infrastructure/adapters/log-stream-writer.adapter.d.ts +80 -0
  92. package/dist/infrastructure/adapters/log-stream-writer.adapter.js +163 -0
  93. package/dist/infrastructure/adapters/system-clock.adapter.d.ts +25 -0
  94. package/dist/infrastructure/adapters/system-clock.adapter.js +30 -0
  95. package/dist/infrastructure/adapters/system-file-path.adapter.d.ts +47 -0
  96. package/dist/infrastructure/adapters/system-file-path.adapter.js +141 -0
  97. package/dist/infrastructure/errors/file-operation.error.d.ts +28 -0
  98. package/dist/infrastructure/errors/file-operation.error.js +54 -0
  99. package/dist/infrastructure/errors/index.d.ts +1 -0
  100. package/dist/infrastructure/errors/index.js +17 -0
  101. package/dist/infrastructure/errors/types/file-operation-error-options.type.d.ts +8 -0
  102. package/dist/infrastructure/errors/types/file-operation-error-options.type.js +2 -0
  103. package/dist/infrastructure/errors/types/file-operation.type.d.ts +1 -0
  104. package/dist/infrastructure/errors/types/file-operation.type.js +2 -0
  105. package/dist/infrastructure/errors/types/fs-error-scope.type.d.ts +1 -0
  106. package/dist/infrastructure/errors/types/fs-error-scope.type.js +2 -0
  107. package/dist/infrastructure/errors/types/index.d.ts +3 -0
  108. package/dist/infrastructure/errors/types/index.js +19 -0
  109. package/dist/infrastructure/filesystem/index.d.ts +1 -0
  110. package/dist/infrastructure/filesystem/index.js +17 -0
  111. package/dist/infrastructure/filesystem/types/filesystem-datasource-options.type.d.ts +45 -0
  112. package/dist/infrastructure/filesystem/types/filesystem-datasource-options.type.js +2 -0
  113. package/dist/infrastructure/filesystem/types/filesystem-rotation.type.d.ts +12 -0
  114. package/dist/infrastructure/filesystem/types/filesystem-rotation.type.js +2 -0
  115. package/dist/infrastructure/filesystem/types/index.d.ts +2 -0
  116. package/dist/infrastructure/filesystem/types/index.js +18 -0
  117. package/install.md +520 -0
  118. package/package.json +40 -12
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RotateIfNeededUseCase = void 0;
4
+ /**
5
+ * RotateIfNeededUseCase
6
+ * -----------------------------------------------------------------------------
7
+ * Caso de uso de Application que:
8
+ * - determina si se debe rotar (según policy + fecha)
9
+ * - si aplica, cambia el writer al nuevo archivo (close/open)
10
+ * - ejecuta un hook opcional onRotate(oldPath, newPath)
11
+ *
12
+ * Nota:
13
+ * - Depende de ports (IO indirecto).
14
+ * - Existe potencial de duplicidad si otro use-case también asegura open/close.
15
+ */
16
+ class RotateIfNeededUseCase {
17
+ constructor(
18
+ /**
19
+ * Componente de rotación/naming (según diseño actual).
20
+ */
21
+ fileRotator,
22
+ /**
23
+ * Writer por stream usado para cerrar/abrir el archivo activo.
24
+ */
25
+ fileSystemWriter,
26
+ /**
27
+ * Hook opcional ejecutado cuando efectivamente se rota.
28
+ */
29
+ onRotate) {
30
+ this.fileRotator = fileRotator;
31
+ this.fileSystemWriter = fileSystemWriter;
32
+ this.onRotate = onRotate;
33
+ }
34
+ /**
35
+ * Ejecuta el flujo "rotar si hace falta".
36
+ * Retorna:
37
+ * - null si no corresponde rotar
38
+ * - newPath si rotó (o si el expected path es el nuevo destino)
39
+ */
40
+ async execute(dto) {
41
+ const { currentDate, rotationPolicy } = dto;
42
+ // Decide si corresponde rotar (según implementación actual del port)
43
+ const shouldRotate = await this.fileRotator.shouldRotate(rotationPolicy, currentDate);
44
+ if (!shouldRotate) {
45
+ return null;
46
+ }
47
+ // Path anterior (si existe) y path esperado para la fecha actual
48
+ const oldPath = this.fileRotator.getCurrentPath();
49
+ const newPath = this.fileRotator.getExpectedPathForDate(currentDate);
50
+ // Solo si hay cambio real de archivo, se reabre el writer
51
+ if (oldPath && !oldPath.equals(newPath)) {
52
+ await this.fileSystemWriter.close();
53
+ await this.fileSystemWriter.open(newPath);
54
+ if (this.onRotate) {
55
+ await this.onRotate(oldPath, newPath);
56
+ }
57
+ }
58
+ return newPath;
59
+ }
60
+ }
61
+ exports.RotateIfNeededUseCase = RotateIfNeededUseCase;
@@ -0,0 +1 @@
1
+ export * from "./log-entry.model";
@@ -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("./log-entry.model"), exports);
@@ -0,0 +1,8 @@
1
+ import { LogLevel } from "../value-objects";
2
+ export interface LogEntry {
3
+ source: string;
4
+ level: LogLevel;
5
+ message: string | Record<string, unknown>;
6
+ meta?: unknown;
7
+ timestamp: number;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,38 @@
1
+ import { FilePath } from "../../value-objects";
2
+ /**
3
+ * IFilePathPort
4
+ * -----------------------------------------------------------------------------
5
+ * Puerto de dominio para:
6
+ * 1) Construir un FilePath (Value Object) desde entradas string externas.
7
+ * 2) Componer rutas a partir de un FilePath existente.
8
+ *
9
+ * Motivación (Clean Architecture):
10
+ * - El dominio/aplicación NO dependen de `node:path` ni de reglas de OS.
11
+ * - Infraestructura provee un adapter (ej. SystemFilePathAdapter) que implementa esto.
12
+ *
13
+ * Nota de consistencia:
14
+ * - Define y respeta si FilePath en tu dominio es SIEMPRE absoluto o puede ser relativo.
15
+ * (Si es siempre absoluto, fromRaw debería resolver a absoluto.)
16
+ */
17
+ export interface IFilePathPort {
18
+ /**
19
+ * Construye un FilePath a partir de una ruta cruda (relativa o absoluta).
20
+ *
21
+ * Responsabilidades del adapter:
22
+ * - Validar input mínimo (string no vacío).
23
+ * - Normalizar separadores / limpiar.
24
+ * - (Opcional según tu modelo) Resolver a ruta absoluta.
25
+ */
26
+ fromRaw(inputPath: string): FilePath;
27
+ /**
28
+ * Une segmentos a partir de un FilePath base y retorna un nuevo FilePath (inmutable).
29
+ *
30
+ * Caso típico:
31
+ * - basePath (FilePath) + "subdir" + "file.log"
32
+ *
33
+ * Responsabilidades del adapter:
34
+ * - Validar segmentos (no vacíos si aplica).
35
+ * - Normalizar la ruta resultante.
36
+ */
37
+ join(filePath: FilePath, ...segments: string[]): FilePath;
38
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,42 @@
1
+ import { FileSize, FilePath, FileRotationPolicy } from "../../value-objects";
2
+ /**
3
+ * IFileRotatorPort
4
+ * -----------------------------------------------------------------------------
5
+ * Puerto de dominio para consultar información del filesystem necesaria
6
+ * para implementar rotación de archivos (logs) en casos de uso/servicios.
7
+ *
8
+ * Importante (Clean Architecture):
9
+ * - Este port NO debe contener reglas de negocio (p. ej. decidir si rotar).
10
+ * - Debe limitarse a capacidades del mundo externo (filesystem).
11
+ *
12
+ * La decisión de rotación (por fecha/tamaño/política) debe vivir en:
13
+ * - un Domain Service (reglas), o
14
+ * - un Use Case (orquestación), pero no dentro del port.
15
+ */
16
+ export interface IFileRotatorPort {
17
+ /**
18
+ * Obtiene el archivo de log "actual" si existe/está determinado
19
+ * por la implementación (por ejemplo, por configuración).
20
+ *
21
+ * Nota:
22
+ * - Si el "current" depende solo de config, considera eliminar esto
23
+ * y que el caso de uso lo derive desde config/naming.
24
+ */
25
+ getCurrentPath(): FilePath | null;
26
+ /**
27
+ * Calcular cómo se va a llamar el archivo según una fecha
28
+ * @param date Fecha para la que se quiere el path
29
+ */
30
+ getExpectedPathForDate(date: Date): FilePath;
31
+ /**
32
+ * Consulta el tamaño del archivo en filesystem.
33
+ * (IO puro; ideal para políticas de rotación por tamaño).
34
+ */
35
+ getFileSize(filePath: FilePath): Promise<FileSize>;
36
+ /**
37
+ * Decidir si corresponde rotar de acuerdo a una RotationPolicy y la fecha actual
38
+ * @param policy Política de rotación
39
+ * @param currentDate Fecha actual
40
+ */
41
+ shouldRotate(policy: FileRotationPolicy, currentDate: Date): Promise<boolean>;
42
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ export * from "./file-path.port";
2
+ export * from "./file-rotator.port";
@@ -0,0 +1,18 @@
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("./file-path.port"), exports);
18
+ __exportStar(require("./file-rotator.port"), exports);
@@ -0,0 +1,70 @@
1
+ import { FilePath } from "../../value-objects";
2
+ /**
3
+ * IFileSystemWriterPort
4
+ * -----------------------------------------------------------------------------
5
+ * Puerto de salida (Outbound Port) que abstrae un writer basado en stream.
6
+ *
7
+ * Uso típico:
8
+ * - open(path)
9
+ * - write(line)
10
+ * - flush() (opcional, antes de rotar o cerrar)
11
+ * - close() (cerrar el stream actual, con posibilidad de reabrir)
12
+ * - end() (finalizar definitivamente / liberar recursos)
13
+ *
14
+ * Implementación típica en infraestructura:
15
+ * - Node.js fs.createWriteStream + manejo de backpressure ("drain")
16
+ */
17
+ export interface ILogStreamWriterPort {
18
+ /**
19
+ * Escribe datos al stream actual.
20
+ *
21
+ * Retorna:
22
+ * - true: la escritura fue aceptada sin saturar el buffer
23
+ * - false: hay backpressure (buffer lleno) y conviene esperar antes de seguir
24
+ *
25
+ * Nota de diseño:
26
+ * - Si la implementación "await" internamente hasta que drene, el boolean pierde valor.
27
+ * En ese caso considera devolver Promise<void> y ocultar backpressure.
28
+ */
29
+ write(data: string): Promise<boolean>;
30
+ /**
31
+ * Abre un stream para un archivo específico.
32
+ * Debe dejar el writer listo para recibir write().
33
+ */
34
+ open(filePath: FilePath): Promise<void>;
35
+ /**
36
+ * Cierra el stream actual (si existe) SIN implicar "dispose definitivo".
37
+ * Útil para rotación: cerrar -> renombrar -> open(nuevo).
38
+ *
39
+ * Recomendación:
40
+ * - Define claramente si close() es idempotente (llamar dos veces no falla).
41
+ */
42
+ close(): Promise<void>;
43
+ /**
44
+ * Fuerza a que todo lo pendiente se escriba antes de continuar.
45
+ *
46
+ * Importante:
47
+ * - Define qué garantiza: ¿solo vaciar buffer en memoria? ¿fsync a disco?
48
+ * - Es clave si la rotación requiere consistencia antes de renombrar/mover.
49
+ */
50
+ flush(): Promise<void>;
51
+ /**
52
+ * Indica si el writer está abierto y listo para recibir escrituras.
53
+ * Útil para evitar errores por write() sin open().
54
+ */
55
+ isOpen(): boolean;
56
+ /**
57
+ * Devuelve el FilePath actualmente abierto para escritura, o null si no hay.
58
+ * Útil para diagnóstico o para decidir rotación desde la aplicación.
59
+ */
60
+ getCurrentPath(): FilePath | null;
61
+ /**
62
+ * Finaliza definitivamente el writer.
63
+ * Debe liberar recursos y dejar el objeto en estado no reutilizable
64
+ * (o al menos documentar si se puede reabrir).
65
+ *
66
+ * Recomendación:
67
+ * - Aclara la diferencia exacta con close().
68
+ */
69
+ end(): Promise<void>;
70
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Es una abstracción del sistema de archivos (fs) que la capa de dominio puede solicitar sin depender directamente del módulo fs de Node
3
+ */
4
+ export interface IFileSystemProviderPort {
5
+ /**
6
+ * Permite saber si un archivo o carpeta existe
7
+ * @param path Ruta del archivo o directorio
8
+ */
9
+ exists(path: string): Promise<boolean>;
10
+ /**
11
+ * Permite crear directorios
12
+ * @param path Ruta del directorio
13
+ * @param options Opciones de creación. Actualmente solo soporta 'recursive' (Indica si se deben crear directorios padres si no existen)
14
+ */
15
+ mkdir(path: string, options?: {
16
+ recursive?: boolean;
17
+ }): Promise<void>;
18
+ /**
19
+ * Se usa para leer registros existentes
20
+ * @param path Ruta del archivo
21
+ */
22
+ readFile(path: string): Promise<Buffer>;
23
+ /**
24
+ * Se usa para escribir registros nuevos
25
+ * @param path Ruta del archivo
26
+ * @param data Datos a escribir
27
+ */
28
+ writeFile(path: string, data: string | Buffer): Promise<void>;
29
+ /**
30
+ * Se usa para agregar registros nuevos al final del archivo
31
+ * @param path Ruta del archivo
32
+ * @param data Datos a agregar
33
+ */
34
+ appendFile(path: string, data: string | Buffer): Promise<void>;
35
+ /**
36
+ * Permite obtener metadata del archivo o directorio
37
+ * - Ver tamaño actual → política de RotationPolicy.
38
+ * - Ver fecha de modificación → rotación diaria/semanal.
39
+ * @param path Ruta del archivo o directorio
40
+ */
41
+ stat(path: string): Promise<{
42
+ size: number;
43
+ mtime: Date;
44
+ }>;
45
+ /**
46
+ * Necesario para rotación por índice y descubrimiento de archivos app.log.1, app.log.2, etc.
47
+ * @param path Ruta del directorio
48
+ */
49
+ readdir(path: string): Promise<string[]>;
50
+ /**
51
+ * Eliminar archivos antiguos.
52
+ * @param path Ruta del archivo
53
+ */
54
+ unlink(path: string): Promise<void>;
55
+ /**
56
+ * Clave para renombrar archivos cuando rotan.
57
+ * @param oldPath Ruta actual del archivo o directorio
58
+ * @param newPath Nueva ruta del archivo o directorio
59
+ */
60
+ rename(oldPath: string, newPath: string): Promise<void>;
61
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ export * from "./system-clock.port";
2
+ export * from "./filesystem-provider.port";
3
+ export * from "./file/log-stream-writer.port";
4
+ export * from "./file";
5
+ export * from "./logs";
@@ -0,0 +1,21 @@
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("./system-clock.port"), exports);
18
+ __exportStar(require("./filesystem-provider.port"), exports);
19
+ __exportStar(require("./file/log-stream-writer.port"), exports);
20
+ __exportStar(require("./file"), exports);
21
+ __exportStar(require("./logs"), exports);
@@ -0,0 +1,2 @@
1
+ export * from "./log-file-line-reader.port";
2
+ export * from "./log-file-numerator.port";
@@ -0,0 +1,18 @@
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-file-line-reader.port"), exports);
18
+ __exportStar(require("./log-file-numerator.port"), exports);
@@ -0,0 +1,3 @@
1
+ export interface ILogFileLineReaderPort {
2
+ readLines(filePath: string): AsyncIterable<string>;
3
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export interface ILogFileEnumeratorPort {
2
+ listLogFiles(): Promise<string[]>;
3
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ export * from "./find";
2
+ export * from "./log-datasource.port";
@@ -0,0 +1,18 @@
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("./find"), exports);
18
+ __exportStar(require("./log-datasource.port"), exports);
@@ -0,0 +1,10 @@
1
+ import { LogFilterRequest } from "../../request";
2
+ import { LogEntry } from "../../model";
3
+ import { ILogResponse } from "../../response";
4
+ export interface ILogDatasource {
5
+ save(log: LogEntry): Promise<void>;
6
+ find?(filter?: LogFilterRequest): Promise<ILogResponse[]>;
7
+ flush?(): Promise<void>;
8
+ dispose?(): Promise<void>;
9
+ readonly name?: string;
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Representa una abstracción del reloj del sistema dentro de la capa domain.
3
+ * Su único propósito es permitir que el dominio pueda obtener la hora actual
4
+ * sin depender directamente de new Date() ni de Date.now()
5
+ */
6
+ export interface ISystemClockPort {
7
+ now(): Date;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ export * from "./log-filter.request";
2
+ export * from "./save-log.request";
@@ -0,0 +1,18 @@
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-filter.request"), exports);
18
+ __exportStar(require("./save-log.request"), exports);
@@ -0,0 +1,9 @@
1
+ import { LogLevel } from "../value-objects";
2
+ export interface LogFilterRequest {
3
+ levelMin?: LogLevel;
4
+ since?: number;
5
+ until?: number;
6
+ limit?: number;
7
+ offset?: number;
8
+ query?: string;
9
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ import { LogEntry } from "../model";
2
+ /**
3
+ * Request model del caso de uso SaveLog.
4
+ */
5
+ export interface SaveLogRequest {
6
+ log: LogEntry;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export * from "./log.response";
@@ -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("./log.response"), exports);
@@ -0,0 +1,8 @@
1
+ import { LogLevel } from "../value-objects";
2
+ export interface ILogResponse {
3
+ source: string;
4
+ level: LogLevel;
5
+ message: string | Record<string, unknown>;
6
+ meta?: unknown;
7
+ timestamp: number;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Es un tipo discriminado que define cómo se realizará la rotación de logs dentro del sistema.
3
+ * Los valores significan:
4
+ * "none" → Sin rotación. El archivo crece indefinidamente.
5
+ * "day" → Rotación diaria (por fecha).
6
+ * "size" → Rotación por tamaño (normalmente basado en maxSizeMB).
7
+ */
8
+ export type FsRotationBy = "none" | "day" | "size";
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export * from "./fs-rotation-by.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("./fs-rotation-by.type"), exports);
@@ -0,0 +1,36 @@
1
+ /**
2
+ * FileNamePattern (Value Object)
3
+ * -----------------------------------------------------------------------------
4
+ * Representa un patrón de nombrado de archivos de log.
5
+ *
6
+ * Ejemplos:
7
+ * - "app.log"
8
+ * - "app-{yyyy}{MM}{dd}.log"
9
+ *
10
+ * Responsabilidades:
11
+ * - Garantizar invariantes (string no vacío, sin solo espacios)
12
+ * - Exponer el patrón inmutable
13
+ * - Ofrecer operaciones de dominio relacionadas (tokens)
14
+ */
15
+ export declare class FileNamePattern {
16
+ private readonly _pattern;
17
+ /**
18
+ * Regex base para capturar tokens: "{...}"
19
+ * Centralizarlo evita inconsistencias entre métodos.
20
+ */
21
+ private static readonly TOKEN_REGEX;
22
+ /**
23
+ * Crea un patrón válido.
24
+ * Invariante: debe ser string no vacío y no solo whitespace.
25
+ */
26
+ constructor(pattern: string);
27
+ /**
28
+ * Retorna el valor inmutable del patrón.
29
+ */
30
+ get pattern(): string;
31
+ /**
32
+ * Devuelve todos los tokens encerrados en llaves presentes en el patrón.
33
+ * Ej: "app-{yyyy}{MM}.log" => ["yyyy", "MM"]
34
+ */
35
+ getTokens(): string[];
36
+ }