fish-lsp
Version:
LSP implementation for fish/fish-shell
187 lines (186 loc) • 8.54 kB
JavaScript
;
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;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.performHealthCheck = performHealthCheck;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const config_1 = require("../config");
const logger_1 = require("../logger");
const parser_1 = require("../parser");
const exec_1 = require("./exec");
const file_operations_1 = require("./file-operations");
const env_manager_1 = require("./env-manager");
const commander_cli_subcommands_1 = require("./commander-cli-subcommands");
async function performHealthCheck() {
logger_1.logger.logToStdout('fish-lsp health check');
logger_1.logger.logToStdout('='.repeat(21));
logger_1.logger.logToStdout('\nchecking `fish-lsp` command:');
try {
const fishLspVersion = commander_cli_subcommands_1.PackageVersion;
logger_1.logger.logToStdout(`✓ fish-lsp version: v${fishLspVersion}`);
}
catch (error) {
logger_1.logger.logToStdout('✗ fish-lsp version not found');
}
try {
const fishLspPath = (await (0, exec_1.execAsyncFish)('command -v fish-lsp')).stdout.toString().trim();
if (fishLspPath) {
logger_1.logger.logToStdout(`✓ fish-lsp binary found: ${fishLspPath}`);
}
else {
logger_1.logger.logToStdout('✗ fish-lsp binary not found in path');
}
}
catch (error) {
logger_1.logger.logToStdout('✗ fish-lsp binary not found in path');
process.exit(1);
}
logger_1.logger.logToStdout('\nchecking dependencies:');
try {
const fishVersion = (await (0, exec_1.execAsyncFish)('fish --version | string match -r "\\d.*\\$"')).stdout.toString().trim();
logger_1.logger.logToStdout(`✓ fish shell: v${fishVersion}`);
}
catch (error) {
logger_1.logger.logToStdout('✗ fish shell not found or not working correctly');
process.exit(1);
}
try {
await (0, parser_1.initializeParser)().then(() => {
logger_1.logger.logToStdout('✓ tree-sitter initialized successfully');
});
}
catch (e) {
logger_1.logger.logToStdout(`✗ tree-sitter initialization failed: ${e.message}`);
process.exit(1);
}
if (isNodeVersionGreaterThan22()) {
logger_1.logger.logToStdout(`✓ node version satisfies minimum version 22 (current version: ${process.versions.node})`);
}
else {
logger_1.logger.logToStdout(`✓ node version doesn't satisfy minimum version 22 (current version: ${process.versions.node})`);
}
await logFishLspConfig();
logger_1.logger.logToStdout('\nchecking log file:');
if (config_1.config.fish_lsp_log_file) {
logger_1.logger.logToStdout(`✓ log file found: ${config_1.config.fish_lsp_log_file}`);
try {
const logDir = path.dirname(config_1.config.fish_lsp_log_file);
await fs.promises.access(logDir, fs.constants.W_OK);
logger_1.logger.logToStdout(`✓ log directory is writable: ${logDir}`);
}
catch (error) {
logger_1.logger.logToStdout(`✗ cannot write to log directory: ${path.dirname(config_1.config.fish_lsp_log_file)}`);
}
}
else {
logger_1.logger.logToStdout('✗ log file not specified');
}
try {
logger_1.logger.logToStdout('\nchecking for fish-lsp completions:');
const completions = (await (0, exec_1.execAsyncFish)('path sort --unique --key=basename $fish_complete_path/*.fish | string match -re "fish-lsp.fish\\$"')).stdout.toString().trim();
if (completions) {
logger_1.logger.logToStdout(`✓ completions file found: ${completions}`);
}
else {
logger_1.logger.logToStdout('✗ completions file not found');
}
try {
const completionsEqual = await (0, exec_1.execAsyncFish)(`fish-lsp complete | command diff ${completions} -`);
if (completionsEqual.stdout.toString().trim() === '') {
logger_1.logger.logToStdout('✓ completions file is up to date');
}
else {
logger_1.logger.logToStdout('✗ completions file is not up to date');
}
}
catch (error) {
logger_1.logger.logToStdout('✗ completions file is not up to date');
}
}
catch (error) {
logger_1.logger.logToStdout('✗ completion file not found');
}
try {
logger_1.logger.logToStdout('\nchecking for fish-lsp man page:');
const manFile = await (0, exec_1.execAsyncFish)('man fish-lsp 2>/dev/null | command cat | count');
const manFilePath = (await (0, exec_1.execAsyncFish)('man -w fish-lsp 2> /dev/null')).stdout.toString().trim();
if (manFile.stdout && parseInt(manFile.stdout.toString().trim()) > 1 && manFilePath !== '') {
logger_1.logger.logToStdout(`✓ man file found: ${manFilePath}`);
}
else {
logger_1.logger.logToStdout('✗ man file not found');
}
}
catch (error) {
logger_1.logger.logToStdout('✗ man file not found');
}
const memoryUsage = process.memoryUsage();
logger_1.logger.logToStdout('\nmemory usage:');
logger_1.logger.logToStdout(` rss: ${Math.round(memoryUsage.rss / 1024 / 1024)} MB`);
logger_1.logger.logToStdout(` heap Used: ${Math.round(memoryUsage.heapUsed / 1024 / 1024)} MB`);
logger_1.logger.logToStdout(` heap Total: ${Math.round(memoryUsage.heapTotal / 1024 / 1024)} MB`);
logger_1.logger.logToStdout('\nsystem information:');
logger_1.logger.logToStdout(` platform: ${process.platform}`);
logger_1.logger.logToStdout(` node.js: ${process.version}`);
logger_1.logger.logToStdout(` architecture: ${process.arch}`);
logger_1.logger.logToStdout('\nall checks completed!');
}
async function logFishLspConfig() {
logger_1.logger.logToStdout('\nfish_lsp_all_indexed_paths:');
const dataDir = env_manager_1.env.getFirstValueInArray('__fish_data_dir');
for (const path of config_1.config.fish_lsp_all_indexed_paths) {
const expanded_path = file_operations_1.SyncFileHelper.expandEnvVars(path);
if (fs.statSync(expanded_path).isDirectory()) {
logger_1.logger.logToStdout(`✓ fish-lsp workspace '${path}' is a directory`);
}
else {
logger_1.logger.logToStdout(`✗ fish-lsp workspace '${path}' is not a directory`);
}
try {
await fs.promises.access(expanded_path, fs.constants.R_OK);
logger_1.logger.logToStdout(`✓ fish-lsp workspace '${path}' is readable`);
}
catch (error) {
logger_1.logger.logToStdout(`✗ fish-lsp workspace '${path}' is not readable`);
}
try {
await fs.promises.access(expanded_path, fs.constants.W_OK);
logger_1.logger.logToStdout(`✓ fish-lsp workspace '${path}' is writable`);
}
catch (error) {
if (expanded_path === dataDir) {
logger_1.logger.logToStdout(`✗ fish-lsp workspace '${path}' is not writable (this is expected)`);
}
else {
logger_1.logger.logToStdout(`✗ fish-lsp workspace '${path}' is not writable`);
}
}
}
}
function isNodeVersionGreaterThan22() {
const currentVersion = process.versions.node;
const majorVersion = parseInt(currentVersion.split('.')[0], 10);
return majorVersion >= 22;
}