@tanstack/start-client-core 1.152.0 → 1.153.1

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.
@@ -1,10 +1,12 @@
1
1
  import { TSS_SERVER_FUNCTION } from "../constants.js";
2
+ import { getStartOptions } from "../getStartOptions.js";
2
3
  import { serverFnFetcher } from "./serverFnFetcher.js";
3
4
  function createClientRpc(functionId) {
4
5
  const url = process.env.TSS_SERVER_FN_BASE + functionId;
5
6
  const serverFnMeta = { id: functionId };
6
7
  const clientFn = (...args) => {
7
- return serverFnFetcher(url, args, fetch);
8
+ const startFetch = getStartOptions()?.serverFns?.fetch;
9
+ return serverFnFetcher(url, args, startFetch ?? fetch);
8
10
  };
9
11
  return Object.assign(clientFn, {
10
12
  url,
@@ -1 +1 @@
1
- {"version":3,"file":"createClientRpc.js","sources":["../../../src/client-rpc/createClientRpc.ts"],"sourcesContent":["import { TSS_SERVER_FUNCTION } from '../constants'\nimport { serverFnFetcher } from './serverFnFetcher'\nimport type { ClientFnMeta } from '../constants'\n\nexport function createClientRpc(functionId: string) {\n const url = process.env.TSS_SERVER_FN_BASE + functionId\n const serverFnMeta: ClientFnMeta = { id: functionId }\n\n const clientFn = (...args: Array<any>) => {\n return serverFnFetcher(url, args, fetch)\n }\n\n return Object.assign(clientFn, {\n url,\n serverFnMeta,\n [TSS_SERVER_FUNCTION]: true,\n })\n}\n"],"names":[],"mappings":";;AAIO,SAAS,gBAAgB,YAAoB;AAClD,QAAM,MAAM,QAAQ,IAAI,qBAAqB;AAC7C,QAAM,eAA6B,EAAE,IAAI,WAAA;AAEzC,QAAM,WAAW,IAAI,SAAqB;AACxC,WAAO,gBAAgB,KAAK,MAAM,KAAK;AAAA,EACzC;AAEA,SAAO,OAAO,OAAO,UAAU;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,CAAC,mBAAmB,GAAG;AAAA,EAAA,CACxB;AACH;"}
1
+ {"version":3,"file":"createClientRpc.js","sources":["../../../src/client-rpc/createClientRpc.ts"],"sourcesContent":["import { TSS_SERVER_FUNCTION } from '../constants'\nimport { getStartOptions } from '../getStartOptions'\nimport { serverFnFetcher } from './serverFnFetcher'\nimport type { ClientFnMeta } from '../constants'\n\nexport function createClientRpc(functionId: string) {\n const url = process.env.TSS_SERVER_FN_BASE + functionId\n const serverFnMeta: ClientFnMeta = { id: functionId }\n\n const clientFn = (...args: Array<any>) => {\n const startFetch = getStartOptions()?.serverFns?.fetch\n return serverFnFetcher(url, args, startFetch ?? fetch)\n }\n\n return Object.assign(clientFn, {\n url,\n serverFnMeta,\n [TSS_SERVER_FUNCTION]: true,\n })\n}\n"],"names":[],"mappings":";;;AAKO,SAAS,gBAAgB,YAAoB;AAClD,QAAM,MAAM,QAAQ,IAAI,qBAAqB;AAC7C,QAAM,eAA6B,EAAE,IAAI,WAAA;AAEzC,QAAM,WAAW,IAAI,SAAqB;AACxC,UAAM,aAAa,mBAAmB,WAAW;AACjD,WAAO,gBAAgB,KAAK,MAAM,cAAc,KAAK;AAAA,EACvD;AAEA,SAAO,OAAO,OAAO,UAAU;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,CAAC,mBAAmB,GAAG;AAAA,EAAA,CACxB;AACH;"}
@@ -1,5 +1,6 @@
1
1
  import { TSS_SERVER_FUNCTION } from './constants.js';
2
2
  import { AnyFunctionMiddleware, AnyRequestMiddleware, CreateMiddlewareFn } from './createMiddleware.js';
3
+ import { CustomFetch } from './createServerFn.js';
3
4
  import { AnySerializationAdapter, Register, SSROption } from '@tanstack/router-core';
4
5
  export interface StartInstanceOptions<in out TSerializationAdapters, in out TDefaultSsr, in out TRequestMiddlewares, in out TFunctionMiddlewares> {
5
6
  '~types': StartInstanceTypes<TSerializationAdapters, TDefaultSsr, TRequestMiddlewares, TFunctionMiddlewares>;
@@ -7,6 +8,25 @@ export interface StartInstanceOptions<in out TSerializationAdapters, in out TDef
7
8
  defaultSsr?: TDefaultSsr;
8
9
  requestMiddleware?: TRequestMiddlewares;
9
10
  functionMiddleware?: TFunctionMiddlewares;
11
+ /**
12
+ * Configuration options for server functions.
13
+ */
14
+ serverFns?: {
15
+ /**
16
+ * A custom fetch implementation to use for all server function calls.
17
+ * This can be overridden by middleware or at the call site.
18
+ *
19
+ * Precedence (highest to lowest):
20
+ * 1. Call site: `serverFn({ fetch: customFetch })`
21
+ * 2. Later middleware: Last middleware in chain that provides `fetch`
22
+ * 3. Earlier middleware: First middleware in chain that provides `fetch`
23
+ * 4. createStart: `createStart({ serverFns: { fetch: customFetch } })`
24
+ * 5. Default: Global `fetch` function
25
+ *
26
+ * @note Only applies on the client side. During SSR, server functions are called directly.
27
+ */
28
+ fetch?: CustomFetch;
29
+ };
10
30
  }
11
31
  export interface StartInstance<in out TSerializationAdapters, in out TDefaultSsr, in out TRequestMiddlewares, in out TFunctionMiddlewares> {
12
32
  getOptions: () => Promise<StartInstanceOptions<TSerializationAdapters, TDefaultSsr, TRequestMiddlewares, TFunctionMiddlewares>> | StartInstanceOptions<TSerializationAdapters, TDefaultSsr, TRequestMiddlewares, TFunctionMiddlewares>;
@@ -1 +1 @@
1
- {"version":3,"file":"createStart.js","sources":["../../src/createStart.ts"],"sourcesContent":["import { createMiddleware } from './createMiddleware'\nimport type { TSS_SERVER_FUNCTION } from './constants'\nimport type {\n AnyFunctionMiddleware,\n AnyRequestMiddleware,\n CreateMiddlewareFn,\n} from './createMiddleware'\nimport type {\n AnySerializationAdapter,\n Register,\n SSROption,\n} from '@tanstack/router-core'\n\nexport interface StartInstanceOptions<\n in out TSerializationAdapters,\n in out TDefaultSsr,\n in out TRequestMiddlewares,\n in out TFunctionMiddlewares,\n> {\n '~types': StartInstanceTypes<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >\n serializationAdapters?: TSerializationAdapters\n defaultSsr?: TDefaultSsr\n requestMiddleware?: TRequestMiddlewares\n functionMiddleware?: TFunctionMiddlewares\n}\n\nexport interface StartInstance<\n in out TSerializationAdapters,\n in out TDefaultSsr,\n in out TRequestMiddlewares,\n in out TFunctionMiddlewares,\n> {\n getOptions: () =>\n | Promise<\n StartInstanceOptions<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >\n >\n | StartInstanceOptions<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >\n createMiddleware: CreateMiddlewareFn<Register>\n}\n\nexport interface StartInstanceTypes<\n in out TSerializationAdapters,\n in out TDefaultSsr,\n in out TRequestMiddlewares,\n in out TFunctionMiddlewares,\n> {\n serializationAdapters: TSerializationAdapters\n defaultSsr: TDefaultSsr\n requestMiddleware: TRequestMiddlewares\n functionMiddleware: TFunctionMiddlewares\n}\n\nfunction dedupeSerializationAdapters(\n deduped: Set<AnySerializationAdapter>,\n serializationAdapters: Array<AnySerializationAdapter>,\n): void {\n for (let i = 0, len = serializationAdapters.length; i < len; i++) {\n const current = serializationAdapters[i]!\n if (!deduped.has(current)) {\n deduped.add(current)\n if (current.extends) {\n dedupeSerializationAdapters(deduped, current.extends)\n }\n }\n }\n}\n\nexport const createStart = <\n const TSerializationAdapters extends ReadonlyArray<AnySerializationAdapter> =\n [],\n TDefaultSsr extends SSROption = SSROption,\n const TRequestMiddlewares extends ReadonlyArray<AnyRequestMiddleware> = [],\n const TFunctionMiddlewares extends ReadonlyArray<AnyFunctionMiddleware> = [],\n>(\n getOptions: () =>\n | Promise<\n Omit<\n StartInstanceOptions<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >,\n '~types'\n >\n >\n | Omit<\n StartInstanceOptions<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >,\n '~types'\n >,\n): StartInstance<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n> => {\n return {\n getOptions: async () => {\n const options = await getOptions()\n if (options.serializationAdapters) {\n const deduped = new Set<AnySerializationAdapter>()\n dedupeSerializationAdapters(\n deduped,\n options.serializationAdapters as unknown as Array<AnySerializationAdapter>,\n )\n options.serializationAdapters = Array.from(deduped) as any\n }\n return options\n },\n createMiddleware: createMiddleware as any,\n } as StartInstance<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >\n}\n\nexport type AnyStartInstance = StartInstance<any, any, any, any>\nexport type AnyStartInstanceOptions = StartInstanceOptions<any, any, any, any>\n\ndeclare module '@tanstack/router-core' {\n interface SerializableExtensions {\n serverFn: { [TSS_SERVER_FUNCTION]: true }\n }\n}\n"],"names":[],"mappings":";AAmEA,SAAS,4BACP,SACA,uBACM;AACN,WAAS,IAAI,GAAG,MAAM,sBAAsB,QAAQ,IAAI,KAAK,KAAK;AAChE,UAAM,UAAU,sBAAsB,CAAC;AACvC,QAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACzB,cAAQ,IAAI,OAAO;AACnB,UAAI,QAAQ,SAAS;AACnB,oCAA4B,SAAS,QAAQ,OAAO;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,cAAc,CAOzB,eA0BG;AACH,SAAO;AAAA,IACL,YAAY,YAAY;AACtB,YAAM,UAAU,MAAM,WAAA;AACtB,UAAI,QAAQ,uBAAuB;AACjC,cAAM,8BAAc,IAAA;AACpB;AAAA,UACE;AAAA,UACA,QAAQ;AAAA,QAAA;AAEV,gBAAQ,wBAAwB,MAAM,KAAK,OAAO;AAAA,MACpD;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,EAAA;AAOJ;"}
1
+ {"version":3,"file":"createStart.js","sources":["../../src/createStart.ts"],"sourcesContent":["import { createMiddleware } from './createMiddleware'\nimport type { TSS_SERVER_FUNCTION } from './constants'\nimport type {\n AnyFunctionMiddleware,\n AnyRequestMiddleware,\n CreateMiddlewareFn,\n} from './createMiddleware'\nimport type { CustomFetch } from './createServerFn'\nimport type {\n AnySerializationAdapter,\n Register,\n SSROption,\n} from '@tanstack/router-core'\n\nexport interface StartInstanceOptions<\n in out TSerializationAdapters,\n in out TDefaultSsr,\n in out TRequestMiddlewares,\n in out TFunctionMiddlewares,\n> {\n '~types': StartInstanceTypes<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >\n serializationAdapters?: TSerializationAdapters\n defaultSsr?: TDefaultSsr\n requestMiddleware?: TRequestMiddlewares\n functionMiddleware?: TFunctionMiddlewares\n /**\n * Configuration options for server functions.\n */\n serverFns?: {\n /**\n * A custom fetch implementation to use for all server function calls.\n * This can be overridden by middleware or at the call site.\n *\n * Precedence (highest to lowest):\n * 1. Call site: `serverFn({ fetch: customFetch })`\n * 2. Later middleware: Last middleware in chain that provides `fetch`\n * 3. Earlier middleware: First middleware in chain that provides `fetch`\n * 4. createStart: `createStart({ serverFns: { fetch: customFetch } })`\n * 5. Default: Global `fetch` function\n *\n * @note Only applies on the client side. During SSR, server functions are called directly.\n */\n fetch?: CustomFetch\n }\n}\n\nexport interface StartInstance<\n in out TSerializationAdapters,\n in out TDefaultSsr,\n in out TRequestMiddlewares,\n in out TFunctionMiddlewares,\n> {\n getOptions: () =>\n | Promise<\n StartInstanceOptions<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >\n >\n | StartInstanceOptions<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >\n createMiddleware: CreateMiddlewareFn<Register>\n}\n\nexport interface StartInstanceTypes<\n in out TSerializationAdapters,\n in out TDefaultSsr,\n in out TRequestMiddlewares,\n in out TFunctionMiddlewares,\n> {\n serializationAdapters: TSerializationAdapters\n defaultSsr: TDefaultSsr\n requestMiddleware: TRequestMiddlewares\n functionMiddleware: TFunctionMiddlewares\n}\n\nfunction dedupeSerializationAdapters(\n deduped: Set<AnySerializationAdapter>,\n serializationAdapters: Array<AnySerializationAdapter>,\n): void {\n for (let i = 0, len = serializationAdapters.length; i < len; i++) {\n const current = serializationAdapters[i]!\n if (!deduped.has(current)) {\n deduped.add(current)\n if (current.extends) {\n dedupeSerializationAdapters(deduped, current.extends)\n }\n }\n }\n}\n\nexport const createStart = <\n const TSerializationAdapters extends ReadonlyArray<AnySerializationAdapter> =\n [],\n TDefaultSsr extends SSROption = SSROption,\n const TRequestMiddlewares extends ReadonlyArray<AnyRequestMiddleware> = [],\n const TFunctionMiddlewares extends ReadonlyArray<AnyFunctionMiddleware> = [],\n>(\n getOptions: () =>\n | Promise<\n Omit<\n StartInstanceOptions<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >,\n '~types'\n >\n >\n | Omit<\n StartInstanceOptions<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >,\n '~types'\n >,\n): StartInstance<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n> => {\n return {\n getOptions: async () => {\n const options = await getOptions()\n if (options.serializationAdapters) {\n const deduped = new Set<AnySerializationAdapter>()\n dedupeSerializationAdapters(\n deduped,\n options.serializationAdapters as unknown as Array<AnySerializationAdapter>,\n )\n options.serializationAdapters = Array.from(deduped) as any\n }\n return options\n },\n createMiddleware: createMiddleware as any,\n } as StartInstance<\n TSerializationAdapters,\n TDefaultSsr,\n TRequestMiddlewares,\n TFunctionMiddlewares\n >\n}\n\nexport type AnyStartInstance = StartInstance<any, any, any, any>\nexport type AnyStartInstanceOptions = StartInstanceOptions<any, any, any, any>\n\ndeclare module '@tanstack/router-core' {\n interface SerializableExtensions {\n serverFn: { [TSS_SERVER_FUNCTION]: true }\n }\n}\n"],"names":[],"mappings":";AAuFA,SAAS,4BACP,SACA,uBACM;AACN,WAAS,IAAI,GAAG,MAAM,sBAAsB,QAAQ,IAAI,KAAK,KAAK;AAChE,UAAM,UAAU,sBAAsB,CAAC;AACvC,QAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACzB,cAAQ,IAAI,OAAO;AACnB,UAAI,QAAQ,SAAS;AACnB,oCAA4B,SAAS,QAAQ,OAAO;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,cAAc,CAOzB,eA0BG;AACH,SAAO;AAAA,IACL,YAAY,YAAY;AACtB,YAAM,UAAU,MAAM,WAAA;AACtB,UAAI,QAAQ,uBAAuB;AACjC,cAAM,8BAAc,IAAA;AACpB;AAAA,UACE;AAAA,UACA,QAAQ;AAAA,QAAA;AAEV,gBAAQ,wBAAwB,MAAM,KAAK,OAAO;AAAA,MACpD;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,EAAA;AAOJ;"}
@@ -12,7 +12,7 @@ export type { FrameType as FrameTypeValue, ClientFnMeta, ServerFnMeta, } from '.
12
12
  export type * from './serverRoute.js';
13
13
  export type * from './startEntry.js';
14
14
  export { createStart } from './createStart.js';
15
- export type { AnyStartInstance, AnyStartInstanceOptions, StartInstance, } from './createStart.js';
15
+ export type { AnyStartInstance, AnyStartInstanceOptions, StartInstance, StartInstanceOptions, } from './createStart.js';
16
16
  export type { Register } from '@tanstack/router-core';
17
17
  export { getRouterInstance } from './getRouterInstance.js';
18
18
  export { getDefaultSerovalPlugins } from './getDefaultSerovalPlugins.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/start-client-core",
3
- "version": "1.152.0",
3
+ "version": "1.153.1",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -66,9 +66,9 @@
66
66
  "seroval": "^1.4.1",
67
67
  "tiny-invariant": "^1.3.3",
68
68
  "tiny-warning": "^1.0.3",
69
- "@tanstack/router-core": "1.151.6",
69
+ "@tanstack/router-core": "1.153.1",
70
70
  "@tanstack/start-fn-stubs": "1.151.3",
71
- "@tanstack/start-storage-context": "1.151.6"
71
+ "@tanstack/start-storage-context": "1.153.1"
72
72
  },
73
73
  "scripts": {
74
74
  "clean": "rimraf ./dist && rimraf ./coverage",
@@ -1,4 +1,5 @@
1
1
  import { TSS_SERVER_FUNCTION } from '../constants'
2
+ import { getStartOptions } from '../getStartOptions'
2
3
  import { serverFnFetcher } from './serverFnFetcher'
3
4
  import type { ClientFnMeta } from '../constants'
4
5
 
@@ -7,7 +8,8 @@ export function createClientRpc(functionId: string) {
7
8
  const serverFnMeta: ClientFnMeta = { id: functionId }
8
9
 
9
10
  const clientFn = (...args: Array<any>) => {
10
- return serverFnFetcher(url, args, fetch)
11
+ const startFetch = getStartOptions()?.serverFns?.fetch
12
+ return serverFnFetcher(url, args, startFetch ?? fetch)
11
13
  }
12
14
 
13
15
  return Object.assign(clientFn, {
@@ -5,6 +5,7 @@ import type {
5
5
  AnyRequestMiddleware,
6
6
  CreateMiddlewareFn,
7
7
  } from './createMiddleware'
8
+ import type { CustomFetch } from './createServerFn'
8
9
  import type {
9
10
  AnySerializationAdapter,
10
11
  Register,
@@ -27,6 +28,25 @@ export interface StartInstanceOptions<
27
28
  defaultSsr?: TDefaultSsr
28
29
  requestMiddleware?: TRequestMiddlewares
29
30
  functionMiddleware?: TFunctionMiddlewares
31
+ /**
32
+ * Configuration options for server functions.
33
+ */
34
+ serverFns?: {
35
+ /**
36
+ * A custom fetch implementation to use for all server function calls.
37
+ * This can be overridden by middleware or at the call site.
38
+ *
39
+ * Precedence (highest to lowest):
40
+ * 1. Call site: `serverFn({ fetch: customFetch })`
41
+ * 2. Later middleware: Last middleware in chain that provides `fetch`
42
+ * 3. Earlier middleware: First middleware in chain that provides `fetch`
43
+ * 4. createStart: `createStart({ serverFns: { fetch: customFetch } })`
44
+ * 5. Default: Global `fetch` function
45
+ *
46
+ * @note Only applies on the client side. During SSR, server functions are called directly.
47
+ */
48
+ fetch?: CustomFetch
49
+ }
30
50
  }
31
51
 
32
52
  export interface StartInstance<
package/src/index.tsx CHANGED
@@ -109,6 +109,7 @@ export type {
109
109
  AnyStartInstance,
110
110
  AnyStartInstanceOptions,
111
111
  StartInstance,
112
+ StartInstanceOptions,
112
113
  } from './createStart'
113
114
  export type { Register } from '@tanstack/router-core'
114
115