From 9a6a2e0a8de1a7cca22ada732de507ee508e7170 Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Mon, 19 Oct 2026 13:34:08 +0530 Subject: [PATCH] fix: serve design studio through the component app production route --- README.md | 16 ++++--- app/middleware/design-studio.ts | 29 ++++++++++++ app/types/wrnexus.generated.d.ts | 4 +- deploy/nginx-design-studio.conf | 19 ++------ deploy/studio-single-port.jpg | Bin 0 -> 96652 bytes package.json | 7 +-- scripts/start.ts | 22 ++------- scripts/verify-deployment.ts | 78 +++++++++++++++++++++++++++++++ test/hosted-studio.test.ts | 24 ++++++++++ tsconfig.json | 7 ++- wrnexus.config.ts | 15 ++++-- 11 files changed, 174 insertions(+), 47 deletions(-) create mode 100644 app/middleware/design-studio.ts create mode 100644 deploy/studio-single-port.jpg create mode 100644 scripts/verify-deployment.ts diff --git a/README.md b/README.md index ae3c2b3..c1164d1 100644 --- a/README.md +++ b/README.md @@ -88,13 +88,15 @@ bun run check PORT=3000 bun run start ``` -`start` runs the production component site and an export-only Studio sidecar -bound to loopback port 4320. Include `deploy/nginx-design-studio.conf` inside your -existing nginx server block, retain its existing component-site proxy, validate -with `nginx -t`, then reload nginx. The proxy must preserve `/design-studio/` and -Host, and pass Origin unchanged. If port 4320 is occupied, set DESIGN_STUDIO_PORT -and update the proxy upstream to the same port. Manage the `bun run start` -process using your existing service manager and restart it after each build. +`start` runs one production server. Design Studio is mounted directly at +`/design-studio/` by `app/middleware/design-studio.ts`, so the same route works +with `bun dist/server.js` and with the development server. No extra port or +Studio-specific proxy rule is needed. Your existing reverse proxy should forward +all paths to the normal app port and preserve Host, Origin and X-Forwarded-Proto. +If you installed the older Studio-only nginx location pointing to port 4320, +remove it so `/design-studio/` follows the app's normal proxy route. Validate with +`nginx -t`, then reload nginx. Rebuild and restart the application after updating. +The optional `bun run studio` command is only for running a separate demo server. The private `@wrnexus` registry is configured in `.npmrc`. Supply registry credentials on the VM through its user configuration or secret store; no tokens diff --git a/app/middleware/design-studio.ts b/app/middleware/design-studio.ts new file mode 100644 index 0000000..4a3b310 --- /dev/null +++ b/app/middleware/design-studio.ts @@ -0,0 +1,29 @@ +import type { Middleware } from "@wrnexus/core"; +import type { createStudioHandler } from "@wrnexus/design-studio/server"; + +let studio: 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(); + // 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; + }); + return (await studio)(ctx.req); +}; + +export default designStudio; diff --git a/app/types/wrnexus.generated.d.ts b/app/types/wrnexus.generated.d.ts index e2151ad..81c58c7 100644 --- a/app/types/wrnexus.generated.d.ts +++ b/app/types/wrnexus.generated.d.ts @@ -24,7 +24,9 @@ declare namespace WRNexusGenerated { interface ApiContracts { "/api/teams": { GET: ApiContract }; } - type MiddlewareContexts = Record; + interface MiddlewareContexts { + "design-studio": MiddlewareContext<(typeof import("../middleware/design-studio.ts"))["default"]>; + } type DatabaseQueries = Record; type RealtimeMessages = Record; type QueuePayloads = Record; diff --git a/deploy/nginx-design-studio.conf b/deploy/nginx-design-studio.conf index 6e9a7df..58517c7 100644 --- a/deploy/nginx-design-studio.conf +++ b/deploy/nginx-design-studio.conf @@ -1,14 +1,5 @@ -# Include INSIDE the existing component site's nginx server block. -# The existing location / continues to proxy the component app on its usual port. -location = /design-studio { - return 308 /design-studio/; -} -location /design-studio/ { - # Preserve the path and the external Host so same-origin validation works. - proxy_pass http://127.0.0.1:4320; - proxy_set_header Host $http_host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_http_version 1.1; - proxy_read_timeout 60s; - client_max_body_size 2m; -} +# Studio is now mounted in the component app on its existing port. +# No separate nginx location is required. +# Remove the old /design-studio/ location that proxied to port 4320. +# Let the existing location / forward Studio and normal pages to the same app. +# Preserve Host, Origin and X-Forwarded-Proto in that existing proxy location. diff --git a/deploy/studio-single-port.jpg b/deploy/studio-single-port.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e984623688e60d39f6757ff82058b291e1f6328b GIT binary patch literal 96652 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 3d9753c..c740696 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,16 @@ "build": "bun run generate && wrnexus build .", "typecheck": "tsc --noEmit -p tsconfig.json", "test": "bun test test", - "check": "bun run generate && bun run typecheck && bun run test && bun run build", - "start": "bun scripts/start.ts", + "check": "bun run generate && bun run typecheck && bun run test && bun run build && bun run check:deployment", + "start": "bun dist/server.js", "production": "bun run build && bun run start", "doctor": "wrnexus doctor .", "config:explain": "wrnexus config . --explain", "analyze": "wrnexus analyze .", "update:preview": "wrnexus update . --dry-run", "start:site": "bun dist/server.js", - "studio": "bun scripts/studio.ts" + "studio": "bun scripts/studio.ts", + "check:deployment": "bun scripts/verify-deployment.ts" }, "dependencies": { "@wrnexus/core": "0.8.25", diff --git a/scripts/start.ts b/scripts/start.ts index 6f9002c..446d4dd 100644 --- a/scripts/start.ts +++ b/scripts/start.ts @@ -1,18 +1,4 @@ -import { startStudio } from "./studio.ts"; - -const studio = await startStudio(); -const site = Bun.spawn([process.execPath, "dist/server.js"], { - stdout: "inherit", - stderr: "inherit", - stdin: "inherit", - env: process.env, -}); -const stop = () => { - studio.stop(true); - site.kill("SIGTERM"); -}; -process.on("SIGINT", stop); -process.on("SIGTERM", stop); -const code = await site.exited; -studio.stop(true); -process.exit(code); +// Compatibility entry point: Studio is mounted in the app middleware now. +const entry = "../dist/server.js"; +await import(entry); +export {}; diff --git a/scripts/verify-deployment.ts b/scripts/verify-deployment.ts new file mode 100644 index 0000000..6be69c1 --- /dev/null +++ b/scripts/verify-deployment.ts @@ -0,0 +1,78 @@ +import { CORE_DESIGN_SYSTEMS } from "@wrnexus/design-system"; + +// Exercise the compiled entry point, including package-relative Studio assets. +const reservation = Bun.serve({ + port: 0, + hostname: "127.0.0.1", + fetch: () => new Response(), +}); +const port = reservation.port!; +reservation.stop(true); +const server = Bun.spawn([process.execPath, "dist/server.js"], { + env: { ...process.env, PORT: String(port) }, + stdout: "pipe", + stderr: "pipe", +}); +const origin = `http://127.0.0.1:${port}`; +try { + let ready = false; + for (let attempt = 0; attempt < 60; attempt++) { + try { + ready = (await fetch(origin)).ok; + } catch { + /* Wait for the server to listen. */ + } + if (ready) break; + await Bun.sleep(100); + } + if (!ready) throw Error("Compiled server did not become ready."); + for (const path of [ + "/", + "/components/button", + "/design-studio/", + "/design-studio/studio.js", + "/design-studio/studio.css", + ]) { + const response = await fetch(origin + path); + if (!response.ok) throw Error(`${path} returned ${response.status}`); + const policy = response.headers.get("content-security-policy") ?? ""; + if (path === "/" && !policy.includes("require-trusted-types-for")) + throw Error( + "Normal component pages lost the production security policy.", + ); + if ( + path === "/design-studio/" && + (!policy.includes("frame-ancestors 'none'") || + policy.includes("require-trusted-types-for")) + ) + throw Error("The app replaced Studio's isolated editor security policy."); + } + const application = await ( + await fetch(origin + "/design-studio/api/application") + ).json(); + if (application.enabled !== false) + throw Error("Hosted Studio must remain export-only."); + const preview = await fetch(origin + "/design-studio/api/preview", { + method: "POST", + headers: { "content-type": "application/json", origin }, + body: JSON.stringify({ system: CORE_DESIGN_SYSTEMS.soft }), + }); + if (!preview.ok) + throw Error( + `Studio preview returned ${preview.status}: ${await preview.text()}`, + ); + const { url } = await preview.json(); + if ( + !url.startsWith("/design-studio/preview/") || + !(await fetch(origin + url)).ok + ) + throw Error("Studio preview was not mounted under the app path."); + console.log( + "Compiled server serves component pages, Studio assets, export-only APIs and previews on one port.", + ); +} finally { + server.kill("SIGTERM"); + await server.exited; + const errors = await new Response(server.stderr).text(); + if (errors.trim()) console.error(errors); +} diff --git a/test/hosted-studio.test.ts b/test/hosted-studio.test.ts index 1421af5..5d0af34 100644 --- a/test/hosted-studio.test.ts +++ b/test/hosted-studio.test.ts @@ -1,6 +1,30 @@ import { expect, test } from "bun:test"; import { createStudioHandler } from "@wrnexus/design-studio/server"; import { CORE_DESIGN_SYSTEMS } from "@wrnexus/design-system"; +import { createContext } from "@wrnexus/core"; +import designStudio from "../app/middleware/design-studio.ts"; + +test("application middleware mounts Studio before unmatched routes and preserves normal pages", async () => { + const send = (path: string) => { + const req = new Request("https://components.example" + path); + return designStudio( + createContext(req, new URL(req.url)), + () => new Response("normal page"), + ); + }; + expect(await (await send("/components/button")).text()).toBe("normal page"); + expect(await (await send("/design-studio-other")).text()).toBe("normal page"); + const redirect = await send("/design-studio"); + expect(redirect.status).toBe(308); + expect(redirect.headers.get("location")).toBe("/design-studio/"); + expect(await (await send("/design-studio/")).text()).toContain( + "WrNexus Design Studio", + ); + expect((await send("/design-studio/studio.js")).status).toBe(200); + expect( + (await (await send("/design-studio/api/application")).json()).enabled, + ).toBe(false); +}); test("deployed Studio serves assets and isolated previews without application writes", async () => { const handler = await createStudioHandler({ diff --git a/tsconfig.json b/tsconfig.json index 9d9804b..5a64686 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,6 +15,11 @@ "jsx": "react-jsx", "jsxImportSource": "@wrnexus/core" }, - "include": ["wrnexus.config.ts", "test/**/*.ts", "scripts/**/*.ts"], + "include": [ + "wrnexus.config.ts", + "test/**/*.ts", + "scripts/**/*.ts", + "app/middleware/**/*.ts" + ], "exclude": ["node_modules", "dist", "**/dist", "**/.wrnexus"] } diff --git a/wrnexus.config.ts b/wrnexus.config.ts index 73c0628..770c91d 100644 --- a/wrnexus.config.ts +++ b/wrnexus.config.ts @@ -5,14 +5,21 @@ const config: AppConfig = { seo: { title: "WRNexus UI Component Showcase", titleTemplate: "%s | UI Showcase", - description: "A generated, exhaustive showcase of every component in @wrnexus/ui.", + description: + "A generated, exhaustive showcase of every component in @wrnexus/ui.", robots: "noindex,nofollow", themeColor: "#7c3aed", }, security: { + // Studio supplies its own editor and sandboxed-preview security policies. + routeContentSecurityPolicy: true, contentSecurityPolicy: { directives: { - "frame-src": ["'self'", "https://www.openstreetmap.org", "https://www.google.com"], + "frame-src": [ + "'self'", + "https://www.openstreetmap.org", + "https://www.google.com", + ], }, }, }, @@ -22,7 +29,9 @@ const config: AppConfig = { }, fonts: { sans: '"Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif', - google: [{ family: "Plus Jakarta Sans", weights: [400, 500, 600, 700, 800] }], + google: [ + { family: "Plus Jakarta Sans", weights: [400, 500, 600, 700, 800] }, + ], }, styles: { entry: "app/styles/global.css",