fix(journal): re-publish only changed declarations

topoSortAffected followed declared dependencies even when they were not in the affected set, so reevaluateDependents re-evaluated and re-published variables that had not changed. This could also overwrite a value just set via /set with the declaration's own expression.
This commit is contained in:
hyper
2026-09-12 23:44:06 +08:00
parent f17f09a8c4
commit 3532be2335
3 changed files with 28 additions and 4 deletions
@@ -844,6 +844,25 @@ describe("var-reactivity", () => {
});
});
describe("computeCascade — declarations", () => {
test("does not re-publish or re-evaluate declared dependencies that did not change", () => {
initReactivity({
declarations: [
{ key: "$con", expression: "12" },
{ key: "$hp", expression: "$con * 5" },
],
tagModifiers: [],
});
// $con was set to 14; only its dependent $hp should be re-evaluated.
setBase("$con", "14");
const cascade = computeCascade("$con", "12", store({ $con: "14" }));
expect(cascade.map((r) => r.key)).toEqual(["$hp"]);
expect(cascade[0].value).toBe("70");
});
});
describe("computeCascade — tag activation/deactivation", () => {
test("activates tag modifiers when a tag value is set", () => {
initReactivity({