UNPKG

@arpinum/log

Version:

Simple module to log on stdout or stderr

102 lines (101 loc) 4.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createLogger = void 0; const asserts_1 = require("./asserts"); const basename_1 = require("./basename"); const logLevels_1 = require("./logLevels"); const defaultOptions = { level: getDefaultLevel(), category: "default", filter: getDefaultFilter(), console, getDateString: () => new Date().toISOString(), getLogInputs: getDefaultLogInputs, }; const createLogger = (options = {}) => { validateArgs(); const theOptions = buildOptions(); const configuredLevel = logLevels_1.logLevels[theOptions.level]; const allowedToLog = filterMatchesCategory(); return createLoggingFunctions(); function validateArgs() { (0, asserts_1.assertOptionalString)(options.level, "level"); if (options.level !== undefined && logLevels_1.logLevels[options.level] === undefined) { const levelList = Object.keys(logLevels_1.logLevels).join(","); throw new Error(`level ${options.level} is invalid, pick one in [${levelList}]`); } (0, asserts_1.assertOptionalString)(options.category, "options#category"); (0, asserts_1.assertOptionalString)(options.filter, "options#filter"); (0, asserts_1.assertOptionalString)(options.fileName, "options#fileName"); if (options.console !== undefined) { (0, asserts_1.assertOptionalFunction)(options.console.log, "options#console#log"); (0, asserts_1.assertOptionalFunction)(options.console.warn, "options#console#warn"); (0, asserts_1.assertOptionalFunction)(options.console.error, "options#console#error"); } if (options.getDateString !== null) { (0, asserts_1.assertOptionalFunction)(options.getDateString, "getDateString"); } (0, asserts_1.assertOptionalFunction)(options.getLogInputs, "getLogInputs"); } function buildOptions() { return Object.assign({}, defaultOptions, options, maybeWithCategoryFromFileName()); } function maybeWithCategoryFromFileName() { if (!options.fileName) { return {}; } return { category: (0, basename_1.basename)(options.fileName), }; } function filterMatchesCategory() { return new RegExp(theOptions.filter).test(theOptions.category); } function createLoggingFunctions() { return Object.entries(logLevels_1.logLevels).reduce((result, [level, configuration]) => Object.assign(result, configuration.log ? { [level]: createLoggingFunction(level, configuration) } : {}), {}); } function createLoggingFunction(level, configuration) { if (configuredLevel.priority <= configuration.priority && allowedToLog) { const logFunction = configuration.log(theOptions.console); return (...args) => { const inputs = theOptions.getLogInputs({ date: theOptions.getDateString !== null ? theOptions.getDateString() : "", category: theOptions.category, level, args, }); logFunction(...inputs); }; } return () => undefined; } }; exports.createLogger = createLogger; function getDefaultLogInputs(log) { const { date, category, level, args } = log; const datePart = date ? `${date} - ` : ""; return [`${datePart}${level}: [${category}]`, ...args]; } function getDefaultLevel() { const fallback = logLevels_1.LogLevel.info; try { return process.env.ARP_LOG_LEVEL || fallback; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { return fallback; } } function getDefaultFilter() { const fallback = ".*"; try { return process.env.ARP_LOG_FILTER || fallback; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { return fallback; } }