@jmlq/logger 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.
- package/README.md +307 -0
- package/architecture.md +171 -0
- package/dist/examples/data-source-service.example.d.ts +3 -0
- package/dist/examples/data-source-service.example.js +174 -0
- package/dist/examples/flush-buffers-use-case.example.d.ts +3 -0
- package/dist/examples/flush-buffers-use-case.example.js +60 -0
- package/dist/examples/get-logs-use-case.example.d.ts +3 -0
- package/dist/examples/get-logs-use-case.example.js +110 -0
- package/dist/examples/index.example.d.ts +8 -0
- package/dist/examples/index.example.js +116 -0
- package/dist/examples/logger-factory.example.d.ts +39 -0
- package/dist/examples/logger-factory.example.js +158 -0
- package/dist/examples/normalize-message.example.d.ts +3 -0
- package/dist/examples/normalize-message.example.js +80 -0
- package/dist/examples/pii-redactor.example.d.ts +3 -0
- package/dist/examples/pii-redactor.example.js +129 -0
- package/dist/examples/save-log-use-case.example.d.ts +3 -0
- package/dist/examples/save-log-use-case.example.js +150 -0
- package/dist/examples/to-log-level.example.d.ts +3 -0
- package/dist/examples/to-log-level.example.js +49 -0
- package/dist/examples/to-pii-regex.example.d.ts +3 -0
- package/dist/examples/to-pii-regex.example.js +75 -0
- package/dist/{presentation/factory/index.d.ts → src/application/factory/create-logger.d.ts} +1 -1
- package/dist/src/application/factory/create-logger.js +29 -0
- package/dist/src/application/factory/index.d.ts +1 -0
- package/dist/{config → src/application/factory}/index.js +1 -2
- package/dist/src/application/factory/logger.factory.d.ts +12 -0
- package/dist/src/application/factory/logger.factory.js +74 -0
- package/dist/src/application/index.d.ts +2 -0
- package/dist/{presentation → src/application}/index.js +1 -0
- package/dist/src/application/use-cases/flush-buffers.use-case.d.ts +6 -0
- package/dist/src/application/use-cases/flush-buffers.use-case.js +13 -0
- package/dist/src/application/use-cases/get-logs.use-case.d.ts +8 -0
- package/dist/src/application/use-cases/get-logs.use-case.js +24 -0
- package/dist/src/application/use-cases/index.d.ts +3 -0
- package/dist/src/application/use-cases/index.js +19 -0
- package/dist/src/application/use-cases/save-log.use-case.d.ts +8 -0
- package/dist/src/application/use-cases/save-log.use-case.js +26 -0
- package/dist/src/domain/index.d.ts +6 -0
- package/dist/src/domain/index.js +22 -0
- package/dist/src/domain/ports/create-logger-options.port.d.ts +7 -0
- package/dist/{config/interfaces/index.js → src/domain/ports/create-logger-options.port.js} +0 -1
- package/dist/src/domain/ports/index.d.ts +6 -0
- package/dist/src/domain/ports/index.js +22 -0
- package/dist/src/domain/ports/log-datasource.port.d.ts +9 -0
- package/dist/src/domain/ports/log-datasource.port.js +2 -0
- package/dist/src/domain/ports/logger-factory-config.port.d.ts +28 -0
- package/dist/src/domain/ports/logger-factory-config.port.js +2 -0
- package/dist/src/domain/ports/logger-service.port.d.ts +19 -0
- package/dist/src/domain/ports/logger-service.port.js +2 -0
- package/dist/src/domain/ports/logger.port.d.ts +10 -0
- package/dist/src/domain/ports/logger.port.js +2 -0
- package/dist/src/domain/ports/pii-redactor.port.d.ts +5 -0
- package/dist/src/domain/ports/pii-redactor.port.js +2 -0
- package/dist/src/domain/request/get-logs-filter.props.d.ts +9 -0
- package/dist/src/domain/request/get-logs-filter.props.js +2 -0
- package/dist/src/domain/request/index.d.ts +5 -0
- package/dist/src/domain/request/index.js +21 -0
- package/dist/src/domain/request/log.props.d.ts +7 -0
- package/dist/src/domain/request/log.props.js +2 -0
- package/dist/src/domain/request/pii-options.props.d.ts +8 -0
- package/dist/src/domain/request/pii-options.props.js +2 -0
- package/dist/src/domain/request/pii-replacement.props.d.ts +5 -0
- package/dist/src/domain/request/pii-replacement.props.js +2 -0
- package/dist/src/domain/request/save-log.props.d.ts +7 -0
- package/dist/src/domain/request/save-log.props.js +2 -0
- package/dist/src/domain/response/index.d.ts +1 -0
- package/dist/{domain/services → src/domain/response}/index.js +1 -1
- package/dist/src/domain/response/log.response.d.ts +7 -0
- package/dist/src/domain/response/log.response.js +2 -0
- package/dist/src/domain/services/index.d.ts +4 -0
- package/dist/{index.js → src/domain/services/index.js} +4 -4
- package/dist/src/domain/services/log-level.service.d.ts +2 -0
- package/dist/src/domain/services/log-level.service.js +27 -0
- package/dist/src/domain/services/message-normalizer.service.d.ts +3 -0
- package/dist/src/domain/services/message-normalizer.service.js +8 -0
- package/dist/src/domain/services/pii-pattern.service.d.ts +2 -0
- package/dist/src/domain/services/pii-pattern.service.js +13 -0
- package/dist/src/domain/services/pii-redactor.d.ts +10 -0
- package/dist/src/domain/services/pii-redactor.js +68 -0
- package/dist/src/domain/services/pii-redactor.service.d.ts +10 -0
- package/dist/src/domain/services/pii-redactor.service.js +68 -0
- package/dist/src/domain/types/index.d.ts +1 -0
- package/dist/src/domain/types/index.js +17 -0
- package/dist/src/domain/types/log-message.type.d.ts +1 -0
- package/dist/src/domain/types/log-message.type.js +2 -0
- package/dist/src/domain/value-objects/index.d.ts +1 -0
- package/dist/src/domain/value-objects/index.js +17 -0
- package/dist/src/domain/value-objects/log-level.vo.d.ts +8 -0
- package/dist/src/domain/value-objects/log-level.vo.js +13 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +22 -0
- package/dist/src/infrastructure/datasources/in-memory-log.datasource.d.ts +1 -0
- package/dist/src/infrastructure/datasources/in-memory-log.datasource.js +2 -0
- package/dist/src/infrastructure/datasources/index.d.ts +1 -0
- package/dist/src/infrastructure/datasources/index.js +17 -0
- package/dist/src/infrastructure/services/data-source-error-handler.type.d.ts +5 -0
- package/dist/src/infrastructure/services/data-source-error-handler.type.js +2 -0
- package/dist/src/infrastructure/services/datasource.service.d.ts +15 -0
- package/dist/src/infrastructure/services/datasource.service.js +63 -0
- package/dist/src/infrastructure/services/index.d.ts +2 -0
- package/dist/src/infrastructure/services/index.js +18 -0
- package/dist/tests/application/factory/logger-factory.spec.d.ts +1 -0
- package/dist/tests/application/factory/logger-factory.spec.js +161 -0
- package/dist/tests/application/use-cases/flush-buffers.use-case.spec.d.ts +1 -0
- package/dist/tests/application/use-cases/flush-buffers.use-case.spec.js +38 -0
- package/dist/tests/application/use-cases/get-logs.use-case.spec.d.ts +1 -0
- package/dist/tests/application/use-cases/get-logs.use-case.spec.js +114 -0
- package/dist/tests/application/use-cases/save-log.use-case.spec.d.ts +1 -0
- package/dist/tests/application/use-cases/save-log.use-case.spec.js +138 -0
- package/dist/tests/domain/services/log-level.service.spec.d.ts +1 -0
- package/dist/tests/domain/services/log-level.service.spec.js +68 -0
- package/dist/tests/domain/services/normalize-message.spec.d.ts +1 -0
- package/dist/tests/domain/services/normalize-message.spec.js +83 -0
- package/dist/tests/domain/services/pii-redactor.spec.d.ts +1 -0
- package/dist/tests/domain/services/pii-redactor.spec.js +170 -0
- package/dist/tests/domain/services/to-pii-regex.spec.d.ts +1 -0
- package/dist/tests/domain/services/to-pii-regex.spec.js +82 -0
- package/dist/tests/infrastructure/services/datasource.service.spec.d.ts +1 -0
- package/dist/tests/infrastructure/services/datasource.service.spec.js +128 -0
- package/dist/tests/test-utils/create-pii-redactor-mock.d.ts +5 -0
- package/dist/tests/test-utils/create-pii-redactor-mock.js +10 -0
- package/install.md +367 -0
- package/package.json +33 -10
- package/dist/Composite/index.d.ts +0 -9
- package/dist/Composite/index.js +0 -23
- package/dist/Factory/index.d.ts +0 -5
- package/dist/Factory/index.js +0 -23
- package/dist/config/index.d.ts +0 -2
- package/dist/config/interfaces/index.d.ts +0 -67
- package/dist/config/types/index.d.ts +0 -10
- package/dist/config/types/index.js +0 -13
- package/dist/domain/services/index.d.ts +0 -1
- package/dist/domain/services/pii-redactor.d.ts +0 -27
- package/dist/domain/services/pii-redactor.js +0 -139
- package/dist/index.d.ts +0 -4
- package/dist/interfaces/index.d.ts +0 -35
- package/dist/interfaces/index.js +0 -13
- package/dist/presentation/factory/index.js +0 -74
- package/dist/presentation/index.d.ts +0 -1
- /package/dist/{domain → src/infrastructure}/index.d.ts +0 -0
- /package/dist/{domain → src/infrastructure}/index.js +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SaveLogUseCase = void 0;
|
|
4
|
+
const services_1 = require("../../domain/services");
|
|
5
|
+
class SaveLogUseCase {
|
|
6
|
+
constructor(props) {
|
|
7
|
+
this.props = props;
|
|
8
|
+
}
|
|
9
|
+
async execute(level, message, meta) {
|
|
10
|
+
// 1) Filtro por nivel (evita hacer trabajo innecesario)
|
|
11
|
+
if (level < this.props.minLevel)
|
|
12
|
+
return; // no se loggea
|
|
13
|
+
// 2) Normalización + PII
|
|
14
|
+
const normalized = (0, services_1.normalizeMessage)(message, this.props.redactor);
|
|
15
|
+
// 3) Construcción del evento
|
|
16
|
+
const log = {
|
|
17
|
+
level,
|
|
18
|
+
message: normalized,
|
|
19
|
+
meta: meta === undefined ? undefined : this.props.redactor.redact(meta),
|
|
20
|
+
timestamp: Date.now(),
|
|
21
|
+
};
|
|
22
|
+
// 4) Persistencia (fan-out lo maneja el ds si es composite)
|
|
23
|
+
await this.props.ds.save(log);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.SaveLogUseCase = SaveLogUseCase;
|
|
@@ -0,0 +1,22 @@
|
|
|
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("./ports"), exports);
|
|
18
|
+
__exportStar(require("./request"), exports);
|
|
19
|
+
__exportStar(require("./response"), exports);
|
|
20
|
+
__exportStar(require("./services"), exports);
|
|
21
|
+
__exportStar(require("./types"), exports);
|
|
22
|
+
__exportStar(require("./value-objects"), exports);
|
|
@@ -0,0 +1,22 @@
|
|
|
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-datasource.port"), exports);
|
|
18
|
+
__exportStar(require("./logger.port"), exports);
|
|
19
|
+
__exportStar(require("./pii-redactor.port"), exports);
|
|
20
|
+
__exportStar(require("./create-logger-options.port"), exports);
|
|
21
|
+
__exportStar(require("./logger-factory-config.port"), exports);
|
|
22
|
+
__exportStar(require("./logger-service.port"), exports);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IGetLogsFilterProps, ILogProps } from "../request";
|
|
2
|
+
import { ILogResponse } from "../response";
|
|
3
|
+
export interface ILogDatasource {
|
|
4
|
+
save(log: ILogProps): Promise<void>;
|
|
5
|
+
find?(filter?: IGetLogsFilterProps): Promise<ILogResponse[]>;
|
|
6
|
+
flush?(): Promise<void>;
|
|
7
|
+
dispose?(): Promise<void>;
|
|
8
|
+
readonly name?: string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ILogDatasource, IPiiRedactor } from ".";
|
|
2
|
+
import { IPiiOptionsProps } from "../request";
|
|
3
|
+
import { LogLevel } from "../value-objects";
|
|
4
|
+
/**
|
|
5
|
+
* Configuración de alto nivel para construir el logger.
|
|
6
|
+
* Es lo que recibe el usuario del paquete npm.
|
|
7
|
+
*/
|
|
8
|
+
export interface ILoggerFactoryConfig {
|
|
9
|
+
/**
|
|
10
|
+
* Datasource(s) concretos donde se van a persistir los logs.
|
|
11
|
+
* Pueden venir uno o varios; si hay más de uno se compone con DataSourceService (fan-out).
|
|
12
|
+
*/
|
|
13
|
+
datasources: ILogDatasource | ILogDatasource[];
|
|
14
|
+
/**
|
|
15
|
+
* Nivel mínimo de logging. Por defecto: INFO.
|
|
16
|
+
*/
|
|
17
|
+
minLevel?: LogLevel;
|
|
18
|
+
/**
|
|
19
|
+
* Instancia de redactor de PII personalizada.
|
|
20
|
+
* Si no se proporciona, se creará internamente un PiiRedactor con las opciones dadas.
|
|
21
|
+
*/
|
|
22
|
+
redactor?: IPiiRedactor;
|
|
23
|
+
/**
|
|
24
|
+
* Opciones para el redactor de PII interno.
|
|
25
|
+
* Solo se usan si no se pasa `redactor` explícito.
|
|
26
|
+
*/
|
|
27
|
+
redactorOptions?: IPiiOptionsProps;
|
|
28
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { IGetLogsFilterProps } from "../request";
|
|
2
|
+
import { ILogResponse } from "../response";
|
|
3
|
+
import { LogMessage } from "../types";
|
|
4
|
+
import { LogLevel } from "../value-objects";
|
|
5
|
+
/**
|
|
6
|
+
* Facade de alto nivel que expone el comportamiento del logger
|
|
7
|
+
* listo para ser usado por el cliente del paquete.
|
|
8
|
+
*/
|
|
9
|
+
export interface ILoggerService {
|
|
10
|
+
log(level: LogLevel, message: LogMessage, meta?: unknown): Promise<void>;
|
|
11
|
+
trace(message: LogMessage, meta?: unknown): Promise<void>;
|
|
12
|
+
debug(message: LogMessage, meta?: unknown): Promise<void>;
|
|
13
|
+
info(message: LogMessage, meta?: unknown): Promise<void>;
|
|
14
|
+
warn(message: LogMessage, meta?: unknown): Promise<void>;
|
|
15
|
+
error(message: LogMessage, meta?: unknown): Promise<void>;
|
|
16
|
+
fatal(message: LogMessage, meta?: unknown): Promise<void>;
|
|
17
|
+
getLogs(filter?: IGetLogsFilterProps): Promise<ILogResponse[]>;
|
|
18
|
+
flush(): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ILogger {
|
|
2
|
+
trace: (message: unknown, meta?: unknown) => void | Promise<void>;
|
|
3
|
+
debug: (message: unknown, meta?: unknown) => void | Promise<void>;
|
|
4
|
+
info: (message: unknown, meta?: unknown) => void | Promise<void>;
|
|
5
|
+
warn: (message: unknown, meta?: unknown) => void | Promise<void>;
|
|
6
|
+
error: (message: unknown, meta?: unknown) => void | Promise<void>;
|
|
7
|
+
fatal: (message: unknown, meta?: unknown) => void | Promise<void>;
|
|
8
|
+
flush?: () => Promise<void>;
|
|
9
|
+
dispose?: () => Promise<void>;
|
|
10
|
+
}
|
|
@@ -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("./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);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./log.response";
|
|
@@ -14,4 +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("./
|
|
17
|
+
__exportStar(require("./log.response"), exports);
|
|
@@ -14,7 +14,7 @@ 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("./
|
|
18
|
-
__exportStar(require("./
|
|
19
|
-
__exportStar(require("./
|
|
20
|
-
__exportStar(require("./
|
|
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);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toLogLevel = toLogLevel;
|
|
4
|
+
const value_objects_1 = require("../value-objects");
|
|
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()) {
|
|
12
|
+
case "trace":
|
|
13
|
+
return value_objects_1.LogLevel.TRACE;
|
|
14
|
+
case "debug":
|
|
15
|
+
return value_objects_1.LogLevel.DEBUG;
|
|
16
|
+
case "info":
|
|
17
|
+
return value_objects_1.LogLevel.INFO;
|
|
18
|
+
case "warn":
|
|
19
|
+
return value_objects_1.LogLevel.WARN;
|
|
20
|
+
case "error":
|
|
21
|
+
return value_objects_1.LogLevel.ERROR;
|
|
22
|
+
case "fatal":
|
|
23
|
+
return value_objects_1.LogLevel.FATAL;
|
|
24
|
+
default:
|
|
25
|
+
return def; // evita lanzar excepción por valores inesperados
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeMessage = normalizeMessage;
|
|
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
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toPiiRegex = toPiiRegex;
|
|
4
|
+
// Convierte un patrón PII declarativo a un RegExp seguro
|
|
5
|
+
function toPiiRegex(props) {
|
|
6
|
+
try {
|
|
7
|
+
return new RegExp(props.pattern, props.flags ?? "g");
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
// fallback: RegExp imposible que nunca hace match
|
|
11
|
+
return /$a/;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IPiiRedactor } from "../ports";
|
|
2
|
+
import { IPiiOptionsProps } from "../request";
|
|
3
|
+
export declare class PiiRedactor implements IPiiRedactor {
|
|
4
|
+
private props;
|
|
5
|
+
constructor(props?: IPiiOptionsProps);
|
|
6
|
+
updateOptions(opts: IPiiOptionsProps): void;
|
|
7
|
+
redact<T = unknown>(value: T): T;
|
|
8
|
+
private applyPatterns;
|
|
9
|
+
private redactDeep;
|
|
10
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PiiRedactor = void 0;
|
|
4
|
+
const pii_pattern_service_1 = require("./pii-pattern.service");
|
|
5
|
+
class PiiRedactor {
|
|
6
|
+
constructor(props = {}) {
|
|
7
|
+
this.props = props;
|
|
8
|
+
}
|
|
9
|
+
updateOptions(opts) {
|
|
10
|
+
// merge superficial de opciones; no muta referencias externas
|
|
11
|
+
this.props = { ...this.props, ...opts };
|
|
12
|
+
}
|
|
13
|
+
redact(value) {
|
|
14
|
+
if (!this.props.enabled)
|
|
15
|
+
return value; // early exit si PII apagado
|
|
16
|
+
if (value == null)
|
|
17
|
+
return value;
|
|
18
|
+
// Si es string → aplicar patrones
|
|
19
|
+
if (typeof value === "string") {
|
|
20
|
+
return this.applyPatterns(value);
|
|
21
|
+
}
|
|
22
|
+
// Si es objeto/array → redacción profunda si corresponde
|
|
23
|
+
if (typeof value === "object") {
|
|
24
|
+
return this.redactDeep(value);
|
|
25
|
+
}
|
|
26
|
+
// Otros tipos (number, boolean, function) no se redactan
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
applyPatterns(input) {
|
|
30
|
+
const patterns = this.props.patterns ?? [];
|
|
31
|
+
let out = input;
|
|
32
|
+
for (const p of patterns) {
|
|
33
|
+
const rx = (0, pii_pattern_service_1.toPiiRegex)(p);
|
|
34
|
+
// replace con patrón RegExp
|
|
35
|
+
out = out.replace(rx, p.replaceWith);
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
redactDeep(obj) {
|
|
40
|
+
// Evita mutar el objeto original → copia superficial
|
|
41
|
+
const clone = Array.isArray(obj)
|
|
42
|
+
? [...obj]
|
|
43
|
+
: { ...obj };
|
|
44
|
+
const { whitelistKeys = [], blacklistKeys = [], deep = true } = this.props;
|
|
45
|
+
for (const key of Object.keys(clone)) {
|
|
46
|
+
const val = clone[key];
|
|
47
|
+
// Si está en whitelist, se respeta siempre
|
|
48
|
+
if (whitelistKeys.includes(key))
|
|
49
|
+
continue;
|
|
50
|
+
// Si está en blacklist y es string → reemplazar completamente
|
|
51
|
+
if (blacklistKeys.includes(key)) {
|
|
52
|
+
clone[key] = "[REDACTED]"; // fuerza redacción total de claves sensibles
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Para strings comunes → aplicar patrones
|
|
56
|
+
if (typeof val === "string") {
|
|
57
|
+
clone[key] = this.applyPatterns(val);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Para objetos/arrays y deep===true → recursión
|
|
61
|
+
if (deep && val && typeof val === "object") {
|
|
62
|
+
clone[key] = this.redactDeep(val);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return clone;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.PiiRedactor = PiiRedactor;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IPiiRedactor } from "../ports";
|
|
2
|
+
import { IPiiOptionsProps } from "../request";
|
|
3
|
+
export declare class PiiRedactor implements IPiiRedactor {
|
|
4
|
+
private props;
|
|
5
|
+
constructor(props?: IPiiOptionsProps);
|
|
6
|
+
updateOptions(opts: IPiiOptionsProps): void;
|
|
7
|
+
redact<T = unknown>(value: T): T;
|
|
8
|
+
private applyPatterns;
|
|
9
|
+
private redactDeep;
|
|
10
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PiiRedactor = void 0;
|
|
4
|
+
const pii_pattern_service_1 = require("./pii-pattern.service");
|
|
5
|
+
class PiiRedactor {
|
|
6
|
+
constructor(props = {}) {
|
|
7
|
+
this.props = props;
|
|
8
|
+
}
|
|
9
|
+
updateOptions(opts) {
|
|
10
|
+
// merge superficial de opciones; no muta referencias externas
|
|
11
|
+
this.props = { ...this.props, ...opts };
|
|
12
|
+
}
|
|
13
|
+
redact(value) {
|
|
14
|
+
if (!this.props.enabled)
|
|
15
|
+
return value; // early exit si PII apagado
|
|
16
|
+
if (value == null)
|
|
17
|
+
return value;
|
|
18
|
+
// Si es string → aplicar patrones
|
|
19
|
+
if (typeof value === "string") {
|
|
20
|
+
return this.applyPatterns(value);
|
|
21
|
+
}
|
|
22
|
+
// Si es objeto/array → redacción profunda si corresponde
|
|
23
|
+
if (typeof value === "object") {
|
|
24
|
+
return this.redactDeep(value);
|
|
25
|
+
}
|
|
26
|
+
// Otros tipos (number, boolean, function) no se redactan
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
applyPatterns(input) {
|
|
30
|
+
const patterns = this.props.patterns ?? [];
|
|
31
|
+
let out = input;
|
|
32
|
+
for (const p of patterns) {
|
|
33
|
+
const rx = (0, pii_pattern_service_1.toPiiRegex)(p);
|
|
34
|
+
// replace con patrón RegExp
|
|
35
|
+
out = out.replace(rx, p.replaceWith);
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
redactDeep(obj) {
|
|
40
|
+
// Evita mutar el objeto original → copia superficial
|
|
41
|
+
const clone = Array.isArray(obj)
|
|
42
|
+
? [...obj]
|
|
43
|
+
: { ...obj };
|
|
44
|
+
const { whitelistKeys = [], blacklistKeys = [], deep = true } = this.props;
|
|
45
|
+
for (const key of Object.keys(clone)) {
|
|
46
|
+
const val = clone[key];
|
|
47
|
+
// Si está en whitelist, se respeta siempre
|
|
48
|
+
if (whitelistKeys.includes(key))
|
|
49
|
+
continue;
|
|
50
|
+
// Si está en blacklist y es string → reemplazar completamente
|
|
51
|
+
if (blacklistKeys.includes(key)) {
|
|
52
|
+
clone[key] = "[REDACTED]"; // fuerza redacción total de claves sensibles
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Para strings comunes → aplicar patrones
|
|
56
|
+
if (typeof val === "string") {
|
|
57
|
+
clone[key] = this.applyPatterns(val);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Para objetos/arrays y deep===true → recursión
|
|
61
|
+
if (deep && val && typeof val === "object") {
|
|
62
|
+
clone[key] = this.redactDeep(val);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return clone;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.PiiRedactor = PiiRedactor;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./log-message.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("./log-message.type"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type LogMessage = string | Record<string, unknown> | (() => string | Record<string, unknown>);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./log-level.vo";
|
|
@@ -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-level.vo"), exports);
|