Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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/bump-solid-rc-6.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@tanstack/solid-router': patch
'@tanstack/solid-router-devtools': patch
'@tanstack/solid-router-ssr-query': patch
'@tanstack/solid-start': patch
'@tanstack/solid-start-client': patch
'@tanstack/solid-start-server': patch
---

Bump solid-js, @solidjs/web, and @solidjs/signals to ^2.0.0-rc.6 across the monorepo. rc.6 provides the named flight-data source API (registerFlightDataSource / two-argument subscribeFlightData) that the Start single-flight integration now requires; @tanstack/solid-start's peer floor moves to rc.6 accordingly.
5 changes: 5 additions & 0 deletions .changeset/load-flight-target.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/solid-router': patch
---

New `loadFlightTarget` helper (exported from `@tanstack/solid-router/ssr/server`): the router's half of a single-flight refresh. Given the mutation request's target href, it builds a router for that location, loads it, and returns the dehydrated payload for the `tsr` flight-data slice, so server collectors can refresh router state alongside other caches on the same mutation response.
5 changes: 5 additions & 0 deletions .changeset/named-flight-source.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/solid-start': patch
---

Adopt Solid's multi-source single-flight protocol: the router's flight data (loader/match state, dehydrated data) registers under its own source id (`tsr`), so other caches' slices — e.g. solid-query's `sq` — coexist on the same mutation response instead of competing for a single consumer slot, and a user-supplied `collectFlightData` hook adds data alongside the router's rather than displacing it. Requires solid-js / @solidjs/web 2.0.0-rc.6+ (named flight-data sources).
5 changes: 5 additions & 0 deletions .changeset/retire-solid-router-ssr-query.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/solid-router-ssr-query': patch
---

