@mccann-hub/json-logger
Version:
A secure, configurable JSON logger built on Winston for Node.js and Deno applications. Supports custom log levels, structured JSON output, sensitive data sanitization, and error handling for multi-environment setups.
62 lines • 2.48 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_process_1 = __importDefault(require("node:process"));
exports.default = (sensitiveKeys = ['SECRET', 'PASSWORD', 'TOKEN', 'KEY']) => {
const sensitiveValues = Object.keys(node_process_1.default.env)
.filter((envKey) => sensitiveKeys.some((sensitive) => envKey.toUpperCase().includes(sensitive)))
.map((envKey) => node_process_1.default.env[envKey] || '');
const recursiveSanitize = (obj) => {
if (Array.isArray(obj)) {
obj.forEach((item, index) => {
if (item === undefined || item === null) {
return;
}
else if (typeof item === 'string') {
obj[index] = sanitizeString(item);
}
else if (Array.isArray(item) || typeof item === 'object') {
recursiveSanitize(item);
}
});
}
else {
for (const key in obj) {
if (obj[key] === undefined || obj[key] === null) {
continue;
}
if (typeof obj[key] === 'string') {
if (sensitiveKeys.some((sensitive) => key.toUpperCase().includes(sensitive))) {
obj[key] = '***REDACTED***';
}
else {
obj[key] = sanitizeString(obj[key]);
}
}
else if (Array.isArray(obj[key]) || typeof obj[key] === 'object') {
recursiveSanitize(obj[key]);
}
}
}
};
const sanitizeString = (str) => {
let sanitizedStr = str;
sensitiveValues.forEach((value) => {
if (value) {
const escapedValue = value.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
sanitizedStr = sanitizedStr.replace(new RegExp(escapedValue, 'g'), '***REDACTED***');
}
});
return sanitizedStr;
};
return (info) => {
if (info === undefined)
return undefined;
const sanitizedInfo = JSON.parse(JSON.stringify(info));
recursiveSanitize(sanitizedInfo);
return sanitizedInfo;
};
};
//# sourceMappingURL=sanitize.js.map
;