Skip to content

fix(editor): polyfill structuredClone for legacy browsers (Sentry MONOREPO-EDITOR-FB)#524

Open
anton-pascal wants to merge 1 commit into
mainfrom
fix/sentry-EDITOR-FB
Open

fix(editor): polyfill structuredClone for legacy browsers (Sentry MONOREPO-EDITOR-FB)#524
anton-pascal wants to merge 1 commit into
mainfrom
fix/sentry-EDITOR-FB

Conversation

@anton-pascal

@anton-pascal anton-pascal commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add a guarded structuredClone polyfill for browsers that do not provide the native API
  • load it from Next.js instrumentation-client.ts before the editor's client modules are evaluated
  • add a local TypeScript declaration for @ungap/structured-clone

Sentry issue

Sentry issue MONOREPO-EDITOR-FB shows the public viewer failing entirely on legacy Android browsers (including Honor Browser 9.8.0 / Chromium <98) with ReferenceError: structuredClone is not defined.

@pascal-app/lingo@0.2.0 calls structuredClone during module initialization through registerKind. The package is imported by packages/editor/src/lib/measurement-parser.ts, so app-level component guards run too late. Installing the global fallback from the client instrumentation entry ensures it exists before the editor/lingo module graph is evaluated.

Validation

  • bun install --frozen-lockfile
  • Biome lint on the new instrumentation/polyfill/type declaration files ✅
  • editor app typecheck: touched files pass, but the command remains red due to existing unrelated workspace type/export mismatches

Generated from the nightly Sentry triage cron.


Note

Low Risk
Small, guarded client bootstrap change with a well-known polyfill; native browsers are untouched and scope is limited to the editor app.

Overview
Fixes hard crashes on legacy browsers (e.g. older Android / Chromium <98) where structuredClone is missing and the editor fails during module load (Sentry MONOREPO-EDITOR-FB).

The editor app now depends on @ungap/structured-clone and installs a guarded global fallback in lib/polyfills/structured-clone.ts (only when globalThis.structuredClone is not a function). That polyfill is pulled in from instrumentation-client.ts so it runs before the rest of the client bundle—important because dependencies such as @pascal-app/lingo can call structuredClone at import time.

A local ungap-structured-clone.d.ts types the polyfill package for TypeScript.

Reviewed by Cursor Bugbot for commit e380b05. Bugbot is set up for automated code reviews on this repo. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant