diff --git a/.changeset/refresh-derived-invalidation.md b/.changeset/refresh-derived-invalidation.md new file mode 100644 index 0000000..e45c506 --- /dev/null +++ b/.changeset/refresh-derived-invalidation.md @@ -0,0 +1,5 @@ +--- +"@effect-atom/atom": patch +--- + +ensure refreshed lazy parents invalidate newly mounted children diff --git a/packages/atom/src/internal/registry.ts b/packages/atom/src/internal/registry.ts index 5dd8054..6474574 100644 --- a/packages/atom/src/internal/registry.ts +++ b/packages/atom/src/internal/registry.ts @@ -376,6 +376,9 @@ class Node { if (parent.children.indexOf(this) === -1) { parent.children.push(this) + if (parent.skipInvalidation) { + parent.skipInvalidation = false + } } } diff --git a/packages/atom/test/Atom.test.ts b/packages/atom/test/Atom.test.ts index 38cb17e..a70a486 100644 --- a/packages/atom/test/Atom.test.ts +++ b/packages/atom/test/Atom.test.ts @@ -278,6 +278,33 @@ describe("Atom", () => { expect(rebuilds).toEqual(2) }) + it("refresh derived before mount resolves base effect", async () => { + const baseAtom = Atom.make( + Effect.succeed("value").pipe(Effect.delay(100)) + ) + const derivedAtom = Atom.writable( + (get) => get(baseAtom), + () => { + }, + (refresh) => refresh(baseAtom) + ) + const registry = Registry.make() + + registry.refresh(derivedAtom) + const unmount = registry.mount(derivedAtom) + + let result = registry.get(derivedAtom) + assert(result.waiting) + + await vitest.advanceTimersByTimeAsync(100) + + result = registry.get(derivedAtom) + assert(Result.isSuccess(result)) + expect(result.value).toEqual("value") + + unmount() + }) + it("scopedFn", async () => { let finalized = 0 const count = Atom.fn((n: number) =>