Skip to content

Commit 6fad330

Browse files
authored
chore(deps): upgrade Solid and Router (#45808)
1 parent 87f21a3 commit 6fad330

6 files changed

Lines changed: 197 additions & 59 deletions

File tree

‎bun.lock‎

Lines changed: 13 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,11 @@
101101
"tailwindcss": "4.1.11",
102102
"vite": "7.3.6",
103103
"@solidjs/meta": "0.29.4",
104-
"@solidjs/router": "0.15.4",
104+
"@solidjs/router": "1.0.0",
105105
"@solidjs/start": "https://pkg.pr.new/@solidjs/start@dfb2020",
106106
"@sentry/solid": "10.71.0",
107107
"@sentry/vite-plugin": "5.4.0",
108-
"solid-js": "1.9.10",
108+
"solid-js": "1.9.15",
109109
"solid-sonner": "0.3.1",
110110
"vite-plugin-solid": "2.11.10",
111111
"@lydell/node-pty": "1.2.0-beta.12"
@@ -161,15 +161,16 @@
161161
"@effect/platform-node-shared": "catalog:",
162162
"@types/bun": "catalog:",
163163
"@types/node": "catalog:",
164-
"effect": "catalog:"
164+
"effect": "catalog:",
165+
"solid-js": "catalog:"
165166
},
166167
"patchedDependencies": {
167168
"@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch",
168169
"@dnd-kit/dom@0.5.0": "patches/@dnd-kit%2Fdom@0.5.0.patch",
169170
"@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch",
170171
"@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch",
171172
"@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
172-
"solid-js@1.9.10": "patches/solid-js@1.9.10.patch",
173+
"solid-js@1.9.15": "patches/solid-js@1.9.15.patch",
173174
"@ai-sdk/mistral@3.0.51": "patches/@ai-sdk%2Fmistral@3.0.51.patch",
174175
"gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch",
175176
"pacote@21.5.0": "patches/pacote@21.5.0.patch",
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { expect, test } from "bun:test"
2+
import { MemoryRouter, Route, createMemoryHistory, useNavigate, useParams } from "@solidjs/router"
3+
import { createEffect, onCleanup } from "solid-js"
4+
import { createComponent, render } from "solid-js/web"
5+
import { createSessionOwnership } from "@/session/session-ownership"
6+
7+
test("session ownership follows navigation, back, forward, replacement, and route disposal", async () => {
8+
const host = document.createElement("div")
9+
const history = createMemoryHistory()
10+
history.set({ value: "/session/A", replace: true, scroll: false })
11+
const captured: ReturnType<ReturnType<typeof createSessionOwnership>["capture"]>[] = []
12+
const navigate: ReturnType<typeof useNavigate>[] = []
13+
const cleaned: string[] = []
14+
const settle = () => new Promise((resolve) => setTimeout(resolve, 0))
15+
16+
const Session = () => {
17+
const params = useParams<{ id: string }>()
18+
const ownership = createSessionOwnership(() => params.id)
19+
const label = document.createElement("div")
20+
navigate.push(useNavigate())
21+
createEffect(() => {
22+
label.textContent = params.id
23+
captured.push(ownership.capture())
24+
})
25+
onCleanup(() => cleaned.push("session"))
26+
return label
27+
}
28+
29+
const dispose = render(
30+
() =>
31+
createComponent(MemoryRouter, {
32+
history,
33+
get children() {
34+
return [
35+
createComponent(Route, { path: "/", component: () => "Home" }),
36+
createComponent(Route, { path: "/session/:id", component: Session }),
37+
]
38+
},
39+
}),
40+
host,
41+
)
42+
43+
try {
44+
expect(host.textContent).toBe("A")
45+
expect(captured[0].current()).toBe(true)
46+
47+
navigate[0]("/session/B")
48+
await settle()
49+
expect(host.textContent).toBe("B")
50+
expect(captured[0].current()).toBe(false)
51+
expect(captured[1].current()).toBe(true)
52+
53+
history.back()
54+
await settle()
55+
expect(host.textContent).toBe("A")
56+
expect(captured[0].current()).toBe(false)
57+
expect(captured[1].current()).toBe(false)
58+
expect(captured[2].current()).toBe(true)
59+
60+
history.forward()
61+
await settle()
62+
expect(host.textContent).toBe("B")
63+
expect(captured[2].current()).toBe(false)
64+
expect(captured[3].current()).toBe(true)
65+
expect(navigate).toHaveLength(1)
66+
expect(cleaned).toEqual([])
67+
68+
navigate[0]("/", { replace: true })
69+
await settle()
70+
expect(host.textContent).toBe("Home")
71+
expect(captured.every((owner) => !owner.current())).toBe(true)
72+
expect(cleaned).toEqual(["session"])
73+
74+
history.back()
75+
await settle()
76+
expect(host.textContent).toBe("A")
77+
expect(captured[4].current()).toBe(true)
78+
expect(navigate).toHaveLength(2)
79+
} finally {
80+
dispose()
81+
}
82+
83+
expect(captured.every((owner) => !owner.current())).toBe(true)
84+
expect(cleaned).toEqual(["session", "session"])
85+
})
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import { expect, test } from "bun:test"
2+
import {
3+
createComputed,
4+
createMemo,
5+
createResource,
6+
createRoot,
7+
createSignal,
8+
onCleanup,
9+
startTransition,
10+
Suspense,
11+
type Accessor,
12+
type JSX,
13+
} from "solid-js"
14+
import { createComponent, render } from "solid-js/web"
15+
16+
// Solid 1.9.15 includes the former transition patch for solidjs/solid#2046.
17+
test("a memo created during a paused transition has a committed value", async () => {
18+
const host = document.createElement("div")
19+
const loaded = Promise.withResolvers<string>()
20+
const started = Promise.withResolvers<void>()
21+
const memos: Accessor<string>[] = []
22+
const [session, setSession] = createSignal(false)
23+
const dispose = render(
24+
() =>
25+
createComponent(Suspense, {
26+
fallback: "Loading",
27+
get children() {
28+
return createMemo(() => {
29+
if (!session()) return "Home"
30+
memos.push(createMemo(() => "Session"))
31+
const [data] = createResource(() => loaded.promise)
32+
started.resolve()
33+
return createMemo(() => data() ?? "")
34+
}) as unknown as JSX.Element
35+
},
36+
}),
37+
host,
38+
)
39+
40+
try {
41+
expect(host.textContent).toBe("Home")
42+
const pending = startTransition(() => setSession(true))
43+
await started.promise
44+
expect(host.textContent).toBe("Home")
45+
expect(memos).toHaveLength(1)
46+
expect(memos[0]()).toBe("Session")
47+
48+
loaded.resolve("Session loaded")
49+
await pending
50+
expect(host.textContent).toBe("Session loaded")
51+
expect(memos[0]()).toBe("Session")
52+
} finally {
53+
loaded.resolve("Session loaded")
54+
dispose()
55+
}
56+
})
57+
58+
// Exercise each patched bundle independently; importing both dev formats emits Solid's duplicate-runtime warning.
59+
test.each(["solid.js", "solid.cjs", "dev.js", "dev.cjs", "server.js", "server.cjs"])(
60+
"%s reentrant disposal cleans owned computations and callbacks exactly once",
61+
async (file) => {
62+
const runtime: {
63+
createRoot: typeof createRoot
64+
createComputed: typeof createComputed
65+
onCleanup: typeof onCleanup
66+
} = await import(`solid-js/dist/${file}`)
67+
const cleaned: string[] = []
68+
const dispose = runtime.createRoot((dispose) => {
69+
runtime.onCleanup(() => cleaned.push("root"))
70+
runtime.createComputed(() => {
71+
runtime.onCleanup(() => cleaned.push("first"))
72+
})
73+
runtime.createComputed(() => {
74+
runtime.onCleanup(() => cleaned.push("second"))
75+
runtime.onCleanup(() => {
76+
cleaned.push("reentrant")
77+
// Bound the regression so an unpatched runtime fails without overflowing the stack.
78+
if (cleaned.filter((item) => item === "reentrant").length === 1) dispose()
79+
})
80+
})
81+
return dispose
82+
})
83+
84+
expect(dispose).not.toThrow()
85+
expect(cleaned.toSorted()).toEqual(["first", "reentrant", "root", "second"])
86+
dispose()
87+
expect(cleaned).toHaveLength(4)
88+
},
89+
)

‎packages/desktop/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"@sentry/vite-plugin": "catalog:",
4141
"@solid-primitives/storage": "catalog:",
4242
"@solidjs/meta": "catalog:",
43-
"@solidjs/router": "0.15.4",
43+
"@solidjs/router": "catalog:",
4444
"@types/bun": "catalog:",
4545
"@types/node": "catalog:",
4646
"@typescript/native-preview": "catalog:",

0 commit comments

Comments
 (0)