@tanstack/react-start 1.168.60 → 1.169.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,6 @@ import { RequestHandler } from '@tanstack/react-start/server';
3
3
  export type ServerEntry = {
4
4
  fetch: RequestHandler<Register>;
5
5
  };
6
- export declare function createServerEntry(entry: ServerEntry): ServerEntry;
6
+ export declare const createServerEntry: (entry: ServerEntry) => ServerEntry;
7
7
  declare const _default: ServerEntry;
8
8
  export default _default;
@@ -1,11 +1,7 @@
1
- import { createStartHandler, defaultStreamHandler } from "@tanstack/react-start/server";
1
+ import { createServerEntry as createServerEntry$1, createStartHandler, defaultStreamHandler } from "@tanstack/react-start/server";
2
2
  //#region src/default-entry/server.ts
3
3
  var fetch = createStartHandler(defaultStreamHandler);
4
- function createServerEntry(entry) {
5
- return { async fetch(...args) {
6
- return await entry.fetch(...args);
7
- } };
8
- }
4
+ var createServerEntry = createServerEntry$1;
9
5
  var server_default = createServerEntry({ fetch });
10
6
  //#endregion
11
7
  export { createServerEntry, server_default as default };
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","names":[],"sources":["../../../src/default-entry/server.ts"],"sourcesContent":["import {\n createStartHandler,\n defaultStreamHandler,\n} from '@tanstack/react-start/server'\nimport type { Register } from '@tanstack/react-router'\nimport type { RequestHandler } from '@tanstack/react-start/server'\n\nconst fetch = createStartHandler(defaultStreamHandler)\n\n// Providing `RequestHandler` from `@tanstack/react-start/server` is required so that the output types don't import it from `@tanstack/start-server-core`\nexport type ServerEntry = { fetch: RequestHandler<Register> }\n\nexport function createServerEntry(entry: ServerEntry): ServerEntry {\n return {\n async fetch(...args) {\n return await entry.fetch(...args)\n },\n }\n}\n\nexport default createServerEntry({ fetch })\n"],"mappings":";;AAOA,IAAM,QAAQ,mBAAmB,oBAAoB;AAKrD,SAAgB,kBAAkB,OAAiC;CACjE,OAAO,EACL,MAAM,MAAM,GAAG,MAAM;EACnB,OAAO,MAAM,MAAM,MAAM,GAAG,IAAI;CAClC,EACF;AACF;AAEA,IAAA,iBAAe,kBAAkB,EAAE,MAAM,CAAC"}
1
+ {"version":3,"file":"server.js","names":["createCoreServerEntry"],"sources":["../../../src/default-entry/server.ts"],"sourcesContent":["import {\n createStartHandler,\n defaultStreamHandler,\n createServerEntry as createCoreServerEntry,\n} from '@tanstack/react-start/server'\nimport type { Register } from '@tanstack/react-router'\nimport type { RequestHandler } from '@tanstack/react-start/server'\n\nconst fetch = createStartHandler(defaultStreamHandler)\n\n// Providing `RequestHandler` from `@tanstack/react-start/server` is required so that the output types don't import it from `@tanstack/start-server-core`\nexport type ServerEntry = { fetch: RequestHandler<Register> }\n\n// Bind the shared request context and fallback error handling to React's Register.\nexport const createServerEntry: (entry: ServerEntry) => ServerEntry =\n createCoreServerEntry<Register>\n\nexport default createServerEntry({ fetch })\n"],"mappings":";;AAQA,IAAM,QAAQ,mBAAmB,oBAAoB;AAMrD,IAAa,oBACXA;AAEF,IAAA,iBAAe,kBAAkB,EAAE,MAAM,CAAC"}
@@ -1,2 +1 @@
1
- import { condition, idle, interaction, load, media, never, visible } from "@tanstack/react-start-client/hydration";
2
- export { condition, idle, interaction, load, media, never, visible };
1
+ export { condition, idle, interaction, load, media, never, visible } from "@tanstack/react-start-client/hydration";
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","names":[],"sources":["../../../src/plugin/shared.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url'\nimport path from 'pathe'\n\nconst currentDir = path.dirname(fileURLToPath(import.meta.url))\nexport const reactStartPluginDir = currentDir\nconst defaultEntryDir = path.resolve(\n currentDir,\n '..',\n '..',\n 'plugin',\n 'default-entry',\n)\n\nexport const reactStartDefaultEntryPaths = {\n client: path.resolve(defaultEntryDir, 'client.tsx'),\n server: path.resolve(defaultEntryDir, 'server.ts'),\n start: path.resolve(defaultEntryDir, 'start.ts'),\n}\n\nexport function resolvePackageEntryPath(packageName: string): string {\n return fileURLToPath(import.meta.resolve(packageName))\n}\n"],"mappings":";;;AAGA,IAAM,aAAa,KAAK,QAAQ,cAAc,OAAO,KAAK,GAAG,CAAC;AAC9D,IAAa,sBAAsB;AACnC,IAAM,kBAAkB,KAAK,QAC3B,YACA,MACA,MACA,UACA,eACF;AAEA,IAAa,8BAA8B;CACzC,QAAQ,KAAK,QAAQ,iBAAiB,YAAY;CAClD,QAAQ,KAAK,QAAQ,iBAAiB,WAAW;CACjD,OAAO,KAAK,QAAQ,iBAAiB,UAAU;AACjD"}
1
+ {"version":3,"file":"shared.js","names":[],"sources":["../../../src/plugin/shared.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url'\nimport path from 'pathe'\n\nconst currentDir = path.dirname(fileURLToPath(import.meta.url))\nexport const reactStartPluginDir = currentDir\nconst defaultEntryDir = path.resolve(\n currentDir,\n '..',\n '..',\n 'plugin',\n 'default-entry',\n)\n\nexport const reactStartDefaultEntryPaths = {\n client: path.resolve(defaultEntryDir, 'client.tsx'),\n server: path.resolve(defaultEntryDir, 'server.ts'),\n start: path.resolve(defaultEntryDir, 'start.ts'),\n}\n\nexport function resolvePackageEntryPath(packageName: string): string {\n return fileURLToPath(import.meta.resolve(packageName))\n}\n"],"mappings":";;;AAGA,IAAM,aAAa,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAC9D,IAAa,sBAAsB;AACnC,IAAM,kBAAkB,KAAK,QAC3B,YACA,MACA,MACA,UACA,eACF;AAEA,IAAa,8BAA8B;CACzC,QAAQ,KAAK,QAAQ,iBAAiB,YAAY;CAClD,QAAQ,KAAK,QAAQ,iBAAiB,WAAW;CACjD,OAAO,KAAK,QAAQ,iBAAiB,UAAU;AACjD"}
@@ -1,2 +1 @@
1
- import { rscSerializationAdapter } from "@tanstack/react-start-rsc/serialization.client";
2
- export { rscSerializationAdapter };
1
+ export { rscSerializationAdapter } from "@tanstack/react-start-rsc/serialization.client";
@@ -1,2 +1 @@
1
- import { rscSerializationAdapter } from "@tanstack/react-start-rsc/serialization.server";
2
- export { rscSerializationAdapter };
1
+ export { rscSerializationAdapter } from "@tanstack/react-start-rsc/serialization.server";
@@ -1,2 +1 @@
1
- import { createServerRpc } from "@tanstack/start-server-core/createServerRpc";
2
- export { createServerRpc };
1
+ export { createServerRpc } from "@tanstack/start-server-core/createServerRpc";
@@ -1,2 +1 @@
1
- import { createSsrRpc } from "@tanstack/start-server-core/createSsrRpc";
2
- export { createSsrRpc };
1
+ export { createSsrRpc } from "@tanstack/start-server-core/createSsrRpc";
@@ -1 +1 @@
1
- {"version":3,"file":"useServerFn.js","names":[],"sources":["../../src/useServerFn.ts"],"sourcesContent":["import * as React from 'react'\nimport { isRedirect, useRouter } from '@tanstack/react-router'\n\nexport function useServerFn<T extends (...deps: Array<any>) => Promise<any>>(\n serverFn: T,\n): (...args: Parameters<T>) => ReturnType<T> {\n const router = useRouter()\n\n return React.useCallback(\n async (...args: Array<any>) => {\n try {\n const res = await serverFn(...args)\n\n if (isRedirect(res)) {\n throw res\n }\n\n return res\n } catch (err) {\n if (isRedirect(err)) {\n err.options._fromLocation = router.stores.location.get()\n return router.navigate(router.resolveRedirect(err).options)\n }\n\n throw err\n }\n },\n [router, serverFn],\n ) as any\n}\n"],"mappings":";;;AAGA,SAAgB,YACd,UAC2C;CAC3C,MAAM,SAAS,UAAU;CAEzB,OAAO,MAAM,YACX,OAAO,GAAG,SAAqB;EAC7B,IAAI;GACF,MAAM,MAAM,MAAM,SAAS,GAAG,IAAI;GAElC,IAAI,WAAW,GAAG,GAChB,MAAM;GAGR,OAAO;EACT,SAAS,KAAK;GACZ,IAAI,WAAW,GAAG,GAAG;IACnB,IAAI,QAAQ,gBAAgB,OAAO,OAAO,SAAS,IAAI;IACvD,OAAO,OAAO,SAAS,OAAO,gBAAgB,GAAG,EAAE,OAAO;GAC5D;GAEA,MAAM;EACR;CACF,GACA,CAAC,QAAQ,QAAQ,CACnB;AACF"}
1
+ {"version":3,"file":"useServerFn.js","names":[],"sources":["../../src/useServerFn.ts"],"sourcesContent":["import * as React from 'react'\nimport { isRedirect, useRouter } from '@tanstack/react-router'\n\nexport function useServerFn<T extends (...deps: Array<any>) => Promise<any>>(\n serverFn: T,\n): (...args: Parameters<T>) => ReturnType<T> {\n const router = useRouter()\n\n return React.useCallback(\n async (...args: Array<any>) => {\n try {\n const res = await serverFn(...args)\n\n if (isRedirect(res)) {\n throw res\n }\n\n return res\n } catch (err) {\n if (isRedirect(err)) {\n err.options._fromLocation = router.stores.location.get()\n return router.navigate(router.resolveRedirect(err).options)\n }\n\n throw err\n }\n },\n [router, serverFn],\n ) as any\n}\n"],"mappings":";;;AAGA,SAAgB,YACd,UAC2C;CAC3C,MAAM,SAAS,UAAU;CAEzB,OAAO,MAAM,YACX,OAAO,GAAG,SAAqB;EAC7B,IAAI;GACF,MAAM,MAAM,MAAM,SAAS,GAAG,IAAI;GAElC,IAAI,WAAW,GAAG,GAChB,MAAM;GAGR,OAAO;EACT,SAAS,KAAK;GACZ,IAAI,WAAW,GAAG,GAAG;IACnB,IAAI,QAAQ,gBAAgB,OAAO,OAAO,SAAS,IAAI;IACvD,OAAO,OAAO,SAAS,OAAO,gBAAgB,GAAG,CAAC,CAAC,OAAO;GAC5D;GAEA,MAAM;EACR;CACF,GACA,CAAC,QAAQ,QAAQ,CACnB;AACF"}
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  createStartHandler,
3
3
  defaultStreamHandler,
