valdres 0.2.0-alpha.0 → 0.2.0-alpha.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.
package/dist/index.js CHANGED
@@ -8,7 +8,9 @@ var atom = (defaultValue, options) => {
8
8
  };
9
9
  };
10
10
  // src/utils/isPromiseLike.ts
11
- var isPromiseLike = (object) => object && object.then && typeof object.then === "function";
11
+ var isPromiseLike = (object) => {
12
+ return object && object.then && typeof object.then === "function";
13
+ };
12
14
 
13
15
  // src/lib/stableStringify.ts
14
16
  var stableStringifyRecurse = (x, key) => {
@@ -65,24 +67,15 @@ var stableStringify = (x) => {
65
67
  };
66
68
 
67
69
  // src/atomFamily.ts
68
- var handleDefaultValue = (defaultValue, override, key) => {
69
- if (override) {
70
- return typeof override === "function" ? () => typeof defaultValue === "function" ? override(defaultValue(key)) : override(defaultValue) : override;
71
- } else {
72
- return typeof defaultValue === "function" ? () => defaultValue(key) : defaultValue;
73
- }
74
- };
75
70
  var atomFamily = (defaultValue, debugLabel) => {
76
71
  const map = new Map;
77
72
  const atomFamily2 = (key, defaultOverride) => {
78
73
  const keyStringified = stableStringify(key);
79
74
  if (map.has(keyStringified)) {
80
- if (defaultOverride)
81
- throw new Error("defaultOverride is only allowed first time an atom is initiaizlied");
82
75
  return map.get(keyStringified);
83
76
  }
84
77
  const atomDebugLabel = debugLabel && debugLabel + "_" + keyStringified;
85
- const newAtom = atom(handleDefaultValue(defaultValue, defaultOverride, key), {
78
+ const newAtom = atom(typeof defaultValue === "function" ? () => defaultValue(key) : defaultValue, {
86
79
  label: atomDebugLabel
87
80
  });
88
81
  newAtom.family = atomFamily2;
@@ -94,18 +87,18 @@ var atomFamily = (defaultValue, debugLabel) => {
94
87
  return atomFamily2;
95
88
  };
96
89
  // src/lib/updateStateSubscribers.ts
97
- var updateStateSubscribers = (state2, data) => {
98
- const subscribtions = data.subscriptions.get(state2);
90
+ var updateStateSubscribers = (state, data) => {
91
+ const subscribtions = data.subscriptions.get(state);
99
92
  if (subscribtions?.size) {
100
93
  for (const subscribtion of subscribtions) {
101
94
  subscribtion.callback();
102
95
  }
103
96
  }
104
- if (state2.family) {
105
- const familySubscriptions = data.subscriptions.get(state2.family);
97
+ if (state.family) {
98
+ const familySubscriptions = data.subscriptions.get(state.family);
106
99
  if (familySubscriptions?.size) {
107
100
  for (const subscribtion of familySubscriptions) {
108
- subscribtion.callback(state2.familyKey);
101
+ subscribtion.callback(state.familyKey);
109
102
  }
110
103
  }
111
104
  }
@@ -123,12 +116,12 @@ class SuspendAndWaitForResolveError extends Error {
123
116
  this.promise = promise;
124
117
  }
125
118
  }
126
- var getOrInitConsumersSet = (state2, data) => {
127
- const set = data.stateConsumers.get(state2);
119
+ var getOrInitConsumersSet = (state, data) => {
120
+ const set = data.stateConsumers.get(state);
128
121
  if (set)
129
122
  return set;
130
123
  const newSet = new Set;
131
- data.stateConsumers.set(state2, newSet);
124
+ data.stateConsumers.set(state, newSet);
132
125
  return newSet;
133
126
  };
134
127
  var evaluateSelector = (selector, data) => {
@@ -136,9 +129,9 @@ var evaluateSelector = (selector, data) => {
136
129
  const updatedDependencies = new Set;
137
130
  let result;
138
131
  try {
139
- result = selector.get((state2) => {
140
- const value = getState2(state2, data);
141
- updatedDependencies.add(state2);
132
+ result = selector.get((state) => {
133
+ const value = getState2(state, data);
134
+ updatedDependencies.add(state);
142
135
  if (isPromiseLike(value))
143
136
  throw new SuspendAndWaitForResolveError(value);
144
137
  return value;
@@ -152,12 +145,12 @@ var evaluateSelector = (selector, data) => {
152
145
  }
153
146
  const added = updatedDependencies?.difference(currentDependencies);
154
147
  const removed = currentDependencies?.difference(updatedDependencies);
155
- for (const state2 of added) {
156
- const set = getOrInitConsumersSet(state2, data);
148
+ for (const state of added) {
149
+ const set = getOrInitConsumersSet(state, data);
157
150
  set.add(selector);
158
151
  }
159
- for (const state2 of removed) {
160
- const set = getOrInitConsumersSet(state2, data);
152
+ for (const state of removed) {
153
+ const set = getOrInitConsumersSet(state, data);
161
154
  set.delete(selector);
162
155
  }
163
156
  data.stateDependencies.set(selector, updatedDependencies);
@@ -214,7 +207,7 @@ var updateSelectorSubscribers = (selector, data) => {
214
207
  }
215
208
  if (familySubscriptions?.size) {
216
209
  for (const subscribtion of familySubscriptions) {
217
- subscribtion.callback(state.familyKey);
210
+ subscribtion.callback(selector.familyKey);
218
211
  }
219
212
  }
220
213
  };
@@ -307,25 +300,25 @@ var initAtom = (atom3, data) => {
307
300
  };
308
301
 
309
302
  // src/utils/isAtom.ts
310
- var isAtom = (state2) => Object.hasOwn(state2, "defaultValue");
303
+ var isAtom = (state) => Object.hasOwn(state, "defaultValue");
311
304
 
312
305
  // src/utils/isSelector.ts
313
- var isSelector = (state2) => Object.hasOwn(state2, "get");
306
+ var isSelector = (state) => Object.hasOwn(state, "get");
314
307
 
315
308
  // src/utils/isFamily.ts
316
- var isFamily = (state2) => Object.hasOwn(state2, "_map");
309
+ var isFamily = (state) => Object.hasOwn(state, "_map");
317
310
 
318
311
  // src/lib/getState.ts
319
- var getState2 = (state2, data) => {
320
- if (data.values.has(state2))
321
- return data.values.get(state2);
322
- if (isAtom(state2))
323
- return initAtom(state2, data);
324
- if (isSelector(state2))
325
- return initSelector(state2, data);
326
- if (isFamily(state2)) {
312
+ var getState2 = (state, data) => {
313
+ if (data.values.has(state))
314
+ return data.values.get(state);
315
+ if (isAtom(state))
316
+ return initAtom(state, data);
317
+ if (isSelector(state))
318
+ return initSelector(state, data);
319
+ if (isFamily(state)) {
327
320
  const res = [];
328
- for (const atom3 of state2._map.values()) {
321
+ for (const atom3 of state._map.values()) {
329
322
  res.push([atom3.familyKey, getState2(atom3, data)]);
330
323
  }
331
324
  return res;
@@ -334,11 +327,11 @@ var getState2 = (state2, data) => {
334
327
  };
335
328
 
336
329
  // src/lib/unsubscribe.ts
337
- var unsubscribe = (state2, subscription, data, mountRes) => {
338
- const subscribers = data.subscriptions.get(state2);
330
+ var unsubscribe = (state, subscription, data, mountRes) => {
331
+ const subscribers = data.subscriptions.get(state);
339
332
  if (subscribers) {
340
333
  subscribers.delete(subscription);
341
- if (data.subscriptionsRequireEqualCheck.get(state2)) {
334
+ if (data.subscriptionsRequireEqualCheck.get(state)) {
342
335
  let remove = true;
343
336
  for (const subscriber of subscribers) {
344
337
  if (subscriber.requireDeepEqualCheckBeforeCallback) {
@@ -347,33 +340,33 @@ var unsubscribe = (state2, subscription, data, mountRes) => {
347
340
  }
348
341
  }
349
342
  if (remove) {
350
- data.subscriptionsRequireEqualCheck.delete(state2);
343
+ data.subscriptionsRequireEqualCheck.delete(state);
351
344
  }
352
345
  }
353
346
  if (subscribers.size === 0) {
354
- if (state2.onUnmount) {
355
- state2.onUnmount(mountRes);
347
+ if (state.onUnmount) {
348
+ state.onUnmount(mountRes);
356
349
  }
357
350
  }
358
351
  }
359
352
  };
360
353
 
361
354
  // src/lib/subscribe.ts
362
- var initSubscribers = (state2, data) => {
355
+ var initSubscribers = (state, data) => {
363
356
  const set = new Set;
364
- data.subscriptions.set(state2, set);
357
+ data.subscriptions.set(state, set);
365
358
  return set;
366
359
  };
367
- var subscribe = (state2, callback, requireDeepEqualCheckBeforeCallback, data) => {
368
- const subscribers = data.subscriptions.get(state2) || initSubscribers(state2, data);
369
- if (isSelector(state2) && !data.values.has(state2)) {
370
- initSelector(state2, data);
360
+ var subscribe = (state, callback, requireDeepEqualCheckBeforeCallback, data) => {
361
+ const subscribers = data.subscriptions.get(state) || initSubscribers(state, data);
362
+ if (isSelector(state) && !data.values.has(state)) {
363
+ initSelector(state, data);
371
364
  }
372
365
  let subscription;
373
- if (isFamily(state2)) {
366
+ if (isFamily(state)) {
374
367
  subscription = {
375
368
  callback,
376
- state: state2,
369
+ state,
377
370
  requireDeepEqualCheckBeforeCallback
378
371
  };
379
372
  } else {
@@ -383,16 +376,16 @@ var subscribe = (state2, callback, requireDeepEqualCheckBeforeCallback, data) =>
383
376
  };
384
377
  }
385
378
  let mountRes;
386
- if (subscribers.size === 0 && state2.onMount) {
387
- mountRes = state2.onMount((value) => {
388
- setAtom(state2, value, data);
379
+ if (subscribers.size === 0 && state.onMount) {
380
+ mountRes = state.onMount((value) => {
381
+ setAtom(state, value, data);
389
382
  });
390
383
  }
391
384
  subscribers.add(subscription);
392
- if (requireDeepEqualCheckBeforeCallback && data.subscriptionsRequireEqualCheck.get(state2) !== true) {
393
- data.subscriptionsRequireEqualCheck.set(state2, true);
385
+ if (requireDeepEqualCheckBeforeCallback && data.subscriptionsRequireEqualCheck.get(state) !== true) {
386
+ data.subscriptionsRequireEqualCheck.set(state, true);
394
387
  }
395
- return () => unsubscribe(state2, subscription, data, mountRes);
388
+ return () => unsubscribe(state, subscription, data, mountRes);
396
389
  };
397
390
 
398
391
  // src/lib/setAtoms.ts
@@ -410,8 +403,8 @@ var setAtoms = (pairs, data) => {
410
403
  };
411
404
 
412
405
  // src/lib/transaction.ts
413
- var findDependencies = (state2, data, result = new Set) => {
414
- const consumers = data.stateConsumers.get(state2);
406
+ var findDependencies = (state, data, result = new Set) => {
407
+ const consumers = data.stateConsumers.get(state);
415
408
  if (consumers?.size) {
416
409
  for (const consumer of consumers) {
417
410
  if (!result.has(consumer)) {
@@ -426,18 +419,18 @@ var transaction = (callback, data) => {
426
419
  let txnAtomMap = new Map;
427
420
  let txnSelectorCache = new Map;
428
421
  let dirtySelectors = new Set;
429
- const txnGet = (state2) => {
430
- if (isAtom(state2)) {
431
- return txnAtomMap.has(state2) ? txnAtomMap.get(state2) : getState2(state2, data);
422
+ const txnGet = (state) => {
423
+ if (isAtom(state)) {
424
+ return txnAtomMap.has(state) ? txnAtomMap.get(state) : getState2(state, data);
432
425
  } else {
433
- if (txnSelectorCache.has(state2)) {
434
- return txnSelectorCache.get(state2);
435
- } else if (dirtySelectors.has(state2)) {
436
- const res = state2.get(txnGet);
437
- txnSelectorCache.set(state2, res);
426
+ if (txnSelectorCache.has(state)) {
427
+ return txnSelectorCache.get(state);
428
+ } else if (dirtySelectors.has(state)) {
429
+ const res = state.get(txnGet);
430
+ txnSelectorCache.set(state, res);
438
431
  return res;
439
432
  } else {
440
- return getState2(state2, data);
433
+ return getState2(state, data);
441
434
  }
442
435
  }
443
436
  };
@@ -489,14 +482,27 @@ var createStore = (id) => {
489
482
  stateConsumers: new WeakMap,
490
483
  stateDependencies: new WeakMap
491
484
  };
492
- const get = (state2) => getState2(state2, data);
493
- const set = (state2, value) => {
494
- if (isAtom(state2)) {
495
- return setAtom(state2, value, data);
485
+ const get = (state) => getState2(state, data);
486
+ const getWithDefault = (atom3, defaultValue) => {
487
+ if (!isAtom(atom3))
488
+ throw new Error("Only atom allowed");
489
+ if (data.values.has(atom3)) {
490
+ return data.values.get(atom3);
491
+ } else {
492
+ if (typeof defaultValue === "function") {
493
+ defaultValue = defaultValue((state) => getState2(state, data));
494
+ }
495
+ data.values.set(atom3, defaultValue);
496
+ return defaultValue;
497
+ }
498
+ };
499
+ const set = (state, value) => {
500
+ if (isAtom(state)) {
501
+ return setAtom(state, value, data);
496
502
  } else {
497
- if (isSelector(state2)) {
498
- if (state2.set) {
499
- txn((set2, get2) => state2.set({ get: get2, set: set2 }, value));
503
+ if (isSelector(state)) {
504
+ if (state.set) {
505
+ txn((set2, get2) => state.set({ get: get2, set: set2 }, value));
500
506
  return;
501
507
  } else {
502
508
  throw new Error("set on selector is not supported");
@@ -506,10 +512,11 @@ var createStore = (id) => {
506
512
  }
507
513
  };
508
514
  const reset = (atom3) => resetAtom(atom3, data);
509
- const sub = (state2, callback, deepEqualCheckBeforeCallback = true) => subscribe(state2, callback, deepEqualCheckBeforeCallback, data);
515
+ const sub = (state, callback, deepEqualCheckBeforeCallback = true) => subscribe(state, callback, deepEqualCheckBeforeCallback, data);
510
516
  const txn = (callback) => transaction(callback, data);
511
517
  return {
512
518
  get,
519
+ getWithDefault,
513
520
  set,
514
521
  sub,
515
522
  txn,
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,2 +1,2 @@
1
1
  export declare const getDefaultStore: () => any;
2
- export declare const resetDefaultStore: () => import("..").Store;
2
+ export declare const resetDefaultStore: () => import("./types/Store").Store;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,4 @@
1
+ import type { Family } from "../types/Family";
1
2
  import type { State } from "../types/State";
2
3
  import type { StoreData } from "../types/StoreData";
3
- export declare const subscribe: <V>(state: State<V>, callback: any, data: StoreData) => () => void;
4
+ export declare const subscribe: <V>(state: State<V> | Family<V>, callback: any, requireDeepEqualCheckBeforeCallback: boolean, data: StoreData) => () => void;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,3 @@
1
1
  import type { State } from "../types/State";
2
2
  import type { StoreData } from "../types/StoreData";
3
- export declare const unsubscribe: <V>(state: State<V>, subscription: any, store: StoreData, mountRes?: any) => void;
3
+ export declare const unsubscribe: <V>(state: State<V>, subscription: any, data: StoreData, mountRes?: any) => void;
@@ -1,3 +1,3 @@
1
1
  import type { Selector } from "../types/Selector";
2
2
  import type { StoreData } from "../types/StoreData";
3
- export declare const updateSelectorSubscribers: (selector: Selector, data: StoreData, oldValue: any) => void;
3
+ export declare const updateSelectorSubscribers: (selector: Selector, data: StoreData) => void;
@@ -1,5 +1,3 @@
1
1
  import type { GetValue } from "./types/GetValue";
2
- export declare const selector: (get: GetValue, debugLabel?: string) => {
3
- get: GetValue;
4
- debugLabel: string;
5
- };
2
+ import type { Selector } from "./types/Selector";
3
+ export declare const selector: <Value, FamilyKey = undefined>(get: (get: GetValue) => Value, debugLabel?: string) => Selector<Value, FamilyKey>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,2 @@
1
- export declare const selectorFamily: <V, A>(get: any, debugLabel?: string) => {
2
- (key: A): any;
3
- _map: Map<any, any>;
4
- };
1
+ import type { SelectorFamily } from "./types/SelectorFamily";
2
+ export declare const selectorFamily: <Value, Key>(get: any, debugLabel?: string) => SelectorFamily<Value, Key>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,7 +1,9 @@
1
1
  import type { AtomFamily } from "./AtomFamily";
2
- export type Atom<Value = unknown, FamilyKey = undefined> = {
2
+ export type Atom<Value = unknown, FamilyKey = undefined, MountRes = undefined> = {
3
3
  defaultValue?: Value | (() => Value | Promise<Value>);
4
4
  label?: string;
5
5
  family?: AtomFamily<Value, FamilyKey>;
6
6
  familyKey?: FamilyKey;
7
+ onMount?: () => MountRes;
8
+ onUnmount?: (mountRes?: MountRes) => void;
7
9
  };
@@ -1,5 +1,5 @@
1
1
  import type { Atom } from "./Atom";
2
2
  export type AtomFamily<Value, Key> = {
3
- (key: Key, defaultOverride?: any): Atom<Value, Key>;
3
+ (key: Key, defaultOverride?: any): Atom<Value>;
4
4
  _map: Map<Key, Atom<Value, Key>>;
5
5
  };
@@ -1,3 +1,3 @@
1
1
  import type { SelectorFamily } from "./SelectorFamily";
2
2
  import type { AtomFamily } from "./AtomFamily";
3
- export type Family<V, K> = AtomFamily<V, K> | SelectorFamily<V, K>;
3
+ export type Family<V, K = any> = AtomFamily<V, K> | SelectorFamily<V, K>;
@@ -1,2 +1,2 @@
1
1
  import type { State } from "./State";
2
- export type GetValue = <V>(state: State<V>) => V;
2
+ export type GetValue = <V>(state: State<V>) => V | Promise<V>;
@@ -1,4 +1,8 @@
1
- export type Selector<V = any> = {
2
- get: () => {};
1
+ import type { GetValue } from "./GetValue";
2
+ import type { SelectorFamily } from "./SelectorFamily";
3
+ export type Selector<Value = any, FamilyKey = undefined> = {
4
+ get: (get: GetValue) => Value;
3
5
  debugLabel?: string;
6
+ family?: SelectorFamily<Value, FamilyKey>;
7
+ familyKey?: FamilyKey;
4
8
  };
@@ -1 +1,5 @@
1
- export type SelectorFamily<A, V> = {};
1
+ import type { Selector } from "./Selector";
2
+ export type SelectorFamily<Value, Key> = {
3
+ (key: Key, defaultOverride?: any): Selector<Value>;
4
+ _map: Map<Key, Selector<Value, Key>>;
5
+ };
@@ -1,2 +1,2 @@
1
1
  import type { Atom } from "./Atom";
2
- export type SetAtom = <V>(atom: Atom<V>, value: V) => void;
2
+ export type SetAtom = <V>(atom: Atom<V>, value: V | ((current: V) => V)) => void;
@@ -1,7 +1,9 @@
1
1
  export type StoreData = {
2
2
  id: string;
3
3
  values: WeakMap<WeakKey, any>;
4
- subscriptions: WeakMap<WeakKey, any>;
4
+ expiredValues: WeakMap<WeakKey, any>;
5
+ subscriptions: WeakMap<WeakKey, Set<any>>;
6
+ subscriptionsRequireEqualCheck: WeakMap<WeakKey, boolean>;
5
7
  stateConsumers: WeakMap<WeakKey, any>;
6
8
  stateDependencies: WeakMap<WeakKey, any>;
7
9
  };
@@ -1,2 +1,2 @@
1
1
  import type { State } from "./State";
2
- export type SubscribeFn = <V>(state: State<V>, callback: () => void) => () => void;
2
+ export type SubscribeFn = <V>(state: State<V>, callback: () => void, requireDeepEqualCheckBeforeCallback?: boolean) => () => void;
@@ -1,2 +1,3 @@
1
+ import type { Atom } from "../types/Atom";
1
2
  import type { State } from "../types/State";
2
- export declare const isAtom: (state: State) => boolean;
3
+ export declare const isAtom: (state: State) => state is Atom;
@@ -1 +1 @@
1
- export declare const isPromiseLike: (object: any) => boolean;
1
+ export declare const isPromiseLike: <T>(object: any) => object is Promise<T>;
@@ -1,3 +1,2 @@
1
1
  import type { Selector } from "../types/Selector";
2
- import type { State } from "../types/State";
3
- export declare const isSelector: (state: State) => state is Selector;
2
+ export declare const isSelector: (state: any) => state is Selector;
@@ -0,0 +1,2 @@
1
+ export declare const wait: (ms: number) => Promise<unknown>;
2
+ export declare const waitCrash: (ms: number) => Promise<unknown>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valdres",
3
- "version": "0.2.0-alpha.0",
3
+ "version": "0.2.0-alpha.2",
4
4
  "license": "MIT",
5
5
  "author": {
6
6
  "name": "Eigil Sagafos"
@@ -15,7 +15,7 @@
15
15
  ],
16
16
  "scripts": {
17
17
  "build": "NODE_ENV=production bun scripts/build.ts",
18
- "build:types": "tsc index.ts --declaration --emitDeclarationOnly --outDir dist",
18
+ "build:types": "tsc",
19
19
  "test": "bun test"
20
20
  },
21
21
  "dependencies": {
@@ -23,6 +23,7 @@
23
23
  },
24
24
  "devDependencies": {
25
25
  "@testing-library/react-hooks": "8.0.1",
26
+ "jotai": "2.10.0",
26
27
  "mitata": "0.1.14",
27
28
  "react": ">=18",
28
29
  "react-dom": ">=18",
@@ -33,5 +34,5 @@
33
34
  "access": "public",
34
35
  "registry": "https://registry.npmjs.org/"
35
36
  },
36
- "gitHead": "ec1d460976eb7aa8b97c5def2c39bc406670d74c"
37
+ "gitHead": "4f2355214e1e4d2cf9011705733b18ab425f8d20"
37
38
  }
package/dist/index.d.ts DELETED
@@ -1,14 +0,0 @@
1
- export { atom } from "./src/atom";
2
- export { atomFamily } from "./src/atomFamily";
3
- export { createStore } from "./src/createStore";
4
- export { getDefaultStore, resetDefaultStore } from "./src/getDefaultStore";
5
- export { selector } from "./src/selector";
6
- export { selectorFamily } from "./src/selectorFamily";
7
- export { isAtom } from "./src/utils/isAtom";
8
- export { isSelector } from "./src/utils/isSelector";
9
- export { isFamily } from "./src/utils/isFamily";
10
- export { isPromiseLike } from "./src/utils/isPromiseLike";
11
- export type { Atom } from "./src/types/Atom";
12
- export type { Selector } from "./src/types/Selector";
13
- export type { State } from "./src/types/State";
14
- export type { Store } from "./src/types/Store";