UNPKG

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
"use strict"; 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 });