import type { Middleware } from "@wrnexus/core"; import type { createStudioHandler } from "@wrnexus/design-studio/server"; import { studioAI } from "../lib/studio-ai.ts"; import { addStudioGuide, studioHelpScript } from "../lib/studio-guide.ts"; let studio: ReturnType | undefined; let ai: ReturnType | undefined; const designStudio: Middleware = async (ctx, next) => { const url = new URL(ctx.req.url); if (url.pathname === "/design-studio") return new Response(null, { status: 308, headers: { location: "/design-studio/" }, }); if (!url.pathname.startsWith("/design-studio/")) return next(); ai ??= studioAI(process.env.APIMART_API_KEY?.trim()); const generated = await ai(ctx.req); if (generated) return generated; if ( url.pathname === "/design-studio/site-help.js" && ctx.req.method === "GET" ) return new Response(studioHelpScript, { headers: { "content-type": "text/javascript", "cache-control": "no-store", }, }); // Load the installed package at runtime so its assets keep their package-relative URLs. const studioModule = import.meta.resolve("@wrnexus/design-studio/server"); studio ??= import(studioModule) .then(({ createStudioHandler }) => createStudioHandler({ hosted: { basePath: "/design-studio" }, }), ) .catch((error) => { studio = undefined; throw error; }); const response = await (await studio)(ctx.req); if ( url.pathname === "/design-studio/" && response.ok && ctx.req.method === "GET" ) { const headers = new Headers(response.headers); headers.delete("content-length"); return new Response( addStudioGuide( await response.text(), !!process.env.APIMART_API_KEY?.trim(), ), { status: response.status, headers }, ); } return response; }; export default designStudio;