UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

1 lines • 14.3 kB
{"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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"}