@legendapp/state 3.0.0-alpha.1 → 3.0.0-alpha.3

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 (327) hide show
  1. package/.DS_Store +0 -0
  2. package/CHANGELOG.md +1 -831
  3. package/LICENSE +1 -21
  4. package/README.md +1 -141
  5. package/as/arrayAsRecord.d.mts +5 -0
  6. package/as/arrayAsRecord.d.ts +5 -0
  7. package/as/arrayAsRecord.js +28 -0
  8. package/as/arrayAsRecord.mjs +26 -0
  9. package/as/arrayAsSet.d.mts +5 -0
  10. package/as/arrayAsSet.d.ts +5 -0
  11. package/as/arrayAsSet.js +13 -0
  12. package/as/arrayAsSet.mjs +11 -0
  13. package/as/arrayAsString.d.mts +5 -0
  14. package/as/arrayAsString.d.ts +5 -0
  15. package/as/arrayAsString.js +13 -0
  16. package/as/arrayAsString.mjs +11 -0
  17. package/as/numberAsString.d.mts +5 -0
  18. package/as/numberAsString.d.ts +5 -0
  19. package/as/numberAsString.js +13 -0
  20. package/as/numberAsString.mjs +11 -0
  21. package/as/recordAsArray.d.mts +5 -0
  22. package/as/recordAsArray.d.ts +5 -0
  23. package/as/recordAsArray.js +25 -0
  24. package/as/recordAsArray.mjs +23 -0
  25. package/as/recordAsString.d.mts +5 -0
  26. package/as/recordAsString.d.ts +5 -0
  27. package/as/recordAsString.js +13 -0
  28. package/as/recordAsString.mjs +11 -0
  29. package/as/setAsArray.d.mts +5 -0
  30. package/as/setAsArray.d.ts +5 -0
  31. package/as/setAsArray.js +13 -0
  32. package/as/setAsArray.mjs +11 -0
  33. package/as/setAsString.d.mts +5 -0
  34. package/as/setAsString.d.ts +5 -0
  35. package/as/setAsString.js +13 -0
  36. package/as/setAsString.mjs +11 -0
  37. package/as/stringAsArray.d.mts +5 -0
  38. package/as/stringAsArray.d.ts +5 -0
  39. package/as/stringAsArray.js +13 -0
  40. package/as/stringAsArray.mjs +11 -0
  41. package/as/stringAsNumber.d.mts +5 -0
  42. package/as/stringAsNumber.d.ts +5 -0
  43. package/as/stringAsNumber.js +16 -0
  44. package/as/stringAsNumber.mjs +14 -0
  45. package/as/stringAsRecord.d.mts +5 -0
  46. package/as/stringAsRecord.d.ts +5 -0
  47. package/as/stringAsRecord.js +15 -0
  48. package/as/stringAsRecord.mjs +13 -0
  49. package/as/stringAsSet.d.mts +5 -0
  50. package/as/stringAsSet.d.ts +5 -0
  51. package/as/stringAsSet.js +13 -0
  52. package/as/stringAsSet.mjs +11 -0
  53. package/babel.d.mts +21 -0
  54. package/babel.d.ts +21 -2
  55. package/babel.js +57 -53
  56. package/babel.mjs +65 -0
  57. package/config/enable$GetSet.js +13 -14
  58. package/config/enable$GetSet.mjs +13 -14
  59. package/config/enableReactComponents.d.mts +9 -0
  60. package/config/enableReactComponents.d.ts +4 -2
  61. package/config/enableReactComponents.js +13 -10
  62. package/config/enableReactComponents.mjs +13 -10
  63. package/config/enableReactNativeComponents.d.mts +22 -0
  64. package/config/enableReactNativeComponents.d.ts +6 -4
  65. package/config/enableReactNativeComponents.js +43 -47
  66. package/config/enableReactNativeComponents.mjs +43 -47
  67. package/config/enableReactTracking.d.mts +7 -0
  68. package/config/enableReactTracking.d.ts +3 -2
  69. package/config/enableReactTracking.js +33 -38
  70. package/config/enableReactTracking.mjs +33 -38
  71. package/config/enableReactUse.d.mts +10 -0
  72. package/config/enableReactUse.d.ts +4 -1
  73. package/config/enableReactUse.js +15 -14
  74. package/config/enableReactUse.mjs +15 -14
  75. package/config/{enable$GetSet.d.ts → enable_GetSet.d.mts} +4 -2
  76. package/config/enable_GetSet.d.ts +10 -0
  77. package/config/enable_PeekAssign.d.mts +10 -0
  78. package/config/enable_PeekAssign.d.ts +4 -2
  79. package/config/enable_PeekAssign.js +13 -14
  80. package/config/enable_PeekAssign.mjs +13 -14
  81. package/helpers/pageHash.d.mts +9 -0
  82. package/helpers/pageHash.d.ts +2 -0
  83. package/helpers/pageHash.js +25 -30
  84. package/helpers/pageHash.mjs +25 -30
  85. package/helpers/pageHashParams.d.mts +9 -0
  86. package/helpers/pageHashParams.d.ts +2 -0
  87. package/helpers/pageHashParams.js +34 -37
  88. package/helpers/pageHashParams.mjs +34 -37
  89. package/helpers/time.d.mts +6 -0
  90. package/helpers/time.d.ts +6 -3
  91. package/helpers/time.js +17 -17
  92. package/helpers/time.mjs +17 -17
  93. package/helpers/trackHistory.d.mts +6 -0
  94. package/helpers/trackHistory.d.ts +4 -2
  95. package/helpers/trackHistory.js +13 -16
  96. package/helpers/trackHistory.mjs +13 -16
  97. package/helpers/undoRedo.d.mts +37 -0
  98. package/helpers/undoRedo.d.ts +5 -3
  99. package/helpers/undoRedo.js +59 -94
  100. package/helpers/undoRedo.mjs +59 -94
  101. package/index.d.mts +404 -0
  102. package/index.d.ts +371 -28
  103. package/index.js +2015 -2166
  104. package/index.mjs +2015 -2166
  105. package/package.json +254 -195
  106. package/persist-plugins/async-storage.d.mts +18 -0
  107. package/persist-plugins/async-storage.d.ts +6 -3
  108. package/persist-plugins/async-storage.js +79 -86
  109. package/persist-plugins/async-storage.mjs +79 -86
  110. package/persist-plugins/indexeddb.d.mts +29 -0
  111. package/persist-plugins/indexeddb.d.ts +6 -3
  112. package/persist-plugins/indexeddb.js +331 -352
  113. package/persist-plugins/indexeddb.mjs +331 -352
  114. package/persist-plugins/local-storage.d.mts +23 -0
  115. package/persist-plugins/local-storage.d.ts +8 -5
  116. package/persist-plugins/local-storage.js +74 -76
  117. package/persist-plugins/local-storage.mjs +74 -76
  118. package/persist-plugins/mmkv.d.mts +18 -0
  119. package/persist-plugins/mmkv.d.ts +6 -3
  120. package/persist-plugins/mmkv.js +82 -86
  121. package/persist-plugins/mmkv.mjs +82 -86
  122. package/react-hooks/createObservableHook.d.mts +5 -0
  123. package/react-hooks/createObservableHook.d.ts +4 -1
  124. package/react-hooks/createObservableHook.js +29 -30
  125. package/react-hooks/createObservableHook.mjs +25 -30
  126. package/react-hooks/useHover.d.mts +5 -0
  127. package/react-hooks/useHover.d.ts +5 -3
  128. package/react-hooks/useHover.js +29 -29
  129. package/react-hooks/useHover.mjs +29 -29
  130. package/react-hooks/useMeasure.d.mts +9 -0
  131. package/react-hooks/useMeasure.d.ts +5 -2
  132. package/react-hooks/useMeasure.js +30 -32
  133. package/react-hooks/useMeasure.mjs +30 -32
  134. package/react-hooks/useObservableNextRouter.d.mts +35 -0
  135. package/react-hooks/useObservableNextRouter.d.ts +9 -7
  136. package/react-hooks/useObservableNextRouter.js +64 -77
  137. package/react-hooks/useObservableNextRouter.mjs +60 -77
  138. package/react.d.mts +157 -0
  139. package/react.d.ts +157 -21
  140. package/react.js +458 -749
  141. package/react.mjs +457 -752
  142. package/sync-plugins/crud.d.mts +54 -0
  143. package/sync-plugins/crud.d.ts +12 -10
  144. package/sync-plugins/crud.js +253 -270
  145. package/sync-plugins/crud.mjs +253 -270
  146. package/sync-plugins/fetch.d.mts +21 -0
  147. package/sync-plugins/fetch.d.ts +7 -4
  148. package/sync-plugins/fetch.js +50 -37
  149. package/sync-plugins/fetch.mjs +50 -37
  150. package/sync-plugins/keel.d.mts +108 -0
  151. package/sync-plugins/keel.d.ts +17 -15
  152. package/sync-plugins/keel.js +229 -462
  153. package/sync-plugins/keel.mjs +227 -464
  154. package/sync-plugins/supabase.d.mts +39 -0
  155. package/sync-plugins/supabase.d.ts +16 -14
  156. package/sync-plugins/supabase.js +128 -128
  157. package/sync-plugins/supabase.mjs +128 -128
  158. package/sync-plugins/tanstack-query.d.mts +14 -0
  159. package/sync-plugins/tanstack-query.d.ts +7 -4
  160. package/sync-plugins/tanstack-query.js +51 -57
  161. package/sync-plugins/tanstack-query.mjs +51 -57
  162. package/sync-plugins/tanstack-react-query.d.mts +8 -0
  163. package/sync-plugins/tanstack-react-query.d.ts +6 -1
  164. package/sync-plugins/tanstack-react-query.js +2 -2
  165. package/sync-plugins/tanstack-react-query.mjs +2 -2
  166. package/sync.d.mts +351 -0
  167. package/sync.d.ts +349 -9
  168. package/sync.js +910 -964
  169. package/sync.mjs +920 -974
  170. package/trace.d.mts +9 -0
  171. package/trace.d.ts +9 -4
  172. package/trace.js +72 -62
  173. package/trace.mjs +72 -62
  174. package/types/babel.d.ts +1 -12
  175. package/babel.js.map +0 -1
  176. package/config/enable$GetSet.js.map +0 -1
  177. package/config/enable$GetSet.mjs.map +0 -1
  178. package/config/enableReactComponents.js.map +0 -1
  179. package/config/enableReactComponents.mjs.map +0 -1
  180. package/config/enableReactNativeComponents.js.map +0 -1
  181. package/config/enableReactNativeComponents.mjs.map +0 -1
  182. package/config/enableReactTracking.js.map +0 -1
  183. package/config/enableReactTracking.mjs.map +0 -1
  184. package/config/enableReactUse.js.map +0 -1
  185. package/config/enableReactUse.mjs.map +0 -1
  186. package/config/enable_PeekAssign.js.map +0 -1
  187. package/config/enable_PeekAssign.mjs.map +0 -1
  188. package/helpers/pageHash.js.map +0 -1
  189. package/helpers/pageHash.mjs.map +0 -1
  190. package/helpers/pageHashParams.js.map +0 -1
  191. package/helpers/pageHashParams.mjs.map +0 -1
  192. package/helpers/time.js.map +0 -1
  193. package/helpers/time.mjs.map +0 -1
  194. package/helpers/trackHistory.js.map +0 -1
  195. package/helpers/trackHistory.mjs.map +0 -1
  196. package/helpers/undoRedo.js.map +0 -1
  197. package/helpers/undoRedo.mjs.map +0 -1
  198. package/history.d.ts +0 -1
  199. package/history.js +0 -24
  200. package/history.js.map +0 -1
  201. package/history.mjs +0 -22
  202. package/history.mjs.map +0 -1
  203. package/index.js.map +0 -1
  204. package/index.mjs.map +0 -1
  205. package/persist-plugins/async-storage.js.map +0 -1
  206. package/persist-plugins/async-storage.mjs.map +0 -1
  207. package/persist-plugins/indexeddb.js.map +0 -1
  208. package/persist-plugins/indexeddb.mjs.map +0 -1
  209. package/persist-plugins/local-storage.js.map +0 -1
  210. package/persist-plugins/local-storage.mjs.map +0 -1
  211. package/persist-plugins/mmkv.js.map +0 -1
  212. package/persist-plugins/mmkv.mjs.map +0 -1
  213. package/react-hooks/createObservableHook.js.map +0 -1
  214. package/react-hooks/createObservableHook.mjs.map +0 -1
  215. package/react-hooks/useHover.js.map +0 -1
  216. package/react-hooks/useHover.mjs.map +0 -1
  217. package/react-hooks/useMeasure.js.map +0 -1
  218. package/react-hooks/useMeasure.mjs.map +0 -1
  219. package/react-hooks/useObservableNextRouter.js.map +0 -1
  220. package/react-hooks/useObservableNextRouter.mjs.map +0 -1
  221. package/react.js.map +0 -1
  222. package/react.mjs.map +0 -1
  223. package/src/ObservableObject.ts +0 -1350
  224. package/src/ObservablePrimitive.ts +0 -62
  225. package/src/babel/index.ts +0 -83
  226. package/src/batching.ts +0 -357
  227. package/src/computed.ts +0 -18
  228. package/src/config/enable$GetSet.ts +0 -30
  229. package/src/config/enableReactComponents.ts +0 -26
  230. package/src/config/enableReactNativeComponents.ts +0 -102
  231. package/src/config/enableReactTracking.ts +0 -62
  232. package/src/config/enableReactUse.ts +0 -32
  233. package/src/config/enable_PeekAssign.ts +0 -31
  234. package/src/config.ts +0 -47
  235. package/src/createObservable.ts +0 -47
  236. package/src/event.ts +0 -26
  237. package/src/globals.ts +0 -235
  238. package/src/helpers/pageHash.ts +0 -41
  239. package/src/helpers/pageHashParams.ts +0 -55
  240. package/src/helpers/time.ts +0 -30
  241. package/src/helpers/trackHistory.ts +0 -29
  242. package/src/helpers/undoRedo.ts +0 -111
  243. package/src/helpers.ts +0 -231
  244. package/src/is.ts +0 -63
  245. package/src/linked.ts +0 -17
  246. package/src/observable.ts +0 -32
  247. package/src/observableInterfaces.ts +0 -151
  248. package/src/observableTypes.ts +0 -232
  249. package/src/observe.ts +0 -89
  250. package/src/old-plugins/firebase.ts +0 -1053
  251. package/src/onChange.ts +0 -146
  252. package/src/persist/configureObservablePersistence.ts +0 -7
  253. package/src/persist/fieldTransformer.ts +0 -149
  254. package/src/persist/observablePersistRemoteFunctionsAdapter.ts +0 -39
  255. package/src/persist/persistObservable.ts +0 -1034
  256. package/src/persist-plugins/async-storage.ts +0 -99
  257. package/src/persist-plugins/indexeddb.ts +0 -439
  258. package/src/persist-plugins/local-storage.ts +0 -86
  259. package/src/persist-plugins/mmkv.ts +0 -91
  260. package/src/proxy.ts +0 -28
  261. package/src/react/Computed.tsx +0 -8
  262. package/src/react/For.tsx +0 -116
  263. package/src/react/Memo.tsx +0 -4
  264. package/src/react/Reactive.tsx +0 -53
  265. package/src/react/Show.tsx +0 -33
  266. package/src/react/Switch.tsx +0 -43
  267. package/src/react/react-globals.ts +0 -3
  268. package/src/react/reactInterfaces.ts +0 -32
  269. package/src/react/reactive-observer.tsx +0 -210
  270. package/src/react/useComputed.ts +0 -36
  271. package/src/react/useEffectOnce.ts +0 -41
  272. package/src/react/useIsMounted.ts +0 -16
  273. package/src/react/useMount.ts +0 -15
  274. package/src/react/useObservable.ts +0 -24
  275. package/src/react/useObservableReducer.ts +0 -52
  276. package/src/react/useObservableState.ts +0 -30
  277. package/src/react/useObserve.ts +0 -54
  278. package/src/react/useObserveEffect.ts +0 -40
  279. package/src/react/usePauseProvider.tsx +0 -16
  280. package/src/react/useSelector.ts +0 -167
  281. package/src/react/useUnmount.ts +0 -8
  282. package/src/react/useWhen.ts +0 -9
  283. package/src/react-hooks/createObservableHook.ts +0 -53
  284. package/src/react-hooks/useHover.ts +0 -40
  285. package/src/react-hooks/useMeasure.ts +0 -48
  286. package/src/react-hooks/useObservableNextRouter.ts +0 -137
  287. package/src/retry.ts +0 -71
  288. package/src/setupTracking.ts +0 -26
  289. package/src/sync/activateSyncedNode.ts +0 -128
  290. package/src/sync/configureObservableSync.ts +0 -7
  291. package/src/sync/persistTypes.ts +0 -216
  292. package/src/sync/syncHelpers.ts +0 -180
  293. package/src/sync/syncObservable.ts +0 -1056
  294. package/src/sync/syncObservableAdapter.ts +0 -31
  295. package/src/sync/syncTypes.ts +0 -189
  296. package/src/sync/synced.ts +0 -21
  297. package/src/sync-plugins/crud.ts +0 -412
  298. package/src/sync-plugins/fetch.ts +0 -80
  299. package/src/sync-plugins/keel.ts +0 -495
  300. package/src/sync-plugins/supabase.ts +0 -249
  301. package/src/sync-plugins/tanstack-query.ts +0 -113
  302. package/src/sync-plugins/tanstack-react-query.ts +0 -12
  303. package/src/trace/traceHelpers.ts +0 -11
  304. package/src/trace/useTraceListeners.ts +0 -34
  305. package/src/trace/useTraceUpdates.ts +0 -24
  306. package/src/trace/useVerifyNotTracking.ts +0 -33
  307. package/src/trace/useVerifyOneRender.ts +0 -10
  308. package/src/trackSelector.ts +0 -52
  309. package/src/tracking.ts +0 -43
  310. package/src/types/babel.d.ts +0 -12
  311. package/src/when.ts +0 -75
  312. package/sync-plugins/crud.js.map +0 -1
  313. package/sync-plugins/crud.mjs.map +0 -1
  314. package/sync-plugins/fetch.js.map +0 -1
  315. package/sync-plugins/fetch.mjs.map +0 -1
  316. package/sync-plugins/keel.js.map +0 -1
  317. package/sync-plugins/keel.mjs.map +0 -1
  318. package/sync-plugins/supabase.js.map +0 -1
  319. package/sync-plugins/supabase.mjs.map +0 -1
  320. package/sync-plugins/tanstack-query.js.map +0 -1
  321. package/sync-plugins/tanstack-query.mjs.map +0 -1
  322. package/sync-plugins/tanstack-react-query.js.map +0 -1
  323. package/sync-plugins/tanstack-react-query.mjs.map +0 -1
  324. package/sync.js.map +0 -1
  325. package/sync.mjs.map +0 -1
  326. package/trace.js.map +0 -1
  327. package/trace.mjs.map +0 -1
