@arpinum/log
Version:
Simple module to log on stdout or stderr
102 lines (101 loc) • 4.03 kB
JavaScript
;
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;
}
}