@legendapp/state 2.2.0-next.7 → 2.2.0-next.71

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 (298) hide show
  1. package/README.md +4 -2
  2. package/babel.js.map +1 -1
  3. package/config/enable$get.d.ts +8 -0
  4. package/config/enable$get.js +24 -0
  5. package/config/enable$get.js.map +1 -0
  6. package/config/enable$get.mjs +21 -0
  7. package/config/enable$get.mjs.map +1 -0
  8. package/config/enableReactComponents.js.map +1 -1
  9. package/config/enableReactComponents.mjs.map +1 -1
  10. package/config/enableReactNativeComponents.js.map +1 -1
  11. package/config/enableReactNativeComponents.mjs.map +1 -1
  12. package/config/enableReactTracking.d.ts +0 -9
  13. package/config/enableReactTracking.js.map +1 -1
  14. package/config/enableReactTracking.mjs.map +1 -1
  15. package/config/enableReactUse.d.ts +1 -1
  16. package/config/enableReactUse.js +1 -0
  17. package/config/enableReactUse.js.map +1 -1
  18. package/config/enableReactUse.mjs +1 -0
  19. package/config/enableReactUse.mjs.map +1 -1
  20. package/config/enable_peek.d.ts +8 -0
  21. package/config/{enableDirectPeek.js → enable_peek.js} +6 -3
  22. package/config/enable_peek.js.map +1 -0
  23. package/config/{enableDirectPeek.mjs → enable_peek.mjs} +5 -3
  24. package/config/enable_peek.mjs.map +1 -0
  25. package/helpers/fetch.d.ts +4 -3
  26. package/helpers/fetch.js.map +1 -1
  27. package/helpers/fetch.mjs.map +1 -1
  28. package/helpers/pageHash.js.map +1 -1
  29. package/helpers/pageHash.mjs.map +1 -1
  30. package/helpers/pageHashParams.js.map +1 -1
  31. package/helpers/pageHashParams.mjs.map +1 -1
  32. package/helpers/time.d.ts +2 -2
  33. package/helpers/time.js.map +1 -1
  34. package/helpers/time.mjs.map +1 -1
  35. package/history.js +2 -2
  36. package/history.js.map +1 -1
  37. package/history.mjs +3 -3
  38. package/history.mjs.map +1 -1
  39. package/index.d.ts +30 -9
  40. package/index.js +877 -661
  41. package/index.js.map +1 -1
  42. package/index.mjs +874 -658
  43. package/index.mjs.map +1 -1
  44. package/package.json +22 -25
  45. package/persist-plugins/async-storage.d.ts +3 -3
  46. package/persist-plugins/async-storage.js +8 -7
  47. package/persist-plugins/async-storage.js.map +1 -1
  48. package/persist-plugins/async-storage.mjs +9 -8
  49. package/persist-plugins/async-storage.mjs.map +1 -1
  50. package/persist-plugins/fetch.js.map +1 -1
  51. package/persist-plugins/fetch.mjs.map +1 -1
  52. package/persist-plugins/firebase.d.ts +1 -1
  53. package/persist-plugins/firebase.js +12 -11
  54. package/persist-plugins/firebase.js.map +1 -1
  55. package/persist-plugins/firebase.mjs +13 -12
  56. package/persist-plugins/firebase.mjs.map +1 -1
  57. package/persist-plugins/indexeddb.d.ts +10 -10
  58. package/persist-plugins/indexeddb.js +2 -2
  59. package/persist-plugins/indexeddb.js.map +1 -1
  60. package/persist-plugins/indexeddb.mjs +2 -2
  61. package/persist-plugins/indexeddb.mjs.map +1 -1
  62. package/persist-plugins/local-storage.d.ts +3 -4
  63. package/persist-plugins/local-storage.js +19 -7
  64. package/persist-plugins/local-storage.js.map +1 -1
  65. package/persist-plugins/local-storage.mjs +20 -9
  66. package/persist-plugins/local-storage.mjs.map +1 -1
  67. package/persist-plugins/mmkv.d.ts +8 -8
  68. package/persist-plugins/mmkv.js +5 -4
  69. package/persist-plugins/mmkv.js.map +1 -1
  70. package/persist-plugins/mmkv.mjs +6 -5
  71. package/persist-plugins/mmkv.mjs.map +1 -1
  72. package/persist-plugins/query.js.map +1 -1
  73. package/persist-plugins/query.mjs.map +1 -1
  74. package/persist.d.ts +2 -14
  75. package/persist.js +1250 -268
  76. package/persist.js.map +1 -1
  77. package/persist.mjs +1250 -269
  78. package/persist.mjs.map +1 -1
  79. package/react-hooks/createObservableHook.js +1 -1
  80. package/react-hooks/createObservableHook.js.map +1 -1
  81. package/react-hooks/createObservableHook.mjs +1 -1
  82. package/react-hooks/createObservableHook.mjs.map +1 -1
  83. package/react-hooks/useFetch.d.ts +4 -3
  84. package/react-hooks/useFetch.js.map +1 -1
  85. package/react-hooks/useFetch.mjs.map +1 -1
  86. package/react-hooks/useHover.js.map +1 -1
  87. package/react-hooks/useHover.mjs.map +1 -1
  88. package/react-hooks/useMeasure.js.map +1 -1
  89. package/react-hooks/useMeasure.mjs.map +1 -1
  90. package/react-hooks/useObservableNextRouter.js.map +1 -1
  91. package/react-hooks/useObservableNextRouter.mjs.map +1 -1
  92. package/react-hooks/useObservableQuery.js.map +1 -1
  93. package/react-hooks/useObservableQuery.mjs.map +1 -1
  94. package/react-hooks/usePersistedObservable.d.ts +5 -3
  95. package/react-hooks/usePersistedObservable.js +5 -2
  96. package/react-hooks/usePersistedObservable.js.map +1 -1
  97. package/react-hooks/usePersistedObservable.mjs +5 -2
  98. package/react-hooks/usePersistedObservable.mjs.map +1 -1
  99. package/react.js +61 -75
  100. package/react.js.map +1 -1
  101. package/react.mjs +61 -75
  102. package/react.mjs.map +1 -1
  103. package/src/ObservableObject.ts +1184 -0
  104. package/src/ObservablePrimitive.ts +62 -0
  105. package/src/babel/index.ts +70 -0
  106. package/src/batching.ts +372 -0
  107. package/src/computed.ts +16 -0
  108. package/src/config/enable$get.ts +30 -0
  109. package/src/config/enableReactComponents.ts +26 -0
  110. package/src/config/enableReactNativeComponents.ts +102 -0
  111. package/src/config/enableReactTracking.ts +60 -0
  112. package/src/config/enableReactUse.ts +23 -0
  113. package/src/config/enable_peek.ts +31 -0
  114. package/src/config.ts +47 -0
  115. package/src/createObservable.ts +46 -0
  116. package/src/event.ts +26 -0
  117. package/src/globals.ts +224 -0
  118. package/src/helpers/fetch.ts +26 -0
  119. package/src/helpers/pageHash.ts +41 -0
  120. package/src/helpers/pageHashParams.ts +55 -0
  121. package/src/helpers/time.ts +30 -0
  122. package/src/helpers.ts +221 -0
  123. package/src/history/trackHistory.ts +29 -0
  124. package/src/is.ts +56 -0
  125. package/src/linked.ts +6 -0
  126. package/src/observable.ts +32 -0
  127. package/src/observableInterfaces.ts +165 -0
  128. package/src/observableTypes.ts +221 -0
  129. package/src/observe.ts +89 -0
  130. package/src/onChange.ts +136 -0
  131. package/src/persist/configureObservablePersistence.ts +7 -0
  132. package/src/persist/fieldTransformer.ts +149 -0
  133. package/src/persist/observablePersistRemoteFunctionsAdapter.ts +39 -0
  134. package/src/persist/persistObservable.ts +1029 -0
  135. package/src/persist-plugins/async-storage.ts +102 -0
  136. package/src/persist-plugins/fetch.ts +33 -0
  137. package/src/persist-plugins/firebase.ts +1050 -0
  138. package/src/persist-plugins/indexeddb.ts +433 -0
  139. package/src/persist-plugins/local-storage.ts +90 -0
  140. package/src/persist-plugins/mmkv.ts +90 -0
  141. package/src/persist-plugins/query.ts +133 -0
  142. package/src/persistTypes.ts +226 -0
  143. package/src/proxy.ts +28 -0
  144. package/src/react/Computed.tsx +7 -0
  145. package/src/react/For.tsx +116 -0
  146. package/src/react/Memo.tsx +4 -0
  147. package/src/react/Reactive.tsx +53 -0
  148. package/src/react/Show.tsx +33 -0
  149. package/src/react/Switch.tsx +43 -0
  150. package/src/react/react-globals.ts +3 -0
  151. package/src/react/{reactInterfaces.d.ts → reactInterfaces.ts} +15 -7
  152. package/src/react/reactive-observer.tsx +210 -0
  153. package/src/react/useComputed.ts +36 -0
  154. package/src/react/useEffectOnce.ts +41 -0
  155. package/src/react/useIsMounted.ts +16 -0
  156. package/src/react/useMount.ts +15 -0
  157. package/src/react/useObservable.ts +24 -0
  158. package/src/react/useObservableReducer.ts +52 -0
  159. package/src/react/useObservableState.ts +30 -0
  160. package/src/react/useObserve.ts +54 -0
  161. package/src/react/useObserveEffect.ts +40 -0
  162. package/src/react/usePauseProvider.tsx +13 -0
  163. package/src/react/useSelector.ts +167 -0
  164. package/src/react/useUnmount.ts +8 -0
  165. package/src/react/useWhen.ts +9 -0
  166. package/src/react-hooks/createObservableHook.ts +53 -0
  167. package/src/react-hooks/useFetch.ts +16 -0
  168. package/src/react-hooks/useHover.ts +40 -0
  169. package/src/react-hooks/useMeasure.ts +48 -0
  170. package/src/react-hooks/useObservableNextRouter.ts +137 -0
  171. package/src/react-hooks/useObservableQuery.ts +205 -0
  172. package/src/react-hooks/usePersistedObservable.ts +24 -0
  173. package/src/retry.ts +69 -0
  174. package/src/setupTracking.ts +26 -0
  175. package/src/sync/activateSyncedNode.ts +146 -0
  176. package/src/sync/configureObservableSync.ts +7 -0
  177. package/src/sync/syncHelpers.ts +15 -0
  178. package/src/sync/syncObservable.ts +989 -0
  179. package/src/sync/syncObservableAdapter.ts +30 -0
  180. package/src/sync/synced.ts +20 -0
  181. package/src/sync-plugins/fetch.ts +42 -0
  182. package/src/syncTypes.ts +163 -0
  183. package/src/trace/traceHelpers.ts +11 -0
  184. package/src/trace/useTraceListeners.ts +34 -0
  185. package/src/trace/useTraceUpdates.ts +24 -0
  186. package/src/trace/useVerifyNotTracking.ts +33 -0
  187. package/src/trace/useVerifyOneRender.ts +10 -0
  188. package/src/trackSelector.ts +52 -0
  189. package/src/tracking.ts +43 -0
  190. package/src/types/babel.d.ts +12 -0
  191. package/src/when.ts +70 -0
  192. package/sync-plugins/fetch.d.ts +11 -0
  193. package/sync-plugins/fetch.js +24 -0
  194. package/sync-plugins/fetch.js.map +1 -0
  195. package/sync-plugins/fetch.mjs +22 -0
  196. package/sync-plugins/fetch.mjs.map +1 -0
  197. package/sync.d.ts +8 -0
  198. package/sync.js +919 -0
  199. package/sync.js.map +1 -0
  200. package/sync.mjs +912 -0
  201. package/sync.mjs.map +1 -0
  202. package/trace.js +13 -10
  203. package/trace.js.map +1 -1
  204. package/trace.mjs +11 -8
  205. package/trace.mjs.map +1 -1
  206. package/types/babel.d.ts +3 -3
  207. package/config/enableDirectAccess.d.ts +0 -7
  208. package/config/enableDirectAccess.js +0 -25
  209. package/config/enableDirectAccess.js.map +0 -1
  210. package/config/enableDirectAccess.mjs +0 -23
  211. package/config/enableDirectAccess.mjs.map +0 -1
  212. package/config/enableDirectPeek.d.ts +0 -7
  213. package/config/enableDirectPeek.js.map +0 -1
  214. package/config/enableDirectPeek.mjs.map +0 -1
  215. package/config/enableReactDirectRender.d.ts +0 -2
  216. package/config/enableReactDirectRender.js +0 -78
  217. package/config/enableReactDirectRender.js.map +0 -1
  218. package/config/enableReactDirectRender.mjs +0 -75
  219. package/config/enableReactDirectRender.mjs.map +0 -1
  220. package/src/ObservableObject.d.ts +0 -14
  221. package/src/ObservablePrimitive.d.ts +0 -7
  222. package/src/babel/index.d.ts +0 -17
  223. package/src/batching.d.ts +0 -6
  224. package/src/computed.d.ts +0 -4
  225. package/src/config/enableDirectAccess.d.ts +0 -7
  226. package/src/config/enableDirectPeek.d.ts +0 -7
  227. package/src/config/enableReactComponents.d.ts +0 -7
  228. package/src/config/enableReactDirectRender.d.ts +0 -2
  229. package/src/config/enableReactNativeComponents.d.ts +0 -20
  230. package/src/config/enableReactTracking.d.ts +0 -15
  231. package/src/config/enableReactUse.d.ts +0 -7
  232. package/src/config.d.ts +0 -8
  233. package/src/createObservable.d.ts +0 -2
  234. package/src/event.d.ts +0 -2
  235. package/src/globals.d.ts +0 -32
  236. package/src/helpers/fetch.d.ts +0 -6
  237. package/src/helpers/pageHash.d.ts +0 -7
  238. package/src/helpers/pageHashParams.d.ts +0 -7
  239. package/src/helpers/time.d.ts +0 -3
  240. package/src/helpers.d.ts +0 -13
  241. package/src/history/trackHistory.d.ts +0 -4
  242. package/src/is.d.ts +0 -10
  243. package/src/observable.d.ts +0 -16
  244. package/src/observableInterfaces.d.ts +0 -456
  245. package/src/observe.d.ts +0 -6
  246. package/src/onChange.d.ts +0 -7
  247. package/src/persist/configureObservablePersistence.d.ts +0 -3
  248. package/src/persist/fieldTransformer.d.ts +0 -8
  249. package/src/persist/observablePersistRemoteFunctionsAdapter.d.ts +0 -2
  250. package/src/persist/persistActivateNode.d.ts +0 -1
  251. package/src/persist/persistHelpers.d.ts +0 -1
  252. package/src/persist/persistObservable.d.ts +0 -25
  253. package/src/persist-plugins/async-storage.d.ts +0 -14
  254. package/src/persist-plugins/fetch.d.ts +0 -10
  255. package/src/persist-plugins/firebase.d.ts +0 -51
  256. package/src/persist-plugins/indexeddb.d.ts +0 -25
  257. package/src/persist-plugins/local-storage.d.ts +0 -21
  258. package/src/persist-plugins/mmkv.d.ts +0 -14
  259. package/src/persist-plugins/query.d.ts +0 -18
  260. package/src/proxy.d.ts +0 -5
  261. package/src/react/Computed.d.ts +0 -5
  262. package/src/react/For.d.ts +0 -15
  263. package/src/react/Memo.d.ts +0 -3
  264. package/src/react/Reactive.d.ts +0 -9
  265. package/src/react/Show.d.ts +0 -18
  266. package/src/react/Switch.d.ts +0 -14
  267. package/src/react/react-globals.d.ts +0 -3
  268. package/src/react/reactive-observer.d.ts +0 -14
  269. package/src/react/useComputed.d.ts +0 -5
  270. package/src/react/useEffectOnce.d.ts +0 -1
  271. package/src/react/useIsMounted.d.ts +0 -2
  272. package/src/react/useMount.d.ts +0 -2
  273. package/src/react/useObservable.d.ts +0 -9
  274. package/src/react/useObservableReducer.d.ts +0 -7
  275. package/src/react/useObservableState.d.ts +0 -2
  276. package/src/react/useObserve.d.ts +0 -4
  277. package/src/react/useObserveEffect.d.ts +0 -4
  278. package/src/react/usePauseProvider.d.ts +0 -8
  279. package/src/react/useSelector.d.ts +0 -3
  280. package/src/react/useUnmount.d.ts +0 -2
  281. package/src/react/useWhen.d.ts +0 -3
  282. package/src/react-hooks/createObservableHook.d.ts +0 -2
  283. package/src/react-hooks/useFetch.d.ts +0 -6
  284. package/src/react-hooks/useHover.d.ts +0 -3
  285. package/src/react-hooks/useMeasure.d.ts +0 -6
  286. package/src/react-hooks/useObservableNextRouter.d.ts +0 -33
  287. package/src/react-hooks/useObservableQuery.d.ts +0 -6
  288. package/src/react-hooks/usePersistedObservable.d.ts +0 -11
  289. package/src/retry.d.ts +0 -9
  290. package/src/setupTracking.d.ts +0 -2
  291. package/src/trace/traceHelpers.d.ts +0 -2
  292. package/src/trace/useTraceListeners.d.ts +0 -1
  293. package/src/trace/useTraceUpdates.d.ts +0 -1
  294. package/src/trace/useVerifyNotTracking.d.ts +0 -1
  295. package/src/trace/useVerifyOneRender.d.ts +0 -1
  296. package/src/trackSelector.d.ts +0 -7
  297. package/src/tracking.d.ts +0 -13
  298. package/src/when.d.ts +0 -3
