feat(compiler): commit deferred client state writes
This commit is contained in:
@@ -145,3 +145,42 @@ test("browser codegen binds peer client functions through the scoped function ta
|
||||
functions.run?.();
|
||||
expect(state.value).toBe(1);
|
||||
});
|
||||
|
||||
test("deferred timer state writes commit after the client function returns", async () => {
|
||||
const targets = generateTargets(
|
||||
parse(`component DeferredWrite {
|
||||
state { value: number = 0 }
|
||||
functions {
|
||||
client function later(): void { setTimeout(() => { value = 2 }, 0) }
|
||||
}
|
||||
view { <button @click='later()'>{value}</button> }
|
||||
}`),
|
||||
);
|
||||
const executable = new Function(
|
||||
`${targets.browser.replace(/^export\s+/gm, "")}\nreturn { bindClientScope };`,
|
||||
)() as { bindClientScope: (context: Record<string, unknown>) => Record<string, () => void> };
|
||||
let rendered = "0";
|
||||
const state = new Proxy(
|
||||
{ value: 0 },
|
||||
{
|
||||
set(target, property, value) {
|
||||
Reflect.set(target, property, value);
|
||||
rendered = String(value);
|
||||
return true;
|
||||
},
|
||||
},
|
||||
);
|
||||
const functions = executable.bindClientScope({
|
||||
state,
|
||||
props: {},
|
||||
output: {},
|
||||
server: {},
|
||||
refs: {},
|
||||
});
|
||||
|
||||
functions.later?.();
|
||||
expect(state.value).toBe(0);
|
||||
await new Promise((resolve) => setTimeout(resolve, 10));
|
||||
expect(state.value).toBe(2);
|
||||
expect(rendered).toBe("2");
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user