fix(core): use file:// URLs for local dynamic import() on Windows+Node (#23639)
This commit is contained in:
@@ -19,6 +19,7 @@ import { zod } from "@/util/effect-zod"
|
|||||||
import { iife } from "@/util/iife"
|
import { iife } from "@/util/iife"
|
||||||
import { Global } from "../global"
|
import { Global } from "../global"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
|
import { pathToFileURL } from "url"
|
||||||
import { Effect, Layer, Context, Schema, Types } from "effect"
|
import { Effect, Layer, Context, Schema, Types } from "effect"
|
||||||
import { EffectBridge } from "@/effect"
|
import { EffectBridge } from "@/effect"
|
||||||
import { InstanceState } from "@/effect"
|
import { InstanceState } from "@/effect"
|
||||||
@@ -1506,7 +1507,10 @@ const layer: Layer.Layer<
|
|||||||
installedPath = model.api.npm
|
installedPath = model.api.npm
|
||||||
}
|
}
|
||||||
|
|
||||||
const mod = await import(installedPath)
|
// `installedPath` is a local entry path or an existing `file://` URL. Normalize
|
||||||
|
// only path inputs so Node on Windows accepts the dynamic import.
|
||||||
|
const importSpec = installedPath.startsWith("file://") ? installedPath : pathToFileURL(installedPath).href
|
||||||
|
const mod = await import(importSpec)
|
||||||
|
|
||||||
const fn = mod[Object.keys(mod).find((key) => key.startsWith("create"))!]
|
const fn = mod[Object.keys(mod).find((key) => key.startsWith("create"))!]
|
||||||
const loaded = fn({
|
const loaded = fn({
|
||||||
|
|||||||
@@ -157,9 +157,9 @@ export const layer: Layer.Layer<
|
|||||||
if (matches.length) yield* config.waitForDependencies()
|
if (matches.length) yield* config.waitForDependencies()
|
||||||
for (const match of matches) {
|
for (const match of matches) {
|
||||||
const namespace = path.basename(match, path.extname(match))
|
const namespace = path.basename(match, path.extname(match))
|
||||||
const mod = yield* Effect.promise(
|
// `match` is an absolute filesystem path from `Glob.scanSync(..., { absolute: true })`.
|
||||||
() => import(process.platform === "win32" ? match : pathToFileURL(match).href),
|
// Import it as `file://` so Node on Windows accepts the dynamic import.
|
||||||
)
|
const mod = yield* Effect.promise(() => import(pathToFileURL(match).href))
|
||||||
for (const [id, def] of Object.entries<ToolDefinition>(mod)) {
|
for (const [id, def] of Object.entries<ToolDefinition>(mod)) {
|
||||||
custom.push(fromPlugin(id === "default" ? namespace : `${namespace}_${id}`, def))
|
custom.push(fromPlugin(id === "default" ? namespace : `${namespace}_${id}`, def))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user