@tanstack/start-client-core 1.132.0-alpha.7 → 1.132.0-alpha.8

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 +1 @@
1
- {"version":3,"file":"serverFnFetcher.js","sources":["../../src/serverFnFetcher.ts"],"sourcesContent":["import {\n encode,\n isNotFound,\n isPlainObject,\n parseRedirect,\n} from '@tanstack/router-core'\nimport { fromCrossJSON, toJSONAsync } from 'seroval'\nimport invariant from 'tiny-invariant'\nimport { getClientSerovalPlugins } from './serializer/getClientSerovalPlugins'\nimport { TSS_FORMDATA_CONTEXT, X_TSS_SERIALIZED } from './constants'\nimport type { FunctionMiddlewareClientFnOptions } from './createMiddleware'\nimport type { Plugin as SerovalPlugin } from 'seroval'\n\nlet serovalPlugins: Array<SerovalPlugin<any, any>> | null = null\n\nexport async function serverFnFetcher(\n url: string,\n args: Array<any>,\n handler: (url: string, requestInit: RequestInit) => Promise<Response>,\n) {\n if (!serovalPlugins) {\n serovalPlugins = getClientSerovalPlugins()\n }\n const _first = args[0]\n\n // If createServerFn was used to wrap the fetcher,\n // We need to handle the arguments differently\n if (isPlainObject(_first) && _first.method) {\n const first = _first as FunctionMiddlewareClientFnOptions<\n any,\n any,\n any,\n any\n > & {\n headers: HeadersInit\n }\n const type = first.data instanceof FormData ? 'formData' : 'payload'\n\n // Arrange the headers\n const headers = new Headers({\n 'x-tsr-redirect': 'manual',\n ...(type === 'payload'\n ? {\n 'content-type': 'application/json',\n accept: 'application/x-ndjson, application/json',\n }\n : {}),\n ...(first.headers instanceof Headers\n ? Object.fromEntries(first.headers.entries())\n : first.headers),\n })\n\n // If the method is GET, we need to move the payload to the query string\n if (first.method === 'GET') {\n const encodedPayload = encode({\n payload: await serializePayload(first),\n })\n\n if (encodedPayload) {\n if (url.includes('?')) {\n url += `&${encodedPayload}`\n } else {\n url += `?${encodedPayload}`\n }\n }\n }\n\n if (url.includes('?')) {\n url += `&createServerFn`\n } else {\n url += `?createServerFn`\n }\n if (first.response === 'raw') {\n url += `&raw`\n }\n\n return await getResponse(async () =>\n handler(url, {\n method: first.method,\n headers,\n signal: first.signal,\n ...(await getFetcherRequestOptions(first)),\n }),\n )\n }\n\n // If not a custom fetcher, it was probably\n // a `use server` function, so just proxy the arguments\n // through as a POST request\n return await getResponse(() =>\n handler(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(args),\n }),\n )\n}\n\nasync function serializePayload(\n opts: FunctionMiddlewareClientFnOptions<any, any, any, any>,\n) {\n const payloadToSerialize: any = {}\n if (opts.data) {\n payloadToSerialize['data'] = opts.data\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (opts.context && Object.keys(opts.context).length > 0) {\n payloadToSerialize['context'] = opts.context\n }\n\n return serialize(payloadToSerialize)\n}\n\nasync function serialize(data: any) {\n return JSON.stringify(\n await Promise.resolve(toJSONAsync(data, { plugins: serovalPlugins! })),\n )\n}\n\nasync function getFetcherRequestOptions(\n opts: FunctionMiddlewareClientFnOptions<any, any, any, any>,\n) {\n if (opts.method === 'POST') {\n if (opts.data instanceof FormData) {\n opts.data.set(TSS_FORMDATA_CONTEXT, await serialize(opts.context))\n return {\n body: opts.data,\n }\n }\n\n return {\n body: await serializePayload(opts),\n }\n }\n\n return {}\n}\n\n/**\n * Retrieves a response from a given function and manages potential errors\n * and special response types including redirects and not found errors.\n *\n * @param fn - The function to execute for obtaining the response.\n * @returns The processed response from the function.\n * @throws If the response is invalid or an error occurs during processing.\n */\nasync function getResponse(fn: () => Promise<Response>) {\n const response = await (async () => {\n try {\n return await fn()\n } catch (error) {\n if (error instanceof Response) {\n return error\n }\n\n throw error\n }\n })()\n\n const contentType = response.headers.get('content-type')\n invariant(contentType, 'expected content-type header to be set')\n const serializedByStart = !!response.headers.get(X_TSS_SERIALIZED)\n // If the response is not ok, throw an error\n if (!response.ok) {\n if (serializedByStart && contentType.includes('application/json')) {\n const jsonPayload = await response.json()\n const result = fromCrossJSON(jsonPayload, { plugins: serovalPlugins! })\n throw result\n }\n\n throw new Error(await response.text())\n }\n\n if (serializedByStart) {\n let result\n if (contentType.includes('application/x-ndjson')) {\n const refs = new Map()\n result = await processServerFnResponse({\n response,\n onMessage: (msg) =>\n fromCrossJSON(msg, { refs, plugins: serovalPlugins! }),\n onError(msg, error) {\n // TODO how could we notify consumer that an error occurred?\n console.error(msg, error)\n },\n })\n }\n if (contentType.includes('application/json')) {\n const jsonPayload = await response.json()\n result = fromCrossJSON(jsonPayload, { plugins: serovalPlugins! })\n }\n invariant(result, 'expected result to be resolved')\n if (result instanceof Error) {\n throw result\n }\n return result\n }\n\n if (contentType.includes('application/json')) {\n const jsonPayload = await response.json()\n const redirect = parseRedirect(jsonPayload)\n if (redirect) {\n throw redirect\n }\n if (isNotFound(jsonPayload)) {\n throw jsonPayload\n }\n return jsonPayload\n }\n\n return response\n}\n\nasync function processServerFnResponse({\n response,\n onMessage,\n onError,\n}: {\n response: Response\n onMessage: (msg: any) => any\n onError?: (msg: string, error?: any) => void\n}) {\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader()\n\n let buffer = ''\n let firstRead = false\n let firstObject\n\n while (!firstRead) {\n const { value, done } = await reader.read()\n if (value) buffer += value\n\n if (buffer.length === 0 && done) {\n throw new Error('Stream ended before first object')\n }\n\n // common case: buffer ends with newline\n if (buffer.endsWith('\\n')) {\n const lines = buffer.split('\\n').filter(Boolean)\n const firstLine = lines[0]\n if (!firstLine) throw new Error('No JSON line in the first chunk')\n firstObject = JSON.parse(firstLine)\n firstRead = true\n buffer = lines.slice(1).join('\\n')\n } else {\n // fallback: wait for a newline to parse first object safely\n const newlineIndex = buffer.indexOf('\\n')\n if (newlineIndex >= 0) {\n const line = buffer.slice(0, newlineIndex).trim()\n buffer = buffer.slice(newlineIndex + 1)\n if (line.length > 0) {\n firstObject = JSON.parse(line)\n firstRead = true\n }\n }\n }\n }\n\n // process rest of the stream asynchronously\n ;(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const { value, done } = await reader.read()\n if (value) buffer += value\n\n const lastNewline = buffer.lastIndexOf('\\n')\n if (lastNewline >= 0) {\n const chunk = buffer.slice(0, lastNewline)\n buffer = buffer.slice(lastNewline + 1)\n const lines = chunk.split('\\n').filter(Boolean)\n\n for (const line of lines) {\n try {\n onMessage(JSON.parse(line))\n } catch (e) {\n onError?.(`Invalid JSON line: ${line}`, e)\n }\n }\n }\n\n if (done) {\n break\n }\n }\n } catch (err) {\n onError?.('Stream processing error:', err)\n }\n })()\n\n return onMessage(firstObject)\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serverFnFetcher.js","sources":["../../src/serverFnFetcher.ts"],"sourcesContent":["import {\n encode,\n isNotFound,\n isPlainObject,\n parseRedirect,\n} from '@tanstack/router-core'\nimport { fromCrossJSON, toJSONAsync } from 'seroval'\nimport invariant from 'tiny-invariant'\nimport { getClientSerovalPlugins } from './serializer/getClientSerovalPlugins'\nimport { TSS_FORMDATA_CONTEXT, X_TSS_SERIALIZED } from './constants'\nimport type { FunctionMiddlewareClientFnOptions } from './createMiddleware'\nimport type { Plugin as SerovalPlugin } from 'seroval'\n\nlet serovalPlugins: Array<SerovalPlugin<any, any>> | null = null\n\nexport async function serverFnFetcher(\n url: string,\n args: Array<any>,\n handler: (url: string, requestInit: RequestInit) => Promise<Response>,\n) {\n if (!serovalPlugins) {\n serovalPlugins = getClientSerovalPlugins()\n }\n const _first = args[0]\n\n // If createServerFn was used to wrap the fetcher,\n // We need to handle the arguments differently\n if (isPlainObject(_first) && _first.method) {\n const first = _first as FunctionMiddlewareClientFnOptions<\n any,\n any,\n any,\n any,\n any\n > & {\n headers: HeadersInit\n }\n const type = first.data instanceof FormData ? 'formData' : 'payload'\n\n // Arrange the headers\n const headers = new Headers({\n 'x-tsr-redirect': 'manual',\n ...(type === 'payload'\n ? {\n 'content-type': 'application/json',\n accept: 'application/x-ndjson, application/json',\n }\n : {}),\n ...(first.headers instanceof Headers\n ? Object.fromEntries(first.headers.entries())\n : first.headers),\n })\n\n // If the method is GET, we need to move the payload to the query string\n if (first.method === 'GET') {\n const encodedPayload = encode({\n payload: await serializePayload(first),\n })\n\n if (encodedPayload) {\n if (url.includes('?')) {\n url += `&${encodedPayload}`\n } else {\n url += `?${encodedPayload}`\n }\n }\n }\n\n if (url.includes('?')) {\n url += `&createServerFn`\n } else {\n url += `?createServerFn`\n }\n if (first.response === 'raw') {\n url += `&raw`\n }\n\n return await getResponse(async () =>\n handler(url, {\n method: first.method,\n headers,\n signal: first.signal,\n ...(await getFetcherRequestOptions(first)),\n }),\n )\n }\n\n // If not a custom fetcher, it was probably\n // a `use server` function, so just proxy the arguments\n // through as a POST request\n return await getResponse(() =>\n handler(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(args),\n }),\n )\n}\n\nasync function serializePayload(\n opts: FunctionMiddlewareClientFnOptions<any, any, any, any, any>,\n) {\n const payloadToSerialize: any = {}\n if (opts.data) {\n payloadToSerialize['data'] = opts.data\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (opts.context && Object.keys(opts.context).length > 0) {\n payloadToSerialize['context'] = opts.context\n }\n\n return serialize(payloadToSerialize)\n}\n\nasync function serialize(data: any) {\n return JSON.stringify(\n await Promise.resolve(toJSONAsync(data, { plugins: serovalPlugins! })),\n )\n}\n\nasync function getFetcherRequestOptions(\n opts: FunctionMiddlewareClientFnOptions<any, any, any, any, any>,\n) {\n if (opts.method === 'POST') {\n if (opts.data instanceof FormData) {\n opts.data.set(TSS_FORMDATA_CONTEXT, await serialize(opts.context))\n return {\n body: opts.data,\n }\n }\n\n return {\n body: await serializePayload(opts),\n }\n }\n\n return {}\n}\n\n/**\n * Retrieves a response from a given function and manages potential errors\n * and special response types including redirects and not found errors.\n *\n * @param fn - The function to execute for obtaining the response.\n * @returns The processed response from the function.\n * @throws If the response is invalid or an error occurs during processing.\n */\nasync function getResponse(fn: () => Promise<Response>) {\n const response = await (async () => {\n try {\n return await fn()\n } catch (error) {\n if (error instanceof Response) {\n return error\n }\n\n throw error\n }\n })()\n\n const contentType = response.headers.get('content-type')\n invariant(contentType, 'expected content-type header to be set')\n const serializedByStart = !!response.headers.get(X_TSS_SERIALIZED)\n // If the response is not ok, throw an error\n if (!response.ok) {\n if (serializedByStart && contentType.includes('application/json')) {\n const jsonPayload = await response.json()\n const result = fromCrossJSON(jsonPayload, { plugins: serovalPlugins! })\n throw result\n }\n\n throw new Error(await response.text())\n }\n\n if (serializedByStart) {\n let result\n if (contentType.includes('application/x-ndjson')) {\n const refs = new Map()\n result = await processServerFnResponse({\n response,\n onMessage: (msg) =>\n fromCrossJSON(msg, { refs, plugins: serovalPlugins! }),\n onError(msg, error) {\n // TODO how could we notify consumer that an error occurred?\n console.error(msg, error)\n },\n })\n }\n if (contentType.includes('application/json')) {\n const jsonPayload = await response.json()\n result = fromCrossJSON(jsonPayload, { plugins: serovalPlugins! })\n }\n invariant(result, 'expected result to be resolved')\n if (result instanceof Error) {\n throw result\n }\n return result\n }\n\n if (contentType.includes('application/json')) {\n const jsonPayload = await response.json()\n const redirect = parseRedirect(jsonPayload)\n if (redirect) {\n throw redirect\n }\n if (isNotFound(jsonPayload)) {\n throw jsonPayload\n }\n return jsonPayload\n }\n\n return response\n}\n\nasync function processServerFnResponse({\n response,\n onMessage,\n onError,\n}: {\n response: Response\n onMessage: (msg: any) => any\n onError?: (msg: string, error?: any) => void\n}) {\n if (!response.body) {\n throw new Error('No response body')\n }\n\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader()\n\n let buffer = ''\n let firstRead = false\n let firstObject\n\n while (!firstRead) {\n const { value, done } = await reader.read()\n if (value) buffer += value\n\n if (buffer.length === 0 && done) {\n throw new Error('Stream ended before first object')\n }\n\n // common case: buffer ends with newline\n if (buffer.endsWith('\\n')) {\n const lines = buffer.split('\\n').filter(Boolean)\n const firstLine = lines[0]\n if (!firstLine) throw new Error('No JSON line in the first chunk')\n firstObject = JSON.parse(firstLine)\n firstRead = true\n buffer = lines.slice(1).join('\\n')\n } else {\n // fallback: wait for a newline to parse first object safely\n const newlineIndex = buffer.indexOf('\\n')\n if (newlineIndex >= 0) {\n const line = buffer.slice(0, newlineIndex).trim()\n buffer = buffer.slice(newlineIndex + 1)\n if (line.length > 0) {\n firstObject = JSON.parse(line)\n firstRead = true\n }\n }\n }\n }\n\n // process rest of the stream asynchronously\n ;(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const { value, done } = await reader.read()\n if (value) buffer += value\n\n const lastNewline = buffer.lastIndexOf('\\n')\n if (lastNewline >= 0) {\n const chunk = buffer.slice(0, lastNewline)\n buffer = buffer.slice(lastNewline + 1)\n const lines = chunk.split('\\n').filter(Boolean)\n\n for (const line of lines) {\n try {\n onMessage(JSON.parse(line))\n } catch (e) {\n onError?.(`Invalid JSON line: ${line}`, e)\n }\n }\n }\n\n if (done) {\n break\n }\n }\n } catch (err) {\n onError?.('Stream processing error:', err)\n }\n })()\n\n return onMessage(firstObject)\n}\n"],"names":[],"mappings":";;;;;AAaA,IAAI,iBAAwD;AAE5D,eAAsB,gBACpB,KACA,MACA,SACA;AACA,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,wBAAA;AAAA,EACnB;AACA,QAAM,SAAS,KAAK,CAAC;AAIrB,MAAI,cAAc,MAAM,KAAK,OAAO,QAAQ;AAC1C,UAAM,QAAQ;AASd,UAAM,OAAO,MAAM,gBAAgB,WAAW,aAAa;AAG3D,UAAM,UAAU,IAAI,QAAQ;AAAA,MAC1B,kBAAkB;AAAA,MAClB,GAAI,SAAS,YACT;AAAA,QACE,gBAAgB;AAAA,QAChB,QAAQ;AAAA,MAAA,IAEV,CAAA;AAAA,MACJ,GAAI,MAAM,mBAAmB,UACzB,OAAO,YAAY,MAAM,QAAQ,SAAS,IAC1C,MAAM;AAAA,IAAA,CACX;AAGD,QAAI,MAAM,WAAW,OAAO;AAC1B,YAAM,iBAAiB,OAAO;AAAA,QAC5B,SAAS,MAAM,iBAAiB,KAAK;AAAA,MAAA,CACtC;AAED,UAAI,gBAAgB;AAClB,YAAI,IAAI,SAAS,GAAG,GAAG;AACrB,iBAAO,IAAI,cAAc;AAAA,QAC3B,OAAO;AACL,iBAAO,IAAI,cAAc;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,GAAG,GAAG;AACrB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AACA,QAAI,MAAM,aAAa,OAAO;AAC5B,aAAO;AAAA,IACT;AAEA,WAAO,MAAM;AAAA,MAAY,YACvB,QAAQ,KAAK;AAAA,QACX,QAAQ,MAAM;AAAA,QACd;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,GAAI,MAAM,yBAAyB,KAAK;AAAA,MAAA,CACzC;AAAA,IAAA;AAAA,EAEL;AAKA,SAAO,MAAM;AAAA,IAAY,MACvB,QAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAAA;AAAA,MAElB,MAAM,KAAK,UAAU,IAAI;AAAA,IAAA,CAC1B;AAAA,EAAA;AAEL;AAEA,eAAe,iBACb,MACA;AACA,QAAM,qBAA0B,CAAA;AAChC,MAAI,KAAK,MAAM;AACb,uBAAmB,MAAM,IAAI,KAAK;AAAA,EACpC;AAEA,MAAI,KAAK,WAAW,OAAO,KAAK,KAAK,OAAO,EAAE,SAAS,GAAG;AACxD,uBAAmB,SAAS,IAAI,KAAK;AAAA,EACvC;AAEA,SAAO,UAAU,kBAAkB;AACrC;AAEA,eAAe,UAAU,MAAW;AAClC,SAAO,KAAK;AAAA,IACV,MAAM,QAAQ,QAAQ,YAAY,MAAM,EAAE,SAAS,gBAAiB,CAAC;AAAA,EAAA;AAEzE;AAEA,eAAe,yBACb,MACA;AACA,MAAI,KAAK,WAAW,QAAQ;AAC1B,QAAI,KAAK,gBAAgB,UAAU;AACjC,WAAK,KAAK,IAAI,sBAAsB,MAAM,UAAU,KAAK,OAAO,CAAC;AACjE,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,MAAA;AAAA,IAEf;AAEA,WAAO;AAAA,MACL,MAAM,MAAM,iBAAiB,IAAI;AAAA,IAAA;AAAA,EAErC;AAEA,SAAO,CAAA;AACT;AAUA,eAAe,YAAY,IAA6B;AACtD,QAAM,WAAW,OAAO,YAAY;AAClC,QAAI;AACF,aAAO,MAAM,GAAA;AAAA,IACf,SAAS,OAAO;AACd,UAAI,iBAAiB,UAAU;AAC7B,eAAO;AAAA,MACT;AAEA,YAAM;AAAA,IACR;AAAA,EACF,GAAA;AAEA,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,YAAU,aAAa,wCAAwC;AAC/D,QAAM,oBAAoB,CAAC,CAAC,SAAS,QAAQ,IAAI,gBAAgB;AAEjE,MAAI,CAAC,SAAS,IAAI;AAChB,QAAI,qBAAqB,YAAY,SAAS,kBAAkB,GAAG;AACjE,YAAM,cAAc,MAAM,SAAS,KAAA;AACnC,YAAM,SAAS,cAAc,aAAa,EAAE,SAAS,gBAAiB;AACtE,YAAM;AAAA,IACR;AAEA,UAAM,IAAI,MAAM,MAAM,SAAS,MAAM;AAAA,EACvC;AAEA,MAAI,mBAAmB;AACrB,QAAI;AACJ,QAAI,YAAY,SAAS,sBAAsB,GAAG;AAChD,YAAM,2BAAW,IAAA;AACjB,eAAS,MAAM,wBAAwB;AAAA,QACrC;AAAA,QACA,WAAW,CAAC,QACV,cAAc,KAAK,EAAE,MAAM,SAAS,gBAAiB;AAAA,QACvD,QAAQ,KAAK,OAAO;AAElB,kBAAQ,MAAM,KAAK,KAAK;AAAA,QAC1B;AAAA,MAAA,CACD;AAAA,IACH;AACA,QAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,YAAM,cAAc,MAAM,SAAS,KAAA;AACnC,eAAS,cAAc,aAAa,EAAE,SAAS,gBAAiB;AAAA,IAClE;AACA,cAAU,QAAQ,gCAAgC;AAClD,QAAI,kBAAkB,OAAO;AAC3B,YAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,UAAM,cAAc,MAAM,SAAS,KAAA;AACnC,UAAM,WAAW,cAAc,WAAW;AAC1C,QAAI,UAAU;AACZ,YAAM;AAAA,IACR;AACA,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,wBAAwB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,CAAC,SAAS,MAAM;AAClB,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,QAAM,SAAS,SAAS,KAAK,YAAY,IAAI,kBAAA,CAAmB,EAAE,UAAA;AAElE,MAAI,SAAS;AACb,MAAI,YAAY;AAChB,MAAI;AAEJ,SAAO,CAAC,WAAW;AACjB,UAAM,EAAE,OAAO,KAAA,IAAS,MAAM,OAAO,KAAA;AACrC,QAAI,MAAO,WAAU;AAErB,QAAI,OAAO,WAAW,KAAK,MAAM;AAC/B,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAGA,QAAI,OAAO,SAAS,IAAI,GAAG;AACzB,YAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAC/C,YAAM,YAAY,MAAM,CAAC;AACzB,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,iCAAiC;AACjE,oBAAc,KAAK,MAAM,SAAS;AAClC,kBAAY;AACZ,eAAS,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,IACnC,OAAO;AAEL,YAAM,eAAe,OAAO,QAAQ,IAAI;AACxC,UAAI,gBAAgB,GAAG;AACrB,cAAM,OAAO,OAAO,MAAM,GAAG,YAAY,EAAE,KAAA;AAC3C,iBAAS,OAAO,MAAM,eAAe,CAAC;AACtC,YAAI,KAAK,SAAS,GAAG;AACnB,wBAAc,KAAK,MAAM,IAAI;AAC7B,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGC,GAAC,YAAY;AACZ,QAAI;AAEF,aAAO,MAAM;AACX,cAAM,EAAE,OAAO,KAAA,IAAS,MAAM,OAAO,KAAA;AACrC,YAAI,MAAO,WAAU;AAErB,cAAM,cAAc,OAAO,YAAY,IAAI;AAC3C,YAAI,eAAe,GAAG;AACpB,gBAAM,QAAQ,OAAO,MAAM,GAAG,WAAW;AACzC,mBAAS,OAAO,MAAM,cAAc,CAAC;AACrC,gBAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,OAAO,OAAO;AAE9C,qBAAW,QAAQ,OAAO;AACxB,gBAAI;AACF,wBAAU,KAAK,MAAM,IAAI,CAAC;AAAA,YAC5B,SAAS,GAAG;AACV,wBAAU,sBAAsB,IAAI,IAAI,CAAC;AAAA,YAC3C;AAAA,UACF;AAAA,QACF;AAEA,YAAI,MAAM;AACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,gBAAU,4BAA4B,GAAG;AAAA,IAC3C;AAAA,EACF,GAAA;AAEA,SAAO,UAAU,WAAW;AAC9B;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/start-client-core",
3
- "version": "1.132.0-alpha.7",
3
+ "version": "1.132.0-alpha.8",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -48,8 +48,8 @@
48
48
  "seroval-plugins": "^1.3.2",
49
49
  "tiny-invariant": "^1.3.3",
50
50
  "tiny-warning": "^1.0.3",
51
- "@tanstack/start-storage-context": "1.132.0-alpha.4",
52
- "@tanstack/router-core": "1.132.0-alpha.4"
51
+ "@tanstack/router-core": "1.132.0-alpha.8",
52
+ "@tanstack/start-storage-context": "1.132.0-alpha.8"
53
53
  },
54
54
  "scripts": {}
55
55
  }
