@tamagui/use-store 1.52.6 → 1.52.8

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.
Files changed (45) hide show
  1. package/dist/cjs/helpers.js +5 -26
  2. package/dist/cjs/helpers.js.map +1 -1
  3. package/dist/cjs/index.js +2 -4
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/observe.js +159 -0
  6. package/dist/cjs/observe.js.map +6 -0
  7. package/dist/cjs/reaction.js +0 -80
  8. package/dist/cjs/reaction.js.map +2 -2
  9. package/dist/cjs/selector.js +64 -9
  10. package/dist/cjs/selector.js.map +1 -1
  11. package/dist/cjs/useStore.js +23 -13
  12. package/dist/cjs/useStore.js.map +1 -1
  13. package/dist/esm/helpers.js +5 -25
  14. package/dist/esm/helpers.js.map +1 -1
  15. package/dist/esm/index.js +1 -2
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/esm/observe.js +134 -0
  18. package/dist/esm/observe.js.map +6 -0
  19. package/dist/esm/reaction.js +0 -56
  20. package/dist/esm/reaction.js.map +2 -2
  21. package/dist/esm/selector.js +62 -8
  22. package/dist/esm/selector.js.map +1 -1
  23. package/dist/esm/useStore.js +21 -13
  24. package/dist/esm/useStore.js.map +1 -1
  25. package/package.json +5 -2
  26. package/src/helpers.tsx +7 -30
  27. package/src/index.ts +1 -2
  28. package/src/interfaces.tsx +2 -1
  29. package/src/{selector.tsx → observe.tsx} +73 -50
  30. package/src/useStore.tsx +28 -13
  31. package/types/helpers.d.ts +1 -2
  32. package/types/helpers.d.ts.map +1 -1
  33. package/types/index.d.ts +1 -2
  34. package/types/index.d.ts.map +1 -1
  35. package/types/interfaces.d.ts +2 -1
  36. package/types/interfaces.d.ts.map +1 -1
  37. package/types/observe.d.ts +6 -0
  38. package/types/observe.d.ts.map +1 -0
  39. package/types/reaction.d.ts +0 -3
  40. package/types/reaction.d.ts.map +1 -1
  41. package/types/selector.d.ts +5 -1
  42. package/types/selector.d.ts.map +1 -1
  43. package/types/useStore.d.ts +3 -0
  44. package/types/useStore.d.ts.map +1 -1
  45. package/src/reaction.tsx +0 -112
@@ -5,8 +5,6 @@ import { UNWRAP_PROXY } from './constants'
5
5
  import { StoreInfo } from './interfaces'
6
6
  import { trackStoresAccess } from './useStore'
7
7
 
8
- // TODO i think we can just replace reaction() with this, its not worse in any way
9
-
10
8
  const logUpdate =
11
9
  process.env.NODE_ENV === 'development'
12
10
  ? (fn: any, stores: any[], last: any, next: any) => {
@@ -26,57 +24,59 @@ const logUpdate =
26
24
  }
27
25
  : null
28
26
 
