From 8497256c56e508ea7f6707d46ec0b94cf6d5efb8 Mon Sep 17 00:00:00 2001 From: David Maskasky Date: Tue, 18 Nov 2025 17:02:36 -0800 Subject: [PATCH] add storeHooks.i to be called when atomState is created --- src/vanilla/internals.ts | 5 +++++ tests/vanilla/internals.test.tsx | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/vanilla/internals.ts b/src/vanilla/internals.ts index 26f3e23ec1..fd095fdaf4 100644 --- a/src/vanilla/internals.ts +++ b/src/vanilla/internals.ts @@ -330,6 +330,8 @@ type StoreHookForAtoms = { /** StoreHooks are an experimental API. */ type StoreHooks = { + /** Listener to notify when the atom is initialized. */ + readonly i?: StoreHookForAtoms /** Listener to notify when the atom is read. */ readonly r?: StoreHookForAtoms /** Listener to notify when the atom value is changed. */ @@ -380,6 +382,7 @@ const createStoreHookForAtoms = (): StoreHookForAtoms => { function initializeStoreHooks(storeHooks: StoreHooks): Required { type SH = { -readonly [P in keyof StoreHooks]: StoreHooks[P] } + ;(storeHooks as SH).i ||= createStoreHookForAtoms() ;(storeHooks as SH).r ||= createStoreHookForAtoms() ;(storeHooks as SH).c ||= createStoreHookForAtoms() ;(storeHooks as SH).m ||= createStoreHookForAtoms() @@ -401,6 +404,7 @@ const atomOnMount: AtomOnMount = (_store, atom, setAtom) => const ensureAtomState: EnsureAtomState = (store, atom) => { const buildingBlocks = getInternalBuildingBlocks(store) const atomStateMap = buildingBlocks[0] + const storeHooks = buildingBlocks[6] const atomOnInit = buildingBlocks[9] if (import.meta.env?.MODE !== 'production' && !atom) { throw new Error('Atom is undefined or null') @@ -409,6 +413,7 @@ const ensureAtomState: EnsureAtomState = (store, atom) => { if (!atomState) { atomState = { d: new Map(), p: new Set(), n: 0 } atomStateMap.set(atom, atomState) + storeHooks.i?.(atom) atomOnInit?.(store, atom) } return atomState as never diff --git a/tests/vanilla/internals.test.tsx b/tests/vanilla/internals.test.tsx index bf27c40bdc..8e580260c1 100644 --- a/tests/vanilla/internals.test.tsx +++ b/tests/vanilla/internals.test.tsx @@ -106,6 +106,17 @@ describe('store hooks', () => { return { store, storeHooks } } + describe('init hook (i)', () => { + it('should call init hook when atom state is initialized', () => { + const { store, storeHooks } = createStoreWithHooks() + const baseAtom = atom(0) + const initCallback = vi.fn() + storeHooks.i.add(baseAtom, initCallback) + store.get(baseAtom) + expect(initCallback).toHaveBeenCalledTimes(1) + }) + }) + describe('read hook (r)', () => { it('should call read hook when atom is read', () => { const { store, storeHooks } = createStoreWithHooks()