# WRNexusJS DevServer integration ## 1. Add workspace dependency ```json "@wrnexus/dev-toolbar": "workspace:*" ``` ## 2. Create a collector when development starts ```ts import { createDevToolbarCollector } from "@wrnexus/dev-toolbar/server"; const collector = mode === "development" ? createDevToolbarCollector() : undefined; ``` ## 3. Handle toolbar routes before public-file fallback ```ts import { handleDevToolbarRoute } from "@wrnexus/dev-toolbar/server"; const toolbarResponse = collector ? await handleDevToolbarRoute(request, { mode, root: appRoot, collector, editor: config.devToolbar?.editor, allowOpenEditor: config.devToolbar?.openEditor !== false, }) : null; if (toolbarResponse) return toolbarResponse; ``` ## 4. Inject toolbar in full HTML documents ```ts function injectDevToolbar(html: string): string { if (mode !== "development") return html; const script = ''; return html.includes("") ? html.replace("", `${script}`) : `${html}${script}`; } ``` Do not inject into APIs, JSON, XML, assets, downloads, or navigation fragments. Keep the toolbar outside `#app` so CSR navigation does not destroy it. ## 5. Add server errors ```ts import { issueFromError } from "@wrnexus/dev-toolbar/server"; try { return await renderPage(); } catch (error) { collector?.add( issueFromError(error, { ruleId: "server/render-error", category: "server", title: "Page rendering failed", pathname: new URL(request.url).pathname, }), ); throw error; } ``` ## 6. Notify browser after HMR/navigation Dispatch one of these events from existing runtimes: ```ts window.dispatchEvent(new CustomEvent("wrnexus:hmr")); window.dispatchEvent(new CustomEvent("wrnexus:navigated", { detail: { pathname } })); window.dispatchEvent(new CustomEvent("wrnexus:runtime-error", { detail: { message, stack } })); ```