@jmlq/logger-plugin-fs 0.1.0-alpha.1 → 0.1.0-alpha.11

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 (119) hide show
  1. package/README.md +551 -0
  2. package/architecture.md +299 -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/types/filesystem-datasource-options.type.d.ts +45 -0
  12. package/dist/application/types/filesystem-datasource-options.type.js +2 -0
  13. package/dist/application/types/index.d.ts +1 -0
  14. package/dist/application/types/index.js +17 -0
  15. package/dist/application/use-cases/append-log.use-case.d.ts +30 -0
  16. package/dist/application/use-cases/append-log.use-case.js +39 -0
  17. package/dist/application/use-cases/ensure-directory.use-case.d.ts +58 -0
  18. package/dist/application/use-cases/ensure-directory.use-case.js +64 -0
  19. package/dist/application/use-cases/find-logs-use-case.d.ts +17 -0
  20. package/dist/application/use-cases/find-logs-use-case.js +64 -0
  21. package/dist/application/use-cases/index.d.ts +5 -0
  22. package/dist/application/use-cases/index.js +21 -0
  23. package/dist/application/use-cases/persist-log.use-case.d.ts +96 -0
  24. package/dist/application/use-cases/persist-log.use-case.js +105 -0
  25. package/dist/application/use-cases/rotate-if-needed.use-case.d.ts +55 -0
  26. package/dist/application/use-cases/rotate-if-needed.use-case.js +61 -0
  27. package/dist/domain/model/index.d.ts +1 -0
  28. package/dist/domain/model/index.js +17 -0
  29. package/dist/domain/model/log-entry.model.d.ts +8 -0
  30. package/dist/domain/model/log-entry.model.js +2 -0
  31. package/dist/domain/ports/file/file-path.port.d.ts +38 -0
  32. package/dist/domain/ports/file/file-path.port.js +2 -0
  33. package/dist/domain/ports/file/file-rotator.port.d.ts +42 -0
  34. package/dist/domain/ports/file/file-rotator.port.js +2 -0
  35. package/dist/domain/ports/file/index.d.ts +2 -0
  36. package/dist/domain/ports/file/index.js +18 -0
  37. package/dist/domain/ports/file/log-stream-writer.port.d.ts +70 -0
  38. package/dist/domain/ports/file/log-stream-writer.port.js +2 -0
  39. package/dist/domain/ports/filesystem-provider.port.d.ts +61 -0
  40. package/dist/domain/ports/filesystem-provider.port.js +2 -0
  41. package/dist/domain/ports/index.d.ts +5 -0
  42. package/dist/domain/ports/index.js +21 -0
  43. package/dist/domain/ports/logs/find/index.d.ts +2 -0
  44. package/dist/domain/ports/logs/find/index.js +18 -0
  45. package/dist/domain/ports/logs/find/log-file-line-reader.port.d.ts +3 -0
  46. package/dist/domain/ports/logs/find/log-file-line-reader.port.js +2 -0
  47. package/dist/domain/ports/logs/find/log-file-numerator.port.d.ts +3 -0
  48. package/dist/domain/ports/logs/find/log-file-numerator.port.js +2 -0
  49. package/dist/domain/ports/logs/index.d.ts +2 -0
  50. package/dist/domain/ports/logs/index.js +18 -0
  51. package/dist/domain/ports/logs/log-datasource.port.d.ts +10 -0
  52. package/dist/domain/ports/logs/log-datasource.port.js +2 -0
  53. package/dist/domain/ports/system-clock.port.d.ts +8 -0
  54. package/dist/domain/ports/system-clock.port.js +2 -0
  55. package/dist/domain/request/index.d.ts +2 -0
  56. package/dist/domain/request/index.js +18 -0
  57. package/dist/domain/request/log-filter.request.d.ts +9 -0
  58. package/dist/domain/request/log-filter.request.js +2 -0
  59. package/dist/domain/request/save-log.request.d.ts +7 -0
  60. package/dist/domain/request/save-log.request.js +2 -0
  61. package/dist/domain/response/index.d.ts +1 -0
  62. package/dist/domain/response/index.js +17 -0
  63. package/dist/domain/response/log.response.d.ts +8 -0
  64. package/dist/domain/response/log.response.js +2 -0
  65. package/dist/domain/types/fs-rotation-by.type.d.ts +8 -0
  66. package/dist/domain/types/fs-rotation-by.type.js +2 -0
  67. package/dist/domain/types/index.d.ts +1 -0
  68. package/dist/domain/types/index.js +17 -0
  69. package/dist/domain/value-objects/file-name-pattern.vo.d.ts +36 -0
  70. package/dist/domain/value-objects/file-name-pattern.vo.js +53 -0
  71. package/dist/domain/value-objects/file-path.vo.d.ts +91 -0
  72. package/dist/domain/value-objects/file-path.vo.js +100 -0
  73. package/dist/domain/value-objects/file-rotation-policy.vo.d.ts +51 -0
  74. package/dist/domain/value-objects/file-rotation-policy.vo.js +76 -0
  75. package/dist/domain/value-objects/file-size.vo.d.ts +75 -0
  76. package/dist/domain/value-objects/file-size.vo.js +114 -0
  77. package/dist/domain/value-objects/index.d.ts +5 -0
  78. package/dist/domain/value-objects/index.js +21 -0
  79. package/dist/domain/value-objects/log-level.vo.d.ts +8 -0
  80. package/dist/domain/value-objects/log-level.vo.js +13 -0
  81. package/dist/index.d.ts +4 -13
  82. package/dist/index.js +10 -38
  83. package/dist/infrastructure/adapters/file-rotator.adapter.d.ts +79 -0
  84. package/dist/infrastructure/adapters/file-rotator.adapter.js +171 -0
  85. package/dist/infrastructure/adapters/fileSystem-datasource.adapter.d.ts +26 -0
  86. package/dist/infrastructure/adapters/fileSystem-datasource.adapter.js +45 -0
  87. package/dist/infrastructure/adapters/filesystem-log-file-enumerator.adapter.d.ts +6 -0
  88. package/dist/infrastructure/adapters/filesystem-log-file-enumerator.adapter.js +54 -0
  89. package/dist/infrastructure/adapters/filesystem-log-file-line-reader.adapter.d.ts +4 -0
  90. package/dist/infrastructure/adapters/filesystem-log-file-line-reader.adapter.js +53 -0
  91. package/dist/infrastructure/adapters/filesystem-provider.adapter.d.ts +122 -0
  92. package/dist/infrastructure/adapters/filesystem-provider.adapter.js +182 -0
  93. package/dist/infrastructure/adapters/index.d.ts +8 -0
  94. package/dist/infrastructure/adapters/index.js +24 -0
  95. package/dist/infrastructure/adapters/log-stream-writer.adapter.d.ts +80 -0
  96. package/dist/infrastructure/adapters/log-stream-writer.adapter.js +163 -0
  97. package/dist/infrastructure/adapters/system-clock.adapter.d.ts +25 -0
  98. package/dist/infrastructure/adapters/system-clock.adapter.js +30 -0
  99. package/dist/infrastructure/adapters/system-file-path.adapter.d.ts +47 -0
  100. package/dist/infrastructure/adapters/system-file-path.adapter.js +141 -0
  101. package/dist/infrastructure/errors/file-operation.error.d.ts +28 -0
  102. package/dist/infrastructure/errors/file-operation.error.js +54 -0
  103. package/dist/infrastructure/errors/index.d.ts +1 -0
  104. package/dist/infrastructure/errors/index.js +17 -0
  105. package/dist/infrastructure/errors/types/file-operation-error-options.type.d.ts +8 -0
  106. package/dist/infrastructure/errors/types/file-operation-error-options.type.js +2 -0
  107. package/dist/infrastructure/errors/types/file-operation.type.d.ts +1 -0
  108. package/dist/infrastructure/errors/types/file-operation.type.js +2 -0
  109. package/dist/infrastructure/errors/types/fs-error-scope.type.d.ts +1 -0
  110. package/dist/infrastructure/errors/types/fs-error-scope.type.js +2 -0
  111. package/dist/infrastructure/errors/types/index.d.ts +3 -0
  112. package/dist/infrastructure/errors/types/index.js +19 -0
  113. package/dist/infrastructure/filesystem/index.d.ts +1 -0
  114. package/dist/infrastructure/filesystem/index.js +17 -0
  115. package/dist/infrastructure/filesystem/types/filesystem-rotation.type.d.ts +12 -0
  116. package/dist/infrastructure/filesystem/types/filesystem-rotation.type.js +2 -0
  117. package/dist/infrastructure/filesystem/types/index.d.ts +1 -0
  118. package/dist/infrastructure/filesystem/types/index.js +17 -0
  119. package/package.json +40 -13
