UNPKG

fish-lsp

Version:

LSP implementation for fish/fish-shell

187 lines (186 loc) 6.17 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.logger = exports.JestLogger = exports.Logger = void 0; exports.createServerLogger = createServerLogger; exports.createJestLogger = createJestLogger; exports.logToStdout = logToStdout; exports.logToStdoutJoined = logToStdoutJoined; exports.log = log; const console = __importStar(require("node:console")); const fs_1 = __importDefault(require("fs")); class Logger { _console; /** never print to console */ _silence = true; /** reformat every log message as json */ _onlyJson = true; logFilePath; started = false; constructor(logFilePath = '', clear = true, _console = console) { this.logFilePath = logFilePath; this._console = _console; if (clear && this.hasLogFile()) { this.clearLogFile(); } } isStarted() { return this.started; } start() { this.started = true; } toggleSilence() { this._silence = !this._silence; } toggleJson() { this._onlyJson = !this._onlyJson; } hasSilence() { return this._silence; } hasLogFile() { return this.logFilePath !== ''; } clearLogFile() { if (this.hasLogFile()) { try { // fs.truncateSync(this.logFilePath, 0); fs_1.default.writeFileSync(this.logFilePath, ''); } catch (error) { this._console.error(`Error clearing log file: ${error}`); } } } logToFile(message) { if (this.hasLogFile()) { fs_1.default.appendFileSync(this.logFilePath, message + '\n', 'utf-8'); } } log(...args) { const formattedMessage = args.map((arg) => { if (arg instanceof Error) { return arg.stack || arg.message; } if (typeof arg === 'object') { return JSON.stringify(arg, null, 2); } return String(arg); }).join('\n'); if (!this.hasSilence()) this._console.log(formattedMessage); if (this.hasLogFile()) this.logToFile(formattedMessage); } logAsJson(message) { this.logToFile(JSON.stringify({ date: new Date().toLocaleString(), message: message, })); } logPropertiesForEachObject(objs, ...keys) { objs.forEach((obj, i) => { // const selectedKeys = keys.filter(key => obj.hasOwnProperty(key)); const selectedKeys = keys.filter(key => Object.prototype.hasOwnProperty.bind(obj, key)); const selectedObj = selectedKeys.reduce((acc, key) => { acc[key] = obj[key]; return acc; }, {}); const formattedMessage = `${i}: ${JSON.stringify(selectedObj, null, 2)}`; this._console.log(formattedMessage); this.logToFile(formattedMessage); }); } showLogfileText() { if (!this.hasLogFile()) { this._console.log('No log file specified'); } this._console.log('--- Log file name ---'); this._console.log(this.logFilePath); this._console.log('--- Log file text ---'); this._console.log(fs_1.default.readFileSync(this.logFilePath, 'utf-8')); } getLoggingOpts() { return { logFile: this.hasLogFile(), silence: this.hasSilence(), }; } } exports.Logger = Logger; class JestLogger extends Logger { _jestConsole = console; _globalConsole = global.console; constructor() { super('', false, console); } beforeEachTest() { global.console = this._globalConsole; } afterEachTest() { global.console = this._jestConsole; } } exports.JestLogger = JestLogger; exports.logger = new Logger(); function createServerLogger(logFilePath, clear = true, connectionConsole) { if (!exports.logger.isStarted()) { exports.logger = new Logger(logFilePath, clear, connectionConsole); exports.logger.start(); } return exports.logger; } function createJestLogger() { return new JestLogger(); } function logToStdout(message, newline = true) { const output = `${message}${!!newline && '\n'}`; process.stdout.write(output); } /** util for joining multiple strings and logging to stdout with trailing `\n` */ function logToStdoutJoined(...message) { const output = `${message.join('')}\n`; process.stdout.write(output); } /** * A helper function to wrap default logging behavior for the logger, if it is started. * - If logger is started, log to logger `logger.log()` * - If logger is not started, log to stdout `logToStdout()` * * @param args - any number of arguments to log * @returns void */ function log(...args) { if (exports.logger.isStarted()) { exports.logger.log(...args); } else { logToStdout(args.join(''), true); } }