From b06ead4145c8232cb9661d7306a7711ac9300c81 Mon Sep 17 00:00:00 2001 From: Michal Piechowiak Date: Mon, 22 Sep 2025 13:50:14 +0200 Subject: [PATCH 1/3] fix: set proper peer dependencies --- packages/vite-plugin-tanstack-start/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vite-plugin-tanstack-start/package.json b/packages/vite-plugin-tanstack-start/package.json index 44060947..82724c54 100644 --- a/packages/vite-plugin-tanstack-start/package.json +++ b/packages/vite-plugin-tanstack-start/package.json @@ -49,8 +49,8 @@ "@netlify/vite-plugin": "^2.5.10" }, "peerDependencies": { - "@tanstack/react-start": "alpha", - "@tanstack/solid-start": "alpha", + "@tanstack/react-start": ">=1.132.0", + "@tanstack/solid-start": ">=1.132.0", "vite": ">=7.0.0" }, "peerDependenciesMeta": { From f9ca764da5a15e5a318f139e9fadfa4f720b7306 Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Tue, 23 Sep 2025 18:24:50 -0400 Subject: [PATCH 2/3] chore: run npm install --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8fed86d3..359b1cf3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19977,8 +19977,8 @@ "node": "^22.12.0" }, "peerDependencies": { - "@tanstack/react-start": "alpha", - "@tanstack/solid-start": "alpha", + "@tanstack/react-start": ">=1.132.0", + "@tanstack/solid-start": ">=1.132.0", "vite": ">=7.0.0" }, "peerDependenciesMeta": { From 6b3a055fc75acf8176fb5c72002cd8e0a6fc0b4b Mon Sep 17 00:00:00 2001 From: Michal Piechowiak Date: Wed, 24 Sep 2025 09:09:36 +0200 Subject: [PATCH 3/3] update test fixture --- .../fixtures/start-basic-alpha/package.json | 6 +- .../fixtures/start-basic-alpha/src/Foo.ts | 6 + .../start-basic-alpha/src/routeTree.gen.ts | 162 ++++++++---------- .../fixtures/start-basic-alpha/src/router.tsx | 17 +- .../start-basic-alpha/src/routes/__root.tsx | 130 ++++++++++++++ .../src/routes/api/users.$userId.ts | 46 ++--- .../start-basic-alpha/src/routes/api/users.ts | 42 +++-- .../src/routes/customScript[.]js.ts | 19 +- .../start-basic-alpha/src/routes/deferred.tsx | 4 +- .../start-basic-alpha/src/routes/index.tsx | 64 +++++++ .../fixtures/start-basic-alpha/src/server.ts | 10 ++ .../fixtures/start-basic-alpha/src/start.tsx | 112 ++++++++++++ .../start-basic-alpha/src/utils/posts.tsx | 7 +- 13 files changed, 474 insertions(+), 151 deletions(-) create mode 100644 packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/Foo.ts create mode 100644 packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/server.ts create mode 100644 packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/start.tsx diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/package.json b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/package.json index c1835011..ef344da3 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/package.json +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/package.json @@ -9,9 +9,9 @@ "start": "node .output/server/index.mjs" }, "dependencies": { - "@tanstack/react-router": "^1.132.0-alpha.21", - "@tanstack/react-router-devtools": "^1.132.0-alpha.21", - "@tanstack/react-start": "^1.132.0-alpha.22", + "@tanstack/react-router": "^1.132.2", + "@tanstack/react-router-devtools": "^1.132.2", + "@tanstack/react-start": "^1.132.2", "react": "^19.0.0", "react-dom": "^19.0.0", "tailwind-merge": "^2.6.0", diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/Foo.ts b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/Foo.ts new file mode 100644 index 00000000..6a3a36a1 --- /dev/null +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/Foo.ts @@ -0,0 +1,6 @@ +export class Foo { + constructor(private value: string) {} + bar() { + return this.value + } +} diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routeTree.gen.ts b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routeTree.gen.ts index 9f7ccda0..011ecf91 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routeTree.gen.ts +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routeTree.gen.ts @@ -8,28 +8,24 @@ // You should NOT make any changes in this file as it will be overwritten. // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. -import { createServerRootRoute } from '@tanstack/react-start/server' - import { Route as rootRouteImport } from './routes/__root' import { Route as UsersRouteImport } from './routes/users' import { Route as RedirectRouteImport } from './routes/redirect' import { Route as PostsRouteImport } from './routes/posts' import { Route as DeferredRouteImport } from './routes/deferred' +import { Route as CustomScriptDotjsRouteImport } from './routes/customScript[.]js' import { Route as PathlessLayoutRouteImport } from './routes/_pathlessLayout' import { Route as IndexRouteImport } from './routes/index' import { Route as UsersIndexRouteImport } from './routes/users.index' import { Route as PostsIndexRouteImport } from './routes/posts.index' import { Route as UsersUserIdRouteImport } from './routes/users.$userId' import { Route as PostsPostIdRouteImport } from './routes/posts.$postId' +import { Route as ApiUsersRouteImport } from './routes/api/users' import { Route as PathlessLayoutNestedLayoutRouteImport } from './routes/_pathlessLayout/_nested-layout' import { Route as PostsPostIdDeepRouteImport } from './routes/posts_.$postId.deep' +import { Route as ApiUsersUserIdRouteImport } from './routes/api/users.$userId' import { Route as PathlessLayoutNestedLayoutRouteBRouteImport } from './routes/_pathlessLayout/_nested-layout/route-b' import { Route as PathlessLayoutNestedLayoutRouteARouteImport } from './routes/_pathlessLayout/_nested-layout/route-a' -import { ServerRoute as CustomScriptDotjsServerRouteImport } from './routes/customScript[.]js' -import { ServerRoute as ApiUsersServerRouteImport } from './routes/api/users' -import { ServerRoute as ApiUsersUserIdServerRouteImport } from './routes/api/users.$userId' - -const rootServerRouteImport = createServerRootRoute() const UsersRoute = UsersRouteImport.update({ id: '/users', @@ -51,6 +47,11 @@ const DeferredRoute = DeferredRouteImport.update({ path: '/deferred', getParentRoute: () => rootRouteImport, } as any) +const CustomScriptDotjsRoute = CustomScriptDotjsRouteImport.update({ + id: '/customScript.js', + path: '/customScript.js', + getParentRoute: () => rootRouteImport, +} as any) const PathlessLayoutRoute = PathlessLayoutRouteImport.update({ id: '/_pathlessLayout', getParentRoute: () => rootRouteImport, @@ -80,6 +81,11 @@ const PostsPostIdRoute = PostsPostIdRouteImport.update({ path: '/$postId', getParentRoute: () => PostsRoute, } as any) +const ApiUsersRoute = ApiUsersRouteImport.update({ + id: '/api/users', + path: '/api/users', + getParentRoute: () => rootRouteImport, +} as any) const PathlessLayoutNestedLayoutRoute = PathlessLayoutNestedLayoutRouteImport.update({ id: '/_nested-layout', @@ -90,6 +96,11 @@ const PostsPostIdDeepRoute = PostsPostIdDeepRouteImport.update({ path: '/posts/$postId/deep', getParentRoute: () => rootRouteImport, } as any) +const ApiUsersUserIdRoute = ApiUsersUserIdRouteImport.update({ + id: '/$userId', + path: '/$userId', + getParentRoute: () => ApiUsersRoute, +} as any) const PathlessLayoutNestedLayoutRouteBRoute = PathlessLayoutNestedLayoutRouteBRouteImport.update({ id: '/route-b', @@ -102,147 +113,124 @@ const PathlessLayoutNestedLayoutRouteARoute = path: '/route-a', getParentRoute: () => PathlessLayoutNestedLayoutRoute, } as any) -const CustomScriptDotjsServerRoute = CustomScriptDotjsServerRouteImport.update({ - id: '/customScript.js', - path: '/customScript.js', - getParentRoute: () => rootServerRouteImport, -} as any) -const ApiUsersServerRoute = ApiUsersServerRouteImport.update({ - id: '/api/users', - path: '/api/users', - getParentRoute: () => rootServerRouteImport, -} as any) -const ApiUsersUserIdServerRoute = ApiUsersUserIdServerRouteImport.update({ - id: '/$userId', - path: '/$userId', - getParentRoute: () => ApiUsersServerRoute, -} as any) export interface FileRoutesByFullPath { '/': typeof IndexRoute + '/customScript.js': typeof CustomScriptDotjsRoute '/deferred': typeof DeferredRoute '/posts': typeof PostsRouteWithChildren '/redirect': typeof RedirectRoute '/users': typeof UsersRouteWithChildren + '/api/users': typeof ApiUsersRouteWithChildren '/posts/$postId': typeof PostsPostIdRoute '/users/$userId': typeof UsersUserIdRoute '/posts/': typeof PostsIndexRoute '/users/': typeof UsersIndexRoute '/route-a': typeof PathlessLayoutNestedLayoutRouteARoute '/route-b': typeof PathlessLayoutNestedLayoutRouteBRoute + '/api/users/$userId': typeof ApiUsersUserIdRoute '/posts/$postId/deep': typeof PostsPostIdDeepRoute } export interface FileRoutesByTo { '/': typeof IndexRoute + '/customScript.js': typeof CustomScriptDotjsRoute '/deferred': typeof DeferredRoute '/redirect': typeof RedirectRoute + '/api/users': typeof ApiUsersRouteWithChildren '/posts/$postId': typeof PostsPostIdRoute '/users/$userId': typeof UsersUserIdRoute '/posts': typeof PostsIndexRoute '/users': typeof UsersIndexRoute '/route-a': typeof PathlessLayoutNestedLayoutRouteARoute '/route-b': typeof PathlessLayoutNestedLayoutRouteBRoute + '/api/users/$userId': typeof ApiUsersUserIdRoute '/posts/$postId/deep': typeof PostsPostIdDeepRoute } export interface FileRoutesById { __root__: typeof rootRouteImport '/': typeof IndexRoute '/_pathlessLayout': typeof PathlessLayoutRouteWithChildren + '/customScript.js': typeof CustomScriptDotjsRoute '/deferred': typeof DeferredRoute '/posts': typeof PostsRouteWithChildren '/redirect': typeof RedirectRoute '/users': typeof UsersRouteWithChildren '/_pathlessLayout/_nested-layout': typeof PathlessLayoutNestedLayoutRouteWithChildren + '/api/users': typeof ApiUsersRouteWithChildren '/posts/$postId': typeof PostsPostIdRoute '/users/$userId': typeof UsersUserIdRoute '/posts/': typeof PostsIndexRoute '/users/': typeof UsersIndexRoute '/_pathlessLayout/_nested-layout/route-a': typeof PathlessLayoutNestedLayoutRouteARoute '/_pathlessLayout/_nested-layout/route-b': typeof PathlessLayoutNestedLayoutRouteBRoute + '/api/users/$userId': typeof ApiUsersUserIdRoute '/posts_/$postId/deep': typeof PostsPostIdDeepRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath fullPaths: | '/' + | '/customScript.js' | '/deferred' | '/posts' | '/redirect' | '/users' + | '/api/users' | '/posts/$postId' | '/users/$userId' | '/posts/' | '/users/' | '/route-a' | '/route-b' + | '/api/users/$userId' | '/posts/$postId/deep' fileRoutesByTo: FileRoutesByTo to: | '/' + | '/customScript.js' | '/deferred' | '/redirect' + | '/api/users' | '/posts/$postId' | '/users/$userId' | '/posts' | '/users' | '/route-a' | '/route-b' + | '/api/users/$userId' | '/posts/$postId/deep' id: | '__root__' | '/' | '/_pathlessLayout' + | '/customScript.js' | '/deferred' | '/posts' | '/redirect' | '/users' | '/_pathlessLayout/_nested-layout' + | '/api/users' | '/posts/$postId' | '/users/$userId' | '/posts/' | '/users/' | '/_pathlessLayout/_nested-layout/route-a' | '/_pathlessLayout/_nested-layout/route-b' + | '/api/users/$userId' | '/posts_/$postId/deep' fileRoutesById: FileRoutesById } export interface RootRouteChildren { IndexRoute: typeof IndexRoute PathlessLayoutRoute: typeof PathlessLayoutRouteWithChildren + CustomScriptDotjsRoute: typeof CustomScriptDotjsRoute DeferredRoute: typeof DeferredRoute PostsRoute: typeof PostsRouteWithChildren RedirectRoute: typeof RedirectRoute UsersRoute: typeof UsersRouteWithChildren + ApiUsersRoute: typeof ApiUsersRouteWithChildren PostsPostIdDeepRoute: typeof PostsPostIdDeepRoute } -export interface FileServerRoutesByFullPath { - '/customScript.js': typeof CustomScriptDotjsServerRoute - '/api/users': typeof ApiUsersServerRouteWithChildren - '/api/users/$userId': typeof ApiUsersUserIdServerRoute -} -export interface FileServerRoutesByTo { - '/customScript.js': typeof CustomScriptDotjsServerRoute - '/api/users': typeof ApiUsersServerRouteWithChildren - '/api/users/$userId': typeof ApiUsersUserIdServerRoute -} -export interface FileServerRoutesById { - __root__: typeof rootServerRouteImport - '/customScript.js': typeof CustomScriptDotjsServerRoute - '/api/users': typeof ApiUsersServerRouteWithChildren - '/api/users/$userId': typeof ApiUsersUserIdServerRoute -} -export interface FileServerRouteTypes { - fileServerRoutesByFullPath: FileServerRoutesByFullPath - fullPaths: '/customScript.js' | '/api/users' | '/api/users/$userId' - fileServerRoutesByTo: FileServerRoutesByTo - to: '/customScript.js' | '/api/users' | '/api/users/$userId' - id: '__root__' | '/customScript.js' | '/api/users' | '/api/users/$userId' - fileServerRoutesById: FileServerRoutesById -} -export interface RootServerRouteChildren { - CustomScriptDotjsServerRoute: typeof CustomScriptDotjsServerRoute - ApiUsersServerRoute: typeof ApiUsersServerRouteWithChildren -} declare module '@tanstack/react-router' { interface FileRoutesByPath { @@ -274,6 +262,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DeferredRouteImport parentRoute: typeof rootRouteImport } + '/customScript.js': { + id: '/customScript.js' + path: '/customScript.js' + fullPath: '/customScript.js' + preLoaderRoute: typeof CustomScriptDotjsRouteImport + parentRoute: typeof rootRouteImport + } '/_pathlessLayout': { id: '/_pathlessLayout' path: '' @@ -316,6 +311,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof PostsPostIdRouteImport parentRoute: typeof PostsRoute } + '/api/users': { + id: '/api/users' + path: '/api/users' + fullPath: '/api/users' + preLoaderRoute: typeof ApiUsersRouteImport + parentRoute: typeof rootRouteImport + } '/_pathlessLayout/_nested-layout': { id: '/_pathlessLayout/_nested-layout' path: '' @@ -330,6 +332,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof PostsPostIdDeepRouteImport parentRoute: typeof rootRouteImport } + '/api/users/$userId': { + id: '/api/users/$userId' + path: '/$userId' + fullPath: '/api/users/$userId' + preLoaderRoute: typeof ApiUsersUserIdRouteImport + parentRoute: typeof ApiUsersRoute + } '/_pathlessLayout/_nested-layout/route-b': { id: '/_pathlessLayout/_nested-layout/route-b' path: '/route-b' @@ -346,31 +355,6 @@ declare module '@tanstack/react-router' { } } } -declare module '@tanstack/react-start/server' { - interface ServerFileRoutesByPath { - '/customScript.js': { - id: '/customScript.js' - path: '/customScript.js' - fullPath: '/customScript.js' - preLoaderRoute: typeof CustomScriptDotjsServerRouteImport - parentRoute: typeof rootServerRouteImport - } - '/api/users': { - id: '/api/users' - path: '/api/users' - fullPath: '/api/users' - preLoaderRoute: typeof ApiUsersServerRouteImport - parentRoute: typeof rootServerRouteImport - } - '/api/users/$userId': { - id: '/api/users/$userId' - path: '/$userId' - fullPath: '/api/users/$userId' - preLoaderRoute: typeof ApiUsersUserIdServerRouteImport - parentRoute: typeof ApiUsersServerRoute - } - } -} interface PathlessLayoutNestedLayoutRouteChildren { PathlessLayoutNestedLayoutRouteARoute: typeof PathlessLayoutNestedLayoutRouteARoute @@ -426,34 +410,38 @@ const UsersRouteChildren: UsersRouteChildren = { const UsersRouteWithChildren = UsersRoute._addFileChildren(UsersRouteChildren) -interface ApiUsersServerRouteChildren { - ApiUsersUserIdServerRoute: typeof ApiUsersUserIdServerRoute +interface ApiUsersRouteChildren { + ApiUsersUserIdRoute: typeof ApiUsersUserIdRoute } -const ApiUsersServerRouteChildren: ApiUsersServerRouteChildren = { - ApiUsersUserIdServerRoute: ApiUsersUserIdServerRoute, +const ApiUsersRouteChildren: ApiUsersRouteChildren = { + ApiUsersUserIdRoute: ApiUsersUserIdRoute, } -const ApiUsersServerRouteWithChildren = ApiUsersServerRoute._addFileChildren( - ApiUsersServerRouteChildren, +const ApiUsersRouteWithChildren = ApiUsersRoute._addFileChildren( + ApiUsersRouteChildren, ) const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, PathlessLayoutRoute: PathlessLayoutRouteWithChildren, + CustomScriptDotjsRoute: CustomScriptDotjsRoute, DeferredRoute: DeferredRoute, PostsRoute: PostsRouteWithChildren, RedirectRoute: RedirectRoute, UsersRoute: UsersRouteWithChildren, + ApiUsersRoute: ApiUsersRouteWithChildren, PostsPostIdDeepRoute: PostsPostIdDeepRoute, } export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) ._addFileTypes() -const rootServerRouteChildren: RootServerRouteChildren = { - CustomScriptDotjsServerRoute: CustomScriptDotjsServerRoute, - ApiUsersServerRoute: ApiUsersServerRouteWithChildren, + +import type { getRouter } from './router.tsx' +import type { startInstance } from './start.tsx' +declare module '@tanstack/react-start' { + interface Register { + router: Awaited> + config: Awaited> + } } -export const serverRouteTree = rootServerRouteImport - ._addFileChildren(rootServerRouteChildren) - ._addFileTypes() diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/router.tsx b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/router.tsx index c76eb021..6773db54 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/router.tsx +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/router.tsx @@ -1,22 +1,19 @@ -import { createRouter as createTanStackRouter } from '@tanstack/react-router' +import { createRouter } from '@tanstack/react-router' +import { getGlobalStartContext } from '@tanstack/react-start' import { routeTree } from './routeTree.gen' import { DefaultCatchBoundary } from './components/DefaultCatchBoundary' import { NotFound } from './components/NotFound' -export function createRouter() { - const router = createTanStackRouter({ +export function getRouter() { + const router = createRouter({ routeTree, defaultPreload: 'intent', defaultErrorComponent: DefaultCatchBoundary, defaultNotFoundComponent: () => , scrollRestoration: true, + ssr: { + nonce: getGlobalStartContext()?.nonce, + }, }) - return router } - -declare module '@tanstack/react-router' { - interface Register { - router: ReturnType - } -} diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/__root.tsx b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/__root.tsx index 346409e9..e9c952a1 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/__root.tsx +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/__root.tsx @@ -9,10 +9,140 @@ import { TanStackRouterDevtools } from '@tanstack/react-router-devtools' import * as React from 'react' import { DefaultCatchBoundary } from '~/components/DefaultCatchBoundary' import { NotFound } from '~/components/NotFound' +import { Test, startInstance } from '~/start' import appCss from '~/styles/app.css?url' import { seo } from '~/utils/seo' +export const testServerMw = startInstance + .createMiddleware() + .server(({ next, context }) => { + context.fromFetch + // ^? + context.fromServerMw + // ^? + + return next({ + context: { + fromIndexServerMw: true, + }, + }) + }) + +export const testFnMw = startInstance + .createMiddleware({ type: 'function' }) + .middleware([testServerMw]) + .server(({ next, context }) => { + context.fromFetch + // ^? + context.fromServerMw + // ^? + context.fromFnMw + // ^? + context.fromIndexServerMw + // ^? + + return next({ + context: { + fromIndexFnMw: true, + }, + }) + }) + +export const testGetMiddleware = startInstance + .createMiddleware() + .server(({ next, context }) => { + return next({ + context: { + fromGetMiddleware: true, + }, + }) + }) + export const Route = createRootRoute({ + server: { + middleware: [testServerMw], + handlers: { + GET: ({ context, next }) => { + context.fromFetch + // ^? + context.fromServerMw + // ^? + context.fromIndexServerMw + // ^? + return next({ + context: { + fromGet: true, + }, + }) + }, + POST: ({ context, next }) => { + context.fromFetch + context.fromServerMw + context.fromIndexServerMw + return next({ + context: { + fromPost: true, + }, + }) + }, + }, + // handlers: ({ createHandlers }) => + // createHandlers({ + // GET: { + // middleware: [testGetMiddleware], + // handler: ({ context, next }) => { + // context.fromFetch + // // ^? + // context.fromServerMw + // // ^? + // context.fromIndexServerMw + // // ^? + // context.fromGetMiddleware + // // ^? + // return next({ + // context: { + // fromGet: true, + // fromPost: false, + // }, + // }) + // }, + // }, + // POST: { + // handler: ({ next }) => { + // return next({ + // context: { + // fromGet: false, + // fromPost: true, + // }, + // }) + // }, + // }, + // }), + test: (test) => {}, + }, + beforeLoad: ({ serverContext }) => { + serverContext?.fromFetch + // ^? + serverContext?.fromServerMw + // ^? + serverContext?.fromIndexServerMw + // ^? + serverContext?.fromGet + // ^? + return serverContext + }, + // ssr: false, + loader: ({ context }) => { + context?.fromFetch + // ^? + context?.fromServerMw + // ^? + context?.fromIndexServerMw + // ^? + context?.fromPost + // ^? + return new Test('test') + }, head: () => ({ meta: [ { diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/api/users.$userId.ts b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/api/users.$userId.ts index c5c25399..2ae7eb9c 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/api/users.$userId.ts +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/api/users.$userId.ts @@ -1,28 +1,32 @@ -import { createServerFileRoute } from '@tanstack/react-start/server' +import { createFileRoute } from '@tanstack/react-router' import { json } from '@tanstack/react-start' import type { User } from '~/utils/users' -export const ServerRoute = createServerFileRoute('/api/users/$userId').methods({ - GET: async ({ params, request }) => { - console.info(`Fetching users by id=${params.userId}... @`, request.url) - try { - const res = await fetch( - 'https://jsonplaceholder.typicode.com/users/' + params.userId, - ) - if (!res.ok) { - throw new Error('Failed to fetch user') - } +export const Route = createFileRoute('/api/users/$userId')({ + server: { + handlers: { + GET: async ({ params, request }) => { + console.info(`Fetching users by id=${params.userId}... @`, request.url) + try { + const res = await fetch( + 'https://jsonplaceholder.typicode.com/users/' + params.userId, + ) + if (!res.ok) { + throw new Error('Failed to fetch user') + } - const user = (await res.json()) as User + const user = (await res.json()) as User - return json({ - id: user.id, - name: user.name, - email: user.email, - }) - } catch (e) { - console.error(e) - return json({ error: 'User not found' }, { status: 404 }) - } + return json({ + id: user.id, + name: user.name, + email: user.email, + }) + } catch (e) { + console.error(e) + return json({ error: 'User not found' }, { status: 404 }) + } + }, + }, }, }) diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/api/users.ts b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/api/users.ts index cb7f9e97..0205a756 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/api/users.ts +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/api/users.ts @@ -1,9 +1,10 @@ -import { createServerFileRoute } from '@tanstack/react-start/server' + +import { createFileRoute } from '@tanstack/react-router' import { getRequestHeaders } from '@tanstack/react-start/server' import { createMiddleware, json } from '@tanstack/react-start' import type { User } from '~/utils/users' -const userLoggerMiddleware = createMiddleware({ type: 'request' }).server( +const userLoggerMiddleware = createMiddleware().server( async ({ next, request }) => { console.info('In: /users') console.info('Request Headers:', getRequestHeaders()) @@ -14,7 +15,7 @@ const userLoggerMiddleware = createMiddleware({ type: 'request' }).server( }, ) -const testParentMiddleware = createMiddleware({ type: 'request' }).server( +const testParentMiddleware = createMiddleware().server( async ({ next, request }) => { console.info('In: testParentMiddleware') const result = await next() @@ -24,7 +25,7 @@ const testParentMiddleware = createMiddleware({ type: 'request' }).server( }, ) -const testMiddleware = createMiddleware({ type: 'request' }) +const testMiddleware = createMiddleware() .middleware([testParentMiddleware]) .server(async ({ next, request }) => { console.info('In: testMiddleware') @@ -42,21 +43,26 @@ const testMiddleware = createMiddleware({ type: 'request' }) return result }) -export const ServerRoute = createServerFileRoute('/api/users') - .middleware([testMiddleware, userLoggerMiddleware, testParentMiddleware]) - .methods({ - GET: async ({ request }) => { - console.info('GET /api/users @', request.url) - console.info('Fetching users... @', request.url) - const res = await fetch('https://jsonplaceholder.typicode.com/users') - if (!res.ok) { - throw new Error('Failed to fetch users') - } +export const Route = createFileRoute('/api/users')({ + server: { + middleware: [testMiddleware, userLoggerMiddleware], + handlers: { + GET: async ({ request }) => { + console.info('GET /api/users @', request.url) + console.info('Fetching users... @', request.url) + const res = await fetch('https://jsonplaceholder.typicode.com/users') + if (!res.ok) { + throw new Error('Failed to fetch users') + } - const data = (await res.json()) as Array + const data = (await res.json()) as Array - const list = data.slice(0, 10) + const list = data.slice(0, 10) - return json(list.map((u) => ({ id: u.id, name: u.name, email: u.email }))) + return json( + list.map((u) => ({ id: u.id, name: u.name, email: u.email })), + ) + }, }, - }) + }, +}) diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/customScript[.]js.ts b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/customScript[.]js.ts index 92cc40da..811471ac 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/customScript[.]js.ts +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/customScript[.]js.ts @@ -1,10 +1,15 @@ -import { createServerFileRoute } from '@tanstack/react-start/server' -export const ServerRoute = createServerFileRoute('/customScript.js').methods({ - GET: async ({ request }) => { - return new Response('console.log("Hello from customScript.js!")', { - headers: { - 'Content-Type': 'application/javascript', +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/customScript.js')({ + server: { + handlers: { + GET: () => { + return new Response('console.log("Hello from customScript.js!")', { + headers: { + 'Content-Type': 'application/javascript', + }, + }) }, - }) + }, }, }) diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/deferred.tsx b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/deferred.tsx index f3e09d1d..c3880824 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/deferred.tsx +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/deferred.tsx @@ -3,13 +3,13 @@ import { createServerFn } from '@tanstack/react-start' import { Suspense, useState } from 'react' const personServerFn = createServerFn({ method: 'GET' }) - .validator((d: string) => d) + .inputValidator((d: string) => d) .handler(({ data: name }) => { return { name, randomNumber: Math.floor(Math.random() * 100) } }) const slowServerFn = createServerFn({ method: 'GET' }) - .validator((d: string) => d) + .inputValidator((d: string) => d) .handler(async ({ data: name }) => { await new Promise((r) => setTimeout(r, 1000)) return { name, randomNumber: Math.floor(Math.random() * 100) } diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/index.tsx b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/index.tsx index 09a907cb..9e9601e8 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/index.tsx +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/routes/index.tsx @@ -1,6 +1,70 @@ import { createFileRoute } from '@tanstack/react-router' +import { Test } from '~/start' export const Route = createFileRoute('/')({ + // server: { + // handlers: { + // GET: ({ context, next }) => { + // context.fromFetch + // // ^? + // context.fromServerMw + // // ^? + // context.fromIndexServerMw + // // ^? + // return next({ + // context: { + // fromGet: true, + // }, + // }) + // }, + // POST: ({ context, next }) => { + // context.fromFetch + // context.fromServerMw + // context.fromIndexServerMw + // return next({ + // context: { + // fromPost: true, + // }, + // }) + // }, + // }, + // // handlers: ({ createHandlers }) => + // // createHandlers({ + // // GET: { + // // middleware: [testGetMiddleware], + // // handler: ({ context, next }) => { + // // context.fromFetch + // // // ^? + // // context.fromServerMw + // // // ^? + // // context.fromIndexServerMw + // // // ^? + // // context.fromGetMiddleware + // // // ^? + // // return next({ + // // context: { + // // fromGet: true, + // // fromPost: false, + // // }, + // // }) + // // }, + // // }, + // // POST: { + // // handler: ({ next }) => { + // // return next({ + // // context: { + // // fromGet: false, + // // fromPost: true, + // // }, + // // }) + // // }, + // // }, + // // }), + // test: (test) => {}, + // }, + loader: () => { + return new Test('test') + }, component: Home, }) diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/server.ts b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/server.ts new file mode 100644 index 00000000..b3fdd605 --- /dev/null +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/server.ts @@ -0,0 +1,10 @@ +// This file is a good smoke test to make sure the custom server entry is working +import handler from '@tanstack/react-start/server-entry' + +console.log("[server-entry]: using custom server entry in 'src/server.ts'") + +export default { + fetch(request: Request) { + return handler.fetch(request, { context: { fromFetch: true } }) + }, +} diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/start.tsx b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/start.tsx new file mode 100644 index 00000000..6a0772f8 --- /dev/null +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/start.tsx @@ -0,0 +1,112 @@ +import { createMiddleware, createStart } from '@tanstack/react-start' +import { createSerializationAdapter } from '@tanstack/react-router' +import type { Register } from '@tanstack/react-router' + +declare module '@tanstack/react-start' { + interface Register { + server: { + requestContext: { + fromFetch: boolean + } + } + } +} + +// @manuel +export const serverMw = createMiddleware().server(({ next, context }) => { + context.fromFetch + // ^? + + const nonce = Math.random().toString(16).slice(2, 10) + console.log('nonce', nonce) + return next({ + context: { + fromServerMw: true, + nonce, + }, + }) +}) + +export const fnMw = createMiddleware({ type: 'function' }) + .middleware([serverMw]) + .server(({ next, context }) => { + context.fromFetch + // ^? + + return next({ + context: { + fromFnMw: true, + }, + }) + }) + +const serializeClass = createSerializationAdapter({ + key: 'Test', + test: (v) => v instanceof Test, + toSerializable: (v) => v.test, + fromSerializable: (v) => new Test(v), +}) + +export class Test { + constructor(public test: string) {} + init() { + return this.test + } +} + +export const startInstance = createStart(() => { + return { + defaultSsr: true, + serializationAdapters: [serializeClass], + requestMiddleware: [serverMw], + functionMiddleware: [fnMw], + } +}) + +// type configKey2 = Register['configKey'] + +// type configKey = GetRegisteredConfigKey + +// type test3 = Register[GetRegisteredConfigKey]['~types'] + +// type test = Register[GetRegisteredConfigKey] extends { +// '~types': infer TTypes +// } +// ? 'defaultSsr' extends keyof TTypes +// ? TTypes['defaultSsr'] +// : unknown +// : unknown + +// export type RegisteredConfigType = TRegister extends Register +// ? TRegister['config'] extends { +// '~types': infer TTypes +// } +// ? TKey extends keyof TTypes +// ? TTypes[TKey] +// : unknown +// : unknown +// : unknown + +// type test = RegisteredSSROption +// type test2 = RegisteredConfigType + +type test3 = Register extends { + config: infer TConfig +} + ? TConfig extends { + '~types': infer TTypes + } + ? TTypes + : unknown + : unknown + +startInstance.createMiddleware().server(({ next, context }) => { + context.fromFetch + // ^? + + return next({ + context: { + fromStartInstanceMw: true, + }, + }) +}) diff --git a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/utils/posts.tsx b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/utils/posts.tsx index 52877be6..e3fbd013 100644 --- a/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/utils/posts.tsx +++ b/packages/vite-plugin-tanstack-start/test/fixtures/start-basic-alpha/src/utils/posts.tsx @@ -7,9 +7,10 @@ export type PostType = { body: string } -export const fetchPost = createServerFn() - .validator((d: string) => d) - .handler(async ({ data }) => { +export const fetchPost = createServerFn({ method: 'POST' }) + .inputValidator((d: string) => d) + .handler(async ({ data, context }) => { + console.log('Request context:', context) console.info(`Fetching post with id ${data}...`) const res = await fetch( `https://jsonplaceholder.typicode.com/posts/${data}`,