Bladeren bron

fix(win32): fix plugin resolution with createRequire fallback (#14898)

Luke Parker 1 maand geleden
bovenliggende
commit
1af3e9e557
2 gewijzigde bestanden met toevoegingen van 13 en 4 verwijderingen
  1. 12 3
      packages/opencode/src/config/config.ts
  2. 1 1
      packages/opencode/test/config/config.test.ts

+ 12 - 3
packages/opencode/src/config/config.ts

@@ -1,6 +1,7 @@
 import { Log } from "../util/log"
 import path from "path"
-import { pathToFileURL } from "url"
+import { pathToFileURL, fileURLToPath } from "url"
+import { createRequire } from "module"
 import os from "os"
 import z from "zod"
 import { Filesystem } from "../util/filesystem"
@@ -276,7 +277,6 @@ export namespace Config {
       "@opencode-ai/plugin": targetVersion,
     }
     await Filesystem.writeJson(pkg, json)
-    await new Promise((resolve) => setTimeout(resolve, 3000))
 
     const gitignore = path.join(dir, ".gitignore")
     const hasGitIgnore = await Filesystem.exists(gitignore)
@@ -1332,7 +1332,16 @@ export namespace Config {
           const plugin = data.plugin[i]
           try {
             data.plugin[i] = import.meta.resolve!(plugin, options.path)
-          } catch (err) {}
+          } catch (e) {
+            try {
+              // import.meta.resolve sometimes fails with newly created node_modules
+              const require = createRequire(options.path)
+              const resolvedPath = require.resolve(plugin)
+              data.plugin[i] = pathToFileURL(resolvedPath).href
+            } catch {
+              // Ignore, plugin might be a generic string identifier like "mcp-server"
+            }
+          }
         }
       }
       return data

+ 1 - 1
packages/opencode/test/config/config.test.ts

@@ -689,7 +689,7 @@ test("resolves scoped npm plugins in config", async () => {
       const pluginEntries = config.plugin ?? []
 
       const baseUrl = pathToFileURL(path.join(tmp.path, "opencode.json")).href
-      const expected = import.meta.resolve("@scope/plugin", baseUrl)
+      const expected = pathToFileURL(path.join(tmp.path, "node_modules", "@scope", "plugin", "index.js")).href
 
       expect(pluginEntries.includes(expected)).toBe(true)