4
+ createServerEntry as createCoreServerEntry,
4
5
  } from '@tanstack/react-start/server'
5
6
  import type { Register } from '@tanstack/react-router'
6
7
  import type { RequestHandler } from '@tanstack/react-start/server'
@@ -10,12 +11,8 @@ const fetch = createStartHandler(defaultStreamHandler)
10
11
  // Providing `RequestHandler` from `@tanstack/react-start/server` is required so that the output types don't import it from `@tanstack/start-server-core`
11
12
  export type ServerEntry = { fetch: RequestHandler<Register> }
12
13
 
13
- export function createServerEntry(entry: ServerEntry): ServerEntry {
14
- return {
15
- async fetch(...args) {
16
- return await entry.fetch(...args)
17
- },
18
- }
19
- }
14
+ // Bind the shared request context and fallback error handling to React's Register.
15
+ export const createServerEntry: (entry: ServerEntry) => ServerEntry =
16
+ createCoreServerEntry<Register>
20
17
 
21
18
  export default createServerEntry({ fetch })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/react-start",
3
- "version": "1.168.60",
3
+ "version": "1.169.0",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -155,20 +155,20 @@
155
155
  },
156
156
  "dependencies": {
157
157
  "pathe": "^2.0.3",
158
- "@tanstack/react-router": "1.170.41",
159
- "@tanstack/react-start-client": "1.168.39",
160
- "@tanstack/react-start-rsc": "0.1.59",
161
- "@tanstack/react-start-server": "1.167.46",
158
+ "@tanstack/react-router": "1.170.43",
159
+ "@tanstack/react-start-client": "1.168.41",
160
+ "@tanstack/react-start-rsc": "0.1.61",
161
+ "@tanstack/react-start-server": "1.167.48",
162
162
  "@tanstack/router-utils": "1.162.3",
163
- "@tanstack/start-client-core": "1.170.34",
164
- "@tanstack/start-plugin-core": "1.171.49",
165
- "@tanstack/start-server-core": "1.169.39"
163
+ "@tanstack/start-client-core": "1.170.36",
164
+ "@tanstack/start-plugin-core": "1.171.51",
165
+ "@tanstack/start-server-core": "1.169.41"
166
166
  },