@@ -9,30 +9,36 @@ import type {
9
9
  Constrain,
10
10
  Expand,
11
11
  IntersectAssign,
12
+ Register,
12
13
  RegisteredRouter,
13
14
  ResolveValidatorInput,
14
15
  ResolveValidatorOutput,
16
+ ValidateSerializableInput,
15
17
  } from '@tanstack/router-core'
16
- import type { SerializerStringify } from './serializer'
17
18
 
18
- export function createMiddleware<TType extends MiddlewareType>(
19
+ export function createMiddleware<
20
+ TRegister extends Register,
21
+ TType extends MiddlewareType,
22
+ >(
19
23
  options: {
20
24
  type: TType
21
25
  validateClient?: boolean
22
26
  },
23
27
  __opts?: FunctionMiddlewareOptions<
28
+ TRegister,
24
29
  unknown,
25
30
  undefined,
26
31
  undefined,
27
32
  undefined,
28
33
  ServerFnResponseType
29
34
  >,
30
- ): CreateMiddlewareResult<TType> {
35
+ ): CreateMiddlewareResult<TRegister, TType> {
31
36
  // const resolvedOptions = (__opts || options) as MiddlewareOptions<
32
37
  const resolvedOptions = {
33
38
  type: 'function',
34
39
  ...(__opts ||
35
40
  (options as FunctionMiddlewareOptions<
41
+ TRegister,
36
42
  unknown,
37
43
  undefined,
38
44
  undefined,
@@ -67,31 +73,44 @@ export function createMiddleware<TType extends MiddlewareType>(
67
73
  Object.assign(resolvedOptions, { server }),
68
74
  ) as any
69
75
  },
70
- } as unknown as CreateMiddlewareResult<TType>
76
+ } as unknown as CreateMiddlewareResult<TRegister, TType>
71
77
  }
72
78
 
73
79
  export type MiddlewareType = 'request' | 'function'
74
80
 
75
- export type CreateMiddlewareResult<TType extends MiddlewareType> =
76
- 'function' extends TType
77
- ? FunctionMiddleware<ServerFnResponseType>
78
- : RequestMiddleware
81
+ export type CreateMiddlewareResult<
82
+ TRegister extends Register,
83
+ TType extends MiddlewareType,
84
+ > = 'function' extends TType
85
+ ? FunctionMiddleware<TRegister, ServerFnResponseType>
86
+ : RequestMiddleware
79
87
 
80
88
  export interface FunctionMiddleware<
89
+ TRegister extends Register,
81
90
  TServerFnResponseType extends ServerFnResponseType,
82
- > extends FunctionMiddlewareAfterMiddleware<unknown, TServerFnResponseType> {
91
+ > extends FunctionMiddlewareAfterMiddleware<
92
+ TRegister,
93
+ unknown,
94
+ TServerFnResponseType
95
+ > {
83
96
  middleware: <const TNewMiddlewares = undefined>(
84
97
  middlewares: Constrain<
85
98
  TNewMiddlewares,
86
99
  ReadonlyArray<AnyFunctionMiddleware>
87
100
  >,
88
- ) => FunctionMiddlewareAfterMiddleware<TNewMiddlewares, TServerFnResponseType>
101
+ ) => FunctionMiddlewareAfterMiddleware<
102
+ TRegister,
103
+ TNewMiddlewares,
104
+ TServerFnResponseType
105
+ >
89
106
  }
90
107
 
91
108
  export interface FunctionMiddlewareAfterMiddleware<
109
+ TRegister extends Register,
92
110
  TMiddlewares,
93
111
  TServerFnResponseType extends ServerFnResponseType,
94
112
  > extends FunctionMiddlewareWithTypes<
113
+ TRegister,
95
114
  TMiddlewares,
96
115
  undefined,
97
116
  undefined,
@@ -101,16 +120,27 @@ export interface FunctionMiddlewareAfterMiddleware<
101
120
  TServerFnResponseType
102
121
  >,
103
122
  FunctionMiddlewareServer<
123
+ TRegister,
104
124
  TMiddlewares,
105
125
  undefined,
106
126
  undefined,
107
127
  undefined,
108
128
  TServerFnResponseType
109
129
  >,
110
- FunctionMiddlewareClient<TMiddlewares, undefined, TServerFnResponseType>,
111
- FunctionMiddlewareValidator<TMiddlewares, TServerFnResponseType> {}
130
+ FunctionMiddlewareClient<
131
+ TRegister,
132
+ TMiddlewares,
133
+ undefined,
134
+ TServerFnResponseType
135
+ >,
136
+ FunctionMiddlewareValidator<
137
+ TRegister,
138
+ TMiddlewares,
139
+ TServerFnResponseType
140
+ > {}
112
141
 
113
142
  export interface FunctionMiddlewareWithTypes<
143
+ TRegister extends Register,
114
144
  TMiddlewares,
115
145
  TValidator,
116
146
  TServerContext,
@@ -128,6 +158,7 @@ export interface FunctionMiddlewareWithTypes<
128
158
  TClientSendContext
129
159
  >
130
160
  options: FunctionMiddlewareOptions<
161
+ TRegister,
131
162
  TMiddlewares,
132
163
  TValidator,
133
164
  TServerContext,
@@ -218,6 +249,7 @@ export type AnyFunctionMiddleware = FunctionMiddlewareWithTypes<
218
249
  any,
219
250
  any,
220
251
  any,
252
+ any,
221
253
  any
222
254
  >
223
255
 
@@ -309,6 +341,7 @@ export type AssignAllClientSendContext<
309
341
  >
310
342
 
311
343
  export interface FunctionMiddlewareOptions<
344
+ in out TRegister extends Register,
312
345
  in out TMiddlewares,
313
346
  in out TValidator,
314
347
  in out TServerContext,
@@ -317,8 +350,9 @@ export interface FunctionMiddlewareOptions<
317
350
  > {
318
351
  validateClient?: boolean
319
352
  middleware?: TMiddlewares
320
- validator?: ConstrainValidator<TValidator>
353
+ validator?: ConstrainValidator<TRegister, TValidator>
321
354
  client?: FunctionMiddlewareClientFn<
355
+ TRegister,
322
356
  TMiddlewares,
323
357
  TValidator,
324
358
  TServerContext,
@@ -326,6 +360,7 @@ export interface FunctionMiddlewareOptions<
326
360
  TServerFnResponseType
327
361
  >
328
362
  server?: FunctionMiddlewareServerFn<
363
+ TRegister,
329
364
  TMiddlewares,
330
365
  TValidator,
331
366
  TServerContext,
@@ -335,18 +370,19 @@ export interface FunctionMiddlewareOptions<
335
370
  >
336
371
  }
337
372
 
338
- export type FunctionMiddlewareClientNextFn<TMiddlewares> = <
339
- TSendContext = undefined,
340
- TNewClientContext = undefined,
341
- >(ctx?: {
373
+ export type FunctionMiddlewareClientNextFn<
374
+ TRegister extends Register,
375
+ TMiddlewares,
376
+ > = <TSendContext = undefined, TNewClientContext = undefined>(ctx?: {
342
377
  context?: TNewClientContext
343
- sendContext?: SerializerStringify<TSendContext>
378
+ sendContext?: ValidateSerializableInput<TRegister, TSendContext>
344
379
  headers?: HeadersInit
345
380
  }) => Promise<
346
381
  FunctionClientResultWithContext<TMiddlewares, TSendContext, TNewClientContext>
347
382
  >
348
383
 
349
384
  export interface FunctionMiddlewareServer<
385
+ TRegister extends Register,
350
386
  TMiddlewares,
351
387
  TValidator,
352
388
  TServerSendContext,
@@ -355,6 +391,7 @@ export interface FunctionMiddlewareServer<
355
391
  > {
356
392
  server: <TNewServerContext = undefined, TSendContext = undefined>(
357
393
  server: FunctionMiddlewareServerFn<
394
+ TRegister,
358
395
  TMiddlewares,
359
396
  TValidator,
360
397
  TServerSendContext,
@@ -363,6 +400,7 @@ export interface FunctionMiddlewareServer<
363
400
  TServerFnResponseType
364
401
  >,
365
402
  ) => FunctionMiddlewareAfterServer<
403
+ TRegister,
366
404
  TMiddlewares,
367
405
  TValidator,
368
406
  TNewServerContext,
@@ -372,7 +410,9 @@ export interface FunctionMiddlewareServer<
372
410
  ServerFnResponseType
373
411
  >
374
412
  }
413
+
375
414
  export type FunctionMiddlewareServerFn<
415
+ TRegister extends Register,
376
416
  TMiddlewares,
377
417
  TValidator,
378
418
  TServerSendContext,
@@ -381,6 +421,7 @@ export type FunctionMiddlewareServerFn<
381
421
  TServerFnResponseType extends ServerFnResponseType,
382
422
  > = (
383
423
  options: FunctionMiddlewareServerFnOptions<
424
+ TRegister,
384
425
  TMiddlewares,
385
426
  TValidator,
386
427
  TServerSendContext,
@@ -394,23 +435,29 @@ export type FunctionMiddlewareServerFn<
394
435
  >
395
436
 
396
437
  export interface RequestMiddlewareServerFnOptions<
438
+ in out TRegister extends Register,
397
439
  in out TMiddlewares,
398
440
  in out TServerSendContext,
399
441
  > {
400
442
  request: Request
401
443
  context: Expand<AssignAllServerContext<TMiddlewares, TServerSendContext>>
402
- next: FunctionMiddlewareServerNextFn<TMiddlewares, TServerSendContext>
444
+ next: FunctionMiddlewareServerNextFn<
445
+ TRegister,
446
+ TMiddlewares,
447
+ TServerSendContext
448
+ >
403
449
  response: Response
404
450
  method: Method
405
451
  signal: AbortSignal
406
452
  }
407
453
 
408
- export type FunctionMiddlewareServerNextFn<TMiddlewares, TServerSendContext> = <
409
- TNewServerContext = undefined,
410
- TSendContext = undefined,
411
- >(ctx?: {
454
+ export type FunctionMiddlewareServerNextFn<
455
+ TRegister extends Register,
456
+ TMiddlewares,
457
+ TServerSendContext,
458
+ > = <TNewServerContext = undefined, TSendContext = undefined>(ctx?: {
412
459
  context?: TNewServerContext
413
- sendContext?: SerializerStringify<TSendContext>
460
+ sendContext?: ValidateSerializableInput<TRegister, TSendContext>
414
461
  }) => Promise<
415
462
  FunctionServerResultWithContext<
416
463
  TMiddlewares,
@@ -438,6 +485,7 @@ export type FunctionServerResultWithContext<
438
485
  }
439
486
 
440
487
  export interface FunctionMiddlewareServerFnOptions<
488
+ in out TRegister extends Register,
441
489
  in out TMiddlewares,
442
490
  in out TValidator,
443
491
  in out TServerSendContext,
@@ -445,7 +493,11 @@ export interface FunctionMiddlewareServerFnOptions<
445
493
  > {
446
494
  data: Expand<IntersectAllValidatorOutputs<TMiddlewares, TValidator>>
447
495
  context: Expand<AssignAllServerContext<TMiddlewares, TServerSendContext>>
448
- next: FunctionMiddlewareServerNextFn<TMiddlewares, TServerSendContext>
496
+ next: FunctionMiddlewareServerNextFn<
497
+ TRegister,
498
+ TMiddlewares,
499
+ TServerSendContext
500
+ >
449
501
  response: TServerFnResponseType
450
502
  method: Method
451
503
  filename: string
@@ -475,6 +527,7 @@ export type FunctionMiddlewareServerFnResult<
475
527
  >
476
528
 
477
529
  export interface FunctionMiddlewareAfterServer<
530
+ TRegister extends Register,
478
531
  TMiddlewares,
479
532
  TValidator,
480
533
  TServerContext,
@@ -483,6 +536,7 @@ export interface FunctionMiddlewareAfterServer<
483
536
  TClientSendContext,
484
537
  TServerFnResponseType extends ServerFnResponseType,
485
538
  > extends FunctionMiddlewareWithTypes<
539
+ TRegister,
486
540
  TMiddlewares,
487
541
  TValidator,
488
542
  TServerContext,
@@ -493,6 +547,7 @@ export interface FunctionMiddlewareAfterServer<
493
547
  > {}
494
548
 
495
549
  export interface FunctionMiddlewareClient<
550
+ TRegister extends Register,
496
551
  TMiddlewares,
497
552
  TValidator,
498
553
  TServerFnResponseType extends ServerFnResponseType,
@@ -500,6 +555,7 @@ export interface FunctionMiddlewareClient<
500
555
  > {
501
556
  client: <TSendServerContext = undefined, TNewClientContext = undefined>(
502
557
  client: FunctionMiddlewareClientFn<
558
+ TRegister,
503
559
  TMiddlewares,
504
560
  TValidator,
505
561
  TSendServerContext,
@@ -508,6 +564,7 @@ export interface FunctionMiddlewareClient<
508
564
  TRouter
509
565
  >,
510
566
  ) => FunctionMiddlewareAfterClient<
567
+ TRegister,
511
568
  TMiddlewares,
512
569
  TValidator,
513
570
  TSendServerContext,
@@ -517,6 +574,7 @@ export interface FunctionMiddlewareClient<
517
574
  }
518
575
 
519
576
  export type FunctionMiddlewareClientFn<
577
+ TRegister extends Register,
520
578
  TMiddlewares,
521
579
  TValidator,
522
580
  TSendContext,
@@ -525,6 +583,7 @@ export type FunctionMiddlewareClientFn<
525
583
  TRouter extends AnyRouter = RegisteredRouter,
526
584
  > = (
527
585
  options: FunctionMiddlewareClientFnOptions<
586
+ TRegister,
528
587
  TMiddlewares,
529
588
  TValidator,
530
589
  TServerFnResponseType,
@@ -537,6 +596,7 @@ export type FunctionMiddlewareClientFn<
537
596
  >
538
597
 
539
598
  export interface FunctionMiddlewareClientFnOptions<
599
+ in out TRegister extends Register,
540
600
  in out TMiddlewares,
541
601
  in out TValidator,
542
602
  in out TServerFnResponseType extends ServerFnResponseType,
@@ -548,7 +608,7 @@ export interface FunctionMiddlewareClientFnOptions<
548
608
  method: Method
549
609
  response: TServerFnResponseType
550
610
  signal: AbortSignal
551
- next: FunctionMiddlewareClientNextFn<TMiddlewares>
611
+ next: FunctionMiddlewareClientNextFn<TRegister, TMiddlewares>
552
612
  filename: string
553
613
  functionId: string
554
614
  router: TRouter
@@ -580,12 +640,14 @@ export type FunctionClientResultWithContext<
580
640
  }
581
641
 
582
642
  export interface FunctionMiddlewareAfterClient<
643
+ TRegister extends Register,
583
644
  TMiddlewares,
584
645
  TValidator,
585
646
  TServerSendContext,
586
647
  TClientContext,
587
648
  TServerFnResponseType extends ServerFnResponseType,
588
649
  > extends FunctionMiddlewareWithTypes<
650
+ TRegister,
589
651
  TMiddlewares,
590
652
  TValidator,
591
653
  undefined,
@@ -595,6 +657,7 @@ export interface FunctionMiddlewareAfterClient<
595
657
  TServerFnResponseType
596
658
  >,
597
659
  FunctionMiddlewareServer<
660
+ TRegister,
598
661
  TMiddlewares,
599
662
  TValidator,
600
663
  TServerSendContext,
@@ -603,12 +666,14 @@ export interface FunctionMiddlewareAfterClient<
603
666
  > {}
604
667
 
605
668
  export interface FunctionMiddlewareValidator<
669
+ TRegister extends Register,
606
670
  TMiddlewares,
607
671
  TServerFnResponseType extends ServerFnResponseType,
608
672
  > {
609
673
  validator: <TNewValidator>(
610
- input: ConstrainValidator<TNewValidator>,
674
+ input: ConstrainValidator<TRegister, TNewValidator>,
611
675
  ) => FunctionMiddlewareAfterValidator<
676
+ TRegister,
612
677
  TMiddlewares,
613
678
  TNewValidator,
614
679
  TServerFnResponseType
@@ -616,10 +681,12 @@ export interface FunctionMiddlewareValidator<
616
681
  }
617
682
 
618
683
  export interface FunctionMiddlewareAfterValidator<
684
+ TRegister extends Register,
619
685
  TMiddlewares,
620
686
  TValidator,
621
687
  TServerFnResponseType extends ServerFnResponseType,
622
688
  > extends FunctionMiddlewareWithTypes<
689
+ TRegister,
623
690
  TMiddlewares,
624
691
  TValidator,
625
692
  undefined,
@@ -629,13 +696,19 @@ export interface FunctionMiddlewareAfterValidator<
629
696
  ServerFnResponseType
630
697
  >,
631
698
  FunctionMiddlewareServer<
699
+ TRegister,
632
700
  TMiddlewares,
633
701
  TValidator,
634
702
  undefined,
635
703
  undefined,
636
704
  TServerFnResponseType
637
705
  >,
638
- FunctionMiddlewareClient<TMiddlewares, TValidator, ServerFnResponseType> {}
706
+ FunctionMiddlewareClient<
707
+ TRegister,
708
+ TMiddlewares,
709
+ TValidator,
710
+ ServerFnResponseType
711
+ > {}
639
712
 
640
713
  export interface RequestMiddleware
641
714
  extends RequestMiddlewareAfterMiddleware<undefined> {