@wrongstack/plug-lsp 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +401 -294
- package/dist/index.js.map +1 -1
- package/dist/setup.js +19 -4
- package/dist/setup.js.map +1 -1
- package/package.json +3 -3
package/dist/setup.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from 'child_process';
|
|
2
3
|
import * as fs from 'fs/promises';
|
|
3
4
|
import * as path from 'path';
|
|
4
5
|
import { pathToFileURL } from 'url';
|
|
5
|
-
import { spawn } from 'child_process';
|
|
6
6
|
|
|
7
7
|
async function resolveServerCommand(command, cwd) {
|
|
8
8
|
const local = await findLocalBinary(cwd, command);
|
|
@@ -138,7 +138,14 @@ async function runSetup(args, deps = DEFAULT_DEPS) {
|
|
|
138
138
|
if (npmPackages.size > 0) {
|
|
139
139
|
const pm = await detectPackageManager(opts.cwd);
|
|
140
140
|
const { command, args: args2 } = installCommand(pm, Array.from(npmPackages));
|
|
141
|
-
await runOrPrint(
|
|
141
|
+
await runOrPrint(
|
|
142
|
+
command,
|
|
143
|
+
args2,
|
|
144
|
+
opts.cwd,
|
|
145
|
+
opts.dryRun,
|
|
146
|
+
"Installing npm-based LSP servers",
|
|
147
|
+
deps
|
|
148
|
+
);
|
|
142
149
|
}
|
|
143
150
|
for (const installer of toolchainInstalls) {
|
|
144
151
|
if (!opts.toolchains) {
|
|
@@ -149,7 +156,14 @@ async function runSetup(args, deps = DEFAULT_DEPS) {
|
|
|
149
156
|
deps.log(`Missing ${installer.label}: command "${installer.command}" is not on PATH.`);
|
|
150
157
|
continue;
|
|
151
158
|
}
|
|
152
|
-
await runOrPrint(
|
|
159
|
+
await runOrPrint(
|
|
160
|
+
installer.command,
|
|
161
|
+
installer.args,
|
|
162
|
+
opts.cwd,
|
|
163
|
+
opts.dryRun,
|
|
164
|
+
`Installing via ${installer.label}`,
|
|
165
|
+
deps
|
|
166
|
+
);
|
|
153
167
|
}
|
|
154
168
|
deps.log("LSP setup finished.");
|
|
155
169
|
}
|
|
@@ -179,7 +193,8 @@ function parseArgs(args, deps = DEFAULT_DEPS) {
|
|
|
179
193
|
}
|
|
180
194
|
async function detectPackageManager(cwd) {
|
|
181
195
|
if (await exists(path.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
|
|
182
|
-
if (await exists(path.join(cwd, "bun.lockb")) || await exists(path.join(cwd, "bun.lock")))
|
|
196
|
+
if (await exists(path.join(cwd, "bun.lockb")) || await exists(path.join(cwd, "bun.lock")))
|
|
197
|
+
return "bun";
|
|
183
198
|
if (await exists(path.join(cwd, "yarn.lock"))) return "yarn";
|
|
184
199
|
return "npm";
|
|
185
200
|
}
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/command-resolver.ts","../src/setup.ts"],"names":["resolve","args","path2","spawn","fs2"],"mappings":"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","file":"setup.js","sourcesContent":["import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { spawn } from 'node:child_process';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return await commandExistsOnPath(command) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return await fileExists(command) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args = process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { stdio: 'ignore', windowsHide: true });\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","#!/usr/bin/env node\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { spawn } from 'node:child_process';\nimport { resolveServerCommand, commandExistsOnPath } from './utils/command-resolver.js';\n\ntype PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\ninterface LanguageInstall {\n npmPackages?: string[];\n binary: string;\n toolchain?: {\n command: string;\n args: string[];\n label: string;\n };\n}\n\nconst DEFAULT_LANGUAGES = ['typescript', 'python', 'json', 'html', 'css', 'yaml', 'shell'];\n\nconst INSTALLS: Record<string, LanguageInstall> = {\n typescript: {\n binary: 'typescript-language-server',\n npmPackages: ['typescript', 'typescript-language-server'],\n },\n python: {\n binary: 'pyright-langserver',\n npmPackages: ['pyright'],\n },\n json: {\n binary: 'vscode-json-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n html: {\n binary: 'vscode-html-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n css: {\n binary: 'vscode-css-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n yaml: {\n binary: 'yaml-language-server',\n npmPackages: ['yaml-language-server'],\n },\n shell: {\n binary: 'bash-language-server',\n npmPackages: ['bash-language-server'],\n },\n go: {\n binary: 'gopls',\n toolchain: {\n command: 'go',\n args: ['install', 'golang.org/x/tools/gopls@latest'],\n label: 'Go toolchain',\n },\n },\n rust: {\n binary: 'rust-analyzer',\n toolchain: {\n command: 'rustup',\n args: ['component', 'add', 'rust-analyzer'],\n label: 'Rust toolchain',\n },\n },\n ruby: {\n binary: 'ruby-lsp',\n toolchain: {\n command: 'gem',\n args: ['install', 'ruby-lsp'],\n label: 'RubyGems',\n },\n },\n};\n\nexport interface SetupOptions {\n cwd: string;\n languages: string[];\n dryRun: boolean;\n toolchains: boolean;\n}\n\nexport interface SetupDeps {\n resolveServerCommand: typeof resolveServerCommand;\n commandExistsOnPath: typeof commandExistsOnPath;\n run: (command: string, args: string[], cwd: string) => Promise<void>;\n log: (message: string) => void;\n cwd: () => string;\n exit?: (code: number) => never;\n}\n\n/* v8 ignore start -- default process-bound deps are covered through injectable deps. */\nconst DEFAULT_DEPS: SetupDeps = {\n resolveServerCommand,\n commandExistsOnPath,\n run: runCommand,\n log: (message) => console.log(message),\n cwd: () => process.cwd(),\n exit: (code) => process.exit(code),\n};\n/* v8 ignore stop */\n\nexport async function runSetup(args: string[], deps: SetupDeps = DEFAULT_DEPS): Promise<void> {\n const opts = parseArgs(args, deps);\n const missing = opts.languages.filter((lang) => !INSTALLS[lang]);\n if (missing.length > 0) {\n throw new Error(`Unknown language preset(s): ${missing.join(', ')}`);\n }\n\n const alreadyInstalled: string[] = [];\n const npmPackages = new Set<string>();\n const toolchainInstalls: Array<NonNullable<LanguageInstall['toolchain']>> = [];\n\n for (const lang of opts.languages) {\n const install = INSTALLS[lang]!;\n if (await deps.resolveServerCommand(install.binary, opts.cwd)) {\n alreadyInstalled.push(lang);\n continue;\n }\n for (const pkg of install.npmPackages ?? []) npmPackages.add(pkg);\n if (install.toolchain) toolchainInstalls.push(install.toolchain);\n }\n\n if (alreadyInstalled.length > 0) {\n deps.log(`Already available: ${alreadyInstalled.join(', ')}`);\n }\n\n if (npmPackages.size > 0) {\n const pm = await detectPackageManager(opts.cwd);\n const { command, args } = installCommand(pm, Array.from(npmPackages));\n await runOrPrint(command, args, opts.cwd, opts.dryRun, 'Installing npm-based LSP servers', deps);\n }\n\n for (const installer of toolchainInstalls) {\n if (!opts.toolchains) {\n deps.log(`Skipping ${installer.label}; rerun without --no-toolchains to install.`);\n continue;\n }\n if (!(await deps.commandExistsOnPath(installer.command))) {\n deps.log(`Missing ${installer.label}: command \"${installer.command}\" is not on PATH.`);\n continue;\n }\n await runOrPrint(installer.command, installer.args, opts.cwd, opts.dryRun, `Installing via ${installer.label}`, deps);\n }\n\n deps.log('LSP setup finished.');\n}\n\nexport function parseArgs(args: string[], deps: Pick<SetupDeps, 'cwd' | 'exit' | 'log'> = DEFAULT_DEPS): SetupOptions {\n let cwd = deps.cwd();\n let languages = DEFAULT_LANGUAGES;\n let dryRun = false;\n let toolchains = true;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === '--cwd') {\n cwd = path.resolve(requiredValue(args, ++i, '--cwd'));\n } else if (arg === '--languages') {\n languages = requiredValue(args, ++i, '--languages')\n .split(',')\n .map((x) => x.trim())\n .filter(Boolean);\n } else if (arg === '--dry-run') {\n dryRun = true;\n } else if (arg === '--no-toolchains') {\n toolchains = false;\n } else if (arg === '--help' || arg === '-h') {\n printHelp(deps.log);\n deps.exit?.(0);\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return { cwd, languages, dryRun, toolchains };\n}\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await exists(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (await exists(path.join(cwd, 'bun.lockb')) || await exists(path.join(cwd, 'bun.lock'))) return 'bun';\n if (await exists(path.join(cwd, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nexport function installCommand(pm: PackageManager, packages: string[]): { command: string; args: string[] } {\n if (pm === 'pnpm') return { command: 'pnpm', args: ['add', '-D', ...packages] };\n if (pm === 'yarn') return { command: 'yarn', args: ['add', '-D', ...packages] };\n if (pm === 'bun') return { command: 'bun', args: ['add', '-d', ...packages] };\n return { command: 'npm', args: ['install', '-D', ...packages] };\n}\n\nasync function runOrPrint(\n command: string,\n args: string[],\n cwd: string,\n dryRun: boolean,\n label: string,\n deps: Pick<SetupDeps, 'run' | 'log'>,\n): Promise<void> {\n const rendered = [command, ...args].join(' ');\n if (dryRun) {\n deps.log(`[dry-run] ${label}: ${rendered}`);\n return;\n }\n deps.log(`${label}: ${rendered}`);\n await deps.run(command, args, cwd);\n}\n\nexport function runCommand(command: string, args: string[], cwd: string): Promise<void> {\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(command);\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell,\n windowsHide: true,\n });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`${command} exited with code ${code ?? 'null'}`));\n });\n });\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction requiredValue(args: string[], index: number, name: string): string {\n const value = args[index];\n if (!value) throw new Error(`${name} requires a value`);\n return value;\n}\n\nfunction printHelp(log: (message: string) => void): void {\n log(`wrongstack-lsp-setup\n\nInstall Language Server Protocol binaries for @wrongstack/plug-lsp.\n\nOptions:\n --cwd <path> Project directory. Defaults to current directory.\n --languages <list> Comma list. Defaults to ${DEFAULT_LANGUAGES.join(',')}.\n Available: ${Object.keys(INSTALLS).join(',')}.\n --dry-run Print commands without running them.\n --no-toolchains Skip Go/Rust/Ruby toolchain installers.\n`);\n}\n\n/* v8 ignore start -- CLI process-exit wrapper is exercised by invoking the built bin, not unit imports. */\nconst isCliEntrypoint = process.argv[1]\n ? import.meta.url === pathToFileURL(process.argv[1]).href\n : false;\n\nif (isCliEntrypoint) {\n runSetup(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n}\n/* v8 ignore stop */\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/command-resolver.ts","../src/setup.ts"],"names":["resolve","args","path2","spawn","fs2"],"mappings":"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","file":"setup.js","sourcesContent":["import { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return (await commandExistsOnPath(command)) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return (await fileExists(command)) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args =\n process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { stdio: 'ignore', windowsHide: true });\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","#!/usr/bin/env node\nimport { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { commandExistsOnPath, resolveServerCommand } from './utils/command-resolver.js';\n\ntype PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\ninterface LanguageInstall {\n npmPackages?: string[];\n binary: string;\n toolchain?: {\n command: string;\n args: string[];\n label: string;\n };\n}\n\nconst DEFAULT_LANGUAGES = ['typescript', 'python', 'json', 'html', 'css', 'yaml', 'shell'];\n\nconst INSTALLS: Record<string, LanguageInstall> = {\n typescript: {\n binary: 'typescript-language-server',\n npmPackages: ['typescript', 'typescript-language-server'],\n },\n python: {\n binary: 'pyright-langserver',\n npmPackages: ['pyright'],\n },\n json: {\n binary: 'vscode-json-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n html: {\n binary: 'vscode-html-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n css: {\n binary: 'vscode-css-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n yaml: {\n binary: 'yaml-language-server',\n npmPackages: ['yaml-language-server'],\n },\n shell: {\n binary: 'bash-language-server',\n npmPackages: ['bash-language-server'],\n },\n go: {\n binary: 'gopls',\n toolchain: {\n command: 'go',\n args: ['install', 'golang.org/x/tools/gopls@latest'],\n label: 'Go toolchain',\n },\n },\n rust: {\n binary: 'rust-analyzer',\n toolchain: {\n command: 'rustup',\n args: ['component', 'add', 'rust-analyzer'],\n label: 'Rust toolchain',\n },\n },\n ruby: {\n binary: 'ruby-lsp',\n toolchain: {\n command: 'gem',\n args: ['install', 'ruby-lsp'],\n label: 'RubyGems',\n },\n },\n};\n\nexport interface SetupOptions {\n cwd: string;\n languages: string[];\n dryRun: boolean;\n toolchains: boolean;\n}\n\nexport interface SetupDeps {\n resolveServerCommand: typeof resolveServerCommand;\n commandExistsOnPath: typeof commandExistsOnPath;\n run: (command: string, args: string[], cwd: string) => Promise<void>;\n log: (message: string) => void;\n cwd: () => string;\n exit?: (code: number) => never;\n}\n\n/* v8 ignore start -- default process-bound deps are covered through injectable deps. */\nconst DEFAULT_DEPS: SetupDeps = {\n resolveServerCommand,\n commandExistsOnPath,\n run: runCommand,\n log: (message) => console.log(message),\n cwd: () => process.cwd(),\n exit: (code) => process.exit(code),\n};\n/* v8 ignore stop */\n\nexport async function runSetup(args: string[], deps: SetupDeps = DEFAULT_DEPS): Promise<void> {\n const opts = parseArgs(args, deps);\n const missing = opts.languages.filter((lang) => !INSTALLS[lang]);\n if (missing.length > 0) {\n throw new Error(`Unknown language preset(s): ${missing.join(', ')}`);\n }\n\n const alreadyInstalled: string[] = [];\n const npmPackages = new Set<string>();\n const toolchainInstalls: Array<NonNullable<LanguageInstall['toolchain']>> = [];\n\n for (const lang of opts.languages) {\n const install = INSTALLS[lang]!;\n if (await deps.resolveServerCommand(install.binary, opts.cwd)) {\n alreadyInstalled.push(lang);\n continue;\n }\n for (const pkg of install.npmPackages ?? []) npmPackages.add(pkg);\n if (install.toolchain) toolchainInstalls.push(install.toolchain);\n }\n\n if (alreadyInstalled.length > 0) {\n deps.log(`Already available: ${alreadyInstalled.join(', ')}`);\n }\n\n if (npmPackages.size > 0) {\n const pm = await detectPackageManager(opts.cwd);\n const { command, args } = installCommand(pm, Array.from(npmPackages));\n await runOrPrint(\n command,\n args,\n opts.cwd,\n opts.dryRun,\n 'Installing npm-based LSP servers',\n deps,\n );\n }\n\n for (const installer of toolchainInstalls) {\n if (!opts.toolchains) {\n deps.log(`Skipping ${installer.label}; rerun without --no-toolchains to install.`);\n continue;\n }\n if (!(await deps.commandExistsOnPath(installer.command))) {\n deps.log(`Missing ${installer.label}: command \"${installer.command}\" is not on PATH.`);\n continue;\n }\n await runOrPrint(\n installer.command,\n installer.args,\n opts.cwd,\n opts.dryRun,\n `Installing via ${installer.label}`,\n deps,\n );\n }\n\n deps.log('LSP setup finished.');\n}\n\nexport function parseArgs(\n args: string[],\n deps: Pick<SetupDeps, 'cwd' | 'exit' | 'log'> = DEFAULT_DEPS,\n): SetupOptions {\n let cwd = deps.cwd();\n let languages = DEFAULT_LANGUAGES;\n let dryRun = false;\n let toolchains = true;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === '--cwd') {\n cwd = path.resolve(requiredValue(args, ++i, '--cwd'));\n } else if (arg === '--languages') {\n languages = requiredValue(args, ++i, '--languages')\n .split(',')\n .map((x) => x.trim())\n .filter(Boolean);\n } else if (arg === '--dry-run') {\n dryRun = true;\n } else if (arg === '--no-toolchains') {\n toolchains = false;\n } else if (arg === '--help' || arg === '-h') {\n printHelp(deps.log);\n deps.exit?.(0);\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return { cwd, languages, dryRun, toolchains };\n}\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await exists(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if ((await exists(path.join(cwd, 'bun.lockb'))) || (await exists(path.join(cwd, 'bun.lock'))))\n return 'bun';\n if (await exists(path.join(cwd, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nexport function installCommand(\n pm: PackageManager,\n packages: string[],\n): { command: string; args: string[] } {\n if (pm === 'pnpm') return { command: 'pnpm', args: ['add', '-D', ...packages] };\n if (pm === 'yarn') return { command: 'yarn', args: ['add', '-D', ...packages] };\n if (pm === 'bun') return { command: 'bun', args: ['add', '-d', ...packages] };\n return { command: 'npm', args: ['install', '-D', ...packages] };\n}\n\nasync function runOrPrint(\n command: string,\n args: string[],\n cwd: string,\n dryRun: boolean,\n label: string,\n deps: Pick<SetupDeps, 'run' | 'log'>,\n): Promise<void> {\n const rendered = [command, ...args].join(' ');\n if (dryRun) {\n deps.log(`[dry-run] ${label}: ${rendered}`);\n return;\n }\n deps.log(`${label}: ${rendered}`);\n await deps.run(command, args, cwd);\n}\n\nexport function runCommand(command: string, args: string[], cwd: string): Promise<void> {\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(command);\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell,\n windowsHide: true,\n });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`${command} exited with code ${code ?? 'null'}`));\n });\n });\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction requiredValue(args: string[], index: number, name: string): string {\n const value = args[index];\n if (!value) throw new Error(`${name} requires a value`);\n return value;\n}\n\nfunction printHelp(log: (message: string) => void): void {\n log(`wrongstack-lsp-setup\n\nInstall Language Server Protocol binaries for @wrongstack/plug-lsp.\n\nOptions:\n --cwd <path> Project directory. Defaults to current directory.\n --languages <list> Comma list. Defaults to ${DEFAULT_LANGUAGES.join(',')}.\n Available: ${Object.keys(INSTALLS).join(',')}.\n --dry-run Print commands without running them.\n --no-toolchains Skip Go/Rust/Ruby toolchain installers.\n`);\n}\n\n/* v8 ignore start -- CLI process-exit wrapper is exercised by invoking the built bin, not unit imports. */\nconst isCliEntrypoint = process.argv[1]\n ? import.meta.url === pathToFileURL(process.argv[1]).href\n : false;\n\nif (isCliEntrypoint) {\n runSetup(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n}\n/* v8 ignore stop */\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrongstack/plug-lsp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "WrongStack plugin that exposes Language Server Protocol tools.",
|
|
6
6
|
"repository": {
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
"vscode-languageserver-protocol": "^3.17.5"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@wrongstack/core": "0.1.
|
|
34
|
+
"@wrongstack/core": "0.1.10"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^22.19.19",
|
|
38
38
|
"tsup": "^8.5.1",
|
|
39
39
|
"typescript": "^5.9.3",
|
|
40
|
-
"@wrongstack/core": "0.1.
|
|
40
|
+
"@wrongstack/core": "0.1.10"
|
|
41
41
|
},
|
|
42
42
|
"publishConfig": {
|
|
43
43
|
"access": "public"
|