From 6f34fb73e3821c30ed435fbb6524865a2acba519 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Wed, 20 Aug 2025 19:06:54 -0700 Subject: [PATCH 01/13] chore(tanstack-react-start): Reuse existing auth object from server handler --- .../src/server/getAuth.ts | 23 +++++-------------- .../src/server/middlewareHandler.ts | 12 +++++++++- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/tanstack-react-start/src/server/getAuth.ts b/packages/tanstack-react-start/src/server/getAuth.ts index c7acf0740e1..cca943730fa 100644 --- a/packages/tanstack-react-start/src/server/getAuth.ts +++ b/packages/tanstack-react-start/src/server/getAuth.ts @@ -1,29 +1,18 @@ import type { AuthenticateRequestOptions, GetAuthFn } from '@clerk/backend/internal'; import { getAuthObjectForAcceptedToken } from '@clerk/backend/internal'; +import { getContext } from '@tanstack/react-start/server'; import { errorThrower } from '../utils'; import { noFetchFnCtxPassedInGetAuth } from '../utils/errors'; -import { authenticateRequest } from './authenticateRequest'; -import { loadOptions } from './loadOptions'; -import type { LoaderOptions } from './types'; -type GetAuthOptions = { acceptsToken?: AuthenticateRequestOptions['acceptsToken'] } & Pick; +type GetAuthOptions = { acceptsToken?: AuthenticateRequestOptions['acceptsToken'] }; -export const getAuth: GetAuthFn = (async (request: Request, opts?: GetAuthOptions) => { +export const getAuth: GetAuthFn = ((request: Request, opts?: GetAuthOptions) => { if (!request) { return errorThrower.throw(noFetchFnCtxPassedInGetAuth); } - const { acceptsToken, ...restOptions } = opts || {}; + const authObjectFn = getContext('auth'); - const loadedOptions = loadOptions(request, restOptions); - - const requestState = await authenticateRequest(request, { - ...loadedOptions, - acceptsToken: 'any', - }); - - const authObject = requestState.toAuth(); - - return getAuthObjectForAcceptedToken({ authObject, acceptsToken }); -}) as GetAuthFn; + return getAuthObjectForAcceptedToken({ authObject: authObjectFn(), acceptsToken: opts?.acceptsToken }); +}) as GetAuthFn; diff --git a/packages/tanstack-react-start/src/server/middlewareHandler.ts b/packages/tanstack-react-start/src/server/middlewareHandler.ts index 34076fb912a..dbb4c0c15d6 100644 --- a/packages/tanstack-react-start/src/server/middlewareHandler.ts +++ b/packages/tanstack-react-start/src/server/middlewareHandler.ts @@ -1,5 +1,10 @@ import type { AnyRouter } from '@tanstack/react-router'; -import type { CustomizeStartHandler, HandlerCallback, RequestHandler } from '@tanstack/react-start/server'; +import { + type CustomizeStartHandler, + getEvent, + type HandlerCallback, + type RequestHandler, +} from '@tanstack/react-start/server'; import { authenticateRequest } from './authenticateRequest'; import { ClerkHandshakeRedirect } from './errors'; @@ -13,6 +18,8 @@ export function createClerkHandler( ) { return (cb: HandlerCallback): RequestHandler => { return eventHandler(async ({ request, router, responseHeaders }) => { + const event = getEvent(); + try { const loadedOptions = loadOptions(request, clerkOptions); @@ -21,6 +28,9 @@ export function createClerkHandler( acceptsToken: 'any', }); + // Set context for getAuth to use + event.context.auth = () => requestState.toAuth(); + const { clerkInitialState, headers } = getResponseClerkState(requestState, loadedOptions); // Merging the TanStack router context with the Clerk context and loading the router From 552e3652d422309157b84eab65d4e8de2bb98741 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Wed, 20 Aug 2025 19:13:36 -0700 Subject: [PATCH 02/13] chore: Set minimum tanstack start versions to 1.130.0 --- integration/templates/tanstack-react-router/package.json | 6 +++--- integration/templates/tanstack-react-start/package.json | 6 +++--- .../templates/tanstack-react-start/src/routes/user.tsx | 4 ++-- packages/tanstack-react-start/package.json | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/integration/templates/tanstack-react-router/package.json b/integration/templates/tanstack-react-router/package.json index 7f2707585fd..176b489a8a2 100644 --- a/integration/templates/tanstack-react-router/package.json +++ b/integration/templates/tanstack-react-router/package.json @@ -9,9 +9,9 @@ "start": "vite" }, "dependencies": { - "@tanstack/react-router": "1.128.0", - "@tanstack/react-router-devtools": "1.128.0", - "@tanstack/router-plugin": "1.128.0", + "@tanstack/react-router": "1.131.27", + "@tanstack/react-router-devtools": "1.131.27", + "@tanstack/router-plugin": "1.131.27", "react": "18.3.1", "react-dom": "18.3.1" }, diff --git a/integration/templates/tanstack-react-start/package.json b/integration/templates/tanstack-react-start/package.json index e998fe3edec..cae4bc234ee 100644 --- a/integration/templates/tanstack-react-start/package.json +++ b/integration/templates/tanstack-react-start/package.json @@ -8,9 +8,9 @@ "start": "vite start --port=$PORT" }, "dependencies": { - "@tanstack/react-router": "1.128.0", - "@tanstack/react-router-devtools": "1.128.0", - "@tanstack/react-start": "1.128.0", + "@tanstack/react-router": "1.131.27", + "@tanstack/react-router-devtools": "1.131.27", + "@tanstack/react-start": "1.131.27", "react": "18.3.1", "react-dom": "18.3.1", "tailwind-merge": "^2.5.4" diff --git a/integration/templates/tanstack-react-start/src/routes/user.tsx b/integration/templates/tanstack-react-start/src/routes/user.tsx index 4fd5f6ccf2c..79677cf1e32 100644 --- a/integration/templates/tanstack-react-start/src/routes/user.tsx +++ b/integration/templates/tanstack-react-start/src/routes/user.tsx @@ -3,11 +3,11 @@ import { createServerFn } from '@tanstack/react-start'; import { getAuth } from '@clerk/tanstack-react-start/server'; import { getWebRequest } from '@tanstack/react-start/server'; -const fetchClerkAuth = createServerFn({ method: 'GET' }).handler(async () => { +const fetchClerkAuth = createServerFn({ method: 'GET' }).handler(() => { const request = getWebRequest(); if (!request) throw new Error('No request found'); - const { userId } = await getAuth(request); + const { userId } = getAuth(request); return { userId, diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index 276261eface..18a00cdc70b 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -76,13 +76,13 @@ "tslib": "catalog:repo" }, "devDependencies": { - "@tanstack/react-router": "^1.128.0", - "@tanstack/react-start": "^1.128.0", + "@tanstack/react-router": "^1.131.27", + "@tanstack/react-start": "^1.131.27", "esbuild-plugin-file-path-extensions": "^2.1.4" }, "peerDependencies": { - "@tanstack/react-router": "^1.127.0", - "@tanstack/react-start": "^1.127.0", + "@tanstack/react-router": "^1.130.0", + "@tanstack/react-start": "^1.130.0", "react": "catalog:peer-react", "react-dom": "catalog:peer-react" }, From bac150fa143341afbaa6093c39944ed653402c03 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Wed, 20 Aug 2025 19:16:55 -0700 Subject: [PATCH 03/13] chore: install deps and dedupe --- pnpm-lock.yaml | 222 ++++++++++++++++++++++++++----------------------- 1 file changed, 117 insertions(+), 105 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b0a7f03f76..6867016190d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -982,11 +982,11 @@ importers: version: 2.8.1 devDependencies: '@tanstack/react-router': - specifier: ^1.128.0 - version: 1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.131.27 + version: 1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start': - specifier: ^1.128.0 - version: 1.128.3(@tanstack/react-router@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + specifier: ^1.131.27 + version: 1.131.27(@tanstack/react-router@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) esbuild-plugin-file-path-extensions: specifier: ^2.1.4 version: 2.1.4 @@ -2905,7 +2905,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {'0': node >=0.10.0} + engines: {node: '>=0.10.0'} '@expo/cli@0.22.26': resolution: {integrity: sha512-I689wc8Fn/AX7aUGiwrh3HnssiORMJtR2fpksX+JIe8Cj/EDleblYMSwRPd0025wrwOV9UN1KM/RuEt/QjCS3Q==} @@ -4755,46 +4755,46 @@ packages: '@swc/types@0.1.23': resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} - '@tanstack/directive-functions-plugin@1.124.1': - resolution: {integrity: sha512-eZdsPCZz+7VIKiXAF5dNdLJBerAo4t79w/OQTWaKuqPLX1E9GQOKHsmTZChWeQbxPx+y+cOV3/0U/yKxtHsm0Q==} + '@tanstack/directive-functions-plugin@1.131.2': + resolution: {integrity: sha512-5Pz6aVPS0BW+0bLvMzWsoajfjI6ZeWqkbVBaQfIbSTm4DOBO05JuQ/pb7W7m3GbCb5TK1a/SKDhuTX6Ag5I7UQ==} engines: {node: '>=12'} peerDependencies: vite: '>=6.0.0' - '@tanstack/history@1.121.34': - resolution: {integrity: sha512-YL8dGi5ZU+xvtav2boRlw4zrRghkY6hvdcmHhA0RGSJ/CBgzv+cbADW9eYJLx74XMZvIQ1pp6VMbrpXnnM5gHA==} + '@tanstack/history@1.131.2': + resolution: {integrity: sha512-cs1WKawpXIe+vSTeiZUuSBy8JFjEuDgdMKZFRLKwQysKo8y2q6Q1HvS74Yw+m5IhOW1nTZooa6rlgdfXcgFAaw==} engines: {node: '>=12'} - '@tanstack/react-router@1.128.3': - resolution: {integrity: sha512-vOb5KVlyi4KLho4ZVN1ju8YxdJe5IKKNoqwHHN1XCUYKKyQhWVrHU4IBnQDCrrAKRH8o1K/WGaRUvN/1eeQ5dQ==} + '@tanstack/react-router@1.131.27': + resolution: {integrity: sha512-JLUsmlarNxMz7VDhFscZCqoc2quhocQZKhia/7YXWf8Jbc8rANk6lukK4ecYn92m/ytoHAAy77JeaB6n0HvqwQ==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.128.3': - resolution: {integrity: sha512-xFVDm95SCQ9R6qjLJaHrnnZUuciakp96EQCpO9asSiomvmKcDAELyP0T7J40vY+96/sS+q8l1bw0F6MSXE2SVw==} + '@tanstack/react-start-client@1.131.27': + resolution: {integrity: sha512-XPGTW1YttgNbD7jxCWdhs/zzim1SF7yBLLxTRddEO+4o5kR2s7WtcuCnrMry8wZYzKm4Wk+1pxJj297u0WwTWw==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-plugin@1.128.3': - resolution: {integrity: sha512-IsRfANTXqgIlG1kWr6wRdDrTeIk2VDHKMmpM25WGrbPxPPeFfz7r+7HSQ/SRiXLckyOAlXwJBg06CN/fBXKd7Q==} + '@tanstack/react-start-plugin@1.131.27': + resolution: {integrity: sha512-LKhcUQDZ1Y81OG53doiPW0DMJIPWlw1CqqAjjHFERRcvJ7lyCGcgujdYygxAwJy3BLU+T6T+TsAbs90RcFIxCw==} engines: {node: '>=12'} peerDependencies: '@vitejs/plugin-react': '>=4.3.4' vite: '>=6.0.0' - '@tanstack/react-start-server@1.128.3': - resolution: {integrity: sha512-2Hgy8UUxIP2YkR4ZuKvUlih1u9QSRomKgOA4Q+I0TjHOdtpedin3f2xCB0Xc7SBivFWEBPAO9Q4HcijTZ0T0/w==} + '@tanstack/react-start-server@1.131.27': + resolution: {integrity: sha512-4HEgkM8dnSYXBZyTYXTpPTX49fm0sJoVq68WhAccd9w3azh+FF1l0QxKMCadu39nVh5LSZPIJ2Fkatktwq7Gig==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.128.3': - resolution: {integrity: sha512-EwDvMH3vcCSN/mDSu+gA+wUONwfDcAbO2QXD2vb5Pm1/ezBS84c9VK/VD9OvEnPNxGfpEVZTqFAcavAev69GRQ==} + '@tanstack/react-start@1.131.27': + resolution: {integrity: sha512-pc1PXvu9hmZoQHXlzbOLJsrZVTe+qeVmd+wbYcbwsqCwjLBKPvWvj9nl5NmjG+3uKS3lDd5KMMkO/ik5w3OVfQ==} engines: {node: '>=12'} peerDependencies: '@vitejs/plugin-react': '>=4.3.4' @@ -4808,20 +4808,20 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.128.3': - resolution: {integrity: sha512-/CiGzGeBrR91+JgiKdAYskY9W1ZINVey1uqEZLvmJEKjemmOaNN4KI+9mGa43/yJ3ED/Q937hFjo39UAj4EBPQ==} + '@tanstack/router-core@1.131.27': + resolution: {integrity: sha512-NEBNxZ/LIBIh6kvQntr6bKq57tDe55zecyTtjAmzPkYFsMy1LXEpRm5H3BPiteBMRApAjuaq+bS1qA664hLH6Q==} engines: {node: '>=12'} - '@tanstack/router-generator@1.128.3': - resolution: {integrity: sha512-vV5aVzA/fC23fOVoJlD7vKr52Nc+FK7TkKRUq7OeiY8B0kAmFM3c/PzhhObxIP5B+Fp6K01vkBTpvtQYBRoadQ==} + '@tanstack/router-generator@1.131.27': + resolution: {integrity: sha512-PXBIVl45q2bBq9g0DDXLBGeKjO9eExcZd2JotLjLdIJ0I/wdxPQOBJHLPZfnmbf3vispToedRvG3b1YDWjL48g==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.128.3': - resolution: {integrity: sha512-oFn3yDSe5SCuY2ZZ0yFYVzcLWNSB14gB35YAPFCZdWTmBWQOaB1ICPR8xGdR9sUHRx0rABG5JBR+1kjOOMf3YQ==} + '@tanstack/router-plugin@1.131.27': + resolution: {integrity: sha512-0V611ehOE8nfCFT2tvrLfQMroyoYW/virDXPaaFe38hdDxslmfCW2miJxngxz4+QqgK/M3sX71ElrZDvkP2Ixw==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.128.3 + '@tanstack/react-router': ^1.131.27 vite: '>=5.0.0 || >=6.0.0' vite-plugin-solid: ^2.11.2 webpack: '>=5.92.0' @@ -4837,45 +4837,49 @@ packages: webpack: optional: true - '@tanstack/router-utils@1.121.21': - resolution: {integrity: sha512-u7ubq1xPBtNiU7Fm+EOWlVWdgFLzuKOa1thhqdscVn8R4dNMUd1VoOjZ6AKmLw201VaUhFtlX+u0pjzI6szX7A==} + '@tanstack/router-utils@1.131.2': + resolution: {integrity: sha512-sr3x0d2sx9YIJoVth0QnfEcAcl+39sQYaNQxThtHmRpyeFYNyM2TTH+Ud3TNEnI3bbzmLYEUD+7YqB987GzhDA==} engines: {node: '>=12'} - '@tanstack/server-functions-plugin@1.124.1': - resolution: {integrity: sha512-9GIu+PXu5itj+Q74FJQpd4WV3FikzkAAxvBl9hrnmiEwz+AGDZL0GOiGy++MdupHJXuHXXss9mHqKtNmw9wMdw==} + '@tanstack/server-functions-plugin@1.131.2': + resolution: {integrity: sha512-hWsaSgEZAVyzHg8+IcJWCEtfI9ZSlNELErfLiGHG9XCHEXMegFWsrESsKHlASzJqef9RsuOLDl+1IMPIskwdDw==} engines: {node: '>=12'} - '@tanstack/start-client-core@1.128.3': - resolution: {integrity: sha512-hX5iPIyINId7g5wlii4x95lEzmFHRNkaAAWER/uF+WWRAtMTn/ASEpYxyqyZh7KSwNLwea+RTWHzfOmgmPfy5Q==} + '@tanstack/start-client-core@1.131.27': + resolution: {integrity: sha512-mS3nYiBbwtHIqrxP3ba9+17+4iAcAlgIPdr/ucyblU7y6QUbDA3JRZkF+1vXYy8A/t+h/QeA4SkxvmjjPPwEpw==} engines: {node: '>=12'} - '@tanstack/start-plugin-core@1.128.3': - resolution: {integrity: sha512-k4XD2zvMb3epbxNsKL2ojd7YoweHRWrY03BIWPzbmUfYvgyAiq36vmqszMxdEXL9Yq2dG9hMmfGJ1G3hjJIzQw==} + '@tanstack/start-plugin-core@1.131.27': + resolution: {integrity: sha512-b3tXyXPIJtX8nw5tNjMx7yb1XrGUOH+LmnZvckbcWqg2G0NCnYxdU3J+PknjSYjt/Pbvy3MwKldrFOr6mqUtQQ==} engines: {node: '>=12'} peerDependencies: vite: '>=6.0.0' - '@tanstack/start-server-core@1.128.3': - resolution: {integrity: sha512-IYjHm5hkB+TdwrAD20suuiLiPXJtl1K6KLubTkE8H2B4yltHz9cy3Wh28xScU2QSQOQFC046oXnhUJUfuNzpeg==} + '@tanstack/start-server-core@1.131.27': + resolution: {integrity: sha512-ImPru1ozUSywM8X4c7iEcZmHUEEdGgRSBnv1glCk6rJpIEwmTJ6htOzgm7b2ukCKFBs8ULoWSvMfDaRug4/rlA==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-client@1.131.27': + resolution: {integrity: sha512-PSPW/k7uuIR8Hf8Y2ONzcH1In9udLMjcdlfL3cb+LFMchjO0z4zA7FoLo1Y3G0xOu26yyGRbZo/w1SYlIuf1QA==} engines: {node: '>=12'} - '@tanstack/start-server-functions-client@1.128.3': - resolution: {integrity: sha512-GLhPzJjn0ZdkI9kTaLyQm9O7zGBu3yeOydpqUHnnGBjkUSCVp99Z3pW0Oq2m6FyS9G98fzN0dTjha3gUC3ALcg==} + '@tanstack/start-server-functions-fetcher@1.131.27': + resolution: {integrity: sha512-hp9pdTBdyRyAB3c3vWOMSmP5D6bCBBf+IFl509dcCSlUyQ12AyHfO1bmCW2nssXHf3XQuXWq7s44O9I1mXmLRQ==} engines: {node: '>=12'} - '@tanstack/start-server-functions-fetcher@1.128.3': - resolution: {integrity: sha512-18aFsMt7CVGx3/5Dn2s31b6Tn0A4wYWtWmAEkwMBHNU8hbwl0dbWYtitOxZkU7+0oBjBIgzi75qabEZbbc5gBw==} + '@tanstack/start-server-functions-server@1.131.2': + resolution: {integrity: sha512-u67d6XspczlC/dYki/Id28oWsTjkZMJhDqO4E23U3rHs8eYgxvMBHKqdeqWgOyC+QWT9k6ze1pJmbv+rmc3wOQ==} engines: {node: '>=12'} - '@tanstack/start-server-functions-server@1.127.4': - resolution: {integrity: sha512-e0KzPtot+Hedp243+Shly6tzgxRIBhVQG6u1IMYCsvLyLF5Z6mPzL/6BV9MUp6XiYUPpyMv3nYiM2BjLfAbagg==} + '@tanstack/start-storage-context@1.131.27': + resolution: {integrity: sha512-SqheDZDBFeasl/1AtBWI6MCygi9+t5rnDeXPmWKvxaXQmbc3zjvDSgYZIxbUInFswcTHRq6V3NvntTBQh9JZ4Q==} engines: {node: '>=12'} '@tanstack/store@0.7.0': resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==} - '@tanstack/virtual-file-routes@1.121.21': - resolution: {integrity: sha512-3nuYsTyaq6ZN7jRZ9z6Gj3GXZqBOqOT0yzd/WZ33ZFfv4yVNIvsa5Lw+M1j3sgyEAxKMqGu/FaNi7FCjr3yOdw==} + '@tanstack/virtual-file-routes@1.131.2': + resolution: {integrity: sha512-VEEOxc4mvyu67O+Bl0APtYjwcNRcL9it9B4HKbNgcBTIOEalhk+ufBl4kiqc8WP1sx1+NAaiS+3CcJBhrqaSRg==} engines: {node: '>=12'} '@testing-library/dom@10.1.0': @@ -19540,47 +19544,48 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tanstack/directive-functions-plugin@1.124.1(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': + '@tanstack/directive-functions-plugin@1.131.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.0 '@babel/traverse': 7.28.0 '@babel/types': 7.28.1 - '@tanstack/router-utils': 1.121.21 + '@tanstack/router-utils': 1.131.2 babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@tanstack/history@1.121.34': {} + '@tanstack/history@1.131.2': {} - '@tanstack/react-router@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-router@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/history': 1.121.34 + '@tanstack/history': 1.131.2 '@tanstack/react-store': 0.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-core': 1.128.3 + '@tanstack/router-core': 1.131.27 isbot: 5.1.23 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-start-client@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-router': 1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-core': 1.128.3 - '@tanstack/start-client-core': 1.128.3 + '@tanstack/react-router': 1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-core': 1.131.27 + '@tanstack/start-client-core': 1.131.27 cookie-es: 1.2.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-plugin@1.128.3(@tanstack/react-router@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@tanstack/react-start-plugin@1.131.27(@tanstack/react-router@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: - '@tanstack/start-plugin-core': 1.128.3(@tanstack/react-router@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@tanstack/start-plugin-core': 1.131.27(@tanstack/react-router@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@vitejs/plugin-react': 4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + pathe: 2.0.3 vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) zod: 3.24.2 transitivePeerDependencies: @@ -19615,25 +19620,25 @@ snapshots: - webpack - xml2js - '@tanstack/react-start-server@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-start-server@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/history': 1.121.34 - '@tanstack/react-router': 1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-core': 1.128.3 - '@tanstack/start-client-core': 1.128.3 - '@tanstack/start-server-core': 1.128.3 + '@tanstack/history': 1.131.2 + '@tanstack/react-router': 1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-core': 1.131.27 + '@tanstack/start-client-core': 1.131.27 + '@tanstack/start-server-core': 1.131.27 h3: 1.13.0 isbot: 5.1.23 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/react-start@1.128.3(@tanstack/react-router@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@tanstack/react-start@1.131.27(@tanstack/react-router@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: - '@tanstack/react-start-client': 1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-start-plugin': 1.128.3(@tanstack/react-router@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@tanstack/react-start-server': 1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/start-server-functions-client': 1.128.3(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) - '@tanstack/start-server-functions-server': 1.127.4(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + '@tanstack/react-start-client': 1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-start-plugin': 1.131.27(@tanstack/react-router@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@tanstack/react-start-server': 1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/start-server-functions-client': 1.131.27(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + '@tanstack/start-server-functions-server': 1.131.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) '@vitejs/plugin-react': 4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19677,9 +19682,9 @@ snapshots: react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.5.0(react@18.3.1) - '@tanstack/router-core@1.128.3': + '@tanstack/router-core@1.131.27': dependencies: - '@tanstack/history': 1.121.34 + '@tanstack/history': 1.131.2 '@tanstack/store': 0.7.0 cookie-es: 1.2.2 seroval: 1.3.2 @@ -19687,11 +19692,11 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-generator@1.128.3': + '@tanstack/router-generator@1.131.27': dependencies: - '@tanstack/router-core': 1.128.3 - '@tanstack/router-utils': 1.121.21 - '@tanstack/virtual-file-routes': 1.121.21 + '@tanstack/router-core': 1.131.27 + '@tanstack/router-utils': 1.131.2 + '@tanstack/virtual-file-routes': 1.131.2 prettier: 3.5.3 recast: 0.23.11 source-map: 0.7.4 @@ -19700,7 +19705,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.128.3(@tanstack/react-router@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@tanstack/router-plugin@1.131.27(@tanstack/react-router@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) @@ -19708,22 +19713,22 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 '@babel/types': 7.28.1 - '@tanstack/router-core': 1.128.3 - '@tanstack/router-generator': 1.128.3 - '@tanstack/router-utils': 1.121.21 - '@tanstack/virtual-file-routes': 1.121.21 + '@tanstack/router-core': 1.131.27 + '@tanstack/router-generator': 1.131.27 + '@tanstack/router-utils': 1.131.2 + '@tanstack/virtual-file-routes': 1.131.2 babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.5 zod: 3.24.2 optionalDependencies: - '@tanstack/react-router': 1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': 1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.121.21': + '@tanstack/router-utils@1.131.2': dependencies: '@babel/core': 7.28.0 '@babel/generator': 7.28.0 @@ -19734,7 +19739,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.124.1(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': + '@tanstack/server-functions-plugin@1.131.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.0 @@ -19743,31 +19748,32 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 '@babel/types': 7.28.1 - '@tanstack/directive-functions-plugin': 1.124.1(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + '@tanstack/directive-functions-plugin': 1.131.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@tanstack/start-client-core@1.128.3': + '@tanstack/start-client-core@1.131.27': dependencies: - '@tanstack/router-core': 1.128.3 + '@tanstack/router-core': 1.131.27 + '@tanstack/start-storage-context': 1.131.27 cookie-es: 1.2.2 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.128.3(@tanstack/react-router@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@tanstack/start-plugin-core@1.131.27(@tanstack/react-router@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.0 '@babel/types': 7.28.1 - '@tanstack/router-core': 1.128.3 - '@tanstack/router-generator': 1.128.3 - '@tanstack/router-plugin': 1.128.3(@tanstack/react-router@1.128.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@tanstack/router-utils': 1.121.21 - '@tanstack/server-functions-plugin': 1.124.1(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) - '@tanstack/start-server-core': 1.128.3 + '@tanstack/router-core': 1.131.27 + '@tanstack/router-generator': 1.131.27 + '@tanstack/router-plugin': 1.131.27(@tanstack/react-router@1.131.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@tanstack/router-utils': 1.131.2 + '@tanstack/server-functions-plugin': 1.131.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + '@tanstack/start-server-core': 1.131.27 '@types/babel__code-frame': 7.0.6 '@types/babel__core': 7.20.5 babel-dead-code-elimination: 1.0.10 @@ -19777,6 +19783,7 @@ snapshots: pathe: 2.0.3 ufo: 1.6.1 vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) + vitefu: 1.1.1(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) xmlbuilder2: 3.1.1 zod: 3.24.2 transitivePeerDependencies: @@ -19811,41 +19818,46 @@ snapshots: - webpack - xml2js - '@tanstack/start-server-core@1.128.3': + '@tanstack/start-server-core@1.131.27': dependencies: - '@tanstack/history': 1.121.34 - '@tanstack/router-core': 1.128.3 - '@tanstack/start-client-core': 1.128.3 + '@tanstack/history': 1.131.2 + '@tanstack/router-core': 1.131.27 + '@tanstack/start-client-core': 1.131.27 + '@tanstack/start-storage-context': 1.131.27 h3: 1.13.0 isbot: 5.1.23 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 unctx: 2.4.1 - '@tanstack/start-server-functions-client@1.128.3(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': + '@tanstack/start-server-functions-client@1.131.27(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': dependencies: - '@tanstack/server-functions-plugin': 1.124.1(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) - '@tanstack/start-server-functions-fetcher': 1.128.3 + '@tanstack/server-functions-plugin': 1.131.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + '@tanstack/start-server-functions-fetcher': 1.131.27 transitivePeerDependencies: - supports-color - vite - '@tanstack/start-server-functions-fetcher@1.128.3': + '@tanstack/start-server-functions-fetcher@1.131.27': dependencies: - '@tanstack/router-core': 1.128.3 - '@tanstack/start-client-core': 1.128.3 + '@tanstack/router-core': 1.131.27 + '@tanstack/start-client-core': 1.131.27 - '@tanstack/start-server-functions-server@1.127.4(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': + '@tanstack/start-server-functions-server@1.131.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': dependencies: - '@tanstack/server-functions-plugin': 1.124.1(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + '@tanstack/server-functions-plugin': 1.131.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite + '@tanstack/start-storage-context@1.131.27': + dependencies: + '@tanstack/router-core': 1.131.27 + '@tanstack/store@0.7.0': {} - '@tanstack/virtual-file-routes@1.121.21': {} + '@tanstack/virtual-file-routes@1.131.2': {} '@testing-library/dom@10.1.0': dependencies: From c715e08afbe1634324daa982caa1ad4c16007c51 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Wed, 20 Aug 2025 19:19:48 -0700 Subject: [PATCH 04/13] chore: install deps and dedupe --- packages/tanstack-react-start/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index 18a00cdc70b..56649f7427f 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -81,8 +81,8 @@ "esbuild-plugin-file-path-extensions": "^2.1.4" }, "peerDependencies": { - "@tanstack/react-router": "^1.130.0", - "@tanstack/react-start": "^1.130.0", + "@tanstack/react-router": "^1.131.0", + "@tanstack/react-start": "^1.131.0", "react": "catalog:peer-react", "react-dom": "catalog:peer-react" }, From a4ee4b1917e13a27c93fb996d9146c660b4945e8 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Thu, 21 Aug 2025 00:24:17 -0700 Subject: [PATCH 05/13] chore: make sure auth object is set immediately --- .../src/server/authenticateRequest.ts | 28 +------ .../src/server/middlewareHandler.ts | 73 +++++++++++-------- 2 files changed, 43 insertions(+), 58 deletions(-) diff --git a/packages/tanstack-react-start/src/server/authenticateRequest.ts b/packages/tanstack-react-start/src/server/authenticateRequest.ts index c364dee74eb..8cbdbb994a3 100644 --- a/packages/tanstack-react-start/src/server/authenticateRequest.ts +++ b/packages/tanstack-react-start/src/server/authenticateRequest.ts @@ -1,16 +1,9 @@ import { createClerkClient } from '@clerk/backend'; -import type { AuthenticatedState, AuthenticateRequestOptions, UnauthenticatedState } from '@clerk/backend/internal'; -import { AuthStatus, constants } from '@clerk/backend/internal'; -import { handleNetlifyCacheInDevInstance } from '@clerk/shared/netlifyCacheHandler'; +import type { AuthenticateRequestOptions, RequestState } from '@clerk/backend/internal'; -import { errorThrower } from '../utils'; -import { ClerkHandshakeRedirect } from './errors'; import { patchRequest } from './utils'; -export async function authenticateRequest( - request: Request, - opts: AuthenticateRequestOptions, -): Promise { +export async function authenticateRequest(request: Request, opts: AuthenticateRequestOptions): Promise { const { audience, authorizedParties } = opts; const { apiUrl, secretKey, jwtKey, proxyUrl, isSatellite, domain, publishableKey, acceptsToken, machineSecretKey } = @@ -37,22 +30,5 @@ export async function authenticateRequest( acceptsToken, }); - const locationHeader = requestState.headers.get(constants.Headers.Location); - if (locationHeader) { - handleNetlifyCacheInDevInstance({ - locationHeader, - requestStateHeaders: requestState.headers, - publishableKey: requestState.publishableKey, - }); - - // triggering a handshake redirect - throw new ClerkHandshakeRedirect(307, requestState.headers); - } - - if (requestState.status === AuthStatus.Handshake) { - // eslint-disable-next-line @typescript-eslint/only-throw-error - throw errorThrower.throw('Clerk: unexpected handshake without redirect'); - } - return requestState; } diff --git a/packages/tanstack-react-start/src/server/middlewareHandler.ts b/packages/tanstack-react-start/src/server/middlewareHandler.ts index dbb4c0c15d6..83e047b5336 100644 --- a/packages/tanstack-react-start/src/server/middlewareHandler.ts +++ b/packages/tanstack-react-start/src/server/middlewareHandler.ts @@ -1,13 +1,16 @@ +import { AuthStatus, constants } from '@clerk/backend/internal'; +import { handleNetlifyCacheInDevInstance } from '@clerk/shared/netlifyCacheHandler'; import type { AnyRouter } from '@tanstack/react-router'; import { type CustomizeStartHandler, getEvent, + getWebRequest, type HandlerCallback, type RequestHandler, } from '@tanstack/react-start/server'; +import { errorThrower } from '../utils'; import { authenticateRequest } from './authenticateRequest'; -import { ClerkHandshakeRedirect } from './errors'; import { loadOptions } from './loadOptions'; import type { LoaderOptions } from './types'; import { getResponseClerkState } from './utils'; @@ -16,46 +19,52 @@ export function createClerkHandler( eventHandler: CustomizeStartHandler, clerkOptions: LoaderOptions = {}, ) { - return (cb: HandlerCallback): RequestHandler => { - return eventHandler(async ({ request, router, responseHeaders }) => { - const event = getEvent(); - - try { - const loadedOptions = loadOptions(request, clerkOptions); - - const requestState = await authenticateRequest(request, { - ...loadedOptions, - acceptsToken: 'any', - }); + return async (cb: HandlerCallback): Promise => { + const request = getWebRequest(); + const event = getEvent(); + const loadedOptions = loadOptions(request, clerkOptions); - // Set context for getAuth to use - event.context.auth = () => requestState.toAuth(); + const requestState = await authenticateRequest(request, { + ...loadedOptions, + acceptsToken: 'any', + }); - const { clerkInitialState, headers } = getResponseClerkState(requestState, loadedOptions); + // Set auth object here so it is available immediately in server functions via getAuth() + event.context.auth = () => requestState.toAuth(); - // Merging the TanStack router context with the Clerk context and loading the router - router.update({ - context: { ...router.options.context, clerkInitialState }, + return eventHandler(async ({ request, router, responseHeaders }) => { + const locationHeader = requestState.headers.get(constants.Headers.Location); + if (locationHeader) { + handleNetlifyCacheInDevInstance({ + locationHeader, + requestStateHeaders: requestState.headers, + publishableKey: requestState.publishableKey, }); - headers.forEach((value, key) => { - responseHeaders.set(key, value); + return new Response(null, { + status: 307, + headers: requestState.headers, }); + } - await router.load(); - } catch (error) { - if (error instanceof ClerkHandshakeRedirect) { - // returning the response - return new Response(null, { - status: error.status, - headers: error.headers, - }); - } - - // rethrowing the error if it is not a Response - throw error; + if (requestState.status === AuthStatus.Handshake) { + // eslint-disable-next-line @typescript-eslint/only-throw-error + throw errorThrower.throw('Clerk: unexpected handshake without redirect'); } + const { clerkInitialState, headers } = getResponseClerkState(requestState, loadedOptions); + + // Merging the TanStack router context with the Clerk context and loading the router + router.update({ + context: { ...router.options.context, clerkInitialState }, + }); + + headers.forEach((value, key) => { + responseHeaders.set(key, value); + }); + + await router.load(); + return cb({ request, router, responseHeaders }); }); }; From 580e2a5a41d87528b895f126de49cb488043986d Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Thu, 21 Aug 2025 00:25:32 -0700 Subject: [PATCH 06/13] fix tests --- .../tanstack-react-start/src/server.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/integration/templates/tanstack-react-start/src/server.tsx b/integration/templates/tanstack-react-start/src/server.tsx index cf2721ae11c..825da1120a6 100644 --- a/integration/templates/tanstack-react-start/src/server.tsx +++ b/integration/templates/tanstack-react-start/src/server.tsx @@ -1,9 +1,13 @@ -import { createStartHandler, defaultStreamHandler } from '@tanstack/react-start/server'; +import { createStartHandler, defineHandlerCallback, defaultStreamHandler } from '@tanstack/react-start/server'; import { createRouter } from './router'; import { createClerkHandler } from '@clerk/tanstack-react-start/server'; -export default createClerkHandler( - createStartHandler({ - createRouter, - }), -)(defaultStreamHandler); +export default defineHandlerCallback(async event => { + const startHandler = await createClerkHandler( + createStartHandler({ + createRouter, + }), + )(defaultStreamHandler); + + return startHandler(event); +}); From 4d62749e78a6d4d0b197a45f7999588581d074c7 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Thu, 21 Aug 2025 08:36:39 -0700 Subject: [PATCH 07/13] chore: update readme and errors --- packages/tanstack-react-start/README.md | 117 +----------------- .../src/server/getAuth.ts | 6 +- .../tanstack-react-start/src/utils/errors.ts | 11 +- 3 files changed, 15 insertions(+), 119 deletions(-) diff --git a/packages/tanstack-react-start/README.md b/packages/tanstack-react-start/README.md index 8c34f3c7d40..70c8a5cacbc 100644 --- a/packages/tanstack-react-start/README.md +++ b/packages/tanstack-react-start/README.md @@ -41,122 +41,13 @@ ### Installation -```sh -npm install @clerk/tanstack-react-start -``` +The fastest way to get started with Clerk is by following the [TanStack React Start Quickstart](https://clerk.com/docs/quickstarts/tanstack-react-start?utm_source=github&utm_medium=clerk_tanstack_react_start). + +You'll learn how to install `@clerk/tanstack-react-start`, set up your environment keys, configure `createClerkHandler` and protect your pages. ## Usage -Make sure the following environment variables are set in a `.env` file: - -```sh -CLERK_PUBLISHABLE_KEY=pk_test_xxx -CLERK_SECRET_KEY=sk_test_xxx -``` - -You can get these from the [API Keys](https://dashboard.clerk.com/last-active?path=api-keys) screen in your Clerk dashboard. - -To initialize Clerk with your TanStack Start application, you will need to make one modification to `app/routes/_root.tsx`. Wrap the children of the `RootComponent` with `` - -```tsx -import { ClerkProvider } from '@clerk/tanstack-react-start' -import { createRootRoute } from '@tanstack/react-router' -import { Link, Outlet } from '@tanstack/react-router' -import { TanStackRouterDevtools } from '@tanstack/router-devtools' -import { Body, Head, Html, Meta, Scripts } from '@tanstack/start' -import * as React from 'react' -import { DefaultCatchBoundary } from '~/components/DefaultCatchBoundary' -import { NotFound } from '~/components/NotFound' - -export const Route = createRootRoute({ - meta: () => [ - { - charSet: 'utf-8', - }, - { - name: 'viewport', - content: 'width=device-width, initial-scale=1', - }, - ], - errorComponent: (props) => { - return ( - - - - ) - }, - notFoundComponent: () => , - component: RootComponent, -}) - -function RootComponent() { - return ( - - - - - - ) -} - -function RootDocument({ children }: { children: React.ReactNode }) { ... } -``` - -### Setup `clerkHandler` in the SSR entrypoint - -You will also need to make on more modification to you SSR entrypoint (default: `app/ssr.tsx`): - -- Wrap the `createStartHandler` with `createClerkHandler` - -```tsx -import { createStartHandler, defaultStreamHandler } from '@tanstack/start/server'; -import { getRouterManifest } from '@tanstack/start/router-manifest'; -import { createRouter } from './router'; -import { createClerkHandler } from '@clerk/tanstack-react-start/server'; - -const handler = createStartHandler({ - createRouter, - getRouterManifest, -}); - -const clerkHandler = createClerkHandler(handler); - -/* - * // You can also override Clerk options by passing an object as second argument - * const clerkHandler = createClerkHandler(handler, { - * afterSignInUrl: '/dashboard', - * }); - */ - -export default clerkHandler(defaultStreamHandler); -``` - -After those changes are made, you can use Clerk components in your routes. - -For example, in `app/routes/index.tsx`: - -```tsx -import { SignIn, SignedIn, SignedOut, UserButton } from '@clerk/tanstack-react-start'; -import { createFileRoute } from '@tanstack/react-router'; - -export const Route = createFileRoute('/')({ - component: Home, -}); - -function Home() { - return ( -
-

Hello Clerk!

- - - - - - -
- ); -} -``` +For further information, guides, and examples visit the [TanStack React Start reference documentation](https://clerk.com/docs/references/tanstack-react-start/overview?utm_source=github&utm_medium=clerk_tanstack_react_start). ## Support diff --git a/packages/tanstack-react-start/src/server/getAuth.ts b/packages/tanstack-react-start/src/server/getAuth.ts index cca943730fa..e0a8110e1ba 100644 --- a/packages/tanstack-react-start/src/server/getAuth.ts +++ b/packages/tanstack-react-start/src/server/getAuth.ts @@ -3,7 +3,7 @@ import { getAuthObjectForAcceptedToken } from '@clerk/backend/internal'; import { getContext } from '@tanstack/react-start/server'; import { errorThrower } from '../utils'; -import { noFetchFnCtxPassedInGetAuth } from '../utils/errors'; +import { clerkHandlerNotConfigured, noFetchFnCtxPassedInGetAuth } from '../utils/errors'; type GetAuthOptions = { acceptsToken?: AuthenticateRequestOptions['acceptsToken'] }; @@ -14,5 +14,9 @@ export const getAuth: GetAuthFn = ((request: Request, opts?: GetAuthOpt const authObjectFn = getContext('auth'); + if (!authObjectFn) { + return errorThrower.throw(clerkHandlerNotConfigured); + } + return getAuthObjectForAcceptedToken({ authObject: authObjectFn(), acceptsToken: opts?.acceptsToken }); }) as GetAuthFn; diff --git a/packages/tanstack-react-start/src/utils/errors.ts b/packages/tanstack-react-start/src/utils/errors.ts index 4b71ba3e9d1..95a15968a76 100644 --- a/packages/tanstack-react-start/src/utils/errors.ts +++ b/packages/tanstack-react-start/src/utils/errors.ts @@ -8,11 +8,12 @@ or come say hi in our discord server: https://clerk.com/discord }; export const noFetchFnCtxPassedInGetAuth = createErrorMessage(` - You're calling 'getAuth()' from a server function, without providing the ctx object. + You're calling 'getAuth()' from a server function, without providing the request object. Example: - export const someServerFunction = createServerFn('GET', async (_payload, ctx) => { - const auth = getAuth(ctx); + export const someServerFunction = createServerFn({ method: 'GET' }).handler(async () => { + const request = getWebRequest() + const auth = getAuth(request); ... }); `); @@ -20,7 +21,7 @@ export const noFetchFnCtxPassedInGetAuth = createErrorMessage(` export const clerkHandlerNotConfigured = createErrorMessage(` It looks like you're trying to use Clerk without configuring the Clerk handler. -To fix this, make sure you have the \`clerkHandler()\` configure in you SSR entry file (example: app/ssr.tsx). +To fix this, make sure you have the \`createClerkHandler()\` configured in you SSR entry file (example: src/server.ts). -For more info, check out the docs: https://github.com/clerk/javascript/tree/main/packages/tanstack-react-start#setup-clerkhandler-in-the-ssr-entrypoint, +For more info, check out the docs: https://clerk.com/docs/references/tanstack-react-start/create-clerk-handler, `); From 9af56de43a94f990946c9e504bfedc98aebce192 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Thu, 21 Aug 2025 08:45:39 -0700 Subject: [PATCH 08/13] chore: update error message for server handler --- packages/tanstack-react-start/src/utils/errors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tanstack-react-start/src/utils/errors.ts b/packages/tanstack-react-start/src/utils/errors.ts index 95a15968a76..30f2da1f814 100644 --- a/packages/tanstack-react-start/src/utils/errors.ts +++ b/packages/tanstack-react-start/src/utils/errors.ts @@ -21,7 +21,7 @@ export const noFetchFnCtxPassedInGetAuth = createErrorMessage(` export const clerkHandlerNotConfigured = createErrorMessage(` It looks like you're trying to use Clerk without configuring the Clerk handler. -To fix this, make sure you have the \`createClerkHandler()\` configured in you SSR entry file (example: src/server.ts). +To fix this, make sure you have the \`createClerkHandler()\` configured in you custom server handler file (example: src/server.ts). For more info, check out the docs: https://clerk.com/docs/references/tanstack-react-start/create-clerk-handler, `); From c2faffedecb93f24f9253d582d2c5297bf316435 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Thu, 21 Aug 2025 08:48:47 -0700 Subject: [PATCH 09/13] chore: update test example --- .../templates/tanstack-react-start/src/server.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/integration/templates/tanstack-react-start/src/server.tsx b/integration/templates/tanstack-react-start/src/server.tsx index 825da1120a6..1f4daa692e3 100644 --- a/integration/templates/tanstack-react-start/src/server.tsx +++ b/integration/templates/tanstack-react-start/src/server.tsx @@ -2,12 +2,13 @@ import { createStartHandler, defineHandlerCallback, defaultStreamHandler } from import { createRouter } from './router'; import { createClerkHandler } from '@clerk/tanstack-react-start/server'; -export default defineHandlerCallback(async event => { - const startHandler = await createClerkHandler( - createStartHandler({ - createRouter, - }), - )(defaultStreamHandler); +const handlerFactory = createClerkHandler( + createStartHandler({ + createRouter, + }), +); +export default defineHandlerCallback(async event => { + const startHandler = await handlerFactory(defaultStreamHandler); return startHandler(event); }); From 6dd884f231f2faffc71cdf538524d778434bd841 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Thu, 21 Aug 2025 09:20:06 -0700 Subject: [PATCH 10/13] chore: add changeset --- .changeset/itchy-zoos-shake.md | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .changeset/itchy-zoos-shake.md diff --git a/.changeset/itchy-zoos-shake.md b/.changeset/itchy-zoos-shake.md new file mode 100644 index 00000000000..373e4f1c1c7 --- /dev/null +++ b/.changeset/itchy-zoos-shake.md @@ -0,0 +1,39 @@ +--- +"@clerk/tanstack-react-start": minor +--- + +Reuses existing `Auth` object from the server handler + +The `createClerkHandler` helper now returns a Promise and requires awaiting during setup to ensure authentication context is available at the earliest possible point in the request lifecycle, before any router loaders or server functions execute + +```ts +// server.ts +import { createStartHandler, defineHandlerCallback, defaultStreamHandler } from '@tanstack/react-start/server'; +import { createRouter } from './router'; +import { createClerkHandler } from '@clerk/tanstack-react-start/server'; + +const handlerFactory = createClerkHandler( + createStartHandler({ + createRouter, + }), +); + +export default defineHandlerCallback(async event => { + const startHandler = await handlerFactory(defaultStreamHandler); // awaited + return startHandler(event); +}); +``` + +`getAuth()` is now sync and no longer requires awaiting + +```ts +import { getAuth } from '@clerk/tanstack-react-start/server' + +const authStateFn = createServerFn({ method: 'GET' }).handler(() => { + const request = getWebRequest() + + const auth = getAuth(request) // no await + + return { userId: auth.userId } +}) +``` From 57646839e63fc96d7abcc9ef06487ecff9cd7ab7 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Thu, 21 Aug 2025 09:26:54 -0700 Subject: [PATCH 11/13] chore: set getAuth to async --- .../templates/tanstack-react-start/src/routes/user.tsx | 4 ++-- packages/tanstack-react-start/src/server/getAuth.ts | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/integration/templates/tanstack-react-start/src/routes/user.tsx b/integration/templates/tanstack-react-start/src/routes/user.tsx index 79677cf1e32..4fd5f6ccf2c 100644 --- a/integration/templates/tanstack-react-start/src/routes/user.tsx +++ b/integration/templates/tanstack-react-start/src/routes/user.tsx @@ -3,11 +3,11 @@ import { createServerFn } from '@tanstack/react-start'; import { getAuth } from '@clerk/tanstack-react-start/server'; import { getWebRequest } from '@tanstack/react-start/server'; -const fetchClerkAuth = createServerFn({ method: 'GET' }).handler(() => { +const fetchClerkAuth = createServerFn({ method: 'GET' }).handler(async () => { const request = getWebRequest(); if (!request) throw new Error('No request found'); - const { userId } = getAuth(request); + const { userId } = await getAuth(request); return { userId, diff --git a/packages/tanstack-react-start/src/server/getAuth.ts b/packages/tanstack-react-start/src/server/getAuth.ts index e0a8110e1ba..6b2d56f2960 100644 --- a/packages/tanstack-react-start/src/server/getAuth.ts +++ b/packages/tanstack-react-start/src/server/getAuth.ts @@ -7,7 +7,7 @@ import { clerkHandlerNotConfigured, noFetchFnCtxPassedInGetAuth } from '../utils type GetAuthOptions = { acceptsToken?: AuthenticateRequestOptions['acceptsToken'] }; -export const getAuth: GetAuthFn = ((request: Request, opts?: GetAuthOptions) => { +export const getAuth: GetAuthFn = (async (request: Request, opts?: GetAuthOptions) => { if (!request) { return errorThrower.throw(noFetchFnCtxPassedInGetAuth); } @@ -18,5 +18,8 @@ export const getAuth: GetAuthFn = ((request: Request, opts?: GetAuthOpt return errorThrower.throw(clerkHandlerNotConfigured); } - return getAuthObjectForAcceptedToken({ authObject: authObjectFn(), acceptsToken: opts?.acceptsToken }); -}) as GetAuthFn; + // We're keeping it a promise for now to minimize breaking changes + const authObject = await Promise.resolve(authObjectFn()); + + return getAuthObjectForAcceptedToken({ authObject, acceptsToken: opts?.acceptsToken }); +}) as GetAuthFn; From 1f5ea7e3319f95967c92d370ae116869709b2538 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Thu, 21 Aug 2025 09:27:22 -0700 Subject: [PATCH 12/13] chore: update changeset --- .changeset/itchy-zoos-shake.md | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/.changeset/itchy-zoos-shake.md b/.changeset/itchy-zoos-shake.md index 373e4f1c1c7..2fd073f7359 100644 --- a/.changeset/itchy-zoos-shake.md +++ b/.changeset/itchy-zoos-shake.md @@ -22,18 +22,4 @@ export default defineHandlerCallback(async event => { const startHandler = await handlerFactory(defaultStreamHandler); // awaited return startHandler(event); }); -``` - -`getAuth()` is now sync and no longer requires awaiting - -```ts -import { getAuth } from '@clerk/tanstack-react-start/server' - -const authStateFn = createServerFn({ method: 'GET' }).handler(() => { - const request = getWebRequest() - - const auth = getAuth(request) // no await - - return { userId: auth.userId } -}) -``` +``` \ No newline at end of file From b4b54ffdad7071bd7201c493dbf2320f5735596f Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Thu, 21 Aug 2025 21:36:57 -0700 Subject: [PATCH 13/13] chore: update changeset --- .changeset/itchy-zoos-shake.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/itchy-zoos-shake.md b/.changeset/itchy-zoos-shake.md index 2fd073f7359..80bace3deab 100644 --- a/.changeset/itchy-zoos-shake.md +++ b/.changeset/itchy-zoos-shake.md @@ -2,7 +2,7 @@ "@clerk/tanstack-react-start": minor --- -Reuses existing `Auth` object from the server handler +Reuses existing `Auth` object from the server handler when using `getAuth()` The `createClerkHandler` helper now returns a Promise and requires awaiting during setup to ensure authentication context is available at the earliest possible point in the request lifecycle, before any router loaders or server functions execute @@ -22,4 +22,4 @@ export default defineHandlerCallback(async event => { const startHandler = await handlerFactory(defaultStreamHandler); // awaited return startHandler(event); }); -``` \ No newline at end of file +```