Files
kurihada 5e32375f0e feat: 重构为 Monorepo 架构并实现 HTTP Server
架构变更:
- 采用 pnpm workspaces 实现 Monorepo 结构
- 将现有代码迁移到 packages/core
- 新增 packages/server HTTP 服务层

Server 功能:
- REST API: 会话管理、工具管理、配置管理
- WebSocket: 实时双向通信支持
- SSE: 服务端事件推送
- Hono + Bun 作为运行时

API 端点:
- GET/POST /api/sessions - 会话 CRUD
- GET/POST /api/sessions/:id/messages - 消息管理
- GET /api/sessions/:id/events - SSE 事件流
- WS /api/ws/:sessionId - WebSocket 连接
- GET/POST /api/tools - 工具管理
- GET/PUT /api/config - 配置管理
2025-12-12 10:42:20 +08:00

196 lines
6.2 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, it, expect } from 'vitest';
import {
getServerConfig,
hasServerConfig,
getSupportedLanguages,
getAllServerConfigs,
getUniqueServers,
} from '../../../src/lsp/server.js';
describe('LSP Server - 语言服务器配置', () => {
describe('getServerConfig - 获取服务器配置', () => {
it('返回 TypeScript 配置', () => {
const config = getServerConfig('typescript');
expect(config).toBeDefined();
expect(config?.command).toBe('typescript-language-server');
expect(config?.args).toContain('--stdio');
expect(config?.displayName).toBe('TypeScript');
});
it('返回 JavaScript 配置(共用 TypeScript', () => {
const config = getServerConfig('javascript');
expect(config).toBeDefined();
expect(config?.command).toBe('typescript-language-server');
});
it('返回 Python 配置', () => {
const config = getServerConfig('python');
expect(config).toBeDefined();
expect(config?.command).toBe('pyright-langserver');
expect(config?.install.npm).toBe('pyright');
});
it('返回 Go 配置', () => {
const config = getServerConfig('go');
expect(config).toBeDefined();
expect(config?.command).toBe('gopls');
expect(config?.install.go).toContain('gopls');
});
it('返回 Rust 配置', () => {
const config = getServerConfig('rust');
expect(config).toBeDefined();
expect(config?.command).toBe('rust-analyzer');
expect(config?.install.rustup).toBe('rust-analyzer');
});
it('返回 C/C++ 配置', () => {
const cConfig = getServerConfig('c');
const cppConfig = getServerConfig('cpp');
expect(cConfig?.command).toBe('clangd');
expect(cppConfig?.command).toBe('clangd');
});
it('返回 Vue 配置', () => {
const config = getServerConfig('vue');
expect(config).toBeDefined();
expect(config?.command).toBe('vue-language-server');
});
it('返回 HTML/CSS/JSON 配置', () => {
expect(getServerConfig('html')?.command).toBe('vscode-html-language-server');
expect(getServerConfig('css')?.command).toBe('vscode-css-language-server');
expect(getServerConfig('json')?.command).toBe('vscode-json-language-server');
});
it('不支持的语言返回 undefined', () => {
const config = getServerConfig('unknown' as any);
expect(config).toBeUndefined();
});
});
describe('hasServerConfig - 检查服务器配置', () => {
it('已配置的语言返回 true', () => {
expect(hasServerConfig('typescript')).toBe(true);
expect(hasServerConfig('python')).toBe(true);
expect(hasServerConfig('go')).toBe(true);
expect(hasServerConfig('rust')).toBe(true);
});
it('未配置的语言返回 false', () => {
expect(hasServerConfig('unknown' as any)).toBe(false);
});
});
describe('getSupportedLanguages - 获取支持的语言', () => {
it('返回所有支持的语言 ID', () => {
const languages = getSupportedLanguages();
expect(Array.isArray(languages)).toBe(true);
expect(languages.length).toBeGreaterThan(0);
expect(languages).toContain('typescript');
expect(languages).toContain('javascript');
expect(languages).toContain('python');
expect(languages).toContain('go');
expect(languages).toContain('rust');
});
});
describe('getAllServerConfigs - 获取所有配置', () => {
it('返回所有服务器配置对象', () => {
const configs = getAllServerConfigs();
expect(typeof configs).toBe('object');
expect(configs.typescript).toBeDefined();
expect(configs.python).toBeDefined();
});
});
describe('getUniqueServers - 获取唯一服务器列表', () => {
it('返回去重后的服务器列表', () => {
const servers = getUniqueServers();
expect(Array.isArray(servers)).toBe(true);
// typescript-language-server 被多个语言共用
const tsServer = servers.find((s) => s.id === 'typescript-language-server');
expect(tsServer).toBeDefined();
expect(tsServer?.languages).toContain('typescript');
expect(tsServer?.languages).toContain('javascript');
});
it('每个服务器包含必要字段', () => {
const servers = getUniqueServers();
for (const server of servers) {
expect(server.id).toBeDefined();
expect(server.config).toBeDefined();
expect(server.languages).toBeDefined();
expect(Array.isArray(server.languages)).toBe(true);
expect(server.languages.length).toBeGreaterThan(0);
}
});
it('clangd 被 C 和 C++ 共用', () => {
const servers = getUniqueServers();
const clangd = servers.find((s) => s.id === 'clangd');
expect(clangd).toBeDefined();
expect(clangd?.languages).toContain('c');
expect(clangd?.languages).toContain('cpp');
});
it('vscode-css-language-server 被 CSS/SCSS/Less 共用', () => {
const servers = getUniqueServers();
const cssServer = servers.find((s) => s.id === 'vscode-css-language-server');
expect(cssServer).toBeDefined();
expect(cssServer?.languages).toContain('css');
expect(cssServer?.languages).toContain('scss');
expect(cssServer?.languages).toContain('less');
});
});
describe('安装配置', () => {
it('TypeScript 服务器有 npm 安装配置', () => {
const config = getServerConfig('typescript');
expect(config?.install.npm).toContain('typescript-language-server');
});
it('Python 服务器有多种安装方式', () => {
const config = getServerConfig('python');
expect(config?.install.npm).toBe('pyright');
expect(config?.install.pip).toBe('pyright');
});
it('Go 服务器有 go install 配置', () => {
const config = getServerConfig('go');
expect(config?.install.go).toContain('gopls');
});
it('Rust 服务器有 rustup 和 brew 安装配置', () => {
const config = getServerConfig('rust');
expect(config?.install.rustup).toBe('rust-analyzer');
expect(config?.install.brew).toBe('rust-analyzer');
});
it('Ruby 服务器有 gem 安装配置', () => {
const config = getServerConfig('ruby');
expect(config?.install.gem).toBe('solargraph');
});
});
});