@tanstack/start-server-core 1.131.6 → 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 (63) hide show
  1. package/dist/esm/createStartHandler.d.ts +1 -1
  2. package/dist/esm/createStartHandler.js +8 -9
  3. package/dist/esm/createStartHandler.js.map +1 -1
  4. package/dist/esm/index.d.ts +1 -1
  5. package/dist/esm/index.js +6 -90
  6. package/dist/esm/index.js.map +1 -1
  7. package/dist/esm/loadVirtualModule.js +2 -0
  8. package/dist/esm/loadVirtualModule.js.map +1 -1
  9. package/dist/esm/request-response.d.ts +124 -0
  10. package/dist/esm/request-response.js +177 -0
  11. package/dist/esm/request-response.js.map +1 -0
  12. package/dist/esm/router-manifest.js +6 -3
  13. package/dist/esm/router-manifest.js.map +1 -1
  14. package/dist/esm/server-functions-handler.js +25 -59
  15. package/dist/esm/server-functions-handler.js.map +1 -1
  16. package/dist/esm/serverRoute.js +1 -2
  17. package/dist/esm/serverRoute.js.map +1 -1
  18. package/dist/esm/session.d.ts +66 -0
  19. package/dist/esm/virtual-modules.d.ts +2 -0
  20. package/dist/esm/virtual-modules.js +2 -1
  21. package/dist/esm/virtual-modules.js.map +1 -1
  22. package/package.json +9 -19
  23. package/src/createStartHandler.ts +7 -7
  24. package/src/global.d.ts +1 -3
  25. package/src/index.tsx +1 -1
  26. package/src/loadVirtualModule.ts +2 -0
  27. package/src/request-response.ts +335 -0
  28. package/src/router-manifest.ts +6 -3
  29. package/src/server-functions-handler.ts +29 -67
  30. package/src/session.ts +75 -0
  31. package/src/tanstack-start.d.ts +4 -0
  32. package/src/virtual-modules.ts +2 -0
  33. package/dist/cjs/constants.cjs +0 -7
  34. package/dist/cjs/constants.cjs.map +0 -1
  35. package/dist/cjs/constants.d.cts +0 -3
  36. package/dist/cjs/createStartHandler.cjs +0 -342
  37. package/dist/cjs/createStartHandler.cjs.map +0 -1
  38. package/dist/cjs/createStartHandler.d.cts +0 -7
  39. package/dist/cjs/h3.cjs +0 -355
  40. package/dist/cjs/h3.cjs.map +0 -1
  41. package/dist/cjs/h3.d.cts +0 -109
  42. package/dist/cjs/index.cjs +0 -257
  43. package/dist/cjs/index.cjs.map +0 -1
  44. package/dist/cjs/index.d.cts +0 -10
  45. package/dist/cjs/loadVirtualModule.cjs +0 -39
  46. package/dist/cjs/loadVirtualModule.cjs.map +0 -1
  47. package/dist/cjs/loadVirtualModule.d.cts +0 -6
  48. package/dist/cjs/router-manifest.cjs +0 -46
  49. package/dist/cjs/router-manifest.cjs.map +0 -1
  50. package/dist/cjs/router-manifest.d.cts +0 -17
  51. package/dist/cjs/server-functions-handler.cjs +0 -181
  52. package/dist/cjs/server-functions-handler.cjs.map +0 -1
  53. package/dist/cjs/server-functions-handler.d.cts +0 -3
  54. package/dist/cjs/serverRoute.cjs +0 -104
  55. package/dist/cjs/serverRoute.cjs.map +0 -1
  56. package/dist/cjs/serverRoute.d.cts +0 -124
  57. package/dist/cjs/virtual-modules.cjs +0 -9
  58. package/dist/cjs/virtual-modules.cjs.map +0 -1
  59. package/dist/cjs/virtual-modules.d.cts +0 -10
  60. package/dist/esm/h3.d.ts +0 -109
  61. package/dist/esm/h3.js +0 -248
  62. package/dist/esm/h3.js.map +0 -1
  63. package/src/h3.ts +0 -492
@@ -1,4 +1,4 @@
1
- import { RequestHandler } from './h3.js';
1
+ import { RequestHandler } from './request-response.js';
2
2
  import { AnyRouter, Awaitable } from '@tanstack/router-core';
3
3
  import { HandlerCallback } from '@tanstack/router-core/ssr/server';
4
4
  export type CustomizeStartHandler<TRouter extends AnyRouter> = (cb: HandlerCallback<TRouter>) => RequestHandler;
@@ -3,7 +3,7 @@ import { json, mergeHeaders, flattenMiddlewares } from "@tanstack/start-client-c
3
3
  import { joinPaths, trimPath, processRouteTree, isRedirect, isResolvedRedirect, getMatchedRoutes } from "@tanstack/router-core";
4
4
  import { attachRouterServerSsrUtils } from "@tanstack/router-core/ssr/server";
5
5
  import { runWithStartContext } from "@tanstack/start-storage-context";
6
- import { requestHandler, getResponseHeaders } from "./h3.js";
6
+ import { requestHandler, getResponseHeaders } from "./request-response.js";
7
7
  import { getStartManifest } from "./router-manifest.js";
8
8
  import { handleServerAction } from "./server-functions-handler.js";
9
9
  import { VIRTUAL_MODULES } from "./virtual-modules.js";
