From c4fe0f676a070a78e76385bfd8c10470f24ac3bd Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Sat, 12 Sep 2026 17:07:33 +1000 Subject: [PATCH] fix(app): polyfill startup APIs for older Safari (#48621) --- bun.lock | 3 ++ .../e2e/regression/browser-polyfills.spec.ts | 37 +++++++++++++++++++ packages/app/package.json | 1 + packages/app/src/entry.tsx | 1 + packages/app/src/runtime/polyfills.ts | 3 ++ 5 files changed, 45 insertions(+) create mode 100644 packages/app/e2e/regression/browser-polyfills.spec.ts create mode 100644 packages/app/src/runtime/polyfills.ts diff --git a/bun.lock b/bun.lock index a6c5b3592ad..ae794a65b9b 100644 --- a/bun.lock +++ b/bun.lock @@ -82,6 +82,7 @@ "@solidjs/router": "catalog:", "@tanstack/solid-query": "5.91.4", "@tanstack/solid-virtual": "catalog:", + "core-js": "3.50.0", "effect": "catalog:", "fuzzysort": "catalog:", "ghostty-web": "github:anomalyco/ghostty-web#83c0a07b8628b748aed073b232cb4b52a6ca11c1", @@ -3702,6 +3703,8 @@ "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + "core-js": ["core-js@3.50.0", "", {}, "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw=="], + "core-js-compat": ["core-js-compat@3.50.0", "", { "dependencies": { "browserslist": "^4.28.7" } }, "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q=="], "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], diff --git a/packages/app/e2e/regression/browser-polyfills.spec.ts b/packages/app/e2e/regression/browser-polyfills.spec.ts new file mode 100644 index 00000000000..1f6dd3bf4cb --- /dev/null +++ b/packages/app/e2e/regression/browser-polyfills.spec.ts @@ -0,0 +1,37 @@ +import { expect, test } from "@playwright/test" +import { fixture, pageMessages } from "../smoke/session-timeline.fixture" +import { mockOpenCodeServer } from "../utils/mock-server" + +test("loads home and the directory picker without newer browser APIs", async ({ page }) => { + await mockOpenCodeServer(page, { + sessions: fixture.sessions, + provider: fixture.provider, + directory: fixture.directory, + project: fixture.project, + pageMessages, + fileList: () => [], + }) + await page.addInitScript((directory) => { + // Safari 16.6 has neither API. Remove them before the web entry runs. + Reflect.deleteProperty(Map, "groupBy") + Reflect.deleteProperty(Promise, "withResolvers") + localStorage.setItem( + "opencode.global.dat:server", + JSON.stringify({ + projects: { local: [{ worktree: directory, expanded: true }] }, + lastProject: { local: directory }, + }), + ) + }, fixture.directory) + + await page.goto("/") + const row = page.locator('[data-component="home-session-row"]').filter({ hasText: fixture.expected.targetTitle }) + await expect(row).toBeVisible() + + await page.getByRole("button", { name: "Add project", exact: true }).click() + const dialog = page.getByRole("dialog") + await expect(dialog.getByRole("button", { name: "Select folder", exact: true })).toBeEnabled() + await dialog.getByRole("button", { name: "Cancel", exact: true }).click() + await expect(dialog).toBeHidden() + await expect(row).toBeVisible() +}) diff --git a/packages/app/package.json b/packages/app/package.json index 0b56fce9b6f..e010ebb67ce 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -84,6 +84,7 @@ "@solidjs/router": "catalog:", "@tanstack/solid-query": "5.91.4", "@tanstack/solid-virtual": "catalog:", + "core-js": "3.50.0", "effect": "catalog:", "fuzzysort": "catalog:", "ghostty-web": "github:anomalyco/ghostty-web#83c0a07b8628b748aed073b232cb4b52a6ca11c1", diff --git a/packages/app/src/entry.tsx b/packages/app/src/entry.tsx index d81c5df221e..e31e28fd08c 100644 --- a/packages/app/src/entry.tsx +++ b/packages/app/src/entry.tsx @@ -1,5 +1,6 @@ // @refresh reload +import "@/runtime/polyfills" import { init } from "@sentry/solid" import { render } from "solid-js/web" import { AppBaseProviders, AppInterface } from "@/app" diff --git a/packages/app/src/runtime/polyfills.ts b/packages/app/src/runtime/polyfills.ts new file mode 100644 index 00000000000..0f1da68d48b --- /dev/null +++ b/packages/app/src/runtime/polyfills.ts @@ -0,0 +1,3 @@ +// Safari before 17.4 does not provide these runtime APIs. +import "core-js/es/map/group-by" +import "core-js/es/promise/with-resolvers"