feat: deno lsp (#3210)

Co-authored-by: hiunguynx <hieu.nm1@teko.vn>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
This commit is contained in:
Hieu Nguyen
2025-10-17 06:08:36 +07:00
committed by GitHub
parent 2be9ed2590
commit 92d9a0ec61
2 changed files with 50 additions and 18 deletions

View File

@@ -20,10 +20,20 @@ export namespace LSPServer {
type RootFunction = (file: string) => Promise<string | undefined>
const NearestRoot = (patterns: string[]): RootFunction => {
const NearestRoot = (includePatterns: string[], excludePatterns?: string[]): RootFunction => {
return async (file) => {
if (excludePatterns) {
const excludedFiles = Filesystem.up({
targets: excludePatterns,
start: path.dirname(file),
stop: Instance.directory,
})
const excluded = await excludedFiles.next()
await excludedFiles.return()
if (excluded.value) return undefined
}
const files = Filesystem.up({
targets: patterns,
targets: includePatterns,
start: path.dirname(file),
stop: Instance.directory,
})
@@ -42,9 +52,30 @@ export namespace LSPServer {
spawn(root: string): Promise<Handle | undefined>
}
export const Deno: Info = {
id: "deno",
root: NearestRoot(["deno.json", "deno.jsonc"]),
extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs"],
async spawn(root) {
const deno = Bun.which("deno")
if (!deno) {
log.info("deno not found, please install deno first")
return
}
return {
process: spawn(deno, ["lsp"], {
cwd: root,
}),
}
},
}
export const Typescript: Info = {
id: "typescript",
root: NearestRoot(["package-lock.json", "bun.lockb", "bun.lock", "pnpm-lock.yaml", "yarn.lock"]),
root: NearestRoot(
["package-lock.json", "bun.lockb", "bun.lock", "pnpm-lock.yaml", "yarn.lock"],
["deno.json", "deno.jsonc"],
),
extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts"],
async spawn(root) {
const tsserver = await Bun.resolve("typescript/lib/tsserver.js", Instance.directory).catch(() => {})

View File

@@ -12,8 +12,9 @@ OpenCode integrates with your Language Server Protocol (LSP) to help the LLM int
OpenCode comes with several built-in LSP servers for popular languages:
| LSP Server | Extensions | Requirements |
| ---------- | ---------------------------------------------------- | ----------------------------------- |
| ---------- | ---------------------------------------------------- | ------------------------------------------------------------ |
| typescript | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts | `typescript` dependency in project |
| deno | .ts, .tsx, .js, .jsx, .mjs | `deno` command available (auto-detects deno.json/deno.jsonc) |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` dependency in project |
| gopls | .go | `go` command available |
| ruby-lsp | .rb, .rake, .gemspec, .ru | `ruby` and `gem` commands available |