@@ -13,7 +13,7 @@ function getStartResponseHeaders(opts) {
13
13
  const headers = mergeHeaders(
14
14
  getResponseHeaders(),
15
15
  {
16
- "Content-Type": "text/html; charset=UTF-8"
16
+ "Content-Type": "text/html; charset=utf-8"
17
17
  },
18
18
  ...opts.router.state.matches.map((match) => {
19
19
  return match.headers;
@@ -29,11 +29,11 @@ function createStartHandler({
29
29
  let processedServerRouteTree = void 0;
30
30
  return (cb) => {
31
31
  const originalFetch = globalThis.fetch;
32
- const startRequestResolver = async ({ request }) => {
32
+ const startRequestResolver = async (request) => {
33
33
  globalThis.fetch = async function(input, init) {
34
34
  function resolve(url2, requestOptions) {
35
35
  const fetchRequest = new Request(url2, requestOptions);
36
- return startRequestResolver({ request: fetchRequest });
36
+ return startRequestResolver(fetchRequest);
37
37
  }
38
38
  function getOrigin() {
39
39
  return request.headers.get("Origin") || request.headers.get("Referer") || "http://localhost";
@@ -48,7 +48,7 @@ function createStartHandler({
48
48
  return originalFetch(input, init);
49
49
  };
50
50
  const url = new URL(request.url);
51
- const href = url.href.replace(url.origin, "");
51
+ const href = decodeURIComponent(url.href.replace(url.origin, ""));
52
52
  const APP_BASE = process.env.TSS_APP_BASE || "/";
53
53
  const router = await createRouter();
54
54
  const history = createMemoryHistory({
@@ -204,7 +204,6 @@ function createStartHandler({
204
204
  };
205
205
  }
206
206
  async function handleServerRoutes(opts) {
207
- var _a, _b;
208
207
  const url = new URL(opts.request.url);
209
208
  const pathname = url.pathname;
210
209
  const serverTreeResult = getMatchedRoutes({
@@ -233,7 +232,7 @@ async function handleServerRoutes(opts) {
233
232
  break;
234
233
  }
235
234
  matchedRoutes.push(route);
236
- routeId = (_a = route.parentRoute) == null ? void 0 : _a.id;
235
+ routeId = route.parentRoute?.id;
237
236
  } while (routeId);
238
237
  matchedRoutes.reverse();
239
238
  }
@@ -243,7 +242,7 @@ async function handleServerRoutes(opts) {
243
242
  const middlewares = flattenMiddlewares(
244
243
  matchedRoutes.flatMap((r) => r.options.middleware).filter(Boolean)
245
244
  ).map((d) => d.options.server);
246
- if ((_b = serverTreeResult.foundRoute) == null ? void 0 : _b.options.methods) {
245
+ if (serverTreeResult.foundRoute?.options.methods) {
247
246
  const method = Object.keys(
248
247
  serverTreeResult.foundRoute.options.methods
249
248
  ).find(
@@ -304,7 +303,7 @@ function executeMiddleware(middlewares, ctx) {
304
303
  ...nextCtx,
305
304
  context: {
306
305
  ...ctx2.context,
307
- ...(nextCtx == null ? void 0 : nextCtx.context) || {}
306
+ ...nextCtx?.context || {}
308
307
  }
309
308
  });
310
309
  return Object.assign(ctx2, handleCtxResult(nextResult));
@@ -1 +1 @@
1
- {"version":3,"file":"createStartHandler.js","sources":["../../src/createStartHandler.ts"],"sourcesContent":["import { createMemoryHistory } from '@tanstack/history'\nimport {\n flattenMiddlewares,\n json,\n mergeHeaders,\n} from '@tanstack/start-client-core'\nimport {\n getMatchedRoutes,\n isRedirect,\n isResolvedRedirect,\n joinPaths,\n processRouteTree,\n trimPath,\n} from '@tanstack/router-core'\nimport { attachRouterServerSsrUtils } from '@tanstack/router-core/ssr/server'\nimport { runWithStartContext } from '@tanstack/start-storage-context'\nimport { getResponseHeaders, requestHandler } from './h3'\nimport { getStartManifest } from './router-manifest'\nimport { handleServerAction } from './server-functions-handler'\nimport { VIRTUAL_MODULES } from './virtual-modules'\nimport { loadVirtualModule } from './loadVirtualModule'\n\nimport { HEADERS } from './constants'\nimport type {\n AnyServerRouteWithTypes,\n ServerRouteMethodHandlerFn,\n} from './serverRoute'\nimport type { RequestHandler } from './h3'\nimport type {\n AnyRoute,\n AnyRouter,\n Awaitable,\n Manifest,\n ProcessRouteTreeResult,\n} from '@tanstack/router-core'\nimport type { HandlerCallback } from '@tanstack/router-core/ssr/server'\n\ntype TODO = any\n\nexport type CustomizeStartHandler<TRouter extends AnyRouter> = (\n cb: HandlerCallback<TRouter>,\n) => RequestHandler\n\nfunction getStartResponseHeaders(opts: { router: AnyRouter }) {\n const headers = mergeHeaders(\n getResponseHeaders(),\n {\n 'Content-Type': 'text/html; charset=UTF-8',\n },\n ...opts.router.state.matches.map((match) => {\n return match.headers\n }),\n )\n return headers\n}\n\nexport function createStartHandler<TRouter extends AnyRouter>({\n createRouter,\n}: {\n createRouter: () => Awaitable<TRouter>\n}): CustomizeStartHandler<TRouter> {\n let routeTreeModule: {\n serverRouteTree: AnyServerRouteWithTypes | undefined\n routeTree: AnyRoute | undefined\n } | null = null\n let startRoutesManifest: Manifest | null = null\n let processedServerRouteTree:\n | ProcessRouteTreeResult<AnyServerRouteWithTypes>\n | undefined = undefined\n\n return (cb) => {\n const originalFetch = globalThis.fetch\n\n const startRequestResolver: RequestHandler = async ({ request }) => {\n // Patching fetch function to use our request resolver\n // if the input starts with `/` which is a common pattern for\n // client-side routing.\n // When we encounter similar requests, we can assume that the\n // user wants to use the same origin as the current request.\n globalThis.fetch = async function (input, init) {\n function resolve(url: URL, requestOptions: RequestInit | undefined) {\n const fetchRequest = new Request(url, requestOptions)\n return startRequestResolver({ request: fetchRequest })\n }\n\n function getOrigin() {\n return (\n request.headers.get('Origin') ||\n request.headers.get('Referer') ||\n 'http://localhost'\n )\n }\n\n if (typeof input === 'string' && input.startsWith('/')) {\n // e.g: fetch('/api/data')\n const url = new URL(input, getOrigin())\n return resolve(url, init)\n } else if (\n typeof input === 'object' &&\n 'url' in input &&\n typeof input.url === 'string' &&\n input.url.startsWith('/')\n ) {\n // e.g: fetch(new Request('/api/data'))\n const url = new URL(input.url, getOrigin())\n return resolve(url, init)\n }\n\n // If not, it should just use the original fetch\n return originalFetch(input, init)\n }\n\n const url = new URL(request.url)\n const href = url.href.replace(url.origin, '')\n\n const APP_BASE = process.env.TSS_APP_BASE || '/'\n\n // TODO how does this work with base path? does the router need to be configured the same as APP_BASE?\n const router = await createRouter()\n\n // Create a history for the client-side router\n const history = createMemoryHistory({\n initialEntries: [href],\n })\n\n // Update the client-side router with the history\n const isPrerendering = process.env.TSS_PRERENDERING === 'true'\n // env var is set during dev is SPA mode is enabled\n let isShell = process.env.TSS_SHELL === 'true'\n if (isPrerendering && !isShell) {\n // only read the shell header if we are prerendering\n // to avoid runtime behavior changes by injecting this header\n // the header is set by the prerender plugin\n isShell = request.headers.get(HEADERS.TSS_SHELL) === 'true'\n }\n router.update({\n history,\n isShell,\n isPrerendering,\n })\n\n const response = await (async () => {\n try {\n if (!process.env.TSS_SERVER_FN_BASE) {\n throw new Error(\n 'tanstack/start-server-core: TSS_SERVER_FN_BASE must be defined in your environment for createStartHandler()',\n )\n }\n\n // First, let's attempt to handle server functions\n // Add trailing slash to sanitise user defined TSS_SERVER_FN_BASE\n const serverFnBase = joinPaths([\n APP_BASE,\n trimPath(process.env.TSS_SERVER_FN_BASE),\n '/',\n ])\n if (href.startsWith(serverFnBase)) {\n return await handleServerAction({ request })\n }\n\n if (routeTreeModule === null) {\n try {\n routeTreeModule = await loadVirtualModule(\n VIRTUAL_MODULES.routeTree,\n )\n if (routeTreeModule.serverRouteTree) {\n processedServerRouteTree =\n processRouteTree<AnyServerRouteWithTypes>({\n routeTree: routeTreeModule.serverRouteTree,\n initRoute: (route, i) => {\n route.init({\n originalIndex: i,\n })\n },\n })\n }\n } catch (e) {\n console.log(e)\n }\n }\n\n const executeRouter = () =>\n runWithStartContext({ router }, async () => {\n const requestAcceptHeader = request.headers.get('Accept') || '*/*'\n const splitRequestAcceptHeader = requestAcceptHeader.split(',')\n\n const supportedMimeTypes = ['*/*', 'text/html']\n const isRouterAcceptSupported = supportedMimeTypes.some(\n (mimeType) =>\n splitRequestAcceptHeader.some((acceptedMimeType) =>\n acceptedMimeType.trim().startsWith(mimeType),\n ),\n )\n\n if (!isRouterAcceptSupported) {\n return json(\n {\n error: 'Only HTML requests are supported here',\n },\n {\n status: 500,\n },\n )\n }\n\n // if the startRoutesManifest is not loaded yet, load it once\n if (startRoutesManifest === null) {\n startRoutesManifest = await getStartManifest({\n basePath: APP_BASE,\n })\n }\n\n // Attach the server-side SSR utils to the client-side router\n attachRouterServerSsrUtils(router, startRoutesManifest)\n\n await router.load()\n\n // If there was a redirect, skip rendering the page at all\n if (router.state.redirect) {\n return router.state.redirect\n }\n\n await router.serverSsr!.dehydrate()\n\n const responseHeaders = getStartResponseHeaders({ router })\n const response = await cb({\n request,\n router,\n responseHeaders,\n })\n\n return response\n })\n\n // If we have a server route tree, then we try matching to see if we have a\n // server route that matches the request.\n if (processedServerRouteTree) {\n const [_matchedRoutes, response] = await handleServerRoutes({\n processedServerRouteTree,\n router,\n request,\n basePath: APP_BASE,\n executeRouter,\n })\n\n if (response) return response\n }\n\n // Server Routes did not produce a response, so fallback to normal SSR matching using the router\n const routerResponse = await executeRouter()\n return routerResponse\n } catch (err) {\n if (err instanceof Response) {\n return err\n }\n\n throw err\n }\n })()\n\n if (isRedirect(response)) {\n if (isResolvedRedirect(response)) {\n if (request.headers.get('x-tsr-redirect') === 'manual') {\n return json(\n {\n ...response.options,\n isSerializedRedirect: true,\n },\n {\n headers: response.headers,\n },\n )\n }\n return response\n }\n if (\n response.options.to &&\n typeof response.options.to === 'string' &&\n !response.options.to.startsWith('/')\n ) {\n throw new Error(\n `Server side redirects must use absolute paths via the 'href' or 'to' options. The redirect() method's \"to\" property accepts an internal path only. Use the \"href\" property to provide an external URL. Received: ${JSON.stringify(response.options)}`,\n )\n }\n\n if (\n ['params', 'search', 'hash'].some(\n (d) => typeof (response.options as any)[d] === 'function',\n )\n ) {\n throw new Error(\n `Server side redirects must use static search, params, and hash values and do not support functional values. Received functional values for: ${Object.keys(\n response.options,\n )\n .filter((d) => typeof (response.options as any)[d] === 'function')\n .map((d) => `\"${d}\"`)\n .join(', ')}`,\n )\n }\n\n const redirect = router.resolveRedirect(response)\n\n if (request.headers.get('x-tsr-redirect') === 'manual') {\n return json(\n {\n ...response.options,\n isSerializedRedirect: true,\n },\n {\n headers: response.headers,\n },\n )\n }\n\n return redirect\n }\n\n return response\n }\n\n return requestHandler(startRequestResolver)\n }\n}\n\nasync function handleServerRoutes(opts: {\n router: AnyRouter\n processedServerRouteTree: ProcessRouteTreeResult<AnyServerRouteWithTypes>\n request: Request\n basePath: string\n executeRouter: () => Promise<Response>\n}) {\n const url = new URL(opts.request.url)\n const pathname = url.pathname\n\n const serverTreeResult = getMatchedRoutes<AnyServerRouteWithTypes>({\n pathname,\n basepath: opts.basePath,\n caseSensitive: true,\n routesByPath: opts.processedServerRouteTree.routesByPath,\n routesById: opts.processedServerRouteTree.routesById,\n flatRoutes: opts.processedServerRouteTree.flatRoutes,\n })\n\n const routeTreeResult = opts.router.getMatchedRoutes(pathname, undefined)\n\n let response: Response | undefined\n let matchedRoutes: Array<AnyServerRouteWithTypes> = []\n matchedRoutes = serverTreeResult.matchedRoutes\n // check if the app route tree found a match that is deeper than the server route tree\n if (routeTreeResult.foundRoute) {\n if (\n serverTreeResult.matchedRoutes.length <\n routeTreeResult.matchedRoutes.length\n ) {\n const closestCommon = [...routeTreeResult.matchedRoutes]\n .reverse()\n .find((r) => {\n return opts.processedServerRouteTree.routesById[r.id] !== undefined\n })\n if (closestCommon) {\n // walk up the tree and collect all parents\n let routeId = closestCommon.id\n matchedRoutes = []\n do {\n const route = opts.processedServerRouteTree.routesById[routeId]\n if (!route) {\n break\n }\n matchedRoutes.push(route)\n routeId = route.parentRoute?.id\n } while (routeId)\n\n matchedRoutes.reverse()\n }\n }\n }\n\n if (matchedRoutes.length) {\n // We've found a server route that (partially) matches the request, so we can call it.\n // TODO: Error handling? What happens when its `throw redirect()` vs `throw new Error()`?\n\n const middlewares = flattenMiddlewares(\n matchedRoutes.flatMap((r) => r.options.middleware).filter(Boolean),\n ).map((d) => d.options.server)\n\n if (serverTreeResult.foundRoute?.options.methods) {\n const method = Object.keys(\n serverTreeResult.foundRoute.options.methods,\n ).find(\n (method) => method.toLowerCase() === opts.request.method.toLowerCase(),\n )\n\n if (method) {\n const handler = serverTreeResult.foundRoute.options.methods[method]\n if (handler) {\n if (typeof handler === 'function') {\n middlewares.push(handlerToMiddleware(handler) as TODO)\n } else {\n if (\n handler._options.middlewares &&\n handler._options.middlewares.length\n ) {\n middlewares.push(\n ...flattenMiddlewares(handler._options.middlewares as any).map(\n (d) => d.options.server,\n ),\n )\n }\n if (handler._options.handler) {\n middlewares.push(handlerToMiddleware(handler._options.handler))\n }\n }\n }\n }\n }\n\n // eventually, execute the router\n middlewares.push(handlerToMiddleware(opts.executeRouter))\n\n // TODO: This is starting to feel too much like a server function\n // Do generalize the existing middleware execution? Or do we need to\n // build a new middleware execution system for server routes?\n const ctx = await executeMiddleware(middlewares, {\n request: opts.request,\n context: {},\n params: serverTreeResult.routeParams,\n pathname,\n })\n\n response = ctx.response\n }\n\n // We return the matched routes too so if\n // the app router happens to match the same path,\n // it can use any request middleware from server routes\n return [matchedRoutes, response] as const\n}\n\nfunction handlerToMiddleware(\n handler: ServerRouteMethodHandlerFn<\n AnyServerRouteWithTypes,\n any,\n any,\n any,\n any\n >,\n) {\n return async ({ next: _next, ...rest }: TODO) => {\n const response = await handler(rest)\n if (response) {\n return { response }\n }\n return _next(rest)\n }\n}\n\nfunction executeMiddleware(middlewares: TODO, ctx: TODO) {\n let index = -1\n\n const next = async (ctx: TODO) => {\n index++\n const middleware = middlewares[index]\n if (!middleware) return ctx\n\n const result = await middleware({\n ...ctx,\n // Allow the middleware to call the next middleware in the chain\n next: async (nextCtx: TODO) => {\n // Allow the caller to extend the context for the next middleware\n const nextResult = await next({\n ...ctx,\n ...nextCtx,\n context: {\n ...ctx.context,\n ...(nextCtx?.context || {}),\n },\n })\n\n // Merge the result into the context\\\n return Object.assign(ctx, handleCtxResult(nextResult))\n },\n // Allow the middleware result to extend the return context\n }).catch((err: TODO) => {\n if (isSpecialResponse(err)) {\n return {\n response: err,\n }\n }\n\n throw err\n })\n\n // Merge the middleware result into the context, just in case it\n // returns a partial context\n return Object.assign(ctx, handleCtxResult(result))\n }\n\n return handleCtxResult(next(ctx))\n}\n\nfunction handleCtxResult(result: TODO) {\n if (isSpecialResponse(result)) {\n return {\n response: result,\n }\n }\n\n return result\n}\n\nfunction isSpecialResponse(err: TODO) {\n return isResponse(err) || isRedirect(err)\n}\n\nfunction isResponse(response: Response): response is Response {\n return response instanceof Response\n}\n"],"names":["url","response","method","ctx"],"mappings":"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"}
1
+ {"version":3,"file":"createStartHandler.js","sources":["../../src/createStartHandler.ts"],"sourcesContent":["import { createMemoryHistory } from '@tanstack/history'\nimport {\n flattenMiddlewares,\n json,\n mergeHeaders,\n} from '@tanstack/start-client-core'\nimport {\n getMatchedRoutes,\n isRedirect,\n isResolvedRedirect,\n joinPaths,\n processRouteTree,\n trimPath,\n} from '@tanstack/router-core'\nimport { attachRouterServerSsrUtils } from '@tanstack/router-core/ssr/server'\nimport { runWithStartContext } from '@tanstack/start-storage-context'\nimport { getResponseHeaders, requestHandler } from './request-response'\nimport { getStartManifest } from './router-manifest'\nimport { handleServerAction } from './server-functions-handler'\nimport { VIRTUAL_MODULES } from './virtual-modules'\nimport { loadVirtualModule } from './loadVirtualModule'\n\nimport { HEADERS } from './constants'\nimport type {\n AnyServerRouteWithTypes,\n ServerRouteMethodHandlerFn,\n} from './serverRoute'\nimport type { RequestHandler } from './request-response'\nimport type {\n AnyRoute,\n AnyRouter,\n Awaitable,\n Manifest,\n ProcessRouteTreeResult,\n} from '@tanstack/router-core'\nimport type { HandlerCallback } from '@tanstack/router-core/ssr/server'\n\ntype TODO = any\n\nexport type CustomizeStartHandler<TRouter extends AnyRouter> = (\n cb: HandlerCallback<TRouter>,\n) => RequestHandler\n\nfunction getStartResponseHeaders(opts: { router: AnyRouter }) {\n const headers = mergeHeaders(\n getResponseHeaders() as Headers,\n {\n 'Content-Type': 'text/html; charset=utf-8',\n },\n ...opts.router.state.matches.map((match) => {\n return match.headers\n }),\n )\n return headers\n}\n\nexport function createStartHandler<TRouter extends AnyRouter>({\n createRouter,\n}: {\n createRouter: () => Awaitable<TRouter>\n}): CustomizeStartHandler<TRouter> {\n let routeTreeModule: {\n serverRouteTree: AnyServerRouteWithTypes | undefined\n routeTree: AnyRoute | undefined\n } | null = null\n let startRoutesManifest: Manifest | null = null\n let processedServerRouteTree:\n | ProcessRouteTreeResult<AnyServerRouteWithTypes>\n | undefined = undefined\n\n return (cb) => {\n const originalFetch = globalThis.fetch\n\n const startRequestResolver: RequestHandler = async (request) => {\n // Patching fetch function to use our request resolver\n // if the input starts with `/` which is a common pattern for\n // client-side routing.\n // When we encounter similar requests, we can assume that the\n // user wants to use the same origin as the current request.\n globalThis.fetch = async function (input, init) {\n function resolve(url: URL, requestOptions: RequestInit | undefined) {\n const fetchRequest = new Request(url, requestOptions)\n return startRequestResolver(fetchRequest)\n }\n\n function getOrigin() {\n return (\n request.headers.get('Origin') ||\n request.headers.get('Referer') ||\n 'http://localhost'\n )\n }\n\n if (typeof input === 'string' && input.startsWith('/')) {\n // e.g: fetch('/api/data')\n const url = new URL(input, getOrigin())\n return resolve(url, init)\n } else if (\n typeof input === 'object' &&\n 'url' in input &&\n typeof input.url === 'string' &&\n input.url.startsWith('/')\n ) {\n // e.g: fetch(new Request('/api/data'))\n const url = new URL(input.url, getOrigin())\n return resolve(url, init)\n }\n\n // If not, it should just use the original fetch\n return originalFetch(input, init)\n }\n\n const url = new URL(request.url)\n const href = decodeURIComponent(url.href.replace(url.origin, ''))\n\n const APP_BASE = process.env.TSS_APP_BASE || '/'\n\n // TODO how does this work with base path? does the router need to be configured the same as APP_BASE?\n const router = await createRouter()\n\n // Create a history for the client-side router\n const history = createMemoryHistory({\n initialEntries: [href],\n })\n\n // Update the client-side router with the history\n const isPrerendering = process.env.TSS_PRERENDERING === 'true'\n // env var is set during dev is SPA mode is enabled\n let isShell = process.env.TSS_SHELL === 'true'\n if (isPrerendering && !isShell) {\n // only read the shell header if we are prerendering\n // to avoid runtime behavior changes by injecting this header\n // the header is set by the prerender plugin\n isShell = request.headers.get(HEADERS.TSS_SHELL) === 'true'\n }\n router.update({\n history,\n isShell,\n isPrerendering,\n })\n\n const response = await (async () => {\n try {\n if (!process.env.TSS_SERVER_FN_BASE) {\n throw new Error(\n 'tanstack/start-server-core: TSS_SERVER_FN_BASE must be defined in your environment for createStartHandler()',\n )\n }\n\n // First, let's attempt to handle server functions\n // Add trailing slash to sanitise user defined TSS_SERVER_FN_BASE\n const serverFnBase = joinPaths([\n APP_BASE,\n trimPath(process.env.TSS_SERVER_FN_BASE),\n '/',\n ])\n if (href.startsWith(serverFnBase)) {\n return await handleServerAction({ request })\n }\n\n if (routeTreeModule === null) {\n try {\n routeTreeModule = await loadVirtualModule(\n VIRTUAL_MODULES.routeTree,\n )\n if (routeTreeModule.serverRouteTree) {\n processedServerRouteTree =\n processRouteTree<AnyServerRouteWithTypes>({\n routeTree: routeTreeModule.serverRouteTree,\n initRoute: (route, i) => {\n route.init({\n originalIndex: i,\n })\n },\n })\n }\n } catch (e) {\n console.log(e)\n }\n }\n\n const executeRouter = () =>\n runWithStartContext({ router }, async () => {\n const requestAcceptHeader = request.headers.get('Accept') || '*/*'\n const splitRequestAcceptHeader = requestAcceptHeader.split(',')\n\n const supportedMimeTypes = ['*/*', 'text/html']\n const isRouterAcceptSupported = supportedMimeTypes.some(\n (mimeType) =>\n splitRequestAcceptHeader.some((acceptedMimeType) =>\n acceptedMimeType.trim().startsWith(mimeType),\n ),\n )\n\n if (!isRouterAcceptSupported) {\n return json(\n {\n error: 'Only HTML requests are supported here',\n },\n {\n status: 500,\n },\n )\n }\n\n // if the startRoutesManifest is not loaded yet, load it once\n if (startRoutesManifest === null) {\n startRoutesManifest = await getStartManifest({\n basePath: APP_BASE,\n })\n }\n\n // Attach the server-side SSR utils to the client-side router\n attachRouterServerSsrUtils(router, startRoutesManifest)\n\n await router.load()\n\n // If there was a redirect, skip rendering the page at all\n if (router.state.redirect) {\n return router.state.redirect\n }\n\n await router.serverSsr!.dehydrate()\n\n const responseHeaders = getStartResponseHeaders({ router })\n const response = await cb({\n request,\n router,\n responseHeaders,\n })\n\n return response\n })\n\n // If we have a server route tree, then we try matching to see if we have a\n // server route that matches the request.\n if (processedServerRouteTree) {\n const [_matchedRoutes, response] = await handleServerRoutes({\n processedServerRouteTree,\n router,\n request,\n basePath: APP_BASE,\n executeRouter,\n })\n\n if (response) return response\n }\n\n // Server Routes did not produce a response, so fallback to normal SSR matching using the router\n const routerResponse = await executeRouter()\n return routerResponse\n } catch (err) {\n if (err instanceof Response) {\n return err\n }\n\n throw err\n }\n })()\n\n if (isRedirect(response)) {\n if (isResolvedRedirect(response)) {\n if (request.headers.get('x-tsr-redirect') === 'manual') {\n return json(\n {\n ...response.options,\n isSerializedRedirect: true,\n },\n {\n headers: response.headers,\n },\n )\n }\n return response\n }\n if (\n response.options.to &&\n typeof response.options.to === 'string' &&\n !response.options.to.startsWith('/')\n ) {\n throw new Error(\n `Server side redirects must use absolute paths via the 'href' or 'to' options. The redirect() method's \"to\" property accepts an internal path only. Use the \"href\" property to provide an external URL. Received: ${JSON.stringify(response.options)}`,\n )\n }\n\n if (\n ['params', 'search', 'hash'].some(\n (d) => typeof (response.options as any)[d] === 'function',\n )\n ) {\n throw new Error(\n `Server side redirects must use static search, params, and hash values and do not support functional values. Received functional values for: ${Object.keys(\n response.options,\n )\n .filter((d) => typeof (response.options as any)[d] === 'function')\n .map((d) => `\"${d}\"`)\n .join(', ')}`,\n )\n }\n\n const redirect = router.resolveRedirect(response)\n\n if (request.headers.get('x-tsr-redirect') === 'manual') {\n return json(\n {\n ...response.options,\n isSerializedRedirect: true,\n },\n {\n headers: response.headers,\n },\n )\n }\n\n return redirect\n }\n\n return response\n }\n\n return requestHandler(startRequestResolver)\n }\n}\n\nasync function handleServerRoutes(opts: {\n router: AnyRouter\n processedServerRouteTree: ProcessRouteTreeResult<AnyServerRouteWithTypes>\n request: Request\n basePath: string\n executeRouter: () => Promise<Response>\n}) {\n const url = new URL(opts.request.url)\n const pathname = url.pathname\n\n const serverTreeResult = getMatchedRoutes<AnyServerRouteWithTypes>({\n pathname,\n basepath: opts.basePath,\n caseSensitive: true,\n routesByPath: opts.processedServerRouteTree.routesByPath,\n routesById: opts.processedServerRouteTree.routesById,\n flatRoutes: opts.processedServerRouteTree.flatRoutes,\n })\n\n const routeTreeResult = opts.router.getMatchedRoutes(pathname, undefined)\n\n let response: Response | undefined\n let matchedRoutes: Array<AnyServerRouteWithTypes> = []\n matchedRoutes = serverTreeResult.matchedRoutes\n // check if the app route tree found a match that is deeper than the server route tree\n if (routeTreeResult.foundRoute) {\n if (\n serverTreeResult.matchedRoutes.length <\n routeTreeResult.matchedRoutes.length\n ) {\n const closestCommon = [...routeTreeResult.matchedRoutes]\n .reverse()\n .find((r) => {\n return opts.processedServerRouteTree.routesById[r.id] !== undefined\n })\n if (closestCommon) {\n // walk up the tree and collect all parents\n let routeId = closestCommon.id\n matchedRoutes = []\n do {\n const route = opts.processedServerRouteTree.routesById[routeId]\n if (!route) {\n break\n }\n matchedRoutes.push(route)\n routeId = route.parentRoute?.id\n } while (routeId)\n\n matchedRoutes.reverse()\n }\n }\n }\n\n if (matchedRoutes.length) {\n // We've found a server route that (partially) matches the request, so we can call it.\n // TODO: Error handling? What happens when its `throw redirect()` vs `throw new Error()`?\n\n const middlewares = flattenMiddlewares(\n matchedRoutes.flatMap((r) => r.options.middleware).filter(Boolean),\n ).map((d) => d.options.server)\n\n if (serverTreeResult.foundRoute?.options.methods) {\n const method = Object.keys(\n serverTreeResult.foundRoute.options.methods,\n ).find(\n (method) => method.toLowerCase() === opts.request.method.toLowerCase(),\n )\n\n if (method) {\n const handler = serverTreeResult.foundRoute.options.methods[method]\n if (handler) {\n if (typeof handler === 'function') {\n middlewares.push(handlerToMiddleware(handler) as TODO)\n } else {\n if (\n handler._options.middlewares &&\n handler._options.middlewares.length\n ) {\n middlewares.push(\n ...flattenMiddlewares(handler._options.middlewares as any).map(\n (d) => d.options.server,\n ),\n )\n }\n if (handler._options.handler) {\n middlewares.push(handlerToMiddleware(handler._options.handler))\n }\n }\n }\n }\n }\n\n // eventually, execute the router\n middlewares.push(handlerToMiddleware(opts.executeRouter))\n\n // TODO: This is starting to feel too much like a server function\n // Do generalize the existing middleware execution? Or do we need to\n // build a new middleware execution system for server routes?\n const ctx = await executeMiddleware(middlewares, {\n request: opts.request,\n context: {},\n params: serverTreeResult.routeParams,\n pathname,\n })\n\n response = ctx.response\n }\n\n // We return the matched routes too so if\n // the app router happens to match the same path,\n // it can use any request middleware from server routes\n return [matchedRoutes, response] as const\n}\n\nfunction handlerToMiddleware(\n handler: ServerRouteMethodHandlerFn<\n AnyServerRouteWithTypes,\n any,\n any,\n any,\n any\n >,\n) {\n return async ({ next: _next, ...rest }: TODO) => {\n const response = await handler(rest)\n if (response) {\n return { response }\n }\n return _next(rest)\n }\n}\n\nfunction executeMiddleware(middlewares: TODO, ctx: TODO) {\n let index = -1\n\n const next = async (ctx: TODO) => {\n index++\n const middleware = middlewares[index]\n if (!middleware) return ctx\n\n const result = await middleware({\n ...ctx,\n // Allow the middleware to call the next middleware in the chain\n next: async (nextCtx: TODO) => {\n // Allow the caller to extend the context for the next middleware\n const nextResult = await next({\n ...ctx,\n ...nextCtx,\n context: {\n ...ctx.context,\n ...(nextCtx?.context || {}),\n },\n })\n\n // Merge the result into the context\\\n return Object.assign(ctx, handleCtxResult(nextResult))\n },\n // Allow the middleware result to extend the return context\n }).catch((err: TODO) => {\n if (isSpecialResponse(err)) {\n return {\n response: err,\n }\n }\n\n throw err\n })\n\n // Merge the middleware result into the context, just in case it\n // returns a partial context\n return Object.assign(ctx, handleCtxResult(result))\n }\n\n return handleCtxResult(next(ctx))\n}\n\nfunction handleCtxResult(result: TODO) {\n if (isSpecialResponse(result)) {\n return {\n response: result,\n }\n }\n\n return result\n}\n\nfunction isSpecialResponse(err: TODO) {\n return isResponse(err) || isRedirect(err)\n}\n\nfunction isResponse(response: Response): response is Response {\n return response instanceof Response\n}\n"],"names":["url","response","method","ctx"],"mappings":"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"}
@@ -3,7 +3,7 @@ export type { CustomizeStartHandler } from './createStartHandler.js';
3
3
  export { attachRouterServerSsrUtils, createRequestHandler, defineHandlerCallback, transformReadableStreamWithRouter, transformPipeableStreamWithRouter, } from '@tanstack/router-core/ssr/server';
4
4
  export type { HandlerCallback } from '@tanstack/router-core/ssr/server';
5
5
  export { handleServerAction } from './server-functions-handler.js';
6
- export * from './h3.js';
6
+ export * from './request-response.js';
7
7
  export { createServerRoute, createServerFileRoute, createServerRootRoute, } from './serverRoute.js';
8
8
  export type { CreateServerFileRoute, ServerFileRoutesByPath, ServerRouteOptions, ServerRouteManifest, ServerRouteAddFileChildrenFn, ServerRouteMethodBuilderOptions, AnyServerRouteWithTypes, ServerRouteWithTypes, ServerRouteTypes, ResolveAllServerContext, AnyServerRoute, ServerRoute, ServerRouteMiddleware, ServerRouteAfterMiddleware, ServerRouteMethods, ServerRouteMethodsOptions, ServerRouteMethodsRecord, ServerRouteMethodRecordValue, ServerRouteVerb, ServerRouteMethodHandlerFn, ServerRouteMethodHandlerCtx, MergeMethodMiddlewares, AssignAllMethodContext, AnyRouteMethodsBuilder, ServerRouteMethodBuilder, ServerRouteMethodBuilderWithTypes, ServerRouteMethodBuilderTypes, ServerRouteMethodBuilderMiddleware, ServerRouteMethodBuilderAfterMiddleware, ServerRouteMethodBuilderHandler, ServerRouteMethodBuilderAfterHandler, ServerRouteMethod, ServerRouteAfterMethods, } from './serverRoute.js';
9
9
  export * from './virtual-modules.js';
package/dist/esm/index.js CHANGED
@@ -1,134 +1,50 @@
1
1
  import { createStartHandler } from "./createStartHandler.js";
2
2
  import { attachRouterServerSsrUtils, createRequestHandler, defineHandlerCallback, transformPipeableStreamWithRouter, transformReadableStreamWithRouter } from "@tanstack/router-core/ssr/server";
3
3
  import { handleServerAction } from "./server-functions-handler.js";
4
- import { HTTPEventSymbol, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, clearResponseHeaders, clearSession, defaultContentType, defineEventHandler, defineMiddleware, deleteCookie, eventHandler, fetchWithEvent, getContext, getCookie, getEvent, getHeader, getHeaders, getProxyRequestHeaders, getQuery, getRequestFingerprint, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestProtocol, getRequestURL, getRequestWebStream, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, getValidatedQuery, getValidatedRouterParams, getWebRequest, handleCacheHeaders, handleCors, isEvent, isMethod, isPreflightRequest, parseCookies, proxyRequest, readBody, readFormData, readMultipartFormData, readRawBody, readValidatedBody, removeResponseHeader, requestHandler, runWithEvent, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, sendWebResponse, setContext, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, unsealSession, updateSession, useSession, writeEarlyHints } from "./h3.js";
4
+ import { clearResponseHeaders, clearSession, deleteCookie, getCookie, getCookies, getRequest, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestProtocol, getRequestUrl, getResponse, getResponseHeader, getResponseHeaders, getResponseStatus, getSession, getValidatedQuery, removeResponseHeader, requestHandler, sealSession, setCookie, setResponseHeader, setResponseHeaders, setResponseStatus, unsealSession, updateSession, useSession } from "./request-response.js";
5
5
  import { createServerFileRoute, createServerRootRoute, createServerRoute } from "./serverRoute.js";
6
6
  import { VIRTUAL_MODULES } from "./virtual-modules.js";
7
7
  import { HEADERS } from "./constants.js";
8
- import { H3Error, H3Event, MIMES, callNodeListener, createApp, createAppEventHandler, createError, createEvent, createRouter, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, defineRequestMiddleware, defineResponseMiddleware, defineWebSocket, dynamicEventHandler, fromNodeMiddleware, fromPlainHandler, fromWebHandler, isCorsOriginAllowed, isError, isEventHandler, isStream, isWebResponse, lazyEventHandler, promisifyNodeListener, sanitizeStatusCode, sanitizeStatusMessage, serveStatic, splitCookiesString, toEventHandler, toNodeListener, toPlainHandler, toWebHandler, toWebRequest, useBase } from "h3";
9
8
  export {
10
- H3Error,
11
- H3Event,
12
9
  HEADERS,
13
- HTTPEventSymbol,
14
- MIMES,
15
10
  VIRTUAL_MODULES,
16
- appendCorsHeaders,
17
- appendCorsPreflightHeaders,
18
- appendHeader,
19
- appendHeaders,
20
- appendResponseHeader,
21
- appendResponseHeaders,
22
- assertMethod,
23
11
  attachRouterServerSsrUtils,
24
- callNodeListener,
25
12
  clearResponseHeaders,
26
13
  clearSession,
27
- createApp,
28
- createAppEventHandler,
29
- createError,
30
- createEvent,
31
14
  createRequestHandler,
32
- createRouter,
33
15
  createServerFileRoute,
34
16
  createServerRootRoute,
35
17
  createServerRoute,
36
18
  createStartHandler,
37
- defaultContentType,
38
- defineEventHandler,
39
19
  defineHandlerCallback,
40
- defineLazyEventHandler,
41
- defineMiddleware,
42
- defineNodeListener,
43
- defineNodeMiddleware,
44
- defineRequestMiddleware,
45
- defineResponseMiddleware,
46
- defineWebSocket,
47
20
  deleteCookie,
48
- dynamicEventHandler,
49
- eventHandler,
50
- fetchWithEvent,
51
- fromNodeMiddleware,
52
- fromPlainHandler,
53
- fromWebHandler,
54
- getContext,
55
21
  getCookie,
56
- getEvent,
57
- getHeader,
58
- getHeaders,
59
- getProxyRequestHeaders,
60
- getQuery,
61
- getRequestFingerprint,
22
+ getCookies,
23
+ getRequest,
62
24
  getRequestHeader,
63
25
  getRequestHeaders,
64
26
  getRequestHost,
65
27
  getRequestIP,
66
28
  getRequestProtocol,
67
- getRequestURL,
68
- getRequestWebStream,
29
+ getRequestUrl,
30
+ getResponse,
69
31
  getResponseHeader,
70
32
  getResponseHeaders,
71
33
  getResponseStatus,
72
- getResponseStatusText,
73
- getRouterParam,
74
- getRouterParams,
75
34
  getSession,
76
35
  getValidatedQuery,
77
- getValidatedRouterParams,
78
- getWebRequest,
79
- handleCacheHeaders,
80
- handleCors,
81
36
  handleServerAction,
82
- isCorsOriginAllowed,
83
- isError,
84
- isEvent,
85
- isEventHandler,
86
- isMethod,
87
- isPreflightRequest,
88
- isStream,
89
- isWebResponse,
90
- lazyEventHandler,
91
- parseCookies,
92
- promisifyNodeListener,
93
- proxyRequest,
94
- readBody,
95
- readFormData,
96
- readMultipartFormData,
97
- readRawBody,
98
- readValidatedBody,
99
37
  removeResponseHeader,
100
38
  requestHandler,
101
- runWithEvent,
102
- sanitizeStatusCode,
103
- sanitizeStatusMessage,
104
39
  sealSession,
105
- send,
106
- sendError,
107
- sendNoContent,
108
- sendProxy,
109
- sendRedirect,
110
- sendStream,
111
- sendWebResponse,
112
- serveStatic,
113
- setContext,
114
40
  setCookie,
115
- setHeader,
116
- setHeaders,
117
41
  setResponseHeader,
118
42
  setResponseHeaders,
119
43
  setResponseStatus,
120
- splitCookiesString,
121
- toEventHandler,
122
- toNodeListener,
123
- toPlainHandler,
124
- toWebHandler,
125
- toWebRequest,
126
44
  transformPipeableStreamWithRouter,
127
45
  transformReadableStreamWithRouter,
128
46
  unsealSession,
129
47
  updateSession,
130
- useBase,
131
- useSession,
132
- writeEarlyHints
48
+ useSession
133
49
  };
134
50
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -7,6 +7,8 @@ async function loadVirtualModule(id) {
7
7
  return await import("tanstack-start-manifest:v");
8
8
  case VIRTUAL_MODULES.serverFnManifest:
9
9
  return await import("tanstack-start-server-fn-manifest:v");
10
+ case VIRTUAL_MODULES.injectedHeadScripts:
11
+ return await import("tanstack-start-injected-head-scripts:v");
10
12
  default:
11
13
  throw new Error(`Unknown virtual module: ${id}`);
12
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loadVirtualModule.js","sources":["../../src/loadVirtualModule.ts"],"sourcesContent":["import { VIRTUAL_MODULES } from './virtual-modules'\nimport type { VirtualModules } from './virtual-modules'\n\n/**\n * we need to explicitly enumerate all imports with string literals,\n * otherwise vite will not pick them up during build\n */\nexport async function loadVirtualModule<TId extends keyof VirtualModules>(\n id: TId,\n): Promise<VirtualModules[TId]> {\n switch (id) {\n case VIRTUAL_MODULES.routeTree:\n return (await import('tanstack-start-route-tree:v')) as any\n case VIRTUAL_MODULES.startManifest:\n return (await import('tanstack-start-manifest:v')) as any\n case VIRTUAL_MODULES.serverFnManifest:\n return (await import('tanstack-start-server-fn-manifest:v')) as any\n default:\n throw new Error(`Unknown virtual module: ${id}`)\n }\n}\n"],"names":[],"mappings":";AAOA,eAAsB,kBACpB,IAC8B;AAC9B,UAAQ,IAAI;AAAA,IACV,KAAK,gBAAgB;AACX,aAAA,MAAM,OAAO,6BAA6B;AAAA,IACpD,KAAK,gBAAgB;AACX,aAAA,MAAM,OAAO,2BAA2B;AAAA,IAClD,KAAK,gBAAgB;AACX,aAAA,MAAM,OAAO,qCAAqC;AAAA,IAC5D;AACE,YAAM,IAAI,MAAM,2BAA2B,EAAE,EAAE;AAAA,EAAA;AAErD;"}
1
+ {"version":3,"file":"loadVirtualModule.js","sources":["../../src/loadVirtualModule.ts"],"sourcesContent":["import { VIRTUAL_MODULES } from './virtual-modules'\nimport type { VirtualModules } from './virtual-modules'\n\n/**\n * we need to explicitly enumerate all imports with string literals,\n * otherwise vite will not pick them up during build\n */\nexport async function loadVirtualModule<TId extends keyof VirtualModules>(\n id: TId,\n): Promise<VirtualModules[TId]> {\n switch (id) {\n case VIRTUAL_MODULES.routeTree:\n return (await import('tanstack-start-route-tree:v')) as any\n case VIRTUAL_MODULES.startManifest:\n return (await import('tanstack-start-manifest:v')) as any\n case VIRTUAL_MODULES.serverFnManifest:\n return (await import('tanstack-start-server-fn-manifest:v')) as any\n case VIRTUAL_MODULES.injectedHeadScripts:\n return (await import('tanstack-start-injected-head-scripts:v')) as any\n default:\n throw new Error(`Unknown virtual module: ${id}`)\n }\n}\n"],"names":[],"mappings":";AAOA,eAAsB,kBACpB,IAC8B;AAC9B,UAAQ,IAAA;AAAA,IACN,KAAK,gBAAgB;AACnB,aAAQ,MAAM,OAAO,6BAA6B;AAAA,IACpD,KAAK,gBAAgB;AACnB,aAAQ,MAAM,OAAO,2BAA2B;AAAA,IAClD,KAAK,gBAAgB;AACnB,aAAQ,MAAM,OAAO,qCAAqC;AAAA,IAC5D,KAAK,gBAAgB;AACnB,aAAQ,MAAM,OAAO,wCAAwC;AAAA,IAC/D;AACE,YAAM,IAAI,MAAM,2BAA2B,EAAE,EAAE;AAAA,EAAA;AAErD;"}
@@ -0,0 +1,124 @@
1
+ import { RequestHeaderMap, RequestHeaderName, ResponseHeaderMap, ResponseHeaderName, TypedHeaders } from 'fetchdts';
2
+ import { CookieSerializeOptions } from 'cookie-es';
3
+ import { Session, SessionConfig, SessionData, SessionManager, SessionUpdate } from './session.js';
4
+ import { StandardSchemaV1 } from '@standard-schema/spec';
5
+ export type RequestHandler = (request: Request) => Promise<Response> | Response;
6
+ export type { ResponseHeaderName, RequestHeaderName };
7
+ export declare function requestHandler(handler: RequestHandler): (request: Request) => Promise<Response> | Response;
8
+ export declare function getRequest(): Request;
9
+ export declare function getRequestHeaders(): TypedHeaders<RequestHeaderMap>;
10
+ export declare function getRequestHeader(name: RequestHeaderName): string | undefined;
11
+ export declare function getRequestIP(opts?: {
12
+ /**
13
+ * Use the X-Forwarded-For HTTP header set by proxies.
14
+ *
15
+ * Note: Make sure that this header can be trusted (your application running behind a CDN or reverse proxy) before enabling.
16
+ */
17
+ xForwardedFor?: boolean;
18
+ }): string | undefined;
19
+ /**
20
+ * Get the request hostname.
21
+ *
22
+ * If `xForwardedHost` is `true`, it will use the `x-forwarded-host` header if it exists.
23
+ *
24
+ * If no host header is found, it will default to "localhost".
25
+ */
26
+ export declare function getRequestHost(opts?: {
27
+ xForwardedHost?: boolean;
28
+ }): string;
29
+ /**
30
+ * Get the full incoming request URL.
31
+ *
32
+ * If `xForwardedHost` is `true`, it will use the `x-forwarded-host` header if it exists.
33
+ *
34
+ * If `xForwardedProto` is `false`, it will not use the `x-forwarded-proto` header.
35
+ */
36
+ export declare function getRequestUrl(opts?: {
37
+ xForwardedHost?: boolean;
38
+ xForwardedProto?: boolean;
39
+ }): URL;
40
+ /**
41
+ * Get the request protocol.
42
+ *
43
+ * If `x-forwarded-proto` header is set to "https", it will return "https". You can disable this behavior by setting `xForwardedProto` to `false`.
44
+ *
45
+ * If protocol cannot be determined, it will default to "http".
46
+ */
47
+ export declare function getRequestProtocol(opts?: {
48
+ xForwardedProto?: boolean;
49
+ }): 'http' | 'https' | (string & {});
50
+ export declare function setResponseHeaders(headers: TypedHeaders<ResponseHeaderMap>): void;
51
+ export declare function getResponseHeaders(): TypedHeaders<ResponseHeaderMap>;
52
+ export declare function getResponseHeader(name: ResponseHeaderName): string | undefined;
53
+ export declare function setResponseHeader(name: ResponseHeaderName, value: string | Array<string>): void;
54
+ export declare function removeResponseHeader(name: ResponseHeaderName): void;
55
+ export declare function clearResponseHeaders(headerNames?: Array<ResponseHeaderName>): void;
56
+ export declare function getResponseStatus(): number;
57
+ export declare function setResponseStatus(code?: number, text?: string): void;
58
+ /**
59
+ * Parse the request to get HTTP Cookie header string and return an object of all cookie name-value pairs.
60
+ * @returns Object of cookie name-value pairs
61
+ * ```ts
62
+ * const cookies = getCookies()
63
+ * ```
64
+ */
65
+ export declare function getCookies(): Record<string, string>;
66
+ /**
67
+ * Get a cookie value by name.
68
+ * @param name Name of the cookie to get
69
+ * @returns {*} Value of the cookie (String or undefined)
70
+ * ```ts
71
+ * const authorization = getCookie('Authorization')
72
+ * ```
73
+ */
74
+ export declare function getCookie(name: string): string | undefined;
75
+ /**
76
+ * Set a cookie value by name.
77
+ * @param name Name of the cookie to set
78
+ * @param value Value of the cookie to set
79
+ * @param options {CookieSerializeOptions} Options for serializing the cookie
80
+ * ```ts
81
+ * setCookie('Authorization', '1234567')
82
+ * ```
83
+ */
84
+ export declare function setCookie(name: string, value: string, options?: CookieSerializeOptions): void;
85
+ /**
86
+ * Remove a cookie by name.
87
+ * @param name Name of the cookie to delete
88
+ * @param serializeOptions {CookieSerializeOptions} Cookie options
89
+ * ```ts
90
+ * deleteCookie('SessionId')
91
+ * ```
92
+ */
93
+ export declare function deleteCookie(name: string, options?: CookieSerializeOptions): void;
94
+ /**
95
+ * Create a session manager for the current request.
96
+ */
97
+ export declare function useSession<TSessionData extends SessionData = SessionData>(config: SessionConfig): Promise<SessionManager<TSessionData>>;
98
+ /**
99
+ * Get the session for the current request
100
+ */
101
+ export declare function getSession<TSessionData extends SessionData = SessionData>(config: SessionConfig): Promise<Session<TSessionData>>;
102
+ /**
103
+ * Update the session data for the current request.
104
+ */
105
+ export declare function updateSession<TSessionData extends SessionData = SessionData>(config: SessionConfig, update?: SessionUpdate<TSessionData>): Promise<Session<TSessionData>>;
106
+ /**
107
+ * Encrypt and sign the session data for the current request.
108
+ */
109
+ export declare function sealSession(config: SessionConfig): Promise<string>;
110
+ /**
111
+ * Decrypt and verify the session data for the current request.
112
+ */
113
+ export declare function unsealSession(config: SessionConfig, sealed: string): Promise<Partial<Session>>;
114
+ /**
115
+ * Clear the session data for the current request.
116
+ */
117
+ export declare function clearSession(config: Partial<SessionConfig>): Promise<void>;
118
+ export declare function getResponse(): {
119
+ status?: number;
120
+ statusText?: string;
121
+ _headers?: Headers;
122
+ get headers(): Headers;
123
+ } | undefined;
124
+ export declare function getValidatedQuery<TSchema extends StandardSchemaV1>(schema: StandardSchemaV1): Promise<StandardSchemaV1.InferOutput<TSchema>>;