{"version":3,"file":"createHandleRequest.js","names":[],"sources":["esm/createHandleRequest.js"],"sourcesContent":["import { LOADER_JS_POSTFIX_UNCACHED } from \"./constants\";\nimport { isResponse } from \"./utils/isResponse\";\nimport { resolveAPIEndpoint, resolveResponse } from \"./vite/resolveResponse\";\nconst debugRouter = process.env.ONE_DEBUG_ROUTER;\nconst staticAssetPathRe = /\\.(?:[a-z0-9]{2,4}|webmanifest|wasm|woff2)$/i;\nfunction isStaticAssetRequestPath(pathname) {\n  return !pathname.endsWith(LOADER_JS_POSTFIX_UNCACHED) && staticAssetPathRe.test(pathname);\n}\nfunction isPageRequestMethod(method) {\n  return method === \"GET\" || method === \"HEAD\";\n}\nfunction ensureResponse(value) {\n  if (isResponse(value)) return value;\n  if (typeof value === \"string\") {\n    return new Response(value, {\n      headers: { \"Content-Type\": \"text/html\" }\n    });\n  }\n  if (value && typeof value === \"object\") {\n    return Response.json(value);\n  }\n  return new Response(value);\n}\nasync function runMiddlewares(handlers, request, route, getResponse) {\n  const middlewares = route.middlewares;\n  if (!middlewares?.length) {\n    return await getResponse();\n  }\n  if (!handlers.loadMiddleware) {\n    throw new Error(`No middleware handler configured`);\n  }\n  if (debugRouter) {\n    console.info(`[one] \\u{1F517} middleware chain (${middlewares.length}) for ${route.page}`);\n  }\n  const context = {};\n  async function dispatch(index) {\n    const middlewareModule = middlewares[index];\n    if (!middlewareModule) {\n      if (debugRouter) {\n        console.info(`[one] \\u2713 middleware chain complete`);\n      }\n      return ensureResponse(await getResponse());\n    }\n    if (debugRouter) {\n      console.info(`[one]   \\u2192 middleware[${index}]: ${middlewareModule.contextKey}`);\n    }\n    const exported = (await handlers.loadMiddleware(middlewareModule))?.default;\n    if (!exported) {\n      throw new Error(\n        `No valid export found in middleware: ${middlewareModule.contextKey}`\n      );\n    }\n    const next = async () => {\n      return dispatch(index + 1);\n    };\n    const response = await exported({ request, next, context });\n    if (response) {\n      if (debugRouter) {\n        console.info(\n          `[one]   \\u2190 middleware[${index}] returned early (status: ${response.status})`\n        );\n      }\n      return response;\n    }\n    return dispatch(index + 1);\n  }\n  return dispatch(0);\n}\nasync function resolveAPIRoute(handlers, request, url, route, env, executionCtx) {\n  const { pathname } = url;\n  const params = getRouteParams(pathname, route);\n  if (debugRouter) {\n    console.info(`[one] \\u{1F4E1} API ${request.method} ${pathname} \\u2192 ${route.file}`, params);\n  }\n  return await runMiddlewares(handlers, request, route, async () => {\n    try {\n      return resolveAPIEndpoint(\n        () => handlers.handleAPI({\n          request,\n          route,\n          url,\n          loaderProps: {\n            path: pathname,\n            search: url.search,\n            subdomain: getSubdomain(url),\n            params\n          }\n        }),\n        request,\n        params || {},\n        env,\n        executionCtx\n      );\n    } catch (err) {\n      if (isResponse(err)) {\n        return err;\n      }\n      if (process.env.NODE_ENV === \"development\") {\n        console.error(`\n [one] Error importing API route at ${pathname}:\n\n          ${err}\n\n          If this is an import error, you can likely fix this by adding this dependency to\n          the \"optimizeDeps.include\" array in your vite.config.ts.\n        `);\n      }\n      throw err;\n    }\n  });\n}\nasync function resolveLoaderRoute(handlers, request, url, route) {\n  if (debugRouter) {\n    console.info(`[one] \\u{1F4E6} loader ${url.pathname} \\u2192 ${route.file}`);\n  }\n  const isNativeRequest = url.searchParams.get(\"platform\") === \"ios\" || url.searchParams.get(\"platform\") === \"android\";\n  const response = await runMiddlewares(handlers, request, route, async () => {\n    return await resolveResponse(async () => {\n      const headers = new Headers();\n      headers.set(\"Content-Type\", \"text/javascript\");\n      try {\n        const loaderResponse = await handlers.handleLoader({\n          request,\n          route,\n          url,\n          loaderProps: {\n            path: url.pathname,\n            search: url.search,\n            subdomain: getSubdomain(url),\n            request: route.type === \"ssr\" ? request : void 0,\n            params: getLoaderParams(url, route)\n          }\n        });\n        const body = isNativeRequest && loaderResponse ? toCjsLoader(loaderResponse) : loaderResponse;\n        return new Response(body, {\n          headers\n        });\n      } catch (err) {\n        if (isResponse(err)) {\n          return err;\n        }\n        if (err?.code !== \"ERR_MODULE_NOT_FOUND\") {\n          console.error(`Error running loader: ${err}`);\n        }\n        throw err;\n      }\n    });\n  });\n  if (response.status >= 300 && response.status < 400) {\n    const location = response.headers.get(\"location\");\n    if (location) {\n      const redirectUrl = new URL(location, url.origin);\n      const redirectPath = redirectUrl.pathname + redirectUrl.search + redirectUrl.hash;\n      const data = `{__oneRedirect:${JSON.stringify(redirectPath)},__oneRedirectStatus:${response.status}}`;\n      const body = isNativeRequest ? `exports.loader=function(){return ${data}}` : `export function loader(){return${data}}`;\n      return new Response(body, {\n        headers: { \"Content-Type\": \"text/javascript\" }\n      });\n    }\n  }\n  if (response.status === 401 || response.status === 403) {\n    const data = `{__oneError:${response.status},__oneErrorMessage:${JSON.stringify(response.statusText || \"Unauthorized\")}}`;\n    const body = isNativeRequest ? `exports.loader=function(){return ${data}}` : `export function loader(){return${data}}`;\n    return new Response(body, {\n      headers: { \"Content-Type\": \"text/javascript\" }\n    });\n  }\n  return response;\n}\nfunction toCjsLoader(esmCode) {\n  if (esmCode.startsWith(\"exports.\")) {\n    return esmCode;\n  }\n  const match = esmCode.match(\n    /export\\s+function\\s+loader\\s*\\(\\)\\s*\\{\\s*return\\s+([\\s\\S]+)\\s*\\}/\n  );\n  if (match) {\n    return `exports.loader=function(){return ${match[1]}}`;\n  }\n  return `exports.loader=function(){return {}}`;\n}\nasync function resolvePageRoute(handlers, request, url, route) {\n  const { pathname, search } = url;\n  if (debugRouter) {\n    console.info(`[one] \\u{1F4C4} page ${pathname} \\u2192 ${route.file} (${route.type})`);\n  }\n  const loaderProps = {\n    path: pathname,\n    search,\n    subdomain: getSubdomain(url),\n    request: route.type === \"ssr\" ? request : void 0,\n    params: getLoaderParams(url, route)\n  };\n  if (!route.middlewares?.length) {\n    return resolveResponse(() => {\n      return handlers.handlePage({ request, route, url, loaderProps });\n    });\n  }\n  return resolveResponse(async () => {\n    return await runMiddlewares(handlers, request, route, async () => {\n      return await handlers.handlePage({ request, route, url, loaderProps });\n    });\n  });\n}\nconst _urlCache = /* @__PURE__ */ new WeakMap();\nfunction getURLfromRequestURL(request) {\n  let url = _urlCache.get(request);\n  if (url) return url;\n  const urlString = request.url || \"\";\n  const host = request.headers.get(\"host\");\n  url = new URL(urlString || \"\", host ? `http://${host}` : void 0);\n  _urlCache.set(request, url);\n  return url;\n}\nfunction getSubdomain(url) {\n  const host = url.hostname;\n  if (!host || host === \"localhost\" || /^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(host)) {\n    return void 0;\n  }\n  const parts = host.split(\".\");\n  if (parts.length < 3) {\n    return void 0;\n  }\n  return parts.slice(0, -2).join(\".\");\n}\nfunction compileRouteRegex(route) {\n  return {\n    ...route,\n    compiledRegex: new RegExp(route.namedRegex)\n  };\n}\nfunction compileManifest(manifest) {\n  return {\n    pageRoutes: manifest.pageRoutes.map(compileRouteRegex),\n    apiRoutes: manifest.apiRoutes.map(compileRouteRegex)\n  };\n}\nfunction getLoaderParams(url, config) {\n  const params = {};\n  const match = config.compiledRegex.exec(url.pathname);\n  if (match?.groups) {\n    for (const [key, value] of Object.entries(match.groups)) {\n      const namedKey = config.routeKeys[key];\n      params[namedKey] = value;\n    }\n  }\n  return params;\n}\nfunction getRouteParams(pathname, route) {\n  const regex = new RegExp(route.namedRegex);\n  const match = regex.exec(pathname);\n  if (!match) return {};\n  return Object.fromEntries(\n    Object.entries(route.routeKeys).map(([key, value]) => {\n      return [value, match.groups?.[key] || \"\"];\n    })\n  );\n}\nexport {\n  compileManifest,\n  getLoaderParams,\n  getSubdomain,\n  getURLfromRequestURL,\n  isPageRequestMethod,\n  isStaticAssetRequestPath,\n  resolveAPIRoute,\n  resolveLoaderRoute,\n  resolvePageRoute,\n  runMiddlewares\n};\n//# sourceMappingURL=createHandleRequest.js.map\n"],"mappings":"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"}