Repository navigation
fix: reset sveltekit-controlled error boundaries on navigation - #16296
Merged
Merged
Conversation
|
Install the latest version of pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/cd48bc7cf470f8f5f037263802236c2a70cbe193Open in |
🦋 Changeset detectedLatest commit: cd48bc7 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
elliott-with-the-longest-name-on-github
force-pushed
the
elliott/double-mount-error
branch
from
July 9, 2026 17:39
7a72d21 to
cd48bc7
Compare
teemingc
approved these changes
Jul 10, 2026
Rich-Harris
pushed a commit
that referenced
this pull request
Jul 14, 2026
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to version-3, this PR will be updated.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ `version-3` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run `changeset pre exit` on `version-3`.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ # Releases ## @sveltejs/kit@3.0.0-next.8 ### Major Changes - breaking: remove `experimental.handleRenderingErrors` flag ([#16265](#16265)) - breaking: make `getRequest` and `setResponse` synchronous ([#16280](#16280)) - breaking: make `page.url` immutable on a type level ([#16256](#16256)) - breaking: add `refreshAll` and deprecate `invalidateAll` ([#16289](#16289)) ### Minor Changes - feat: allow hyphens in param and matcher names ([#16284](#16284)) - feat: add `ErrorProps` to generated types ([#16272](#16272)) ### Patch Changes - fix: detect destructured `load` and `actions` exports during type generation ([#16329](#16329)) - fix: ensure CSS URL references are absolute when `paths.relative` is `false` ([#16315](#16315)) - fix: exclude deleted cookies from `cookies.getAll()` so it stays consistent with `cookies.get()` ([#16297](#16297)) - fix: reset failed `<svelte:boundary>` on client navigation so a stale `+error.svelte` is torn down ([#16296](#16296)) - fix: preserve shared client chunk hashes when the app version changes ([#16324](#16324)) - fix: align MAX_COOKIE_SIZE with RFC 6265bis ([#16322](#16322)) - fix: use mouseover+mousemove for preloading to reduce events ([#16325](#16325)) ## @sveltejs/package@3.0.0-next.2 ### Minor Changes - feat: warn when using a `.server.` file or file inside a `server` directory without importing a server-only module ([#16266](#16266)) ## @sveltejs/adapter-auto@8.0.0-next.1 ### Patch Changes - fix: allow prerelease versions of SvelteKit 3 to satisfy the peer dependency range ([#16286](#16286)) - Updated dependencies [[`737d119`](737d119), [`fa78efb`](fa78efb), [`07c207e`](07c207e), [`a47071b`](a47071b), [`14d7d5a`](14d7d5a), [`5c38e51`](5c38e51), [`0702baa`](0702baa), [`e1938c6`](e1938c6), [`8293144`](8293144), [`f76d7d9`](f76d7d9), [`ab5c253`](ab5c253), [`b557b1b`](b557b1b), [`4a513e2`](4a513e2)]: - @sveltejs/kit@3.0.0-next.8 ## @sveltejs/adapter-cloudflare@8.0.0-next.2 ### Patch Changes - fix: allow prerelease versions of SvelteKit 3 to satisfy the peer dependency range ([#16286](#16286)) - Updated dependencies [[`737d119`](737d119), [`fa78efb`](fa78efb), [`07c207e`](07c207e), [`a47071b`](a47071b), [`14d7d5a`](14d7d5a), [`5c38e51`](5c38e51), [`0702baa`](0702baa), [`e1938c6`](e1938c6), [`8293144`](8293144), [`f76d7d9`](f76d7d9), [`ab5c253`](ab5c253), [`b557b1b`](b557b1b), [`4a513e2`](4a513e2)]: - @sveltejs/kit@3.0.0-next.8 ## @sveltejs/adapter-netlify@7.0.0-next.3 ### Patch Changes - fix: include `utils.js` in package.json `files` ([#16298](#16298)) - Updated dependencies [[`737d119`](737d119), [`fa78efb`](fa78efb), [`07c207e`](07c207e), [`a47071b`](a47071b), [`14d7d5a`](14d7d5a), [`5c38e51`](5c38e51), [`0702baa`](0702baa), [`e1938c6`](e1938c6), [`8293144`](8293144), [`f76d7d9`](f76d7d9), [`ab5c253`](ab5c253), [`b557b1b`](b557b1b), [`4a513e2`](4a513e2)]: - @sveltejs/kit@3.0.0-next.8 ## @sveltejs/adapter-node@6.0.0-next.3 ### Patch Changes - fix: allow prerelease versions of SvelteKit 3 to satisfy the peer dependency range ([#16286](#16286)) - Updated dependencies [[`737d119`](737d119), [`fa78efb`](fa78efb), [`07c207e`](07c207e), [`a47071b`](a47071b), [`14d7d5a`](14d7d5a), [`5c38e51`](5c38e51), [`0702baa`](0702baa), [`e1938c6`](e1938c6), [`8293144`](8293144), [`f76d7d9`](f76d7d9), [`ab5c253`](ab5c253), [`b557b1b`](b557b1b), [`4a513e2`](4a513e2)]: - @sveltejs/kit@3.0.0-next.8 ## @sveltejs/adapter-static@4.0.0-next.1 ### Patch Changes - fix: allow prerelease versions of SvelteKit 3 to satisfy the peer dependency range ([#16286](#16286)) - Updated dependencies [[`737d119`](737d119), [`fa78efb`](fa78efb), [`07c207e`](07c207e), [`a47071b`](a47071b), [`14d7d5a`](14d7d5a), [`5c38e51`](5c38e51), [`0702baa`](0702baa), [`e1938c6`](e1938c6), [`8293144`](8293144), [`f76d7d9`](f76d7d9), [`ab5c253`](ab5c253), [`b557b1b`](b557b1b), [`4a513e2`](4a513e2)]: - @sveltejs/kit@3.0.0-next.8 ## @sveltejs/adapter-vercel@7.0.0-next.2 ### Patch Changes - fix: allow prerelease versions of SvelteKit 3 to satisfy the peer dependency range ([#16286](#16286)) - Updated dependencies [[`737d119`](737d119), [`fa78efb`](fa78efb), [`07c207e`](07c207e), [`a47071b`](a47071b), [`14d7d5a`](14d7d5a), [`5c38e51`](5c38e51), [`0702baa`](0702baa), [`e1938c6`](e1938c6), [`8293144`](8293144), [`f76d7d9`](f76d7d9), [`ab5c253`](ab5c253), [`b557b1b`](b557b1b), [`4a513e2`](4a513e2)]: - @sveltejs/kit@3.0.0-next.8 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Rich-Harris
added a commit
that referenced
this pull request
Aug 13, 2026
…n error is thrown during rendering (#16526) Fixes the error page placement half of #16345. Since #16301, an error thrown while rendering is caught by the boundary at the depth that threw it, so the nearest `+error.svelte` renders inside every layout between its own directory and the throwing component. The same error thrown in `load` renders that component at its own depth with the intervening layouts unmounted. Before #16301 the generated root only armed a boundary at depths that own an error component (`failed={errors[depth] ? failed : undefined}`), which made render errors rethrow up to the owning depth. The unconditional boundary plus the nearest-ancestor `findLast` changed that without a changeset, first shipping in 3.0.0-next.8, the version #16345 was filed against. SvelteKit 2 places the same error at the owning depth. The client and the server now build that array with one shared function instead of a copy each. Nearest-boundary selection (#14410, #15745) is unchanged, only where the selected error page renders. `set_nearest_error_page` rebuilt the chain with no errors at all, so a render error inside a form error page fell back to the root one. It now passes the route's. Conditional arming exposed a latent ordering problem in the #16296 reset path: `navigate` drains the resetters as soon as the new props are applied, before the flush, so a stale failed boundary re-renders its old content (which throws again) at a depth the new tree may no longer have. Unconditionally armed boundaries silently re-swallowed that throw on every teardown; with sparse arming it escaped to an ancestor boundary and rendered an error page instead of the new route. The drain now runs after `settled()`, matching the fork branch, which resets after state is applied. Boundaries at removed depths are simply unmounted by the flush; boundaries at surviving depths reset against a consistent tree. The async test app's `/server-error-boundary` route already had exactly this shape, with the root error page silently rendering inside the section layout. The two existing tests now assert the layout is gone. --------- Co-authored-by: Rich Harris <richard.a.harris@gmail.com> Co-authored-by: Rich Harris <rich.harris@vercel.com>
This was referenced Sep 22, 2026
7 of 8 tasks
Arutemu64
added a commit
to Arutemu64/fanapp
that referenced
this pull request
Oct 8, 2026
…#874) * build(frontend): migrate to sveltekit 3 and precache without vite-pwa Upgrades @sveltejs/kit 2.70.3 -> 3.0.0, adapter-static 3 -> 4, enhanced-img 0.11 -> 1.0 and svelte 5.57.0 -> 5.57.1 (Kit 3's floor), following https://svelte.dev/docs/kit/migrating-to-sveltekit-3. The `sv migrate sveltekit-3` codemod did the mechanical part; its printer also reflowed markup (moving text and punctuation across lines, which changes rendered whitespace), so every touched file was regenerated from main with a specifier-only codemod and only the semantic edits were re-applied. Framework changes: - svelte.config.js is gone; its options are passed to sveltekit() in vite.config.ts. experimental.handleRenderingErrors is now default. - $lib -> #lib subpath imports (package.json "imports"), with explicit extensions; components.json points the shadcn CLI at #lib (verified it emits #lib/utils.js). - $env/static/public -> $app/env/public, declared in src/env.ts. PUBLIC_SMARTCAPTCHA_CLIENT_KEY and PUBLIC_SITE_URL were missing from the codemod's list. - Path literals drop the leading slash ('' for home): route IDs now carry groups, so '/profile' is neither an ID nor a valid pathname. Every place that compares a Path with url.pathname now resolves it first (TAB_ROOTS, isNavItemActive, the back-transition target, the nav bars' re-tap-to-top check). - pushState -> goto('', { shallow: true }). Kit 3 runs navigation hooks for shallow goto, so the (app) layout skips them there. - invalidateAll -> refreshAll, which keeps page.state across the reconnect refresh. replaceState/keepFocus -> replace/reset. - goto now rejects for paths that match no route: completeLogin falls back to home when the ?next= path is bogus. - handleError gets { kind, error } and now sees expected errors too: app errors keep their thrown body, framework errors (unmatched route) get the Russian copy instead of Kit's English "Not Found", and only unknown errors are reported. - ErrorState's reload-on-navigate workaround and its TODO are removed: Kit 3 resets failed boundaries itself (sveltejs/kit#16296). - Removed comments: the handleRenderingErrors note in svelte.config.js and the +error.svelte mentions of the flag (the flag no longer exists), and the frontend.md bullet describing the Kit 2 boundary bug (its workaround is gone). Service worker (ADR-0020, superseding ADR-0016's plugin choice): @vite-pwa/sveltekit 1.1.0 peers only on Kit <= 2 and ships no precache manifest under Kit 3 (support is an open, unreviewed PR, vite-pwa/sveltekit#111). The worker now builds its Workbox precache list from $app/manifest via a pure, unit-tested buildPrecacheManifest with the old globPatterns/globIgnores rules. Verified in Chromium against a Kit 2 build of main served like nginx: the same entries (plus Kit 3's new payload chunk), no excluded file leaks, install, control and offline deep links work. The worker moves to src/service-worker/ with its own tsconfig (typechecked by pnpm check, now type-linted too, which caught an unawaited skipWaiting()) and is registered as a module worker, as Kit 3 emits it (Firefox 147+, Chrome 91+, Safari 15+; older browsers degrade to online-only). Tooling: eslint reads the config through @sveltejs/load-config and drops its function-valued `typescript` key for --cache; perfectionist groups #lib as internal imports; knip learns src/env.ts. pnpm-workspace.yaml exempts the exact versions kit@3.0.0, adapter-static@4.0.0 and enhanced-img@1.0.0 from the 7-day cooldown. All three were published 2026-10-01 ~17:22 UTC, so they mature a few hours after this commit. The TODO there says to drop the exemption. Suggested version bump: PATCH (a dependency migration; `just deploy` alone is enough, with no new env var or manual step). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGCtDhZVRh8Udfx6UwtW3E * fix(frontend): convert backend notification paths to app paths explicitly The API sends root-relative deep links ("/schedule", "/" for home). Passed to resolve() as-is, they hit its route-ID branch, which happens to produce the same pathname for today's paths but would parse [params] and (groups) in one. toAppPath strips the leading slash so resolve() reads them as pathnames; the notification card and the toast action both use it. Tests cover the paths the backend's notification interactors actually send. Also drops the stale "cast to Pathname" comment. Raised by Greptile on #874. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGCtDhZVRh8Udfx6UwtW3E * test(frontend): run the e2e build without captcha and sentry, trim the zoom check Three e2e failures that main shares, fixed here so this PR can go green: - CI builds with the real PUBLIC_SMARTCAPTCHA_CLIENT_KEY repository variable. The Yandex widget refuses 127.0.0.1 and blocks the email step, failing the 12 login specs from #872 on every run. - It also builds with the real PUBLIC_SENTRY_DSN at a 0.1 trace rate, so about one navigation in ten posts a performance trace to the DSN's /api/<project>/envelope/ path, which the API mock's **/api/** route records as unmatched (seen on the WebKit broadcast spec; confirmed locally to be transactions, not error reports). - The map zoom spec tapped «Масштаб» right after the viewer appeared and asserted PhotoSwipe's pswp--zoomed-in class; the opening animation resets an early tap (1/40 on main, 3/40 here). Zooming is the library's job, so the spec now checks only that the single-pointer control is there. playwright.config.ts blanks the two keys in webServer.env (Playwright merges it over process.env, and real env vars beat the .env file). The gallery config inherits it. Also fixes a comment there that still pointed at vite-pwa's devOptions. Verified: all 135 specs on mobile-chromium, desktop-chromium and mobile-webkit with a captcha key, a DSN and trace rate 1.0 set, no retries; the map spec 80/80 across two projects. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGCtDhZVRh8Udfx6UwtW3E * chore(frontend): flag the number-input check for svelte 5.57.2 Svelte 5.57.2 fixes a spread overwriting an unchanged `value`, which can wipe a half-typed number. The shared Input spreads its props next to bind:value, so the settings and ticket-generator number fields may be affected. 5.57.2 is still inside the 7-day pnpm cooldown until 2026-10-13, so this leaves a TODO to verify the fields once Renovate brings it in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGCtDhZVRh8Udfx6UwtW3E --------- Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #15694
Keeps track of error boundaries' reset functions that SvelteKit controls, resetting them on navigate.