@kdeveloper/kvark 0.3.0 → 0.3.2

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.
@@ -0,0 +1,78 @@
1
+ //#region src/internal/types.d.ts
2
+ declare const CONFIG: unique symbol;
3
+ declare const WRITABLE: unique symbol;
4
+ type AtomState<Value> = {
5
+ status: "pending";
6
+ value: undefined;
7
+ error: undefined;
8
+ } | {
9
+ status: "stale";
10
+ value: Value;
11
+ error: undefined;
12
+ } | {
13
+ status: "fresh";
14
+ value: Value;
15
+ error: undefined;
16
+ } | {
17
+ status: "error";
18
+ value: Value | undefined;
19
+ error: unknown;
20
+ };
21
+ type StalePolicy = "keep" | "suspend" | "reset";
22
+ type AtomContext<Deps extends Record<string, Atom<unknown>>> = {
23
+ get: <K extends keyof Deps>(key: K) => Promise<AtomValue<Deps[K]>>;
24
+ signal: AbortSignal;
25
+ };
26
+ type WritableAtomContext<Deps extends Record<string, Atom<unknown>>, Value> = AtomContext<Deps> & {
27
+ setOptimisticValue: (value: Value) => void;
28
+ };
29
+ type AtomConfig<Value, Deps extends Record<string, Atom<unknown>>, Args extends readonly unknown[]> = {
30
+ dependencies?: Deps;
31
+ stalePolicy?: StalePolicy;
32
+ debugLabel?: string;
33
+ get: (ctx: AtomContext<Deps>) => Promise<Value>;
34
+ set?: (ctx: WritableAtomContext<Deps, Value>, ...args: Args) => Promise<void>;
35
+ onMount?: (set: (value: Value) => void) => (() => void) | void;
36
+ };
37
+ interface InternalAtomConfig<Value> {
38
+ dependencies?: Record<string, Atom<unknown>>;
39
+ stalePolicy?: StalePolicy;
40
+ debugLabel?: string;
41
+ get: (ctx: AtomContext<Record<string, Atom<unknown>>>) => Promise<Value>;
42
+ set?: (ctx: WritableAtomContext<Record<string, Atom<unknown>>, Value>, ...args: readonly unknown[]) => Promise<void>;
43
+ onMount?: (set: (value: unknown) => void) => (() => void) | void;
44
+ }
45
+ interface Atom<out Value> {
46
+ readonly [CONFIG]: InternalAtomConfig<Value>;
47
+ readonly debugLabel: string | undefined;
48
+ }
49
+ interface WritableAtom<out Value, in out Args extends readonly unknown[]> extends Atom<Value> {
50
+ readonly [WRITABLE]: Args;
51
+ }
52
+ type AtomValue<A> = A extends Atom<infer V> ? V : never;
53
+ type IsWritable<A> = A extends WritableAtom<unknown, readonly unknown[]> ? true : false;
54
+ type AtomArgs<A> = A extends WritableAtom<unknown, infer Args> ? Args : never;
55
+ //#endregion
56
+ //#region src/internal/store.d.ts
57
+ interface StoreClient {
58
+ get<V>(atom: Atom<V>): Promise<V>;
59
+ set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void>;
60
+ invalidate(atom: Atom<unknown>): void;
61
+ invalidateMany(atoms: ReadonlyArray<Atom<unknown>>): void;
62
+ subscribe<V>(atom: Atom<V>, listener: (state: AtomState<V>) => void): () => void;
63
+ }
64
+ declare class Store {
65
+ #private;
66
+ resolve<V>(atom: Atom<V>): Promise<V>;
67
+ invalidate(atom: Atom<unknown>): void;
68
+ invalidateMany(atoms: ReadonlyArray<Atom<unknown>>): void;
69
+ subscribe<V>(atom: Atom<V>, listener: () => void): () => void;
70
+ getSnapshot<V>(atom: Atom<V>): AtomState<V>;
71
+ getServerSnapshot<V>(atom: Atom<V>): AtomState<V>;
72
+ set<V, A extends readonly unknown[]>(atom: WritableAtom<V, A>, ...args: A): Promise<void>;
73
+ getClient(): StoreClient;
74
+ }
75
+ declare function createStore(): Store;
76
+ //#endregion
77
+ 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 };
78
+ //# sourceMappingURL=store-D4q7TShr.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-D4q7TShr.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.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Atomic state management with explicit dependency graphs",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -22,7 +22,7 @@
22
22
  }
