@kdeveloper/kvark 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -127,7 +127,7 @@ The `ctx` passed to `set` provides:
127
127
 
128
128
  - **`ctx.get(key)`** — read any declared dependency (same as in `get`).
129
129
  - **`ctx.signal`** — an `AbortSignal` tied to the atom's lifecycle, useful for cancelling in-flight requests.
130
- - **`ctx.setOptimisticValue(value)`** — synchronously update the atom's cached value before the async work completes (see below).
130
+ - **`ctx.setOptimisticValue(value)`** — synchronously update the atom's cached value before the async work completes (see below). Also accepts a mutator `(prev) => next`.
131
131
 
132
132
  #### Optimistic updates
133
133
 
@@ -151,17 +151,26 @@ const todoAtom = atom({
151
151
  });
152
152
  ```
153
153
 
154
+ `setOptimisticValue` also accepts a mutator function — the callback receives the previous value (or `undefined` if pending) and returns the next one:
155
+
156
+ ```ts
157
+ set: async (ctx) => {
158
+ ctx.setOptimisticValue((prev) => ({ ...prev, loading: true }));
159
+ await fetch("/api/update", { signal: ctx.signal });
160
+ },
161
+ ```
162
+
154
163
  If the `PUT` fails, the atom reverts to whatever value `get` had loaded before the optimistic update — no manual rollback needed.
155
164
 
156
165
  #### Writable atoms vs `onMount`
157
166
 
158
167
  Both can update an atom's cached value, but they serve different purposes:
159
168
 
160
- | | `set` | `onMount` |
161
- |-|-------|-----------|
162
- | **Triggered by** | Explicit call (`store.set`, `useSetAtom`) | First subscriber mounts |
163
- | **After update** | `invalidate` → refetch via `get` | No refetch — value stays as-is |
164
- | **Use case** | Mutations, API calls, optimistic updates | Timers, subscriptions, imperative push |
169
+ | | `set` | `onMount` |
170
+ | ---------------- | ----------------------------------------- | -------------------------------------- |
171
+ | **Triggered by** | Explicit call (`store.set`, `useSetAtom`) | First subscriber mounts |
172
+ | **After update** | `invalidate` → refetch via `get` | No refetch — value stays as-is |
173
+ | **Use case** | Mutations, API calls, optimistic updates | Timers, subscriptions, imperative push |
165
174
 
166
175
  ### `onMount`
167
176
 
@@ -361,6 +370,14 @@ ws.addEventListener("message", (event) => {
361
370
  });
362
371
  ```
363
372
 
373
+ `write` also accepts a mutator function — just like React's `setState`. The callback receives the previous value (or `undefined` if the atom is still pending) and returns the next one:
374
+
375
+ ```ts
376
+ client.write(counterAtom, (prev) => (prev ?? 0) + 1);
377
+ ```
378
+
379
+ > If `V` itself is a function type, pass a mutator that returns it: `write(atom, () => myFn)`.
380
+
364
381
  `write` works on any `Atom<V>` — the atom does not need a `set` config. This makes it the right tool when you already have the final value and want to skip a redundant network round-trip.
365
382
 
366
383
  ### `StoreClient` interface
