diff --git a/.changeset/pre.json b/.changeset/pre.json index 364b08acbbf..9f258f92a57 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,49 +1,49 @@ { "mode": "pre", - "tag": "beta", + "tag": "rc", "initialVersions": { - "@tanstack/arktype-adapter": "1.166.7", - "@tanstack/eslint-plugin-router": "1.161.4", - "@tanstack/history": "1.161.4", - "@tanstack/nitro-v2-vite-plugin": "1.154.7", - "@tanstack/react-router": "1.166.7", - "@tanstack/react-router-devtools": "1.166.7", - "@tanstack/react-router-ssr-query": "1.166.7", - "@tanstack/react-start": "1.166.8", - "@tanstack/react-start-client": "1.166.7", - "@tanstack/react-start-server": "1.166.7", - "@tanstack/router-cli": "1.166.7", - "@tanstack/router-core": "1.166.7", - "@tanstack/router-devtools": "1.166.7", - "@tanstack/router-devtools-core": "1.166.7", - "@tanstack/router-generator": "1.166.7", - "@tanstack/router-plugin": "1.166.7", - "@tanstack/router-ssr-query-core": "1.166.7", - "@tanstack/router-utils": "1.161.4", - "@tanstack/router-vite-plugin": "1.166.7", - "@tanstack/solid-router": "1.166.7", - "@tanstack/solid-router-devtools": "1.166.7", - "@tanstack/solid-router-ssr-query": "1.166.7", - "@tanstack/solid-start": "1.166.8", - "@tanstack/solid-start-client": "1.166.7", - "@tanstack/solid-start-server": "1.166.7", - "@tanstack/start-client-core": "1.166.7", - "@tanstack/start-fn-stubs": "1.161.4", - "@tanstack/start-plugin-core": "1.166.8", - "@tanstack/start-server-core": "1.166.7", - "@tanstack/start-static-server-functions": "1.166.8", - "@tanstack/start-storage-context": "1.166.7", - "@tanstack/valibot-adapter": "1.166.7", - "@tanstack/virtual-file-routes": "1.161.4", - "@tanstack/vue-router": "1.166.7", - "@tanstack/vue-router-devtools": "1.166.7", - "@tanstack/vue-router-ssr-query": "1.166.7", - "@tanstack/vue-start": "1.166.8", - "@tanstack/vue-start-client": "1.166.7", - "@tanstack/vue-start-server": "1.166.7", - "@tanstack/zod-adapter": "1.166.7", + "@tanstack/arktype-adapter": "1.167.0", + "@tanstack/eslint-plugin-router": "1.162.0", "@tanstack/eslint-plugin-start": "0.1.0", - "@tanstack/react-start-rsc": "0.1.17" + "@tanstack/history": "1.162.0", + "@tanstack/nitro-v2-vite-plugin": "1.155.0", + "@tanstack/react-router": "1.170.19", + "@tanstack/react-router-devtools": "1.167.1", + "@tanstack/react-router-ssr-query": "1.167.1", + "@tanstack/react-start": "1.168.36", + "@tanstack/react-start-client": "1.168.17", + "@tanstack/react-start-rsc": "0.1.35", + "@tanstack/react-start-server": "1.167.24", + "@tanstack/router-cli": "1.167.22", + "@tanstack/router-core": "1.171.16", + "@tanstack/router-devtools": "1.167.1", + "@tanstack/router-devtools-core": "1.168.1", + "@tanstack/router-generator": "1.167.22", + "@tanstack/router-plugin": "1.168.24", + "@tanstack/router-ssr-query-core": "1.169.1", + "@tanstack/router-utils": "1.162.2", + "@tanstack/router-vite-plugin": "1.167.24", + "@tanstack/solid-router": "2.0.0-beta.30", + "@tanstack/solid-router-devtools": "2.0.0-beta.25", + "@tanstack/solid-router-ssr-query": "2.0.0-beta.31", + "@tanstack/solid-start": "2.0.0-beta.31", + "@tanstack/solid-start-client": "2.0.0-beta.30", + "@tanstack/solid-start-server": "2.0.0-beta.30", + "@tanstack/start-client-core": "1.170.15", + "@tanstack/start-fn-stubs": "1.162.0", + "@tanstack/start-plugin-core": "1.171.27", + "@tanstack/start-server-core": "1.169.19", + "@tanstack/start-static-server-functions": "1.167.20", + "@tanstack/start-storage-context": "1.167.18", + "@tanstack/valibot-adapter": "1.167.0", + "@tanstack/virtual-file-routes": "1.162.0", + "@tanstack/vue-router": "1.170.18", + "@tanstack/vue-router-devtools": "1.167.1", + "@tanstack/vue-router-ssr-query": "1.167.1", + "@tanstack/vue-start": "1.168.34", + "@tanstack/vue-start-client": "1.167.20", + "@tanstack/vue-start-server": "1.167.24", + "@tanstack/zod-adapter": "1.167.0" }, "changesets": [ "brave-pans-create", @@ -78,6 +78,7 @@ "solid-js-beta-27", "solid-js-beta-29", "solid-js-beta-32", + "solid-js-rc-0", "solid-kings-help", "solid-match-suspend-ssr-only", "tall-horses-repair", diff --git a/.changeset/solid-js-rc-0.md b/.changeset/solid-js-rc-0.md new file mode 100644 index 00000000000..59ca0fcbdc8 --- /dev/null +++ b/.changeset/solid-js-rc-0.md @@ -0,0 +1,16 @@ +--- +'@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-rc.0`, and migrate from `vite-plugin-solid` to its new name `@solidjs/vite-plugin` at `3.0.0-next.28` + +`vite-plugin-solid` was renamed to `@solidjs/vite-plugin`; its final release (`3.0.0-next.27`) is a re-export shim over the new package. `@solidjs/vite-plugin@3.0.0-next.28` requires `solid-js`/`@solidjs/web` `^2.0.0-rc.0`, so the rename and the `rc` bump land together. + +`@tanstack/router-plugin` is intentionally untouched: it detects the Solid JSX plugin by its Vite plugin _name_ (`solid`), which the renamed package still registers, and its `vite-plugin-solid` peer is optional — so it keeps working for both Solid 1 and Solid 2 consumers without a change. + +Also bumps `@tanstack/solid-query` and `@tanstack/solid-query-devtools` to `^6.0.0-rc.0` (whose peer requires `solid-js >=2.0.0-rc.0`), and converges `@tanstack/query-core` on `5.101.4` — `solid-query` depends on query-core `5.101.0`, which previously resolved to a stale `5.99.0` and produced two incompatible `QueryClient` types. diff --git a/.github/workflows/bundle-size.yml b/.github/workflows/bundle-size.yml index d0deda36a74..23c354e06e6 100644 --- a/.github/workflows/bundle-size.yml +++ b/.github/workflows/bundle-size.yml @@ -8,11 +8,13 @@ on: paths: - 'packages/**' - 'benchmarks/**' + - 'scripts/benchmarks/bundle-size/**' push: branches: [main] paths: - 'packages/**' - 'benchmarks/**' + - 'scripts/benchmarks/bundle-size/**' workflow_dispatch: concurrency: diff --git a/.github/workflows/client-nav-benchmarks.yml b/.github/workflows/client-nav-benchmarks.yml index a56bb703343..8715312d36e 100644 --- a/.github/workflows/client-nav-benchmarks.yml +++ b/.github/workflows/client-nav-benchmarks.yml @@ -72,7 +72,7 @@ jobs: @benchmarks/${{ matrix.benchmark }}:build:${{ matrix.framework }} - name: Run ${{ matrix.benchmark }}:${{ matrix.framework }} CodSpeed benchmark - uses: CodSpeedHQ/action@9d332c4d90b43981c3e55ae8e38e68709996240f # v4.17.0 + uses: CodSpeedHQ/action@4296e51e7041e24dadb86d1d6e8b9320d223dbe8 # v5.0.3 with: mode: ${{ matrix.mode }} run: >- diff --git a/benchmarks/bundle-size/package.json b/benchmarks/bundle-size/package.json index e90ff214c01..a0ff358121b 100644 --- a/benchmarks/bundle-size/package.json +++ b/benchmarks/bundle-size/package.json @@ -36,7 +36,7 @@ } }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/react-router": "workspace:^", "@tanstack/react-start": "workspace:^", "@tanstack/solid-router": "workspace:^", @@ -45,12 +45,13 @@ "@tanstack/vue-start": "workspace:^", "react": "^19.0.0", "react-dom": "^19.0.0", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "vue": "^3.5.16" }, "devDependencies": { "@rsbuild/core": "^2.1.0", "@rsbuild/plugin-react": "^2.0.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-plugin": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", @@ -59,7 +60,6 @@ "@vitejs/plugin-vue-jsx": "^5.1.5", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/benchmarks/bundle-size/scenarios/solid-router-full/vite.config.ts b/benchmarks/bundle-size/scenarios/solid-router-full/vite.config.ts index 9729ada0e8b..c536beefe72 100644 --- a/benchmarks/bundle-size/scenarios/solid-router-full/vite.config.ts +++ b/benchmarks/bundle-size/scenarios/solid-router-full/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' export default defineConfig({ diff --git a/benchmarks/bundle-size/scenarios/solid-router-minimal/vite.config.ts b/benchmarks/bundle-size/scenarios/solid-router-minimal/vite.config.ts index 9729ada0e8b..c536beefe72 100644 --- a/benchmarks/bundle-size/scenarios/solid-router-minimal/vite.config.ts +++ b/benchmarks/bundle-size/scenarios/solid-router-minimal/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' export default defineConfig({ diff --git a/benchmarks/bundle-size/scenarios/solid-start-deferred-hydration/vite.config.ts b/benchmarks/bundle-size/scenarios/solid-start-deferred-hydration/vite.config.ts index 0bd21e64f44..8c3cc043eaf 100644 --- a/benchmarks/bundle-size/scenarios/solid-start-deferred-hydration/vite.config.ts +++ b/benchmarks/bundle-size/scenarios/solid-start-deferred-hydration/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' export default defineConfig({ diff --git a/benchmarks/bundle-size/scenarios/solid-start-full/vite.config.ts b/benchmarks/bundle-size/scenarios/solid-start-full/vite.config.ts index 0bd21e64f44..8c3cc043eaf 100644 --- a/benchmarks/bundle-size/scenarios/solid-start-full/vite.config.ts +++ b/benchmarks/bundle-size/scenarios/solid-start-full/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' export default defineConfig({ diff --git a/benchmarks/bundle-size/scenarios/solid-start-minimal/vite.config.ts b/benchmarks/bundle-size/scenarios/solid-start-minimal/vite.config.ts index 0bd21e64f44..8c3cc043eaf 100644 --- a/benchmarks/bundle-size/scenarios/solid-start-minimal/vite.config.ts +++ b/benchmarks/bundle-size/scenarios/solid-start-minimal/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' export default defineConfig({ diff --git a/benchmarks/client-nav/package.json b/benchmarks/client-nav/package.json index 9b73e9b6342..945a787945e 100644 --- a/benchmarks/client-nav/package.json +++ b/benchmarks/client-nav/package.json @@ -19,19 +19,21 @@ "test:types:vue": "tsc -p ./vue/tsconfig.json --noEmit" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", + "@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-beta.32", + "solid-js": "^2.0.0-rc.0", "vue": "^3.5.16" }, "devDependencies": { "@codspeed/vitest-plugin": "^5.5.0", "@platformatic/flame": "^1.6.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-plugin": "workspace:^", "@testing-library/react": "^16.2.0", "@types/jsdom": "28.0.0", @@ -39,9 +41,9 @@ "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", "@typescript/native": "npm:typescript@^7.0.2", + "jsdom": "^29.1.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vitest": "^4.1.4" }, "nx": { diff --git a/benchmarks/client-nav/scenarios/async-pipeline/react/speed.bench.ts b/benchmarks/client-nav/scenarios/async-pipeline/react/speed.bench.ts index 68c5f97c2f1..c3f4c5231c6 100644 --- a/benchmarks/client-nav/scenarios/async-pipeline/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/async-pipeline/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-async-pipeline', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-async-pipeline navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-async-pipeline', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/async-pipeline/react/src/main.tsx b/benchmarks/client-nav/scenarios/async-pipeline/react/src/main.tsx index 4b141859e65..cab86a12721 100644 --- a/benchmarks/client-nav/scenarios/async-pipeline/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/async-pipeline/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -22,8 +24,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/async-pipeline/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/async-pipeline/solid/speed.bench.ts index d1f620f4477..96082e9963c 100644 --- a/benchmarks/client-nav/scenarios/async-pipeline/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/async-pipeline/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-async-pipeline', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-async-pipeline navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-async-pipeline', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/async-pipeline/solid/src/main.tsx b/benchmarks/client-nav/scenarios/async-pipeline/solid/src/main.tsx index c9268ec31c9..4f6d12dba4c 100644 --- a/benchmarks/client-nav/scenarios/async-pipeline/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/async-pipeline/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -22,8 +24,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/async-pipeline/solid/vite.config.ts b/benchmarks/client-nav/scenarios/async-pipeline/solid/vite.config.ts index 5107c1f0568..9f5092871b8 100644 --- a/benchmarks/client-nav/scenarios/async-pipeline/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/async-pipeline/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/async-pipeline/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/async-pipeline/vue/speed.bench.ts index eeb568323c7..193a3837df3 100644 --- a/benchmarks/client-nav/scenarios/async-pipeline/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/async-pipeline/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-async-pipeline', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-async-pipeline navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-async-pipeline', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/async-pipeline/vue/src/main.tsx b/benchmarks/client-nav/scenarios/async-pipeline/vue/src/main.tsx index d8e659fb093..e1bfa5965f2 100644 --- a/benchmarks/client-nav/scenarios/async-pipeline/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/async-pipeline/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -22,8 +24,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/control-flow/react/speed.bench.ts b/benchmarks/client-nav/scenarios/control-flow/react/speed.bench.ts index 55a2224d3a9..7f1153021f6 100644 --- a/benchmarks/client-nav/scenarios/control-flow/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/control-flow/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-control-flow', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-control-flow navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-control-flow', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/control-flow/react/src/main.tsx b/benchmarks/client-nav/scenarios/control-flow/react/src/main.tsx index 9a0c3d3b501..da9e63d2935 100644 --- a/benchmarks/client-nav/scenarios/control-flow/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/control-flow/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) // The scenario intentionally throws loader errors every lap; keep React 19's // default per-caught-error console reporting out of the measured loop. diff --git a/benchmarks/client-nav/scenarios/control-flow/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/control-flow/solid/speed.bench.ts index abbb85a575e..a88093ca523 100644 --- a/benchmarks/client-nav/scenarios/control-flow/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/control-flow/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-control-flow', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-control-flow navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-control-flow', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/control-flow/solid/src/main.tsx b/benchmarks/client-nav/scenarios/control-flow/solid/src/main.tsx index b43608e1919..f7148011f58 100644 --- a/benchmarks/client-nav/scenarios/control-flow/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/control-flow/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/control-flow/solid/vite.config.ts b/benchmarks/client-nav/scenarios/control-flow/solid/vite.config.ts index 1c6244d3d16..62591420c5c 100644 --- a/benchmarks/client-nav/scenarios/control-flow/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/control-flow/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/control-flow/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/control-flow/vue/speed.bench.ts index 551b88e68f3..9a335cfb870 100644 --- a/benchmarks/client-nav/scenarios/control-flow/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/control-flow/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-control-flow', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-control-flow navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-control-flow', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/control-flow/vue/src/main.tsx b/benchmarks/client-nav/scenarios/control-flow/vue/src/main.tsx index c96d3f3a2e4..cae9b54f1dc 100644 --- a/benchmarks/client-nav/scenarios/control-flow/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/control-flow/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/harness.ts b/benchmarks/client-nav/scenarios/harness.ts index 7b993d0ed89..cf3c39c7e65 100644 --- a/benchmarks/client-nav/scenarios/harness.ts +++ b/benchmarks/client-nav/scenarios/harness.ts @@ -1,3 +1,9 @@ +import { + createBrowserHistory, + createMemoryHistory, + type RouterHistory, +} from '@tanstack/history' +import { JSDOM } from 'jsdom' import { getRequiredLink, waitForRequiredLink } from '../setup-helpers' export interface ScenarioRouter { @@ -76,6 +82,16 @@ async function settle(hops: number) { } const MAX_SETTLE_HOPS = 100 +const BATCH_SETTLE_HOPS = 4 + +/** + * Close the batch at a deterministic macrotask boundary. Four fixed hops give + * framework passive effects and scheduler callbacks time to run without + * changing the amount of navigation work in the batch. + */ +async function finishBatch() { + await settle(BATCH_SETTLE_HOPS) +} async function settleUntil(isSettled: () => boolean, label: string) { for (let i = 0; i < MAX_SETTLE_HOPS; i++) { @@ -101,14 +117,19 @@ async function settleUntil(isSettled: () => boolean, label: string) { * conventions already forbid real-delay timers in measured code; non-zero * delays are passed through untouched. */ -function patchZeroDelayTimeouts() { - const originalSetTimeout = window.setTimeout.bind(window) - const originalClearTimeout = window.clearTimeout.bind(window) +interface TimerWindow { + setTimeout: typeof window.setTimeout + clearTimeout: typeof window.clearTimeout +} + +function patchZeroDelayTimeouts(targetWindow: TimerWindow) { + const originalSetTimeout = targetWindow.setTimeout.bind(targetWindow) + const originalClearTimeout = targetWindow.clearTimeout.bind(targetWindow) const immediates = new Map() // Negative ids cannot collide with real jsdom timer ids. let nextImmediateId = -2 - window.setTimeout = (( + targetWindow.setTimeout = (( handler: (...handlerArgs: Array) => void, delay?: number, ...args: Array @@ -125,9 +146,9 @@ function patchZeroDelayTimeouts() { return id } return originalSetTimeout(handler, delay, ...args) - }) as typeof window.setTimeout + }) as typeof targetWindow.setTimeout - window.clearTimeout = ((id: number) => { + targetWindow.clearTimeout = ((id: number) => { const immediate = immediates.get(id) if (immediate) { clearImmediate(immediate) @@ -135,17 +156,119 @@ function patchZeroDelayTimeouts() { return } originalClearTimeout(id) - }) as typeof window.clearTimeout + }) as typeof targetWindow.clearTimeout return () => { - window.setTimeout = originalSetTimeout as typeof window.setTimeout - window.clearTimeout = originalClearTimeout as typeof window.clearTimeout + targetWindow.setTimeout = + originalSetTimeout as typeof targetWindow.setTimeout + targetWindow.clearTimeout = + originalClearTimeout as typeof targetWindow.clearTimeout + } +} + +interface ListenerTarget { + addEventListener: ( + type: string, + listener: EventListenerOrEventListenerObject | null, + options?: boolean | AddEventListenerOptions, + ) => void + removeEventListener: ( + type: string, + listener: EventListenerOrEventListenerObject | null, + options?: boolean | EventListenerOptions, + ) => void +} + +/** + * Scroll restoration installs page-lifetime listeners without a public router + * dispose operation. Capture just those listeners while the router is created + * so per-invocation routers do not remain reachable after teardown. + */ +function captureScrollRestorationListeners() { + const captured: Array<{ + target: ListenerTarget + type: string + listener: EventListenerOrEventListenerObject | null + options?: boolean | AddEventListenerOptions + }> = [] + const patches: Array<{ + target: ListenerTarget + addEventListener: ListenerTarget['addEventListener'] + }> = [] + + const patch = (target: ListenerTarget, capturedType: string) => { + const originalAddEventListener = target.addEventListener + patches.push({ target, addEventListener: originalAddEventListener }) + + target.addEventListener = function (type, listener, options) { + if (type === capturedType) { + captured.push({ target, type, listener, options }) + } + originalAddEventListener.call(target, type, listener, options) + } + } + + patch(document as unknown as ListenerTarget, 'scroll') + patch(globalThis as unknown as ListenerTarget, 'pagehide') + + let stopped = false + const stop = () => { + if (stopped) { + return + } + stopped = true + for (const entry of patches) { + entry.target.addEventListener = entry.addEventListener + } + } + + return { + stop, + cleanup() { + stop() + for (const { target, type, listener, options } of captured) { + target.removeEventListener(type, listener, options) + } + }, + } +} + +interface ScenarioHistoryResource { + history: RouterHistory + timeoutWindow?: TimerWindow + dispose: () => void +} + +function createScenarioHistory( + mode: NonNullable, + initialUrl: string, +): ScenarioHistoryResource { + if (mode === 'browser') { + const dom = new JSDOM('', { + url: new URL(initialUrl, 'http://localhost').href, + }) + const history = createBrowserHistory({ window: dom.window }) + + return { + history, + timeoutWindow: dom.window as unknown as TimerWindow, + dispose() { + history.destroy() + dom.window.close() + }, + } + } + + const history = createMemoryHistory({ initialEntries: [initialUrl] }) + return { + history, + dispose: history.destroy, } } export interface ScenarioSetupOptions { frameworkLabel: string - mount: (container: HTMLElement) => MountedScenarioApp + mount: (container: HTMLElement, history: RouterHistory) => MountedScenarioApp /** * Circular sequence of steps advanced by `tick()`. Link steps must target * links rendered from the start (e.g. in the root layout), no two @@ -156,13 +279,22 @@ export interface ScenarioSetupOptions { */ steps: ReadonlyArray /** Sanity check run once per step during the warm-up lap in `before()`. */ - assertAfterStep?: (stepIndex: number, container: HTMLElement) => void + assertAfterStep?: ( + stepIndex: number, + container: HTMLElement, + history: RouterHistory, + ) => void /** - * URL the window is reset to before mounting (default '/'). Scenarios whose - * router uses a `basepath` or an input rewrite must start on an external - * URL that maps to their initial route. + * URL used to initialize the fresh history before mounting (default '/'). + * Scenarios whose router uses a `basepath` or an input rewrite must start on + * an external URL that maps to their initial route. */ initialUrl?: string + /** + * Browser history is reserved for the scenario that explicitly measures + * browser history traversal. All other scenarios use fresh memory history. + */ + historyMode?: 'memory' | 'browser' } function warnAboutDevMode(frameworkLabel: string) { @@ -185,18 +317,41 @@ export function createScenarioSetup(options: ScenarioSetupOptions) { let unmount: (() => void) | undefined = undefined let unsub = () => {} let restoreTimeouts = () => {} + let cleanupScrollRestorationListeners = () => {} + let historyResource: ScenarioHistoryResource | undefined = undefined let stepIndex = 0 let next: () => Promise = () => Promise.reject(new Error('Benchmark not initialized')) async function before() { stepIndex = 0 - restoreTimeouts = patchZeroDelayTimeouts() - window.history.replaceState(null, '', options.initialUrl ?? '/') + historyResource = createScenarioHistory( + options.historyMode ?? 'memory', + options.initialUrl ?? '/', + ) + + const restoreGlobalTimeouts = patchZeroDelayTimeouts(window) + const restoreHistoryTimeouts = historyResource.timeoutWindow + ? patchZeroDelayTimeouts(historyResource.timeoutWindow) + : () => {} + restoreTimeouts = () => { + restoreHistoryTimeouts() + restoreGlobalTimeouts() + } + container = document.createElement('div') document.body.append(container) - const { router, unmount: dispose } = options.mount(container) + const capturedListeners = captureScrollRestorationListeners() + let mounted: MountedScenarioApp + try { + mounted = options.mount(container, historyResource.history) + } finally { + capturedListeners.stop() + cleanupScrollRestorationListeners = capturedListeners.cleanup + } + + const { router, unmount: dispose } = mounted unmount = dispose let resolveRendered: () => void = () => {} @@ -294,8 +449,9 @@ export function createScenarioSetup(options: ScenarioSetupOptions) { // ending back on the initial route so measurement starts from a known state. for (const [index, step] of options.steps.entries()) { await runStep(step) - options.assertAfterStep?.(index, container) + options.assertAfterStep?.(index, container, historyResource.history) } + await finishBatch() next = () => { const step = options.steps[stepIndex % options.steps.length]! @@ -308,10 +464,14 @@ export function createScenarioSetup(options: ScenarioSetupOptions) { unmount?.() container?.remove() unsub() + cleanupScrollRestorationListeners() restoreTimeouts() + historyResource?.dispose() restoreTimeouts = () => {} + cleanupScrollRestorationListeners = () => {} unmount = undefined container = undefined + historyResource = undefined } function tick() { @@ -321,13 +481,14 @@ export function createScenarioSetup(options: ScenarioSetupOptions) { return { before, tick, + finishBatch, after, } } export interface MountLoopSetupOptions { frameworkLabel: string - mount: (container: HTMLElement) => MountedScenarioApp + mount: (container: HTMLElement, history: RouterHistory) => MountedScenarioApp /** Test id that must appear in the container before a mount counts as done. */ readyTestId: string assertReady?: (container: HTMLElement) => void @@ -342,11 +503,11 @@ export function createMountLoopSetup(options: MountLoopSetupOptions) { warnAboutDevMode(options.frameworkLabel) async function tick() { - window.history.replaceState(null, '', '/') const container = document.createElement('div') document.body.append(container) + const history = createMemoryHistory({ initialEntries: ['/'] }) - const { router, unmount } = options.mount(container) + const { router, unmount } = options.mount(container, history) try { await router.load() @@ -359,6 +520,7 @@ export function createMountLoopSetup(options: MountLoopSetupOptions) { options.assertReady?.(container) } finally { unmount() + history.destroy() container.remove() } } @@ -366,6 +528,7 @@ export function createMountLoopSetup(options: MountLoopSetupOptions) { return { before: async () => {}, tick, + finishBatch, after: () => {}, } } diff --git a/benchmarks/client-nav/scenarios/head/react/speed.bench.ts b/benchmarks/client-nav/scenarios/head/react/speed.bench.ts index c71b426c561..97c76a1a115 100644 --- a/benchmarks/client-nav/scenarios/head/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/head/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-head', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-head navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-head', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/head/react/src/main.tsx b/benchmarks/client-nav/scenarios/head/react/src/main.tsx index ef0b99555c3..5febd6f7957 100644 --- a/benchmarks/client-nav/scenarios/head/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/head/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/head/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/head/solid/speed.bench.ts index ea0a5ca818a..075e7673de7 100644 --- a/benchmarks/client-nav/scenarios/head/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/head/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-head', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-head navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-head', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/head/solid/src/main.tsx b/benchmarks/client-nav/scenarios/head/solid/src/main.tsx index b43608e1919..f7148011f58 100644 --- a/benchmarks/client-nav/scenarios/head/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/head/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/head/solid/vite.config.ts b/benchmarks/client-nav/scenarios/head/solid/vite.config.ts index 7b5a1e22b46..010028bddc1 100644 --- a/benchmarks/client-nav/scenarios/head/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/head/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/head/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/head/vue/speed.bench.ts index 3630032e446..7080b4ea7d7 100644 --- a/benchmarks/client-nav/scenarios/head/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/head/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-head', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-head navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-head', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/head/vue/src/main.tsx b/benchmarks/client-nav/scenarios/head/vue/src/main.tsx index c96d3f3a2e4..cae9b54f1dc 100644 --- a/benchmarks/client-nav/scenarios/head/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/head/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/history/react/setup.ts b/benchmarks/client-nav/scenarios/history/react/setup.ts index 130583b1907..c26b7ffd08e 100644 --- a/benchmarks/client-nav/scenarios/history/react/setup.ts +++ b/benchmarks/client-nav/scenarios/history/react/setup.ts @@ -11,6 +11,7 @@ export function setup() { return createScenarioSetup({ frameworkLabel: 'React', mount: mountTestApp, + historyMode: 'browser', steps, assertAfterStep: assertStepResult, }) diff --git a/benchmarks/client-nav/scenarios/history/react/speed.bench.ts b/benchmarks/client-nav/scenarios/history/react/speed.bench.ts index df2c951c03c..9192258b663 100644 --- a/benchmarks/client-nav/scenarios/history/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/history/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-history', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-history navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-history', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/history/react/src/main.tsx b/benchmarks/client-nav/scenarios/history/react/src/main.tsx index ef0b99555c3..5febd6f7957 100644 --- a/benchmarks/client-nav/scenarios/history/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/history/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/history/shared.ts b/benchmarks/client-nav/scenarios/history/shared.ts index 9ddfa6c104c..be6096cea8b 100644 --- a/benchmarks/client-nav/scenarios/history/shared.ts +++ b/benchmarks/client-nav/scenarios/history/shared.ts @@ -8,6 +8,7 @@ * forward tail and the session history never grows past 4 entries. */ import type { ScenarioStep } from '../harness' +import type { RouterHistory } from '@tanstack/history' export const pageIds = ['1', '2', '3'] as const export const maskedPhotoId = '42' @@ -27,7 +28,7 @@ interface HistoryStepExpectation { step: ScenarioStep /** Expected router location pathname (the REAL location, even when masked). */ pathname: string - /** Expected window.location pathname when it differs (location masking). */ + /** Expected browser-history pathname when it differs (location masking). */ windowPathname?: string /** Marker test id that must be present in the container after the step. */ marker?: string @@ -52,7 +53,11 @@ export const stepExpectations: ReadonlyArray = [ export const steps = stepExpectations.map((expectation) => expectation.step) -export function assertStepResult(stepIndex: number, container: HTMLElement) { +export function assertStepResult( + stepIndex: number, + container: HTMLElement, + history: RouterHistory, +) { const expected = stepExpectations[stepIndex]! const loc = container.querySelector('[data-testid="loc"]')?.textContent @@ -63,9 +68,9 @@ export function assertStepResult(stepIndex: number, container: HTMLElement) { } const windowPathname = expected.windowPathname ?? expected.pathname - if (window.location.pathname !== windowPathname) { + if (history.location.pathname !== windowPathname) { throw new Error( - `Expected window.location.pathname to be "${windowPathname}" after step ${stepIndex}, received "${window.location.pathname}"`, + `Expected history.location.pathname to be "${windowPathname}" after step ${stepIndex}, received "${history.location.pathname}"`, ) } diff --git a/benchmarks/client-nav/scenarios/history/solid/setup.ts b/benchmarks/client-nav/scenarios/history/solid/setup.ts index 6a46971603c..4adf55d6dfa 100644 --- a/benchmarks/client-nav/scenarios/history/solid/setup.ts +++ b/benchmarks/client-nav/scenarios/history/solid/setup.ts @@ -11,6 +11,7 @@ export function setup() { return createScenarioSetup({ frameworkLabel: 'Solid', mount: mountTestApp, + historyMode: 'browser', steps, assertAfterStep: assertStepResult, }) diff --git a/benchmarks/client-nav/scenarios/history/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/history/solid/speed.bench.ts index 8e814bc1336..d7f4fd898d7 100644 --- a/benchmarks/client-nav/scenarios/history/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/history/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-history', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-history navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-history', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/history/solid/src/main.tsx b/benchmarks/client-nav/scenarios/history/solid/src/main.tsx index b43608e1919..f7148011f58 100644 --- a/benchmarks/client-nav/scenarios/history/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/history/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/history/solid/vite.config.ts b/benchmarks/client-nav/scenarios/history/solid/vite.config.ts index de0eda543cf..e3bfc63e026 100644 --- a/benchmarks/client-nav/scenarios/history/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/history/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/history/vue/setup.ts b/benchmarks/client-nav/scenarios/history/vue/setup.ts index 97b74b38924..df689964e4b 100644 --- a/benchmarks/client-nav/scenarios/history/vue/setup.ts +++ b/benchmarks/client-nav/scenarios/history/vue/setup.ts @@ -11,6 +11,7 @@ export function setup() { return createScenarioSetup({ frameworkLabel: 'Vue', mount: mountTestApp, + historyMode: 'browser', steps, assertAfterStep: assertStepResult, }) diff --git a/benchmarks/client-nav/scenarios/history/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/history/vue/speed.bench.ts index be2956bd85c..a378e45ac57 100644 --- a/benchmarks/client-nav/scenarios/history/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/history/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-history', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-history navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-history', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/history/vue/src/main.tsx b/benchmarks/client-nav/scenarios/history/vue/src/main.tsx index c96d3f3a2e4..cae9b54f1dc 100644 --- a/benchmarks/client-nav/scenarios/history/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/history/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/links/react/speed.bench.ts b/benchmarks/client-nav/scenarios/links/react/speed.bench.ts index 68bb869182f..08923089017 100644 --- a/benchmarks/client-nav/scenarios/links/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/links/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-links', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-links navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-links', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/links/react/src/main.tsx b/benchmarks/client-nav/scenarios/links/react/src/main.tsx index ef0b99555c3..5febd6f7957 100644 --- a/benchmarks/client-nav/scenarios/links/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/links/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/links/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/links/solid/speed.bench.ts index beba86fb6c6..a3d690b4231 100644 --- a/benchmarks/client-nav/scenarios/links/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/links/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-links', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-links navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-links', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/links/solid/src/main.tsx b/benchmarks/client-nav/scenarios/links/solid/src/main.tsx index b43608e1919..f7148011f58 100644 --- a/benchmarks/client-nav/scenarios/links/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/links/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/links/solid/vite.config.ts b/benchmarks/client-nav/scenarios/links/solid/vite.config.ts index 9a5b3d138b7..5f912c0001a 100644 --- a/benchmarks/client-nav/scenarios/links/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/links/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/links/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/links/vue/speed.bench.ts index 54b99d12731..e2d3f7c47a4 100644 --- a/benchmarks/client-nav/scenarios/links/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/links/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-links', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-links navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-links', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/links/vue/src/main.tsx b/benchmarks/client-nav/scenarios/links/vue/src/main.tsx index c96d3f3a2e4..cae9b54f1dc 100644 --- a/benchmarks/client-nav/scenarios/links/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/links/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/loaders/react/speed.bench.ts b/benchmarks/client-nav/scenarios/loaders/react/speed.bench.ts index 7c44f1a0f7a..f5a51b29be3 100644 --- a/benchmarks/client-nav/scenarios/loaders/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/loaders/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-loaders', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-loaders navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-loaders', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/loaders/react/src/main.tsx b/benchmarks/client-nav/scenarios/loaders/react/src/main.tsx index ef0b99555c3..5febd6f7957 100644 --- a/benchmarks/client-nav/scenarios/loaders/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/loaders/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/loaders/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/loaders/solid/speed.bench.ts index 4c97823d11a..9f3bd397dbb 100644 --- a/benchmarks/client-nav/scenarios/loaders/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/loaders/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-loaders', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-loaders navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-loaders', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/loaders/solid/src/main.tsx b/benchmarks/client-nav/scenarios/loaders/solid/src/main.tsx index b43608e1919..f7148011f58 100644 --- a/benchmarks/client-nav/scenarios/loaders/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/loaders/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/loaders/solid/vite.config.ts b/benchmarks/client-nav/scenarios/loaders/solid/vite.config.ts index ea913ac5789..dccbcc4f7ae 100644 --- a/benchmarks/client-nav/scenarios/loaders/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/loaders/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/loaders/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/loaders/vue/speed.bench.ts index eeb9cefaeb5..819fe020b0a 100644 --- a/benchmarks/client-nav/scenarios/loaders/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/loaders/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-loaders', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-loaders navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-loaders', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/loaders/vue/src/main.tsx b/benchmarks/client-nav/scenarios/loaders/vue/src/main.tsx index c96d3f3a2e4..cae9b54f1dc 100644 --- a/benchmarks/client-nav/scenarios/loaders/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/loaders/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/mount/react/speed.bench.ts b/benchmarks/client-nav/scenarios/mount/react/speed.bench.ts index 8f7967c42c0..2d675ff259e 100644 --- a/benchmarks/client-nav/scenarios/mount/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/mount/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-mount', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-mount loop (react)', @@ -24,6 +21,7 @@ describe('client-mount', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/mount/react/src/main.tsx b/benchmarks/client-nav/scenarios/mount/react/src/main.tsx index 78fe2082aa0..4e45ed7ef3f 100644 --- a/benchmarks/client-nav/scenarios/mount/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/mount/react/src/main.tsx @@ -1,19 +1,12 @@ -import { - RouterProvider, - createBrowserHistory, - createRouter, -} from '@tanstack/react-router' +import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -import type { RouterHistory } from '@tanstack/react-router' +import type { RouterHistory } from '@tanstack/history' /** * Unlike the other scenarios, this app is mounted and unmounted in a loop, so * it must not register page-lifetime globals that have no dispose path: - * - the history is created explicitly and `destroy()`ed on unmount — the - * default per-router `createBrowserHistory()` monkey-patches - * `window.history.pushState`/`replaceState`, chaining one wrapper per - * router and degrading every later mount; + * - the harness injects and destroys a fresh memory history per mount; * - `scrollRestoration` stays off — enabling it registers per-router * document/window listeners that retain every router ever created. */ @@ -30,8 +23,7 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const history = createBrowserHistory() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { const router = createTestRouter(history) const reactRoot = createRoot(container) @@ -41,7 +33,6 @@ export function mountTestApp(container: HTMLElement) { router, unmount() { reactRoot.unmount() - history.destroy() }, } } diff --git a/benchmarks/client-nav/scenarios/mount/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/mount/solid/speed.bench.ts index 1bce4c6750b..eaf7f1ed340 100644 --- a/benchmarks/client-nav/scenarios/mount/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/mount/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-mount', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-mount loop (solid)', @@ -24,6 +21,7 @@ describe('client-mount', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/mount/solid/src/main.tsx b/benchmarks/client-nav/scenarios/mount/solid/src/main.tsx index 520d8cff898..bd29324154d 100644 --- a/benchmarks/client-nav/scenarios/mount/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/mount/solid/src/main.tsx @@ -1,19 +1,12 @@ import { render } from '@solidjs/web' -import { - RouterProvider, - createBrowserHistory, - createRouter, -} from '@tanstack/solid-router' +import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -import type { RouterHistory } from '@tanstack/solid-router' +import type { RouterHistory } from '@tanstack/history' /** * Unlike the other scenarios, this app is mounted and unmounted in a loop, so * it must not register page-lifetime globals that have no dispose path: - * - the history is created explicitly and `destroy()`ed on unmount — the - * default per-router `createBrowserHistory()` monkey-patches - * `window.history.pushState`/`replaceState`, chaining one wrapper per - * router and degrading every later mount; + * - the harness injects and destroys a fresh memory history per mount; * - `scrollRestoration` stays off — enabling it registers per-router * document/window listeners that retain every router ever created. */ @@ -30,8 +23,7 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const history = createBrowserHistory() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { const router = createTestRouter(history) const dispose = render(() => , container) @@ -40,7 +32,6 @@ export function mountTestApp(container: HTMLElement) { router, unmount() { dispose() - history.destroy() }, } } diff --git a/benchmarks/client-nav/scenarios/mount/solid/vite.config.ts b/benchmarks/client-nav/scenarios/mount/solid/vite.config.ts index 910d332f9c4..3d685e6a3fa 100644 --- a/benchmarks/client-nav/scenarios/mount/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/mount/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/mount/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/mount/vue/speed.bench.ts index d2e4b72c84f..f5538dd49c2 100644 --- a/benchmarks/client-nav/scenarios/mount/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/mount/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-mount', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-mount loop (vue)', @@ -24,6 +21,7 @@ describe('client-mount', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/mount/vue/src/main.tsx b/benchmarks/client-nav/scenarios/mount/vue/src/main.tsx index 6d238e28329..fc493c10a52 100644 --- a/benchmarks/client-nav/scenarios/mount/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/mount/vue/src/main.tsx @@ -1,19 +1,12 @@ import * as Vue from 'vue' -import { - RouterProvider, - createBrowserHistory, - createRouter, -} from '@tanstack/vue-router' +import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -import type { RouterHistory } from '@tanstack/vue-router' +import type { RouterHistory } from '@tanstack/history' /** * Unlike the other scenarios, this app is mounted and unmounted in a loop, so * it must not register page-lifetime globals that have no dispose path: - * - the history is created explicitly and `destroy()`ed on unmount — the - * default per-router `createBrowserHistory()` monkey-patches - * `window.history.pushState`/`replaceState`, chaining one wrapper per - * router and degrading every later mount; + * - the harness injects and destroys a fresh memory history per mount; * - `scrollRestoration` stays off — enabling it registers per-router * document/window listeners that retain every router ever created. */ @@ -30,8 +23,7 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const history = createBrowserHistory() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { const router = createTestRouter(history) const component = @@ -45,7 +37,6 @@ export function mountTestApp(container: HTMLElement) { router, unmount() { app.unmount() - history.destroy() }, } } diff --git a/benchmarks/client-nav/scenarios/nested-params/react/speed.bench.ts b/benchmarks/client-nav/scenarios/nested-params/react/speed.bench.ts index 321b1ad2305..3dfe93c1170 100644 --- a/benchmarks/client-nav/scenarios/nested-params/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/nested-params/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-nested-params', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-nested-params navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-nested-params', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/nested-params/react/src/main.tsx b/benchmarks/client-nav/scenarios/nested-params/react/src/main.tsx index ef0b99555c3..5febd6f7957 100644 --- a/benchmarks/client-nav/scenarios/nested-params/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/nested-params/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/nested-params/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/nested-params/solid/speed.bench.ts index d35980f6121..dc7ec11f6b1 100644 --- a/benchmarks/client-nav/scenarios/nested-params/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/nested-params/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-nested-params', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-nested-params navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-nested-params', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/nested-params/solid/src/main.tsx b/benchmarks/client-nav/scenarios/nested-params/solid/src/main.tsx index b43608e1919..f7148011f58 100644 --- a/benchmarks/client-nav/scenarios/nested-params/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/nested-params/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/nested-params/solid/vite.config.ts b/benchmarks/client-nav/scenarios/nested-params/solid/vite.config.ts index f5c9e13c0f8..5d77d22b66e 100644 --- a/benchmarks/client-nav/scenarios/nested-params/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/nested-params/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/nested-params/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/nested-params/vue/speed.bench.ts index fac8703c341..fcb336d1dbf 100644 --- a/benchmarks/client-nav/scenarios/nested-params/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/nested-params/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-nested-params', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-nested-params navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-nested-params', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/nested-params/vue/src/main.tsx b/benchmarks/client-nav/scenarios/nested-params/vue/src/main.tsx index c96d3f3a2e4..cae9b54f1dc 100644 --- a/benchmarks/client-nav/scenarios/nested-params/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/nested-params/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/preload/react/speed.bench.ts b/benchmarks/client-nav/scenarios/preload/react/speed.bench.ts index c869ebdcfb2..5b188a0a0b4 100644 --- a/benchmarks/client-nav/scenarios/preload/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/preload/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-preload', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-preload interaction loop (react)', @@ -24,6 +21,7 @@ describe('client-preload', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/preload/react/src/main.tsx b/benchmarks/client-nav/scenarios/preload/react/src/main.tsx index 6f8942c118f..395867f6742 100644 --- a/benchmarks/client-nav/scenarios/preload/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/preload/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -23,8 +25,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/preload/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/preload/solid/speed.bench.ts index ff2771985b2..267c9fd41dd 100644 --- a/benchmarks/client-nav/scenarios/preload/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/preload/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-preload', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-preload interaction loop (solid)', @@ -24,6 +21,7 @@ describe('client-preload', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/preload/solid/src/main.tsx b/benchmarks/client-nav/scenarios/preload/solid/src/main.tsx index 6e944942f85..ad7e065f2e9 100644 --- a/benchmarks/client-nav/scenarios/preload/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/preload/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -23,8 +25,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/preload/solid/vite.config.ts b/benchmarks/client-nav/scenarios/preload/solid/vite.config.ts index b542834469e..34a8fa1a634 100644 --- a/benchmarks/client-nav/scenarios/preload/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/preload/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/preload/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/preload/vue/speed.bench.ts index 2e790e92401..38a2e9e6640 100644 --- a/benchmarks/client-nav/scenarios/preload/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/preload/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-preload', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-preload interaction loop (vue)', @@ -24,6 +21,7 @@ describe('client-preload', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/preload/vue/src/main.tsx b/benchmarks/client-nav/scenarios/preload/vue/src/main.tsx index 1e325392a43..3da20b2cbf9 100644 --- a/benchmarks/client-nav/scenarios/preload/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/preload/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -23,8 +25,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/rewrites/react/speed.bench.ts b/benchmarks/client-nav/scenarios/rewrites/react/speed.bench.ts index 9b77a798385..8e79c6db7ef 100644 --- a/benchmarks/client-nav/scenarios/rewrites/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/rewrites/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-rewrites', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-rewrites navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-rewrites', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/rewrites/react/src/main.tsx b/benchmarks/client-nav/scenarios/rewrites/react/src/main.tsx index 47746bb0fbd..28020ce3732 100644 --- a/benchmarks/client-nav/scenarios/rewrites/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/rewrites/react/src/main.tsx @@ -1,11 +1,13 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' import { basepath, localeRewrite } from '../../shared' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, basepath, rewrite: localeRewrite, scrollRestoration: true, @@ -23,8 +25,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/rewrites/shared.ts b/benchmarks/client-nav/scenarios/rewrites/shared.ts index c45b15d503c..0ca0a7ceb9c 100644 --- a/benchmarks/client-nav/scenarios/rewrites/shared.ts +++ b/benchmarks/client-nav/scenarios/rewrites/shared.ts @@ -8,6 +8,7 @@ * parsing the committed location. */ import type { ScenarioStep } from '../harness' +import type { RouterHistory } from '@tanstack/history' export const basepath = '/app' export const defaultLocale = 'en' @@ -51,7 +52,7 @@ interface StepDef { testId: string /** Internal router pathname expected after the step. */ routerPath: string - /** External window.location pathname expected after the step. */ + /** External history pathname expected after the step. */ windowPath: string } @@ -70,7 +71,11 @@ export const steps: ReadonlyArray = stepDefs.map( (step) => step.testId, ) -export function assertStepResult(stepIndex: number, container: HTMLElement) { +export function assertStepResult( + stepIndex: number, + container: HTMLElement, + history: RouterHistory, +) { const expected = stepDefs[stepIndex]! const marker = container.querySelector('[data-testid="loc"]') const routerPath = marker?.textContent @@ -81,9 +86,9 @@ export function assertStepResult(stepIndex: number, container: HTMLElement) { ) } - if (window.location.pathname !== expected.windowPath) { + if (history.location.pathname !== expected.windowPath) { throw new Error( - `Expected window pathname "${expected.windowPath}" after step ${stepIndex}, received "${window.location.pathname}"`, + `Expected history pathname "${expected.windowPath}" after step ${stepIndex}, received "${history.location.pathname}"`, ) } } diff --git a/benchmarks/client-nav/scenarios/rewrites/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/rewrites/solid/speed.bench.ts index 30d3436071c..cf70bcaa401 100644 --- a/benchmarks/client-nav/scenarios/rewrites/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/rewrites/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-rewrites', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-rewrites navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-rewrites', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/rewrites/solid/src/main.tsx b/benchmarks/client-nav/scenarios/rewrites/solid/src/main.tsx index 9e7fbfe87fb..9f34e66a66e 100644 --- a/benchmarks/client-nav/scenarios/rewrites/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/rewrites/solid/src/main.tsx @@ -1,11 +1,13 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' import { basepath, localeRewrite } from '../../shared' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, basepath, rewrite: localeRewrite, scrollRestoration: true, @@ -23,8 +25,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/rewrites/solid/vite.config.ts b/benchmarks/client-nav/scenarios/rewrites/solid/vite.config.ts index 41613c2ad4e..26fb43fd688 100644 --- a/benchmarks/client-nav/scenarios/rewrites/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/rewrites/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/rewrites/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/rewrites/vue/speed.bench.ts index c10b8723bbd..2dc9eb2679c 100644 --- a/benchmarks/client-nav/scenarios/rewrites/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/rewrites/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-rewrites', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-rewrites navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-rewrites', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/rewrites/vue/src/main.tsx b/benchmarks/client-nav/scenarios/rewrites/vue/src/main.tsx index 83e430038d7..6695e82dbba 100644 --- a/benchmarks/client-nav/scenarios/rewrites/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/rewrites/vue/src/main.tsx @@ -1,11 +1,13 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' import { basepath, localeRewrite } from '../../shared' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, basepath, rewrite: localeRewrite, scrollRestoration: true, @@ -23,8 +25,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/route-tree-scale/react/speed.bench.ts b/benchmarks/client-nav/scenarios/route-tree-scale/react/speed.bench.ts index 50cc26d5d6b..337ba35b736 100644 --- a/benchmarks/client-nav/scenarios/route-tree-scale/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/route-tree-scale/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-route-tree-scale', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-route-tree-scale navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-route-tree-scale', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/route-tree-scale/react/src/main.tsx b/benchmarks/client-nav/scenarios/route-tree-scale/react/src/main.tsx index ef0b99555c3..5febd6f7957 100644 --- a/benchmarks/client-nav/scenarios/route-tree-scale/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/route-tree-scale/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/route-tree-scale/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/route-tree-scale/solid/speed.bench.ts index 3d7a22a0272..545b5016174 100644 --- a/benchmarks/client-nav/scenarios/route-tree-scale/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/route-tree-scale/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-route-tree-scale', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-route-tree-scale navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-route-tree-scale', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/route-tree-scale/solid/src/main.tsx b/benchmarks/client-nav/scenarios/route-tree-scale/solid/src/main.tsx index b43608e1919..f7148011f58 100644 --- a/benchmarks/client-nav/scenarios/route-tree-scale/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/route-tree-scale/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/route-tree-scale/solid/vite.config.ts b/benchmarks/client-nav/scenarios/route-tree-scale/solid/vite.config.ts index dd0bd234e0b..132734617bb 100644 --- a/benchmarks/client-nav/scenarios/route-tree-scale/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/route-tree-scale/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/route-tree-scale/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/route-tree-scale/vue/speed.bench.ts index a767b8d220d..93652315795 100644 --- a/benchmarks/client-nav/scenarios/route-tree-scale/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/route-tree-scale/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-route-tree-scale', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-route-tree-scale navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-route-tree-scale', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/route-tree-scale/vue/src/main.tsx b/benchmarks/client-nav/scenarios/route-tree-scale/vue/src/main.tsx index c96d3f3a2e4..cae9b54f1dc 100644 --- a/benchmarks/client-nav/scenarios/route-tree-scale/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/route-tree-scale/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -20,8 +22,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/scenarios/search-params/react/speed.bench.ts b/benchmarks/client-nav/scenarios/search-params/react/speed.bench.ts index c534611bd00..5bdd994e32b 100644 --- a/benchmarks/client-nav/scenarios/search-params/react/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/search-params/react/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-search-params', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-search-params navigation loop (react)', @@ -24,6 +21,7 @@ describe('client-search-params', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/search-params/react/src/main.tsx b/benchmarks/client-nav/scenarios/search-params/react/src/main.tsx index a68ef7bbb20..b10d53554be 100644 --- a/benchmarks/client-nav/scenarios/search-params/react/src/main.tsx +++ b/benchmarks/client-nav/scenarios/search-params/react/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { RouterProvider, createRouter } from '@tanstack/react-router' import { createRoot } from 'react-dom/client' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -21,8 +23,8 @@ declare module '@tanstack/react-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const reactRoot = createRoot(container) reactRoot.render() diff --git a/benchmarks/client-nav/scenarios/search-params/solid/speed.bench.ts b/benchmarks/client-nav/scenarios/search-params/solid/speed.bench.ts index df6a24dc156..ea0baa10988 100644 --- a/benchmarks/client-nav/scenarios/search-params/solid/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/search-params/solid/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-search-params', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-search-params navigation loop (solid)', @@ -24,6 +21,7 @@ describe('client-search-params', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/search-params/solid/src/main.tsx b/benchmarks/client-nav/scenarios/search-params/solid/src/main.tsx index 16814f03f72..714d5a00988 100644 --- a/benchmarks/client-nav/scenarios/search-params/solid/src/main.tsx +++ b/benchmarks/client-nav/scenarios/search-params/solid/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import { render } from '@solidjs/web' import { RouterProvider, createRouter } from '@tanstack/solid-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -21,8 +23,8 @@ declare module '@tanstack/solid-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const unmount = render(() => , container) diff --git a/benchmarks/client-nav/scenarios/search-params/solid/vite.config.ts b/benchmarks/client-nav/scenarios/search-params/solid/vite.config.ts index c2f4b328062..4ed2807271a 100644 --- a/benchmarks/client-nav/scenarios/search-params/solid/vite.config.ts +++ b/benchmarks/client-nav/scenarios/search-params/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' diff --git a/benchmarks/client-nav/scenarios/search-params/vue/speed.bench.ts b/benchmarks/client-nav/scenarios/search-params/vue/speed.bench.ts index 0b394bbe274..c82efd49c98 100644 --- a/benchmarks/client-nav/scenarios/search-params/vue/speed.bench.ts +++ b/benchmarks/client-nav/scenarios/search-params/vue/speed.bench.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeAll, bench, describe } from 'vitest' +import { afterEach, beforeEach, bench, describe } from 'vitest' import { benchOptions, ticksPerIteration } from '../shared' import { setup } from './setup' @@ -6,17 +6,14 @@ describe('client-search-params', () => { const test = setup() /** - * Running `vitest bench` ignores "suite hooks" like `beforeAll` and `afterAll`, - * so we use tinybench's `setup` and `teardown` options to run our setup and teardown logic. - * - * But CodSpeed calls the benchmarked function directly, bypassing `setup` and `teardown`, - * but it does support `beforeAll` and `afterAll`. - * - * So it looks like we're setting up in duplicate, but in reality, it's only running once per environment, as intended. + * Running `vitest bench` ignores suite hooks, so Tinybench uses the `setup` + * and `teardown` options below. CodSpeed bypasses those options but supports + * `beforeEach` and `afterEach`. Only one lifecycle path runs in either + * environment, and every measured invocation receives fresh application state. */ - beforeAll(test.before) - afterAll(test.after) + beforeEach(test.before) + afterEach(test.after) bench( 'client-search-params navigation loop (vue)', @@ -24,6 +21,7 @@ describe('client-search-params', () => { for (let i = 0; i < ticksPerIteration; i++) { await test.tick() } + await test.finishBatch() }, { ...benchOptions, diff --git a/benchmarks/client-nav/scenarios/search-params/vue/src/main.tsx b/benchmarks/client-nav/scenarios/search-params/vue/src/main.tsx index 1454b8d5474..65bade775c4 100644 --- a/benchmarks/client-nav/scenarios/search-params/vue/src/main.tsx +++ b/benchmarks/client-nav/scenarios/search-params/vue/src/main.tsx @@ -1,10 +1,12 @@ +import type { RouterHistory } from '@tanstack/history' import * as Vue from 'vue' import { RouterProvider, createRouter } from '@tanstack/vue-router' import { routeTree } from './routeTree.gen' -export function createTestRouter() { +export function createTestRouter(history: RouterHistory) { return createRouter({ routeTree, + history, scrollRestoration: true, // Key the scroll-restoration cache by pathname instead of the default // random per-entry location key: with push navigations the default mints @@ -21,8 +23,8 @@ declare module '@tanstack/vue-router' { } } -export function mountTestApp(container: HTMLElement) { - const router = createTestRouter() +export function mountTestApp(container: HTMLElement, history: RouterHistory) { + const router = createTestRouter(history) const component = const app = Vue.createApp({ diff --git a/benchmarks/client-nav/solid/vite.config.ts b/benchmarks/client-nav/solid/vite.config.ts index bd11fe8de94..c39b155a591 100644 --- a/benchmarks/client-nav/solid/vite.config.ts +++ b/benchmarks/client-nav/solid/vite.config.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import codspeedPlugin from '@codspeed/vitest-plugin' // Anchor the project root to the package directory so this config resolves diff --git a/benchmarks/memory/client/package.json b/benchmarks/memory/client/package.json index 26b4feb9a10..e425a76e752 100644 --- a/benchmarks/memory/client/package.json +++ b/benchmarks/memory/client/package.json @@ -12,20 +12,21 @@ "#memory-client/lifecycle": "./lifecycle.ts" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@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.32", + "solid-js": "^2.0.0-rc.0", "vue": "^3.5.16" }, "devDependencies": { "@codspeed/vitest-plugin": "^5.5.0", "@datadog/pprof": "^5.13.2", "@platformatic/flame": "^1.6.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@testing-library/react": "^16.2.0", "@vitejs/plugin-react": "^6.0.1", "@vitejs/plugin-vue": "^6.0.5", @@ -35,7 +36,6 @@ "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vitest": "^4.1.4" }, "nx": { diff --git a/benchmarks/memory/client/scenarios/interrupted-navigations/solid/vite.config.ts b/benchmarks/memory/client/scenarios/interrupted-navigations/solid/vite.config.ts index e710e0fd120..2d508509872 100644 --- a/benchmarks/memory/client/scenarios/interrupted-navigations/solid/vite.config.ts +++ b/benchmarks/memory/client/scenarios/interrupted-navigations/solid/vite.config.ts @@ -1,7 +1,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/client/scenarios/loader-data-retention/solid/vite.config.ts b/benchmarks/memory/client/scenarios/loader-data-retention/solid/vite.config.ts index 58d6b77acce..ca34d647251 100644 --- a/benchmarks/memory/client/scenarios/loader-data-retention/solid/vite.config.ts +++ b/benchmarks/memory/client/scenarios/loader-data-retention/solid/vite.config.ts @@ -1,7 +1,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/client/scenarios/mount-unmount/solid/vite.config.ts b/benchmarks/memory/client/scenarios/mount-unmount/solid/vite.config.ts index 5f0ab26252a..dd42b60b721 100644 --- a/benchmarks/memory/client/scenarios/mount-unmount/solid/vite.config.ts +++ b/benchmarks/memory/client/scenarios/mount-unmount/solid/vite.config.ts @@ -1,7 +1,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/client/scenarios/navigation-churn/solid/vite.config.ts b/benchmarks/memory/client/scenarios/navigation-churn/solid/vite.config.ts index 6b6735891a7..5cf214f6464 100644 --- a/benchmarks/memory/client/scenarios/navigation-churn/solid/vite.config.ts +++ b/benchmarks/memory/client/scenarios/navigation-churn/solid/vite.config.ts @@ -1,7 +1,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/client/scenarios/preload-churn/solid/vite.config.ts b/benchmarks/memory/client/scenarios/preload-churn/solid/vite.config.ts index c86a6fcbb3a..d6e078ce844 100644 --- a/benchmarks/memory/client/scenarios/preload-churn/solid/vite.config.ts +++ b/benchmarks/memory/client/scenarios/preload-churn/solid/vite.config.ts @@ -1,7 +1,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/client/scenarios/unique-location-churn/solid/vite.config.ts b/benchmarks/memory/client/scenarios/unique-location-churn/solid/vite.config.ts index d4acf0019aa..76cffe7b620 100644 --- a/benchmarks/memory/client/scenarios/unique-location-churn/solid/vite.config.ts +++ b/benchmarks/memory/client/scenarios/unique-location-churn/solid/vite.config.ts @@ -1,7 +1,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/server/package.json b/benchmarks/memory/server/package.json index 27177630014..f00caa49272 100644 --- a/benchmarks/memory/server/package.json +++ b/benchmarks/memory/server/package.json @@ -11,7 +11,7 @@ "#memory-server/flame-runner": "./flame-runner.ts" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/react-router": "workspace:*", "@tanstack/react-start": "workspace:*", "@tanstack/solid-router": "workspace:*", @@ -20,19 +20,19 @@ "@tanstack/vue-start": "workspace:*", "react": "^19.0.0", "react-dom": "^19.0.0", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "vue": "^3.5.16" }, "devDependencies": { "@codspeed/vitest-plugin": "^5.5.0", "@datadog/pprof": "^5.13.2", "@platformatic/flame": "^1.6.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@vitejs/plugin-react": "^6.0.1", "@vitejs/plugin-vue-jsx": "^5.1.5", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vitest": "^4.1.4" }, "nx": { diff --git a/benchmarks/memory/server/scenarios/aborted-requests/solid/vite.config.ts b/benchmarks/memory/server/scenarios/aborted-requests/solid/vite.config.ts index 5ee4e152afc..014cae1bbbe 100644 --- a/benchmarks/memory/server/scenarios/aborted-requests/solid/vite.config.ts +++ b/benchmarks/memory/server/scenarios/aborted-requests/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/server/scenarios/error-paths/solid/vite.config.ts b/benchmarks/memory/server/scenarios/error-paths/solid/vite.config.ts index 401d1e5f25f..4997cd0a5fe 100644 --- a/benchmarks/memory/server/scenarios/error-paths/solid/vite.config.ts +++ b/benchmarks/memory/server/scenarios/error-paths/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/server/scenarios/peak-large-page/solid/vite.config.ts b/benchmarks/memory/server/scenarios/peak-large-page/solid/vite.config.ts index 27d4dd65f71..31a3569c6a6 100644 --- a/benchmarks/memory/server/scenarios/peak-large-page/solid/vite.config.ts +++ b/benchmarks/memory/server/scenarios/peak-large-page/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/server/scenarios/request-churn/solid/vite.config.ts b/benchmarks/memory/server/scenarios/request-churn/solid/vite.config.ts index fbf8df94911..0cbe915c2a3 100644 --- a/benchmarks/memory/server/scenarios/request-churn/solid/vite.config.ts +++ b/benchmarks/memory/server/scenarios/request-churn/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/server/scenarios/serialization-payload/solid/vite.config.ts b/benchmarks/memory/server/scenarios/serialization-payload/solid/vite.config.ts index 926646ee126..d239ff2da2d 100644 --- a/benchmarks/memory/server/scenarios/serialization-payload/solid/vite.config.ts +++ b/benchmarks/memory/server/scenarios/serialization-payload/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/server/scenarios/server-fn-churn/solid/vite.config.ts b/benchmarks/memory/server/scenarios/server-fn-churn/solid/vite.config.ts index 8d6d226e97c..3c1df879882 100644 --- a/benchmarks/memory/server/scenarios/server-fn-churn/solid/vite.config.ts +++ b/benchmarks/memory/server/scenarios/server-fn-churn/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/memory/server/scenarios/streaming-peak/solid/vite.config.ts b/benchmarks/memory/server/scenarios/streaming-peak/solid/vite.config.ts index 18bf5b2d044..39569ef3ae9 100644 --- a/benchmarks/memory/server/scenarios/streaming-peak/solid/vite.config.ts +++ b/benchmarks/memory/server/scenarios/streaming-peak/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/bench-utils.test.ts b/benchmarks/ssr/bench-utils.test.ts new file mode 100644 index 00000000000..c6a520447b5 --- /dev/null +++ b/benchmarks/ssr/bench-utils.test.ts @@ -0,0 +1,145 @@ +import { describe, expect, it } from 'vitest' +import { buildRequestSequences, runRequestLoop } from './bench-utils' +import type { StartRequestHandler } from './bench-utils' + +function deferred() { + let resolve = () => {} + const promise = new Promise((resolvePromise) => { + resolve = resolvePromise + }) + return { promise, resolve } +} + +describe('runRequestLoop', () => { + it('caps fixed concurrency and waits for every streaming body', async () => { + const concurrency = 4 + const totalRequests = 20 + const firstWaveStarted = deferred() + let builtRequests = 0 + let executedRequests = 0 + let validatedResponses = 0 + let finishedBodies = 0 + let inFlightRequests = 0 + let maximumInFlightRequests = 0 + + const handler: StartRequestHandler = { + fetch() { + expect(builtRequests).toBe(totalRequests) + executedRequests += 1 + inFlightRequests += 1 + maximumInFlightRequests = Math.max( + maximumInFlightRequests, + inFlightRequests, + ) + + if (inFlightRequests === concurrency) { + firstWaveStarted.resolve() + } + + const body = new ReadableStream({ + async start(controller) { + await firstWaveStarted.promise + controller.enqueue(new Uint8Array([1])) + controller.close() + finishedBodies += 1 + inFlightRequests -= 1 + }, + }) + + return new Response(body) + }, + } + + await runRequestLoop(handler, { + seed: 123, + concurrency, + totalRequests, + buildRequest: (_random, index) => { + builtRequests += 1 + return new Request(`http://localhost/request/${index}`) + }, + validateResponse: () => { + validatedResponses += 1 + }, + }) + + expect(builtRequests).toBe(totalRequests) + expect(executedRequests).toBe(totalRequests) + expect(validatedResponses).toBe(totalRequests) + expect(maximumInFlightRequests).toBe(concurrency) + expect(inFlightRequests).toBe(0) + expect(finishedBodies).toBe(totalRequests) + }) + + it('builds identical predetermined worker sequences from identical seeds', () => { + const buildSequences = (seed: number) => + buildRequestSequences({ + seed, + concurrency: 4, + totalRequests: 12, + buildRequest: (random, index) => + new Request( + `http://localhost/request/${index}?value=${random().toString(36)}`, + ), + }).map((requests) => requests.map((request) => request.url)) + + const first = buildSequences(456) + const second = buildSequences(456) + + expect(second).toEqual(first) + expect(first.map((requests) => requests.map(requestIndex))).toEqual([ + [0, 4, 8], + [1, 5, 9], + [2, 6, 10], + [3, 7, 11], + ]) + }) + + it('drains every started body before reporting a worker failure', async () => { + const concurrency = 4 + const firstWaveStarted = deferred() + let executedRequests = 0 + let finishedBodies = 0 + let inFlightRequests = 0 + + const handler: StartRequestHandler = { + fetch(request) { + executedRequests += 1 + inFlightRequests += 1 + if (inFlightRequests === concurrency) { + firstWaveStarted.resolve() + } + + const body = new ReadableStream({ + async start(controller) { + await firstWaveStarted.promise + controller.close() + finishedBodies += 1 + inFlightRequests -= 1 + }, + }) + + return new Response(body, { + status: request.url.endsWith('/0') ? 500 : 200, + }) + }, + } + + await expect( + runRequestLoop(handler, { + seed: 789, + concurrency, + totalRequests: 12, + buildRequest: (_random, index) => + new Request(`http://localhost/request/${index}`), + }), + ).rejects.toThrow('non-200 status 500') + + expect(finishedBodies).toBe(executedRequests) + expect(inFlightRequests).toBe(0) + }) +}) + +function requestIndex(url: string) { + return Number(new URL(url).pathname.split('/').at(-1)) +} diff --git a/benchmarks/ssr/bench-utils.ts b/benchmarks/ssr/bench-utils.ts index 353c56cb4b1..7a54fce897c 100644 --- a/benchmarks/ssr/bench-utils.ts +++ b/benchmarks/ssr/bench-utils.ts @@ -9,7 +9,8 @@ export interface RunSsrRequestLoopOptions { export interface RunRequestLoopOptions { seed: number - iterations?: number + concurrency: number + totalRequests: number buildRequest: (random: () => number, index: number) => Request validateResponse?: (response: Response, request: Request) => void } @@ -99,13 +100,18 @@ export async function runRequestLoop( handler: StartRequestHandler, { seed, - iterations = 10, + concurrency, + totalRequests, buildRequest, validateResponse, }: RunRequestLoopOptions, ) { - const random = createDeterministicRandom(seed) - const pendingBodyReads: Array> = [] + const requestSequences = buildRequestSequences({ + seed, + concurrency, + totalRequests, + buildRequest, + }) const validate = validateResponse ?? ((response: Response, request: Request) => { @@ -116,20 +122,84 @@ export async function runRequestLoop( } }) - for (let index = 0; index < iterations; index++) { - const request = buildRequest(random, index) - const response = await handler.fetch(request) + let startWorkers = () => {} + const startBarrier = new Promise((resolve) => { + startWorkers = resolve + }) - try { - validate(response, request) - } catch (error) { - await Promise.allSettled(pendingBodyReads) + const workers = requestSequences.map(async (requests) => { + await startBarrier - throw error + for (const request of requests) { + const response = await handler.fetch(request) + let validationFailure: { error: unknown } | undefined + + try { + validate(response, request) + } catch (error) { + validationFailure = { error } + } + + await drainResponse(response) + + if (validationFailure) { + throw validationFailure.error + } } + }) - pendingBodyReads.push(drainResponse(response)) + startWorkers() + const results = await Promise.allSettled(workers) + const failedWorker = results.find( + (result): result is PromiseRejectedResult => result.status === 'rejected', + ) + + if (failedWorker) { + throw failedWorker.reason } +} - await Promise.all(pendingBodyReads) +export type BuildRequestSequencesOptions = Pick< + RunRequestLoopOptions, + 'seed' | 'concurrency' | 'totalRequests' | 'buildRequest' +> + +/** + * Build the entire seeded workload before any request starts, then partition + * it round-robin so completion timing can never change a worker's next input. + */ +export function buildRequestSequences({ + seed, + concurrency, + totalRequests, + buildRequest, +}: BuildRequestSequencesOptions): Array> { + assertPositiveInteger('concurrency', concurrency) + assertPositiveInteger('totalRequests', totalRequests) + + if (concurrency > totalRequests) { + throw new RangeError( + `concurrency (${concurrency}) cannot exceed totalRequests (${totalRequests})`, + ) + } + + const random = createDeterministicRandom(seed) + const requestSequences = Array.from( + { length: concurrency }, + () => new Array(), + ) + + for (let index = 0; index < totalRequests; index++) { + requestSequences[index % concurrency]!.push(buildRequest(random, index)) + } + + return requestSequences +} + +function assertPositiveInteger(name: string, value: number) { + if (!Number.isSafeInteger(value) || value < 1) { + throw new RangeError( + `${name} must be a positive integer; received ${value}`, + ) + } } diff --git a/benchmarks/ssr/package.json b/benchmarks/ssr/package.json index 0b09bf385a8..e52f8d67ae4 100644 --- a/benchmarks/ssr/package.json +++ b/benchmarks/ssr/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/react-router": "workspace:^", "@tanstack/react-start": "workspace:^", "@tanstack/solid-router": "workspace:^", @@ -12,18 +12,18 @@ "@tanstack/vue-start": "workspace:^", "react": "^19.0.0", "react-dom": "^19.0.0", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "vue": "^3.5.16" }, "devDependencies": { "@codspeed/vitest-plugin": "^5.5.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@vitejs/plugin-react": "^6.0.1", "@vitejs/plugin-vue-jsx": "^5.1.5", - "seroval": "^1.5.4", + "seroval": "^1.6.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vitest": "^4.1.4" }, "nx": { @@ -119,6 +119,13 @@ "cwd": "benchmarks/ssr" } }, + "test:unit": { + "executor": "nx:run-commands", + "options": { + "command": "vitest run --config ./vitest.unit.config.ts", + "cwd": "benchmarks/ssr" + } + }, "test:perf:react": { "executor": "nx:run-commands", "cache": false, @@ -153,7 +160,11 @@ } }, "test:types": { - "executor": "nx:noop", + "executor": "nx:run-commands", + "options": { + "command": "tsc -p ./tsconfig.json --noEmit", + "cwd": "benchmarks/ssr" + }, "dependsOn": [ { "projects": [ diff --git a/benchmarks/ssr/scenarios/assets/shared.ts b/benchmarks/ssr/scenarios/assets/shared.ts index 3974988698e..ec811794e33 100644 --- a/benchmarks/ssr/scenarios/assets/shared.ts +++ b/benchmarks/ssr/scenarios/assets/shared.ts @@ -7,8 +7,8 @@ export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad const origin = 'http://localhost' const cdnOrigin = 'https://cdn.example.com' -const inlineCssLoopIterations = 25 -const linkedCssLoopIterations = 30 +const inlineCssLoopTotalRequests = 32 +const linkedCssLoopTotalRequests = 32 const inlineRequestInit = { method: 'GET', @@ -41,7 +41,8 @@ function buildAssetsRequest(random: () => number, requestInit: RequestInit) { export function runAssetsInlineLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: inlineCssLoopIterations, + concurrency: 16, + totalRequests: inlineCssLoopTotalRequests, buildRequest: (random) => buildAssetsRequest(random, inlineRequestInit), }) } @@ -49,7 +50,8 @@ export function runAssetsInlineLoop(handler: StartRequestHandler) { export function runAssetsLinkedControlLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: linkedCssLoopIterations, + concurrency: 16, + totalRequests: linkedCssLoopTotalRequests, buildRequest: (random) => buildAssetsRequest(random, linkedRequestInit), }) } diff --git a/benchmarks/ssr/scenarios/assets/solid/vite.config.ts b/benchmarks/ssr/scenarios/assets/solid/vite.config.ts index 788ac1f5b85..48340b691ef 100644 --- a/benchmarks/ssr/scenarios/assets/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/assets/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/before-load/shared-bench.ts b/benchmarks/ssr/scenarios/before-load/shared-bench.ts index 39579fc8180..cf3a02f114b 100644 --- a/benchmarks/ssr/scenarios/before-load/shared-bench.ts +++ b/benchmarks/ssr/scenarios/before-load/shared-bench.ts @@ -5,7 +5,7 @@ import type { StartRequestHandler } from '../../bench-utils' export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad -const beforeLoadLoopIterations = 30 +const beforeLoadLoopTotalRequests = 32 const requestInit = { method: 'GET', @@ -57,7 +57,8 @@ export const beforeLoadBenchOptions = { export function runBeforeLoadLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: beforeLoadLoopIterations, + concurrency: 16, + totalRequests: beforeLoadLoopTotalRequests, buildRequest: buildBeforeLoadRequest, }) } diff --git a/benchmarks/ssr/scenarios/before-load/solid/vite.config.ts b/benchmarks/ssr/scenarios/before-load/solid/vite.config.ts index ea0177e0597..ebc2576199a 100644 --- a/benchmarks/ssr/scenarios/before-load/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/before-load/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/control-flow/shared.ts b/benchmarks/ssr/scenarios/control-flow/shared.ts index 7b796837850..307665d59da 100644 --- a/benchmarks/ssr/scenarios/control-flow/shared.ts +++ b/benchmarks/ssr/scenarios/control-flow/shared.ts @@ -5,11 +5,11 @@ import type { StartRequestHandler } from '../../bench-utils' export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad -const redirectLoopIterations = 100 -const notFoundLoopIterations = 45 -const errorLoopIterations = 45 -const unmatchedLoopIterations = 60 -const routeHeadersLoopIterations = 50 +const redirectLoopTotalRequests = 112 +const notFoundLoopTotalRequests = 48 +const errorLoopTotalRequests = 48 +const unmatchedLoopTotalRequests = 64 +const routeHeadersLoopTotalRequests = 64 // Pinned to the current built handler responses for these control-flow routes. const OK_STATUS = 200 @@ -124,7 +124,8 @@ function validateRouteHeadersResponse(response: Response, request: Request) { export function runRedirectLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: redirectLoopIterations, + concurrency: 16, + totalRequests: redirectLoopTotalRequests, buildRequest: buildRedirectRequest, validateResponse: validateRedirectResponse, }) @@ -133,7 +134,8 @@ export function runRedirectLoop(handler: StartRequestHandler) { export function runNotFoundLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: notFoundLoopIterations, + concurrency: 16, + totalRequests: notFoundLoopTotalRequests, buildRequest: buildNotFoundRequest, validateResponse: validateNotFoundResponse, }) @@ -142,7 +144,8 @@ export function runNotFoundLoop(handler: StartRequestHandler) { export function runErrorLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: errorLoopIterations, + concurrency: 16, + totalRequests: errorLoopTotalRequests, buildRequest: buildErrorRequest, validateResponse: validateErrorResponse, }) @@ -151,7 +154,8 @@ export function runErrorLoop(handler: StartRequestHandler) { export function runUnmatchedLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: unmatchedLoopIterations, + concurrency: 16, + totalRequests: unmatchedLoopTotalRequests, buildRequest: buildUnmatchedRequest, validateResponse: validateUnmatchedResponse, }) @@ -160,7 +164,8 @@ export function runUnmatchedLoop(handler: StartRequestHandler) { export function runRouteHeadersLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: routeHeadersLoopIterations, + concurrency: 16, + totalRequests: routeHeadersLoopTotalRequests, buildRequest: buildRouteHeadersRequest, validateResponse: validateRouteHeadersResponse, }) diff --git a/benchmarks/ssr/scenarios/control-flow/solid/vite.config.ts b/benchmarks/ssr/scenarios/control-flow/solid/vite.config.ts index 0bcd175f606..6c309b1cce9 100644 --- a/benchmarks/ssr/scenarios/control-flow/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/control-flow/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/global-middleware/bench.ts b/benchmarks/ssr/scenarios/global-middleware/bench.ts index cd4dc662e3b..a89d03cabb7 100644 --- a/benchmarks/ssr/scenarios/global-middleware/bench.ts +++ b/benchmarks/ssr/scenarios/global-middleware/bench.ts @@ -54,9 +54,9 @@ const postHeaders = { accept: acceptHeader, 'content-type': 'application/json', } satisfies HeadersInit -const documentLoopIterations = 50 -const serverFnLoopIterations = 125 -const serverRouteLoopIterations = 250 +const documentLoopTotalRequests = 64 +const serverFnLoopTotalRequests = 128 +const serverRouteLoopTotalRequests = 256 export const globalMiddlewareBenchOptions = { warmupIterations: 100, @@ -263,7 +263,8 @@ export async function assertGlobalMiddlewareScenario( export function runGlobalMiddlewareDocumentLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: documentLoopIterations, + concurrency: 16, + totalRequests: documentLoopTotalRequests, buildRequest: buildDocumentRequest, }) } @@ -274,7 +275,8 @@ export function runGlobalMiddlewareServerFnLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnLoopIterations, + concurrency: 16, + totalRequests: serverFnLoopTotalRequests, buildRequest: (_random, index) => buildPostRequest(context.urls, context.bodies, index), }) @@ -285,7 +287,8 @@ export function runGlobalMiddlewareServerRouteLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverRouteLoopIterations, + concurrency: 16, + totalRequests: serverRouteLoopTotalRequests, buildRequest: buildServerRouteRequest, }) } diff --git a/benchmarks/ssr/scenarios/global-middleware/solid/vite.config.ts b/benchmarks/ssr/scenarios/global-middleware/solid/vite.config.ts index e8af6933edc..a1e0c3227cc 100644 --- a/benchmarks/ssr/scenarios/global-middleware/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/global-middleware/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/head/shared.ts b/benchmarks/ssr/scenarios/head/shared.ts index 26e084b1565..033ca47c22d 100644 --- a/benchmarks/ssr/scenarios/head/shared.ts +++ b/benchmarks/ssr/scenarios/head/shared.ts @@ -7,7 +7,7 @@ export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad const origin = 'http://localhost' const dedupedMetaName = 'head-benchmark-shared' -const headLoopIterations = 25 +const headLoopTotalRequests = 32 const requestInit = { method: 'GET', @@ -32,7 +32,8 @@ function buildHeadRequest(random: () => number) { export function runHeadLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: headLoopIterations, + concurrency: 16, + totalRequests: headLoopTotalRequests, buildRequest: buildHeadRequest, }) } diff --git a/benchmarks/ssr/scenarios/head/solid/vite.config.ts b/benchmarks/ssr/scenarios/head/solid/vite.config.ts index f7b97a44d13..f59b96e3bca 100644 --- a/benchmarks/ssr/scenarios/head/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/head/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/loaders/shared-bench.ts b/benchmarks/ssr/scenarios/loaders/shared-bench.ts index 2b1e9b47499..f52c51dccdb 100644 --- a/benchmarks/ssr/scenarios/loaders/shared-bench.ts +++ b/benchmarks/ssr/scenarios/loaders/shared-bench.ts @@ -5,7 +5,7 @@ import type { StartRequestHandler } from '../../bench-utils' export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad -const loadersLoopIterations = 15 +const loadersLoopTotalRequests = 16 const requestInit = { method: 'GET', @@ -68,7 +68,8 @@ export const benchOptions = { export function runLoadersLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: loadersLoopIterations, + concurrency: 16, + totalRequests: loadersLoopTotalRequests, buildRequest: buildLoaderRequest, }) } diff --git a/benchmarks/ssr/scenarios/loaders/solid/vite.config.ts b/benchmarks/ssr/scenarios/loaders/solid/vite.config.ts index 527ca977c53..b62c48ede1b 100644 --- a/benchmarks/ssr/scenarios/loaders/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/loaders/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/rewrites/shared.ts b/benchmarks/ssr/scenarios/rewrites/shared.ts index a8f2e3279b3..9b29bc02493 100644 --- a/benchmarks/ssr/scenarios/rewrites/shared.ts +++ b/benchmarks/ssr/scenarios/rewrites/shared.ts @@ -6,8 +6,8 @@ export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad const origin = 'http://localhost' -const localizedLoopIterations = 25 -const passthroughLoopIterations = 25 +const localizedLoopTotalRequests = 32 +const passthroughLoopTotalRequests = 32 const requestInit = { method: 'GET', @@ -39,7 +39,8 @@ function buildPassthroughRequest(random: () => number) { export function runRewriteLocalizedLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: localizedLoopIterations, + concurrency: 16, + totalRequests: localizedLoopTotalRequests, buildRequest: buildLocalizedRequest, }) } @@ -47,7 +48,8 @@ export function runRewriteLocalizedLoop(handler: StartRequestHandler) { export function runRewritePassthroughLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: passthroughLoopIterations, + concurrency: 16, + totalRequests: passthroughLoopTotalRequests, buildRequest: buildPassthroughRequest, }) } diff --git a/benchmarks/ssr/scenarios/rewrites/solid/vite.config.ts b/benchmarks/ssr/scenarios/rewrites/solid/vite.config.ts index ae9f925cb72..28d4aace953 100644 --- a/benchmarks/ssr/scenarios/rewrites/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/rewrites/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/selective-ssr/shared-bench.ts b/benchmarks/ssr/scenarios/selective-ssr/shared-bench.ts index bf97d5d63eb..5b2530ccab2 100644 --- a/benchmarks/ssr/scenarios/selective-ssr/shared-bench.ts +++ b/benchmarks/ssr/scenarios/selective-ssr/shared-bench.ts @@ -5,7 +5,7 @@ import type { StartRequestHandler } from '../../bench-utils' export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad -const selectiveLoopIterations = 20 +const selectiveLoopTotalRequests = 32 const requestInit = { method: 'GET', @@ -88,7 +88,8 @@ export const benchOptions = { export function runSelectiveLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: selectiveLoopIterations, + concurrency: 16, + totalRequests: selectiveLoopTotalRequests, buildRequest: buildSelectiveRequest, }) } diff --git a/benchmarks/ssr/scenarios/selective-ssr/solid/vite.config.ts b/benchmarks/ssr/scenarios/selective-ssr/solid/vite.config.ts index 09b42f00e65..f8a95639e6f 100644 --- a/benchmarks/ssr/scenarios/selective-ssr/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/selective-ssr/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/serialization/shared-bench.ts b/benchmarks/ssr/scenarios/serialization/shared-bench.ts index a39f35dc75d..25ed478f03c 100644 --- a/benchmarks/ssr/scenarios/serialization/shared-bench.ts +++ b/benchmarks/ssr/scenarios/serialization/shared-bench.ts @@ -5,8 +5,8 @@ import type { StartRequestHandler } from '../../bench-utils' export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad -const richSerializationLoopIterations = 30 -const plainSerializationLoopIterations = 30 +const richSerializationLoopTotalRequests = 32 +const plainSerializationLoopTotalRequests = 32 const requestInit = { method: 'GET', @@ -89,7 +89,8 @@ export const serializationBenchOptions = { export function runRichSerializationLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: richSerializationLoopIterations, + concurrency: 16, + totalRequests: richSerializationLoopTotalRequests, buildRequest: (random, index) => buildSerializationRequest('rich', random, index), }) @@ -98,7 +99,8 @@ export function runRichSerializationLoop(handler: StartRequestHandler) { export function runPlainSerializationLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: plainSerializationLoopIterations, + concurrency: 16, + totalRequests: plainSerializationLoopTotalRequests, buildRequest: (random, index) => buildSerializationRequest('plain', random, index), }) diff --git a/benchmarks/ssr/scenarios/serialization/solid/vite.config.ts b/benchmarks/ssr/scenarios/serialization/solid/vite.config.ts index 67df3299e10..6fbb13d63af 100644 --- a/benchmarks/ssr/scenarios/serialization/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/serialization/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/server-fn-transport/bench.ts b/benchmarks/ssr/scenarios/server-fn-transport/bench.ts index 73a79aa79ad..4274c724ca0 100644 --- a/benchmarks/ssr/scenarios/server-fn-transport/bench.ts +++ b/benchmarks/ssr/scenarios/server-fn-transport/bench.ts @@ -67,9 +67,9 @@ const commonHeaders = { 'sec-fetch-site': 'same-origin', accept: acceptHeader, } satisfies HeadersInit -const serverFnMultipartLoopIterations = 125 -const serverFnRawResponseLoopIterations = 175 -const serverFnRawStreamLoopIterations = 100 +const serverFnMultipartLoopTotalRequests = 128 +const serverFnRawResponseLoopTotalRequests = 176 +const serverFnRawStreamLoopTotalRequests = 112 export const serverFnTransportBenchOptions = { warmupIterations: 100, @@ -519,7 +519,8 @@ export function runServerFnMultipartRequestLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnMultipartLoopIterations, + concurrency: 16, + totalRequests: serverFnMultipartLoopTotalRequests, buildRequest: (_random, index) => buildMultipartRequest(context.urls, context.multipartPayloads, index), validateResponse: validateSerializedResponse, @@ -532,7 +533,8 @@ export function runServerFnRawResponseRequestLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnRawResponseLoopIterations, + concurrency: 16, + totalRequests: serverFnRawResponseLoopTotalRequests, buildRequest: (_random, index) => buildRawResponseRequest(context.urls, context.rawPayloads, index), validateResponse: validateRawResponse, @@ -545,7 +547,8 @@ export function runServerFnRawStreamRequestLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnRawStreamLoopIterations, + concurrency: 16, + totalRequests: serverFnRawStreamLoopTotalRequests, buildRequest: (_random, index) => buildRawStreamRequest(context.urls, context.streamPayloads, index), validateResponse: validateRawStreamResponse, diff --git a/benchmarks/ssr/scenarios/server-fn-transport/solid/vite.config.ts b/benchmarks/ssr/scenarios/server-fn-transport/solid/vite.config.ts index b71d03009ba..67f73b89f74 100644 --- a/benchmarks/ssr/scenarios/server-fn-transport/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/server-fn-transport/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/server-fns/bench.ts b/benchmarks/ssr/scenarios/server-fns/bench.ts index 65a8749cef5..1461ce2bfd7 100644 --- a/benchmarks/ssr/scenarios/server-fns/bench.ts +++ b/benchmarks/ssr/scenarios/server-fns/bench.ts @@ -53,12 +53,12 @@ const documentRequestInit = { accept: 'text/html', }, } satisfies RequestInit -const serverFnGetLoopIterations = 100 -const serverFnPostLoopIterations = 150 -const serverFnRedirectLoopIterations = 125 -const serverFnNotFoundLoopIterations = 200 -const serverFnSendContextLoopIterations = 175 -const serverFnDocumentSsrLoopIterations = 45 +const serverFnGetLoopTotalRequests = 112 +const serverFnPostLoopTotalRequests = 160 +const serverFnRedirectLoopTotalRequests = 128 +const serverFnNotFoundLoopTotalRequests = 208 +const serverFnSendContextLoopTotalRequests = 176 +const serverFnDocumentSsrLoopTotalRequests = 48 export const serverFnBenchOptions = { warmupIterations: 100, @@ -456,7 +456,8 @@ export function runServerFnGetRequestLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnGetLoopIterations, + concurrency: 16, + totalRequests: serverFnGetLoopTotalRequests, buildRequest: (_random, index) => buildGetRequest(context.urls, context.getQueries, index), }) @@ -468,7 +469,8 @@ export function runServerFnPostRequestLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnPostLoopIterations, + concurrency: 16, + totalRequests: serverFnPostLoopTotalRequests, buildRequest: (_random, index) => buildPostRequest(context.urls, context.bodies, index), }) @@ -480,7 +482,8 @@ export function runServerFnRedirectRequestLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnRedirectLoopIterations, + concurrency: 16, + totalRequests: serverFnRedirectLoopTotalRequests, buildRequest: (_random, index) => buildRedirectRequest(context.urls, context.bodies, index), validateResponse: validateRedirectResponse, @@ -493,7 +496,8 @@ export function runServerFnNotFoundRequestLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnNotFoundLoopIterations, + concurrency: 16, + totalRequests: serverFnNotFoundLoopTotalRequests, buildRequest: (_random, index) => buildNotFoundRequest(context.urls, context.bodies, index), validateResponse: (response) => @@ -507,7 +511,8 @@ export function runServerFnSendContextRequestLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnSendContextLoopIterations, + concurrency: 16, + totalRequests: serverFnSendContextLoopTotalRequests, buildRequest: (_random, index) => buildContextRequest(context.urls, context.contextBodies, index), validateResponse: (response) => @@ -520,7 +525,8 @@ export function runServerFnDocumentSsrRequestLoop( ) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: serverFnDocumentSsrLoopIterations, + concurrency: 16, + totalRequests: serverFnDocumentSsrLoopTotalRequests, buildRequest: buildSsrCallRequest, validateResponse: validateDocumentResponse, }) diff --git a/benchmarks/ssr/scenarios/server-fns/solid/vite.config.ts b/benchmarks/ssr/scenarios/server-fns/solid/vite.config.ts index ef8292a042a..d762190f8af 100644 --- a/benchmarks/ssr/scenarios/server-fns/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/server-fns/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/server-routes-middleware/shared.ts b/benchmarks/ssr/scenarios/server-routes-middleware/shared.ts index 3177e0f763b..663ca092943 100644 --- a/benchmarks/ssr/scenarios/server-routes-middleware/shared.ts +++ b/benchmarks/ssr/scenarios/server-routes-middleware/shared.ts @@ -4,7 +4,7 @@ import type { StartRequestHandler } from '../../bench-utils' export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad -const loopIterations = 150 +const loopTotalRequests = 160 const apiRequestInit = { method: 'GET', @@ -22,7 +22,8 @@ export const serverRouteMiddlewareBenchOptions = { export function runServerRouteMiddlewareLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: loopIterations, + concurrency: 16, + totalRequests: loopTotalRequests, buildRequest: (random) => new Request( `http://localhost/api/chain/${randomSegment(random)}`, diff --git a/benchmarks/ssr/scenarios/server-routes-middleware/solid/vite.config.ts b/benchmarks/ssr/scenarios/server-routes-middleware/solid/vite.config.ts index 89116c111ef..4337cf62241 100644 --- a/benchmarks/ssr/scenarios/server-routes-middleware/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/server-routes-middleware/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/server-routes/shared.ts b/benchmarks/ssr/scenarios/server-routes/shared.ts index 20f67ea2960..ce33faaefe0 100644 --- a/benchmarks/ssr/scenarios/server-routes/shared.ts +++ b/benchmarks/ssr/scenarios/server-routes/shared.ts @@ -4,7 +4,7 @@ import type { StartRequestHandler } from '../../bench-utils' export type { StartRequestHandler } const benchmarkSeed = 0xdecafbad -const loopIterations = 200 +const loopTotalRequests = 208 const apiRequestInit = { method: 'GET', @@ -22,7 +22,8 @@ export const serverRouteBenchOptions = { export function runServerRouteLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, - iterations: loopIterations, + concurrency: 16, + totalRequests: loopTotalRequests, buildRequest: (random) => new Request( `http://localhost/api/users/${randomSegment(random)}`, diff --git a/benchmarks/ssr/scenarios/server-routes/solid/vite.config.ts b/benchmarks/ssr/scenarios/server-routes/solid/vite.config.ts index 24e502a63a8..d89faccc42f 100644 --- a/benchmarks/ssr/scenarios/server-routes/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/server-routes/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/scenarios/streaming/shared-bench.ts b/benchmarks/ssr/scenarios/streaming/shared-bench.ts index 25685b3c78f..cc45062e1b5 100644 --- a/benchmarks/ssr/scenarios/streaming/shared-bench.ts +++ b/benchmarks/ssr/scenarios/streaming/shared-bench.ts @@ -71,6 +71,8 @@ export const benchOptions = { export function runStreamingLoop(handler: StartRequestHandler) { return runRequestLoop(handler, { seed: benchmarkSeed, + concurrency: 16, + totalRequests: 16, buildRequest: buildStreamingRequest, }) } diff --git a/benchmarks/ssr/scenarios/streaming/solid/vite.config.ts b/benchmarks/ssr/scenarios/streaming/solid/vite.config.ts index 5b736899c07..ea1f1cc1cca 100644 --- a/benchmarks/ssr/scenarios/streaming/solid/vite.config.ts +++ b/benchmarks/ssr/scenarios/streaming/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/solid/vite.config.ts b/benchmarks/ssr/solid/vite.config.ts index dc9cbf90e31..9afb48f16ef 100644 --- a/benchmarks/ssr/solid/vite.config.ts +++ b/benchmarks/ssr/solid/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitest/config' import codspeedPlugin from '@codspeed/vitest-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const rootDir = fileURLToPath(new URL('.', import.meta.url)) diff --git a/benchmarks/ssr/tsconfig.json b/benchmarks/ssr/tsconfig.json index e3ed3ad08ae..6702925d131 100644 --- a/benchmarks/ssr/tsconfig.json +++ b/benchmarks/ssr/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "types": ["node", "vite/client", "vitest/globals"] }, - "include": ["bench-utils.ts"] + "include": ["bench-utils.ts", "bench-utils.test.ts", "vitest.unit.config.ts"] } diff --git a/benchmarks/ssr/vitest.unit.config.ts b/benchmarks/ssr/vitest.unit.config.ts new file mode 100644 index 00000000000..cbba6db9efb --- /dev/null +++ b/benchmarks/ssr/vitest.unit.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: '@benchmarks/ssr unit', + environment: 'node', + include: ['bench-utils.test.ts'], + }, +}) diff --git a/docs/router/api/router/LinkOptionsType.md b/docs/router/api/router/LinkOptionsType.md index cf20e0ff198..9d3d3fe8d8c 100644 --- a/docs/router/api/router/LinkOptionsType.md +++ b/docs/router/api/router/LinkOptionsType.md @@ -42,7 +42,7 @@ The `LinkOptions` object accepts/contains the following properties: - Type: `number` - Optional -- Delay focus and hover intent preloading by this many milliseconds. Touch intent preloads immediately. If focus or hover exits before the delay, the preload will be cancelled. +- Delay focus, hover, and viewport preloading by this many milliseconds. Touch intent preloads immediately. If focus or hover ends, or the link leaves the viewport before the delay, the preload will be cancelled. ### `disabled` diff --git a/docs/router/api/router/RouterOptionsType.md b/docs/router/api/router/RouterOptionsType.md index 91f13e0e503..709d08c621a 100644 --- a/docs/router/api/router/RouterOptionsType.md +++ b/docs/router/api/router/RouterOptionsType.md @@ -59,7 +59,7 @@ The `RouterOptions` type accepts an object with the following properties and met - Type: `number` - Optional - Defaults to `50` -- The delay in milliseconds that a route must be hovered over or touched before it is preloaded. +- The delay in milliseconds before intent focus/hover and viewport preloading. Touch intent preloads immediately. ### `defaultComponent` property diff --git a/docs/router/api/router/useMatchRouteHook.md b/docs/router/api/router/useMatchRouteHook.md index 01c26d07c6b..e67ccb6cbd8 100644 --- a/docs/router/api/router/useMatchRouteHook.md +++ b/docs/router/api/router/useMatchRouteHook.md @@ -3,7 +3,9 @@ id: useMatchRouteHook title: useMatchRoute hook --- -The `useMatchRoute` hook is a hook that returns a `matchRoute` function that can be used to match a route against either the current or pending location. +The `useMatchRoute` hook returns a `matchRoute` function that can be used to match a route against either the current or pending location. The hook subscribes the component to changes in the router state used for matching, making it useful when the match result affects what the component renders. + +The `matchRoute` function's identity changes when that router state changes. For an imperative check, such as one performed in an event handler, use [`useRouter`](./useRouterHook.md) and call `router.matchRoute` instead. The router instance is stable, and this avoids subscribing the component to router state that it does not use while rendering. ## useMatchRoute returns @@ -25,6 +27,8 @@ The `matchRoute` function accepts a single argument, an `options` object. ## Examples +Use `useMatchRoute` when the result determines the rendered output: + ```tsx import { useMatchRoute } from '@tanstack/react-router' @@ -33,7 +37,36 @@ function Component() { const matchRoute = useMatchRoute() const params = matchRoute({ to: '/posts/$postId' }) // ^ { postId: '123' } + + return params ? : } +``` + +For a check made at the time of an event, call `router.matchRoute` directly: + +```tsx +import { useRouter } from '@tanstack/react-router' + +function Component() { + const router = useRouter() + + return ( + + ) +} +``` + +Additional matching examples: + +```tsx +import { useMatchRoute } from '@tanstack/react-router' // Current location: /posts/123 function Component() { diff --git a/docs/router/guide/navigation.md b/docs/router/guide/navigation.md index b2bb03ad0e2..dc9c46e57e7 100644 --- a/docs/router/guide/navigation.md +++ b/docs/router/guide/navigation.md @@ -731,7 +731,7 @@ What's even better is that by using a cache-first library like `@tanstack/query` ### Link Preloading Delay -For `'intent'` preloading, a configurable delay determines how long a link must remain focused or hovered before preloading begins. If focus or hover ends before the delay, the queued preload is cancelled. Touch intent preloads immediately without waiting for the delay. The default delay is 50 milliseconds, but you can change it by passing a `preloadDelay` prop to the `Link` component: +For `'intent'` and `'viewport'` preloading, a configurable delay determines how long to wait before preloading begins after focus, hover, or viewport entry. If focus or hover ends, or the link leaves the viewport before the delay, the queued preload is cancelled. Touch intent preloads immediately without waiting for the delay. The default delay is 50 milliseconds, but you can change it by passing a `preloadDelay` prop to the `Link` component: ```tsx const link = ( @@ -792,7 +792,7 @@ The `router.navigate` method is the same as the `navigate` function returned by ## `useMatchRoute` and `` -The `useMatchRoute` hook and `` component are the same thing, but the hook is a bit more flexible. They both accept the standard navigation `ToOptions` interface either as options or props and return `true/false` if that route is currently matched. It also has a handy `pending` option that will return `true` if the route is currently pending (e.g. a route is currently transitioning to that route). This can be extremely useful for showing optimistic UI around where a user is navigating: +The `useMatchRoute` hook and `` component are the same thing, but the hook is a bit more flexible. They both accept the standard navigation `ToOptions` interface, either as options or props, to determine whether a route is currently matched. The `pending` option checks whether the route is currently pending (e.g. the router is currently transitioning to that route). This can be extremely useful for showing optimistic UI around where a user is navigating: ```tsx function Component() { @@ -828,7 +828,7 @@ function Component() { } ``` -The hook version `useMatchRoute` returns a function that can be called programmatically to check if a route is matched: +The hook version `useMatchRoute` returns a function for checking whether a route is matched. It subscribes the component to the router state used for matching, so use it when the result affects rendering or to trigger an effect. This subscription ensures the component updates as the current or pending location changes: ```tsx function Component() { @@ -838,7 +838,7 @@ function Component() { if (matchRoute({ to: '/users', pending: true })) { console.info('The /users route is matched and pending') } - }) + }, [matchRoute]) return (
@@ -848,6 +848,26 @@ function Component() { } ``` +The `matchRoute` function returned by `useMatchRoute` changes identity when the relevant router state changes. If you only need to check the route at the time an event occurs, use the stable router instance returned by `useRouter` and call `router.matchRoute` directly. This reads the latest router state without subscribing the component to matching state that it does not use while rendering: + +```tsx +function Component() { + const router = useRouter() + + return ( + + ) +} +``` + --- Phew! That's a lot of navigating! That said, hopefully you're feeling pretty good about getting around your application now. Let's move on! diff --git a/docs/router/guide/preloading.md b/docs/router/guide/preloading.md index 6ae9563f2f8..7f48412ce68 100644 --- a/docs/router/guide/preloading.md +++ b/docs/router/guide/preloading.md @@ -64,7 +64,7 @@ This will turn on `intent` preloading by default for all `` components in ## Preload Delay -By default, preloading will start after **50ms** of the user hovering or touching a `` component. You can change this delay by setting the `defaultPreloadDelay` option on your router: +By default, intent focus/hover and viewport preloading start after **50ms**. Pending preloads are cancelled if focus or hover ends, or the link leaves the viewport. Touch intent preloads immediately. You can change this delay by setting the `defaultPreloadDelay` option on your router: diff --git a/docs/router/installation/with-vite.md b/docs/router/installation/with-vite.md index 64cf2cb2b74..4db7a084997 100644 --- a/docs/router/installation/with-vite.md +++ b/docs/router/installation/with-vite.md @@ -42,7 +42,7 @@ Or, you can clone our [Quickstart Vite example](https://github.com/TanStack/rout ```ts title="vite.config.ts" import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' // https://vitejs.dev/config/ diff --git a/docs/router/routing/virtual-file-routes.md b/docs/router/routing/virtual-file-routes.md index 2de0ded5df2..e8e1eed2f0c 100644 --- a/docs/router/routing/virtual-file-routes.md +++ b/docs/router/routing/virtual-file-routes.md @@ -73,7 +73,7 @@ export default defineConfig({ ```tsx title="vite.config.ts" import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' export default defineConfig({ @@ -132,7 +132,7 @@ export default defineConfig({ ```tsx title="vite.config.ts" import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' const routes = rootRoute('root.tsx', [ diff --git a/docs/start/framework/solid/build-from-scratch.md b/docs/start/framework/solid/build-from-scratch.md index c376497aeb6..912c90ebeb1 100644 --- a/docs/start/framework/solid/build-from-scratch.md +++ b/docs/start/framework/solid/build-from-scratch.md @@ -69,7 +69,7 @@ Install the build tool and Solid integration you want to use: # Vite ```shell -npm i -D vite vite-plugin-solid +npm i -D vite @solidjs/vite-plugin ``` # Rsbuild @@ -129,7 +129,7 @@ Then configure TanStack Start's build tool plugin: ```ts title="vite.config.ts" import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' export default defineConfig({ server: { diff --git a/docs/start/framework/solid/guide/environment-variables.md b/docs/start/framework/solid/guide/environment-variables.md index 6a7f763d110..ff3c26fbe95 100644 --- a/docs/start/framework/solid/guide/environment-variables.md +++ b/docs/start/framework/solid/guide/environment-variables.md @@ -10,7 +10,7 @@ replace: '{children}': '{props.children}', '@tanstack/react-start/plugin/vite': '@tanstack/solid-start/plugin/vite', '@tanstack/react-start/plugin/rsbuild': '@tanstack/solid-start/plugin/rsbuild', - '@vitejs/plugin-react': 'vite-plugin-solid', + '@vitejs/plugin-react': '@solidjs/vite-plugin', 'viteReact()': 'viteSolid({ ssr: true })', 'viteReact': 'viteSolid', "import { pluginReact } from '@rsbuild/plugin-react'": "import { pluginBabel } from '@rsbuild/plugin-babel'\nimport { pluginSolid } from '@rsbuild/plugin-solid'", diff --git a/docs/start/framework/solid/guide/hosting.md b/docs/start/framework/solid/guide/hosting.md index 23f1d35cf40..fea0c29a370 100644 --- a/docs/start/framework/solid/guide/hosting.md +++ b/docs/start/framework/solid/guide/hosting.md @@ -3,7 +3,7 @@ ref: docs/start/framework/react/guide/hosting.md replace: { '@tanstack/react-start': '@tanstack/solid-start', - '@vitejs/plugin-react': 'vite-plugin-solid', + '@vitejs/plugin-react': '@solidjs/vite-plugin', 'viteReact()': 'viteSolid({ ssr: true })', 'viteReact': 'viteSolid', 'examples/react/start-basic-cloudflare': 'examples/solid/start-basic-cloudflare', diff --git a/docs/start/framework/solid/guide/static-prerendering.md b/docs/start/framework/solid/guide/static-prerendering.md index d5308138969..5ebbc1e96a0 100644 --- a/docs/start/framework/solid/guide/static-prerendering.md +++ b/docs/start/framework/solid/guide/static-prerendering.md @@ -16,7 +16,7 @@ TanStack Start can prerender your application to static HTML files, which can th ```ts title="vite.config.ts" import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' export default defineConfig({ plugins: [ diff --git a/docs/start/framework/solid/guide/tailwind-integration.md b/docs/start/framework/solid/guide/tailwind-integration.md index adb733a5097..272846ca610 100644 --- a/docs/start/framework/solid/guide/tailwind-integration.md +++ b/docs/start/framework/solid/guide/tailwind-integration.md @@ -4,7 +4,7 @@ replace: { '@tanstack/react-start': '@tanstack/solid-start', '@tanstack/react-router': '@tanstack/solid-router', - '@vitejs/plugin-react': 'vite-plugin-solid', + '@vitejs/plugin-react': '@solidjs/vite-plugin', 'viteReact()': 'viteSolid({ ssr: true })', 'viteReact': 'viteSolid', "import { pluginReact } from '@rsbuild/plugin-react'": "import { pluginBabel } from '@rsbuild/plugin-babel'\nimport { pluginSolid } from '@rsbuild/plugin-solid'", diff --git a/e2e/react-router/basic-react-query-file-based/package.json b/e2e/react-router/basic-react-query-file-based/package.json index 65483817725..5f121de6a4f 100644 --- a/e2e/react-router/basic-react-query-file-based/package.json +++ b/e2e/react-router/basic-react-query-file-based/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", "@tanstack/react-router": "workspace:^", "@tanstack/react-router-devtools": "workspace:^", diff --git a/e2e/react-router/basic-react-query/package.json b/e2e/react-router/basic-react-query/package.json index 81eb9eb67bf..3e0527183b0 100644 --- a/e2e/react-router/basic-react-query/package.json +++ b/e2e/react-router/basic-react-query/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", "@tanstack/react-router": "workspace:^", "@tanstack/router-devtools": "workspace:^", diff --git a/e2e/react-router/issue-4759/index.html b/e2e/react-router/issue-4759/index.html new file mode 100644 index 00000000000..9609ea710b7 --- /dev/null +++ b/e2e/react-router/issue-4759/index.html @@ -0,0 +1,62 @@ + + + + + + Issue 4759 + + + +
+
HTML fallback
+
+ + + + diff --git a/e2e/react-router/issue-4759/package.json b/e2e/react-router/issue-4759/package.json new file mode 100644 index 00000000000..91a7a5053e4 --- /dev/null +++ b/e2e/react-router/issue-4759/package.json @@ -0,0 +1,26 @@ +{ + "name": "tanstack-router-e2e-react-issue-4759", + "private": true, + "type": "module", + "scripts": { + "build": "vite build && tsc --noEmit", + "dev": "vite --port 3000", + "dev:e2e": "vite", + "preview": "vite preview", + "start": "vite", + "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-router": "workspace:^", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@playwright/test": "^1.61.0", + "@tanstack/router-e2e-utils": "workspace:^", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^6.0.1", + "vite": "^8.0.14" + } +} diff --git a/e2e/react-router/issue-4759/playwright.config.ts b/e2e/react-router/issue-4759/playwright.config.ts new file mode 100644 index 00000000000..b5e8249edc7 --- /dev/null +++ b/e2e/react-router/issue-4759/playwright.config.ts @@ -0,0 +1,25 @@ +import { defineConfig, devices } from '@playwright/test' +import { getTestServerPort } from '@tanstack/router-e2e-utils' +import packageJson from './package.json' with { type: 'json' } + +const PORT = await getTestServerPort(packageJson.name) +const baseURL = `http://localhost:${PORT}` + +export default defineConfig({ + testDir: './tests', + workers: 1, + reporter: [['line']], + use: { baseURL }, + webServer: { + command: `VITE_SERVER_PORT=${PORT} pnpm dev:e2e --port ${PORT}`, + url: baseURL, + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}) diff --git a/e2e/react-router/issue-4759/src/main.tsx b/e2e/react-router/issue-4759/src/main.tsx new file mode 100644 index 00000000000..bc4a99c37fb --- /dev/null +++ b/e2e/react-router/issue-4759/src/main.tsx @@ -0,0 +1,50 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import { + RouterProvider, + createRootRoute, + createRoute, + createRouter, +} from '@tanstack/react-router' + +const rootRoute = createRootRoute() +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + loader: () => new Promise((resolve) => setTimeout(resolve, 1_000)), + component: () =>
loaded
, +}) +const routePendingRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/route-pending', + pendingMs: 0, + pendingMinMs: 0, + pendingComponent: () => ( +
+ route pending +
+ ), + loader: () => new Promise((resolve) => setTimeout(resolve, 1_000)), + component: () =>
loaded
, +}) +const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, routePendingRoute]), +}) +const usesRoutePending = window.location.pathname === '/route-pending' + +createRoot(document.getElementById('app')!).render( + +
+ ( +
+ default pending +
+ )} + /> +
+
, +) diff --git a/e2e/react-router/issue-4759/tests/issue-4759.spec.ts b/e2e/react-router/issue-4759/tests/issue-4759.spec.ts new file mode 100644 index 00000000000..7556b1c47a4 --- /dev/null +++ b/e2e/react-router/issue-4759/tests/issue-4759.spec.ts @@ -0,0 +1,38 @@ +import { expect, test } from '@playwright/test' +import type { Page } from '@playwright/test' + +async function expectNoBlankFrame( + page: Page, + pendingSource: 'default' | 'route', +) { + await expect( + page.locator( + `[data-state="pending"][data-pending-source="${pendingSource}"]`, + ), + ).toBeVisible() + + const paintStates = await page.evaluate( + () => + (globalThis as typeof globalThis & { __paintStates: Array }) + .__paintStates, + ) + + expect(paintStates).toContain('pending') + expect(paintStates).not.toContain('shell') + expect(paintStates).not.toContain('empty') + await expect(page.locator('[data-state="loaded"]')).toBeVisible() +} + +test('#4759: the initial default pending component has no blank frame before it', async ({ + page, +}) => { + await page.goto('/') + await expectNoBlankFrame(page, 'default') +}) + +test('an initial route pending component has no blank frame before it', async ({ + page, +}) => { + await page.goto('/route-pending') + await expectNoBlankFrame(page, 'route') +}) diff --git a/e2e/react-router/issue-4759/tsconfig.json b/e2e/react-router/issue-4759/tsconfig.json new file mode 100644 index 00000000000..e4ba4788a35 --- /dev/null +++ b/e2e/react-router/issue-4759/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "strict": true, + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext", + "resolveJsonModule": true, + "skipLibCheck": true, + "types": ["vite/client"] + }, + "exclude": ["node_modules", "dist"] +} diff --git a/e2e/react-router/issue-4759/vite.config.ts b/e2e/react-router/issue-4759/vite.config.ts new file mode 100644 index 00000000000..9ffcc675746 --- /dev/null +++ b/e2e/react-router/issue-4759/vite.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], +}) diff --git a/e2e/react-router/issue-7457/package.json b/e2e/react-router/issue-7457/package.json index 3220a4dbb40..bf78bbf428b 100644 --- a/e2e/react-router/issue-7457/package.json +++ b/e2e/react-router/issue-7457/package.json @@ -11,7 +11,7 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@tanstack/react-query": "^5.99.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-router": "workspace:^", "@tanstack/router-plugin": "workspace:^", "react": "^19.0.0", diff --git a/e2e/react-router/react-compiler/index.html b/e2e/react-router/react-compiler/index.html new file mode 100644 index 00000000000..0c5b6b471c5 --- /dev/null +++ b/e2e/react-router/react-compiler/index.html @@ -0,0 +1,12 @@ + + + + + + React Compiler useMatchRoute test + + +
+ + + diff --git a/e2e/react-router/react-compiler/package.json b/e2e/react-router/react-compiler/package.json new file mode 100644 index 00000000000..d4d0e6473af --- /dev/null +++ b/e2e/react-router/react-compiler/package.json @@ -0,0 +1,29 @@ +{ + "name": "tanstack-router-e2e-react-compiler", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port 3000", + "dev:e2e": "vite", + "build": "vite build && tsc --noEmit", + "preview": "vite preview", + "start": "vite", + "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-router": "workspace:^", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@babel/core": "^7.29.0", + "@playwright/test": "^1.61.0", + "@rolldown/plugin-babel": "^0.2.0", + "@tanstack/router-e2e-utils": "workspace:^", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^6.0.1", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.14" + } +} diff --git a/e2e/react-router/react-compiler/playwright.config.ts b/e2e/react-router/react-compiler/playwright.config.ts new file mode 100644 index 00000000000..61a995a8155 --- /dev/null +++ b/e2e/react-router/react-compiler/playwright.config.ts @@ -0,0 +1,25 @@ +import { defineConfig, devices } from '@playwright/test' +import { getTestServerPort } from '@tanstack/router-e2e-utils' +import packageJson from './package.json' with { type: 'json' } + +const PORT = await getTestServerPort(packageJson.name) +const baseURL = `http://localhost:${PORT}` + +export default defineConfig({ + testDir: './tests', + workers: 1, + reporter: [['line']], + use: { baseURL }, + webServer: { + command: `VITE_NODE_ENV="test" VITE_SERVER_PORT=${PORT} pnpm dev:e2e --port ${PORT}`, + url: baseURL, + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}) diff --git a/e2e/react-router/react-compiler/src/main.tsx b/e2e/react-router/react-compiler/src/main.tsx new file mode 100644 index 00000000000..e6e549da836 --- /dev/null +++ b/e2e/react-router/react-compiler/src/main.tsx @@ -0,0 +1,73 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import { + Link, + Outlet, + RouterProvider, + createRootRoute, + createRoute, + createRouter, + linkOptions, + useMatchRoute, +} from '@tanstack/react-router' + +const links = linkOptions([ + { to: '/home', label: 'Home' }, + { to: '/about', label: 'About' }, +]) + +function useRouteName() { + const matchRoute = useMatchRoute() + + return links.find((link) => matchRoute(link))?.label ?? 'Unknown' +} + +function RootComponent() { + const matchedRoute = useRouteName() + + return ( + <> + +

+ Matched route: {matchedRoute} +

+ + + ) +} + +const rootRoute = createRootRoute({ component: RootComponent }) +const homeRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/home', +}) +const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', +}) +const router = createRouter({ + routeTree: rootRoute.addChildren([homeRoute, aboutRoute]), +}) + +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app') +if (!rootElement) { + throw new Error('Root element not found') +} + +createRoot(rootElement).render( + + + , +) diff --git a/e2e/react-router/react-compiler/tests/use-match-route.spec.ts b/e2e/react-router/react-compiler/tests/use-match-route.spec.ts new file mode 100644 index 00000000000..b800e3c9086 --- /dev/null +++ b/e2e/react-router/react-compiler/tests/use-match-route.spec.ts @@ -0,0 +1,16 @@ +import { expect, test } from '@playwright/test' + +test('useMatchRoute updates after navigation with React Compiler', async ({ + page, +}) => { + await page.goto('/home') + await expect(page.getByTestId('matched-route')).toHaveText('Home') + + await page.getByRole('link', { name: 'About' }).click() + await expect(page).toHaveURL(/\/about$/) + await expect(page.getByTestId('matched-route')).toHaveText('About') + + await page.getByRole('link', { name: 'Home' }).click() + await expect(page).toHaveURL(/\/home$/) + await expect(page.getByTestId('matched-route')).toHaveText('Home') +}) diff --git a/e2e/react-router/react-compiler/tsconfig.json b/e2e/react-router/react-compiler/tsconfig.json new file mode 100644 index 00000000000..4f6089bc08d --- /dev/null +++ b/e2e/react-router/react-compiler/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext", + "resolveJsonModule": true, + "allowJs": true, + "skipLibCheck": true, + "types": ["vite/client"] + }, + "exclude": ["node_modules", "dist"] +} diff --git a/e2e/react-router/react-compiler/vite.config.js b/e2e/react-router/react-compiler/vite.config.js new file mode 100644 index 00000000000..b4478aced4f --- /dev/null +++ b/e2e/react-router/react-compiler/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react, { reactCompilerPreset } from '@vitejs/plugin-react' +import babel from '@rolldown/plugin-babel' + +export default defineConfig({ + plugins: [react(), babel({ presets: [reactCompilerPreset()] })], +}) diff --git a/e2e/react-start/basic-react-query/package.json b/e2e/react-start/basic-react-query/package.json index ed7328f3360..b16e484dcfc 100644 --- a/e2e/react-start/basic-react-query/package.json +++ b/e2e/react-start/basic-react-query/package.json @@ -12,7 +12,7 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", "@tanstack/react-router": "workspace:^", "@tanstack/react-router-devtools": "workspace:^", @@ -31,10 +31,10 @@ "@types/node": "^22.10.2", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "^6.0.1", "srvx": "^0.11.9", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/e2e/react-start/query-integration/package.json b/e2e/react-start/query-integration/package.json index 4ad18395379..52a3098514a 100644 --- a/e2e/react-start/query-integration/package.json +++ b/e2e/react-start/query-integration/package.json @@ -12,7 +12,7 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", "@tanstack/react-router": "workspace:^", "@tanstack/react-router-devtools": "workspace:^", @@ -30,9 +30,9 @@ "@types/node": "^22.10.2", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "^6.0.1", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/e2e/react-start/rsc-query/package.json b/e2e/react-start/rsc-query/package.json index 24c7b488f64..218a1a1da98 100644 --- a/e2e/react-start/rsc-query/package.json +++ b/e2e/react-start/rsc-query/package.json @@ -12,7 +12,7 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", "@tanstack/react-router": "workspace:^", "@tanstack/react-router-devtools": "workspace:^", diff --git a/e2e/react-start/selective-ssr/src/routeTree.gen.ts b/e2e/react-start/selective-ssr/src/routeTree.gen.ts index 5c7daa4701c..63636ce9522 100644 --- a/e2e/react-start/selective-ssr/src/routeTree.gen.ts +++ b/e2e/react-start/selective-ssr/src/routeTree.gen.ts @@ -11,6 +11,8 @@ import { Route as rootRouteImport } from './routes/__root' import { Route as IndexRouteImport } from './routes/index' import { Route as Issue4614RouteImport } from './routes/issue-4614' +import { Route as Issue7947RouteImport } from './routes/issue-7947' +import { Route as Issue7947TargetRouteImport } from './routes/issue-7947-target' import { Route as PostsRouteImport } from './routes/posts' import { Route as PostsPostIdRouteImport } from './routes/posts.$postId' @@ -24,6 +26,16 @@ const Issue4614Route = Issue4614RouteImport.update({ path: '/issue-4614', getParentRoute: () => rootRouteImport, } as any) +const Issue7947Route = Issue7947RouteImport.update({ + id: '/issue-7947', + path: '/issue-7947', + getParentRoute: () => rootRouteImport, +} as any) +const Issue7947TargetRoute = Issue7947TargetRouteImport.update({ + id: '/issue-7947-target', + path: '/issue-7947-target', + getParentRoute: () => rootRouteImport, +} as any) const PostsRoute = PostsRouteImport.update({ id: '/posts', path: '/posts', @@ -38,12 +50,16 @@ const PostsPostIdRoute = PostsPostIdRouteImport.update({ export interface FileRoutesByFullPath { '/': typeof IndexRoute '/issue-4614': typeof Issue4614Route + '/issue-7947': typeof Issue7947Route + '/issue-7947-target': typeof Issue7947TargetRoute '/posts': typeof PostsRouteWithChildren '/posts/$postId': typeof PostsPostIdRoute } export interface FileRoutesByTo { '/': typeof IndexRoute '/issue-4614': typeof Issue4614Route + '/issue-7947': typeof Issue7947Route + '/issue-7947-target': typeof Issue7947TargetRoute '/posts': typeof PostsRouteWithChildren '/posts/$postId': typeof PostsPostIdRoute } @@ -51,20 +67,43 @@ export interface FileRoutesById { __root__: typeof rootRouteImport '/': typeof IndexRoute '/issue-4614': typeof Issue4614Route + '/issue-7947': typeof Issue7947Route + '/issue-7947-target': typeof Issue7947TargetRoute '/posts': typeof PostsRouteWithChildren '/posts/$postId': typeof PostsPostIdRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: '/' | '/issue-4614' | '/posts' | '/posts/$postId' + fullPaths: + | '/' + | '/issue-4614' + | '/issue-7947' + | '/issue-7947-target' + | '/posts' + | '/posts/$postId' fileRoutesByTo: FileRoutesByTo - to: '/' | '/issue-4614' | '/posts' | '/posts/$postId' - id: '__root__' | '/' | '/issue-4614' | '/posts' | '/posts/$postId' + to: + | '/' + | '/issue-4614' + | '/issue-7947' + | '/issue-7947-target' + | '/posts' + | '/posts/$postId' + id: + | '__root__' + | '/' + | '/issue-4614' + | '/issue-7947' + | '/issue-7947-target' + | '/posts' + | '/posts/$postId' fileRoutesById: FileRoutesById } export interface RootRouteChildren { IndexRoute: typeof IndexRoute Issue4614Route: typeof Issue4614Route + Issue7947Route: typeof Issue7947Route + Issue7947TargetRoute: typeof Issue7947TargetRoute PostsRoute: typeof PostsRouteWithChildren } @@ -84,6 +123,20 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof Issue4614RouteImport parentRoute: typeof rootRouteImport } + '/issue-7947': { + id: '/issue-7947' + path: '/issue-7947' + fullPath: '/issue-7947' + preLoaderRoute: typeof Issue7947RouteImport + parentRoute: typeof rootRouteImport + } + '/issue-7947-target': { + id: '/issue-7947-target' + path: '/issue-7947-target' + fullPath: '/issue-7947-target' + preLoaderRoute: typeof Issue7947TargetRouteImport + parentRoute: typeof rootRouteImport + } '/posts': { id: '/posts' path: '/posts' @@ -114,6 +167,8 @@ const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, Issue4614Route: Issue4614Route, + Issue7947Route: Issue7947Route, + Issue7947TargetRoute: Issue7947TargetRoute, PostsRoute: PostsRouteWithChildren, } export const routeTree = rootRouteImport diff --git a/e2e/react-start/selective-ssr/src/routes/issue-7947-target.tsx b/e2e/react-start/selective-ssr/src/routes/issue-7947-target.tsx new file mode 100644 index 00000000000..b889c786f41 --- /dev/null +++ b/e2e/react-start/selective-ssr/src/routes/issue-7947-target.tsx @@ -0,0 +1,15 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/issue-7947-target')({ + ssr: false, + // A different head shape exposes redirects that land before hydration as + // React's structural hydration error #418. + head: () => ({ + meta: [ + { title: 'Issue 7947 target' }, + { name: 'robots', content: 'noindex, nofollow' }, + { name: 'description', content: 'beforeLoad redirect target' }, + ], + }), + component: () =>
Target
, +}) diff --git a/e2e/react-start/selective-ssr/src/routes/issue-7947.tsx b/e2e/react-start/selective-ssr/src/routes/issue-7947.tsx new file mode 100644 index 00000000000..934e60ed73e --- /dev/null +++ b/e2e/react-start/selective-ssr/src/routes/issue-7947.tsx @@ -0,0 +1,10 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' + +export const Route = createFileRoute('/issue-7947')({ + ssr: false, + head: () => ({ meta: [{ title: 'Issue 7947 origin' }] }), + beforeLoad: () => { + throw redirect({ to: '/issue-7947-target' }) + }, + component: () =>
Origin
, +}) diff --git a/e2e/react-start/selective-ssr/tests/app.spec.ts b/e2e/react-start/selective-ssr/tests/app.spec.ts index 89eff32caef..acf65edd0b7 100644 --- a/e2e/react-start/selective-ssr/tests/app.spec.ts +++ b/e2e/react-start/selective-ssr/tests/app.spec.ts @@ -4,6 +4,34 @@ import { test } from '@tanstack/router-e2e-utils' const testCount = 7 test.describe('selective ssr', () => { + test('#7947: beforeLoad redirect on an ssr: false route does not cause a hydration error', async ({ + page, + }) => { + const browserErrors: Array = [] + // React's default onRecoverableError reports through both channels, + // depending on whether the development or production build is running. + page.on('console', (message) => { + if (message.type() === 'error') { + browserErrors.push(message.text()) + } + }) + page.on('pageerror', (error) => { + browserErrors.push(error.message) + }) + + await page.goto('/issue-7947') + + await expect(page).toHaveURL(/\/issue-7947-target$/) + await expect(page.getByTestId('issue-7947-target')).toBeVisible() + + const hydrationErrors = browserErrors.filter((error) => + /hydrat|did not match|server rendered HTML|Minified React error #(418|423|425)\b/i.test( + error, + ), + ) + expect(hydrationErrors).toEqual([]) + }) + test('#4614: cached parent loader data does not cache its beforeLoad context', async ({ page, }) => { diff --git a/e2e/react-start/server-functions/package.json b/e2e/react-start/server-functions/package.json index 7c8d4f10ca8..ef55ff39ccb 100644 --- a/e2e/react-start/server-functions/package.json +++ b/e2e/react-start/server-functions/package.json @@ -17,7 +17,7 @@ "test:e2e:rsbuild-cache": "playwright test -c playwright.rsbuild-cache.config.ts --project=chromium" }, "dependencies": { - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-router": "workspace:^", "@tanstack/react-router-devtools": "workspace:^", "@tanstack/react-router-ssr-query": "workspace:^", @@ -40,11 +40,11 @@ "@types/node": "^22.10.2", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "^6.0.1", "combinate": "^1.1.11", "srvx": "^0.11.9", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" }, diff --git a/e2e/react-start/server-routes/package.json b/e2e/react-start/server-routes/package.json index f8082e3618f..074d26905dc 100644 --- a/e2e/react-start/server-routes/package.json +++ b/e2e/react-start/server-routes/package.json @@ -12,7 +12,7 @@ "test:e2e": "playwright test --project=chromium" }, "dependencies": { - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-router": "workspace:^", "@tanstack/react-router-devtools": "workspace:^", "@tanstack/react-router-ssr-query": "workspace:^", @@ -32,11 +32,11 @@ "@types/node": "^22.10.2", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "^6.0.1", "combinate": "^1.1.11", "srvx": "^0.11.9", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/e2e/react-start/streaming-ssr/package.json b/e2e/react-start/streaming-ssr/package.json index fcf78262d54..dddd52c9dab 100644 --- a/e2e/react-start/streaming-ssr/package.json +++ b/e2e/react-start/streaming-ssr/package.json @@ -13,7 +13,7 @@ "test:e2e:preview": "rm -rf port*.txt; MODE=preview playwright test preview-streaming.spec.ts --project=chromium" }, "dependencies": { - "@tanstack/react-query": "^5.80.7", + "@tanstack/react-query": "catalog:", "@tanstack/react-router": "workspace:^", "@tanstack/react-router-ssr-query": "workspace:^", "@tanstack/react-start": "workspace:^", @@ -26,8 +26,8 @@ "@types/node": "^22.10.2", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "srvx": "^0.11.9", "@typescript/native": "npm:typescript@^7.0.2", + "srvx": "^0.11.9", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/e2e/solid-router/basepath-file-based/package.json b/e2e/solid-router/basepath-file-based/package.json index f7754996841..719ff2b8609 100644 --- a/e2e/solid-router/basepath-file-based/package.json +++ b/e2e/solid-router/basepath-file-based/package.json @@ -11,16 +11,16 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/router-plugin": "workspace:^", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite-plugin-solid": "^3.0.0-next.23", "vite": "^8.0.14" } } diff --git a/e2e/solid-router/basepath-file-based/vite.config.js b/e2e/solid-router/basepath-file-based/vite.config.js index 29470dc9e4a..9b101abe408 100644 --- a/e2e/solid-router/basepath-file-based/vite.config.js +++ b/e2e/solid-router/basepath-file-based/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' // https://vitejs.dev/config/ diff --git a/e2e/solid-router/basic-esbuild-file-based/package.json b/e2e/solid-router/basic-esbuild-file-based/package.json index 80d9a7322d6..38e6c48e5c1 100644 --- a/e2e/solid-router/basic-esbuild-file-based/package.json +++ b/e2e/solid-router/basic-esbuild-file-based/package.json @@ -10,12 +10,12 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/router-plugin": "workspace:^", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "zod": "^4.4.3" }, "devDependencies": { diff --git a/e2e/solid-router/basic-file-based-code-splitting/package.json b/e2e/solid-router/basic-file-based-code-splitting/package.json index e3f731103e4..8a70c7aad44 100644 --- a/e2e/solid-router/basic-file-based-code-splitting/package.json +++ b/e2e/solid-router/basic-file-based-code-splitting/package.json @@ -11,19 +11,19 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/basic-file-based-code-splitting/vite.config.ts b/e2e/solid-router/basic-file-based-code-splitting/vite.config.ts index b5efb3bfad7..c1dfef41f49 100644 --- a/e2e/solid-router/basic-file-based-code-splitting/vite.config.ts +++ b/e2e/solid-router/basic-file-based-code-splitting/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/e2e/solid-router/basic-file-based/package.json b/e2e/solid-router/basic-file-based/package.json index f7ce525af54..d8aac060263 100644 --- a/e2e/solid-router/basic-file-based/package.json +++ b/e2e/solid-router/basic-file-based/package.json @@ -12,21 +12,21 @@ "test:e2e:default": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", "combinate": "^1.1.11", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/basic-file-based/vite.config.js b/e2e/solid-router/basic-file-based/vite.config.js index bfd3a0404ec..1207e9fc582 100644 --- a/e2e/solid-router/basic-file-based/vite.config.js +++ b/e2e/solid-router/basic-file-based/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/e2e/solid-router/basic-scroll-restoration/package.json b/e2e/solid-router/basic-scroll-restoration/package.json index 61ea000dbc8..aa8dbcc7c32 100644 --- a/e2e/solid-router/basic-scroll-restoration/package.json +++ b/e2e/solid-router/basic-scroll-restoration/package.json @@ -11,20 +11,20 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-virtual": "^3.13.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "typescript": "~5.9.0" } } diff --git a/e2e/solid-router/basic-scroll-restoration/vite.config.js b/e2e/solid-router/basic-scroll-restoration/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/e2e/solid-router/basic-scroll-restoration/vite.config.js +++ b/e2e/solid-router/basic-scroll-restoration/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/e2e/solid-router/basic-solid-query-file-based/package.json b/e2e/solid-router/basic-solid-query-file-based/package.json index 39acb569655..ab78c1e8a50 100644 --- a/e2e/solid-router/basic-solid-query-file-based/package.json +++ b/e2e/solid-router/basic-solid-query-file-based/package.json @@ -11,22 +11,22 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/basic-solid-query-file-based/vite.config.js b/e2e/solid-router/basic-solid-query-file-based/vite.config.js index 95863b470a8..691de8db161 100644 --- a/e2e/solid-router/basic-solid-query-file-based/vite.config.js +++ b/e2e/solid-router/basic-solid-query-file-based/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/e2e/solid-router/basic-solid-query/package.json b/e2e/solid-router/basic-solid-query/package.json index d33019754c0..3c0bc5a7cef 100644 --- a/e2e/solid-router/basic-solid-query/package.json +++ b/e2e/solid-router/basic-solid-query/package.json @@ -11,20 +11,20 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/basic-solid-query/vite.config.js b/e2e/solid-router/basic-solid-query/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/e2e/solid-router/basic-solid-query/vite.config.js +++ b/e2e/solid-router/basic-solid-query/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/e2e/solid-router/basic-virtual-file-based/package.json b/e2e/solid-router/basic-virtual-file-based/package.json index 0047a968ef4..51a855ff9c8 100644 --- a/e2e/solid-router/basic-virtual-file-based/package.json +++ b/e2e/solid-router/basic-virtual-file-based/package.json @@ -11,21 +11,21 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/virtual-file-routes": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/basic-virtual-file-based/vite.config.ts b/e2e/solid-router/basic-virtual-file-based/vite.config.ts index 62bb160684e..b5a3e5d27fe 100644 --- a/e2e/solid-router/basic-virtual-file-based/vite.config.ts +++ b/e2e/solid-router/basic-virtual-file-based/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import { routes } from './routes' import tailwindcss from '@tailwindcss/vite' diff --git a/e2e/solid-router/basic-virtual-named-export-config-file-based/package.json b/e2e/solid-router/basic-virtual-named-export-config-file-based/package.json index 2a9156916cf..a409e3d007e 100644 --- a/e2e/solid-router/basic-virtual-named-export-config-file-based/package.json +++ b/e2e/solid-router/basic-virtual-named-export-config-file-based/package.json @@ -11,21 +11,21 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/virtual-file-routes": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/basic-virtual-named-export-config-file-based/vite.config.ts b/e2e/solid-router/basic-virtual-named-export-config-file-based/vite.config.ts index ec379c254de..b83b11cd241 100644 --- a/e2e/solid-router/basic-virtual-named-export-config-file-based/vite.config.ts +++ b/e2e/solid-router/basic-virtual-named-export-config-file-based/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/e2e/solid-router/basic/package.json b/e2e/solid-router/basic/package.json index aa82fb49c99..ac973b49962 100644 --- a/e2e/solid-router/basic/package.json +++ b/e2e/solid-router/basic/package.json @@ -11,18 +11,18 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/basic/vite.config.js b/e2e/solid-router/basic/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/e2e/solid-router/basic/vite.config.js +++ b/e2e/solid-router/basic/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/e2e/solid-router/generator-cli-only/package.json b/e2e/solid-router/generator-cli-only/package.json index 22375b9f5b3..260a85acffb 100644 --- a/e2e/solid-router/generator-cli-only/package.json +++ b/e2e/solid-router/generator-cli-only/package.json @@ -11,19 +11,19 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-cli": "workspace:^", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/generator-cli-only/vite.config.js b/e2e/solid-router/generator-cli-only/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/e2e/solid-router/generator-cli-only/vite.config.js +++ b/e2e/solid-router/generator-cli-only/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/e2e/solid-router/js-only-file-based/package.json b/e2e/solid-router/js-only-file-based/package.json index 12ffea795d6..423073a1681 100644 --- a/e2e/solid-router/js-only-file-based/package.json +++ b/e2e/solid-router/js-only-file-based/package.json @@ -11,19 +11,19 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", "@tanstack/router-plugin": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/js-only-file-based/vite.config.js b/e2e/solid-router/js-only-file-based/vite.config.js index ee3b3654493..7036e7db12d 100644 --- a/e2e/solid-router/js-only-file-based/vite.config.js +++ b/e2e/solid-router/js-only-file-based/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/e2e/solid-router/rspack-basic-file-based/package.json b/e2e/solid-router/rspack-basic-file-based/package.json index b213e22f976..cb2978783ca 100644 --- a/e2e/solid-router/rspack-basic-file-based/package.json +++ b/e2e/solid-router/rspack-basic-file-based/package.json @@ -10,11 +10,11 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@playwright/test": "^1.61.0", diff --git a/e2e/solid-router/rspack-basic-virtual-named-export-config-file-based/package.json b/e2e/solid-router/rspack-basic-virtual-named-export-config-file-based/package.json index 045fbc2a003..9b28eab4e93 100644 --- a/e2e/solid-router/rspack-basic-virtual-named-export-config-file-based/package.json +++ b/e2e/solid-router/rspack-basic-virtual-named-export-config-file-based/package.json @@ -10,11 +10,11 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@playwright/test": "^1.61.0", diff --git a/e2e/solid-router/scroll-restoration-sandbox-vite/package.json b/e2e/solid-router/scroll-restoration-sandbox-vite/package.json index 3746c37c19e..b17091410f5 100644 --- a/e2e/solid-router/scroll-restoration-sandbox-vite/package.json +++ b/e2e/solid-router/scroll-restoration-sandbox-vite/package.json @@ -14,20 +14,20 @@ "test:e2e": "rm -rf port*.txt; pnpm run test:e2e:browser && pnpm run test:e2e:hash" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/scroll-restoration-sandbox-vite/vite.config.js b/e2e/solid-router/scroll-restoration-sandbox-vite/vite.config.js index e3329b79f3e..399d1d9a1f7 100644 --- a/e2e/solid-router/scroll-restoration-sandbox-vite/vite.config.js +++ b/e2e/solid-router/scroll-restoration-sandbox-vite/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/e2e/solid-router/sentry-integration/package.json b/e2e/solid-router/sentry-integration/package.json index 71f528bc69a..7f03665aa84 100644 --- a/e2e/solid-router/sentry-integration/package.json +++ b/e2e/solid-router/sentry-integration/package.json @@ -14,18 +14,18 @@ "@sentry/solid": "^10.32.0", "@sentry/tracing": "^7.120.4", "@sentry/vite-plugin": "^4.6.1", - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/sentry-integration/vite.config.js b/e2e/solid-router/sentry-integration/vite.config.js index 0ed7f0290c1..d263417c3ba 100644 --- a/e2e/solid-router/sentry-integration/vite.config.js +++ b/e2e/solid-router/sentry-integration/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { sentryVitePlugin } from '@sentry/vite-plugin' import tailwindcss from '@tailwindcss/vite' diff --git a/e2e/solid-router/view-transitions/package.json b/e2e/solid-router/view-transitions/package.json index c6d6df4c971..5268644449b 100644 --- a/e2e/solid-router/view-transitions/package.json +++ b/e2e/solid-router/view-transitions/package.json @@ -11,22 +11,22 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-router/view-transitions/vite.config.js b/e2e/solid-router/view-transitions/vite.config.js index 79454008ba6..71e662f1cff 100644 --- a/e2e/solid-router/view-transitions/vite.config.js +++ b/e2e/solid-router/view-transitions/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/e2e/solid-start/basic-auth/package.json b/e2e/solid-start/basic-auth/package.json index ffcab8cc1ea..21e500e4638 100644 --- a/e2e/solid-start/basic-auth/package.json +++ b/e2e/solid-start/basic-auth/package.json @@ -16,16 +16,17 @@ "@libsql/client": "^0.15.15", "@prisma/adapter-libsql": "^7.0.0", "@prisma/client": "^7.0.0", - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", @@ -35,7 +36,6 @@ "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/basic-auth/vite.config.ts b/e2e/solid-start/basic-auth/vite.config.ts index eebcf3d04b4..4e321ba3827 100644 --- a/e2e/solid-start/basic-auth/vite.config.ts +++ b/e2e/solid-start/basic-auth/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/basic-cloudflare/package.json b/e2e/solid-start/basic-cloudflare/package.json index 103703836c9..be272ee395c 100644 --- a/e2e/solid-start/basic-cloudflare/package.json +++ b/e2e/solid-start/basic-cloudflare/package.json @@ -13,15 +13,16 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@cloudflare/vite-plugin": "^1.29.0", "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", @@ -29,7 +30,6 @@ "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "wrangler": "^4.74.0" } } diff --git a/e2e/solid-start/basic-cloudflare/vite.config.ts b/e2e/solid-start/basic-cloudflare/vite.config.ts index b70055510b9..58fcc314091 100644 --- a/e2e/solid-start/basic-cloudflare/vite.config.ts +++ b/e2e/solid-start/basic-cloudflare/vite.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'vite' import { cloudflare } from '@cloudflare/vite-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/basic-solid-query/package.json b/e2e/solid-start/basic-solid-query/package.json index 02f5e8ee185..7f87defe3f1 100644 --- a/e2e/solid-start/basic-solid-query/package.json +++ b/e2e/solid-start/basic-solid-query/package.json @@ -12,20 +12,21 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-router-ssr-query": "workspace:^", "@tanstack/solid-start": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", @@ -33,7 +34,6 @@ "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/basic-solid-query/vite.config.ts b/e2e/solid-start/basic-solid-query/vite.config.ts index c0ae2c4cca2..70ab2f9f22a 100644 --- a/e2e/solid-start/basic-solid-query/vite.config.ts +++ b/e2e/solid-start/basic-solid-query/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/basic-tsr-config/package.json b/e2e/solid-start/basic-tsr-config/package.json index b3ca67999b9..f1fbc62807f 100644 --- a/e2e/solid-start/basic-tsr-config/package.json +++ b/e2e/solid-start/basic-tsr-config/package.json @@ -11,19 +11,19 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "srvx": "^0.11.9", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/basic-tsr-config/vite.config.ts b/e2e/solid-start/basic-tsr-config/vite.config.ts index 56b36b5c035..101392a768d 100644 --- a/e2e/solid-start/basic-tsr-config/vite.config.ts +++ b/e2e/solid-start/basic-tsr-config/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' export default defineConfig({ resolve: { tsconfigPaths: true }, diff --git a/e2e/solid-start/basic/package.json b/e2e/solid-start/basic/package.json index 563407b149f..dee9ed142e0 100644 --- a/e2e/solid-start/basic/package.json +++ b/e2e/solid-start/basic/package.json @@ -14,7 +14,7 @@ "test:e2e:local": "playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", @@ -22,7 +22,7 @@ "http-proxy-middleware": "^3.0.5", "js-cookie": "^3.0.5", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, @@ -31,6 +31,7 @@ "@rsbuild/core": "^2.1.0", "@rsbuild/plugin-babel": "^1.1.2", "@rsbuild/plugin-solid": "^2.0.0-beta.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/postcss": "^4.2.2", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", @@ -41,8 +42,7 @@ "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" }, "nx": { "metadata": { diff --git a/e2e/solid-start/basic/vite.config.ts b/e2e/solid-start/basic/vite.config.ts index 3cfb9f46c89..7fd7f7925df 100644 --- a/e2e/solid-start/basic/vite.config.ts +++ b/e2e/solid-start/basic/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import { e2eStartDummyServerForBuild } from '@tanstack/router-e2e-utils' import { isSpaMode } from './tests/utils/isSpaMode' import { isPrerender } from './tests/utils/isPrerender' diff --git a/e2e/solid-start/csp/package.json b/e2e/solid-start/csp/package.json index 9bb63a58b8f..1b0c4ac0642 100644 --- a/e2e/solid-start/csp/package.json +++ b/e2e/solid-start/csp/package.json @@ -11,19 +11,19 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "srvx": "^0.11.9", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/csp/vite.config.ts b/e2e/solid-start/csp/vite.config.ts index a9913da087e..e257f5ed9e0 100644 --- a/e2e/solid-start/csp/vite.config.ts +++ b/e2e/solid-start/csp/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' export default defineConfig({ server: { diff --git a/e2e/solid-start/css-modules/package.json b/e2e/solid-start/css-modules/package.json index 6bd4c10be98..4ffddf31da5 100644 --- a/e2e/solid-start/css-modules/package.json +++ b/e2e/solid-start/css-modules/package.json @@ -14,13 +14,14 @@ "test:e2e": "rm -rf port*.txt; pnpm run test:e2e:dev" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:*", "@tanstack/solid-start": "workspace:*", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:*", "@types/node": "^22.10.2", "sass": "^1.97.2", @@ -28,7 +29,6 @@ "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/e2e/solid-start/css-modules/vite.config.ts b/e2e/solid-start/css-modules/vite.config.ts index 48a1788a138..e5337af8d88 100644 --- a/e2e/solid-start/css-modules/vite.config.ts +++ b/e2e/solid-start/css-modules/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' export default defineConfig({ resolve: { tsconfigPaths: true }, diff --git a/e2e/solid-start/custom-basepath/package.json b/e2e/solid-start/custom-basepath/package.json index 613b52e5a80..f41c8ca4fad 100644 --- a/e2e/solid-start/custom-basepath/package.json +++ b/e2e/solid-start/custom-basepath/package.json @@ -11,16 +11,17 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", "express": "^5.2.1", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/express": "^5.0.6", @@ -32,7 +33,6 @@ "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/e2e/solid-start/custom-basepath/vite.config.ts b/e2e/solid-start/custom-basepath/vite.config.ts index 7f0ece5c8eb..74db2d43213 100644 --- a/e2e/solid-start/custom-basepath/vite.config.ts +++ b/e2e/solid-start/custom-basepath/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/deferred-hydration/package.json b/e2e/solid-start/deferred-hydration/package.json index a735999357b..0449c1edf2b 100644 --- a/e2e/solid-start/deferred-hydration/package.json +++ b/e2e/solid-start/deferred-hydration/package.json @@ -18,22 +18,22 @@ "test:e2e": "playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@rsbuild/core": "^2.1.0", "@rsbuild/plugin-babel": "^1.1.2", "@rsbuild/plugin-solid": "^2.0.0-beta.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "srvx": "^0.11.9", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" }, "nx": { "targets": { diff --git a/e2e/solid-start/deferred-hydration/vite.config.ts b/e2e/solid-start/deferred-hydration/vite.config.ts index 70f388638a8..ee4b99a5f5b 100644 --- a/e2e/solid-start/deferred-hydration/vite.config.ts +++ b/e2e/solid-start/deferred-hydration/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' const outDir = process.env.E2E_DIST_DIR ?? 'dist-vite-ssr' diff --git a/e2e/solid-start/query-integration/package.json b/e2e/solid-start/query-integration/package.json index a567be506c3..94907ad0367 100644 --- a/e2e/solid-start/query-integration/package.json +++ b/e2e/solid-start/query-integration/package.json @@ -12,26 +12,26 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-router-ssr-query": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/query-integration/vite.config.ts b/e2e/solid-start/query-integration/vite.config.ts index c0ae2c4cca2..70ab2f9f22a 100644 --- a/e2e/solid-start/query-integration/vite.config.ts +++ b/e2e/solid-start/query-integration/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/scroll-restoration/package.json b/e2e/solid-start/scroll-restoration/package.json index 070cc20bf75..24c9d15e872 100644 --- a/e2e/solid-start/scroll-restoration/package.json +++ b/e2e/solid-start/scroll-restoration/package.json @@ -12,17 +12,18 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", @@ -31,7 +32,6 @@ "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/scroll-restoration/vite.config.ts b/e2e/solid-start/scroll-restoration/vite.config.ts index e4bf298e6d6..fc8afa0e720 100644 --- a/e2e/solid-start/scroll-restoration/vite.config.ts +++ b/e2e/solid-start/scroll-restoration/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/selective-ssr/package.json b/e2e/solid-start/selective-ssr/package.json index 00dd54d61e3..263f94d3710 100644 --- a/e2e/solid-start/selective-ssr/package.json +++ b/e2e/solid-start/selective-ssr/package.json @@ -12,13 +12,14 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "srvx": "^0.11.9", @@ -26,7 +27,6 @@ "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/e2e/solid-start/selective-ssr/vite.config.ts b/e2e/solid-start/selective-ssr/vite.config.ts index e4bf298e6d6..fc8afa0e720 100644 --- a/e2e/solid-start/selective-ssr/vite.config.ts +++ b/e2e/solid-start/selective-ssr/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/serialization-adapters/package.json b/e2e/solid-start/serialization-adapters/package.json index 4c24bf1b36e..0e08baa4130 100644 --- a/e2e/solid-start/serialization-adapters/package.json +++ b/e2e/solid-start/serialization-adapters/package.json @@ -12,15 +12,16 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "vite-tsconfig-paths": "^5.1.4", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", @@ -28,7 +29,6 @@ "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/serialization-adapters/vite.config.ts b/e2e/solid-start/serialization-adapters/vite.config.ts index e4bf298e6d6..fc8afa0e720 100644 --- a/e2e/solid-start/serialization-adapters/vite.config.ts +++ b/e2e/solid-start/serialization-adapters/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/server-functions/package.json b/e2e/solid-start/server-functions/package.json index f49db22ce4d..5e1f9ba081d 100644 --- a/e2e/solid-start/server-functions/package.json +++ b/e2e/solid-start/server-functions/package.json @@ -12,21 +12,22 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-router-ssr-query": "workspace:^", "@tanstack/solid-start": "workspace:^", "js-cookie": "^3.0.5", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/js-cookie": "^3.0.6", @@ -36,7 +37,6 @@ "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/server-functions/vite.config.ts b/e2e/solid-start/server-functions/vite.config.ts index fc622bbfb02..fe814d6f03e 100644 --- a/e2e/solid-start/server-functions/vite.config.ts +++ b/e2e/solid-start/server-functions/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' const FUNCTIONS_WITH_CONSTANT_ID = [ diff --git a/e2e/solid-start/server-routes/package.json b/e2e/solid-start/server-routes/package.json index e7f9bc8c2ef..d8e6f0b2735 100644 --- a/e2e/solid-start/server-routes/package.json +++ b/e2e/solid-start/server-routes/package.json @@ -12,20 +12,21 @@ "test:e2e": "playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-query": "^6.0.0-beta.7", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-query": "^6.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-router-ssr-query": "workspace:^", "@tanstack/solid-start": "workspace:^", "js-cookie": "^3.0.5", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/js-cookie": "^3.0.6", @@ -35,7 +36,6 @@ "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/server-routes/vite.config.ts b/e2e/solid-start/server-routes/vite.config.ts index e4bf298e6d6..fc8afa0e720 100644 --- a/e2e/solid-start/server-routes/vite.config.ts +++ b/e2e/solid-start/server-routes/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/solid-query-layout-suspense/package.json b/e2e/solid-start/solid-query-layout-suspense/package.json index 7bc5265c743..2781ab357cf 100644 --- a/e2e/solid-start/solid-query-layout-suspense/package.json +++ b/e2e/solid-start/solid-query-layout-suspense/package.json @@ -10,19 +10,19 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-query": "^6.0.0-beta.7", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-query": "^6.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/solid-query-layout-suspense/vite.config.ts b/e2e/solid-start/solid-query-layout-suspense/vite.config.ts index e1c2d5526c4..21adb398ce2 100644 --- a/e2e/solid-start/solid-query-layout-suspense/vite.config.ts +++ b/e2e/solid-start/solid-query-layout-suspense/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' export default defineConfig({ plugins: [tanstackStart(), solid({ ssr: true })], diff --git a/e2e/solid-start/spa-mode/package.json b/e2e/solid-start/spa-mode/package.json index d6989d456b3..5d902405743 100644 --- a/e2e/solid-start/spa-mode/package.json +++ b/e2e/solid-start/spa-mode/package.json @@ -12,21 +12,21 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/e2e/solid-start/spa-mode/vite.config.ts b/e2e/solid-start/spa-mode/vite.config.ts index b0394b9bf97..45fcae2e4d1 100644 --- a/e2e/solid-start/spa-mode/vite.config.ts +++ b/e2e/solid-start/spa-mode/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/start-manifest/package.json b/e2e/solid-start/start-manifest/package.json index 6427e2803ef..e508e41d386 100644 --- a/e2e/solid-start/start-manifest/package.json +++ b/e2e/solid-start/start-manifest/package.json @@ -10,20 +10,20 @@ "test:e2e": "playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-start": "workspace:^", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "srvx": "^0.11.9", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" }, "nx": { "targets": { diff --git a/e2e/solid-start/start-manifest/vite.config.ts b/e2e/solid-start/start-manifest/vite.config.ts index 896fa284f1b..e2a624d0581 100644 --- a/e2e/solid-start/start-manifest/vite.config.ts +++ b/e2e/solid-start/start-manifest/vite.config.ts @@ -1,6 +1,6 @@ import { tanstackStart } from '@tanstack/solid-start/plugin/vite' import { defineConfig } from 'vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' export default defineConfig({ server: { diff --git a/e2e/solid-start/virtual-routes/package.json b/e2e/solid-start/virtual-routes/package.json index 84338d960ea..f84edafbc00 100644 --- a/e2e/solid-start/virtual-routes/package.json +++ b/e2e/solid-start/virtual-routes/package.json @@ -12,18 +12,19 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", "@tanstack/virtual-file-routes": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", @@ -32,7 +33,6 @@ "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/virtual-routes/vite.config.ts b/e2e/solid-start/virtual-routes/vite.config.ts index 2dccd737ed4..498ba424e8d 100644 --- a/e2e/solid-start/virtual-routes/vite.config.ts +++ b/e2e/solid-start/virtual-routes/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/solid-start/website/package.json b/e2e/solid-start/website/package.json index 547de99c4de..d7c0c9dfbae 100644 --- a/e2e/solid-start/website/package.json +++ b/e2e/solid-start/website/package.json @@ -12,17 +12,18 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-router": "workspace:^", "@tanstack/solid-router-devtools": "workspace:^", "@tanstack/solid-start": "workspace:^", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { "@playwright/test": "^1.61.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", @@ -30,7 +31,6 @@ "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/e2e/solid-start/website/vite.config.ts b/e2e/solid-start/website/vite.config.ts index e4bf298e6d6..fc8afa0e720 100644 --- a/e2e/solid-start/website/vite.config.ts +++ b/e2e/solid-start/website/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/e2e/vue-router/basepath-file-based/package.json b/e2e/vue-router/basepath-file-based/package.json index c9e06e47b3a..cddebf1d0f7 100644 --- a/e2e/vue-router/basepath-file-based/package.json +++ b/e2e/vue-router/basepath-file-based/package.json @@ -13,7 +13,7 @@ "dependencies": { "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", - "@tanstack/vue-query": "^5.90.0", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-query-devtools": "^6.1.2", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", diff --git a/e2e/vue-router/basic-virtual-file-based/package.json b/e2e/vue-router/basic-virtual-file-based/package.json index 567999f255d..998ac21bde1 100644 --- a/e2e/vue-router/basic-virtual-file-based/package.json +++ b/e2e/vue-router/basic-virtual-file-based/package.json @@ -14,7 +14,7 @@ "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", "@tanstack/virtual-file-routes": "workspace:^", - "@tanstack/vue-query": "^5.90.0", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-query-devtools": "^6.1.2", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", diff --git a/e2e/vue-router/basic-virtual-named-export-config-file-based/package.json b/e2e/vue-router/basic-virtual-named-export-config-file-based/package.json index 66f1b479553..295c9cb6f32 100644 --- a/e2e/vue-router/basic-virtual-named-export-config-file-based/package.json +++ b/e2e/vue-router/basic-virtual-named-export-config-file-based/package.json @@ -14,7 +14,7 @@ "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", "@tanstack/virtual-file-routes": "workspace:^", - "@tanstack/vue-query": "^5.90.0", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-query-devtools": "^6.1.2", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", diff --git a/e2e/vue-router/basic-vue-query-file-based/package.json b/e2e/vue-router/basic-vue-query-file-based/package.json index 772e6303669..44417eaff44 100644 --- a/e2e/vue-router/basic-vue-query-file-based/package.json +++ b/e2e/vue-router/basic-vue-query-file-based/package.json @@ -13,7 +13,7 @@ "dependencies": { "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", - "@tanstack/vue-query": "^5.90.0", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-query-devtools": "^6.1.2", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", diff --git a/e2e/vue-router/basic-vue-query/package.json b/e2e/vue-router/basic-vue-query/package.json index b1bc2345956..a8bf14b6f48 100644 --- a/e2e/vue-router/basic-vue-query/package.json +++ b/e2e/vue-router/basic-vue-query/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/vue-query": "^5.90.0", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-query-devtools": "^6.1.2", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", diff --git a/e2e/vue-router/js-only-file-based/package.json b/e2e/vue-router/js-only-file-based/package.json index d7f062038ea..f650d14f6ac 100644 --- a/e2e/vue-router/js-only-file-based/package.json +++ b/e2e/vue-router/js-only-file-based/package.json @@ -13,7 +13,7 @@ "dependencies": { "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", - "@tanstack/vue-query": "^5.90.0", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-query-devtools": "^6.1.2", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", diff --git a/e2e/vue-router/view-transitions/package.json b/e2e/vue-router/view-transitions/package.json index 1e693e25db2..22bb7702c56 100644 --- a/e2e/vue-router/view-transitions/package.json +++ b/e2e/vue-router/view-transitions/package.json @@ -13,7 +13,7 @@ "dependencies": { "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "workspace:^", - "@tanstack/vue-query": "^5.90.0", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-query-devtools": "^6.1.2", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", diff --git a/e2e/vue-start/basic-vue-query/package.json b/e2e/vue-start/basic-vue-query/package.json index 9162a2b6a6a..68f23b0838f 100644 --- a/e2e/vue-start/basic-vue-query/package.json +++ b/e2e/vue-start/basic-vue-query/package.json @@ -12,7 +12,7 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@tanstack/vue-query": "^5.92.1", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-query-devtools": "^6.1.2", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", @@ -28,11 +28,11 @@ "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", "srvx": "^0.11.9", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/e2e/vue-start/query-integration/package.json b/e2e/vue-start/query-integration/package.json index a3b775e0ebc..b4ab0d2e037 100644 --- a/e2e/vue-start/query-integration/package.json +++ b/e2e/vue-start/query-integration/package.json @@ -12,7 +12,7 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@tanstack/vue-query": "^5.90.0", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-query-devtools": "^5.90.0", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", @@ -27,10 +27,10 @@ "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/e2e/vue-start/server-functions/package.json b/e2e/vue-start/server-functions/package.json index 7c631b1fcca..3750c2775d7 100644 --- a/e2e/vue-start/server-functions/package.json +++ b/e2e/vue-start/server-functions/package.json @@ -12,7 +12,7 @@ "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" }, "dependencies": { - "@tanstack/vue-query": "^5.90.9", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", "@tanstack/vue-router-ssr-query": "workspace:^", @@ -29,12 +29,12 @@ "@tanstack/router-e2e-utils": "workspace:^", "@types/js-cookie": "^3.0.6", "@types/node": "^22.10.2", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", "combinate": "^1.1.11", "srvx": "^0.11.9", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/e2e/vue-start/server-routes/package.json b/e2e/vue-start/server-routes/package.json index 4407103e81e..3600196e00f 100644 --- a/e2e/vue-start/server-routes/package.json +++ b/e2e/vue-start/server-routes/package.json @@ -12,7 +12,7 @@ "test:e2e": "playwright test --project=chromium" }, "dependencies": { - "@tanstack/vue-query": "^5.90.9", + "@tanstack/vue-query": "catalog:", "@tanstack/vue-router": "workspace:^", "@tanstack/vue-router-devtools": "workspace:^", "@tanstack/vue-router-ssr-query": "workspace:^", @@ -29,12 +29,12 @@ "@tanstack/router-e2e-utils": "workspace:^", "@types/js-cookie": "^3.0.6", "@types/node": "^22.10.2", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", "combinate": "^1.1.11", "srvx": "^0.11.9", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/authenticated-routes-firebase/package.json b/examples/react/authenticated-routes-firebase/package.json index c6465c19405..89bc91e3bd5 100644 --- a/examples/react/authenticated-routes-firebase/package.json +++ b/examples/react/authenticated-routes-firebase/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "firebase": "^11.4.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/authenticated-routes/package.json b/examples/react/authenticated-routes/package.json index 7e2743b760d..4d0bf221edf 100644 --- a/examples/react/authenticated-routes/package.json +++ b/examples/react/authenticated-routes/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", diff --git a/examples/react/basic-default-search-params/package.json b/examples/react/basic-default-search-params/package.json index 69239de4e0d..fd301e269b3 100644 --- a/examples/react/basic-default-search-params/package.json +++ b/examples/react/basic-default-search-params/package.json @@ -10,8 +10,8 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-query": "catalog:", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -22,8 +22,8 @@ "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/basic-devtools-panel/package.json b/examples/react/basic-devtools-panel/package.json index 9f83a686489..7f45996dceb 100644 --- a/examples/react/basic-devtools-panel/package.json +++ b/examples/react/basic-devtools-panel/package.json @@ -11,7 +11,7 @@ "dependencies": { "@tailwindcss/vite": "^4.2.2", "@tanstack/react-query-devtools": "^5.67.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/basic-file-based/package.json b/examples/react/basic-file-based/package.json index b13da4adca1..9c483a9003c 100644 --- a/examples/react/basic-file-based/package.json +++ b/examples/react/basic-file-based/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", diff --git a/examples/react/basic-non-nested-devtools/package.json b/examples/react/basic-non-nested-devtools/package.json index 0c747b097ed..75461ace4b5 100644 --- a/examples/react/basic-non-nested-devtools/package.json +++ b/examples/react/basic-non-nested-devtools/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/basic-react-query-file-based/package.json b/examples/react/basic-react-query-file-based/package.json index aff759e64cd..d1dae219f8f 100644 --- a/examples/react/basic-react-query-file-based/package.json +++ b/examples/react/basic-react-query-file-based/package.json @@ -10,11 +10,11 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", @@ -24,8 +24,8 @@ "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/basic-react-query/package.json b/examples/react/basic-react-query/package.json index 443c16f8c86..f9f0b830e88 100644 --- a/examples/react/basic-react-query/package.json +++ b/examples/react/basic-react-query/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -22,8 +22,8 @@ "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/basic-ssr-file-based/package.json b/examples/react/basic-ssr-file-based/package.json index c046f9e6d10..ff7a73a8412 100644 --- a/examples/react/basic-ssr-file-based/package.json +++ b/examples/react/basic-ssr-file-based/package.json @@ -11,8 +11,8 @@ "debug": "node --inspect-brk server" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/react-router": "^1.170.27", + "@tanstack/router-plugin": "^1.168.30", "compression": "^1.8.0", "express": "^5.2.1", "get-port": "^7.1.0", diff --git a/examples/react/basic-ssr-streaming-file-based/package.json b/examples/react/basic-ssr-streaming-file-based/package.json index f20318d88d6..d746dc9ac3d 100644 --- a/examples/react/basic-ssr-streaming-file-based/package.json +++ b/examples/react/basic-ssr-streaming-file-based/package.json @@ -11,8 +11,8 @@ "debug": "node --inspect-brk server" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/react-router": "^1.170.27", + "@tanstack/router-plugin": "^1.168.30", "compression": "^1.8.0", "express": "^5.2.1", "get-port": "^7.1.0", diff --git a/examples/react/basic-virtual-file-based/package.json b/examples/react/basic-virtual-file-based/package.json index b55c0b1bdf0..331faca7e92 100644 --- a/examples/react/basic-virtual-file-based/package.json +++ b/examples/react/basic-virtual-file-based/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "@tanstack/virtual-file-routes": "^1.162.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/basic-virtual-inside-file-based/package.json b/examples/react/basic-virtual-inside-file-based/package.json index 473dd8a81cf..430d2fc9712 100644 --- a/examples/react/basic-virtual-inside-file-based/package.json +++ b/examples/react/basic-virtual-inside-file-based/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "@tanstack/virtual-file-routes": "^1.162.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/basic/package.json b/examples/react/basic/package.json index c030b321f15..9e070e3e366 100644 --- a/examples/react/basic/package.json +++ b/examples/react/basic/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/deferred-data/package.json b/examples/react/deferred-data/package.json index c36bb4fafaa..be214567c7c 100644 --- a/examples/react/deferred-data/package.json +++ b/examples/react/deferred-data/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/i18n-paraglide/package.json b/examples/react/i18n-paraglide/package.json index f82d68e8cde..2b678ad81d0 100644 --- a/examples/react/i18n-paraglide/package.json +++ b/examples/react/i18n-paraglide/package.json @@ -11,8 +11,8 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/react-router": "^1.170.27", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.1.1", "react-dom": "^19.1.1", "tailwindcss": "^4.2.2" diff --git a/examples/react/kitchen-sink-file-based/package.json b/examples/react/kitchen-sink-file-based/package.json index c453ff25f68..a84776db902 100644 --- a/examples/react/kitchen-sink-file-based/package.json +++ b/examples/react/kitchen-sink-file-based/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "immer": "^10.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/kitchen-sink-react-query-file-based/package.json b/examples/react/kitchen-sink-react-query-file-based/package.json index 66bce428ea0..d73c409c1cc 100644 --- a/examples/react/kitchen-sink-react-query-file-based/package.json +++ b/examples/react/kitchen-sink-react-query-file-based/package.json @@ -10,11 +10,11 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "immer": "^10.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -25,8 +25,8 @@ "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/kitchen-sink-react-query/package.json b/examples/react/kitchen-sink-react-query/package.json index 3ce98536f4a..f91334fcdbe 100644 --- a/examples/react/kitchen-sink-react-query/package.json +++ b/examples/react/kitchen-sink-react-query/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "immer": "^10.1.1", "react": "^19.0.0", @@ -24,8 +24,8 @@ "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/kitchen-sink/package.json b/examples/react/kitchen-sink/package.json index 7bae6392fe4..44e34975d62 100644 --- a/examples/react/kitchen-sink/package.json +++ b/examples/react/kitchen-sink/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "immer": "^10.1.1", "react": "^19.0.0", diff --git a/examples/react/large-file-based/package.json b/examples/react/large-file-based/package.json index 121a73a568d..8cfb25d8220 100644 --- a/examples/react/large-file-based/package.json +++ b/examples/react/large-file-based/package.json @@ -12,10 +12,10 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-query": "catalog:", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", @@ -25,8 +25,8 @@ "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/location-masking/package.json b/examples/react/location-masking/package.json index 34b52ef958b..e3a63e29b21 100644 --- a/examples/react/location-masking/package.json +++ b/examples/react/location-masking/package.json @@ -11,8 +11,8 @@ "dependencies": { "@radix-ui/react-dialog": "^1.1.6", "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-query": "catalog:", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -22,8 +22,8 @@ "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/navigation-blocking/package.json b/examples/react/navigation-blocking/package.json index cb92d282769..384b8da15ec 100644 --- a/examples/react/navigation-blocking/package.json +++ b/examples/react/navigation-blocking/package.json @@ -10,8 +10,8 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-query": "catalog:", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -21,8 +21,8 @@ "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/quickstart-esbuild-file-based/package.json b/examples/react/quickstart-esbuild-file-based/package.json index ad2e79b6eca..77c0de6e15f 100644 --- a/examples/react/quickstart-esbuild-file-based/package.json +++ b/examples/react/quickstart-esbuild-file-based/package.json @@ -9,9 +9,9 @@ "start": "dev" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", diff --git a/examples/react/quickstart-file-based/package.json b/examples/react/quickstart-file-based/package.json index 164630daea1..ebf82a35b03 100644 --- a/examples/react/quickstart-file-based/package.json +++ b/examples/react/quickstart-file-based/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", diff --git a/examples/react/quickstart-rspack-file-based/package.json b/examples/react/quickstart-rspack-file-based/package.json index b758b8a56c3..cf992365999 100644 --- a/examples/react/quickstart-rspack-file-based/package.json +++ b/examples/react/quickstart-rspack-file-based/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@tailwindcss/postcss": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "postcss": "^8.5.1", "react": "^19.0.0", @@ -19,7 +19,7 @@ "devDependencies": { "@rsbuild/core": "^2.1.0", "@rsbuild/plugin-react": "^2.0.0", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", "@typescript/native": "npm:typescript@^7.0.2", diff --git a/examples/react/quickstart-webpack-file-based/package.json b/examples/react/quickstart-webpack-file-based/package.json index 99386be4014..90657914768 100644 --- a/examples/react/quickstart-webpack-file-based/package.json +++ b/examples/react/quickstart-webpack-file-based/package.json @@ -7,14 +7,14 @@ "build": "webpack build && tsc --noEmit" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { "@swc/core": "^1.15.33", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", "html-webpack-plugin": "^5.6.3", diff --git a/examples/react/quickstart/package.json b/examples/react/quickstart/package.json index 8e57454acf3..18060c100e2 100644 --- a/examples/react/quickstart/package.json +++ b/examples/react/quickstart/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/router-monorepo-react-query/package.json b/examples/react/router-monorepo-react-query/package.json index 7dfb8c6be66..cb5463380e2 100644 --- a/examples/react/router-monorepo-react-query/package.json +++ b/examples/react/router-monorepo-react-query/package.json @@ -10,11 +10,11 @@ "dev": "pnpm post-query build && pnpm router build && pnpm post-feature build && pnpm app dev" }, "dependencies": { - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1" @@ -24,8 +24,8 @@ "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", "@typescript/native": "npm:typescript@^7.0.2", - "typescript": "npm:@typescript/typescript6@^6.0.2", "@vitejs/plugin-react": "^6.0.1", + "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", "vite-plugin-dts": "^4.5.4" }, diff --git a/examples/react/router-monorepo-react-query/packages/app/package.json b/examples/react/router-monorepo-react-query/packages/app/package.json index 336998abe7f..0fa6999da04 100644 --- a/examples/react/router-monorepo-react-query/packages/app/package.json +++ b/examples/react/router-monorepo-react-query/packages/app/package.json @@ -11,21 +11,21 @@ "dependencies": { "@router-mono-react-query/post-feature": "workspace:*", "@router-mono-react-query/router": "workspace:*", - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { + "@tailwindcss/vite": "^4.2.2", "@tanstack/react-router-devtools": "^1.167.1", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "^6.0.1", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-dts": "^4.5.4", - "@tailwindcss/vite": "^4.2.2" + "vite-plugin-dts": "^4.5.4" }, "nx": { "targets": { diff --git a/examples/react/router-monorepo-react-query/packages/post-feature/package.json b/examples/react/router-monorepo-react-query/packages/post-feature/package.json index 21dc0d77939..17f9480ba1e 100644 --- a/examples/react/router-monorepo-react-query/packages/post-feature/package.json +++ b/examples/react/router-monorepo-react-query/packages/post-feature/package.json @@ -8,17 +8,17 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@tanstack/react-query": "^5.90.0", "@router-mono-react-query/post-query": "workspace:*", "@router-mono-react-query/router": "workspace:*", + "@tanstack/react-query": "catalog:", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", "vite-plugin-dts": "^4.5.4" diff --git a/examples/react/router-monorepo-react-query/packages/post-query/package.json b/examples/react/router-monorepo-react-query/packages/post-query/package.json index 15b1daa4639..9c940a81ea1 100644 --- a/examples/react/router-monorepo-react-query/packages/post-query/package.json +++ b/examples/react/router-monorepo-react-query/packages/post-query/package.json @@ -8,13 +8,13 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "redaxios": "^0.5.1", "zod": "^4.4.3" }, "devDependencies": { - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/router-monorepo-react-query/packages/router/package.json b/examples/react/router-monorepo-react-query/packages/router/package.json index 8840dea47b8..47275bd87ec 100644 --- a/examples/react/router-monorepo-react-query/packages/router/package.json +++ b/examples/react/router-monorepo-react-query/packages/router/package.json @@ -9,10 +9,10 @@ "types": "./dist/index.d.ts", "dependencies": { "@router-mono-react-query/post-query": "workspace:*", - "@tanstack/history": "^1.162.0", - "@tanstack/react-query": "^5.90.0", - "@tanstack/react-router": "^1.170.19", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/history": "^1.162.1", + "@tanstack/react-query": "catalog:", + "@tanstack/react-router": "^1.170.27", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", @@ -21,8 +21,8 @@ "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", "vite-plugin-dts": "^4.5.4" diff --git a/examples/react/router-monorepo-simple-lazy/package.json b/examples/react/router-monorepo-simple-lazy/package.json index 6297e540dec..4d94d0af5cd 100644 --- a/examples/react/router-monorepo-simple-lazy/package.json +++ b/examples/react/router-monorepo-simple-lazy/package.json @@ -8,9 +8,9 @@ "dev": "pnpm router build && pnpm post-feature build && pnpm app dev" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1" diff --git a/examples/react/router-monorepo-simple-lazy/packages/post-feature/package.json b/examples/react/router-monorepo-simple-lazy/packages/post-feature/package.json index 5e387f61f47..0103fd674c6 100644 --- a/examples/react/router-monorepo-simple-lazy/packages/post-feature/package.json +++ b/examples/react/router-monorepo-simple-lazy/packages/post-feature/package.json @@ -16,16 +16,16 @@ } }, "dependencies": { - "@tanstack/react-query": "^5.90.0", "@router-mono-simple-lazy/router": "workspace:*", + "@tanstack/react-query": "catalog:", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", "vite-plugin-dts": "^4.5.4" diff --git a/examples/react/router-monorepo-simple-lazy/packages/router/package.json b/examples/react/router-monorepo-simple-lazy/packages/router/package.json index ee48da871fa..5b893303546 100644 --- a/examples/react/router-monorepo-simple-lazy/packages/router/package.json +++ b/examples/react/router-monorepo-simple-lazy/packages/router/package.json @@ -8,9 +8,9 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@tanstack/history": "^1.162.0", - "@tanstack/react-router": "^1.170.19", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/history": "^1.162.1", + "@tanstack/react-router": "^1.170.27", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", diff --git a/examples/react/router-monorepo-simple/package.json b/examples/react/router-monorepo-simple/package.json index b6df4df4a5e..18065c806d9 100644 --- a/examples/react/router-monorepo-simple/package.json +++ b/examples/react/router-monorepo-simple/package.json @@ -8,9 +8,9 @@ "dev": "pnpm router build && pnpm post-feature build && pnpm app dev" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1" diff --git a/examples/react/router-monorepo-simple/packages/router/package.json b/examples/react/router-monorepo-simple/packages/router/package.json index b59ef63fc93..168472d5f98 100644 --- a/examples/react/router-monorepo-simple/packages/router/package.json +++ b/examples/react/router-monorepo-simple/packages/router/package.json @@ -8,9 +8,9 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@tanstack/history": "^1.162.0", - "@tanstack/react-router": "^1.170.19", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/history": "^1.162.1", + "@tanstack/react-router": "^1.170.27", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", diff --git a/examples/react/scroll-restoration/package.json b/examples/react/scroll-restoration/package.json index 76081ff3b04..e7ee10c8e1c 100644 --- a/examples/react/scroll-restoration/package.json +++ b/examples/react/scroll-restoration/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "@tanstack/react-virtual": "^3.13.0", "react": "^19.0.0", diff --git a/examples/react/search-validator-adapters/package.json b/examples/react/search-validator-adapters/package.json index 86700f3b13f..8e9df46d5e8 100644 --- a/examples/react/search-validator-adapters/package.json +++ b/examples/react/search-validator-adapters/package.json @@ -12,10 +12,10 @@ "dependencies": { "@tailwindcss/vite": "^4.2.2", "@tanstack/arktype-adapter": "^1.167.0", - "@tanstack/react-query": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-query": "catalog:", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "@tanstack/valibot-adapter": "^1.167.0", "@tanstack/zod-adapter": "^1.167.0", "arktype": "^2.1.7", @@ -30,8 +30,8 @@ "@testing-library/react": "^16.2.0", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^6.0.1", "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.1", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/start-bare/package.json b/examples/react/start-bare/package.json index 4afcc5b3f65..330b1d01529 100644 --- a/examples/react/start-bare/package.json +++ b/examples/react/start-bare/package.json @@ -10,9 +10,9 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "zod": "^4.4.3" diff --git a/examples/react/start-basic-auth/package.json b/examples/react/start-basic-auth/package.json index c4fab434de0..56713b84304 100644 --- a/examples/react/start-basic-auth/package.json +++ b/examples/react/start-basic-auth/package.json @@ -14,9 +14,9 @@ "@libsql/client": "^0.15.15", "@prisma/adapter-libsql": "^7.0.0", "@prisma/client": "^7.0.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", diff --git a/examples/react/start-basic-authjs/package.json b/examples/react/start-basic-authjs/package.json index 7648214f17c..317124a8004 100644 --- a/examples/react/start-basic-authjs/package.json +++ b/examples/react/start-basic-authjs/package.json @@ -11,9 +11,9 @@ }, "dependencies": { "@auth/core": "^0.41.1", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "start-authjs": "^1.0.0", diff --git a/examples/react/start-basic-cloudflare/package.json b/examples/react/start-basic-cloudflare/package.json index ffc5a68c715..95cc169a066 100644 --- a/examples/react/start-basic-cloudflare/package.json +++ b/examples/react/start-basic-cloudflare/package.json @@ -12,9 +12,9 @@ "postinstall": "WRANGLER_LOG=warn npm run --silent cf-typegen" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/start-basic-react-query/package.json b/examples/react/start-basic-react-query/package.json index eb16a1b7eb0..2903bac7ad2 100644 --- a/examples/react/start-basic-react-query/package.json +++ b/examples/react/start-basic-react-query/package.json @@ -10,12 +10,12 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "@tanstack/react-router-ssr-query": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", @@ -26,9 +26,9 @@ "@types/node": "^22.5.4", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "^6.0.1", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/start-basic-rsbuild/package.json b/examples/react/start-basic-rsbuild/package.json index 9de8f02a015..44afd5733f2 100644 --- a/examples/react/start-basic-rsbuild/package.json +++ b/examples/react/start-basic-rsbuild/package.json @@ -10,9 +10,9 @@ "start": "srvx --prod -s ../client dist/server/index.js" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.2.3", "react-dom": "^19.2.3", "tailwind-merge": "^3.6.0", diff --git a/examples/react/start-basic-static/package.json b/examples/react/start-basic-static/package.json index ac369b8faf9..d8e4c367b9b 100644 --- a/examples/react/start-basic-static/package.json +++ b/examples/react/start-basic-static/package.json @@ -10,10 +10,10 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", - "@tanstack/start-static-server-functions": "^1.167.20", + "@tanstack/react-start": "^1.168.44", + "@tanstack/start-static-server-functions": "^1.167.27", "@vitejs/plugin-react": "^6.0.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/start-basic/package.json b/examples/react/start-basic/package.json index ade898753f4..70165026a4d 100644 --- a/examples/react/start-basic/package.json +++ b/examples/react/start-basic/package.json @@ -10,9 +10,9 @@ "start": "node .output/server/index.mjs" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "tailwind-merge": "^3.6.0", diff --git a/examples/react/start-bun/package.json b/examples/react/start-bun/package.json index 9c9b7e20e28..4bd6f10b481 100644 --- a/examples/react/start-bun/package.json +++ b/examples/react/start-bun/package.json @@ -15,11 +15,11 @@ "dependencies": { "@tailwindcss/vite": "^4.2.2", "@tanstack/react-devtools": "^0.7.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "@tanstack/react-router-ssr-query": "^1.167.1", - "@tanstack/react-start": "^1.168.36", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/react-start": "^1.168.44", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.1.1", "react-dom": "^19.1.1", "tailwindcss": "^4.2.2" diff --git a/examples/react/start-clerk-basic/package.json b/examples/react/start-clerk-basic/package.json index eb068eb88de..7e4697e46dc 100644 --- a/examples/react/start-clerk-basic/package.json +++ b/examples/react/start-clerk-basic/package.json @@ -11,9 +11,9 @@ }, "dependencies": { "@clerk/tanstack-react-start": "^0.27.14", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "@vitejs/plugin-react": "^6.0.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/start-convex-trellaux/package.json b/examples/react/start-convex-trellaux/package.json index 998eaa26b50..cdf629aaeae 100644 --- a/examples/react/start-convex-trellaux/package.json +++ b/examples/react/start-convex-trellaux/package.json @@ -13,12 +13,12 @@ }, "dependencies": { "@convex-dev/react-query": "0.0.0-alpha.8", - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "@tanstack/react-router-ssr-query": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "concurrently": "^8.2.2", "convex": "^1.19.0", "ky": "^1.7.4", @@ -35,9 +35,9 @@ "@types/node": "22.10.2", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "^6.0.1", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/start-counter/package.json b/examples/react/start-counter/package.json index afaedb0b1dc..257959da0f8 100644 --- a/examples/react/start-counter/package.json +++ b/examples/react/start-counter/package.json @@ -10,9 +10,9 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/start-i18n-paraglide/package.json b/examples/react/start-i18n-paraglide/package.json index 88d9c81298e..f8519b2f956 100644 --- a/examples/react/start-i18n-paraglide/package.json +++ b/examples/react/start-i18n-paraglide/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tanstack/react-devtools": "^0.7.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.1.1", "react-dom": "^19.1.1" }, diff --git a/examples/react/start-large/package.json b/examples/react/start-large/package.json index 369d1abe200..7f8b5349163 100644 --- a/examples/react/start-large/package.json +++ b/examples/react/start-large/package.json @@ -12,10 +12,10 @@ "test:types": "tsc --extendedDiagnostics" }, "dependencies": { - "@tanstack/react-query": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-query": "catalog:", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", @@ -27,9 +27,9 @@ "@types/node": "^22.5.4", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "^6.0.1", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" }, diff --git a/examples/react/start-material-ui/package.json b/examples/react/start-material-ui/package.json index 3b4588ef3fb..8ff3e1d6ce4 100644 --- a/examples/react/start-material-ui/package.json +++ b/examples/react/start-material-ui/package.json @@ -15,9 +15,9 @@ "@emotion/styled": "11.14.0", "@fontsource-variable/roboto": "5.2.5", "@mui/material": "6.4.7", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "zod": "^4.4.3" diff --git a/examples/react/start-rscs/package.json b/examples/react/start-rscs/package.json index b3e98d61905..b8c448ea68b 100644 --- a/examples/react/start-rscs/package.json +++ b/examples/react/start-rscs/package.json @@ -10,9 +10,9 @@ "start": "node .output/server/index.mjs" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "dexie": "^4.0.10", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/examples/react/start-streaming-data-from-server-functions/package.json b/examples/react/start-streaming-data-from-server-functions/package.json index 0cf6b2d40a0..70e73cdb2a7 100644 --- a/examples/react/start-streaming-data-from-server-functions/package.json +++ b/examples/react/start-streaming-data-from-server-functions/package.json @@ -10,9 +10,9 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "zod": "^4.4.3" diff --git a/examples/react/start-supabase-basic/package.json b/examples/react/start-supabase-basic/package.json index 79132b7bf60..b760367ccd8 100644 --- a/examples/react/start-supabase-basic/package.json +++ b/examples/react/start-supabase-basic/package.json @@ -15,9 +15,9 @@ "dependencies": { "@supabase/ssr": "^0.5.2", "@supabase/supabase-js": "^2.48.1", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1" diff --git a/examples/react/start-tailwind-v4/package.json b/examples/react/start-tailwind-v4/package.json index bbfa2f7dee2..711e4e5ae32 100644 --- a/examples/react/start-tailwind-v4/package.json +++ b/examples/react/start-tailwind-v4/package.json @@ -10,9 +10,9 @@ "start": "node .output/server/index.mjs" }, "dependencies": { - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "react": "^19.0.0", "react-dom": "^19.0.0", "tailwind-merge": "^3.6.0", diff --git a/examples/react/start-trellaux/package.json b/examples/react/start-trellaux/package.json index 723fe3f70e4..99977c5bc92 100644 --- a/examples/react/start-trellaux/package.json +++ b/examples/react/start-trellaux/package.json @@ -10,12 +10,12 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "@tanstack/react-router-ssr-query": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "ky": "^1.7.4", "msw": "^2.7.0", "react": "^19.0.0", @@ -30,9 +30,9 @@ "@types/node": "22.10.2", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "^6.0.1", "tailwindcss": "^4.2.2", - "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" } diff --git a/examples/react/start-workos/package.json b/examples/react/start-workos/package.json index 0fc2bb046cb..f4917595d40 100644 --- a/examples/react/start-workos/package.json +++ b/examples/react/start-workos/package.json @@ -14,9 +14,9 @@ "license": "MIT", "dependencies": { "@radix-ui/themes": "^3.3.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-start": "^1.168.36", + "@tanstack/react-start": "^1.168.44", "@workos/authkit-tanstack-react-start": "^0.5.0", "react": "^19.0.0", "react-dom": "^19.0.0" diff --git a/examples/react/view-transitions/package.json b/examples/react/view-transitions/package.json index a597e63551d..da746430b46 100644 --- a/examples/react/view-transitions/package.json +++ b/examples/react/view-transitions/package.json @@ -10,9 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "react": "^19.0.0", "react-dom": "^19.0.0", "redaxios": "^0.5.1", diff --git a/examples/react/with-framer-motion/package.json b/examples/react/with-framer-motion/package.json index cbd7e1e24f4..e833154633f 100644 --- a/examples/react/with-framer-motion/package.json +++ b/examples/react/with-framer-motion/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", "framer-motion": "^11.18.2", "react": "^19.0.0", diff --git a/examples/react/with-trpc-react-query/package.json b/examples/react/with-trpc-react-query/package.json index 9e623203662..492aeffaa83 100644 --- a/examples/react/with-trpc-react-query/package.json +++ b/examples/react/with-trpc-react-query/package.json @@ -11,11 +11,11 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-query": "^5.90.0", + "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "^5.90.0", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "@trpc/client": "^11.4.3", "@trpc/server": "^11.4.3", "@trpc/tanstack-react-query": "^11.4.3", diff --git a/examples/react/with-trpc/package.json b/examples/react/with-trpc/package.json index 6b872333861..a43d01e4a0a 100644 --- a/examples/react/with-trpc/package.json +++ b/examples/react/with-trpc/package.json @@ -11,9 +11,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/react-router": "^1.170.19", + "@tanstack/react-router": "^1.170.27", "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "@trpc/client": "^11.4.3", "@trpc/server": "^11.4.3", "express": "^5.2.1", diff --git a/examples/solid/authenticated-routes-firebase/package.json b/examples/solid/authenticated-routes-firebase/package.json index b2a8b9d3da6..030ceca9058 100644 --- a/examples/solid/authenticated-routes-firebase/package.json +++ b/examples/solid/authenticated-routes-firebase/package.json @@ -9,22 +9,22 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "firebase": "^11.4.0", "redaxios": "^0.5.1", "simple-icons": "^14.9.0", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/authenticated-routes-firebase/vite.config.js b/examples/solid/authenticated-routes-firebase/vite.config.js index 79454008ba6..71e662f1cff 100644 --- a/examples/solid/authenticated-routes-firebase/vite.config.js +++ b/examples/solid/authenticated-routes-firebase/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/authenticated-routes/package.json b/examples/solid/authenticated-routes/package.json index a03c23d6ca6..8e7c6c6eb23 100644 --- a/examples/solid/authenticated-routes/package.json +++ b/examples/solid/authenticated-routes/package.json @@ -9,20 +9,20 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/authenticated-routes/vite.config.js b/examples/solid/authenticated-routes/vite.config.js index 79454008ba6..71e662f1cff 100644 --- a/examples/solid/authenticated-routes/vite.config.js +++ b/examples/solid/authenticated-routes/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/basic-default-search-params/package.json b/examples/solid/basic-default-search-params/package.json index a8986ed1392..426c58f9261 100644 --- a/examples/solid/basic-default-search-params/package.json +++ b/examples/solid/basic-default-search-params/package.json @@ -9,20 +9,20 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-default-search-params/vite.config.js b/examples/solid/basic-default-search-params/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/basic-default-search-params/vite.config.js +++ b/examples/solid/basic-default-search-params/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/basic-devtools-panel/package.json b/examples/solid/basic-devtools-panel/package.json index c6e56817f6b..d7244698399 100644 --- a/examples/solid/basic-devtools-panel/package.json +++ b/examples/solid/basic-devtools-panel/package.json @@ -9,18 +9,18 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-devtools-panel/vite.config.js b/examples/solid/basic-devtools-panel/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/basic-devtools-panel/vite.config.js +++ b/examples/solid/basic-devtools-panel/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/basic-file-based/package.json b/examples/solid/basic-file-based/package.json index 560333b48dd..2824cc36d05 100644 --- a/examples/solid/basic-file-based/package.json +++ b/examples/solid/basic-file-based/package.json @@ -9,20 +9,20 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { - "@tanstack/router-plugin": "^1.168.24", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@tanstack/router-plugin": "^1.168.30", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-file-based/vite.config.js b/examples/solid/basic-file-based/vite.config.js index 79454008ba6..71e662f1cff 100644 --- a/examples/solid/basic-file-based/vite.config.js +++ b/examples/solid/basic-file-based/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/basic-non-nested-devtools/package.json b/examples/solid/basic-non-nested-devtools/package.json index 2861e6629f7..1c49b2afeee 100644 --- a/examples/solid/basic-non-nested-devtools/package.json +++ b/examples/solid/basic-non-nested-devtools/package.json @@ -9,20 +9,20 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-non-nested-devtools/vite.config.js b/examples/solid/basic-non-nested-devtools/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/basic-non-nested-devtools/vite.config.js +++ b/examples/solid/basic-non-nested-devtools/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/basic-solid-query-file-based/package.json b/examples/solid/basic-solid-query-file-based/package.json index b0d6ae35472..ce4f39c1098 100644 --- a/examples/solid/basic-solid-query-file-based/package.json +++ b/examples/solid/basic-solid-query-file-based/package.json @@ -10,22 +10,22 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { - "@tanstack/router-plugin": "^1.168.24", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@tanstack/router-plugin": "^1.168.30", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-solid-query-file-based/vite.config.js b/examples/solid/basic-solid-query-file-based/vite.config.js index 95863b470a8..691de8db161 100644 --- a/examples/solid/basic-solid-query-file-based/vite.config.js +++ b/examples/solid/basic-solid-query-file-based/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/basic-solid-query/package.json b/examples/solid/basic-solid-query/package.json index 7bc4191f358..c34642df9fd 100644 --- a/examples/solid/basic-solid-query/package.json +++ b/examples/solid/basic-solid-query/package.json @@ -9,21 +9,21 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { - "@tanstack/router-plugin": "^1.168.24", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@tanstack/router-plugin": "^1.168.30", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-solid-query/vite.config.js b/examples/solid/basic-solid-query/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/basic-solid-query/vite.config.js +++ b/examples/solid/basic-solid-query/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/basic-ssr-file-based/package.json b/examples/solid/basic-ssr-file-based/package.json index b01fab352a1..c61e3040b53 100644 --- a/examples/solid/basic-ssr-file-based/package.json +++ b/examples/solid/basic-ssr-file-based/package.json @@ -11,21 +11,21 @@ "debug": "node --inspect-brk server" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", "compression": "^1.8.0", "express": "^5.2.1", "get-port": "^7.1.0", "node-fetch": "^3.3.2", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "@types/express": "^5.0.6", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-ssr-file-based/vite.config.ts b/examples/solid/basic-ssr-file-based/vite.config.ts index 1d86df82a17..b2fb01412d8 100644 --- a/examples/solid/basic-ssr-file-based/vite.config.ts +++ b/examples/solid/basic-ssr-file-based/vite.config.ts @@ -2,7 +2,7 @@ import path from 'node:path' import url from 'node:url' import { tanstackRouter } from '@tanstack/router-plugin/vite' import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import type { BuildEnvironmentOptions } from 'vite' const __filename = url.fileURLToPath(import.meta.url) diff --git a/examples/solid/basic-ssr-streaming-file-based/package.json b/examples/solid/basic-ssr-streaming-file-based/package.json index 7a75852a96d..3973737778e 100644 --- a/examples/solid/basic-ssr-streaming-file-based/package.json +++ b/examples/solid/basic-ssr-streaming-file-based/package.json @@ -11,25 +11,25 @@ "debug": "node --inspect-brk server" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "compression": "^1.8.0", "express": "^5.2.1", "get-port": "^7.1.0", "node-fetch": "^3.3.2", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { - "@tanstack/router-plugin": "^1.168.24", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@tanstack/router-plugin": "^1.168.30", "@types/express": "^5.0.6", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-ssr-streaming-file-based/vite.config.js b/examples/solid/basic-ssr-streaming-file-based/vite.config.js index 03bd2116e44..f3dc4ab0030 100644 --- a/examples/solid/basic-ssr-streaming-file-based/vite.config.js +++ b/examples/solid/basic-ssr-streaming-file-based/vite.config.js @@ -1,7 +1,7 @@ import url from 'node:url' import path from 'node:path' import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/basic-virtual-file-based/package.json b/examples/solid/basic-virtual-file-based/package.json index 06c7d33e129..768d4436d25 100644 --- a/examples/solid/basic-virtual-file-based/package.json +++ b/examples/solid/basic-virtual-file-based/package.json @@ -9,21 +9,21 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "@tanstack/virtual-file-routes": "^1.162.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-virtual-file-based/vite.config.ts b/examples/solid/basic-virtual-file-based/vite.config.ts index ec379c254de..b83b11cd241 100644 --- a/examples/solid/basic-virtual-file-based/vite.config.ts +++ b/examples/solid/basic-virtual-file-based/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/basic-virtual-inside-file-based/package.json b/examples/solid/basic-virtual-inside-file-based/package.json index df32f13ff6c..30fc2e1af80 100644 --- a/examples/solid/basic-virtual-inside-file-based/package.json +++ b/examples/solid/basic-virtual-inside-file-based/package.json @@ -9,21 +9,21 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "@tanstack/virtual-file-routes": "^1.162.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic-virtual-inside-file-based/vite.config.ts b/examples/solid/basic-virtual-inside-file-based/vite.config.ts index 79454008ba6..71e662f1cff 100644 --- a/examples/solid/basic-virtual-inside-file-based/vite.config.ts +++ b/examples/solid/basic-virtual-inside-file-based/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/basic/package.json b/examples/solid/basic/package.json index 8719730c81e..fcb92bfa9cb 100644 --- a/examples/solid/basic/package.json +++ b/examples/solid/basic/package.json @@ -9,20 +9,20 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/basic/vite.config.js b/examples/solid/basic/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/basic/vite.config.js +++ b/examples/solid/basic/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/deferred-data/package.json b/examples/solid/deferred-data/package.json index 959b75dfe9d..c1b3aaf7565 100644 --- a/examples/solid/deferred-data/package.json +++ b/examples/solid/deferred-data/package.json @@ -9,19 +9,19 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/deferred-data/vite.config.js b/examples/solid/deferred-data/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/deferred-data/vite.config.js +++ b/examples/solid/deferred-data/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/i18n-paraglide/package.json b/examples/solid/i18n-paraglide/package.json index e259a9bcd65..58c5ebae750 100644 --- a/examples/solid/i18n-paraglide/package.json +++ b/examples/solid/i18n-paraglide/package.json @@ -10,19 +10,19 @@ "test": "vitest run" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "solid-js": "2.0.0-beta.32", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@inlang/paraglide-js": "^2.4.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/node": "^22.18.6", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/i18n-paraglide/vite.config.ts b/examples/solid/i18n-paraglide/vite.config.ts index 90768fc32e3..0c9eb28a4c8 100644 --- a/examples/solid/i18n-paraglide/vite.config.ts +++ b/examples/solid/i18n-paraglide/vite.config.ts @@ -1,6 +1,6 @@ import { resolve } from 'node:path' import { defineConfig } from 'vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import { paraglideVitePlugin } from '@inlang/paraglide-js' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/kitchen-sink-file-based/package.json b/examples/solid/kitchen-sink-file-based/package.json index 1ddaf901c94..7887101302f 100644 --- a/examples/solid/kitchen-sink-file-based/package.json +++ b/examples/solid/kitchen-sink-file-based/package.json @@ -9,21 +9,21 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "immer": "^10.1.1", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { - "@tanstack/router-plugin": "^1.168.24", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@tanstack/router-plugin": "^1.168.30", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/kitchen-sink-file-based/vite.config.js b/examples/solid/kitchen-sink-file-based/vite.config.js index ca85ceebb47..4c47e5e07e2 100644 --- a/examples/solid/kitchen-sink-file-based/vite.config.js +++ b/examples/solid/kitchen-sink-file-based/vite.config.js @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackRouter } from '@tanstack/router-plugin/vite' -import solidPlugin from 'vite-plugin-solid' +import solidPlugin from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/kitchen-sink-solid-query-file-based/package.json b/examples/solid/kitchen-sink-solid-query-file-based/package.json index aafe71a8036..cdcdd950931 100644 --- a/examples/solid/kitchen-sink-solid-query-file-based/package.json +++ b/examples/solid/kitchen-sink-solid-query-file-based/package.json @@ -9,23 +9,23 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "immer": "^10.1.1", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/kitchen-sink-solid-query-file-based/vite.config.js b/examples/solid/kitchen-sink-solid-query-file-based/vite.config.js index 378aa5c234c..25b144fb129 100644 --- a/examples/solid/kitchen-sink-solid-query-file-based/vite.config.js +++ b/examples/solid/kitchen-sink-solid-query-file-based/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { TanStackRouterVite } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/kitchen-sink-solid-query/package.json b/examples/solid/kitchen-sink-solid-query/package.json index 692b9bb2c83..16f78034036 100644 --- a/examples/solid/kitchen-sink-solid-query/package.json +++ b/examples/solid/kitchen-sink-solid-query/package.json @@ -9,22 +9,22 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "immer": "^10.1.1", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/kitchen-sink-solid-query/vite.config.js b/examples/solid/kitchen-sink-solid-query/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/kitchen-sink-solid-query/vite.config.js +++ b/examples/solid/kitchen-sink-solid-query/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/kitchen-sink/package.json b/examples/solid/kitchen-sink/package.json index 81f288a82e0..d4d7928fbd8 100644 --- a/examples/solid/kitchen-sink/package.json +++ b/examples/solid/kitchen-sink/package.json @@ -9,20 +9,20 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "immer": "^10.1.1", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/kitchen-sink/vite.config.js b/examples/solid/kitchen-sink/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/kitchen-sink/vite.config.js +++ b/examples/solid/kitchen-sink/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/large-file-based/package.json b/examples/solid/large-file-based/package.json index fcb46a10a50..993cedf297d 100644 --- a/examples/solid/large-file-based/package.json +++ b/examples/solid/large-file-based/package.json @@ -11,21 +11,21 @@ "test:types": "tsc --extendedDiagnostics" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/large-file-based/vite.config.js b/examples/solid/large-file-based/vite.config.js index 95863b470a8..691de8db161 100644 --- a/examples/solid/large-file-based/vite.config.js +++ b/examples/solid/large-file-based/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/location-masking/package.json b/examples/solid/location-masking/package.json index cd4db508573..0c694055335 100644 --- a/examples/solid/location-masking/package.json +++ b/examples/solid/location-masking/package.json @@ -9,19 +9,19 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/location-masking/vite.config.js b/examples/solid/location-masking/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/location-masking/vite.config.js +++ b/examples/solid/location-masking/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/navigation-blocking/package.json b/examples/solid/navigation-blocking/package.json index 2d01bb83b0e..28605eecf32 100644 --- a/examples/solid/navigation-blocking/package.json +++ b/examples/solid/navigation-blocking/package.json @@ -9,19 +9,19 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/navigation-blocking/vite.config.js b/examples/solid/navigation-blocking/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/navigation-blocking/vite.config.js +++ b/examples/solid/navigation-blocking/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/quickstart-esbuild-file-based/package.json b/examples/solid/quickstart-esbuild-file-based/package.json index 3bc314d9457..ff945cfb9e6 100644 --- a/examples/solid/quickstart-esbuild-file-based/package.json +++ b/examples/solid/quickstart-esbuild-file-based/package.json @@ -9,12 +9,12 @@ "start": "dev" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, diff --git a/examples/solid/quickstart-file-based/package.json b/examples/solid/quickstart-file-based/package.json index d1eac6412be..09fcfdff91c 100644 --- a/examples/solid/quickstart-file-based/package.json +++ b/examples/solid/quickstart-file-based/package.json @@ -9,20 +9,20 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { - "@tanstack/router-plugin": "^1.168.24", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@tanstack/router-plugin": "^1.168.30", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/quickstart-file-based/vite.config.js b/examples/solid/quickstart-file-based/vite.config.js index 79454008ba6..71e662f1cff 100644 --- a/examples/solid/quickstart-file-based/vite.config.js +++ b/examples/solid/quickstart-file-based/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/quickstart-rspack-file-based/package.json b/examples/solid/quickstart-rspack-file-based/package.json index 5e605d90c6f..fa5046b442e 100644 --- a/examples/solid/quickstart-rspack-file-based/package.json +++ b/examples/solid/quickstart-rspack-file-based/package.json @@ -8,19 +8,19 @@ "preview": "rsbuild preview" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/postcss": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "postcss": "^8.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@rsbuild/core": "^2.1.0", "@rsbuild/plugin-babel": "^1.1.2", "@rsbuild/plugin-solid": "^2.0.0-beta.0", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2" } diff --git a/examples/solid/quickstart-webpack-file-based/package.json b/examples/solid/quickstart-webpack-file-based/package.json index aa3bfda5105..c60e893cfa7 100644 --- a/examples/solid/quickstart-webpack-file-based/package.json +++ b/examples/solid/quickstart-webpack-file-based/package.json @@ -7,18 +7,18 @@ "build": "webpack build && tsc --noEmit" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "solid-js": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@babel/core": "^7.28.5", "@babel/preset-typescript": "^7.27.1", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "babel-loader": "^10.0.0", - "babel-preset-solid": "2.0.0-beta.32", + "babel-preset-solid": "^2.0.0-rc.0", "css-loader": "^7.1.2", "html-webpack-plugin": "^5.6.3", "postcss": "^8.5.6", diff --git a/examples/solid/quickstart/package.json b/examples/solid/quickstart/package.json index 5e972274e5a..8e26949268f 100644 --- a/examples/solid/quickstart/package.json +++ b/examples/solid/quickstart/package.json @@ -9,17 +9,17 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "solid-js": "2.0.0-beta.32", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/quickstart/vite.config.js b/examples/solid/quickstart/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/quickstart/vite.config.js +++ b/examples/solid/quickstart/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/router-monorepo-simple-lazy/package.json b/examples/solid/router-monorepo-simple-lazy/package.json index 0577ae1dd0f..8c889bd8b41 100644 --- a/examples/solid/router-monorepo-simple-lazy/package.json +++ b/examples/solid/router-monorepo-simple-lazy/package.json @@ -8,20 +8,20 @@ "dev": "pnpm router build && pnpm post-feature build && pnpm app dev" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/node": "^22.7.4", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-dts": "^4.5.4", - "vite-plugin-solid": "^3.0.0-next.23" + "vite-plugin-dts": "^4.5.4" }, "keywords": [], "author": "", diff --git a/examples/solid/router-monorepo-simple-lazy/packages/app/vite.config.ts b/examples/solid/router-monorepo-simple-lazy/packages/app/vite.config.ts index 474d3104bdb..a81c91a24cc 100644 --- a/examples/solid/router-monorepo-simple-lazy/packages/app/vite.config.ts +++ b/examples/solid/router-monorepo-simple-lazy/packages/app/vite.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'vite' import dts from 'vite-plugin-dts' import * as path from 'node:path' import { fileURLToPath } from 'node:url' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' const __filename = fileURLToPath(import.meta.url) diff --git a/examples/solid/router-monorepo-simple-lazy/packages/post-feature/package.json b/examples/solid/router-monorepo-simple-lazy/packages/post-feature/package.json index 92524a47042..7ebbf409e7b 100644 --- a/examples/solid/router-monorepo-simple-lazy/packages/post-feature/package.json +++ b/examples/solid/router-monorepo-simple-lazy/packages/post-feature/package.json @@ -16,13 +16,13 @@ } }, "dependencies": { - "@tanstack/solid-query": "^6.0.0-beta.7", + "@tanstack/solid-query": "^6.0.0-rc.0", "@router-solid-mono-simple-lazy/router": "workspace:*", - "solid-js": "2.0.0-beta.32", - "@solidjs/web": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0", + "@solidjs/web": "^2.0.0-rc.0" }, "devDependencies": { - "vite-plugin-solid": "^3.0.0-next.23", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", diff --git a/examples/solid/router-monorepo-simple-lazy/packages/post-feature/vite.config.ts b/examples/solid/router-monorepo-simple-lazy/packages/post-feature/vite.config.ts index e5ab1b29f5a..c5d8be8cbe8 100644 --- a/examples/solid/router-monorepo-simple-lazy/packages/post-feature/vite.config.ts +++ b/examples/solid/router-monorepo-simple-lazy/packages/post-feature/vite.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'vite' import dts from 'vite-plugin-dts' import * as path from 'node:path' import { fileURLToPath } from 'node:url' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) diff --git a/examples/solid/router-monorepo-simple-lazy/packages/router/package.json b/examples/solid/router-monorepo-simple-lazy/packages/router/package.json index f4492661aca..b9186d78639 100644 --- a/examples/solid/router-monorepo-simple-lazy/packages/router/package.json +++ b/examples/solid/router-monorepo-simple-lazy/packages/router/package.json @@ -8,16 +8,16 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@tanstack/history": "^1.162.0", + "@tanstack/history": "^1.162.1", + "@tanstack/router-plugin": "^1.168.30", "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/router-plugin": "^1.168.24", "redaxios": "^0.5.1", "zod": "^4.4.3", - "solid-js": "2.0.0-beta.32", - "@solidjs/web": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0", + "@solidjs/web": "^2.0.0-rc.0" }, "devDependencies": { - "vite-plugin-solid": "^3.0.0-next.23", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", diff --git a/examples/solid/router-monorepo-simple-lazy/packages/router/vite.config.ts b/examples/solid/router-monorepo-simple-lazy/packages/router/vite.config.ts index fd99b4b7de1..d06f41bdfb4 100644 --- a/examples/solid/router-monorepo-simple-lazy/packages/router/vite.config.ts +++ b/examples/solid/router-monorepo-simple-lazy/packages/router/vite.config.ts @@ -3,7 +3,7 @@ import dts from 'vite-plugin-dts' import * as path from 'node:path' import { fileURLToPath } from 'node:url' import { tanstackRouter } from '@tanstack/router-plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) diff --git a/examples/solid/router-monorepo-simple/package.json b/examples/solid/router-monorepo-simple/package.json index d97ccecb1a4..719e2ff9d69 100644 --- a/examples/solid/router-monorepo-simple/package.json +++ b/examples/solid/router-monorepo-simple/package.json @@ -8,20 +8,20 @@ "dev": "pnpm router build && pnpm post-feature build && pnpm app dev" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/node": "^22.7.4", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-dts": "^4.5.4", - "vite-plugin-solid": "^3.0.0-next.23" + "vite-plugin-dts": "^4.5.4" }, "keywords": [], "author": "", diff --git a/examples/solid/router-monorepo-simple/packages/app/package.json b/examples/solid/router-monorepo-simple/packages/app/package.json index 514423c7f1d..87d205c595b 100644 --- a/examples/solid/router-monorepo-simple/packages/app/package.json +++ b/examples/solid/router-monorepo-simple/packages/app/package.json @@ -11,11 +11,11 @@ "dependencies": { "@router-solid-mono-simple/post-feature": "workspace:*", "@router-solid-mono-simple/router": "workspace:*", - "solid-js": "2.0.0-beta.32", - "@solidjs/web": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0", + "@solidjs/web": "^2.0.0-rc.0" }, "devDependencies": { - "vite-plugin-solid": "^3.0.0-next.23", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "@tanstack/solid-router-devtools": "^2.0.0-beta.25", diff --git a/examples/solid/router-monorepo-simple/packages/app/vite.config.ts b/examples/solid/router-monorepo-simple/packages/app/vite.config.ts index da34410003f..c9a3fc1400e 100644 --- a/examples/solid/router-monorepo-simple/packages/app/vite.config.ts +++ b/examples/solid/router-monorepo-simple/packages/app/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import * as path from 'node:path' import { defineConfig } from 'vite' import dts from 'vite-plugin-dts' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' const __filename = fileURLToPath(import.meta.url) diff --git a/examples/solid/router-monorepo-simple/packages/post-feature/package.json b/examples/solid/router-monorepo-simple/packages/post-feature/package.json index 228e417db14..29561dba8b2 100644 --- a/examples/solid/router-monorepo-simple/packages/post-feature/package.json +++ b/examples/solid/router-monorepo-simple/packages/post-feature/package.json @@ -9,11 +9,11 @@ "types": "./dist/index.d.ts", "dependencies": { "@router-solid-mono-simple/router": "workspace:*", - "solid-js": "2.0.0-beta.32", - "@solidjs/web": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0", + "@solidjs/web": "^2.0.0-rc.0" }, "devDependencies": { - "vite-plugin-solid": "^3.0.0-next.23", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", diff --git a/examples/solid/router-monorepo-simple/packages/post-feature/vite.config.ts b/examples/solid/router-monorepo-simple/packages/post-feature/vite.config.ts index fec43f13329..f0577156179 100644 --- a/examples/solid/router-monorepo-simple/packages/post-feature/vite.config.ts +++ b/examples/solid/router-monorepo-simple/packages/post-feature/vite.config.ts @@ -2,7 +2,7 @@ import * as path from 'node:path' import { fileURLToPath } from 'node:url' import { defineConfig } from 'vite' import dts from 'vite-plugin-dts' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) diff --git a/examples/solid/router-monorepo-simple/packages/router/package.json b/examples/solid/router-monorepo-simple/packages/router/package.json index 0714ac9c151..81de1cb47fc 100644 --- a/examples/solid/router-monorepo-simple/packages/router/package.json +++ b/examples/solid/router-monorepo-simple/packages/router/package.json @@ -8,16 +8,16 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@tanstack/history": "^1.162.0", + "@tanstack/history": "^1.162.1", + "@tanstack/router-plugin": "^1.168.30", "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/router-plugin": "^1.168.24", "redaxios": "^0.5.1", "zod": "^4.4.3", - "solid-js": "2.0.0-beta.32", - "@solidjs/web": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0", + "@solidjs/web": "^2.0.0-rc.0" }, "devDependencies": { - "vite-plugin-solid": "^3.0.0-next.23", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", diff --git a/examples/solid/router-monorepo-simple/packages/router/vite.config.ts b/examples/solid/router-monorepo-simple/packages/router/vite.config.ts index fd99b4b7de1..d06f41bdfb4 100644 --- a/examples/solid/router-monorepo-simple/packages/router/vite.config.ts +++ b/examples/solid/router-monorepo-simple/packages/router/vite.config.ts @@ -3,7 +3,7 @@ import dts from 'vite-plugin-dts' import * as path from 'node:path' import { fileURLToPath } from 'node:url' import { tanstackRouter } from '@tanstack/router-plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) diff --git a/examples/solid/router-monorepo-solid-query/package.json b/examples/solid/router-monorepo-solid-query/package.json index 3bc87f9ab28..0a09fd23132 100644 --- a/examples/solid/router-monorepo-solid-query/package.json +++ b/examples/solid/router-monorepo-solid-query/package.json @@ -10,22 +10,22 @@ "dev": "pnpm post-query build && pnpm router build && pnpm post-feature build && pnpm app dev" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/node": "^22.10.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-dts": "^4.5.4", - "vite-plugin-solid": "^3.0.0-next.23" + "vite-plugin-dts": "^4.5.4" }, "keywords": [], "author": "", diff --git a/examples/solid/router-monorepo-solid-query/packages/app/package.json b/examples/solid/router-monorepo-solid-query/packages/app/package.json index 9cb16583674..0c14f6f2925 100644 --- a/examples/solid/router-monorepo-solid-query/packages/app/package.json +++ b/examples/solid/router-monorepo-solid-query/packages/app/package.json @@ -9,14 +9,14 @@ "start": "vite" }, "dependencies": { - "@tanstack/solid-query": "^6.0.0-beta.7", + "@tanstack/solid-query": "^6.0.0-rc.0", "@router-solid-mono-solid-query/post-feature": "workspace:*", "@router-solid-mono-solid-query/router": "workspace:*", - "solid-js": "2.0.0-beta.32", - "@solidjs/web": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0", + "@solidjs/web": "^2.0.0-rc.0" }, "devDependencies": { - "vite-plugin-solid": "^3.0.0-next.23", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "@tanstack/solid-router-devtools": "^2.0.0-beta.25", diff --git a/examples/solid/router-monorepo-solid-query/packages/app/vite.config.ts b/examples/solid/router-monorepo-solid-query/packages/app/vite.config.ts index da34410003f..c9a3fc1400e 100644 --- a/examples/solid/router-monorepo-solid-query/packages/app/vite.config.ts +++ b/examples/solid/router-monorepo-solid-query/packages/app/vite.config.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import * as path from 'node:path' import { defineConfig } from 'vite' import dts from 'vite-plugin-dts' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' const __filename = fileURLToPath(import.meta.url) diff --git a/examples/solid/router-monorepo-solid-query/packages/post-feature/package.json b/examples/solid/router-monorepo-solid-query/packages/post-feature/package.json index c597f6c4a55..d9f20f0b942 100644 --- a/examples/solid/router-monorepo-solid-query/packages/post-feature/package.json +++ b/examples/solid/router-monorepo-solid-query/packages/post-feature/package.json @@ -8,14 +8,14 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@tanstack/solid-query": "^6.0.0-beta.7", + "@tanstack/solid-query": "^6.0.0-rc.0", "@router-solid-mono-solid-query/post-query": "workspace:*", "@router-solid-mono-solid-query/router": "workspace:*", - "solid-js": "2.0.0-beta.32", - "@solidjs/web": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0", + "@solidjs/web": "^2.0.0-rc.0" }, "devDependencies": { - "vite-plugin-solid": "^3.0.0-next.23", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", diff --git a/examples/solid/router-monorepo-solid-query/packages/post-feature/vite.config.ts b/examples/solid/router-monorepo-solid-query/packages/post-feature/vite.config.ts index 58bcbd81a08..e924c1f34d3 100644 --- a/examples/solid/router-monorepo-solid-query/packages/post-feature/vite.config.ts +++ b/examples/solid/router-monorepo-solid-query/packages/post-feature/vite.config.ts @@ -2,7 +2,7 @@ import * as path from 'node:path' import { fileURLToPath } from 'node:url' import { defineConfig } from 'vite' import dts from 'vite-plugin-dts' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) diff --git a/examples/solid/router-monorepo-solid-query/packages/post-query/package.json b/examples/solid/router-monorepo-solid-query/packages/post-query/package.json index 4040ce53406..de141ee54ae 100644 --- a/examples/solid/router-monorepo-solid-query/packages/post-query/package.json +++ b/examples/solid/router-monorepo-solid-query/packages/post-query/package.json @@ -8,12 +8,12 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@tanstack/solid-query": "^6.0.0-beta.7", + "@tanstack/solid-query": "^6.0.0-rc.0", "redaxios": "^0.5.1", "zod": "^4.4.3" }, "devDependencies": { - "vite-plugin-solid": "^3.0.0-next.23", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14" diff --git a/examples/solid/router-monorepo-solid-query/packages/router/package.json b/examples/solid/router-monorepo-solid-query/packages/router/package.json index c7be51da0f2..8cc82c9fb16 100644 --- a/examples/solid/router-monorepo-solid-query/packages/router/package.json +++ b/examples/solid/router-monorepo-solid-query/packages/router/package.json @@ -8,18 +8,18 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@tanstack/history": "^1.162.0", - "@tanstack/solid-query": "^6.0.0-beta.7", + "@tanstack/history": "^1.162.1", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-query": "^6.0.0-rc.0", "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/router-plugin": "^1.168.24", "@router-solid-mono-solid-query/post-query": "workspace:*", "redaxios": "^0.5.1", "zod": "^4.4.3", - "solid-js": "2.0.0-beta.32", - "@solidjs/web": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0", + "@solidjs/web": "^2.0.0-rc.0" }, "devDependencies": { - "vite-plugin-solid": "^3.0.0-next.23", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", diff --git a/examples/solid/router-monorepo-solid-query/packages/router/vite.config.ts b/examples/solid/router-monorepo-solid-query/packages/router/vite.config.ts index 49d522530dd..c1b0a85daf6 100644 --- a/examples/solid/router-monorepo-solid-query/packages/router/vite.config.ts +++ b/examples/solid/router-monorepo-solid-query/packages/router/vite.config.ts @@ -3,7 +3,7 @@ import dts from 'vite-plugin-dts' import * as path from 'node:path' import { fileURLToPath } from 'node:url' import { tanstackRouter } from '@tanstack/router-plugin/vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) diff --git a/examples/solid/scroll-restoration/package.json b/examples/solid/scroll-restoration/package.json index 894dec6abce..5a239646b50 100644 --- a/examples/solid/scroll-restoration/package.json +++ b/examples/solid/scroll-restoration/package.json @@ -9,18 +9,18 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "@tanstack/solid-virtual": "^3.13.0", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/scroll-restoration/vite.config.js b/examples/solid/scroll-restoration/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/scroll-restoration/vite.config.js +++ b/examples/solid/scroll-restoration/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/search-validator-adapters/package.json b/examples/solid/search-validator-adapters/package.json index 62e6aaf7016..3e01fd7c570 100644 --- a/examples/solid/search-validator-adapters/package.json +++ b/examples/solid/search-validator-adapters/package.json @@ -10,27 +10,27 @@ "test:unit": "vitest" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/arktype-adapter": "^1.167.0", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "@tanstack/valibot-adapter": "^1.167.0", "@tanstack/zod-adapter": "^1.167.0", "arktype": "^2.1.7", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "valibot": "1.0.0-beta.15", "zod": "^3.24.2" }, "devDependencies": { "@solidjs/testing-library": "^0.8.10", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@testing-library/jest-dom": "^6.6.3", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/search-validator-adapters/vite.config.ts b/examples/solid/search-validator-adapters/vite.config.ts index abb9d36cdf7..42e0edff512 100644 --- a/examples/solid/search-validator-adapters/vite.config.ts +++ b/examples/solid/search-validator-adapters/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import packageJson from './package.json' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/start-basic-auth/package.json b/examples/solid/start-basic-auth/package.json index 43180b5b14f..465868216c9 100644 --- a/examples/solid/start-basic-auth/package.json +++ b/examples/solid/start-basic-auth/package.json @@ -14,15 +14,16 @@ "@libsql/client": "^0.15.15", "@prisma/adapter-libsql": "^7.0.0", "@prisma/client": "^7.0.0", - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "dotenv": "^17.2.3", @@ -31,7 +32,6 @@ "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/examples/solid/start-basic-auth/vite.config.ts b/examples/solid/start-basic-auth/vite.config.ts index 3c406c8001a..3251cd40fde 100644 --- a/examples/solid/start-basic-auth/vite.config.ts +++ b/examples/solid/start-basic-auth/vite.config.ts @@ -1,6 +1,6 @@ import { tanstackStart } from '@tanstack/solid-start/plugin/vite' import { defineConfig } from 'vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-basic-authjs/package.json b/examples/solid/start-basic-authjs/package.json index cd12af24be6..fb9ec2d2ebb 100644 --- a/examples/solid/start-basic-authjs/package.json +++ b/examples/solid/start-basic-authjs/package.json @@ -11,22 +11,22 @@ }, "dependencies": { "@auth/core": "^0.41.1", - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", - "solid-js": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "start-authjs": "^1.0.0", "tailwind-merge": "^3.6.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/examples/solid/start-basic-authjs/vite.config.ts b/examples/solid/start-basic-authjs/vite.config.ts index a18dcb874b7..090b04c7944 100644 --- a/examples/solid/start-basic-authjs/vite.config.ts +++ b/examples/solid/start-basic-authjs/vite.config.ts @@ -1,6 +1,6 @@ import { tanstackStart } from '@tanstack/solid-start/plugin/vite' import { defineConfig } from 'vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-basic-cloudflare/package.json b/examples/solid/start-basic-cloudflare/package.json index 83e001a46e8..cb67ce0f464 100644 --- a/examples/solid/start-basic-cloudflare/package.json +++ b/examples/solid/start-basic-cloudflare/package.json @@ -12,21 +12,21 @@ "postinstall": "npm run cf-typegen" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", - "solid-js": "2.0.0-beta.32" + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@cloudflare/vite-plugin": "^1.29.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4", "wrangler": "^4.74.0" } diff --git a/examples/solid/start-basic-cloudflare/vite.config.ts b/examples/solid/start-basic-cloudflare/vite.config.ts index b9deb59030f..c5e66bbc901 100644 --- a/examples/solid/start-basic-cloudflare/vite.config.ts +++ b/examples/solid/start-basic-cloudflare/vite.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'vite' import { cloudflare } from '@cloudflare/vite-plugin' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-basic-netlify/package.json b/examples/solid/start-basic-netlify/package.json index 09e00cf46fb..168e88e1be2 100644 --- a/examples/solid/start-basic-netlify/package.json +++ b/examples/solid/start-basic-netlify/package.json @@ -9,21 +9,21 @@ "preview": "vite preview" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", - "solid-js": "2.0.0-beta.32" + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@netlify/vite-plugin-tanstack-start": "^1.1.4", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/examples/solid/start-basic-netlify/vite.config.ts b/examples/solid/start-basic-netlify/vite.config.ts index 7324d8f5851..bc011265ac6 100644 --- a/examples/solid/start-basic-netlify/vite.config.ts +++ b/examples/solid/start-basic-netlify/vite.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'vite' import netlify from '@netlify/vite-plugin-tanstack-start' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-basic-nitro/package.json b/examples/solid/start-basic-nitro/package.json index 3e1258c891f..446b1cbb47f 100644 --- a/examples/solid/start-basic-nitro/package.json +++ b/examples/solid/start-basic-nitro/package.json @@ -9,13 +9,14 @@ "preview": "vite preview" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", - "solid-js": "2.0.0-beta.32" + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "nitro": "^3.0.260311-beta", @@ -23,7 +24,6 @@ "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/examples/solid/start-basic-nitro/vite.config.ts b/examples/solid/start-basic-nitro/vite.config.ts index db70391ee17..5c316dc390e 100644 --- a/examples/solid/start-basic-nitro/vite.config.ts +++ b/examples/solid/start-basic-nitro/vite.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'vite' import { nitro } from 'nitro/vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-basic-solid-query/package.json b/examples/solid/start-basic-solid-query/package.json index b88f0ab42e5..e4bfe741a6a 100644 --- a/examples/solid/start-basic-solid-query/package.json +++ b/examples/solid/start-basic-solid-query/package.json @@ -10,25 +10,25 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-query-devtools": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-router-ssr-query": "^2.0.0-beta.31", - "@tanstack/solid-start": "^2.0.0-beta.31", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-query-devtools": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-router-ssr-query": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/examples/solid/start-basic-solid-query/vite.config.ts b/examples/solid/start-basic-solid-query/vite.config.ts index 3c406c8001a..3251cd40fde 100644 --- a/examples/solid/start-basic-solid-query/vite.config.ts +++ b/examples/solid/start-basic-solid-query/vite.config.ts @@ -1,6 +1,6 @@ import { tanstackStart } from '@tanstack/solid-start/plugin/vite' import { defineConfig } from 'vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-basic-static/package.json b/examples/solid/start-basic-static/package.json index 52668d8d75d..1b5cfea27c7 100644 --- a/examples/solid/start-basic-static/package.json +++ b/examples/solid/start-basic-static/package.json @@ -10,23 +10,23 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", - "@tanstack/start-static-server-functions": "^1.167.20", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", + "@tanstack/start-static-server-functions": "^1.167.27", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.3" } } diff --git a/examples/solid/start-basic-static/vite.config.ts b/examples/solid/start-basic-static/vite.config.ts index 9d2f632fa38..c219d76382d 100644 --- a/examples/solid/start-basic-static/vite.config.ts +++ b/examples/solid/start-basic-static/vite.config.ts @@ -1,6 +1,6 @@ import { tanstackStart } from '@tanstack/solid-start/plugin/vite' import { defineConfig } from 'vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-basic/package.json b/examples/solid/start-basic/package.json index eae59396ddb..38192951628 100644 --- a/examples/solid/start-basic/package.json +++ b/examples/solid/start-basic/package.json @@ -10,15 +10,16 @@ "start": "node .output/server/index.mjs" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "nitro": "^3.0.260311-beta", @@ -26,7 +27,6 @@ "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/examples/solid/start-basic/vite.config.ts b/examples/solid/start-basic/vite.config.ts index 21afe15e794..d042a8c633b 100644 --- a/examples/solid/start-basic/vite.config.ts +++ b/examples/solid/start-basic/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' import { nitro } from 'nitro/vite' diff --git a/examples/solid/start-bun/package.json b/examples/solid/start-bun/package.json index 289c3f8d2c0..80000fe2e86 100644 --- a/examples/solid/start-bun/package.json +++ b/examples/solid/start-bun/package.json @@ -13,19 +13,20 @@ "check": "prettier --write . && eslint --fix" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", + "@tanstack/router-plugin": "^1.168.30", "@tanstack/solid-devtools": "^0.7.0", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-router-ssr-query": "^2.0.0-beta.31", - "@tanstack/solid-start": "^2.0.0-beta.31", - "solid-js": "2.0.0-beta.32", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-router-ssr-query": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2" }, "devDependencies": { "@solidjs/testing-library": "^0.8.10", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tanstack/eslint-config": "^0.3.2", "@testing-library/dom": "^10.4.1", "@types/bun": "^1.2.22", @@ -35,7 +36,6 @@ "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vitest": "^4.1.4", "web-vitals": "^5.1.0" } diff --git a/examples/solid/start-bun/vite.config.ts b/examples/solid/start-bun/vite.config.ts index 660dc8ed506..4df51ff1546 100644 --- a/examples/solid/start-bun/vite.config.ts +++ b/examples/solid/start-bun/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' const config = defineConfig({ diff --git a/examples/solid/start-convex-better-auth/package.json b/examples/solid/start-convex-better-auth/package.json index dcce25de0a4..c52f04ecf5e 100644 --- a/examples/solid/start-convex-better-auth/package.json +++ b/examples/solid/start-convex-better-auth/package.json @@ -12,28 +12,28 @@ }, "dependencies": { "@convex-dev/better-auth": "^0.9.7", - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", "better-auth": "^1.6.19", "clsx": "^2.1.1", "convex": "^1.28.2", "convex-solidjs": "^0.0.3", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/node": "^22.10.2", "combinate": "^1.1.11", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/examples/solid/start-convex-better-auth/vite.config.ts b/examples/solid/start-convex-better-auth/vite.config.ts index 659538b94f6..a963a79e034 100644 --- a/examples/solid/start-convex-better-auth/vite.config.ts +++ b/examples/solid/start-convex-better-auth/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-counter/package.json b/examples/solid/start-counter/package.json index 2f073d44564..0ab6d50df49 100644 --- a/examples/solid/start-counter/package.json +++ b/examples/solid/start-counter/package.json @@ -10,21 +10,21 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/node": "^22.10.2", "combinate": "^1.1.11", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/start-counter/vite.config.ts b/examples/solid/start-counter/vite.config.ts index e60181d9f25..133c0a49536 100644 --- a/examples/solid/start-counter/vite.config.ts +++ b/examples/solid/start-counter/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' export default defineConfig({ server: { diff --git a/examples/solid/start-i18n-paraglide/package.json b/examples/solid/start-i18n-paraglide/package.json index 494f2e26db3..eaa85324697 100644 --- a/examples/solid/start-i18n-paraglide/package.json +++ b/examples/solid/start-i18n-paraglide/package.json @@ -9,21 +9,21 @@ "preview": "vite preview" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-devtools": "^0.7.0", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", - "solid-js": "2.0.0-beta.32" + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { "@inlang/paraglide-js": "^2.4.0", + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.18.6", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/start-i18n-paraglide/vite.config.ts b/examples/solid/start-i18n-paraglide/vite.config.ts index 709f9596f37..70631b52f34 100644 --- a/examples/solid/start-i18n-paraglide/vite.config.ts +++ b/examples/solid/start-i18n-paraglide/vite.config.ts @@ -1,7 +1,7 @@ import { paraglideVitePlugin } from '@inlang/paraglide-js' import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' const config = defineConfig({ diff --git a/examples/solid/start-large/package.json b/examples/solid/start-large/package.json index 14c192da5f2..9aaaa2bbe2d 100644 --- a/examples/solid/start-large/package.json +++ b/examples/solid/start-large/package.json @@ -12,24 +12,24 @@ "test:types": "tsc --extendedDiagnostics" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-query": "^6.0.0-beta.7", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-query": "^6.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "valibot": "^1.0.0-beta.15" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" }, "keywords": [], "author": "", diff --git a/examples/solid/start-large/vite.config.ts b/examples/solid/start-large/vite.config.ts index 3c406c8001a..3251cd40fde 100644 --- a/examples/solid/start-large/vite.config.ts +++ b/examples/solid/start-large/vite.config.ts @@ -1,6 +1,6 @@ import { tanstackStart } from '@tanstack/solid-start/plugin/vite' import { defineConfig } from 'vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-streaming-data-from-server-functions/package.json b/examples/solid/start-streaming-data-from-server-functions/package.json index b7793dfdf55..46a020b56f7 100644 --- a/examples/solid/start-streaming-data-from-server-functions/package.json +++ b/examples/solid/start-streaming-data-from-server-functions/package.json @@ -10,18 +10,18 @@ "start": "pnpx srvx --prod -s ../client dist/server/server.js" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", - "solid-js": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/node": "^22.5.4", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/start-streaming-data-from-server-functions/vite.config.ts b/examples/solid/start-streaming-data-from-server-functions/vite.config.ts index 7a6ce913f83..f042c0f0528 100644 --- a/examples/solid/start-streaming-data-from-server-functions/vite.config.ts +++ b/examples/solid/start-streaming-data-from-server-functions/vite.config.ts @@ -1,6 +1,6 @@ import { tanstackStart } from '@tanstack/solid-start/plugin/vite' import { defineConfig } from 'vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' export default defineConfig({ server: { diff --git a/examples/solid/start-supabase-basic/package.json b/examples/solid/start-supabase-basic/package.json index 3eab8f874b1..8efabe1e173 100644 --- a/examples/solid/start-supabase-basic/package.json +++ b/examples/solid/start-supabase-basic/package.json @@ -12,23 +12,23 @@ "author": "", "license": "ISC", "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@supabase/ssr": "^0.5.2", "@supabase/supabase-js": "^2.48.1", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/examples/solid/start-supabase-basic/vite.config.ts b/examples/solid/start-supabase-basic/vite.config.ts index 659538b94f6..a963a79e034 100644 --- a/examples/solid/start-supabase-basic/vite.config.ts +++ b/examples/solid/start-supabase-basic/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/start-tailwind-v4/package.json b/examples/solid/start-tailwind-v4/package.json index bb9a661848e..f1ad9a9503a 100644 --- a/examples/solid/start-tailwind-v4/package.json +++ b/examples/solid/start-tailwind-v4/package.json @@ -10,22 +10,22 @@ "start": "node .output/server/index.mjs" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", - "@tanstack/solid-start": "^2.0.0-beta.31", - "solid-js": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", + "@tanstack/solid-start": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@tailwindcss/vite": "^4.2.2", "@types/node": "^22.5.4", "tailwindcss": "^4.2.2", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/examples/solid/start-tailwind-v4/vite.config.ts b/examples/solid/start-tailwind-v4/vite.config.ts index 3c406c8001a..3251cd40fde 100644 --- a/examples/solid/start-tailwind-v4/vite.config.ts +++ b/examples/solid/start-tailwind-v4/vite.config.ts @@ -1,6 +1,6 @@ import { tanstackStart } from '@tanstack/solid-start/plugin/vite' import { defineConfig } from 'vite' -import viteSolid from 'vite-plugin-solid' +import viteSolid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ diff --git a/examples/solid/view-transitions/package.json b/examples/solid/view-transitions/package.json index d6c846e94eb..00ec5d21d7b 100644 --- a/examples/solid/view-transitions/package.json +++ b/examples/solid/view-transitions/package.json @@ -9,20 +9,20 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/view-transitions/vite.config.js b/examples/solid/view-transitions/vite.config.js index 79454008ba6..71e662f1cff 100644 --- a/examples/solid/view-transitions/vite.config.js +++ b/examples/solid/view-transitions/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/solid/with-framer-motion/package.json b/examples/solid/with-framer-motion/package.json index db62e74855e..c7788ed5b14 100644 --- a/examples/solid/with-framer-motion/package.json +++ b/examples/solid/with-framer-motion/package.json @@ -9,20 +9,20 @@ "start": "vite" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "solid-motionone": "^1.0.4", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/with-framer-motion/vite.config.js b/examples/solid/with-framer-motion/vite.config.js index fb5faf92369..59c45c737c3 100644 --- a/examples/solid/with-framer-motion/vite.config.js +++ b/examples/solid/with-framer-motion/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ diff --git a/examples/solid/with-trpc/package.json b/examples/solid/with-trpc/package.json index 026ad10fcc5..e37f2fba0f0 100644 --- a/examples/solid/with-trpc/package.json +++ b/examples/solid/with-trpc/package.json @@ -10,23 +10,23 @@ "start": "NODE_ENV=production node dist/server/server.js" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/solid-router": "^2.0.0-beta.30", - "@tanstack/solid-router-devtools": "^2.0.0-beta.25", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/solid-router": "^2.0.0-rc.0", + "@tanstack/solid-router-devtools": "^2.0.0-rc.0", "@trpc/client": "^11.4.3", "@trpc/server": "^11.4.3", "express": "^5.2.1", "redaxios": "^0.5.1", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^4.2.2", "zod": "^4.4.3" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.28", "@types/express": "^5.0.6", "tsx": "^4.20.3", - "vite": "^8.0.14", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "^8.0.14" } } diff --git a/examples/solid/with-trpc/vite.config.ts b/examples/solid/with-trpc/vite.config.ts index 553d3030d16..3ee81acb5a0 100644 --- a/examples/solid/with-trpc/vite.config.ts +++ b/examples/solid/with-trpc/vite.config.ts @@ -1,7 +1,7 @@ import url from 'node:url' import path from 'node:path' import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' import type { BuildEnvironmentOptions } from 'vite' import tailwindcss from '@tailwindcss/vite' diff --git a/examples/vue/basic-file-based-jsx/package.json b/examples/vue/basic-file-based-jsx/package.json index 5e94ab51eaf..3044b8fc366 100644 --- a/examples/vue/basic-file-based-jsx/package.json +++ b/examples/vue/basic-file-based-jsx/package.json @@ -10,8 +10,8 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/vue-router": "^1.170.18", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/vue-router": "^1.170.24", "@tanstack/vue-router-devtools": "^1.167.1", "redaxios": "^0.5.1", "tailwindcss": "^4.2.2", diff --git a/examples/vue/basic-file-based-sfc/package.json b/examples/vue/basic-file-based-sfc/package.json index f2a41544cb5..61c311cf7d9 100644 --- a/examples/vue/basic-file-based-sfc/package.json +++ b/examples/vue/basic-file-based-sfc/package.json @@ -10,8 +10,8 @@ }, "dependencies": { "@tailwindcss/vite": "^4.2.2", - "@tanstack/router-plugin": "^1.168.24", - "@tanstack/vue-router": "^1.170.18", + "@tanstack/router-plugin": "^1.168.30", + "@tanstack/vue-router": "^1.170.24", "@tanstack/vue-router-devtools": "^1.167.1", "redaxios": "^0.5.1", "tailwindcss": "^4.2.2", diff --git a/examples/vue/basic/package.json b/examples/vue/basic/package.json index 16c55a19b59..8f848d7d1b1 100644 --- a/examples/vue/basic/package.json +++ b/examples/vue/basic/package.json @@ -9,7 +9,7 @@ "start": "vite" }, "dependencies": { - "@tanstack/vue-router": "^1.170.18", + "@tanstack/vue-router": "^1.170.24", "@tanstack/vue-router-devtools": "^1.167.1", "redaxios": "^0.5.1", "vue": "^3.5.13", diff --git a/packages/history/CHANGELOG.md b/packages/history/CHANGELOG.md index dbd02474bf9..8d61013c844 100644 --- a/packages/history/CHANGELOG.md +++ b/packages/history/CHANGELOG.md @@ -1,5 +1,11 @@ # @tanstack/history +## 1.162.1 + +### Patch Changes + +- [#7985](https://github.com/TanStack/router/pull/7985) [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b) - perf: compact private bundle boundaries- [#7975](https://github.com/TanStack/router/issues/7975) + ## 1.162.0 ### Minor Changes diff --git a/packages/history/package.json b/packages/history/package.json index 52e4641a01c..3573777fc48 100644 --- a/packages/history/package.json +++ b/packages/history/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/history", - "version": "1.162.0", + "version": "1.162.1", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/history/src/index.ts b/packages/history/src/index.ts index 0f3be8242e7..063174c7328 100644 --- a/packages/history/src/index.ts +++ b/packages/history/src/index.ts @@ -329,18 +329,14 @@ export function createBrowserHistory(opts?: { let next: | undefined - | { - // This is the latest location that we were attempting to push/replace - href: string - // This is the latest state that we were attempting to push/replace - state: any - // This is the latest type that we were attempting to push/replace - isPush: boolean - } - - // We need to track the current scheduled update to prevent - // multiple updates from being scheduled at the same time. - let scheduled: undefined | boolean + | [ + // The latest location that we were attempting to push/replace + href: string, + // The latest state that we were attempting to push/replace + state: any, + // Whether any queued update needs to push rather than replace + isPush: boolean, + ] // This function flushes the next update to the browser history const flush = () => { @@ -352,30 +348,30 @@ export function createBrowserHistory(opts?: { history._ignoreSubscribers = true // Update the browser history - ;(next.isPush ? win.history.pushState : win.history.replaceState)( - next.state, + ;(next[2 /* is push */] ? win.history.pushState : win.history.replaceState)( + next[1 /* state */], '', - next.href, + next[0 /* href */], ) // Stop ignoring subscriber updates history._ignoreSubscribers = false - // Reset the nextIsPush flag and clear the scheduled update + // Clear the queued action after it reaches browser history. next = undefined - scheduled = false rollbackLocation = undefined } // This function queues up a call to update the browser history const queueHistoryAction = ( - type: 'push' | 'replace', + isPush: boolean, destHref: string, state: any, ) => { const href = createHref(destHref) + const hasPendingAction = !!next - if (!scheduled) { + if (!hasPendingAction) { rollbackLocation = currentLocation } @@ -383,15 +379,10 @@ export function createBrowserHistory(opts?: { currentLocation = parseHref(destHref, state) // Keep track of the next location we need to flush to the URL - next = { - href, - state, - isPush: next?.isPush || type === 'push', - } + next = [href, state, next?.[2 /* is push */] || isPush] - if (!scheduled) { + if (!hasPendingAction) { // Schedule an update to the browser history - scheduled = true queueMicrotask(() => flush()) } } @@ -489,8 +480,8 @@ export function createBrowserHistory(opts?: { const history = createHistory({ getLocation, getLength: () => win.history.length, - pushState: (href, state) => queueHistoryAction('push', href, state), - replaceState: (href, state) => queueHistoryAction('replace', href, state), + pushState: (href, state) => queueHistoryAction(true, href, state), + replaceState: (href, state) => queueHistoryAction(false, href, state), back: (ignoreBlocker) => { if (ignoreBlocker) skipBlockerNextPop = true ignoreNextBeforeUnload = true diff --git a/packages/history/tests/createBrowserHistory.test.ts b/packages/history/tests/createBrowserHistory.test.ts new file mode 100644 index 00000000000..97b3c40ef3c --- /dev/null +++ b/packages/history/tests/createBrowserHistory.test.ts @@ -0,0 +1,106 @@ +import { describe, expect, test, vi } from 'vitest' +import { createBrowserHistory } from '../src' + +function createBrowserHistoryHarness() { + const location = { + pathname: '/', + search: '', + hash: '', + } + const pushState = vi.fn() + const replaceState = vi.fn() + const nativeHistory = { + state: { __TSR_index: 0, __TSR_key: 'initial' }, + length: 1, + pushState, + replaceState, + back: vi.fn(), + forward: vi.fn(), + go: vi.fn(), + } + const window = { + location, + history: nativeHistory, + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + } + const history = createBrowserHistory({ window }) + + return { + history, + pushState, + replaceState, + } +} + +describe('createBrowserHistory', () => { + test('coalesces consecutive replaces into the latest replace', async () => { + const { history, pushState, replaceState } = createBrowserHistoryHarness() + + history.replace('/first', { value: 1 }) + history.replace('/second', { value: 2 }) + await Promise.resolve() + + expect(pushState).not.toHaveBeenCalled() + expect(replaceState).toHaveBeenCalledTimes(1) + expect(replaceState).toHaveBeenCalledWith( + expect.objectContaining({ value: 2 }), + '', + '/second', + ) + history.destroy() + }) + + test('promotes a queued replace to a push', async () => { + const { history, pushState, replaceState } = createBrowserHistoryHarness() + + history.replace('/first', { value: 1 }) + history.push('/second', { value: 2 }) + await Promise.resolve() + + expect(replaceState).not.toHaveBeenCalled() + expect(pushState).toHaveBeenCalledTimes(1) + expect(pushState).toHaveBeenCalledWith( + expect.objectContaining({ value: 2 }), + '', + '/second', + ) + history.destroy() + }) + + test('keeps a queued push when followed by a replace', async () => { + const { history, pushState, replaceState } = createBrowserHistoryHarness() + + history.push('/first', { value: 1 }) + history.replace('/second', { value: 2 }) + await Promise.resolve() + + expect(replaceState).not.toHaveBeenCalled() + expect(pushState).toHaveBeenCalledTimes(1) + expect(pushState).toHaveBeenCalledWith( + expect.objectContaining({ value: 2 }), + '', + '/second', + ) + history.destroy() + }) + + test('flushes a later action after an explicit flush', async () => { + const { history, pushState, replaceState } = createBrowserHistoryHarness() + + history.replace('/first', { value: 1 }) + history.flush() + await Promise.resolve() + history.replace('/second', { value: 2 }) + await Promise.resolve() + + expect(pushState).not.toHaveBeenCalled() + expect(replaceState).toHaveBeenCalledTimes(2) + expect(replaceState).toHaveBeenLastCalledWith( + expect.objectContaining({ value: 2 }), + '', + '/second', + ) + history.destroy() + }) +}) diff --git a/packages/react-router-ssr-query/package.json b/packages/react-router-ssr-query/package.json index 2967d695b09..4b3fecb4860 100644 --- a/packages/react-router-ssr-query/package.json +++ b/packages/react-router-ssr-query/package.json @@ -67,18 +67,18 @@ "@tanstack/router-ssr-query-core": "workspace:*" }, "devDependencies": { + "@tanstack/react-query": "catalog:", + "@tanstack/react-router": "workspace:*", "@vitejs/plugin-react": "^4.3.4", "react": ">=19", "react-dom": ">=19", - "@tanstack/react-router": "workspace:*", - "@tanstack/react-query": ">=5.90.0", "vite": "*" }, "peerDependencies": { - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0", "@tanstack/query-core": ">=5.90.0", + "@tanstack/react-query": ">=5.90.0", "@tanstack/react-router": ">=1.127.0", - "@tanstack/react-query": ">=5.90.0" + "react": ">=18.0.0 || >=19.0.0", + "react-dom": ">=18.0.0 || >=19.0.0" } } diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 49e069817b2..ab7af2c14ed 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,81 @@ # @tanstack/react-router +## 1.170.27 + +### Patch Changes + +- [#8047](https://github.com/TanStack/router/pull/8047) [`b0817f5`](https://github.com/TanStack/router/commit/b0817f50cc639ae50b6c30cd11c5adbf7eed028c) - useMatchRoute w/ React Compiler + +## 1.170.26 + +### Patch Changes + +- [#8045](https://github.com/TanStack/router/pull/8045) [`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3) - Warn when an Outlet is rendered inside a pending, error, or not-found component. + +- [#8043](https://github.com/TanStack/router/pull/8043) [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1) - remove the undocumented Link `isTransitioning` state and `data-transitioning` attribute + +- [#8044](https://github.com/TanStack/router/pull/8044) [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e) - Apply `preloadDelay` to viewport link preloading and cancel pending preloads when links leave the viewport. + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13)]: + - @tanstack/router-core@1.171.22 + +## 1.170.25 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + +## 1.170.24 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + +## 1.170.23 + +### Patch Changes + +- [#7952](https://github.com/TanStack/router/pull/7952) [`95dec51`](https://github.com/TanStack/router/commit/95dec51018d01483949c6f1fe3094b019ccf3b4f) - bail out of `Link` re-renders when the resolved href and active state are unchanged + +## 1.170.22 + +### Patch Changes + +- [#7992](https://github.com/TanStack/router/pull/7992) [`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9) - retain mounted UI during revalidation + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/router-core@1.171.19 + +## 1.170.21 + +### Patch Changes + +- [#7961](https://github.com/TanStack/router/pull/7961) [`697ebb6`](https://github.com/TanStack/router/commit/697ebb6ddbd433d052b6b4707938a5c595865d58) - Prevent a blank frame before zero-delay initial pending UI by using a + component-scoped React transition for match publication. Pending timing, + boundary selection, and rendered matches continue to come from the router + core. + +- [#7970](https://github.com/TanStack/router/pull/7970) [`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf) - createFileRoute does not rely on FileRoute class + +- [#7971](https://github.com/TanStack/router/pull/7971) [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7) - clean intersection observer options in link component + +- [#7967](https://github.com/TanStack/router/pull/7967) [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c) - Preserve path params in their raw string form while matching routes so structured values returned by `params.parse` produce stable match IDs and do not reuse stale loader data. + + `RouterCore.getMatchedRoutes()` now returns `[matchedRoutes, rawParams, foundRoute]` instead of an object. + +- Updated dependencies [[`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/router-core@1.171.18 + - @tanstack/history@1.162.1 + +## 1.170.20 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + ## 1.170.19 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index fdb6266ef2c..65a417d1bd4 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-router", - "version": "1.170.19", + "version": "1.170.27", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/react-router/src/CatchBoundary.tsx b/packages/react-router/src/CatchBoundary.tsx index d97e49f8f5d..f459ef3fce2 100644 --- a/packages/react-router/src/CatchBoundary.tsx +++ b/packages/react-router/src/CatchBoundary.tsx @@ -1,6 +1,7 @@ 'use client' import * as React from 'react' +import { wrapInNonRouteComponentContext } from './nonRouteComponentContext' import type { ErrorRouteComponent } from './route' import type { ErrorInfo } from 'react' @@ -44,12 +45,21 @@ class CatchBoundaryImpl extends React.Component<{ } render() { const error = this.state.error - return error - ? React.createElement(this.props.errorComponent ?? ErrorComponent, { + if (error) { + const element = React.createElement( + this.props.errorComponent ?? ErrorComponent, + { error, reset: this.reset, - }) - : this.props.children + }, + ) + + return process.env.NODE_ENV !== 'production' + ? wrapInNonRouteComponentContext(element, 'errorComponent') + : element + } + + return this.props.children } } diff --git a/packages/react-router/src/Match.tsx b/packages/react-router/src/Match.tsx index 6bca031a4dc..922c0aa5880 100644 --- a/packages/react-router/src/Match.tsx +++ b/packages/react-router/src/Match.tsx @@ -12,6 +12,10 @@ import { SafeFragment } from './SafeFragment' import { renderRouteNotFound } from './renderRouteNotFound' import { ScrollRestoration } from './scroll-restoration' import { ClientOnly } from './ClientOnly' +import { + nonRouteComponentContext, + wrapInNonRouteComponentContext, +} from './nonRouteComponentContext' import type { AnyRoute, AnyRouteMatch, @@ -24,7 +28,14 @@ export function renderPending( ) { const PendingComponent = route?.options.pendingComponent ?? router.options.defaultPendingComponent - return PendingComponent ? : null + if (!PendingComponent) { + return null + } + + const pendingElement = + return process.env.NODE_ENV !== 'production' + ? wrapInNonRouteComponentContext(pendingElement, 'pendingComponent') + : pendingElement } type OutletMatchSelection = [ @@ -123,10 +134,16 @@ function MatchView({ throw error } - return React.createElement( + const notFoundElement = React.createElement( routeNotFoundComponent!, error as any, ) + return process.env.NODE_ENV !== 'production' + ? wrapInNonRouteComponentContext( + notFoundElement, + 'notFoundComponent', + ) + : notFoundElement }} > {resolvedNoSsr ? ( @@ -197,7 +214,7 @@ export const MatchInner = React.memo(function MatchInnerImpl({ (route.options.errorComponent ?? router.options.defaultErrorComponent) || ErrorComponent - return ( + const errorElement = ( ) + return process.env.NODE_ENV !== 'production' + ? wrapInNonRouteComponentContext(errorElement, 'errorComponent') + : errorElement } throw match.error } @@ -220,6 +240,16 @@ export const MatchInner = React.memo(function MatchInnerImpl({ * @link https://tanstack.com/router/latest/docs/framework/react/api/router/outletComponent */ export const Outlet = React.memo(function OutletImpl() { + if (process.env.NODE_ENV !== 'production') { + // eslint-disable-next-line react-hooks/rules-of-hooks + const nonRouteComponent = React.useContext(nonRouteComponentContext!) + if (nonRouteComponent) { + console.warn( + `Warning: An was rendered inside a ${nonRouteComponent}. should only be rendered inside a route component.`, + ) + } + } + const router = useRouter() const routeId = React.useContext(matchContext)! diff --git a/packages/react-router/src/Matches.tsx b/packages/react-router/src/Matches.tsx index 3be41739960..cada2373ff9 100644 --- a/packages/react-router/src/Matches.tsx +++ b/packages/react-router/src/Matches.tsx @@ -57,7 +57,16 @@ export function Matches() { const inner = ( <> - {!(isServer ?? router.isServer) && } + {!(isServer ?? router.isServer) && ( + ()[1]} + /> + )} @@ -137,34 +146,40 @@ export type UseMatchRouteOptions< * `search`, etc.) and returns either `false` (no match) or the matched params * object when the route matches the current or pending location. * - * Useful for conditional rendering and active UI states. + * Useful for conditional rendering and active UI states because it subscribes + * the component to the router state used for matching. The returned function's + * identity changes when that state changes. For imperative checks in event + * handlers, get the router with `useRouter` and call `router.matchRoute(...)` + * to avoid that subscription. * * @returns A `matchRoute(options)` function that returns `false` or params. * @link https://tanstack.com/router/latest/docs/framework/react/api/router/useMatchRouteHook */ -export function useMatchRoute() { +export function useMatchRoute(): < + const TFrom extends string = string, + const TTo extends string | undefined = undefined, + const TMaskFrom extends string = TFrom, + const TMaskTo extends string = '', +>( + opts: UseMatchRouteOptions, +) => false | Expand['types']['allParams']> { const router = useRouter() + if (isServer ?? router.isServer) { + return (opts) => { + const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts - if (!(isServer ?? router.isServer)) { - // eslint-disable-next-line react-hooks/rules-of-hooks - useStore(router.stores.location, (location) => location.href) - // eslint-disable-next-line react-hooks/rules-of-hooks - useStore(router.stores.resolvedLocation, (location) => location?.href) - // eslint-disable-next-line react-hooks/rules-of-hooks - useStore(router.stores.status, (status) => status) + return router.matchRoute(rest as any, { + pending, + caseSensitive, + fuzzy, + includeSearch, + }) + } } + // eslint-disable-next-line react-hooks/rules-of-hooks return React.useCallback( - < - const TFrom extends string = string, - const TTo extends string | undefined = undefined, - const TMaskFrom extends string = TFrom, - const TMaskTo extends string = '', - >( - opts: UseMatchRouteOptions, - ): - | false - | Expand['types']['allParams']> => { + (opts) => { const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts return router.matchRoute(rest as any, { @@ -174,7 +189,15 @@ export function useMatchRoute() { includeSearch, }) }, - [router], + [ + router, + // eslint-disable-next-line react-hooks/rules-of-hooks, react-hooks/exhaustive-deps + useStore(router.stores.location, (location) => location.href), + // eslint-disable-next-line react-hooks/rules-of-hooks, react-hooks/exhaustive-deps + useStore(router.stores.resolvedLocation, (location) => location?.href), + // eslint-disable-next-line react-hooks/rules-of-hooks, react-hooks/exhaustive-deps + useStore(router.stores.status, (status) => status), + ], ) } diff --git a/packages/react-router/src/Transitioner.tsx b/packages/react-router/src/Transitioner.tsx index 341d09ffcca..cd20673ff16 100644 --- a/packages/react-router/src/Transitioner.tsx +++ b/packages/react-router/src/Transitioner.tsx @@ -15,7 +15,11 @@ export function settleOwner( settle?.(rendered) } -export function Transitioner() { +export function Transitioner({ + t, +}: { + t: React.Dispatch> +}) { const router = useRouter() const acknowledgement = (router._rendered ??= []) const mounted = @@ -28,6 +32,7 @@ export function Transitioner() { new Promise((resolve, reject) => { settleOwner(acknowledgement, false) acknowledgement.push(expected, resolve) + t(router) React.startTransition(() => { try { fn() diff --git a/packages/react-router/src/fileRoute.ts b/packages/react-router/src/fileRoute.ts index 46b96240a47..e5fdb4993b9 100644 --- a/packages/react-router/src/fileRoute.ts +++ b/packages/react-router/src/fileRoute.ts @@ -54,11 +54,14 @@ export function createFileRoute< TFullPath extends RouteConstraints['TFullPath'] = FileRoutesByPath[TFilePath]['fullPath'], >( + // eslint-disable-next-line unused-imports/no-unused-vars path?: TFilePath, ): FileRoute['createRoute'] { - return new FileRoute(path, { - silent: true, - }).createRoute + return (options) => { + const route = createRoute(options as any) + ;(route as any).isRoot = false + return route as any + } } /** diff --git a/packages/react-router/src/link.tsx b/packages/react-router/src/link.tsx index eddc0ac0b3b..88f18bee400 100644 --- a/packages/react-router/src/link.tsx +++ b/packages/react-router/src/link.tsx @@ -2,7 +2,6 @@ import * as React from 'react' import { useStore } from '@tanstack/react-store' -import { flushSync } from 'react-dom' import { deepEqual, exactPathTest, @@ -19,9 +18,11 @@ import { useForwardedRef, useIntersectionObserver } from './utils' import { useHydrated } from './ClientOnly' import type { + ActiveOptions, AnyRouter, Constrain, LinkOptions, + ParsedLocation, RegisteredRouter, RoutePaths, } from '@tanstack/router-core' @@ -31,6 +32,114 @@ import type { ValidateLinkOptionsArray, } from './typePrimitives' +type LinkState = [ + href: string | undefined, + externalLink: string | undefined, + isActive: boolean, +] + +// Keep a referentially stable value while the contents are equal. Links +// routinely pass inline `params` / `search` object literals, which would +// otherwise change `_options` identity on every parent render, rebuild the +// store selector, and discard its memoized selection. +// +// `ignoreUndefined: false` is required: an explicit `undefined` clears an +// inherited param or search key, so `{}` and `{ category: undefined }` build +// different locations and must not be treated as equal here. +function useValueStable(value: T): T { + const ref = React.useRef(value) + // `deepEqual` short-circuits on reference equality, so this covers both cases. + if (!deepEqual(ref.current, value, { ignoreUndefined: false })) { + ref.current = value + } + return ref.current +} + +function compareLinkState(a: LinkState, b: LinkState) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] +} + +function resolveExternalLink( + hrefOption: { href: string; external?: boolean } | undefined, + to: unknown, + protocolAllowlist: AnyRouter['protocolAllowlist'], +): string | undefined { + if (hrefOption?.external) { + // Block dangerous protocols for external links + if (isDangerousProtocol(hrefOption.href, protocolAllowlist)) { + if (process.env.NODE_ENV !== 'production') { + console.warn(`Blocked Link with dangerous protocol: ${hrefOption.href}`) + } + return undefined + } + return hrefOption.href + } + if (isSafeInternal(to)) { + return undefined + } + if (typeof to !== 'string' || to.indexOf(':') === -1) { + return undefined + } + try { + new URL(to) + // Block dangerous protocols like javascript:, blob:, data: + if (isDangerousProtocol(to, protocolAllowlist)) { + if (process.env.NODE_ENV !== 'production') { + console.warn(`Blocked Link with dangerous protocol: ${to}`) + } + return undefined + } + return to + } catch {} + return undefined +} + +function resolveIsActive( + location: ParsedLocation, + next: ParsedLocation, + activeOptions: ActiveOptions | undefined, + basepath: string, + isHydrated: boolean, + isExternal: boolean, +): boolean { + if (isExternal) { + return false + } + if (activeOptions?.exact) { + const testExact = exactPathTest(location.pathname, next.pathname, basepath) + if (!testExact) { + return false + } + } else { + const currentPathSplit = removeTrailingSlash(location.pathname, basepath) + const nextPathSplit = removeTrailingSlash(next.pathname, basepath) + + const pathIsFuzzyEqual = + currentPathSplit.startsWith(nextPathSplit) && + (currentPathSplit.length === nextPathSplit.length || + currentPathSplit[nextPathSplit.length] === '/') + + if (!pathIsFuzzyEqual) { + return false + } + } + + if (activeOptions?.includeSearch ?? true) { + const searchTest = deepEqual(location.search, next.search, { + partial: !activeOptions?.exact, + ignoreUndefined: !activeOptions?.explicitUndefined, + }) + if (!searchTest) { + return false + } + } + + if (activeOptions?.includeHash) { + return isHydrated && location.hash === next.hash + } + return true +} + /** * Build anchor-like props for declarative navigation and preloading. * @@ -56,9 +165,6 @@ export function useLinkProps< const router = useRouter() const innerRef = useForwardedRef(forwardedRef) - // Determine if we're on the server - used for tree-shaking client-only code - const _isServer = isServer ?? router.isServer - const { // custom props activeProps, @@ -110,7 +216,9 @@ export function useLinkProps< // // Note: `location.hash` is not available on the server. // ========================================================================== - if (_isServer) { + // The expression must stay inlined in the `if` so bundlers fold the + // browser-build constant `isServer = false` and drop this server block. + if (isServer ?? router.isServer) { const safeInternal = isSafeInternal(to) // If `to` is obviously an absolute URL, treat as external and avoid @@ -381,6 +489,12 @@ export function useLinkProps< // eslint-disable-next-line react-hooks/rules-of-hooks const isHydrated = useHydrated() + // eslint-disable-next-line react-hooks/rules-of-hooks + const stableSearch = useValueStable(options.search) + // eslint-disable-next-line react-hooks/rules-of-hooks + const stableParams = useValueStable(options.params) + // eslint-disable-next-line react-hooks/rules-of-hooks + const stableActiveOptions = useValueStable(activeOptions) // eslint-disable-next-line react-hooks/rules-of-hooks const _options = React.useMemo( () => options, @@ -391,136 +505,64 @@ export function useLinkProps< options._fromLocation, options.hash, options.to, - options.search, - options.params, + stableSearch, + stableParams, options.state, options.mask, options.unsafeRelative, ], ) + // Derive inside the selector so `compareLinkState` can bail out. Deriving after + // the subscription instead re-renders every link on every navigation, because + // the comparator only sees the location, not whether this link's output moved. // eslint-disable-next-line react-hooks/rules-of-hooks - const currentLocation = useStore( - router.stores.location, - (l) => l, - (prev, next) => prev.href === next.href, - ) - - // eslint-disable-next-line react-hooks/rules-of-hooks - const next = React.useMemo(() => { - const opts = { _fromLocation: currentLocation, ..._options } - return router.buildLocation(opts as any) - }, [router, currentLocation, _options]) - - // Use publicHref - it contains the correct href for display - // When a rewrite changes the origin, publicHref is the full URL - // Otherwise it's the origin-stripped path - // This avoids constructing URL objects in the hot path - const hrefOptionPublicHref = next.maskedLocation - ? next.maskedLocation.publicHref - : next.publicHref - const hrefOptionExternal = next.maskedLocation - ? next.maskedLocation.external - : next.external - // eslint-disable-next-line react-hooks/rules-of-hooks - const hrefOption = React.useMemo( - () => - getHrefOption( - hrefOptionPublicHref, - hrefOptionExternal, + const selectLinkState = React.useCallback( + (location: ParsedLocation): LinkState => { + const next = router.buildLocation({ + _fromLocation: location, + ..._options, + } as any) + + // Use publicHref - it contains the correct href for display + // When a rewrite changes the origin, publicHref is the full URL + // Otherwise it's the origin-stripped path + // This avoids constructing URL objects in the hot path + const hrefOption = getHrefOption( + next.maskedLocation ? next.maskedLocation.publicHref : next.publicHref, + next.maskedLocation ? next.maskedLocation.external : next.external, router.history, disabled, - ), - [disabled, hrefOptionExternal, hrefOptionPublicHref, router.history], - ) - - // eslint-disable-next-line react-hooks/rules-of-hooks - const externalLink = React.useMemo(() => { - if (hrefOption?.external) { - // Block dangerous protocols for external links - if (isDangerousProtocol(hrefOption.href, router.protocolAllowlist)) { - if (process.env.NODE_ENV !== 'production') { - console.warn( - `Blocked Link with dangerous protocol: ${hrefOption.href}`, - ) - } - return undefined - } - return hrefOption.href - } - const safeInternal = isSafeInternal(to) - if (safeInternal) return undefined - if (typeof to !== 'string' || to.indexOf(':') === -1) return undefined - try { - new URL(to as any) - // Block dangerous protocols like javascript:, blob:, data: - if (isDangerousProtocol(to, router.protocolAllowlist)) { - if (process.env.NODE_ENV !== 'production') { - console.warn(`Blocked Link with dangerous protocol: ${to}`) - } - return undefined - } - return to - } catch {} - return undefined - }, [to, hrefOption, router.protocolAllowlist]) - - // eslint-disable-next-line react-hooks/rules-of-hooks - const isActive = React.useMemo(() => { - if (externalLink) return false - if (activeOptions?.exact) { - const testExact = exactPathTest( - currentLocation.pathname, - next.pathname, - router.basepath, ) - if (!testExact) { - return false - } - } else { - const currentPathSplit = removeTrailingSlash( - currentLocation.pathname, - router.basepath, - ) - const nextPathSplit = removeTrailingSlash(next.pathname, router.basepath) - - const pathIsFuzzyEqual = - currentPathSplit.startsWith(nextPathSplit) && - (currentPathSplit.length === nextPathSplit.length || - currentPathSplit[nextPathSplit.length] === '/') - if (!pathIsFuzzyEqual) { - return false - } - } + const externalLink = resolveExternalLink( + hrefOption, + to, + router.protocolAllowlist, + ) - if (activeOptions?.includeSearch ?? true) { - const searchTest = deepEqual(currentLocation.search, next.search, { - partial: !activeOptions?.exact, - ignoreUndefined: !activeOptions?.explicitUndefined, - }) - if (!searchTest) { - return false - } - } + return [ + hrefOption?.href, + externalLink, + resolveIsActive( + location, + next, + stableActiveOptions, + router.basepath, + isHydrated, + externalLink !== undefined, + ), + ] + }, + [stableActiveOptions, disabled, isHydrated, _options, router, to], + ) - if (activeOptions?.includeHash) { - return isHydrated && currentLocation.hash === next.hash - } - return true - }, [ - activeOptions?.exact, - activeOptions?.explicitUndefined, - activeOptions?.includeHash, - activeOptions?.includeSearch, - currentLocation, - externalLink, - isHydrated, - next.hash, - next.pathname, - next.search, - router.basepath, - ]) + // eslint-disable-next-line react-hooks/rules-of-hooks + const [href, externalLink, isActive] = useStore( + router.stores.location, + selectLinkState, + compareLinkState, + ) // Get the active props const resolvedActiveProps: React.HTMLAttributes = isActive @@ -549,13 +591,11 @@ export function useLinkProps< ...resolvedInactiveProps.style, } - // eslint-disable-next-line react-hooks/rules-of-hooks - const [isTransitioning, setIsTransitioning] = React.useState(false) // eslint-disable-next-line react-hooks/rules-of-hooks const hasRenderFetched = React.useRef(false) const preload = - options.reloadDocument || externalLink + options.reloadDocument || externalLink || disabled ? false : (userPreload ?? router.options.defaultPreload) const preloadDelay = @@ -563,42 +603,67 @@ export function useLinkProps< // eslint-disable-next-line react-hooks/rules-of-hooks const doPreload = React.useCallback(() => { - router - .preloadRoute({ ..._options, _builtLocation: next } as any) - .catch((err) => { - console.warn(err) - console.warn(preloadWarning) - }) - }, [router, _options, next]) + // `preloadRoute` builds the location itself; it is no longer held in render + // state. It only reads the options, so `_options` can go through as-is. + router.preloadRoute(_options as any).catch((err) => { + console.warn(err) + console.warn(preloadWarning) + }) + }, [router, _options]) // eslint-disable-next-line react-hooks/rules-of-hooks - const preloadViewportIoCallback = React.useCallback( - (entry: IntersectionObserverEntry | undefined) => { - if (entry?.isIntersecting) { + const enqueuePreload = React.useCallback( + (e?: React.MouseEvent | React.FocusEvent | IntersectionObserverEntry) => { + if (!e) { + cancelPreload(innerRef) + return + } + + if ( + !( + (e as IntersectionObserverEntry).isIntersecting ?? + preload === 'intent' + ) + ) { + if ((e as IntersectionObserverEntry).isIntersecting === false) { + cancelPreload(innerRef) + } + return + } + + if (!preloadDelay) { doPreload() + return } + + if (timeoutMap.has(innerRef)) { + return + } + + timeoutMap.set( + innerRef, + setTimeout(() => { + timeoutMap.delete(innerRef) + doPreload() + }, preloadDelay), + ) }, - [doPreload], + [doPreload, innerRef, preload, preloadDelay], ) // eslint-disable-next-line react-hooks/rules-of-hooks - useIntersectionObserver( - innerRef, - preloadViewportIoCallback, - intersectionObserverOptions, - { disabled: !!disabled || !(preload === 'viewport') }, - ) + useIntersectionObserver(innerRef, enqueuePreload, preload !== 'viewport') // eslint-disable-next-line react-hooks/rules-of-hooks React.useEffect(() => { if (hasRenderFetched.current) { return } - if (!disabled && preload === 'render') { + if (preload === 'render') { doPreload() hasRenderFetched.current = true } - }, [disabled, doPreload, preload]) + }, [doPreload, preload]) // The click handler const handleClick = (e: React.MouseEvent) => { @@ -617,15 +682,6 @@ export function useLinkProps< ) { e.preventDefault() - flushSync(() => { - setIsTransitioning(true) - }) - - const unsub = router.subscribe('onResolved', () => { - unsub() - setIsTransitioning(false) - }) - // All is well? Navigate! // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing router.navigate({ @@ -659,39 +715,14 @@ export function useLinkProps< } } - const enqueueIntentPreload = (e: React.MouseEvent | React.FocusEvent) => { - if (disabled || preload !== 'intent') return - - if (!preloadDelay) { - doPreload() - return - } - - const eventTarget = e.currentTarget - - if (timeoutMap.has(eventTarget)) { - return - } - - const id = setTimeout(() => { - timeoutMap.delete(eventTarget) - doPreload() - }, preloadDelay) - timeoutMap.set(eventTarget, id) - } - - const handleTouchStart = (_: React.TouchEvent) => { - if (disabled || preload !== 'intent') return + const handleTouchStart = () => { + if (preload !== 'intent') return doPreload() } - const handleLeave = (e: React.MouseEvent | React.FocusEvent) => { - if (disabled || !preload || !preloadDelay) return - const eventTarget = e.currentTarget - const id = timeoutMap.get(eventTarget) - if (id) { - clearTimeout(id) - timeoutMap.delete(eventTarget) + const handleLeave = () => { + if (preload === 'intent') { + cancelPreload(innerRef) } } @@ -699,12 +730,12 @@ export function useLinkProps< ...propsSafeToSpread, ...resolvedActiveProps, ...resolvedInactiveProps, - href: hrefOption?.href, + href, ref: innerRef as React.ComponentPropsWithRef<'a'>['ref'], onClick: composeHandlers([onClick, handleClick]), onBlur: composeHandlers([onBlur, handleLeave]), - onFocus: composeHandlers([onFocus, enqueueIntentPreload]), - onMouseEnter: composeHandlers([onMouseEnter, enqueueIntentPreload]), + onFocus: composeHandlers([onFocus, enqueuePreload]), + onMouseEnter: composeHandlers([onMouseEnter, enqueuePreload]), onMouseLeave: composeHandlers([onMouseLeave, handleLeave]), onTouchStart: composeHandlers([onTouchStart, handleTouchStart]), disabled: !!disabled, @@ -713,7 +744,6 @@ export function useLinkProps< ...(resolvedClassName && { className: resolvedClassName }), ...(disabled && STATIC_DISABLED_PROPS), ...(isActive && STATIC_ACTIVE_PROPS), - ...(isHydrated && isTransitioning && STATIC_TRANSITIONING_PROPS), } } @@ -721,12 +751,11 @@ const STATIC_EMPTY_OBJECT = {} const STATIC_ACTIVE_OBJECT = { className: 'active' } const STATIC_DISABLED_PROPS = { role: 'link', 'aria-disabled': true } const STATIC_ACTIVE_PROPS = { 'data-status': 'active', 'aria-current': 'page' } -const STATIC_TRANSITIONING_PROPS = { 'data-transitioning': 'transitioning' } - -const timeoutMap = new WeakMap>() -const intersectionObserverOptions: IntersectionObserverInit = { - rootMargin: '100px', +const timeoutMap = new WeakMap>() +const cancelPreload = (eventTarget: object) => { + clearTimeout(timeoutMap.get(eventTarget)) + timeoutMap.delete(eventTarget) } const composeHandlers = @@ -822,10 +851,7 @@ export interface LinkPropsChildren { // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns children?: | React.ReactNode - | ((state: { - isActive: boolean - isTransitioning: boolean - }) => React.ReactNode) + | ((state: { isActive: boolean }) => React.ReactNode) } type LinkComponentReactProps = Omit< @@ -912,7 +938,7 @@ export function createLink( * * Props: * - `preload`: Controls route preloading (eg. 'intent', 'render', 'viewport', true/false) - * - `preloadDelay`: Delay in ms before preloading on hover + * - `preloadDelay`: Delay in ms before preloading on focus, hover, or viewport entry * - `activeProps`/`inactiveProps`: Additional props merged when link is active/inactive * - `resetScroll`/`hashScrollIntoView`: Control scroll behavior on navigation * - `viewTransition`/`startTransition`: Use View Transitions/React transitions for navigation diff --git a/packages/react-router/src/nonRouteComponentContext.tsx b/packages/react-router/src/nonRouteComponentContext.tsx new file mode 100644 index 00000000000..252ab7fd109 --- /dev/null +++ b/packages/react-router/src/nonRouteComponentContext.tsx @@ -0,0 +1,21 @@ +'use client' + +import * as React from 'react' + +export type NonRouteComponent = + | 'pendingComponent' + | 'errorComponent' + | 'notFoundComponent' + +export const nonRouteComponentContext = + process.env.NODE_ENV !== 'production' + ? React.createContext(undefined) + : undefined + +export function wrapInNonRouteComponentContext( + element: React.ReactElement, + component: NonRouteComponent, +): React.ReactElement { + const Context = nonRouteComponentContext! + return {element} +} diff --git a/packages/react-router/src/renderRouteNotFound.tsx b/packages/react-router/src/renderRouteNotFound.tsx index f8374ebd7c2..9e363da7f44 100644 --- a/packages/react-router/src/renderRouteNotFound.tsx +++ b/packages/react-router/src/renderRouteNotFound.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { DefaultGlobalNotFound } from './not-found' +import { wrapInNonRouteComponentContext } from './nonRouteComponentContext' import type { AnyRoute, AnyRouter } from '@tanstack/router-core' /** @@ -17,7 +18,12 @@ export function renderRouteNotFound( ) { if (!route.options.notFoundComponent) { if (router.options.defaultNotFoundComponent) { - return + const notFoundElement = ( + + ) + return process.env.NODE_ENV !== 'production' + ? wrapInNonRouteComponentContext(notFoundElement, 'notFoundComponent') + : notFoundElement } if (process.env.NODE_ENV !== 'production') { @@ -31,5 +37,8 @@ export function renderRouteNotFound( return } - return + const notFoundElement = + return process.env.NODE_ENV !== 'production' + ? wrapInNonRouteComponentContext(notFoundElement, 'notFoundComponent') + : notFoundElement } diff --git a/packages/react-router/src/useBlocker.tsx b/packages/react-router/src/useBlocker.tsx index 68612c97cb3..65636510c9d 100644 --- a/packages/react-router/src/useBlocker.tsx +++ b/packages/react-router/src/useBlocker.tsx @@ -179,22 +179,24 @@ export function useBlocker( location: HistoryLocation, ): AnyShouldBlockFnLocation { const parsedLocation = router.parseLocation(location) - const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname) - if (matchedRoutes.foundRoute === undefined) { + const [, rawParams, foundRoute] = router.getMatchedRoutes( + parsedLocation.pathname, + ) + if (foundRoute === undefined) { return { routeId: '__notFound__', fullPath: parsedLocation.pathname, pathname: parsedLocation.pathname, - params: matchedRoutes.routeParams, + params: rawParams, search: router.options.parseSearch(location.search), } } return { - routeId: matchedRoutes.foundRoute.id, - fullPath: matchedRoutes.foundRoute.fullPath, + routeId: foundRoute.id, + fullPath: foundRoute.fullPath, pathname: parsedLocation.pathname, - params: matchedRoutes.routeParams, + params: rawParams, search: router.options.parseSearch(location.search), } } diff --git a/packages/react-router/src/useRouterState.tsx b/packages/react-router/src/useRouterState.tsx index 1e281645af7..f3fbb2ad6e9 100644 --- a/packages/react-router/src/useRouterState.tsx +++ b/packages/react-router/src/useRouterState.tsx @@ -56,8 +56,9 @@ export function useRouterState< // During SSR we render exactly once and do not need reactivity. // Avoid subscribing to the store (and any structural sharing work) on the server. - const _isServer = isServer ?? router.isServer - if (_isServer) { + // The expression must stay inlined in the `if` so bundlers fold the + // browser-build constant `isServer = false` and drop this server block. + if (isServer ?? router.isServer) { const state = router.stores.__store.get() as RouterState< TRouter['routeTree'] > diff --git a/packages/react-router/src/utils.ts b/packages/react-router/src/utils.ts index ca0653e350b..b650e343881 100644 --- a/packages/react-router/src/utils.ts +++ b/packages/react-router/src/utils.ts @@ -66,9 +66,8 @@ export function usePrevious(value: T): T | null { * When the intersection changes, the callback will be called with the `IntersectionObserverEntry`. * * @param ref - The ref to observe - * @param intersectionObserverOptions - The options to pass to the IntersectionObserver - * @param options - The options to pass to the hook * @param callback - The callback to call when the intersection changes + * @param disabled - Whether observation is disabled * @returns The IntersectionObserver instance * @example * ```tsx @@ -77,37 +76,39 @@ export function usePrevious(value: T): T | null { * useIntersectionObserver( * ref, * (entry) => { doSomething(entry) }, - * { rootMargin: '10px' }, - * { disabled: false } + * false * ) * return
* ``` */ export function useIntersectionObserver( ref: React.RefObject, - callback: (entry: IntersectionObserverEntry | undefined) => void, - intersectionObserverOptions: IntersectionObserverInit = {}, - options: { disabled?: boolean } = {}, + callback: (entry?: IntersectionObserverEntry) => void, + disabled?: boolean, ) { React.useEffect(() => { if ( !ref.current || - options.disabled || + disabled || typeof IntersectionObserver !== 'function' ) { - return + return () => callback() } - const observer = new IntersectionObserver(([entry]) => { - callback(entry) - }, intersectionObserverOptions) + const observer = new IntersectionObserver( + (entries) => { + callback(entries.pop()) + }, + { rootMargin: '100px' }, + ) observer.observe(ref.current) return () => { observer.disconnect() + callback() } - }, [callback, intersectionObserverOptions, options.disabled, ref]) + }, [callback, disabled, ref]) } /** diff --git a/packages/react-router/tests/Matches.test.tsx b/packages/react-router/tests/Matches.test.tsx index 33153a4e11f..93dca8b9c02 100644 --- a/packages/react-router/tests/Matches.test.tsx +++ b/packages/react-router/tests/Matches.test.tsx @@ -4,6 +4,7 @@ import { cleanup, fireEvent, render, + renderHook, screen, waitFor, } from '@testing-library/react' @@ -12,6 +13,7 @@ import { createControlledPromise } from '@tanstack/router-core' import { Link, Outlet, + RouterContextProvider, RouterProvider, createRootRoute, createRoute, @@ -232,6 +234,59 @@ test('useMatchRoute follows superseding pending locations', async () => { }) }) +test('useMatchRoute callback identity tracks route matching state', async () => { + const root = createRootRoute() + const a = createRoute({ + getParentRoute: () => root, + path: '/a', + }) + const b = createRoute({ + getParentRoute: () => root, + path: '/b', + }) + const router = createRouter({ + routeTree: root.addChildren([a, b]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + const aLocation = router.buildLocation({ to: '/a' }) + const bLocation = router.buildLocation({ to: '/b' }) + + const { result, rerender } = renderHook(() => useMatchRoute(), { + wrapper: ({ children }) => ( + {children} + ), + }) + + let previous = result.current + rerender() + expect(result.current).toBe(previous) + + async function expectCallbackInvalidated(update: () => void) { + previous = result.current + act(update) + await waitFor(() => expect(result.current).not.toBe(previous)) + } + + await expectCallbackInvalidated(() => { + router.stores.location.set(aLocation) + }) + await expectCallbackInvalidated(() => { + router.stores.resolvedLocation.set(bLocation) + }) + await expectCallbackInvalidated(() => { + router.stores.status.set('pending') + }) + + previous = result.current + act(() => { + router.stores.location.set({ ...aLocation }) + router.stores.resolvedLocation.set({ ...bLocation }) + router.stores.status.set('pending') + }) + rerender() + expect(result.current).toBe(previous) +}) + test('legacy notFoundRoute drops a stale parent layout after navigation', async () => { let legacyLoads = 0 const root = createRootRoute({ component: Outlet }) diff --git a/packages/react-router/tests/Outlet.test.tsx b/packages/react-router/tests/Outlet.test.tsx new file mode 100644 index 00000000000..e8dc5447cbc --- /dev/null +++ b/packages/react-router/tests/Outlet.test.tsx @@ -0,0 +1,146 @@ +import { afterEach, expect, test, vi } from 'vitest' +import { cleanup, render, screen } from '@testing-library/react' +import { createMemoryHistory } from '@tanstack/history' +import { createControlledPromise, notFound } from '@tanstack/router-core' +import { + Outlet, + RouterProvider, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +const outletWarning = ( + component: 'pendingComponent' | 'errorComponent' | 'notFoundComponent', +) => + `Warning: An was rendered inside a ${component}. should only be rendered inside a route component.` + +afterEach(() => { + cleanup() + vi.restoreAllMocks() +}) + +test('does not warn when Outlet is rendered inside a route component', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const rootRoute = createRootRoute({ + component: () => ( + <> + Root route + + + ), + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + + expect(await screen.findByText('Index route')).toBeInTheDocument() + expect(warn).not.toHaveBeenCalled() +}) + +test('warns when Outlet is rendered inside a pendingComponent', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const pending = createControlledPromise() + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const pendingRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/pending', + loader: () => pending, + pendingMs: 0, + pendingComponent: () => ( + <> + Pending route + + + ), + component: () => Resolved route, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, pendingRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + await screen.findByText('Index route') + + const navigation = router.navigate({ to: '/pending' }) + expect(await screen.findByText('Pending route')).toBeInTheDocument() + pending.resolve() + await navigation + + expect(warn).toHaveBeenCalledWith(outletWarning('pendingComponent')) +}) + +test('warns when Outlet is rendered inside an errorComponent', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + loader: () => { + throw new Error('Loader failed') + }, + errorComponent: () => ( + <> + Error route + + + ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + + expect(await screen.findByText('Error route')).toBeInTheDocument() + expect(warn).toHaveBeenCalledWith(outletWarning('errorComponent')) +}) + +test('warns when Outlet is rendered inside a notFoundComponent', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const notFoundRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/not-found', + component: () => { + throw notFound() + }, + notFoundComponent: () => ( + <> + Not found route + + + ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, notFoundRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + await screen.findByText('Index route') + await router.navigate({ to: '/not-found' }) + + expect(await screen.findByText('Not found route')).toBeInTheDocument() + expect(warn).toHaveBeenCalledWith(outletWarning('notFoundComponent')) +}) diff --git a/packages/react-router/tests/fileRoute.test.ts b/packages/react-router/tests/fileRoute.test.ts index 2a8e225371e..9f3fa290d3a 100644 --- a/packages/react-router/tests/fileRoute.test.ts +++ b/packages/react-router/tests/fileRoute.test.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -import { describe, it, expect } from 'vitest' +import { afterEach, describe, it, expect, vi } from 'vitest' import { getRouteApi, createFileRoute, @@ -7,8 +7,33 @@ import { createLazyFileRoute, LazyRoute, AnyRoute, + FileRoute, } from '../src' +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('createFileRoute', () => { + it('creates a non-root route without a deprecation warning', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = createFileRoute('')({}) + + expect(route.isRoot).toBe(false) + expect(warn).not.toHaveBeenCalled() + }) + + it('keeps the deprecation warning for direct FileRoute usage', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = new FileRoute('').createRoute({}) + + expect(route.isRoot).toBe(false) + expect(warn).toHaveBeenCalledOnce() + }) +}) + describe('createFileRoute has the same hooks as getRouteApi', () => { const routeApi = getRouteApi('foo') const hookNames = Object.keys(routeApi).filter((key) => key.startsWith('use')) diff --git a/packages/react-router/tests/issue-4759-pending-frame.test.tsx b/packages/react-router/tests/issue-4759-pending-frame.test.tsx deleted file mode 100644 index 7b8b74161c0..00000000000 --- a/packages/react-router/tests/issue-4759-pending-frame.test.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import * as React from 'react' -import { - afterEach, - beforeEach, - describe, - expect, - onTestFinished, - test, - vi, -} from 'vitest' -import { act, cleanup, render, screen } from '@testing-library/react' -import { - RouterProvider, - createBrowserHistory, - createRootRoute, - createRoute, - createRouter, -} from '../src' -import type { RouterHistory } from '../src' - -let history: RouterHistory - -beforeEach(() => { - history = createBrowserHistory() - expect(window.location.pathname).toBe('/') -}) - -afterEach(() => { - history.destroy() - window.history.replaceState(null, 'root', '/') - vi.resetAllMocks() - cleanup() -}) - -// Repro for https://github.com/TanStack/router/issues/4759 -// -// JSDOM cannot observe browser paints. This unit reduction verifies the event -// ordering behind the issue: pending DOM must be published before the first -// macrotask when pendingMs is 0. -describe('issue #4759: pendingMs 0 publishes pending DOM before a macrotask', () => { - test('pending fallback is committed on mount without waiting for a macrotask', async () => { - vi.useFakeTimers() - let resolveLoader!: (value: string) => void - const loaderPromise = new Promise((resolve) => { - resolveLoader = resolve - }) - - const rootRoute = createRootRoute() - const indexRoute = createRoute({ - getParentRoute: () => rootRoute, - path: '/', - loader: () => loaderPromise, - component: () =>
loaded
, - }) - - const router = createRouter({ - routeTree: rootRoute.addChildren([indexRoute]), - history, - }) - let resolveRendered!: () => void - const rendered = new Promise((resolve) => { - resolveRendered = resolve - }) - const unsubscribe = router.subscribe('onRendered', (event) => { - if (event.toLocation.pathname === '/') { - resolveRendered() - } - }) - - onTestFinished(() => { - unsubscribe() - resolveLoader('done') - vi.useRealTimers() - }) - - render( -
- ( -
pending...
- )} - /> -
, - ) - - // Fake timers keep the first macrotask frozen. An implementation that - // publishes pending state with setTimeout cannot satisfy this assertion. - await act(async () => {}) - expect(screen.getByTestId('pending')).toBeInTheDocument() - - // Sanity: the load still completes normally afterwards. - resolveLoader('done') - await act(() => rendered) - expect(screen.getByTestId('loaded')).toBeInTheDocument() - expect(screen.queryByTestId('pending')).not.toBeInTheDocument() - }) -}) diff --git a/packages/react-router/tests/issue-7964-param-parsing-loader.test.tsx b/packages/react-router/tests/issue-7964-param-parsing-loader.test.tsx new file mode 100644 index 00000000000..54f6c19c47f --- /dev/null +++ b/packages/react-router/tests/issue-7964-param-parsing-loader.test.tsx @@ -0,0 +1,107 @@ +import { act, cleanup, render, screen, waitFor } from '@testing-library/react' +import { afterEach, expect, test } from 'vitest' +import { + Outlet, + RouterProvider, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +afterEach(() => { + cleanup() +}) + +// https://github.com/TanStack/router/issues/7964 +test('#7964: a child loader receives fresh structured params after revisiting its route', async () => { + const rootRoute = createRootRoute({ + component: Outlet, + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () =>
Home page
, + }) + const parsedParamRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/$parsedParam', + params: { + parse: ({ parsedParam }) => { + const [recordName, revisionNumber] = parsedParam.split('-') + return { + parsedParam: { + recordName: recordName!, + revisionNumber: Number(revisionNumber), + }, + } + }, + stringify: ({ parsedParam }) => ({ + parsedParam: `${parsedParam.recordName}-${parsedParam.revisionNumber}`, + }), + }, + component: Outlet, + }) + const parsedParamIndexRoute = createRoute({ + getParentRoute: () => parsedParamRoute, + path: '/', + loader: ({ params }) => params.parsedParam.revisionNumber * 100, + component: () => { + const params = parsedParamIndexRoute.useParams() + const loaderData = parsedParamIndexRoute.useLoaderData() + + return ( + <> +
+ Params have {params.parsedParam.recordName} with revision{' '} + {params.parsedParam.revisionNumber} +
+
Loader data is {loaderData}
+ + ) + }, + }) + const routeTree = rootRoute.addChildren([ + indexRoute, + parsedParamRoute.addChildren([parsedParamIndexRoute]), + ]) + const router = createRouter({ + routeTree, + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + expect(await screen.findByText('Home page')).toBeInTheDocument() + + await act(() => + router.navigate({ + to: '/$parsedParam', + params: { parsedParam: { recordName: 'blue', revisionNumber: 1 } }, + }), + ) + expect( + await screen.findByText('Params have blue with revision 1'), + ).toBeInTheDocument() + expect(await screen.findByText('Loader data is 100')).toBeInTheDocument() + + await act(() => router.navigate({ to: '/' })) + expect(await screen.findByText('Home page')).toBeInTheDocument() + + await act(() => + router.navigate({ + to: '/$parsedParam', + params: { parsedParam: { recordName: 'red', revisionNumber: 2 } }, + }), + ) + expect(router.state.location.pathname).toBe('/red-2') + + await waitFor(() => { + expect({ + params: screen.getByTestId('params').textContent, + loaderData: screen.getByTestId('loader-data').textContent, + }).toEqual({ + params: 'Params have red with revision 2', + loaderData: 'Loader data is 200', + }) + }) +}) diff --git a/packages/react-router/tests/issue-7986-retained-pending.test.tsx b/packages/react-router/tests/issue-7986-retained-pending.test.tsx new file mode 100644 index 00000000000..1d2dfdf5c8b --- /dev/null +++ b/packages/react-router/tests/issue-7986-retained-pending.test.tsx @@ -0,0 +1,658 @@ +import { act, cleanup, render, screen, waitFor } from '@testing-library/react' +import { afterEach, expect, test, vi } from 'vitest' +import { + Outlet, + RouterProvider, + createLazyRoute, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +afterEach(() => { + cleanup() + vi.useRealTimers() + vi.restoreAllMocks() +}) + +const navigationDelay = 100 + +function delayNavigation() { + return new Promise((resolve) => setTimeout(resolve, navigationDelay)) +} + +function deferred() { + let resolve!: () => void + const promise = new Promise((resolver) => { + resolve = resolver + }) + return { promise, resolve } +} + +function setup() { + const navigationBeforeLoadStarted = deferred() + let beforeLoadCalls = 0 + + const rootRoute = createRootRoute({ component: Outlet }) + const layoutRoute = createRoute({ + getParentRoute: () => rootRoute, + id: 'app', + beforeLoad: async () => { + if (++beforeLoadCalls > 1) { + navigationBeforeLoadStarted.resolve() + await delayNavigation() + } + return { user: 'test' } + }, + component: Outlet, + }) + const projectRoute = createRoute({ + getParentRoute: () => layoutRoute, + path: '/projects/$projectId', + validateSearch: (search: Record): { tab?: string } => + typeof search.tab === 'string' ? { tab: search.tab } : {}, + component: Project, + }) + + function Project() { + const { projectId } = projectRoute.useParams() + const { tab } = projectRoute.useSearch() + return ( +
+ project={projectId} tab={tab ?? 'default'} +
+ ) + } + + const router = createRouter({ + routeTree: rootRoute.addChildren([layoutRoute.addChildren([projectRoute])]), + history: createMemoryHistory({ initialEntries: ['/projects/p1'] }), + defaultPendingComponent: () =>
Pending
, + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + return { + router, + navigationBeforeLoadStarted, + } +} + +test('a search-only navigation retains successful UI while beforeLoad reruns', async () => { + const { router, navigationBeforeLoadStarted } = setup() + render() + expect(await screen.findByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + + vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) + let navigation!: Promise + await act(async () => { + navigation = router.navigate({ + to: '/projects/$projectId', + params: { projectId: 'p1' }, + search: { tab: 'files' }, + }) + await navigationBeforeLoadStarted.promise + }) + + const contentWhileLoading = screen.getByTestId('content') + expect(contentWhileLoading).toBeVisible() + expect(contentWhileLoading).toHaveTextContent('project=p1 tab=default') + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await act(async () => { + await vi.advanceTimersByTimeAsync(0) + }) + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await act(async () => { + await vi.advanceTimersByTimeAsync(navigationDelay) + await navigation + }) + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=files', + ) +}) + +test('a path-param navigation retains successful UI while beforeLoad reruns', async () => { + const { router, navigationBeforeLoadStarted } = setup() + render() + expect(await screen.findByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + + vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) + let navigation!: Promise + await act(async () => { + navigation = router.navigate({ + to: '/projects/$projectId', + params: { projectId: 'p2' }, + }) + await navigationBeforeLoadStarted.promise + }) + + const contentWhileLoading = screen.getByTestId('content') + expect(contentWhileLoading).toBeVisible() + expect(contentWhileLoading).toHaveTextContent('project=p1 tab=default') + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await act(async () => { + await vi.advanceTimersByTimeAsync(0) + }) + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await act(async () => { + await vi.advanceTimersByTimeAsync(navigationDelay) + await navigation + }) + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p2 tab=default', + ) +}) + +test('a blocking reload retains the exact successful match', async () => { + const reloadStarted = deferred() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ component: Outlet }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + validateSearch: (search: Record): { tab?: string } => + typeof search.tab === 'string' ? { tab: search.tab } : {}, + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (++loaderCalls === 1) { + return 'initial' + } + reloadStarted.resolve() + return delayNavigation().then(() => 'reloaded') + }, + }, + component: () => ( +
+ {pageRoute.useLoaderData()} tab= + {pageRoute.useSearch().tab ?? 'default'} +
+ ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingComponent: () =>
Pending
, + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toHaveTextContent( + 'initial tab=default', + ) + + vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) + let navigation!: Promise + await act(async () => { + navigation = router.navigate({ + to: '/page', + search: { tab: 'files' }, + }) + await reloadStarted.promise + }) + + const contentWhileLoading = screen.getByTestId('content') + expect(contentWhileLoading).toBeVisible() + expect(contentWhileLoading).toHaveTextContent('initial tab=default') + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await act(async () => { + await vi.advanceTimersByTimeAsync(0) + }) + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('initial tab=default') + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await act(async () => { + await vi.advanceTimersByTimeAsync(navigationDelay) + await navigation + }) + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent('reloaded tab=files') +}) + +test('a cached success retries through pending UI when an error is mounted', async () => { + vi.spyOn(console, 'error').mockImplementation(() => {}) + vi.spyOn(console, 'warn').mockImplementation(() => {}) + const retryStarted = deferred() + const retry = deferred() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ component: Outlet }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + loaderCalls++ + if (loaderCalls === 1) { + throw new Error('initial load failed') + } + if (loaderCalls === 2) { + return 'preloaded' + } + retryStarted.resolve() + return retry.promise.then(() => 'retried') + }, + }, + component: () => ( +
{pageRoute.useLoaderData()}
+ ), + pendingComponent: () =>
Pending
, + errorComponent: () =>
Failed
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('error')).toBeInTheDocument() + + await router.preloadRoute({ to: '/page' }) + expect(loaderCalls).toBe(2) + expect(screen.getByTestId('error')).toBeInTheDocument() + + let navigation!: Promise + await act(async () => { + navigation = router.navigate({ to: '/page' }) + await retryStarted.promise + }) + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.getByTestId('error')).not.toBeVisible() + + await act(async () => { + retry.resolve() + await navigation + }) + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('retried') +}) + +test('a cache-only success retries through pending UI over mounted success', async () => { + const retryStarted = deferred() + const retry = deferred() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ component: Outlet }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + const generation = ++loaderCalls + if (generation === 3) { + retryStarted.resolve() + return retry.promise.then(() => `generation ${generation}`) + } + return `generation ${generation}` + }, + }, + component: () => ( +
{pageRoute.useLoaderData()}
+ ), + pendingComponent: () =>
Pending
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toHaveTextContent('generation 1') + + await router.preloadRoute({ to: '/page' }) + expect(loaderCalls).toBe(2) + expect(screen.getByTestId('content')).toHaveTextContent('generation 1') + + let navigation!: Promise + await act(async () => { + navigation = router.navigate({ to: '/page' }) + await retryStarted.promise + }) + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.getByTestId('content')).not.toBeVisible() + + await act(async () => { + retry.resolve() + await navigation + }) + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent('generation 3') +}) + +test('a success hidden below an error boundary retries through pending UI', async () => { + vi.spyOn(console, 'error').mockImplementation(() => {}) + vi.spyOn(console, 'warn').mockImplementation(() => {}) + const childReloadStarted = deferred() + const childReload = deferred() + let parentFails = false + let childReloads = false + + const rootRoute = createRootRoute({ component: Outlet }) + const parentRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/parent', + shouldReload: true, + loader: () => { + if (parentFails) { + throw new Error('parent failed') + } + return 'parent data' + }, + component: Outlet, + errorComponent: () =>
Parent failed
, + }) + const childRoute = createRoute({ + getParentRoute: () => parentRoute, + path: '/child', + shouldReload: () => childReloads, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (childReloads) { + childReloadStarted.resolve() + return childReload.promise.then(() => 'reloaded child') + } + return 'initial child' + }, + }, + component: () => ( +
{childRoute.useLoaderData()}
+ ), + pendingComponent: () =>
Pending child
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([parentRoute.addChildren([childRoute])]), + history: createMemoryHistory({ initialEntries: ['/parent/child'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toHaveTextContent( + 'initial child', + ) + + parentFails = true + await act(() => router.navigate({ to: '/parent/child' })) + expect(await screen.findByTestId('error')).toBeInTheDocument() + + parentFails = false + childReloads = true + let navigation!: Promise + await act(async () => { + navigation = router.navigate({ to: '/parent/child' }) + await childReloadStarted.promise + }) + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.queryByTestId('error')).not.toBeInTheDocument() + + await act(async () => { + childReload.resolve() + await navigation + }) + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('reloaded child') +}) + +test('a global not-found destination does not retain the mounted root success', async () => { + const missingStarted = deferred() + const missingLoader = deferred() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (++loaderCalls === 1) { + return 'initial root' + } + missingStarted.resolve() + return missingLoader.promise + }, + }, + component: Outlet, + pendingComponent: () =>
Pending root
, + notFoundComponent: () =>
Missing
, + }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + component: () =>
Page
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toBeInTheDocument() + + let navigation!: Promise + await act(async () => { + navigation = router.navigate({ to: '/missing' } as any) + await missingStarted.promise + }) + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.getByTestId('content')).not.toBeVisible() + + await act(async () => { + missingLoader.resolve() + await navigation + }) + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('missing')).toBeVisible() +}) + +test('lazy fuzzy-boundary relocation retains the mounted parent', async () => { + const lazyStarted = deferred() + const lazyRoute = deferred() + const parentReloadStarted = deferred() + const parentReload = deferred() + let parentLoads = 0 + + const rootRoute = createRootRoute({ + component: Outlet, + notFoundComponent: () =>
Root missing
, + }) + const parentRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/parent', + beforeLoad: async () => { + if (++parentLoads > 1) { + parentReloadStarted.resolve() + await parentReload.promise + } + }, + component: () => ( +
+
Parent content
+ +
+ ), + pendingComponent: () => ( +
Parent pending
+ ), + notFoundComponent: () => ( +
Parent missing
+ ), + }) + const childRoute = createRoute({ + getParentRoute: () => parentRoute, + path: '/child', + }).lazy(async () => { + lazyStarted.resolve() + await lazyRoute.promise + return createLazyRoute('/parent/child')({ + notFoundComponent: () => ( +
Child missing
+ ), + }) + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([parentRoute.addChildren([childRoute])]), + history: createMemoryHistory({ initialEntries: ['/parent'] }), + defaultPendingComponent: () => ( +
Pending
+ ), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('parent-content')).toBeVisible() + + let navigation!: Promise + await act(async () => { + navigation = router.navigate({ to: '/parent/child/missing' as any }) + await lazyStarted.promise + }) + + expect(screen.getByTestId('parent-content')).toBeVisible() + expect(screen.queryByTestId('parent-pending')).not.toBeInTheDocument() + expect(screen.queryByTestId('parent-missing')).not.toBeInTheDocument() + + await act(async () => { + lazyRoute.resolve() + await parentReloadStarted.promise + }) + + expect(screen.getByTestId('parent-content')).toBeVisible() + expect(screen.queryByTestId('parent-pending')).not.toBeInTheDocument() + expect(screen.queryByTestId('parent-missing')).not.toBeInTheDocument() + + await act(async () => { + parentReload.resolve() + await navigation + }) + + expect(screen.getByTestId('child-missing')).toBeVisible() + expect(screen.queryByTestId('root-missing')).not.toBeInTheDocument() + expect(screen.queryByTestId('parent-missing')).not.toBeInTheDocument() +}) + +test('a superseding navigation replaces an unrelated pending presentation', async () => { + const otherStarted = deferred() + const otherLoader = deferred() + const pageReloadStarted = deferred() + const pageReload = deferred() + let pageLoads = 0 + + const rootRoute = createRootRoute({ component: Outlet }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (++pageLoads === 1) { + return 'initial page' + } + pageReloadStarted.resolve() + return pageReload.promise.then(() => 'reloaded page') + }, + }, + component: () => ( +
{pageRoute.useLoaderData()}
+ ), + pendingComponent: () =>
Page pending
, + }) + const otherRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/other', + loader: async () => { + otherStarted.resolve() + await otherLoader.promise + }, + pendingComponent: () => ( +
Other pending
+ ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute, otherRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toHaveTextContent('initial page') + + await act(async () => { + void router.navigate({ to: '/other' }) + await otherStarted.promise + }) + expect(await screen.findByTestId('other-pending')).toBeVisible() + + let navigation!: Promise + await act(async () => { + navigation = router.navigate({ to: '/page' }) + await pageReloadStarted.promise + }) + + await waitFor(() => { + expect(screen.getByTestId('page-pending')).toBeVisible() + expect(screen.queryByTestId('other-pending')).not.toBeInTheDocument() + }) + + await act(async () => { + pageReload.resolve() + await navigation + }) + await act(async () => { + otherLoader.resolve() + await Promise.resolve() + }) + + expect(screen.queryByTestId('page-pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('reloaded page') +}) diff --git a/packages/react-router/tests/link.test.tsx b/packages/react-router/tests/link.test.tsx index f06a3a8decc..1c135361acf 100644 --- a/packages/react-router/tests/link.test.tsx +++ b/packages/react-router/tests/link.test.tsx @@ -31,6 +31,7 @@ import { redirect, retainSearchParams, stripSearchParams, + useLinkProps, useLoaderData, useMatchRoute, useParams, @@ -47,12 +48,16 @@ import type { RouterHistory } from '../src' const ioObserveMock = vi.fn() const ioDisconnectMock = vi.fn() +let ioCallback: IntersectionObserverCallback let history: RouterHistory beforeEach(() => { const io = getIntersectionObserverMock({ observe: ioObserveMock, disconnect: ioDisconnectMock, + onCreate: (callback) => { + ioCallback = callback + }, }) vi.stubGlobal('IntersectionObserver', io) history = createBrowserHistory() @@ -60,6 +65,7 @@ beforeEach(() => { }) afterEach(() => { + vi.useRealTimers() history.destroy() window.history.replaceState(null, 'root', '/') vi.resetAllMocks() @@ -952,6 +958,26 @@ describe('Link', () => { expect(relativeFoo).toHaveAttribute('href', '/invoices/foo') }) }) + + test('relative links from root keep javascript-like segments rooted', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Continue, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + + expect( + await screen.findByRole('link', { name: 'Continue' }), + ).toHaveAttribute('href', '/javascript:alert(1)') + }) }) test('when the current route is the root with beforeLoad that throws', async () => { @@ -5098,6 +5124,241 @@ describe('Link', () => { expect(ioDisconnectMock).toBeCalledTimes(1) // it should not disconnect again }) + test('Link.preload="viewport" should respect preloadDelay', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => ( + <> + + Viewport Link + + + Intent Link + + + ), + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, aboutRoute]), + history, + }) + const preloadRouteSpy = vi.spyOn(router, 'preloadRoute') + + render() + + const viewportLink = await screen.findByRole('link', { + name: 'Viewport Link', + }) + const intentLink = await screen.findByRole('link', { name: 'Intent Link' }) + vi.useFakeTimers() + + ioCallback([], {} as IntersectionObserver) + ioCallback( + [ + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).not.toHaveBeenCalled() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + fireEvent.mouseLeave(viewportLink) + + expect(preloadRouteSpy).not.toHaveBeenCalled() + await vi.advanceTimersByTimeAsync(49) + expect(preloadRouteSpy).not.toHaveBeenCalled() + await vi.advanceTimersByTimeAsync(1) + expect(preloadRouteSpy).toHaveBeenCalledOnce() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).toHaveBeenCalledOnce() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(49) + + ioCallback( + [ + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(1) + expect(preloadRouteSpy).toHaveBeenCalledTimes(2) + + fireEvent.mouseEnter(intentLink) + fireEvent.mouseLeave(intentLink) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).toHaveBeenCalledTimes(2) + }) + + test('Link.preload="viewport" should cancel and use new link options after they change', async () => { + const rootRoute = createRootRoute() + const RouteComponent = () => { + const [to, setTo] = React.useState<'/about' | '/other'>('/about') + const [preload, setPreload] = React.useState< + 'viewport' | 'intent' | false + >('viewport') + return ( + <> + + + + + Viewport Link + + + ) + } + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: RouteComponent, + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + }) + const otherRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/other', + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, aboutRoute, otherRoute]), + history, + }) + const preloadRouteSpy = vi.spyOn(router, 'preloadRoute') + + render() + + const viewportLink = await screen.findByRole('link', { + name: 'Viewport Link', + }) + const initialIoCallback = ioCallback + vi.useFakeTimers() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + + fireEvent.click(screen.getByRole('button', { name: 'Change destination' })) + expect(viewportLink).toHaveAttribute('href', '/other') + expect(ioCallback).not.toBe(initialIoCallback) + + ioCallback( + [ + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).not.toHaveBeenCalled() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + fireEvent.click(screen.getByRole('button', { name: 'Change destination' })) + expect(viewportLink).toHaveAttribute('href', '/about') + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).toHaveBeenCalledTimes(1) + expect(preloadRouteSpy).toHaveBeenCalledWith( + expect.objectContaining({ to: '/about' }), + ) + + preloadRouteSpy.mockClear() + fireEvent.click(screen.getByRole('button', { name: 'Use intent' })) + fireEvent.mouseEnter(viewportLink) + fireEvent.click(screen.getByRole('button', { name: 'Disable preload' })) + fireEvent.mouseLeave(viewportLink) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).not.toHaveBeenCalled() + }) + test("Router.preload='render', should trigger the route loader on render", async () => { const mock = vi.fn() @@ -7540,3 +7801,165 @@ describe('protocolAllowlist', () => { ) }) }) + +describe('link re-render bail-out', () => { + // `useLinkProps` subscribes to the location store. Counting renders of a + // component that calls it therefore measures exactly what the subscription + // publishes: a link whose resolved href and active state are unaffected by a + // navigation should not re-render at all. + // + // The components are memoized so a re-render of the route component that owns + // them cannot be mistaken for the subscription firing, and the link options are + // module-stable for the same reason. + const stableOptions = { + unaffected: { to: '/elsewhere' } as const, + becomesActive: { to: '/posts' } as const, + } + + function setup() { + const renderCounts = { unaffected: 0, becomesActive: 0 } + + const CountingLink = React.memo(function CountingLink({ + name, + }: { + name: keyof typeof renderCounts + }) { + renderCounts[name]++ + const linkProps = useLinkProps(stableOptions[name]) + return + }) + + const rootRoute = createRootRoute({ + component: () => ( + <> + + + + Go + + + + ), + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () =>

Index

, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () =>

Posts

, + }) + + const elsewhereRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/elsewhere', + component: () =>

Elsewhere

, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute, + elsewhereRoute, + ]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + return { router, renderCounts } + } + + test('does not re-render a link a navigation cannot affect', async () => { + const { router, renderCounts } = setup() + render() + + await screen.findByTestId('unaffected') + const before = { ...renderCounts } + expect(screen.getByTestId('becomesActive')).not.toHaveAttribute( + 'data-status', + ) + + fireEvent.click(await screen.findByTestId('go')) + expect(await screen.findByText('Posts')).toBeInTheDocument() + + // `/posts` gains its active state, so it has to re-render. + expect(renderCounts.becomesActive).toBeGreaterThan(before.becomesActive) + expect(screen.getByTestId('becomesActive')).toHaveAttribute( + 'data-status', + 'active', + ) + + // `/elsewhere` is neither the origin nor the destination: its href and + // active state are identical before and after, so the subscription must + // bail out rather than publish an equal value. Asserting the published + // values too, so a selector that returned a constant would still fail. + expect(renderCounts.unaffected).toBe(before.unaffected) + expect(screen.getByTestId('unaffected')).toHaveAttribute( + 'href', + '/elsewhere', + ) + expect(screen.getByTestId('unaffected')).not.toHaveAttribute('data-status') + }) +}) + +describe('explicit-undefined params are not collapsed into an empty object', () => { + // `params: { category: undefined }` clears an inherited optional param while + // `params: {}` inherits it, so the two build different locations. The link + // options are stabilised by value, and that comparison must not treat them as + // equal or the link keeps publishing the stale href. + it('updates href when params goes from {} to { category: undefined }', async () => { + function CategoryLink({ + params, + }: { + params: Record + }) { + return ( + + link + + ) + } + + const rootRoute = createRootRoute({ component: () => }) + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/{-$category}', + component: function Posts() { + const [params, setParams] = React.useState< + Record + >({}) + return ( + <> + + + + ) + }, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute]), + history: createMemoryHistory({ initialEntries: ['/posts/tech'] }), + }) + + render() + + await waitFor(() => + expect(screen.getByTestId('lnk')).toHaveAttribute('href', '/posts/tech'), + ) + + fireEvent.click(screen.getByTestId('clear')) + + await waitFor(() => + expect(screen.getByTestId('lnk')).toHaveAttribute('href', '/posts'), + ) + }) +}) diff --git a/packages/react-router/tests/utils.ts b/packages/react-router/tests/utils.ts index be5d60819b5..da96eb2d959 100644 --- a/packages/react-router/tests/utils.ts +++ b/packages/react-router/tests/utils.ts @@ -20,9 +20,11 @@ export function createTimer() { export const getIntersectionObserverMock = ({ observe, disconnect, + onCreate, }: { observe: Mock disconnect: Mock + onCreate?: (callback: IntersectionObserverCallback) => void }) => { return class IO implements IntersectionObserver { root: Document | Element | null @@ -33,6 +35,7 @@ export const getIntersectionObserverMock = ({ _cb: IntersectionObserverCallback, options?: IntersectionObserverInit, ) { + onCreate?.(_cb) this.root = options?.root ?? null this.rootMargin = options?.rootMargin ?? '0px' this.scrollMargin = options?.scrollMargin ?? '0px' diff --git a/packages/react-start-client/CHANGELOG.md b/packages/react-start-client/CHANGELOG.md index 261be673dff..070d82b8c1d 100644 --- a/packages/react-start-client/CHANGELOG.md +++ b/packages/react-start-client/CHANGELOG.md @@ -1,5 +1,74 @@ # @tanstack/react-start-client +## 1.168.25 + +### Patch Changes + +- Updated dependencies [[`b0817f5`](https://github.com/TanStack/router/commit/b0817f50cc639ae50b6c30cd11c5adbf7eed028c)]: + - @tanstack/react-router@1.170.27 + +## 1.168.24 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13), [`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3), [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1), [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e)]: + - @tanstack/router-core@1.171.22 + - @tanstack/react-router@1.170.26 + - @tanstack/start-client-core@1.170.22 + +## 1.168.23 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + - @tanstack/react-router@1.170.25 + - @tanstack/start-client-core@1.170.21 + +## 1.168.22 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`c59788c`](https://github.com/TanStack/router/commit/c59788ca20f2d2e7f264a859ebe01b7646ba3154), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + - @tanstack/start-client-core@1.170.20 + - @tanstack/react-router@1.170.24 + +## 1.168.21 + +### Patch Changes + +- Updated dependencies [[`2fbc99f`](https://github.com/TanStack/router/commit/2fbc99f2c262b057cb957e6ebba1ee073c655186), [`95dec51`](https://github.com/TanStack/router/commit/95dec51018d01483949c6f1fe3094b019ccf3b4f), [`6bede65`](https://github.com/TanStack/router/commit/6bede65d7074dcd83455151b66b4574268bc782c)]: + - @tanstack/start-client-core@1.170.19 + - @tanstack/react-router@1.170.23 + +## 1.168.20 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/react-router@1.170.22 + - @tanstack/router-core@1.171.19 + - @tanstack/start-client-core@1.170.18 + +## 1.168.19 + +### Patch Changes + +- Updated dependencies [[`697ebb6`](https://github.com/TanStack/router/commit/697ebb6ddbd433d052b6b4707938a5c595865d58), [`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf), [`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/react-router@1.170.21 + - @tanstack/router-core@1.171.18 + - @tanstack/start-client-core@1.170.17 + +## 1.168.18 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + - @tanstack/start-client-core@1.170.16 + - @tanstack/react-router@1.170.20 + ## 1.168.17 ### Patch Changes diff --git a/packages/react-start-client/package.json b/packages/react-start-client/package.json index 1b85f031c38..a2219f2bd43 100644 --- a/packages/react-start-client/package.json +++ b/packages/react-start-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-start-client", - "version": "1.168.17", + "version": "1.168.25", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/react-start-rsc/CHANGELOG.md b/packages/react-start-rsc/CHANGELOG.md index 90e0807dd29..e872b342ea1 100644 --- a/packages/react-start-rsc/CHANGELOG.md +++ b/packages/react-start-rsc/CHANGELOG.md @@ -1,5 +1,87 @@ # @tanstack/react-start-rsc +## 0.1.43 + +### Patch Changes + +- Updated dependencies [[`b0817f5`](https://github.com/TanStack/router/commit/b0817f50cc639ae50b6c30cd11c5adbf7eed028c)]: + - @tanstack/react-router@1.170.27 + +## 0.1.42 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13), [`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3), [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1), [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e)]: + - @tanstack/router-core@1.171.22 + - @tanstack/react-router@1.170.26 + - @tanstack/start-client-core@1.170.22 + - @tanstack/start-plugin-core@1.171.34 + - @tanstack/start-storage-context@1.167.24 + +## 0.1.41 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + - @tanstack/react-router@1.170.25 + - @tanstack/start-client-core@1.170.21 + - @tanstack/start-plugin-core@1.171.33 + - @tanstack/start-storage-context@1.167.23 + +## 0.1.40 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`c59788c`](https://github.com/TanStack/router/commit/c59788ca20f2d2e7f264a859ebe01b7646ba3154), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + - @tanstack/start-client-core@1.170.20 + - @tanstack/react-router@1.170.24 + - @tanstack/start-plugin-core@1.171.32 + - @tanstack/start-storage-context@1.167.22 + +## 0.1.39 + +### Patch Changes + +- Updated dependencies [[`2fbc99f`](https://github.com/TanStack/router/commit/2fbc99f2c262b057cb957e6ebba1ee073c655186), [`95dec51`](https://github.com/TanStack/router/commit/95dec51018d01483949c6f1fe3094b019ccf3b4f), [`6bede65`](https://github.com/TanStack/router/commit/6bede65d7074dcd83455151b66b4574268bc782c)]: + - @tanstack/start-client-core@1.170.19 + - @tanstack/react-router@1.170.23 + - @tanstack/start-plugin-core@1.171.31 + +## 0.1.38 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/react-router@1.170.22 + - @tanstack/router-core@1.171.19 + - @tanstack/start-client-core@1.170.18 + - @tanstack/start-plugin-core@1.171.30 + - @tanstack/start-storage-context@1.167.21 + +## 0.1.37 + +### Patch Changes + +- Updated dependencies [[`697ebb6`](https://github.com/TanStack/router/commit/697ebb6ddbd433d052b6b4707938a5c595865d58), [`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf), [`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/react-router@1.170.21 + - @tanstack/router-core@1.171.18 + - @tanstack/start-client-core@1.170.17 + - @tanstack/start-plugin-core@1.171.29 + - @tanstack/start-storage-context@1.167.20 + +## 0.1.36 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + - @tanstack/start-client-core@1.170.16 + - @tanstack/start-plugin-core@1.171.28 + - @tanstack/react-router@1.170.20 + - @tanstack/start-storage-context@1.167.19 + ## 0.1.35 ### Patch Changes diff --git a/packages/react-start-rsc/package.json b/packages/react-start-rsc/package.json index 7280c24c39d..b61dc666273 100644 --- a/packages/react-start-rsc/package.json +++ b/packages/react-start-rsc/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-start-rsc", - "version": "0.1.35", + "version": "0.1.43", "description": "React Server Components support for TanStack Start", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/react-start-server/CHANGELOG.md b/packages/react-start-server/CHANGELOG.md index d1ba326d960..b4b2bbd8e8d 100644 --- a/packages/react-start-server/CHANGELOG.md +++ b/packages/react-start-server/CHANGELOG.md @@ -1,5 +1,74 @@ # @tanstack/react-start-server +## 1.167.32 + +### Patch Changes + +- Updated dependencies [[`b0817f5`](https://github.com/TanStack/router/commit/b0817f50cc639ae50b6c30cd11c5adbf7eed028c)]: + - @tanstack/react-router@1.170.27 + +## 1.167.31 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13), [`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3), [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1), [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e)]: + - @tanstack/router-core@1.171.22 + - @tanstack/react-router@1.170.26 + - @tanstack/start-server-core@1.169.26 + +## 1.167.30 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + - @tanstack/react-router@1.170.25 + - @tanstack/start-server-core@1.169.25 + +## 1.167.29 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + - @tanstack/react-router@1.170.24 + - @tanstack/start-server-core@1.169.24 + +## 1.167.28 + +### Patch Changes + +- Updated dependencies [[`95dec51`](https://github.com/TanStack/router/commit/95dec51018d01483949c6f1fe3094b019ccf3b4f)]: + - @tanstack/react-router@1.170.23 + - @tanstack/start-server-core@1.169.23 + +## 1.167.27 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/react-router@1.170.22 + - @tanstack/router-core@1.171.19 + - @tanstack/start-server-core@1.169.22 + +## 1.167.26 + +### Patch Changes + +- Updated dependencies [[`697ebb6`](https://github.com/TanStack/router/commit/697ebb6ddbd433d052b6b4707938a5c595865d58), [`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf), [`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/react-router@1.170.21 + - @tanstack/router-core@1.171.18 + - @tanstack/start-server-core@1.169.21 + +## 1.167.25 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + - @tanstack/start-server-core@1.169.20 + - @tanstack/react-router@1.170.20 + ## 1.167.24 ### Patch Changes diff --git a/packages/react-start-server/package.json b/packages/react-start-server/package.json index 3e5b0f67dbe..ae5446ade4f 100644 --- a/packages/react-start-server/package.json +++ b/packages/react-start-server/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-start-server", - "version": "1.167.24", + "version": "1.167.32", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/react-start/CHANGELOG.md b/packages/react-start/CHANGELOG.md index d5795717910..6e383e694df 100644 --- a/packages/react-start/CHANGELOG.md +++ b/packages/react-start/CHANGELOG.md @@ -1,5 +1,106 @@ # @tanstack/react-start +## 1.168.44 + +### Patch Changes + +- Updated dependencies [[`b0817f5`](https://github.com/TanStack/router/commit/b0817f50cc639ae50b6c30cd11c5adbf7eed028c)]: + - @tanstack/react-router@1.170.27 + - @tanstack/react-start-client@1.168.25 + - @tanstack/react-start-rsc@0.1.43 + - @tanstack/react-start-server@1.167.32 + +## 1.168.43 + +### Patch Changes + +- Updated dependencies [[`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3), [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1), [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e)]: + - @tanstack/react-router@1.170.26 + - @tanstack/react-start-client@1.168.24 + - @tanstack/react-start-rsc@0.1.42 + - @tanstack/react-start-server@1.167.31 + - @tanstack/start-client-core@1.170.22 + - @tanstack/start-plugin-core@1.171.34 + - @tanstack/start-server-core@1.169.26 + +## 1.168.42 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/react-router@1.170.25 + - @tanstack/react-start-client@1.168.23 + - @tanstack/react-start-rsc@0.1.41 + - @tanstack/react-start-server@1.167.30 + - @tanstack/start-client-core@1.170.21 + - @tanstack/start-plugin-core@1.171.33 + - @tanstack/start-server-core@1.169.25 + +## 1.168.41 + +### Patch Changes + +- Updated dependencies [[`c59788c`](https://github.com/TanStack/router/commit/c59788ca20f2d2e7f264a859ebe01b7646ba3154)]: + - @tanstack/start-client-core@1.170.20 + - @tanstack/react-router@1.170.24 + - @tanstack/react-start-client@1.168.22 + - @tanstack/react-start-rsc@0.1.40 + - @tanstack/react-start-server@1.167.29 + - @tanstack/start-plugin-core@1.171.32 + - @tanstack/start-server-core@1.169.24 + +## 1.168.40 + +### Patch Changes + +- Updated dependencies [[`2fbc99f`](https://github.com/TanStack/router/commit/2fbc99f2c262b057cb957e6ebba1ee073c655186), [`95dec51`](https://github.com/TanStack/router/commit/95dec51018d01483949c6f1fe3094b019ccf3b4f), [`6bede65`](https://github.com/TanStack/router/commit/6bede65d7074dcd83455151b66b4574268bc782c)]: + - @tanstack/start-client-core@1.170.19 + - @tanstack/react-router@1.170.23 + - @tanstack/react-start-client@1.168.21 + - @tanstack/react-start-rsc@0.1.39 + - @tanstack/start-server-core@1.169.23 + - @tanstack/react-start-server@1.167.28 + - @tanstack/start-plugin-core@1.171.31 + +## 1.168.39 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/react-router@1.170.22 + - @tanstack/react-start-client@1.168.20 + - @tanstack/react-start-rsc@0.1.38 + - @tanstack/react-start-server@1.167.27 + - @tanstack/start-client-core@1.170.18 + - @tanstack/start-plugin-core@1.171.30 + - @tanstack/start-server-core@1.169.22 + +## 1.168.38 + +### Patch Changes + +- Updated dependencies [[`697ebb6`](https://github.com/TanStack/router/commit/697ebb6ddbd433d052b6b4707938a5c595865d58), [`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/react-router@1.170.21 + - @tanstack/start-client-core@1.170.17 + - @tanstack/start-server-core@1.169.21 + - @tanstack/react-start-client@1.168.19 + - @tanstack/react-start-rsc@0.1.37 + - @tanstack/react-start-server@1.167.26 + - @tanstack/start-plugin-core@1.171.29 + +## 1.168.37 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/start-client-core@1.170.16 + - @tanstack/start-plugin-core@1.171.28 + - @tanstack/start-server-core@1.169.20 + - @tanstack/react-router@1.170.20 + - @tanstack/react-start-client@1.168.18 + - @tanstack/react-start-rsc@0.1.36 + - @tanstack/react-start-server@1.167.25 + ## 1.168.36 ### Patch Changes diff --git a/packages/react-start/package.json b/packages/react-start/package.json index 9abee3a86eb..dae17ea7e82 100644 --- a/packages/react-start/package.json +++ b/packages/react-start/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-start", - "version": "1.168.36", + "version": "1.168.44", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/router-cli/CHANGELOG.md b/packages/router-cli/CHANGELOG.md index 8b9c4c1d71c..654e9bcbb6e 100644 --- a/packages/router-cli/CHANGELOG.md +++ b/packages/router-cli/CHANGELOG.md @@ -1,5 +1,47 @@ # @tanstack/router-cli +## 1.167.28 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-generator@1.167.28 + +## 1.167.27 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-generator@1.167.27 + +## 1.167.26 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-generator@1.167.26 + +## 1.167.25 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-generator@1.167.25 + +## 1.167.24 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-generator@1.167.24 + +## 1.167.23 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-generator@1.167.23 + ## 1.167.22 ### Patch Changes diff --git a/packages/router-cli/package.json b/packages/router-cli/package.json index 313869c287f..89f699e9e9d 100644 --- a/packages/router-cli/package.json +++ b/packages/router-cli/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-cli", - "version": "1.167.22", + "version": "1.167.28", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/router-core/CHANGELOG.md b/packages/router-core/CHANGELOG.md index 52db7369b6c..81360a690f8 100644 --- a/packages/router-core/CHANGELOG.md +++ b/packages/router-core/CHANGELOG.md @@ -1,5 +1,54 @@ # @tanstack/router-core +## 1.171.22 + +### Patch Changes + +- [#8039](https://github.com/TanStack/router/pull/8039) [`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13) - load-client can cache settles abandonned loader work without preload authority + +## 1.171.21 + +### Patch Changes + +- [#8019](https://github.com/TanStack/router/pull/8019) [`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05) - handle excessive parent relative links + +## 1.171.20 + +### Patch Changes + +- [#8006](https://github.com/TanStack/router/pull/8006) [`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246) - skip impossible JSON parse attempts + +- [#8010](https://github.com/TanStack/router/pull/8010) [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a) - perf: speed up structural sharing (`replaceEqualDeep`) by computing enumerable own keys with `Object.keys` + a length compare instead of `getOwnPropertyNames` followed by a `propertyIsEnumerable` call per key. This runs on every selector result on every state update when `defaultStructuralSharing` is enabled, and is ~1.3-1.5x faster on typical router state objects with identical behavior. + +## 1.171.19 + +### Patch Changes + +- [#7992](https://github.com/TanStack/router/pull/7992) [`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9) - retain mounted UI during revalidation + +## 1.171.18 + +### Patch Changes + +- [#7984](https://github.com/TanStack/router/pull/7984) [`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7) - Improve route-tree construction and matching performance by fusing static and + dynamic node creation, sorting only dynamic sibling lists that need it, and + deriving matcher depth from trie nodes. + +- [#7985](https://github.com/TanStack/router/pull/7985) [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b) - perf: compact private bundle boundaries- [#7975](https://github.com/TanStack/router/issues/7975) + +- [#7967](https://github.com/TanStack/router/pull/7967) [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c) - Preserve path params in their raw string form while matching routes so structured values returned by `params.parse` produce stable match IDs and do not reuse stale loader data. + + `RouterCore.getMatchedRoutes()` now returns `[matchedRoutes, rawParams, foundRoute]` instead of an object. + +- Updated dependencies [[`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b)]: + - @tanstack/history@1.162.1 + +## 1.171.17 + +### Patch Changes + +- [#7962](https://github.com/TanStack/router/pull/7962) [`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5) - Update Seroval dependencies to version 1.6.2. + ## 1.171.16 ### Patch Changes diff --git a/packages/router-core/INTERNALS.md b/packages/router-core/INTERNALS.md index 0335da541aa..2fd9472cec2 100644 --- a/packages/router-core/INTERNALS.md +++ b/packages/router-core/INTERNALS.md @@ -45,6 +45,10 @@ match a private lane -> publish only if the navigation still owns the result ``` +An ordinary foreground or preload loader success can gain an independent cache +owner while its lane is still private. This is per-match data reuse, not lane +publication; unresolved loader work remains owned only by its consumers. + Preloads run the same work without publishing a lane. Server loading uses a request signal instead of a client navigation owner. Hydration reconstructs the accepted server prefix, then hands any remaining client work to the initial @@ -251,7 +255,10 @@ chain. On the client, eligible loaders and normal component chunks start concurrently. On the server, loaders reduce before normal render chunks are consumed. Reduction turns their outcomes into one terminal semantic lane and one cutoff. -No task publishes while reduction is in progress. +No task publishes semantic or presentation state while reduction is in +progress. An eligible successful client loader may independently enter the +off-screen cache at settlement; that admission neither accepts the lane nor +selects its terminal outcome. ### Projected @@ -321,9 +328,12 @@ is also removed from the transaction's private ownership before publication. Every asynchronous navigation or presentation publication checks `_tx` immediately before the write. Background publication additionally checks the -exact committed base array from which it was derived. Preload cache admission -and private redirect continuation use their own identity and controller checks -instead. +exact committed base array from which it was derived. Per-match cache admission +is not lane publication: it requires the producing lane's controller to remain +live and the cache entry captured during planning to remain the exact current +entry. Navigation lanes use their transaction controller, while preloads use +their independently owned controller. Private preload redirect continuation +uses the active preload entry as its additional authority. ## `beforeLoad`: execution and hydration @@ -390,6 +400,23 @@ lane uses that data or requires a loader generation. A discoverable same-ID flight may satisfy that requirement, including when `shouldReload` returns `true`. +Every eligible successful blocking loader task from an ordinary foreground +navigation or preload attempts cache admission immediately after loader +settlement. It does not wait for component readiness, whole-lane reduction, +projection, commit, or render acknowledgement. The cache receives a +non-terminal copy with merged context removed and an additional flight lease; +the private lane keeps its own match and lease until it commits or is discarded. +If a navigation is superseded, a settled cached generation therefore survives +the lane's lease release, while an unresolved loader has no cache owner and is +aborted when its last consumer releases it. Navigation-produced entries retain +normal navigation staleness and GC semantics rather than becoming synthetic +preloads. + +Background loader candidates remain private until their exact transaction and +committed base authorize background publication. Development refresh foreground +generations also skip early cache admission because their candidate publication +may roll back. + It is valid for cached loader data to have been produced under context from an older `beforeLoad` generation. Loaders are the cache boundary; guards are not. Likewise, a shared in-flight invocation may have started with another lane's @@ -401,15 +428,13 @@ its generation identity, but it can never satisfy freshness and must reload. Failed, canceled, loaderless, and expired generations do not become reusable loader-cache entries. -A terminal preload lane can still contain independently successful loader -generations when its error or not-found came from `beforeLoad`, validation, or -another route. Each preload loader success attempts cache admission immediately, -before whole-lane reduction. The cache receives a non-terminal copy and an -additional flight lease; the speculative lane keeps its own lease and terminal -meaning until it is discarded. This works even below the eventual render -boundary and does not preserve the speculative parent chain: merged -context and `beforeLoad` output are cleared. Same-ID `_ctx`, loader identity, -and successful loader data remain reusable by design. +A private client lane can contain independently successful loader generations +when its eventual terminal outcome comes from `beforeLoad`, validation, another +route, or when a descendant is still loading as the navigation is superseded. +Settlement-time cache admission works even below the eventual render boundary +and does not preserve the private parent chain: merged context and `beforeLoad` +output are cleared. Same-ID `_ctx`, loader identity, and successful loader data +remain reusable by design. Hydration retry is the transported-work exception because it did not run those client loader tasks. There, `loaderData` membership together with @@ -424,12 +449,13 @@ transport. Reconstruction preserves the absence and does not treat an omitted value as reusable loader success during hydration retry. The cache may deliberately contain a successful generation with the same match -ID as a committed match. For example, a speculative lane can produce reusable -ancestor loader data before failing below it while the older committed -generation remains visible. Cache-first matching lets the next lane use that -newer loader generation. Its merged context and `beforeLoad` contribution have -been removed; the merged chain is rebuilt from current parents and same-ID -route-local context before `beforeLoad` reruns. +ID as a committed match. For example, a navigation can finish an ancestor +loader and then be superseded while a descendant is still pending, or a private +lane can produce reusable ancestor data before failing below it while an older +committed generation remains visible. Cache-first matching lets the next lane +use that newer loader generation. Its merged context and `beforeLoad` +contribution have been removed; the merged chain is rebuilt from current parents +and same-ID route-local context before `beforeLoad` reruns. Commit removes a cache entry when the accepted render prefix contains that ID, or when a successful match anywhere in the committed lane contains it. A @@ -722,6 +748,19 @@ executing them. Pending UI is presentation, not partial semantic commit. +An exact successful match remains successful while `beforeLoad` or a blocking +loader revalidates it only when the same successful, non-not-found prefix is in +both the transaction's committed base and its starting presentation. +`isFetching` exposes that work without replacing its rendered UI. A cache-only +success, a different match ID, or a success hidden below a terminal boundary has +no retained presentation and remains eligible for pending UI. Explicit +force-pending invalidation already changes the committed generation to pending +and therefore overrides retention. + +The initial pending offer for a fuzzy not-found lane waits until lazy route +options resolve its boundary. This prevents a provisional ancestor boundary +from replacing the mounted presentation before ownership moves to a lazy child. + The first unresolved boundary is the only pending candidate. Its route or the router default must provide a pending component, and its effective `pendingMs` must allow presentation. Core does not skip an ineligible ancestor to expose an @@ -909,9 +948,11 @@ leases and discovery entries are detached does it abort the collected flight and preload-lane controllers. A public loader signal can synchronously reenter from its abort listener; that reentrant load must observe the cleared authorities and every removed lease as already detached. Unselected concurrent preloads keep -shared flights discoverable, and every later cache publication must still have a -live preload signal and pass the per-match cache-entry identity check captured -during planning. +shared flights discoverable, and every later cache admission must still have a +live producing-lane signal and pass the per-match cache-entry identity check +captured during planning. Cache clearing does not cancel the current transaction, +so an active navigation loader that settles afterward may establish a new cache +generation. Invalidation is the API that replaces active semantic generations. Development refresh is deliberately aggressive about reuse. It removes all loader flights from discovery, discards active preloads and cache entries, and @@ -919,6 +960,13 @@ rematches with committed/cache reuse disabled so obsolete params, context, loader data, or projected assets cannot seed the refreshed lane. Selected cache and preload resources are detached before their controllers are aborted. +Unlike an ordinary foreground navigation, a development refresh does not admit +its loader successes to the cache while its candidate lane is private. The +refresh publication checkpoint is created only after lane execution; admitting +the new generation earlier would capture it as rollback cache and allow a failed +or superseded refresh to remain reusable. Acknowledged refresh data becomes +committed normally and may be cached later when displaced. + Refresh does not immediately discard the accepted committed lane or abort the loader signals it still owns. The previous semantic lane, presentation, and their resources remain available to the refresh transaction until the new @@ -956,13 +1004,13 @@ match array while any eligible successful loader generations can still enter the cache. Cancellation or control flow that does not yield a reusable lane can resolve `undefined`. -Each preload loader task compares the current cache entry for its match ID with -the entry captured when that task was planned. It cannot overwrite a cache -generation installed since that plan. Admission happens at loader settlement, -without waiting for whole-lane success. A distinct successful generation may -coexist with an older committed same-ID generation; this changes future -planning precedence, not current presentation. A duplicate sharing the already -accepted flight is discarded. +Each preload loader task uses the shared settlement-time cache admission rule: +it compares the current cache entry for its match ID with the entry captured when +that task was planned. It cannot overwrite a cache generation installed since +that plan. Admission does not wait for whole-lane success. A distinct successful +generation may coexist with an older committed same-ID generation; this changes +future planning precedence, not current presentation. A duplicate sharing the +already accepted flight is discarded. `preloadRoute` also works on a server router. It runs the same speculative protocol with `preload: true`, can return matches and populate that router's diff --git a/packages/router-core/package.json b/packages/router-core/package.json index a1461352514..1af741db19d 100644 --- a/packages/router-core/package.json +++ b/packages/router-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-core", - "version": "1.171.16", + "version": "1.171.22", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -184,8 +184,8 @@ "dependencies": { "@tanstack/history": "workspace:*", "cookie-es": "^3.0.0", - "seroval": "^1.5.4", - "seroval-plugins": "^1.5.4" + "seroval": "^1.6.2", + "seroval-plugins": "^1.6.2" }, "devDependencies": { "@tanstack/store": "^0.9.3", diff --git a/packages/router-core/src/link.ts b/packages/router-core/src/link.ts index 7ec148b8f4e..799ae50811a 100644 --- a/packages/router-core/src/link.ts +++ b/packages/router-core/src/link.ts @@ -677,9 +677,9 @@ export interface LinkOptionsProps { */ preload?: false | 'intent' | 'viewport' | 'render' /** - * When the intent preload strategy is set, this delays focus and hover - * preloading by this many milliseconds. Touch intent preloads immediately. - * If focus or hover exits before this delay, the preload will be cancelled. + * Delays focus, hover, and viewport preloading by this many milliseconds. + * Touch intent preloads immediately. If focus or hover ends, or the link + * leaves the viewport before this delay, the preload will be cancelled. */ preloadDelay?: number /** diff --git a/packages/router-core/src/load-client.ts b/packages/router-core/src/load-client.ts index 83a76974995..08084cc70de 100644 --- a/packages/router-core/src/load-client.ts +++ b/packages/router-core/src/load-client.ts @@ -357,6 +357,7 @@ async function contextualize( options: ExecuteLaneOptions, end: number, planSuccessfulLane: () => void, + retainedEnd: number, ): Promise { const [location, matches] = lane const signal = options[0 /* controller */].signal @@ -433,7 +434,8 @@ async function contextualize( } const previousStatus = match.status - if (previousStatus === 'success') { + // Retain only a success that is mounted through the same valid prefix. + if (previousStatus === 'success' && index >= retainedEnd) { match.status = 'pending' } options[8 /* onReady */]?.() @@ -511,40 +513,21 @@ function transferMatchResources( router: AnyRouter, previous: Array, next?: Array, + deferSameIdFlight?: true, ): void { const abort: Array = [] for (const match of previous as Array) { if (!next?.includes(match)) { - const flight = match._flight - match._flight = undefined - const controller = releaseOwnedFlight(router, match, flight) - if (controller) { - abort.push(controller) - } - } - } - for (const controller of abort) { - controller.abort() - } -} - -function transferPredecessorResources( - router: AnyRouter, - previous: Array, - next: Array, -): void { - const abort: Array = [] - for (const match of previous as Array) { - if (!next.includes(match)) { const flight = match._flight match._flight = undefined if ( + deferSameIdFlight && flight?.[2 /* leases */] === 1 && router._flights?.get(match.id) === flight && !( process.env.NODE_ENV !== 'production' && router._tx?.[6 /* refresh */] ) && - next.some((candidate) => candidate.id === match.id) + next?.some((candidate) => candidate.id === match.id) ) { // The successor has not made its same-ID reload decision yet. flight[2 /* leases */] = 0 @@ -561,19 +544,6 @@ function transferPredecessorResources( } } -function releaseUnownedFlights(router: AnyRouter): void { - const abort: Array = [] - for (const [id, flight] of router._flights ?? []) { - if (!flight[2 /* leases */]) { - router._flights!.delete(id) - abort.push(flight[1 /* controller */]) - } - } - for (const controller of abort) { - controller.abort() - } -} - function acquireMatchResources(matches: Array): void { for (const match of matches as Array) { const flight = match._flight @@ -775,11 +745,12 @@ function createLoaderTask( tasks: Array, semanticParent: Promise | undefined, options: ExecuteLaneOptions, + retainedEnd: number, ): Promise { const match = lane[1 /* matches */][index]! const route = getRoute(router, match) const preload = !!options[4 /* preload */] - const plannedCacheMatch = preload ? router._cache.get(match.id) : undefined + const plannedCacheMatch = router._cache.get(match.id) let configured let reload = false let reloadFailure: LoaderOutcome | undefined @@ -879,11 +850,9 @@ function createLoaderTask( const acceptedFlight = match._flight match._flight = donor releaseOwnedFlight(router, match, acceptedFlight)?.abort() - // A successful route without a loader has no blocking work to present. It - // still gets a task so its chunk and derived assets participate in the - // lane, but putting it back into pending would hide an already-rendered - // ancestor while only a descendant is loading. - if (match.status === 'success') { + // A successful route without a loader has no blocking work to present. A + // mounted success likewise remains renderable while its loader revalidates. + if (match.status === 'success' && index >= retainedEnd) { match.status = 'pending' } options[8 /* onReady */]?.() @@ -909,10 +878,16 @@ function createLoaderTask( if (blocking) { settleInto(match, result, preload) if (result[0 /* kind */] === SUCCESS) { + // A settled generation can outlive its lane without keeping unresolved + // navigation work alive. Refresh generations remain private for rollback. if ( - preload && routeLoader && - !options[0 /* controller */].signal.aborted + !options[0 /* controller */].signal.aborted && + !( + process.env.NODE_ENV !== 'production' && + !preload && + router._tx?.[6 /* refresh */] + ) ) { cacheLoaderMatch(router, match, plannedCacheMatch) } @@ -1173,18 +1148,19 @@ async function reduceLane( } } install() + const route = getRoute(router, match) try { await waitFor( outcome ? Promise.resolve().then(() => loadRouteChunk( - getRoute(router, match), + route, kind === ERROR ? 'errorComponent' : 'notFoundComponent', ), ) : Promise.all([ - loadRouteChunk(getRoute(router, match)), - loadRouteChunk(getRoute(router, match), 'notFoundComponent'), + loadRouteChunk(route), + loadRouteChunk(route, 'notFoundComponent'), ]), controller.signal, ) @@ -1268,6 +1244,7 @@ async function executeClientLane( options: ExecuteLaneOptions, ): Promise { const matched = [location, matches as Array] as MatchedLane + const presented = router.stores.matches.get() let plannedBoundary = matches.findIndex((match) => match._notFound) if (router.options.notFoundMode !== 'root' && plannedBoundary >= 0) { const boundary = await getNotFoundBoundary( @@ -1284,6 +1261,24 @@ async function executeClientLane( plannedBoundary = boundary } let end = plannedBoundary < 0 ? matches.length : plannedBoundary + 1 + let retainedEnd = 0 + while (retainedEnd < end && retainedEnd !== plannedBoundary) { + const match = matches[retainedEnd]! + const committed = options[3 /* base */][retainedEnd] + const visible = presented[retainedEnd] + if ( + committed?.id !== match.id || + committed.status !== 'success' || + committed._notFound || + match.preload || + visible?.id !== match.id || + visible.status !== 'success' || + visible._notFound + ) { + break + } + retainedEnd++ + } const tasks: Array = [] const start = options[7 /* resolvedPrefix */] ?? 0 let semanticParent = start @@ -1301,6 +1296,7 @@ async function executeClientLane( tasks, semanticParent, options, + retainedEnd, ) } } @@ -1313,6 +1309,7 @@ async function executeClientLane( options, end, planSuccessfulLane, + retainedEnd, ) if (failure) { options[5 /* sync */] = true @@ -1331,7 +1328,16 @@ async function executeClientLane( planSuccessfulLane() } if (options[2 /* isCurrent */]() && !options[4 /* preload */]) { - releaseUnownedFlights(router) + const abort: Array = [] + for (const [id, flight] of router._flights ?? []) { + if (!flight[2 /* leases */]) { + router._flights!.delete(id) + abort.push(flight[1 /* controller */]) + } + } + for (const controller of abort) { + controller.abort() + } } let reduced: ReducedLane | ControlOutcome try { @@ -1376,49 +1382,6 @@ async function executeClientLane( ) } -/** - * Finds the first route that should show pending UI and its two timing values. - * A fallback already on screen remains selected after its route loads, so we - * do not jump to a child fallback. Matches put back into pending by invalidation - * skip pendingMs, and a route without a usable fallback blocks pending UI for deeper routes. - */ -function pendingConfig( - router: AnyRouter, - matches: Array, -): - | [delay: number, boundary: number, min: number, component: unknown] - | undefined - | void { - const presented = router.stores.matches.get() - for (let index = 0; index < matches.length; index++) { - const match = matches[index]! - const success = match.status === 'success' - const visible = - success && - presented[index]?.id === match.id && - presented[index]?.status === 'pending' - if (success && !visible) { - continue - } - const route = getRoute(router, match as WorkMatch) - const delay = - visible || match.invalid - ? 0 - : (route.options.pendingMs ?? router.options.defaultPendingMs) - const component = - route.options.pendingComponent ?? - (router.options as any).defaultPendingComponent - return component && typeof delay === 'number' && delay !== Infinity - ? [ - delay, - index, - route.options.pendingMinMs ?? router.options.defaultPendingMinMs ?? 0, - component, - ] - : undefined - } -} - /** * Waits for `pendingMs`, then presents the complete lane. Rendering applies the * selected boundary cutoff while retaining every match's structural state. @@ -1445,12 +1408,41 @@ function offerPending(router: CoordinatorRouter, tx: LoadTransaction): void { router._pending = session = undefined } } - const config = pendingConfig(router, tx[3 /* matches */]) - if (!config) { + const matches = tx[3 /* matches */] + const presented = router.stores.matches.get() + let boundary = -1 + let delay: number | undefined + let min!: number + let component: unknown + let presentedPending = false + for (let index = 0; index < matches.length; index++) { + const match = matches[index]! + const success = match.status === 'success' + presentedPending = + presented[index]?.id === match.id && + presented[index]?.status === 'pending' + if (success && !presentedPending) { + continue + } + const route = getRoute(router, match as WorkMatch) + delay = + (success && presentedPending) || match.invalid + ? 0 + : (route.options.pendingMs ?? router.options.defaultPendingMs) + component = + route.options.pendingComponent ?? + (router.options as any).defaultPendingComponent + if (!component || typeof delay !== 'number' || delay === Infinity) { + return + } + boundary = index + min = route.options.pendingMinMs ?? router.options.defaultPendingMinMs ?? 0 + break + } + if (boundary < 0) { return } - const [delay, boundary, min, component] = config - const matchId = tx[3 /* matches */][boundary]!.id + const matchId = matches[boundary]!.id if ( !session || session[1 /* boundary */] !== boundary || @@ -1459,14 +1451,12 @@ function offerPending(router: CoordinatorRouter, tx: LoadTransaction): void { // Hydration and redirects can preserve pending presentation without a session. // Do not delay it again; conservatively start pendingMinMs from now. clearTimeout(session?.[3 /* timer */]) - const presented = router.stores.matches.get()[boundary] - const visible = presented?.id === matchId && presented.status === 'pending' router._pending = session = [ tx, boundary, - visible ? Date.now() + min : tx[4 /* startedAt */] + delay, + presentedPending ? Date.now() + min : tx[4 /* startedAt */] + delay!, undefined, - visible ? Promise.resolve(true) : undefined, + presentedPending ? Promise.resolve(true) : undefined, component, ] } @@ -1482,14 +1472,15 @@ function offerPending(router: CoordinatorRouter, tx: LoadTransaction): void { clearTimeout(session[3 /* timer */]) const remaining = session[2 /* deadline */] - Date.now() if (remaining > 0) { - session[3 /* timer */] = setTimeout(() => { - offerPending(router, tx) - }, remaining) + session[3 /* timer */] = setTimeout( + () => offerPending(router, tx), + remaining, + ) return } session[2 /* deadline */] = 0 } - const offered = tx[3 /* matches */].map((match) => ({ + const offered = matches.map((match) => ({ ...match, _flight: undefined, })) @@ -2149,10 +2140,11 @@ export async function loadClientRoute( } } previousOwner[0 /* controller */].abort() - transferPredecessorResources( + transferMatchResources( router, previousOwner[3 /* matches */], tx[3 /* matches */], + true, ) } if (router._tx !== tx) { @@ -2165,7 +2157,11 @@ export async function loadClientRoute( router.stores.status.set('pending') router.stores.location.set(location) }) - offerPending(router, tx) + // Cold loads have no committed UI to retain, but provisional not-found + // matches must wait for lazy routes to place the final boundary. + if (!resolvedLocation && !matches.some((match) => match._notFound)) { + offerPending(router, tx) + } try { await tx[5 /* done */] } finally { diff --git a/packages/router-core/src/new-process-route-tree.ts b/packages/router-core/src/new-process-route-tree.ts index 6978b071ce3..2640961815a 100644 --- a/packages/router-core/src/new-process-route-tree.ts +++ b/packages/router-core/src/new-process-route-tree.ts @@ -199,16 +199,18 @@ function parseSegments( start: number, node: AnySegmentNode, depth: number, + /** Each dynamic sibling list is recorded once, when it first needs sorting. */ + dynamicListsToSort?: Array>>, onRoute?: (route: TRouteLike) => void, ) { onRoute?.(route) let cursor = start { const path = route.fullPath ?? route.from + const options = route.options const length = path.length - const caseSensitive = route.options?.caseSensitive ?? defaultCaseSensitive - const parseParams = - route.options?.params?.parse ?? route.options?.parseParams + const caseSensitive = options?.caseSensitive ?? defaultCaseSensitive + const parseParams = options?.params?.parse ?? options?.parseParams while (cursor < length) { const segment = parseSegment(path, cursor, data) let nextNode: AnySegmentNode @@ -220,81 +222,29 @@ function parseSegments( switch (kind) { case SEGMENT_TYPE_PATHNAME: { const value = path.substring(segment[2], segment[3]) + let name = value + let staticChildren: Map> if (caseSensitive) { - const existingNode = node.static?.get(value) - if (existingNode) { - nextNode = existingNode - } else { - node.static ??= new Map() - const next = createStaticNode( - route.fullPath ?? route.from, - ) - next.parent = node - next.depth = depth - nextNode = next - node.static.set(value, next) - } + staticChildren = node.static ??= new Map() } else { - const name = value.toLowerCase() - const existingNode = node.staticInsensitive?.get(name) - if (existingNode) { - nextNode = existingNode - } else { - node.staticInsensitive ??= new Map() - const next = createStaticNode( - route.fullPath ?? route.from, - ) - next.parent = node - next.depth = depth - nextNode = next - node.staticInsensitive.set(name, next) - } + name = value.toLowerCase() + staticChildren = node.staticInsensitive ??= new Map() } - break - } - case SEGMENT_TYPE_PARAM: { - const prefix_raw = path.substring(start, segment[1]) - const suffix_raw = path.substring(segment[4], end) - const actuallyCaseSensitive = - caseSensitive && !!(prefix_raw || suffix_raw) - const prefix = !prefix_raw - ? undefined - : actuallyCaseSensitive - ? prefix_raw - : prefix_raw.toLowerCase() - const suffix = !suffix_raw - ? undefined - : actuallyCaseSensitive - ? suffix_raw - : suffix_raw.toLowerCase() - const existingNode = - !parseParams && - node.dynamic?.find( - (s) => - !s.parse && - s.caseSensitive === actuallyCaseSensitive && - s.prefix === prefix && - s.suffix === suffix, - ) + const existingNode = staticChildren.get(name) if (existingNode) { nextNode = existingNode } else { - const next = createDynamicNode( - SEGMENT_TYPE_PARAM, - route.fullPath ?? route.from, - actuallyCaseSensitive, - prefix, - suffix, - ) - nextNode = next - next.depth = depth + const next = createStaticNode(path) next.parent = node - node.dynamic ??= [] - node.dynamic.push(next) + next.depth = depth + nextNode = next + staticChildren.set(name, next) } break } - case SEGMENT_TYPE_OPTIONAL_PARAM: { + case SEGMENT_TYPE_PARAM: + case SEGMENT_TYPE_OPTIONAL_PARAM: + case SEGMENT_TYPE_WILDCARD: { const prefix_raw = path.substring(start, segment[1]) const suffix_raw = path.substring(segment[4], end) const actuallyCaseSensitive = @@ -309,9 +259,18 @@ function parseSegments( : actuallyCaseSensitive ? suffix_raw : suffix_raw.toLowerCase() + const siblings = + kind === SEGMENT_TYPE_PARAM + ? node.dynamic + : kind === SEGMENT_TYPE_OPTIONAL_PARAM + ? node.optional + : node.wildcard const existingNode = + // Keep wildcard aliases as separate match candidates, even when + // they have the same shape and no parser. + kind !== SEGMENT_TYPE_WILDCARD && !parseParams && - node.optional?.find( + siblings?.find( (s) => !s.parse && s.caseSensitive === actuallyCaseSensitive && @@ -322,8 +281,8 @@ function parseSegments( nextNode = existingNode } else { const next = createDynamicNode( - SEGMENT_TYPE_OPTIONAL_PARAM, - route.fullPath ?? route.from, + kind, + path, actuallyCaseSensitive, prefix, suffix, @@ -331,39 +290,21 @@ function parseSegments( nextNode = next next.parent = node next.depth = depth - node.optional ??= [] - node.optional.push(next) + let nodes: Array> + if (kind === SEGMENT_TYPE_PARAM) { + nodes = node.dynamic ??= [] + } else if (kind === SEGMENT_TYPE_OPTIONAL_PARAM) { + nodes = node.optional ??= [] + } else { + nodes = node.wildcard ??= [] + } + nodes.push(next) + if (nodes.length === 2) { + dynamicListsToSort?.push(nodes) + } } break } - case SEGMENT_TYPE_WILDCARD: { - const prefix_raw = path.substring(start, segment[1]) - const suffix_raw = path.substring(segment[4], end) - const actuallyCaseSensitive = - caseSensitive && !!(prefix_raw || suffix_raw) - const prefix = !prefix_raw - ? undefined - : actuallyCaseSensitive - ? prefix_raw - : prefix_raw.toLowerCase() - const suffix = !suffix_raw - ? undefined - : actuallyCaseSensitive - ? suffix_raw - : suffix_raw.toLowerCase() - const next = createDynamicNode( - SEGMENT_TYPE_WILDCARD, - route.fullPath ?? route.from, - actuallyCaseSensitive, - prefix, - suffix, - ) - nextNode = next - next.parent = node - next.depth = depth - node.wildcard ??= [] - node.wildcard.push(next) - } } node = nextNode } @@ -376,9 +317,7 @@ function parseSegments( route.id && route.id.charCodeAt(route.id.lastIndexOf('/') + 1) === 95 /* '_' */ ) { - const pathlessNode = createStaticNode( - route.fullPath ?? route.from, - ) + const pathlessNode = createStaticNode(path) pathlessNode.kind = SEGMENT_TYPE_PATHLESS pathlessNode.parent = node depth++ @@ -391,9 +330,7 @@ function parseSegments( const isLeaf = (route.path || !route.children) && !route.isRoot // create index node if (isLeaf && path.endsWith('/')) { - const indexNode = createStaticNode( - route.fullPath ?? route.from, - ) + const indexNode = createStaticNode(path) indexNode.kind = SEGMENT_TYPE_INDEX indexNode.parent = node depth++ @@ -403,12 +340,12 @@ function parseSegments( } node.parse = parseParams ?? null - node.priority = route.options?.params?.priority ?? 0 + node.priority = options?.params?.priority ?? 0 // make node "matchable" if (isLeaf && !node.route) { node.route = route - node.fullPath = route.fullPath ?? route.from + node.fullPath = path } } if (route.children) @@ -420,6 +357,7 @@ function parseSegments( cursor, node, depth, + dynamicListsToSort, onRoute, ) } @@ -464,42 +402,6 @@ function sortDynamic( return 0 } -function sortTreeNodes(node: SegmentNode) { - if (node.pathless) { - for (const child of node.pathless) { - sortTreeNodes(child) - } - } - if (node.static) { - for (const child of node.static.values()) { - sortTreeNodes(child) - } - } - if (node.staticInsensitive) { - for (const child of node.staticInsensitive.values()) { - sortTreeNodes(child) - } - } - if (node.dynamic?.length) { - node.dynamic.sort(sortDynamic) - for (const child of node.dynamic) { - sortTreeNodes(child) - } - } - if (node.optional?.length) { - node.optional.sort(sortDynamic) - for (const child of node.optional) { - sortTreeNodes(child) - } - } - if (node.wildcard?.length) { - node.wildcard.sort(sortDynamic) - for (const child of node.wildcard) { - sortTreeNodes(child) - } - } -} - function createStaticNode( fullPath: string, ): StaticSegmentNode { @@ -663,10 +565,13 @@ export function processRouteMasks< ) { const segmentTree = createStaticNode('/') const data = new Uint16Array(6) + const dynamicListsToSort: Array>> = [] for (const route of routeList) { - parseSegments(false, data, route, 1, segmentTree, 0) + parseSegments(false, data, route, 1, segmentTree, 0, dynamicListsToSort) + } + for (const nodes of dynamicListsToSort) { + nodes.sort(sortDynamic) } - sortTreeNodes(segmentTree) processedTree.masksTree = segmentTree processedTree.flatCache = createLRUCache< string, @@ -789,34 +694,46 @@ export function processRouteTree< ): ProcessRouteTreeResult { const segmentTree = createStaticNode(routeTree.fullPath) const data = new Uint16Array(6) + const dynamicListsToSort: Array>> = [] const routesById = {} as Record const routesByPath = {} as Record let index = 0 - parseSegments(caseSensitive, data, routeTree, 1, segmentTree, 0, (route) => { - initRoute?.(route, index) + parseSegments( + caseSensitive, + data, + routeTree, + 1, + segmentTree, + 0, + dynamicListsToSort, + (route) => { + initRoute?.(route, index) + + if (route.id in routesById) { + if (process.env.NODE_ENV !== 'production') { + throw new Error( + `Invariant failed: Duplicate routes found with id: ${String(route.id)}`, + ) + } - if (route.id in routesById) { - if (process.env.NODE_ENV !== 'production') { - throw new Error( - `Invariant failed: Duplicate routes found with id: ${String(route.id)}`, - ) + invariant() } - invariant() - } - - routesById[route.id] = route + routesById[route.id] = route - if (index !== 0 && route.path) { - const trimmedFullPath = trimPathRight(route.fullPath) - if (!routesByPath[trimmedFullPath] || route.fullPath.endsWith('/')) { - routesByPath[trimmedFullPath] = route + if (index !== 0 && route.path) { + const trimmedFullPath = trimPathRight(route.fullPath) + if (!routesByPath[trimmedFullPath] || route.fullPath.endsWith('/')) { + routesByPath[trimmedFullPath] = route + } } - } - index++ - }) - sortTreeNodes(segmentTree) + index++ + }, + ) + for (const nodes of dynamicListsToSort) { + nodes.sort(sortDynamic) + } const processedTree: ProcessedTree = { segmentTree, singleCache: createLRUCache>(1000), @@ -992,8 +909,6 @@ type MatchStackFrame = { node: AnySegmentNode /** index of the segment of path */ index: number - /** how many nodes between `node` and the root of the segment tree */ - depth: number /** * Bitmask of skipped optional segments. * @@ -1043,7 +958,6 @@ function getNodeMatch( node: segmentTree, index: 1, skipped: 0, - depth: 1, statics: 0, dynamics: 0, optionals: 0, @@ -1055,7 +969,7 @@ function getNodeMatch( while (stack.length) { const frame = stack.pop()! - const { node, index, skipped, depth, statics, dynamics, optionals } = frame + const { node, index, skipped, statics, dynamics, optionals } = frame let { extract, rawParams } = frame // Wildcard candidates are pushed speculatively as fallbacks in case a @@ -1112,7 +1026,6 @@ function getNodeMatch( node: node.index, index, skipped, - depth: depth + 1, statics, dynamics, optionals, @@ -1165,7 +1078,6 @@ function getNodeMatch( node: segment, index: partsLength, skipped, - depth: depth + 1, statics, dynamics, optionals, @@ -1177,16 +1089,15 @@ function getNodeMatch( // 4. Try optional match if (node.optional) { - const nextSkipped = skipped | (1 << depth) - const nextDepth = depth + 1 + // A skipped optional is keyed by the child node's trie depth. + const nextSkipped = skipped | (1 << (node.depth + 1)) for (let i = node.optional.length - 1; i >= 0; i--) { const segment = node.optional[i]! - // when skipping, node and depth advance by 1, but index doesn't + // when skipping, the node advances by 1, but the index doesn't stack.push({ node: segment, index, skipped: nextSkipped, - depth: nextDepth, statics, dynamics, optionals, @@ -1209,7 +1120,6 @@ function getNodeMatch( node: segment, index: index + 1, skipped, - depth: nextDepth, statics, dynamics, optionals: optionals + segmentScore(partsLength, index), @@ -1236,7 +1146,6 @@ function getNodeMatch( node: segment, index: index + 1, skipped, - depth: depth + 1, statics, dynamics: dynamics + segmentScore(partsLength, index), optionals, @@ -1256,7 +1165,6 @@ function getNodeMatch( node: match, index: index + 1, skipped, - depth: depth + 1, statics: statics + segmentScore(partsLength, index), dynamics, optionals, @@ -1274,7 +1182,6 @@ function getNodeMatch( node: match, index: index + 1, skipped, - depth: depth + 1, statics: statics + segmentScore(partsLength, index), dynamics, optionals, @@ -1286,14 +1193,12 @@ function getNodeMatch( // 0. Try pathless match if (node.pathless) { - const nextDepth = depth + 1 for (let i = node.pathless.length - 1; i >= 0; i--) { const segment = node.pathless[i]! stack.push({ node: segment, index, skipped, - depth: nextDepth, statics, dynamics, optionals, @@ -1380,6 +1285,6 @@ function isFrameMoreSpecific( (prev.node.kind === SEGMENT_TYPE_INDEX) || ((next.node.kind === SEGMENT_TYPE_INDEX) === (prev.node.kind === SEGMENT_TYPE_INDEX) && - next.depth > prev.depth))))))) + next.node.depth > prev.node.depth))))))) ) } diff --git a/packages/router-core/src/path.ts b/packages/router-core/src/path.ts index 577ce00ecf0..da410e9c7d3 100644 --- a/packages/router-core/src/path.ts +++ b/packages/router-core/src/path.ts @@ -112,8 +112,8 @@ export function resolvePath({ trailingSlash = 'never', cache, }: ResolvePathOptions) { + const isBase = to === '.' const isAbsolute = to.startsWith('/') - const isBase = !isAbsolute && to === '.' let key if (cache) { @@ -148,7 +148,11 @@ export function resolvePath({ // ignore inter-slashes } } else if (value === '..') { - baseSegments.pop() + if (baseSegments.length > 1) { + baseSegments.pop() + } else { + baseSegments = [''] + } } else if (value === '.') { // ignore } else { diff --git a/packages/router-core/src/router.ts b/packages/router-core/src/router.ts index 5b0cbfb6be6..75c47a1c2ef 100644 --- a/packages/router-core/src/router.ts +++ b/packages/router-core/src/router.ts @@ -213,7 +213,8 @@ export interface RouterOptions< */ defaultPreload?: false | 'intent' | 'viewport' | 'render' /** - * The delay in milliseconds that a route must be hovered over or touched before it is preloaded. + * The delay in milliseconds before intent focus/hover and viewport preloading. + * Touch intent preloads immediately. * * @default 50 * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultpreloaddelay-property) @@ -750,13 +751,12 @@ export type ParseLocationFn = ( previousLocation?: ParsedLocation>, ) => ParsedLocation> -export type GetMatchRoutesFn = (pathname: string) => { - matchedRoutes: ReadonlyArray +export type GetMatchRoutesFn = (pathname: string) => [ + matchedRoutes: ReadonlyArray, /** exhaustive params, still in their string form */ - routeParams: Record - foundRoute: AnyRoute | undefined - parseError?: unknown -} + rawParams: Record, + foundRoute: AnyRoute | undefined, +] export type EmitFn = (routerEvent: RouterEvent) => void @@ -964,12 +964,12 @@ export function runRouteLifecycle( } } -type LightweightRouteMatchResult = { - matchedRoutes: ReadonlyArray - fullPath: string - search: Record - params: Record -} +type LightweightRouteMatchResult = [ + matchedRoutes: ReadonlyArray, + fullPath: string, + search: Record, + params: Record, +] type LightweightRouteMatchCacheEntry = [ lastMatchId: string | undefined, @@ -1512,16 +1512,17 @@ export class RouterCore< next: ParsedLocation, opts?: MatchRoutesOpts, ): Array { - const matchedRoutesResult = this.getMatchedRoutes(next.pathname) - const { foundRoute, routeParams } = matchedRoutesResult - let { matchedRoutes } = matchedRoutesResult + const [initialMatchedRoutes, rawParams, foundRoute] = this.getMatchedRoutes( + next.pathname, + ) + let matchedRoutes = initialMatchedRoutes let isGlobalNotFound = false // Check to see if the route needs a 404 entry if ( // If we found a route, and it's not an index route and we have left over path foundRoute - ? foundRoute.path !== '/' && routeParams['**'] + ? foundRoute.path !== '/' && rawParams['**'] : // Or if we didn't find a route and we have left over path trimPathRight(next.pathname) ) { @@ -1549,6 +1550,7 @@ export class RouterCore< : undefined } + let strictParams: AnyRouteMatch['_strictParams'] | undefined for (let index = 0; index < matchedRoutes.length; index++) { const route = matchedRoutes[index]! // Take each matched route and resolve + validate its search params @@ -1614,9 +1616,10 @@ export class RouterCore< } searchError ??= cause } + // Match identity must only use the raw params captured from the URL. const { interpolatedPath, usedParams } = interpolatePath({ path: route.fullPath, - params: routeParams, + params: rawParams, decoder: this.pathParamsDecoder, server: this.isServer, }) @@ -1639,7 +1642,9 @@ export class RouterCore< : (this._cache.get(matchId) ?? (previousMatch?.id === matchId ? previousMatch : undefined)) - const strictParams = existingMatch?._strictParams ?? usedParams + // Carry parsed ancestors forward without mutating the raw route params. + strictParams = + existingMatch?._strictParams ?? Object.assign(usedParams, strictParams) let paramsError: unknown @@ -1661,8 +1666,6 @@ export class RouterCore< } } - Object.assign(routeParams, strictParams) - const cause = previousMatch ? 'stay' : 'enter' let match: AnyRouteMatch @@ -1671,8 +1674,6 @@ export class RouterCore< match = { ...existingMatch, cause, - params: previousMatch?.params ?? routeParams, - _strictParams: strictParams, search: previousMatch ? nullReplaceEqualDeep(previousMatch.search, preMatchSearch) : nullReplaceEqualDeep(existingMatch.search, preMatchSearch), @@ -1687,7 +1688,7 @@ export class RouterCore< ssr: (isServer ?? this.isServer) ? undefined : route.options.ssr, index, routeId: route.id, - params: previousMatch?.params ?? routeParams, + params: previousMatch?.params ?? strictParams, _strictParams: strictParams, pathname: interpolatedPath, updatedAt: Date.now(), @@ -1727,8 +1728,8 @@ export class RouterCore< const match = matches[index]! match.params = match.cause === 'stay' - ? nullReplaceEqualDeep(match.params, routeParams) - : routeParams + ? nullReplaceEqualDeep(match.params, strictParams) + : strictParams! if (opts?._controller) { match.context = {} } @@ -1738,20 +1739,20 @@ export class RouterCore< } getMatchedRoutes: GetMatchRoutesFn = (pathname) => { - const routeParams: Record = Object.create(null) + const rawParams: Record = Object.create(null) const match = findRouteMatch( trimPathRight(pathname), this.processedTree, true, ) if (match) { - Object.assign(routeParams, match.rawParams) - } - return { - matchedRoutes: match?.branch || [this.routesById[rootRouteId]!], - routeParams, - foundRoute: match?.route, + Object.assign(rawParams, match.rawParams) } + return [ + match?.branch || [this.routesById[rootRouteId]!], + rawParams, + match?.route, + ] } /** @@ -1772,9 +1773,7 @@ export class RouterCore< return cached[1 /* result */] } - const { matchedRoutes, routeParams } = this.getMatchedRoutes( - location.pathname, - ) + const [matchedRoutes, rawParams] = this.getMatchedRoutes(location.pathname) const lastRoute = last(matchedRoutes)! // I don't know if we should run the full search middleware chain, or just validateSearch @@ -1812,7 +1811,7 @@ export class RouterCore< // Parse params through the route chain const strictParams: Record = Object.assign( Object.create(null), - routeParams, + rawParams, ) for (const route of matchedRoutes) { try { @@ -1824,12 +1823,12 @@ export class RouterCore< params = strictParams } - const result = { + const result: LightweightRouteMatchResult = [ matchedRoutes, - fullPath: lastRoute.fullPath, - search: accumulatedSearch, + lastRoute.fullPath, + accumulatedSearch, params, - } + ] this.lightweightCache.set(location, [lastStateMatchId, result]) return result } @@ -1862,14 +1861,17 @@ export class RouterCore< process.env.NODE_ENV !== 'production' && dest._isNavigate ) { - const allFromMatches = this.getMatchedRoutes(dest.from).matchedRoutes + const [allFromMatches] = this.getMatchedRoutes(dest.from) - const matchedFrom = findLast(lightweightResult.matchedRoutes, (d) => { - return comparePaths(d.fullPath, dest.from!) - }) + const matchedFrom = findLast( + lightweightResult[0 /* matchedRoutes */], + (d) => { + return comparePaths(d.fullPath, dest.from!) + }, + ) const matchedCurrent = findLast(allFromMatches, (d) => { - return comparePaths(d.fullPath, lightweightResult.fullPath) + return comparePaths(d.fullPath, lightweightResult[1 /* fullPath */]) }) // for from to be invalid it shouldn't just be unmatched to currentLocation @@ -1882,15 +1884,15 @@ export class RouterCore< const defaultedFromPath = dest.unsafeRelative === 'path' ? currentLocation.pathname - : (dest.from ?? lightweightResult.fullPath) + : (dest.from ?? lightweightResult[1 /* fullPath */]) const destTo = dest.to ? `${dest.to}` : undefined // From search should always use the current location - const fromSearch = lightweightResult.search + const fromSearch = lightweightResult[2 /* search */] // Same with params. It can't hurt to provide as many as possible const fromParams = Object.assign( Object.create(null), - lightweightResult.params, + lightweightResult[3 /* params */], ) const isAbsoluteTo = destTo?.charCodeAt(0) === 47 @@ -1918,14 +1920,13 @@ export class RouterCore< // typed destination mismatch, not a concrete URL to route-match. destRoutes = [] } else { - const destMatchResult = this.getMatchedRoutes(nextTo) - destRoutes = destMatchResult.matchedRoutes + const [matchedRoutes, rawParams, foundRoute] = + this.getMatchedRoutes(nextTo) + destRoutes = matchedRoutes if ( this.options.notFoundRoute && - (!destMatchResult.foundRoute || - (destMatchResult.foundRoute.path !== '/' && - destMatchResult.routeParams['**'])) + (!foundRoute || (foundRoute.path !== '/' && rawParams['**'])) ) { destRoutes = [...destRoutes, this.options.notFoundRoute] } @@ -1968,10 +1969,10 @@ export class RouterCore< !opts.leaveParams ) { try { - const roundTrip = this.getMatchedRoutes(nextPathname) - if (roundTrip.foundRoute?.id !== destRoute.id) { + const foundRoute = this.getMatchedRoutes(nextPathname)[2] + if (foundRoute?.id !== destRoute.id) { console.warn( - `Generated path "${nextPathname}" for route "${destRoute.id}" matched route "${roundTrip.foundRoute?.id}" instead. This can happen when multiple route templates resolve to the same URL. Use the route template that matches the intended route, or adjust params.stringify if it changed the target path.`, + `Generated path "${nextPathname}" for route "${destRoute.id}" matched route "${foundRoute?.id}" instead. This can happen when multiple route templates resolve to the same URL. Use the route template that matches the intended route, or adjust params.stringify if it changed the target path.`, ) } } catch { diff --git a/packages/router-core/src/searchParams.ts b/packages/router-core/src/searchParams.ts index 740d36441c0..b93cc23206e 100644 --- a/packages/router-core/src/searchParams.ts +++ b/packages/router-core/src/searchParams.ts @@ -1,6 +1,10 @@ import { decode, encode } from './qss' import type { AnySchema } from './validators' +// JSON can start with whitespace, ", [, {, -, a digit, or fa/nu/tr. +// False positives safely fall through to JSON.parse. +const jsonStart = /^(?:\s|["[{\d-]|fa|nu|tr)/ + /** Default `parseSearch` that strips leading '?' and JSON-parses values. */ export const defaultParseSearch = parseSearchWith(JSON.parse) /** Default `stringifySearch` using JSON.stringify for complex values. */ @@ -59,15 +63,19 @@ export function stringifySearchWith( stringify: (search: any) => string, parser?: (str: string) => any, ) { - const hasParser = typeof parser === 'function' + const isJsonParser = parser === JSON.parse function stringifyValue(val: any) { - if (typeof val === 'object' && val !== null) { + if (val && typeof val === 'object') { try { return stringify(val) } catch (_err) { // silent } - } else if (hasParser && typeof val === 'string') { + } else if (parser && typeof val === 'string') { + // Skip JSON.parse when the value cannot begin valid JSON. + if (isJsonParser && !jsonStart.test(val)) { + return val + } try { // Check if it's a valid parseable string. // If it is, then stringify it again. diff --git a/packages/router-core/src/utils.ts b/packages/router-core/src/utils.ts index 91011bfa7f0..e0665dde69c 100644 --- a/packages/router-core/src/utils.ts +++ b/packages/router-core/src/utils.ts @@ -299,24 +299,31 @@ export function replaceEqualDeep( * Optimized for the common case where objects have no symbol properties. */ function getEnumerableOwnKeys(o: object) { - const names = Object.getOwnPropertyNames(o) - - // Fast path: check all string property names are enumerable - for (const name of names) { - if (!isEnumerable.call(o, name)) return false + // `Object.keys` returns only enumerable own string keys natively (no per-key + // JS callback). If it has fewer entries than `getOwnPropertyNames` (all own + // string keys), the object has a non-enumerable own string prop and is not + // "clone-friendly" -> bail. This replaces an O(n) loop of + // `propertyIsEnumerable` calls with two native calls. + const keys = Object.keys(o) + if (keys.length !== Object.getOwnPropertyNames(o).length) { + return false } // Only check symbols if the object has any (most plain objects don't) const symbols = Object.getOwnPropertySymbols(o) - // Fast path: no symbols, return names directly (avoids array allocation/concat) - if (symbols.length === 0) return names + // Fast path: no symbols, return enumerable string keys directly + if (symbols.length === 0) { + return keys + } - // Slow path: has symbols, need to check and merge - const keys: Array = names + // Slow path: has symbols, include only enumerable ones, bail on any + // non-enumerable symbol so it round-trips like the string-key check above. for (const symbol of symbols) { - if (!isEnumerable.call(o, symbol)) return false - keys.push(symbol) + if (!isEnumerable.call(o, symbol)) { + return false + } + ;(keys as Array).push(symbol) } return keys } diff --git a/packages/router-core/tests/build-location.test.ts b/packages/router-core/tests/build-location.test.ts index ce0d5c3c988..c35937259c5 100644 --- a/packages/router-core/tests/build-location.test.ts +++ b/packages/router-core/tests/build-location.test.ts @@ -1300,6 +1300,31 @@ describe('buildLocation - relative paths', () => { expect(location.pathname).toBe('/a/d') }) + test('over-root traversal stays rooted for javascript-like segments', async () => { + const rootRoute = new BaseRootRoute({}) + const indexRoute = new BaseRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const routeTree = rootRoute.addChildren([indexRoute]) + + const router = createTestRouter({ + routeTree, + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + await router.load() + + const location = router.buildLocation({ + to: '../javascript:alert(1)', + }) + + expect(location.pathname).toBe('/javascript:alert(1)') + expect(location.href).toBe('/javascript:alert(1)') + expect(location.publicHref).toBe('/javascript:alert(1)') + }) + test('. should stay on current route', async () => { const rootRoute = new BaseRootRoute({}) const postsRoute = new BaseRoute({ diff --git a/packages/router-core/tests/issue-3920-on-before-navigate-after-initial-redirect.test.ts b/packages/router-core/tests/issue-3920-on-before-navigate-after-initial-redirect.test.ts index f0de5df8dd8..6df66a08faf 100644 --- a/packages/router-core/tests/issue-3920-on-before-navigate-after-initial-redirect.test.ts +++ b/packages/router-core/tests/issue-3920-on-before-navigate-after-initial-redirect.test.ts @@ -1,5 +1,5 @@ import { createMemoryHistory } from '@tanstack/history' -import { expect, test } from 'vitest' +import { expect, onTestFinished, test } from 'vitest' import { BaseRootRoute, BaseRoute, redirect } from '../src' import { createTestRouter } from './routerTestUtils' @@ -30,9 +30,10 @@ test('onBeforeNavigate fires after the initial load redirects', async () => { expect(router.state.location.pathname).toBe('/target') const navigatedPaths: Array = [] - router.subscribe('onBeforeNavigate', (event) => { + const unsub = router.subscribe('onBeforeNavigate', (event) => { navigatedPaths.push(event.toLocation.pathname) }) + onTestFinished(unsub) await router.navigate({ to: '/third' }) diff --git a/packages/router-core/tests/loader-architecture-regressions.test.ts b/packages/router-core/tests/loader-architecture-regressions.test.ts index d8493052446..97561a9f727 100644 --- a/packages/router-core/tests/loader-architecture-regressions.test.ts +++ b/packages/router-core/tests/loader-architecture-regressions.test.ts @@ -154,6 +154,7 @@ test('superseding a load clears fetching state from the still-presented lane', a await vi.waitFor(() => expect(router.state.matches.at(-1)).toMatchObject({ routeId: pageRoute.id, + status: 'success', isFetching: 'beforeLoad', }), ) diff --git a/packages/router-core/tests/navigation-settled-cache.test.ts b/packages/router-core/tests/navigation-settled-cache.test.ts new file mode 100644 index 00000000000..b45a8143495 --- /dev/null +++ b/packages/router-core/tests/navigation-settled-cache.test.ts @@ -0,0 +1,74 @@ +import { expect, test, vi } from 'vitest' +import { createMemoryHistory } from '@tanstack/history' +import { BaseRootRoute, BaseRoute } from '../src' +import { createTestRouter } from './routerTestUtils' + +test('a settled loader result survives when its navigation is superseded', async () => { + const aLoader = vi.fn(() => 'a data') + let bSignal: AbortSignal | undefined + const bLoader = vi.fn( + ({ abortController }: { abortController: AbortController }) => { + bSignal = abortController.signal + return new Promise((_resolve, reject) => { + abortController.signal.addEventListener( + 'abort', + () => reject(abortController.signal), + { once: true }, + ) + }) + }, + ) + + const rootRoute = new BaseRootRoute({}) + const indexRoute = new BaseRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + const aRoute = new BaseRoute({ + getParentRoute: () => rootRoute, + path: '/a', + loader: aLoader, + staleTime: Infinity, + gcTime: Infinity, + }) + const bRoute = new BaseRoute({ + getParentRoute: () => aRoute, + path: '/b', + loader: bLoader, + }) + const cRoute = new BaseRoute({ + getParentRoute: () => rootRoute, + path: '/c', + }) + const dRoute = new BaseRoute({ + getParentRoute: () => cRoute, + path: '/d', + }) + const router = createTestRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + aRoute.addChildren([bRoute]), + cRoute.addChildren([dRoute]), + ]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + await router.load() + const abandoned = router.navigate({ to: '/a/b' }) + await vi.waitFor(() => { + expect(aLoader).toHaveBeenCalledOnce() + expect(bLoader).toHaveBeenCalledOnce() + }) + + await router.navigate({ to: '/c/d' }) + await abandoned + expect(bSignal?.aborted).toBe(true) + + await router.navigate({ to: '/a' }) + + expect(aLoader).toHaveBeenCalledOnce() + expect(router.state.matches.at(-1)).toMatchObject({ + routeId: aRoute.id, + loaderData: 'a data', + }) +}) diff --git a/packages/router-core/tests/new-process-route-tree.test.ts b/packages/router-core/tests/new-process-route-tree.test.ts index d93581355ea..d7e1cd977bf 100644 --- a/packages/router-core/tests/new-process-route-tree.test.ts +++ b/packages/router-core/tests/new-process-route-tree.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from 'vitest' +import { beforeAll, describe, expect, it } from 'vitest' import { findFlatMatch, findRouteMatch, @@ -114,6 +114,10 @@ describe('findRouteMatch', () => { const tree = makeTree(['/a/{-$b}b', '/a/{-$b}']) expect(findRouteMatch('/a/bbb', tree)?.route.id).toBe('/a/{-$b}b') }) + it('prefix+suffix optional wins when declared after plain optional', () => { + const tree = makeTree(['/a/{-$b}', '/a/b{-$b}b']) + expect(findRouteMatch('/a/bbb', tree)?.route.id).toBe('/a/b{-$b}b') + }) it('prefix+suffix wildcard wins over plain wildcard', () => { const tree = makeTree(['/a/b{$}b', '/a/$']) @@ -127,6 +131,90 @@ describe('findRouteMatch', () => { const tree = makeTree(['/a/{$}b', '/a/$']) expect(findRouteMatch('/a/bbb', tree)?.route.id).toBe('/a/{$}b') }) + it('sorts a third, more specific wildcard declared last', () => { + const tree = makeTree(['/a/$', '/a/b{$}', '/a/b{$}b']) + expect(findRouteMatch('/a/bbb', tree)?.route.id).toBe('/a/b{$}b') + }) + }) + + it('sorts parser priorities after building required, optional, and wildcard siblings', () => { + const cases = [ + ['pre{$value}suf', 'dynamic'], + ['pre{-$value}suf', 'optional'], + ['pre{$}suf', 'wildcard'], + ] as const + + for (const [segment, siblingKind] of cases) { + let acceptHigherPriority = true + const fullPath = `/a/${segment}` + const routeTree = { + id: '__root__', + isRoot: true, + fullPath: '/', + path: '/', + children: [ + { + id: `low-${siblingKind}`, + fullPath, + path: fullPath.slice(1), + options: { + params: { + priority: 1, + parse: (params: Record) => params, + }, + }, + }, + { + id: `high-${siblingKind}`, + fullPath, + path: fullPath.slice(1), + options: { + params: { + priority: 2, + parse: (params: Record) => + acceptHigherPriority ? params : false, + }, + }, + }, + ], + } + const { processedTree } = processRouteTree(routeTree) + const branch = processedTree.segmentTree.staticInsensitive?.get('a') + + expect(branch?.[siblingKind]).toHaveLength(2) + expect(findRouteMatch('/a/prewinsuf', processedTree)?.route.id).toBe( + `high-${siblingKind}`, + ) + + acceptHigherPriority = false + expect( + findRouteMatch('/a/prefallbacksuf', processedTree)?.route.id, + ).toBe(`low-${siblingKind}`) + } + }) + + it('reuses optional nodes with the same shape when they have no parser', () => { + const tree = makeTree([ + '/a/{-$first}/first-child', + '/a/{-$second}/second-child', + ]) + const branch = tree.segmentTree.staticInsensitive?.get('a') + + expect(branch?.optional).toHaveLength(1) + expect(findRouteMatch('/a/value/first-child', tree)?.route.id).toBe( + '/a/{-$first}/first-child', + ) + expect(findRouteMatch('/a/value/second-child', tree)?.route.id).toBe( + '/a/{-$second}/second-child', + ) + }) + + it('keeps same-shaped wildcard aliases as separate match candidates', () => { + const tree = makeTree(['/a/$', '/a/{$}']) + const branch = tree.segmentTree.staticInsensitive?.get('a') + + expect(branch?.wildcard).toHaveLength(2) + expect(findRouteMatch('/a/value', tree)?.route.id).toBe('/a/$') }) describe('prefix / suffix lengths', () => { @@ -390,6 +478,63 @@ describe('findRouteMatch', () => { }) describe('case sensitivity competition', () => { + it('reuses an insensitive static node for differently cased siblings', () => { + const tree = { + id: '__root__', + isRoot: true, + fullPath: '/', + path: '/', + children: [ + { + id: '/Docs/API', + fullPath: '/Docs/API', + path: 'Docs/API', + }, + { + id: '/docs/guide', + fullPath: '/docs/guide', + path: 'docs/guide', + }, + ], + } + const { processedTree } = processRouteTree(tree) + const docs = processedTree.segmentTree.staticInsensitive?.get('docs') + + expect(processedTree.segmentTree.staticInsensitive?.size).toBe(1) + expect(docs?.staticInsensitive?.size).toBe(2) + expect(findRouteMatch('/DOCS/api', processedTree)?.route.id).toBe( + '/Docs/API', + ) + expect(findRouteMatch('/Docs/GUIDE', processedTree)?.route.id).toBe( + '/docs/guide', + ) + }) + it('allows a route to override a sensitive tree default', () => { + const tree = { + id: '__root__', + isRoot: true, + fullPath: '/', + path: '/', + children: [ + { + id: '/Strict', + fullPath: '/Strict', + path: 'Strict', + }, + { + id: '/loose', + fullPath: '/loose', + path: 'loose', + options: { caseSensitive: false }, + }, + ], + } + const { processedTree } = processRouteTree(tree, true) + + expect(findRouteMatch('/Strict', processedTree)?.route.id).toBe('/Strict') + expect(findRouteMatch('/strict', processedTree)).toBeNull() + expect(findRouteMatch('/LOOSE', processedTree)?.route.id).toBe('/loose') + }) it('a case sensitive segment early on should not prevent a case insensitive match', () => { const tree = { id: '__root__', @@ -1346,6 +1491,40 @@ describe('findRouteMatch', () => { '/_layout/a/b', ) }) + it('uses trie depth to break equal-specificity pathless ties', () => { + const tree = { + id: '__root__', + fullPath: '/', + path: '/', + isRoot: true, + children: [ + { + id: '/a', + fullPath: '/a', + path: 'a', + }, + { + id: '/_layout', + fullPath: '/', + options: { + params: { + parse: (params: Record) => params, + }, + }, + children: [ + { + id: '/_layout/a', + fullPath: '/a', + path: 'a', + }, + ], + }, + ], + } + const { processedTree } = processRouteTree(tree) + + expect(findRouteMatch('/a', processedTree)?.route.id).toBe('/_layout/a') + }) it('builds segment tree correctly', () => { const tree = { path: '/', @@ -1638,15 +1817,27 @@ describe('processRouteMasks', { sequential: true }, () => { fullPath: '/', } as AnyRoute const { processedTree } = processRouteTree(routeTree) - it('processes a route masks list into a segment tree', () => { - const routeMasks: Array> = [ - { from: '/a/b/c', routeTree }, - { from: '/a/b/d', routeTree }, - { from: '/a/$param/d', routeTree }, - { from: '/a/{-$optional}/d', routeTree }, - { from: '/a/b/{$}.txt', routeTree }, - ] + const routeMasks: Array> = [ + { from: '/a/b/c', routeTree }, + { from: '/a/b/d', routeTree }, + { from: '/a/$param/d', routeTree }, + { from: '/a/{-$optional}/d', routeTree }, + { from: '/a/b/{$}.txt', routeTree }, + { from: '/a/$', routeTree }, + { from: '/a/foo{$}', routeTree }, + { from: '/a/foo{$}bar', routeTree }, + { from: '/required/$param', routeTree }, + { from: '/required/foo{$param}bar', routeTree }, + { from: '/optional/{-$param}', routeTree }, + { from: '/optional/foo{-$param}bar', routeTree }, + { from: '/Admin/Panel', routeTree }, + ] + + beforeAll(() => { processRouteMasks(routeMasks, processedTree) + }) + + it('processes a route masks list into a segment tree', () => { const aBranch = processedTree.masksTree?.staticInsensitive?.get('a') expect(aBranch).toBeDefined() expect(aBranch?.staticInsensitive?.get('b')).toBeDefined() @@ -1657,6 +1848,10 @@ describe('processRouteMasks', { sequential: true }, () => { const res = findFlatMatch('/a/b/c', processedTree) expect(res?.route.from).toBe('/a/b/c') }) + it('matches uppercase static route masks case-insensitively', () => { + const res = findFlatMatch('/admin/panel', processedTree) + expect(res?.route.from).toBe('/Admin/Panel') + }) it('can match dynamic route masks w/ `findFlatMatch`', () => { const res = findFlatMatch('/a/123/d', processedTree) expect(res?.route.from).toBe('/a/$param/d') @@ -1672,4 +1867,44 @@ describe('processRouteMasks', { sequential: true }, () => { expect(res?.route.from).toBe('/a/b/{$}.txt') expect(res?.rawParams).toEqual({ '*': 'file/path', _splat: 'file/path' }) }) + it('sorts competing wildcard masks by specificity', () => { + const res = findFlatMatch('/a/fooxbar', processedTree) + expect(res?.route.from).toBe('/a/foo{$}bar') + expect(res?.rawParams).toEqual({ '*': 'x', _splat: 'x' }) + }) + it('sorts competing required masks by specificity', () => { + const res = findFlatMatch('/required/fooxbar', processedTree) + expect(res?.route.from).toBe('/required/foo{$param}bar') + expect(res?.rawParams).toEqual({ param: 'x' }) + }) + it('sorts competing optional masks by specificity', () => { + const res = findFlatMatch('/optional/fooxbar', processedTree) + expect(res?.route.from).toBe('/optional/foo{-$param}bar') + expect(res?.rawParams).toEqual({ param: 'x' }) + }) + it('sorts competing route masks declared least-specific first', () => { + const localTree = processRouteTree(routeTree).processedTree + processRouteMasks( + [ + { from: '/dynamic/$param', routeTree }, + { from: '/dynamic/prefix{$param}', routeTree }, + { from: '/optional/{-$param}', routeTree }, + { from: '/optional/prefix{-$param}', routeTree }, + { from: '/wildcard/$', routeTree }, + { from: '/wildcard/prefix{$}', routeTree }, + { from: '/wildcard/prefix{$}.txt', routeTree }, + ], + localTree, + ) + + expect(findFlatMatch('/dynamic/prefixvalue', localTree)?.route.from).toBe( + '/dynamic/prefix{$param}', + ) + expect(findFlatMatch('/optional/prefixvalue', localTree)?.route.from).toBe( + '/optional/prefix{-$param}', + ) + expect( + findFlatMatch('/wildcard/prefixvalue.txt', localTree)?.route.from, + ).toBe('/wildcard/prefix{$}.txt') + }) }) diff --git a/packages/router-core/tests/path.test.ts b/packages/router-core/tests/path.test.ts index 4e494122098..658bbcaa383 100644 --- a/packages/router-core/tests/path.test.ts +++ b/packages/router-core/tests/path.test.ts @@ -94,6 +94,9 @@ describe('resolvePath', () => { ['/', 'a/', '/a'], ['/', '/a/b', '/a/b'], ['/a', 'b', '/a/b'], + ['/a', '', '/'], + ['/a', '.well-known', '/a/.well-known'], + ['/a', '/absolute', '/absolute'], ['/', 'a/b', '/a/b'], ['/', './a/b', '/a/b'], ['/a/b/c', 'd', '/a/b/c/d'], @@ -106,6 +109,8 @@ describe('resolvePath', () => { ['/a/b/c', '../..', '/a'], ['/a/b/c', '../../..', '/'], ['/a/b/c/', '../../..', '/'], + ['/', '../javascript:alert(1)', '/javascript:alert(1)'], + ['/posts', '../../data:text/html,test', '/data:text/html,test'], ])('resolves correctly', (a, b, eq) => { it(`${a} to ${b} === ${eq}`, () => { expect(resolvePath({ base: a, to: b })).toEqual(eq) diff --git a/packages/router-core/tests/searchParams.bench.ts b/packages/router-core/tests/searchParams.bench.ts new file mode 100644 index 00000000000..e2c2acb2632 --- /dev/null +++ b/packages/router-core/tests/searchParams.bench.ts @@ -0,0 +1,160 @@ +import { bench, describe, expect } from 'vitest' +import { defaultStringifySearch } from '../src' + +const iterations = 1_000 + +const ordinaryStrings = { + tab: 'specs', + filter: 'available', + category: 'hardware', + sort: 'newest', +} +const nonLiteralInitialStrings = { + tab: 'specs', + filter: 'available', + category: 'hardware', + sort: 'descending', +} +const jsonInitialStrings = { + filter: 'foo', + notification: 'new', + tab: 'tabular', + empty: '', +} +const emptyStrings = { + first: '', + second: '', + third: '', + fourth: '', +} +const punctuationStrings = { + file: '.env', + path: '/products', + positive: '+1', + priority: '!important', +} +const nonLiteralPrefixStrings = { + first: 'future', + second: 'framework', + third: 'name', + fourth: 'table', +} +const jsonLiteralPrefixStrings = { + first: 'favorite', + second: 'number', + third: 'travel', + fourth: 'nullish', +} +const jsonLiteralWordStrings = { + truthy: 'true_value', + falsy: 'false_value', + nullable: 'null_value', +} +const jsonLiteralBoundaryStrings = { + truthy: 'true-value', + falsy: 'false/value', + nullable: 'null.value', +} +const jsonStrings = { + number: '123', + boolean: 'true', + object: '{"nested":true}', + array: '[1,2,3]', +} +const mixedValues = { + tab: 'specs', + page: 2, + filters: ['available', 'featured'], + exactPage: '2', +} +let benchmarkSink = 0 + +expect(defaultStringifySearch(ordinaryStrings)).toBe( + '?tab=specs&filter=available&category=hardware&sort=newest', +) +expect(defaultStringifySearch(nonLiteralInitialStrings)).toBe( + '?tab=specs&filter=available&category=hardware&sort=descending', +) +expect(defaultStringifySearch(jsonInitialStrings)).toBe( + '?filter=foo¬ification=new&tab=tabular&empty=', +) +expect(defaultStringifySearch(emptyStrings)).toBe( + '?first=&second=&third=&fourth=', +) +expect(defaultStringifySearch(punctuationStrings)).toBe( + '?file=.env&path=%2Fproducts&positive=%2B1&priority=%21important', +) +expect(defaultStringifySearch(nonLiteralPrefixStrings)).toBe( + '?first=future&second=framework&third=name&fourth=table', +) +expect(defaultStringifySearch(jsonLiteralPrefixStrings)).toBe( + '?first=favorite&second=number&third=travel&fourth=nullish', +) +expect(defaultStringifySearch(jsonLiteralWordStrings)).toBe( + '?truthy=true_value&falsy=false_value&nullable=null_value', +) +expect(defaultStringifySearch(jsonLiteralBoundaryStrings)).toBe( + '?truthy=true-value&falsy=false%2Fvalue&nullable=null.value', +) +expect(defaultStringifySearch(jsonStrings)).toBe( + '?number=%22123%22&boolean=%22true%22&object=%22%7B%5C%22nested%5C%22%3Atrue%7D%22&array=%22%5B1%2C2%2C3%5D%22', +) +expect(defaultStringifySearch(mixedValues)).toBe( + '?tab=specs&page=2&filters=%5B%22available%22%2C%22featured%22%5D&exactPage=%222%22', +) + +function stringifyBatch(search: Record) { + let size = 0 + for (let index = 0; index < iterations; index++) { + size += defaultStringifySearch(search).length + } + benchmarkSink = size +} + +describe('default search serialization', () => { + bench('ordinary string values', () => { + stringifyBatch(ordinaryStrings) + }) + + bench('ordinary strings outside JSON-literal initials', () => { + stringifyBatch(nonLiteralInitialStrings) + }) + + bench('ordinary strings with JSON-literal initials', () => { + stringifyBatch(jsonInitialStrings) + }) + + bench('empty string values', () => { + stringifyBatch(emptyStrings) + }) + + bench('ordinary strings with non-JSON punctuation starts', () => { + stringifyBatch(punctuationStrings) + }) + + bench('ordinary f/n/t words outside JSON-literal prefixes', () => { + stringifyBatch(nonLiteralPrefixStrings) + }) + + bench('application words with JSON-literal prefixes', () => { + stringifyBatch(jsonLiteralPrefixStrings) + }) + + bench('application words with complete JSON-literal prefixes', () => { + stringifyBatch(jsonLiteralWordStrings) + }) + + bench('JSON-literal prefixes followed by punctuation', () => { + stringifyBatch(jsonLiteralBoundaryStrings) + }) + + bench('JSON-compatible string values', () => { + stringifyBatch(jsonStrings) + }) + + bench('mixed application values', () => { + stringifyBatch(mixedValues) + }) +}) + +void benchmarkSink diff --git a/packages/router-core/tests/searchParams.test.ts b/packages/router-core/tests/searchParams.test.ts index 006e119be53..e56f8b7131f 100644 --- a/packages/router-core/tests/searchParams.test.ts +++ b/packages/router-core/tests/searchParams.test.ts @@ -1,5 +1,9 @@ -import { describe, expect, test } from 'vitest' -import { defaultParseSearch, defaultStringifySearch } from '../src' +import { describe, expect, test, vi } from 'vitest' +import { + defaultParseSearch, + defaultStringifySearch, + stringifySearchWith, +} from '../src' describe('Search Params serialization and deserialization', () => { /* @@ -47,6 +51,64 @@ describe('Search Params serialization and deserialization', () => { expect(defaultParseSearch(str)).toEqual({ foo: 'bar' }) }) + test.each([ + 'false', + '-1', + '"quoted"', + ' true ', + 'true ', + 'false\t', + 'null\r\n', + '\tfalse', + '\nnull', + '\r1', + ' ', + '雪', + '"雪"', + ])('preserves JSON-compatible string %j as a string', (value) => { + const str = defaultStringifySearch({ value }) + expect(defaultParseSearch(str)).toEqual({ value }) + }) + + test('uses custom parsers for ordinary strings', () => { + const stringify = stringifySearchWith(JSON.stringify, (value) => { + if (value === 'word') { + return value + } + throw new Error('not parseable') + }) + + expect(stringify({ value: 'word' })).toEqual('?value=%22word%22') + }) + + test('skips JSON.parse for strings that cannot be JSON', () => { + const parseSpy = vi.spyOn(JSON, 'parse') + try { + const stringify = stringifySearchWith(JSON.stringify, JSON.parse) + + expect( + stringify({ + empty: '', + filter: 'foo', + future: 'future', + name: 'name', + notification: 'new', + tab: 'tabular', + topic: 'topic', + unicode: '雪', + }), + ).toEqual( + '?empty=&filter=foo&future=future&name=name¬ification=new&tab=tabular&topic=topic&unicode=%E9%9B%AA', + ) + expect( + stringify({ file: '.env', path: '/products', positive: '+1' }), + ).toEqual('?file=.env&path=%2Fproducts&positive=%2B1') + expect(parseSpy).not.toHaveBeenCalled() + } finally { + parseSpy.mockRestore() + } + }) + test('[edge case] self-reference serializes to "object Object"', () => { const obj = {} as any obj.self = obj diff --git a/packages/router-core/tests/utils.test.ts b/packages/router-core/tests/utils.test.ts index fff911df377..9e5c14c4138 100644 --- a/packages/router-core/tests/utils.test.ts +++ b/packages/router-core/tests/utils.test.ts @@ -950,6 +950,53 @@ describe('getEnumerableOwnKeys behavior (via replaceEqualDeep)', () => { ] expect(replaceEqualDeep(prev, next)).toBe(prev) }) + + it('preserves identity of unchanged nested subtrees when one leaf changes', () => { + const prev = { + search: { q: 'hello', f: 'live' }, + params: { username: 'elonmusk', tweetId: '123' }, + loaderData: { + user: { id: '44196397', name: 'Elon' }, + tabs: ['a', 'b'], + }, + } + const next = { + search: { q: 'hello', f: 'live' }, + params: { username: 'elonmusk', tweetId: '123' }, + loaderData: { + user: { id: '44196397', name: 'Musk' }, + tabs: ['a', 'b'], + }, + } + const result = replaceEqualDeep(prev, next) + // user.name changed -> top object is new, but every unchanged subtree + // (including the array) keeps its previous reference for cheap memo checks. + expect(result).not.toBe(prev) + expect(result.search).toBe(prev.search) + expect(result.params).toBe(prev.params) + expect(result.loaderData.tabs).toBe(prev.loaderData.tabs) + expect(result.loaderData.user).not.toBe(prev.loaderData.user) + expect(result.loaderData.user.name).toBe('Musk') + }) + + it('bails to next for a nested object carrying a non-enumerable prop', () => { + const prevInner: Record = { a: 1 } + Object.defineProperty(prevInner, 'hidden', { + value: 2, + enumerable: false, + }) + const nextInner: Record = { a: 1 } + Object.defineProperty(nextInner, 'hidden', { + value: 2, + enumerable: false, + }) + const prev = { shared: { x: 1 }, inner: prevInner } + const next = { shared: { x: 1 }, inner: nextInner } + const result = replaceEqualDeep(prev, next) + // inner is not clone-friendly -> returns nextInner; sibling subtree shared. + expect(result.inner).toBe(nextInner) + expect(result.shared).toBe(prev.shared) + }) }) }) diff --git a/packages/router-generator/CHANGELOG.md b/packages/router-generator/CHANGELOG.md index fd9dc5dceae..0f33149a54b 100644 --- a/packages/router-generator/CHANGELOG.md +++ b/packages/router-generator/CHANGELOG.md @@ -1,5 +1,47 @@ # @tanstack/router-generator +## 1.167.28 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13)]: + - @tanstack/router-core@1.171.22 + +## 1.167.27 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + +## 1.167.26 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + +## 1.167.25 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/router-core@1.171.19 + +## 1.167.24 + +### Patch Changes + +- Updated dependencies [[`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/router-core@1.171.18 + +## 1.167.23 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + ## 1.167.22 ### Patch Changes diff --git a/packages/router-generator/package.json b/packages/router-generator/package.json index 492c8cc726d..3946ea57876 100644 --- a/packages/router-generator/package.json +++ b/packages/router-generator/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-generator", - "version": "1.167.22", + "version": "1.167.28", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/router-plugin/CHANGELOG.md b/packages/router-plugin/CHANGELOG.md index 43463e919a9..e8f0edc4278 100644 --- a/packages/router-plugin/CHANGELOG.md +++ b/packages/router-plugin/CHANGELOG.md @@ -1,5 +1,59 @@ # @tanstack/router-plugin +## 1.168.30 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13), [`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3), [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1), [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e)]: + - @tanstack/router-core@1.171.22 + - @tanstack/react-router@1.170.26 + - @tanstack/router-generator@1.167.28 + +## 1.168.29 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + - @tanstack/react-router@1.170.25 + - @tanstack/router-generator@1.167.27 + +## 1.168.28 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + - @tanstack/react-router@1.170.24 + - @tanstack/router-generator@1.167.26 + +## 1.168.27 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/react-router@1.170.22 + - @tanstack/router-core@1.171.19 + - @tanstack/router-generator@1.167.25 + +## 1.168.26 + +### Patch Changes + +- Updated dependencies [[`697ebb6`](https://github.com/TanStack/router/commit/697ebb6ddbd433d052b6b4707938a5c595865d58), [`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf), [`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/react-router@1.170.21 + - @tanstack/router-core@1.171.18 + - @tanstack/router-generator@1.167.24 + +## 1.168.25 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + - @tanstack/react-router@1.170.20 + - @tanstack/router-generator@1.167.23 + ## 1.168.24 ### Patch Changes diff --git a/packages/router-plugin/package.json b/packages/router-plugin/package.json index 380c7e29bef..f95cbadc2d8 100644 --- a/packages/router-plugin/package.json +++ b/packages/router-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-plugin", - "version": "1.168.24", + "version": "1.168.30", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/router-plugin/tests/handle-route-update.test.ts b/packages/router-plugin/tests/handle-route-update.test.ts index db371746af4..9c8e239fe27 100644 --- a/packages/router-plugin/tests/handle-route-update.test.ts +++ b/packages/router-plugin/tests/handle-route-update.test.ts @@ -240,7 +240,7 @@ describe('handleRouteUpdate', () => { const routeTree = rootRoute.addChildren([asAnyRoute(itemRoute)]) const router = createTestRouter(routeTree) - expect(router.getMatchedRoutes('/items/abc').foundRoute?.id).toBeUndefined() + expect(router.getMatchedRoutes('/items/abc')[2]?.id).toBeUndefined() const restoreWindow = withWindowRouter(router) try { @@ -258,9 +258,7 @@ describe('handleRouteUpdate', () => { restoreWindow() } - expect(router.getMatchedRoutes('/items/abc').foundRoute?.id).toBe( - itemRoute.id, - ) + expect(router.getMatchedRoutes('/items/abc')[2]?.id).toBe(itemRoute.id) }) it('hydrates the hot module route export with generated route tree state', () => { diff --git a/packages/router-ssr-query-core/package.json b/packages/router-ssr-query-core/package.json index c4dffe04739..3b939b16867 100644 --- a/packages/router-ssr-query-core/package.json +++ b/packages/router-ssr-query-core/package.json @@ -64,12 +64,12 @@ "node": ">=20.19" }, "devDependencies": { + "@tanstack/query-core": "catalog:", "@tanstack/router-core": ">=1.171.7", - "@tanstack/query-core": ">=5.90.0", "vite": "*" }, "peerDependencies": { - "@tanstack/router-core": ">=1.127.0", - "@tanstack/query-core": ">=5.90.0" + "@tanstack/query-core": ">=5.90.0", + "@tanstack/router-core": ">=1.127.0" } } diff --git a/packages/router-vite-plugin/CHANGELOG.md b/packages/router-vite-plugin/CHANGELOG.md index a8abbec3f2a..268659c7ea1 100644 --- a/packages/router-vite-plugin/CHANGELOG.md +++ b/packages/router-vite-plugin/CHANGELOG.md @@ -1,5 +1,47 @@ # @tanstack/router-vite-plugin +## 1.167.30 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-plugin@1.168.30 + +## 1.167.29 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-plugin@1.168.29 + +## 1.167.28 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-plugin@1.168.28 + +## 1.167.27 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-plugin@1.168.27 + +## 1.167.26 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-plugin@1.168.26 + +## 1.167.25 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/router-plugin@1.168.25 + ## 1.167.24 ### Patch Changes diff --git a/packages/router-vite-plugin/package.json b/packages/router-vite-plugin/package.json index f80dd4d53e2..94576bea45f 100644 --- a/packages/router-vite-plugin/package.json +++ b/packages/router-vite-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-vite-plugin", - "version": "1.167.24", + "version": "1.167.30", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/solid-router-devtools/CHANGELOG.md b/packages/solid-router-devtools/CHANGELOG.md index 6f45b1758de..871b008dd35 100644 --- a/packages/solid-router-devtools/CHANGELOG.md +++ b/packages/solid-router-devtools/CHANGELOG.md @@ -1,5 +1,20 @@ # @tanstack/solid-router-devtools +## 2.0.0-rc.0 + +### Patch Changes + +- [#8058](https://github.com/TanStack/router/pull/8058) [`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713) - Upgrade `solid-js` and `@solidjs/web` to `2.0.0-rc.0`, and migrate from `vite-plugin-solid` to its new name `@solidjs/vite-plugin` at `3.0.0-next.28` + + `vite-plugin-solid` was renamed to `@solidjs/vite-plugin`; its final release (`3.0.0-next.27`) is a re-export shim over the new package. `@solidjs/vite-plugin@3.0.0-next.28` requires `solid-js`/`@solidjs/web` `^2.0.0-rc.0`, so the rename and the `rc` bump land together. + + `@tanstack/router-plugin` is intentionally untouched: it detects the Solid JSX plugin by its Vite plugin _name_ (`solid`), which the renamed package still registers, and its `vite-plugin-solid` peer is optional — so it keeps working for both Solid 1 and Solid 2 consumers without a change. + + Also bumps `@tanstack/solid-query` and `@tanstack/solid-query-devtools` to `^6.0.0-rc.0` (whose peer requires `solid-js >=2.0.0-rc.0`), and converges `@tanstack/query-core` on `5.101.4` — `solid-query` depends on query-core `5.101.0`, which previously resolved to a stale `5.99.0` and produced two incompatible `QueryClient` types. + +- Updated dependencies [[`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713)]: + - @tanstack/solid-router@2.0.0-rc.0 + ## 2.0.0-beta.25 ### Patch Changes diff --git a/packages/solid-router-devtools/package.json b/packages/solid-router-devtools/package.json index d32725178db..60f7af53221 100644 --- a/packages/solid-router-devtools/package.json +++ b/packages/solid-router-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-router-devtools", - "version": "2.0.0-beta.25", + "version": "2.0.0-rc.0", "description": "Modern and scalable routing for Solid applications", "author": "Tanner Linsley", "license": "MIT", @@ -66,21 +66,21 @@ "node": ">=20.19" }, "dependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/router-devtools-core": "workspace:*" }, "devDependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@solidjs/web": "^2.0.0-rc.0", "@types/node": ">=20", - "solid-js": "2.0.0-beta.32", - "vite": "*", - "vite-plugin-solid": "^3.0.0-next.23" + "solid-js": "^2.0.0-rc.0", + "vite": "*" }, "peerDependencies": { - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/router-core": "workspace:^", "@tanstack/solid-router": "workspace:^", - "solid-js": "2.0.0-beta.32" + "solid-js": "^2.0.0-rc.0" }, "peerDependenciesMeta": { "@tanstack/router-core": { diff --git a/packages/solid-router-devtools/vite.config.ts b/packages/solid-router-devtools/vite.config.ts index 633c31d0051..9285e9eb897 100644 --- a/packages/solid-router-devtools/vite.config.ts +++ b/packages/solid-router-devtools/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/vite-config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' const config = defineConfig({ plugins: [solid()], diff --git a/packages/solid-router-ssr-query/CHANGELOG.md b/packages/solid-router-ssr-query/CHANGELOG.md index 9c8969d726b..06b71632f07 100644 --- a/packages/solid-router-ssr-query/CHANGELOG.md +++ b/packages/solid-router-ssr-query/CHANGELOG.md @@ -1,5 +1,17 @@ # @tanstack/solid-router-ssr-query +## 2.0.0-rc.0 + +### Patch Changes + +- [#8058](https://github.com/TanStack/router/pull/8058) [`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713) - Upgrade `solid-js` and `@solidjs/web` to `2.0.0-rc.0`, and migrate from `vite-plugin-solid` to its new name `@solidjs/vite-plugin` at `3.0.0-next.28` + + `vite-plugin-solid` was renamed to `@solidjs/vite-plugin`; its final release (`3.0.0-next.27`) is a re-export shim over the new package. `@solidjs/vite-plugin@3.0.0-next.28` requires `solid-js`/`@solidjs/web` `^2.0.0-rc.0`, so the rename and the `rc` bump land together. + + `@tanstack/router-plugin` is intentionally untouched: it detects the Solid JSX plugin by its Vite plugin _name_ (`solid`), which the renamed package still registers, and its `vite-plugin-solid` peer is optional — so it keeps working for both Solid 1 and Solid 2 consumers without a change. + + Also bumps `@tanstack/solid-query` and `@tanstack/solid-query-devtools` to `^6.0.0-rc.0` (whose peer requires `solid-js >=2.0.0-rc.0`), and converges `@tanstack/query-core` on `5.101.4` — `solid-query` depends on query-core `5.101.0`, which previously resolved to a stale `5.99.0` and produced two incompatible `QueryClient` types. + ## 2.0.0-beta.31 ### Patch Changes diff --git a/packages/solid-router-ssr-query/package.json b/packages/solid-router-ssr-query/package.json index 3997a277a76..eba1d652209 100644 --- a/packages/solid-router-ssr-query/package.json +++ b/packages/solid-router-ssr-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-router-ssr-query", - "version": "2.0.0-beta.31", + "version": "2.0.0-rc.0", "description": "Modern and scalable routing for Solid applications", "author": "Tanner Linsley", "license": "MIT", @@ -67,13 +67,13 @@ "@tanstack/router-ssr-query-core": "workspace:*" }, "devDependencies": { - "@solidjs/web": "2.0.0-beta.32", - "@tanstack/solid-query": "^6.0.0-beta.7", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@solidjs/web": "^2.0.0-rc.0", + "@tanstack/solid-query": "^6.0.0-rc.0", "@tanstack/solid-router": "workspace:*", "eslint-plugin-solid": "^0.14.5", - "solid-js": "2.0.0-beta.32", - "vite": "*", - "vite-plugin-solid": "^3.0.0-next.23" + "solid-js": "^2.0.0-rc.0", + "vite": "*" }, "peerDependencies": { "@solidjs/web": ">=2.0.0-beta.17", diff --git a/packages/solid-router-ssr-query/vite.config.ts b/packages/solid-router-ssr-query/vite.config.ts index 52b38213cb1..3dbbbee0fb7 100644 --- a/packages/solid-router-ssr-query/vite.config.ts +++ b/packages/solid-router-ssr-query/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/vite-config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import packageJson from './package.json' const config = defineConfig({ diff --git a/packages/solid-router/CHANGELOG.md b/packages/solid-router/CHANGELOG.md index 9dde82f8786..fb6d892e8d0 100644 --- a/packages/solid-router/CHANGELOG.md +++ b/packages/solid-router/CHANGELOG.md @@ -1,5 +1,17 @@ # @tanstack/solid-router +## 2.0.0-rc.0 + +### Patch Changes + +- [#8058](https://github.com/TanStack/router/pull/8058) [`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713) - Upgrade `solid-js` and `@solidjs/web` to `2.0.0-rc.0`, and migrate from `vite-plugin-solid` to its new name `@solidjs/vite-plugin` at `3.0.0-next.28` + + `vite-plugin-solid` was renamed to `@solidjs/vite-plugin`; its final release (`3.0.0-next.27`) is a re-export shim over the new package. `@solidjs/vite-plugin@3.0.0-next.28` requires `solid-js`/`@solidjs/web` `^2.0.0-rc.0`, so the rename and the `rc` bump land together. + + `@tanstack/router-plugin` is intentionally untouched: it detects the Solid JSX plugin by its Vite plugin _name_ (`solid`), which the renamed package still registers, and its `vite-plugin-solid` peer is optional — so it keeps working for both Solid 1 and Solid 2 consumers without a change. + + Also bumps `@tanstack/solid-query` and `@tanstack/solid-query-devtools` to `^6.0.0-rc.0` (whose peer requires `solid-js >=2.0.0-rc.0`), and converges `@tanstack/query-core` on `5.101.4` — `solid-query` depends on query-core `5.101.0`, which previously resolved to a stale `5.99.0` and produced two incompatible `QueryClient` types. + ## 2.0.0-beta.30 ### Patch Changes diff --git a/packages/solid-router/eslint.config.ts b/packages/solid-router/eslint.config.ts index 672ce4e4da9..44f961c3043 100644 --- a/packages/solid-router/eslint.config.ts +++ b/packages/solid-router/eslint.config.ts @@ -1,4 +1,4 @@ -import solidPlugin from 'vite-plugin-solid' +import solidPlugin from '@solidjs/vite-plugin' import rootConfig from '../../eslint.config.js' export default [ diff --git a/packages/solid-router/package.json b/packages/solid-router/package.json index e9884eb7012..c7cb8b0746a 100644 --- a/packages/solid-router/package.json +++ b/packages/solid-router/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-router", - "version": "2.0.0-beta.30", + "version": "2.0.0-rc.0", "description": "Modern and scalable routing for Solid applications", "author": "Tanner Linsley", "license": "MIT", @@ -106,7 +106,7 @@ "dependencies": { "@solid-devtools/logger": "^0.9.4", "@solidjs/meta": "^0.29.4", - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/history": "workspace:*", "@tanstack/router-core": "workspace:*", "isbot": "^5.1.22", @@ -114,14 +114,14 @@ }, "devDependencies": { "@solidjs/testing-library": "^0.8.10", - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@solidjs/web": "^2.0.0-rc.0", "@testing-library/jest-dom": "^6.6.3", "@types/node": ">=20", "combinate": "^1.1.11", "eslint-plugin-solid": "^0.14.5", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "vite": "*", - "vite-plugin-solid": "^3.0.0-next.23", "zod": "^4.4.3" }, "peerDependencies": { diff --git a/packages/solid-router/skills/solid-router/SKILL.md b/packages/solid-router/skills/solid-router/SKILL.md index 0cfd22ad730..a9f10fb46e9 100644 --- a/packages/solid-router/skills/solid-router/SKILL.md +++ b/packages/solid-router/skills/solid-router/SKILL.md @@ -42,7 +42,7 @@ npm install -D @tanstack/router-plugin @tanstack/solid-router-devtools ```ts // vite.config.ts import { defineConfig } from 'vite' -import solidPlugin from 'vite-plugin-solid' +import solidPlugin from '@solidjs/vite-plugin' import { tanstackRouter } from '@tanstack/router-plugin/vite' export default defineConfig({ diff --git a/packages/solid-router/src/CatchBoundary.tsx b/packages/solid-router/src/CatchBoundary.tsx index 2f79ec51627..4157ab1f852 100644 --- a/packages/solid-router/src/CatchBoundary.tsx +++ b/packages/solid-router/src/CatchBoundary.tsx @@ -1,5 +1,6 @@ import * as Solid from 'solid-js' import { Dynamic } from '@solidjs/web' +import { renderInNonRouteComponentContext } from './nonRouteComponentContext' import type { ErrorRouteComponent } from './route' import type { JSX } from '@solidjs/web' @@ -47,7 +48,18 @@ export function CatchBoundary( props.onCatch?.(resolvedError) resetBoundary = reset - return ( + return process.env.NODE_ENV !== 'production' ? ( + renderInNonRouteComponentContext( + () => ( + + ), + 'errorComponent', + ) + ) : ( { status: match.status, } }) - const nearestMatch = { - routeId: () => props.routeId, - match: currentMatch, - } + const nearestMatch = [() => props.routeId, currentMatch] as const return ( @@ -107,7 +108,15 @@ export const Match = (props: { routeId: string }) => { const MatchContent = () => ( } + fallback={(() => { + if (process.env.NODE_ENV !== 'production') { + return renderInNonRouteComponentContext( + () => , + 'pendingComponent', + ) + } + return + })()} > @@ -123,7 +132,17 @@ export const Match = (props: { routeId: string }) => { throw notFoundError } - return ( + return process.env.NODE_ENV !== 'production' ? ( + renderInNonRouteComponentContext( + () => ( + + ), + 'notFoundComponent', + ) + ) : ( { } + fallback={(() => { + if (process.env.NODE_ENV !== 'production') { + return renderInNonRouteComponentContext( + () => , + 'pendingComponent', + ) + } + return + })()} > @@ -151,11 +178,20 @@ export const Match = (props: { routeId: string }) => { - ) - } + fallback={(() => { + // Data-only SSR renders the inner fallback on the server, so + // avoid adding an extra loading fallback on the client. + if (shouldSkipLoadingFallback()) { + return undefined + } + if (process.env.NODE_ENV !== 'production') { + return renderInNonRouteComponentContext( + () => , + 'pendingComponent', + ) + } + return + })()} > { export const MatchInner = (): any => { const router = useRouter() const nearestMatch = Solid.useContext(nearestMatchContext) - const match = nearestMatch.match - const routeId = nearestMatch.routeId + const match = nearestMatch[1 /* match */] + const routeId = nearestMatch[0 /* route id */] const matchState = Solid.createMemo(() => { const currentMatch = match() @@ -212,12 +248,18 @@ export const MatchInner = (): any => { const route = router.routesById[currentRouteId] as AnyRoute const remount = route.options.remountDeps ?? router.options.defaultRemountDeps - const deps = remount?.({ - routeId: currentRouteId, - loaderDeps: currentMatch.loaderDeps, - params: currentMatch._strictParams, - search: currentMatch._strictSearch, - }) + let componentKey: string + if (!remount) { + componentKey = currentRouteId + } else { + const deps = remount({ + routeId: currentRouteId, + loaderDeps: currentMatch.loaderDeps, + params: currentMatch._strictParams, + search: currentMatch._strictSearch, + }) + componentKey = JSON.stringify(deps) ?? currentRouteId + } return { route, @@ -227,11 +269,7 @@ export const MatchInner = (): any => { status: currentMatch.status, error: currentMatch.error, }, - componentKey: deps - ? JSON.stringify(deps) - : route.isRoot - ? currentRouteId - : currentMatch.id, + componentKey, } }) @@ -275,7 +313,18 @@ export const MatchInner = (): any => { router.options.defaultErrorComponent) || ErrorComponent - return ( + return process.env.NODE_ENV !== 'production' ? ( + renderInNonRouteComponentContext( + () => ( + + ), + 'errorComponent', + ) + ) : ( { } export const Outlet = () => { + if (process.env.NODE_ENV !== 'production') { + const nonRouteComponent = Solid.useContext(nonRouteComponentContext!) + if (nonRouteComponent) { + console.warn( + `Warning: An was rendered inside a ${nonRouteComponent}. should only be rendered inside a route component.`, + ) + } + } + const router = useRouter() const nearestParentMatch = Solid.useContext(nearestMatchContext) - const parentMatch = nearestParentMatch.match - const routeId = nearestParentMatch.routeId + const parentMatch = nearestParentMatch[1 /* match */] + const routeId = nearestParentMatch[0 /* route id */] const route = Solid.createMemo(() => { const currentRouteId = routeId() return currentRouteId @@ -352,11 +410,18 @@ export const Outlet = () => { return ( - ) : null - } + fallback={(() => { + if (!childPendingComponent()) { + return null + } + if (process.env.NODE_ENV !== 'production') { + return renderInNonRouteComponentContext( + () => , + 'pendingComponent', + ) + } + return + })()} > {nextMatch()} diff --git a/packages/solid-router/src/Matches.tsx b/packages/solid-router/src/Matches.tsx index 8eb5966507a..f7353e964a2 100644 --- a/packages/solid-router/src/Matches.tsx +++ b/packages/solid-router/src/Matches.tsx @@ -6,6 +6,7 @@ import { Rendered, Transitioner } from './Transitioner' import { nearestMatchContext } from './matchContext' import { SafeFragment } from './SafeFragment' import { Match } from './Match' +import { renderInNonRouteComponentContext } from './nonRouteComponentContext' import type { AnyRoute, AnyRouter, @@ -103,7 +104,19 @@ export function Matches() { return ( : null} + fallback={ + PendingComponent + ? (() => { + if (process.env.NODE_ENV !== 'production') { + return renderInNonRouteComponentContext( + () => , + 'pendingComponent', + ) + } + return + })() + : null + } > @@ -118,10 +131,7 @@ function MatchesInner() { const routeId = () => router.stores.ids.get()[0] const match = () => routeId() ? router.stores.byRoute.get(routeId()!)?.get() : undefined - const nearestMatch = { - routeId, - match, - } + const nearestMatch = [routeId, match] as const const matchContent = () => ( @@ -274,7 +284,7 @@ export function useParentMatches< >( opts?: UseMatchesBaseOptions, ): Solid.Accessor> { - const contextRouteId = Solid.useContext(nearestMatchContext).routeId + const contextRouteId = Solid.useContext(nearestMatchContext)[0 /* route id */] return useMatches({ select: (matches: Array>) => { @@ -293,7 +303,7 @@ export function useChildMatches< >( opts?: UseMatchesBaseOptions, ): Solid.Accessor> { - const contextRouteId = Solid.useContext(nearestMatchContext).routeId + const contextRouteId = Solid.useContext(nearestMatchContext)[0 /* route id */] return useMatches({ select: (matches: Array>) => { diff --git a/packages/solid-router/src/fileRoute.ts b/packages/solid-router/src/fileRoute.ts index 35aa4de1717..1115ee54144 100644 --- a/packages/solid-router/src/fileRoute.ts +++ b/packages/solid-router/src/fileRoute.ts @@ -43,11 +43,14 @@ export function createFileRoute< TFullPath extends RouteConstraints['TFullPath'] = FileRoutesByPath[TFilePath]['fullPath'], >( + // eslint-disable-next-line unused-imports/no-unused-vars path?: TFilePath, ): FileRoute['createRoute'] { - return new FileRoute(path, { - silent: true, - }).createRoute + return (options) => { + const route = createRoute(options as any) + ;(route as any).isRoot = false + return route as any + } } /** diff --git a/packages/solid-router/src/link.tsx b/packages/solid-router/src/link.tsx index 4999effdae1..c5d3691672b 100644 --- a/packages/solid-router/src/link.tsx +++ b/packages/solid-router/src/link.tsx @@ -61,7 +61,11 @@ function splitProps, TKey extends keyof T>( // Note: Solid.omit uses rest params (...keys), so we must spread the array. return [props as any, Solid.omit(props, ...(keys as any)) as any] } -const timeoutMap = new WeakMap>() +const timeoutMap = new WeakMap>() +const cancelPreload = (eventTarget: object) => { + clearTimeout(timeoutMap.get(eventTarget)) + timeoutMap.delete(eventTarget) +} export function useLinkProps< TRouter extends AnyRouter = RegisteredRouter, @@ -73,7 +77,6 @@ export function useLinkProps< options: UseLinkPropsOptions, ): ComponentProps<'a'> { const router = useRouter() - const [isTransitioning, setIsTransitioning] = Solid.createSignal(false) const shouldHydrateHash = !isServer && !!router.options.ssr const hasHydrated = useHydrated() @@ -208,7 +211,7 @@ export function useLinkProps< const preload = Solid.createMemo( () => { - if (_options().reloadDocument || externalLink()) { + if (_options().reloadDocument || externalLink() || local.disabled) { return false } return local.preload ?? router.options.defaultPreload @@ -281,14 +284,6 @@ export function useLinkProps< console.warn(preloadWarning) }) - const preloadViewportIoCallback = ( - entry: IntersectionObserverEntry | undefined, - ) => { - if (entry?.isIntersecting) { - doPreload() - } - } - const [ref, setRefSignal] = Solid.createSignal(null) const setRef = (el: Element | null) => { @@ -297,18 +292,49 @@ export function useLinkProps< }) } - useIntersectionObserver( - ref, - preloadViewportIoCallback, - { rootMargin: '100px' }, - { disabled: !!local.disabled || !(Solid.untrack(preload) === 'viewport') }, - ) + const enqueuePreload = ( + e?: MouseEvent | FocusEvent | IntersectionObserverEntry, + ) => { + if (!e) { + cancelPreload(ref) + return + } + + if ( + !( + (e as IntersectionObserverEntry).isIntersecting ?? + preload() === 'intent' + ) + ) { + if ((e as IntersectionObserverEntry).isIntersecting === false) { + cancelPreload(ref) + } + return + } + + if (!preloadDelay()) { + doPreload() + return + } + + if (!timeoutMap.has(ref)) { + timeoutMap.set( + ref, + setTimeout(() => { + timeoutMap.delete(ref) + doPreload() + }, preloadDelay()), + ) + } + } + + useIntersectionObserver(ref, enqueuePreload, () => preload() !== 'viewport') Solid.createEffect(preload, (preloadValue) => { if (hasRenderFetched) { return } - if (!local.disabled && preloadValue === 'render') { + if (preloadValue === 'render') { Solid.untrack(() => doPreload()) hasRenderFetched = true } @@ -357,17 +383,6 @@ export function useLinkProps< ) { e.preventDefault() - Solid.runWithOwner(null, () => { - setIsTransitioning(true) - }) - - const unsub = router.subscribe('onResolved', () => { - unsub() - Solid.runWithOwner(null, () => { - setIsTransitioning(false) - }) - }) - // All is well? Navigate! // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing router.navigate({ @@ -382,40 +397,14 @@ export function useLinkProps< } } - const enqueueIntentPreload = (e: MouseEvent | FocusEvent) => { - if (local.disabled || preload() !== 'intent') return - - if (!preloadDelay()) { - doPreload() - return - } - - const eventTarget = e.currentTarget || e.target - - if (!eventTarget || timeoutMap.has(eventTarget)) return - - timeoutMap.set( - eventTarget, - setTimeout(() => { - timeoutMap.delete(eventTarget) - doPreload() - }, preloadDelay()), - ) - } - - const handleTouchStart = (_: TouchEvent) => { - if (local.disabled || preload() !== 'intent') return + const handleTouchStart = () => { + if (preload() !== 'intent') return doPreload() } - const handleLeave = (e: MouseEvent | FocusEvent) => { - if (local.disabled) return - const eventTarget = e.currentTarget || e.target - - if (eventTarget) { - const id = timeoutMap.get(eventTarget) - clearTimeout(id) - timeoutMap.delete(eventTarget) + const handleLeave = () => { + if (preload() === 'intent') { + cancelPreload(ref) } } @@ -430,17 +419,14 @@ export function useLinkProps< const onClick = createComposedHandler(() => local.onClick, handleClick) const onBlur = createComposedHandler(() => local.onBlur, handleLeave) - const onFocus = createComposedHandler( - () => local.onFocus, - enqueueIntentPreload, - ) + const onFocus = createComposedHandler(() => local.onFocus, enqueuePreload) const onMouseEnter = createComposedHandler( () => local.onMouseEnter, - enqueueIntentPreload, + enqueuePreload, ) const onMouseOver = createComposedHandler( () => local.onMouseOver, - enqueueIntentPreload, + enqueuePreload, ) const onMouseLeave = createComposedHandler( () => local.onMouseLeave, @@ -552,8 +538,6 @@ export function useLinkProps< 'aria-disabled': () => (local.disabled ? 'true' : undefined), 'data-status': () => (isActive() ? 'active' : undefined), 'aria-current': () => (isActive() ? 'page' : undefined), - 'data-transitioning': () => - isTransitioning() ? 'transitioning' : undefined, class: resolvedClass, style: resolvedStyle, }) @@ -639,9 +623,7 @@ export type LinkProps< export interface LinkPropsChildren { // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns - children?: - | JSX.Element - | ((state: { isActive: boolean; isTransitioning: boolean }) => JSX.Element) + children?: JSX.Element | ((state: { isActive: boolean }) => JSX.Element) } type LinkComponentSolidProps = TComp extends ValidComponent @@ -726,9 +708,6 @@ export const Link: LinkComponent<'a'> = (props) => { get isActive() { return (linkProps as any)['data-status'] === 'active' }, - get isTransitioning() { - return (linkProps as any)['data-transitioning'] === 'transitioning' - }, }) } diff --git a/packages/solid-router/src/matchContext.tsx b/packages/solid-router/src/matchContext.tsx index 50ab0d4b767..87cd32f4a83 100644 --- a/packages/solid-router/src/matchContext.tsx +++ b/packages/solid-router/src/matchContext.tsx @@ -1,15 +1,15 @@ import * as Solid from 'solid-js' import type { AnyRouteMatch } from '@tanstack/router-core' -export type NearestMatchContextValue = { - routeId: Solid.Accessor - match: Solid.Accessor -} +export type NearestMatchContextValue = readonly [ + routeId: Solid.Accessor, + match: Solid.Accessor, +] -const defaultNearestMatchContext: NearestMatchContextValue = { - routeId: () => undefined, - match: () => undefined, -} +const defaultNearestMatchContext: NearestMatchContextValue = [ + () => undefined, + () => undefined, +] export const nearestMatchContext = Solid.createContext(defaultNearestMatchContext) diff --git a/packages/solid-router/src/nonRouteComponentContext.tsx b/packages/solid-router/src/nonRouteComponentContext.tsx new file mode 100644 index 00000000000..9d498c7cd88 --- /dev/null +++ b/packages/solid-router/src/nonRouteComponentContext.tsx @@ -0,0 +1,23 @@ +import * as Solid from 'solid-js' +import type { JSX } from '@solidjs/web' + +export type NonRouteComponent = + | 'pendingComponent' + | 'errorComponent' + | 'notFoundComponent' + +// Solid 2's `useContext` throws for a default-less context with no mounted +// provider, so default to `null` to keep the unset read falsy instead. +export const nonRouteComponentContext = + process.env.NODE_ENV !== 'production' + ? /* @__PURE__ */ Solid.createContext(null) + : undefined + +export function renderInNonRouteComponentContext( + render: () => JSX.Element, + component: NonRouteComponent, +) { + // In Solid 2 the context object itself is the provider component. + const Context = nonRouteComponentContext! + return {render()} +} diff --git a/packages/solid-router/src/renderRouteNotFound.tsx b/packages/solid-router/src/renderRouteNotFound.tsx index 078a632e08c..9e8a09e9c7a 100644 --- a/packages/solid-router/src/renderRouteNotFound.tsx +++ b/packages/solid-router/src/renderRouteNotFound.tsx @@ -1,4 +1,5 @@ import { DefaultGlobalNotFound } from './not-found' +import { renderInNonRouteComponentContext } from './nonRouteComponentContext' import type { AnyRoute, AnyRouter } from '@tanstack/router-core' /** @@ -14,19 +15,35 @@ export function renderRouteNotFound( route: AnyRoute, data: any, ) { + if (process.env.NODE_ENV !== 'production') { + if (!route.options.notFoundComponent) { + if (router.options.defaultNotFoundComponent) { + const DefaultNotFoundComponent = router.options.defaultNotFoundComponent + return renderInNonRouteComponentContext( + () => , + 'notFoundComponent', + ) + } + + console.warn( + `Warning: A notFoundError was encountered on the route with ID "${route.id}", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (

Not Found

)`, + ) + + return + } + + const NotFoundComponent = route.options.notFoundComponent + return renderInNonRouteComponentContext( + () => , + 'notFoundComponent', + ) + } + if (!route.options.notFoundComponent) { if (router.options.defaultNotFoundComponent) { return } - if (process.env.NODE_ENV !== 'production') { - if (!route.options.notFoundComponent) { - console.warn( - `Warning: A notFoundError was encountered on the route with ID "${route.id}", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (

Not Found

)`, - ) - } - } - return } diff --git a/packages/solid-router/src/ssr/clientAssetsManifest.ts b/packages/solid-router/src/ssr/clientAssetsManifest.ts index 377da8efa59..ff1c806c62e 100644 --- a/packages/solid-router/src/ssr/clientAssetsManifest.ts +++ b/packages/solid-router/src/ssr/clientAssetsManifest.ts @@ -8,7 +8,7 @@ * * This module is a stub on purpose: bundler integrations that can answer * those lookups (e.g. TanStack Start's vite plugin, which swaps this module - * for vite-plugin-solid's `virtual:solid-manifest`) replace it at build + * for @solidjs/vite-plugin's `virtual:solid-manifest`) replace it at build * time. Everywhere else — plain SSR setups, bundlers without an * integration — it stays `undefined` and rendering falls back to the * router's own route manifest. diff --git a/packages/solid-router/src/useBlocker.tsx b/packages/solid-router/src/useBlocker.tsx index 36d8fa8874a..f1303ba59de 100644 --- a/packages/solid-router/src/useBlocker.tsx +++ b/packages/solid-router/src/useBlocker.tsx @@ -198,21 +198,23 @@ export function useBlocker( location: HistoryLocation, ): AnyShouldBlockFnLocation { const parsedLocation = router.parseLocation(location) - const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname) - if (matchedRoutes.foundRoute === undefined) { + const [, rawParams, foundRoute] = router.getMatchedRoutes( + parsedLocation.pathname, + ) + if (foundRoute === undefined) { return { routeId: '__notFound__', fullPath: parsedLocation.pathname, pathname: parsedLocation.pathname, - params: matchedRoutes.routeParams, + params: rawParams, search: parsedLocation.search, } } return { - routeId: matchedRoutes.foundRoute.id, - fullPath: matchedRoutes.foundRoute.fullPath, + routeId: foundRoute.id, + fullPath: foundRoute.fullPath, pathname: parsedLocation.pathname, - params: matchedRoutes.routeParams, + params: rawParams, search: parsedLocation.search, } } diff --git a/packages/solid-router/src/useMatch.tsx b/packages/solid-router/src/useMatch.tsx index eb633b927d5..59be9f55ff5 100644 --- a/packages/solid-router/src/useMatch.tsx +++ b/packages/solid-router/src/useMatch.tsx @@ -78,7 +78,7 @@ export function useMatch< return router.stores.getMatchStore(opts.from).get() } - return nearestMatch?.match() + return nearestMatch?.[1 /* match */]() } Solid.createEffect(match, (selectedMatch) => { diff --git a/packages/solid-router/src/utils.ts b/packages/solid-router/src/utils.ts index f7ae7aa3ce7..cc7b1fee3b0 100644 --- a/packages/solid-router/src/utils.ts +++ b/packages/solid-router/src/utils.ts @@ -8,9 +8,8 @@ import * as Solid from 'solid-js' * When the intersection changes, the callback will be called with the `IntersectionObserverEntry`. * * @param ref - The ref to observe - * @param intersectionObserverOptions - The options to pass to the IntersectionObserver - * @param options - The options to pass to the hook * @param callback - The callback to call when the intersection changes + * @param disabled - Whether observation is disabled * @returns The IntersectionObserver instance * @example * ```tsx @@ -19,37 +18,42 @@ import * as Solid from 'solid-js' * useIntersectionObserver( * ref, * (entry) => { doSomething(entry) }, - * { rootMargin: '10px' }, - * { disabled: false } + * false * ) * return
* ``` */ export function useIntersectionObserver( ref: Solid.Accessor, - callback: (entry: IntersectionObserverEntry | undefined) => void, - intersectionObserverOptions: IntersectionObserverInit = {}, - options: { disabled?: boolean } = {}, + callback: (entry?: IntersectionObserverEntry) => void, + disabled: Solid.Accessor, ): Solid.Accessor { const isIntersectionObserverAvailable = typeof IntersectionObserver === 'function' let observerRef: IntersectionObserver | null = null - Solid.createEffect(ref, (r) => { - if (!r || !isIntersectionObserverAvailable || options.disabled) { - return - } + Solid.createEffect( + () => [ref(), disabled()] as const, + ([r, isDisabled]) => { + if (isDisabled || !r || !isIntersectionObserverAvailable) { + return () => callback() + } - observerRef = new IntersectionObserver(([entry]) => { - callback(entry) - }, intersectionObserverOptions) + observerRef = new IntersectionObserver( + (entries) => { + callback(entries.pop()) + }, + { rootMargin: '100px' }, + ) - observerRef.observe(r) + observerRef.observe(r) - return () => { - observerRef?.disconnect() - } - }) + return () => { + observerRef?.disconnect() + callback() + } + }, + ) return () => observerRef } diff --git a/packages/solid-router/tests/Outlet.test.tsx b/packages/solid-router/tests/Outlet.test.tsx new file mode 100644 index 00000000000..248c710b1c3 --- /dev/null +++ b/packages/solid-router/tests/Outlet.test.tsx @@ -0,0 +1,146 @@ +import { afterEach, expect, test, vi } from 'vitest' +import { cleanup, render, screen } from '@solidjs/testing-library' +import { createMemoryHistory } from '@tanstack/history' +import { createControlledPromise, notFound } from '@tanstack/router-core' +import { + Outlet, + RouterProvider, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +const outletWarning = ( + component: 'pendingComponent' | 'errorComponent' | 'notFoundComponent', +) => + `Warning: An was rendered inside a ${component}. should only be rendered inside a route component.` + +afterEach(() => { + cleanup() + vi.restoreAllMocks() +}) + +test('does not warn when Outlet is rendered inside a route component', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const rootRoute = createRootRoute({ + component: () => ( + <> + Root route + + + ), + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render(() => ) + + expect(await screen.findByText('Index route')).toBeInTheDocument() + expect(warn).not.toHaveBeenCalled() +}) + +test('warns when Outlet is rendered inside a pendingComponent', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const pending = createControlledPromise() + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const pendingRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/pending', + loader: () => pending, + pendingMs: 0, + pendingComponent: () => ( + <> + Pending route + + + ), + component: () => Resolved route, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, pendingRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render(() => ) + await screen.findByText('Index route') + + const navigation = router.navigate({ to: '/pending' }) + expect(await screen.findByText('Pending route')).toBeInTheDocument() + pending.resolve() + await navigation + + expect(warn).toHaveBeenCalledWith(outletWarning('pendingComponent')) +}) + +test('warns when Outlet is rendered inside an errorComponent', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + loader: () => { + throw new Error('Loader failed') + }, + errorComponent: () => ( + <> + Error route + + + ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render(() => ) + + expect(await screen.findByText('Error route')).toBeInTheDocument() + expect(warn).toHaveBeenCalledWith(outletWarning('errorComponent')) +}) + +test('warns when Outlet is rendered inside a notFoundComponent', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const notFoundRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/not-found', + component: () => { + throw notFound() + }, + notFoundComponent: () => ( + <> + Not found route + + + ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, notFoundRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render(() => ) + await screen.findByText('Index route') + await router.navigate({ to: '/not-found' }) + + expect(await screen.findByText('Not found route')).toBeInTheDocument() + expect(warn).toHaveBeenCalledWith(outletWarning('notFoundComponent')) +}) diff --git a/packages/solid-router/tests/fileRoute.test.ts b/packages/solid-router/tests/fileRoute.test.ts index f6b92298c8e..5d459d1b7ed 100644 --- a/packages/solid-router/tests/fileRoute.test.ts +++ b/packages/solid-router/tests/fileRoute.test.ts @@ -1,13 +1,38 @@ /* eslint-disable */ -import { describe, it, expect } from 'vitest' +import { afterEach, describe, it, expect, vi } from 'vitest' import { getRouteApi, createFileRoute, createLazyRoute, createLazyFileRoute, LazyRoute, + FileRoute, } from '../src' +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('createFileRoute', () => { + it('creates a non-root route without a deprecation warning', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = createFileRoute('')({}) + + expect(route.isRoot).toBe(false) + expect(warn).not.toHaveBeenCalled() + }) + + it('keeps the deprecation warning for direct FileRoute usage', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = new FileRoute('').createRoute({}) + + expect(route.isRoot).toBe(false) + expect(warn).toHaveBeenCalledOnce() + }) +}) + describe('createFileRoute has the same hooks as getRouteApi', () => { const routeApi = getRouteApi('foo') const hookNames = Object.keys(routeApi).filter((key) => key.startsWith('use')) diff --git a/packages/solid-router/tests/issue-7964-param-parsing-loader.test.tsx b/packages/solid-router/tests/issue-7964-param-parsing-loader.test.tsx new file mode 100644 index 00000000000..ca49ad1dc7b --- /dev/null +++ b/packages/solid-router/tests/issue-7964-param-parsing-loader.test.tsx @@ -0,0 +1,102 @@ +import { cleanup, render, screen, waitFor } from '@solidjs/testing-library' +import { afterEach, expect, test } from 'vitest' +import { + Outlet, + RouterProvider, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +afterEach(() => { + cleanup() +}) + +// https://github.com/TanStack/router/issues/7964 +test('#7964: a child loader receives fresh structured params after revisiting its route', async () => { + const rootRoute = createRootRoute({ + component: Outlet, + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () =>
Home page
, + }) + const parsedParamRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/$parsedParam', + params: { + parse: ({ parsedParam }) => { + const [recordName, revisionNumber] = parsedParam.split('-') + return { + parsedParam: { + recordName: recordName!, + revisionNumber: Number(revisionNumber), + }, + } + }, + stringify: ({ parsedParam }) => ({ + parsedParam: `${parsedParam.recordName}-${parsedParam.revisionNumber}`, + }), + }, + component: Outlet, + }) + const parsedParamIndexRoute = createRoute({ + getParentRoute: () => parsedParamRoute, + path: '/', + loader: ({ params }) => params.parsedParam.revisionNumber * 100, + component: () => { + const params = parsedParamIndexRoute.useParams() + const loaderData = parsedParamIndexRoute.useLoaderData() + + return ( + <> +
+ Params have {params().parsedParam.recordName} with revision{' '} + {params().parsedParam.revisionNumber} +
+
Loader data is {loaderData()}
+ + ) + }, + }) + const routeTree = rootRoute.addChildren([ + indexRoute, + parsedParamRoute.addChildren([parsedParamIndexRoute]), + ]) + const router = createRouter({ + routeTree, + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render(() => ) + + await router.navigate({ + to: '/$parsedParam', + params: { parsedParam: { recordName: 'blue', revisionNumber: 1 } }, + }) + expect( + await screen.findByText('Params have blue with revision 1'), + ).toBeInTheDocument() + expect(await screen.findByText('Loader data is 100')).toBeInTheDocument() + + await router.navigate({ to: '/' }) + expect(await screen.findByText('Home page')).toBeInTheDocument() + + await router.navigate({ + to: '/$parsedParam', + params: { parsedParam: { recordName: 'red', revisionNumber: 2 } }, + }) + expect(router.state.location.pathname).toBe('/red-2') + + await waitFor(() => { + expect({ + params: screen.getByTestId('params').textContent, + loaderData: screen.getByTestId('loader-data').textContent, + }).toEqual({ + params: 'Params have red with revision 2', + loaderData: 'Loader data is 200', + }) + }) +}) diff --git a/packages/solid-router/tests/issue-7986-retained-pending.test.tsx b/packages/solid-router/tests/issue-7986-retained-pending.test.tsx new file mode 100644 index 00000000000..db0092610c0 --- /dev/null +++ b/packages/solid-router/tests/issue-7986-retained-pending.test.tsx @@ -0,0 +1,630 @@ +import { cleanup, render, screen, waitFor } from '@solidjs/testing-library' +import { afterEach, expect, test, vi } from 'vitest' +import { createControlledPromise } from '@tanstack/router-core' +import { + Outlet, + RouterProvider, + createLazyRoute, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' +import type { ControlledPromise } from '@tanstack/router-core' + +const controlledPromises = new Set>() +const pendingOperations = new Set>() + +afterEach(async () => { + try { + for (const promise of controlledPromises) { + if (promise.status === 'pending') { + promise.resolve() + } + } + if (vi.isFakeTimers()) { + await vi.runAllTimersAsync() + } + await Promise.allSettled(pendingOperations) + } finally { + controlledPromises.clear() + pendingOperations.clear() + cleanup() + vi.useRealTimers() + vi.restoreAllMocks() + } +}) + +const navigationDelay = 100 + +function delayNavigation() { + return new Promise((resolve) => setTimeout(resolve, navigationDelay)) +} + +function controlled() { + const promise = createControlledPromise() + controlledPromises.add(promise) + return promise +} + +function track(operation: Promise) { + pendingOperations.add(operation) + return operation +} + +function setup() { + const navigationBeforeLoadStarted = controlled() + let beforeLoadCalls = 0 + + const rootRoute = createRootRoute({ component: () => }) + const layoutRoute = createRoute({ + getParentRoute: () => rootRoute, + id: 'app', + beforeLoad: async () => { + if (++beforeLoadCalls > 1) { + navigationBeforeLoadStarted.resolve() + await delayNavigation() + } + return { user: 'test' } + }, + component: () => , + }) + const projectRoute = createRoute({ + getParentRoute: () => layoutRoute, + path: '/projects/$projectId', + validateSearch: (search: Record): { tab?: string } => + typeof search.tab === 'string' ? { tab: search.tab } : {}, + component: Project, + }) + + function Project() { + const params = projectRoute.useParams() + const search = projectRoute.useSearch() + return ( +
+ project={params().projectId} tab={search().tab ?? 'default'} +
+ ) + } + + const router = createRouter({ + routeTree: rootRoute.addChildren([layoutRoute.addChildren([projectRoute])]), + history: createMemoryHistory({ initialEntries: ['/projects/p1'] }), + defaultPendingComponent: () =>
Pending
, + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + return { router, navigationBeforeLoadStarted } +} + +test('a search-only navigation retains successful UI while beforeLoad reruns', async () => { + const { router, navigationBeforeLoadStarted } = setup() + render(() => ) + expect(await screen.findByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + + vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) + const navigation = track( + router.navigate({ + to: '/projects/$projectId', + params: { projectId: 'p1' }, + search: { tab: 'files' }, + }), + ) + await navigationBeforeLoadStarted + + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(0) + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(navigationDelay) + await navigation + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=files', + ) +}) + +test('a path-param navigation retains successful UI while beforeLoad reruns', async () => { + const { router, navigationBeforeLoadStarted } = setup() + render(() => ) + expect(await screen.findByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + + vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) + const navigation = track( + router.navigate({ + to: '/projects/$projectId', + params: { projectId: 'p2' }, + }), + ) + await navigationBeforeLoadStarted + + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(0) + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(navigationDelay) + await navigation + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p2 tab=default', + ) +}) + +test('a blocking reload retains the exact successful match', async () => { + const reloadStarted = controlled() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ component: () => }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + validateSearch: (search: Record): { tab?: string } => + typeof search.tab === 'string' ? { tab: search.tab } : {}, + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (++loaderCalls === 1) { + return 'initial' + } + reloadStarted.resolve() + return delayNavigation().then(() => 'reloaded') + }, + }, + component: () => ( +
+ {pageRoute.useLoaderData()()} tab= + {pageRoute.useSearch()().tab ?? 'default'} +
+ ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingComponent: () =>
Pending
, + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render(() => ) + expect(await screen.findByTestId('content')).toHaveTextContent( + 'initial tab=default', + ) + + vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) + const navigation = track( + router.navigate({ + to: '/page', + search: { tab: 'files' }, + }), + ) + await reloadStarted + + const contentWhileLoading = screen.getByTestId('content') + expect(contentWhileLoading).toBeVisible() + expect(contentWhileLoading).toHaveTextContent('initial tab=default') + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(0) + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('initial tab=default') + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(navigationDelay) + await navigation + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent('reloaded tab=files') +}) + +test('a cached success retries through pending UI when an error is mounted', async () => { + vi.spyOn(console, 'error').mockImplementation(() => {}) + vi.spyOn(console, 'warn').mockImplementation(() => {}) + const retryStarted = controlled() + const retry = controlled() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ component: () => }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + loaderCalls++ + if (loaderCalls === 1) { + throw new Error('initial load failed') + } + if (loaderCalls === 2) { + return 'preloaded' + } + retryStarted.resolve() + return retry.then(() => 'retried') + }, + }, + component: () => ( +
{pageRoute.useLoaderData()()}
+ ), + pendingComponent: () =>
Pending
, + errorComponent: () =>
Failed
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render(() => ) + expect(await screen.findByTestId('error')).toBeInTheDocument() + + await router.preloadRoute({ to: '/page' }) + expect(loaderCalls).toBe(2) + expect(screen.getByTestId('error')).toBeInTheDocument() + + const navigation = track(router.navigate({ to: '/page' })) + await retryStarted + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.queryByTestId('error')).not.toBeInTheDocument() + + retry.resolve() + await navigation + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('retried') +}) + +test('a cache-only success retries through pending UI over mounted success', async () => { + const retryStarted = controlled() + const retry = controlled() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ component: () => }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + const generation = ++loaderCalls + if (generation === 3) { + retryStarted.resolve() + return retry.then(() => `generation ${generation}`) + } + return `generation ${generation}` + }, + }, + component: () => ( +
{pageRoute.useLoaderData()()}
+ ), + pendingComponent: () =>
Pending
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render(() => ) + expect(await screen.findByTestId('content')).toHaveTextContent('generation 1') + + await router.preloadRoute({ to: '/page' }) + expect(loaderCalls).toBe(2) + expect(screen.getByTestId('content')).toHaveTextContent('generation 1') + + const navigation = track(router.navigate({ to: '/page' })) + await retryStarted + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.queryByTestId('content')).not.toBeInTheDocument() + + retry.resolve() + await navigation + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent('generation 3') +}) + +test('a success hidden below an error boundary retries through pending UI', async () => { + vi.spyOn(console, 'error').mockImplementation(() => {}) + vi.spyOn(console, 'warn').mockImplementation(() => {}) + const childReloadStarted = controlled() + const childReload = controlled() + let parentFails = false + let childReloads = false + + const rootRoute = createRootRoute({ component: () => }) + const parentRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/parent', + shouldReload: true, + loader: () => { + if (parentFails) { + throw new Error('parent failed') + } + return 'parent data' + }, + component: () => , + errorComponent: () =>
Parent failed
, + }) + const childRoute = createRoute({ + getParentRoute: () => parentRoute, + path: '/child', + shouldReload: () => childReloads, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (childReloads) { + childReloadStarted.resolve() + return childReload.then(() => 'reloaded child') + } + return 'initial child' + }, + }, + component: () => ( +
{childRoute.useLoaderData()()}
+ ), + pendingComponent: () =>
Pending child
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([parentRoute.addChildren([childRoute])]), + history: createMemoryHistory({ initialEntries: ['/parent/child'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render(() => ) + expect(await screen.findByTestId('content')).toHaveTextContent( + 'initial child', + ) + + parentFails = true + await track(router.navigate({ to: '/parent/child' })) + expect(await screen.findByTestId('error')).toBeInTheDocument() + + parentFails = false + childReloads = true + const navigation = track(router.navigate({ to: '/parent/child' })) + await childReloadStarted + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.queryByTestId('error')).not.toBeInTheDocument() + + childReload.resolve() + await navigation + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('reloaded child') +}) + +test('a global not-found destination does not retain the mounted root success', async () => { + const missingStarted = controlled() + const missingLoader = controlled() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (++loaderCalls === 1) { + return 'initial root' + } + missingStarted.resolve() + return missingLoader + }, + }, + component: () => , + pendingComponent: () =>
Pending root
, + notFoundComponent: () =>
Missing
, + }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + component: () =>
Page
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render(() => ) + expect(await screen.findByTestId('content')).toBeInTheDocument() + + const navigation = track(router.navigate({ to: '/missing' } as any)) + await missingStarted + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.queryByTestId('content')).not.toBeInTheDocument() + + missingLoader.resolve() + await navigation + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('missing')).toBeVisible() +}) + +test('lazy fuzzy-boundary relocation retains the mounted parent', async () => { + const lazyStarted = controlled() + const lazyRoute = controlled() + const parentReloadStarted = controlled() + const parentReload = controlled() + let parentLoads = 0 + + const rootRoute = createRootRoute({ + component: () => , + notFoundComponent: () =>
Root missing
, + }) + const parentRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/parent', + beforeLoad: async () => { + if (++parentLoads > 1) { + parentReloadStarted.resolve() + await parentReload + } + }, + component: () => ( +
+
Parent content
+ +
+ ), + pendingComponent: () => ( +
Parent pending
+ ), + notFoundComponent: () => ( +
Parent missing
+ ), + }) + const childRoute = createRoute({ + getParentRoute: () => parentRoute, + path: '/child', + }).lazy(async () => { + lazyStarted.resolve() + await lazyRoute + return createLazyRoute('/parent/child')({ + notFoundComponent: () => ( +
Child missing
+ ), + }) + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([parentRoute.addChildren([childRoute])]), + history: createMemoryHistory({ initialEntries: ['/parent'] }), + defaultPendingComponent: () => ( +
Pending
+ ), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render(() => ) + expect(await screen.findByTestId('parent-content')).toBeVisible() + + const navigation = track( + router.navigate({ to: '/parent/child/missing' as any }), + ) + await lazyStarted + + expect(screen.getByTestId('parent-content')).toBeVisible() + expect(screen.queryByTestId('parent-pending')).not.toBeInTheDocument() + expect(screen.queryByTestId('parent-missing')).not.toBeInTheDocument() + + lazyRoute.resolve() + await parentReloadStarted + + expect(screen.getByTestId('parent-content')).toBeVisible() + expect(screen.queryByTestId('parent-pending')).not.toBeInTheDocument() + expect(screen.queryByTestId('parent-missing')).not.toBeInTheDocument() + + parentReload.resolve() + await navigation + + expect(screen.getByTestId('child-missing')).toBeVisible() + expect(screen.queryByTestId('root-missing')).not.toBeInTheDocument() + expect(screen.queryByTestId('parent-missing')).not.toBeInTheDocument() +}) + +test('a superseding navigation replaces an unrelated pending presentation', async () => { + const otherStarted = controlled() + const otherLoader = controlled() + const pageReloadStarted = controlled() + const pageReload = controlled() + let pageLoads = 0 + + const rootRoute = createRootRoute({ component: () => }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (++pageLoads === 1) { + return 'initial page' + } + pageReloadStarted.resolve() + return pageReload.then(() => 'reloaded page') + }, + }, + component: () => ( +
{pageRoute.useLoaderData()()}
+ ), + pendingComponent: () =>
Page pending
, + }) + const otherRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/other', + loader: async () => { + otherStarted.resolve() + await otherLoader + }, + pendingComponent: () => ( +
Other pending
+ ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute, otherRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render(() => ) + expect(await screen.findByTestId('content')).toHaveTextContent('initial page') + + const otherNavigation = track(router.navigate({ to: '/other' })) + await otherStarted + expect(await screen.findByTestId('other-pending')).toBeVisible() + + const navigation = track(router.navigate({ to: '/page' })) + await pageReloadStarted + + await waitFor(() => { + expect(screen.getByTestId('page-pending')).toBeVisible() + expect(screen.queryByTestId('other-pending')).not.toBeInTheDocument() + }) + + pageReload.resolve() + await navigation + otherLoader.resolve() + await otherNavigation + + expect(screen.queryByTestId('page-pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('reloaded page') +}) diff --git a/packages/solid-router/tests/link.test.tsx b/packages/solid-router/tests/link.test.tsx index 67596e744bd..f4de9b831c7 100644 --- a/packages/solid-router/tests/link.test.tsx +++ b/packages/solid-router/tests/link.test.tsx @@ -44,12 +44,16 @@ import type { JSX } from '@solidjs/web' const ioObserveMock = vi.fn() const ioDisconnectMock = vi.fn() +let ioCallback: IntersectionObserverCallback let history: RouterHistory beforeEach(() => { const io = getIntersectionObserverMock({ observe: ioObserveMock, disconnect: ioDisconnectMock, + onCreate: (callback) => { + ioCallback = callback + }, }) vi.stubGlobal('IntersectionObserver', io) history = createBrowserHistory() @@ -57,6 +61,7 @@ beforeEach(() => { }) afterEach(() => { + vi.useRealTimers() history.destroy?.() window.history.replaceState(null, 'root', '/') vi.resetAllMocks() @@ -4999,6 +5004,128 @@ describe('Link', () => { expect(ioDisconnectMock).not.toHaveBeenCalled() // it should not disconnect again }) + test('Link.preload="viewport" should respect preloadDelay', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => ( + <> + + Viewport Link + + + Intent Link + + + ), + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, aboutRoute]), + history, + }) + const preloadRouteSpy = vi.spyOn(router, 'preloadRoute') + + render(() => ) + + const viewportLink = await screen.findByRole('link', { + name: 'Viewport Link', + }) + const intentLink = await screen.findByRole('link', { name: 'Intent Link' }) + vi.useFakeTimers() + + ioCallback([], {} as IntersectionObserver) + ioCallback( + [ + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).not.toHaveBeenCalled() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + fireEvent.mouseLeave(viewportLink) + + expect(preloadRouteSpy).not.toHaveBeenCalled() + await vi.advanceTimersByTimeAsync(49) + expect(preloadRouteSpy).not.toHaveBeenCalled() + await vi.advanceTimersByTimeAsync(1) + expect(preloadRouteSpy).toHaveBeenCalledOnce() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).toHaveBeenCalledOnce() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(49) + + ioCallback( + [ + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(1) + expect(preloadRouteSpy).toHaveBeenCalledTimes(2) + + fireEvent.mouseEnter(intentLink) + fireEvent.mouseLeave(intentLink) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).toHaveBeenCalledTimes(2) + }) + test("Router.preload='render', should trigger the route loader on render", async () => { const mock = vi.fn() diff --git a/packages/solid-router/tests/remountDeps.test.tsx b/packages/solid-router/tests/remountDeps.test.tsx new file mode 100644 index 00000000000..991ee786f3e --- /dev/null +++ b/packages/solid-router/tests/remountDeps.test.tsx @@ -0,0 +1,99 @@ +import * as Solid from 'solid-js' +import { cleanup, render, screen } from '@solidjs/testing-library' +import { afterEach, expect, test, vi } from 'vitest' +import { + Outlet, + RouterProvider, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +afterEach(() => { + cleanup() +}) + +function setup(remountOnParams: boolean | 'falsy' = false) { + const mounted = vi.fn() + const unmounted = vi.fn() + const rootRoute = createRootRoute({ component: () => }) + + function ItemComponent() { + const params = itemRoute.useParams() + + Solid.onMount(mounted) + Solid.onCleanup(unmounted) + + return
Item {params().itemId}
+ } + + const itemRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/items/$itemId', + component: ItemComponent, + remountDeps: + remountOnParams === 'falsy' + ? ({ params }) => (params.itemId === 'one' ? false : 0) + : remountOnParams + ? ({ params }) => params + : undefined, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([itemRoute]), + history: createMemoryHistory({ initialEntries: ['/items/one'] }), + }) + + render(() => ) + + return { mounted, router, unmounted } +} + +async function navigateToSecondItem( + router: ReturnType['router'], +) { + await router.navigate({ + to: '/items/$itemId', + params: { itemId: 'two' }, + }) +} + +test('keeps an active route component mounted when params change by default', async () => { + const { mounted, router, unmounted } = setup() + + expect(await screen.findByText('Item one')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(1) + expect(unmounted).not.toHaveBeenCalled() + + await navigateToSecondItem(router) + + expect(await screen.findByText('Item two')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(1) + expect(unmounted).not.toHaveBeenCalled() +}) + +test('remounts an active route component when params are remount deps', async () => { + const { mounted, router, unmounted } = setup(true) + + expect(await screen.findByText('Item one')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(1) + + await navigateToSecondItem(router) + + expect(await screen.findByText('Item two')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(2) + expect(unmounted).toHaveBeenCalledTimes(1) +}) + +test('remounts when remount deps change between falsy values', async () => { + const { mounted, router, unmounted } = setup('falsy') + + expect(await screen.findByText('Item one')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(1) + + await navigateToSecondItem(router) + + expect(await screen.findByText('Item two')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(2) + expect(unmounted).toHaveBeenCalledTimes(1) +}) diff --git a/packages/solid-router/tests/utils.ts b/packages/solid-router/tests/utils.ts index 6c11bea20a8..668cc9deb6a 100644 --- a/packages/solid-router/tests/utils.ts +++ b/packages/solid-router/tests/utils.ts @@ -20,9 +20,11 @@ export function createTimer() { export const getIntersectionObserverMock = ({ observe, disconnect, + onCreate, }: { observe: Mock disconnect: Mock + onCreate?: (callback: IntersectionObserverCallback) => void }) => { return class IO implements IntersectionObserver { root: Document | Element | null @@ -33,6 +35,7 @@ export const getIntersectionObserverMock = ({ _cb: IntersectionObserverCallback, options?: IntersectionObserverInit, ) { + onCreate?.(_cb) this.root = options?.root ?? null this.rootMargin = options?.rootMargin ?? '0px' this.scrollMargin = options?.scrollMargin ?? '0px' diff --git a/packages/solid-router/vite.config.ts b/packages/solid-router/vite.config.ts index 5281d0561b1..a9d2a99384d 100644 --- a/packages/solid-router/vite.config.ts +++ b/packages/solid-router/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/vite-config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import packageJson from './package.json' import type { ViteUserConfig } from 'vitest/config' diff --git a/packages/solid-start-client/CHANGELOG.md b/packages/solid-start-client/CHANGELOG.md index 52c2c67b48c..e55144b212a 100644 --- a/packages/solid-start-client/CHANGELOG.md +++ b/packages/solid-start-client/CHANGELOG.md @@ -1,5 +1,20 @@ # @tanstack/solid-start-client +## 2.0.0-rc.0 + +### Patch Changes + +- [#8058](https://github.com/TanStack/router/pull/8058) [`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713) - Upgrade `solid-js` and `@solidjs/web` to `2.0.0-rc.0`, and migrate from `vite-plugin-solid` to its new name `@solidjs/vite-plugin` at `3.0.0-next.28` + + `vite-plugin-solid` was renamed to `@solidjs/vite-plugin`; its final release (`3.0.0-next.27`) is a re-export shim over the new package. `@solidjs/vite-plugin@3.0.0-next.28` requires `solid-js`/`@solidjs/web` `^2.0.0-rc.0`, so the rename and the `rc` bump land together. + + `@tanstack/router-plugin` is intentionally untouched: it detects the Solid JSX plugin by its Vite plugin _name_ (`solid`), which the renamed package still registers, and its `vite-plugin-solid` peer is optional — so it keeps working for both Solid 1 and Solid 2 consumers without a change. + + Also bumps `@tanstack/solid-query` and `@tanstack/solid-query-devtools` to `^6.0.0-rc.0` (whose peer requires `solid-js >=2.0.0-rc.0`), and converges `@tanstack/query-core` on `5.101.4` — `solid-query` depends on query-core `5.101.0`, which previously resolved to a stale `5.99.0` and produced two incompatible `QueryClient` types. + +- Updated dependencies [[`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713)]: + - @tanstack/solid-router@2.0.0-rc.0 + ## 2.0.0-beta.30 ### Patch Changes diff --git a/packages/solid-start-client/package.json b/packages/solid-start-client/package.json index 4003dad49ce..072c5f9f9e3 100644 --- a/packages/solid-start-client/package.json +++ b/packages/solid-start-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-start-client", - "version": "2.0.0-beta.30", + "version": "2.0.0-rc.0", "description": "Modern and scalable routing for Solid applications", "author": "Tanner Linsley", "license": "MIT", @@ -77,11 +77,11 @@ }, "devDependencies": { "@solidjs/testing-library": "^0.8.10", - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@solidjs/web": "^2.0.0-rc.0", "@testing-library/jest-dom": "^6.6.3", - "solid-js": "2.0.0-beta.32", - "vite": "*", - "vite-plugin-solid": "^3.0.0-next.23" + "solid-js": "^2.0.0-rc.0", + "vite": "*" }, "peerDependencies": { "@solidjs/web": ">=2.0.0-0 <3.0.0", diff --git a/packages/solid-start-client/src/GenericHydrate.tsx b/packages/solid-start-client/src/GenericHydrate.tsx index 6b601fb9e1e..9026a843942 100644 --- a/packages/solid-start-client/src/GenericHydrate.tsx +++ b/packages/solid-start-client/src/GenericHydrate.tsx @@ -34,10 +34,10 @@ type HydrationMarkerDynamicProps = DynamicProps<'div'> & { [key: `data-${string}`]: string | undefined } type PrefetchController = { - abortController: AbortController - hydrationRequested: boolean - hydrationListeners: Set<() => void> - hydrationResolvePending: boolean + abort: AbortController + requested: boolean + listeners: Set<() => void> + resolvePending: boolean started: boolean promise?: Promise } @@ -110,10 +110,10 @@ export function GenericHydrate(props: InternalHydrateProps) { ) const [prefetchError, setPrefetchError] = Solid.createSignal() const controller: PrefetchController = { - abortController: new AbortController(), - hydrationRequested: false, - hydrationListeners: new Set<() => void>(), - hydrationResolvePending: false, + abort: new AbortController(), + requested: false, + listeners: new Set<() => void>(), + resolvePending: false, started: false, } let didPrefetch = false @@ -151,35 +151,35 @@ export function GenericHydrate(props: InternalHydrateProps) { } const onHydrate = (listener: () => void) => { - if (controller.hydrationRequested) { + if (controller.requested) { listener() return () => {} } - controller.hydrationListeners.add(listener) + controller.listeners.add(listener) return () => { - controller.hydrationListeners.delete(listener) + controller.listeners.delete(listener) } } const requestHydration = () => { - if (!controller.hydrationRequested) { - controller.hydrationRequested = true - controller.hydrationListeners.forEach((listener) => listener()) - controller.hydrationListeners.clear() + if (!controller.requested) { + controller.requested = true + controller.listeners.forEach((listener) => listener()) + controller.listeners.clear() } if (!controller.promise) { resolveGate() return } - if (controller.hydrationResolvePending) return - controller.hydrationResolvePending = true + if (controller.resolvePending) return + controller.resolvePending = true controller.promise.then( () => resolveGate(), (error) => { - if (!controller.abortController.signal.aborted) { + if (!controller.abort.signal.aborted) { setPrefetchError(() => error) } }, @@ -188,8 +188,8 @@ export function GenericHydrate(props: InternalHydrateProps) { const resolveGate = gate.resolve Solid.onCleanup(() => { - controller.abortController.abort() - controller.hydrationListeners.clear() + controller.abort.abort() + controller.listeners.clear() cleanupHydrationRuntime() if (!didReleaseGate) { didReleaseGate = true @@ -243,12 +243,12 @@ export function GenericHydrate(props: InternalHydrateProps) { .then(() => currentPrefetchStrategy({ element: markerElement ?? null, - signal: controller.abortController.signal, + signal: controller.abort.signal, preload, waitFor: (strategy) => waitForHydrationPrefetchStrategy(strategy, { element: markerElement ?? null, - signal: controller.abortController.signal, + signal: controller.abort.signal, onHydrate, }), }), @@ -257,7 +257,7 @@ export function GenericHydrate(props: InternalHydrateProps) { controller.promise = promise promise.catch((error) => { - if (!controller.abortController.signal.aborted) { + if (!controller.abort.signal.aborted) { setPrefetchError(() => error) } }) diff --git a/packages/solid-start-client/vite.config.ts b/packages/solid-start-client/vite.config.ts index dbfb60ea039..973f4721a29 100644 --- a/packages/solid-start-client/vite.config.ts +++ b/packages/solid-start-client/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/vite-config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import packageJson from './package.json' import type { ViteUserConfig } from 'vitest/config' diff --git a/packages/solid-start-server/CHANGELOG.md b/packages/solid-start-server/CHANGELOG.md index f8c0af403ec..9b7449ac354 100644 --- a/packages/solid-start-server/CHANGELOG.md +++ b/packages/solid-start-server/CHANGELOG.md @@ -1,5 +1,20 @@ # @tanstack/solid-start-server +## 2.0.0-rc.0 + +### Patch Changes + +- [#8058](https://github.com/TanStack/router/pull/8058) [`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713) - Upgrade `solid-js` and `@solidjs/web` to `2.0.0-rc.0`, and migrate from `vite-plugin-solid` to its new name `@solidjs/vite-plugin` at `3.0.0-next.28` + + `vite-plugin-solid` was renamed to `@solidjs/vite-plugin`; its final release (`3.0.0-next.27`) is a re-export shim over the new package. `@solidjs/vite-plugin@3.0.0-next.28` requires `solid-js`/`@solidjs/web` `^2.0.0-rc.0`, so the rename and the `rc` bump land together. + + `@tanstack/router-plugin` is intentionally untouched: it detects the Solid JSX plugin by its Vite plugin _name_ (`solid`), which the renamed package still registers, and its `vite-plugin-solid` peer is optional — so it keeps working for both Solid 1 and Solid 2 consumers without a change. + + Also bumps `@tanstack/solid-query` and `@tanstack/solid-query-devtools` to `^6.0.0-rc.0` (whose peer requires `solid-js >=2.0.0-rc.0`), and converges `@tanstack/query-core` on `5.101.4` — `solid-query` depends on query-core `5.101.0`, which previously resolved to a stale `5.99.0` and produced two incompatible `QueryClient` types. + +- Updated dependencies [[`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713)]: + - @tanstack/solid-router@2.0.0-rc.0 + ## 2.0.0-beta.30 ### Patch Changes diff --git a/packages/solid-start-server/package.json b/packages/solid-start-server/package.json index 640510075ee..de8d26c3952 100644 --- a/packages/solid-start-server/package.json +++ b/packages/solid-start-server/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-start-server", - "version": "2.0.0-beta.30", + "version": "2.0.0-rc.0", "description": "Modern and scalable routing for Solid applications", "author": "Tanner Linsley", "license": "MIT", @@ -63,12 +63,12 @@ "@tanstack/start-server-core": "workspace:*" }, "devDependencies": { - "@solidjs/web": "2.0.0-beta.32", - "solid-js": "2.0.0-beta.32", + "@solidjs/vite-plugin": "^3.0.0-next.28", + "@solidjs/web": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2", - "vite": "*", - "vite-plugin-solid": "^3.0.0-next.23" + "vite": "*" }, "peerDependencies": { "@solidjs/web": ">=2.0.0-0 <3.0.0", diff --git a/packages/solid-start-server/vite.config.ts b/packages/solid-start-server/vite.config.ts index 9115434d50e..3b6c4132583 100644 --- a/packages/solid-start-server/vite.config.ts +++ b/packages/solid-start-server/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/vite-config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import packageJson from './package.json' const config = defineConfig({ diff --git a/packages/solid-start/CHANGELOG.md b/packages/solid-start/CHANGELOG.md index 080c1fbf8a7..c8698b08e2f 100644 --- a/packages/solid-start/CHANGELOG.md +++ b/packages/solid-start/CHANGELOG.md @@ -1,5 +1,22 @@ # @tanstack/solid-start +## 2.0.0-rc.0 + +### Patch Changes + +- [#8058](https://github.com/TanStack/router/pull/8058) [`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713) - Upgrade `solid-js` and `@solidjs/web` to `2.0.0-rc.0`, and migrate from `vite-plugin-solid` to its new name `@solidjs/vite-plugin` at `3.0.0-next.28` + + `vite-plugin-solid` was renamed to `@solidjs/vite-plugin`; its final release (`3.0.0-next.27`) is a re-export shim over the new package. `@solidjs/vite-plugin@3.0.0-next.28` requires `solid-js`/`@solidjs/web` `^2.0.0-rc.0`, so the rename and the `rc` bump land together. + + `@tanstack/router-plugin` is intentionally untouched: it detects the Solid JSX plugin by its Vite plugin _name_ (`solid`), which the renamed package still registers, and its `vite-plugin-solid` peer is optional — so it keeps working for both Solid 1 and Solid 2 consumers without a change. + + Also bumps `@tanstack/solid-query` and `@tanstack/solid-query-devtools` to `^6.0.0-rc.0` (whose peer requires `solid-js >=2.0.0-rc.0`), and converges `@tanstack/query-core` on `5.101.4` — `solid-query` depends on query-core `5.101.0`, which previously resolved to a stale `5.99.0` and produced two incompatible `QueryClient` types. + +- Updated dependencies [[`56cc90e`](https://github.com/TanStack/router/commit/56cc90ea2c29b8d8c3aa21252b60f0995083b713)]: + - @tanstack/solid-router@2.0.0-rc.0 + - @tanstack/solid-start-client@2.0.0-rc.0 + - @tanstack/solid-start-server@2.0.0-rc.0 + ## 2.0.0-beta.31 ### Patch Changes diff --git a/packages/solid-start/package.json b/packages/solid-start/package.json index b1b7c58c17d..8a57325acf4 100644 --- a/packages/solid-start/package.json +++ b/packages/solid-start/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-start", - "version": "2.0.0-beta.31", + "version": "2.0.0-rc.0", "description": "Modern and scalable routing for Solid applications", "author": "Tanner Linsley", "license": "MIT", @@ -128,10 +128,10 @@ }, "devDependencies": { "@rsbuild/core": "^2.1.0", - "@solidjs/web": "2.0.0-beta.32", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/router-utils": "workspace:*", "@types/node": ">=20", - "solid-js": "2.0.0-beta.32", + "solid-js": "^2.0.0-rc.0", "vite": "*" }, "peerDependencies": { diff --git a/packages/solid-start/skills/solid-start/SKILL.md b/packages/solid-start/skills/solid-start/SKILL.md index d00ca60f453..0e78c779b14 100644 --- a/packages/solid-start/skills/solid-start/SKILL.md +++ b/packages/solid-start/skills/solid-start/SKILL.md @@ -45,7 +45,7 @@ Server utilities (`getRequest`, `getRequestHeader`, `setResponseHeader`, `setCoo ```bash npm i @tanstack/solid-start @tanstack/solid-router solid-js -npm i -D vite vite-plugin-solid typescript +npm i -D vite @solidjs/vite-plugin typescript ``` ### 2. package.json @@ -82,7 +82,7 @@ npm i -D vite vite-plugin-solid typescript ```ts import { defineConfig } from 'vite' import { tanstackStart } from '@tanstack/solid-start/plugin/vite' -import solidPlugin from 'vite-plugin-solid' +import solidPlugin from '@solidjs/vite-plugin' export default defineConfig({ plugins: [ diff --git a/packages/solid-start/src/plugin/vite.ts b/packages/solid-start/src/plugin/vite.ts index 50e03fc7215..a72c918c6f8 100644 --- a/packages/solid-start/src/plugin/vite.ts +++ b/packages/solid-start/src/plugin/vite.ts @@ -9,7 +9,7 @@ import type { } from '@tanstack/start-plugin-core/vite' import type { PluginOption } from 'vite' -// vite-plugin-solid's client-assets manifest: resolves the module keys its +// @solidjs/vite-plugin's client-assets manifest: resolves the module keys its // compiler bakes into lazy() calls to client JS/CSS assets — a live resolver // over the dev module graph in dev, the client build's `.vite/manifest.json` // in builds. Solid's server renderer consumes either shape natively. @@ -95,7 +95,7 @@ export function tanstackStart( return undefined } - // Only swap when the installed vite-plugin-solid actually registers + // Only swap when the installed @solidjs/vite-plugin actually registers // the virtual module (older versions don't) — otherwise keep the // inert stub. const resolved = await this.resolve(SOLID_MANIFEST_ID, id) diff --git a/packages/start-client-core/CHANGELOG.md b/packages/start-client-core/CHANGELOG.md index 9c4a205bacf..b127886d0bc 100644 --- a/packages/start-client-core/CHANGELOG.md +++ b/packages/start-client-core/CHANGELOG.md @@ -1,5 +1,67 @@ # @tanstack/start-client-core +## 1.170.22 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13)]: + - @tanstack/router-core@1.171.22 + - @tanstack/start-storage-context@1.167.24 + +## 1.170.21 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + - @tanstack/start-storage-context@1.167.23 + +## 1.170.20 + +### Patch Changes + +- [#8009](https://github.com/TanStack/router/pull/8009) [`c59788c`](https://github.com/TanStack/router/commit/c59788ca20f2d2e7f264a859ebe01b7646ba3154) - perf: drop consumed chunks from the client frame decoder buffer with an O(1) head pointer instead of `Array.prototype.shift()` (O(n)). The previous approach degraded to O(n^2) when a single large frame (e.g. a big `RawStream` payload) was assembled from many small network reads. + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + - @tanstack/start-storage-context@1.167.22 + +## 1.170.19 + +### Patch Changes + +- [#7978](https://github.com/TanStack/router/pull/7978) [`2fbc99f`](https://github.com/TanStack/router/commit/2fbc99f2c262b057cb957e6ebba1ee073c655186) - compact private frame decoder result keys + +- [#7980](https://github.com/TanStack/router/pull/7980) [`6bede65`](https://github.com/TanStack/router/commit/6bede65d7074dcd83455151b66b4574268bc782c) - compact deferred hydration private state + +## 1.170.18 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/router-core@1.171.19 + - @tanstack/start-storage-context@1.167.21 + +## 1.170.17 + +### Patch Changes + +- [#7985](https://github.com/TanStack/router/pull/7985) [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b) - perf: compact private bundle boundaries- [#7975](https://github.com/TanStack/router/issues/7975) + +- Updated dependencies [[`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/router-core@1.171.18 + - @tanstack/start-storage-context@1.167.20 + +## 1.170.16 + +### Patch Changes + +- [#7962](https://github.com/TanStack/router/pull/7962) [`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5) - Update Seroval dependencies to version 1.6.2. + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + - @tanstack/start-storage-context@1.167.19 + ## 1.170.15 ### Patch Changes diff --git a/packages/start-client-core/package.json b/packages/start-client-core/package.json index fe83f213fd0..83cbf4746ef 100644 --- a/packages/start-client-core/package.json +++ b/packages/start-client-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/start-client-core", - "version": "1.170.15", + "version": "1.170.22", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -109,7 +109,7 @@ "@tanstack/router-core": "workspace:*", "@tanstack/start-fn-stubs": "workspace:*", "@tanstack/start-storage-context": "workspace:*", - "seroval": "^1.5.4" + "seroval": "^1.6.2" }, "devDependencies": { "vite": "*", diff --git a/packages/start-client-core/src/client-rpc/frame-decoder.ts b/packages/start-client-core/src/client-rpc/frame-decoder.ts index 9834b10a1b2..cd1a0c719fc 100644 --- a/packages/start-client-core/src/client-rpc/frame-decoder.ts +++ b/packages/start-client-core/src/client-rpc/frame-decoder.ts @@ -25,9 +25,9 @@ const MAX_FRAMES = 100_000 // Limit total frames to prevent CPU DoS */ export interface FrameDecoderResult { /** Gets or creates a raw stream by ID (for use by deserialize plugin) */ - getOrCreateStream: (id: number) => ReadableStream + getStream: (id: number) => ReadableStream /** Stream of JSON strings (NDJSON lines) */ - jsonChunks: ReadableStream + chunks: ReadableStream } /** @@ -133,8 +133,26 @@ export function createFrameDecoder( inputReader = reader const bufferList: Array = [] + // Index of the first un-consumed chunk in bufferList. Advancing this + // pointer is O(1); using bufferList.shift() to drop a consumed chunk is + // O(n) and degrades to O(n^2) when a single large frame is assembled from + // many small chunks (e.g. a big RawStream payload split across reads). + let bufferHead = 0 let totalLength = 0 + function advanceBufferHead(): void { + bufferList[bufferHead++] = EMPTY_BUFFER + + // Reset drained buffers immediately and compact long-lived buffers in batches. + if (bufferHead === bufferList.length) { + bufferList.length = 0 + bufferHead = 0 + } else if (bufferHead >= 32) { + bufferList.splice(0, bufferHead) + bufferHead = 0 + } + } + /** * Reads header bytes from buffer chunks without flattening. * Returns header data or null if not enough bytes available. @@ -146,7 +164,7 @@ export function createFrameDecoder( } | null { if (totalLength < FRAME_HEADER_SIZE) return null - const first = bufferList[0]! + const first = bufferList[bufferHead]! // Fast path: header fits entirely in first chunk (common case) if (first.length >= FRAME_HEADER_SIZE) { @@ -170,7 +188,7 @@ export function createFrameDecoder( const headerBytes = new Uint8Array(FRAME_HEADER_SIZE) let offset = 0 let remaining = FRAME_HEADER_SIZE - for (let i = 0; i < bufferList.length && remaining > 0; i++) { + for (let i = bufferHead; i < bufferList.length && remaining > 0; i++) { const chunk = bufferList[i]! const toCopy = Math.min(chunk.length, remaining) headerBytes.set(chunk.subarray(0, toCopy), offset) @@ -207,13 +225,13 @@ export function createFrameDecoder( // copying `count` bytes. The view shares the chunk's backing ArrayBuffer, // which is safe because buffered chunks are never mutated in place after // being read from the network. - const first = bufferList[0] + const first = bufferList[bufferHead] if (first && first.length >= count) { const result = first.subarray(0, count) if (first.length === count) { - bufferList.shift() + advanceBufferHead() } else { - bufferList[0] = first.subarray(count) + bufferList[bufferHead] = first.subarray(count) } totalLength -= count return result @@ -224,9 +242,8 @@ export function createFrameDecoder( let offset = 0 let remaining = count - while (remaining > 0 && bufferList.length > 0) { - const chunk = bufferList[0] - if (!chunk) break + while (remaining > 0 && bufferHead < bufferList.length) { + const chunk = bufferList[bufferHead]! const toCopy = Math.min(chunk.length, remaining) result.set(chunk.subarray(0, toCopy), offset) @@ -234,9 +251,9 @@ export function createFrameDecoder( remaining -= toCopy if (toCopy === chunk.length) { - bufferList.shift() + advanceBufferHead() } else { - bufferList[0] = chunk.subarray(toCopy) + bufferList[bufferHead] = chunk.subarray(toCopy) } } @@ -404,5 +421,5 @@ export function createFrameDecoder( } })() - return { getOrCreateStream, jsonChunks } + return { getStream: getOrCreateStream, chunks: jsonChunks } } diff --git a/packages/start-client-core/src/client-rpc/serverFnFetcher.ts b/packages/start-client-core/src/client-rpc/serverFnFetcher.ts index 2e993205bcf..2534b6bb938 100644 --- a/packages/start-client-core/src/client-rpc/serverFnFetcher.ts +++ b/packages/start-client-core/src/client-rpc/serverFnFetcher.ts @@ -157,11 +157,10 @@ export async function serverFnFetcher( let body = undefined if (first.method === 'POST') { - const fetchBody = await getFetchBody(first) - if (fetchBody?.contentType) { - headers.set('content-type', fetchBody.contentType) + body = await getFetchBody(first) + if (typeof body === 'string') { + headers.set('content-type', 'application/json') } - body = fetchBody?.body } return await getResponse(async () => @@ -204,7 +203,7 @@ async function serialize(data: any) { async function getFetchBody( opts: FunctionMiddlewareClientFnOptions, -): Promise<{ body: FormData | string; contentType?: string } | undefined> { +): Promise { if (opts.data instanceof FormData) { let serializedContext = undefined // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition @@ -214,11 +213,11 @@ async function getFetchBody( if (serializedContext !== undefined) { opts.data.set(TSS_FORMDATA_CONTEXT, serializedContext) } - return { body: opts.data } + return opts.data } const serializedBody = await serializePayload(opts) if (serializedBody) { - return { body: serializedBody, contentType: 'application/json' } + return serializedBody } return undefined } @@ -274,18 +273,15 @@ async function getResponse(fn: () => Promise) { throw new Error('No response body for framed response') } - const { getOrCreateStream, jsonChunks } = createFrameDecoder( - response.body, - ) + const { getStream, chunks } = createFrameDecoder(response.body) // Create deserialize plugin that wires up the raw streams - const rawStreamPlugin = - createRawStreamDeserializePlugin(getOrCreateStream) + const rawStreamPlugin = createRawStreamDeserializePlugin(getStream) const plugins = [rawStreamPlugin, ...(serovalPlugins || [])] const refs = new Map() result = await processFramedResponse({ - jsonStream: jsonChunks, + jsonStream: chunks, onMessage: (msg: any) => fromCrossJSON(msg, { refs, plugins }), onError(msg, error) { console.error(msg, error) diff --git a/packages/start-client-core/src/hydration/runtime.ts b/packages/start-client-core/src/hydration/runtime.ts index b1da55195d6..307487c4f97 100644 --- a/packages/start-client-core/src/hydration/runtime.ts +++ b/packages/start-client-core/src/hydration/runtime.ts @@ -115,18 +115,19 @@ export function waitForHydrationPrefetchStrategy( } return new Promise((resolve) => { - const state = { disposed: false } - const cleanupStrategyRef: { current: void | (() => void) } = { - current: undefined, - } + let disposed = false + // The strategy may finish synchronously before returning its cleanup. + let cleanupStrategy: void | (() => void) = undefined let cleanupHydrate = () => {} const finish = (reason: HydrationPrefetchWaitReason) => { - if (state.disposed) return - state.disposed = true + if (disposed) { + return + } + disposed = true options.signal.removeEventListener('abort', onAbort) cleanupHydrate() - runHydrationStrategyCleanup(cleanupStrategyRef.current)?.() + runHydrationStrategyCleanup(cleanupStrategy)?.() resolve(reason) } @@ -134,12 +135,13 @@ export function waitForHydrationPrefetchStrategy( options.signal.addEventListener('abort', onAbort, { once: true }) cleanupHydrate = options.onHydrate(() => finish('hydrate')) - const cleanupStrategy = strategy._s?.({ + cleanupStrategy = strategy._s?.({ element: options.element, prefetch: () => finish('prefetch'), }) - cleanupStrategyRef.current = cleanupStrategy - if (state.disposed) { + // A synchronous finish must immediately run the cleanup just returned. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (disposed) { runHydrationStrategyCleanup(cleanupStrategy)?.() } }) diff --git a/packages/start-client-core/src/hydration/visible.ts b/packages/start-client-core/src/hydration/visible.ts index 3c3391b1de0..27855c6d688 100644 --- a/packages/start-client-core/src/hydration/visible.ts +++ b/packages/start-client-core/src/hydration/visible.ts @@ -7,18 +7,23 @@ export type VisibleHydrationOptions = { threshold?: number | Array } -type VisibleObserverEntry = { - key: string - observer: IntersectionObserver - elements: Map void>> -} +type VisibleObserverEntry = [ + observer: IntersectionObserver, + elements: Map void>>, +] const observerRegistry = /* @__PURE__ */ new Map() -function cleanupVisibleObserverEntry(observerEntry: VisibleObserverEntry) { - if (observerEntry.elements.size > 0) return - observerEntry.observer.disconnect() - observerRegistry.delete(observerEntry.key) +function cleanupVisibleObserverEntry( + key: string, + observer: IntersectionObserver, + elements: Map void>>, +) { + if (elements.size > 0) { + return + } + observer.disconnect() + observerRegistry.delete(key) } /* @__NO_SIDE_EFFECTS__ */ @@ -44,46 +49,48 @@ export function visible( let observerEntry = observerRegistry.get(key) if (!observerEntry) { - const entry: VisibleObserverEntry = { - key, - elements: new Map void>>(), - observer: new IntersectionObserver( - (entries) => { - for (const intersectingEntry of entries) { - if (!intersectingEntry.isIntersecting) continue - - const callbacks = entry.elements.get(intersectingEntry.target) - if (!callbacks) continue + const elements = new Map void>>() + const observer = new IntersectionObserver( + (entries) => { + for (const intersectingEntry of entries) { + if (!intersectingEntry.isIntersecting) { + continue + } - callbacks.forEach((callback) => callback()) - entry.elements.delete(intersectingEntry.target) - entry.observer.unobserve(intersectingEntry.target) - cleanupVisibleObserverEntry(entry) + const callbacks = elements.get(intersectingEntry.target) + if (!callbacks) { + continue } - }, - { rootMargin, threshold }, - ), - } - observerRegistry.set(key, entry) - observerEntry = entry + + callbacks.forEach((callback) => callback()) + elements.delete(intersectingEntry.target) + observer.unobserve(intersectingEntry.target) + cleanupVisibleObserverEntry(key, observer, elements) + } + }, + { rootMargin, threshold }, + ) + observerEntry = [observer, elements] + observerRegistry.set(key, observerEntry) } - let callbacks = observerEntry.elements.get(element) + const [observer, elements] = observerEntry + let callbacks = elements.get(element) if (!callbacks) { callbacks = new Set() - observerEntry.elements.set(element, callbacks) - observerEntry.observer.observe(element) + elements.set(element, callbacks) + observer.observe(element) } callbacks.add(callback) return () => { - const currentCallbacks = observerEntry.elements.get(element) + const currentCallbacks = elements.get(element) currentCallbacks?.delete(callback) if (currentCallbacks?.size === 0) { - observerEntry.elements.delete(element) - observerEntry.observer.unobserve(element) + elements.delete(element) + observer.unobserve(element) } - cleanupVisibleObserverEntry(observerEntry) + cleanupVisibleObserverEntry(key, observer, elements) } }, } diff --git a/packages/start-client-core/tests/frame-decoder.test.ts b/packages/start-client-core/tests/frame-decoder.test.ts index 3a05611392c..17862c480b8 100644 --- a/packages/start-client-core/tests/frame-decoder.test.ts +++ b/packages/start-client-core/tests/frame-decoder.test.ts @@ -50,7 +50,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() await expect(reader.read()).rejects.toThrow('Unknown frame type') @@ -65,7 +65,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() await expect(reader.read()).rejects.toThrow('Invalid raw frame streamId') @@ -84,7 +84,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() await expect(reader.read()).rejects.toThrow('Invalid JSON frame streamId') @@ -105,7 +105,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() await expect(reader.read()).rejects.toThrow('Frame payload too large') @@ -125,7 +125,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() await expect(reader.read()).rejects.toThrow('Incomplete frame') @@ -140,7 +140,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() await reader.cancel() @@ -169,7 +169,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() await expect(reader.read()).rejects.toThrow('Too many raw streams') @@ -186,7 +186,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() await expect(reader.read()).rejects.toThrow('buffer exceeded') @@ -207,7 +207,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() const chunks: Array = [] @@ -240,7 +240,8 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks, getOrCreateStream } = createFrameDecoder(input) + const { chunks: jsonChunks, getStream: getOrCreateStream } = + createFrameDecoder(input) // Pre-create the stream before consuming const stream5 = getOrCreateStream(5) @@ -276,7 +277,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() const chunks: Array = [] @@ -301,7 +302,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() const { value } = await reader.read() @@ -326,7 +327,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() const { value } = await reader.read() @@ -353,7 +354,7 @@ describe('frame-decoder', () => { }, }) - const { jsonChunks } = createFrameDecoder(input) + const { chunks: jsonChunks } = createFrameDecoder(input) const reader = jsonChunks.getReader() const { value } = await reader.read() @@ -387,7 +388,8 @@ describe('frame-decoder', () => { }, }) - const { getOrCreateStream, jsonChunks } = createFrameDecoder(input) + const { getStream: getOrCreateStream, chunks: jsonChunks } = + createFrameDecoder(input) // Pre-create streams before consuming const stream1 = getOrCreateStream(1) @@ -428,7 +430,8 @@ describe('frame-decoder', () => { }, }) - const { getOrCreateStream, jsonChunks } = createFrameDecoder(input) + const { getStream: getOrCreateStream, chunks: jsonChunks } = + createFrameDecoder(input) // Pre-create stream 3 const stream3 = getOrCreateStream(3) @@ -480,7 +483,8 @@ describe('frame-decoder', () => { }, }) - const { getOrCreateStream, jsonChunks } = createFrameDecoder(input) + const { getStream: getOrCreateStream, chunks: jsonChunks } = + createFrameDecoder(input) // First, fully consume JSON stream (this processes all frames) const jsonReader = jsonChunks.getReader() @@ -536,7 +540,8 @@ describe('frame-decoder', () => { }, }) - const { getOrCreateStream, jsonChunks } = createFrameDecoder(input) + const { getStream: getOrCreateStream, chunks: jsonChunks } = + createFrameDecoder(input) // Drain JSON (processes all frames) const jsonReader = jsonChunks.getReader() @@ -588,7 +593,8 @@ describe('frame-decoder', () => { }, }) - const { getOrCreateStream, jsonChunks } = createFrameDecoder(input) + const { getStream: getOrCreateStream, chunks: jsonChunks } = + createFrameDecoder(input) const stream11 = getOrCreateStream(11) const jsonReader = jsonChunks.getReader() @@ -604,5 +610,99 @@ describe('frame-decoder', () => { } expect(received).toEqual(Array.from(payload)) }) + + it('reassembles a large chunk payload delivered one byte at a time', async () => { + // Forces the header slow path AND many whole-chunk consumptions within a + // single extract, exercising the head-pointer advance + fully-drained + // reset. With the previous bufferList.shift() this path was O(n^2). + const payload = new Uint8Array(200) + for (let i = 0; i < payload.length; i++) { + payload[i] = (i * 7) % 256 + } + + const jsonFrame = encodeJSONFrame('{"ref":21}') + const chunkFrame = encodeChunkFrame(21, payload) + const endFrame = encodeEndFrame(21) + + const combined = new Uint8Array( + jsonFrame.length + chunkFrame.length + endFrame.length, + ) + combined.set(jsonFrame, 0) + combined.set(chunkFrame, jsonFrame.length) + combined.set(endFrame, jsonFrame.length + chunkFrame.length) + + const input = new ReadableStream({ + start(controller) { + for (let i = 0; i < combined.length; i++) { + controller.enqueue(combined.subarray(i, i + 1)) + } + controller.close() + }, + }) + + const { getStream: getOrCreateStream, chunks: jsonChunks } = + createFrameDecoder(input) + const stream21 = getOrCreateStream(21) + + const jsonReader = jsonChunks.getReader() + const { value: jsonValue } = await jsonReader.read() + expect(jsonValue).toBe('{"ref":21}') + + const rawReader = stream21.getReader() + const received: Array = [] + while (true) { + const { done, value } = await rawReader.read() + if (done) { + break + } + if (value) { + received.push(...value) + } + } + expect(received).toEqual(Array.from(payload)) + }) + + it('decodes many frames when reads never align with frame boundaries', async () => { + // 100-byte frames fed in 7-byte reads never align until the very end, so + // consumed chunks accumulate and the head pointer climbs past the + // compaction threshold repeatedly, exercising the splice() prefix drop. + const FRAME_COUNT = 7 + const expected: Array = [] + const frames: Array = [] + for (let i = 0; i < FRAME_COUNT; i++) { + const payload = `frame-${i}`.padEnd(91, '.') // 91 bytes => 100-byte frame + expected.push(payload) + frames.push(encodeJSONFrame(payload)) + } + + const totalLen = frames.reduce((acc, f) => acc + f.length, 0) + const combined = new Uint8Array(totalLen) + let offset = 0 + for (const f of frames) { + combined.set(f, offset) + offset += f.length + } + + const input = new ReadableStream({ + start(controller) { + for (let i = 0; i < combined.length; i += 7) { + controller.enqueue(combined.subarray(i, i + 7)) + } + controller.close() + }, + }) + + const { chunks: jsonChunks } = createFrameDecoder(input) + const reader = jsonChunks.getReader() + const received: Array = [] + while (true) { + const { done, value } = await reader.read() + if (done) { + break + } + received.push(value) + } + expect(received).toEqual(expected) + }) }) }) diff --git a/packages/start-client-core/tests/hydration-runtime.test.ts b/packages/start-client-core/tests/hydration-runtime.test.ts new file mode 100644 index 00000000000..577d329cd9c --- /dev/null +++ b/packages/start-client-core/tests/hydration-runtime.test.ts @@ -0,0 +1,100 @@ +import { describe, expect, it, vi } from 'vitest' +import { waitForHydrationPrefetchStrategy } from '../src/hydration/runtime' +import type { HydrationPrefetchStrategy } from '../src/hydration/types' + +describe('waitForHydrationPrefetchStrategy', () => { + it('cleans up a strategy that finishes during synchronous setup', async () => { + const abortController = new AbortController() + const cleanupHydrate = vi.fn() + const cleanupStrategy = vi.fn() + let hydrate = () => {} + + const strategy: HydrationPrefetchStrategy = { + _s: ({ prefetch }) => { + prefetch?.() + return cleanupStrategy + }, + } + + const result = waitForHydrationPrefetchStrategy(strategy, { + element: null, + signal: abortController.signal, + onHydrate: (listener) => { + hydrate = listener + return cleanupHydrate + }, + }) + + await expect(result).resolves.toBe('prefetch') + expect(cleanupHydrate).toHaveBeenCalledTimes(1) + expect(cleanupStrategy).toHaveBeenCalledTimes(1) + + hydrate() + abortController.abort() + expect(cleanupHydrate).toHaveBeenCalledTimes(1) + expect(cleanupStrategy).toHaveBeenCalledTimes(1) + }) + + it.each([ + ['abort', 'abort'], + ['hydrate', 'hydrate'], + ] as const)( + 'settles an abort/hydrate race with %s first and cleans up once', + async (winner, expectedReason) => { + const abortController = new AbortController() + const cleanupHydrate = vi.fn() + const cleanupStrategy = vi.fn() + let hydrate = () => {} + let prefetch = () => {} + + const strategy: HydrationPrefetchStrategy = { + _s: (context) => { + prefetch = context.prefetch ?? (() => {}) + return cleanupStrategy + }, + } + + const result = waitForHydrationPrefetchStrategy(strategy, { + element: null, + signal: abortController.signal, + onHydrate: (listener) => { + hydrate = listener + return cleanupHydrate + }, + }) + + if (winner === 'abort') { + abortController.abort() + hydrate() + } else { + hydrate() + abortController.abort() + } + prefetch() + + await expect(result).resolves.toBe(expectedReason) + expect(cleanupHydrate).toHaveBeenCalledTimes(1) + expect(cleanupStrategy).toHaveBeenCalledTimes(1) + }, + ) + + it('does not set up a strategy when the signal is already aborted', async () => { + const abortController = new AbortController() + abortController.abort() + const setup = vi.fn() + const onHydrate = vi.fn() + + const result = waitForHydrationPrefetchStrategy( + { _s: setup }, + { + element: null, + signal: abortController.signal, + onHydrate, + }, + ) + + await expect(result).resolves.toBe('abort') + expect(setup).not.toHaveBeenCalled() + expect(onHydrate).not.toHaveBeenCalled() + }) +}) diff --git a/packages/start-client-core/tests/hydration-visible.test.ts b/packages/start-client-core/tests/hydration-visible.test.ts new file mode 100644 index 00000000000..c0fbac0dfd9 --- /dev/null +++ b/packages/start-client-core/tests/hydration-visible.test.ts @@ -0,0 +1,127 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { visible } from '../src/hydration/visible' +import type { HydrationPrefetchStrategy } from '../src/hydration/types' + +class IntersectionObserverMock implements IntersectionObserver { + readonly root: Document | Element | null + readonly rootMargin: string + readonly scrollMargin: string + readonly thresholds: ReadonlyArray + readonly observe = vi.fn((_target: Element) => {}) + readonly unobserve = vi.fn((_target: Element) => {}) + readonly disconnect = vi.fn(() => {}) + + constructor( + readonly callback: IntersectionObserverCallback, + options: IntersectionObserverInit = {}, + ) { + this.root = options.root ?? null + this.rootMargin = options.rootMargin ?? '0px' + this.scrollMargin = options.scrollMargin ?? '0px' + this.thresholds = Array.isArray(options.threshold) + ? options.threshold + : [options.threshold ?? 0] + } + + takeRecords(): Array { + return [] + } + + emit(target: Element, isIntersecting = true) { + this.callback( + [{ target, isIntersecting } as IntersectionObserverEntry], + this, + ) + } +} + +describe('visible hydration strategy', () => { + let observers: Array + const cleanups: Array<() => void> = [] + + beforeEach(() => { + observers = [] + vi.stubGlobal( + 'IntersectionObserver', + class extends IntersectionObserverMock { + constructor( + callback: IntersectionObserverCallback, + options?: IntersectionObserverInit, + ) { + super(callback, options) + observers.push(this) + } + }, + ) + }) + + afterEach(() => { + cleanups.splice(0).forEach((cleanup) => cleanup()) + vi.unstubAllGlobals() + }) + + function observe( + strategy: HydrationPrefetchStrategy, + element: Element, + callback: () => void, + ) { + const cleanup = strategy._s?.({ element, prefetch: callback }) + if (cleanup) { + cleanups.push(cleanup) + } + return cleanup + } + + it('shares an observer and tracks multiple callbacks for one element', () => { + const element = document.createElement('div') + const first = vi.fn() + const second = vi.fn() + const strategy = visible({ rootMargin: '25px', threshold: [0, 0.5] }) + + const cleanupFirst = observe(strategy, element, first) + observe(strategy, element, second) + + expect(observers).toHaveLength(1) + expect(observers[0]!.observe).toHaveBeenCalledOnce() + expect(observers[0]!.observe).toHaveBeenCalledWith(element) + + cleanupFirst?.() + observers[0]!.emit(element) + + expect(first).not.toHaveBeenCalled() + expect(second).toHaveBeenCalledOnce() + expect(observers[0]!.unobserve).toHaveBeenCalledOnce() + expect(observers[0]!.unobserve).toHaveBeenCalledWith(element) + expect(observers[0]!.disconnect).toHaveBeenCalledOnce() + }) + + it('keeps a shared observer until every element is cleaned up', () => { + const firstElement = document.createElement('div') + const secondElement = document.createElement('div') + const options = { rootMargin: '50px', threshold: 0.25 } + + const cleanupFirst = observe(visible(options), firstElement, vi.fn()) + const cleanupSecond = observe(visible(options), secondElement, vi.fn()) + + expect(observers).toHaveLength(1) + expect(observers[0]!.observe).toHaveBeenCalledTimes(2) + + cleanupFirst?.() + expect(observers[0]!.unobserve).toHaveBeenCalledWith(firstElement) + expect(observers[0]!.disconnect).not.toHaveBeenCalled() + + cleanupSecond?.() + expect(observers[0]!.unobserve).toHaveBeenCalledWith(secondElement) + expect(observers[0]!.disconnect).toHaveBeenCalledOnce() + + const cleanupThird = observe( + visible(options), + document.createElement('div'), + vi.fn(), + ) + expect(observers).toHaveLength(2) + + cleanupThird?.() + expect(observers[1]!.disconnect).toHaveBeenCalledOnce() + }) +}) diff --git a/packages/start-plugin-core/CHANGELOG.md b/packages/start-plugin-core/CHANGELOG.md index b7b0ff96da8..8b3f704c2d4 100644 --- a/packages/start-plugin-core/CHANGELOG.md +++ b/packages/start-plugin-core/CHANGELOG.md @@ -1,5 +1,75 @@ # @tanstack/start-plugin-core +## 1.171.34 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13)]: + - @tanstack/router-core@1.171.22 + - @tanstack/router-generator@1.167.28 + - @tanstack/router-plugin@1.168.30 + - @tanstack/start-server-core@1.169.26 + +## 1.171.33 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + - @tanstack/router-generator@1.167.27 + - @tanstack/router-plugin@1.168.29 + - @tanstack/start-server-core@1.169.25 + +## 1.171.32 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + - @tanstack/router-generator@1.167.26 + - @tanstack/router-plugin@1.168.28 + - @tanstack/start-server-core@1.169.24 + +## 1.171.31 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/start-server-core@1.169.23 + - @tanstack/router-generator@1.167.25 + +## 1.171.30 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/router-core@1.171.19 + - @tanstack/router-generator@1.167.25 + - @tanstack/router-plugin@1.168.27 + - @tanstack/start-server-core@1.169.22 + +## 1.171.29 + +### Patch Changes + +- Updated dependencies [[`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/router-core@1.171.18 + - @tanstack/start-server-core@1.169.21 + - @tanstack/router-generator@1.167.24 + - @tanstack/router-plugin@1.168.26 + +## 1.171.28 + +### Patch Changes + +- [#7962](https://github.com/TanStack/router/pull/7962) [`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5) - Update Seroval dependencies to version 1.6.2. + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + - @tanstack/start-server-core@1.169.20 + - @tanstack/router-generator@1.167.23 + - @tanstack/router-plugin@1.168.25 + ## 1.171.27 ### Patch Changes diff --git a/packages/start-plugin-core/package.json b/packages/start-plugin-core/package.json index 3aa6a3ef9a8..493e418f4e5 100644 --- a/packages/start-plugin-core/package.json +++ b/packages/start-plugin-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/start-plugin-core", - "version": "1.171.27", + "version": "1.171.34", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -97,7 +97,7 @@ "lightningcss": "^1.32.0", "pathe": "^2.0.3", "picomatch": "^4.0.3", - "seroval": "^1.5.4", + "seroval": "^1.6.2", "source-map": "^0.7.6", "srvx": "^0.11.9", "tinyglobby": "^0.2.15", diff --git a/packages/start-server-core/CHANGELOG.md b/packages/start-server-core/CHANGELOG.md index f7869e4737e..e13c8fd7371 100644 --- a/packages/start-server-core/CHANGELOG.md +++ b/packages/start-server-core/CHANGELOG.md @@ -1,5 +1,73 @@ # @tanstack/start-server-core +## 1.169.26 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13)]: + - @tanstack/router-core@1.171.22 + - @tanstack/start-client-core@1.170.22 + - @tanstack/start-storage-context@1.167.24 + +## 1.169.25 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + - @tanstack/start-client-core@1.170.21 + - @tanstack/start-storage-context@1.167.23 + +## 1.169.24 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`c59788c`](https://github.com/TanStack/router/commit/c59788ca20f2d2e7f264a859ebe01b7646ba3154), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + - @tanstack/start-client-core@1.170.20 + - @tanstack/start-storage-context@1.167.22 + +## 1.169.23 + +### Patch Changes + +- Updated dependencies [[`2fbc99f`](https://github.com/TanStack/router/commit/2fbc99f2c262b057cb957e6ebba1ee073c655186), [`6bede65`](https://github.com/TanStack/router/commit/6bede65d7074dcd83455151b66b4574268bc782c)]: + - @tanstack/start-client-core@1.170.19 + +## 1.169.22 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/router-core@1.171.19 + - @tanstack/start-client-core@1.170.18 + - @tanstack/start-storage-context@1.167.21 + +## 1.169.21 + +### Patch Changes + +- [#7967](https://github.com/TanStack/router/pull/7967) [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c) - Preserve path params in their raw string form while matching routes so structured values returned by `params.parse` produce stable match IDs and do not reuse stale loader data. + + `RouterCore.getMatchedRoutes()` now returns `[matchedRoutes, rawParams, foundRoute]` instead of an object. + +- Updated dependencies [[`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/router-core@1.171.18 + - @tanstack/start-client-core@1.170.17 + - @tanstack/history@1.162.1 + - @tanstack/start-storage-context@1.167.20 + +## 1.169.20 + +### Patch Changes + +- [#7962](https://github.com/TanStack/router/pull/7962) [`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5) - Update Seroval dependencies to version 1.6.2. + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + - @tanstack/start-client-core@1.170.16 + - @tanstack/start-storage-context@1.167.19 + ## 1.169.19 ### Patch Changes diff --git a/packages/start-server-core/package.json b/packages/start-server-core/package.json index ac8787c47a5..9f8a192765d 100644 --- a/packages/start-server-core/package.json +++ b/packages/start-server-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/start-server-core", - "version": "1.169.19", + "version": "1.169.26", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -105,7 +105,7 @@ "@tanstack/start-storage-context": "workspace:*", "fetchdts": "^0.1.6", "h3-v2": "npm:h3@2.0.1-rc.20", - "seroval": "^1.5.4" + "seroval": "^1.6.2" }, "devDependencies": { "@standard-schema/spec": "^1.0.0", diff --git a/packages/start-server-core/src/createStartHandler.ts b/packages/start-server-core/src/createStartHandler.ts index 20c47631379..c7b427bfb1f 100644 --- a/packages/start-server-core/src/createStartHandler.ts +++ b/packages/start-server-core/src/createStartHandler.ts @@ -893,10 +893,10 @@ async function handleServerRoutes({ // this will perform a fuzzy match, however for server routes we need an exact match // if the route is not an exact match, executeRouter will handle rendering the app router // the match will be cached internally, so no extra work is done during the app router render - const { matchedRoutes, foundRoute, routeParams } = + const [matchedRoutes, rawParams, foundRoute] = router.getMatchedRoutes(pathname) - const isExactMatch = foundRoute && routeParams['**'] === undefined + const isExactMatch = foundRoute && rawParams['**'] === undefined // Collect and dedupe route middlewares const routeMiddlewares: Array = [] @@ -964,7 +964,7 @@ async function handleServerRoutes({ { request, context, - params: routeParams, + params: rawParams, pathname, handlerType: 'router', }, diff --git a/packages/start-static-server-functions/CHANGELOG.md b/packages/start-static-server-functions/CHANGELOG.md index 6118173acfa..0ee47621aa8 100644 --- a/packages/start-static-server-functions/CHANGELOG.md +++ b/packages/start-static-server-functions/CHANGELOG.md @@ -1,5 +1,70 @@ # @tanstack/start-static-server-functions +## 1.167.27 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/start-client-core@1.170.22 + - @tanstack/react-start@1.168.43 + - @tanstack/solid-start@1.168.42 + +## 1.167.26 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/start-client-core@1.170.21 + - @tanstack/react-start@1.168.42 + - @tanstack/solid-start@1.168.41 + +## 1.167.25 + +### Patch Changes + +- Updated dependencies [[`c59788c`](https://github.com/TanStack/router/commit/c59788ca20f2d2e7f264a859ebe01b7646ba3154)]: + - @tanstack/start-client-core@1.170.20 + - @tanstack/react-start@1.168.41 + - @tanstack/solid-start@1.168.40 + +## 1.167.24 + +### Patch Changes + +- Updated dependencies [[`2fbc99f`](https://github.com/TanStack/router/commit/2fbc99f2c262b057cb957e6ebba1ee073c655186), [`6bede65`](https://github.com/TanStack/router/commit/6bede65d7074dcd83455151b66b4574268bc782c)]: + - @tanstack/start-client-core@1.170.19 + - @tanstack/react-start@1.168.40 + - @tanstack/solid-start@1.168.39 + +## 1.167.23 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/react-start@1.168.39 + - @tanstack/start-client-core@1.170.18 + - @tanstack/solid-start@1.168.38 + +## 1.167.22 + +### Patch Changes + +- Updated dependencies [[`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b)]: + - @tanstack/start-client-core@1.170.17 + - @tanstack/react-start@1.168.38 + - @tanstack/solid-start@1.168.37 + +## 1.167.21 + +### Patch Changes + +- [#7962](https://github.com/TanStack/router/pull/7962) [`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5) - Update Seroval dependencies to version 1.6.2. + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/start-client-core@1.170.16 + - @tanstack/react-start@1.168.37 + - @tanstack/solid-start@1.168.36 + ## 1.167.20 ### Patch Changes diff --git a/packages/start-static-server-functions/package.json b/packages/start-static-server-functions/package.json index c828bd7a196..3eb2236f626 100644 --- a/packages/start-static-server-functions/package.json +++ b/packages/start-static-server-functions/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/start-static-server-functions", - "version": "1.167.20", + "version": "1.167.27", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -60,7 +60,7 @@ }, "dependencies": { "@tanstack/start-client-core": "workspace:*", - "seroval": "^1.5.4" + "seroval": "^1.6.2" }, "devDependencies": { "vite": "*", diff --git a/packages/start-storage-context/CHANGELOG.md b/packages/start-storage-context/CHANGELOG.md index da8b12f4d46..c99fa652a46 100644 --- a/packages/start-storage-context/CHANGELOG.md +++ b/packages/start-storage-context/CHANGELOG.md @@ -1,5 +1,47 @@ # @tanstack/start-storage-context +## 1.167.24 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13)]: + - @tanstack/router-core@1.171.22 + +## 1.167.23 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + +## 1.167.22 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + +## 1.167.21 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/router-core@1.171.19 + +## 1.167.20 + +### Patch Changes + +- Updated dependencies [[`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/router-core@1.171.18 + +## 1.167.19 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + ## 1.167.18 ### Patch Changes diff --git a/packages/start-storage-context/package.json b/packages/start-storage-context/package.json index 31c243b74bb..d90f909a188 100644 --- a/packages/start-storage-context/package.json +++ b/packages/start-storage-context/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/start-storage-context", - "version": "1.167.18", + "version": "1.167.24", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index a15a0a7eaa7..aa84fc434ce 100644 --- a/packages/vue-router/CHANGELOG.md +++ b/packages/vue-router/CHANGELOG.md @@ -1,5 +1,64 @@ # @tanstack/vue-router +## 1.170.24 + +### Patch Changes + +- [#8045](https://github.com/TanStack/router/pull/8045) [`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3) - Warn when an Outlet is rendered inside a pending, error, or not-found component. + +- [#8043](https://github.com/TanStack/router/pull/8043) [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1) - remove the undocumented Link `isTransitioning` state and `data-transitioning` attribute + +- [#8044](https://github.com/TanStack/router/pull/8044) [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e) - Apply `preloadDelay` to viewport link preloading and cancel pending preloads when links leave the viewport. + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13)]: + - @tanstack/router-core@1.171.22 + +## 1.170.23 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + +## 1.170.22 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + +## 1.170.21 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/router-core@1.171.19 + +## 1.170.20 + +### Patch Changes + +- [#7970](https://github.com/TanStack/router/pull/7970) [`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf) - createFileRoute does not rely on FileRoute class + +- [#7985](https://github.com/TanStack/router/pull/7985) [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b) - perf: compact private bundle boundaries- [#7975](https://github.com/TanStack/router/issues/7975) + +- [#7971](https://github.com/TanStack/router/pull/7971) [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7) - clean intersection observer options in link component + +- [#7967](https://github.com/TanStack/router/pull/7967) [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c) - Preserve path params in their raw string form while matching routes so structured values returned by `params.parse` produce stable match IDs and do not reuse stale loader data. + + `RouterCore.getMatchedRoutes()` now returns `[matchedRoutes, rawParams, foundRoute]` instead of an object. + +- Updated dependencies [[`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/router-core@1.171.18 + - @tanstack/history@1.162.1 + +## 1.170.19 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + ## 1.170.18 ### Patch Changes diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index 5d61f81e725..e16852285c2 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-router", - "version": "1.170.18", + "version": "1.170.24", "description": "Modern and scalable routing for Vue applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/vue-router/src/CatchBoundary.tsx b/packages/vue-router/src/CatchBoundary.tsx index e9124451586..d170e6fb1a1 100644 --- a/packages/vue-router/src/CatchBoundary.tsx +++ b/packages/vue-router/src/CatchBoundary.tsx @@ -1,4 +1,5 @@ import * as Vue from 'vue' +import { renderInNonRouteComponentContext } from './nonRouteComponentContext' import type { ErrorRouteComponent } from './route' type CatchBoundaryProps = { @@ -49,13 +50,25 @@ const VueErrorBoundary = Vue.defineComponent({ return false }) - return () => - error.value - ? Vue.h(props.errorComponent ?? ErrorComponent, { - error: error.value, - reset, - }) - : (props.children as Vue.VNode) + return () => { + if (!error.value) { + return props.children as Vue.VNode + } + + const errorComponent = props.errorComponent ?? ErrorComponent + const errorProps = { + error: error.value, + reset, + } + + return process.env.NODE_ENV !== 'production' + ? renderInNonRouteComponentContext( + errorComponent, + errorProps, + 'errorComponent', + ) + : Vue.h(errorComponent, errorProps) + } }, }) diff --git a/packages/vue-router/src/Match.tsx b/packages/vue-router/src/Match.tsx index 96d81970a51..0a643447f02 100644 --- a/packages/vue-router/src/Match.tsx +++ b/packages/vue-router/src/Match.tsx @@ -9,6 +9,10 @@ import { CatchNotFound } from './not-found' import { routeIdContext } from './matchContext' import { renderRouteNotFound } from './renderRouteNotFound' import { ScrollRestoration } from './scroll-restoration' +import { + nonRouteComponentContext, + renderInNonRouteComponentContext, +} from './nonRouteComponentContext' import type { VNode } from 'vue' import type { AnyRoute, RootRouteOptions } from '@tanstack/router-core' @@ -41,7 +45,13 @@ export const Match = Vue.defineComponent({ route?.options.pendingComponent ?? router.options.defaultPendingComponent const pendingElement = PendingComponent - ? Vue.h(PendingComponent) + ? process.env.NODE_ENV !== 'production' + ? renderInNonRouteComponentContext( + PendingComponent, + undefined, + 'pendingComponent', + ) + : Vue.h(PendingComponent) : undefined const routeErrorComponent = route?.options.errorComponent ?? router.options.defaultErrorComponent @@ -81,7 +91,13 @@ export const Match = Vue.defineComponent({ throw error } - return Vue.h(routeNotFoundComponent, error) + return process.env.NODE_ENV !== 'production' + ? renderInNonRouteComponentContext( + routeNotFoundComponent, + error, + 'notFoundComponent', + ) + : Vue.h(routeNotFoundComponent, error) }, children: content, }) @@ -160,19 +176,18 @@ export const MatchInner = Vue.defineComponent({ (router.routesById[matchRouteId] as AnyRoute).options.remountDeps ?? router.options.defaultRemountDeps - const remountDeps = remountFn - ? remountFn({ - routeId: matchRouteId, - loaderDeps: match.loaderDeps, - params: match._strictParams, - search: match._strictSearch, - }) + const remountKey = remountFn + ? JSON.stringify( + remountFn({ + routeId: matchRouteId, + loaderDeps: match.loaderDeps, + params: match._strictParams, + search: match._strictSearch, + }), + ) : undefined - return [ - match, - remountDeps ? JSON.stringify(remountDeps) : undefined, - ] as const + return [match, remountKey] as const }) return (): VNode | null => { @@ -197,7 +212,7 @@ export const MatchInner = Vue.defineComponent({ // If this route has an error component, render it directly // This is more reliable than relying on Vue's error boundary if (RouteErrorComponent) { - return Vue.h(RouteErrorComponent, { + const errorProps = { error: match.error, reset: () => { router.invalidate() @@ -205,7 +220,14 @@ export const MatchInner = Vue.defineComponent({ info: { componentStack: '', }, - }) + } + return process.env.NODE_ENV !== 'production' + ? renderInNonRouteComponentContext( + RouteErrorComponent, + errorProps, + 'errorComponent', + ) + : Vue.h(RouteErrorComponent, errorProps) } // If there's no error component for this route, throw the error @@ -221,7 +243,13 @@ export const MatchInner = Vue.defineComponent({ router.options.defaultPendingComponent if (PendingComponent) { - return Vue.h(PendingComponent) + return process.env.NODE_ENV !== 'production' + ? renderInNonRouteComponentContext( + PendingComponent, + undefined, + 'pendingComponent', + ) + : Vue.h(PendingComponent) } // If no pending component, return null while loading @@ -249,6 +277,21 @@ export const MatchInner = Vue.defineComponent({ export const Outlet = Vue.defineComponent({ name: 'Outlet', setup() { + if (process.env.NODE_ENV !== 'production') { + const nonRouteComponent = Vue.inject(nonRouteComponentContext!, undefined) + if (nonRouteComponent) { + Vue.watch( + nonRouteComponent, + (component) => { + console.warn( + `Warning: An was rendered inside a ${component}. should only be rendered inside a route component.`, + ) + }, + { immediate: true }, + ) + } + } + const router = useRouter() const parentRouteId = Vue.inject(routeIdContext)! @@ -256,17 +299,11 @@ export const Outlet = Vue.defineComponent({ const route = router.routesById[parentRouteId]! - const childMatch = useStore(router.stores.matches, (matches) => { + const childRouteId = useStore(router.stores.matches, (matches) => { const index = matches.findIndex( (match) => match.routeId === parentRouteId, ) - const child = matches[index + 1] - return child - ? ([ - child.routeId, - child.routeId + JSON.stringify(child._strictParams), - ] as const) - : undefined + return matches[index + 1]?.routeId }) return (): VNode | null => { @@ -274,17 +311,14 @@ export const Outlet = Vue.defineComponent({ return renderRouteNotFound(router, route, parentMatch.value.error) } - const child = childMatch.value + const child = childRouteId.value if (!child) { return null } const nextMatch = Vue.h(Match, { - routeId: child[0 /* routeId */], - // Key based on routeId + params only (not loaderDeps) - // This ensures component recreates when params change, - // but NOT when only loaderDeps change - key: child[1 /* key */], + routeId: child, + key: child, }) // Note: We intentionally do NOT wrap in Suspense here. diff --git a/packages/vue-router/src/Matches.tsx b/packages/vue-router/src/Matches.tsx index 15799d2a5ba..ae3b4f72eec 100644 --- a/packages/vue-router/src/Matches.tsx +++ b/packages/vue-router/src/Matches.tsx @@ -6,6 +6,7 @@ import { useRouter } from './useRouter' import { useTransitionerSetup } from './Transitioner' import { routeIdContext } from './matchContext' import { Match } from './Match' +import { renderInNonRouteComponentContext } from './nonRouteComponentContext' import type { AnyRouter, DeepPartial, @@ -40,7 +41,13 @@ export const Matches = Vue.defineComponent({ return () => { const pendingElement = router.options.defaultPendingComponent - ? Vue.h(router.options.defaultPendingComponent) + ? process.env.NODE_ENV !== 'production' + ? renderInNonRouteComponentContext( + router.options.defaultPendingComponent, + undefined, + 'pendingComponent', + ) + : Vue.h(router.options.defaultPendingComponent) : null // Do not render a root Suspense during SSR or hydrating from SSR diff --git a/packages/vue-router/src/Scripts.tsx b/packages/vue-router/src/Scripts.tsx index 8c0a1f87f3a..4c0d8feed06 100644 --- a/packages/vue-router/src/Scripts.tsx +++ b/packages/vue-router/src/Scripts.tsx @@ -6,13 +6,6 @@ import { Asset } from './Asset' import { useRouter } from './useRouter' import type { RouterManagedTag } from '@tanstack/router-core' -type ScriptsRenderState = { - scripts: Array - assetScripts: Array - mounted: boolean - nonce?: string -} - export const Scripts = Vue.defineComponent({ name: 'Scripts', setup() { @@ -53,20 +46,19 @@ export const Scripts = Vue.defineComponent({ }) return () => { - const [userScripts, assetScripts] = scripts.value - return renderScripts(router, { - scripts: userScripts, - assetScripts, - mounted: mounted.value, - nonce, - }) + return renderScripts(router, scripts.value, mounted.value, nonce) } }, }) function renderScripts( router: ReturnType, - { scripts, assetScripts, mounted, nonce }: ScriptsRenderState, + [scripts, assetScripts]: readonly [ + Array, + Array, + ], + mounted: boolean, + nonce?: string, ) { const allScripts: Array = [] diff --git a/packages/vue-router/src/fileRoute.ts b/packages/vue-router/src/fileRoute.ts index 672328b5607..0e0b6c8368f 100644 --- a/packages/vue-router/src/fileRoute.ts +++ b/packages/vue-router/src/fileRoute.ts @@ -43,11 +43,14 @@ export function createFileRoute< TFullPath extends RouteConstraints['TFullPath'] = FileRoutesByPath[TFilePath]['fullPath'], >( + // eslint-disable-next-line unused-imports/no-unused-vars path?: TFilePath, ): FileRoute['createRoute'] { - return new FileRoute(path, { - silent: true, - }).createRoute + return (options) => { + const route = createRoute(options as any) + ;(route as any).isRoot = false + return route as any + } } /** diff --git a/packages/vue-router/src/link.tsx b/packages/vue-router/src/link.tsx index 3a5a9875a82..ccff4e90060 100644 --- a/packages/vue-router/src/link.tsx +++ b/packages/vue-router/src/link.tsx @@ -29,7 +29,7 @@ import type { type EventHandler = (e: TEvent) => void -const timeoutMap = new WeakMap>() +const timeoutMap = new WeakMap>() type DataAttributes = { [K in `data-${string}`]?: unknown @@ -58,6 +58,17 @@ type VueStyleLinkEventHandlers = { onTouchstart?: EventHandler } +type LinkEventHandlers = { + onClick: EventHandler + onBlur: EventHandler + onFocus: EventHandler + onMouseenter: EventHandler + onMouseleave: EventHandler + onMouseover: EventHandler + onMouseout: EventHandler + onTouchstart: EventHandler +} + interface StyledProps { class?: LinkHTMLAttributes['class'] style?: LinkHTMLAttributes['style'] @@ -73,7 +84,9 @@ type PropsOfComponent = ? P : Record -type AnyLinkPropsOptions = UseLinkPropsOptions +type AnyLinkPropsOptions = UseLinkPropsOptions & { + _asChild?: unknown +} type LinkEventOptions = AnyLinkPropsOptions & Partial export function useLinkProps< @@ -84,10 +97,15 @@ export function useLinkProps< TMaskTo extends string = '', >( options: UseLinkPropsOptions, +): LinkHTMLAttributes { + return useLinkPropsImpl(() => options as AnyLinkPropsOptions) +} + +function useLinkPropsImpl( + getOptions: () => AnyLinkPropsOptions, ): LinkHTMLAttributes { const router = useRouter() - const isTransitioning = Vue.ref(false) - let hasRenderFetched = false + let renderFetchedHref: string | undefined // Ensure router is defined before proceeding if (!router) { @@ -97,6 +115,7 @@ export function useLinkProps< // Determine if the link is external or internal const type = Vue.computed(() => { + const options = getOptions() try { new URL(`${options.to}`) return 'external' @@ -106,108 +125,38 @@ export function useLinkProps< }) const ref = Vue.ref(null) - const eventHandlers = getLinkEventHandlers(options as LinkEventOptions) - - if (type.value === 'external') { - // Block dangerous protocols like javascript:, blob:, data: - if (isDangerousProtocol(options.to as string, router.protocolAllowlist)) { - if (process.env.NODE_ENV !== 'production') { - console.warn(`Blocked Link with dangerous protocol: ${options.to}`) - } - // Return props without href to prevent navigation - const safeProps: Record = { - ...getPropsSafeToSpread(options as AnyLinkPropsOptions), - ref, - // No href attribute - blocks the dangerous protocol - target: options.target, - disabled: options.disabled, - style: options.style, - class: options.class, - onClick: options.onClick, - onBlur: options.onBlur, - onFocus: options.onFocus, - onMouseenter: eventHandlers.onMouseenter, - onMouseleave: eventHandlers.onMouseleave, - onMouseover: eventHandlers.onMouseover, - onMouseout: eventHandlers.onMouseout, - onTouchstart: eventHandlers.onTouchstart, - } - - // Remove undefined values - Object.keys(safeProps).forEach((key) => { - if (safeProps[key] === undefined) { - delete safeProps[key] - } - }) - - return Vue.computed( - () => safeProps as LinkHTMLAttributes, - ) as unknown as LinkHTMLAttributes - } - - // External links just have simple props - const externalProps: Record = { - ...getPropsSafeToSpread(options as AnyLinkPropsOptions), - ref, - href: options.to, - target: options.target, - disabled: options.disabled, - style: options.style, - class: options.class, - onClick: options.onClick, - onBlur: options.onBlur, - onFocus: options.onFocus, - onMouseenter: eventHandlers.onMouseenter, - onMouseleave: eventHandlers.onMouseleave, - onMouseover: eventHandlers.onMouseover, - onMouseout: eventHandlers.onMouseout, - onTouchstart: eventHandlers.onTouchstart, - } - - // Remove undefined values - Object.keys(externalProps).forEach((key) => { - if (externalProps[key] === undefined) { - delete externalProps[key] - } - }) - - return Vue.computed( - () => externalProps as LinkHTMLAttributes, - ) as unknown as LinkHTMLAttributes - } // During SSR we render exactly once and do not need reactivity. // Avoid store subscriptions, effects and observers on the server. if (isServer ?? router.isServer) { + const options = getOptions() + if (type.value === 'external') { + return Vue.ref( + getExternalLinkProps(options, router, ref), + ) as unknown as LinkHTMLAttributes + } + const next = router.buildLocation(options as any) - const href = getHref({ - options: options as AnyLinkPropsOptions, - router, - nextLocation: next, - }) + const href = getHref(options, router, next) - const isActive = getIsActive({ - loc: router.stores.location.get(), - nextLoc: next, - activeOptions: options.activeOptions, + const isActive = getIsActive( + router.stores.location.get(), + next, + options.activeOptions, router, - }) + ) const { resolvedActiveProps, resolvedInactiveProps, resolvedClassName, resolvedStyle, - } = resolveStyleProps({ - options: options as AnyLinkPropsOptions, - isActive, - }) + } = resolveStyleProps(options, isActive) const result = combineResultProps({ href, - options: options as AnyLinkPropsOptions, + options, isActive, - isTransitioning: false, resolvedActiveProps, resolvedInactiveProps, resolvedClassName, @@ -219,72 +168,149 @@ export function useLinkProps< ) as unknown as LinkHTMLAttributes } - const currentLocation = useStore(router.stores.location, (l) => l, { - equal: (prev, next) => prev.href === next.href, - }) + const currentLocation: Vue.Ref< + ReturnType + > = + type.value === 'external' + ? Vue.shallowRef(router.stores.location.get()) + : (useStore(router.stores.location, (l) => l, { + equal: (prev, next) => prev.href === next.href, + }) as Vue.Ref>) + + // Links that start external skip useStore above. Subscribe if they later + // become internal so active state follows subsequent location changes. + if (type.value === 'external') { + Vue.watchEffect((onCleanup) => { + if (type.value === 'external') { + return + } + + const store = router.stores.location + const subscription = store.subscribe((location) => { + if (currentLocation.value.href !== location.href) { + currentLocation.value = location + } + }) + onCleanup(() => subscription.unsubscribe()) + }) + } const next = Vue.computed(() => { // Rebuild when inherited search/hash or the current route context changes. + const options = getOptions() const opts = { _fromLocation: currentLocation.value, ...options } return router.buildLocation(opts) }) const preload = Vue.computed(() => { - if (options.reloadDocument) { + const options = getOptions() + if ( + type.value === 'external' || + options.reloadDocument || + options.disabled + ) { return false } return options.preload ?? router.options.defaultPreload }) const preloadDelay = Vue.computed( - () => options.preloadDelay ?? router.options.defaultPreloadDelay ?? 0, + () => getOptions().preloadDelay ?? router.options.defaultPreloadDelay ?? 0, ) - const isActive = Vue.computed(() => - getIsActive({ - activeOptions: options.activeOptions, - loc: currentLocation.value, - nextLoc: next.value, + const isActive = Vue.computed(() => { + const options = getOptions() + return getIsActive( + currentLocation.value, + next.value, + options.activeOptions, router, - }), - ) + ) + }) - const doPreload = () => - router + const doPreload = () => { + const options = getOptions() + return router .preloadRoute({ ...options, _builtLocation: next.value } as any) .catch((err: any) => { console.warn(err) console.warn(preloadWarning) }) + } + + let pendingPreload: 'intent' | 'viewport' | undefined - const preloadViewportIoCallback = ( - entry: IntersectionObserverEntry | undefined, + const enqueuePreload = ( + e?: MouseEvent | FocusEvent | IntersectionObserverEntry, ) => { - if (entry?.isIntersecting) { + if (!e) { + clearTimeout(timeoutMap.get(ref)) + timeoutMap.delete(ref) + pendingPreload = undefined + return + } + + const isIntersecting = (e as IntersectionObserverEntry).isIntersecting + const preloadMode = isIntersecting === undefined ? 'intent' : 'viewport' + if (preload.value !== preloadMode || isIntersecting === false) { + if (isIntersecting === false && pendingPreload === 'viewport') { + clearTimeout(timeoutMap.get(ref)) + timeoutMap.delete(ref) + pendingPreload = undefined + } + return + } + + if (!preloadDelay.value) { doPreload() + return + } + + if (!timeoutMap.has(ref)) { + const scheduledHref = next.value.href + pendingPreload = preloadMode + timeoutMap.set( + ref, + setTimeout(() => { + timeoutMap.delete(ref) + pendingPreload = undefined + if ( + preload.value === preloadMode && + next.value.href === scheduledHref + ) { + doPreload() + } + }, preloadDelay.value), + ) } } useIntersectionObserver( ref, - preloadViewportIoCallback, - { rootMargin: '100px' }, - { disabled: () => !!options.disabled || !(preload.value === 'viewport') }, + enqueuePreload, + () => preload.value !== 'viewport', ) - Vue.effect(() => { - if (hasRenderFetched) { + Vue.watchEffect(() => { + if (preload.value !== 'render') { return } - if (!options.disabled && preload.value === 'render') { + + const nextHref = next.value.href + if (nextHref && renderFetchedHref !== nextHref) { + renderFetchedHref = nextHref doPreload() - hasRenderFetched = true } }) // The click handler const handleClick = (e: PointerEvent): void => { + if (type.value === 'external') { + return + } + + const options = getOptions() // Check actual element's target attribute as fallback const elementTarget = ( e.currentTarget as HTMLAnchorElement | SVGAElement @@ -306,13 +332,6 @@ export function useLinkProps< e.preventDefault() - isTransitioning.value = true - - const unsub = router.subscribe('onResolved', () => { - unsub() - isTransitioning.value = false - }) - // All is well? Navigate! router.navigate({ ...options, @@ -326,105 +345,76 @@ export function useLinkProps< } } - const enqueueIntentPreload = (e: MouseEvent | FocusEvent) => { - if (options.disabled || preload.value !== 'intent') return - - if (!preloadDelay.value) { + const handleTouchStart = () => { + if (preload.value === 'intent') { doPreload() - return } - - const eventTarget = e.currentTarget || e.target - - if (!eventTarget || timeoutMap.has(eventTarget)) return - - timeoutMap.set( - eventTarget, - setTimeout(() => { - timeoutMap.delete(eventTarget) - doPreload() - }, preloadDelay.value), - ) - } - - const handleTouchStart = (_: TouchEvent) => { - if (options.disabled || preload.value !== 'intent') return - doPreload() } - const handleLeave = (e: MouseEvent | FocusEvent) => { - if (options.disabled) return - const eventTarget = e.currentTarget || e.target - - if (eventTarget) { - const id = timeoutMap.get(eventTarget) - clearTimeout(id) - timeoutMap.delete(eventTarget) + const handleLeave = () => { + if (pendingPreload === 'intent') { + clearTimeout(timeoutMap.get(ref)) + timeoutMap.delete(ref) + pendingPreload = undefined } } - // Helper to compose event handlers - with explicit return type and better type handling function composeEventHandlers( - handlers: Array | undefined>, + getUserHandler: () => EventHandler | undefined, + handler: EventHandler, ): (e: T) => void { return (event: T) => { - for (const handler of handlers) { - if (handler) { - handler(event) - } - } + getUserHandler()?.(event) + handler(event) } } // Get the active and inactive props - const resolvedStyleProps = Vue.computed(() => - resolveStyleProps({ - options: options as AnyLinkPropsOptions, - isActive: isActive.value, - }), - ) + const resolvedStyleProps = Vue.computed(() => { + const options = getOptions() + return resolveStyleProps(options, isActive.value) + }) - const href = Vue.computed(() => - getHref({ - options: options as AnyLinkPropsOptions, - router, - nextLocation: next.value, - }), - ) + const href = Vue.computed(() => { + const options = getOptions() + return getHref(options, router, next.value) + }) // Create static event handlers that don't change between renders - const staticEventHandlers = { - onClick: composeEventHandlers([options.onClick, handleClick]), - onBlur: composeEventHandlers([options.onBlur, handleLeave]), - onFocus: composeEventHandlers([ - options.onFocus, - enqueueIntentPreload, - ]), - onMouseenter: composeEventHandlers([ - eventHandlers.onMouseenter, - enqueueIntentPreload, - ]), - onMouseover: composeEventHandlers([ - eventHandlers.onMouseover, - enqueueIntentPreload, - ]), - onMouseleave: composeEventHandlers([ - eventHandlers.onMouseleave, + const staticEventHandlers: LinkEventHandlers = { + onClick: composeEventHandlers(() => getOptions().onClick, handleClick), + onBlur: composeEventHandlers(() => getOptions().onBlur, handleLeave), + onFocus: composeEventHandlers(() => getOptions().onFocus, enqueuePreload), + onMouseenter: composeEventHandlers( + () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseenter, + enqueuePreload, + ), + onMouseover: composeEventHandlers( + () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseover, + enqueuePreload, + ), + onMouseleave: composeEventHandlers( + () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseleave, handleLeave, - ]), - onMouseout: composeEventHandlers([ - eventHandlers.onMouseout, + ), + onMouseout: composeEventHandlers( + () => getLinkEventHandlers(getOptions() as LinkEventOptions).onMouseout, handleLeave, - ]), - onTouchstart: composeEventHandlers([ - eventHandlers.onTouchstart, + ), + onTouchstart: composeEventHandlers( + () => getLinkEventHandlers(getOptions() as LinkEventOptions).onTouchstart, handleTouchStart, - ]), + ), } // Compute all props synchronously to avoid hydration mismatches // Using Vue.computed ensures props are calculated at render time, not after const computedProps = Vue.computed(() => { + const options = getOptions() + if (type.value === 'external') { + return getExternalLinkProps(options, router, ref, staticEventHandlers) + } + const { resolvedActiveProps, resolvedInactiveProps, @@ -433,11 +423,10 @@ export function useLinkProps< } = resolvedStyleProps.value return combineResultProps({ href: href.value, - options: options as AnyLinkPropsOptions, + options, ref, staticEventHandlers, isActive: isActive.value, - isTransitioning: isTransitioning.value, resolvedActiveProps, resolvedInactiveProps, resolvedClassName, @@ -449,13 +438,7 @@ export function useLinkProps< return computedProps as unknown as LinkHTMLAttributes } -function resolveStyleProps({ - options, - isActive, -}: { - options: AnyLinkPropsOptions - isActive: boolean -}) { +function resolveStyleProps(options: AnyLinkPropsOptions, isActive: boolean) { const activeProps = options.activeProps || (() => ({ class: 'active' })) const resolvedActiveProps: StyledProps = (isActive ? typeof activeProps === 'function' @@ -506,7 +489,6 @@ function combineResultProps({ href, options, isActive, - isTransitioning, resolvedActiveProps, resolvedInactiveProps, resolvedClassName, @@ -518,29 +500,19 @@ function combineResultProps({ href: string | undefined options: AnyLinkPropsOptions isActive: boolean - isTransitioning: boolean resolvedActiveProps: StyledProps resolvedInactiveProps: StyledProps resolvedClassName?: string resolvedStyle?: Record ref?: Vue.VNodeRef | undefined - staticEventHandlers?: { - onClick: any - onBlur: any - onFocus: any - onMouseenter: any - onMouseover: any - onMouseleave: any - onMouseout: any - onTouchstart: any - } + staticEventHandlers?: LinkEventHandlers }) { const result: Record = { ...getPropsSafeToSpread(options), ref, ...staticEventHandlers, href, - disabled: !!options.disabled, + disabled: options._asChild ? !!options.disabled : undefined, target: options.target, } @@ -562,10 +534,6 @@ function combineResultProps({ result['aria-current'] = 'page' } - if (isTransitioning) { - result['data-transitioning'] = 'transitioning' - } - for (const key of Object.keys(resolvedActiveProps)) { if (key !== 'class' && key !== 'style') { result[key] = resolvedActiveProps[key] @@ -580,6 +548,56 @@ function combineResultProps({ return result } +function getExternalLinkProps( + options: AnyLinkPropsOptions, + router: AnyRouter, + ref: Vue.Ref, + staticEventHandlers?: LinkEventHandlers, +): LinkHTMLAttributes { + const dangerous = isDangerousProtocol( + options.to as string, + router.protocolAllowlist, + ) + if (dangerous && process.env.NODE_ENV !== 'production') { + console.warn(`Blocked Link with dangerous protocol: ${options.to}`) + } + + const eventHandlers = getLinkEventHandlers(options as LinkEventOptions) + const result: Record = { + ...getPropsSafeToSpread(options), + ref, + href: dangerous || options.disabled ? undefined : options.to, + target: options.target, + disabled: options._asChild ? !!options.disabled : undefined, + style: options.style, + class: options.class, + onClick: staticEventHandlers?.onClick ?? options.onClick, + onBlur: staticEventHandlers?.onBlur ?? options.onBlur, + onFocus: staticEventHandlers?.onFocus ?? options.onFocus, + onMouseenter: + staticEventHandlers?.onMouseenter ?? eventHandlers.onMouseenter, + onMouseleave: + staticEventHandlers?.onMouseleave ?? eventHandlers.onMouseleave, + onMouseover: staticEventHandlers?.onMouseover ?? eventHandlers.onMouseover, + onMouseout: staticEventHandlers?.onMouseout ?? eventHandlers.onMouseout, + onTouchstart: + staticEventHandlers?.onTouchstart ?? eventHandlers.onTouchstart, + } + + if (options.disabled) { + result.role = 'link' + result['aria-disabled'] = true + } + + for (const key of Object.keys(result)) { + if (result[key] === undefined) { + delete result[key] + } + } + + return result as LinkHTMLAttributes +} + function getLinkEventHandlers( options: LinkEventOptions, ): VueStyleLinkEventHandlers { @@ -645,25 +663,20 @@ const getPropsSafeToSpread = (options: AnyLinkPropsOptions) => { return propsSafeToSpread } -function getIsActive({ - activeOptions, - loc, - nextLoc, - router, -}: { - activeOptions: LinkOptions['activeOptions'] +function getIsActive( loc: { pathname: string search: any hash: string - } + }, nextLoc: { pathname: string search: any hash: string - } - router: AnyRouter -}) { + }, + activeOptions: LinkOptions['activeOptions'], + router: AnyRouter, +) { if (activeOptions?.exact) { const testExact = exactPathTest( loc.pathname, @@ -702,15 +715,11 @@ function getIsActive({ return true } -function getHref({ - options, - router, - nextLocation, -}: { - options: AnyLinkPropsOptions - router: AnyRouter - nextLocation?: ParsedLocation -}) { +function getHref( + options: AnyLinkPropsOptions, + router: AnyRouter, + nextLocation?: ParsedLocation, +) { if (options.disabled) { return undefined } @@ -782,12 +791,7 @@ export type LinkProps< export interface LinkPropsChildren { // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns - children?: - | Vue.VNodeChild - | ((state: { - isActive: boolean - isTransitioning: boolean - }) => Vue.VNodeChild) + children?: Vue.VNodeChild | ((state: { isActive: boolean }) => Vue.VNodeChild) } type LinkComponentVueProps = TComp extends keyof HTMLElementTagNameMap @@ -888,9 +892,25 @@ const LinkImpl = Vue.defineComponent({ 'target', ], setup(props, { attrs, slots }) { - // Call useLinkProps ONCE during setup with combined props and attrs - const allProps = { ...props, ...attrs } - const linkPropsSource = useLinkProps(allProps) as + const attrsSnapshot = Vue.shallowRef({ ...attrs }) + Vue.onBeforeUpdate(() => { + const keys = Object.keys(attrs) + const previous = attrsSnapshot.value + if ( + keys.length !== Object.keys(previous).length || + keys.some((key) => !Object.is(attrs[key], previous[key])) + ) { + attrsSnapshot.value = { ...attrs } + } + }) + + // Keep a plain cached snapshot so location-only updates do not repeatedly + // cross Vue's props and attrs proxies for every link computation. + const allProps = Vue.computed(() => ({ + ...props, + ...attrsSnapshot.value, + })) + const linkPropsSource = useLinkPropsImpl(() => allProps.value) as | LinkHTMLAttributes | Vue.ComputedRef @@ -900,16 +920,9 @@ const LinkImpl = Vue.defineComponent({ const linkProps = Vue.unref(linkPropsSource) const isActive = linkProps['data-status'] === 'active' - const isTransitioning = - linkProps['data-transitioning'] === 'transitioning' // Create the slot content or empty array if no default slot - const slotContent = slots.default - ? slots.default({ - isActive, - isTransitioning, - }) - : [] + const slotContent = slots.default ? slots.default({ isActive }) : [] // Special handling for SVG links - wrap an
inside the SVG if (Component === 'svg') { diff --git a/packages/vue-router/src/nonRouteComponentContext.tsx b/packages/vue-router/src/nonRouteComponentContext.tsx new file mode 100644 index 00000000000..2111a9ef570 --- /dev/null +++ b/packages/vue-router/src/nonRouteComponentContext.tsx @@ -0,0 +1,45 @@ +import * as Vue from 'vue' + +export type NonRouteComponent = + | 'pendingComponent' + | 'errorComponent' + | 'notFoundComponent' + +export const nonRouteComponentContext = + process.env.NODE_ENV !== 'production' + ? (Symbol('nonRouteComponentContext') as Vue.InjectionKey< + Vue.ComputedRef + >) + : undefined + +const NonRouteComponentContextProvider = + process.env.NODE_ENV !== 'production' + ? Vue.defineComponent({ + name: 'NonRouteComponentContextProvider', + props: { + value: { + type: String as Vue.PropType, + required: true, + }, + }, + setup(props, { slots }) { + Vue.provide( + nonRouteComponentContext!, + Vue.computed(() => props.value), + ) + return () => slots.default?.() + }, + }) + : undefined + +export function renderInNonRouteComponentContext( + component: Vue.Component, + props: Record | undefined, + context: NonRouteComponent, +): Vue.VNode { + return Vue.h( + NonRouteComponentContextProvider!, + { value: context }, + { default: () => Vue.h(component, props) }, + ) +} diff --git a/packages/vue-router/src/renderRouteNotFound.tsx b/packages/vue-router/src/renderRouteNotFound.tsx index 3b029070a9c..104a65ab730 100644 --- a/packages/vue-router/src/renderRouteNotFound.tsx +++ b/packages/vue-router/src/renderRouteNotFound.tsx @@ -1,5 +1,6 @@ import * as Vue from 'vue' import { DefaultGlobalNotFound } from './not-found' +import { renderInNonRouteComponentContext } from './nonRouteComponentContext' import type { AnyRoute, AnyRouter } from '@tanstack/router-core' /** @@ -17,7 +18,13 @@ export function renderRouteNotFound( ): Vue.VNode { if (!route.options.notFoundComponent) { if (router.options.defaultNotFoundComponent) { - return Vue.h(router.options.defaultNotFoundComponent, data) + return process.env.NODE_ENV !== 'production' + ? renderInNonRouteComponentContext( + router.options.defaultNotFoundComponent, + data, + 'notFoundComponent', + ) + : Vue.h(router.options.defaultNotFoundComponent, data) } if (process.env.NODE_ENV !== 'production') { @@ -31,5 +38,11 @@ export function renderRouteNotFound( return Vue.h(DefaultGlobalNotFound) } - return Vue.h(route.options.notFoundComponent, data) + return process.env.NODE_ENV !== 'production' + ? renderInNonRouteComponentContext( + route.options.notFoundComponent, + data, + 'notFoundComponent', + ) + : Vue.h(route.options.notFoundComponent, data) } diff --git a/packages/vue-router/src/useBlocker.tsx b/packages/vue-router/src/useBlocker.tsx index 4802a3e82af..17eef20f7aa 100644 --- a/packages/vue-router/src/useBlocker.tsx +++ b/packages/vue-router/src/useBlocker.tsx @@ -179,21 +179,23 @@ export function useBlocker( location: HistoryLocation, ): AnyShouldBlockFnLocation { const parsedLocation = router.parseLocation(location) - const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname) - if (matchedRoutes.foundRoute === undefined) { + const [, rawParams, foundRoute] = router.getMatchedRoutes( + parsedLocation.pathname, + ) + if (foundRoute === undefined) { return { routeId: '__notFound__', fullPath: parsedLocation.pathname, pathname: parsedLocation.pathname, - params: matchedRoutes.routeParams, + params: rawParams, search: parsedLocation.search, } } return { - routeId: matchedRoutes.foundRoute.id, - fullPath: matchedRoutes.foundRoute.fullPath, + routeId: foundRoute.id, + fullPath: foundRoute.fullPath, pathname: parsedLocation.pathname, - params: matchedRoutes.routeParams, + params: rawParams, search: parsedLocation.search, } } @@ -373,21 +375,23 @@ const BlockImpl = Vue.defineComponent({ location: HistoryLocation, ): AnyShouldBlockFnLocation { const parsedLocation = router.parseLocation(location) - const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname) - if (matchedRoutes.foundRoute === undefined) { + const [, rawParams, foundRoute] = router.getMatchedRoutes( + parsedLocation.pathname, + ) + if (foundRoute === undefined) { return { routeId: '__notFound__', fullPath: parsedLocation.pathname, pathname: parsedLocation.pathname, - params: matchedRoutes.routeParams, + params: rawParams, search: parsedLocation.search, } } return { - routeId: matchedRoutes.foundRoute.id, - fullPath: matchedRoutes.foundRoute.fullPath, + routeId: foundRoute.id, + fullPath: foundRoute.fullPath, pathname: parsedLocation.pathname, - params: matchedRoutes.routeParams, + params: rawParams, search: parsedLocation.search, } } diff --git a/packages/vue-router/src/useRouterState.tsx b/packages/vue-router/src/useRouterState.tsx index 13b6f852369..7d3d536f57d 100644 --- a/packages/vue-router/src/useRouterState.tsx +++ b/packages/vue-router/src/useRouterState.tsx @@ -39,9 +39,9 @@ export function useRouterState< // During SSR we render exactly once and do not need reactivity. // Avoid subscribing to the store on the server since the server store // implementation does not provide subscribe() semantics. - const _isServer = isServer ?? router.isServer - - if (_isServer) { + // The expression must stay inlined in the `if` so bundlers fold the + // browser-build constant `isServer = false` and drop this server block. + if (isServer ?? router.isServer) { const state = router.stores.__store.get() as RouterState< TRouter['routeTree'] > diff --git a/packages/vue-router/src/utils.ts b/packages/vue-router/src/utils.ts index 609c4558a8b..8787649d8bd 100644 --- a/packages/vue-router/src/utils.ts +++ b/packages/vue-router/src/utils.ts @@ -31,9 +31,8 @@ export const usePrevious = (fn: () => boolean) => { * When the intersection changes, the callback will be called with the `IntersectionObserverEntry`. * * @param ref - The ref to observe - * @param intersectionObserverOptions - The options to pass to the IntersectionObserver - * @param options - The options to pass to the hook * @param callback - The callback to call when the intersection changes + * @param disabled - Whether observation is disabled * @returns The IntersectionObserver instance * @example * ```tsx @@ -42,17 +41,15 @@ export const usePrevious = (fn: () => boolean) => { * useIntersectionObserver( * ref, * (entry) => { doSomething(entry) }, - * { rootMargin: '10px' }, - * { disabled: false } + * () => false * ) * return
* ``` */ export function useIntersectionObserver( ref: Vue.Ref, - callback: (entry: IntersectionObserverEntry | undefined) => void, - intersectionObserverOptions: IntersectionObserverInit = {}, - options: { disabled?: boolean | (() => boolean) } = {}, + callback: (entry?: IntersectionObserverEntry) => void, + disabled: () => boolean, ): Vue.Ref { const isIntersectionObserverAvailable = typeof IntersectionObserver === 'function' @@ -61,18 +58,17 @@ export function useIntersectionObserver( // Use watchEffect with cleanup to properly manage the observer lifecycle Vue.watchEffect((onCleanup) => { const r = ref.value - // Support both static boolean and function for disabled check - const isDisabled = - typeof options.disabled === 'function' - ? options.disabled() - : options.disabled - if (!r || !isIntersectionObserverAvailable || isDisabled) { + if (disabled() || !r || !isIntersectionObserverAvailable) { + onCleanup(() => callback()) return } - const observer = new IntersectionObserver(([entry]) => { - callback(entry) - }, intersectionObserverOptions) + const observer = new IntersectionObserver( + (entries) => { + callback(entries.pop()) + }, + { rootMargin: '100px' }, + ) observerRef.value = observer observer.observe(r) @@ -80,6 +76,7 @@ export function useIntersectionObserver( onCleanup(() => { observer.disconnect() observerRef.value = null + callback() }) }) diff --git a/packages/vue-router/tests/Outlet.test.tsx b/packages/vue-router/tests/Outlet.test.tsx new file mode 100644 index 00000000000..f8d0f699a2d --- /dev/null +++ b/packages/vue-router/tests/Outlet.test.tsx @@ -0,0 +1,187 @@ +import { afterEach, expect, test, vi } from 'vitest' +import { cleanup, render, screen } from '@testing-library/vue' +import { createMemoryHistory } from '@tanstack/history' +import { createControlledPromise, notFound } from '@tanstack/router-core' +import { + Outlet, + RouterProvider, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +const outletWarning = ( + component: 'pendingComponent' | 'errorComponent' | 'notFoundComponent', +) => + `Warning: An was rendered inside a ${component}. should only be rendered inside a route component.` + +afterEach(() => { + cleanup() + vi.restoreAllMocks() +}) + +test('does not warn when Outlet is rendered inside a route component', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const rootRoute = createRootRoute({ + component: () => ( + <> + Root route + + + ), + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + + expect(await screen.findByText('Index route')).toBeInTheDocument() + expect(warn).not.toHaveBeenCalled() +}) + +test('warns when Outlet is rendered inside a pendingComponent', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const pending = createControlledPromise() + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const pendingRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/pending', + loader: () => pending, + pendingMs: 0, + pendingComponent: () => ( + <> + Pending route + + + ), + component: () => Resolved route, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, pendingRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + await screen.findByText('Index route') + + const navigation = router.navigate({ to: '/pending' }) + expect(await screen.findByText('Pending route')).toBeInTheDocument() + pending.resolve() + await navigation + + expect(warn).toHaveBeenCalledWith(outletWarning('pendingComponent')) +}) + +test('warns when Outlet is rendered inside an errorComponent', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + loader: () => { + throw new Error('Loader failed') + }, + errorComponent: () => ( + <> + Error route + + + ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + + expect(await screen.findByText('Error route')).toBeInTheDocument() + expect(warn).toHaveBeenCalledWith(outletWarning('errorComponent')) +}) + +test('warns with the current component after a fallback transition', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const pending = createControlledPromise() + const FallbackComponent = (props: { error?: Error }) => ( + <> + {props.error ? 'Error route' : 'Pending route'} + + + ) + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const transitionRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/transition', + loader: () => pending, + pendingMs: 0, + pendingComponent: FallbackComponent, + errorComponent: FallbackComponent, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, transitionRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + await screen.findByText('Index route') + + const navigation = router.navigate({ to: '/transition' }) + expect(await screen.findByText('Pending route')).toBeInTheDocument() + pending.reject(new Error('Loader failed')) + await navigation + + expect(await screen.findByText('Error route')).toBeInTheDocument() + expect(warn).toHaveBeenCalledWith(outletWarning('pendingComponent')) + expect(warn).toHaveBeenCalledWith(outletWarning('errorComponent')) +}) + +test('warns when Outlet is rendered inside a notFoundComponent', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const rootRoute = createRootRoute({ component: Outlet }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => Index route, + }) + const notFoundRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/not-found', + component: () => { + throw notFound() + }, + notFoundComponent: () => ( + <> + Not found route + + + ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, notFoundRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + render() + await screen.findByText('Index route') + await router.navigate({ to: '/not-found' }) + + expect(await screen.findByText('Not found route')).toBeInTheDocument() + expect(warn).toHaveBeenCalledWith(outletWarning('notFoundComponent')) +}) diff --git a/packages/vue-router/tests/fileRoute.test.ts b/packages/vue-router/tests/fileRoute.test.ts index f6b92298c8e..5d459d1b7ed 100644 --- a/packages/vue-router/tests/fileRoute.test.ts +++ b/packages/vue-router/tests/fileRoute.test.ts @@ -1,13 +1,38 @@ /* eslint-disable */ -import { describe, it, expect } from 'vitest' +import { afterEach, describe, it, expect, vi } from 'vitest' import { getRouteApi, createFileRoute, createLazyRoute, createLazyFileRoute, LazyRoute, + FileRoute, } from '../src' +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('createFileRoute', () => { + it('creates a non-root route without a deprecation warning', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = createFileRoute('')({}) + + expect(route.isRoot).toBe(false) + expect(warn).not.toHaveBeenCalled() + }) + + it('keeps the deprecation warning for direct FileRoute usage', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = new FileRoute('').createRoute({}) + + expect(route.isRoot).toBe(false) + expect(warn).toHaveBeenCalledOnce() + }) +}) + describe('createFileRoute has the same hooks as getRouteApi', () => { const routeApi = getRouteApi('foo') const hookNames = Object.keys(routeApi).filter((key) => key.startsWith('use')) diff --git a/packages/vue-router/tests/issue-7986-retained-pending.test.tsx b/packages/vue-router/tests/issue-7986-retained-pending.test.tsx new file mode 100644 index 00000000000..57e94e2ad03 --- /dev/null +++ b/packages/vue-router/tests/issue-7986-retained-pending.test.tsx @@ -0,0 +1,660 @@ +import { cleanup, render, screen, waitFor } from '@testing-library/vue' +import { afterEach, expect, test, vi } from 'vitest' +import { createControlledPromise } from '@tanstack/router-core' +import { nextTick } from 'vue' +import { + Outlet, + RouterProvider, + createLazyRoute, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' +import type { ControlledPromise } from '@tanstack/router-core' + +const controlledPromises = new Set>() +const pendingOperations = new Set>() + +afterEach(async () => { + try { + for (const promise of controlledPromises) { + if (promise.status === 'pending') { + promise.resolve() + } + } + if (vi.isFakeTimers()) { + await vi.runAllTimersAsync() + } + await Promise.allSettled(pendingOperations) + } finally { + controlledPromises.clear() + pendingOperations.clear() + cleanup() + vi.useRealTimers() + vi.restoreAllMocks() + } +}) + +const navigationDelay = 100 + +function controlled() { + const promise = createControlledPromise() + controlledPromises.add(promise) + return promise +} + +function track(operation: Promise) { + pendingOperations.add(operation) + return operation +} + +function setup() { + const navigationBeforeLoadStarted = controlled() + let beforeLoadCalls = 0 + + const rootRoute = createRootRoute({ component: () => }) + const layoutRoute = createRoute({ + getParentRoute: () => rootRoute, + id: 'app', + beforeLoad: async () => { + if (++beforeLoadCalls > 1) { + navigationBeforeLoadStarted.resolve() + await new Promise((resolve) => + setTimeout(resolve, navigationDelay), + ) + } + return { user: 'test' } + }, + component: () => , + }) + const projectRoute = createRoute({ + getParentRoute: () => layoutRoute, + path: '/projects/$projectId', + validateSearch: (search: Record): { tab?: string } => + typeof search.tab === 'string' ? { tab: search.tab } : {}, + component: Project, + }) + + function Project() { + const params = projectRoute.useParams() + const search = projectRoute.useSearch() + return ( +
+ project={params.value.projectId} tab={search.value.tab ?? 'default'} +
+ ) + } + + const router = createRouter({ + routeTree: rootRoute.addChildren([layoutRoute.addChildren([projectRoute])]), + history: createMemoryHistory({ initialEntries: ['/projects/p1'] }), + defaultPendingComponent: () =>
Pending
, + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + return { router, navigationBeforeLoadStarted } +} + +test('a search-only navigation retains successful UI while beforeLoad reruns', async () => { + const { router, navigationBeforeLoadStarted } = setup() + render() + expect(await screen.findByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + + vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) + const navigation = track( + router.navigate({ + to: '/projects/$projectId', + params: { projectId: 'p1' }, + search: { tab: 'files' }, + }), + ) + await navigationBeforeLoadStarted + + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(0) + await nextTick() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(navigationDelay) + await navigation + await nextTick() + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=files', + ) +}) + +test('a path-param navigation retains successful UI while beforeLoad reruns', async () => { + const { router, navigationBeforeLoadStarted } = setup() + render() + expect(await screen.findByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + + vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) + const navigation = track( + router.navigate({ + to: '/projects/$projectId', + params: { projectId: 'p2' }, + }), + ) + await navigationBeforeLoadStarted + + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(0) + await nextTick() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p1 tab=default', + ) + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(navigationDelay) + await navigation + await nextTick() + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent( + 'project=p2 tab=default', + ) +}) + +test('a blocking reload retains the exact successful match', async () => { + const reloadStarted = controlled() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ component: () => }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + validateSearch: (search: Record): { tab?: string } => + typeof search.tab === 'string' ? { tab: search.tab } : {}, + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (++loaderCalls === 1) { + return 'initial' + } + reloadStarted.resolve() + return new Promise((resolve) => + setTimeout(() => resolve('reloaded'), navigationDelay), + ) + }, + }, + component: () => { + const loaderData = pageRoute.useLoaderData() + const search = pageRoute.useSearch() + return ( +
+ {loaderData.value} tab={search.value.tab ?? 'default'} +
+ ) + }, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingComponent: () =>
Pending
, + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toHaveTextContent( + 'initial tab=default', + ) + + vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) + const navigation = track( + router.navigate({ + to: '/page', + search: { tab: 'files' }, + }), + ) + await reloadStarted + + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('initial tab=default') + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(0) + await nextTick() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('initial tab=default') + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(navigationDelay) + await navigation + await nextTick() + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent('reloaded tab=files') +}) + +test('a cached success retries through pending UI when an error is mounted', async () => { + vi.spyOn(console, 'error').mockImplementation(() => {}) + vi.spyOn(console, 'warn').mockImplementation(() => {}) + const retryStarted = controlled() + const retry = controlled() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ component: () => }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + loaderCalls++ + if (loaderCalls === 1) { + throw new Error('initial load failed') + } + if (loaderCalls === 2) { + return 'preloaded' + } + retryStarted.resolve() + return retry.then(() => 'retried') + }, + }, + component: () => { + const loaderData = pageRoute.useLoaderData() + return
{loaderData.value}
+ }, + pendingComponent: () =>
Pending
, + errorComponent: () =>
Failed
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('error')).toBeInTheDocument() + + await router.preloadRoute({ to: '/page' }) + expect(loaderCalls).toBe(2) + expect(screen.getByTestId('error')).toBeInTheDocument() + + const navigation = track(router.navigate({ to: '/page' })) + await retryStarted + await nextTick() + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.queryByTestId('error')).not.toBeInTheDocument() + + retry.resolve() + await navigation + await nextTick() + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('retried') +}) + +test('a cache-only success retries through pending UI over mounted success', async () => { + const retryStarted = controlled() + const retry = controlled() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ component: () => }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + const generation = ++loaderCalls + if (generation === 3) { + retryStarted.resolve() + return retry.then(() => `generation ${generation}`) + } + return `generation ${generation}` + }, + }, + component: () => { + const loaderData = pageRoute.useLoaderData() + return
{loaderData.value}
+ }, + pendingComponent: () =>
Pending
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toHaveTextContent('generation 1') + + await router.preloadRoute({ to: '/page' }) + expect(loaderCalls).toBe(2) + expect(screen.getByTestId('content')).toHaveTextContent('generation 1') + + const navigation = track(router.navigate({ to: '/page' })) + await retryStarted + await nextTick() + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.queryByTestId('content')).not.toBeInTheDocument() + + retry.resolve() + await navigation + await nextTick() + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toHaveTextContent('generation 3') +}) + +test('a success hidden below an error boundary retries through pending UI', async () => { + vi.spyOn(console, 'error').mockImplementation(() => {}) + vi.spyOn(console, 'warn').mockImplementation(() => {}) + const childReloadStarted = controlled() + const childReload = controlled() + let parentFails = false + let childReloads = false + + const rootRoute = createRootRoute({ component: () => }) + const parentRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/parent', + shouldReload: true, + loader: () => { + if (parentFails) { + throw new Error('parent failed') + } + return 'parent data' + }, + component: () => , + errorComponent: () =>
Parent failed
, + }) + const childRoute = createRoute({ + getParentRoute: () => parentRoute, + path: '/child', + shouldReload: () => childReloads, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (childReloads) { + childReloadStarted.resolve() + return childReload.then(() => 'reloaded child') + } + return 'initial child' + }, + }, + component: () => { + const loaderData = childRoute.useLoaderData() + return
{loaderData.value}
+ }, + pendingComponent: () =>
Pending child
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([parentRoute.addChildren([childRoute])]), + history: createMemoryHistory({ initialEntries: ['/parent/child'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toHaveTextContent( + 'initial child', + ) + + parentFails = true + await track(router.navigate({ to: '/parent/child' })) + await nextTick() + expect(await screen.findByTestId('error')).toBeInTheDocument() + + parentFails = false + childReloads = true + const navigation = track(router.navigate({ to: '/parent/child' })) + await childReloadStarted + await nextTick() + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.queryByTestId('error')).not.toBeInTheDocument() + + childReload.resolve() + await navigation + await nextTick() + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('reloaded child') +}) + +test('a global not-found destination does not retain the mounted root success', async () => { + const missingStarted = controlled() + const missingLoader = controlled() + let loaderCalls = 0 + + const rootRoute = createRootRoute({ + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (++loaderCalls === 1) { + return 'initial root' + } + missingStarted.resolve() + return missingLoader + }, + }, + component: () => , + pendingComponent: () =>
Pending root
, + notFoundComponent: () =>
Missing
, + }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + component: () =>
Page
, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toBeInTheDocument() + + const navigation = track(router.navigate({ to: '/missing' } as any)) + await missingStarted + await nextTick() + + expect(await screen.findByTestId('pending')).toBeVisible() + expect(screen.queryByTestId('content')).not.toBeInTheDocument() + + missingLoader.resolve() + await navigation + await nextTick() + + expect(screen.queryByTestId('pending')).not.toBeInTheDocument() + expect(screen.getByTestId('missing')).toBeVisible() +}) + +test('lazy fuzzy-boundary relocation retains the mounted parent', async () => { + const lazyStarted = controlled() + const lazyRoute = controlled() + const parentReloadStarted = controlled() + const parentReload = controlled() + let parentLoads = 0 + + const rootRoute = createRootRoute({ + component: () => , + notFoundComponent: () =>
Root missing
, + }) + const parentRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/parent', + beforeLoad: async () => { + if (++parentLoads > 1) { + parentReloadStarted.resolve() + await parentReload + } + }, + component: () => ( +
+
Parent content
+ +
+ ), + pendingComponent: () => ( +
Parent pending
+ ), + notFoundComponent: () => ( +
Parent missing
+ ), + }) + const childRoute = createRoute({ + getParentRoute: () => parentRoute, + path: '/child', + }).lazy(async () => { + lazyStarted.resolve() + await lazyRoute + return createLazyRoute('/parent/child')({ + notFoundComponent: () => ( +
Child missing
+ ), + }) + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([parentRoute.addChildren([childRoute])]), + history: createMemoryHistory({ initialEntries: ['/parent'] }), + defaultPendingComponent: () => ( +
Pending
+ ), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('parent-content')).toBeVisible() + + const navigation = track( + router.navigate({ + to: '/parent/child/missing' as any, + }), + ) + await lazyStarted + await nextTick() + + expect(screen.getByTestId('parent-content')).toBeVisible() + expect(screen.queryByTestId('parent-pending')).not.toBeInTheDocument() + expect(screen.queryByTestId('parent-missing')).not.toBeInTheDocument() + + lazyRoute.resolve() + await parentReloadStarted + await nextTick() + + expect(screen.getByTestId('parent-content')).toBeVisible() + expect(screen.queryByTestId('parent-pending')).not.toBeInTheDocument() + expect(screen.queryByTestId('parent-missing')).not.toBeInTheDocument() + + parentReload.resolve() + await navigation + await nextTick() + + expect(screen.getByTestId('child-missing')).toBeVisible() + expect(screen.queryByTestId('root-missing')).not.toBeInTheDocument() + expect(screen.queryByTestId('parent-missing')).not.toBeInTheDocument() +}) + +test('a superseding navigation replaces an unrelated pending presentation', async () => { + const otherStarted = controlled() + const otherLoader = controlled() + const pageReloadStarted = controlled() + const pageReload = controlled() + let pageLoads = 0 + + const rootRoute = createRootRoute({ component: () => }) + const pageRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/page', + shouldReload: true, + loader: { + staleReloadMode: 'blocking', + handler: () => { + if (++pageLoads === 1) { + return 'initial page' + } + pageReloadStarted.resolve() + return pageReload.then(() => 'reloaded page') + }, + }, + component: () => { + const loaderData = pageRoute.useLoaderData() + return
{loaderData.value}
+ }, + pendingComponent: () =>
Page pending
, + }) + const otherRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/other', + loader: async () => { + otherStarted.resolve() + await otherLoader + }, + pendingComponent: () => ( +
Other pending
+ ), + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([pageRoute, otherRoute]), + history: createMemoryHistory({ initialEntries: ['/page'] }), + defaultPendingMs: 0, + defaultPendingMinMs: 1, + }) + + render() + expect(await screen.findByTestId('content')).toHaveTextContent('initial page') + + const otherNavigation = track(router.navigate({ to: '/other' })) + await otherStarted + await nextTick() + expect(await screen.findByTestId('other-pending')).toBeVisible() + + const navigation = track(router.navigate({ to: '/page' })) + await pageReloadStarted + await nextTick() + + await waitFor(() => { + expect(screen.getByTestId('page-pending')).toBeVisible() + expect(screen.queryByTestId('other-pending')).not.toBeInTheDocument() + }) + + pageReload.resolve() + await navigation + otherLoader.resolve() + await Promise.allSettled([otherNavigation]) + await nextTick() + + expect(screen.queryByTestId('page-pending')).not.toBeInTheDocument() + expect(screen.getByTestId('content')).toBeVisible() + expect(screen.getByTestId('content')).toHaveTextContent('reloaded page') +}) diff --git a/packages/vue-router/tests/link.test.tsx b/packages/vue-router/tests/link.test.tsx index be5e9bf70be..1669682cb2d 100644 --- a/packages/vue-router/tests/link.test.tsx +++ b/packages/vue-router/tests/link.test.tsx @@ -33,6 +33,7 @@ import { useRouteContext, useSearch, } from '../src' +import { useIntersectionObserver } from '../src/utils' import { getIntersectionObserverMock, getSearchParamsFromURI, @@ -42,12 +43,16 @@ import type { RouterHistory } from '../src' const ioObserveMock = vi.fn() const ioDisconnectMock = vi.fn() +let ioCallback: IntersectionObserverCallback let history: RouterHistory beforeEach(() => { const io = getIntersectionObserverMock({ observe: ioObserveMock, disconnect: ioDisconnectMock, + onCreate: (callback) => { + ioCallback = callback + }, }) vi.stubGlobal('IntersectionObserver', io) history = createBrowserHistory() @@ -55,6 +60,7 @@ beforeEach(() => { }) afterEach(() => { + vi.useRealTimers() history.destroy?.() window.history.replaceState(null, 'root', '/') vi.resetAllMocks() @@ -406,6 +412,220 @@ describe('Link', () => { expect(vueCaseTouchstart).toHaveBeenCalledTimes(1) }) + test('reacts to internal and external destination changes', async () => { + const to = Vue.ref('/posts') + const target = Vue.ref() + const decorated = Vue.ref(false) + const disabled = Vue.ref(false) + + const rootRoute = createRootRoute({ + component: Vue.defineComponent({ + setup() { + return () => + Vue.h( + Link as any, + { + to: to.value, + target: target.value, + disabled: disabled.value, + ...(decorated.value + ? { class: 'decorated', 'aria-label': 'Updated link' } + : {}), + }, + { default: () => 'Dynamic link' }, + ) + }, + }), + }) + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute, aboutRoute]), + history, + }) + const navigateSpy = vi.spyOn(router, 'navigate') + + render() + + const link = await screen.findByRole('link', { name: 'Dynamic link' }) + expect(link).toHaveAttribute('href', '/posts') + expect(link).not.toHaveClass('decorated') + + to.value = 'https://example.com/one' + target.value = '_blank' + decorated.value = true + disabled.value = true + await Vue.nextTick() + + expect(link).not.toHaveAttribute('href') + expect(link).toHaveAttribute('target', '_blank') + expect(link).toHaveAttribute('aria-label', 'Updated link') + expect(link).toHaveClass('decorated') + expect(link).toHaveAttribute('role', 'link') + expect(link).toHaveAttribute('aria-disabled', 'true') + expect(link).not.toHaveAttribute('disabled') + + disabled.value = false + to.value = 'https://example.com/two' + await Vue.nextTick() + expect(link).toHaveAttribute('href', 'https://example.com/two') + expect(link).not.toHaveAttribute('aria-disabled') + expect(link).not.toHaveAttribute('disabled') + + to.value = 'javascript:alert(1)' + await Vue.nextTick() + expect(link).not.toHaveAttribute('href') + + to.value = 'https://example.com/three' + await Vue.nextTick() + expect(link).toHaveAttribute('href', 'https://example.com/three') + + to.value = '/about' + target.value = undefined + decorated.value = false + disabled.value = false + await Vue.nextTick() + + expect(link).toHaveAttribute('href', '/about') + expect(link).not.toHaveAttribute('target') + expect(link).not.toHaveAttribute('aria-label') + expect(link).not.toHaveClass('decorated') + expect(link).not.toHaveAttribute('aria-disabled') + expect(link).not.toHaveAttribute('disabled') + + decorated.value = true + await Vue.nextTick() + expect(link).toHaveAttribute('aria-label', 'Updated link') + expect(link).toHaveClass('decorated') + + decorated.value = false + await Vue.nextTick() + expect(link).not.toHaveAttribute('aria-label') + expect(link).not.toHaveClass('decorated') + + await fireEvent.click(link) + expect(navigateSpy).toHaveBeenCalledOnce() + }) + + test('tracks router location after an external link becomes internal', async () => { + const to = Vue.ref('https://example.com') + const rootRoute = createRootRoute({ + component: Vue.defineComponent({ + setup() { + return () => ( + + Initially external + + ) + }, + }), + }) + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute]), + history, + }) + + render() + + const link = await screen.findByRole('link', { name: 'Initially external' }) + expect(link).toHaveAttribute('href', 'https://example.com') + + to.value = '/posts' + await Vue.nextTick() + expect(link).toHaveAttribute('href', '/posts') + + await fireEvent.click(link) + await waitFor(() => { + expect(window.location.pathname).toBe('/posts') + expect(link).toHaveAttribute('data-status', 'active') + }) + }) + + test('uses current event handlers after link props change', async () => { + const firstClick = vi.fn((event: MouseEvent) => event.preventDefault()) + const secondClick = vi.fn((event: MouseEvent) => event.preventDefault()) + const firstMouseEnter = vi.fn() + const secondMouseEnter = vi.fn() + const clickHandler = Vue.shallowRef< + ((event: MouseEvent) => void) | undefined + >(firstClick) + const mouseEnterHandler = Vue.shallowRef< + ((event: MouseEvent) => void) | undefined + >(firstMouseEnter) + const disabled = Vue.ref(false) + + const rootRoute = createRootRoute({ + component: Vue.defineComponent({ + setup() { + return () => ( + + Dynamic handlers + + ) + }, + }), + }) + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute]), + history, + }) + + render() + + const link = await screen.findByRole('link', { name: 'Dynamic handlers' }) + await fireEvent.click(link) + await fireEvent.mouseEnter(link) + expect(firstClick).toHaveBeenCalledOnce() + expect(firstMouseEnter).toHaveBeenCalledOnce() + + clickHandler.value = secondClick + mouseEnterHandler.value = secondMouseEnter + await Vue.nextTick() + await fireEvent.click(link) + await fireEvent.mouseEnter(link) + + expect(firstClick).toHaveBeenCalledOnce() + expect(firstMouseEnter).toHaveBeenCalledOnce() + expect(secondClick).toHaveBeenCalledOnce() + expect(secondMouseEnter).toHaveBeenCalledOnce() + + clickHandler.value = undefined + mouseEnterHandler.value = undefined + await Vue.nextTick() + await fireEvent.click(link) + await fireEvent.mouseEnter(link) + + expect(secondClick).toHaveBeenCalledOnce() + expect(secondMouseEnter).toHaveBeenCalledOnce() + + disabled.value = true + await Vue.nextTick() + await fireEvent.click(link) + await fireEvent.mouseEnter(link) + + expect(secondClick).toHaveBeenCalledOnce() + expect(secondMouseEnter).toHaveBeenCalledOnce() + }) + describe('when the current route has a search fields with undefined values', () => { async function runTest(opts: { explicitUndefined: boolean | undefined }) { const rootRoute = createRootRoute() @@ -5053,6 +5273,191 @@ describe('Link', () => { expect(ioDisconnectMock).not.toHaveBeenCalled() // it should not disconnect again }) + test('Link.preload="viewport" should respect preloadDelay', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => ( + <> + + Viewport Link + + + Intent Link + + + ), + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, aboutRoute]), + history, + }) + const preloadRouteSpy = vi.spyOn(router, 'preloadRoute') + + render() + + const viewportLink = await screen.findByRole('link', { + name: 'Viewport Link', + }) + const intentLink = await screen.findByRole('link', { name: 'Intent Link' }) + vi.useFakeTimers() + + ioCallback([], {} as IntersectionObserver) + ioCallback( + [ + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).not.toHaveBeenCalled() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + fireEvent.mouseLeave(viewportLink) + + expect(preloadRouteSpy).not.toHaveBeenCalled() + await vi.advanceTimersByTimeAsync(49) + expect(preloadRouteSpy).not.toHaveBeenCalled() + await vi.advanceTimersByTimeAsync(1) + expect(preloadRouteSpy).toHaveBeenCalledOnce() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).toHaveBeenCalledOnce() + + ioCallback( + [ + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(49) + + ioCallback( + [ + { + isIntersecting: false, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + { + isIntersecting: true, + target: viewportLink, + } as unknown as IntersectionObserverEntry, + ], + {} as IntersectionObserver, + ) + await vi.advanceTimersByTimeAsync(1) + expect(preloadRouteSpy).toHaveBeenCalledTimes(2) + + fireEvent.mouseEnter(intentLink) + fireEvent.mouseLeave(intentLink) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).toHaveBeenCalledTimes(2) + }) + + test('Link.disabled should disable viewport observation', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => ( + <> +

Index Heading

+ + Index Link + + + ), + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + defaultPreload: 'viewport', + }) + + render() + + const indexLink = await screen.findByRole('link', { name: 'Index Link' }) + expect(indexLink).toBeInTheDocument() + expect(indexLink).toHaveAttribute('aria-disabled', 'true') + expect(ioObserveMock).not.toHaveBeenCalled() + }) + + test('useIntersectionObserver should react to its disabled getter', async () => { + const TestComponent = Vue.defineComponent({ + name: 'TestComponent', + setup() { + const element = Vue.ref(null) + const disabled = Vue.ref(true) + + useIntersectionObserver( + element, + () => {}, + () => disabled.value, + ) + + return () => ( + <> + +
+ + ) + }, + }) + + render() + expect(ioObserveMock).not.toHaveBeenCalled() + + const toggle = screen.getByRole('button', { name: 'Toggle disabled' }) + await fireEvent.click(toggle) + await waitFor(() => expect(ioObserveMock).toHaveBeenCalledOnce()) + + await fireEvent.click(toggle) + await waitFor(() => expect(ioDisconnectMock).toHaveBeenCalledOnce()) + }) + test("Router.preload='render', should trigger the route loader on render", async () => { const mock = vi.fn() @@ -5093,6 +5498,112 @@ describe('Link', () => { expect(mock).toHaveBeenCalledTimes(1) }) + test('Link.preload="render" preloads each reactive destination', async () => { + const to = Vue.ref('/posts') + const rootRoute = createRootRoute({ + component: Vue.defineComponent({ + setup() { + return () => ( + + Dynamic render preload + + ) + }, + }), + }) + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute, aboutRoute]), + history, + }) + const preloadRouteSpy = vi.spyOn(router, 'preloadRoute') + + render() + + const link = await screen.findByRole('link', { + name: 'Dynamic render preload', + }) + await waitFor(() => expect(preloadRouteSpy).toHaveBeenCalledOnce()) + expect(link).toHaveAttribute('href', '/posts') + + to.value = '/about' + await waitFor(() => expect(preloadRouteSpy).toHaveBeenCalledTimes(2)) + expect(link).toHaveAttribute('href', '/about') + }) + + test('cancels stale delayed preloads after link inputs change', async () => { + const to = Vue.ref('/posts') + const disabled = Vue.ref(false) + const rootRoute = createRootRoute({ + component: Vue.defineComponent({ + setup() { + return () => ( + + Dynamic intent preload + + ) + }, + }), + }) + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute, aboutRoute]), + history, + }) + const preloadRouteSpy = vi.spyOn(router, 'preloadRoute') + + render() + const link = await screen.findByRole('link', { + name: 'Dynamic intent preload', + }) + vi.useFakeTimers() + + await fireEvent.mouseEnter(link) + disabled.value = true + await Vue.nextTick() + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).not.toHaveBeenCalled() + + disabled.value = false + await Vue.nextTick() + await fireEvent.mouseEnter(link) + to.value = '/about' + await Vue.nextTick() + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).not.toHaveBeenCalled() + + await fireEvent.mouseEnter(link) + to.value = 'https://example.com' + await Vue.nextTick() + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).not.toHaveBeenCalled() + + to.value = '/about' + await Vue.nextTick() + await fireEvent.mouseEnter(link) + await vi.advanceTimersByTimeAsync(50) + expect(preloadRouteSpy).toHaveBeenCalledOnce() + }) + test.each([undefined, false, 'render', 'viewport'] as const)( 'Link.preload="%s" should not preload on focus, hover, or touchstart', async (preloadMode) => { @@ -5253,79 +5764,6 @@ describe('Link', () => { expect(window.location.pathname).toBe('/posts') }) - test('Link slot receives isTransitioning during pending navigation', async () => { - let resolvePostsLoader: (() => void) | undefined - - const postsLoaderPromise = new Promise((resolve) => { - resolvePostsLoader = resolve - }) - - const rootRoute = createRootRoute({ - component: () => - Vue.h(Vue.Fragment, null, [ - Vue.h( - Link, - { to: '/posts', 'data-testid': 'posts-link' }, - { - default: ({ isTransitioning }: { isTransitioning: boolean }) => ( - <> - - {isTransitioning ? 'transitioning' : 'idle'} - - Posts - - ), - }, - ), - Vue.h(Outlet), - ]), - }) - - const indexRoute = createRoute({ - getParentRoute: () => rootRoute, - path: '/', - component: () =>

Index page

, - }) - - const postsRoute = createRoute({ - ssr: false, - getParentRoute: () => rootRoute, - path: '/posts', - loader: () => postsLoaderPromise, - component: () =>

Posts page

, - }) - - const router = createRouter({ - routeTree: rootRoute.addChildren([indexRoute, postsRoute]), - history, - }) - - render() - - await screen.findByRole('heading', { name: 'Index page' }) - - const postsLink = await screen.findByTestId('posts-link') - const transitionState = await screen.findByTestId('slot-transition-state') - - expect(transitionState).toHaveTextContent('idle') - expect(postsLink).not.toHaveAttribute('data-transitioning') - - fireEvent.click(postsLink) - - await waitFor(() => expect(resolvePostsLoader).toBeDefined()) - await waitFor(() => - expect(transitionState).toHaveTextContent('transitioning'), - ) - expect(postsLink).toHaveAttribute('data-transitioning', 'transitioning') - - resolvePostsLoader?.() - - await screen.findByRole('heading', { name: 'Posts page' }) - - await waitFor(() => expect(transitionState).toHaveTextContent('idle')) - expect(postsLink).not.toHaveAttribute('data-transitioning') - }) - describe('when preloading a link, `preload` should be', () => { async function runTest({ expectedPreload, diff --git a/packages/vue-router/tests/remountDeps.test.tsx b/packages/vue-router/tests/remountDeps.test.tsx new file mode 100644 index 00000000000..ff9bf6808e3 --- /dev/null +++ b/packages/vue-router/tests/remountDeps.test.tsx @@ -0,0 +1,100 @@ +import * as Vue from 'vue' +import { cleanup, render, screen } from '@testing-library/vue' +import { afterEach, expect, test, vi } from 'vitest' +import { + Outlet, + RouterProvider, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +afterEach(() => { + cleanup() +}) + +function setup(remountOnParams: boolean | 'falsy' = false) { + const mounted = vi.fn() + const unmounted = vi.fn() + const rootRoute = createRootRoute({ component: () => }) + const ItemComponent = Vue.defineComponent({ + name: 'ItemComponent', + setup() { + const params = itemRoute.useParams() + + Vue.onMounted(mounted) + Vue.onUnmounted(unmounted) + + return () =>
Item {params.value.itemId}
+ }, + }) + const itemRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/items/$itemId', + component: ItemComponent, + remountDeps: + remountOnParams === 'falsy' + ? ({ params }) => (params.itemId === 'one' ? false : 0) + : remountOnParams + ? ({ params }) => params + : undefined, + }) + const router = createRouter({ + routeTree: rootRoute.addChildren([itemRoute]), + history: createMemoryHistory({ initialEntries: ['/items/one'] }), + }) + + render() + + return { mounted, router, unmounted } +} + +async function navigateToSecondItem( + router: ReturnType['router'], +) { + await router.navigate({ + to: '/items/$itemId', + params: { itemId: 'two' }, + }) +} + +test('keeps an active route component mounted when params change by default', async () => { + const { mounted, router, unmounted } = setup() + + expect(await screen.findByText('Item one')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(1) + expect(unmounted).not.toHaveBeenCalled() + + await navigateToSecondItem(router) + + expect(await screen.findByText('Item two')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(1) + expect(unmounted).not.toHaveBeenCalled() +}) + +test('remounts an active route component when params are remount deps', async () => { + const { mounted, router, unmounted } = setup(true) + + expect(await screen.findByText('Item one')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(1) + + await navigateToSecondItem(router) + + expect(await screen.findByText('Item two')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(2) + expect(unmounted).toHaveBeenCalledTimes(1) +}) + +test('remounts when remount deps change between falsy values', async () => { + const { mounted, router, unmounted } = setup('falsy') + + expect(await screen.findByText('Item one')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(1) + + await navigateToSecondItem(router) + + expect(await screen.findByText('Item two')).toBeInTheDocument() + expect(mounted).toHaveBeenCalledTimes(2) + expect(unmounted).toHaveBeenCalledTimes(1) +}) diff --git a/packages/vue-router/tests/utils.ts b/packages/vue-router/tests/utils.ts index be5d60819b5..da96eb2d959 100644 --- a/packages/vue-router/tests/utils.ts +++ b/packages/vue-router/tests/utils.ts @@ -20,9 +20,11 @@ export function createTimer() { export const getIntersectionObserverMock = ({ observe, disconnect, + onCreate, }: { observe: Mock disconnect: Mock + onCreate?: (callback: IntersectionObserverCallback) => void }) => { return class IO implements IntersectionObserver { root: Document | Element | null @@ -33,6 +35,7 @@ export const getIntersectionObserverMock = ({ _cb: IntersectionObserverCallback, options?: IntersectionObserverInit, ) { + onCreate?.(_cb) this.root = options?.root ?? null this.rootMargin = options?.rootMargin ?? '0px' this.scrollMargin = options?.scrollMargin ?? '0px' diff --git a/packages/vue-start-client/CHANGELOG.md b/packages/vue-start-client/CHANGELOG.md index 3b51c790ae8..4da44832dd8 100644 --- a/packages/vue-start-client/CHANGELOG.md +++ b/packages/vue-start-client/CHANGELOG.md @@ -1,5 +1,66 @@ # @tanstack/vue-start-client +## 1.167.27 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13), [`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3), [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1), [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e)]: + - @tanstack/router-core@1.171.22 + - @tanstack/vue-router@1.170.24 + - @tanstack/start-client-core@1.170.22 + +## 1.167.26 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + - @tanstack/start-client-core@1.170.21 + - @tanstack/vue-router@1.170.23 + +## 1.167.25 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`c59788c`](https://github.com/TanStack/router/commit/c59788ca20f2d2e7f264a859ebe01b7646ba3154), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + - @tanstack/start-client-core@1.170.20 + - @tanstack/vue-router@1.170.22 + +## 1.167.24 + +### Patch Changes + +- Updated dependencies [[`2fbc99f`](https://github.com/TanStack/router/commit/2fbc99f2c262b057cb957e6ebba1ee073c655186), [`6bede65`](https://github.com/TanStack/router/commit/6bede65d7074dcd83455151b66b4574268bc782c)]: + - @tanstack/start-client-core@1.170.19 + +## 1.167.23 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/router-core@1.171.19 + - @tanstack/start-client-core@1.170.18 + - @tanstack/vue-router@1.170.21 + +## 1.167.22 + +### Patch Changes + +- Updated dependencies [[`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf), [`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/vue-router@1.170.20 + - @tanstack/router-core@1.171.18 + - @tanstack/start-client-core@1.170.17 + +## 1.167.21 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + - @tanstack/start-client-core@1.170.16 + - @tanstack/vue-router@1.170.19 + ## 1.167.20 ### Patch Changes diff --git a/packages/vue-start-client/package.json b/packages/vue-start-client/package.json index 452516147e7..1b30f19255b 100644 --- a/packages/vue-start-client/package.json +++ b/packages/vue-start-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-start-client", - "version": "1.167.20", + "version": "1.167.27", "description": "Modern and scalable routing for Vue applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/vue-start-server/CHANGELOG.md b/packages/vue-start-server/CHANGELOG.md index 24a59274812..b3ec29fece0 100644 --- a/packages/vue-start-server/CHANGELOG.md +++ b/packages/vue-start-server/CHANGELOG.md @@ -1,5 +1,66 @@ # @tanstack/vue-start-server +## 1.167.31 + +### Patch Changes + +- Updated dependencies [[`7e93431`](https://github.com/TanStack/router/commit/7e93431ae9ff58c91c3c5ca10ffcb8414c1d0b13), [`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3), [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1), [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e)]: + - @tanstack/router-core@1.171.22 + - @tanstack/vue-router@1.170.24 + - @tanstack/start-server-core@1.169.26 + +## 1.167.30 + +### Patch Changes + +- Updated dependencies [[`51138a8`](https://github.com/TanStack/router/commit/51138a824cea053738f125c4c95073bd6286ff05)]: + - @tanstack/router-core@1.171.21 + - @tanstack/start-server-core@1.169.25 + - @tanstack/vue-router@1.170.23 + +## 1.167.29 + +### Patch Changes + +- Updated dependencies [[`44a8c3e`](https://github.com/TanStack/router/commit/44a8c3e1d2af305064b2363d97fc7847c6f1a246), [`5253e70`](https://github.com/TanStack/router/commit/5253e70db2083d68a788fb7c9a043bb0c5518f2a)]: + - @tanstack/router-core@1.171.20 + - @tanstack/start-server-core@1.169.24 + - @tanstack/vue-router@1.170.22 + +## 1.167.28 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/start-server-core@1.169.23 + +## 1.167.27 + +### Patch Changes + +- Updated dependencies [[`ea3a665`](https://github.com/TanStack/router/commit/ea3a665d81cbb5074c2d77ec953255ab534e7db9)]: + - @tanstack/router-core@1.171.19 + - @tanstack/start-server-core@1.169.22 + - @tanstack/vue-router@1.170.21 + +## 1.167.26 + +### Patch Changes + +- Updated dependencies [[`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf), [`84db4a8`](https://github.com/TanStack/router/commit/84db4a842311df3f7e58073f6f12aaf371aeb5c7), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/vue-router@1.170.20 + - @tanstack/router-core@1.171.18 + - @tanstack/start-server-core@1.169.21 + +## 1.167.25 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/router-core@1.171.17 + - @tanstack/start-server-core@1.169.20 + - @tanstack/vue-router@1.170.19 + ## 1.167.24 ### Patch Changes diff --git a/packages/vue-start-server/package.json b/packages/vue-start-server/package.json index cd1b8163365..5317734eedc 100644 --- a/packages/vue-start-server/package.json +++ b/packages/vue-start-server/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-start-server", - "version": "1.167.24", + "version": "1.167.31", "description": "Modern and scalable routing for Vue applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/vue-start/CHANGELOG.md b/packages/vue-start/CHANGELOG.md index 0189e65e4ee..f41dfdf368f 100644 --- a/packages/vue-start/CHANGELOG.md +++ b/packages/vue-start/CHANGELOG.md @@ -1,5 +1,88 @@ # @tanstack/vue-start +## 1.168.41 + +### Patch Changes + +- Updated dependencies [[`f500760`](https://github.com/TanStack/router/commit/f5007607d62e932b8df19de866cdc6bddcff8db3), [`1aafca9`](https://github.com/TanStack/router/commit/1aafca9b45d24f8f0dba78e716fc9582346c6ca1), [`aa10b65`](https://github.com/TanStack/router/commit/aa10b6589eeda215f5a60ea0af95a3101d8c414e)]: + - @tanstack/vue-router@1.170.24 + - @tanstack/start-client-core@1.170.22 + - @tanstack/start-plugin-core@1.171.34 + - @tanstack/start-server-core@1.169.26 + - @tanstack/vue-start-client@1.167.27 + - @tanstack/vue-start-server@1.167.31 + +## 1.168.40 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/start-client-core@1.170.21 + - @tanstack/start-plugin-core@1.171.33 + - @tanstack/start-server-core@1.169.25 + - @tanstack/vue-router@1.170.23 + - @tanstack/vue-start-client@1.167.26 + - @tanstack/vue-start-server@1.167.30 + +## 1.168.39 + +### Patch Changes + +- Updated dependencies [[`c59788c`](https://github.com/TanStack/router/commit/c59788ca20f2d2e7f264a859ebe01b7646ba3154)]: + - @tanstack/start-client-core@1.170.20 + - @tanstack/start-plugin-core@1.171.32 + - @tanstack/start-server-core@1.169.24 + - @tanstack/vue-router@1.170.22 + - @tanstack/vue-start-client@1.167.25 + - @tanstack/vue-start-server@1.167.29 + +## 1.168.38 + +### Patch Changes + +- Updated dependencies [[`2fbc99f`](https://github.com/TanStack/router/commit/2fbc99f2c262b057cb957e6ebba1ee073c655186), [`6bede65`](https://github.com/TanStack/router/commit/6bede65d7074dcd83455151b66b4574268bc782c)]: + - @tanstack/start-client-core@1.170.19 + - @tanstack/start-server-core@1.169.23 + - @tanstack/vue-start-client@1.167.24 + - @tanstack/start-plugin-core@1.171.31 + - @tanstack/vue-start-server@1.167.28 + +## 1.168.37 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/start-client-core@1.170.18 + - @tanstack/start-plugin-core@1.171.30 + - @tanstack/start-server-core@1.169.22 + - @tanstack/vue-router@1.170.21 + - @tanstack/vue-start-client@1.167.23 + - @tanstack/vue-start-server@1.167.27 + +## 1.168.36 + +### Patch Changes + +- Updated dependencies [[`2435885`](https://github.com/TanStack/router/commit/2435885fa8b5e31c8c4b74d93920919f27316ebf), [`9cac62a`](https://github.com/TanStack/router/commit/9cac62a5c7f99ef070991ea6f1fa7e42c746d46b), [`86bf510`](https://github.com/TanStack/router/commit/86bf510c2923afb76804223bd04afc2a809b33e7), [`6aefb33`](https://github.com/TanStack/router/commit/6aefb3392595a07a93f89301d7b5e3558ff9190c)]: + - @tanstack/vue-router@1.170.20 + - @tanstack/start-client-core@1.170.17 + - @tanstack/start-server-core@1.169.21 + - @tanstack/vue-start-client@1.167.22 + - @tanstack/vue-start-server@1.167.26 + - @tanstack/start-plugin-core@1.171.29 + +## 1.168.35 + +### Patch Changes + +- Updated dependencies [[`b2908c6`](https://github.com/TanStack/router/commit/b2908c642ac09aa08e6d965d2a820d7186e42fd5)]: + - @tanstack/start-client-core@1.170.16 + - @tanstack/start-plugin-core@1.171.28 + - @tanstack/start-server-core@1.169.20 + - @tanstack/vue-router@1.170.19 + - @tanstack/vue-start-client@1.167.21 + - @tanstack/vue-start-server@1.167.25 + ## 1.168.34 ### Patch Changes diff --git a/packages/vue-start/package.json b/packages/vue-start/package.json index 260004a3384..1a6f89c77ad 100644 --- a/packages/vue-start/package.json +++ b/packages/vue-start/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-start", - "version": "1.168.34", + "version": "1.168.41", "description": "Modern and scalable routing for Vue applications", "author": "Tanner Linsley", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac1df62f12b..8ebec65b8e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,10 +15,10 @@ overrides: vite: ^8.0.14 '@types/node': 25.0.9 '@playwright/test': ^1.61.0 - '@tanstack/query-core': ^5.99.0 - '@tanstack/react-query': ^5.99.0 - '@tanstack/solid-query': ^6.0.0-beta.7 - '@tanstack/vue-query': ^5.99.0 + '@tanstack/query-core': ^5.101.4 + '@tanstack/react-query': ^5.101.4 + '@tanstack/solid-query': ^6.0.0-rc.0 + '@tanstack/vue-query': ^5.101.4 '@tanstack/history': workspace:* '@tanstack/router-core': workspace:* '@tanstack/react-router': workspace:* @@ -77,7 +77,7 @@ importers: version: 1.26.2(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0))(ts-api-utils@2.4.0(@typescript/typescript6@6.0.2)) '@nx/devkit': specifier: 22.7.5 - version: 22.7.5(nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3)) + version: 22.7.5(nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3)) '@playwright/test': specifier: ^1.61.0 version: 1.61.1 @@ -86,25 +86,25 @@ importers: version: 1.14.1(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26) '@swc-node/register': specifier: ^1.11.1 - version: 1.11.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2) + version: 1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2) '@tanstack/eslint-config': specifier: 0.4.0 version: 0.4.0(@typescript-eslint/utils@8.57.1(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0)))(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0)) '@tanstack/query-core': - specifier: ^5.99.0 - version: 5.99.0 + specifier: ^5.101.4 + version: 5.101.4 '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/vite-config': specifier: 0.5.2 version: 0.5.2(@types/node@25.0.9)(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)) '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -140,7 +140,7 @@ importers: version: 4.0.3 nx: specifier: 22.7.5 - version: 22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3) + version: 22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3) prettier: specifier: ^3.8.0 version: 3.8.1 @@ -187,8 +187,8 @@ importers: benchmarks/bundle-size: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/react-router': specifier: workspace:* version: link:../../packages/react-router @@ -214,8 +214,8 @@ importers: specifier: ^19.2.3 version: 19.2.3(react@19.2.3) solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vue: specifier: ^3.5.16 version: 3.5.25(@typescript/typescript6@6.0.2) @@ -226,6 +226,9 @@ importers: '@rsbuild/plugin-react': specifier: ^2.0.0 version: 2.0.0(@rsbuild/core@2.1.1)(@rspack/core@2.1.1(@swc/helpers@0.5.23)) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../packages/router-plugin @@ -240,7 +243,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue': specifier: ^6.0.5 version: 6.0.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) @@ -253,15 +256,15 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) benchmarks/client-nav: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) + '@tanstack/history': + specifier: workspace:* + version: link:../../packages/history '@tanstack/react-router': specifier: workspace:* version: link:../../packages/react-router @@ -281,8 +284,8 @@ importers: specifier: ^19.2.3 version: 19.2.3(react@19.2.3) solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vue: specifier: ^3.5.16 version: 3.5.25(@typescript/typescript6@6.0.2) @@ -293,6 +296,9 @@ importers: '@platformatic/flame': specifier: ^1.6.0 version: 1.6.0 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../packages/router-plugin @@ -307,22 +313,22 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue': specifier: ^6.0.5 version: 6.0.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.5 version: 5.1.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) + jsdom: + specifier: ^29.1.1 + version: 29.1.1(@noble/hashes@2.0.1) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vitest: specifier: ^4.1.4 version: 4.1.4(@types/node@25.0.9)(@vitest/ui@4.1.4)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.7.0(@types/node@25.0.9)(@typescript/typescript6@6.0.2))(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -330,8 +336,8 @@ importers: benchmarks/memory/client: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -351,8 +357,8 @@ importers: specifier: ^19.2.3 version: 19.2.3(react@19.2.3) solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vue: specifier: ^3.5.16 version: 3.5.25(@typescript/typescript6@6.0.2) @@ -366,6 +372,9 @@ importers: '@platformatic/flame': specifier: ^1.6.0 version: 1.6.0 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@testing-library/react': specifier: ^16.2.0 version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -377,7 +386,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue': specifier: ^6.0.5 version: 6.0.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) @@ -393,9 +402,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vitest: specifier: ^4.1.4 version: 4.1.4(@types/node@25.0.9)(@vitest/ui@4.1.4)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.7.0(@types/node@25.0.9)(@typescript/typescript6@6.0.2))(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -403,8 +409,8 @@ importers: benchmarks/memory/server: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -430,8 +436,8 @@ importers: specifier: ^19.2.3 version: 19.2.3(react@19.2.3) solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vue: specifier: ^3.5.16 version: 3.5.25(@typescript/typescript6@6.0.2) @@ -445,12 +451,15 @@ importers: '@platformatic/flame': specifier: ^1.6.0 version: 1.6.0 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.5 version: 5.1.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) @@ -460,9 +469,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vitest: specifier: ^4.1.4 version: 4.1.4(@types/node@25.0.9)(@vitest/ui@4.1.4)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.7.0(@types/node@25.0.9)(@typescript/typescript6@6.0.2))(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -470,8 +476,8 @@ importers: benchmarks/ssr: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/react-router': specifier: workspace:* version: link:../../packages/react-router @@ -497,8 +503,8 @@ importers: specifier: ^19.2.3 version: 19.2.3(react@19.2.3) solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vue: specifier: ^3.5.16 version: 3.5.25(@typescript/typescript6@6.0.2) @@ -506,27 +512,27 @@ importers: '@codspeed/vitest-plugin': specifier: ^5.5.0 version: 5.5.0(debug@4.4.3)(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.5 version: 5.1.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) seroval: - specifier: ^1.5.4 - version: 1.5.4 + specifier: ^1.6.2 + version: 1.6.2 typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vitest: specifier: ^4.1.4 version: 4.1.4(@types/node@25.0.9)(@vitest/ui@4.1.4)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.7.0(@types/node@25.0.9)(@typescript/typescript6@6.0.2))(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -608,7 +614,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -651,7 +657,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -740,7 +746,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -789,7 +795,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -800,11 +806,11 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -838,7 +844,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -849,11 +855,11 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -893,7 +899,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -939,7 +945,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: ~5.9.0 version: 5.9.3 @@ -994,7 +1000,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1046,7 +1052,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1080,7 +1086,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1126,7 +1132,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1175,7 +1181,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -1183,6 +1189,37 @@ importers: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + e2e/react-router/issue-4759: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + react: + specifier: ^19.2.3 + version: 19.2.3 + react-dom: + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + devDependencies: + '@playwright/test': + specifier: ^1.61.0 + version: 1.61.1 + '@tanstack/router-e2e-utils': + specifier: workspace:^ + version: link:../../e2e-utils + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.9) + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + vite: + specifier: ^8.0.14 + version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + e2e/react-router/issue-7120: dependencies: '@tanstack/react-router': @@ -1212,7 +1249,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1220,8 +1257,8 @@ importers: e2e/react-router/issue-7457: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -1249,7 +1286,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1295,7 +1332,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1328,6 +1365,46 @@ importers: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + e2e/react-router/react-compiler: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + react: + specifier: ^19.2.3 + version: 19.2.3 + react-dom: + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + devDependencies: + '@babel/core': + specifier: ^7.29.0 + version: 7.29.0 + '@playwright/test': + specifier: ^1.61.0 + version: 1.61.1 + '@rolldown/plugin-babel': + specifier: ^0.2.0 + version: 0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + '@tanstack/router-e2e-utils': + specifier: workspace:^ + version: link:../../e2e-utils + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.9) + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + babel-plugin-react-compiler: + specifier: ^1.0.0 + version: 1.0.0 + vite: + specifier: ^8.0.14 + version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + e2e/react-router/rspack-basic-file-based: dependencies: '@tanstack/react-router': @@ -1485,7 +1562,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1537,7 +1614,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1589,7 +1666,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -1665,7 +1742,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -1741,7 +1818,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -1802,7 +1879,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -1819,11 +1896,11 @@ importers: e2e/react-start/basic-react-query: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -1875,7 +1952,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -1979,7 +2056,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2080,7 +2157,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -2126,10 +2203,10 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) nitro: specifier: ^3.0.260311-beta - version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) sass: specifier: ^1.97.2 version: 1.97.2 @@ -2196,7 +2273,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) cross-env: specifier: ^10.0.0 version: 10.0.0 @@ -2318,7 +2395,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.15 @@ -2367,7 +2444,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -2422,7 +2499,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) node-forge: specifier: ^1.3.1 version: 1.3.1 @@ -2465,7 +2542,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) autocannon: specifier: ^8.0.0 version: 8.0.0 @@ -2529,7 +2606,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2584,7 +2661,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2639,7 +2716,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2685,7 +2762,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2699,11 +2776,11 @@ importers: e2e/react-start/query-integration: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -2752,7 +2829,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2853,7 +2930,7 @@ importers: version: 8.44.1(eslint@9.22.0(jiti@2.7.0))(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-rsc': specifier: ^0.5.30 version: 0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -2905,7 +2982,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-rsc': specifier: ^0.5.30 version: 0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -2922,11 +2999,11 @@ importers: e2e/react-start/rsc-query: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -2963,7 +3040,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-rsc': specifier: ^0.5.30 version: 0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3070,7 +3147,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -3128,7 +3205,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3183,7 +3260,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3200,8 +3277,8 @@ importers: e2e/react-start/server-functions: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -3268,7 +3345,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -3323,7 +3400,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3340,8 +3417,8 @@ importers: e2e/react-start/server-routes: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -3399,7 +3476,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -3454,7 +3531,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3552,7 +3629,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3598,7 +3675,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3622,7 +3699,7 @@ importers: version: link:../../../packages/start-static-server-functions nitro: specifier: ^3.0.1-alpha.2 - version: 3.0.1-alpha.2(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.0.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 3.0.1-alpha.2(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.0.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) react: specifier: ^19.2.3 version: 19.2.3 @@ -3650,7 +3727,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -3661,8 +3738,8 @@ importers: e2e/react-start/streaming-ssr: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -3745,7 +3822,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3809,7 +3886,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -3876,7 +3953,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3893,8 +3970,8 @@ importers: e2e/solid-router/basepath-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -3905,27 +3982,27 @@ importers: specifier: workspace:^ version: link:../../../packages/solid-router-devtools solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/basic: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3939,8 +4016,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -3948,21 +4025,21 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/basic-esbuild-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -3976,8 +4053,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 zod: specifier: ^4.4.3 version: 4.4.3 @@ -3993,13 +4070,13 @@ importers: version: 0.27.4 esbuild-plugin-solid: specifier: ^0.6.0 - version: 0.6.0(esbuild@0.27.4)(solid-js@2.0.0-beta.32) + version: 0.6.0(esbuild@0.27.4)(solid-js@2.0.0-rc.0) e2e/solid-router/basic-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4016,8 +4093,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4028,6 +4105,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4037,15 +4117,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/basic-file-based-code-splitting: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4059,8 +4136,8 @@ importers: specifier: workspace:^ version: link:../../../packages/solid-router-devtools solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4071,21 +4148,21 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/basic-scroll-restoration: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4097,13 +4174,13 @@ importers: version: link:../../../packages/solid-router-devtools '@tanstack/solid-virtual': specifier: ^3.13.0 - version: 3.13.12(solid-js@2.0.0-beta.32) + version: 3.13.12(solid-js@2.0.0-rc.0) redaxios: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4111,6 +4188,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4120,24 +4200,21 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/basic-solid-query: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4148,8 +4225,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4157,21 +4234,21 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/basic-solid-query-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4179,11 +4256,11 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4194,8 +4271,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4206,21 +4283,21 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/basic-virtual-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4240,8 +4317,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4252,21 +4329,21 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/basic-virtual-named-export-config-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4286,8 +4363,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4298,21 +4375,21 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/generator-cli-only: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4329,8 +4406,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4338,21 +4415,21 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/js-only-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4366,8 +4443,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4375,6 +4452,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4384,15 +4464,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/rspack-basic-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4403,8 +4480,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@playwright/test': specifier: ^1.61.0 @@ -4417,7 +4494,7 @@ importers: version: 1.1.2(@rsbuild/core@2.1.1) '@rsbuild/plugin-solid': specifier: ^2.0.0-beta.0 - version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tailwindcss/postcss': specifier: ^4.2.2 version: 4.2.2 @@ -4443,8 +4520,8 @@ importers: e2e/solid-router/rspack-basic-virtual-named-export-config-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4455,8 +4532,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@playwright/test': specifier: ^1.61.0 @@ -4469,7 +4546,7 @@ importers: version: 1.1.2(@rsbuild/core@2.1.1) '@rsbuild/plugin-solid': specifier: ^2.0.0-beta.0 - version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tailwindcss/postcss': specifier: ^4.2.2 version: 4.2.2 @@ -4498,8 +4575,8 @@ importers: e2e/solid-router/scroll-restoration-sandbox-vite: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4516,8 +4593,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4528,21 +4605,21 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/sentry-integration: dependencies: '@sentry/solid': specifier: ^10.32.0 - version: 10.32.0(@tanstack/solid-router@packages+solid-router)(solid-js@2.0.0-beta.32) + version: 10.32.0(@tanstack/solid-router@packages+solid-router)(solid-js@2.0.0-rc.0) '@sentry/tracing': specifier: ^7.120.4 version: 7.120.4 @@ -4550,8 +4627,8 @@ importers: specifier: ^4.6.1 version: 4.6.1 '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4565,8 +4642,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4574,21 +4651,21 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-router/view-transitions: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4605,8 +4682,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -4617,6 +4694,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4629,15 +4709,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/basic: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4660,8 +4737,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -4680,7 +4757,10 @@ importers: version: 1.1.2(@rsbuild/core@2.1.1) '@rsbuild/plugin-solid': specifier: ^2.0.0-beta.0 - version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/postcss': specifier: ^4.2.2 version: 4.2.2 @@ -4714,9 +4794,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/basic-auth: dependencies: @@ -4730,8 +4807,8 @@ importers: specifier: ^7.0.0 version: 7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4745,8 +4822,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -4754,6 +4831,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4784,15 +4864,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/basic-cloudflare: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4803,8 +4880,8 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@cloudflare/vite-plugin': specifier: ^1.29.0 @@ -4812,6 +4889,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4833,9 +4913,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) wrangler: specifier: ^4.74.0 version: 4.75.0 @@ -4843,14 +4920,14 @@ importers: e2e/solid-start/basic-solid-query: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4867,8 +4944,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -4879,6 +4956,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4903,15 +4983,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/basic-tsr-config: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4922,9 +4999,12 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4943,15 +5023,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/csp: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -4959,12 +5036,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4983,15 +5063,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/css-modules: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:* version: link:../../../packages/solid-router @@ -4999,12 +5076,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:* version: link:../../e2e-utils @@ -5026,9 +5106,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5036,8 +5113,8 @@ importers: e2e/solid-start/custom-basepath: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5054,12 +5131,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5093,9 +5173,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5103,8 +5180,8 @@ importers: e2e/solid-start/deferred-hydration: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5112,8 +5189,8 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@rsbuild/core': specifier: ^2.1.0 @@ -5123,7 +5200,10 @@ importers: version: 1.1.2(@rsbuild/core@2.1.1) '@rsbuild/plugin-solid': specifier: ^2.0.0-beta.0 - version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5142,21 +5222,18 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/query-integration: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5170,8 +5247,8 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -5182,6 +5259,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5203,15 +5283,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/scroll-restoration: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5225,8 +5302,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -5237,6 +5314,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5264,15 +5344,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/selective-ssr: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5280,12 +5357,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 zod: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5307,9 +5387,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5317,8 +5394,8 @@ importers: e2e/solid-start/serialization-adapters: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5329,8 +5406,8 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5338,6 +5415,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5362,21 +5442,18 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/server-functions: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5396,8 +5473,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -5408,6 +5485,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5438,18 +5518,15 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/server-routes: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5469,8 +5546,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -5481,6 +5558,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5511,18 +5591,15 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/solid-query-layout-suspense: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5530,12 +5607,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5551,15 +5631,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/spa-mode: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5570,12 +5647,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 zod: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5594,9 +5674,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5604,8 +5681,8 @@ importers: e2e/solid-start/start-manifest: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5613,12 +5690,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5637,15 +5717,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/virtual-routes: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5662,8 +5739,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -5674,6 +5751,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5701,15 +5781,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/solid-start/website: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -5723,8 +5800,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -5735,6 +5812,9 @@ importers: '@playwright/test': specifier: ^1.61.0 version: 1.61.1 + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5759,9 +5839,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) e2e/vue-router/basepath-file-based: dependencies: @@ -5772,11 +5849,11 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(typescript@5.8.3)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-query-devtools': specifier: ^6.1.2 - version: 6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) + version: 6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -6087,11 +6164,11 @@ importers: specifier: workspace:* version: link:../../../packages/virtual-file-routes '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(typescript@5.8.3)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-query-devtools': specifier: ^6.1.2 - version: 6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) + version: 6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -6142,11 +6219,11 @@ importers: specifier: workspace:* version: link:../../../packages/virtual-file-routes '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(typescript@5.8.3)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-query-devtools': specifier: ^6.1.2 - version: 6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) + version: 6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -6191,11 +6268,11 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(typescript@5.8.3)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-query-devtools': specifier: ^6.1.2 - version: 6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) + version: 6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -6243,11 +6320,11 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(typescript@5.8.3)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-query-devtools': specifier: ^6.1.2 - version: 6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) + version: 6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -6344,11 +6421,11 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(typescript@7.0.2)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(typescript@7.0.2)) '@tanstack/vue-query-devtools': specifier: ^6.1.2 - version: 6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@7.0.2)))(vue@3.5.25(typescript@7.0.2)) + version: 6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@7.0.2)))(vue@3.5.25(typescript@7.0.2)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -6604,11 +6681,11 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(typescript@5.8.3)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-query-devtools': specifier: ^6.1.2 - version: 6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) + version: 6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -6900,11 +6977,11 @@ importers: e2e/vue-start/basic-vue-query: dependencies: '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)) '@tanstack/vue-query-devtools': specifier: ^6.1.2 - version: 6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)))(vue@3.5.25(@typescript/typescript6@6.0.2)) + version: 6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)))(vue@3.5.25(@typescript/typescript6@6.0.2)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -7071,11 +7148,11 @@ importers: e2e/vue-start/query-integration: dependencies: '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)) '@tanstack/vue-query-devtools': specifier: ^5.90.0 - version: 5.91.0(@tanstack/vue-query@5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)))(vue@3.5.25(@typescript/typescript6@6.0.2)) + version: 5.91.0(@tanstack/vue-query@5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)))(vue@3.5.25(@typescript/typescript6@6.0.2)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -7288,8 +7365,8 @@ importers: e2e/vue-start/server-functions: dependencies: '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -7361,8 +7438,8 @@ importers: e2e/vue-start/server-routes: dependencies: '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -7674,7 +7751,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7729,7 +7806,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7772,7 +7849,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7786,8 +7863,8 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -7821,7 +7898,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7836,7 +7913,7 @@ importers: version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query-devtools': specifier: ^5.67.2 - version: 5.67.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.67.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -7867,7 +7944,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7916,7 +7993,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7959,7 +8036,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7973,11 +8050,11 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8008,7 +8085,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8022,11 +8099,11 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8063,7 +8140,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8115,7 +8192,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8167,7 +8244,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8219,7 +8296,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8271,7 +8348,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8317,7 +8394,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8363,7 +8440,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8412,7 +8489,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8464,7 +8541,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8478,11 +8555,11 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8519,7 +8596,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8533,11 +8610,11 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8577,7 +8654,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8591,8 +8668,8 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8629,7 +8706,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8646,8 +8723,8 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8678,7 +8755,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8692,8 +8769,8 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8724,7 +8801,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8764,7 +8841,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8847,7 +8924,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8956,11 +9033,11 @@ importers: examples/react/router-monorepo-react-query: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8994,7 +9071,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9014,8 +9091,8 @@ importers: specifier: workspace:* version: link:../router '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -9040,7 +9117,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9063,8 +9140,8 @@ importers: specifier: workspace:* version: link:../router '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -9083,7 +9160,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9097,8 +9174,8 @@ importers: examples/react/router-monorepo-react-query/packages/post-query: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) redaxios: specifier: ^0.5.1 version: 0.5.1 @@ -9111,7 +9188,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9128,8 +9205,8 @@ importers: specifier: workspace:* version: link:../../../../../packages/history '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../../../packages/react-router @@ -9160,7 +9237,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9206,7 +9283,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9252,7 +9329,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9295,7 +9372,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9315,8 +9392,8 @@ importers: specifier: workspace:* version: link:../router '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -9335,7 +9412,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9381,7 +9458,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9424,7 +9501,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9461,7 +9538,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9507,7 +9584,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9553,7 +9630,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9570,8 +9647,8 @@ importers: specifier: workspace:* version: link:../../../packages/arktype-adapter '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -9623,7 +9700,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9666,7 +9743,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9715,7 +9792,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -9779,7 +9856,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -9840,7 +9917,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9889,7 +9966,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9906,11 +9983,11 @@ importers: examples/react/start-basic-react-query: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -9953,7 +10030,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10035,7 +10112,7 @@ importers: version: link:../../../packages/start-static-server-functions '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) react: specifier: ^19.2.3 version: 19.2.3 @@ -10081,7 +10158,7 @@ importers: version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-devtools': specifier: ^0.7.0 - version: 0.7.0(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32) + version: 0.7.0(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.12) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -10133,7 +10210,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) jsdom: specifier: ^27.0.0 version: 27.0.0(postcss@8.5.15) @@ -10169,7 +10246,7 @@ importers: version: link:../../../packages/react-start '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) react: specifier: ^19.2.3 version: 19.2.3 @@ -10215,13 +10292,13 @@ importers: dependencies: '@convex-dev/react-query': specifier: 0.0.0-alpha.8 - version: 0.0.0-alpha.8(@tanstack/react-query@5.99.0(react@19.2.3))(convex@1.19.0(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) + version: 0.0.0-alpha.8(@tanstack/react-query@5.101.4(react@19.2.3))(convex@1.19.0(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -10282,7 +10359,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10325,7 +10402,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10337,7 +10414,7 @@ importers: dependencies: '@tanstack/react-devtools': specifier: ^0.7.0 - version: 0.7.0(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32) + version: 0.7.0(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-rc.0) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -10374,7 +10451,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10388,8 +10465,8 @@ importers: examples/react/start-large: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -10432,7 +10509,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10493,7 +10570,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10545,7 +10622,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-rsc': specifier: ^0.5.30 version: 0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -10597,7 +10674,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10646,7 +10723,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10698,7 +10775,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10712,11 +10789,11 @@ importers: examples/react/start-trellaux: dependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -10771,7 +10848,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10817,7 +10894,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10866,7 +10943,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10915,7 +10992,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10973,7 +11050,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tsx: specifier: ^4.20.3 version: 4.20.3 @@ -10987,11 +11064,11 @@ importers: specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.90.0 - version: 5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3) + version: 5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -11009,7 +11086,7 @@ importers: version: 11.4.3(@typescript/typescript6@6.0.2) '@trpc/tanstack-react-query': specifier: ^11.4.3 - version: 11.4.3(@tanstack/react-query@5.99.0(react@19.2.3))(@trpc/client@11.4.3(@trpc/server@11.4.3(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2))(@trpc/server@11.4.3(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 11.4.3(@tanstack/react-query@5.101.4(react@19.2.3))(@trpc/client@11.4.3(@trpc/server@11.4.3(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2))(@trpc/server@11.4.3(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) express: specifier: ^5.2.1 version: 5.2.1 @@ -11040,7 +11117,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tsx: specifier: ^4.20.3 version: 4.20.3 @@ -11051,8 +11128,8 @@ importers: examples/solid/authenticated-routes: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -11060,7 +11137,7 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11069,8 +11146,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11078,6 +11155,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11087,15 +11167,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/authenticated-routes-firebase: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -11103,7 +11180,7 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11118,8 +11195,8 @@ importers: specifier: ^14.9.0 version: 14.9.0 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11127,6 +11204,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11136,20 +11216,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11158,12 +11235,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/react': specifier: ^19.2.8 version: 19.2.9 @@ -11179,23 +11259,20 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-default-search-params: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11204,8 +11281,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11213,6 +11290,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11222,20 +11302,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-devtools-panel: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11244,12 +11321,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11259,20 +11339,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11281,8 +11358,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11290,6 +11367,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -11302,20 +11382,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-non-nested-devtools: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11324,12 +11401,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/react': specifier: ^19.2.8 version: 19.2.9 @@ -11345,26 +11425,23 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-solid-query: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11373,12 +11450,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -11391,26 +11471,23 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-solid-query-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11419,8 +11496,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11428,6 +11505,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -11440,20 +11520,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-ssr-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router compression: specifier: ^1.8.0 @@ -11468,9 +11545,12 @@ importers: specifier: ^3.3.2 version: 3.3.2 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router-devtools': specifier: workspace:^ version: link:../../../packages/solid-router-devtools @@ -11486,20 +11566,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-ssr-streaming-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11520,8 +11597,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11529,6 +11606,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -11544,15 +11624,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-virtual-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -11560,7 +11637,7 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11572,8 +11649,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11581,6 +11658,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11590,15 +11670,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/basic-virtual-inside-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -11606,7 +11683,7 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11618,8 +11695,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11627,6 +11704,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11636,20 +11716,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/deferred-data: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11658,8 +11735,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11667,6 +11744,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11676,15 +11756,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/i18n-paraglide: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -11692,11 +11769,11 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11704,6 +11781,9 @@ importers: '@inlang/paraglide-js': specifier: ^2.4.0 version: 2.4.0(babel-plugin-macros@3.1.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -11716,20 +11796,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/kitchen-sink: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11741,8 +11818,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11750,6 +11827,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11759,20 +11839,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/kitchen-sink-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11784,8 +11861,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11793,6 +11870,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -11805,26 +11885,23 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/kitchen-sink-solid-query: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11836,8 +11913,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11845,6 +11922,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11854,15 +11934,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/kitchen-sink-solid-query-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -11870,13 +11947,13 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11888,8 +11965,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11897,6 +11974,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11906,15 +11986,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/large-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -11922,10 +11999,10 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11934,8 +12011,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -11943,6 +12020,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11952,23 +12032,20 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/location-masking: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -11977,12 +12054,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -11992,23 +12072,20 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/navigation-blocking: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12017,12 +12094,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -12032,31 +12112,31 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/quickstart: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ version: link:../../../packages/solid-router-devtools solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -12066,20 +12146,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/quickstart-esbuild-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12088,8 +12165,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -12102,18 +12179,18 @@ importers: version: 0.27.4 esbuild-plugin-solid: specifier: ^0.6.0 - version: 0.6.0(esbuild@0.27.4)(solid-js@2.0.0-beta.32) + version: 0.6.0(esbuild@0.27.4)(solid-js@2.0.0-rc.0) examples/solid/quickstart-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12122,8 +12199,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -12131,6 +12208,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -12143,20 +12223,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/quickstart-rspack-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/postcss': specifier: ^4.2.2 version: 4.2.2 '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12165,8 +12242,8 @@ importers: specifier: ^8.5.1 version: 8.5.6 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -12179,7 +12256,7 @@ importers: version: 1.1.2(@rsbuild/core@2.1.1) '@rsbuild/plugin-solid': specifier: ^2.0.0-beta.0 - version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + version: 2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -12193,17 +12270,17 @@ importers: examples/solid/quickstart-webpack-file-based: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ version: link:../../../packages/solid-router-devtools solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -12224,8 +12301,8 @@ importers: specifier: ^10.0.0 version: 10.0.0(@babel/core@7.28.5)(webpack@5.97.1) babel-preset-solid: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(@babel/core@7.28.5)(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(@babel/core@7.28.5)(solid-js@2.0.0-rc.0) css-loader: specifier: ^7.1.2 version: 7.1.2(webpack@5.97.1) @@ -12257,13 +12334,13 @@ importers: examples/solid/router-monorepo-simple: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12272,9 +12349,12 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -12290,20 +12370,17 @@ importers: vite-plugin-dts: specifier: 4.2.3 version: 4.2.3(@types/node@25.0.9)(@typescript/typescript6@6.0.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/router-monorepo-simple-lazy: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12312,9 +12389,12 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -12330,26 +12410,23 @@ importers: vite-plugin-dts: specifier: 4.2.3 version: 4.2.3(@types/node@25.0.9)(@typescript/typescript6@6.0.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/router-monorepo-solid-query: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12358,9 +12435,12 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -12376,34 +12456,34 @@ importers: vite-plugin-dts: specifier: 4.2.3 version: 4.2.3(@types/node@25.0.9)(@typescript/typescript6@6.0.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/scroll-restoration: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ version: link:../../../packages/solid-router-devtools '@tanstack/solid-virtual': specifier: ^3.13.0 - version: 3.13.12(solid-js@2.0.0-beta.32) + version: 3.13.12(solid-js@2.0.0-rc.0) solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -12413,15 +12493,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/search-validator-adapters: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12432,10 +12509,10 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12450,8 +12527,8 @@ importers: specifier: ^2.1.7 version: 2.1.7 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -12464,7 +12541,10 @@ importers: devDependencies: '@solidjs/testing-library': specifier: ^0.8.10 - version: 0.8.10(solid-js@2.0.0-beta.32) + version: 0.8.10(solid-js@2.0.0-rc.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -12477,17 +12557,14 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/start-basic: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12499,12 +12576,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12526,9 +12606,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12545,10 +12622,10 @@ importers: specifier: ^7.0.0 version: 7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12560,12 +12637,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12590,9 +12670,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12603,10 +12680,10 @@ importers: specifier: ^0.41.1 version: 0.41.1 '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12615,8 +12692,8 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 start-authjs: specifier: ^1.0.0 version: 1.0.0(@auth/core@0.41.1) @@ -12624,6 +12701,9 @@ importers: specifier: ^3.6.0 version: 3.6.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12642,9 +12722,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12652,10 +12729,10 @@ importers: examples/solid/start-basic-cloudflare: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12664,12 +12741,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@cloudflare/vite-plugin': specifier: ^1.29.0 version: 1.29.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(workerd@1.20260317.1)(wrangler@4.75.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12688,9 +12768,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12701,10 +12778,10 @@ importers: examples/solid/start-basic-netlify: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12713,12 +12790,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@netlify/vite-plugin-tanstack-start': specifier: ^1.1.4 version: 1.1.4(@tanstack/solid-start@packages+solid-start)(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.9.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12737,9 +12817,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12747,10 +12824,10 @@ importers: examples/solid/start-basic-nitro: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12759,9 +12836,12 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12783,9 +12863,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12793,16 +12870,16 @@ importers: examples/solid/start-basic-solid-query: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query-devtools': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12817,12 +12894,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12841,9 +12921,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12851,10 +12928,10 @@ importers: examples/solid/start-basic-static: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12869,12 +12946,15 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12893,9 +12973,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.3 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12903,8 +12980,8 @@ importers: examples/solid/start-bun: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12913,9 +12990,9 @@ importers: version: link:../../../packages/router-plugin '@tanstack/solid-devtools': specifier: ^0.7.0 - version: 0.7.14(csstype@3.2.3)(solid-js@2.0.0-beta.32) + version: 0.7.14(csstype@3.2.3)(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12927,15 +13004,18 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 devDependencies: '@solidjs/testing-library': specifier: ^0.8.10 - version: 0.8.10(solid-js@2.0.0-beta.32) + version: 0.8.10(solid-js@2.0.0-rc.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/eslint-config': specifier: ^0.3.2 version: 0.3.2(@typescript-eslint/utils@8.57.1(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0)))(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0)) @@ -12963,9 +13043,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vitest: specifier: ^4.1.4 version: 4.1.4(@types/node@25.0.9)(@vitest/ui@4.1.4)(jsdom@27.0.0(postcss@8.5.15))(msw@2.7.0(@types/node@25.0.9)(@typescript/typescript6@6.0.2))(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -12977,15 +13054,15 @@ importers: dependencies: '@convex-dev/better-auth': specifier: ^0.9.7 - version: 0.9.7(@standard-schema/spec@1.1.0)(@typescript/typescript6@6.0.2)(better-auth@1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)))(convex@1.28.2(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3))(hono@4.7.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 0.9.7(@standard-schema/spec@1.1.0)(@typescript/typescript6@6.0.2)(better-auth@1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-rc.0)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)))(convex@1.28.2(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3))(hono@4.7.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -12995,7 +13072,7 @@ importers: version: link:../../../packages/solid-start better-auth: specifier: ^1.6.19 - version: 1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)) + version: 1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-rc.0)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -13004,13 +13081,13 @@ importers: version: 1.28.2(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) convex-solidjs: specifier: ^0.0.3 - version: 0.0.3(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32) + version: 0.0.3(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-rc.0) redaxios: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -13021,6 +13098,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -13036,9 +13116,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -13046,10 +13123,10 @@ importers: examples/solid/start-counter: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -13061,8 +13138,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -13070,6 +13147,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -13085,20 +13165,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/start-i18n-paraglide: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-devtools': specifier: ^0.7.0 - version: 0.7.14(csstype@3.2.3)(solid-js@2.0.0-beta.32) + version: 0.7.14(csstype@3.2.3)(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -13107,12 +13184,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: '@inlang/paraglide-js': specifier: ^2.4.0 version: 2.4.0(babel-plugin-macros@3.1.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -13131,20 +13211,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/start-large: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -13156,8 +13233,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -13165,6 +13242,9 @@ importers: specifier: ^1.0.0-beta.15 version: 1.0.0-beta.15(@typescript/typescript6@6.0.2) devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -13183,17 +13263,14 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/start-streaming-data-from-server-functions: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -13202,12 +13279,15 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 zod: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -13220,15 +13300,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/start-supabase-basic: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@supabase/ssr': specifier: ^0.5.2 version: 0.5.2(@supabase/supabase-js@2.48.1) @@ -13236,7 +13313,7 @@ importers: specifier: ^2.48.1 version: 2.48.1 '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -13248,9 +13325,12 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -13269,9 +13349,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -13279,10 +13356,10 @@ importers: examples/solid/start-tailwind-v4: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -13291,8 +13368,8 @@ importers: specifier: workspace:* version: link:../../../packages/solid-start solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -13300,6 +13377,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -13318,9 +13398,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -13328,8 +13405,8 @@ importers: examples/solid/view-transitions: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -13337,7 +13414,7 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -13346,8 +13423,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -13355,6 +13432,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -13364,20 +13444,17 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/with-framer-motion: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -13386,11 +13463,11 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 solid-motionone: specifier: ^1.0.4 - version: 1.0.4(solid-js@2.0.0-beta.32) + version: 1.0.4(solid-js@2.0.0-rc.0) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -13398,6 +13475,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -13407,15 +13487,12 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/solid/with-trpc: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -13423,7 +13500,7 @@ importers: specifier: workspace:* version: link:../../../packages/router-plugin '@tanstack/solid-router': - specifier: ^2.0.0-beta.30 + specifier: ^2.0.0-rc.0 version: link:../../../packages/solid-router '@tanstack/solid-router-devtools': specifier: workspace:^ @@ -13441,8 +13518,8 @@ importers: specifier: ^0.5.1 version: 0.5.1 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -13450,6 +13527,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/express': specifier: ^5.0.6 version: 5.0.6 @@ -13459,9 +13539,6 @@ importers: vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) examples/vue/basic: dependencies: @@ -13700,8 +13777,8 @@ importers: version: 5.1.28 devDependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -13761,15 +13838,15 @@ importers: packages/react-router-ssr-query: dependencies: '@tanstack/query-core': - specifier: ^5.99.0 - version: 5.99.0 + specifier: ^5.101.4 + version: 5.101.4 '@tanstack/router-ssr-query-core': specifier: workspace:* version: link:../router-ssr-query-core devDependencies: '@tanstack/react-query': - specifier: ^5.99.0 - version: 5.99.0(react@19.2.3) + specifier: ^5.101.4 + version: 5.101.4(react@19.2.3) '@tanstack/react-router': specifier: workspace:* version: link:../react-router @@ -13974,11 +14051,11 @@ importers: specifier: ^3.0.0 version: 3.1.1 seroval: - specifier: ^1.5.4 - version: 1.5.4 + specifier: ^1.6.2 + version: 1.6.2 seroval-plugins: - specifier: ^1.5.4 - version: 1.5.4(seroval@1.5.4) + specifier: ^1.6.2 + version: 1.6.2(seroval@1.6.2) devDependencies: '@tanstack/store': specifier: ^0.9.3 @@ -14117,7 +14194,7 @@ importers: version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) vite-plugin-solid: specifier: ^2.11.10 || ^3.0.0-0 - version: 2.11.11(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 2.11.11(@testing-library/jest-dom@6.6.3)(solid-js@1.9.12)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) webpack: specifier: '>=5.92.0' version: 5.97.1(@swc/core@1.15.33(@swc/helpers@0.5.23))(esbuild@0.27.4) @@ -14141,8 +14218,8 @@ importers: packages/router-ssr-query-core: devDependencies: '@tanstack/query-core': - specifier: ^5.99.0 - version: 5.99.0 + specifier: ^5.101.4 + version: 5.101.4 '@tanstack/router-core': specifier: workspace:* version: link:../router-core @@ -14201,16 +14278,16 @@ importers: dependencies: '@solid-devtools/logger': specifier: ^0.9.4 - version: 0.9.7(solid-js@2.0.0-beta.32) + version: 0.9.11(solid-js@2.0.0-rc.0) '@solid-primitives/refs': specifier: ^1.0.8 - version: 1.1.0(solid-js@2.0.0-beta.32) + version: 1.1.0(solid-js@2.0.0-rc.0) '@solidjs/meta': specifier: ^0.29.4 - version: 0.29.4(solid-js@2.0.0-beta.32) + version: 0.29.4(solid-js@2.0.0-rc.0) '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/history': specifier: workspace:* version: link:../history @@ -14223,7 +14300,10 @@ importers: devDependencies: '@solidjs/testing-library': specifier: ^0.8.10 - version: 0.8.10(solid-js@2.0.0-beta.32) + version: 0.8.10(solid-js@2.0.0-rc.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -14237,14 +14317,11 @@ importers: specifier: ^0.14.5 version: 0.14.5(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0)) solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) zod: specifier: ^4.4.3 version: 4.4.3 @@ -14252,8 +14329,8 @@ importers: packages/solid-router-devtools: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/router-core': specifier: workspace:* version: link:../router-core @@ -14264,34 +14341,37 @@ importers: specifier: workspace:^ version: link:../solid-router devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@types/node': specifier: 25.0.9 version: 25.0.9 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) packages/solid-router-ssr-query: dependencies: '@tanstack/query-core': - specifier: ^5.99.0 - version: 5.99.0 + specifier: ^5.101.4 + version: 5.101.4 '@tanstack/router-ssr-query-core': specifier: workspace:* version: link:../router-ssr-query-core devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': - specifier: ^6.0.0-beta.7 - version: 6.0.0-beta.7(solid-js@2.0.0-beta.32) + specifier: ^6.0.0-rc.0 + version: 6.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-router': specifier: workspace:* version: link:../solid-router @@ -14299,14 +14379,11 @@ importers: specifier: ^0.14.5 version: 0.14.5(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0)) solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) packages/solid-start: dependencies: @@ -14336,8 +14413,8 @@ importers: specifier: ^2.1.0 version: 2.1.1 '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/router-utils': specifier: workspace:* version: link:../router-utils @@ -14345,8 +14422,8 @@ importers: specifier: 25.0.9 version: 25.0.9 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -14365,22 +14442,22 @@ importers: devDependencies: '@solidjs/testing-library': specifier: ^0.8.10 - version: 0.8.10(solid-js@2.0.0-beta.32) + version: 0.8.10(solid-js@2.0.0-rc.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) packages/solid-start-server: dependencies: @@ -14394,24 +14471,24 @@ importers: specifier: workspace:* version: link:../start-server-core devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.28 + version: 3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@solidjs/web': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(solid-js@2.0.0-beta.32) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 solid-js: - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vite-plugin-solid: - specifier: ^3.0.0-next.23 - version: 3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) packages/start-client-core: dependencies: @@ -14425,8 +14502,8 @@ importers: specifier: workspace:* version: link:../start-storage-context seroval: - specifier: ^1.5.4 - version: 1.5.4 + specifier: ^1.6.2 + version: 1.6.2 devDependencies: '@types/node': specifier: 25.0.9 @@ -14480,8 +14557,8 @@ importers: specifier: ^4.0.3 version: 4.0.3 seroval: - specifier: ^1.5.4 - version: 1.5.4 + specifier: ^1.6.2 + version: 1.6.2 source-map: specifier: ^0.7.6 version: 0.7.6 @@ -14542,10 +14619,10 @@ importers: version: 0.1.7 h3-v2: specifier: npm:h3@2.0.1-rc.20 - version: h3@2.0.1-rc.20(crossws@0.4.9(srvx@0.11.22)) + version: h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.22)) seroval: - specifier: ^1.5.4 - version: 1.5.4 + specifier: ^1.6.2 + version: 1.6.2 devDependencies: '@standard-schema/spec': specifier: ^1.0.0 @@ -14572,8 +14649,8 @@ importers: specifier: workspace:* version: link:../start-client-core seroval: - specifier: ^1.5.4 - version: 1.5.4 + specifier: ^1.6.2 + version: 1.6.2 devDependencies: '@types/node': specifier: 25.0.9 @@ -14696,14 +14773,14 @@ importers: packages/vue-router-ssr-query: dependencies: '@tanstack/query-core': - specifier: ^5.99.0 - version: 5.99.0 + specifier: ^5.101.4 + version: 5.101.4 '@tanstack/router-ssr-query-core': specifier: workspace:* version: link:../router-ssr-query-core '@tanstack/vue-query': - specifier: ^5.99.0 - version: 5.99.0(vue@3.5.25(typescript@7.0.2)) + specifier: ^5.101.4 + version: 5.101.4(vue@3.5.25(typescript@7.0.2)) devDependencies: '@tanstack/vue-router': specifier: workspace:* @@ -15516,7 +15593,7 @@ packages: '@convex-dev/react-query@0.0.0-alpha.8': resolution: {integrity: sha512-Rv/q7/CplU75f7ckBd2vh+HoeeQ0tOrjwMl14Hk7D/03e55oUIU0TV5JYYzC79ZQyyAtoj7CmCo5ZxcmtKNv1Q==} peerDependencies: - '@tanstack/react-query': ^5.99.0 + '@tanstack/react-query': ^5.101.4 convex: ^1.17.0 '@cspotcode/source-map-support@0.8.1': @@ -15636,8 +15713,8 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - '@dom-expressions/babel-plugin-jsx@0.50.0-next.40': - resolution: {integrity: sha512-elH34kK5V3fm5+AztmzpyDmlgYXkboVRPtHJhDVOfk7WPXR16dvssQjrnCjo/ulkTSP9IGTsKCOjG/zRCU74yQ==} + '@dom-expressions/babel-plugin-jsx@0.50.0-next.42': + resolution: {integrity: sha512-ol24x9RW8loPyOTzC/mQzh/zAsrsPxyTG4WRxxRlwzNK2uBWIBftWN5IwmSV51zDQa7JcT6sE6kkXFCLUvsYIQ==} peerDependencies: '@babel/core': ^7.20.12 @@ -17612,11 +17689,12 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@napi-rs/wasm-runtime@1.1.6': - resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + '@napi-rs/wasm-runtime@1.2.3': + resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} @@ -19336,6 +19414,23 @@ packages: cpu: [x64] os: [win32] + '@rolldown/plugin-babel@0.2.3': + resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} + engines: {node: '>=22.12.0 || ^24.0.0'} + peerDependencies: + '@babel/core': ^7.29.0 || ^8.0.0-rc.1 + '@babel/plugin-transform-runtime': ^7.29.0 || ^8.0.0-rc.1 + '@babel/runtime': ^7.27.0 || ^8.0.0-rc.1 + rolldown: ^1.0.0-rc.5 + vite: ^8.0.14 + peerDependenciesMeta: + '@babel/plugin-transform-runtime': + optional: true + '@babel/runtime': + optional: true + vite: + optional: true + '@rolldown/pluginutils@1.0.0': resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} @@ -20045,23 +20140,23 @@ packages: '@so-ric/colorspace@1.1.6': resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} - '@solid-devtools/debugger@0.26.0': - resolution: {integrity: sha512-36QxZ+s/lY60E+Pb9q0eTsdqgaog4c823WIj5dC2LFdGrGXbVGBQEj6k7CgvMnEETdwndrd0Fm72fQyYPlZrVA==} + '@solid-devtools/debugger@0.28.1': + resolution: {integrity: sha512-6qIUI6VYkXoRnL8oF5bvh2KgH71qlJ18hNw/mwSyY6v48eb80ZR48/5PDXufUa3q+MBSuYa1uqTMwLewpay9eg==} peerDependencies: solid-js: ^1.9.0 - '@solid-devtools/logger@0.9.7': - resolution: {integrity: sha512-JHZ0ejkQnRoMcV8bgqogSYFlYdo0wJ1S/vAHEROSHQk1jNtErTXJwLrCXdR+LNuBWhJJ0aq/y7Pjit/ssvKrDw==} + '@solid-devtools/logger@0.9.11': + resolution: {integrity: sha512-THbiY1iQlieL6vdgJc4FIsLe7V8a57hod/Thm8zdKrTkWL88UPZjkBBfM+mVNGusd4OCnAN20tIFBhNnuT1Dew==} peerDependencies: solid-js: ^1.9.0 - '@solid-devtools/shared@0.19.0': - resolution: {integrity: sha512-OGo6l84f9X5YEAqSEM4Xl94+xKXSqmACMzKWsAqO0BStLBMVL0vIVu286AQk5XkNxn11/EB9wrdkZc9GUzKlxA==} + '@solid-devtools/shared@0.20.0': + resolution: {integrity: sha512-o5TACmUOQsxpzpOKCjbQqGk8wL8PMi+frXG9WNu4Lh3PQVUB6hs95Kl/S8xc++zwcMguUKZJn8h5URUiMOca6Q==} peerDependencies: solid-js: ^1.9.0 - '@solid-primitives/bounds@0.0.122': - resolution: {integrity: sha512-kUq/IprOdFr/rg2upon5lQGOoTnDAmxQS4ASKK2l+VwoKSctdPwgu/4qJxEITZikL+nB0myYZzBZWptySV0cRg==} + '@solid-primitives/bounds@0.1.7': + resolution: {integrity: sha512-uWE47+MhAGYB3EadHVg79C/6CawVVL7MwTArricxX2GDDJX+7SBnD+WsnMbkLOi7UbCOA3EsepnBr3bix83LLA==} peerDependencies: solid-js: ^1.6.12 @@ -20070,18 +20165,13 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/cursor@0.0.115': - resolution: {integrity: sha512-8nEmUN/sacXPChwuJOAi6Yi6VnxthW/Jk8VGvvcF38AenjUvOA6FHI6AkJILuFXjQw1PGxia1YbH/Mn77dPiOA==} - peerDependencies: - solid-js: ^1.6.12 - - '@solid-primitives/event-listener@2.4.0': - resolution: {integrity: sha512-TSfR1PNTfojFEYGSxSMCnUhXsaYWBo4p+cm73QmWODa9YnaQAk6PB7VjzG2bOT2D817VlvuOqTj0Qdq+MZrdGg==} + '@solid-primitives/event-listener@2.4.3': + resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/event-listener@2.4.3': - resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} + '@solid-primitives/event-listener@2.4.6': + resolution: {integrity: sha512-5I0YJcTVYIWoMmgBSROBZGcz+ymhew/pGTg2dHW74BUjFKsV8Li4bOZYl0YAGP4mHw5o4UBd9/BEesqBci3wxw==} peerDependencies: solid-js: ^1.6.12 @@ -20095,13 +20185,8 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/media@2.3.0': - resolution: {integrity: sha512-7+C3wfbWnGE/WPoNsqcp/EeOP2aNNB92RCpsWhBth8E5lZo/J+rK6jMb7umVsK0zguT8HBpeXp1pFyFbcsHStA==} - peerDependencies: - solid-js: ^1.6.12 - - '@solid-primitives/platform@0.1.2': - resolution: {integrity: sha512-sSxcZfuUrtxcwV0vdjmGnZQcflACzMfLriVeIIWXKp8hzaS3Or3tO6EFQkTd3L8T5dTq+kTtLvPscXIpL0Wzdg==} + '@solid-primitives/media@2.3.6': + resolution: {integrity: sha512-pk49gPOq/UMRUJ+pTSrOfBiR8xJjRYHXIf1iR/jSnyQ/KroU+ZXhkZzavC7hvfp2vJeOTW5k2/HN0r3Q1VJ7Pw==} peerDependencies: solid-js: ^1.6.12 @@ -20115,8 +20200,8 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/resize-observer@2.1.0': - resolution: {integrity: sha512-tO9MDAc2pNjpcRd5B8LWbiR1qzIgvGZ5BtTuO98N7CLwd+fnuyGwtlQtJpz5hcLcTnoawpQYLpiRGNgaYW+YzQ==} + '@solid-primitives/refs@1.1.4': + resolution: {integrity: sha512-bLjwIs6ZPu8NQnuw04sU3Zc8qKSpbc0umUU/O4SHf6oWOdO4+dHY8vb1T7C4b/Tg103+9WGr6sEE0+NFlbaB/A==} peerDependencies: solid-js: ^1.6.12 @@ -20125,8 +20210,8 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/rootless@1.5.0': - resolution: {integrity: sha512-YJ+EveQeDv9DLqfDKfsPAAGy2x3vBruoD23yn+nD2dT84QjoBxWT1T0qA0TMFjek6/xuN3flqnHtQ4r++4zdjg==} + '@solid-primitives/resize-observer@2.2.0': + resolution: {integrity: sha512-9Fuu/EWBeGj+atGHRJp70HKhdfalmpjwxY8a32NZixdLNmfCJ45AfhLQNr6uOzETbbiMx4iCKlTrJ8KZCHC2Ww==} peerDependencies: solid-js: ^1.6.12 @@ -20135,28 +20220,28 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/scheduled@1.5.0': - resolution: {integrity: sha512-RVw24IRNh1FQ4DCMb3OahB70tXIwc5vH8nhR4nNPsXwUPQeuOkLsDI5BlxaPk0vyZgqw9lDpufgI3HnPwplgDw==} + '@solid-primitives/rootless@1.5.4': + resolution: {integrity: sha512-TOIZa1VUfVJ+9nkCcRajw3U4t9vBOP1HxX1WHNTbXq32mXwlqTvUnC4CRIilohcryBkT9u2ZkhUDSHRTaGp55g==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.0.8': - resolution: {integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==} + '@solid-primitives/scheduled@1.5.3': + resolution: {integrity: sha512-oNwLE6E6lxJAWrc8QXuwM0k2oU1BnANnkChwMw82aK1j3+mWGJkG1IFe5gCwbV+afYmjI76t9JJV3md/8tLw+g==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.1.0': - resolution: {integrity: sha512-6Coau0Kv/dF83UQpbBzc+gnJafOQAPe2jCbB4jmTK5UocsR5cWmFBVRm3kin+nZFVaO4WkuELw0cKANWgTVh8Q==} + '@solid-primitives/static-store@0.1.2': + resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.1.2': - resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==} + '@solid-primitives/static-store@0.1.4': + resolution: {integrity: sha512-LgtVaVBtB7EbmS4+M0b8xY5Iq6pUWXBsIC4VgtrFKDGDdyCaDt88sHk0fUlx1Enxm/XZnZyLXJABRoa39RjJqA==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/styles@0.0.114': - resolution: {integrity: sha512-SFXr16mgr6LvZAIj6L7i59HHg+prAmIF8VP/U3C6jSHz68Eh1G71vaWr9vlJVpy/j6bh1N8QUzu5CgtvIC92OQ==} + '@solid-primitives/styles@0.1.4': + resolution: {integrity: sha512-siDvuK9mBpswjUdJCpr3ZUhBIHghNjHsBhZ9p3mIH1sDgwVr5gQGfFmESIvtb4Ka4Oq6B6hLOqi4QES/i8u4YA==} peerDependencies: solid-js: ^1.6.12 @@ -20175,13 +20260,18 @@ packages: peerDependencies: solid-js: ^1.6.12 + '@solid-primitives/utils@6.4.1': + resolution: {integrity: sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==} + peerDependencies: + solid-js: ^1.6.12 + '@solidjs/meta@0.29.4': resolution: {integrity: sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g==} peerDependencies: solid-js: '>=1.8.4' - '@solidjs/signals@2.0.0-beta.32': - resolution: {integrity: sha512-ZRdZksswcPRyPnye6AR3LMacc0Dn/sV/cW1jPsMgJHO5pg2iNvg+8UWojLXClIO2K3oD2ftVWeQIwyVbvM971A==} + '@solidjs/signals@2.0.0-rc.0': + resolution: {integrity: sha512-oKZSfvsCcKw1uJjOGbUkJ+OqlhXLHtZ+rShSyu9KH0lUH7UUwfMfsKeh81JPiQxDDg4YLhEwI38hg0JkwzTdvA==} '@solidjs/testing-library@0.8.10': resolution: {integrity: sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==} @@ -20193,10 +20283,21 @@ packages: '@solidjs/router': optional: true - '@solidjs/web@2.0.0-beta.32': - resolution: {integrity: sha512-7HBUbGNoNnQIKTtgJRpmqZkQ5GzBt4K6d1BiHAaHksWbdYAsXkzRU7b72WtTwklN4Z2iA5MY8b5jiITlvY1noA==} + '@solidjs/vite-plugin@3.0.0-next.28': + resolution: {integrity: sha512-P/Xova2R8QoveQ2szrzkHSMPZjIyc5dE4hh2UHNgRW8CC5sSoh8yzPLw7qwvKdE1DydPHUWq/hrRIApkwt+grw==} + peerDependencies: + '@solidjs/web': ^2.0.0-rc.0 + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^2.0.0-rc.0 + vite: ^8.0.14 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + + '@solidjs/web@2.0.0-rc.0': + resolution: {integrity: sha512-pYSaA9+dH8H1h/d/ZF/P2kR6omfzFGNcdzKhWTcg9fJghXhn8+5UrXUr2iYxDdYNOXZzxxFQhYHSJ7P4HKDqgw==} peerDependencies: - solid-js: ^2.0.0-beta.32 + solid-js: ^2.0.0-rc.0 '@speed-highlight/core@1.2.14': resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} @@ -20619,8 +20720,8 @@ packages: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@5.99.0': - resolution: {integrity: sha512-3Jv3WQG0BCcH7G+7lf/bP8QyBfJOXeY+T08Rin3GZ1bshvwlbPt7NrDHMEzGdKIOmOzvIQmxjk28YEQX60k7pQ==} + '@tanstack/query-core@5.101.4': + resolution: {integrity: sha512-gNwcvOJcRbLWPOLG/2OBm+zM+Yv+MKsXKEOWC57USuZDEsI71hEErQsiEGx5wX9rzWWkfwM0fVSPoiIFSsxfiw==} '@tanstack/query-devtools@5.101.0': resolution: {integrity: sha512-MVqw17k08RQtGGLEL654+dX/btbX9p/8WjkznO//zusLTMaObxi3Q+MoFwGVkC9K3tqjn8qrrNhJevXx4fJTeQ==} @@ -20646,17 +20747,17 @@ packages: '@tanstack/react-query-devtools@5.67.2': resolution: {integrity: sha512-cmj2DxBc+/9btQ66n5xI8wTtAma2BLVa403K7zIYiguzJ/kV201jnGensYqJeu1Rd8uRMLLRM74jLVMLDWNRJA==} peerDependencies: - '@tanstack/react-query': ^5.99.0 + '@tanstack/react-query': ^5.101.4 react: ^19.2.3 '@tanstack/react-query-devtools@5.90.2': resolution: {integrity: sha512-vAXJzZuBXtCQtrY3F/yUNJCV4obT/A/n81kb3+YqLbro5Z2+phdAbceO+deU3ywPw8B42oyJlp4FhO0SoivDFQ==} peerDependencies: - '@tanstack/react-query': ^5.99.0 + '@tanstack/react-query': ^5.101.4 react: ^19.2.3 - '@tanstack/react-query@5.99.0': - resolution: {integrity: sha512-OY2bCqPemT1LlqJ8Y2CUau4KELnIhhG9Ol3ZndPbdnB095pRbPo1cHuXTndg8iIwtoHTgwZjyaDnQ0xD0mYwAw==} + '@tanstack/react-query@5.101.4': + resolution: {integrity: sha512-yRg2pfOCxIs4ZJW3XYYHU/WgtD04FHSnfHlpRT7h7pR77hwkdRG4wxbKe4aq6P0RvXUTBSQpQeadS1SUYUe+KA==} peerDependencies: react: ^19.2.3 @@ -20678,16 +20779,16 @@ packages: peerDependencies: solid-js: '>=1.9.7' - '@tanstack/solid-query-devtools@6.0.0-beta.7': - resolution: {integrity: sha512-U21K7AAkIEal6/02Zf0qmSscrUmYl5OkIqjOhTgIWwTqkJvspobGtHIp1zuDeLC/AHSIemYB+Swcgc3mzCTwPQ==} + '@tanstack/solid-query-devtools@6.0.0-rc.0': + resolution: {integrity: sha512-1Wf+rBo75aL6srPQi7rB+QcWp8moaYzVkFzcxgrRLBs/9WxoNeto5ahoDfpri13ALNaucxGlsC0gduvp0nzbNw==} peerDependencies: - '@tanstack/solid-query': ^6.0.0-beta.7 + '@tanstack/solid-query': ^6.0.0-rc.0 solid-js: '>=2.0.0-beta.0 <3.0.0' - '@tanstack/solid-query@6.0.0-beta.7': - resolution: {integrity: sha512-wrUpCKOsJk1p3Tnj47F1g+MQEoyJV3R1zrTyOJCCcKbTi6D7Hv+IiTMzKHd/P1/JE59A+Od24ikkpMyLip14Kw==} + '@tanstack/solid-query@6.0.0-rc.0': + resolution: {integrity: sha512-v6U7OWYAI9DAPrmDjizCJ90/RrJU+F2Uvu9s/xfwsnOVHQeEC15T2Jsmn1dqCHm4XpuUv21t1SNgLqB+zzzsJQ==} peerDependencies: - solid-js: '>=2.0.0-beta.0 <3.0.0' + solid-js: '>=2.0.0-rc.0 <3.0.0' '@tanstack/solid-virtual@3.13.12': resolution: {integrity: sha512-0dS8GkBTmbuM9cUR6Jni0a45eJbd32CAEbZj8HrZMWIj3lu974NpGz5ywcomOGJ9GdeHuDaRzlwtonBbKV1ihQ==} @@ -20715,17 +20816,17 @@ packages: '@tanstack/vue-query-devtools@5.91.0': resolution: {integrity: sha512-Kn6p5ffEKUj+YGEP+BapoPI8kUiPtNnFDyzjTvUx6GHbyfzfefQPhYoRtFiWeyrGHjUB/Mvtnr7Rosbzs/ngVg==} peerDependencies: - '@tanstack/vue-query': ^5.99.0 + '@tanstack/vue-query': ^5.101.4 vue: ^3.3.0 '@tanstack/vue-query-devtools@6.1.2': resolution: {integrity: sha512-1E886RHorY432aOJU3dyzLbI67PhqQzvAPQyp8hU6UR4EVXKZSVzVT0O0utmTT2jnBpbbUiCFt2uNSs8W3grHw==} peerDependencies: - '@tanstack/vue-query': ^5.99.0 + '@tanstack/vue-query': ^5.101.4 vue: ^3.3.0 - '@tanstack/vue-query@5.99.0': - resolution: {integrity: sha512-okrHNkouasL5cjo7O8hUxul22DiIL335KUQus/cfoAdCOUytF/OIv3BpNDevfqE6zHqqJ651Fb9OkUJPUCL0ZQ==} + '@tanstack/vue-query@5.101.4': + resolution: {integrity: sha512-UYjkUZhnWQIFGNb7SdgjCitAftNyYQfOIVUh6vBUQAG4SQKNMSBKeQERFDubpxLAMpIBJTaOrE8fM4c1kZcIGQ==} peerDependencies: '@vue/composition-api': ^1.1.2 vue: ^2.6.0 || ^3.3.0 @@ -20813,7 +20914,7 @@ packages: '@trpc/tanstack-react-query@11.4.3': resolution: {integrity: sha512-aYPp12wE9IrakccGWoQU/waZuWr3FLw9RtagsqJmX9NKHpQOVzoDvHA1W0amwyTQSAfL98Bn5rWmD7KTdr5AWg==} peerDependencies: - '@tanstack/react-query': ^5.99.0 + '@tanstack/react-query': ^5.101.4 '@trpc/client': 11.4.3 '@trpc/server': 11.4.3 react: ^19.2.3 @@ -22039,6 +22140,9 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + babel-plugin-vue-jsx-hmr@1.0.0: resolution: {integrity: sha512-XRq+XTD4bub6HkavELMhihvLX2++JkSBAxRXlqQK32b+Tb0S9PEqxrDSMpOEZ1iGyOaJZj9Y0uU/FzICdyL9MA==} @@ -22051,11 +22155,20 @@ packages: solid-js: optional: true - babel-preset-solid@2.0.0-beta.32: - resolution: {integrity: sha512-D+ziCSJ+oznNOUHaUu6nrhSjf9sHOOdIoGhdpIFpR1yV/JqWE4kGh3wtcSzei5Hf7AdYHMv1qAr9Lz/gTxadjA==} + babel-preset-solid@2.0.0-beta.34: + resolution: {integrity: sha512-r06URXFAiHtT9dIKG4sF2mgqxh6rpd6KOYtPNX4HFxC5nZLsNSybLZcuZ30cONUl//n/Tav6IzZQiSwxqCkLfg==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^2.0.0-beta.32 + solid-js: ^2.0.0-beta.34 + peerDependenciesMeta: + solid-js: + optional: true + + babel-preset-solid@2.0.0-rc.0: + resolution: {integrity: sha512-Ap2/QQY3pICj+Q0VM/RnIOpZo7e6icZnUA0oBJuhqzoCrljqMNo3eFb2OeEa4pUQeFREJOlex4Bt1ggwrcgC8w==} + peerDependencies: + '@babel/core': ^7.0.0 + solid-js: ^2.0.0-rc.0 peerDependenciesMeta: solid-js: optional: true @@ -22762,8 +22875,8 @@ packages: srvx: optional: true - crossws@0.4.9: - resolution: {integrity: sha512-iWx+1OMSG2aOHpjyf9AESOzkwsVdS49cXM9dVrI2PDhxU5l2RIWE/KG56gk4BbAnsMoycvniJ9OnOxO9LRzHVA==} + crossws@0.4.5: + resolution: {integrity: sha512-wUR89x/Rw7/8t+vn0CmGDYM9TD6VtARGb0LD5jq2wjtMy1vCP4M+sm6N6TigWeTYvnA8MoW29NqqXD0ep0rfBA==} peerDependencies: srvx: '>=0.11.5' peerDependenciesMeta: @@ -23648,9 +23761,6 @@ packages: exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - exsolve@1.1.0: - resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==} - extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -26607,10 +26717,20 @@ packages: peerDependencies: seroval: ^1.0 + seroval-plugins@1.6.2: + resolution: {integrity: sha512-TfxuUjlbBESzUOWdTkTKqvSmav0ABym+itetDXLK6mDz8SmrpdI30aF8RTXE8Bvq+tH/1yIDkvy3W0lfQb1ipQ==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + seroval@1.5.4: resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} engines: {node: '>=10'} + seroval@1.6.2: + resolution: {integrity: sha512-mPT+SD2TrlB6wvte1KkYOYUkubaTbd6pZ/6Kk3C9nxzrHmCZyhxOO7XGAeL7f+yLKZglzGtM9odUVvg/EhO+vQ==} + engines: {node: '>=10'} + serve-index@1.9.1: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} @@ -26736,8 +26856,8 @@ packages: solid-js@1.9.12: resolution: {integrity: sha512-QzKaSJq2/iDrWR1As6MHZQ8fQkdOBf8GReYb7L5iKwMGceg7HxDcaOHk0at66tNgn9U2U7dXo8ZZpLIAmGMzgw==} - solid-js@2.0.0-beta.32: - resolution: {integrity: sha512-Ka7SHt7wn8JYn61sXf9neBhxIdVGes8qVIdTNgrOu7LN0SveQ6k1tGa7BCvhqvDgrciy8a9lh4oW6cZdaU3s3w==} + solid-js@2.0.0-rc.0: + resolution: {integrity: sha512-3enTJ71VL69nM5p/it2InVBDBt316Cqfij+F0S7VuHZLITc8YV7Rvavjoy52nAKKxYWXM+BcXh2K7KcLTf1zdQ==} solid-motionone@1.0.4: resolution: {integrity: sha512-aqEjgecoO9raDFznu/dEci7ORSmA26Kjj9J4Cn1Gyr0GZuOVdvsNxdxClTL9J40Aq/uYFx4GLwC8n70fMLHiuA==} @@ -27846,17 +27966,6 @@ packages: '@testing-library/jest-dom': optional: true - vite-plugin-solid@3.0.0-next.23: - resolution: {integrity: sha512-3I5U5y5eU0wqRhFRbhpTtPpmr7yrLNowGuEM4j868vXDuzzjdc2uNhWKbIk59tUSjfIVXUYe5zDSjOXKWjRm8A==} - peerDependencies: - '@solidjs/web': '>=2.0.0-beta.32 <2.0.0-experimental.0' - '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* - solid-js: '>=2.0.0-beta.32 <2.0.0-experimental.0' - vite: ^8.0.14 - peerDependenciesMeta: - '@testing-library/jest-dom': - optional: true - vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: @@ -28641,7 +28750,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.5 '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -28711,7 +28820,7 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -28720,7 +28829,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -29383,9 +29492,9 @@ snapshots: '@colors/colors@1.6.0': {} - '@convex-dev/better-auth@0.9.7(@standard-schema/spec@1.1.0)(@typescript/typescript6@6.0.2)(better-auth@1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)))(convex@1.28.2(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3))(hono@4.7.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@convex-dev/better-auth@0.9.7(@standard-schema/spec@1.1.0)(@typescript/typescript6@6.0.2)(better-auth@1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-rc.0)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)))(convex@1.28.2(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3))(hono@4.7.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - better-auth: 1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)) + better-auth: 1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-rc.0)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)) common-tags: 1.8.2 convex: 1.28.2(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) convex-helpers: 0.1.104(@standard-schema/spec@1.1.0)(@typescript/typescript6@6.0.2)(convex@1.28.2(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3))(hono@4.7.10)(react@19.2.3)(zod@3.25.76) @@ -29401,9 +29510,9 @@ snapshots: - hono - typescript - '@convex-dev/react-query@0.0.0-alpha.8(@tanstack/react-query@5.99.0(react@19.2.3))(convex@1.19.0(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': + '@convex-dev/react-query@0.0.0-alpha.8(@tanstack/react-query@5.101.4(react@19.2.3))(convex@1.19.0(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': dependencies: - '@tanstack/react-query': 5.99.0(react@19.2.3) + '@tanstack/react-query': 5.101.4(react@19.2.3) convex: 1.19.0(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@cspotcode/source-map-support@0.8.1': @@ -29499,7 +29608,7 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@dom-expressions/babel-plugin-jsx@0.50.0-next.40(@babel/core@7.28.5)': + '@dom-expressions/babel-plugin-jsx@0.50.0-next.42(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.18.6 @@ -29509,7 +29618,7 @@ snapshots: parse5: 7.3.0 validate-html-nesting: 1.2.4 - '@dom-expressions/babel-plugin-jsx@0.50.0-next.40(@babel/core@7.29.0)': + '@dom-expressions/babel-plugin-jsx@0.50.0-next.42(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.18.6 @@ -29535,7 +29644,7 @@ snapshots: dependencies: '@emnapi/core': 1.11.2 '@emnapi/runtime': 1.11.2 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true '@dom-expressions/compiler-win32-x64-msvc@0.50.0-next.40': @@ -30799,12 +30908,12 @@ snapshots: '@img/sharp-wasm32@0.34.4': dependencies: - '@emnapi/runtime': 1.11.2 + '@emnapi/runtime': 1.11.1 optional: true '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.11.2 + '@emnapi/runtime': 1.11.1 optional: true '@img/sharp-win32-arm64@0.34.4': @@ -31273,8 +31382,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 '@tybys/wasm-util': 0.10.2 optional: true @@ -31291,6 +31400,13 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.2 + optional: true + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: '@emnapi/core': 1.11.2 @@ -31298,21 +31414,21 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true - '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.3 optional: true - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 '@tybys/wasm-util': 0.10.3 optional: true - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: '@emnapi/core': 1.11.2 '@emnapi/runtime': 1.11.2 @@ -31623,7 +31739,7 @@ snapshots: '@netlify/zip-it-and-ship-it@14.1.11(rollup@4.56.0)': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.28.5 '@babel/types': 7.28.4 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 2.7.1 @@ -31682,13 +31798,13 @@ snapshots: '@nothing-but/utils@0.17.0': {} - '@nx/devkit@22.7.5(nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3))': + '@nx/devkit@22.7.5(nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3))': dependencies: '@zkochan/js-yaml': 0.0.7 ejs: 5.0.1 enquirer: 2.3.6 minimatch: 10.2.5 - nx: 22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3) + nx: 22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3) semver: 7.8.2 tslib: 2.8.1 yargs-parser: 21.1.1 @@ -31801,9 +31917,9 @@ snapshots: '@oxc-minify/binding-openharmony-arm64@0.110.0': optional: true - '@oxc-minify/binding-wasm32-wasi@0.110.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@oxc-minify/binding-wasm32-wasi@0.110.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -31870,9 +31986,9 @@ snapshots: '@oxc-resolver/binding-openharmony-arm64@11.19.1': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -31935,9 +32051,9 @@ snapshots: '@oxc-transform/binding-openharmony-arm64@0.110.0': optional: true - '@oxc-transform/binding-wasm32-wasi@0.110.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@oxc-transform/binding-wasm32-wasi@0.110.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -33040,6 +33156,14 @@ snapshots: '@rolldown/binding-openharmony-arm64@1.0.2': optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.9(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.9(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) @@ -33052,7 +33176,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9': @@ -33067,6 +33191,14 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.2': optional: true + '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': + dependencies: + '@babel/core': 7.29.0 + picomatch: 4.0.4 + rolldown: 1.0.2 + optionalDependencies: + vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + '@rolldown/pluginutils@1.0.0': {} '@rolldown/pluginutils@1.0.0-beta.19': {} @@ -33264,13 +33396,13 @@ snapshots: transitivePeerDependencies: - '@rspack/core' - '@rsbuild/plugin-solid@2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32)': + '@rsbuild/plugin-solid@2.0.0-beta.0(@babel/core@7.29.0)(@rsbuild/core@2.1.1)(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': dependencies: '@rsbuild/plugin-babel': 1.1.2(@rsbuild/core@2.1.1) - '@solidjs/web': 2.0.0-beta.32(solid-js@2.0.0-beta.32) - babel-preset-solid: 2.0.0-beta.32(@babel/core@7.29.0)(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 - solid-refresh: 0.8.0-next.7(solid-js@2.0.0-beta.32) + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + babel-preset-solid: 2.0.0-beta.34(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 + solid-refresh: 0.8.0-next.7(solid-js@2.0.0-rc.0) optionalDependencies: '@rsbuild/core': 2.1.1 transitivePeerDependencies: @@ -33622,11 +33754,11 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.2.3 - '@sentry/solid@10.32.0(@tanstack/solid-router@packages+solid-router)(solid-js@2.0.0-beta.32)': + '@sentry/solid@10.32.0(@tanstack/solid-router@packages+solid-router)(solid-js@2.0.0-rc.0)': dependencies: '@sentry/browser': 10.32.0 '@sentry/core': 10.32.0 - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 optionalDependencies: '@tanstack/solid-router': link:packages/solid-router @@ -33669,184 +33801,215 @@ snapshots: color: 5.0.2 text-hex: 1.0.0 - '@solid-devtools/debugger@0.26.0(solid-js@2.0.0-beta.32)': + '@solid-devtools/debugger@0.28.1(solid-js@2.0.0-rc.0)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/shared': 0.19.0(solid-js@2.0.0-beta.32) - '@solid-primitives/bounds': 0.0.122(solid-js@2.0.0-beta.32) - '@solid-primitives/cursor': 0.0.115(solid-js@2.0.0-beta.32) - '@solid-primitives/event-listener': 2.4.0(solid-js@2.0.0-beta.32) - '@solid-primitives/keyboard': 1.3.0(solid-js@2.0.0-beta.32) - '@solid-primitives/platform': 0.1.2(solid-js@2.0.0-beta.32) - '@solid-primitives/rootless': 1.5.0(solid-js@2.0.0-beta.32) - '@solid-primitives/scheduled': 1.5.0(solid-js@2.0.0-beta.32) - '@solid-primitives/static-store': 0.0.8(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 - - '@solid-devtools/logger@0.9.7(solid-js@2.0.0-beta.32)': + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-rc.0) + '@solid-primitives/bounds': 0.1.7(solid-js@2.0.0-rc.0) + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/keyboard': 1.3.3(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 + + '@solid-devtools/logger@0.9.11(solid-js@2.0.0-rc.0)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/debugger': 0.26.0(solid-js@2.0.0-beta.32) - '@solid-devtools/shared': 0.19.0(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-devtools/debugger': 0.28.1(solid-js@2.0.0-rc.0) + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-devtools/shared@0.19.0(solid-js@2.0.0-beta.32)': + '@solid-devtools/shared@0.20.0(solid-js@2.0.0-rc.0)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-primitives/event-listener': 2.4.0(solid-js@2.0.0-beta.32) - '@solid-primitives/media': 2.3.0(solid-js@2.0.0-beta.32) - '@solid-primitives/refs': 1.1.0(solid-js@2.0.0-beta.32) - '@solid-primitives/rootless': 1.5.0(solid-js@2.0.0-beta.32) - '@solid-primitives/scheduled': 1.5.0(solid-js@2.0.0-beta.32) - '@solid-primitives/static-store': 0.0.8(solid-js@2.0.0-beta.32) - '@solid-primitives/styles': 0.0.114(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/media': 2.3.6(solid-js@2.0.0-rc.0) + '@solid-primitives/refs': 1.1.4(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/styles': 0.1.4(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 + + '@solid-primitives/bounds@0.1.7(solid-js@2.0.0-rc.0)': + dependencies: + '@solid-primitives/event-listener': 2.4.6(solid-js@2.0.0-rc.0) + '@solid-primitives/resize-observer': 2.2.0(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.4(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.4.1(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/bounds@0.0.122(solid-js@2.0.0-beta.32)': + '@solid-primitives/context@0.3.2(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.0(solid-js@2.0.0-beta.32) - '@solid-primitives/resize-observer': 2.1.0(solid-js@2.0.0-beta.32) - '@solid-primitives/static-store': 0.0.8(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 - '@solid-primitives/context@0.3.2(solid-js@2.0.0-beta.32)': + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.12)': dependencies: - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/cursor@0.0.115(solid-js@2.0.0-beta.32)': + '@solid-primitives/event-listener@2.4.3(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/event-listener@2.4.0(solid-js@2.0.0-beta.32)': + '@solid-primitives/event-listener@2.4.6(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.4.1(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/event-listener@2.4.3(solid-js@2.0.0-beta.32)': + '@solid-primitives/keyboard@1.3.0(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.12) + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.12) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/keyboard@1.3.0(solid-js@2.0.0-beta.32)': + '@solid-primitives/keyboard@1.3.0(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.0(solid-js@2.0.0-beta.32) - '@solid-primitives/rootless': 1.5.0(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/keyboard@1.3.3(solid-js@2.0.0-beta.32)': + '@solid-primitives/keyboard@1.3.3(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-beta.32) - '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/media@2.3.0(solid-js@2.0.0-beta.32)': + '@solid-primitives/media@2.3.6(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.0(solid-js@2.0.0-beta.32) - '@solid-primitives/rootless': 1.5.0(solid-js@2.0.0-beta.32) - '@solid-primitives/static-store': 0.1.0(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/event-listener': 2.4.6(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.4(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.4(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.4.1(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/platform@0.1.2(solid-js@2.0.0-beta.32)': + '@solid-primitives/props@3.2.2(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/props@3.2.2(solid-js@2.0.0-beta.32)': + '@solid-primitives/refs@1.1.0(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/refs@1.1.0(solid-js@2.0.0-beta.32)': + '@solid-primitives/refs@1.1.4(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.4.1(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/resize-observer@2.1.0(solid-js@2.0.0-beta.32)': + '@solid-primitives/resize-observer@2.1.3(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.0(solid-js@2.0.0-beta.32) - '@solid-primitives/rootless': 1.5.0(solid-js@2.0.0-beta.32) - '@solid-primitives/static-store': 0.1.0(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.2(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/resize-observer@2.1.3(solid-js@2.0.0-beta.32)': + '@solid-primitives/resize-observer@2.2.0(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-beta.32) - '@solid-primitives/rootless': 1.5.2(solid-js@2.0.0-beta.32) - '@solid-primitives/static-store': 0.1.2(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/event-listener': 2.4.6(solid-js@2.0.0-rc.0) + '@solid-primitives/rootless': 1.5.4(solid-js@2.0.0-rc.0) + '@solid-primitives/static-store': 0.1.4(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.4.1(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/rootless@1.5.0(solid-js@2.0.0-beta.32)': + '@solid-primitives/rootless@1.5.2(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/rootless@1.5.2(solid-js@2.0.0-beta.32)': + '@solid-primitives/rootless@1.5.2(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/scheduled@1.5.0(solid-js@2.0.0-beta.32)': + '@solid-primitives/rootless@1.5.4(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.4.1(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/static-store@0.0.8(solid-js@2.0.0-beta.32)': + '@solid-primitives/scheduled@1.5.3(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 - '@solid-primitives/static-store@0.1.0(solid-js@2.0.0-beta.32)': + '@solid-primitives/static-store@0.1.2(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/static-store@0.1.2(solid-js@2.0.0-beta.32)': + '@solid-primitives/static-store@0.1.4(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/utils': 6.4.1(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/styles@0.0.114(solid-js@2.0.0-beta.32)': + '@solid-primitives/styles@0.1.4(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/rootless': 1.5.0(solid-js@2.0.0-beta.32) - '@solid-primitives/utils': 6.3.0(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@solid-primitives/rootless': 1.5.4(solid-js@2.0.0-rc.0) + '@solid-primitives/utils': 6.4.1(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@solid-primitives/transition-group@1.1.2(solid-js@2.0.0-beta.32)': + '@solid-primitives/transition-group@1.1.2(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 - '@solid-primitives/utils@6.3.0(solid-js@2.0.0-beta.32)': + '@solid-primitives/utils@6.3.0(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 - '@solid-primitives/utils@6.3.2(solid-js@2.0.0-beta.32)': + '@solid-primitives/utils@6.3.2(solid-js@1.9.12)': dependencies: - solid-js: 2.0.0-beta.32 + solid-js: 1.9.12 - '@solidjs/meta@0.29.4(solid-js@2.0.0-beta.32)': + '@solid-primitives/utils@6.3.2(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 - '@solidjs/signals@2.0.0-beta.32': {} + '@solid-primitives/utils@6.4.1(solid-js@2.0.0-rc.0)': + dependencies: + solid-js: 2.0.0-rc.0 - '@solidjs/testing-library@0.8.10(solid-js@2.0.0-beta.32)': + '@solidjs/meta@0.29.4(solid-js@2.0.0-rc.0)': + dependencies: + solid-js: 2.0.0-rc.0 + + '@solidjs/signals@2.0.0-rc.0': {} + + '@solidjs/testing-library@0.8.10(solid-js@2.0.0-rc.0)': dependencies: '@testing-library/dom': 10.4.1 - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 + + '@solidjs/vite-plugin@3.0.0-next.28(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-rc.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/core': 7.29.0 + '@dom-expressions/compiler': 0.50.0-next.40 + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + '@types/babel__core': 7.20.5 + babel-preset-solid: 2.0.0-rc.0(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) + merge-anything: 5.1.7 + solid-js: 2.0.0-rc.0 + vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + optionalDependencies: + '@testing-library/jest-dom': 6.6.3 + transitivePeerDependencies: + - supports-color - '@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32)': + '@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0)': dependencies: seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 '@speed-highlight/core@1.2.14': {} @@ -33931,14 +34094,14 @@ snapshots: '@swc/core': 1.15.33(@swc/helpers@0.5.23) '@swc/types': 0.1.26 - '@swc-node/register@1.11.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2)': + '@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2)': dependencies: '@swc-node/core': 1.14.1(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26) '@swc-node/sourcemap-support': 0.6.1 '@swc/core': 1.15.33(@swc/helpers@0.5.23) colorette: 2.0.20 debug: 4.4.3 - oxc-resolver: 11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + oxc-resolver: 11.19.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) pirates: 4.0.7 tslib: 2.8.1 typescript: '@typescript/typescript6@6.0.2' @@ -34026,7 +34189,7 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.20.1 - jiti: 2.7.0 + jiti: 2.6.1 lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 @@ -34189,46 +34352,67 @@ snapshots: '@tanstack/devtools-event-client@0.3.4': {} - '@tanstack/devtools-ui@0.3.5(csstype@3.2.3)(solid-js@2.0.0-beta.32)': + '@tanstack/devtools-ui@0.3.5(csstype@3.2.3)(solid-js@1.9.12)': + dependencies: + clsx: 2.1.1 + goober: 2.1.16(csstype@3.2.3) + solid-js: 1.9.12 + transitivePeerDependencies: + - csstype + + '@tanstack/devtools-ui@0.3.5(csstype@3.2.3)(solid-js@2.0.0-rc.0)': dependencies: clsx: 2.1.1 goober: 2.1.16(csstype@3.2.3) - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 transitivePeerDependencies: - csstype - '@tanstack/devtools-ui@0.4.4(csstype@3.2.3)(solid-js@2.0.0-beta.32)': + '@tanstack/devtools-ui@0.4.4(csstype@3.2.3)(solid-js@2.0.0-rc.0)': dependencies: clsx: 2.1.1 goober: 2.1.16(csstype@3.2.3) - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 transitivePeerDependencies: - csstype - '@tanstack/devtools@0.6.14(csstype@3.2.3)(solid-js@2.0.0-beta.32)': + '@tanstack/devtools@0.6.14(csstype@3.2.3)(solid-js@1.9.12)': dependencies: - '@solid-primitives/keyboard': 1.3.0(solid-js@2.0.0-beta.32) + '@solid-primitives/keyboard': 1.3.0(solid-js@1.9.12) '@tanstack/devtools-event-bus': 0.3.2 - '@tanstack/devtools-ui': 0.3.5(csstype@3.2.3)(solid-js@2.0.0-beta.32) + '@tanstack/devtools-ui': 0.3.5(csstype@3.2.3)(solid-js@1.9.12) clsx: 2.1.1 goober: 2.1.16(csstype@3.2.3) - solid-js: 2.0.0-beta.32 + solid-js: 1.9.12 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/devtools@0.8.1(csstype@3.2.3)(solid-js@2.0.0-beta.32)': + '@tanstack/devtools@0.6.14(csstype@3.2.3)(solid-js@2.0.0-rc.0)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-beta.32) - '@solid-primitives/keyboard': 1.3.3(solid-js@2.0.0-beta.32) - '@solid-primitives/resize-observer': 2.1.3(solid-js@2.0.0-beta.32) + '@solid-primitives/keyboard': 1.3.0(solid-js@2.0.0-rc.0) + '@tanstack/devtools-event-bus': 0.3.2 + '@tanstack/devtools-ui': 0.3.5(csstype@3.2.3)(solid-js@2.0.0-rc.0) + clsx: 2.1.1 + goober: 2.1.16(csstype@3.2.3) + solid-js: 2.0.0-rc.0 + transitivePeerDependencies: + - bufferutil + - csstype + - utf-8-validate + + '@tanstack/devtools@0.8.1(csstype@3.2.3)(solid-js@2.0.0-rc.0)': + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@2.0.0-rc.0) + '@solid-primitives/keyboard': 1.3.3(solid-js@2.0.0-rc.0) + '@solid-primitives/resize-observer': 2.1.3(solid-js@2.0.0-rc.0) '@tanstack/devtools-client': 0.0.4 '@tanstack/devtools-event-bus': 0.3.3 - '@tanstack/devtools-ui': 0.4.4(csstype@3.2.3)(solid-js@2.0.0-beta.32) + '@tanstack/devtools-ui': 0.4.4(csstype@3.2.3)(solid-js@2.0.0-rc.0) clsx: 2.1.1 goober: 2.1.16(csstype@3.2.3) - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 transitivePeerDependencies: - bufferutil - csstype @@ -34270,7 +34454,7 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.99.0': {} + '@tanstack/query-core@5.101.4': {} '@tanstack/query-devtools@5.101.0': {} @@ -34280,9 +34464,22 @@ snapshots: '@tanstack/query-devtools@5.91.1': {} - '@tanstack/react-devtools@0.7.0(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32)': + '@tanstack/react-devtools@0.7.0(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.12)': + dependencies: + '@tanstack/devtools': 0.6.14(csstype@3.2.3)(solid-js@1.9.12) + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - bufferutil + - csstype + - solid-js + - utf-8-validate + + '@tanstack/react-devtools@0.7.0(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-rc.0)': dependencies: - '@tanstack/devtools': 0.6.14(csstype@3.2.3)(solid-js@2.0.0-beta.32) + '@tanstack/devtools': 0.6.14(csstype@3.2.3)(solid-js@2.0.0-rc.0) '@types/react': 19.2.9 '@types/react-dom': 19.2.3(@types/react@19.2.9) react: 19.2.3 @@ -34293,21 +34490,21 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-query-devtools@5.67.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3)': + '@tanstack/react-query-devtools@5.67.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/query-devtools': 5.67.2 - '@tanstack/react-query': 5.99.0(react@19.2.3) + '@tanstack/react-query': 5.101.4(react@19.2.3) react: 19.2.3 - '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.99.0(react@19.2.3))(react@19.2.3)': + '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.101.4(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/query-devtools': 5.90.1 - '@tanstack/react-query': 5.99.0(react@19.2.3) + '@tanstack/react-query': 5.101.4(react@19.2.3) react: 19.2.3 - '@tanstack/react-query@5.99.0(react@19.2.3)': + '@tanstack/react-query@5.101.4(react@19.2.3)': dependencies: - '@tanstack/query-core': 5.99.0 + '@tanstack/query-core': 5.101.4 react: 19.2.3 '@tanstack/react-store@0.9.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': @@ -34323,30 +34520,30 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - '@tanstack/solid-devtools@0.7.14(csstype@3.2.3)(solid-js@2.0.0-beta.32)': + '@tanstack/solid-devtools@0.7.14(csstype@3.2.3)(solid-js@2.0.0-rc.0)': dependencies: - '@tanstack/devtools': 0.8.1(csstype@3.2.3)(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@tanstack/devtools': 0.8.1(csstype@3.2.3)(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/solid-query-devtools@6.0.0-beta.7(@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32))(solid-js@2.0.0-beta.32)': + '@tanstack/solid-query-devtools@6.0.0-rc.0(@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': dependencies: '@tanstack/query-devtools': 5.101.0 - '@tanstack/solid-query': 6.0.0-beta.7(solid-js@2.0.0-beta.32) - solid-js: 2.0.0-beta.32 + '@tanstack/solid-query': 6.0.0-rc.0(solid-js@2.0.0-rc.0) + solid-js: 2.0.0-rc.0 - '@tanstack/solid-query@6.0.0-beta.7(solid-js@2.0.0-beta.32)': + '@tanstack/solid-query@6.0.0-rc.0(solid-js@2.0.0-rc.0)': dependencies: - '@tanstack/query-core': 5.99.0 - solid-js: 2.0.0-beta.32 + '@tanstack/query-core': 5.101.4 + solid-js: 2.0.0-rc.0 - '@tanstack/solid-virtual@3.13.12(solid-js@2.0.0-beta.32)': + '@tanstack/solid-virtual@3.13.12(solid-js@2.0.0-rc.0)': dependencies: '@tanstack/virtual-core': 3.13.12 - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 '@tanstack/store@0.9.3': {} @@ -34368,50 +34565,50 @@ snapshots: - supports-color - typescript - '@tanstack/vue-query-devtools@5.91.0(@tanstack/vue-query@5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)))(vue@3.5.25(@typescript/typescript6@6.0.2))': + '@tanstack/vue-query-devtools@5.91.0(@tanstack/vue-query@5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)))(vue@3.5.25(@typescript/typescript6@6.0.2))': dependencies: '@tanstack/query-devtools': 5.90.1 - '@tanstack/vue-query': 5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)) + '@tanstack/vue-query': 5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)) vue: 3.5.25(@typescript/typescript6@6.0.2) - '@tanstack/vue-query-devtools@6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)))(vue@3.5.25(@typescript/typescript6@6.0.2))': + '@tanstack/vue-query-devtools@6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)))(vue@3.5.25(@typescript/typescript6@6.0.2))': dependencies: '@tanstack/query-devtools': 5.91.1 - '@tanstack/vue-query': 5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2)) + '@tanstack/vue-query': 5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2)) vue: 3.5.25(@typescript/typescript6@6.0.2) - '@tanstack/vue-query-devtools@6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3))': + '@tanstack/vue-query-devtools@6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3))': dependencies: '@tanstack/query-devtools': 5.91.1 - '@tanstack/vue-query': 5.99.0(vue@3.5.25(typescript@5.8.3)) + '@tanstack/vue-query': 5.101.4(vue@3.5.25(typescript@5.8.3)) vue: 3.5.25(typescript@5.8.3) - '@tanstack/vue-query-devtools@6.1.2(@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@7.0.2)))(vue@3.5.25(typescript@7.0.2))': + '@tanstack/vue-query-devtools@6.1.2(@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@7.0.2)))(vue@3.5.25(typescript@7.0.2))': dependencies: '@tanstack/query-devtools': 5.91.1 - '@tanstack/vue-query': 5.99.0(vue@3.5.25(typescript@7.0.2)) + '@tanstack/vue-query': 5.101.4(vue@3.5.25(typescript@7.0.2)) vue: 3.5.25(typescript@7.0.2) - '@tanstack/vue-query@5.99.0(vue@3.5.25(@typescript/typescript6@6.0.2))': + '@tanstack/vue-query@5.101.4(vue@3.5.25(@typescript/typescript6@6.0.2))': dependencies: '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/query-core': 5.99.0 + '@tanstack/query-core': 5.101.4 '@vue/devtools-api': 6.6.4 vue: 3.5.25(@typescript/typescript6@6.0.2) vue-demi: 0.14.10(vue@3.5.25(@typescript/typescript6@6.0.2)) - '@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@5.8.3))': + '@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@5.8.3))': dependencies: '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/query-core': 5.99.0 + '@tanstack/query-core': 5.101.4 '@vue/devtools-api': 6.6.4 vue: 3.5.25(typescript@5.8.3) vue-demi: 0.14.10(vue@3.5.25(typescript@5.8.3)) - '@tanstack/vue-query@5.99.0(vue@3.5.25(typescript@7.0.2))': + '@tanstack/vue-query@5.101.4(vue@3.5.25(typescript@7.0.2))': dependencies: '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/query-core': 5.99.0 + '@tanstack/query-core': 5.101.4 '@vue/devtools-api': 6.6.4 vue: 3.5.25(typescript@7.0.2) vue-demi: 0.14.10(vue@3.5.25(typescript@7.0.2)) @@ -34497,9 +34694,9 @@ snapshots: dependencies: typescript: '@typescript/typescript6@6.0.2' - '@trpc/tanstack-react-query@11.4.3(@tanstack/react-query@5.99.0(react@19.2.3))(@trpc/client@11.4.3(@trpc/server@11.4.3(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2))(@trpc/server@11.4.3(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@trpc/tanstack-react-query@11.4.3(@tanstack/react-query@5.101.4(react@19.2.3))(@trpc/client@11.4.3(@trpc/server@11.4.3(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2))(@trpc/server@11.4.3(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/react-query': 5.99.0(react@19.2.3) + '@tanstack/react-query': 5.101.4(react@19.2.3) '@trpc/client': 11.4.3(@trpc/server@11.4.3(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2) '@trpc/server': 11.4.3(@typescript/typescript6@6.0.2) react: 19.2.3 @@ -35411,10 +35608,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@6.0.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': + '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + optionalDependencies: + '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + babel-plugin-react-compiler: 1.0.0 '@vitejs/plugin-rsc@0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: @@ -35647,22 +35847,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.29.0)': - dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.29.0 - '@vue/babel-helper-vue-transform-on': 1.5.0 - '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.29.0) - '@vue/shared': 3.5.25 - optionalDependencies: - '@babel/core': 7.29.0 - transitivePeerDependencies: - - supports-color - '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.0)': dependencies: '@babel/helper-module-imports': 7.27.1 @@ -35690,17 +35874,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.29.0)': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/parser': 7.28.5 - '@vue/compiler-sfc': 3.5.25 - transitivePeerDependencies: - - supports-color - '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.0)': dependencies: '@babel/code-frame': 7.27.1 @@ -36274,25 +36447,20 @@ snapshots: html-entities: 2.3.3 parse5: 7.3.0 - babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) - '@babel/types': 7.29.0 - html-entities: 2.3.3 - parse5: 7.3.0 - babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.26.7 cosmiconfig: 7.1.0 resolve: 1.22.11 + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.29.0 + babel-plugin-vue-jsx-hmr@1.0.0: dependencies: '@babel/core': 7.29.0 - '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) transitivePeerDependencies: - supports-color @@ -36303,33 +36471,33 @@ snapshots: optionalDependencies: solid-js: 1.9.12 - babel-preset-solid@1.9.10(@babel/core@7.28.5)(solid-js@2.0.0-beta.32): + babel-preset-solid@1.9.10(@babel/core@7.28.5)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.28.5 babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.28.5) optionalDependencies: - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 - babel-preset-solid@1.9.10(@babel/core@7.29.0)(solid-js@2.0.0-beta.32): + babel-preset-solid@2.0.0-beta.34(@babel/core@7.29.0)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.29.0 - babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.29.0) + '@dom-expressions/babel-plugin-jsx': 0.50.0-next.42(@babel/core@7.29.0) optionalDependencies: - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 - babel-preset-solid@2.0.0-beta.32(@babel/core@7.28.5)(solid-js@2.0.0-beta.32): + babel-preset-solid@2.0.0-rc.0(@babel/core@7.28.5)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.28.5 - '@dom-expressions/babel-plugin-jsx': 0.50.0-next.40(@babel/core@7.28.5) + '@dom-expressions/babel-plugin-jsx': 0.50.0-next.42(@babel/core@7.28.5) optionalDependencies: - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 - babel-preset-solid@2.0.0-beta.32(@babel/core@7.29.0)(solid-js@2.0.0-beta.32): + babel-preset-solid@2.0.0-rc.0(@babel/core@7.29.0)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.29.0 - '@dom-expressions/babel-plugin-jsx': 0.50.0-next.40(@babel/core@7.29.0) + '@dom-expressions/babel-plugin-jsx': 0.50.0-next.42(@babel/core@7.29.0) optionalDependencies: - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 balanced-match@1.0.2: {} @@ -36382,7 +36550,7 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - better-auth@1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)): + better-auth@1.6.19(@prisma/client@7.0.0(@typescript/typescript6@6.0.2)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)))(@tanstack/solid-start@packages+solid-start)(mysql2@3.15.3)(prisma@7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-rc.0)(vitest@4.1.4)(vue@3.5.25(@typescript/typescript6@6.0.2)): dependencies: '@better-auth/core': 1.6.19(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.6(zod@4.4.3))(jose@6.1.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/drizzle-adapter': 1.6.19(@better-auth/core@1.6.19(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.6(zod@4.4.3))(jose@6.1.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.2) @@ -36408,7 +36576,7 @@ snapshots: prisma: 7.0.0(@types/react@19.2.9)(@typescript/typescript6@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 vitest: 4.1.4(@types/node@25.0.9)(@vitest/ui@4.1.4)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.7.0(@types/node@25.0.9)(@typescript/typescript6@6.0.2))(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vue: 3.5.25(@typescript/typescript6@6.0.2) transitivePeerDependencies: @@ -36555,9 +36723,9 @@ snapshots: confbox: 0.2.2 defu: 6.1.4 dotenv: 16.6.1 - exsolve: 1.1.0 + exsolve: 1.0.8 giget: 2.0.0 - jiti: 2.7.0 + jiti: 2.6.1 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 @@ -36572,7 +36740,7 @@ snapshots: dotenv: 17.4.2 exsolve: 1.0.8 giget: 2.0.0 - jiti: 2.7.0 + jiti: 2.6.1 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 2.0.0 @@ -36913,11 +37081,11 @@ snapshots: typescript: '@typescript/typescript6@6.0.2' zod: 3.25.76 - convex-solidjs@0.0.3(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-beta.32): + convex-solidjs@0.0.3(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(solid-js@2.0.0-rc.0): dependencies: - '@solid-primitives/context': 0.3.2(solid-js@2.0.0-beta.32) + '@solid-primitives/context': 0.3.2(solid-js@2.0.0-rc.0) convex: 1.28.2(@clerk/clerk-react@5.59.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 transitivePeerDependencies: - '@auth0/auth0-react' - '@clerk/clerk-react' @@ -37017,11 +37185,11 @@ snapshots: optionalDependencies: srvx: 0.11.15 - crossws@0.4.9(srvx@0.11.15): + crossws@0.4.4(srvx@0.11.18): optionalDependencies: - srvx: 0.11.15 + srvx: 0.11.18 - crossws@0.4.9(srvx@0.11.22): + crossws@0.4.5(srvx@0.11.22): optionalDependencies: srvx: 0.11.22 optional: true @@ -37484,7 +37652,7 @@ snapshots: env-runner@0.1.6(miniflare@4.20260317.0): dependencies: - crossws: 0.4.9(srvx@0.11.15) + crossws: 0.4.4(srvx@0.11.18) httpxy: 0.3.1 srvx: 0.11.18 optionalDependencies: @@ -37539,13 +37707,13 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild-plugin-solid@0.6.0(esbuild@0.27.4)(solid-js@2.0.0-beta.32): + esbuild-plugin-solid@0.6.0(esbuild@0.27.4)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.28.5 '@babel/preset-typescript': 7.27.1(@babel/core@7.28.5) - babel-preset-solid: 1.9.10(@babel/core@7.28.5)(solid-js@2.0.0-beta.32) + babel-preset-solid: 1.9.10(@babel/core@7.28.5)(solid-js@2.0.0-rc.0) esbuild: 0.27.4 - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 transitivePeerDependencies: - supports-color @@ -38139,8 +38307,6 @@ snapshots: exsolve@1.0.8: {} - exsolve@1.1.0: {} - extendable-error@0.1.7: {} extract-zip@2.0.1: @@ -38607,12 +38773,12 @@ snapshots: optionalDependencies: crossws: 0.4.4(srvx@0.11.15) - h3@2.0.1-rc.20(crossws@0.4.9(srvx@0.11.22)): + h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.22)): dependencies: rou3: 0.8.1 srvx: 0.11.15 optionalDependencies: - crossws: 0.4.9(srvx@0.11.22) + crossws: 0.4.5(srvx@0.11.22) handle-thing@2.0.1: {} @@ -39490,7 +39656,7 @@ snapshots: get-port-please: 3.2.0 h3: 1.15.5 http-shutdown: 1.2.2 - jiti: 2.7.0 + jiti: 2.6.1 mlly: 1.8.0 node-forge: 1.3.1 pathe: 1.1.2 @@ -39892,7 +40058,7 @@ snapshots: nf3@0.3.6: {} - nitro@3.0.1-alpha.2(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.0.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): + nitro@3.0.1-alpha.2(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.0.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): dependencies: consola: 3.4.2 crossws: 0.4.3(srvx@0.10.1) @@ -39902,8 +40068,8 @@ snapshots: nf3: 0.3.6 ofetch: 2.0.0-alpha.3 ohash: 2.0.11 - oxc-minify: 0.110.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) - oxc-transform: 0.110.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + oxc-minify: 0.110.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + oxc-transform: 0.110.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) srvx: 0.10.1 undici: 7.24.4 unenv: 2.0.0-rc.24 @@ -39943,6 +40109,59 @@ snapshots: - sqlite3 - uploadthing + nitro@3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): + dependencies: + consola: 3.4.2 + crossws: 0.4.4(srvx@0.11.15) + db0: 0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3) + env-runner: 0.1.6(miniflare@4.20260317.0) + h3: 2.0.1-rc.16(crossws@0.4.4(srvx@0.11.15)) + hookable: 6.1.0 + nf3: 0.3.11 + ocache: 0.1.2 + ofetch: 2.0.0-alpha.3 + ohash: 2.0.11 + rolldown: 1.0.0-rc.9(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + srvx: 0.11.15 + unenv: 2.0.0-rc.24 + unstorage: 2.0.0-alpha.6(@netlify/blobs@10.1.0)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3) + optionalDependencies: + dotenv: 17.4.2 + giget: 2.0.0 + jiti: 2.7.0 + vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@emnapi/core' + - '@emnapi/runtime' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - chokidar + - drizzle-orm + - idb-keyval + - ioredis + - lru-cache + - miniflare + - mongodb + - mysql2 + - sqlite3 + - uploadthing + nitro@3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): dependencies: consola: 3.4.2 @@ -40140,7 +40359,7 @@ snapshots: node-source-walk@7.0.1: dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.28.5 node-stream-zip@1.15.0: {} @@ -40178,7 +40397,7 @@ snapshots: nwsapi@2.2.16: {} - nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3): + nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3): dependencies: '@emnapi/core': 1.4.5 '@emnapi/runtime': 1.4.5 @@ -40301,7 +40520,7 @@ snapshots: '@nx/nx-linux-x64-musl': 22.7.5 '@nx/nx-win32-arm64-msvc': 22.7.5 '@nx/nx-win32-x64-msvc': 22.7.5 - '@swc-node/register': 1.11.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2) + '@swc-node/register': 1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2) '@swc/core': 1.15.33(@swc/helpers@0.5.23) transitivePeerDependencies: - debug @@ -40421,7 +40640,7 @@ snapshots: outvariant@1.4.3: {} - oxc-minify@0.110.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): + oxc-minify@0.110.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): optionalDependencies: '@oxc-minify/binding-android-arm-eabi': 0.110.0 '@oxc-minify/binding-android-arm64': 0.110.0 @@ -40439,7 +40658,7 @@ snapshots: '@oxc-minify/binding-linux-x64-gnu': 0.110.0 '@oxc-minify/binding-linux-x64-musl': 0.110.0 '@oxc-minify/binding-openharmony-arm64': 0.110.0 - '@oxc-minify/binding-wasm32-wasi': 0.110.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@oxc-minify/binding-wasm32-wasi': 0.110.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) '@oxc-minify/binding-win32-arm64-msvc': 0.110.0 '@oxc-minify/binding-win32-ia32-msvc': 0.110.0 '@oxc-minify/binding-win32-x64-msvc': 0.110.0 @@ -40447,7 +40666,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-resolver@11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): + oxc-resolver@11.19.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.19.1 '@oxc-resolver/binding-android-arm64': 11.19.1 @@ -40465,7 +40684,7 @@ snapshots: '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 '@oxc-resolver/binding-linux-x64-musl': 11.19.1 '@oxc-resolver/binding-openharmony-arm64': 11.19.1 - '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 @@ -40473,7 +40692,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-transform@0.110.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): + oxc-transform@0.110.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): optionalDependencies: '@oxc-transform/binding-android-arm-eabi': 0.110.0 '@oxc-transform/binding-android-arm64': 0.110.0 @@ -40491,7 +40710,7 @@ snapshots: '@oxc-transform/binding-linux-x64-gnu': 0.110.0 '@oxc-transform/binding-linux-x64-musl': 0.110.0 '@oxc-transform/binding-openharmony-arm64': 0.110.0 - '@oxc-transform/binding-wasm32-wasi': 0.110.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@oxc-transform/binding-wasm32-wasi': 0.110.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) '@oxc-transform/binding-win32-arm64-msvc': 0.110.0 '@oxc-transform/binding-win32-ia32-msvc': 0.110.0 '@oxc-transform/binding-win32-x64-msvc': 0.110.0 @@ -41346,6 +41565,30 @@ snapshots: glob: 13.0.0 package-json-from-dist: 1.0.1 + rolldown@1.0.0-rc.9(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): + dependencies: + '@oxc-project/types': 0.115.0 + '@rolldown/pluginutils': 1.0.0-rc.9 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.9 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.9 + '@rolldown/binding-darwin-x64': 1.0.0-rc.9 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.9 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.9 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.9 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.9 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.9 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.9(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.9 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.9 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + rolldown@1.0.0-rc.9(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): dependencies: '@oxc-project/types': 0.115.0 @@ -41599,8 +41842,14 @@ snapshots: dependencies: seroval: 1.5.4 + seroval-plugins@1.6.2(seroval@1.6.2): + dependencies: + seroval: 1.6.2 + seroval@1.5.4: {} + seroval@1.6.2: {} + serve-index@1.9.1: dependencies: accepts: 1.3.8 @@ -41801,46 +42050,37 @@ snapshots: seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - solid-js@2.0.0-beta.32: + solid-js@2.0.0-rc.0: dependencies: - '@solidjs/signals': 2.0.0-beta.32 + '@solidjs/signals': 2.0.0-rc.0 csstype: 3.2.3 seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - solid-motionone@1.0.4(solid-js@2.0.0-beta.32): + solid-motionone@1.0.4(solid-js@2.0.0-rc.0): dependencies: '@motionone/dom': 10.18.0 '@motionone/utils': 10.18.0 - '@solid-primitives/props': 3.2.2(solid-js@2.0.0-beta.32) - '@solid-primitives/refs': 1.1.0(solid-js@2.0.0-beta.32) - '@solid-primitives/transition-group': 1.1.2(solid-js@2.0.0-beta.32) + '@solid-primitives/props': 3.2.2(solid-js@2.0.0-rc.0) + '@solid-primitives/refs': 1.1.0(solid-js@2.0.0-rc.0) + '@solid-primitives/transition-group': 1.1.2(solid-js@2.0.0-rc.0) csstype: 3.1.3 - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 solid-refresh@0.6.3(solid-js@1.9.12): dependencies: - '@babel/generator': 7.29.1 - '@babel/helper-module-imports': 7.28.6 + '@babel/generator': 7.28.5 + '@babel/helper-module-imports': 7.27.1 '@babel/types': 7.29.0 solid-js: 1.9.12 transitivePeerDependencies: - supports-color - solid-refresh@0.6.3(solid-js@2.0.0-beta.32): + solid-refresh@0.8.0-next.7(solid-js@2.0.0-rc.0): dependencies: '@babel/generator': 7.29.1 - '@babel/helper-module-imports': 7.28.6 '@babel/types': 7.29.0 - solid-js: 2.0.0-beta.32 - transitivePeerDependencies: - - supports-color - - solid-refresh@0.8.0-next.7(solid-js@2.0.0-beta.32): - dependencies: - '@babel/generator': 7.29.1 - '@babel/types': 7.29.0 - solid-js: 2.0.0-beta.32 + solid-js: 2.0.0-rc.0 sonic-boom@4.2.0: dependencies: @@ -42599,7 +42839,7 @@ snapshots: dependencies: citty: 0.1.6 defu: 6.1.4 - jiti: 2.7.0 + jiti: 2.6.1 knitwork: 1.3.0 scule: 1.3.0 @@ -42733,14 +42973,14 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.11(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): + vite-plugin-solid@2.11.11(@testing-library/jest-dom@6.6.3)(solid-js@1.9.12)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.5 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.10(@babel/core@7.29.0)(solid-js@2.0.0-beta.32) + babel-preset-solid: 1.9.10(@babel/core@7.28.5)(solid-js@1.9.12) merge-anything: 5.1.7 - solid-js: 2.0.0-beta.32 - solid-refresh: 0.6.3(solid-js@2.0.0-beta.32) + solid-js: 1.9.12 + solid-refresh: 0.6.3(solid-js@1.9.12) vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) vitefu: 1.1.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) optionalDependencies: @@ -42748,23 +42988,6 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-solid@3.0.0-next.23(@solidjs/web@2.0.0-beta.32(solid-js@2.0.0-beta.32))(@testing-library/jest-dom@6.6.3)(solid-js@2.0.0-beta.32)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/core': 7.29.0 - '@dom-expressions/compiler': 0.50.0-next.40 - '@solidjs/web': 2.0.0-beta.32(solid-js@2.0.0-beta.32) - '@types/babel__core': 7.20.5 - babel-preset-solid: 2.0.0-beta.32(@babel/core@7.29.0)(solid-js@2.0.0-beta.32) - merge-anything: 5.1.7 - solid-js: 2.0.0-beta.32 - vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - vitefu: 1.1.3(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) - optionalDependencies: - '@testing-library/jest-dom': 6.6.3 - transitivePeerDependencies: - - supports-color - vite-tsconfig-paths@5.1.4(@typescript/typescript6@6.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): dependencies: debug: 4.4.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6534858de30..ec057fecbf7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -51,10 +51,10 @@ catalog: vite: ^8.0.14 '@types/node': 25.0.9 '@playwright/test': ^1.61.0 - '@tanstack/query-core': ^5.99.0 - '@tanstack/react-query': ^5.99.0 - '@tanstack/solid-query': ^6.0.0-beta.7 - '@tanstack/vue-query': ^5.99.0 + '@tanstack/query-core': ^5.101.4 + '@tanstack/react-query': ^5.101.4 + '@tanstack/solid-query': ^6.0.0-rc.0 + '@tanstack/vue-query': ^5.101.4 overrides: '@types/babel__traverse': '^7.28.0' diff --git a/scripts/benchmarks/bundle-size/measure.mjs b/scripts/benchmarks/bundle-size/measure.mjs index 94d12b39b7a..239d63e0d67 100644 --- a/scripts/benchmarks/bundle-size/measure.mjs +++ b/scripts/benchmarks/bundle-size/measure.mjs @@ -548,8 +548,6 @@ async function buildViteScenario({ root, outDir, sourcemap }) { build: { outDir, emptyOutDir: true, - target: 'es2022', - minify: 'esbuild', sourcemap: sourcemap ? 'hidden' : false, reportCompressedSize: false, manifest: true,