UNPKG

fish-lsp

Version:

LSP implementation for fish/fish-shell

187 lines (186 loc) 8.54 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; }; 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; }