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

This commit is contained in:
Luke Parker
2026-02-24 22:20:57 +10:00
committed by GitHub
parent a292eddeb5
commit 1af3e9e557
2 changed files with 13 additions and 4 deletions

View File

@@ -1,6 +1,7 @@
import { Log } from "../util/log" import { Log } from "../util/log"
import path from "path" import path from "path"
import { pathToFileURL } from "url" import { pathToFileURL, fileURLToPath } from "url"
import { createRequire } from "module"
import os from "os" import os from "os"
import z from "zod" import z from "zod"
import { Filesystem } from "../util/filesystem" import { Filesystem } from "../util/filesystem"
@@ -276,7 +277,6 @@ export namespace Config {
"@opencode-ai/plugin": targetVersion, "@opencode-ai/plugin": targetVersion,
} }
await Filesystem.writeJson(pkg, json) await Filesystem.writeJson(pkg, json)
await new Promise((resolve) => setTimeout(resolve, 3000))
const gitignore = path.join(dir, ".gitignore") const gitignore = path.join(dir, ".gitignore")
const hasGitIgnore = await Filesystem.exists(gitignore) const hasGitIgnore = await Filesystem.exists(gitignore)
@@ -1332,7 +1332,16 @@ export namespace Config {
const plugin = data.plugin[i] const plugin = data.plugin[i]
try { try {
data.plugin[i] = import.meta.resolve!(plugin, options.path) 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 return data

View File

@@ -689,7 +689,7 @@ test("resolves scoped npm plugins in config", async () => {
const pluginEntries = config.plugin ?? [] const pluginEntries = config.plugin ?? []
const baseUrl = pathToFileURL(path.join(tmp.path, "opencode.json")).href 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) expect(pluginEntries.includes(expected)).toBe(true)