Skip to content

Commit 7b61904

Browse files
Pin transition commit-on-handled-error behavior from the #3107 router thread
A source write entangled with downstream async that rejects must still commit — the error boundary handling the rejection is the transition resolving, not it failing. This pin came out of the router navigation investigation and was never landed; tests only, no changeset. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent ce83af6 commit 7b61904

1 file changed

Lines changed: 61 additions & 0 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import {
2+
createEffect,
3+
createErrorBoundary,
4+
createMemo,
5+
createRenderEffect,
6+
createRoot,
7+
createSignal,
8+
flush
9+
} from "../src/index.js";
10+
11+
afterEach(() => flush());
12+
13+
it("commits a source write and its effect when a downstream async error is handled", async () => {
14+
const error = new Error("lazy route failed");
15+
let reject!: (error: unknown) => void;
16+
const [route, setRoute] = createSignal("/", { ownedWrite: true });
17+
let rendered = "";
18+
let external = "/";
19+
20+
createRoot(() => {
21+
const lazyRoute = createMemo(() => {
22+
if (route() === "/") return "home";
23+
return new Promise<string>((_, fail) => (reject = fail));
24+
});
25+
const boundary = createErrorBoundary(
26+
() => lazyRoute(),
27+
caught => {
28+
expect(caught()).toBe(error);
29+
return "error";
30+
}
31+
);
32+
createRenderEffect(boundary, value => {
33+
rendered = value;
34+
});
35+
createEffect(
36+
route,
37+
value => {
38+
external = value;
39+
},
40+
{ defer: true }
41+
);
42+
});
43+
44+
flush();
45+
expect(rendered).toBe("home");
46+
47+
setRoute("/plugins");
48+
flush();
49+
expect(route()).toBe("/");
50+
expect(rendered).toBe("home");
51+
expect(external).toBe("/");
52+
53+
reject(error);
54+
await Promise.resolve();
55+
await Promise.resolve();
56+
flush();
57+
58+
expect(rendered).toBe("error");
59+
expect(route()).toBe("/plugins");
60+
expect(external).toBe("/plugins");
61+
});

0 commit comments

Comments
 (0)