@@ -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
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileNamePattern = void 0;
4
+ /**
5
+ * FileNamePattern (Value Object)
6
+ * -----------------------------------------------------------------------------
7
+ * Representa un patrón de nombrado de archivos de log.
8
+ *
9
+ * Ejemplos:
10
+ * - "app.log"
11
+ * - "app-{yyyy}{MM}{dd}.log"
12
+ *
13
+ * Responsabilidades:
14
+ * - Garantizar invariantes (string no vacío, sin solo espacios)
15
+ * - Exponer el patrón inmutable
16
+ * - Ofrecer operaciones de dominio relacionadas (tokens)
17
+ */
18
+ class FileNamePattern {
19
+ /**
20
+ * Crea un patrón válido.
21
+ * Invariante: debe ser string no vacío y no solo whitespace.
22
+ */
23
+ constructor(pattern) {
24
+ if (typeof pattern !== "string") {
25
+ throw new Error("FileNamePattern: pattern must be a non-empty string");
26
+ }
27
+ const trimmed = pattern.trim();
28
+ if (!trimmed) {
29
+ throw new Error("FileNamePattern: pattern must be a non-empty string");
30
+ }
31
+ this._pattern = trimmed;
32
+ }
33
+ /**
34
+ * Retorna el valor inmutable del patrón.
35
+ */
36
+ get pattern() {
37
+ return this._pattern;
38
+ }
39
+ /**
40
+ * Devuelve todos los tokens encerrados en llaves presentes en el patrón.
41
+ * Ej: "app-{yyyy}{MM}.log" => ["yyyy", "MM"]
42
+ */
43
+ getTokens() {
44
+ const matches = this._pattern.match(FileNamePattern.TOKEN_REGEX);
45
+ return matches ? matches.map((m) => m.slice(1, -1)) : [];
46
+ }
47
+ }
48
+ exports.FileNamePattern = FileNamePattern;
49
+ /**
50
+ * Regex base para capturar tokens: "{...}"
51
+ * Centralizarlo evita inconsistencias entre métodos.
52
+ */
53
+ FileNamePattern.TOKEN_REGEX = /\{([^}]+)\}/g;
@@ -0,0 +1,91 @@
1
+ export type FilePathKind = "file" | "dir";
2
+ /**
3
+ * Props requeridas para construir un FilePath.
4
+ *
5
+ * Importante:
6
+ * - Estas props representan una ruta YA normalizada.
7
+ * - La responsabilidad de construir valores coherentes
8
+ * (resolver path, separar directorio, basename, extensión, etc.)
9
+ * recae en la capa de infraestructura (adapters).
10
+ */
11
+ export interface IFilePathProps {
12
+ /**
13
+ * Ruta absoluta completa del archivo.
14
+ * Ej: "/var/log/app/app-20251215.log"
15
+ */
16
+ absolutePath: string;
17
+ /**
18
+ * Directorio contenedor del archivo.
19
+ * Ej: "/var/log/app"
20
+ */
21
+ directory: string;
22
+ /**
23
+ * Nombre completo del archivo (basename + extensión).
24
+ * Ej: "app-20251215.log"
25
+ */
26
+ filename: string | null;
27
+ /**
28
+ * Extensión del archivo.
29
+ * Regla de dominio: debe ser string (puede ser vacío si no aplica).
30
+ * Ej: "log"
31
+ */
32
+ extension: string | null;
33
+ /**
34
+ * Nombre base del archivo sin extensión.
35
+ * Ej: "app-20251215"
36
+ */
37
+ basename: string | null;
38
+ kind: FilePathKind;
39
+ }
40
+ /**
41
+ * FilePath (Value Object)
42
+ * -----------------------------------------------------------------------------
43
+ * Representa una ruta de archivo ya normalizada e inmutable.
44
+ *
45
+ * Características (DDD / Clean Architecture):
46
+ * - Es un Value Object (igualdad por valor).
47
+ * - No depende de Node.js ni del módulo `path`.
48
+ * - No realiza IO ni lógica de infraestructura.
49
+ * - Asume que la normalización fuerte ocurre en adapters.
50
+ *
51
+ * Su responsabilidad es:
52
+ * - Encapsular el concepto de "ruta de archivo válida"
53
+ * - Proteger invariantes básicas (no null, no vacío)
54
+ * - Exponer acceso seguro a sus partes
55
+ */
56
+ export declare class FilePath {
57
+ private readonly _absolutePath;
58
+ private readonly _directory;
59
+ private readonly _filename;
60
+ private readonly _extension;
61
+ private readonly _basename;
62
+ /**
63
+ * Crea un FilePath a partir de props ya normalizadas.
64
+ *
65
+ * Nota de diseño:
66
+ * - Este constructor NO calcula rutas ni usa `path`.
67
+ * - Solo valida invariantes mínimas del dominio.
68
+ */
69
+ constructor(props: IFilePathProps);
70
+ /**
71
+ * Valor principal del Value Object.
72
+ * Alias explícito de `absolutePath` para uso genérico.
73
+ */
74
+ get value(): string;
75
+ /**
76
+ * Ruta absoluta completa del archivo.
77
+ */
78
+ get absolutePath(): string;
79
+ /**
80
+ * Directorio contenedor del archivo.
81
+ */
82
+ get directory(): string;
83
+ get filename(): string | null;
84
+ get extension(): string | null;
85
+ get basename(): string | null;
86
+ /**
87
+ * Comparación por valor.
88
+ * Dos FilePath son iguales si representan la misma ruta absoluta.
89
+ */
90
+ equals(other: FilePath): boolean;
91
+ }