Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
345 commits
Select commit Hold shift + click to select a range
410c952
chore(qwik): fold the reset changeset into the ErrorBoundary major ch…
maiieul Jun 26, 2026
c1f18ec
refactor(qwik): trim ErrorBoundary comments to the essential why
maiieul Jun 26, 2026
6a2dbf0
test(qwik): strip non-essential comments from ErrorBoundary tests
maiieul Jun 26, 2026
41bf2c1
Merge remote-tracking branch 'origin/build/v2' into claude/gracious-p…
maiieul Jun 26, 2026
31957d8
fix(qwik): make ErrorBoundary reset() work after a streamed fallback …
maiieul Jun 26, 2026
50c9666
fix(qwik): show the Suspense fallback when an ErrorBoundary wraps a s…
maiieul Jun 26, 2026
5fbf92a
fix(qwik): make ErrorBoundary reset() work when the boundary is insid…
maiieul Jun 26, 2026
47b05d5
test(qwik): add fixme regression for reset() through a Slot-projectin…
maiieul Jun 26, 2026
5b3e69c
fix(qwik): resolve ErrorBoundary reset() owner via the projection fra…
maiieul Jun 26, 2026
d380a7c
test(qwik): unmask Slot-wrapper reset() by stabilizing the e2e scenario
maiieul Jun 26, 2026
7068872
test(qwik): cover 2nd reset() of an ErrorBoundary inside Suspense (pr…
maiieul Jun 27, 2026
a81c14b
test(qwik): cover reset() of a client-first (SPA-nav) ErrorBoundary i…
maiieul Jun 27, 2026
b543491
test(qwik): ErrorBoundary vs async-signal .error channel
maiieul Jun 27, 2026
8d6bff9
fix(qwik): serialize ErrorBoundary reset() owner under a non-$ store …
maiieul Jun 27, 2026
3967363
Merge remote-tracking branch 'origin/build/v2' into claude/gracious-p…
maiieul Jun 27, 2026
4d33b3c
fix(qwik): redact the ErrorBoundary SSR error payload in production
maiieul Jun 27, 2026
149bc4d
feat(qwik): pass an info arg (phase + boundaryId) to ErrorBoundary on…
maiieul Jun 27, 2026
cf6598b
refactor(qwik): type ErrorBoundary fallback$ error as unknown and ret…
maiieul Jun 27, 2026
f757ca9
feat(qwik): ErrorBoundary last-resort fallback + unhandledrejection b…
maiieul Jun 27, 2026
806178e
docs(qwik): document ErrorBoundary reset() handler form and sync gene…
maiieul Jun 27, 2026
7b973d2
test(qwik): thread the handleError phase arg through task and event t…
maiieul Jun 27, 2026
172b632
fix(qwik): redact the error in the ErrorBoundary out-of-order streame…
maiieul Jun 27, 2026
c2cb8b3
test(qwik): align ErrorBoundary e2e with prod error redaction
maiieul Jun 27, 2026
a2eb40a
docs(qwik): note why client-origin ErrorBoundary errors are not redacted
maiieul Jun 27, 2026
97f0fbb
fix(qwik): redact client-caught ErrorBoundary errors in prod for pari…
maiieul Jun 27, 2026
b191038
test(qwik): e2e for onError$ event phase, nested client routing, last…
maiieul Jun 27, 2026
a1bf374
feat(core): add transformError render option to customize ErrorBounda…
maiieul Jun 28, 2026
9956bb3
chore(changeset): consolidate ErrorBoundary changesets into the major
maiieul Jun 28, 2026
681cc4c
test(qwik): reorganize error-boundary spec into behavior/mechanics su…
maiieul Jul 2, 2026
b5a990a
test(qwik): encode option-a in-order-default semantics in error-bound…
maiieul Jul 2, 2026
f52bb96
test(qwik): add new error-boundary coverage from the spec review
maiieul Jul 2, 2026
cdc56e9
fix(qwik): swap in-place errorboundary fallbacks via qErr regardless …
maiieul Jul 2, 2026
13ad7fc
docs(qwik): update error-boundary core-notes for the drain-time swap …
maiieul Jul 2, 2026
7f89ef5
fix(qwik): reveal the errorboundary fallback for a thrown undefined
maiieul Jul 2, 2026
8ae6ba1
fix(qwik): re-fire onError$ for each new error caught by a boundary
maiieul Jul 2, 2026
597ebb6
fix(qwik): preserve the task phase for ssr onerror info
maiieul Jul 2, 2026
6fc4ccc
docs(qwik): refresh error-boundary core-notes for per-error onerror a…
maiieul Jul 2, 2026
5aefc71
fix(qwik): emit backpatch entries in document order for the forward-o…
maiieul Jul 2, 2026
0c154ae
fix(qwik): resume nested boundaries when outer and inner both error o…
maiieul Jul 2, 2026
836e4aa
docs(qwik): refresh error-boundary core-notes for harness qErr and la…
maiieul Jul 2, 2026
3eea98f
test(qwik): pin in-place qErr swap beside a live suspense segment
maiieul Jul 2, 2026
6cacac7
chore: update changesets
maiieul Jul 2, 2026
fb0fe44
Merge remote-tracking branch 'origin/build/v2' into claude/gracious-p…
maiieul Jul 2, 2026
8bb2220
chore: cleanup error-boundary.spec.tsx
maiieul Jul 2, 2026
f04cc83
chore(qwik): trim error-boundary comments to essential-why
maiieul Jul 2, 2026
4402e8c
docs(qwik): regenerate api docs
maiieul Jul 2, 2026
f6a82cc
refactor(qwik): dry error-boundary helpers
maiieul Jul 2, 2026
beaac1c
docs(qwik): tighten error-boundary core-notes
maiieul Jul 2, 2026
228591c
docs(qwik): fix q:prewarm attribute name in core-notes
maiieul Jul 2, 2026
6aa4e3e
test(qwik): harden error-boundary e2e reset residue and browser-error…
maiieul Jul 2, 2026
5177015
test(qwik): e2e for qErr swap beside a live suspense segment
maiieul Jul 2, 2026
de31e13
test(qwik): e2e for useVisibleTask$ throw routed to the boundary
maiieul Jul 2, 2026
2741cd7
test(qwik): e2e pins import-error qerror leaves the boundary inert
maiieul Jul 2, 2026
a9fc792
test(qwik): e2e for mid-stream click replay on a swapped fallback (in…
maiieul Jul 2, 2026
0f07d27
test(qwik): e2e for qErr container-scoping isolation
maiieul Jul 2, 2026
c964912
test(qwik): prod-mode error-boundary app and e2e suite (qDev=false axis)
maiieul Jul 2, 2026
bb307a5
chore(e2e): drop unused eslint-disable in error-boundary fixture
maiieul Jul 2, 2026
a7be1cf
fix(qwik): chunk load failures in event handlers no longer trip error…
maiieul Jul 3, 2026
11c4454
revert(qwik): defer chunk-load failure handling to the version-skew d…
maiieul Jul 3, 2026
4ff62db
fix(qwik): route qerror to the nearest owning container, not any ance…
maiieul Jul 3, 2026
68268d0
refactor(qwik): gate errorboundary SSR wrapper and drop dead fallback…
maiieul Jul 3, 2026
ab24856
test(qwik): make errorboundary streaming e2e webkit-agnostic
maiieul Jul 6, 2026
4ca5fdb
chore(qwik): trim errorboundary comments to the essential why
maiieul Jul 6, 2026
0af3bea
chore(qwik): cut errorboundary comments to hypercritical only
maiieul Jul 6, 2026
f7a4597
chore(qwik): drop errorboundary test section banners and redundant se…
maiieul Jul 7, 2026
1e1bc28
test(qwik): pin suspense deferral through a stateful wrapper componen…
maiieul Jul 7, 2026
e5d0b6f
chore: api.update
maiieul Jul 7, 2026
ab173f3
Merge remote-tracking branch 'origin/build/v2' into claude/gracious-p…
maiieul Jul 8, 2026
4dea9d5
feat(qwik): type ErrorBoundary callbacks as Error with cause-preservi…
maiieul Jul 8, 2026
f2f4c5f
docs(api): regenerate API reports for ErrorBoundary Error typing
maiieul Jul 8, 2026
14a274a
chore(ruler): update ErrorBoundary invariants for the Error coercion …
maiieul Jul 8, 2026
54aac5f
test(qwik): use indexed loop to satisfy loop-style lint rule
maiieul Jul 8, 2026
d65b112
fix(qwik): route function-child throws to the nearest error boundary
maiieul Jul 8, 2026
e3698dc
chore(ruler): note the SSR function-child sentinel routing invariants
maiieul Jul 8, 2026
3a6fe3d
test(qwik): pin dev ErrorBoundary cause survives SSR resume
maiieul Jul 8, 2026
0a698ef
Merge remote-tracking branch 'origin/build/v2' into claude/gracious-p…
maiieul Jul 8, 2026
577894d
refactor(qwik): drop error cause cast unlocked by es2022 lib
maiieul Jul 8, 2026
7e9fc97
Merge origin/build/v2 into claude/gracious-poitras-0f1723
maiieul Jul 13, 2026
6359a80
fix(core): ship ErrorBoundaryInfo from the package root, tag the Erro…
maiieul Jul 13, 2026
23152a7
chore: add devtools changeset for the removed hook, trim the ErrorBou…
maiieul Jul 13, 2026
d816203
fix(core): fail-closed error normalization for hostile values, serial…
maiieul Jul 13, 2026
0572c0a
fix(core): gate client ErrorBoundary listeners and error routing behi…
maiieul Jul 13, 2026
930dfb0
fix(core): discard queued ErrorBoundary content frames after an SSR c…
maiieul Jul 13, 2026
58094a9
docs(ruler): record discard-scope, fail-closed normalization, and fla…
maiieul Jul 13, 2026
f701e9b
chore: satisfy loop-style lint and drop unused eslint directives in h…
maiieul Jul 14, 2026
bca3be1
chore: mark the devtools hook-removal changeset as patch
maiieul Jul 14, 2026
bb0d126
chore: drop per-fix changesets folded into the ErrorBoundary feature …
maiieul Jul 14, 2026
c75c1b9
test(core): drop the flag-off vitest project; verify the gate by insp…
maiieul Jul 14, 2026
0d7701f
docs(ruler): drop the ErrorBoundary false-pass traps notes
maiieul Jul 14, 2026
91267aa
Merge remote-tracking branch 'origin/build/v2' into claude/gracious-p…
maiieul Jul 14, 2026
48887b1
refactor(core): collapse hostile-value guards behind a safeRead helper
maiieul Jul 14, 2026
c9c080a
refactor(core): reuse the hashCode util for the boundary error digest
maiieul Jul 14, 2026
9e9288d
test(core): reuse the Thrower and fb fixtures in the transformError r…
maiieul Jul 14, 2026
5768ece
test(core): fold streamAndResume into the shared out-of-order script …
maiieul Jul 14, 2026
ce7531c
refactor(core): emit the error-swap executor through emitInlineScript
maiieul Jul 14, 2026
4563ae2
test(e2e): share the ooos release-store helpers with the error-bounda…
maiieul Jul 14, 2026
17acdb9
Merge origin/build/v2 into claude/gracious-poitras-0f1723
maiieul Jul 18, 2026
0a4413a
Merge remote-tracking branch 'origin/main' into claude/gracious-poitr…
maiieul Jul 18, 2026
27d4adb
feat(core): PublicError class for user-facing boundary errors
maiieul Jul 18, 2026
f1c5836
feat(core): PublicError keeps its class identity across SSR serializa…
maiieul Jul 18, 2026
f23f0bc
feat(core): PublicError passes the ErrorBoundary redaction membrane u…
maiieul Jul 18, 2026
53737c4
test(core): PublicError SSR, resume, CSR, and escalation integration …
maiieul Jul 18, 2026
8e86333
test(e2e): PublicError prod scenario — unredacted fallback, generic s…
maiieul Jul 18, 2026
4c84d7a
chore(core): ship PublicError from the package root, regenerate API docs
maiieul Jul 18, 2026
2f344b9
docs(ruler): record the PublicError membrane and marker invariants
maiieul Jul 18, 2026
de49a95
fix(core): reserve the PublicError marker key, document the consent c…
maiieul Jul 18, 2026
97a918f
test(core): pin the stateless ErrorBoundary contract
maiieul Jul 26, 2026
c025d6e
test(core): hostile store pins assert the display contract, not the s…
maiieul Jul 26, 2026
2fffbcb
test(core): execute error-swap scripts in the unit SSR harness
maiieul Jul 26, 2026
4080e6d
refactor(core): emit static ErrorBoundary host styles at SSR time
maiieul Jul 26, 2026
7397f5f
fix(core): allow resetting a resumed ErrorBoundary without in-memory …
maiieul Jul 26, 2026
dfc42f8
test(core): drive client re-derivation through the owner re-render
maiieul Jul 26, 2026
a7b3ef5
feat(core): stop serializing the ErrorBoundary error
maiieul Jul 26, 2026
fd272d3
refactor(core): fold the boundary membrane into display-time redaction
maiieul Jul 26, 2026
8ed2494
fix(core): require the framework brand for the display membrane pass-…
maiieul Jul 26, 2026
7554d71
docs(core): document stateless ErrorBoundary semantics
maiieul Jul 26, 2026
db955b9
chore: update ruler EB invariants for the stateless model
maiieul Jul 26, 2026
503568f
test(core): pin nested inner ErrorBoundary reset re-executing its chi…
maiieul Jul 27, 2026
8c67227
fix(core): skip ErrorBoundary parents when resolving the reset owner
maiieul Jul 27, 2026
c226767
fix(core): reset stops at an errored boundary parent that authors its…
maiieul Jul 27, 2026
1ef94b1
chore: note the reset owner-walk stop rule and the QRL-stability test…
maiieul Jul 27, 2026
853416b
test(core): pin resetting a boundary nested in a resumed SSR fallback
maiieul Jul 27, 2026
524ddfc
test(core): gate the resumed-fallback flake on the platform, not a ca…
maiieul Jul 27, 2026
1291b22
chore: correct the resumed-reset note; record the three reset-test traps
maiieul Jul 27, 2026
a0320c6
feat(core): transformError returning undefined falls through to the d…
maiieul Jul 27, 2026
fc3e61f
feat(core): type the redaction digest on the fallback error
maiieul Jul 27, 2026
225b491
docs(core): regenerate api for the transformError decline and typed d…
maiieul Jul 27, 2026
31a50ad
chore: slim the ErrorBoundary core-notes to durable invariants
maiieul Jul 27, 2026
b377430
chore: drop the unit-harness trap notes from core-notes
maiieul Jul 27, 2026
a873d58
test(e2e): scaffold the error-handling router app and re-point the pr…
maiieul Jul 27, 2026
0439001
test(e2e): port error-handling scenarios to per-route files
maiieul Jul 27, 2026
8189697
test(e2e): consolidate the error-handling suite into one file
maiieul Jul 27, 2026
494dc5b
fix(core): resolve the reset owner in deep projection topologies
maiieul Jul 27, 2026
053474e
test(core): pin the OOOS author-only-Suspense re-render loss (#8876)
maiieul Jul 27, 2026
4ff6962
test(e2e): park the async deferred-throw pin pending the vnode-data i…
maiieul Jul 27, 2026
ef2168e
test(e2e): run the OOOS-blocked scenarios in-order pending #8876/#8877
maiieul Jul 27, 2026
15de952
fix(qwikloader): report a failed chunk import once for streamed conta…
maiieul Jul 27, 2026
04a2a11
test(e2e): count only the click's import failure in the router app
maiieul Jul 27, 2026
03003b9
test(e2e): serve the multi-container fragment from a dedicated plain app
maiieul Jul 27, 2026
2a0d660
test(e2e): park the loader-reset pins pending the revalidation ruling
maiieul Jul 27, 2026
4df28c9
test(e2e): retire the scenario-switch error-boundary fixture and suites
maiieul Jul 27, 2026
f22fcfe
test(e2e): make the multi-container fallback assertion mode-agnostic
maiieul Jul 27, 2026
c01b1b0
test(e2e): share the error-handling fixture primitives across routes
maiieul Jul 27, 2026
3569ef4
test(e2e): strip non-critical comments from the error-handling suite
maiieul Jul 27, 2026
cdae87c
test(core): strip non-critical comments from the error-handling test …
maiieul Jul 27, 2026
5dd49b2
chore(core): strip non-critical comments from the error-handling source
maiieul Jul 27, 2026
9735e48
docs(core): drop the stale serialization consent from the PublicError…
maiieul Jul 28, 2026
e433e49
docs(core): trim and correct the error-handling API docs
maiieul Jul 28, 2026
185ded6
test(core): trim the remaining error-handling test comments
maiieul Jul 28, 2026
1f2a2e3
refactor(core): drop the redundant PublicError classification guard
maiieul Jul 28, 2026
50c5af2
refactor(core): drop the superseded reset-owner plumbing and dead guards
maiieul Jul 28, 2026
99cfc82
refactor(core): drop the Error-field canSerialize gate left by the ol…
maiieul Jul 28, 2026
132108b
test(e2e): pin prod digest forgery and unserializable PublicError dis…
maiieul Jul 28, 2026
ab92454
test(e2e): drop the error-handling routes no test drives
maiieul Jul 28, 2026
4e8f520
chore(core): document the INERT flag and record the loader-reset ruling
maiieul Jul 28, 2026
512791e
test(e2e): state the loader-reset pins as fact, not roadmap
maiieul Jul 28, 2026
2ae84a1
test(core): keep the empty catch lint-clean
maiieul Jul 28, 2026
3d09fd8
fix(core): stop a thrown null from silencing later boundary errors
maiieul Jul 28, 2026
b55c37a
test(core): drop the can-serialize unit file left by the removed gate
maiieul Jul 28, 2026
fca1810
feat(core): report the error digest to onError$
maiieul Jul 28, 2026
2469ec2
perf(core): keep the consumed boundary callbacks off the wire
maiieul Jul 28, 2026
71e79cb
docs(core): correct the reset-owner note and drop the phantom server …
maiieul Jul 28, 2026
e858d11
chore(core): regenerate api for the onError$ digest
maiieul Jul 28, 2026
af9bf5b
fix(core): report a deferred-segment error to onError$ only once
maiieul Jul 28, 2026
30ed254
test(core): pin the wrapper-topology reset gap as expected failures
maiieul Jul 28, 2026
64710db
fix(core): re-render projected children when a forwarded boundary resets
maiieul Jul 28, 2026
5bd7d76
fix(core): stop broadcast handlers firing in an errored boundary's hi…
maiieul Jul 28, 2026
75c9935
fix(core): ignore a scheduled task whose host an ErrorBoundary tore down
maiieul Jul 28, 2026
8a41829
fix(core): drop element effects in an errored subtree so bindings sto…
maiieul Jul 28, 2026
9f9f639
revert(core): drop the CSR-only forwarded-boundary reset fix
maiieul Jul 28, 2026
7c9b87f
refactor(core): rename resetOwner to resumableParent
maiieul Jul 28, 2026
6ae203a
docs(core): say what boundaryId actually guarantees
maiieul Jul 28, 2026
52e25bc
fix(core): reject an async transformError instead of redacting everyt…
maiieul Jul 28, 2026
111f768
docs: add the ErrorBoundary experimental page
maiieul Jul 28, 2026
bcafb90
chore(core): regenerate api for the transformError signature
maiieul Jul 28, 2026
4540650
refactor(core): retain the boundary's parent explicitly instead of vi…
maiieul Jul 29, 2026
4d1cfb8
fix(core): recover reset for a boundary packaged in a wrapper component
maiieul Jul 29, 2026
a2b50d5
perf(core): retain the reset chain only when a boundary errors
maiieul Jul 29, 2026
a17ac3e
chore(core): trim the new error-boundary comments
maiieul Jul 29, 2026
88245d5
test: make each error-boundary test title state its own claim
maiieul Jul 29, 2026
e95c186
test(core): put each error-boundary test in the block its name promises
maiieul Jul 29, 2026
8594215
test(core): co-locate the error-handling unit tests with their module
maiieul Jul 29, 2026
5d0b08b
test: share the streaming-mode table and the e2e error collectors
maiieul Jul 29, 2026
d7701ef
test(core): name out-of-order streaming as the default it is
maiieul Jul 30, 2026
064347f
test(core): group the SSR emission blocks by delivery route
maiieul Jul 30, 2026
24a74fe
Merge origin/main into claude/public-error
maiieul Jul 30, 2026
727df72
fix(core): defuse the errored content when the fallback is delivered …
maiieul Jul 30, 2026
37f4e25
test: record the real blocker for out-of-order resets through a segment
maiieul Jul 30, 2026
0c16e2b
test(core): group the single-mode reset scenarios by topology
maiieul Jul 30, 2026
e0c7e71
test(e2e): split the streaming-swap catch-all into four topic groups
maiieul Jul 30, 2026
a30ede8
test(core): pin the boundary walk that keeps Suspense visible through…
maiieul Jul 30, 2026
f5341d1
test(core): run the behavior matrix inside a deferred segment
maiieul Jul 30, 2026
4f531df
test(core): pin which boundary catches a named-slot throw
maiieul Jul 30, 2026
bf388fe
test(core): make the escalation fixture a real component$
maiieul Jul 30, 2026
85c4965
test(core): inline the boxed() wrapper at its call sites
maiieul Jul 30, 2026
1c4230e
test(core): pin the wrapped cause for every falsy throw
maiieul Jul 30, 2026
3ad98fa
test(core): name the coercion pin after the contract it protects
maiieul Jul 30, 2026
53f0cb6
test(core): give reset one parent describe
maiieul Jul 30, 2026
d6b9d88
test(core): name the reset tests after where the error happened
maiieul Jul 31, 2026
9b1ff6b
test(core): drive the async-generator tests through <SSRStream>
maiieul Jul 31, 2026
9f904fd
test(core): give the post-resume tests one home
maiieul Jul 31, 2026
138c380
test(core): drop 'serialized' from a transformError title, nothing se…
maiieul Jul 31, 2026
254e99e
test(core): reorganise the spec by feature
maiieul Jul 31, 2026
81cd90d
test(core): dissolve the after-resume block into its features
maiieul Jul 31, 2026
f7ecac2
test(core): group integration tests by the primitive they exercise
maiieul Jul 31, 2026
69da124
test(core): hostile-throw render tests belong to fallback$, not a mem…
maiieul Jul 31, 2026
cdcd6ee
test(core): order render modes CSR-SSR-OOOS and group scenario pairs
maiieul Jul 31, 2026
4beaedf
test(core): adopt the repo's SSR-first mode order in the EB spec
maiieul Jul 31, 2026
c073775
test: align the PR's added tests with their host suites' structure
maiieul Jul 31, 2026
84932e8
test(core): group the display-membrane unit tests by policy facet
maiieul Jul 31, 2026
a18d5c9
refactor(core): extract the shared segment-swap finalize into an ssr …
maiieul Jul 31, 2026
10e0c5f
refactor(core): move the EB SSR fallback components into error-bounda…
maiieul Jul 31, 2026
eb3abc1
docs(ruler): record the new EB fallback-host and segment-swap homes
maiieul Jul 31, 2026
6f14b07
test(core): name the ErrorProvider capture spec after its subject
maiieul Jul 31, 2026
54a4edb
chore(core): pin the INERT pairing and the base error-swap contract
maiieul Jul 31, 2026
d2fa216
refactor(core): move ErrorBoundaryInfo into the error-handling leaf
maiieul Jul 31, 2026
2a0bb4d
fix(core): remove the unhandledrejection bridge when the last contain…
maiieul Jul 31, 2026
92ee226
refactor(core): gate the ErrorProvider capture sentinel on qTest
maiieul Jul 31, 2026
c544e51
test(e2e): deflake the mid-stream and chunk-404 error-handling tests
maiieul Jul 31, 2026
9c84c7b
test(e2e): poll loader readiness driver-side on held streams
maiieul Jul 31, 2026
a07ed1a
test(e2e): settle the chunk-404 qerror assert and park the webkit mid…
maiieul Jul 31, 2026
c19a044
chore: move error-handling-helpers.ts into e2e.ts
maiieul Aug 1, 2026
82cda4f
test(e2e): restructure the error-handling suite to mirror the unit sp…
maiieul Aug 1, 2026
343d11e
test(e2e): share the release-gate fixture across the error-handling r…
maiieul Aug 1, 2026
df561ce
test(e2e): extract the release-gate waiter into one module shared by …
maiieul Aug 1, 2026
eea7a8b
test(e2e): move release-gate into a utils folder
maiieul Aug 1, 2026
6bfa2e2
refactor(core): drop inline copies of isPromise and the segment reten…
maiieul Aug 1, 2026
c481fee
test(core): dedupe the spec's reset driver, swap markers, and thrower…
maiieul Aug 1, 2026
584a17d
test(e2e): dedupe shared suite helpers, the re-error fixture, and the…
maiieul Aug 1, 2026
0d33b38
refactor(core): resolve context values through the single context-own…
maiieul Aug 1, 2026
33985cb
refactor(core): simplify ErrorBoundary internals
Varixo Aug 2, 2026
0a594ca
refactor(core): localize projected ErrorBoundary reset recovery
Varixo Aug 2, 2026
c9c0d6c
fix: e2e tests after dev build
Varixo Aug 2, 2026
700aa47
fix: registers one qerror listener on the document
Varixo Aug 3, 2026
eaa318e
fix: centralize server render error handling in the container
Varixo Aug 3, 2026
039197f
refactor: nicer ssr render jsx code, add error boundary phase enum and
Varixo Aug 4, 2026
6c7f021
refactor: preserve ErrorBoundary metadata across SSR
Varixo Aug 4, 2026
2102375
refactor(core): serialize PublicError with its own type
Varixo Aug 4, 2026
d336289
refactor: remove unhandledrejection bridge
Varixo Aug 4, 2026
679aea9
Merge remote-tracking branch 'origin/main' into claude/gracious-poitr…
maiieul Aug 4, 2026
e21c031
refactor(core): drop PublicError from the error model
maiieul Aug 4, 2026
e88bacb
feat(core): render client-origin boundary errors unredacted
maiieul Aug 4, 2026
2fb7a08
feat(core): send no-store when a boundary catches before the first flush
maiieul Aug 4, 2026
a2f2bab
fix(router): skip the ssr etag cache for errored renders
maiieul Aug 4, 2026
8e1c728
chore: sweep the PublicError removal leftovers
maiieul Aug 4, 2026
9ccb82a
fix(core): redact an errored async signal's error at serialization time
maiieul Aug 5, 2026
c81ccd9
Merge branch 'main' into claude/gracious-poitras-0f1723
maiieul Aug 14, 2026
fc446f7
Merge remote-tracking branch 'origin/main' into claude/gracious-poitr…
maiieul Aug 25, 2026
d01efcb
test: adapt the error-handling fixtures to the vite 8 merge
maiieul Aug 25, 2026
b37e40e
feat(router): warn when a boundary catch disables configured caching
maiieul Aug 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/devtools-drop-use-error-boundary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/devtools': patch
---

fix: drop the removed `useErrorBoundary` hook from the devtools hook lists
6 changes: 6 additions & 0 deletions .changeset/errorboundary-to-core.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@qwik.dev/core': major
'@qwik.dev/router': major
---

feat: `<ErrorBoundary>` moves to `@qwik.dev/core` behind the experimental `errorBoundary` flag and `useErrorBoundary()` is removed. `fallback$` receives `(error, reset)`, `onError$` reports caught errors, and production redacts server-origin errors to a generic message + digest while client-origin errors render as thrown.
6 changes: 6 additions & 0 deletions .changeset/errored-pages-no-store.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@qwik.dev/core': minor
'@qwik.dev/router': patch
---

feat: `renderToStream` reports a pre-flush `<ErrorBoundary>` catch via `onBeforeFirstFlush`; the router sends `Cache-Control: no-store` for those pages and for error documents.
5 changes: 5 additions & 0 deletions .changeset/redact-serialized-signal-errors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: redact server-origin errors when serializing errored async signals in production
5 changes: 5 additions & 0 deletions .changeset/suspense-deferral-through-component.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: show the `Suspense` fallback when a suspending child is wrapped in an `ErrorBoundary`.
5 changes: 5 additions & 0 deletions .changeset/tidy-moles-smoke.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: a failed handler chunk import is no longer reported twice for streamed containers
13 changes: 12 additions & 1 deletion .ruler/skills/qwik-core-development/references/core-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ When a core value gains serialized state:
1. Update the serializer and inflater together.
2. Keep array positions or marker encodings documented in the code that owns them.
3. Add a round-trip test in `shared/serdes` or the closest subsystem.
4. Check SSR and client resume behavior when the value affects hydration or streamed state.
4. Check SSR and client resume behavior when the value affects resumed or streamed state.

For AsyncSignal fields, inspect the serdes tests that deserialize async signals and verify
concurrency, timeout, stale value, and error/loading state behavior.
Expand Down Expand Up @@ -174,6 +174,17 @@ streaming, navigation, or integration with fixture apps. For Qwik e2e, load

Never use `pnpm test.unit` for agent verification in this repo.

## ErrorBoundary (experimental `errorBoundary`)

Keep error state non-enumerable and out of serialized state. Store the raw throw and project it only
at display sites; redaction is origin-based — the server display redacts in production unless the
app returns an `Error` from `transformError`; the client display always shows the error as thrown.

Reset must re-render the component that authored projected children. Identify and retain that
component as soon as SSR error teardown determines it; store its VNode reference only when the
projection cut prevents the client owner walk. Re-key the highest wrapper below that author so
normal diffing recreates emptied projected content without projection-wide scheduling.

## Keep This Reference Fresh

Before finishing a core task, ask:
Expand Down
5 changes: 5 additions & 0 deletions .ruler/skills/qwik-e2e-verification/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ Use this skill for Playwright e2e work in `e2e/**`. Keep the repo-wide rules fro
- CLI e2e: `e2e/qwik-cli-e2e/tests/`
- React integration e2e: `e2e/qwik-react-e2e/tests/`

Apps whose directory names contain `.prod` run in production mode under the shared Qwik dev server.
Keep exact production-only assertions in those fixtures; regular fixtures must pass after either
`build.core.dev` or `build.core`.

## Commands

Main Qwik e2e config uses `--browser`, not Playwright projects:
Expand Down Expand Up @@ -58,6 +62,7 @@ pnpm playwright test e2e/qwik-react-e2e/tests/reactify.spec.ts --project=chromiu

Traps:

- The core budget is skipped after `build.core.dev`; run `pnpm build.core` to measure it.
- `test.e2e.router.ssg.update` regenerates the goldens only; it never touches the budgets, so a
budget breach survives the update.
- The update run can exit non-zero because a sibling budget assertion failed, not the golden. "N
Expand Down
4 changes: 2 additions & 2 deletions e2e/qwik-e2e/apps/e2e/src/components/events/events.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ const EventsParent = component$(() => {
<a
href="/"
preventdefault:click
stoppropagation:click
id="prevent-default-2"
onClick$={(ev) => {
ev.stopPropagation();
onClick$={() => {
store.countAnchor++;
}}
>
Expand Down
38 changes: 3 additions & 35 deletions e2e/qwik-e2e/apps/e2e/src/components/suspense/ooos.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,8 @@ import {
type Signal,
} from '@qwik.dev/core';
import { SSRRaw, SSRStream, type SSRStreamWriter } from '@qwik.dev/core/internal';

type OutOfOrderReleaseStore = {
resolved: Set<string>;
resolvers: Map<string, Set<() => void>>;
};

const getOutOfOrderReleaseStore = (): OutOfOrderReleaseStore =>
((globalThis as any).__qwikOOOSReleaseStore ||= {
resolved: new Set<string>(),
resolvers: new Map<string, Set<() => void>>(),
});

const getOutOfOrderReleaseKey = (requestId: string, releaseId: string): string => {
return `${requestId}:${releaseId}`;
};
import { waitForRelease } from '../../../../../utils/release-gate';
import { WEBKIT_STREAMING_FLUSH } from '../../../../../utils/webkit-flush';

const getSearchParam = (url: string | undefined, name: string): string | null => {
return url ? new URL(url).searchParams.get(name) : null;
Expand All @@ -33,33 +20,14 @@ const waitForOutOfOrderRelease = (
requestId: string,
releaseId: string,
value: JSXOutput
): Promise<JSXOutput> => {
return new Promise<JSXOutput>((resolve) => {
const release = () => resolve(value);
const store = getOutOfOrderReleaseStore();
const key = getOutOfOrderReleaseKey(requestId, releaseId);
if (store.resolved.has(key)) {
release();
} else {
let resolvers = store.resolvers.get(key);
if (!resolvers) {
store.resolvers.set(key, (resolvers = new Set()));
}
resolvers.add(release);
}
});
};
): Promise<JSXOutput> => waitForRelease(requestId, releaseId).then(() => value);

const escapeHtml = (value: string): string =>
value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');

const escapeAttr = (value: string): string =>
escapeHtml(value).replace(/"/g, '&quot;').replace(/'/g, '&#39;');

// WebKit buffers streamed HTML until enough early body content is emitted.
// https://bugs.webkit.org/show_bug.cgi?id=265386
const WEBKIT_STREAMING_FLUSH = '\u200b'.repeat(512);

export const OutOfOrderSuspenseRoot = component$(() => {
const shellCount = useSignal(0);
const render = useSignal(0);
Expand Down
1 change: 0 additions & 1 deletion e2e/qwik-e2e/apps/e2e/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
"outDir": "tmp",
"noEmit": true,
"types": ["node", "vite/client"],
"rootDir": ".",
"paths": {
"~/*": ["./src/*"]
}
Expand Down
6 changes: 6 additions & 0 deletions e2e/qwik-e2e/apps/error-handling-fragment/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"name": "error-handling-fragment",
"description": "Serves the embedded container fragment inlined by the error-handling multi-container route.",
"private": true,
"type": "module"
}
11 changes: 11 additions & 0 deletions e2e/qwik-e2e/apps/error-handling-fragment/src/entry.ssr.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { renderToStream, type RenderToStreamOptions } from '@qwik.dev/core/server';
import Root from './root';

export default function (opts: RenderToStreamOptions) {
return renderToStream(<Root />, {
containerTagName: 'container',
qwikLoader: { include: 'never' },
...opts,
streaming: { ...opts.streaming, outOfOrder: false },
});
}
37 changes: 37 additions & 0 deletions e2e/qwik-e2e/apps/error-handling-fragment/src/root.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { $, component$, ErrorBoundary, isServer, sync$, type JSXOutput } from '@qwik.dev/core';

// onClick$ here would load a second core copy and re-trip Q30.
const bumpCount = sync$((_: Event, el: Element) => {
const count = el.parentElement!.querySelector('#eb-fallback-count')!;
count.textContent = String(Number(count.textContent) + 1);
});

const FragmentFallback = component$((props: { msg: string }) => (
<section id="eb-fallback">
<p id="eb-fallback-msg">caught: {props.msg}</p>
<button id="eb-fallback-button" onClick$={bumpCount}>
Touch fallback
</button>
<span id="eb-fallback-count">0</span>
</section>
));

const fragmentFallback = $((e: unknown) => (
<FragmentFallback msg={String((e as { message?: unknown })?.message ?? e)} />
));

const FragmentThrower = component$((): JSXOutput => {
if (isServer) {
throw new Error('fragment boom');
}
return <span id="eb-fragment-client" />;
});

export default component$(() => (
<ErrorBoundary fallback$={fragmentFallback}>
<section id="eb-content">
<p>fragment content</p>
</section>
<FragmentThrower />
</ErrorBoundary>
));
23 changes: 23 additions & 0 deletions e2e/qwik-e2e/apps/error-handling-fragment/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"compilerOptions": {
"allowJs": true,
"target": "ES2020",
"module": "ES2022",
"lib": ["es2022", "DOM", "WebWorker", "DOM.Iterable"],
"jsx": "react-jsx",
"jsxImportSource": "@qwik.dev/core",
"strict": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"moduleResolution": "Bundler",
"esModuleInterop": true,
"allowImportingTsExtensions": true,
"skipLibCheck": true,
"incremental": true,
"isolatedModules": true,
"outDir": "tmp",
"noEmit": true,
"types": ["node", "vite/client"],
"rootDir": "."
}
}
9 changes: 9 additions & 0 deletions e2e/qwik-e2e/apps/error-handling.prod/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "error-handling.prod",
"description": "Prod-mode (qDev=false) twin of the error-handling router app; re-exports its routes.",
"private": true,
"type": "module",
"__qwik__": {
"qwikRouter": true
}
}
15 changes: 15 additions & 0 deletions e2e/qwik-e2e/apps/error-handling.prod/src/entry.ssr.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { renderToStream, type RenderToStreamOptions } from '@qwik.dev/core/server';
import Root from '../../error-handling/src/root';

export default function (opts: RenderToStreamOptions) {
const url = opts.serverData?.url ? new URL(opts.serverData.url) : undefined;
const outOfOrder = url?.searchParams.get('outOfOrder') !== 'false';
return renderToStream(<Root />, {
base: '/error-handling.prod/build/',
...opts,
streaming: {
...opts.streaming,
outOfOrder,
},
});
}
1 change: 1 addition & 0 deletions e2e/qwik-e2e/apps/error-handling.prod/src/root.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '../../error-handling/src/root';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '../../../../error-handling/src/routes/async-error-captured/index';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '../../../../error-handling/src/routes/basic/index';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '../../../../error-handling/src/routes/csr-event/index';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '../../../../error-handling/src/routes/digest-forgery/index';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '../../../error-handling/src/routes/layout';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '../../../../error-handling/src/routes/rederive/index';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '../../../../error-handling/src/routes/reset/index';
21 changes: 21 additions & 0 deletions e2e/qwik-e2e/apps/error-handling.prod/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"compilerOptions": {
"allowJs": true,
"target": "ES2020",
"module": "ES2022",
"lib": ["es2023", "DOM", "WebWorker", "DOM.Iterable"],
"jsx": "react-jsx",
"jsxImportSource": "@qwik.dev/core",
"strict": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"moduleResolution": "Bundler",
"esModuleInterop": true,
"skipLibCheck": true,
"incremental": true,
"isolatedModules": true,
"outDir": "tmp",
"noEmit": true
},
"include": ["src", "./*.d.ts", "./*.config.ts"]
}
9 changes: 9 additions & 0 deletions e2e/qwik-e2e/apps/error-handling/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "error-handling",
"description": "Error-handling e2e app: one route per ErrorBoundary/loader scenario.",
"private": true,
"type": "module",
"__qwik__": {
"qwikRouter": true
}
}
Loading
Loading