lorin
Version:
Lorin is a lightweight, dependency-free Express.js middleware for colorful, categorized logging of API requests, with both console output and file storage.
141 lines (135 loc) • 4.86 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
logger: () => logger,
loggerMiddleware: () => logger_middleware_default
});
module.exports = __toCommonJS(index_exports);
// src/logger.ts
var import_promises = require("fs/promises");
var import_fs = require("fs");
// src/config.ts
var colorize = (...args) => ({
red: `\x1B[31m${args.join(" ")}\x1B[0m`,
// ERROR (Red Text)
green: `\x1B[32m${args.join(" ")}\x1B[0m`,
// SUCCESS (Green Text)
cyan: `\x1B[36m${args.join(" ")}\x1B[0m`,
// INFO (Cyan Text)
yellow: `\x1B[33m${args.join(" ")}\x1B[0m`,
// WARN (Yellow Text)
bgCyan: `\x1B[46;30m${args.join(" ")}\x1B[0m`,
// INFO Label (Cyan BG, Black Text)
bgGreen: `\x1B[42;30m${args.join(" ")}\x1B[0m`,
// SUCCESS Label (Green BG, Black Text)
bgYellow: `\x1B[43;30m${args.join(" ")}\x1B[0m`,
// WARN Label (Yellow BG, Black Text)
bgRed: `\x1B[41;37m${args.join(" ")}\x1B[0m`,
// ERROR Label (Red BG, White Text)
default: `\x1B[0m${args.join(" ")}`
// Default Reset
});
var LOG_DIR = ".logs";
// src/logger.ts
var logger = {
/**
* Logs an informational message to both console and the 'info.log' file.
* The message is colorized in cyan.
*
* @param message - The message to log.
*/
info: (message) => loggerWithType(message, "INFO"),
/**
* Logs an error message to both console and the 'error.log' file.
* The message is colorized in red.
*
* @param message - The error message to log.
*/
error: (message) => loggerWithType(message, "ERROR"),
/**
* Logs a warning message to both console and the 'warn.log' file.
* The message is colorized in yellow.
*
* @param message - The warning message to log.
*/
warn: (message) => loggerWithType(message, "WARN"),
/**
* Logs a success message to both console and the 'success.log' file.
* The message is colorized in green.
*
* @param message - The success message to log.
*/
success: (message) => loggerWithType(message, "SUCCESS")
};
var LOG_RECORDS = {
INFO: { filePath: `${LOG_DIR}/info.log`, color: "cyan" },
ERROR: { filePath: `${LOG_DIR}/error.log`, color: "red" },
WARN: { filePath: `${LOG_DIR}/warn.log`, color: "yellow" },
SUCCESS: { filePath: `${LOG_DIR}/success.log`, color: "green" }
};
function loggerWithType(message, logType = "INFO") {
const { filePath, color } = LOG_RECORDS[logType];
logMessageToConsoleAndFile(message, filePath, color, {
label: logType
});
}
function logMessageToConsoleAndFile(message, filePath, color = "cyan", options = null) {
const timeStamp = (/* @__PURE__ */ new Date()).toLocaleString("sv-SE");
const logMessage = `[${timeStamp}] ${message}
`;
if (options?.label) {
const bgColor = color.replace(
/^[a-z]/,
(match) => `bg${match.toUpperCase()}`
);
console.log(
`[${timeStamp}]`,
colorize(options.label + ":")[bgColor],
colorize(message)[color]
);
} else console.log(`[${timeStamp}]`, colorize(message)[color]);
if (!(0, import_fs.existsSync)(LOG_DIR)) {
(0, import_fs.mkdirSync)(LOG_DIR);
(0, import_promises.writeFile)(`${LOG_DIR}/.gitignore`, `# auto generated by lorin
*`);
}
(0, import_promises.writeFile)(filePath, logMessage, { flag: "a" }).catch(console.error);
}
// src/logger.middleware.ts
var loggerMiddleware = (req, res, next) => {
const startTime = Date.now();
res.on("finish", () => {
const method = req.method;
const route = req.baseUrl + req.url;
const statusCode = res.statusCode;
const endTime = Date.now();
const logMessage = `${req.protocol}: ${method} ${route} ${statusCode} (${endTime - startTime}ms)`;
const color = statusCode >= 500 ? "bgRed" : statusCode >= 400 ? "red" : statusCode >= 300 ? "cyan" : statusCode >= 200 ? "green" : "default";
logMessageToConsoleAndFile(logMessage, ".logs/api.log", color);
});
next();
};
var logger_middleware_default = loggerMiddleware;
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
logger,
loggerMiddleware
});