Skip to content

Add framework adapter#7847

Draft
tannerlinsley wants to merge 6 commits into
mainfrom
taren/framework-adapter
Draft

Add framework adapter#7847
tannerlinsley wants to merge 6 commits into
mainfrom
taren/framework-adapter

Conversation

@tannerlinsley

@tannerlinsley tannerlinsley commented Jul 18, 2026

Copy link
Copy Markdown
Member

Summary

  • add official Octane Router and Start packages
  • add first-class .tsrx generation, transforms, and code splitting
  • add SSR, streaming hydration, server functions, and HMR coverage
  • add Vite, Cloudflare, Netlify, and Nitro integration coverage

Validation

  • lint, type, unit, build, publint, and package API checks for affected packages
  • Octane Start production SSR Playwright suite: 7 passed
  • Octane Start Vite HMR Playwright suite
  • Cloudflare and Netlify production builds
  • clean CI temp-directory reproduction for generator and CLI fixtures

@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1ba56b4e-a9a0-4742-b007-3d5e21efb8cc

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch taren/framework-adapter

Comment @coderabbitai help to get the list of available commands.

@nx-cloud

nx-cloud Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 09b8fa6

Command Status Duration Result
nx affected --targets=test:eslint,test:unit,tes... ✅ Succeeded 5m 35s View ↗
nx run-many --target=build --exclude=examples/*... ✅ Succeeded 31s View ↗

☁️ Nx Cloud last updated this comment at 2026-07-18 04:05:01 UTC

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Changeset Version Preview

8 package(s) bumped directly, 5 bumped as dependents.

🟩 Patch bumps

Package Version Reason
@tanstack/octane-router 1.170.18 → 1.170.19 Changeset
@tanstack/octane-start 1.168.28 → 1.168.29 Changeset
@tanstack/octane-start-client 1.168.16 → 1.168.17 Changeset
@tanstack/octane-start-server 1.167.22 → 1.167.23 Changeset
@tanstack/router-cli 1.167.21 → 1.167.22 Changeset
@tanstack/router-generator 1.167.21 → 1.167.22 Changeset
@tanstack/router-plugin 1.168.22 → 1.168.23 Changeset
@tanstack/start-plugin-core 1.171.22 → 1.171.23 Changeset
@tanstack/react-start 1.168.30 → 1.168.31 Dependent
@tanstack/react-start-rsc 0.1.29 → 0.1.30 Dependent
@tanstack/router-vite-plugin 1.167.22 → 1.167.23 Dependent
@tanstack/solid-start 1.168.30 → 1.168.31 Dependent
@tanstack/vue-start 1.168.29 → 1.168.30 Dependent

@github-actions

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Bundle Size Benchmarks

  • Commit: 8daa7b9b1461
  • Measured at: 2026-07-18T04:00:52.867Z
  • Baseline source: history:62a191baa068
  • Dashboard: bundle-size history
Scenario Current (gzip) Delta vs baseline Initial gzip Raw Brotli Trend
react-router.minimal 87.35 KiB 0 B (0.00%) 87.21 KiB 273.70 KiB 76.01 KiB ███▁▁▁▁▁▁▁▁
react-router.full 91.06 KiB 0 B (0.00%) 90.92 KiB 285.59 KiB 79.19 KiB ███▁▁▁▁▁▁▁▁
solid-router.minimal 35.53 KiB 0 B (0.00%) 35.40 KiB 105.90 KiB 31.94 KiB ███▁▁▁▁▁▁▁▁
solid-router.full 40.58 KiB 0 B (0.00%) 40.46 KiB 121.11 KiB 36.51 KiB ███▁▁▁▁▁▁▁▁
vue-router.minimal 53.00 KiB 0 B (0.00%) 52.87 KiB 149.94 KiB 47.63 KiB ███▁▁▁▁▁▁▁▁
vue-router.full 58.94 KiB 0 B (0.00%) 58.81 KiB 168.70 KiB 52.76 KiB ███▁▁▁▁▁▁▁▁
react-start.minimal 101.99 KiB 0 B (0.00%) 101.85 KiB 322.13 KiB 88.23 KiB ███▁▁▁▁▁▁▁▁
react-start.deferred-hydration 102.72 KiB 0 B (0.00%) 101.87 KiB 323.50 KiB 88.88 KiB ███▁▁▁▁▁▁▁▁
react-start.full 105.36 KiB 0 B (0.00%) 105.23 KiB 332.06 KiB 91.12 KiB ███▁▁▁▁▁▁▁▁
react-start.rsbuild.minimal 99.68 KiB 0 B (0.00%) 99.51 KiB 316.57 KiB 85.74 KiB ███▁▁▁▁▁▁▁▁
react-start.rsbuild.minimal-iife 100.08 KiB 0 B (0.00%) 99.91 KiB 317.51 KiB 86.11 KiB ███▁▁▁▁▁▁▁▁
react-start.rsbuild.full 102.89 KiB 0 B (0.00%) 102.72 KiB 326.63 KiB 88.52 KiB ███▁▁▁▁▁▁▁▁
solid-start.minimal 49.61 KiB 0 B (0.00%) 49.48 KiB 152.07 KiB 43.83 KiB ███▁▁▁▁▁▁▁▁
solid-start.deferred-hydration 52.87 KiB 0 B (0.00%) 49.53 KiB 160.11 KiB 46.89 KiB ███▁▁▁▁▁▁▁▁
solid-start.full 55.42 KiB 0 B (0.00%) 55.29 KiB 169.12 KiB 48.90 KiB ███▁▁▁▁▁▁▁▁
vue-start.minimal 71.03 KiB 0 B (0.00%) 70.90 KiB 207.19 KiB 62.89 KiB ███▁▁▁▁▁▁▁▁
vue-start.full 75.03 KiB 0 B (0.00%) 74.90 KiB 219.83 KiB 66.37 KiB ███▁▁▁▁▁▁▁▁

Current gzip tracks all emitted client JS chunks. Initial gzip tracks only the entry/import graph. Trend sparkline is historical current gzip ending with this PR measurement; lower is better.

@pkg-pr-new

pkg-pr-new Bot commented Jul 18, 2026

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@7847

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@7847

@tanstack/eslint-plugin-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-start@7847

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@7847

@tanstack/nitro-v2-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/nitro-v2-vite-plugin@7847

@tanstack/octane-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/octane-router@7847

@tanstack/octane-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/octane-start@7847

@tanstack/octane-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/octane-start-client@7847

@tanstack/octane-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/octane-start-server@7847

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@7847

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@7847

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@7847

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@7847

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@7847

@tanstack/react-start-rsc

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-rsc@7847

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@7847

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@7847

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@7847

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@7847

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@7847

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@7847

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@7847

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@7847

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@7847

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@7847

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@7847

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@7847

@tanstack/solid-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-ssr-query@7847

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@7847

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@7847

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@7847

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@7847

@tanstack/start-fn-stubs

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-fn-stubs@7847

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@7847

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@7847

@tanstack/start-static-server-functions

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-static-server-functions@7847

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@7847

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@7847

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@7847

@tanstack/vue-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-router@7847

@tanstack/vue-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-router-devtools@7847

@tanstack/vue-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-router-ssr-query@7847

@tanstack/vue-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-start@7847

@tanstack/vue-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-start-client@7847

@tanstack/vue-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-start-server@7847

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@7847

commit: 753f919

@codspeed-hq

codspeed-hq Bot commented Jul 18, 2026

Copy link
Copy Markdown

Merging this PR will regress 2 benchmarks

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 3 improved benchmarks
❌ 2 regressed benchmarks
✅ 175 untouched benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory mem client navigation-churn (vue) 986.5 KB 1,052.5 KB -6.27%
Memory mem server request-churn (react) 482.5 KB 502.5 KB -3.98%
Memory mem server error-paths not-found (solid) 763.6 KB 416.7 KB +83.24%
Memory mem server error-paths redirect (vue) 732.1 KB 545.2 KB +34.28%
Simulation client-preload interaction loop (react) 60.6 ms 57.3 ms +5.68%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing taren/framework-adapter (753f919) with main (62a191b)1

Open in CodSpeed

Footnotes

  1. No successful run was found on main (31a634d) during the generation of this report, so 62a191b was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

nx-cloud[bot]

This comment was marked as outdated.

@nx-cloud nx-cloud Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

At least one additional CI pipeline execution has run since the conclusion below was written and it may no longer be applicable.

Nx Cloud is proposing a fix for your failed CI:

We fixed three failing tasks introduced by the new framework adapter code. The rename fallback in generator.ts resolves EXDEV: cross-device link not permitted errors that occur when the generator's temp directory and the test's /tmp/ route directory reside on different filesystems, and the paths entries added to octane-start/tsconfig.json resolve the five TS2307 errors caused by TypeScript being unable to locate the unbuilt sub-path exports (/client, /server) during the type check.

Tip

We verified this fix by re-running @tanstack/router-generator:test:unit, @tanstack/octane-start:test:types.

Suggested Fix changes
diff --git a/packages/octane-start/tsconfig.json b/packages/octane-start/tsconfig.json
index 23535530..e800b9a6 100644
--- a/packages/octane-start/tsconfig.json
+++ b/packages/octane-start/tsconfig.json
@@ -2,7 +2,11 @@
   "extends": "../../tsconfig.json",
   "compilerOptions": {
     "module": "esnext",
-    "types": ["node"]
+    "types": ["node"],
+    "paths": {
+      "@tanstack/octane-start/client": ["./src/client.ts"],
+      "@tanstack/octane-start/server": ["./src/server.ts"]
+    }
   },
   "include": ["src", "tests", "vite.config.ts", "vite.config.server-entry.ts"]
 }
diff --git a/packages/router-generator/src/generator.ts b/packages/router-generator/src/generator.ts
index dc1ba405..3b357166 100644
--- a/packages/router-generator/src/generator.ts
+++ b/packages/router-generator/src/generator.ts
@@ -121,7 +121,23 @@ const DefaultFileSystem: fs = {
       gid: Number(res.gid),
     }
   },
-  rename: (oldPath, newPath) => fsp.rename(oldPath, newPath),
+  rename: async (oldPath, newPath) => {
+    try {
+      await fsp.rename(oldPath, newPath)
+    } catch (err) {
+      if (
+        typeof err === 'object' &&
+        err !== null &&
+        'code' in err &&
+        (err as NodeJS.ErrnoException).code === 'EXDEV'
+      ) {
+        await fsp.copyFile(oldPath, newPath)
+        await fsp.unlink(oldPath)
+      } else {
+        throw err
+      }
+    }
+  },
   writeFile: (filePath, content) => fsp.writeFile(filePath, content),
   readFile: async (filePath: string) => {
     try {

Apply fix via Nx Cloud  Reject fix via Nx Cloud


Or Apply changes locally with:

npx nx-cloud apply-locally 1osE-9Shl

Apply fix locally with your editor ↗   View interactive diff ↗



🎓 Learn more about Self-Healing CI on nx.dev

@schiller-manuel

Copy link
Copy Markdown
Collaborator

we need to first merge #7830


export const Head: ComponentBody<HeadProps> = (props) => {
const router = useRouter()
const server = isServer ?? router.isServer

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we must always inline isServer ?? router.isServer, otherwise treeshaking wont happen as expected

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants