@tanstack/start-client-core 1.131.7 → 1.132.0-alpha.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.
Files changed (44) hide show
  1. package/dist/esm/createIsomorphicFn.js.map +1 -1
  2. package/dist/esm/createMiddleware.d.ts +1 -2
  3. package/dist/esm/createMiddleware.js.map +1 -1
  4. package/dist/esm/createServerFn.d.ts +3 -28
  5. package/dist/esm/createServerFn.js +9 -148
  6. package/dist/esm/createServerFn.js.map +1 -1
  7. package/dist/esm/envOnly.js.map +1 -1
  8. package/dist/esm/index.d.ts +2 -2
  9. package/dist/esm/index.js +1 -2
  10. package/dist/esm/registerGlobalMiddleware.js.map +1 -1
  11. package/dist/esm/serializer.js +0 -10
  12. package/dist/esm/serializer.js.map +1 -1
  13. package/package.json +3 -7
  14. package/src/createMiddleware.ts +0 -7
  15. package/src/createServerFn.ts +8 -319
  16. package/src/index.tsx +0 -3
  17. package/src/serializer.ts +0 -13
  18. package/src/tests/createServerFn.test-d.ts +0 -6
  19. package/dist/cjs/createIsomorphicFn.cjs +0 -12
  20. package/dist/cjs/createIsomorphicFn.cjs.map +0 -1
  21. package/dist/cjs/createIsomorphicFn.d.cts +0 -12
  22. package/dist/cjs/createMiddleware.cjs +0 -37
  23. package/dist/cjs/createMiddleware.cjs.map +0 -1
  24. package/dist/cjs/createMiddleware.d.cts +0 -177
  25. package/dist/cjs/createServerFn.cjs +0 -385
  26. package/dist/cjs/createServerFn.cjs.map +0 -1
  27. package/dist/cjs/createServerFn.d.cts +0 -159
  28. package/dist/cjs/envOnly.cjs +0 -7
  29. package/dist/cjs/envOnly.cjs.map +0 -1
  30. package/dist/cjs/envOnly.d.cts +0 -4
  31. package/dist/cjs/index.cjs +0 -40
  32. package/dist/cjs/index.cjs.map +0 -1
  33. package/dist/cjs/index.d.cts +0 -11
  34. package/dist/cjs/registerGlobalMiddleware.cjs +0 -9
  35. package/dist/cjs/registerGlobalMiddleware.cjs.map +0 -1
  36. package/dist/cjs/registerGlobalMiddleware.d.cts +0 -5
  37. package/dist/cjs/serializer.cjs +0 -162
  38. package/dist/cjs/serializer.cjs.map +0 -1
  39. package/dist/cjs/serializer.d.cts +0 -23
  40. package/dist/cjs/tests/createIsomorphicFn.test-d.d.cts +0 -1
  41. package/dist/cjs/tests/createServerFn.test-d.d.cts +0 -1
  42. package/dist/cjs/tests/createServerMiddleware.test-d.d.cts +0 -1
  43. package/dist/cjs/tests/envOnly.test-d.d.cts +0 -1
  44. package/dist/cjs/tests/serializer.test.d.cts +0 -1
package/dist/esm/index.js CHANGED
@@ -2,7 +2,7 @@ import { hydrate, json, mergeHeaders } from "@tanstack/router-core/ssr/client";
2
2
  import { startSerializer } from "./serializer.js";
3
3
  import { createIsomorphicFn } from "./createIsomorphicFn.js";
4
4
  import { clientOnly, serverOnly } from "./envOnly.js";
5
- import { applyMiddleware, createServerFn, execValidator, executeMiddleware, extractFormDataContext, flattenMiddlewares, serverFnBaseToMiddleware, serverFnStaticCache } from "./createServerFn.js";
5
+ import { applyMiddleware, createServerFn, execValidator, executeMiddleware, extractFormDataContext, flattenMiddlewares, serverFnBaseToMiddleware } from "./createServerFn.js";
6
6
  import { createMiddleware } from "./createMiddleware.js";
7
7
  import { globalMiddleware, registerGlobalMiddleware } from "./registerGlobalMiddleware.js";
8
8
  export {
@@ -21,7 +21,6 @@ export {
21
21
  mergeHeaders,
22
22
  registerGlobalMiddleware,
23
23
  serverFnBaseToMiddleware,
24
- serverFnStaticCache,
25
24
  serverOnly,
26
25
  startSerializer
27
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"registerGlobalMiddleware.js","sources":["../../src/registerGlobalMiddleware.ts"],"sourcesContent":["import type { AnyFunctionMiddleware } from './createMiddleware'\n\nexport const globalMiddleware: Array<AnyFunctionMiddleware> = []\n\nexport function registerGlobalMiddleware(options: {\n middleware: Array<AnyFunctionMiddleware>\n}) {\n globalMiddleware.push(...options.middleware)\n}\n"],"names":[],"mappings":"AAEO,MAAM,mBAAiD,CAAA;AAEvD,SAAS,yBAAyB,SAEtC;AACgB,mBAAA,KAAK,GAAG,QAAQ,UAAU;AAC7C;"}
1
+ {"version":3,"file":"registerGlobalMiddleware.js","sources":["../../src/registerGlobalMiddleware.ts"],"sourcesContent":["import type { AnyFunctionMiddleware } from './createMiddleware'\n\nexport const globalMiddleware: Array<AnyFunctionMiddleware> = []\n\nexport function registerGlobalMiddleware(options: {\n middleware: Array<AnyFunctionMiddleware>\n}) {\n globalMiddleware.push(...options.middleware)\n}\n"],"names":[],"mappings":"AAEO,MAAM,mBAAiD,CAAA;AAEvD,SAAS,yBAAyB,SAEtC;AACD,mBAAiB,KAAK,GAAG,QAAQ,UAAU;AAC7C;"}
@@ -144,16 +144,6 @@ const serializers = [
144
144
  (v) => v.toString(),
145
145
  // From
146
146
  (v) => BigInt(v)
147
- ),
148
- createSerializer(
149
- // Key
150
- "server-function",
151
- // Check
152
- (v) => typeof v === "function" && "functionId" in v && typeof v.functionId === "string",
153
- // To
154
- ({ functionId }) => ({ functionId, __serverFn: true }),
155
- // From, dummy impl. the actual server function lookup is done on the server in packages/start-server-core/src/server-functions-handler.ts
156
- (v) => v
157
147
  )
158
148
  ];
159
149
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"serializer.js","sources":["../../src/serializer.ts"],"sourcesContent":["import { isPlainObject } from '@tanstack/router-core'\n\nexport interface StartSerializer {\n stringify: (obj: unknown) => string\n parse: (str: string) => unknown\n encode: <T>(value: T) => T\n decode: <T>(value: T) => T\n}\n\nexport type SerializerStringifyBy<T, TSerializable> = T extends TSerializable\n ? T\n : T extends (...args: Array<any>) => any\n ? 'Function is not serializable'\n : { [K in keyof T]: SerializerStringifyBy<T[K], TSerializable> }\n\nexport type SerializerParseBy<T, TSerializable> = T extends TSerializable\n ? T\n : unknown extends SerializerExtensions['ReadableStream']\n ? { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }\n : T extends SerializerExtensions['ReadableStream']\n ? ReadableStream\n : { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }\n\nexport interface DefaultSerializerExtensions {\n ReadableStream: unknown\n}\n\nexport interface SerializerExtensions extends DefaultSerializerExtensions {}\n\nexport type Serializable = Date | undefined | Error | FormData | bigint\n\nexport type SerializerStringify<T> = SerializerStringifyBy<T, Serializable>\n\nexport type SerializerParse<T> = SerializerParseBy<T, Serializable>\nexport const startSerializer: StartSerializer = {\n stringify: (value: any) =>\n JSON.stringify(value, function replacer(key, val) {\n const ogVal = this[key]\n const serializer = serializers.find((t) => t.stringifyCondition(ogVal))\n\n if (serializer) {\n return serializer.stringify(ogVal)\n }\n\n return val\n }),\n parse: (value: string) =>\n JSON.parse(value, function parser(key, val) {\n const ogVal = this[key]\n if (isPlainObject(ogVal)) {\n const serializer = serializers.find((t) => t.parseCondition(ogVal))\n\n if (serializer) {\n return serializer.parse(ogVal)\n }\n }\n\n return val\n }),\n encode: (value: any) => {\n // When encoding, dive first\n if (Array.isArray(value)) {\n return value.map((v) => startSerializer.encode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n startSerializer.encode(v),\n ]),\n )\n }\n\n const serializer = serializers.find((t) => t.stringifyCondition(value))\n if (serializer) {\n return serializer.stringify(value)\n }\n\n return value\n },\n decode: (value: any) => {\n // Attempt transform first\n if (isPlainObject(value)) {\n const serializer = serializers.find((t) => t.parseCondition(value))\n if (serializer) {\n return serializer.parse(value)\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => startSerializer.decode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n startSerializer.decode(v),\n ]),\n )\n }\n\n return value\n },\n}\nconst createSerializer = <TKey extends string, TInput, TSerialized>(\n key: TKey,\n check: (value: any) => value is TInput,\n toValue: (value: TInput) => TSerialized,\n fromValue: (value: TSerialized) => TInput,\n) => ({\n key,\n stringifyCondition: check,\n stringify: (value: any) => ({ [`$${key}`]: toValue(value) }),\n parseCondition: (value: any) => Object.hasOwn(value, `$${key}`),\n parse: (value: any) => fromValue(value[`$${key}`]),\n})\n// Keep these ordered by predicted frequency\n// Make sure to keep DefaultSerializable in sync with these serializers\n// Also, make sure that they are unit tested in serializer.test.tsx\nconst serializers = [\n createSerializer(\n // Key\n 'undefined',\n // Check\n (v): v is undefined => v === undefined,\n // To\n () => 0,\n // From\n () => undefined,\n ),\n createSerializer(\n // Key\n 'date',\n // Check\n (v): v is Date => v instanceof Date,\n // To\n (v) => v.toISOString(),\n // From\n (v) => new Date(v),\n ),\n createSerializer(\n // Key\n 'error',\n // Check\n (v): v is Error => v instanceof Error,\n // To\n (v) => ({\n ...v,\n message: v.message,\n stack: process.env.NODE_ENV === 'development' ? v.stack : undefined,\n cause: v.cause,\n }),\n // From\n (v) => Object.assign(new Error(v.message), v),\n ),\n createSerializer(\n // Key\n 'formData',\n // Check\n (v): v is FormData => v instanceof FormData,\n // To\n (v) => {\n const entries: Record<\n string,\n Array<FormDataEntryValue> | FormDataEntryValue\n > = {}\n v.forEach((value, key) => {\n const entry = entries[key]\n if (entry !== undefined) {\n if (Array.isArray(entry)) {\n entry.push(value)\n } else {\n entries[key] = [entry, value]\n }\n } else {\n entries[key] = value\n }\n })\n return entries\n },\n // From\n (v) => {\n const formData = new FormData()\n Object.entries(v).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach((val) => formData.append(key, val))\n } else {\n formData.append(key, value)\n }\n })\n return formData\n },\n ),\n createSerializer(\n // Key\n 'bigint',\n // Check\n (v): v is bigint => typeof v === 'bigint',\n // To\n (v) => v.toString(),\n // From\n (v) => BigInt(v),\n ),\n createSerializer(\n // Key\n 'server-function',\n // Check\n (v): v is { functionId: string } =>\n typeof v === 'function' &&\n 'functionId' in v &&\n typeof v.functionId === 'string',\n // To\n ({ functionId }) => ({ functionId, __serverFn: true }),\n // From, dummy impl. the actual server function lookup is done on the server in packages/start-server-core/src/server-functions-handler.ts\n (v) => v,\n ),\n] as const\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serializer.js","sources":["../../src/serializer.ts"],"sourcesContent":["import { isPlainObject } from '@tanstack/router-core'\n\nexport interface StartSerializer {\n stringify: (obj: unknown) => string\n parse: (str: string) => unknown\n encode: <T>(value: T) => T\n decode: <T>(value: T) => T\n}\n\nexport type SerializerStringifyBy<T, TSerializable> = T extends TSerializable\n ? T\n : T extends (...args: Array<any>) => any\n ? 'Function is not serializable'\n : { [K in keyof T]: SerializerStringifyBy<T[K], TSerializable> }\n\nexport type SerializerParseBy<T, TSerializable> = T extends TSerializable\n ? T\n : unknown extends SerializerExtensions['ReadableStream']\n ? { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }\n : T extends SerializerExtensions['ReadableStream']\n ? ReadableStream\n : { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }\n\nexport interface DefaultSerializerExtensions {\n ReadableStream: unknown\n}\n\nexport interface SerializerExtensions extends DefaultSerializerExtensions {}\n\nexport type Serializable = Date | undefined | Error | FormData | bigint\n\nexport type SerializerStringify<T> = SerializerStringifyBy<T, Serializable>\n\nexport type SerializerParse<T> = SerializerParseBy<T, Serializable>\nexport const startSerializer: StartSerializer = {\n stringify: (value: any) =>\n JSON.stringify(value, function replacer(key, val) {\n const ogVal = this[key]\n const serializer = serializers.find((t) => t.stringifyCondition(ogVal))\n\n if (serializer) {\n return serializer.stringify(ogVal)\n }\n\n return val\n }),\n parse: (value: string) =>\n JSON.parse(value, function parser(key, val) {\n const ogVal = this[key]\n if (isPlainObject(ogVal)) {\n const serializer = serializers.find((t) => t.parseCondition(ogVal))\n\n if (serializer) {\n return serializer.parse(ogVal)\n }\n }\n\n return val\n }),\n encode: (value: any) => {\n // When encoding, dive first\n if (Array.isArray(value)) {\n return value.map((v) => startSerializer.encode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n startSerializer.encode(v),\n ]),\n )\n }\n\n const serializer = serializers.find((t) => t.stringifyCondition(value))\n if (serializer) {\n return serializer.stringify(value)\n }\n\n return value\n },\n decode: (value: any) => {\n // Attempt transform first\n if (isPlainObject(value)) {\n const serializer = serializers.find((t) => t.parseCondition(value))\n if (serializer) {\n return serializer.parse(value)\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => startSerializer.decode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n startSerializer.decode(v),\n ]),\n )\n }\n\n return value\n },\n}\nconst createSerializer = <TKey extends string, TInput, TSerialized>(\n key: TKey,\n check: (value: any) => value is TInput,\n toValue: (value: TInput) => TSerialized,\n fromValue: (value: TSerialized) => TInput,\n) => ({\n key,\n stringifyCondition: check,\n stringify: (value: any) => ({ [`$${key}`]: toValue(value) }),\n parseCondition: (value: any) => Object.hasOwn(value, `$${key}`),\n parse: (value: any) => fromValue(value[`$${key}`]),\n})\n// Keep these ordered by predicted frequency\n// Make sure to keep DefaultSerializable in sync with these serializers\n// Also, make sure that they are unit tested in serializer.test.tsx\nconst serializers = [\n createSerializer(\n // Key\n 'undefined',\n // Check\n (v): v is undefined => v === undefined,\n // To\n () => 0,\n // From\n () => undefined,\n ),\n createSerializer(\n // Key\n 'date',\n // Check\n (v): v is Date => v instanceof Date,\n // To\n (v) => v.toISOString(),\n // From\n (v) => new Date(v),\n ),\n createSerializer(\n // Key\n 'error',\n // Check\n (v): v is Error => v instanceof Error,\n // To\n (v) => ({\n ...v,\n message: v.message,\n stack: process.env.NODE_ENV === 'development' ? v.stack : undefined,\n cause: v.cause,\n }),\n // From\n (v) => Object.assign(new Error(v.message), v),\n ),\n createSerializer(\n // Key\n 'formData',\n // Check\n (v): v is FormData => v instanceof FormData,\n // To\n (v) => {\n const entries: Record<\n string,\n Array<FormDataEntryValue> | FormDataEntryValue\n > = {}\n v.forEach((value, key) => {\n const entry = entries[key]\n if (entry !== undefined) {\n if (Array.isArray(entry)) {\n entry.push(value)\n } else {\n entries[key] = [entry, value]\n }\n } else {\n entries[key] = value\n }\n })\n return entries\n },\n // From\n (v) => {\n const formData = new FormData()\n Object.entries(v).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach((val) => formData.append(key, val))\n } else {\n formData.append(key, value)\n }\n })\n return formData\n },\n ),\n createSerializer(\n // Key\n 'bigint',\n // Check\n (v): v is bigint => typeof v === 'bigint',\n // To\n (v) => v.toString(),\n // From\n (v) => BigInt(v),\n ),\n] as const\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/start-client-core",
3
- "version": "1.131.7",
3
+ "version": "1.132.0-alpha.0",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -30,10 +30,6 @@
30
30
  "import": {
31
31
  "types": "./dist/esm/index.d.ts",
32
32
  "default": "./dist/esm/index.js"
33
- },
34
- "require": {
35
- "types": "./dist/cjs/index.d.cts",
36
- "default": "./dist/cjs/index.cjs"
37
33
  }
38
34
  },
39
35
  "./package.json": "./package.json"
@@ -50,8 +46,8 @@
50
46
  "cookie-es": "^1.2.2",
51
47
  "tiny-invariant": "^1.3.3",
52
48
  "tiny-warning": "^1.0.3",
53
- "@tanstack/router-core": "1.131.7",
54
- "@tanstack/start-storage-context": "1.131.7"
49
+ "@tanstack/router-core": "1.132.0-alpha.0",
50
+ "@tanstack/start-storage-context": "1.132.0-alpha.0"
55
51
  },
56
52
  "scripts": {}
57
53
  }
@@ -2,7 +2,6 @@ import type {
2
2
  ConstrainValidator,
3
3
  Method,
4
4
  ServerFnResponseType,
5
- ServerFnTypeOrTypeFn,
6
5
  } from './createServerFn'
7
6
  import type {
8
7
  AnyRouter,
@@ -552,12 +551,6 @@ export interface FunctionMiddlewareClientFnOptions<
552
551
  next: FunctionMiddlewareClientNextFn<TMiddlewares>
553
552
  filename: string
554
553
  functionId: string
555
- type: ServerFnTypeOrTypeFn<
556
- Method,
557
- TServerFnResponseType,
558
- TMiddlewares,
559
- TValidator
560
- >
561
554
  router: TRouter
562
555
  }
563
556
 
@@ -1,5 +1,3 @@
1
- import { default as invariant } from 'tiny-invariant'
2
- import { default as warning } from 'tiny-warning'
3
1
  import { isNotFound, isRedirect } from '@tanstack/router-core'
4
2
  import { mergeHeaders } from '@tanstack/router-core/ssr/client'
5
3
  import { getStartContext } from '@tanstack/start-storage-context'
@@ -49,7 +47,6 @@ export function createServerFn<
49
47
  options?: {
50
48
  method?: TMethod
51
49
  response?: TServerFnResponseType
52
- type?: ServerFnType
53
50
  },
54
51
  __opts?: ServerFnBaseOptions<
55
52
  TMethod,
@@ -91,15 +88,6 @@ export function createServerFn<
91
88
  TValidator
92
89
  >(undefined, Object.assign(resolvedOptions, { validator })) as any
93
90
  },
