fix(core): preserve static methods on classes exposed through scoped window

This commit is contained in:
func25
2026-05-24 22:50:40 +07:00
parent 0845dc9e56
commit d3127a7507
2 changed files with 23 additions and 2 deletions
@@ -146,6 +146,28 @@ body { margin: 0; }
expect(variablesByComp["card-1"]).toEqual({ title: "Pro" });
});
it("preserves static methods on classes exposed through window", () => {
const { document } = parseHTML(`<div data-composition-id="scene"></div>`);
class FakeTexts {
static mountChars() {
return "ok";
}
}
const fakeWindow: Record<string, unknown> = {
document,
__timelines: {},
Texts: FakeTexts,
};
const wrapped = wrapScopedCompositionScript(
`window.__capturedMountCharsType = typeof window.Texts?.mountChars;`,
"scene",
);
new Function("window", wrapped)(fakeWindow);
expect(fakeWindow.__capturedMountCharsType).toBe("function");
});
it("executes document and GSAP selectors inside the composition root", () => {
const { document } = parseHTML(`
<div data-composition-id="scene" data-start="intro"><h1 class="title">Scene</h1></div>
@@ -383,8 +383,7 @@ export function wrapScopedCompositionScript(
? new Proxy(window, {
get: function(target, prop, receiver) {
if (prop === "__timelines") return __hfGetTimelineRegistry();
var value = Reflect.get(target, prop, target);
return typeof value === "function" ? value.bind(target) : value;
return Reflect.get(target, prop, target);
},
set: function(target, prop, value, receiver) {
if (prop === "__timelines") {