UNPKG

@netlify/remix-edge-adapter

Version:

Remix Adapter for Netlify Edge Functions

165 lines (158 loc) 5.88 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/common/globals.ts var require_globals = __commonJS({ "src/common/globals.ts"() { "use strict"; globalThis.process ||= { env: Netlify.env.toObject() }; } }); // src/index.ts var index_exports = {}; __export(index_exports, { config: () => config, createHydrogenAppLoadContext: () => createHydrogenAppLoadContext, createRequestHandler: () => createRequestHandler, handleRequest: () => handleRequest }); module.exports = __toCommonJS(index_exports); var import_globals = __toESM(require_globals()); // src/common/server.ts var import_remix_runtime = require("@netlify/remix-runtime"); function createRequestHandler({ build, mode, getLoadContext }) { const remixHandler = (0, import_remix_runtime.createRequestHandler)(build, mode); const assetPath = build.assets.url.split("/").slice(0, -1).join("/"); return async (request, context) => { const { pathname } = new URL(request.url); if (pathname.startsWith(`${assetPath}/`)) { return; } try { const loadContext = await (getLoadContext == null ? void 0 : getLoadContext(request, context)) || context; const response = await remixHandler(request, loadContext); response.headers.set("x-nf-runtime", "Edge"); if (response.status === 404) { const originResponse = await loadContext.next({ sendConditionalRequest: true }); if (originResponse && (originResponse == null ? void 0 : originResponse.status) !== 404) { return originResponse; } } return response; } catch (error) { console.error(error); return new Response("Internal Error", { status: 500 }); } }; } // src/classic-compiler/defaultRemixConfig.ts var config = { server: "./server.ts", ignoredRouteFiles: ["**/.*"], serverBuildPath: ".netlify/edge-functions/server.js", serverConditions: ["deno", "worker"], serverDependenciesToBundle: "all", serverMainFields: ["module", "main"], serverModuleFormat: "esm", serverPlatform: "neutral" }; // src/common/entry.server.tsx var import_react = require("@remix-run/react"); var import_isbot = require("isbot"); var ReactDOMServer = __toESM(require("react-dom/server")); var import_jsx_runtime = require("react/jsx-runtime"); async function handleRequest(request, responseStatusCode, responseHeaders, remixContext, _loadContext) { let isStreamClosing = false; const abortController = new AbortController(); request.signal.addEventListener("abort", () => { if (!isStreamClosing) { abortController.abort(request.signal.reason); } }); const body = await ReactDOMServer.renderToReadableStream(/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.RemixServer, { context: remixContext, url: request.url }), { signal: abortController.signal, onError(error) { console.error(error); responseStatusCode = 500; } }); const transformedBody = body.pipeThrough( new TransformStream({ flush() { isStreamClosing = true; } }) ); if ((0, import_isbot.isbot)(request.headers.get("user-agent") || "")) { await body.allReady; } responseHeaders.set("Content-Type", "text/html"); return new Response(transformedBody, { headers: responseHeaders, status: responseStatusCode }); } // src/vite/hydrogen.ts var executionContext = { /** * Hydrogen expects a `waitUntil` function like the one in the workerd runtime: * https://developers.cloudflare.com/workers/runtime-apis/context/#waituntil. * Netlify Edge Functions don't have such a function, but Deno Deploy isolates make a best-effort * attempt to wait for the event loop to drain, so just awaiting the promise here is equivalent. */ async waitUntil(p) { await p; } }; var getEnv = () => { if (globalThis.Netlify) { return globalThis.Netlify.env.toObject(); } return process.env; }; var createHydrogenAppLoadContext = async (request, netlifyContext, createAppLoadContext) => { const env = getEnv(); const userHydrogenContext = await createAppLoadContext(request, env, executionContext); return Object.assign(netlifyContext, userHydrogenContext); }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { config, createHydrogenAppLoadContext, createRequestHandler, handleRequest });