import { expect, test } from "bun:test"; import { compile } from "../src/index.ts"; test("inactive conditional branches do not dereference null state during server rendering", async () => { const source = `component AddressReview { state review = null view {
{review.address}
{#if review.suppression.active}{/if}{/if} } }`; const code = new Bun.Transpiler({ loader: "ts" }).transformSync( compile(source, "AddressReview.wrn").code, ); const mod = await import("data:text/javascript;base64," + Buffer.from(code).toString("base64")); expect(() => mod.render({})).not.toThrow(); expect(mod.render({})).toContain("{review.address}
{#if review.suppression}{review.suppression.reason}{:else}No block{/if}{/if} } }`; const code = new Bun.Transpiler({ loader: "ts" }).transformSync( compile(source, "ReviewedAddress.wrn").code, ); const mod = await import("data:text/javascript;base64," + Buffer.from(code).toString("base64")); const html = mod.render({}); expect(html).toContain('data-text="review.address">review@example.test'); expect(html).toContain("No block"); expect(html).not.toContain("null"); }); test("inactive branch child components retain parent prop bindings", async () => { const source = `component AddressReview { props { messages = { evidence: 'Evidence', reactivate: 'Reactivate' } } state review = null view { {#if review}{/if} } }`; const code = new Bun.Transpiler({ loader: "ts" }).transformSync( compile(source, "LocalizedReview.wrn").code, ); const mod = await import("data:text/javascript;base64," + Buffer.from(code).toString("base64")); const html = mod.render({}); const match = /data-wrn-if="([A-Za-z0-9+/=]+)"/.exec(html)!; const body = JSON.parse(Buffer.from(match[1]!, "base64").toString())[0].body; expect(body).toContain("data-wrn-prop-bind-0="); expect(body).not.toContain("data-wrn-bind-0="); expect(body).toContain("messages.evidence"); expect(body).toContain("messages.reactivate"); });