94
- type: (type) => {
95
- return createServerFn<
96
- TMethod,
97
- ServerFnResponseType,
98
- TResponse,
99
- TMiddlewares,
100
- TValidator
101
- >(undefined, Object.assign(resolvedOptions, { type })) as any
102
- },
103
91
  handler: (...args) => {
104
92
  // This function signature changes due to AST transformations
105
93
  // in the babel plugin. We need to cast it to the correct
@@ -159,70 +147,20 @@ export function createServerFn<
159
147
  const opts =
160
148
  opts_ instanceof FormData ? extractFormDataContext(opts_) : opts_
161
149
 
162
- opts.type =
163
- typeof resolvedOptions.type === 'function'
164
- ? resolvedOptions.type(opts)
165
- : resolvedOptions.type
166
-
167
150
  const ctx = {
168
151
  ...extractedFn,
169
152
  ...opts,
170
153
  signal,
171
154
  }
172
155
 
173
- const run = () =>
174
- executeMiddleware(resolvedMiddleware, 'server', ctx).then(
175
- (d) => ({
176
- // Only send the result and sendContext back to the client
177
- result: d.result,
178
- error: d.error,
179
- context: d.sendContext,
180
- }),
181
- )
182
-
183
- if (ctx.type === 'static') {
184
- let response: StaticCachedResult | undefined
185
-
186
- // If we can get the cached item, try to get it
187
- if (serverFnStaticCache?.getItem) {
188
- // If this throws, it's okay to let it bubble up
189
- response = await serverFnStaticCache.getItem(ctx)
190
- }
191
-
192
- if (!response) {
193
- // If there's no cached item, execute the server function
194
- response = await run()
195
- .then((d) => {
196
- return {
197
- ctx: d,
198
- error: null,
199
- }
200
- })
201
- .catch((e) => {
202
- return {
203
- ctx: undefined,
204
- error: e,
205
- }
206
- })
207
-
208
- if (serverFnStaticCache?.setItem) {
209
- await serverFnStaticCache.setItem(ctx, response)
210
- }
211
- }
212
-
213
- invariant(
214
- response,
215
- 'No response from both server and static cache!',
216
- )
217
-
218
- if (response.error) {
219
- throw response.error
220
- }
221
-
222
- return response.ctx
223
- }
224
-
225
- return run()
156
+ return executeMiddleware(resolvedMiddleware, 'server', ctx).then(
157
+ (d) => ({
158
+ // Only send the result and sendContext back to the client
159
+ result: d.result,
160
+ error: d.error,
161
+ context: d.sendContext,
162
+ }),
163
+ )
226
164
  },
227
165
  },
228
166
  ) as any
@@ -367,12 +305,9 @@ export interface RequiredFetcher<
367
305
 
368
306
  export type FetcherBaseOptions = {
369
307
  headers?: HeadersInit
370
- type?: ServerFnType
371
308
  signal?: AbortSignal
372
309
  }
373
310
 
374
- export type ServerFnType = 'static' | 'dynamic'
375
-
376
311
  export interface OptionalFetcherDataOptions<TMiddlewares, TValidator>
377
312
  extends FetcherBaseOptions {
378
313
  data?: Expand<IntersectAllValidatorInputs<TMiddlewares, TValidator>>
@@ -466,12 +401,6 @@ export type ServerFnBaseOptions<
466
401
  TResponse
467
402
  >
468
403
  functionId: string
469
- type: ServerFnTypeOrTypeFn<
470
- TMethod,
471
- TServerFnResponseType,
472
- TMiddlewares,
473
- AnyValidator
474
- >
475
404
  }
476
405
 
477
406
  export type ValidatorInputStringify<TValidator> = SerializerStringifyBy<
@@ -516,7 +445,6 @@ export interface ServerFnAfterMiddleware<
516
445
  TMiddlewares,
517
446
  TValidator,
518
447
  > extends ServerFnValidator<TMethod, TServerFnResponseType, TMiddlewares>,
519
- ServerFnTyper<TMethod, TServerFnResponseType, TMiddlewares, TValidator>,
520
448
  ServerFnHandler<TMethod, TServerFnResponseType, TMiddlewares, TValidator> {}
521
449
 
522
450
  export type ValidatorFn<
@@ -546,47 +474,8 @@ export interface ServerFnAfterValidator<
546
474
  TMiddlewares,
547
475
  TValidator,
548
476
  > extends ServerFnMiddleware<TMethod, TServerFnResponseType, TValidator>,
549
- ServerFnTyper<TMethod, TServerFnResponseType, TMiddlewares, TValidator>,
550
477
  ServerFnHandler<TMethod, TServerFnResponseType, TMiddlewares, TValidator> {}
551
478
 
552
- // Typer
553
- export interface ServerFnTyper<
554
- TMethod extends Method,
555
- TServerFnResponseType extends ServerFnResponseType,
556
- TMiddlewares,
557
- TValidator,
558
- > {
559
- type: (
560
- typer: ServerFnTypeOrTypeFn<
561
- TMethod,
562
- TServerFnResponseType,
563
- TMiddlewares,
564
- TValidator
565
- >,
566
- ) => ServerFnAfterTyper<
567
- TMethod,
568
- TServerFnResponseType,
569
- TMiddlewares,
570
- TValidator
571
- >
572
- }
573
-
574
- export type ServerFnTypeOrTypeFn<
575
- TMethod extends Method,
576
- TServerFnResponseType extends ServerFnResponseType,
577
- TMiddlewares,
578
- TValidator,
579
- > =
580
- | ServerFnType
581
- | ((
582
- ctx: ServerFnCtx<
583
- TMethod,
584
- TServerFnResponseType,
585
- TMiddlewares,
586
- TValidator
587
- >,
588
- ) => ServerFnType)
589
-
590
479
  export interface ServerFnAfterTyper<
