fix(csr): consume document binding metadata
Quality / quality (ubuntu-latest) (push) Failing after 9m52s
Quality / quality (windows-latest) (push) Canceled after 0s

This commit is contained in:
2026-08-11 19:12:42 +05:30
parent 78ca2b85d9
commit 4d6db0d887
2 changed files with 33 additions and 0 deletions
+14
View File
@@ -3537,6 +3537,20 @@ export const REACTIVE_RUNTIME = String.raw`
function hydrateScopes(root) { function hydrateScopes(root) {
var host = root || document; var host = root || document;
// The document shell can contain server-resolved attributes such as
// lang={language} and data-theme={theme}. It has no component scope and
// therefore no client-side binding to retain; consume its compiler markers
// separately from component hydration.
if (host === document || host === document.documentElement) {
Array.prototype.slice
.call(document.documentElement.attributes)
.forEach(function (attribute) {
if (attribute.name.indexOf("data-wrn-bind-") === 0) {
document.documentElement.removeAttribute(attribute.name);
}
});
}
var scopeSelector = var scopeSelector =
"[data-scope], [data-wrn-scope]"; "[data-scope], [data-wrn-scope]";
+19
View File
@@ -549,6 +549,25 @@ test("hydration consumes private scope, behavior, and binding metadata", () => {
expect(button.getAttribute("aria-expanded")).toBe("true"); expect(button.getAttribute("aria-expanded")).toBe("true");
}); });
test("hydration removes server-resolved document binding metadata", () => {
const win = mount(`<main>Document content</main>`);
const root = win.document.documentElement;
root.setAttribute("lang", "en");
root.setAttribute("data-theme", "dark");
root.setAttribute("data-wrn-bind-0", '["lang","{language}"]');
root.setAttribute("data-wrn-bind-1", '["data-theme","{theme}"]');
const runtime = win as unknown as {
__wrnexusHydrateScopes?: (root: unknown) => void;
};
runtime.__wrnexusHydrateScopes?.(win.document);
expect(root.getAttribute("lang")).toBe("en");
expect(root.getAttribute("data-theme")).toBe("dark");
expect(root.hasAttribute("data-wrn-bind-0")).toBe(false);
expect(root.hasAttribute("data-wrn-bind-1")).toBe(false);
});
test("compiled client functions are not overwritten by fallback behavior parsing", () => { test("compiled client functions are not overwritten by fallback behavior parsing", () => {
const behavior = Buffer.from( const behavior = Buffer.from(
JSON.stringify({ JSON.stringify({