29
- // // TODO test this works the same as useSelector
30
- // export function selector(fn: () => any) {
31
- // let prev = runStoreSelector(fn)
32
- // let disposeValue: Function | null = null
33
- // const subscribe = () => {
34
- // return subscribeToStores([...prev.storeInfos], () => {
35
- // try {
36
- // disposeValue?.()
37
- // setIsInReaction(true)
38
- // const next = runStoreSelector(fn)
39
- // if (typeof next.value === 'function') {
40
- // disposeValue = next.value
41
- // if (process.env.NODE_ENV === 'development') {
42
- // logUpdate!(fn, [...next.storeInfos], '(fn)', '(fn)')
43
- // }
44
- // return
45
- // }
46
- // if (
47
- // isEqualSubsetShallow(prev.stores, next.stores) &&
48
- // isEqualSubsetShallow(prev.value, next.value)
49
- // ) {
50
- // return
51
- // }
52
- // if (process.env.NODE_ENV === 'development') {
53
- // logUpdate!(fn, [...next.stores], prev.value, next.value)
54
- // }
55
- // prev = next
56
- // dispose()
57
- // dispose = subscribe()
58
- // } finally {
59
- // setIsInReaction(false)
60
- // }
61
- // })
62
- // }
63
- // let dispose = subscribe()
64
- // return () => {
65
- // dispose()
66
- // disposeValue?.()
67
- // }
68
- // }
69
-
70
- export function useSelector<A>(fn: () => A): A {
27
+ export function observe(fn: () => any) {
28
+ let prev = getObserverValueAndStoresAccessed(fn)
29
+ let disposeValue: Function | null = null
30
+
31
+ const subscribe = () => {
32
+ const stores = [...prev.storeInfos]
33
+ return subscribeToStores(stores, () => {
34
+ disposeValue?.()
35
+ const next = getObserverValueAndStoresAccessed(fn)
36
+
37
+ if (typeof next.value === 'function') {
38
+ disposeValue = next.value
39
+ if (process.env.NODE_ENV === 'development') {
40
+ logUpdate!(fn, [...next.storeInfos], '(fn)', '(fn)')
41
+ }
42
+ return
43
+ }
44
+ if (
45
+ isEqualSubsetShallow(prev.storeInfos, next.storeInfos) &&
46
+ isEqualSubsetShallow(prev.value, next.value)
47
+ ) {
48
+ return
49
+ }
50
+ if (process.env.NODE_ENV === 'development') {
51
+ logUpdate!(fn, [...next.storeInfos], prev.value, next.value)
52
+ }
53
+ prev = next
54
+ dispose()
55
+ dispose = subscribe()
56
+ })
57
+ }
58
+
59
+ let dispose = subscribe()
60
+
61
+ return {
62
+ dispose: () => {
63
+ dispose()
64
+ disposeValue?.()
65
+ },
66
+ getValue: () => prev.value,
67
+ }
68
+ }
69
+
70
+ export function useObserve<A>(fn: () => A): A {
71
71
  const [state, setState] = useState(() => {
72
- return runStoreSelector(fn)
72
+ return getObserverValueAndStoresAccessed(fn)
73
73
  })
74
74
 
75
75
  useEffect(() => {
76
76
  let dispose
77
77
  const unsub = subscribeToStores([...state.storeInfos], () => {
78
78
  dispose?.()
79
- const next = runStoreSelector(fn)
79
+ const next = getObserverValueAndStoresAccessed(fn)
80
80
 
81
81
  const nextStoreInfos = [...next.storeInfos]
82
82
  const prevStoreInfos = [...state.storeInfos]
@@ -89,6 +89,7 @@ export function useSelector<A>(fn: () => A): A {
89
89
  dispose = next.value
90
90
  return
91
91
  }
92
+
92
93
  setState((prev) => {
93
94
  if (
94
95
  isEqualSubsetShallow(prevStoreInfos, nextStoreInfos) &&
@@ -102,6 +103,7 @@ export function useSelector<A>(fn: () => A): A {
102
103
  return next
103
104
  })
104
105
  })
106
+
105
107
  return () => {
106
108
  unsub()
107
109
  dispose?.()
@@ -111,7 +113,7 @@ export function useSelector<A>(fn: () => A): A {
111
113
  return state.value
112
114
  }
113
115
 
114
- function runStoreSelector<A>(selector: () => A): {
116
+ function getObserverValueAndStoresAccessed<A>(selector: () => A): {
115
117
  value: A
116
118
  storeInfos: Set<StoreInfo>
117
119
  } {
@@ -127,10 +129,31 @@ function runStoreSelector<A>(selector: () => A): {
127
129
  }
128
130
  }
129
131
 
130
- function subscribeToStores(stores: StoreInfo[], onUpdate: () => any) {
132
+ function subscribeToStores(storeInfos: StoreInfo[], onUpdate: () => any) {
131
133
  const disposes: Function[] = []
132
- for (const store of stores) {
133
- disposes.push(store.subscribe(onUpdate))
134
+
135
+ // wrap onUpdate to avoid waterfall calls + avoid tracking during onUpdate
136
+ let isUpdating = false
137
+ const onUpdateDebouncedWithoutTracking = () => {
138
+ if (isUpdating) return
139
+ isUpdating = true
140
+ queueMicrotask(() => {
141
+ try {
142
+ for (const storeInfo of storeInfos) {
143
+ storeInfo.disableTracking = true
144
+ }
145
+ onUpdate()
146
+ } finally {
147
+ isUpdating = false
148
+ for (const storeInfo of storeInfos) {
149
+ storeInfo.disableTracking = false
150
+ }
151
+ }
152
+ })
153
+ }
154
+
155
+ for (const storeInfo of storeInfos) {
156
+ disposes.push(storeInfo.subscribe(onUpdateDebouncedWithoutTracking))
134
157
  }
135
158
  return () => {
136
159
  disposes.forEach((x) => x())
package/src/useStore.tsx CHANGED
@@ -40,10 +40,7 @@ export function createStore<A, B extends Object>(
40
40
  props?: B,
41
41
  options?: UseStoreOptions<A, any>
42
42
  ): A {
43
- return getOrCreateStoreInfo(StoreKlass, props, {
44
- ...options,
45
- avoidCache: true,
46
- }).store as any
43
+ return getOrCreateStoreInfo(StoreKlass, props, options).store as any
47
44
  }
48
45
  // use singleton with react
49
46
  // TODO selector support with types...
@@ -128,6 +125,15 @@ export function getStore<A, B extends Object>(
128
125
  return getStoreInfo(StoreKlass, props).store as any
129
126
  }
130
127
 
128
+ export function getOrCreateStore<A, B extends Object>(
129
+ StoreKlass: (new (props: B) => A) | (new () => A),
130
+ props?: B
131
+ ): A {
132
+ return getOrCreateStoreInfo(StoreKlass, props, {
133
+ refuseCreation: false,
134
+ }).store as any
135
+ }
136
+
131
137
  // just like getOrCreateStoreInfo but refuses to create
132
138
  export function getStoreInfo(StoreKlass: any, props: any) {
133
139
  return getOrCreateStoreInfo(StoreKlass, props, {
@@ -135,6 +141,17 @@ export function getStoreInfo(StoreKlass: any, props: any) {
135
141
  })
136
142
  }
137
143
 
144
+ export type CreateStoreListener = (storeInfo: StoreInfo) => void
145
+
146
+ const onCreateListeners = new Set<CreateStoreListener>()
147
+
148
+ export function onCreateStore(cb: CreateStoreListener) {
149
+ onCreateListeners.add(cb)
150
+ return () => {
151
+ onCreateListeners.delete(cb)
152
+ }
153
+ }
154
+
138
155
  function getOrCreateStoreInfo(
139
156
  StoreKlass: any,
140
157
  props: any,
@@ -176,11 +193,12 @@ function getOrCreateStoreInfo(
176
193
  const listeners = new Set<Function>()
177
194
 
178
195
  const storeInfo = {
179
- uid: Math.random(),
196
+ uid,
180
197
  keyComparators,
181
198
  storeInstance,
182
199
  getters,
183
200
  stateKeys,
201
+ props,
184
202
  actions,
185
203
  debug: options?.debug,
186
204
  disableTracking: false,
@@ -228,6 +246,8 @@ function getOrCreateStoreInfo(
228
246
  // still set even when avoidCache is true (hmr)
229
247
  cache.set(uid, result)
230
248
 
249
+ onCreateListeners.forEach((cb) => cb(result))
250
+
231
251
  return result
232
252
  }
233
253
 
@@ -543,13 +563,8 @@ function createProxiedStore(storeInfo: StoreInfo) {
543
563
  if (key === UNWRAP_STORE_INFO) {
544
564
  return storeInfo
545
565
  }
546
- const trackingDisabled = storeInfo.disableTracking
547
- if (!trackingDisabled) {
548
- if (storeAccessTrackers.size && !storeAccessTrackers.has(storeInstance)) {
549
- for (const t of storeAccessTrackers) {
550
- t(storeInfo)
551
- }
552
- }
566
+ if (storeAccessTrackers.size) {
567
+ storeAccessTrackers.forEach((cb) => cb(storeInfo))
553
568
  }
554
569
  if (typeof key !== 'string') {
555
570
  return Reflect.get(storeInstance, key)
@@ -557,7 +572,7 @@ function createProxiedStore(storeInfo: StoreInfo) {
557
572
 
558
573
  // non-actions...
559
574
 
560
- if (!trackingDisabled) {
575
+ if (!storeInfo.disableTracking) {
561
576
  if (gettersState.isGetting) {
562
577
  gettersState.curGetKeys.add(key)
563
578
  } else {
@@ -1,12 +1,11 @@
1
1
  import { StoreInfo } from './interfaces';
2
- export declare function getStoreUid(Constructor: any, props: string | Object | void): string;
2
+ export declare function getStoreUid(Constructor: any, props: string | Object | void): any;
3
3
  export declare const UNWRAP_STORE_INFO: unique symbol;
4
4
  export declare const cache: Map<string, StoreInfo>;
5
5
  export declare function getStoreDescriptors(storeInstance: any): {
6
6
  [x: string]: TypedPropertyDescriptor<any> & PropertyDescriptor;
7
7
  };
8
8
  export declare function get<A>(_: A, b?: any): A extends new (props?: any) => infer B ? B : A;
9
- export declare function getKey(props: Object): string;
10
9
  export default function useConstant<T>(fn: () => T): T;
11
10
  export declare function simpleStr(arg: any): any;
12
11
  export declare function getStoreDebugInfo(store: any): any;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAUxC,wBAAgB,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,UAS1E;AAED,eAAO,MAAM,iBAAiB,eAA8B,CAAA;AAC5D,eAAO,MAAM,KAAK,wBAA+B,CAAA;AAEjD,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,GAAG;;EAWrD;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAEpF;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,UAYnC;AAID,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAMrD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,OAejC;AAGD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,OAI3C"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,wBAAgB,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,OAO1E;AAED,eAAO,MAAM,iBAAiB,eAA8B,CAAA;AAC5D,eAAO,MAAM,KAAK,wBAA+B,CAAA;AAEjD,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,GAAG;;EAWrD;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAEpF;AAID,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAMrD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,OAejC;AAGD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,OAI3C"}
package/types/index.d.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  export * from './useStore';
2
2
  export { configureUseStore } from './configureUseStore';
3
3
  export * from './interfaces';
4
- export * from './selector';
5
- export * from './reaction';
4
+ export * from './observe';
6
5
  export { UNWRAP_PROXY } from './constants';
7
6
  export * from './comparators';
8
7
  export * from './decorators';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAG5B,qBAAa,KAAK,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC/B,KAAK,EAAE,KAAK;gBAAZ,KAAK,EAAE,KAAK;CAChC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAG5B,qBAAa,KAAK,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC/B,KAAK,EAAE,KAAK;gBAAZ,KAAK,EAAE,KAAK;CAChC"}
@@ -11,11 +11,12 @@ export interface Store<Props = Record<string, any> | null | undefined> {
11
11
  props: Props;
12
12
  }
13
13
  export type StoreInfo<A = Store> = {
14
- uid: number;
14
+ uid: string;
15
15
  keyComparators?: {
16
16
  [key: string]: (a: any, b: any) => boolean;
17
17
  };
18
18
  store: A;
19
+ props: Record<string, any> | null;
19
20
  storeInstance: any;
20
21
  getters: {
21
22
  [key: string]: any;
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;AAE5D,MAAM,MAAM,gBAAgB,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAChE,MAAM,MAAM,eAAe,CAAC,KAAK,GAAG,GAAG,EAAE,WAAW,GAAG,GAAG,IAAI;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,WAAW,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS;IACnE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;IACzB,KAAK,EAAE,KAAK,CAAA;CACb;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,KAAK,IAAI;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,CAAC,EAAE;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,OAAO,CAAA;KAC3C,CAAA;IAED,KAAK,EAAE,CAAC,CAAA;IACR,aAAa,EAAE,GAAG,CAAA;IAClB,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;IAC/B,OAAO,EAAE,GAAG,CAAA;IACZ,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,YAAY,EAAE;QACZ,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC1B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACtC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QACvB,SAAS,EAAE,OAAO,CAAA;KACnB,CAAA;IACD,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;IAChD,aAAa,EAAE,QAAQ,CAAA;IACvB,eAAe,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;CACtC,CAAA"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;AAE5D,MAAM,MAAM,gBAAgB,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAA;AAChE,MAAM,MAAM,eAAe,CAAC,KAAK,GAAG,GAAG,EAAE,WAAW,GAAG,GAAG,IAAI;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,WAAW,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS;IACnE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;IACzB,KAAK,EAAE,KAAK,CAAA;CACb;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,KAAK,IAAI;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,CAAC,EAAE;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,OAAO,CAAA;KAC3C,CAAA;IAED,KAAK,EAAE,CAAC,CAAA;IACR,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACjC,aAAa,EAAE,GAAG,CAAA;IAClB,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;IAC/B,OAAO,EAAE,GAAG,CAAA;IACZ,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,YAAY,EAAE;QACZ,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC1B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACtC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QACvB,SAAS,EAAE,OAAO,CAAA;KACnB,CAAA;IACD,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;IAChD,aAAa,EAAE,QAAQ,CAAA;IACvB,eAAe,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;CACtC,CAAA"}
@@ -0,0 +1,6 @@
1
+ export declare function observe(fn: () => any): {
2
+ dispose: () => void;
3
+ getValue: () => any;
4
+ };
5
+ export declare function useObserve<A>(fn: () => A): A;
6
+ //# sourceMappingURL=observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../src/observe.tsx"],"names":[],"mappings":"AA0BA,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG;;;EAyCpC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CA4C5C"}
@@ -1,4 +1 @@
1
- import { StoreInfo } from './interfaces';
2
- export declare function useReaction<StoreInstance, Selector extends (a: StoreInstance) => any>(store: StoreInstance, selector: Selector, receiver: Selector extends (a: StoreInstance) => infer Derived ? (a: Derived) => any : unknown, props?: Record<string, any>, equalityFn?: (a: any, b: any) => boolean, memoArgs?: any[]): () => void;
3
- export declare function reaction<StoreInstance extends StoreInfo, Selector extends (a: StoreInstance) => any>({ store, subscribe }: StoreInstance, selector: Selector, receiver: Selector extends (a: StoreInstance) => infer Derived ? (a: Derived) => any : unknown, equalityFn?: (a: any, b: any) => boolean): () => void;
4
1
  //# sourceMappingURL=reaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../src/reaction.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AASxC,wBAAgB,WAAW,CAAC,aAAa,EAAE,QAAQ,SAAS,CAAC,CAAC,EAAE,aAAa,KAAK,GAAG,EACnF,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,SAAS,CAAC,CAAC,EAAE,aAAa,KAAK,MAAM,OAAO,GAC1D,CAAC,CAAC,EAAE,OAAO,KAAK,GAAG,GACnB,OAAO,EACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,UAAU,GAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,OAA8B,EAC9D,QAAQ,CAAC,EAAE,GAAG,EAAE,cAOjB;AAED,wBAAgB,QAAQ,CACtB,aAAa,SAAS,SAAS,EAC/B,QAAQ,SAAS,CAAC,CAAC,EAAE,aAAa,KAAK,GAAG,EAE1C,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,aAAa,EACnC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,SAAS,CAAC,CAAC,EAAE,aAAa,KAAK,MAAM,OAAO,GAC1D,CAAC,CAAC,EAAE,OAAO,KAAK,GAAG,GACnB,OAAO,EACX,UAAU,GAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,OAA8B,cAyC/D"}
1
+ {"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../src/reaction.tsx"],"names":[],"mappings":""}
@@ -1,2 +1,6 @@
1
- export declare function useSelector<A>(fn: () => A): A;
1
+ export declare function observe(fn: () => any): {
2
+ dispose: () => void;
3
+ getValue: () => any;
4
+ };
5
+ export declare function useObserve<A>(fn: () => A): A;
2
6
  //# sourceMappingURL=selector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selector.d.ts","sourceRoot":"","sources":["../src/selector.tsx"],"names":[],"mappings":"AAqEA,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CA0C7C"}
1
+ {"version":3,"file":"selector.d.ts","sourceRoot":"","sources":["../src/selector.tsx"],"names":[],"mappings":"AA0BA,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG;;;EAwCpC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CA4C5C"}
@@ -10,7 +10,10 @@ export declare function useStoreSelector<A extends Store<B>, B extends Object, S
10
10
  type StoreAccessTracker = (store: StoreInfo) => void;
11
11
  export declare function trackStoresAccess(cb: StoreAccessTracker): () => void;
12
12
  export declare function getStore<A, B extends Object>(StoreKlass: (new (props: B) => A) | (new () => A), props?: B): A;
13
+ export declare function getOrCreateStore<A, B extends Object>(StoreKlass: (new (props: B) => A) | (new () => A), props?: B): A;
13
14
  export declare function getStoreInfo(StoreKlass: any, props: any): StoreInfo;
15
+ export type CreateStoreListener = (storeInfo: StoreInfo) => void;
16
+ export declare function onCreateStore(cb: CreateStoreListener): () => void;
14
17
  export declare const allStores: {};
15
18
  export declare const setIsInReaction: (val: boolean) => void;
16
19
  export type StoreTracker = {
@@ -1 +1 @@
1
- {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../src/useStore.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../src/useStore.tsx"],"names":[],"mappings":"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"}
package/src/reaction.tsx DELETED
@@ -1,112 +0,0 @@
1
- import { useMemo } from 'react'
2
-
3
- import { isEqualSubsetShallow } from './comparators'
4
- import { UNWRAP_PROXY } from './constants'
5
- import { StoreInfo } from './interfaces'
6
- import { getStoreInfo, setIsInReaction } from './useStore'
7
-
8
- const dispose = (d: any) => {
9
- if (typeof d === 'function') {
10
- d()
11
- }
12
- }
13
-
14
- export function useReaction<StoreInstance, Selector extends (a: StoreInstance) => any>(
15
- store: StoreInstance,
16
- selector: Selector,
17
- receiver: Selector extends (a: StoreInstance) => infer Derived
18
- ? (a: Derived) => any
19
- : unknown,
20
- props?: Record<string, any>,
21
- equalityFn: (a: any, b: any) => boolean = isEqualSubsetShallow,
22
- memoArgs?: any[]
23
- ) {
24
- const storeInfo = getStoreInfo(store, props)
25
- return useMemo(
26
- () => reaction(storeInfo, selector as any, receiver, equalityFn),
27
- [memoArgs]
28
- )
29
- }
30
-
31
- export function reaction<
32
- StoreInstance extends StoreInfo,
33
- Selector extends (a: StoreInstance) => any
34
- >(
35
- { store, subscribe }: StoreInstance,
36
- selector: Selector,
37
- receiver: Selector extends (a: StoreInstance) => infer Derived
38
- ? (a: Derived) => any
39
- : unknown,
40
- equalityFn: (a: any, b: any) => boolean = isEqualSubsetShallow
41
- ) {
42
- let last: any = undefined
43
- let innerDispose: any
44
-
45
- function updateReaction() {
46
- try {
47
- setIsInReaction(true)
48
- const storeInstance = store[UNWRAP_PROXY] || store
49
- const next = selector(storeInstance)
50
- if (!equalityFn(last, next)) {
51
- if (process.env.NODE_ENV === 'development') {
52
- console.groupCollapsed(
53
- `🌑 ⏭ %c${receiver.name.padStart(24)} (${storeInstance.constructor.name}${
54
- store.props?.id ? `:${store.props.id}` : ''
55
- }) ${last} => ${next}`,
56
- 'color: chocolate;'
57
- )
58
- console.groupCollapsed('trace >')
59
- console.trace()
60
- console.groupEnd()
61
- // rome-ignore lint/nursery/noConsoleLog: <explanation>
62
- console.log(' ARG', next)
63
- console.groupEnd()
64
- }
65
- dispose(innerDispose)
66
- last = next
67
- innerDispose = receiver(next)
68
- }
69
- } finally {
70
- setIsInReaction(false)
71
- }
72
- }
73
-
74
- const disposeSubscribe = subscribe(updateReaction)
75
- updateReaction()
76
-
77
- return () => {
78
- disposeSubscribe()
79
- dispose(innerDispose)
80
- }
81
- }
82
-
83
- // start on simpler reaction
84
- // export function reaction2(fn: () => any): () => void {
85
- // let state = runStoreSelector(fn)
86
- // let disposeSubscribe
87
- // const disposePrev = () => {
88
- // // treat return functions as dispose
89
- // if (typeof state.value === 'function') {
90
- // state.value()
91
- // }
92
- // }
93
- // const dispose = () => {
94
- // disposeSubscribe?.()
95
- // disposePrev()
96
- // }
97
- // function update() {
98
- // dispose()
99
- // disposeSubscribe = subscribeToStores([...state.stores], () => {
100
- // const next = runStoreSelector(fn)
101
- // disposePrev()
102
- // if (!isEqualSubsetShallow(state.stores, next.stores)) {
103
- // state = next
104
- // update()
105
- // } else {
106
- // state = next
107
- // }
108
- // })
109
- // }
110
- // update()
111
- // return dispose
112
- // }