diff --git a/examples/react/basic-ssr-streaming-file-based/package.disabled.json b/examples/react/basic-ssr-streaming-file-based/package.disabled.json deleted file mode 100644 index 85730feee9..0000000000 --- a/examples/react/basic-ssr-streaming-file-based/package.disabled.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "tanstack-router-react-example-basic-ssr-streaming-file-based", - "private": true, - "type": "module", - "scripts": { - "dev": "node server", - "build": "npm run build:client && npm run build:server", - "build:client": "exit 0; vite build src/entry-client.tsx --outDir dist/client", - "build:server": "vite build --ssr src/entry-server.tsx --outDir dist/server", - "serve": "NODE_ENV=production node server", - "debug": "node --inspect-brk server" - }, - "dependencies": { - "@tanstack/react-router": "^1.120.20", - "@tanstack/react-router-devtools": "^1.120.20", - "@tanstack/router-plugin": "^1.120.20", - "@tanstack/react-start": "^1.120.20", - "get-port": "^7.1.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "redaxios": "^0.5.1", - "superjson": "^2.2.2" - }, - "devDependencies": { - "@babel/core": "^7.26.8", - "@babel/generator": "^7.26.8", - "@rollup/plugin-babel": "^6.0.4", - "@types/express": "^4.17.21", - "@vitejs/plugin-react": "^4.3.4", - "typescript": "^5.7.2", - "compression": "^1.7.5", - "express": "^4.21.2", - "isbot": "^5.1.22", - "node-fetch": "^3.3.2", - "serve-static": "^1.16.2", - "vite": "^6.3.5", - "@types/react": "^19.0.8", - "@types/react-dom": "^19.0.1" - } -} diff --git a/examples/react/basic-ssr-streaming-file-based/package.json b/examples/react/basic-ssr-streaming-file-based/package.json new file mode 100644 index 0000000000..a3b532a928 --- /dev/null +++ b/examples/react/basic-ssr-streaming-file-based/package.json @@ -0,0 +1,34 @@ +{ + "name": "tanstack-router-react-example-basic-ssr-streaming-file-based", + "private": true, + "type": "module", + "scripts": { + "dev": "node server", + "build": "npm run build:client && npm run build:server", + "build:client": "vite build", + "build:server": "vite build --ssr", + "serve": "NODE_ENV=production node server", + "debug": "node --inspect-brk server" + }, + "dependencies": { + "@tanstack/react-router": "^1.121.27", + "@tanstack/react-start": "^1.121.28", + "get-port": "^7.1.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tanstack/react-router-devtools": "^1.121.27", + "@tanstack/router-plugin": "^1.121.27", + "@types/express": "^4.17.23", + "@vitejs/plugin-react": "^4.5.2", + "typescript": "^5.7.2", + "compression": "^1.8.0", + "express": "^4.21.2", + "isbot": "^5.1.22", + "node-fetch": "^3.3.2", + "vite": "^6.3.5", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.1" + } +} diff --git a/examples/react/basic-ssr-streaming-file-based/public/images/favicon.ico b/examples/react/basic-ssr-streaming-file-based/public/images/favicon.ico new file mode 100644 index 0000000000..1a1751676f Binary files /dev/null and b/examples/react/basic-ssr-streaming-file-based/public/images/favicon.ico differ diff --git a/examples/react/basic-ssr-streaming-file-based/server.js b/examples/react/basic-ssr-streaming-file-based/server.js index 4643af5fb0..5686edc048 100644 --- a/examples/react/basic-ssr-streaming-file-based/server.js +++ b/examples/react/basic-ssr-streaming-file-based/server.js @@ -1,5 +1,7 @@ +import path from 'node:path' import express from 'express' import getPort, { portNumbers } from 'get-port' +import * as zlib from 'node:zlib' const isTest = process.env.NODE_ENV === 'test' || !!process.env.VITE_TEST_BUILD @@ -37,21 +39,30 @@ export async function createServer( // use vite's connect instance as middleware app.use(vite.middlewares) } else { - app.use((await import('compression')).default()) + app.use( + (await import('compression')).default({ + brotli: { + flush: zlib.constants.BROTLI_OPERATION_FLUSH, + }, + flush: zlib.constants.Z_SYNC_FLUSH, + }), + ) } + if (isProd) app.use(express.static('./dist/client')) + app.use('*', async (req, res) => { try { const url = req.originalUrl - if (url.includes('.')) { + if (path.extname(url) !== '') { console.warn(`${url} is not valid router path`) res.status(404) res.end(`${url} is not valid router path`) return } - // Extract the head from vite's index transformation hook + // Best effort extraction of the head from vite's index transformation hook let viteHead = !isProd ? await vite.transformIndexHtml( url, @@ -73,7 +84,7 @@ export async function createServer( })() console.info('Rendering: ', url, '...') - entry.render({ req, res, url, head: viteHead }) + entry.render({ req, res, head: viteHead }) } catch (e) { !isProd && vite.ssrFixStacktrace(e) console.info(e.stack) diff --git a/examples/react/basic-ssr-streaming-file-based/src/entry-server.tsx b/examples/react/basic-ssr-streaming-file-based/src/entry-server.tsx index e41f8c6f55..da362a0fc1 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/entry-server.tsx +++ b/examples/react/basic-ssr-streaming-file-based/src/entry-server.tsx @@ -1,22 +1,63 @@ +import { pipeline } from 'node:stream/promises' import { createRequestHandler, defaultStreamHandler, -} from '@tanstack/react-start/server' +} from '@tanstack/react-start/server-core-ssr' import { createRouter } from './router' import type express from 'express' - -// index.js import './fetch-polyfill' -export async function render(opts: { - url: string +export async function render({ + req, + res, + head, +}: { head: string req: express.Request res: express.Response }) { - return createRequestHandler({ - createRouter, - req: opts.req, - res: opts.res, - })(defaultStreamHandler) + // Convert the express request to a fetch request + const url = new URL(req.originalUrl || req.url, 'https://localhost:3000').href + + const request = new Request(url, { + method: req.method, + headers: (() => { + const headers = new Headers() + for (const [key, value] of Object.entries(req.headers)) { + headers.set(key, value as any) + } + return headers + })(), + }) + + // Create a request handler + const handler = createRequestHandler({ + request, + createRouter: () => { + const router = createRouter() + + // Update each router instance with the head info from vite + router.update({ + context: { + ...router.options.context, + head: head, + }, + }) + return router + }, + }) + + // Let's use the default stream handler to create the response + const response = await handler(defaultStreamHandler) + + // Convert the fetch response back to an express response + res.statusMessage = response.statusText + res.status(response.status) + + response.headers.forEach((value, name) => { + res.setHeader(name, value) + }) + + // Stream the response body + return pipeline(response.body as any, res) } diff --git a/examples/react/basic-ssr-streaming-file-based/src/routeTree.gen.ts b/examples/react/basic-ssr-streaming-file-based/src/routeTree.gen.ts index 4ff6d62320..4e61620e43 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/routeTree.gen.ts +++ b/examples/react/basic-ssr-streaming-file-based/src/routeTree.gen.ts @@ -8,154 +8,39 @@ // 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 Routes - -import type { FileRoutesByPath, CreateFileRoute } from '@tanstack/react-router' -import { Route as rootRoute } from './routes/__root' +import { Route as rootRouteImport } from './routes/__root' import { Route as ErrorRouteImport } from './routes/error' import { Route as PostsRouteRouteImport } from './routes/posts/route' import { Route as IndexRouteImport } from './routes/index' import { Route as PostsIndexRouteImport } from './routes/posts/index' import { Route as PostsPostIdRouteImport } from './routes/posts/$postId' -// Create/Update Routes - const ErrorRoute = ErrorRouteImport.update({ id: '/error', path: '/error', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - const PostsRouteRoute = PostsRouteRouteImport.update({ id: '/posts', path: '/posts', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - const IndexRoute = IndexRouteImport.update({ id: '/', path: '/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - const PostsIndexRoute = PostsIndexRouteImport.update({ id: '/', path: '/', getParentRoute: () => PostsRouteRoute, } as any) - const PostsPostIdRoute = PostsPostIdRouteImport.update({ id: '/$postId', path: '/$postId', getParentRoute: () => PostsRouteRoute, } as any) -// Populate the FileRoutesByPath interface - -declare module '@tanstack/react-router' { - interface FileRoutesByPath { - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexRouteImport - parentRoute: typeof rootRoute - } - '/posts': { - id: '/posts' - path: '/posts' - fullPath: '/posts' - preLoaderRoute: typeof PostsRouteRouteImport - parentRoute: typeof rootRoute - } - '/error': { - id: '/error' - path: '/error' - fullPath: '/error' - preLoaderRoute: typeof ErrorRouteImport - parentRoute: typeof rootRoute - } - '/posts/$postId': { - id: '/posts/$postId' - path: '/$postId' - fullPath: '/posts/$postId' - preLoaderRoute: typeof PostsPostIdRouteImport - parentRoute: typeof PostsRouteRouteImport - } - '/posts/': { - id: '/posts/' - path: '/' - fullPath: '/posts/' - preLoaderRoute: typeof PostsIndexRouteImport - parentRoute: typeof PostsRouteRouteImport - } - } -} - -// Add type-safety to the createFileRoute function across the route tree - -declare module './routes/index' { - const createFileRoute: CreateFileRoute< - '/', - FileRoutesByPath['/']['parentRoute'], - FileRoutesByPath['/']['id'], - FileRoutesByPath['/']['path'], - FileRoutesByPath['/']['fullPath'] - > -} -declare module './routes/posts/route' { - const createFileRoute: CreateFileRoute< - '/posts', - FileRoutesByPath['/posts']['parentRoute'], - FileRoutesByPath['/posts']['id'], - FileRoutesByPath['/posts']['path'], - FileRoutesByPath['/posts']['fullPath'] - > -} -declare module './routes/error' { - const createFileRoute: CreateFileRoute< - '/error', - FileRoutesByPath['/error']['parentRoute'], - FileRoutesByPath['/error']['id'], - FileRoutesByPath['/error']['path'], - FileRoutesByPath['/error']['fullPath'] - > -} -declare module './routes/posts/$postId' { - const createFileRoute: CreateFileRoute< - '/posts/$postId', - FileRoutesByPath['/posts/$postId']['parentRoute'], - FileRoutesByPath['/posts/$postId']['id'], - FileRoutesByPath['/posts/$postId']['path'], - FileRoutesByPath['/posts/$postId']['fullPath'] - > -} -declare module './routes/posts/index' { - const createFileRoute: CreateFileRoute< - '/posts/', - FileRoutesByPath['/posts/']['parentRoute'], - FileRoutesByPath['/posts/']['id'], - FileRoutesByPath['/posts/']['path'], - FileRoutesByPath['/posts/']['fullPath'] - > -} - -// Create and export the route tree - -interface PostsRouteRouteChildren { - PostsPostIdRoute: typeof PostsPostIdRoute - PostsIndexRoute: typeof PostsIndexRoute -} - -const PostsRouteRouteChildren: PostsRouteRouteChildren = { - PostsPostIdRoute: PostsPostIdRoute, - PostsIndexRoute: PostsIndexRoute, -} - -const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren( - PostsRouteRouteChildren, -) - export interface FileRoutesByFullPath { '/': typeof IndexRoute '/posts': typeof PostsRouteRouteWithChildren @@ -163,23 +48,20 @@ export interface FileRoutesByFullPath { '/posts/$postId': typeof PostsPostIdRoute '/posts/': typeof PostsIndexRoute } - export interface FileRoutesByTo { '/': typeof IndexRoute '/error': typeof ErrorRoute '/posts/$postId': typeof PostsPostIdRoute '/posts': typeof PostsIndexRoute } - export interface FileRoutesById { - __root__: typeof rootRoute + __root__: typeof rootRouteImport '/': typeof IndexRoute '/posts': typeof PostsRouteRouteWithChildren '/error': typeof ErrorRoute '/posts/$postId': typeof PostsPostIdRoute '/posts/': typeof PostsIndexRoute } - export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath fullPaths: '/' | '/posts' | '/error' | '/posts/$postId' | '/posts/' @@ -188,58 +70,71 @@ export interface FileRouteTypes { id: '__root__' | '/' | '/posts' | '/error' | '/posts/$postId' | '/posts/' fileRoutesById: FileRoutesById } - export interface RootRouteChildren { IndexRoute: typeof IndexRoute PostsRouteRoute: typeof PostsRouteRouteWithChildren ErrorRoute: typeof ErrorRoute } +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/error': { + id: '/error' + path: '/error' + fullPath: '/error' + preLoaderRoute: typeof ErrorRouteImport + parentRoute: typeof rootRouteImport + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsRouteRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof PostsIndexRouteImport + parentRoute: typeof PostsRouteRoute + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof PostsPostIdRouteImport + parentRoute: typeof PostsRouteRoute + } + } +} + +interface PostsRouteRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteRouteChildren: PostsRouteRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren( + PostsRouteRouteChildren, +) + const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, PostsRouteRoute: PostsRouteRouteWithChildren, ErrorRoute: ErrorRoute, } - -export const routeTree = rootRoute +export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) ._addFileTypes() - -// @ts-ignore -import type * as ServerTypes from '../.tanstack-start/server-routes/routeTree.gen.ts' - -/* ROUTE_MANIFEST_START -{ - "routes": { - "__root__": { - "filePath": "__root.tsx", - "children": [ - "/", - "/posts", - "/error" - ] - }, - "/": { - "filePath": "index.tsx" - }, - "/posts": { - "filePath": "posts/route.tsx", - "children": [ - "/posts/$postId", - "/posts/" - ] - }, - "/error": { - "filePath": "error.tsx" - }, - "/posts/$postId": { - "filePath": "posts/$postId.tsx", - "parent": "/posts" - }, - "/posts/": { - "filePath": "posts/index.tsx", - "parent": "/posts" - } - } -} -ROUTE_MANIFEST_END */ diff --git a/examples/react/basic-ssr-streaming-file-based/src/routes/__root.tsx b/examples/react/basic-ssr-streaming-file-based/src/routes/__root.tsx index 49c02bf5e4..d1fe7ae360 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/routes/__root.tsx +++ b/examples/react/basic-ssr-streaming-file-based/src/routes/__root.tsx @@ -11,6 +11,7 @@ import type { RouterContext } from '../routerContext' export const Route = createRootRouteWithContext()({ head: () => ({ + links: [{ rel: 'icon', href: '/images/favicon.ico' }], meta: [ { title: 'TanStack Router SSR Basic File Based', @@ -27,21 +28,27 @@ export const Route = createRootRouteWithContext()({ { src: 'https://unpkg.com/@tailwindcss/browser@4', }, - { - type: 'module', - children: `import RefreshRuntime from "/@react-refresh" + ...(!import.meta.env.PROD + ? [ + { + type: 'module', + children: `import RefreshRuntime from "/@react-refresh" RefreshRuntime.injectIntoGlobalHook(window) window.$RefreshReg$ = () => {} window.$RefreshSig$ = () => (type) => type window.__vite_plugin_react_preamble_installed__ = true`, - }, - { - type: 'module', - src: '/@vite/client', - }, + }, + { + type: 'module', + src: '/@vite/client', + }, + ] + : []), { type: 'module', - src: '/src/entry-client.tsx', + src: import.meta.env.PROD + ? '/static/entry-client.js' + : '/src/entry-client.tsx', }, ], }), diff --git a/examples/react/basic-ssr-streaming-file-based/src/routes/error.tsx b/examples/react/basic-ssr-streaming-file-based/src/routes/error.tsx index a8f14563d2..8ab6d2b52d 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/routes/error.tsx +++ b/examples/react/basic-ssr-streaming-file-based/src/routes/error.tsx @@ -1,4 +1,4 @@ -import { Await } from '@tanstack/react-router' +import { Await, createFileRoute } from '@tanstack/react-router' import * as React from 'react' async function loadData() { @@ -7,7 +7,7 @@ async function loadData() { return 'Hello!' } -export const Route = createFileRoute({ +export const Route = createFileRoute('/error')({ component: ErrorComponent, loader: () => { if (Math.random() > 0.5) throw new Error('Random error!') diff --git a/examples/react/basic-ssr-streaming-file-based/src/routes/index.tsx b/examples/react/basic-ssr-streaming-file-based/src/routes/index.tsx index 33f887a27b..20c73c00bb 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/routes/index.tsx +++ b/examples/react/basic-ssr-streaming-file-based/src/routes/index.tsx @@ -1,7 +1,7 @@ -import { Await } from '@tanstack/react-router' +import { Await, createFileRoute } from '@tanstack/react-router' import * as React from 'react' -export const Route = createFileRoute({ +export const Route = createFileRoute('/')({ loader: () => ({ date: new Date(), deferred: new Promise<{ date: Date }>((r) => @@ -19,7 +19,7 @@ function IndexComponent() {

Welcome Home!

Data: {data.date.getDate()}

- {(data) =>

Deferred: {data.date.getDate()}

} + {(data) =>

Deferred: {new Date(data.date).getDate()}

}
) diff --git a/examples/react/basic-ssr-streaming-file-based/src/routes/posts/$postId.tsx b/examples/react/basic-ssr-streaming-file-based/src/routes/posts/$postId.tsx index 9466546c60..d945e5d551 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/routes/posts/$postId.tsx +++ b/examples/react/basic-ssr-streaming-file-based/src/routes/posts/$postId.tsx @@ -1,4 +1,4 @@ -import { Await, notFound } from '@tanstack/react-router' +import { Await, notFound, createFileRoute } from '@tanstack/react-router' import * as React from 'react' import type { PostType } from './route' @@ -32,7 +32,7 @@ async function fetchComments(postId: string) { ).then((r) => r.json() as Promise>) } -export const Route = createFileRoute({ +export const Route = createFileRoute('/posts/$postId')({ loader: async ({ params: { postId } }) => { const commentsPromise = fetchComments(postId) const post = await fetchPostById(postId) diff --git a/examples/react/basic-ssr-streaming-file-based/src/routes/posts/index.tsx b/examples/react/basic-ssr-streaming-file-based/src/routes/posts/index.tsx index a88aaa8f26..2aa298c265 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/routes/posts/index.tsx +++ b/examples/react/basic-ssr-streaming-file-based/src/routes/posts/index.tsx @@ -1,6 +1,7 @@ +import { createFileRoute } from '@tanstack/react-router' import * as React from 'react' -export const Route = createFileRoute({ +export const Route = createFileRoute('/posts/')({ component: PostsIndexComponent, wrapInSuspense: true, errorComponent: ({ error }) => { diff --git a/examples/react/basic-ssr-streaming-file-based/src/routes/posts/route.tsx b/examples/react/basic-ssr-streaming-file-based/src/routes/posts/route.tsx index ceb14625f2..ad2b0082ad 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/routes/posts/route.tsx +++ b/examples/react/basic-ssr-streaming-file-based/src/routes/posts/route.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { Link, Outlet } from '@tanstack/react-router' +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' export type PostType = { id: string @@ -7,7 +7,7 @@ export type PostType = { body: string } -export const Route = createFileRoute({ +export const Route = createFileRoute('/posts')({ loader: async () => { console.info('Fetching posts...') await new Promise((r) => diff --git a/examples/react/basic-ssr-streaming-file-based/vite.config.js b/examples/react/basic-ssr-streaming-file-based/vite.config.js deleted file mode 100644 index ab615485ae..0000000000 --- a/examples/react/basic-ssr-streaming-file-based/vite.config.js +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' -import { tanstackRouter } from '@tanstack/router-plugin/vite' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - tanstackRouter({ target: 'react', autoCodeSplitting: true }), - react(), - ], -}) diff --git a/examples/react/basic-ssr-streaming-file-based/vite.config.ts b/examples/react/basic-ssr-streaming-file-based/vite.config.ts new file mode 100644 index 0000000000..e6e86d12a0 --- /dev/null +++ b/examples/react/basic-ssr-streaming-file-based/vite.config.ts @@ -0,0 +1,53 @@ +import path from 'node:path' +import url from 'node:url' +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { tanstackRouter } from '@tanstack/router-plugin/vite' +import type { BuildEnvironmentOptions } from 'vite' + +const __filename = url.fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +// SSR configuration +const ssrBuildConfig: BuildEnvironmentOptions = { + ssr: true, + outDir: 'dist/server', + ssrEmitAssets: true, + copyPublicDir: false, + emptyOutDir: true, + rollupOptions: { + input: path.resolve(__dirname, 'src/entry-server.tsx'), + output: { + entryFileNames: '[name].js', + chunkFileNames: 'assets/[name]-[hash].js', + assetFileNames: 'assets/[name]-[hash][extname]', + }, + }, +} + +// Client-specific configuration +const clientBuildConfig: BuildEnvironmentOptions = { + outDir: 'dist/client', + emitAssets: true, + copyPublicDir: true, + emptyOutDir: true, + rollupOptions: { + input: path.resolve(__dirname, 'src/entry-client.tsx'), + output: { + entryFileNames: 'static/[name].js', + chunkFileNames: 'static/assets/[name]-[hash].js', + assetFileNames: 'static/assets/[name]-[hash][extname]', + }, + }, +} + +// https://vitejs.dev/config/ +export default defineConfig((configEnv) => { + return { + plugins: [ + tanstackRouter({ target: 'react', autoCodeSplitting: true }), + react(), + ], + build: configEnv.isSsrBuild ? ssrBuildConfig : clientBuildConfig, + } +}) diff --git a/packages/react-start-server/package.json b/packages/react-start-server/package.json index 18836f5412..2db0e30631 100644 --- a/packages/react-start-server/package.json +++ b/packages/react-start-server/package.json @@ -51,6 +51,16 @@ "default": "./dist/cjs/index.cjs" } }, + "./core-ssr": { + "import": { + "types": "./dist/esm/core-ssr-export.d.ts", + "default": "./dist/esm/core-ssr-export.js" + }, + "require": { + "types": "./dist/cjs/core-ssr-export.d.cts", + "default": "./dist/cjs/core-ssr-export.cjs" + } + }, "./package.json": "./package.json" }, "sideEffects": false, diff --git a/packages/react-start-server/src/core-ssr-export.ts b/packages/react-start-server/src/core-ssr-export.ts new file mode 100644 index 0000000000..f2fca774da --- /dev/null +++ b/packages/react-start-server/src/core-ssr-export.ts @@ -0,0 +1,4 @@ +export { StartServer } from './StartServer' +export { defaultStreamHandler } from './defaultStreamHandler' +export { defaultRenderHandler } from './defaultRenderHandler' +export * from '@tanstack/start-server-core/core-ssr' diff --git a/packages/react-start-server/src/defaultRenderHandler.tsx b/packages/react-start-server/src/defaultRenderHandler.tsx index 01138e38ec..a833ed4ba8 100644 --- a/packages/react-start-server/src/defaultRenderHandler.tsx +++ b/packages/react-start-server/src/defaultRenderHandler.tsx @@ -1,5 +1,5 @@ import ReactDOMServer from 'react-dom/server' -import { defineHandlerCallback } from '@tanstack/start-server-core' +import { defineHandlerCallback } from '@tanstack/start-server-core/core-ssr' import { StartServer } from './StartServer' export const defaultRenderHandler = defineHandlerCallback( diff --git a/packages/react-start-server/src/defaultStreamHandler.tsx b/packages/react-start-server/src/defaultStreamHandler.tsx index 8891dfd218..974e07bd3f 100644 --- a/packages/react-start-server/src/defaultStreamHandler.tsx +++ b/packages/react-start-server/src/defaultStreamHandler.tsx @@ -6,7 +6,8 @@ import { defineHandlerCallback, transformPipeableStreamWithRouter, transformReadableStreamWithRouter, -} from '@tanstack/start-server-core' +} from '@tanstack/start-server-core/core-ssr' + import { StartServer } from './StartServer' import type { ReadableStream } from 'node:stream/web' diff --git a/packages/react-start-server/vite.config.ts b/packages/react-start-server/vite.config.ts index e05e5cc394..09ea8edf99 100644 --- a/packages/react-start-server/vite.config.ts +++ b/packages/react-start-server/vite.config.ts @@ -18,6 +18,6 @@ export default mergeConfig( config, tanstackViteConfig({ srcDir: './src', - entry: './src/index.tsx', + entry: ['./src/index.tsx','./src/core-ssr-export.ts'] }), ) diff --git a/packages/react-start/package.json b/packages/react-start/package.json index 0ba6786cee..d23c9ef440 100644 --- a/packages/react-start/package.json +++ b/packages/react-start/package.json @@ -62,6 +62,16 @@ "default": "./dist/cjs/server.cjs" } }, + "./server-core-ssr": { + "import": { + "types": "./dist/esm/server-core-ssr.d.ts", + "default": "./dist/esm/server-core-ssr.js" + }, + "require": { + "types": "./dist/cjs/server-core-ssr.d.cts", + "default": "./dist/cjs/server-core-ssr.cjs" + } + }, "./plugin/vite": { "import": { "types": "./dist/esm/plugin-vite.d.ts", diff --git a/packages/react-start/src/server-core-ssr.ts b/packages/react-start/src/server-core-ssr.ts new file mode 100644 index 0000000000..e7a3753c51 --- /dev/null +++ b/packages/react-start/src/server-core-ssr.ts @@ -0,0 +1 @@ +export * from '@tanstack/react-start-server/core-ssr' diff --git a/packages/react-start/vite.config.ts b/packages/react-start/vite.config.ts index 99fd4a8b00..e1fee129c0 100644 --- a/packages/react-start/vite.config.ts +++ b/packages/react-start/vite.config.ts @@ -20,6 +20,7 @@ export default mergeConfig( './src/plugin-vite.ts', './src/server-functions-client.tsx', './src/server-functions-server.tsx', + './src/server-core-ssr.ts', ], externalDeps: [ '@tanstack/react-start-client', diff --git a/packages/start-server-core/package.json b/packages/start-server-core/package.json index 697a7dff61..eae26feba2 100644 --- a/packages/start-server-core/package.json +++ b/packages/start-server-core/package.json @@ -51,6 +51,16 @@ "default": "./dist/cjs/index.cjs" } }, + "./core-ssr": { + "import": { + "types": "./dist/esm/core-ssr-export.d.ts", + "default": "./dist/esm/core-ssr-export.js" + }, + "require": { + "types": "./dist/cjs/core-ssr-export.d.cts", + "default": "./dist/cjs/core-ssr-export.cjs" + } + }, "./package.json": "./package.json" }, "sideEffects": false, diff --git a/packages/start-server-core/src/core-ssr-export.ts b/packages/start-server-core/src/core-ssr-export.ts new file mode 100644 index 0000000000..3e8f8ead6a --- /dev/null +++ b/packages/start-server-core/src/core-ssr-export.ts @@ -0,0 +1,4 @@ +export {transformPipeableStreamWithRouter, transformReadableStreamWithRouter} from './transformStreamWithRouter' +export {createRequestHandler} from './createRequestHandler' +export {defineHandlerCallback} from './handlerCallback' +export type {HandlerCallback} from './handlerCallback' diff --git a/packages/start-server-core/vite.config.ts b/packages/start-server-core/vite.config.ts index ec9a7caaed..f8920b9acf 100644 --- a/packages/start-server-core/vite.config.ts +++ b/packages/start-server-core/vite.config.ts @@ -21,7 +21,7 @@ export default mergeConfig( config, tanstackViteConfig({ srcDir: './src', - entry: './src/index.tsx', - externalDeps: [...Object.values(VIRTUAL_MODULES)], + entry: ['./src/index.tsx','./src/core-ssr-export.ts'], + externalDeps: [...Object.values(VIRTUAL_MODULES)] }), ) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b343a6aaaf..7370668b2c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2862,6 +2862,61 @@ importers: specifier: 6.3.5 version: 6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + examples/react/basic-ssr-streaming-file-based: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-start': + specifier: workspace:* + version: link:../../../packages/react-start + get-port: + specifier: ^7.1.0 + version: 7.1.0 + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + devDependencies: + '@tanstack/react-router-devtools': + specifier: workspace:^ + version: link:../../../packages/react-router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@types/express': + specifier: ^4.17.23 + version: 4.17.23 + '@types/react': + specifier: ^19.0.8 + version: 19.0.8 + '@types/react-dom': + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.8) + '@vitejs/plugin-react': + specifier: ^4.5.2 + version: 4.5.2(vite@6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + compression: + specifier: ^1.8.0 + version: 1.8.0 + express: + specifier: ^4.21.2 + version: 4.21.2 + isbot: + specifier: ^5.1.22 + version: 5.1.28 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + typescript: + specifier: ^5.7.2 + version: 5.8.3 + vite: + specifier: 6.3.5 + version: 6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + examples/react/basic-virtual-file-based: dependencies: '@tanstack/react-router': @@ -5181,10 +5236,10 @@ importers: version: link:../../../packages/router-plugin '@trpc/client': specifier: 11.0.0-rc.772 - version: 11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.2))(typescript@5.8.2) + version: 11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.3))(typescript@5.8.3) '@trpc/server': specifier: 11.0.0-rc.772 - version: 11.0.0-rc.772(typescript@5.8.2) + version: 11.0.0-rc.772(typescript@5.8.3) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.5.3) @@ -5239,13 +5294,13 @@ importers: version: link:../../../packages/router-plugin '@trpc/client': specifier: 11.0.0-rc.772 - version: 11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.2))(typescript@5.8.2) + version: 11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.3))(typescript@5.8.3) '@trpc/server': specifier: 11.0.0-rc.772 - version: 11.0.0-rc.772(typescript@5.8.2) + version: 11.0.0-rc.772(typescript@5.8.3) '@trpc/tanstack-react-query': specifier: 11.0.0-rc.772 - version: 11.0.0-rc.772(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.772(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + version: 11.0.0-rc.772(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.0.0-rc.772(typescript@5.8.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.5.3) @@ -5801,11 +5856,11 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.23.0 - version: 8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + version: 8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3) devDependencies: '@typescript-eslint/rule-tester': specifier: ^8.23.0 - version: 8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + version: 8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -6346,7 +6401,7 @@ importers: version: 1.1.11 eslint-plugin-solid: specifier: ^0.14.5 - version: 0.14.5(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + version: 0.14.5(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3) solid-js: specifier: ^1.9.5 version: 1.9.5 @@ -6677,7 +6732,7 @@ importers: version: 19.0.0(react@19.0.0) valibot: specifier: 1.0.0-beta.15 - version: 1.0.0-beta.15(typescript@5.8.2) + version: 1.0.0-beta.15(typescript@5.8.3) packages/virtual-file-routes: {} @@ -6869,12 +6924,24 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-source@7.25.9': resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.27.1': resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} engines: {node: '>=6.9.0'} @@ -9043,6 +9110,9 @@ packages: '@types/react-dom': optional: true + '@rolldown/pluginutils@1.0.0-beta.11': + resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -9976,8 +10046,8 @@ packages: '@types/express-serve-static-core@5.0.6': resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -10193,6 +10263,12 @@ packages: peerDependencies: vite: 6.3.5 + '@vitejs/plugin-react@4.5.2': + resolution: {integrity: sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: 6.3.5 + '@vitest/browser@3.0.6': resolution: {integrity: sha512-FqKwCAkALZfNzGNx4YvRJa6HCWM2USWTjOdNO2egI/s6+3WkIl4xAlYISOARLJLDAI3yCXcpTtuUUF39K8TQgw==} peerDependencies: @@ -10937,8 +11013,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.7.5: - resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} + compression@1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} engines: {node: '>= 0.8.0'} computeds@0.0.1: @@ -11971,6 +12047,10 @@ packages: get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -12494,6 +12574,10 @@ packages: resolution: {integrity: sha512-RqCFY3cJy3c2y1I+rMn81cfzAR4XJwfPBC+M8kffUjbPzxApzyyv7Tbm1C/gXXq2dSCuD238pKFEWlQMTWsTFw==} engines: {node: '>=18'} + isbot@5.1.28: + resolution: {integrity: sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -13722,6 +13806,10 @@ packages: resolution: {integrity: sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==} engines: {node: '>=0.10.0'} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -14587,6 +14675,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} @@ -15456,11 +15549,21 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -17756,6 +17859,8 @@ snapshots: '@types/react': 19.0.8 '@types/react-dom': 19.0.3(@types/react@19.0.8) + '@rolldown/pluginutils@1.0.0-beta.11': {} + '@rollup/plugin-alias@5.1.1(rollup@4.41.1)': optionalDependencies: rollup: 4.41.1 @@ -18614,23 +18719,23 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 - '@trpc/client@11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.2))(typescript@5.8.2)': + '@trpc/client@11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@trpc/server': 11.0.0-rc.772(typescript@5.8.2) - typescript: 5.8.2 + '@trpc/server': 11.0.0-rc.772(typescript@5.8.3) + typescript: 5.8.3 - '@trpc/server@11.0.0-rc.772(typescript@5.8.2)': + '@trpc/server@11.0.0-rc.772(typescript@5.8.3)': dependencies: - typescript: 5.8.2 + typescript: 5.8.3 - '@trpc/tanstack-react-query@11.0.0-rc.772(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.772(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2)': + '@trpc/tanstack-react-query@11.0.0-rc.772(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.0.0-rc.772(typescript@5.8.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)': dependencies: '@tanstack/react-query': 5.66.0(react@19.0.0) - '@trpc/client': 11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.2))(typescript@5.8.2) - '@trpc/server': 11.0.0-rc.772(typescript@5.8.2) + '@trpc/client': 11.0.0-rc.772(@trpc/server@11.0.0-rc.772(typescript@5.8.3))(typescript@5.8.3) + '@trpc/server': 11.0.0-rc.772(typescript@5.8.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - typescript: 5.8.2 + typescript: 5.8.3 '@tybys/wasm-util@0.9.0': dependencies: @@ -18698,7 +18803,7 @@ snapshots: '@types/cookies@0.9.0': dependencies: '@types/connect': 3.4.38 - '@types/express': 4.17.21 + '@types/express': 4.17.23 '@types/keygrip': 1.0.6 '@types/node': 22.13.4 @@ -18732,7 +18837,7 @@ snapshots: '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - '@types/express@4.17.21': + '@types/express@4.17.23': dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.19.6 @@ -18823,7 +18928,7 @@ snapshots: '@types/serve-index@1.9.4': dependencies: - '@types/express': 4.17.21 + '@types/express': 4.17.23 '@types/serve-static@1.15.7': dependencies: @@ -18887,10 +18992,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/rule-tester@8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3) ajv: 6.12.6 eslint: 9.22.0(jiti@2.4.2) json-stable-stringify-without-jsonify: 1.0.1 @@ -18964,6 +19069,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.23.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/visitor-keys': 8.23.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.0.1(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.22.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0(jiti@2.4.2)) @@ -18986,6 +19105,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.23.0 + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.8.3) + eslint: 9.22.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.22.0': dependencies: '@typescript-eslint/types': 8.22.0 @@ -19026,6 +19156,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@rolldown/pluginutils': 1.0.0-beta.11 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - supports-color + '@vitest/browser@3.0.6(@types/node@22.13.4)(playwright@1.52.0)(typescript@5.8.2)(vite@6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.0.6)': dependencies: '@testing-library/dom': 10.4.0 @@ -19899,7 +20041,7 @@ snapshots: dependencies: mime-db: 1.54.0 - compression@1.7.5: + compression@1.8.0: dependencies: bytes: 3.1.2 compressible: 2.0.18 @@ -20163,16 +20305,16 @@ snapshots: detective-stylus@5.0.1: {} - detective-typescript@14.0.0(typescript@5.8.2): + detective-typescript@14.0.0(typescript@5.8.3): dependencies: - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.8.3) ast-module-types: 6.0.1 node-source-walk: 7.0.1 - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - detective-vue2@2.2.0(typescript@5.8.2): + detective-vue2@2.2.0(typescript@5.8.3): dependencies: '@dependents/detective-less': 5.0.1 '@vue/compiler-sfc': 3.5.14 @@ -20180,8 +20322,8 @@ snapshots: detective-sass: 6.0.1 detective-scss: 5.0.1 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.8.2) - typescript: 5.8.2 + detective-typescript: 14.0.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -20639,16 +20781,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-solid@0.14.5(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2): + eslint-plugin-solid@0.14.5(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/utils': 8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/utils': 8.23.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.22.0(jiti@2.4.2) estraverse: 5.3.0 is-html: 2.0.0 kebab-case: 1.0.2 known-css-properties: 0.30.0 style-to-object: 1.0.8 - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -21078,6 +21220,8 @@ snapshots: get-port-please@3.1.2: {} + get-port@7.1.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -21333,7 +21477,7 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.7(@types/express@4.17.21): + http-proxy-middleware@2.0.7(@types/express@4.17.23): dependencies: '@types/http-proxy': 1.17.15 http-proxy: 1.18.1 @@ -21341,7 +21485,7 @@ snapshots: is-plain-obj: 3.0.0 micromatch: 4.0.8 optionalDependencies: - '@types/express': 4.17.21 + '@types/express': 4.17.23 transitivePeerDependencies: - debug @@ -21450,7 +21594,7 @@ snapshots: dependencies: '@peculiar/webcrypto': 1.5.0 '@types/cookie': 0.5.4 - '@types/express': 4.17.21 + '@types/express': 4.17.23 '@types/koa': 2.15.0 '@types/node': 17.0.45 cookie: 0.5.0 @@ -21595,6 +21739,8 @@ snapshots: isbot@5.1.22: {} + isbot@5.1.28: {} + isexe@2.0.0: {} isobject@3.0.1: {} @@ -22727,12 +22873,12 @@ snapshots: detective-sass: 6.0.1 detective-scss: 5.0.1 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.8.2) - detective-vue2: 2.2.0(typescript@5.8.2) + detective-typescript: 14.0.0(typescript@5.8.3) + detective-vue2: 2.2.0(typescript@5.8.3) module-definition: 6.0.1 node-source-walk: 7.0.1 postcss: 8.5.3 - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -22941,6 +23087,8 @@ snapshots: react-refresh@0.16.0: {} + react-refresh@0.17.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.0.8)(react@19.0.0): dependencies: react: 19.0.0 @@ -23773,6 +23921,10 @@ snapshots: dependencies: typescript: 5.8.2 + ts-api-utils@2.0.1(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + ts-declaration-location@1.0.5(typescript@5.8.2): dependencies: minimatch: 10.0.1 @@ -23860,6 +24012,8 @@ snapshots: typescript@5.8.2: {} + typescript@5.8.3: {} + uc.micro@2.1.0: {} ufo@1.6.1: {} @@ -24050,6 +24204,10 @@ snapshots: optionalDependencies: typescript: 5.8.2 + valibot@1.0.0-beta.15(typescript@5.8.3): + optionalDependencies: + typescript: 5.8.3 + validate-html-nesting@1.2.2: {} validate-npm-package-license@3.0.4: @@ -24310,7 +24468,7 @@ snapshots: dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 + '@types/express': 4.17.23 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.7 '@types/sockjs': 0.3.36 @@ -24319,11 +24477,11 @@ snapshots: bonjour-service: 1.3.0 chokidar: 3.6.0 colorette: 2.0.20 - compression: 1.7.5 + compression: 1.8.0 connect-history-api-fallback: 2.0.0 express: 4.21.2 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.7(@types/express@4.17.21) + http-proxy-middleware: 2.0.7(@types/express@4.17.23) ipaddr.js: 2.2.0 launch-editor: 2.9.1 open: 10.1.0