167
167
  "peerDependencies": {
168
168
  "@rsbuild/core": "^2.0.0",
169
169
  "react": ">=18.0.0 || >=19.0.0",
170
170
  "react-dom": ">=18.0.0 || >=19.0.0",
171
- "vite": ">=7.0.0"
171
+ "vite": ">=8.0.0"
172
172
  },
173
173
  "peerDependenciesMeta": {
174
174
  "@rsbuild/core": {
@@ -74,10 +74,10 @@ Treat TanStack Start RSCs as fetchable React Flight payloads, not as a framework
74
74
 
75
75
  - Simple server fragment in a route loader -> `renderServerComponent`
76
76
  - Interactive slot inside server markup -> `createCompositeComponent`
77
- - Route component needs browser APIs but loader can still prefetch on the server -> `ssr: 'data-only'`
77
+ - Route component needs browser APIs but loader can still query on the server -> `ssr: 'data-only'`
78
78
  - Loader itself needs browser APIs -> `ssr: false`
79
79
  - Route cache key must include search params -> `loaderDeps`
80
- - Query-managed RSC -> `useSuspenseQuery` + SSR `ensureQueryData`
80
+ - Query-managed RSC -> `useSuspenseQuery` + SSR `query` with `staleTime: 'static'`
81
81
  - Multiple independent RSCs -> separate server functions + `Promise.all`
82
82
  - Multiple RSCs sharing data or invalidating together -> one server function returning many renderables or sources
83
83
  - Need isolated widget failures or staggered reveal -> return promises from the loader and resolve with `use()` inside Suspense
@@ -73,10 +73,13 @@ const postQueryOptions = (postId: string) => ({
73
73
  })
74
74
  ```
75
75
 
76
- For SSR reuse, prefetch in the route loader:
76
+ For SSR reuse, run a static query in the route loader so cached data is reused without a stale refetch:
77
77
 
78
78
  ```tsx
79
- await context.queryClient.ensureQueryData(postQueryOptions(params.postId))
79
+ await context.queryClient.query({
80
+ ...postQueryOptions(params.postId),
81
+ staleTime: 'static',
82
+ })
80
83
  ```
81
84
 
82
85
  Then read it with `useSuspenseQuery` in the component.
@@ -1,5 +1,5 @@
1
1
  // Query-owned RSC pattern.
2
- // Assumes your router context provides a queryClient for SSR prefetch.
2
+ // Assumes your router context provides a queryClient for SSR queries.
3
3
 
4
4
  import type { ReactNode } from 'react'
5
5
  import { createFileRoute } from '@tanstack/react-router'
@@ -68,7 +68,10 @@ const postQueryOptions = (postId: string) => ({
68
68
 
69
69
  export const Route = createFileRoute('/posts/$postId')({
70
70
  loader: async ({ context, params }) => {
71
- await context.queryClient.ensureQueryData(postQueryOptions(params.postId))
71
+ await context.queryClient.query({
72
+ ...postQueryOptions(params.postId),
73
+ staleTime: 'static',
74
+ })
72
75
  },
73
76
  component: PostPage,
74
77
  })
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  createStartHandler,
3
3
  defaultStreamHandler,
4
+ createServerEntry as createCoreServerEntry,
4
5
  } from '@tanstack/react-start/server'
5
6
  import type { Register } from '@tanstack/react-router'
6
7
  import type { RequestHandler } from '@tanstack/react-start/server'
@@ -10,12 +11,8 @@ const fetch = createStartHandler(defaultStreamHandler)
10
11
  // Providing `RequestHandler` from `@tanstack/react-start/server` is required so that the output types don't import it from `@tanstack/start-server-core`
11
12
  export type ServerEntry = { fetch: RequestHandler<Register> }
12
13
 
13
- export function createServerEntry(entry: ServerEntry): ServerEntry {
14
- return {
15
- async fetch(...args) {
16
- return await entry.fetch(...args)
17
- },
18
- }
19
- }
14
+ // Bind the shared request context and fallback error handling to React's Register.
15
+ export const createServerEntry: (entry: ServerEntry) => ServerEntry =
16
+ createCoreServerEntry<Register>
20
17
 
21
18
  export default createServerEntry({ fetch })