Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
a30aa89
chore: upgrade Solid v2 packages to 2.0.0-beta.16
brenelz Jul 8, 2026
cde449e
chore: upgrade Solid v2 packages to 2.0.0-beta.17
brenelz Jul 10, 2026
76f6d00
fix(solid-router): suspend on the match loadPromise only during SSR
brenelz Jul 10, 2026
95f0a59
fix(lockfile): restore all @rspack/binding@2.0.8 platform binaries
brenelz Jul 14, 2026
9d02a63
chore: add changesets for solid-js beta.17 upgrade and SSR-only match…
brenelz Jul 14, 2026
68cc84b
fix(examples): replace broken nitro-nightly pin with nitro beta in st…
brenelz Jul 14, 2026
f657680
chore: upgrade vite-plugin-solid to next.7
brenelz Jul 14, 2026
82d0f66
fix(solid-router): retain manifest stylesheets across navigation
brenelz Jul 14, 2026
f7805a8
chore: upgrade Solid v2 packages to 2.0.0-beta.18 and vite-plugin-sol…
brenelz Jul 14, 2026
d0f4926
fix(start-plugin-core): select client entry chunk by facade module in…
brenelz Jul 14, 2026
f1f590c
ci: apply automated fixes
autofix-ci[bot] Jul 14, 2026
4a335c1
test(start-plugin-core): pass getClientEntry to startManifestPlugin i…
brenelz Jul 14, 2026
a1ee163
Revert "fix(start-plugin-core): select client entry chunk by facade m…
brenelz Jul 15, 2026
d81a244
chore: upgrade vite-plugin-solid to 3.0.0-next.10
brenelz Jul 15, 2026
6a5534c
chore: upgrade solid-js/@solidjs/web to 2.0.0-beta.19 and vite-plugin…
brenelz Jul 16, 2026
ab35ca5
chore: upgrade solid-js/@solidjs/web to 2.0.0-beta.19 and vite-plugin…
nx-cloud[bot] Jul 16, 2026
0bba388
chore: upgrade solid-js/@solidjs/web to 2.0.0-beta.19 and vite-plugin…
nx-cloud[bot] Jul 16, 2026
de2132a
fix(e2e): make prerender builds hermetic to deflake build:vite:prerender
brenelz Jul 16, 2026
b082697
ci: apply automated fixes
autofix-ci[bot] Jul 16, 2026
ab5a623
chore: upgrade solid-js/@solidjs/web to 2.0.0-beta.19 and vite-plugin…
nx-cloud[bot] Jul 16, 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
10 changes: 10 additions & 0 deletions .changeset/solid-js-beta-17.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@tanstack/solid-router-devtools': patch
'@tanstack/solid-router-ssr-query': patch
'@tanstack/solid-router': patch
'@tanstack/solid-start-client': patch
'@tanstack/solid-start-server': patch
'@tanstack/solid-start': patch
---

Upgrade `solid-js` and `@solidjs/web` to `2.0.0-beta.17`
10 changes: 10 additions & 0 deletions .changeset/solid-js-beta-18.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@tanstack/solid-router-devtools': patch
'@tanstack/solid-router-ssr-query': patch
'@tanstack/solid-router': patch
'@tanstack/solid-start-client': patch
'@tanstack/solid-start-server': patch
'@tanstack/solid-start': patch
---

Upgrade `solid-js` and `@solidjs/web` to `2.0.0-beta.18`
10 changes: 10 additions & 0 deletions .changeset/solid-js-beta-19.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@tanstack/solid-router-devtools': patch
'@tanstack/solid-router-ssr-query': patch
'@tanstack/solid-router': patch
'@tanstack/solid-start-client': patch
'@tanstack/solid-start-server': patch
'@tanstack/solid-start': patch
---

Upgrade `solid-js` and `@solidjs/web` to `2.0.0-beta.19` and `vite-plugin-solid` to `3.0.0-next.11`
5 changes: 5 additions & 0 deletions .changeset/solid-match-suspend-ssr-only.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/solid-router': patch
---

