feat(html): browser renderer — runtime-cached tagged templates

Each template literal parses once, keyed by its strings array in a
WeakMap: static parts become a <template> with hole markers, renders
clone and fill. Interpolated values never pass through innerHTML (child
values become text nodes or adopted DOM; attributes go through
setAttribute). Event handlers set as properties so nanomorph copies them.
Document-level roots (<body>/<head>/<html>) parse via DOMParser because
<template> drops them. Replaces the v7 browserify transform entirely —
production speed is now a runtime property.

Tests run in happy-dom (new devDependency), including a check that server
and browser renderers serialize identical markup.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014NgfSjHE11oFpoSnLVKLXd
This commit is contained in:
Bendik Aagaard Lynghaug
2026-09-08 16:56:53 +02:00
co-authored by Claude Fable 5
parent 501e8f5927
commit 84230b1770
4 changed files with 415 additions and 12 deletions
+5 -2
View File
@@ -11,8 +11,11 @@
"node": ">=24"
},
"scripts": {
"test": "node --test packages/core/test/ packages/html/test/"
"test": "node --test packages/core/test/ packages/html/test/ packages/component/test/"
},
"repository": "choojs/choo",
"license": "MIT"
"license": "MIT",
"devDependencies": {
"happy-dom": "^20.14.0"
}
}