{
const root = mkdtempSync(join(tmpdir(), "wrnexus-component-prop-"));
roots.push(root);
const app = join(root, "app");
mkdirSync(join(app, "pages"), { recursive: true });
mkdirSync(join(app, "components"), { recursive: true });
writeFileSync(join(app, "pages/index.ts"), "export default () => '';\n");
writeFileSync(
join(app, "components/Child.wrn"),
"component Child { props { value = 0 } view { {value} } }\n",
);
const marker = "["value","{count}"]";
const locals = Buffer.from(JSON.stringify({ field: { id: "answer" } })).toString("base64");
const childState = Buffer.from(JSON.stringify({ value: 1 })).toString("base64");
const handlers = createHandlers({
mode: "development",
hmr: false,
router: buildRouter(app),
loadModule: async (file) =>
basename(file) === "Child.wrn"
? {
render: () =>
`1
`,
}
: {
default: () =>
``,
},
getMiddleware: async () => [],
assets: { serve: async () => null },
} satisfies RuntimeDeps);
const response = await handlers.fetch(new Request("https://example.test/"), {
upgrade: () => false,
});
const html = await response!.text();
expect(html).toContain(`data-wrn-prop-bind-0="${marker}"`);
const child = /]*>/.exec(html)?.[0];
expect(child).toBeTruthy();
expect(child).toContain(`data-wrn-prop-bind-0="${marker}"`);
const registry = JSON.parse(/data-wrn-controls[^>]*>(.*?)<\/script>/s.exec(html)![1]!);
const metadata = (attribute: string) => {
const reference = new RegExp(`${attribute}="@[^"]+:([0-9]+)"`).exec(child!)?.[1];
expect(reference).toBeDefined();
return registry[Number(reference)].value;
};
expect(metadata("data-wrn-loop-locals")).toEqual({ field: { id: "answer" } });
expect(metadata("data-wrn-scope")).toEqual({ value: 1 });
expect(html).not.toContain('data-component="Child"');
});
test("translated text is present in the raw server response", async () => {
const root = mkdtempSync(join(tmpdir(), "wrnexus-ssr-i18n-"));
roots.push(root);
const app = join(root, "app");
mkdirSync(join(app, "pages"), { recursive: true });
writeFileSync(join(app, "pages/index.ts"), "export default () => '';\n");
const handlers = createHandlers({
mode: "development",
hmr: false,
router: buildRouter(app),
i18n: resolveI18n({ en: { nav: { title: "Navigation" } } }, { default: "en" }),
loadModule: async () => ({
default: () => '',
}),
getMiddleware: async () => [],
assets: { serve: async () => null },
} satisfies RuntimeDeps);
const response = await handlers.fetch(new Request("https://example.test/"), {
upgrade: () => false,
});
const html = await response!.text();
expect(html).toContain('Navigation');
});
test("translated layout text survives document-template rendering", async () => {
const root = mkdtempSync(join(tmpdir(), "wrnexus-layout-ssr-i18n-"));
roots.push(root);
const app = join(root, "app");
mkdirSync(join(app, "pages"), { recursive: true });
mkdirSync(join(app, "layouts"), { recursive: true });
writeFileSync(join(app, "pages/index.ts"), "export default () => '';\n");
writeFileSync(join(app, "layouts/public.wrn"), "layout Public { view { } }\n");
writeFileSync(
join(app, "layouts/document.wrn"),
"layout Document { view { } }\n",
);
const handlers = createHandlers({
mode: "development",
hmr: false,
router: buildRouter(app),
i18n: resolveI18n({ en: { nav: { home: "Home" } } }, { default: "en" }),
loadModule: async (file) => {
if (basename(file) === "public.wrn") {
return { render: () => '' };
}
if (basename(file) === "document.wrn") {
return { render: () => "" };
}
return { default: () => "Page", layout: "public" };
},
getMiddleware: async () => [],
assets: { serve: async () => null },
} satisfies RuntimeDeps);
const response = await handlers.fetch(new Request("https://example.test/"), {
upgrade: () => false,
});
const html = await response!.text();
expect(html).toContain('Home');
expect(html).not.toContain('');
});