@@ -1,288 +1,271 @@
1
1
  import { internal, isNullOrUndefined, getNodeValue } from '@legendapp/state';
2
2
  import { synced, deepEqual, diffObjects } from '@legendapp/state/sync';
3
3
 
4
- const { clone } = internal;
4
+ // src/sync-plugins/crud.ts
5
+ var { clone } = internal;
5
6
  function transformOut(data, transform) {
6
- return transform ? transform(clone(data)) : data;
7
+ return transform ? transform(clone(data)) : data;
7
8
  }
8
9
  function ensureId(obj, generateId) {
9
- if (!obj.id) {
10
- obj.id = generateId();
11
- }
12
- return obj.id;
10
+ if (!obj.id) {
11
+ obj.id = generateId();
12
+ }
13
+ return obj.id;
13
14
  }
14
15
  function onSavedCreatedUpdatedAt(mode, { saved, currentValue, isCreate, props }) {
15
- const savedOut = {};
16
- if (isCreate) {
17
- // Update with any fields that are currently undefined
18
- Object.keys(saved).forEach((key) => {
19
- if (isNullOrUndefined(currentValue[key])) {
20
- savedOut[key] = saved[key];
21
- }
22
- });
23
- }
24
- else if (mode === 'createdUpdatedAt') {
25
- // Update with any fields ending in createdAt or updatedAt
26
- Object.keys(saved).forEach((key) => {
27
- const k = key;
28
- const keyLower = key.toLowerCase();
29
- if ((key === props.fieldCreatedAt ||
30
- key === props.fieldUpdatedAt ||
31
- keyLower.endsWith('createdat') ||
32
- keyLower.endsWith('updatedat') ||
33
- keyLower.endsWith('created_at') ||
34
- keyLower.endsWith('updated_at')) &&
35
- saved[k] instanceof Date) {
36
- savedOut[k] = saved[k];
37
- }
38
- });
39
- }
40
- return savedOut;
16
+ const savedOut = {};
17
+ if (isCreate) {
18
+ Object.keys(saved).forEach((key) => {
19
+ if (isNullOrUndefined(currentValue[key])) {
20
+ savedOut[key] = saved[key];
21
+ }
22
+ });
23
+ } else if (mode === "createdUpdatedAt") {
24
+ Object.keys(saved).forEach((key) => {
25
+ const k = key;
26
+ const keyLower = key.toLowerCase();
27
+ if ((key === props.fieldCreatedAt || key === props.fieldUpdatedAt || keyLower.endsWith("createdat") || keyLower.endsWith("updatedat") || keyLower.endsWith("created_at") || keyLower.endsWith("updated_at")) && saved[k] instanceof Date) {
28
+ savedOut[k] = saved[k];
29
+ }
30
+ });
31
+ }
32
+ return savedOut;
41
33
  }
