UNPKG

@sprucelabs/spruce-skill-utils

Version:

Loosely coupled classes and functions to make skill development faster! 🏎

154 lines (153 loc) 5.11 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.stubLog = exports.testLog = void 0; exports.default = buildLog; const chalk_1 = __importDefault(require("chalk")); function getProcess() { if (typeof process !== 'undefined') { return process; } return null; } let lastLogTimeMs = Date.now(); const getMaxLogPrefixesLength = () => { return typeof getProcess()?.env?.MAXIMUM_LOG_PREFIXES_LENGTH === 'string' ? +getProcess()?.env?.MAXIMUM_LOG_PREFIXES_LENGTH : undefined; }; function buildLog(prefix = undefined, options) { const { colors = {}, log, useColors } = options ?? {}; const { info = 'yellow', error = 'red' } = colors; const isInteractive = getProcess()?.stdout?.isTTY ?? false; const shouldUseColors = useColors !== false && isInteractive; const pre = prefix ? `${prefix} ::` : undefined; const transports = { ERROR: options?.transportsByLevel?.ERROR, INFO: options?.transportsByLevel?.INFO, WARN: options?.transportsByLevel?.WARN, }; const logUtil = { prefix, info(...args) { //@ts-ignore return write(chalk_1.default?.green?.[info], args, 'INFO'); }, warn(...args) { //@ts-ignore return write(chalk_1.default?.yellow?.[info], args, 'WARN'); }, error(...args) { //@ts-ignore return write(chalk_1.default?.red?.[error], args, 'ERROR'); }, buildLog(prefix = undefined, options) { return buildLog(`${pre ? `${pre} ` : ''}${prefix}`, { log, useColors, transportsByLevel: transports, ...options, }); }, }; return logUtil; function getTransports(level) { const t = transports[level]; if (!t) { return []; } if (!Array.isArray(t)) { return [t]; } return t; } function write(chalkMethod, rawArgs, level) { if (!shouldWrite(getProcess()?.env?.LOG_LEVEL ?? undefined, level)) { return ''; } const args = rawArgs.map((a) => a?.toString?.() ?? 'undefined'); let chalkArgs = [...args]; let builtPrefix = pre; if (pre) { const length = getMaxLogPrefixesLength(); if (typeof length === 'number' && !isNaN(length)) { const parts = pre.split(' :: '); builtPrefix = parts .splice(parts.length - length, length) .join(' :: '); } chalkArgs = [builtPrefix, ...chalkArgs]; } const prefix = builtPrefix ? ` ${builtPrefix}` : ''; let transports = getTransports(level); if (transports.length > 0) { for (const transport of transports) { transport(...[prefix.trim(), ...args].filter((t) => t && t.length > 0)); } return prefix; } const env = getProcess()?.env ?? {}; let logMethod = 'log'; switch (level) { case 'ERROR': logMethod = 'error'; break; case 'WARN': logMethod = 'warn'; break; default: logMethod = 'log'; break; } const transport = log ?? (level === 'ERROR' && getProcess()?.stderr?.write ? (...args) => { getProcess()?.stderr.write(args.join(' ') + '\n'); } : (console[logMethod] ?? console.log).bind(console)); let message = shouldUseColors === false ? `(${level})${prefix}` : chalkMethod?.(...chalkArgs); if (env.SHOULD_LOG_TIME_DELTAS !== 'false') { const now = Date.now(); const diff = now - lastLogTimeMs; lastLogTimeMs = now; message = `(${diff}ms) ${message}`; } if (env.SHOULD_LOG_TIME !== 'false') { message = `(${new Date().toISOString()}) ${message}`; } if (shouldUseColors === false) { transport(message, ...args); } else { transport(message); } return message; } } exports.testLog = buildLog('TEST', { log: (...parts) => { getProcess()?.stderr?.write?.(parts.join(' ') + '\n'); }, }); exports.stubLog = buildLog('STUB', { log: () => { }, useColors: false, }); function shouldWrite(maxLogLevel, level) { if (maxLogLevel) { if (getProcess()?.env?.LOG_LEVEL == 'none') { return false; } if (getProcess()?.env?.LOG_LEVEL == 'error' && level !== 'ERROR') { return false; } if (getProcess()?.env?.LOG_LEVEL == 'warn' && level === 'INFO') { return false; } } return true; }