23
23
  },
24
24
  "scripts": {
25
- "build": "tsup",
25
+ "build": "tsc --noEmit && tsdown",
26
26
  "lint": "oxlint --deny-warnings",
27
27
  "lint:fix": "oxlint --fix --deny-warnings",
28
28
  "lint:types": "tsc --noEmit",
@@ -41,7 +41,7 @@
41
41
  "oxlint": "^1.57.0",
42
42
  "react": ">=18",
43
43
  "react-dom": "^19.2.4",
44
- "tsup": "^8.5.1",
44
+ "tsdown": "^0.21.6",
45
45
  "typescript": "^6.0.2",
46
46
  "vitest": "^4.1.2"
47
47
  },
@@ -1,405 +0,0 @@
1
- // src/internal/types.ts
2
- var CONFIG = /* @__PURE__ */ Symbol("kvark.config");
3
- var WRITABLE = /* @__PURE__ */ Symbol("kvark.writable");
4
- var FAMILY_LINK = /* @__PURE__ */ Symbol("kvark.familyLink");
5
-
6
- // src/internal/atom.ts
7
- function atom(config) {
8
- const internal = /* @__PURE__ */ Object.create(null);
9
- internal.get = config.get;
10
- if (config.debugLabel != null) {
11
- internal.debugLabel = config.debugLabel;
12
- }
13
- if (config.dependencies != null) {
14
- internal.dependencies = config.dependencies;
15
- }
16
- if (config.stalePolicy != null) {
17
- internal.stalePolicy = config.stalePolicy;
18
- }
19
- if (config.set != null) {
20
- internal.set = config.set;
21
- }
22
- if (config.set != null) {
23
- return {
24
- [CONFIG]: internal,
25
- [WRITABLE]: [],
26
- debugLabel: config.debugLabel
27
- };
28
- }
29
- return {
30
- [CONFIG]: internal,
31
- debugLabel: config.debugLabel
32
- };
33
- }
34
-
35
- // src/internal/family.ts
36
- function getFamilyLink(target) {
37
- return target[FAMILY_LINK];
38
- }
39
- function atomFamily(options) {
40
- const cachePolicy = options.cachePolicy ?? "keep-all";
41
- const lruSize = options.lruSize ?? 100;
42
- const cache = /* @__PURE__ */ new Map();
43
- const lruOrder = [];
44
- const storeCallbacks = /* @__PURE__ */ new Set();
45
- const link = {
46
- invalidateAtom(target) {
47
- for (const cb of storeCallbacks) {
48
- cb(target);
49
- }
50
- },
51
- registerStore(cb) {
52
- storeCallbacks.add(cb);
53
- return () => {
54
- storeCallbacks.delete(cb);
55
- };
56
- }
57
- };
58
- function attachLink(target) {
59
- target[FAMILY_LINK] = link;
60
- }
61
- function getOrCreate(param) {
62
- const cached = cache.get(param);
63
- if (cached != null) {
64
- if (cachePolicy === "lru") {
65
- touchLru(param);
66
- }
67
- return cached;
68
- }
69
- const deps = options.dependencies?.(param);
70
- const getFn = options.get(param);
71
- const setFn = options.set?.(param);
72
- const label = options.debugLabel != null ? `${options.debugLabel}(${String(param)})` : void 0;
73
- const created = createAtom(label, deps, getFn, setFn);
74
- attachLink(created);
75
- cache.set(param, created);
76
- if (cachePolicy === "lru") {
77
- lruOrder.push(param);
78
- evictLru();
79
- }
80
- return created;
81
- }
82
- function createAtom(label, deps, getFn, setFn) {
83
- const base = {
84
- get: getFn
85
- };
86
- if (label != null) {
87
- base.debugLabel = label;
88
- }
89
- if (deps != null) {
90
- base.dependencies = deps;
91
- }
92
- if (options.stalePolicy != null) {
93
- base.stalePolicy = options.stalePolicy;
94
- }
95
- if (setFn != null) {
96
- base.set = setFn;
97
- return atom(
98
- base
99
- );
100
- }
101
- return atom(base);
102
- }
103
- function touchLru(param) {
104
- const idx = lruOrder.indexOf(param);
105
- if (idx !== -1) {
106
- lruOrder.splice(idx, 1);
107
- }
108
- lruOrder.push(param);
109
- }
110
- function evictLru() {
111
- while (lruOrder.length > lruSize) {
112
- const evicted = lruOrder.shift();
113
- if (evicted !== void 0) {
114
- cache.delete(evicted);
115
- }
116
- }
117
- }
118
- const family = getOrCreate;
119
- family.invalidate = (param) => {
120
- const cached = cache.get(param);
121
- if (cached != null) {
122
- link.invalidateAtom(cached);
123
- }
124
- };
125
- family.invalidateAll = () => {
126
- for (const cached of cache.values()) {
127
- link.invalidateAtom(cached);
128
- }
129
- };
130
- family.remove = (param) => {
131
- cache.delete(param);
132
- if (cachePolicy === "lru") {
133
- const idx = lruOrder.indexOf(param);
134
- if (idx !== -1) {
135
- lruOrder.splice(idx, 1);
136
- }
137
- }
138
- };
139
- family.getCache = () => cache;
140
- return family;
141
- }
142
-
143
- // src/internal/store.ts
144
- var PENDING_STATE = {
145
- status: "pending",
146
- value: void 0,
147
- error: void 0
148
- };
149
- var Store = class {
150
- #atoms = /* @__PURE__ */ new WeakMap();
151
- #rdeps = /* @__PURE__ */ new Map();
152
- #pending = /* @__PURE__ */ new Set();
153
- #controllers = /* @__PURE__ */ new WeakMap();
154
- #familyUnsubs = /* @__PURE__ */ new Set();
155
- #registeredFamilies = /* @__PURE__ */ new WeakSet();
156
- #client = null;
157
- #getOrCreate(atom2) {
158
- let entry = this.#atoms.get(atom2);
159
- if (entry == null) {
160
- entry = {
161
- state: PENDING_STATE,
162
- version: 0,
163
- promise: null,
164
- listeners: /* @__PURE__ */ new Set()
165
- };
166
- this.#atoms.set(atom2, entry);
167
- }
168
- return entry;
169
- }
170
- resolve(atom2) {
171
- const entry = this.#getOrCreate(atom2);
172
- if (entry.promise != null) {
173
- return entry.promise;
174
- }
175
- const promise = this.#runGet(atom2).finally(() => {
176
- const e = this.#atoms.get(atom2);
177
- if (e != null) {
178
- e.promise = null;
179
- }
180
- });
181
- entry.promise = promise;
182
- return promise;
183
- }
184
- async #runGet(atom2) {
185
- const config = atom2[CONFIG];
186
- const dependencies = config.dependencies;
187
- const stalePolicy = config.stalePolicy ?? "keep";
188
- const entry = this.#getOrCreate(atom2);
189
- if (dependencies != null) {
190
- await Promise.all(Object.values(dependencies).map((dep) => this.resolve(dep)));
191
- this.#registerRdeps(atom2, dependencies);
192
- }
193
- const ctx = this.#makeCtx(atom2, dependencies ?? {});
194
- try {
195
- const value = await config.get(ctx);
196
- entry.state = { status: "fresh", value, error: void 0 };
197
- entry.version++;
198
- this.#scheduleNotify(atom2);
199
- return value;
200
- } catch (e) {
201
- if (isAbortError(e)) {
202
- throw e;
203
- }
204
- const prevValue = extractPreviousValue(entry.state);
205
- entry.state = {
206
- status: "error",
207
- value: stalePolicy === "keep" ? prevValue : void 0,
208
- error: e
209
- };
210
- entry.version++;
211
- this.#scheduleNotify(atom2);
212
- throw e;
213
- }
214
- }
215
- invalidate(atom2) {
216
- this.#markStale(atom2);
217
- this.#pending.add(atom2);
218
- if (this.#pending.size === 1) {
219
- queueMicrotask(() => {
220
- this.#flushPending();
221
- });
222
- }
223
- }
224
- invalidateMany(atoms) {
225
- for (const a of atoms) {
226
- this.#markStale(a);
227
- this.#pending.add(a);
228
- }
229
- if (this.#pending.size > 0) {
230
- queueMicrotask(() => {
231
- this.#flushPending();
232
- });
233
- }
234
- }
235
- #markStale(atom2, visited = /* @__PURE__ */ new Set()) {
236
- if (visited.has(atom2)) {
237
- return;
238
- }
239
- visited.add(atom2);
240
- const entry = this.#atoms.get(atom2);
241
- if (entry != null) {
242
- const stalePolicy = atom2[CONFIG].stalePolicy ?? "keep";
243
- if (entry.state.status === "fresh") {
244
- if (stalePolicy === "reset") {
245
- entry.state = PENDING_STATE;
246
- } else {
247
- entry.state = { ...entry.state, status: "stale" };
248
- }
249
- }
250
- entry.promise = null;
251
- this.#controllers.get(atom2)?.abort();
252
- }
253
- const rdeps = this.#rdeps.get(atom2);
254
- if (rdeps != null) {
255
- for (const dep of rdeps) {
256
- this.#markStale(dep, visited);
257
- }
258
- }
259
- }
260
- #flushPending() {
261
- const batch = [...this.#pending];
262
- this.#pending.clear();
263
- const toNotify = /* @__PURE__ */ new Set();
264
- for (const a of batch) {
265
- const entry = this.#atoms.get(a);
266
- if (entry != null) {
267
- for (const l of entry.listeners) {
268
- toNotify.add(l);
269
- }
270
- }
271
- }
272
- for (const l of toNotify) {
273
- l();
274
- }
275
- }
276
- #scheduleNotify(atom2) {
277
- this.#pending.add(atom2);
278
- if (this.#pending.size === 1) {
279
- queueMicrotask(() => {
280
- this.#flushPending();
281
- });
282
- }
283
- }
284
- #registerRdeps(atom2, deps) {
285
- for (const dep of Object.values(deps)) {
286
- let set = this.#rdeps.get(dep);
287
- if (set == null) {
288
- set = /* @__PURE__ */ new Set();
289
- this.#rdeps.set(dep, set);
290
- }
291
- set.add(atom2);
292
- }
293
- }
294
- #makeCtx(atom2, deps) {
295
- this.#controllers.get(atom2)?.abort();
296
- const controller = new AbortController();
297
- this.#controllers.set(atom2, controller);
298
- return {
299
- signal: controller.signal,
300
- get: async (key) => {
301
- const dep = deps[key];
302
- if (dep == null) {
303
- throw new Error(`Unknown dependency key: "${String(key)}"`);
304
- }
305
- return this.resolve(dep);
306
- }
307
- };
308
- }
309
- subscribe(atom2, listener) {
310
- const entry = this.#getOrCreate(atom2);
311
- entry.listeners.add(listener);
312
- this.#autoRegisterFamily(atom2);
313
- if (entry.state.status === "pending" && entry.promise == null) {
314
- void this.resolve(atom2);
315
- }
316
- return () => {
317
- entry.listeners.delete(listener);
318
- };
319
- }
320
- #autoRegisterFamily(atom2) {
321
- const link = getFamilyLink(atom2);
322
- if (link == null) {
323
- return;
324
- }
325
- if (this.#registeredFamilies.has(link)) {
326
- return;
327
- }
328
- this.#registeredFamilies.add(link);
329
- const unsub = link.registerStore((target) => {
330
- this.invalidate(target);
331
- });
332
- this.#familyUnsubs.add(unsub);
333
- }
334
- getSnapshot(atom2) {
335
- return this.#getOrCreate(atom2).state;
336
- }
337
- getServerSnapshot(atom2) {
338
- const entry = this.#atoms.get(atom2);
339
- if (entry != null) {
340
- return entry.state;
341
- }
342
- return PENDING_STATE;
343
- }
344
- async set(atom2, ...args) {
345
- const config = atom2[CONFIG];
346
- if (config.set == null) {
347
- throw new Error(
348
- `Atom${atom2.debugLabel != null ? ` "${atom2.debugLabel}"` : ""} is not writable`
349
- );
350
- }
351
- const deps = config.dependencies ?? {};
352
- const ctx = this.#makeCtx(atom2, deps);
353
- await config.set(ctx, ...args);
354
- this.invalidate(atom2);
355
- }
356
- getClient() {
357
- if (this.#client != null) {
358
- return this.#client;
359
- }
360
- const store = this;
361
- this.#client = {
362
- get(atom2) {
363
- return store.resolve(atom2);
364
- },
365
- set(atom2, ...args) {
366
- return store.set(atom2, ...args);
367
- },
368
- invalidate(atom2) {
369
- store.invalidate(atom2);
370
- },
371
- invalidateMany(atoms) {
372
- store.invalidateMany(atoms);
373
- },
374
- subscribe(atom2, listener) {
375
- return store.subscribe(atom2, () => {
376
- listener(store.getSnapshot(atom2));
377
- });
378
- }
379
- };
380
- return this.#client;
381
- }
382
- };
383
- function createStore() {
384
- return new Store();
385
- }
386
- function isAbortError(e) {
387
- return e instanceof DOMException && e.name === "AbortError";
388
- }
389
- function extractPreviousValue(state) {
390
- if (state.status === "stale" || state.status === "fresh") {
391
- return state.value;
392
- }
393
- if (state.status === "error") {
394
- return state.value;
395
- }
396
- return void 0;
397
- }
398
-
399
- export {
400
- CONFIG,
401
- atom,
402
- atomFamily,
403
- createStore
404
- };
405
- //# sourceMappingURL=chunk-6WIZ6MFN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"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 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: AtomContext<Deps>, ...args: Args) => Promise<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: AtomContext<Record<string, Atom<unknown>>>,\n ...args: readonly unknown[]\n ) => Promise<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 { Atom, AtomConfig, AtomContext, InternalAtomConfig, WritableAtom } 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: AtomContext<Deps>, ...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\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} 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};\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 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 };\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 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 #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 return () => {\n entry.listeners.delete(listener);\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 ctx = this.#makeCtx(atom, deps);\n await config.set(ctx, ...args);\n this.invalidate(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 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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","names":["atom"]}
package/dist/family.d.ts DELETED
@@ -1,23 +0,0 @@
1
- import { A as Atom, S as StalePolicy, a as AtomContext } from './store-DwEjhc31.js';
2
- export { b as AtomConfig, c as AtomState, d as AtomValue, W as WritableAtom, e as createStore } from './store-DwEjhc31.js';
3
- export { atom } from './index.js';
4
-
5
- type AtomFamilyOptions<Param, Value, Deps extends Record<string, Atom<unknown>>, Args extends readonly unknown[]> = {
6
- dependencies?: (param: Param) => Deps;
7
- stalePolicy?: StalePolicy;
8
- cachePolicy?: "keep-all" | "lru";
9
- lruSize?: number;
10
- debugLabel?: string;
11
- get: (param: Param) => (ctx: AtomContext<Deps>) => Promise<Value>;
12
- set?: (param: Param) => (ctx: AtomContext<Deps>, ...args: Args) => Promise<void>;
13
- };
14
- interface AtomFamily<Param, Value> {
15
- (param: Param): Atom<Value>;
16
- invalidate(param: Param): void;
17
- invalidateAll(): void;
18
- remove(param: Param): void;
19
- getCache(): ReadonlyMap<Param, Atom<Value>>;
20
- }
21
- declare function atomFamily<Param, Value, Deps extends Record<string, Atom<unknown>> = Record<never, never>, Args extends readonly unknown[] = readonly []>(options: AtomFamilyOptions<Param, Value, Deps, Args>): AtomFamily<Param, Value>;
22
-
23
- export { Atom, AtomContext, type AtomFamily, type AtomFamilyOptions, StalePolicy, atomFamily };
package/dist/family.js DELETED
@@ -1,11 +0,0 @@
1
- import {
2
- atom,
3
- atomFamily,
4
- createStore
5
- } from "./chunk-6WIZ6MFN.js";
6
- export {
7
- atom,
8
- atomFamily,
9
- createStore
10
- };
11
- //# sourceMappingURL=family.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/index.js DELETED
@@ -1,9 +0,0 @@
1
- import {
2
- atom,
3
- createStore
4
- } from "./chunk-6WIZ6MFN.js";
5
- export {
6
- atom,
7
- createStore
8
- };
9
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}