591
480
  TMethod extends Method,
592
481
  TServerFnResponseType extends ServerFnResponseType,
@@ -622,7 +511,6 @@ export interface ServerFnBuilder<
622
511
  TServerFnResponseType extends ServerFnResponseType = 'data',
623
512
  > extends ServerFnMiddleware<TMethod, TServerFnResponseType, undefined>,
624
513
  ServerFnValidator<TMethod, TServerFnResponseType, undefined>,
625
- ServerFnTyper<TMethod, TServerFnResponseType, undefined, undefined>,
626
514
  ServerFnHandler<TMethod, TServerFnResponseType, undefined, undefined> {
627
515
  options: ServerFnBaseOptions<
628
516
  TMethod,
@@ -633,176 +521,6 @@ export interface ServerFnBuilder<
633
521
  >
634
522
  }
635
523
 
636
- export type StaticCachedResult = {
637
- ctx?: {
638
- result: any
639
- context: any
640
- }
641
- error?: any
642
- }
643
-
644
- export type ServerFnStaticCache = {
645
- getItem: (
646
- ctx: ServerFnMiddlewareResult,
647
- ) => StaticCachedResult | Promise<StaticCachedResult | undefined>
648
- setItem: (
649
- ctx: ServerFnMiddlewareResult,
650
- response: StaticCachedResult,
651
- ) => Promise<void>
652
- fetchItem: (
653
- ctx: ServerFnMiddlewareResult,
654
- ) => StaticCachedResult | Promise<StaticCachedResult | undefined>
655
- }
656
-
657
- export let serverFnStaticCache: ServerFnStaticCache | undefined
658
-
659
- export function setServerFnStaticCache(
660
- cache?: ServerFnStaticCache | (() => ServerFnStaticCache | undefined),
661
- ) {
662
- const previousCache = serverFnStaticCache
663
- serverFnStaticCache = typeof cache === 'function' ? cache() : cache
664
-
665
- return () => {
666
- serverFnStaticCache = previousCache
667
- }
668
- }
669
-
670
- export function createServerFnStaticCache(
671
- serverFnStaticCache: ServerFnStaticCache,
672
- ) {
673
- return serverFnStaticCache
674
- }
675
-
676
- /**
677
- * This is a simple hash function for generating a hash from a string to make the filenames shorter.
678
- *
679
- * It is not cryptographically secure (as its using SHA-1) and should not be used for any security purposes.
680
- *
681
- * It is only used to generate a hash for the static cache filenames.
682
- *
683
- * @param message - The input string to hash.
684
- * @returns A promise that resolves to the SHA-1 hash of the input string in hexadecimal format.
685
- *
686
- * @example
687
- * ```typescript
688
- * const hash = await sha1Hash("hello");
689
- * console.log(hash); // Outputs the SHA-1 hash of "hello" -> "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d"
690
- * ```
691
- */
692
- async function sha1Hash(message: string): Promise<string> {
693
- // Encode the string as UTF-8
694
- const msgBuffer = new TextEncoder().encode(message)
695
-
696
- // Hash the message
697
- const hashBuffer = await crypto.subtle.digest('SHA-1', msgBuffer)
698
-
699
- // Convert the ArrayBuffer to a string
700
- const hashArray = Array.from(new Uint8Array(hashBuffer))
701
- const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')
702
- return hashHex
703
- }
704
-
705
- setServerFnStaticCache(() => {
706
- const getStaticCacheUrl = async (
707
- options: ServerFnMiddlewareResult,
708
- hash: string,
709
- ) => {
710
- const filename = await sha1Hash(`${options.functionId}__${hash}`)
711
- return `/__tsr/staticServerFnCache/${filename}.json`
712
- }
713
-
714
- const jsonToFilenameSafeString = (json: any) => {
715
- // Custom replacer to sort keys
716
- const sortedKeysReplacer = (key: string, value: any) =>
717
- value && typeof value === 'object' && !Array.isArray(value)
718
- ? Object.keys(value)
719
- .sort()
720
- .reduce((acc: any, curr: string) => {
721
- acc[curr] = value[curr]
722
- return acc
723
- }, {})
724
- : value
725
-
726
- // Convert JSON to string with sorted keys
727
- const jsonString = JSON.stringify(json ?? '', sortedKeysReplacer)
728
-
729
- // Replace characters invalid in filenames
730
- return jsonString
731
- .replace(/[/\\?%*:|"<>]/g, '-') // Replace invalid characters with a dash
732
- .replace(/\s+/g, '_') // Optionally replace whitespace with underscores
733
- }
734
-
735
- const staticClientCache =
736
- typeof document !== 'undefined' ? new Map<string, any>() : null
737
-
738
- return createServerFnStaticCache({
739
- getItem: async (ctx) => {
740
- if (typeof document === 'undefined') {
741
- const hash = jsonToFilenameSafeString(ctx.data)
742
- const url = await getStaticCacheUrl(ctx, hash)
743
- const publicUrl = process.env.TSS_OUTPUT_PUBLIC_DIR!
744
-
745
- // Use fs instead of fetch to read from filesystem
746
- const { promises: fs } = await import('node:fs')
747
- const path = await import('node:path')
748
- const filePath = path.join(publicUrl, url)
749
-
750
- const [cachedResult, readError] = await fs
751
- .readFile(filePath, 'utf-8')
752
- .then((c) => [
753
- startSerializer.parse(c) as {
754
- ctx: unknown
755
- error: any
756
- },
757
- null,
758
- ])
759
- .catch((e) => [null, e])
760
-
761
- if (readError && readError.code !== 'ENOENT') {
762
- throw readError
763
- }
764
-
765
- return cachedResult as StaticCachedResult
766
- }
767
-
768
- return undefined
769
- },
770
- setItem: async (ctx, response) => {
771
- const { promises: fs } = await import('node:fs')
772
- const path = await import('node:path')
773
-
774
- const hash = jsonToFilenameSafeString(ctx.data)
775
- const url = await getStaticCacheUrl(ctx, hash)
776
- const publicUrl = process.env.TSS_OUTPUT_PUBLIC_DIR!
777
- const filePath = path.join(publicUrl, url)
778
-
779
- // Ensure the directory exists
780
- await fs.mkdir(path.dirname(filePath), { recursive: true })
781
-
782
- // Store the result with fs
783
- await fs.writeFile(filePath, startSerializer.stringify(response))
784
- },
785
- fetchItem: async (ctx) => {
786
- const hash = jsonToFilenameSafeString(ctx.data)
787
- const url = await getStaticCacheUrl(ctx, hash)
788
-
789
- let result: any = staticClientCache?.get(url)
790
-
791
- if (!result) {
792
- result = await fetch(url, {
793
- method: 'GET',
794
- })
795
- .then((r) => r.text())
796
- .then((d) => startSerializer.parse(d))
797
-
798
- staticClientCache?.set(url, result)
799
- }
800
-
801
- return result
802
- },
803
- })
804
- })
805
-
806
524
  export function extractFormDataContext(formData: FormData) {
807
525
  const serializedContext = formData.get('__TSR_CONTEXT')
808
526
  formData.delete('__TSR_CONTEXT')
@@ -859,7 +577,6 @@ export type ServerFnMiddlewareOptions = {
859
577
  signal?: AbortSignal
860
578
  sendContext?: any
861
579
  context?: any
862
- type: ServerFnTypeOrTypeFn<any, any, any, any>
863
580
  functionId: string
864
581
  router?: AnyRouter
865
582
  }
@@ -867,7 +584,6 @@ export type ServerFnMiddlewareOptions = {
867
584
  export type ServerFnMiddlewareResult = ServerFnMiddlewareOptions & {
868
585
  result?: unknown
869
586
  error?: unknown
870
- type: ServerFnTypeOrTypeFn<any, any, any, any>
871
587
  }
872
588
 
873
589
  export type NextFn = (
@@ -957,35 +673,8 @@ export function serverFnBaseToMiddleware(
957
673
  ...ctx,
958
674
  // switch the sendContext over to context
959
675
  context: sendContext,
960
- type: typeof ctx.type === 'function' ? ctx.type(ctx) : ctx.type,
961
676
  } as any
962
677
 
963
- if (
964
- ctx.type === 'static' &&
965
- process.env.NODE_ENV === 'production' &&
966
- typeof document !== 'undefined'
967
- ) {
968
- invariant(
969
- serverFnStaticCache,
970
- 'serverFnStaticCache.fetchItem is not available!',
971
- )
972
-
973
- const result = await serverFnStaticCache.fetchItem(payload)
974
-
975
- if (result) {
976
- if (result.error) {
977
- throw result.error
978
- }
979
-
980
- return next(result.ctx)
981
- }
982
-
983
- warning(
984
- result,
985
- `No static cache item found for ${payload.functionId}__${JSON.stringify(payload.data)}, falling back to server function...`,
986
- )
987
- }
988
-
989
678
  // Execute the extracted function
990
679
  // but not before serializing the context
991
680
  const res = await options.extractedFn?.(payload)
package/src/index.tsx CHANGED
@@ -73,11 +73,9 @@ export type {
73
73
  ServerFnMiddlewareOptions,
74
74
  ServerFnMiddlewareResult,
75
75
  ServerFnBuilder,
76
- ServerFnType,
77
76
  ServerFnBaseOptions,
78
77
  NextFn,
79
78
  Method,
80
- StaticCachedResult,
81
79
  OptionalFetcher,
82
80
  RequiredFetcher,
83
81
  } from './createServerFn'
@@ -87,6 +85,5 @@ export {
87
85
  serverFnBaseToMiddleware,
88
86
  extractFormDataContext,
89
87
  flattenMiddlewares,
90
- serverFnStaticCache,
91
88
  executeMiddleware,
92
89
  } from './createServerFn'
package/src/serializer.ts CHANGED
@@ -203,17 +203,4 @@ const serializers = [
203
203
  // From
204
204
  (v) => BigInt(v),
205
205
  ),
206
- createSerializer(
207
- // Key
208
- 'server-function',
209
- // Check
210
- (v): v is { functionId: string } =>
211
- typeof v === 'function' &&
212
- 'functionId' in v &&
213
- typeof v.functionId === 'string',
214
- // To
215
- ({ functionId }) => ({ functionId, __serverFn: true }),
216
- // From, dummy impl. the actual server function lookup is done on the server in packages/start-server-core/src/server-functions-handler.ts
217
- (v) => v,
218
- ),
219
206
  ] as const
@@ -52,7 +52,6 @@ test('createServerFn with validator', () => {
52
52
  expectTypeOf(fn).parameter(0).toEqualTypeOf<{
53
53
  data: { input: string }
54
54
  headers?: HeadersInit
55
- type?: 'static' | 'dynamic'
56
55
  signal?: AbortSignal
57
56
  }>()
58
57
 
@@ -168,7 +167,6 @@ describe('createServerFn with middleware and validator', () => {
168
167
  readonly inputC: 'inputC'
169
168
  }
170
169
  headers?: HeadersInit
171
- type?: 'static' | 'dynamic'
172
170
  signal?: AbortSignal
173
171
  }>()
174
172
 
@@ -212,7 +210,6 @@ describe('createServerFn with middleware and validator', () => {
212
210
  readonly inputC: 'inputC'
213
211
  }
214
212
  headers?: HeadersInit
215
- type?: 'static' | 'dynamic'
216
213
  signal?: AbortSignal
217
214
  }>()
218
215
 
@@ -323,7 +320,6 @@ test('createServerFn where validator is optional if object is optional', () => {
323
320
  | {
324
321
  data?: 'c' | undefined
325
322
  headers?: HeadersInit
326
- type?: 'static' | 'dynamic'
327
323
  signal?: AbortSignal
328
324
  }
329
325
  | undefined
@@ -347,7 +343,6 @@ test('createServerFn where data is optional if there is no validator', () => {
347
343
  | {
348
344
  data?: undefined
349
345
  headers?: HeadersInit
350
- type?: 'static' | 'dynamic'
351
346
  signal?: AbortSignal
352
347
  }
353
348
  | undefined
@@ -509,7 +504,6 @@ test('createServerFn validator infers unknown for default input type', () => {
509
504
  | {
510
505
  data?: unknown | undefined
511
506
  headers?: HeadersInit
512
- type?: 'static' | 'dynamic'
513
507
  signal?: AbortSignal
514
508
  }
515
509
  | undefined
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- function createIsomorphicFn() {
4
- return {
5
- server: () => ({ client: () => () => {
6
- } }),
7
- client: () => ({ server: () => () => {
8
- } })
9
- };
10
- }
11
- exports.createIsomorphicFn = createIsomorphicFn;
12
- //# sourceMappingURL=createIsomorphicFn.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createIsomorphicFn.cjs","sources":["../../src/createIsomorphicFn.ts"],"sourcesContent":["// a function that can have different implementations on the client and server.\n// implementations not provided will default to a no-op function.\n\nexport type IsomorphicFn<\n TArgs extends Array<any> = [],\n TServer = undefined,\n TClient = undefined,\n> = (...args: TArgs) => TServer | TClient\n\nexport interface ServerOnlyFn<TArgs extends Array<any>, TServer>\n extends IsomorphicFn<TArgs, TServer> {\n client: <TClient>(\n clientImpl: (...args: TArgs) => TClient,\n ) => IsomorphicFn<TArgs, TServer, TClient>\n}\n\nexport interface ClientOnlyFn<TArgs extends Array<any>, TClient>\n extends IsomorphicFn<TArgs, undefined, TClient> {\n server: <TServer>(\n serverImpl: (...args: TArgs) => TServer,\n ) => IsomorphicFn<TArgs, TServer, TClient>\n}\n\nexport interface IsomorphicFnBase extends IsomorphicFn {\n server: <TArgs extends Array<any>, TServer>(\n serverImpl: (...args: TArgs) => TServer,\n ) => ServerOnlyFn<TArgs, TServer>\n client: <TArgs extends Array<any>, TClient>(\n clientImpl: (...args: TArgs) => TClient,\n ) => ClientOnlyFn<TArgs, TClient>\n}\n\n// this is a dummy function, it will be replaced by the transformer\n// if we use `createIsomorphicFn` in this library itself, vite tries to execute it before the transformer runs\n// therefore we must return a dummy function that allows calling `server` and `client` method chains.\nexport function createIsomorphicFn(): IsomorphicFnBase {\n return {\n server: () => ({ client: () => () => {} }),\n client: () => ({ server: () => () => {} }),\n } as any\n}\n"],"names":[],"mappings":";;AAmCO,SAAS,qBAAuC;AAC9C,SAAA;AAAA,IACL,QAAQ,OAAO,EAAE,QAAQ,MAAM,MAAM;AAAA,IAAA;IACrC,QAAQ,OAAO,EAAE,QAAQ,MAAM,MAAM;AAAA,IAAA,EAAG;AAAA,EAC1C;AACF;;"}