@@ -370,6 +387,7 @@ interface StoreClient {
370
387
  get<V>(atom: Atom<V>): Promise<V>;
371
388
  set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void>;
372
389
  write<V>(atom: Atom<V>, value: V): void;
390
+ write<V>(atom: Atom<V>, mutate: (prev: V | undefined) => V): void;
373
391
  invalidate(atom: Atom<unknown>): void;
374
392
  invalidateMany(atoms: ReadonlyArray<Atom<unknown>>): void;
375
393
  subscribe<V>(atom: Atom<V>, listener: (state: AtomState<V>) => void): () => void;
@@ -408,11 +426,11 @@ type Writable = IsWritable<typeof countAtom>; // → true | false
408
426
 
409
427
  ## Package Structure
410
428
 
411
- | Import | Contents |
412
- | -------------------------- | ---------------------------------------------------------------------- |
413
- | `@kdeveloper/kvark` | `atom`, `createStore`, all types |
429
+ | Import | Contents |
430
+ | -------------------------- | --------------------------------------------------------------------- |
431
+ | `@kdeveloper/kvark` | `atom`, `createStore`, all types |
414
432
  | `@kdeveloper/kvark/react` | `Provider`, `useAtomValue`, `useSetAtom`, `useAtom`, `useAtomContext` |
415
- | `@kdeveloper/kvark/family` | `atomFamily` |
433
+ | `@kdeveloper/kvark/family` | `atomFamily` |
416
434
 
417
435
  The core (`@kdeveloper/kvark`) has **zero runtime dependencies**. React is a peer dependency only needed when using the `/react` subpath.
418
436
 
@@ -1,4 +1,4 @@
1
- import { f as WritableAtom, i as Atom, o as AtomConfig, p as WritableAtomContext } from "./store-BbmNU3xn.mjs";
1
+ import { f as WritableAtom, i as Atom, o as AtomConfig, p as WritableAtomContext } from "./store-DQL8VJhU.mjs";
2
2
 
3
3
  //#region src/internal/atom.d.ts
4
4
  type WritableConfig<Value, Deps extends Record<string, Atom<unknown>>, Args extends readonly unknown[]> = AtomConfig<Value, Deps, Args> & {
@@ -9,4 +9,4 @@ declare function atom<Value, Deps extends Record<string, Atom<unknown>> = Record
9
9
  declare function atom<Value, Deps extends Record<string, Atom<unknown>> = Record<never, never>>(config: ReadonlyConfig<Value, Deps>): Atom<Value>;
10
10
  //#endregion
11
11
  export { atom as t };
12
- //# sourceMappingURL=atom-CtZVA4ka.d.mts.map
12
+ //# sourceMappingURL=atom-DEAcunGv.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"atom-CtZVA4ka.d.mts","names":[],"sources":["../src/internal/atom.ts"],"mappings":";;;KASK,cAAA,qBAEU,MAAA,SAAe,IAAA,+CAE1B,UAAA,CAAW,KAAA,EAAO,IAAA,EAAM,IAAA;EAC1B,GAAA,GAAM,GAAA,EAAK,mBAAA,CAAoB,IAAA,EAAM,KAAA,MAAW,IAAA,EAAM,IAAA,KAAS,OAAA;AAAA;AAAA,KAG5D,cAAA,qBAAmC,MAAA,SAAe,IAAA,cAAkB,IAAA,CACvE,UAAA,CAAW,KAAA,EAAO,IAAA;AAAA,iBAIJ,IAAA,qBAED,MAAA,SAAe,IAAA,aAAiB,MAAA,8DAAA,CAE7C,MAAA,EAAQ,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,IAAA,IAAQ,YAAA,CAAa,KAAA,EAAO,IAAA;AAAA,iBAElD,IAAA,qBAAyB,MAAA,SAAe,IAAA,aAAiB,MAAA,eAAA,CACvE,MAAA,EAAQ,cAAA,CAAe,KAAA,EAAO,IAAA,IAC7B,IAAA,CAAK,KAAA"}
1
+ {"version":3,"file":"atom-DEAcunGv.d.mts","names":[],"sources":["../src/internal/atom.ts"],"mappings":";;;KASK,cAAA,qBAEU,MAAA,SAAe,IAAA,+CAE1B,UAAA,CAAW,KAAA,EAAO,IAAA,EAAM,IAAA;EAC1B,GAAA,GAAM,GAAA,EAAK,mBAAA,CAAoB,IAAA,EAAM,KAAA,MAAW,IAAA,EAAM,IAAA,KAAS,OAAA;AAAA;AAAA,KAG5D,cAAA,qBAAmC,MAAA,SAAe,IAAA,cAAkB,IAAA,CACvE,UAAA,CAAW,KAAA,EAAO,IAAA;AAAA,iBAIJ,IAAA,qBAED,MAAA,SAAe,IAAA,aAAiB,MAAA,8DAAA,CAE7C,MAAA,EAAQ,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,IAAA,IAAQ,YAAA,CAAa,KAAA,EAAO,IAAA;AAAA,iBAElD,IAAA,qBAAyB,MAAA,SAAe,IAAA,aAAiB,MAAA,eAAA,CACvE,MAAA,EAAQ,cAAA,CAAe,KAAA,EAAO,IAAA,IAC7B,IAAA,CAAK,KAAA"}
package/dist/family.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as AtomState, d as StalePolicy, f as WritableAtom, i as Atom, l as AtomValue, o as AtomConfig, r as createStore, s as AtomContext } from "./store-BbmNU3xn.mjs";
2
- import { t as atom } from "./atom-CtZVA4ka.mjs";
1
+ import { c as AtomState, d as StalePolicy, f as WritableAtom, i as Atom, l as AtomValue, o as AtomConfig, r as createStore, s as AtomContext } from "./store-DQL8VJhU.mjs";
2
+ import { t as atom } from "./atom-DEAcunGv.mjs";
3
3
 
4
4
  //#region src/internal/family.d.ts
5
5
  type AtomFamilyOptions<Param, Value, Deps extends Record<string, Atom<unknown>>, Args extends readonly unknown[]> = {
package/dist/family.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { n as atomFamily, r as atom, t as createStore } from "./store-CmRXgcwh.mjs";
1
+ import { n as atomFamily, r as atom, t as createStore } from "./store-CNjvdLHG.mjs";
2
2
  export { atom, atomFamily, createStore };
package/dist/index.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- import { a as AtomArgs, c as AtomState, d as StalePolicy, f as WritableAtom, i as Atom, l as AtomValue, n as StoreClient, o as AtomConfig, p as WritableAtomContext, r as createStore, s as AtomContext, u as IsWritable } from "./store-BbmNU3xn.mjs";
2
- import { t as atom } from "./atom-CtZVA4ka.mjs";
1
+ import { a as AtomArgs, c as AtomState, d as StalePolicy, f as WritableAtom, i as Atom, l as AtomValue, n as StoreClient, o as AtomConfig, p as WritableAtomContext, r as createStore, s as AtomContext, u as IsWritable } from "./store-DQL8VJhU.mjs";
2
+ import { t as atom } from "./atom-DEAcunGv.mjs";
3
3
  export { type Atom, type AtomArgs, type AtomConfig, type AtomContext, type AtomState, type AtomValue, type IsWritable, type StalePolicy, type StoreClient, type WritableAtom, type WritableAtomContext, atom, createStore };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { r as atom, t as createStore } from "./store-CmRXgcwh.mjs";
1
+ import { r as atom, t as createStore } from "./store-CNjvdLHG.mjs";
2
2
  export { atom, createStore };
@@ -1,4 +1,4 @@
1
- import { f as WritableAtom, i as Atom, n as StoreClient, t as Store } from "../store-BbmNU3xn.mjs";
1
+ import { f as WritableAtom, i as Atom, n as StoreClient, t as Store } from "../store-DQL8VJhU.mjs";
2
2
  import { ReactNode } from "react";
3
3
 
4
4
  //#region src/react/provider.d.ts
@@ -1,4 +1,4 @@
1
- import { i as CONFIG } from "../store-CmRXgcwh.mjs";
1
+ import { i as CONFIG } from "../store-CNjvdLHG.mjs";
2
2
  import { createContext, useCallback, useContext, useSyncExternalStore } from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/react/provider.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/react/provider.tsx","../../src/react/use-atom-value.ts","../../src/react/use-set-atom.ts","../../src/react/use-atom.ts","../../src/react/use-atom-context.ts"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\nimport { Store } from \"../internal/store.js\";\n\nconst StoreContext = createContext<Store | null>(null);\n\nexport type ProviderProps = {\n store: Store;\n children: ReactNode;\n};\n\nexport function Provider({ store, children }: ProviderProps): ReactNode {\n return <StoreContext value={store}>{children}</StoreContext>;\n}\n\nexport function useStore(): Store {\n const store = useContext(StoreContext);\n if (store == null) {\n throw new Error(\"useStore must be used within a <Provider>\");\n }\n return store;\n}\n","import { useSyncExternalStore } from \"react\";\nimport type { Atom, AtomState, StalePolicy } from \"../internal/types.js\";\nimport { CONFIG } from \"../internal/types.js\";\nimport { useStore } from \"./provider.js\";\n\ntype ObservedValue<V> = {\n value: V;\n isStale: boolean;\n error: unknown;\n};\n\nexport function useAtomValue<V>(atom: Atom<V>): V;\nexport function useAtomValue<V>(atom: Atom<V>, opts: { observe: true }): ObservedValue<V>;\nexport function useAtomValue<V>(atom: Atom<V>, opts?: { observe: true }): V | ObservedValue<V> {\n const store = useStore();\n\n const snapshot: AtomState<V> = useSyncExternalStore(\n (notify) => store.subscribe(atom, notify),\n () => store.getSnapshot(atom),\n () => store.getServerSnapshot(atom),\n );\n\n const stalePolicy: StalePolicy = atom[CONFIG].stalePolicy ?? \"keep\";\n\n if (snapshot.status === \"pending\") {\n throw store.resolve(atom);\n }\n\n if (snapshot.status === \"stale\") {\n if (stalePolicy === \"suspend\") {\n throw store.resolve(atom);\n }\n // \"keep\" or \"reset\" while stale: trigger background revalidation\n void store.resolve(atom);\n\n if (opts?.observe === true) {\n return { value: snapshot.value, isStale: true, error: undefined };\n }\n return snapshot.value;\n }\n\n if (snapshot.status === \"error\") {\n if (opts?.observe === true && snapshot.value !== undefined) {\n return {\n value: snapshot.value as V,\n isStale: false,\n error: snapshot.error,\n };\n }\n throw snapshot.error;\n }\n\n // status === \"fresh\"\n if (opts?.observe === true) {\n return { value: snapshot.value, isStale: false, error: undefined };\n }\n return snapshot.value;\n}\n","import { useCallback } from \"react\";\nimport type { WritableAtom } from \"../internal/types.js\";\nimport { useStore } from \"./provider.js\";\n\nexport function useSetAtom<V, A extends readonly unknown[]>(\n atom: WritableAtom<V, A>,\n): (...args: A) => Promise<void> {\n const store = useStore();\n return useCallback((...args: A): Promise<void> => store.set(atom, ...args), [store, atom]);\n}\n","import type { WritableAtom } from \"../internal/types.js\";\nimport { useAtomValue } from \"./use-atom-value.js\";\nimport { useSetAtom } from \"./use-set-atom.js\";\n\nexport function useAtom<V, A extends readonly unknown[]>(\n atom: WritableAtom<V, A>,\n): readonly [V, (...args: A) => Promise<void>] {\n const value = useAtomValue(atom);\n const setter = useSetAtom(atom);\n return [value, setter] as const;\n}\n","import { useCallback } from \"react\";\nimport type { StoreClient } from \"../internal/store.js\";\nimport { useStore } from \"./provider.js\";\n\nexport function useAtomContext<R>(callback: (ctx: StoreClient) => Promise<R>): () => Promise<R> {\n const store = useStore();\n return useCallback((): Promise<R> => callback(store.getClient()), [store, callback]);\n}\n"],"mappings":";;;;AAGA,MAAM,eAAe,cAA4B,KAAK;AAOtD,SAAgB,SAAS,EAAE,OAAO,YAAsC;AACtE,QAAO,oBAAC,cAAD;EAAc,OAAO;EAAQ;EAAwB,CAAA;;AAG9D,SAAgB,WAAkB;CAChC,MAAM,QAAQ,WAAW,aAAa;AACtC,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,4CAA4C;AAE9D,QAAO;;;;ACNT,SAAgB,aAAgB,MAAe,MAAgD;CAC7F,MAAM,QAAQ,UAAU;CAExB,MAAM,WAAyB,sBAC5B,WAAW,MAAM,UAAU,MAAM,OAAO,QACnC,MAAM,YAAY,KAAK,QACvB,MAAM,kBAAkB,KAAK,CACpC;CAED,MAAM,cAA2B,KAAK,QAAQ,eAAe;AAE7D,KAAI,SAAS,WAAW,UACtB,OAAM,MAAM,QAAQ,KAAK;AAG3B,KAAI,SAAS,WAAW,SAAS;AAC/B,MAAI,gBAAgB,UAClB,OAAM,MAAM,QAAQ,KAAK;AAGtB,QAAM,QAAQ,KAAK;AAExB,MAAI,MAAM,YAAY,KACpB,QAAO;GAAE,OAAO,SAAS;GAAO,SAAS;GAAM,OAAO,KAAA;GAAW;AAEnE,SAAO,SAAS;;AAGlB,KAAI,SAAS,WAAW,SAAS;AAC/B,MAAI,MAAM,YAAY,QAAQ,SAAS,UAAU,KAAA,EAC/C,QAAO;GACL,OAAO,SAAS;GAChB,SAAS;GACT,OAAO,SAAS;GACjB;AAEH,QAAM,SAAS;;AAIjB,KAAI,MAAM,YAAY,KACpB,QAAO;EAAE,OAAO,SAAS;EAAO,SAAS;EAAO,OAAO,KAAA;EAAW;AAEpE,QAAO,SAAS;;;;ACpDlB,SAAgB,WACd,MAC+B;CAC/B,MAAM,QAAQ,UAAU;AACxB,QAAO,aAAa,GAAG,SAA2B,MAAM,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC,OAAO,KAAK,CAAC;;;;ACJ5F,SAAgB,QACd,MAC6C;AAG7C,QAAO,CAFO,aAAa,KAAK,EACjB,WAAW,KAAK,CACT;;;;ACLxB,SAAgB,eAAkB,UAA8D;CAC9F,MAAM,QAAQ,UAAU;AACxB,QAAO,kBAA8B,SAAS,MAAM,WAAW,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/react/provider.tsx","../../src/react/use-atom-value.ts","../../src/react/use-set-atom.ts","../../src/react/use-atom.ts","../../src/react/use-atom-context.ts"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\nimport { Store } from \"@/internal/store.js\";\n\nconst StoreContext = createContext<Store | null>(null);\n\nexport type ProviderProps = {\n store: Store;\n children: ReactNode;\n};\n\nexport function Provider({ store, children }: ProviderProps): ReactNode {\n return <StoreContext value={store}>{children}</StoreContext>;\n}\n\nexport function useStore(): Store {\n const store = useContext(StoreContext);\n if (store == null) {\n throw new Error(\"useStore must be used within a <Provider>\");\n }\n return store;\n}\n","import { useSyncExternalStore } from \"react\";\nimport type { Atom, AtomState, StalePolicy } from \"@/internal/types.js\";\nimport { CONFIG } from \"@/internal/types.js\";\nimport { useStore } from \"@/react/provider.js\";\n\ntype ObservedValue<V> = {\n value: V;\n isStale: boolean;\n error: unknown;\n};\n\nexport function useAtomValue<V>(atom: Atom<V>): V;\nexport function useAtomValue<V>(atom: Atom<V>, opts: { observe: true }): ObservedValue<V>;\nexport function useAtomValue<V>(atom: Atom<V>, opts?: { observe: true }): V | ObservedValue<V> {\n const store = useStore();\n\n const snapshot: AtomState<V> = useSyncExternalStore(\n (notify) => store.subscribe(atom, notify),\n () => store.getSnapshot(atom),\n () => store.getServerSnapshot(atom),\n );\n\n const stalePolicy: StalePolicy = atom[CONFIG].stalePolicy ?? \"keep\";\n\n if (snapshot.status === \"pending\") {\n throw store.resolve(atom);\n }\n\n if (snapshot.status === \"stale\") {\n if (stalePolicy === \"suspend\") {\n throw store.resolve(atom);\n }\n // \"keep\" or \"reset\" while stale: trigger background revalidation\n void store.resolve(atom);\n\n if (opts?.observe === true) {\n return { value: snapshot.value, isStale: true, error: undefined };\n }\n return snapshot.value;\n }\n\n if (snapshot.status === \"error\") {\n if (opts?.observe === true && snapshot.value !== undefined) {\n return {\n value: snapshot.value as V,\n isStale: false,\n error: snapshot.error,\n };\n }\n throw snapshot.error;\n }\n\n // status === \"fresh\"\n if (opts?.observe === true) {\n return { value: snapshot.value, isStale: false, error: undefined };\n }\n return snapshot.value;\n}\n","import { useCallback } from \"react\";\nimport type { WritableAtom } from \"@/internal/types.js\";\nimport { useStore } from \"@/react/provider.js\";\n\nexport function useSetAtom<V, A extends readonly unknown[]>(\n atom: WritableAtom<V, A>,\n): (...args: A) => Promise<void> {\n const store = useStore();\n return useCallback((...args: A): Promise<void> => store.set(atom, ...args), [store, atom]);\n}\n","import type { WritableAtom } from \"@/internal/types.js\";\nimport { useAtomValue } from \"@/react/use-atom-value.js\";\nimport { useSetAtom } from \"@/react/use-set-atom.js\";\n\nexport function useAtom<V, A extends readonly unknown[]>(\n atom: WritableAtom<V, A>,\n): readonly [V, (...args: A) => Promise<void>] {\n const value = useAtomValue(atom);\n const setter = useSetAtom(atom);\n return [value, setter] as const;\n}\n","import { useCallback } from \"react\";\nimport type { StoreClient } from \"@/internal/store.js\";\nimport { useStore } from \"@/react/provider.js\";\n\nexport function useAtomContext<R>(callback: (ctx: StoreClient) => Promise<R>): () => Promise<R> {\n const store = useStore();\n return useCallback((): Promise<R> => callback(store.getClient()), [store, callback]);\n}\n"],"mappings":";;;;AAGA,MAAM,eAAe,cAA4B,KAAK;AAOtD,SAAgB,SAAS,EAAE,OAAO,YAAsC;AACtE,QAAO,oBAAC,cAAD;EAAc,OAAO;EAAQ;EAAwB,CAAA;;AAG9D,SAAgB,WAAkB;CAChC,MAAM,QAAQ,WAAW,aAAa;AACtC,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,4CAA4C;AAE9D,QAAO;;;;ACNT,SAAgB,aAAgB,MAAe,MAAgD;CAC7F,MAAM,QAAQ,UAAU;CAExB,MAAM,WAAyB,sBAC5B,WAAW,MAAM,UAAU,MAAM,OAAO,QACnC,MAAM,YAAY,KAAK,QACvB,MAAM,kBAAkB,KAAK,CACpC;CAED,MAAM,cAA2B,KAAK,QAAQ,eAAe;AAE7D,KAAI,SAAS,WAAW,UACtB,OAAM,MAAM,QAAQ,KAAK;AAG3B,KAAI,SAAS,WAAW,SAAS;AAC/B,MAAI,gBAAgB,UAClB,OAAM,MAAM,QAAQ,KAAK;AAGtB,QAAM,QAAQ,KAAK;AAExB,MAAI,MAAM,YAAY,KACpB,QAAO;GAAE,OAAO,SAAS;GAAO,SAAS;GAAM,OAAO,KAAA;GAAW;AAEnE,SAAO,SAAS;;AAGlB,KAAI,SAAS,WAAW,SAAS;AAC/B,MAAI,MAAM,YAAY,QAAQ,SAAS,UAAU,KAAA,EAC/C,QAAO;GACL,OAAO,SAAS;GAChB,SAAS;GACT,OAAO,SAAS;GACjB;AAEH,QAAM,SAAS;;AAIjB,KAAI,MAAM,YAAY,KACpB,QAAO;EAAE,OAAO,SAAS;EAAO,SAAS;EAAO,OAAO,KAAA;EAAW;AAEpE,QAAO,SAAS;;;;ACpDlB,SAAgB,WACd,MAC+B;CAC/B,MAAM,QAAQ,UAAU;AACxB,QAAO,aAAa,GAAG,SAA2B,MAAM,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC,OAAO,KAAK,CAAC;;;;ACJ5F,SAAgB,QACd,MAC6C;AAG7C,QAAO,CAFO,aAAa,KAAK,EACjB,WAAW,KAAK,CACT;;;;ACLxB,SAAgB,eAAkB,UAA8D;CAC9F,MAAM,QAAQ,UAAU;AACxB,QAAO,kBAA8B,SAAS,MAAM,WAAW,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC"}
