Просмотр исходного кода

Add Vue LSP and enable eslint for `.vue` files. (#1952)

Andre van Tonder 6 месяцев назад
Родитель
Сommit
17a7c824b8
2 измененных файлов с 63 добавлено и 1 удалено
  1. 1 0
      packages/opencode/src/lsp/language.ts
  2. 62 1
      packages/opencode/src/lsp/server.ts

+ 1 - 0
packages/opencode/src/lsp/language.ts

@@ -94,6 +94,7 @@ export const LANGUAGE_EXTENSIONS: Record<string, string> = {
   ".yml": "yaml",
   ".mjs": "javascript",
   ".cjs": "javascript",
+  ".vue": "vue",
   ".zig": "zig",
   ".zon": "zig",
 } as const

+ 62 - 1
packages/opencode/src/lsp/server.ts

@@ -65,6 +65,67 @@ export namespace LSPServer {
     },
   }
 
+  export const Vue: Info = {
+    id: "vue",
+    extensions: [".vue"],
+    root: NearestRoot([
+      "tsconfig.json",
+      "jsconfig.json",
+      "package.json",
+      "pnpm-lock.yaml",
+      "yarn.lock",
+      "bun.lockb",
+      "bun.lock",
+      "vite.config.ts",
+      "vite.config.js",
+      "nuxt.config.ts",
+      "nuxt.config.js",
+      "vue.config.js",
+    ]),
+    async spawn(_, root) {
+      let binary = Bun.which("vue-language-server")
+      const args: string[] = []
+      if (!binary) {
+        const js = path.join(
+          Global.Path.bin,
+          "node_modules",
+          "@vue",
+          "language-server",
+          "bin",
+          "vue-language-server.js",
+        )
+        if (!(await Bun.file(js).exists())) {
+          await Bun.spawn([BunProc.which(), "install", "@vue/language-server"], {
+            cwd: Global.Path.bin,
+            env: {
+              ...process.env,
+              BUN_BE_BUN: "1",
+            },
+            stdout: "pipe",
+            stderr: "pipe",
+            stdin: "pipe",
+          }).exited
+        }
+        binary = BunProc.which()
+        args.push("run", js)
+      }
+      args.push("--stdio")
+      const proc = spawn(binary, args, {
+        cwd: root,
+        env: {
+          ...process.env,
+          BUN_BE_BUN: "1",
+        },
+      })
+      return {
+        process: proc,
+        initialization: {
+          // Leave empty; the server will auto-detect workspace TypeScript.
+        },
+      }
+    },
+  }
+
   export const ESLint: Info = {
     id: "eslint",
     root: NearestRoot([
@@ -81,7 +142,7 @@ export namespace LSPServer {
       ".eslintrc.json",
       "package.json",
     ]),
-    extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts"],
+    extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts", ".vue"],
     async spawn(app, root) {
       const eslint = await Bun.resolve("eslint", app.path.cwd).catch(() => {})
       if (!eslint) return