import { expect, test } from "bun:test"; import { renderDocument, renderDocumentStream, renderStoreHydration } from "../src/index.ts"; import type { StoreContainer } from "@wrnexus/store"; import { runWithRequestContext, encodeControlTemplate } from "@wrnexus/core"; test("inactive hydration branches share nonce-tagged styles without changing registry source", () => { runWithRequestContext({} as never, () => { const css = ".review{color:blue}".repeat(500); const style = ``; const reference = encodeControlTemplate([ { cond: "open", body: `${style.repeat(30)}` }, ]); const options = { meta: {}, body: `${style}`, styleNonce: "review-nonce", }; for (let attempt = 0; attempt < 2; attempt++) { const html = renderDocument(options); expect(html.match(/data-wrnexus-style-id="review"/g)).toHaveLength(1); expect(html).toContain('nonce="review-nonce"'); expect(html.indexOf(css)).toBeLessThan(html.indexOf("")); const definitions = JSON.parse(/data-wrn-controls[^>]*>(.*?)<\/script>/s.exec(html)![1]!); expect(definitions[0][0].body).toBe(""); expect(html.length).toBeLessThan(css.length + 2000); } const inactiveOnly = renderDocument({ meta: {}, body: ``, }); expect(inactiveOnly).toContain(css); }); }); test("streamed documents include templates registered by late body chunks", async () => { await runWithRequestContext({} as never, async () => { async function* body() { yield "

Shell

"; await Promise.resolve(); yield ``; } const html = await new Response(renderDocumentStream({ meta: {}, body: body() })).text(); expect(html).toContain("data-wrn-controls"); expect(html).toContain('"body":"Late"'); expect(html.match(/data-wrn-controls/g)).toHaveLength(1); }); }); test("store hydration is HTML-safe, bounded, redacted, and JSON-compatible", () => { const container = { serialize: () => ({ ProfileStore: { display: "", accessToken: "never-render-this", }, }), } as unknown as StoreContainer; const html = renderStoreHydration(container, 'safe" onload="bad'); expect(html).not.toContain("", accessToken: "[REDACTED]" }, }); const oversized = { serialize: () => ({ value: "x".repeat(300_000) }), } as unknown as StoreContainer; expect(() => renderStoreHydration(oversized)).toThrow("exceeds 262144 bytes"); }); test("escapes metadata and script URLs while preserving trusted rendered body", () => { const html = renderDocument({ meta: { title: '', description: '" onload="x' }, body: "
trusted
", scripts: ['">'], }); expect(html).not.toContain(''); expect(html).toContain("</title>"); expect(html).toContain("
trusted
"); expect(html).not.toContain(""); }); test("deduplicates runtime scripts and module preloads", () => { const html = renderDocument({ meta: { title: "Page" }, body: "", scripts: ["/app.js", "/app.js"], }); expect(html.match(/rel="modulepreload"/g)).toHaveLength(1); expect(html.match(/src="\/app\.js"/g)).toHaveLength(1); }); test("always emits a document language and preserves an explicit language", () => { const fallback = renderDocument({ meta: {}, body: "" }); expect(fallback).toContain(''); const explicit = renderDocument({ meta: {}, body: "", htmlAttrs: ' data-theme="dark" lang="fr"', }); expect(explicit).toContain(''); expect(explicit).not.toContain('lang="en"'); }); test("merges framework head and scripts into an application document template", () => { const html = renderDocument({ meta: { title: "Document layout" }, body: "", htmlAttrs: ' data-theme="dark"', scripts: ["/page.js"], documentTemplate: '
Page
', }); expect(html).toStartWith(""); expect(html).toContain(''); expect(html).toContain("Document layout"); expect(html).toContain(''); expect(html).toContain(''); expect(html.match(/ { async function* body() { yield "

Shell

"; yield "

Later

"; } const html = await new Response( renderDocumentStream({ meta: { title: "Stream" }, body: body() }), ).text(); expect(html).toContain('

Shell

Later

'); }); test("renders rich script metadata and deduplicates by source", () => { const html = renderDocument({ meta: { title: "Runtime" }, body: '
', scripts: [ { src: "/__wrnexus/assets/captcha.abc.js", type: "classic", defer: true, integrity: "sha256-test", crossOrigin: "anonymous", attributes: { "data-wrnexus-runtime-src": "captcha" }, }, { src: "/__wrnexus/assets/captcha.abc.js", type: "classic" }, ], }); expect(html.match(/captcha\.abc\.js/g)).toHaveLength(1); expect(html).toContain("defer"); expect(html).toContain('integrity="sha256-test"'); expect(html).toContain('crossorigin="anonymous"'); expect(html).toContain('data-wrnexus-runtime-src="captcha"'); expect(html).not.toContain('rel="modulepreload" href="/__wrnexus/assets/captcha.abc.js"'); }); test("promotes WRN style blocks into head after global CSS with CSP nonce", () => { const html = renderDocument({ meta: { title: "Styled" }, extraHead: '', styleNonce: "nonce-123", body: '' + '' + '' + '
Styled
', }); expect(html).not.toContain('
Styled'); expect(html.match(/data-wrnexus-style-id=/g)).toHaveLength(3); expect(html.match(/nonce="nonce-123"/g)).toHaveLength(3); const globalIndex = html.indexOf("/global.css"); const layoutIndex = html.indexOf('data-wrnexus-style-id="layout"'); const pageIndex = html.indexOf('data-wrnexus-style-id="page"'); const componentIndex = html.indexOf('data-wrnexus-style-id="card"'); expect(globalIndex).toBeLessThan(layoutIndex); expect(layoutIndex).toBeLessThan(pageIndex); expect(pageIndex).toBeLessThan(componentIndex); }); test("deduplicates repeated component style blocks", () => { const style = ''; const html = renderDocument({ meta: { title: "Repeated" }, body: `${style}
One
${style}
Two
`, }); expect(html.match(/data-wrnexus-style-id="card"/g)).toHaveLength(1); expect(html).toContain("
One
Two
"); }); test("places document-layout WRN styles at the end of head", () => { const html = renderDocument({ meta: { title: "Document styles" }, styleNonce: "document-nonce", body: "", documentTemplate: '' + '' + '
Page
', }); const globalIndex = html.indexOf("/document-global.css"); const styleIndex = html.indexOf('data-wrnexus-style-id="document-layout"'); const headEnd = html.indexOf(""); expect(globalIndex).toBeLessThan(styleIndex); expect(styleIndex).toBeLessThan(headEnd); expect(html).not.toContain(" { runWithRequestContext({} as never, () => { const behavior = { functions: "function increment(){count++}", outputs: [], computed: [], effects: [], lifecycle: {}, watches: [], }; const encoded = Buffer.from(JSON.stringify(behavior)).toString("base64"); const instance = `
`; const reference = encodeControlTemplate([{ cond: "open", body: instance.repeat(100) }]); const document = renderDocument({ meta: {}, body: instance.repeat(100) + ``, }); const definitions = JSON.parse(/data-wrn-controls[^>]*>(.*?)<\/script>/s.exec(document)![1]!); expect(definitions.filter((entry: any) => entry.functions)).toHaveLength(1); expect(document).not.toContain(`data-wrn-behavior="${encoded}"`); expect(document.match(/data-wrn-behavior="@/g)?.length).toBe(100); expect(definitions[0][0].body.match(/data-wrn-behavior="@/g)).toHaveLength(100); expect(document.length).toBeLessThan(instance.length * 200); }); }); test("old client navigation keeps inline behavior while capable clients use references", () => { const encoded = Buffer.from( JSON.stringify({ functions: "function increment(){count++}" }), ).toString("base64"); for (const capable of [false, true]) runWithRequestContext( { req: new Request("https://example.test/next", { headers: { "x-wrnexus-nav": "1", ...(capable ? { "x-wrnexus-behaviors": "registry-v1" } : {}), }, }), } as never, () => { const html = renderDocument({ meta: {}, body: `
`, }); expect(html.includes(`data-wrn-behavior="${encoded}"`)).toBe(!capable); expect(html.includes('data-wrn-behavior="@')).toBe(capable); }, ); }); test("scope and loop metadata share a request value without duplicating fallback declarations", () => { const encoded = Buffer.from( JSON.stringify({ items: Array.from({ length: 30 }, (_, i) => ({ label: "Menu " + i })) }), ).toString("base64"); for (const mode of ["registry-v1", "registry-v2"]) runWithRequestContext( { req: new Request("https://example.test/", { headers: { "x-wrnexus-nav": "1", "x-wrnexus-behaviors": mode }, }), } as never, () => { const node = `
`; const html = renderDocument({ meta: {}, body: node.repeat(50) }); if (mode === "registry-v1") { expect(html).toContain(`data-wrn-scope="${encoded}"`); expect(html).toContain('data-scope="items: []"'); } else { expect(html).not.toContain(encoded); expect(html).toContain('data-scope=""'); expect(html).toContain('data-wrn-loop-locals="@'); expect(html.length).toBeLessThan(node.length * 10); } }, ); }); test("scope state named body remains data rather than a control template", () => { runWithRequestContext({} as never, () => { const value = { body: '', label: "keep", }; const encoded = Buffer.from(JSON.stringify(value)).toString("base64"); const html = renderDocument({ meta: {}, body: `
`, }); const entries = JSON.parse(/data-wrn-controls[^>]*>(.*?)<\/script>/s.exec(html)![1]!); expect(entries.find((entry: any) => entry.__wrnMetadata)?.value).toEqual(value); expect(html.split("")[0]).not.toContain("literal user text"); }); });