Suspend on the match `loadPromise` only during SSR. On the client, suspending on the pending match kept a live async source in the tree, which since `solid-js@2.0.0-beta.16` routed signal writes into a transition hold and broke synchronous write-then-load flows such as `invalidate()` on a `notFound` match.
6 changes: 3 additions & 3 deletions benchmarks/bundle-size/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
}
},
"dependencies": {
"@solidjs/web": "2.0.0-beta.15",
"@solidjs/web": "2.0.0-beta.19",
"@tanstack/react-router": "workspace:^",
"@tanstack/react-start": "workspace:^",
"@tanstack/solid-router": "workspace:^",
Expand All @@ -36,7 +36,7 @@
"@tanstack/vue-start": "workspace:^",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"solid-js": "2.0.0-beta.15",
"solid-js": "2.0.0-beta.19",
"vue": "^3.5.16"
},
"devDependencies": {
Expand All @@ -50,6 +50,6 @@
"@vitejs/plugin-vue-jsx": "^5.1.5",
"typescript": "^6.0.2",
"vite": "^8.0.14",
"vite-plugin-solid": "^3.0.0-next.5"
"vite-plugin-solid": "^3.0.0-next.11"
}
}
6 changes: 3 additions & 3 deletions benchmarks/client-nav/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@
"test:types:vue": "tsc -p ./vue/tsconfig.json --noEmit"
},
"dependencies": {
"@solidjs/web": "2.0.0-beta.15",
"@solidjs/web": "2.0.0-beta.19",
"@tanstack/react-router": "workspace:^",
"@tanstack/router-core": "workspace:^",
"@tanstack/solid-router": "workspace:^",
"@tanstack/vue-router": "workspace:^",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"solid-js": "2.0.0-beta.15",
"solid-js": "2.0.0-beta.19",
"vue": "^3.5.16"
},
"devDependencies": {
Expand All @@ -40,7 +40,7 @@
"@vitejs/plugin-vue-jsx": "^5.1.5",
"typescript": "^6.0.2",
"vite": "^8.0.14",
"vite-plugin-solid": "^3.0.0-next.5",
"vite-plugin-solid": "^3.0.0-next.11",
"vitest": "^4.1.4"
},
"nx": {
Expand Down
6 changes: 3 additions & 3 deletions benchmarks/memory/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
"#memory-client/lifecycle": "./lifecycle.ts"
},
"dependencies": {
"@solidjs/web": "2.0.0-beta.15",
"@solidjs/web": "2.0.0-beta.19",
"@tanstack/react-router": "workspace:*",
"@tanstack/router-core": "workspace:*",
"@tanstack/solid-router": "workspace:*",
"@tanstack/vue-router": "workspace:*",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"solid-js": "2.0.0-beta.15",
"solid-js": "2.0.0-beta.19",
"vue": "^3.5.16"
},
"devDependencies": {
Expand All @@ -34,7 +34,7 @@
"jsdom": "29.1.1",
"typescript": "^6.0.2",
"vite": "^8.0.14",
"vite-plugin-solid": "^3.0.0-next.5",
"vite-plugin-solid": "^3.0.0-next.11",
"vitest": "^4.1.4"
},
"nx": {
Expand Down
6 changes: 3 additions & 3 deletions benchmarks/memory/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"#memory-server/flame-runner": "./flame-runner.ts"
},
"dependencies": {
"@solidjs/web": "2.0.0-beta.15",
"@solidjs/web": "2.0.0-beta.19",
"@tanstack/react-router": "workspace:*",
"@tanstack/react-start": "workspace:*",
"@tanstack/solid-router": "workspace:*",
Expand All @@ -20,7 +20,7 @@
"@tanstack/vue-start": "workspace:*",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"solid-js": "2.0.0-beta.15",
"solid-js": "2.0.0-beta.19",
"vue": "^3.5.16"
},
"devDependencies": {
Expand All @@ -31,7 +31,7 @@
"@vitejs/plugin-vue-jsx": "^5.1.5",
"typescript": "^6.0.2",
"vite": "^8.0.14",
"vite-plugin-solid": "^3.0.0-next.5",
"vite-plugin-solid": "^3.0.0-next.11",
"vitest": "^4.1.4"
},
"nx": {
Expand Down
6 changes: 3 additions & 3 deletions benchmarks/ssr/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"private": true,
"type": "module",
"dependencies": {
"@solidjs/web": "2.0.0-beta.15",
"@solidjs/web": "2.0.0-beta.19",
"@tanstack/react-router": "workspace:^",
"@tanstack/react-start": "workspace:^",
"@tanstack/solid-router": "workspace:^",
Expand All @@ -12,7 +12,7 @@
"@tanstack/vue-start": "workspace:^",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"solid-js": "2.0.0-beta.15",
"solid-js": "2.0.0-beta.19",
"vue": "^3.5.16"
},
"devDependencies": {
Expand All @@ -22,7 +22,7 @@
"seroval": "^1.5.4",
"typescript": "^6.0.2",
"vite": "^8.0.14",
"vite-plugin-solid": "^3.0.0-next.5",
"vite-plugin-solid": "^3.0.0-next.11",
"vitest": "^4.1.4"
},
"nx": {
Expand Down
23 changes: 23 additions & 0 deletions e2e/e2e-utils/src/e2eSetupTeardown.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { getRandomPort } from 'get-port-please'
import { localDummyServer } from './localDummyServer'
import { getDummyServerPort } from './derivePort'

Expand All @@ -7,6 +8,28 @@ export async function e2eStartDummyServer(input: string) {
return await localDummyServer(port)
}

/**
* Prerendering happens inside `vite build`, where no dummy server is running,
* so pages whose loaders fetch the "external host" would hit the real one —
* unstable in CI. Call this from an app's vite config when building in
* prerender mode: it starts the dummy server on a free port for the lifetime
* of the build and exposes it via VITE_NODE_ENV/VITE_EXTERNAL_PORT for
* request-time lookups. Everything is unref'd so the build process can exit.
*/
export async function e2eStartDummyServerForBuild() {
// vite reloads the config file for the prerender preview server;
// an earlier load in this process already started the server
if (process.env.VITE_EXTERNAL_PORT) return

const port = await getRandomPort()
process.env.VITE_NODE_ENV = 'test'
process.env.VITE_EXTERNAL_PORT = String(port)

const server = await localDummyServer(port)
server.unref()
server.on('connection', (socket) => socket.unref())
}

export async function e2eStopDummyServer(input: string) {
const port = await getDummyServerPort(input)

Expand Down
6 changes: 5 additions & 1 deletion e2e/e2e-utils/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ export { derivePort, getDummyServerPort, getTestServerPort } from './derivePort'
export { localDummyServer } from './localDummyServer'
export { toRuntimePath } from './to-runtime-path'
export { resolveRuntimeSuffix } from './resolve-runtime-suffix'
export { e2eStartDummyServer, e2eStopDummyServer } from './e2eSetupTeardown'
export {
e2eStartDummyServer,
e2eStartDummyServerForBuild,
e2eStopDummyServer,
} from './e2eSetupTeardown'
export { preOptimizeDevServer, waitForServer } from './devServerWarmup'
export { createHmrFileEditor, replaceAll } from './hmrFileEditor'
export type { HmrFileEditorOptions } from './hmrFileEditor'
Expand Down
14 changes: 9 additions & 5 deletions e2e/react-start/basic/src/routes/api.users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,22 @@ import axios from 'redaxios'

import type { User } from '~/utils/users'

let queryURL = 'https://jsonplaceholder.typicode.com'

if (import.meta.env.VITE_NODE_ENV === 'test') {
queryURL = `http://localhost:${import.meta.env.VITE_EXTERNAL_PORT}`
// resolved at request time (server-side only) so the built app picks up the
// dummy server the e2e harness starts — Playwright at test time, the vite
// config at prerender build time
function getQueryURL() {
if (process.env.VITE_NODE_ENV === 'test') {
return `http://localhost:${process.env.VITE_EXTERNAL_PORT}`
}
return 'https://jsonplaceholder.typicode.com'
}

export const Route = createFileRoute('/api/users')({
server: {
handlers: {
GET: async ({ request }) => {
console.info('Fetching users... @', request.url)
const res = await axios.get<Array<User>>(`${queryURL}/users`)
const res = await axios.get<Array<User>>(`${getQueryURL()}/users`)

const list = res.data.slice(0, 10)

Expand Down
16 changes: 11 additions & 5 deletions e2e/react-start/basic/src/routes/api/users.$id.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ import { createFileRoute } from '@tanstack/react-router'
import axios from 'redaxios'
import type { User } from '~/utils/users'

let queryURL = 'https://jsonplaceholder.typicode.com'

if (import.meta.env.VITE_NODE_ENV === 'test') {
queryURL = `http://localhost:${import.meta.env.VITE_EXTERNAL_PORT}`
// resolved at request time (server-side only) so the built app picks up the
// dummy server the e2e harness starts — Playwright at test time, the vite
// config at prerender build time
function getQueryURL() {
if (process.env.VITE_NODE_ENV === 'test') {
return `http://localhost:${process.env.VITE_EXTERNAL_PORT}`
}
return 'https://jsonplaceholder.typicode.com'
}

export const Route = createFileRoute('/api/users/$id')({
Expand All @@ -14,7 +18,9 @@ export const Route = createFileRoute('/api/users/$id')({
GET: async ({ request, params }) => {
console.info(`Fetching users by id=${params.id}... @`, request.url)
try {
const res = await axios.get<User>(`${queryURL}/users/` + params.id)
const res = await axios.get<User>(
`${getQueryURL()}/users/` + params.id,
)

return Response.json({
id: res.data.id,
Expand Down
16 changes: 10 additions & 6 deletions e2e/react-start/basic/src/utils/posts.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,22 @@ export type PostType = {
body: string
}

let queryURL = 'https://jsonplaceholder.typicode.com'

if (import.meta.env.VITE_NODE_ENV === 'test') {
queryURL = `http://localhost:${import.meta.env.VITE_EXTERNAL_PORT}`
// resolved at request time (server-side only) so the built app picks up the
// dummy server the e2e harness starts — Playwright at test time, the vite
// config at prerender build time
function getQueryURL() {
if (process.env.VITE_NODE_ENV === 'test') {
return `http://localhost:${process.env.VITE_EXTERNAL_PORT}`
}
return 'https://jsonplaceholder.typicode.com'
}

export const fetchPost = createServerFn({ method: 'GET' })
.validator((postId: string) => postId)
.handler(async ({ data: postId }) => {
console.info(`Fetching post with id ${postId}...`)
const post = await axios
.get<PostType>(`${queryURL}/posts/${postId}`)
.get<PostType>(`${getQueryURL()}/posts/${postId}`)
.then((r) => r.data)
.catch((err) => {
console.error(err)
Expand All @@ -36,7 +40,7 @@ export const fetchPosts = createServerFn({ method: 'GET' }).handler(
async () => {
console.info('Fetching posts...')
return axios
.get<Array<PostType>>(`${queryURL}/posts`)
.get<Array<PostType>>(`${getQueryURL()}/posts`)
.then((r) => r.data.slice(0, 10))
},
)
6 changes: 6 additions & 0 deletions e2e/react-start/basic/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@ import { defineConfig } from 'vite'
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
import viteReact from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
import { e2eStartDummyServerForBuild } from '@tanstack/router-e2e-utils'
import { getStartModeConfig } from './start-mode-config'
import { isPrerender } from './tests/utils/isPrerender'

if (isPrerender) {
await e2eStartDummyServerForBuild()
}

const outDir = process.env.E2E_DIST_DIR ?? 'dist'
const startModeConfig = getStartModeConfig()
Expand Down
2 changes: 1 addition & 1 deletion e2e/react-start/flamegraph-bench/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"srvx": "^0.11.9"
},
"devDependencies": {
"@platformatic/flame": "latest",
"@platformatic/flame": "1.6.0",
"@vitejs/plugin-react": "^6.0.1",
"nitro": "^3.0.260311-beta",
"autocannon": "^8.0.0",
Expand Down
6 changes: 3 additions & 3 deletions e2e/solid-router/basepath-file-based/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,16 @@
"test:e2e": "rm -rf port*.txt; playwright test --project=chromium"
},
"dependencies": {
"@solidjs/web": "2.0.0-beta.15",
"@solidjs/web": "2.0.0-beta.19",
"@tanstack/router-plugin": "workspace:^",
"@tanstack/solid-router": "workspace:^",
"@tanstack/solid-router-devtools": "workspace:^",
"solid-js": "2.0.0-beta.15"
"solid-js": "2.0.0-beta.19"
},
"devDependencies": {
"@playwright/test": "^1.50.1",
"@tanstack/router-e2e-utils": "workspace:^",
"vite-plugin-solid": "^3.0.0-next.5",
"vite-plugin-solid": "^3.0.0-next.11",
"vite": "^8.0.14"
}
}
4 changes: 2 additions & 2 deletions e2e/solid-router/basic-esbuild-file-based/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@
"test:e2e": "rm -rf port*.txt; playwright test --project=chromium"
},
"dependencies": {
"@solidjs/web": "2.0.0-beta.15",
"@solidjs/web": "2.0.0-beta.19",
"@tanstack/router-plugin": "workspace:^",
"@tanstack/solid-router": "workspace:^",
"@tanstack/solid-router-devtools": "workspace:^",
"redaxios": "^0.5.1",
"solid-js": "2.0.0-beta.15",
"solid-js": "2.0.0-beta.19",
"zod": "^4.4.3"
},
"devDependencies": {
Expand Down
6 changes: 3 additions & 3 deletions e2e/solid-router/basic-file-based-code-splitting/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@
"test:e2e": "rm -rf port*.txt; playwright test --project=chromium"
},
"dependencies": {
"@solidjs/web": "2.0.0-beta.15",
"@solidjs/web": "2.0.0-beta.19",
"@tailwindcss/vite": "^4.2.2",
"@tanstack/router-plugin": "workspace:^",
"@tanstack/solid-router": "workspace:^",
"@tanstack/solid-router-devtools": "workspace:^",
"solid-js": "2.0.0-beta.15",
"solid-js": "2.0.0-beta.19",
"tailwindcss": "^4.2.2",
"zod": "^4.4.3"
},
"devDependencies": {
"@playwright/test": "^1.50.1",
"@tanstack/router-e2e-utils": "workspace:^",
"vite": "^8.0.14",
"vite-plugin-solid": "^3.0.0-next.5"
"vite-plugin-solid": "^3.0.0-next.11"
}
}
Loading
Loading