diff --git a/src/middleware.ts b/src/middleware.ts index ea953e1..c51086c 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,10 +1,10 @@ -import { defineMiddleware } from "astro:middleware"; +import { defineMiddleware, sequence } from "astro:middleware"; // Normalize URL casing: agents that paste prompts hand-roll URLs in arbitrary // case (/Skill.md, /SKILL.MD) and Astro's file-based router is case-sensitive. // Redirect any path with uppercase to its lowercase form so we behave like a // case-agnostic file server. -export const onRequest = defineMiddleware((context, next) => { +const normalizeCasing = defineMiddleware((context, next) => { const url = new URL(context.request.url); const lower = url.pathname.toLowerCase(); if (url.pathname !== lower) { @@ -12,3 +12,36 @@ export const onRequest = defineMiddleware((context, next) => { } return next(); }); + +// Inline script injected into every SSR'd HTML page. +const WIX_EMBEDS_SCRIPT = + ""; + +// Inject the inline script into the rendered HTML. This runs last in the +// middleware chain, so it only acts once all upstream middleware has finished +// and the page has been server-rendered. +const injectWixEmbedsScript = defineMiddleware(async (_context, next) => { + const response = await next(); + + const contentType = response.headers.get("content-type") ?? ""; + if (!contentType.includes("text/html")) { + return response; + } + + const html = await response.text(); + const injected = html.includes("") + ? html.replace("", `${WIX_EMBEDS_SCRIPT}`) + : html + WIX_EMBEDS_SCRIPT; + + // Drop content-length so the runtime recomputes it for the rewritten body. + const headers = new Headers(response.headers); + headers.delete("content-length"); + + return new Response(injected, { + status: response.status, + statusText: response.statusText, + headers, + }); +}); + +export const onRequest = sequence(normalizeCasing, injectWixEmbedsScript);