@@ -0,0 +1,24 @@
1
+ import { Observable, ObservableParam, LegacyPersistOptions, observable } from '@legendapp/state';
2
+ import { persistObservable } from '@legendapp/state/persist';
3
+ import { useMemo } from 'react';
4
+
5
+ // TODO: Deprecate this
6
+
7
+ /**
8
+ * A React hook that creates a new observable and can optionally listen or persist its state.
9
+ *
10
+ * @param initialValue The initial value of the observable or a function that returns the initial value
11
+ * @param options Persistence options for the observable
12
+ *
13
+ * @see https://www.legendapp.com/dev/state/react/#useObservable
14
+ */
15
+ export function usePersistedObservable<T>(params: {
16
+ options: LegacyPersistOptions<T>;
17
+ initialValue?: T | (() => T) | (() => Promise<T>);
18
+ }): Observable<T> {
19
+ // Create the observable from the default value
20
+ return useMemo(() => {
21
+ const obs$ = observable<T>(params.initialValue as any);
22
+ persistObservable<T>(obs$ as ObservableParam<T>, params.options);
23
+ }, []) as any;
24
+ }
package/src/retry.ts ADDED
@@ -0,0 +1,69 @@
1
+ import { whenReady } from './when';
2
+ import type { NodeValue, RetryOptions } from './observableInterfaces';
3
+ import { isPromise } from './is';
4
+
5
+ function calculateRetryDelay(retryOptions: RetryOptions, attemptNum: number): number | null {
6
+ const { backoff, delay = 1000, infinite, times = 3, maxDelay = 30000 } = retryOptions;
7
+ if (infinite || attemptNum < times) {
8
+ const delayTime = Math.min(delay * (backoff === 'constant' ? 1 : 2 ** attemptNum), maxDelay);
9
+ return delayTime;
10
+ }
11
+ return null;
12
+ }
13
+
14
+ function createRetryTimeout(retryOptions: RetryOptions, attemptNum: number, fn: () => void) {
15
+ const delayTime = calculateRetryDelay(retryOptions, attemptNum);
16
+ if (delayTime) {
17
+ return setTimeout(fn, delayTime);
18
+ }
19
+ }
20
+
21
+ export function runWithRetry<T>(
22
+ node: NodeValue,
23
+ state: { attemptNum: number },
24
+ fn: (e: { cancel?: boolean }) => T | Promise<T>,
25
+ ): T | Promise<T> {
26
+ const { retry, waitFor } = node.activationState!;
27
+
28
+ const e = { cancel: false };
29
+ let value: any = undefined;
30
+ if (waitFor) {
31
+ value = whenReady(waitFor, () => {
32
+ node.activationState!.waitFor = undefined;
33
+ return fn(e);
34
+ });
35
+ } else {
36
+ value = fn(e);
37
+ }
38
+
39
+ if (isPromise(value) && retry) {
40
+ let timeoutRetry: any;
41
+ return new Promise<any>((resolve) => {
42
+ const run = () => {
43
+ (value as Promise<any>)
44
+ .then((val: any) => {
45
+ node.activationState!.persistedRetry = false;
46
+ resolve(val);
47
+ })
48
+ .catch(() => {
49
+ state.attemptNum++;
50
+ if (timeoutRetry) {
51
+ clearTimeout(timeoutRetry);
52
+ }
53
+ if (!e.cancel) {
54
+ timeoutRetry = createRetryTimeout(retry, state.attemptNum, () => {
55
+ value = fn(e);
56
+ run();
57
+ });
58
+ }
59
+ })
60
+ .finally(() => {
61
+ node.activationState!.persistedRetry = false;
62
+ });
63
+ };
64
+ run();
65
+ });
66
+ }
67
+
68
+ return value;
69
+ }
@@ -0,0 +1,26 @@
1
+ import type { ListenerFn, NodeValue, TrackingNode } from './observableInterfaces';
2
+ import { onChange } from './onChange';
3
+
4
+ export function setupTracking(
5
+ nodes: Map<NodeValue, TrackingNode> | undefined,
6
+ update: ListenerFn,
7
+ noArgs?: boolean,
8
+ immediate?: boolean,
9
+ ) {
10
+ let listeners: (() => void)[] | undefined = [];
11
+
12
+ // Listen to tracked nodes
13
+ nodes?.forEach((tracked) => {
14
+ const { node, track } = tracked;
15
+ listeners!.push(onChange(node, update, { trackingType: track, immediate, noArgs }));
16
+ });
17
+
18
+ return () => {
19
+ if (listeners) {
20
+ for (let i = 0; i < listeners.length; i++) {
21
+ listeners[i]();
22
+ }
23
+ listeners = undefined;
24
+ }
25
+ };
26
+ }
@@ -0,0 +1,146 @@
1
+ import type {
2
+ GetMode,
3
+ NodeValue,
4
+ Observable,
5
+ ObservableOnChangeParams,
6
+ ObservablePersistState,
7
+ ObservableSyncFunctions,
8
+ ObservableSyncGetParams,
9
+ ObservableSyncSetParams,
10
+ SyncedGetParams,
11
+ SyncedSetParams,
12
+ UpdateFn,
13
+ } from '@legendapp/state';
14
+ import { internal, isFunction, isPromise, mergeIntoObservable, when, whenReady } from '@legendapp/state';
15
+ import { syncObservable } from './syncObservable';
16
+ const { getProxy, globalState, runWithRetry, symbolLinked, setNodeValue, getNodeValue } = internal;
17
+
18
+ export function enableActivateSyncedNode() {
19
+ globalState.activateSyncedNode = function activateSyncedNode(node: NodeValue, newValue: any) {
20
+ const obs$ = getProxy(node);
21
+ if (node.activationState) {
22
+ // If it is a Synced
23
+ const { get, initial, set, subscribe } = node.activationState!;
24
+
25
+ let onChange: UpdateFn | undefined = undefined;
26
+ const pluginRemote: ObservableSyncFunctions = {};
27
+ let promiseReturn: any = undefined;
28
+
29
+ // Not sure why this disable is needed, but it's needed to make the linter happy
30
+ // eslint-disable-next-line prefer-const
31
+ let syncState: Observable<ObservablePersistState>;
32
+ const refresh = () => syncState?.sync();
33
+
34
+ if (get) {
35
+ pluginRemote.get = (params: ObservableSyncGetParams<any>) => {
36
+ onChange = params.onChange;
37
+ const updateLastSync = (lastSync: number) => (params.lastSync = lastSync);
38
+ const setMode = (mode: GetMode) => (params.mode = mode);
39
+
40
+ const existingValue = getNodeValue(node);
41
+ const value = runWithRetry(node, { attemptNum: 0 }, () => {
42
+ return get!({
43
+ value:
44
+ isFunction(existingValue) || existingValue?.[symbolLinked] ? undefined : existingValue,
45
+ lastSync: params.lastSync!,
46
+ updateLastSync,
47
+ setMode,
48
+ refresh,
49
+ });
50
+ });
51
+
52
+ promiseReturn = value;
53
+
54
+ return value;
55
+ };
56
+ }
57
+ if (set) {
58
+ // TODO: Work out these types better
59
+ pluginRemote.set = async (params: ObservableSyncSetParams<any>) => {
60
+ if (node.state?.isLoaded.get()) {
61
+ const retryAttempts = { attemptNum: 0 };
62
+ return runWithRetry(node, retryAttempts, async (retryEvent) => {
63
+ let changes = {};
64
+ let maxModified = 0;
65
+ if (!node.state!.isLoaded.peek()) {
66
+ await whenReady(node.state!.isLoaded);
67
+ }
68
+
69
+ const cancelRetry = () => {
70
+ retryEvent.cancel = true;
71
+ };
72
+
73
+ await set({
74
+ ...(params as unknown as SyncedSetParams<any>),
75
+ node,
76
+ update: (params) => {
77
+ const { value, lastSync } = params;
78
+ maxModified = Math.max(lastSync || 0, maxModified);
79
+ changes = mergeIntoObservable(changes, value);
80
+ },
81
+ retryNum: retryAttempts.attemptNum,
82
+ cancelRetry,
83
+ refresh,
84
+ fromSubscribe: false,
85
+ });
86
+ return { changes, lastSync: maxModified || undefined };
87
+ });
88
+ }
89
+ };
90
+ }
91
+
92
+ const nodeVal = getNodeValue(node);
93
+ if (promiseReturn !== undefined) {
94
+ newValue = promiseReturn;
95
+ } else if (nodeVal !== undefined && !isFunction(nodeVal)) {
96
+ newValue = nodeVal;
97
+ } else {
98
+ newValue = initial;
99
+ }
100
+ setNodeValue(node, promiseReturn ? undefined : newValue);
101
+
102
+ // @ts-expect-error TODO fix these types
103
+ syncState = syncObservable(obs$, { ...node.activationState, ...pluginRemote });
104
+
105
+ if (subscribe) {
106
+ when(promiseReturn || true, () => {
107
+ subscribe({
108
+ node,
109
+ update: (params: ObservableOnChangeParams) => {
110
+ if (!onChange) {
111
+ // TODO: Make this message better
112
+ console.log('[legend-state] Cannot update immediately before the first return');
113
+ } else {
114
+ onChange(params);
115
+ }
116
+ },
117
+ refresh,
118
+ });
119
+ });
120
+ }
121
+
122
+ return { update: onChange!, value: newValue };
123
+ } else {
124
+ // If it is not a Synced
125
+
126
+ let update: UpdateFn | undefined = undefined;
127
+ const get = async (params: SyncedGetParams) => {
128
+ update = params.refresh;
129
+ if (isPromise(newValue)) {
130
+ try {
131
+ newValue = await newValue;
132
+ } catch {
133
+ // TODO Once we have global retry settings this should retry
134
+ }
135
+ }
136
+ return newValue;
137
+ };
138
+
139
+ syncObservable(obs$, {
140
+ get,
141
+ });
142
+
143
+ return { update: update!, value: newValue };
144
+ }
145
+ };
146
+ }
@@ -0,0 +1,7 @@
1
+ import type { SyncedOptionsGlobal } from '@legendapp/state';
2
+
3
+ export const observableSyncConfiguration: SyncedOptionsGlobal = {};
4
+
5
+ export function configureObservableSync(options?: SyncedOptionsGlobal) {
6
+ Object.assign(observableSyncConfiguration, options);
7
+ }
@@ -0,0 +1,15 @@
1
+ import { isObject } from '@legendapp/state';
2
+
3
+ export function removeNullUndefined<T extends Record<string, any>>(val: T) {
4
+ if (val) {
5
+ Object.keys(val).forEach((key) => {
6
+ const v = val[key];
7
+ if (v === null || v === undefined) {
8
+ delete val[key];
9
+ } else if (isObject(v)) {
10
+ removeNullUndefined(v);
11
+ }
12
+ });
13
+ }
14
+ return val;
15
+ }