@chemzqm/neovim
Version:
NodeJS client API for vim9 and neovim
123 lines (122 loc) • 4.09 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.level = exports.nullLogger = void 0;
exports.createLogger = createLogger;
const fs_1 = __importDefault(require("fs"));
const os_1 = __importDefault(require("os"));
const path_1 = __importDefault(require("path"));
const util_1 = require("util");
exports.nullLogger = {
debug: () => { },
info: () => { },
warn: () => { },
error: () => { },
trace: () => { },
};
function getLogFile() {
let file = process.env.NODE_CLIENT_LOG_FILE;
if (file)
return file;
let dir = process.env.XDG_RUNTIME_DIR;
if (dir)
return path_1.default.join(dir, 'node-client.log');
return path_1.default.join(os_1.default.tmpdir(), `node-client-${process.pid}.log`);
}
const debugging = process.env.COC_NODE_CLIENT_DEBUG == '1' && process.env.COC_TESTER == '1';
const LOG_FILE_PATH = getLogFile();
exports.level = debugging ? 'debug' : process.env.NODE_CLIENT_LOG_LEVEL || 'info';
let invalid = !debugging && process.getuid && process.getuid() == 0;
if (!invalid && !debugging) {
try {
fs_1.default.mkdirSync(path_1.default.dirname(LOG_FILE_PATH), { recursive: true });
fs_1.default.writeFileSync(LOG_FILE_PATH, '', { encoding: 'utf8', mode: 0o666 });
}
catch (_e) {
invalid = true;
}
}
function toObject(arg) {
if (arg == null) {
return arg;
}
if (Array.isArray(arg)) {
return arg.map(o => toObject(o));
}
if (typeof arg == 'object' && typeof arg.prefix == 'string' && typeof arg.data == 'number') {
return '[' + arg.prefix + arg.data + ']';
}
return arg;
}
function toString(arg) {
if (debugging)
return (0, util_1.inspect)(arg, { depth: null, colors: true, compact: false });
if (arg == null)
return String(arg);
if (arg instanceof Error)
return arg.stack;
if (typeof arg == 'object')
return JSON.stringify(arg, null, 2);
return String(arg);
}
const toTwoDigits = (v) => v < 10 ? `0${v}` : v.toString();
const toThreeDigits = (v) => v < 10 ? `00${v}` : v < 100 ? `0${v}` : v.toString();
function toTimeString(currentTime) {
return `${toTwoDigits(currentTime.getHours())}:${toTwoDigits(currentTime.getMinutes())}:${toTwoDigits(currentTime.getSeconds())}.${toThreeDigits(currentTime.getMilliseconds())}`;
}
let writableStream = undefined;
class Logger {
constructor(name) {
this.name = name;
}
get stream() {
if (writableStream)
return writableStream;
if (debugging) {
writableStream = process.stdout;
}
else {
writableStream = fs_1.default.createWriteStream(LOG_FILE_PATH, { encoding: 'utf8' });
}
return writableStream;
}
getText(level, data, meta) {
let more = '';
if (meta.length) {
let arr = toObject(meta);
more = ' ' + arr.map(o => toString(o)).join(', ');
}
return `${toTimeString(new Date())} ${level.toUpperCase()} [${this.name}] - ${data}${more}\n`;
}
debug(data, ...meta) {
if (exports.level != 'debug' || invalid)
return;
this.stream.write(this.getText('debug', data, meta));
}
info(data, ...meta) {
if (invalid)
return;
this.stream.write(this.getText('info', data, meta));
}
warn(data, ...meta) {
if (invalid)
return;
this.stream.write(this.getText('warn', data, meta));
}
error(data, ...meta) {
if (invalid)
return;
let stream = debugging ? process.stderr : this.stream;
stream.write(this.getText('error', data, meta));
}
trace(data, ...meta) {
if (exports.level != 'trace' || invalid)
return;
this.stream.write(this.getText('trace', data, meta));
}
}
function createLogger(name) {
return new Logger(name);
}