42
34
  function syncedCrud(props) {
43
- const { get: getFn, list: listFn, create: createFn, update: updateFn, delete: deleteFn, transform, fieldCreatedAt, fieldUpdatedAt, fieldDeleted, updatePartial, onSaved, onSavedUpdate, mode: modeParam, changesSince, generateId, ...rest } = props;
44
- let asType = props.as;
45
- if (!asType) {
46
- asType = (getFn ? 'value' : 'object');
35
+ const {
36
+ get: getFn,
37
+ list: listFn,
38
+ create: createFn,
39
+ update: updateFn,
40
+ delete: deleteFn,
41
+ transform,
42
+ fieldCreatedAt,
43
+ fieldUpdatedAt,
44
+ fieldDeleted,
45
+ updatePartial,
46
+ onSaved,
47
+ onSavedUpdate,
48
+ mode: modeParam,
49
+ changesSince,
50
+ generateId,
51
+ ...rest
52
+ } = props;
53
+ let asType = props.as;
54
+ if (!asType) {
55
+ asType = getFn ? "value" : "object";
56
+ }
57
+ const asMap = asType === "Map";
58
+ const asArray = asType === "array";
59
+ const get = getFn || listFn ? async (getParams) => {
60
+ const { updateLastSync, lastSync, value } = getParams;
61
+ if (listFn) {
62
+ const isLastSyncMode = changesSince === "last-sync";
63
+ if (isLastSyncMode && lastSync) {
64
+ getParams.mode = modeParam || (asType === "array" ? "append" : asType === "value" ? "set" : "assign");
65
+ }
66
+ const data = await listFn(getParams) || [];
67
+ let newLastSync = 0;
68
+ for (let i = 0; i < data.length; i++) {
69
+ const updated = data[i][fieldUpdatedAt] || data[i][fieldCreatedAt];
70
+ if (updated) {
71
+ newLastSync = Math.max(newLastSync, +new Date(updated));
72
+ }
73
+ }
74
+ if (newLastSync && newLastSync !== lastSync) {
75
+ updateLastSync(newLastSync);
76
+ }
77
+ let transformed = data;
78
+ if (transform == null ? void 0 : transform.load) {
79
+ transformed = await Promise.all(data.map((value2) => transform.load(value2, "get")));
80
+ }
81
+ if (asType === "value") {
82
+ return transformed.length > 0 ? transformed[0] : isLastSyncMode && lastSync && value || null;
83
+ } else {
84
+ const results = transformed.map(
85
+ (result) => result[fieldDeleted] || result.__deleted ? internal.symbolDelete : result
86
+ );
87
+ const out = asType === "array" ? [] : asMap ? /* @__PURE__ */ new Map() : {};
88
+ for (let i = 0; i < results.length; i++) {
89
+ let result = results[i];
90
+ result = result[fieldDeleted] || result.__deleted ? internal.symbolDelete : result;
91
+ if (asArray) {
92
+ out.push(result);
93
+ } else if (asMap) {
94
+ out.set(result.id, result);
95
+ } else {
96
+ out[result.id] = result;
97
+ }
98
+ }
99
+ return out;
100
+ }
101
+ } else if (getFn) {
102
+ const data = await getFn(getParams);
103
+ let transformed = data;
104
+ if (data) {
105
+ const newLastSync = data[fieldUpdatedAt] || data[fieldCreatedAt];
106
+ if (newLastSync && newLastSync !== lastSync) {
107
+ updateLastSync(newLastSync);
108
+ }
109
+ if (transform == null ? void 0 : transform.load) {
110
+ transformed = await transform.load(data, "get");
111
+ }
112
+ }
113
+ return transformed;
47
114
  }
48
- const asMap = asType === 'Map';
49
- const asArray = asType === 'array';
50
- const get = getFn || listFn
51
- ? async (getParams) => {
52
- const { updateLastSync, lastSync, value } = getParams;
53
- if (listFn) {
54
- const isLastSyncMode = changesSince === 'last-sync';
55
- if (isLastSyncMode && lastSync) {
56
- getParams.mode =
57
- modeParam || (asType === 'array' ? 'append' : asType === 'value' ? 'set' : 'assign');
58
- }
59
- const data = (await listFn(getParams)) || [];
60
- let newLastSync = 0;
61
- for (let i = 0; i < data.length; i++) {
62
- const updated = data[i][fieldUpdatedAt] || data[i][fieldCreatedAt];
63
- if (updated) {
64
- newLastSync = Math.max(newLastSync, +new Date(updated));
65
- }
66
- }
67
- if (newLastSync && newLastSync !== lastSync) {
68
- updateLastSync(newLastSync);
69
- }
70
- let transformed = data;
71
- if (transform === null || transform === void 0 ? void 0 : transform.load) {
72
- transformed = await Promise.all(data.map((value) => transform.load(value, 'get')));
73
- }
74
- if (asType === 'value') {
75
- return transformed.length > 0
76
- ? transformed[0]
77
- : (isLastSyncMode && lastSync && value) || null;
78
- }
79
- else {
80
- const results = transformed.map((result) => result[fieldDeleted] || result.__deleted ? internal.symbolDelete : result);
81
- const out = asType === 'array' ? [] : asMap ? new Map() : {};
82
- for (let i = 0; i < results.length; i++) {
83
- let result = results[i];
84
- result = result[fieldDeleted] || result.__deleted ? internal.symbolDelete : result;
85
- if (asArray) {
86
- out.push(result);
87
- }
88
- else if (asMap) {
89
- out.set(result.id, result);
90
- }
91
- else {
92
- out[result.id] = result;
93
- }
94
- }
95
- return out;
96
- }
97
- }
98
- else if (getFn) {
99
- const data = await getFn(getParams);
100
- let transformed = data;
101
- if (data) {
102
- const newLastSync = data[fieldUpdatedAt] || data[fieldCreatedAt];
103
- if (newLastSync && newLastSync !== lastSync) {
104
- updateLastSync(newLastSync);
105
- }
106
- if (transform === null || transform === void 0 ? void 0 : transform.load) {
107
- transformed = await transform.load(data, 'get');
108
- }
109
- }
110
- return transformed;
115
+ } : void 0;
116
+ const set = createFn || updateFn || deleteFn ? async (params) => {
117
+ const { value, changes, update, retryAsCreate, valuePrevious, node } = params;
118
+ const creates = /* @__PURE__ */ new Map();
119
+ const updates = /* @__PURE__ */ new Map();
120
+ const deletes = /* @__PURE__ */ new Set();
121
+ changes.forEach(({ path, prevAtPath, valueAtPath }) => {
122
+ if (asType === "value") {
123
+ if (value) {
124
+ let id = value == null ? void 0 : value.id;
125
+ const isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
126
+ if (!id && generateId) {
127
+ id = ensureId(value, generateId);
128
+ }
129
+ if (id) {
130
+ if (isCreate || retryAsCreate) {
131
+ creates.set(id, value);
132
+ } else if (path.length === 0) {
133
+ if (valueAtPath) {
134
+ updates.set(id, valueAtPath);
135
+ } else if (prevAtPath) {
136
+ deletes.add(prevAtPath == null ? void 0 : prevAtPath.id);
137
+ }
138
+ } else {
139
+ updates.set(id, Object.assign(updates.get(id) || { id }, value));
111
140
  }
141
+ } else {
142
+ console.error("[legend-state]: added synced item without an id");
143
+ }
144
+ } else if (path.length === 0) {
145
+ const id = prevAtPath == null ? void 0 : prevAtPath.id;
146
+ if (id) {
147
+ deletes.add(id);
148
+ }
112
149
  }
113
- : undefined;
114
- const set = createFn || updateFn || deleteFn
115
- ? async (params) => {
116
- const { value, changes, update, retryAsCreate, valuePrevious, node } = params;
117
- const creates = new Map();
118
- const updates = new Map();
119
- const deletes = new Set();
120
- changes.forEach(({ path, prevAtPath, valueAtPath }) => {
121
- if (asType === 'value') {
122
- if (value) {
123
- let id = value === null || value === void 0 ? void 0 : value.id;
124
- const isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
125
- if (!id && generateId) {
126
- id = ensureId(value, generateId);
127
- }
128
- if (id) {
129
- if (isCreate || retryAsCreate) {
130
- creates.set(id, value);
131
- }
132
- else if (path.length === 0) {
133
- if (valueAtPath) {
134
- updates.set(id, valueAtPath);
135
- }
136
- else if (prevAtPath) {
137
- deletes.add(prevAtPath === null || prevAtPath === void 0 ? void 0 : prevAtPath.id);
138
- }
139
- }
140
- else {
141
- updates.set(id, Object.assign(updates.get(id) || { id }, value));
142
- }
143
- }
144
- else {
145
- console.error('[legend-state]: added synced item without an id');
146
- }
147
- }
148
- else if (path.length === 0) {
149
- const id = prevAtPath === null || prevAtPath === void 0 ? void 0 : prevAtPath.id;
150
- if (id) {
151
- deletes.add(id);
152
- }
153
- }
154
- }
155
- else {
156
- let itemsChanged = undefined;
157
- if (path.length === 0) {
158
- // Do a deep equal of each element vs its previous element to see which have changed
159
- itemsChanged = (asMap
160
- ? Array.from(valueAtPath.entries())
161
- : Object.entries(valueAtPath)).filter(([key, value]) => {
162
- const prev = asMap ? prevAtPath.get(key) : prevAtPath[key];
163
- const isDiff = !prevAtPath || !deepEqual(value, prev);
164
- return isDiff;
165
- });
166
- }
167
- else {
168
- const itemKey = path[0];
169
- const itemValue = asMap ? value.get(itemKey) : value[itemKey];
170
- if (!itemValue) {
171
- if (path.length === 1 && prevAtPath) {
172
- deletes.add(itemKey);
173
- }
174
- }
175
- else {
176
- itemsChanged = [[itemKey, itemValue]];
177
- }
178
- }
179
- itemsChanged === null || itemsChanged === void 0 ? void 0 : itemsChanged.forEach(([itemKey, item]) => {
180
- if (isNullOrUndefined(item)) {
181
- deletes.add(itemKey);
182
- }
183
- else {
184
- const prev = asMap ? valuePrevious.get(itemKey) : valuePrevious[itemKey];
185
- const isCreate = fieldCreatedAt
186
- ? !item[fieldCreatedAt]
187
- : fieldUpdatedAt
188
- ? !item[fieldUpdatedAt]
189
- : isNullOrUndefined(prev);
190
- if (isCreate) {
191
- if (generateId) {
192
- ensureId(item, generateId);
193
- }
194
- if (!item.id) {
195
- console.error('[legend-state]: added item without an id');
196
- }
197
- if (createFn) {
198
- creates.set(item.id, item);
199
- }
200
- else {
201
- console.log('[legend-state] missing create function');
202
- }
203
- }
204
- else {
205
- if (updateFn) {
206
- updates.set(item.id, item);
207
- }
208
- else {
209
- console.log('[legend-state] missing update function');
210
- }
211
- }
212
- }
213
- });
214
- }
215
- });
216
- const saveResult = async (itemKey, input, data, isCreate) => {
217
- if (data && (onSaved || onSavedUpdate)) {
218
- const saved = ((transform === null || transform === void 0 ? void 0 : transform.load) ? transform.load(data, 'set') : data);
219
- const isChild = itemKey !== 'undefined' && asType !== 'value';
220
- const currentPeeked = getNodeValue(node);
221
- const currentValue = isChild ? currentPeeked === null || currentPeeked === void 0 ? void 0 : currentPeeked[itemKey] : currentPeeked;
222
- const dataOnSaved = {
223
- saved,
224
- input,
225
- currentValue,
226
- isCreate,
227
- props,
228
- };
229
- let savedOut = undefined;
230
- if (onSavedUpdate) {
231
- savedOut = onSavedCreatedUpdatedAt(onSavedUpdate, dataOnSaved);
232
- }
233
- if (onSaved) {
234
- const ret = onSaved(dataOnSaved);
235
- if (ret) {
236
- savedOut = ret;
237
- }
238
- }
239
- if (savedOut) {
240
- const createdAt = fieldCreatedAt ? savedOut[fieldCreatedAt] : undefined;
241
- const updatedAt = fieldUpdatedAt ? savedOut[fieldUpdatedAt] : undefined;
242
- const value = itemKey !== 'undefined' && asType !== 'value' ? { [itemKey]: savedOut } : savedOut;
243
- update({
244
- value,
245
- lastSync: updatedAt || createdAt ? +new Date(updatedAt || createdAt) : undefined,
246
- mode: 'merge',
247
- });
248
- }
249
- }
250
- };
251
- return Promise.all([
252
- ...Array.from(creates).map(([itemKey, itemValue]) => {
253
- const createObj = transformOut(itemValue, transform === null || transform === void 0 ? void 0 : transform.save);
254
- return createFn(createObj, params).then((result) => saveResult(itemKey, createObj, result, true));
255
- }),
256
- ...Array.from(updates).map(([itemKey, itemValue]) => {
257
- const toSave = updatePartial
258
- ? Object.assign(diffObjects(asType === 'value' ? valuePrevious : valuePrevious[itemKey], itemValue), { id: itemValue.id })
259
- : itemValue;
260
- const changed = transformOut(toSave, transform === null || transform === void 0 ? void 0 : transform.save);
261
- if (Object.keys(changed).length > 0) {
262
- return updateFn(changed, params).then((result) => result && saveResult(itemKey, changed, result, false));
263
- }
264
- }),
265
- ...Array.from(deletes).map((id) => {
266
- if (deleteFn) {
267
- deleteFn({ id }, params);
268
- }
269
- else if (fieldDeleted && updateFn) {
270
- updateFn({ id, [fieldDeleted]: true }, params);
271
- }
272
- else {
273
- console.log('[legend-state] missing delete function');
274
- }
275
- }),
276
- ]);
150
+ } else {
151
+ let itemsChanged = void 0;
152
+ if (path.length === 0) {
153
+ itemsChanged = (asMap ? Array.from(valueAtPath.entries()) : Object.entries(valueAtPath)).filter(([key, value2]) => {
154
+ const prev = asMap ? prevAtPath.get(key) : prevAtPath[key];
155
+ const isDiff = !prevAtPath || !deepEqual(value2, prev);
156
+ return isDiff;
157
+ });
158
+ } else {
159
+ const itemKey = path[0];
160
+ const itemValue = asMap ? value.get(itemKey) : value[itemKey];
161
+ if (!itemValue) {
162
+ if (path.length === 1 && prevAtPath) {
163
+ deletes.add(itemKey);
164
+ }
165
+ } else {
166
+ itemsChanged = [[itemKey, itemValue]];
167
+ }
277
168
  }
278
- : undefined;
279
- return synced({
280
- set,
281
- get,
282
- mode: modeParam,
283
- ...rest,
169
+ itemsChanged == null ? void 0 : itemsChanged.forEach(([itemKey, item]) => {
170
+ if (isNullOrUndefined(item)) {
171
+ deletes.add(itemKey);
172
+ } else {
173
+ const prev = asMap ? valuePrevious.get(itemKey) : valuePrevious[itemKey];
174
+ const isCreate = fieldCreatedAt ? !item[fieldCreatedAt] : fieldUpdatedAt ? !item[fieldUpdatedAt] : isNullOrUndefined(prev);
175
+ if (isCreate) {
176
+ if (generateId) {
177
+ ensureId(item, generateId);
178
+ }
179
+ if (!item.id) {
180
+ console.error("[legend-state]: added item without an id");
181
+ }
182
+ if (createFn) {
183
+ creates.set(item.id, item);
184
+ } else {
185
+ console.log("[legend-state] missing create function");
186
+ }
187
+ } else {
188
+ if (updateFn) {
189
+ updates.set(item.id, item);
190
+ } else {
191
+ console.log("[legend-state] missing update function");
192
+ }
193
+ }
194
+ }
195
+ });
196
+ }
284
197
  });
198
+ const saveResult = async (itemKey, input, data, isCreate) => {
199
+ if (data && (onSaved || onSavedUpdate)) {
200
+ const saved = (transform == null ? void 0 : transform.load) ? transform.load(data, "set") : data;
201
+ const isChild = itemKey !== "undefined" && asType !== "value";
202
+ const currentPeeked = getNodeValue(node);
203
+ const currentValue = isChild ? currentPeeked == null ? void 0 : currentPeeked[itemKey] : currentPeeked;
204
+ const dataOnSaved = {
205
+ saved,
206
+ input,
207
+ currentValue,
208
+ isCreate,
209
+ props
210
+ };
211
+ let savedOut = void 0;
212
+ if (onSavedUpdate) {
213
+ savedOut = onSavedCreatedUpdatedAt(onSavedUpdate, dataOnSaved);
214
+ }
215
+ if (onSaved) {
216
+ const ret = onSaved(dataOnSaved);
217
+ if (ret) {
218
+ savedOut = ret;
219
+ }
220
+ }
221
+ if (savedOut) {
222
+ const createdAt = fieldCreatedAt ? savedOut[fieldCreatedAt] : void 0;
223
+ const updatedAt = fieldUpdatedAt ? savedOut[fieldUpdatedAt] : void 0;
224
+ const value2 = itemKey !== "undefined" && asType !== "value" ? { [itemKey]: savedOut } : savedOut;
225
+ update({
226
+ value: value2,
227
+ lastSync: updatedAt || createdAt ? +new Date(updatedAt || createdAt) : void 0,
228
+ mode: "merge"
229
+ });
230
+ }
231
+ }
232
+ };
233
+ return Promise.all([
234
+ ...Array.from(creates).map(([itemKey, itemValue]) => {
235
+ const createObj = transformOut(itemValue, transform == null ? void 0 : transform.save);
236
+ return createFn(createObj, params).then(
237
+ (result) => saveResult(itemKey, createObj, result, true)
238
+ );
239
+ }),
240
+ ...Array.from(updates).map(([itemKey, itemValue]) => {
241
+ const toSave = updatePartial ? Object.assign(
242
+ diffObjects(asType === "value" ? valuePrevious : valuePrevious[itemKey], itemValue),
243
+ { id: itemValue.id }
244
+ ) : itemValue;
245
+ const changed = transformOut(toSave, transform == null ? void 0 : transform.save);
246
+ if (Object.keys(changed).length > 0) {
247
+ return updateFn(changed, params).then(
248
+ (result) => result && saveResult(itemKey, changed, result, false)
249
+ );
250
+ }
251
+ }),
252
+ ...Array.from(deletes).map((id) => {
253
+ if (deleteFn) {
254
+ deleteFn({ id }, params);
255
+ } else if (fieldDeleted && updateFn) {
256
+ updateFn({ id, [fieldDeleted]: true }, params);
257
+ } else {
258
+ console.log("[legend-state] missing delete function");
259
+ }
260
+ })
261
+ ]);
262
+ } : void 0;
263
+ return synced({
264
+ set,
265
+ get,
266
+ mode: modeParam,
267
+ ...rest
268
+ });
285
269
  }
286
270
 
287
271
  export { syncedCrud };
288
- //# sourceMappingURL=crud.mjs.map
@@ -0,0 +1,21 @@
1
+ import { Selector } from '@legendapp/state';
2
+ import { SyncedOptions, Synced } from '@legendapp/state/sync';
3
+
4
+ interface SyncedFetchOnSavedParams<TRemote, TLocal = TRemote> {
5
+ saved: TLocal;
6
+ input: TRemote;
7
+ currentValue: TLocal;
8
+ props: SyncedFetchProps<TRemote, TLocal>;
9
+ }
10
+ interface SyncedFetchProps<TRemote, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set'> {
11
+ get: Selector<string>;
12
+ set?: Selector<string>;
13
+ getInit?: RequestInit;
14
+ setInit?: RequestInit;
15
+ valueType?: 'arrayBuffer' | 'blob' | 'formData' | 'json' | 'text';
16
+ onSavedValueType?: 'arrayBuffer' | 'blob' | 'formData' | 'json' | 'text';
17
+ onSaved?: (params: SyncedFetchOnSavedParams<TRemote, TLocal>) => Partial<TLocal> | void;
18
+ }
19
+ declare function syncedFetch<TRemote, TLocal = TRemote>(props: SyncedFetchProps<TRemote, TLocal>): Synced<TLocal>;
20
+
21
+ export { type SyncedFetchOnSavedParams, type SyncedFetchProps, syncedFetch };
@@ -1,12 +1,13 @@
1
1
  import { Selector } from '@legendapp/state';
2
- import { Synced, SyncedOptions } from '@legendapp/state/sync';
3
- export interface SyncedFetchOnSavedParams<TRemote, TLocal = TRemote> {
2
+ import { SyncedOptions, Synced } from '@legendapp/state/sync';
3
+
4
+ interface SyncedFetchOnSavedParams<TRemote, TLocal = TRemote> {
4
5
  saved: TLocal;
5
6
  input: TRemote;
6
7
  currentValue: TLocal;
7
8
  props: SyncedFetchProps<TRemote, TLocal>;
8
9
  }
9
- export interface SyncedFetchProps<TRemote, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set'> {
10
+ interface SyncedFetchProps<TRemote, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set'> {
10
11
  get: Selector<string>;
11
12
  set?: Selector<string>;
12
13
  getInit?: RequestInit;
@@ -15,4 +16,6 @@ export interface SyncedFetchProps<TRemote, TLocal = TRemote> extends Omit<Synced
15
16
  onSavedValueType?: 'arrayBuffer' | 'blob' | 'formData' | 'json' | 'text';
16
17
  onSaved?: (params: SyncedFetchOnSavedParams<TRemote, TLocal>) => Partial<TLocal> | void;
17
18
  }
18
- export declare function syncedFetch<TRemote, TLocal = TRemote>(props: SyncedFetchProps<TRemote, TLocal>): Synced<TLocal>;
19
+ declare function syncedFetch<TRemote, TLocal = TRemote>(props: SyncedFetchProps<TRemote, TLocal>): Synced<TLocal>;
20
+
21
+ export { type SyncedFetchOnSavedParams, type SyncedFetchProps, syncedFetch };