Deprecated: Solid Query's `QueryClientProvider` now carries the Router + Query SSR pairing natively (registry hydration, named single-flight sources, redirect handling via userland glue), so this integration package is no longer needed. See the README for the migration.
4 changes: 2 additions & 2 deletions benchmarks/bundle-size/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
}
},
"dependencies": {
"@solidjs/web": "^2.0.0-rc.4",
"@solidjs/web": "^2.0.0-rc.6",
"@tanstack/react-router": "workspace:^",
"@tanstack/react-start": "workspace:^",
"@tanstack/solid-router": "workspace:^",
Expand All @@ -45,7 +45,7 @@
"@tanstack/vue-start": "workspace:^",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"solid-js": "^2.0.0-rc.4",
"solid-js": "^2.0.0-rc.6",
"vue": "^3.5.16"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/client-nav/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@
"test:types:vue": "tsc -p ./vue/tsconfig.json --noEmit"
},
"dependencies": {
"@solidjs/web": "^2.0.0-rc.4",
"@solidjs/web": "^2.0.0-rc.6",
"@tanstack/history": "workspace:^",
"@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-rc.4",
"solid-js": "^2.0.0-rc.6",
"vue": "^3.5.16"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 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-rc.4",
"@solidjs/web": "^2.0.0-rc.6",
"@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-rc.4",
"solid-js": "^2.0.0-rc.6",
"vue": "^3.5.16"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 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-rc.4",
"@solidjs/web": "^2.0.0-rc.6",
"@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-rc.4",
"solid-js": "^2.0.0-rc.6",
"vue": "^3.5.16"
},
"devDependencies": {
Expand Down
12 changes: 8 additions & 4 deletions benchmarks/solid-server-functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,21 @@ const instanceHeader = 'X-Server-Function-Instance'
export const solidServerFunctionFormatHeader = 'X-Server-Function-Format'

// Since solid-js 2.0.0-rc.4 the server resolves the function id from the
// request url pathname (`<endpoint>/<id>`); the X-Server-Function-Id header
// no longer exists. Requests keep the full function url they were given.
// request url pathname; the X-Server-Function-Id header no longer exists.
// Since 2.0.0-rc.6 scripted callers must use the data address
// (`<endpoint>/data/<id>`) — the bare address (`<endpoint>/<id>`) answers
// document traffic with the no-JS convention instead of the wire protocol.
function resolveSolidServerFunctionPathname(url: string) {
const parsed = new URL(url, origin)
const id = parsed.pathname.slice(parsed.pathname.lastIndexOf('/') + 1)
const slash = parsed.pathname.lastIndexOf('/')
const id = parsed.pathname.slice(slash + 1)

if (!id) {
throw new Error(`Unable to resolve Solid server function id from ${url}`)
}

return parsed.pathname
const mount = parsed.pathname.slice(0, slash)
return mount.endsWith('/data') ? parsed.pathname : `${mount}/data/${id}`
}

function createSolidServerFunctionHeaders(instance: string) {
Expand Down
4 changes: 2 additions & 2 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-rc.4",
"@solidjs/web": "^2.0.0-rc.6",
"@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-rc.4",
"solid-js": "^2.0.0-rc.6",
"vue": "^3.5.16"
},
"devDependencies": {
Expand Down
72 changes: 36 additions & 36 deletions benchmarks/ssr/scenarios/control-flow/solid/src/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,40 @@

import { Route as rootRouteImport } from './routes/__root'
import { Route as IndexRouteImport } from './routes/index'
import { Route as TargetIdRouteImport } from './routes/target.$id'
import { Route as MissingIdRouteImport } from './routes/missing.$id'
import { Route as HeadersIdRouteImport } from './routes/headers.$id'
import { Route as FromIdRouteImport } from './routes/from.$id'
import { Route as BoomIdRouteImport } from './routes/boom.$id'
import { Route as FromIdRouteImport } from './routes/from.$id'
import { Route as HeadersIdRouteImport } from './routes/headers.$id'
import { Route as MissingIdRouteImport } from './routes/missing.$id'
import { Route as TargetIdRouteImport } from './routes/target.$id'

const IndexRoute = IndexRouteImport.update({
id: '/',
path: '/',
getParentRoute: () => rootRouteImport,
} as any)
const TargetIdRoute = TargetIdRouteImport.update({
id: '/target/$id',
path: '/target/$id',
const BoomIdRoute = BoomIdRouteImport.update({
id: '/boom/$id',
path: '/boom/$id',
getParentRoute: () => rootRouteImport,
} as any)
const MissingIdRoute = MissingIdRouteImport.update({
id: '/missing/$id',
path: '/missing/$id',
const FromIdRoute = FromIdRouteImport.update({
id: '/from/$id',
path: '/from/$id',
getParentRoute: () => rootRouteImport,
} as any)
const HeadersIdRoute = HeadersIdRouteImport.update({
id: '/headers/$id',
path: '/headers/$id',
getParentRoute: () => rootRouteImport,
} as any)
const FromIdRoute = FromIdRouteImport.update({
id: '/from/$id',
path: '/from/$id',
const MissingIdRoute = MissingIdRouteImport.update({
id: '/missing/$id',
path: '/missing/$id',
getParentRoute: () => rootRouteImport,
} as any)
const BoomIdRoute = BoomIdRouteImport.update({
id: '/boom/$id',
path: '/boom/$id',
const TargetIdRoute = TargetIdRouteImport.update({
id: '/target/$id',
path: '/target/$id',
getParentRoute: () => rootRouteImport,
} as any)

Expand Down Expand Up @@ -117,18 +117,18 @@ declare module '@tanstack/solid-router' {
preLoaderRoute: typeof IndexRouteImport
parentRoute: typeof rootRouteImport
}
'/target/$id': {
id: '/target/$id'
path: '/target/$id'
fullPath: '/target/$id'
preLoaderRoute: typeof TargetIdRouteImport
'/boom/$id': {
id: '/boom/$id'
path: '/boom/$id'
fullPath: '/boom/$id'
preLoaderRoute: typeof BoomIdRouteImport
parentRoute: typeof rootRouteImport
}
'/missing/$id': {
id: '/missing/$id'
path: '/missing/$id'
fullPath: '/missing/$id'
preLoaderRoute: typeof MissingIdRouteImport
'/from/$id': {
id: '/from/$id'
path: '/from/$id'
fullPath: '/from/$id'
preLoaderRoute: typeof FromIdRouteImport
parentRoute: typeof rootRouteImport
}
'/headers/$id': {
Expand All @@ -138,18 +138,18 @@ declare module '@tanstack/solid-router' {
preLoaderRoute: typeof HeadersIdRouteImport
parentRoute: typeof rootRouteImport
}
'/from/$id': {
id: '/from/$id'
path: '/from/$id'
fullPath: '/from/$id'
preLoaderRoute: typeof FromIdRouteImport
'/missing/$id': {
id: '/missing/$id'
path: '/missing/$id'
fullPath: '/missing/$id'
preLoaderRoute: typeof MissingIdRouteImport
parentRoute: typeof rootRouteImport
}
'/boom/$id': {
id: '/boom/$id'
path: '/boom/$id'
fullPath: '/boom/$id'
preLoaderRoute: typeof BoomIdRouteImport
'/target/$id': {
id: '/target/$id'
path: '/target/$id'
fullPath: '/target/$id'
preLoaderRoute: typeof TargetIdRouteImport
parentRoute: typeof rootRouteImport
}
}
Expand Down
72 changes: 36 additions & 36 deletions benchmarks/ssr/scenarios/control-flow/vue/src/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,40 @@

import { Route as rootRouteImport } from './routes/__root'
import { Route as IndexRouteImport } from './routes/index'
import { Route as TargetIdRouteImport } from './routes/target.$id'
import { Route as MissingIdRouteImport } from './routes/missing.$id'
import { Route as HeadersIdRouteImport } from './routes/headers.$id'
import { Route as FromIdRouteImport } from './routes/from.$id'
import { Route as BoomIdRouteImport } from './routes/boom.$id'
import { Route as FromIdRouteImport } from './routes/from.$id'
import { Route as HeadersIdRouteImport } from './routes/headers.$id'
import { Route as MissingIdRouteImport } from './routes/missing.$id'
import { Route as TargetIdRouteImport } from './routes/target.$id'

const IndexRoute = IndexRouteImport.update({
id: '/',
path: '/',
getParentRoute: () => rootRouteImport,
} as any)
const TargetIdRoute = TargetIdRouteImport.update({
id: '/target/$id',
path: '/target/$id',
const BoomIdRoute = BoomIdRouteImport.update({
id: '/boom/$id',
path: '/boom/$id',
getParentRoute: () => rootRouteImport,
} as any)
const MissingIdRoute = MissingIdRouteImport.update({
id: '/missing/$id',
path: '/missing/$id',
const FromIdRoute = FromIdRouteImport.update({
id: '/from/$id',
path: '/from/$id',
getParentRoute: () => rootRouteImport,
} as any)
const HeadersIdRoute = HeadersIdRouteImport.update({
id: '/headers/$id',
path: '/headers/$id',
getParentRoute: () => rootRouteImport,
} as any)
const FromIdRoute = FromIdRouteImport.update({
id: '/from/$id',
path: '/from/$id',
const MissingIdRoute = MissingIdRouteImport.update({
id: '/missing/$id',
path: '/missing/$id',
getParentRoute: () => rootRouteImport,
} as any)
const BoomIdRoute = BoomIdRouteImport.update({
id: '/boom/$id',
path: '/boom/$id',
const TargetIdRoute = TargetIdRouteImport.update({
id: '/target/$id',
path: '/target/$id',
getParentRoute: () => rootRouteImport,
} as any)

Expand Down Expand Up @@ -117,18 +117,18 @@ declare module '@tanstack/vue-router' {
preLoaderRoute: typeof IndexRouteImport
parentRoute: typeof rootRouteImport
}
'/target/$id': {
id: '/target/$id'
path: '/target/$id'
fullPath: '/target/$id'
preLoaderRoute: typeof TargetIdRouteImport
'/boom/$id': {
id: '/boom/$id'
path: '/boom/$id'
fullPath: '/boom/$id'
preLoaderRoute: typeof BoomIdRouteImport
parentRoute: typeof rootRouteImport
}
'/missing/$id': {
id: '/missing/$id'
path: '/missing/$id'
fullPath: '/missing/$id'
preLoaderRoute: typeof MissingIdRouteImport
'/from/$id': {
id: '/from/$id'
path: '/from/$id'
fullPath: '/from/$id'
preLoaderRoute: typeof FromIdRouteImport
parentRoute: typeof rootRouteImport
}
'/headers/$id': {
Expand All @@ -138,18 +138,18 @@ declare module '@tanstack/vue-router' {
preLoaderRoute: typeof HeadersIdRouteImport
parentRoute: typeof rootRouteImport
}
'/from/$id': {
id: '/from/$id'
path: '/from/$id'
fullPath: '/from/$id'
preLoaderRoute: typeof FromIdRouteImport
'/missing/$id': {
id: '/missing/$id'
path: '/missing/$id'
fullPath: '/missing/$id'
preLoaderRoute: typeof MissingIdRouteImport
parentRoute: typeof rootRouteImport
}
'/boom/$id': {
id: '/boom/$id'
path: '/boom/$id'
fullPath: '/boom/$id'
preLoaderRoute: typeof BoomIdRouteImport
'/target/$id': {
id: '/target/$id'
path: '/target/$id'
fullPath: '/target/$id'
preLoaderRoute: typeof TargetIdRouteImport
parentRoute: typeof rootRouteImport
}
}
Expand Down
Loading
Loading