{"version":3,"file":"createStartHandler.cjs","sources":["../../src/createStartHandler.ts"],"sourcesContent":["import { createMemoryHistory } from '@tanstack/history'\nimport { mergeHeaders } from '@tanstack/start-client'\nimport { eventHandler, getResponseHeaders, toWebRequest } from 'h3'\nimport { attachRouterServerSsrUtils, dehydrateRouter } from './ssr-server'\nimport type { HandlerCallback } from './handlerCallback'\nimport type { EventHandlerResponse, H3Event } from 'h3'\nimport type { AnyRouter, Manifest } from '@tanstack/react-router'\n\nexport type CustomizeStartHandler<\n  TRouter extends AnyRouter,\n  TResponse extends EventHandlerResponse = EventHandlerResponse,\n> = (cb: HandlerCallback<TRouter, TResponse>) => ReturnType<typeof eventHandler>\n\nexport function createStartHandler<\n  TRouter extends AnyRouter,\n  TResponse extends EventHandlerResponse = EventHandlerResponse,\n>({\n  createRouter,\n  getRouterManifest,\n}: {\n  createRouter: () => TRouter\n  getRouterManifest?: () => Manifest | Promise<Manifest>\n}): CustomizeStartHandler<TRouter, TResponse> {\n  return (cb) => {\n    return eventHandler(async (event) => {\n      const request = toWebRequest(event)\n\n      const url = new URL(request.url)\n      const href = url.href.replace(url.origin, '')\n\n      // Create a history for the router\n      const history = createMemoryHistory({\n        initialEntries: [href],\n      })\n\n      const router = createRouter()\n\n      attachRouterServerSsrUtils(router, await getRouterManifest?.())\n\n      // Update the router with the history and context\n      router.update({\n        history,\n      })\n\n      await router.load()\n\n      dehydrateRouter(router)\n\n      const responseHeaders = getStartResponseHeaders({ event, router })\n      const response = await cb({\n        request,\n        router,\n        responseHeaders,\n      })\n\n      return response\n    })\n  }\n}\n\nfunction getStartResponseHeaders(opts: { event: H3Event; router: AnyRouter }) {\n  let headers = mergeHeaders(\n    getResponseHeaders(opts.event),\n    (opts.event as any).___ssrRpcResponseHeaders,\n    {\n      'Content-Type': 'text/html; charset=UTF-8',\n    },\n    ...opts.router.state.matches.map((match) => {\n      return match.headers\n    }),\n  )\n\n  // Handle Redirects\n  const { redirect } = opts.router.state\n\n  if (redirect) {\n    headers = mergeHeaders(headers, redirect.headers, {\n      Location: redirect.href,\n    })\n  }\n  return headers\n}\n"],"names":["eventHandler","toWebRequest","history","createMemoryHistory","attachRouterServerSsrUtils","dehydrateRouter","mergeHeaders","getResponseHeaders"],"mappings":";;;;;;AAaO,SAAS,mBAGd;AAAA,EACA;AAAA,EACA;AACF,GAG8C;AAC5C,SAAO,CAAC,OAAO;AACN,WAAAA,GAAAA,aAAa,OAAO,UAAU;AAC7B,YAAA,UAAUC,gBAAa,KAAK;AAElC,YAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,YAAM,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,EAAE;AAG5C,YAAMC,YAAUC,QAAAA,oBAAoB;AAAA,QAClC,gBAAgB,CAAC,IAAI;AAAA,MAAA,CACtB;AAED,YAAM,SAAS,aAAa;AAEDC,2CAAA,QAAQ,OAAM,yDAAqB;AAG9D,aAAO,OAAO;AAAA,QACZF,SAAAA;AAAAA,MAAA,CACD;AAED,YAAM,OAAO,KAAK;AAElBG,gBAAAA,gBAAgB,MAAM;AAEtB,YAAM,kBAAkB,wBAAwB,EAAE,OAAO,QAAQ;AAC3D,YAAA,WAAW,MAAM,GAAG;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAEM,aAAA;AAAA,IAAA,CACR;AAAA,EACH;AACF;AAEA,SAAS,wBAAwB,MAA6C;AAC5E,MAAI,UAAUC,YAAA;AAAA,IACZC,GAAA,mBAAmB,KAAK,KAAK;AAAA,IAC5B,KAAK,MAAc;AAAA,IACpB;AAAA,MACE,gBAAgB;AAAA,IAClB;AAAA,IACA,GAAG,KAAK,OAAO,MAAM,QAAQ,IAAI,CAAC,UAAU;AAC1C,aAAO,MAAM;AAAA,IACd,CAAA;AAAA,EACH;AAGA,QAAM,EAAE,SAAA,IAAa,KAAK,OAAO;AAEjC,MAAI,UAAU;AACF,cAAAD,YAAA,aAAa,SAAS,SAAS,SAAS;AAAA,MAChD,UAAU,SAAS;AAAA,IAAA,CACpB;AAAA,EAAA;AAEI,SAAA;AACT;;"}