@@ -319,14 +319,14 @@ var Store = class {
319
319
  const optimisticSnapshot = { current: null };
320
320
  const ctx = {
321
321
  ...baseCtx,
322
- setOptimisticValue: (value) => {
322
+ setOptimisticValue: (valueOrMutate) => {
323
323
  if (optimisticSnapshot.current == null) optimisticSnapshot.current = {
324
324
  state: entry.state,
325
325
  version: entry.version
326
326
  };
327
327
  entry.state = {
328
328
  status: "fresh",
329
- value,
329
+ value: typeof valueOrMutate === "function" ? valueOrMutate(extractPreviousValue(entry.state)) : valueOrMutate,
330
330
  error: void 0
331
331
  };
332
332
  entry.version++;
@@ -347,13 +347,13 @@ var Store = class {
347
347
  }
348
348
  this.invalidate(atom);
349
349
  }
350
- write(atom, value) {
350
+ write(atom, valueOrMutate) {
351
351
  const entry = this.#getOrCreate(atom);
352
352
  this.#controllers.get(atom)?.abort();
353
353
  entry.promise = null;
354
354
  entry.state = {
355
355
  status: "fresh",
356
- value,
356
+ value: typeof valueOrMutate === "function" ? valueOrMutate(extractPreviousValue(entry.state)) : valueOrMutate,
357
357
  error: void 0
358
358
  };
359
359
  entry.version++;
@@ -362,28 +362,15 @@ var Store = class {
362
362
  }
363
363
  getClient() {
364
364
  if (this.#client != null) return this.#client;
365
- const store = this;
366
365
  this.#client = {
367
- get(atom) {
368
- return store.resolve(atom);
369
- },
370
- set(atom, ...args) {
371
- return store.set(atom, ...args);
372
- },
373
- write(atom, value) {
374
- store.write(atom, value);
375
- },
376
- invalidate(atom) {
377
- store.invalidate(atom);
378
- },
379
- invalidateMany(atoms) {
380
- store.invalidateMany(atoms);
381
- },
382
- subscribe(atom, listener) {
383
- return store.subscribe(atom, () => {
384
- listener(store.getSnapshot(atom));
385
- });
386
- }
366
+ get: (atom) => this.resolve(atom),
367
+ set: (atom, ...args) => this.set(atom, ...args),
368
+ write: (atom, valueOrMutate) => this.write(atom, valueOrMutate),
369
+ invalidate: (atom) => this.invalidate(atom),
370
+ invalidateMany: (atoms) => this.invalidateMany(atoms),
371
+ subscribe: (atom, listener) => this.subscribe(atom, () => {
372
+ listener(this.getSnapshot(atom));
373
+ })
387
374
  };
388
375
  return this.#client;
389
376
  }
@@ -401,4 +388,4 @@ function extractPreviousValue(state) {
401
388
  //#endregion
402
389
  export { CONFIG as i, atomFamily as n, atom as r, createStore as t };
403
390
 
404
- //# sourceMappingURL=store-CmRXgcwh.mjs.map
391
+ //# sourceMappingURL=store-CNjvdLHG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-CNjvdLHG.mjs","names":["#atoms","#rdeps","#pending","#controllers","#familyUnsubs","#registeredFamilies","#getOrCreate","#runGet","#registerRdeps","#makeCtx","#scheduleNotify","#markStale","#flushPending","#autoRegisterFamily","#markReverseDependentsStale","#client"],"sources":["../src/internal/types.ts","../src/internal/atom.ts","../src/internal/family.ts","../src/internal/store.ts"],"sourcesContent":["export const CONFIG = Symbol(\"kvark.config\");\nexport const WRITABLE = Symbol(\"kvark.writable\");\nexport const FAMILY_LINK = Symbol(\"kvark.familyLink\");\n\nexport type AtomState<Value> =\n | { status: \"pending\"; value: undefined; error: undefined }\n | { status: \"stale\"; value: Value; error: undefined }\n | { status: \"fresh\"; value: Value; error: undefined }\n | { status: \"error\"; value: Value | undefined; error: unknown };\n\nexport type StalePolicy = \"keep\" | \"suspend\" | \"reset\";\n\nexport type AtomContext<Deps extends Record<string, Atom<unknown>>> = {\n get: <K extends keyof Deps>(key: K) => Promise<AtomValue<Deps[K]>>;\n signal: AbortSignal;\n};\n\nexport interface WritableAtomContext<\n Deps extends Record<string, Atom<unknown>>,\n Value,\n> extends AtomContext<Deps> {\n setOptimisticValue(value: Value): void;\n setOptimisticValue(mutate: (prev: Value | undefined) => Value): void;\n}\n\nexport type AtomConfig<\n Value,\n Deps extends Record<string, Atom<unknown>>,\n Args extends readonly unknown[],\n> = {\n dependencies?: Deps;\n stalePolicy?: StalePolicy;\n debugLabel?: string;\n get: (ctx: AtomContext<Deps>) => Promise<Value>;\n set?: (ctx: WritableAtomContext<Deps, Value>, ...args: Args) => Promise<void>;\n onMount?: (set: (value: Value) => void) => (() => void) | void;\n};\n\nexport interface InternalAtomConfig<Value> {\n dependencies?: Record<string, Atom<unknown>>;\n stalePolicy?: StalePolicy;\n debugLabel?: string;\n get: (ctx: AtomContext<Record<string, Atom<unknown>>>) => Promise<Value>;\n set?: (\n ctx: WritableAtomContext<Record<string, Atom<unknown>>, any>,\n ...args: readonly unknown[]\n ) => Promise<void>;\n onMount?: (set: (value: unknown) => void) => (() => void) | void;\n}\n\nexport interface Atom<out Value> {\n readonly [CONFIG]: InternalAtomConfig<Value>;\n readonly debugLabel: string | undefined;\n}\n\nexport interface WritableAtom<\n out Value,\n in out Args extends readonly unknown[],\n> extends Atom<Value> {\n readonly [WRITABLE]: Args;\n}\n\nexport type AtomValue<A> = A extends Atom<infer V> ? V : never;\nexport type IsWritable<A> = A extends WritableAtom<unknown, readonly unknown[]> ? true : false;\nexport type AtomArgs<A> = A extends WritableAtom<unknown, infer Args> ? Args : never;\n","import type {\n Atom,\n AtomConfig,\n InternalAtomConfig,\n WritableAtom,\n WritableAtomContext,\n} from \"@/internal/types.js\";\nimport { CONFIG, WRITABLE } from \"@/internal/types.js\";\n\ntype WritableConfig<\n Value,\n Deps extends Record<string, Atom<unknown>>,\n Args extends readonly unknown[],\n> = AtomConfig<Value, Deps, Args> & {\n set: (ctx: WritableAtomContext<Deps, Value>, ...args: Args) => Promise<void>;\n};\n\ntype ReadonlyConfig<Value, Deps extends Record<string, Atom<unknown>>> = Omit<\n AtomConfig<Value, Deps, readonly []>,\n \"set\"\n>;\n\nexport function atom<\n Value,\n Deps extends Record<string, Atom<unknown>> = Record<never, never>,\n Args extends readonly unknown[] = readonly [],\n>(config: WritableConfig<Value, Deps, Args>): WritableAtom<Value, Args>;\n\nexport function atom<Value, Deps extends Record<string, Atom<unknown>> = Record<never, never>>(\n config: ReadonlyConfig<Value, Deps>,\n): Atom<Value>;\n\nexport function atom<\n Value,\n Deps extends Record<string, Atom<unknown>> = Record<never, never>,\n Args extends readonly unknown[] = readonly [],\n>(config: AtomConfig<Value, Deps, Args>): Atom<Value> {\n const internal: InternalAtomConfig<Value> = Object.create(null) as InternalAtomConfig<Value>;\n internal.get = config.get as InternalAtomConfig<Value>[\"get\"];\n\n if (config.debugLabel != null) {\n internal.debugLabel = config.debugLabel;\n }\n if (config.dependencies != null) {\n internal.dependencies = config.dependencies as Record<string, Atom<unknown>>;\n }\n if (config.stalePolicy != null) {\n internal.stalePolicy = config.stalePolicy;\n }\n if (config.set != null) {\n internal.set = config.set as NonNullable<InternalAtomConfig<Value>[\"set\"]>;\n }\n if (config.onMount != null) {\n internal.onMount = config.onMount as NonNullable<InternalAtomConfig<Value>[\"onMount\"]>;\n }\n\n if (config.set != null) {\n return {\n [CONFIG]: internal,\n [WRITABLE]: [] as unknown as Args,\n debugLabel: config.debugLabel,\n } as unknown as Atom<Value>;\n }\n\n return {\n [CONFIG]: internal,\n debugLabel: config.debugLabel,\n } as Atom<Value>;\n}\n","import type { Atom, AtomContext, StalePolicy } from \"@/internal/types.js\";\nimport { FAMILY_LINK } from \"@/internal/types.js\";\nimport { atom } from \"@/internal/atom.js\";\n\nexport type AtomFamilyOptions<\n Param,\n Value,\n Deps extends Record<string, Atom<unknown>>,\n Args extends readonly unknown[],\n> = {\n dependencies?: (param: Param) => Deps;\n stalePolicy?: StalePolicy;\n cachePolicy?: \"keep-all\" | \"lru\";\n lruSize?: number;\n debugLabel?: string;\n get: (param: Param) => (ctx: AtomContext<Deps>) => Promise<Value>;\n set?: (param: Param) => (ctx: AtomContext<Deps>, ...args: Args) => Promise<void>;\n};\n\nexport interface AtomFamily<Param, Value> {\n (param: Param): Atom<Value>;\n invalidate(param: Param): void;\n invalidateAll(): void;\n remove(param: Param): void;\n getCache(): ReadonlyMap<Param, Atom<Value>>;\n}\n\nexport interface FamilyLink {\n invalidateAtom: (atom: Atom<unknown>) => void;\n registerStore: (cb: (atom: Atom<unknown>) => void) => () => void;\n}\n\nexport function getFamilyLink(target: Atom<unknown>): FamilyLink | undefined {\n return (target as unknown as Record<symbol, FamilyLink | undefined>)[FAMILY_LINK];\n}\n\nexport function atomFamily<\n Param,\n Value,\n Deps extends Record<string, Atom<unknown>> = Record<never, never>,\n Args extends readonly unknown[] = readonly [],\n>(options: AtomFamilyOptions<Param, Value, Deps, Args>): AtomFamily<Param, Value> {\n const cachePolicy = options.cachePolicy ?? \"keep-all\";\n const lruSize = options.lruSize ?? 100;\n const cache = new Map<Param, Atom<Value>>();\n const lruOrder: Param[] = [];\n const storeCallbacks = new Set<(atom: Atom<unknown>) => void>();\n\n const link: FamilyLink = {\n invalidateAtom(target: Atom<unknown>): void {\n for (const cb of storeCallbacks) {\n cb(target);\n }\n },\n registerStore(cb: (atom: Atom<unknown>) => void): () => void {\n storeCallbacks.add(cb);\n return () => {\n storeCallbacks.delete(cb);\n };\n },\n };\n\n function attachLink(target: Atom<Value>): void {\n (target as unknown as Record<symbol, FamilyLink>)[FAMILY_LINK] = link;\n }\n\n function getOrCreate(param: Param): Atom<Value> {\n const cached = cache.get(param);\n if (cached != null) {\n if (cachePolicy === \"lru\") {\n touchLru(param);\n }\n return cached;\n }\n\n const deps = options.dependencies?.(param);\n const getFn = options.get(param);\n const setFn = options.set?.(param);\n\n const label =\n options.debugLabel != null ? `${options.debugLabel}(${String(param)})` : undefined;\n\n const created = createAtom(label, deps, getFn, setFn);\n attachLink(created);\n cache.set(param, created);\n\n if (cachePolicy === \"lru\") {\n lruOrder.push(param);\n evictLru();\n }\n\n return created;\n }\n\n function createAtom(\n label: string | undefined,\n deps: Deps | undefined,\n getFn: (ctx: AtomContext<Deps>) => Promise<Value>,\n setFn: ((ctx: AtomContext<Deps>, ...args: Args) => Promise<void>) | undefined,\n ): Atom<Value> {\n const base = {\n get: getFn as (ctx: AtomContext<Deps>) => Promise<Value>,\n } as {\n debugLabel?: string;\n dependencies?: Deps;\n stalePolicy?: StalePolicy;\n get: (ctx: AtomContext<Deps>) => Promise<Value>;\n set?: (ctx: AtomContext<Deps>, ...args: Args) => Promise<void>;\n };\n\n if (label != null) {\n base.debugLabel = label;\n }\n if (deps != null) {\n base.dependencies = deps;\n }\n if (options.stalePolicy != null) {\n base.stalePolicy = options.stalePolicy;\n }\n\n if (setFn != null) {\n base.set = setFn;\n return atom(\n base as typeof base & {\n set: (ctx: AtomContext<Deps>, ...args: Args) => Promise<void>;\n },\n ) as Atom<Value>;\n }\n\n return atom(base as Omit<typeof base, \"set\">);\n }\n\n function touchLru(param: Param): void {\n const idx = lruOrder.indexOf(param);\n if (idx !== -1) {\n lruOrder.splice(idx, 1);\n }\n lruOrder.push(param);\n }\n\n function evictLru(): void {\n while (lruOrder.length > lruSize) {\n const evicted = lruOrder.shift();\n if (evicted !== undefined) {\n cache.delete(evicted);\n }\n }\n }\n\n const family = getOrCreate as AtomFamily<Param, Value>;\n\n family.invalidate = (param: Param): void => {\n const cached = cache.get(param);\n if (cached != null) {\n link.invalidateAtom(cached);\n }\n };\n\n family.invalidateAll = (): void => {\n for (const cached of cache.values()) {\n link.invalidateAtom(cached);\n }\n };\n\n family.remove = (param: Param): void => {\n cache.delete(param);\n if (cachePolicy === \"lru\") {\n const idx = lruOrder.indexOf(param);\n if (idx !== -1) {\n lruOrder.splice(idx, 1);\n }\n }\n };\n\n family.getCache = (): ReadonlyMap<Param, Atom<Value>> => cache;\n\n return family;\n}\n","import type {\n Atom,\n AtomContext,\n AtomState,\n InternalAtomConfig,\n StalePolicy,\n WritableAtom,\n WritableAtomContext,\n} from \"@/internal/types.js\";\nimport { CONFIG } from \"@/internal/types.js\";\nimport { getFamilyLink } from \"@/internal/family.js\";\n\ntype AtomEntry<V> = {\n state: AtomState<V>;\n version: number;\n promise: Promise<V> | null;\n listeners: Set<() => void>;\n mountCount: number;\n unmount: (() => void) | null;\n};\n\nexport interface StoreClient {\n get<V>(atom: Atom<V>): Promise<V>;\n set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void>;\n write<V>(atom: Atom<V>, value: V): void;\n write<V>(atom: Atom<V>, mutate: (prev: V | undefined) => V): void;\n invalidate(atom: Atom<unknown>): void;\n invalidateMany(atoms: ReadonlyArray<Atom<unknown>>): void;\n subscribe<V>(atom: Atom<V>, listener: (state: AtomState<V>) => void): () => void;\n}\n\nconst PENDING_STATE: AtomState<never> = {\n status: \"pending\",\n value: undefined,\n error: undefined,\n} as AtomState<never>;\n\nexport class Store {\n readonly #atoms = new WeakMap<Atom<unknown>, AtomEntry<unknown>>();\n readonly #rdeps = new Map<Atom<unknown>, Set<Atom<unknown>>>();\n readonly #pending = new Set<Atom<unknown>>();\n readonly #controllers = new WeakMap<Atom<unknown>, AbortController>();\n readonly #familyUnsubs = new Set<() => void>();\n readonly #registeredFamilies = new WeakSet<object>();\n #client: StoreClient | null = null;\n\n #getOrCreate<V>(atom: Atom<V>): AtomEntry<V> {\n let entry = this.#atoms.get(atom) as AtomEntry<V> | undefined;\n if (entry == null) {\n entry = {\n state: PENDING_STATE as AtomState<V>,\n version: 0,\n promise: null,\n listeners: new Set(),\n mountCount: 0,\n unmount: null,\n };\n this.#atoms.set(atom, entry as AtomEntry<unknown>);\n }\n return entry;\n }\n\n resolve<V>(atom: Atom<V>): Promise<V> {\n const entry = this.#getOrCreate(atom);\n if (entry.promise != null) {\n return entry.promise;\n }\n\n const promise = this.#runGet(atom).finally(() => {\n const e = this.#atoms.get(atom) as AtomEntry<V> | undefined;\n if (e != null) {\n e.promise = null;\n }\n });\n entry.promise = promise;\n return promise;\n }\n\n async #runGet<V>(atom: Atom<V>): Promise<V> {\n const config: InternalAtomConfig<V> = atom[CONFIG];\n const dependencies = config.dependencies;\n const stalePolicy: StalePolicy = config.stalePolicy ?? \"keep\";\n const entry = this.#getOrCreate(atom);\n\n if (dependencies != null) {\n await Promise.all(Object.values(dependencies).map((dep) => this.resolve(dep)));\n this.#registerRdeps(atom, dependencies);\n }\n\n const ctx = this.#makeCtx(atom, dependencies ?? {});\n\n try {\n const value = await config.get(ctx);\n if (ctx.signal.aborted) {\n throw new DOMException(\"The operation was aborted\", \"AbortError\");\n }\n entry.state = { status: \"fresh\", value, error: undefined };\n entry.version++;\n this.#scheduleNotify(atom);\n return value;\n } catch (e: unknown) {\n if (isAbortError(e)) {\n throw e;\n }\n const prevValue = extractPreviousValue<V>(entry.state);\n entry.state = {\n status: \"error\",\n value: stalePolicy === \"keep\" ? prevValue : undefined,\n error: e,\n } as AtomState<V>;\n entry.version++;\n this.#scheduleNotify(atom);\n throw e;\n }\n }\n\n invalidate(atom: Atom<unknown>): void {\n this.#markStale(atom);\n this.#pending.add(atom);\n if (this.#pending.size === 1) {\n queueMicrotask(() => {\n this.#flushPending();\n });\n }\n }\n\n invalidateMany(atoms: ReadonlyArray<Atom<unknown>>): void {\n for (const a of atoms) {\n this.#markStale(a);\n this.#pending.add(a);\n }\n if (this.#pending.size > 0) {\n queueMicrotask(() => {\n this.#flushPending();\n });\n }\n }\n\n #markStale(atom: Atom<unknown>, visited = new Set<Atom<unknown>>()): void {\n if (visited.has(atom)) {\n return;\n }\n visited.add(atom);\n\n const entry = this.#atoms.get(atom);\n if (entry != null) {\n const stalePolicy: StalePolicy = atom[CONFIG].stalePolicy ?? \"keep\";\n\n if (entry.state.status === \"fresh\") {\n if (stalePolicy === \"reset\") {\n entry.state = PENDING_STATE;\n } else {\n entry.state = { ...entry.state, status: \"stale\" };\n }\n }\n\n entry.promise = null;\n this.#controllers.get(atom)?.abort();\n }\n\n const rdeps = this.#rdeps.get(atom);\n if (rdeps != null) {\n for (const dep of rdeps) {\n this.#markStale(dep, visited);\n }\n }\n }\n\n #markReverseDependentsStale(atom: Atom<unknown>): void {\n const rdeps = this.#rdeps.get(atom);\n if (rdeps != null) {\n const visited = new Set<Atom<unknown>>([atom]);\n for (const dep of rdeps) {\n this.#markStale(dep, visited);\n this.#pending.add(dep);\n }\n }\n }\n\n #flushPending(): void {\n const batch = [...this.#pending];\n this.#pending.clear();\n const toNotify = new Set<() => void>();\n for (const a of batch) {\n const entry = this.#atoms.get(a);\n if (entry != null) {\n for (const l of entry.listeners) {\n toNotify.add(l);\n }\n }\n }\n for (const l of toNotify) {\n l();\n }\n }\n\n #scheduleNotify(atom: Atom<unknown>): void {\n this.#pending.add(atom);\n if (this.#pending.size === 1) {\n queueMicrotask(() => {\n this.#flushPending();\n });\n }\n }\n\n #registerRdeps(atom: Atom<unknown>, deps: Record<string, Atom<unknown>>): void {\n for (const dep of Object.values(deps)) {\n let set = this.#rdeps.get(dep);\n if (set == null) {\n set = new Set();\n this.#rdeps.set(dep, set);\n }\n set.add(atom);\n }\n }\n\n #makeCtx(\n atom: Atom<unknown>,\n deps: Record<string, Atom<unknown>>,\n ): AtomContext<Record<string, Atom<unknown>>> {\n this.#controllers.get(atom)?.abort();\n const controller = new AbortController();\n this.#controllers.set(atom, controller);\n\n return {\n signal: controller.signal,\n get: async (key: string) => {\n const dep = deps[key];\n if (dep == null) {\n throw new Error(`Unknown dependency key: \"${String(key)}\"`);\n }\n return this.resolve(dep);\n },\n };\n }\n\n subscribe<V>(atom: Atom<V>, listener: () => void): () => void {\n const entry = this.#getOrCreate(atom);\n entry.listeners.add(listener);\n\n this.#autoRegisterFamily(atom);\n\n if (entry.state.status === \"pending\" && entry.promise == null) {\n void this.resolve(atom);\n }\n\n entry.mountCount++;\n if (entry.mountCount === 1) {\n const config: InternalAtomConfig<V> = atom[CONFIG];\n if (config.onMount != null) {\n const setValue = (value: V): void => {\n entry.state = { status: \"fresh\", value, error: undefined };\n entry.version++;\n this.#scheduleNotify(atom);\n };\n const cleanup = config.onMount(setValue as (value: unknown) => void);\n if (typeof cleanup === \"function\") {\n entry.unmount = cleanup;\n }\n }\n }\n\n return () => {\n entry.listeners.delete(listener);\n entry.mountCount--;\n if (entry.mountCount === 0 && entry.unmount != null) {\n entry.unmount();\n entry.unmount = null;\n }\n };\n }\n\n #autoRegisterFamily(atom: Atom<unknown>): void {\n const link = getFamilyLink(atom);\n if (link == null) {\n return;\n }\n if (this.#registeredFamilies.has(link)) {\n return;\n }\n this.#registeredFamilies.add(link);\n const unsub = link.registerStore((target: Atom<unknown>) => {\n this.invalidate(target);\n });\n this.#familyUnsubs.add(unsub);\n }\n\n getSnapshot<V>(atom: Atom<V>): AtomState<V> {\n return this.#getOrCreate(atom).state;\n }\n\n getServerSnapshot<V>(atom: Atom<V>): AtomState<V> {\n const entry = this.#atoms.get(atom) as AtomEntry<V> | undefined;\n if (entry != null) {\n return entry.state;\n }\n return PENDING_STATE as AtomState<V>;\n }\n\n async set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void> {\n const config: InternalAtomConfig<V> = atom[CONFIG];\n if (config.set == null) {\n throw new Error(\n `Atom${atom.debugLabel != null ? ` \"${atom.debugLabel}\"` : \"\"} is not writable`,\n );\n }\n\n const deps = config.dependencies ?? {};\n const baseCtx = this.#makeCtx(atom, deps);\n const entry = this.#getOrCreate(atom);\n\n // Ref: assignments inside setOptimisticValue are not tracked on a plain `let` for catch narrowing.\n const optimisticSnapshot: {\n current: { state: AtomState<V>; version: number } | null;\n } = { current: null };\n\n const ctx: WritableAtomContext<Record<string, Atom<unknown>>, V> = {\n ...baseCtx,\n setOptimisticValue: (valueOrMutate: V | ((prev: V | undefined) => V)): void => {\n if (optimisticSnapshot.current == null) {\n optimisticSnapshot.current = { state: entry.state, version: entry.version };\n }\n const next =\n typeof valueOrMutate === \"function\"\n ? (valueOrMutate as (prev: V | undefined) => V)(extractPreviousValue(entry.state))\n : valueOrMutate;\n entry.state = { status: \"fresh\", value: next, error: undefined };\n entry.version++;\n this.#scheduleNotify(atom);\n this.#markReverseDependentsStale(atom);\n },\n };\n\n try {\n await config.set(ctx, ...args);\n } catch (e: unknown) {\n const snap = optimisticSnapshot.current;\n if (snap != null) {\n entry.state = snap.state;\n entry.version = snap.version;\n this.#scheduleNotify(atom);\n }\n throw e;\n }\n\n this.invalidate(atom);\n }\n\n write<V>(atom: Atom<V>, value: V): void;\n write<V>(atom: Atom<V>, mutate: (prev: V | undefined) => V): void;\n write<V>(atom: Atom<V>, valueOrMutate: V | ((prev: V | undefined) => V)): void {\n const entry = this.#getOrCreate(atom);\n this.#controllers.get(atom)?.abort();\n entry.promise = null;\n const next =\n typeof valueOrMutate === \"function\"\n ? (valueOrMutate as (prev: V | undefined) => V)(extractPreviousValue(entry.state))\n : valueOrMutate;\n entry.state = { status: \"fresh\", value: next, error: undefined };\n entry.version++;\n this.#scheduleNotify(atom);\n this.#markReverseDependentsStale(atom);\n }\n\n getClient(): StoreClient {\n if (this.#client != null) {\n return this.#client;\n }\n\n this.#client = {\n get: <V>(atom: Atom<V>): Promise<V> => this.resolve(atom),\n set: <V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void> =>\n this.set(atom, ...args),\n write: <V>(atom: Atom<V>, valueOrMutate: V | ((prev: V | undefined) => V)): void =>\n this.write(atom, valueOrMutate as V),\n invalidate: (atom: Atom<unknown>): void => this.invalidate(atom),\n invalidateMany: (atoms: ReadonlyArray<Atom<unknown>>): void => this.invalidateMany(atoms),\n subscribe: <V>(atom: Atom<V>, listener: (state: AtomState<V>) => void): (() => void) =>\n this.subscribe(atom, () => {\n listener(this.getSnapshot(atom));\n }),\n };\n return this.#client;\n }\n}\n\nexport function createStore(): Store {\n return new Store();\n}\n\nfunction isAbortError(e: unknown): boolean {\n return e instanceof DOMException && e.name === \"AbortError\";\n}\n\nfunction extractPreviousValue<V>(state: AtomState<V>): V | undefined {\n if (state.status === \"stale\" || state.status === \"fresh\") {\n return state.value;\n }\n if (state.status === \"error\") {\n return state.value;\n }\n return undefined;\n}\n"],"mappings":"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"}
@@ -23,9 +23,10 @@ type AtomContext<Deps extends Record<string, Atom<unknown>>> = {
23
23
  get: <K extends keyof Deps>(key: K) => Promise<AtomValue<Deps[K]>>;
24
24
  signal: AbortSignal;
25
25
  };
26
- type WritableAtomContext<Deps extends Record<string, Atom<unknown>>, Value> = AtomContext<Deps> & {
27
- setOptimisticValue: (value: Value) => void;
28
- };
26
+ interface WritableAtomContext<Deps extends Record<string, Atom<unknown>>, Value> extends AtomContext<Deps> {
27
+ setOptimisticValue(value: Value): void;
28
+ setOptimisticValue(mutate: (prev: Value | undefined) => Value): void;
29
+ }
29
30
  type AtomConfig<Value, Deps extends Record<string, Atom<unknown>>, Args extends readonly unknown[]> = {
30
31
  dependencies?: Deps;
31
32
  stalePolicy?: StalePolicy;
@@ -39,7 +40,7 @@ interface InternalAtomConfig<Value> {
39
40
  stalePolicy?: StalePolicy;
40
41
  debugLabel?: string;
41
42
  get: (ctx: AtomContext<Record<string, Atom<unknown>>>) => Promise<Value>;
42
- set?: (ctx: WritableAtomContext<Record<string, Atom<unknown>>, Value>, ...args: readonly unknown[]) => Promise<void>;
43
+ set?: (ctx: WritableAtomContext<Record<string, Atom<unknown>>, any>, ...args: readonly unknown[]) => Promise<void>;
43
44
  onMount?: (set: (value: unknown) => void) => (() => void) | void;
44
45
  }
45
46
  interface Atom<out Value> {
@@ -58,6 +59,7 @@ interface StoreClient {
58
59
  get<V>(atom: Atom<V>): Promise<V>;
59
60
  set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void>;
60
61
  write<V>(atom: Atom<V>, value: V): void;
62
+ write<V>(atom: Atom<V>, mutate: (prev: V | undefined) => V): void;
61
63
  invalidate(atom: Atom<unknown>): void;
62
64
  invalidateMany(atoms: ReadonlyArray<Atom<unknown>>): void;
63
65
  subscribe<V>(atom: Atom<V>, listener: (state: AtomState<V>) => void): () => void;
@@ -72,9 +74,10 @@ declare class Store {
72
74
  getServerSnapshot<V>(atom: Atom<V>): AtomState<V>;
73
75
  set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void>;
74
76
  write<V>(atom: Atom<V>, value: V): void;
77
+ write<V>(atom: Atom<V>, mutate: (prev: V | undefined) => V): void;
75
78
  getClient(): StoreClient;
76
79
  }
77
80
  declare function createStore(): Store;
78
81
  //#endregion
79
82
  export { AtomArgs as a, AtomState as c, StalePolicy as d, WritableAtom as f, Atom as i, AtomValue as l, StoreClient as n, AtomConfig as o, WritableAtomContext as p, createStore as r, AtomContext as s, Store as t, IsWritable as u };
80
- //# sourceMappingURL=store-BbmNU3xn.d.mts.map
83
+ //# sourceMappingURL=store-DQL8VJhU.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-DQL8VJhU.d.mts","names":[],"sources":["../src/internal/types.ts","../src/internal/store.ts"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kdeveloper/kvark",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Atomic state management with explicit dependency graphs",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -1 +0,0 @@
1
- {"version":3,"file":"store-BbmNU3xn.d.mts","names":[],"sources":["../src/internal/types.ts","../src/internal/store.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"store-CmRXgcwh.mjs","names":["#atoms","#rdeps","#pending","#controllers","#familyUnsubs","#registeredFamilies","#getOrCreate","#runGet","#registerRdeps","#makeCtx","#scheduleNotify","#markStale","#flushPending","#autoRegisterFamily","#markReverseDependentsStale","#client"],"sources":["../src/internal/types.ts","../src/internal/atom.ts","../src/internal/family.ts","../src/internal/store.ts"],"sourcesContent":["export const CONFIG = Symbol(\"kvark.config\");\nexport const WRITABLE = Symbol(\"kvark.writable\");\nexport const FAMILY_LINK = Symbol(\"kvark.familyLink\");\n\nexport type AtomState<Value> =\n | { status: \"pending\"; value: undefined; error: undefined }\n | { status: \"stale\"; value: Value; error: undefined }\n | { status: \"fresh\"; value: Value; error: undefined }\n | { status: \"error\"; value: Value | undefined; error: unknown };\n\nexport type StalePolicy = \"keep\" | \"suspend\" | \"reset\";\n\nexport type AtomContext<Deps extends Record<string, Atom<unknown>>> = {\n get: <K extends keyof Deps>(key: K) => Promise<AtomValue<Deps[K]>>;\n signal: AbortSignal;\n};\n\nexport type WritableAtomContext<\n Deps extends Record<string, Atom<unknown>>,\n Value,\n> = AtomContext<Deps> & {\n setOptimisticValue: (value: Value) => void;\n};\n\nexport type AtomConfig<\n Value,\n Deps extends Record<string, Atom<unknown>>,\n Args extends readonly unknown[],\n> = {\n dependencies?: Deps;\n stalePolicy?: StalePolicy;\n debugLabel?: string;\n get: (ctx: AtomContext<Deps>) => Promise<Value>;\n set?: (ctx: WritableAtomContext<Deps, Value>, ...args: Args) => Promise<void>;\n onMount?: (set: (value: Value) => void) => (() => void) | void;\n};\n\nexport interface InternalAtomConfig<Value> {\n dependencies?: Record<string, Atom<unknown>>;\n stalePolicy?: StalePolicy;\n debugLabel?: string;\n get: (ctx: AtomContext<Record<string, Atom<unknown>>>) => Promise<Value>;\n set?: (\n ctx: WritableAtomContext<Record<string, Atom<unknown>>, Value>,\n ...args: readonly unknown[]\n ) => Promise<void>;\n onMount?: (set: (value: unknown) => void) => (() => void) | void;\n}\n\nexport interface Atom<out Value> {\n readonly [CONFIG]: InternalAtomConfig<Value>;\n readonly debugLabel: string | undefined;\n}\n\nexport interface WritableAtom<\n out Value,\n in out Args extends readonly unknown[],\n> extends Atom<Value> {\n readonly [WRITABLE]: Args;\n}\n\nexport type AtomValue<A> = A extends Atom<infer V> ? V : never;\nexport type IsWritable<A> = A extends WritableAtom<unknown, readonly unknown[]> ? true : false;\nexport type AtomArgs<A> = A extends WritableAtom<unknown, infer Args> ? Args : never;\n","import type {\n Atom,\n AtomConfig,\n InternalAtomConfig,\n WritableAtom,\n WritableAtomContext,\n} from \"./types.js\";\nimport { CONFIG, WRITABLE } from \"./types.js\";\n\ntype WritableConfig<\n Value,\n Deps extends Record<string, Atom<unknown>>,\n Args extends readonly unknown[],\n> = AtomConfig<Value, Deps, Args> & {\n set: (ctx: WritableAtomContext<Deps, Value>, ...args: Args) => Promise<void>;\n};\n\ntype ReadonlyConfig<Value, Deps extends Record<string, Atom<unknown>>> = Omit<\n AtomConfig<Value, Deps, readonly []>,\n \"set\"\n>;\n\nexport function atom<\n Value,\n Deps extends Record<string, Atom<unknown>> = Record<never, never>,\n Args extends readonly unknown[] = readonly [],\n>(config: WritableConfig<Value, Deps, Args>): WritableAtom<Value, Args>;\n\nexport function atom<Value, Deps extends Record<string, Atom<unknown>> = Record<never, never>>(\n config: ReadonlyConfig<Value, Deps>,\n): Atom<Value>;\n\nexport function atom<\n Value,\n Deps extends Record<string, Atom<unknown>> = Record<never, never>,\n Args extends readonly unknown[] = readonly [],\n>(config: AtomConfig<Value, Deps, Args>): Atom<Value> {\n const internal: InternalAtomConfig<Value> = Object.create(null) as InternalAtomConfig<Value>;\n internal.get = config.get as InternalAtomConfig<Value>[\"get\"];\n\n if (config.debugLabel != null) {\n internal.debugLabel = config.debugLabel;\n }\n if (config.dependencies != null) {\n internal.dependencies = config.dependencies as Record<string, Atom<unknown>>;\n }\n if (config.stalePolicy != null) {\n internal.stalePolicy = config.stalePolicy;\n }\n if (config.set != null) {\n internal.set = config.set as NonNullable<InternalAtomConfig<Value>[\"set\"]>;\n }\n if (config.onMount != null) {\n internal.onMount = config.onMount as NonNullable<InternalAtomConfig<Value>[\"onMount\"]>;\n }\n\n if (config.set != null) {\n return {\n [CONFIG]: internal,\n [WRITABLE]: [] as unknown as Args,\n debugLabel: config.debugLabel,\n } as unknown as Atom<Value>;\n }\n\n return {\n [CONFIG]: internal,\n debugLabel: config.debugLabel,\n } as Atom<Value>;\n}\n","import type { Atom, AtomContext, StalePolicy } from \"./types.js\";\nimport { FAMILY_LINK } from \"./types.js\";\nimport { atom } from \"./atom.js\";\n\nexport type AtomFamilyOptions<\n Param,\n Value,\n Deps extends Record<string, Atom<unknown>>,\n Args extends readonly unknown[],\n> = {\n dependencies?: (param: Param) => Deps;\n stalePolicy?: StalePolicy;\n cachePolicy?: \"keep-all\" | \"lru\";\n lruSize?: number;\n debugLabel?: string;\n get: (param: Param) => (ctx: AtomContext<Deps>) => Promise<Value>;\n set?: (param: Param) => (ctx: AtomContext<Deps>, ...args: Args) => Promise<void>;\n};\n\nexport interface AtomFamily<Param, Value> {\n (param: Param): Atom<Value>;\n invalidate(param: Param): void;\n invalidateAll(): void;\n remove(param: Param): void;\n getCache(): ReadonlyMap<Param, Atom<Value>>;\n}\n\nexport interface FamilyLink {\n invalidateAtom: (atom: Atom<unknown>) => void;\n registerStore: (cb: (atom: Atom<unknown>) => void) => () => void;\n}\n\nexport function getFamilyLink(target: Atom<unknown>): FamilyLink | undefined {\n return (target as unknown as Record<symbol, FamilyLink | undefined>)[FAMILY_LINK];\n}\n\nexport function atomFamily<\n Param,\n Value,\n Deps extends Record<string, Atom<unknown>> = Record<never, never>,\n Args extends readonly unknown[] = readonly [],\n>(options: AtomFamilyOptions<Param, Value, Deps, Args>): AtomFamily<Param, Value> {\n const cachePolicy = options.cachePolicy ?? \"keep-all\";\n const lruSize = options.lruSize ?? 100;\n const cache = new Map<Param, Atom<Value>>();\n const lruOrder: Param[] = [];\n const storeCallbacks = new Set<(atom: Atom<unknown>) => void>();\n\n const link: FamilyLink = {\n invalidateAtom(target: Atom<unknown>): void {\n for (const cb of storeCallbacks) {\n cb(target);\n }\n },\n registerStore(cb: (atom: Atom<unknown>) => void): () => void {\n storeCallbacks.add(cb);\n return () => {\n storeCallbacks.delete(cb);\n };\n },\n };\n\n function attachLink(target: Atom<Value>): void {\n (target as unknown as Record<symbol, FamilyLink>)[FAMILY_LINK] = link;\n }\n\n function getOrCreate(param: Param): Atom<Value> {\n const cached = cache.get(param);\n if (cached != null) {\n if (cachePolicy === \"lru\") {\n touchLru(param);\n }\n return cached;\n }\n\n const deps = options.dependencies?.(param);\n const getFn = options.get(param);\n const setFn = options.set?.(param);\n\n const label =\n options.debugLabel != null ? `${options.debugLabel}(${String(param)})` : undefined;\n\n const created = createAtom(label, deps, getFn, setFn);\n attachLink(created);\n cache.set(param, created);\n\n if (cachePolicy === \"lru\") {\n lruOrder.push(param);\n evictLru();\n }\n\n return created;\n }\n\n function createAtom(\n label: string | undefined,\n deps: Deps | undefined,\n getFn: (ctx: AtomContext<Deps>) => Promise<Value>,\n setFn: ((ctx: AtomContext<Deps>, ...args: Args) => Promise<void>) | undefined,\n ): Atom<Value> {\n const base = {\n get: getFn as (ctx: AtomContext<Deps>) => Promise<Value>,\n } as {\n debugLabel?: string;\n dependencies?: Deps;\n stalePolicy?: StalePolicy;\n get: (ctx: AtomContext<Deps>) => Promise<Value>;\n set?: (ctx: AtomContext<Deps>, ...args: Args) => Promise<void>;\n };\n\n if (label != null) {\n base.debugLabel = label;\n }\n if (deps != null) {\n base.dependencies = deps;\n }\n if (options.stalePolicy != null) {\n base.stalePolicy = options.stalePolicy;\n }\n\n if (setFn != null) {\n base.set = setFn;\n return atom(\n base as typeof base & {\n set: (ctx: AtomContext<Deps>, ...args: Args) => Promise<void>;\n },\n ) as Atom<Value>;\n }\n\n return atom(base as Omit<typeof base, \"set\">);\n }\n\n function touchLru(param: Param): void {\n const idx = lruOrder.indexOf(param);\n if (idx !== -1) {\n lruOrder.splice(idx, 1);\n }\n lruOrder.push(param);\n }\n\n function evictLru(): void {\n while (lruOrder.length > lruSize) {\n const evicted = lruOrder.shift();\n if (evicted !== undefined) {\n cache.delete(evicted);\n }\n }\n }\n\n const family = getOrCreate as AtomFamily<Param, Value>;\n\n family.invalidate = (param: Param): void => {\n const cached = cache.get(param);\n if (cached != null) {\n link.invalidateAtom(cached);\n }\n };\n\n family.invalidateAll = (): void => {\n for (const cached of cache.values()) {\n link.invalidateAtom(cached);\n }\n };\n\n family.remove = (param: Param): void => {\n cache.delete(param);\n if (cachePolicy === \"lru\") {\n const idx = lruOrder.indexOf(param);\n if (idx !== -1) {\n lruOrder.splice(idx, 1);\n }\n }\n };\n\n family.getCache = (): ReadonlyMap<Param, Atom<Value>> => cache;\n\n return family;\n}\n","import type {\n Atom,\n AtomContext,\n AtomState,\n InternalAtomConfig,\n StalePolicy,\n WritableAtom,\n WritableAtomContext,\n} from \"./types.js\";\nimport { CONFIG } from \"./types.js\";\nimport { getFamilyLink } from \"./family.js\";\n\ntype AtomEntry<V> = {\n state: AtomState<V>;\n version: number;\n promise: Promise<V> | null;\n listeners: Set<() => void>;\n mountCount: number;\n unmount: (() => void) | null;\n};\n\nexport interface StoreClient {\n get<V>(atom: Atom<V>): Promise<V>;\n set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void>;\n write<V>(atom: Atom<V>, value: V): void;\n invalidate(atom: Atom<unknown>): void;\n invalidateMany(atoms: ReadonlyArray<Atom<unknown>>): void;\n subscribe<V>(atom: Atom<V>, listener: (state: AtomState<V>) => void): () => void;\n}\n\nconst PENDING_STATE: AtomState<never> = {\n status: \"pending\",\n value: undefined,\n error: undefined,\n} as AtomState<never>;\n\nexport class Store {\n readonly #atoms = new WeakMap<Atom<unknown>, AtomEntry<unknown>>();\n readonly #rdeps = new Map<Atom<unknown>, Set<Atom<unknown>>>();\n readonly #pending = new Set<Atom<unknown>>();\n readonly #controllers = new WeakMap<Atom<unknown>, AbortController>();\n readonly #familyUnsubs = new Set<() => void>();\n readonly #registeredFamilies = new WeakSet<object>();\n #client: StoreClient | null = null;\n\n #getOrCreate<V>(atom: Atom<V>): AtomEntry<V> {\n let entry = this.#atoms.get(atom) as AtomEntry<V> | undefined;\n if (entry == null) {\n entry = {\n state: PENDING_STATE as AtomState<V>,\n version: 0,\n promise: null,\n listeners: new Set(),\n mountCount: 0,\n unmount: null,\n };\n this.#atoms.set(atom, entry as AtomEntry<unknown>);\n }\n return entry;\n }\n\n resolve<V>(atom: Atom<V>): Promise<V> {\n const entry = this.#getOrCreate(atom);\n if (entry.promise != null) {\n return entry.promise;\n }\n\n const promise = this.#runGet(atom).finally(() => {\n const e = this.#atoms.get(atom) as AtomEntry<V> | undefined;\n if (e != null) {\n e.promise = null;\n }\n });\n entry.promise = promise;\n return promise;\n }\n\n async #runGet<V>(atom: Atom<V>): Promise<V> {\n const config: InternalAtomConfig<V> = atom[CONFIG];\n const dependencies = config.dependencies;\n const stalePolicy: StalePolicy = config.stalePolicy ?? \"keep\";\n const entry = this.#getOrCreate(atom);\n\n if (dependencies != null) {\n await Promise.all(Object.values(dependencies).map((dep) => this.resolve(dep)));\n this.#registerRdeps(atom, dependencies);\n }\n\n const ctx = this.#makeCtx(atom, dependencies ?? {});\n\n try {\n const value = await config.get(ctx);\n if (ctx.signal.aborted) {\n throw new DOMException(\"The operation was aborted\", \"AbortError\");\n }\n entry.state = { status: \"fresh\", value, error: undefined };\n entry.version++;\n this.#scheduleNotify(atom);\n return value;\n } catch (e: unknown) {\n if (isAbortError(e)) {\n throw e;\n }\n const prevValue = extractPreviousValue<V>(entry.state);\n entry.state = {\n status: \"error\",\n value: stalePolicy === \"keep\" ? prevValue : undefined,\n error: e,\n } as AtomState<V>;\n entry.version++;\n this.#scheduleNotify(atom);\n throw e;\n }\n }\n\n invalidate(atom: Atom<unknown>): void {\n this.#markStale(atom);\n this.#pending.add(atom);\n if (this.#pending.size === 1) {\n queueMicrotask(() => {\n this.#flushPending();\n });\n }\n }\n\n invalidateMany(atoms: ReadonlyArray<Atom<unknown>>): void {\n for (const a of atoms) {\n this.#markStale(a);\n this.#pending.add(a);\n }\n if (this.#pending.size > 0) {\n queueMicrotask(() => {\n this.#flushPending();\n });\n }\n }\n\n #markStale(atom: Atom<unknown>, visited = new Set<Atom<unknown>>()): void {\n if (visited.has(atom)) {\n return;\n }\n visited.add(atom);\n\n const entry = this.#atoms.get(atom);\n if (entry != null) {\n const stalePolicy: StalePolicy = atom[CONFIG].stalePolicy ?? \"keep\";\n\n if (entry.state.status === \"fresh\") {\n if (stalePolicy === \"reset\") {\n entry.state = PENDING_STATE;\n } else {\n entry.state = { ...entry.state, status: \"stale\" };\n }\n }\n\n entry.promise = null;\n this.#controllers.get(atom)?.abort();\n }\n\n const rdeps = this.#rdeps.get(atom);\n if (rdeps != null) {\n for (const dep of rdeps) {\n this.#markStale(dep, visited);\n }\n }\n }\n\n #markReverseDependentsStale(atom: Atom<unknown>): void {\n const rdeps = this.#rdeps.get(atom);\n if (rdeps != null) {\n const visited = new Set<Atom<unknown>>([atom]);\n for (const dep of rdeps) {\n this.#markStale(dep, visited);\n this.#pending.add(dep);\n }\n }\n }\n\n #flushPending(): void {\n const batch = [...this.#pending];\n this.#pending.clear();\n const toNotify = new Set<() => void>();\n for (const a of batch) {\n const entry = this.#atoms.get(a);\n if (entry != null) {\n for (const l of entry.listeners) {\n toNotify.add(l);\n }\n }\n }\n for (const l of toNotify) {\n l();\n }\n }\n\n #scheduleNotify(atom: Atom<unknown>): void {\n this.#pending.add(atom);\n if (this.#pending.size === 1) {\n queueMicrotask(() => {\n this.#flushPending();\n });\n }\n }\n\n #registerRdeps(atom: Atom<unknown>, deps: Record<string, Atom<unknown>>): void {\n for (const dep of Object.values(deps)) {\n let set = this.#rdeps.get(dep);\n if (set == null) {\n set = new Set();\n this.#rdeps.set(dep, set);\n }\n set.add(atom);\n }\n }\n\n #makeCtx(\n atom: Atom<unknown>,\n deps: Record<string, Atom<unknown>>,\n ): AtomContext<Record<string, Atom<unknown>>> {\n this.#controllers.get(atom)?.abort();\n const controller = new AbortController();\n this.#controllers.set(atom, controller);\n\n return {\n signal: controller.signal,\n get: async (key: string) => {\n const dep = deps[key];\n if (dep == null) {\n throw new Error(`Unknown dependency key: \"${String(key)}\"`);\n }\n return this.resolve(dep);\n },\n };\n }\n\n subscribe<V>(atom: Atom<V>, listener: () => void): () => void {\n const entry = this.#getOrCreate(atom);\n entry.listeners.add(listener);\n\n this.#autoRegisterFamily(atom);\n\n if (entry.state.status === \"pending\" && entry.promise == null) {\n void this.resolve(atom);\n }\n\n entry.mountCount++;\n if (entry.mountCount === 1) {\n const config: InternalAtomConfig<V> = atom[CONFIG];\n if (config.onMount != null) {\n const setValue = (value: V): void => {\n entry.state = { status: \"fresh\", value, error: undefined };\n entry.version++;\n this.#scheduleNotify(atom);\n };\n const cleanup = config.onMount(setValue as (value: unknown) => void);\n if (typeof cleanup === \"function\") {\n entry.unmount = cleanup;\n }\n }\n }\n\n return () => {\n entry.listeners.delete(listener);\n entry.mountCount--;\n if (entry.mountCount === 0 && entry.unmount != null) {\n entry.unmount();\n entry.unmount = null;\n }\n };\n }\n\n #autoRegisterFamily(atom: Atom<unknown>): void {\n const link = getFamilyLink(atom);\n if (link == null) {\n return;\n }\n if (this.#registeredFamilies.has(link)) {\n return;\n }\n this.#registeredFamilies.add(link);\n const unsub = link.registerStore((target: Atom<unknown>) => {\n this.invalidate(target);\n });\n this.#familyUnsubs.add(unsub);\n }\n\n getSnapshot<V>(atom: Atom<V>): AtomState<V> {\n return this.#getOrCreate(atom).state;\n }\n\n getServerSnapshot<V>(atom: Atom<V>): AtomState<V> {\n const entry = this.#atoms.get(atom) as AtomEntry<V> | undefined;\n if (entry != null) {\n return entry.state;\n }\n return PENDING_STATE as AtomState<V>;\n }\n\n async set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void> {\n const config: InternalAtomConfig<V> = atom[CONFIG];\n if (config.set == null) {\n throw new Error(\n `Atom${atom.debugLabel != null ? ` \"${atom.debugLabel}\"` : \"\"} is not writable`,\n );\n }\n\n const deps = config.dependencies ?? {};\n const baseCtx = this.#makeCtx(atom, deps);\n const entry = this.#getOrCreate(atom);\n\n // Ref: assignments inside setOptimisticValue are not tracked on a plain `let` for catch narrowing.\n const optimisticSnapshot: {\n current: { state: AtomState<V>; version: number } | null;\n } = { current: null };\n\n const ctx: WritableAtomContext<Record<string, Atom<unknown>>, V> = {\n ...baseCtx,\n setOptimisticValue: (value: V): void => {\n if (optimisticSnapshot.current == null) {\n optimisticSnapshot.current = { state: entry.state, version: entry.version };\n }\n entry.state = { status: \"fresh\", value, error: undefined };\n entry.version++;\n this.#scheduleNotify(atom);\n this.#markReverseDependentsStale(atom);\n },\n };\n\n try {\n await config.set(ctx, ...args);\n } catch (e: unknown) {\n const snap = optimisticSnapshot.current;\n if (snap != null) {\n entry.state = snap.state;\n entry.version = snap.version;\n this.#scheduleNotify(atom);\n }\n throw e;\n }\n\n this.invalidate(atom);\n }\n\n write<V>(atom: Atom<V>, value: V): void {\n const entry = this.#getOrCreate(atom);\n this.#controllers.get(atom)?.abort();\n entry.promise = null;\n entry.state = { status: \"fresh\", value, error: undefined };\n entry.version++;\n this.#scheduleNotify(atom);\n this.#markReverseDependentsStale(atom);\n }\n\n getClient(): StoreClient {\n if (this.#client != null) {\n return this.#client;\n }\n\n const store = this;\n this.#client = {\n get<V>(atom: Atom<V>): Promise<V> {\n return store.resolve(atom);\n },\n set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void> {\n return store.set(atom, ...args);\n },\n write<V>(atom: Atom<V>, value: V): void {\n store.write(atom, value);\n },\n invalidate(atom: Atom<unknown>): void {\n store.invalidate(atom);\n },\n invalidateMany(atoms: ReadonlyArray<Atom<unknown>>): void {\n store.invalidateMany(atoms);\n },\n subscribe<V>(atom: Atom<V>, listener: (state: AtomState<V>) => void): () => void {\n return store.subscribe(atom, () => {\n listener(store.getSnapshot(atom));\n });\n },\n };\n return this.#client;\n }\n}\n\nexport function createStore(): Store {\n return new Store();\n}\n\nfunction isAbortError(e: unknown): boolean {\n return e instanceof DOMException && e.name === \"AbortError\";\n}\n\nfunction extractPreviousValue<V>(state: AtomState<V>): V | undefined {\n if (state.status === \"stale\" || state.status === \"fresh\") {\n return state.value;\n }\n if (state.status === \"error\") {\n return state.value;\n }\n return undefined;\n}\n"],"mappings":"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"}