From c8c26c49bd8a4073ed1b0d26ddaaac1cbf2a2d73 Mon Sep 17 00:00:00 2001 From: onmax Date: Sat, 3 Oct 2026 02:06:58 +0200 Subject: [PATCH] fix(provider-runtime): import bundled Node builtins through ESM --- .../provider-runtime/src/package-artifact.test.ts | 11 +++++++++-- packages/provider-runtime/vite.config.ts | 4 +++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/provider-runtime/src/package-artifact.test.ts b/packages/provider-runtime/src/package-artifact.test.ts index e04481e10bdb9..4babb836443e8 100644 --- a/packages/provider-runtime/src/package-artifact.test.ts +++ b/packages/provider-runtime/src/package-artifact.test.ts @@ -48,7 +48,7 @@ function publishedManifest( describe("provider-runtime package artifact", () => { it( - "installs and starts a Codex-only consumer without the Claude SDK", + "starts a Codex-only consumer with ESM Node builtins and no Claude SDK", { timeout: 120_000 }, async () => { const temporaryDirectory = await NodeFSP.mkdtemp( @@ -139,7 +139,14 @@ describe("provider-runtime package artifact", () => { await NodeFSP.writeFile( NodePath.join(consumerDirectory, "verify.mjs"), [ - 'import { createProviderRuntime } from "@t3tools/provider-runtime";', + 'import { registerHooks } from "node:module";', + "registerHooks({ resolve(specifier, context, nextResolve) {", + ' if (context.conditions.includes("require") && /^(node:)?(process|buffer)$/.test(specifier)) {', + ' throw new Error(`No such module "${specifier}"`);', + " }", + " return nextResolve(specifier, context);", + "} });", + 'const { createProviderRuntime } = await import("@t3tools/provider-runtime");', 'const runtime = await createProviderRuntime({ provider: "codex" });', "await runtime.close();", ].join("\n"), diff --git a/packages/provider-runtime/vite.config.ts b/packages/provider-runtime/vite.config.ts index 386338b9bb6a9..1fb30ebae5ab6 100644 --- a/packages/provider-runtime/vite.config.ts +++ b/packages/provider-runtime/vite.config.ts @@ -1,9 +1,11 @@ -import { defineConfig } from "vite-plus"; +import { defineConfig, esmExternalRequirePlugin } from "vite-plus"; export default defineConfig({ pack: { entry: ["src/index.ts"], outDir: "dist", + // Workers accept these Node builtins through ESM, but not createRequire. + plugins: [esmExternalRequirePlugin({ external: [/^(node:)?(?:process|buffer)$/] })], deps: { // Publish the Node adapters built against our locked Effect version. Their // transitive prerelease ranges can otherwise install incompatible adapters.