From b6de25391a5e5fbf385c5b17b192b61bc2d39573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Fri, 23 Oct 2026 07:53:26 +0000 Subject: [PATCH] fix(runtime): a composition script that shadows console no longer breaks the render runtime (#6119) A script with a top-level const console = ... hides the global from every runtime call to console.info/warn. The runtime build now maps console to globalThis.console. --- .../core/scripts/build-hyperframes-runtime-artifact.ts | 2 ++ .../inline-scripts/hyperframesRuntime.engine.test.ts | 10 ++++++++++ .../src/inline-scripts/hyperframesRuntime.engine.ts | 3 +++ 3 files changed, 15 insertions(+) create mode 100644 packages/core/src/inline-scripts/hyperframesRuntime.engine.test.ts diff --git a/packages/core/scripts/build-hyperframes-runtime-artifact.ts b/packages/core/scripts/build-hyperframes-runtime-artifact.ts index 3543992dcf..f07715a8e9 100644 --- a/packages/core/scripts/build-hyperframes-runtime-artifact.ts +++ b/packages/core/scripts/build-hyperframes-runtime-artifact.ts @@ -7,6 +7,7 @@ import { HYPERFRAME_RUNTIME_CONTRACT, loadHyperframeRuntimeSource, } from "../src/inline-scripts/hyperframe"; +import { RUNTIME_ESBUILD_DEFINE } from "../src/inline-scripts/hyperframesRuntime.engine"; import { writeGeneratedFile } from "./writeGeneratedFile.js"; const thisDir = dirname(fileURLToPath(import.meta.url)); @@ -32,6 +33,7 @@ const esmBuild = buildSync({ target: ["es2020"], minify: true, legalComments: "none", + define: RUNTIME_ESBUILD_DEFINE, }); const esmSource = `${esmBuild.outputFiles[0]?.text ?? ""}\n`; diff --git a/packages/core/src/inline-scripts/hyperframesRuntime.engine.test.ts b/packages/core/src/inline-scripts/hyperframesRuntime.engine.test.ts new file mode 100644 index 0000000000..d0578ec2dc --- /dev/null +++ b/packages/core/src/inline-scripts/hyperframesRuntime.engine.test.ts @@ -0,0 +1,10 @@ +// @vitest-environment node +import { describe, expect, it } from "vitest"; +import { buildHyperframesRuntimeScript } from "./hyperframesRuntime.engine"; + +describe("buildHyperframesRuntimeScript", () => { + it("reaches console through globalThis so a composition's own `const console` cannot break it", () => { + const script = buildHyperframesRuntimeScript({ minify: false }); + expect(script).toContain("globalThis.console.info("); + }); +}); diff --git a/packages/core/src/inline-scripts/hyperframesRuntime.engine.ts b/packages/core/src/inline-scripts/hyperframesRuntime.engine.ts index 2cbdb809dd..dce6734798 100644 --- a/packages/core/src/inline-scripts/hyperframesRuntime.engine.ts +++ b/packages/core/src/inline-scripts/hyperframesRuntime.engine.ts @@ -9,6 +9,8 @@ export type HyperframesRuntimeBuildOptions = { minify?: boolean; }; +export const RUNTIME_ESBUILD_DEFINE = { console: "globalThis.console" }; + function applyDefaultParityMode(script: string, enabled: boolean): string { const parityFlagPattern = /var\s+_parityModeEnabled\s*=\s*(?:true|false)\s*;/; if (!parityFlagPattern.test(script)) return script; @@ -41,6 +43,7 @@ export function buildHyperframesRuntimeScript( target: ["es2020"], minify: options.minify ?? true, legalComments: "none", + define: RUNTIME_ESBUILD_DEFINE, }); let script = result.outputFiles[0]?.text ?? ""; if (typeof options.defaultParityMode === "boolean") {