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

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 (78) hide show
  1. package/CHANGELOG.md +831 -1
  2. package/LICENSE +21 -1
  3. package/README.md +141 -1
  4. package/babel.js +0 -2
  5. package/babel.mjs +0 -2
  6. package/config/enable$GetSet.js +2 -1
  7. package/config/enable$GetSet.mjs +2 -1
  8. package/config/enableReactTracking.js +2 -1
  9. package/config/enableReactTracking.mjs +2 -1
  10. package/config/enableReactUse.js +2 -1
  11. package/config/enableReactUse.mjs +2 -1
  12. package/config/enable_PeekAssign.js +2 -1
  13. package/config/enable_PeekAssign.mjs +2 -1
  14. package/config.d.mts +13 -0
  15. package/config.d.ts +13 -0
  16. package/config.js +2052 -0
  17. package/config.mjs +2050 -0
  18. package/helpers/trackHistory.js +2 -2
  19. package/helpers/trackHistory.mjs +2 -2
  20. package/index.d.mts +21 -302
  21. package/index.d.ts +21 -302
  22. package/index.js +274 -318
  23. package/index.mjs +275 -317
  24. package/observableInterfaces-Dilj6F92.d.mts +282 -0
  25. package/observableInterfaces-Dilj6F92.d.ts +282 -0
  26. package/package.json +11 -1
  27. package/persist-plugins/async-storage.d.mts +6 -3
  28. package/persist-plugins/async-storage.d.ts +6 -3
  29. package/persist-plugins/async-storage.js +12 -4
  30. package/persist-plugins/async-storage.mjs +12 -5
  31. package/persist-plugins/indexeddb.d.mts +6 -4
  32. package/persist-plugins/indexeddb.d.ts +6 -4
  33. package/persist-plugins/indexeddb.js +16 -6
  34. package/persist-plugins/indexeddb.mjs +16 -7
  35. package/persist-plugins/mmkv.d.mts +5 -1
  36. package/persist-plugins/mmkv.d.ts +5 -1
  37. package/persist-plugins/mmkv.js +14 -5
  38. package/persist-plugins/mmkv.mjs +14 -6
  39. package/react.d.mts +18 -14
  40. package/react.d.ts +18 -14
  41. package/react.js +57 -32
  42. package/react.mjs +58 -33
  43. package/sync-plugins/_transformObjectFields.d.mts +31 -0
  44. package/sync-plugins/_transformObjectFields.d.ts +31 -0
  45. package/sync-plugins/_transformObjectFields.js +114 -0
  46. package/sync-plugins/_transformObjectFields.mjs +110 -0
  47. package/sync-plugins/crud.d.mts +15 -23
  48. package/sync-plugins/crud.d.ts +15 -23
  49. package/sync-plugins/crud.js +213 -134
  50. package/sync-plugins/crud.mjs +214 -135
  51. package/sync-plugins/fetch.js +12 -8
  52. package/sync-plugins/fetch.mjs +13 -9
  53. package/sync-plugins/firebase.d.mts +26 -0
  54. package/sync-plugins/firebase.d.ts +26 -0
  55. package/sync-plugins/firebase.js +373 -0
  56. package/sync-plugins/firebase.mjs +368 -0
  57. package/sync-plugins/keel.d.mts +27 -10
  58. package/sync-plugins/keel.d.ts +27 -10
  59. package/sync-plugins/keel.js +40 -21
  60. package/sync-plugins/keel.mjs +40 -21
  61. package/sync-plugins/supabase.d.mts +12 -7
  62. package/sync-plugins/supabase.d.ts +12 -7
  63. package/sync-plugins/supabase.js +24 -13
  64. package/sync-plugins/supabase.mjs +25 -14
  65. package/sync-plugins/tanstack-query.d.mts +2 -2
  66. package/sync-plugins/tanstack-query.d.ts +2 -2
  67. package/sync-plugins/tanstack-query.js +3 -2
  68. package/sync-plugins/tanstack-query.mjs +3 -2
  69. package/sync-plugins/tanstack-react-query.d.mts +1 -1
  70. package/sync-plugins/tanstack-react-query.d.ts +1 -1
  71. package/sync.d.mts +68 -197
  72. package/sync.d.ts +68 -197
  73. package/sync.js +448 -283
  74. package/sync.mjs +454 -289
  75. package/types/babel.d.ts +12 -1
  76. package/.DS_Store +0 -0
  77. /package/config/{enable_GetSet.d.mts → enable$GetSet.d.mts} +0 -0
  78. /package/config/{enable_GetSet.d.ts → enable$GetSet.d.ts} +0 -0
package/react.js CHANGED
@@ -111,15 +111,6 @@ function useSelector(selector, options) {
111
111
  const { subscribe, getVersion, run } = selectorFn;
112
112
  value = run(selector);
113
113
  index_js.useSyncExternalStore(subscribe, getVersion, getVersion);
114
- if (options == null ? void 0 : options.suspense) {
115
- if (state.isPromise(value) || !value && state.isObservable(selector) && state.syncState(selector).isLoaded.get() === false) {
116
- if (React__default.default.use) {
117
- React__default.default.use(value);
118
- } else {
119
- throw value;
120
- }
121
- }
122
- }
123
114
  } catch (err) {
124
115
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && ((_a = err == null ? void 0 : err.message) == null ? void 0 : _a.includes("Rendered more"))) {
125
116
  console.warn(
@@ -128,6 +119,17 @@ function useSelector(selector, options) {
128
119
  }
129
120
  throw err;
130
121
  }
122
+ if (options == null ? void 0 : options.suspense) {
123
+ const isProm = state.isPromise(value);
124
+ if (state.isPromise(value) || !value && state.isObservable(selector)) {
125
+ const vProm = isProm ? value : state.when(selector);
126
+ if (React__default.default.use) {
127
+ React__default.default.use(vProm);
128
+ } else {
129
+ throw vProm;
130
+ }
131
+ }
132
+ }
131
133
  return value;
132
134
  }
133
135
 
@@ -149,10 +151,10 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
149
151
  if (component["__legend_proxied"])
150
152
  return component;
151
153
  let useForwardRef = false;
152
- let useMemo5 = false;
154
+ let useMemo4 = false;
153
155
  let render = component;
154
156
  if (ReactMemoSymbol && render["$$typeof"] === ReactMemoSymbol && render["type"]) {
155
- useMemo5 = true;
157
+ useMemo4 = true;
156
158
  render = render["type"];
157
159
  }
158
160
  if (ReactForwardRefSymbol && render["$$typeof"] === ReactForwardRefSymbol) {
@@ -233,7 +235,7 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
233
235
  } else {
234
236
  ret = proxy;
235
237
  }
236
- return observe3 || useMemo5 ? React.memo(ret) : ret;
238
+ return observe3 || useMemo4 ? React.memo(ret) : ret;
237
239
  }
238
240
  function observer(component) {
239
241
  return createReactiveComponent(component, true);
@@ -370,11 +372,11 @@ function configureReactive({
370
372
  }
371
373
  }
372
374
  }
373
- function Show({ if: if_, ifReady, else: else_, wrap, children }) {
375
+ function Show({ if: if_, ifReady, else: else_, $value, wrap, children }) {
374
376
  const value = useSelector(if_ != null ? if_ : ifReady);
375
377
  const show = ifReady !== void 0 ? state.isObservableValueReady(value) : value;
376
378
  const child = useSelector(
377
- show ? state.isFunction(children) ? () => children(value) : children : else_ != null ? else_ : null,
379
+ show ? state.isFunction(children) ? () => children($value ? $value.get() : value) : children : else_ != null ? else_ : null,
378
380
  { skipCheck: true }
379
381
  );
380
382
  return wrap ? React.createElement(wrap, void 0, child) : child;
@@ -389,20 +391,36 @@ function Switch({
389
391
  const child = children[useSelector(value)];
390
392
  return (_b = child ? child() : (_a = children["default"]) == null ? void 0 : _a.call(children)) != null ? _b : null;
391
393
  }
392
- function useComputed(compute, set, deps) {
394
+ function useObservable(initialValue, deps) {
395
+ var _a;
396
+ const ref = React.useRef({});
397
+ ref.current.value = initialValue;
398
+ const depsObs$ = deps ? useObservable(deps) : void 0;
399
+ if (!((_a = ref.current) == null ? void 0 : _a.obs$)) {
400
+ const value = depsObs$ ? state.isFunction(initialValue) && initialValue.length === 1 ? (p) => {
401
+ depsObs$.get();
402
+ return ref.current.value(p);
403
+ } : () => {
404
+ depsObs$.get();
405
+ return state.computeSelector(ref.current.value);
406
+ } : initialValue;
407
+ ref.current.obs$ = state.observable(value);
408
+ }
409
+ if (depsObs$) {
410
+ depsObs$.set(deps);
411
+ }
412
+ return ref.current.obs$;
413
+ }
414
+
415
+ // src/react/useComputed.ts
416
+ function useComputed(get, set, deps) {
393
417
  if (!deps && state.isArray(set)) {
394
418
  deps = set;
395
419
  set = void 0;
396
420
  }
397
- const ref = React.useRef({});
398
- ref.current.compute = compute;
399
- ref.current.set = set;
400
- return React.useMemo(
401
- () => state.computed(
402
- () => state.isFunction(ref.current.compute) ? ref.current.compute() : ref.current.compute,
403
- set ? (value) => ref.current.set(value) : void 0
404
- ),
405
- deps || []
421
+ return useObservable(
422
+ set ? state.linked({ get, set: ({ value }) => set(value) }) : get,
423
+ deps
406
424
  );
407
425
  }
408
426
  var useEffectOnce = (effect, deps) => {
@@ -442,13 +460,6 @@ function useMount(fn) {
442
460
  }, []);
443
461
  }
444
462
  var useMountOnce = useMount;
445
- function useObservable(initialValue) {
446
- const ref = React.useRef();
447
- if (!ref.current) {
448
- ref.current = state.observable(initialValue);
449
- }
450
- return ref.current;
451
- }
452
463
 
453
464
  // src/react/useIsMounted.ts
454
465
  function useIsMounted() {
@@ -484,8 +495,16 @@ function useObserve(selector, reactionOrOptions, options) {
484
495
  } else {
485
496
  options = reactionOrOptions;
486
497
  }
498
+ const deps = options == null ? void 0 : options.deps;
499
+ const depsObs$ = deps ? useObservable(deps) : void 0;
500
+ if (depsObs$) {
501
+ depsObs$.set(deps);
502
+ }
487
503
  const ref = React.useRef({});
488
- ref.current.selector = selector;
504
+ ref.current.selector = deps ? () => {
505
+ depsObs$ == null ? void 0 : depsObs$.get();
506
+ return state.computeSelector(selector);
507
+ } : selector;
489
508
  ref.current.reaction = reaction;
490
509
  if (!ref.current.dispose) {
491
510
  ref.current.dispose = state.observe(
@@ -510,12 +529,18 @@ function useObserveEffect(selector, reactionOrOptions, options) {
510
529
  } else {
511
530
  options = reactionOrOptions;
512
531
  }
532
+ const deps = options == null ? void 0 : options.deps;
533
+ const depsObs$ = deps ? useObservable(deps) : void 0;
534
+ if (depsObs$) {
535
+ depsObs$.set(deps);
536
+ }
513
537
  const ref = React.useRef({ selector });
514
538
  ref.current = { selector, reaction };
515
539
  useMountOnce(
516
540
  () => state.observe(
517
541
  (e) => {
518
542
  const { selector: selector2 } = ref.current;
543
+ depsObs$ == null ? void 0 : depsObs$.get();
519
544
  return state.isFunction(selector2) ? selector2(e) : selector2;
520
545
  },
521
546
  (e) => {
package/react.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { isFunction, isEmpty, observable, isPromise, isObservable, syncState, computeSelector, isArray, isMap, isObservableValueReady, computed, observe, when, whenReady, internal, trackSelector, isPrimitive } from '@legendapp/state';
1
+ import { isFunction, isEmpty, observable, isPromise, isObservable, when, computeSelector, isArray, isMap, isObservableValueReady, linked, observe, whenReady, internal, trackSelector, isPrimitive } from '@legendapp/state';
2
2
  import React, { memo, forwardRef, createElement, useState, useContext, useMemo, useRef, useEffect, createContext, useCallback } from 'react';
3
3
  import { useSyncExternalStore } from 'use-sync-external-store/shim/index.js';
4
4
 
@@ -105,15 +105,6 @@ function useSelector(selector, options) {
105
105
  const { subscribe, getVersion, run } = selectorFn;
106
106
  value = run(selector);
107
107
  useSyncExternalStore(subscribe, getVersion, getVersion);
108
- if (options == null ? void 0 : options.suspense) {
109
- if (isPromise(value) || !value && isObservable(selector) && syncState(selector).isLoaded.get() === false) {
110
- if (React.use) {
111
- React.use(value);
112
- } else {
113
- throw value;
114
- }
115
- }
116
- }
117
108
  } catch (err) {
118
109
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && ((_a = err == null ? void 0 : err.message) == null ? void 0 : _a.includes("Rendered more"))) {
119
110
  console.warn(
@@ -122,6 +113,17 @@ function useSelector(selector, options) {
122
113
  }
123
114
  throw err;
124
115
  }
116
+ if (options == null ? void 0 : options.suspense) {
117
+ const isProm = isPromise(value);
118
+ if (isPromise(value) || !value && isObservable(selector)) {
119
+ const vProm = isProm ? value : when(selector);
120
+ if (React.use) {
121
+ React.use(vProm);
122
+ } else {
123
+ throw vProm;
124
+ }
125
+ }
126
+ }
125
127
  return value;
126
128
  }
127
129
 
@@ -143,10 +145,10 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
143
145
  if (component["__legend_proxied"])
144
146
  return component;
145
147
  let useForwardRef = false;
146
- let useMemo5 = false;
148
+ let useMemo4 = false;
147
149
  let render = component;
148
150
  if (ReactMemoSymbol && render["$$typeof"] === ReactMemoSymbol && render["type"]) {
149
- useMemo5 = true;
151
+ useMemo4 = true;
150
152
  render = render["type"];
151
153
  }
152
154
  if (ReactForwardRefSymbol && render["$$typeof"] === ReactForwardRefSymbol) {
@@ -227,7 +229,7 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
227
229
  } else {
228
230
  ret = proxy;
229
231
  }
230
- return observe3 || useMemo5 ? memo(ret) : ret;
232
+ return observe3 || useMemo4 ? memo(ret) : ret;
231
233
  }
232
234
  function observer(component) {
233
235
  return createReactiveComponent(component, true);
@@ -364,11 +366,11 @@ function configureReactive({
364
366
  }
365
367
  }
366
368
  }
367
- function Show({ if: if_, ifReady, else: else_, wrap, children }) {
369
+ function Show({ if: if_, ifReady, else: else_, $value, wrap, children }) {
368
370
  const value = useSelector(if_ != null ? if_ : ifReady);
369
371
  const show = ifReady !== void 0 ? isObservableValueReady(value) : value;
370
372
  const child = useSelector(
371
- show ? isFunction(children) ? () => children(value) : children : else_ != null ? else_ : null,
373
+ show ? isFunction(children) ? () => children($value ? $value.get() : value) : children : else_ != null ? else_ : null,
372
374
  { skipCheck: true }
373
375
  );
374
376
  return wrap ? createElement(wrap, void 0, child) : child;
@@ -383,20 +385,36 @@ function Switch({
383
385
  const child = children[useSelector(value)];
384
386
  return (_b = child ? child() : (_a = children["default"]) == null ? void 0 : _a.call(children)) != null ? _b : null;
385
387
  }
386
- function useComputed(compute, set, deps) {
388
+ function useObservable(initialValue, deps) {
389
+ var _a;
390
+ const ref = useRef({});
391
+ ref.current.value = initialValue;
392
+ const depsObs$ = deps ? useObservable(deps) : void 0;
393
+ if (!((_a = ref.current) == null ? void 0 : _a.obs$)) {
394
+ const value = depsObs$ ? isFunction(initialValue) && initialValue.length === 1 ? (p) => {
395
+ depsObs$.get();
396
+ return ref.current.value(p);
397
+ } : () => {
398
+ depsObs$.get();
399
+ return computeSelector(ref.current.value);
400
+ } : initialValue;
401
+ ref.current.obs$ = observable(value);
402
+ }
403
+ if (depsObs$) {
404
+ depsObs$.set(deps);
405
+ }
406
+ return ref.current.obs$;
407
+ }
408
+
409
+ // src/react/useComputed.ts
410
+ function useComputed(get, set, deps) {
387
411
  if (!deps && isArray(set)) {
388
412
  deps = set;
389
413
  set = void 0;
390
414
  }
391
- const ref = useRef({});
392
- ref.current.compute = compute;
393
- ref.current.set = set;
394
- return useMemo(
395
- () => computed(
396
- () => isFunction(ref.current.compute) ? ref.current.compute() : ref.current.compute,
397
- set ? (value) => ref.current.set(value) : void 0
398
- ),
399
- deps || []
415
+ return useObservable(
416
+ set ? linked({ get, set: ({ value }) => set(value) }) : get,
417
+ deps
400
418
  );
401
419
  }
402
420
  var useEffectOnce = (effect, deps) => {
@@ -436,13 +454,6 @@ function useMount(fn) {
436
454
  }, []);
437
455
  }
438
456
  var useMountOnce = useMount;
439
- function useObservable(initialValue) {
440
- const ref = useRef();
441
- if (!ref.current) {
442
- ref.current = observable(initialValue);
443
- }
444
- return ref.current;
445
- }
446
457
 
447
458
  // src/react/useIsMounted.ts
448
459
  function useIsMounted() {
@@ -478,8 +489,16 @@ function useObserve(selector, reactionOrOptions, options) {
478
489
  } else {
479
490
  options = reactionOrOptions;
480
491
  }
492
+ const deps = options == null ? void 0 : options.deps;
493
+ const depsObs$ = deps ? useObservable(deps) : void 0;
494
+ if (depsObs$) {
495
+ depsObs$.set(deps);
496
+ }
481
497
  const ref = useRef({});
482
- ref.current.selector = selector;
498
+ ref.current.selector = deps ? () => {
499
+ depsObs$ == null ? void 0 : depsObs$.get();
500
+ return computeSelector(selector);
501
+ } : selector;
483
502
  ref.current.reaction = reaction;
484
503
  if (!ref.current.dispose) {
485
504
  ref.current.dispose = observe(
@@ -504,12 +523,18 @@ function useObserveEffect(selector, reactionOrOptions, options) {
504
523
  } else {
505
524
  options = reactionOrOptions;
506
525
  }
526
+ const deps = options == null ? void 0 : options.deps;
527
+ const depsObs$ = deps ? useObservable(deps) : void 0;
528
+ if (depsObs$) {
529
+ depsObs$.set(deps);
530
+ }
507
531
  const ref = useRef({ selector });
508
532
  ref.current = { selector, reaction };
509
533
  useMountOnce(
510
534
  () => observe(
511
535
  (e) => {
512
536
  const { selector: selector2 } = ref.current;
537
+ depsObs$ == null ? void 0 : depsObs$.get();
513
538
  return isFunction(selector2) ? selector2(e) : selector2;
514
539
  },
515
540
  (e) => {
@@ -0,0 +1,31 @@
1
+ import { RecordValue, ArrayValue } from '@legendapp/state';
2
+ import { SyncTransform } from '@legendapp/state/sync';
3
+
4
+ declare function transformObjectFields(dataIn: Record<string, any>, map: Record<string, any>): any;
5
+ declare function invertFieldMap(obj: Record<string, any>): any;
6
+ declare const fieldTransformToTransform: <T extends object>(fieldTransform: FieldTransforms<T>) => SyncTransform<T>;
7
+ declare type FieldTransforms<T> = (T extends Record<string, Record<string, any>> ? {
8
+ _dict: FieldTransformsInner<RecordValue<T>>;
9
+ } : never) | FieldTransformsInner<T>;
10
+ declare type FieldTransformsInner<T> = {
11
+ [K in keyof T]: string;
12
+ } & ({
13
+ [K in keyof ObjectKeys<T> as `${K}_obj`]?: FieldTransforms<T[K]>;
14
+ } | {
15
+ [K in keyof DictKeys<T> as `${K}_dict`]?: FieldTransforms<RecordValue<T[K]>>;
16
+ }) & {
17
+ [K in keyof ArrayKeys<T> as `${K}_arr`]?: FieldTransforms<ArrayValue<T[K]>>;
18
+ } & {
19
+ [K in keyof ArrayKeys<T> as `${K}_val`]?: FieldTransforms<ArrayValue<T[K]>>;
20
+ };
21
+ declare type ObjectKeys<T> = Pick<T, {
22
+ [K in keyof T]-?: K extends string ? T[K] extends Record<string, any> ? T[K] extends any[] ? never : K : never : never;
23
+ }[keyof T]>;
24
+ declare type DictKeys<T> = Pick<T, {
25
+ [K in keyof T]-?: K extends string ? (T[K] extends Record<string, Record<string, any>> ? K : never) : never;
26
+ }[keyof T]>;
27
+ declare type ArrayKeys<T> = Pick<T, {
28
+ [K in keyof T]-?: K extends string | number ? (T[K] extends any[] ? K : never) : never;
29
+ }[keyof T]>;
30
+
31
+ export { type FieldTransforms, type FieldTransformsInner, fieldTransformToTransform, invertFieldMap, transformObjectFields };
@@ -0,0 +1,31 @@
1
+ import { RecordValue, ArrayValue } from '@legendapp/state';
2
+ import { SyncTransform } from '@legendapp/state/sync';
3
+
4
+ declare function transformObjectFields(dataIn: Record<string, any>, map: Record<string, any>): any;
5
+ declare function invertFieldMap(obj: Record<string, any>): any;
6
+ declare const fieldTransformToTransform: <T extends object>(fieldTransform: FieldTransforms<T>) => SyncTransform<T>;
7
+ declare type FieldTransforms<T> = (T extends Record<string, Record<string, any>> ? {
8
+ _dict: FieldTransformsInner<RecordValue<T>>;
9
+ } : never) | FieldTransformsInner<T>;
10
+ declare type FieldTransformsInner<T> = {
11
+ [K in keyof T]: string;
12
+ } & ({
13
+ [K in keyof ObjectKeys<T> as `${K}_obj`]?: FieldTransforms<T[K]>;
14
+ } | {
15
+ [K in keyof DictKeys<T> as `${K}_dict`]?: FieldTransforms<RecordValue<T[K]>>;
16
+ }) & {
17
+ [K in keyof ArrayKeys<T> as `${K}_arr`]?: FieldTransforms<ArrayValue<T[K]>>;
18
+ } & {
19
+ [K in keyof ArrayKeys<T> as `${K}_val`]?: FieldTransforms<ArrayValue<T[K]>>;
20
+ };
21
+ declare type ObjectKeys<T> = Pick<T, {
22
+ [K in keyof T]-?: K extends string ? T[K] extends Record<string, any> ? T[K] extends any[] ? never : K : never : never;
23
+ }[keyof T]>;
24
+ declare type DictKeys<T> = Pick<T, {
25
+ [K in keyof T]-?: K extends string ? (T[K] extends Record<string, Record<string, any>> ? K : never) : never;
26
+ }[keyof T]>;
27
+ declare type ArrayKeys<T> = Pick<T, {
28
+ [K in keyof T]-?: K extends string | number ? (T[K] extends any[] ? K : never) : never;
29
+ }[keyof T]>;
30
+
31
+ export { type FieldTransforms, type FieldTransformsInner, fieldTransformToTransform, invertFieldMap, transformObjectFields };
@@ -0,0 +1,114 @@
1
+ 'use strict';
2
+
3
+ var state = require('@legendapp/state');
4
+
5
+ // src/sync-plugins/_transformObjectFields.ts
6
+ var validateMap;
7
+ function transformObjectFields(dataIn, map) {
8
+ if (process.env.NODE_ENV === "development") {
9
+ validateMap(map);
10
+ }
11
+ let ret = dataIn;
12
+ if (dataIn) {
13
+ if (dataIn === state.symbolDelete)
14
+ return dataIn;
15
+ if (state.isString(dataIn)) {
16
+ return map[dataIn];
17
+ }
18
+ ret = {};
19
+ const dict = Object.keys(map).length === 1 && map["_dict"];
20
+ for (const key in dataIn) {
21
+ let v = dataIn[key];
22
+ if (dict) {
23
+ ret[key] = transformObjectFields(v, dict);
24
+ } else {
25
+ const mapped = map[key];
26
+ if (mapped === void 0) {
27
+ if (key !== "@") {
28
+ ret[key] = v;
29
+ if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
30
+ console.error("A fatal field transformation error has occurred", key, dataIn, map);
31
+ }
32
+ }
33
+ } else if (mapped !== null) {
34
+ if (v !== void 0 && v !== null) {
35
+ if (map[key + "_val"]) {
36
+ const mapChild = map[key + "_val"];
37
+ if (state.isArray(v)) {
38
+ v = v.map((vChild) => mapChild[vChild]);
39
+ } else {
40
+ v = mapChild[v];
41
+ }
42
+ } else if (map[key + "_arr"] && state.isArray(v)) {
43
+ const mapChild = map[key + "_arr"];
44
+ v = v.map((vChild) => transformObjectFields(vChild, mapChild));
45
+ } else if (state.isObject(v)) {
46
+ if (map[key + "_obj"]) {
47
+ v = transformObjectFields(v, map[key + "_obj"]);
48
+ } else if (map[key + "_dict"]) {
49
+ const mapChild = map[key + "_dict"];
50
+ const out = {};
51
+ for (const keyChild in v) {
52
+ out[keyChild] = transformObjectFields(v[keyChild], mapChild);
53
+ }
54
+ v = out;
55
+ }
56
+ }
57
+ }
58
+ ret[mapped] = v;
59
+ }
60
+ }
61
+ }
62
+ }
63
+ return ret;
64
+ }
65
+ var invertedMaps = /* @__PURE__ */ new WeakMap();
66
+ function invertFieldMap(obj) {
67
+ const existing = invertedMaps.get(obj);
68
+ if (existing)
69
+ return existing;
70
+ const target = {};
71
+ for (const key in obj) {
72
+ const val = obj[key];
73
+ if (key === "_dict") {
74
+ target[key] = invertFieldMap(val);
75
+ } else if (key.endsWith("_obj") || key.endsWith("_dict") || key.endsWith("_arr") || key.endsWith("_val")) {
76
+ const keyMapped = obj[key.replace(/_obj|_dict|_arr|_val$/, "")];
77
+ const suffix = key.match(/_obj|_dict|_arr|_val$/)[0];
78
+ target[keyMapped + suffix] = invertFieldMap(val);
79
+ } else if (typeof val === "string") {
80
+ target[val] = key;
81
+ }
82
+ }
83
+ invertedMaps.set(obj, target);
84
+ return target;
85
+ }
86
+ var fieldTransformToTransform = (fieldTransform) => ({
87
+ load(value) {
88
+ const inverted = invertFieldMap(fieldTransform);
89
+ return transformObjectFields(value, inverted);
90
+ },
91
+ save(value) {
92
+ return transformObjectFields(value, fieldTransform);
93
+ }
94
+ });
95
+ if (process.env.NODE_ENV === "development") {
96
+ validateMap = function(record) {
97
+ const values = Object.values(record).filter((value) => {
98
+ if (state.isObject(value)) {
99
+ validateMap(value);
100
+ } else {
101
+ return state.isString(value);
102
+ }
103
+ });
104
+ const uniques = Array.from(new Set(values));
105
+ if (values.length !== uniques.length) {
106
+ console.error("Field transform map has duplicate values", record, values.length, uniques.length);
107
+ }
108
+ return record;
109
+ };
110
+ }
111
+
112
+ exports.fieldTransformToTransform = fieldTransformToTransform;
113
+ exports.invertFieldMap = invertFieldMap;
114
+ exports.transformObjectFields = transformObjectFields;
@@ -0,0 +1,110 @@
1
+ import { symbolDelete, isString, isArray, isObject } from '@legendapp/state';
2
+
3
+ // src/sync-plugins/_transformObjectFields.ts
4
+ var validateMap;
5
+ function transformObjectFields(dataIn, map) {
6
+ if (process.env.NODE_ENV === "development") {
7
+ validateMap(map);
8
+ }
9
+ let ret = dataIn;
10
+ if (dataIn) {
11
+ if (dataIn === symbolDelete)
12
+ return dataIn;
13
+ if (isString(dataIn)) {
14
+ return map[dataIn];
15
+ }
16
+ ret = {};
17
+ const dict = Object.keys(map).length === 1 && map["_dict"];
18
+ for (const key in dataIn) {
19
+ let v = dataIn[key];
20
+ if (dict) {
21
+ ret[key] = transformObjectFields(v, dict);
22
+ } else {
23
+ const mapped = map[key];
24
+ if (mapped === void 0) {
25
+ if (key !== "@") {
26
+ ret[key] = v;
27
+ if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
28
+ console.error("A fatal field transformation error has occurred", key, dataIn, map);
29
+ }
30
+ }
31
+ } else if (mapped !== null) {
32
+ if (v !== void 0 && v !== null) {
33
+ if (map[key + "_val"]) {
34
+ const mapChild = map[key + "_val"];
35
+ if (isArray(v)) {
36
+ v = v.map((vChild) => mapChild[vChild]);
37
+ } else {
38
+ v = mapChild[v];
39
+ }
40
+ } else if (map[key + "_arr"] && isArray(v)) {
41
+ const mapChild = map[key + "_arr"];
42
+ v = v.map((vChild) => transformObjectFields(vChild, mapChild));
43
+ } else if (isObject(v)) {
44
+ if (map[key + "_obj"]) {
45
+ v = transformObjectFields(v, map[key + "_obj"]);
46
+ } else if (map[key + "_dict"]) {
47
+ const mapChild = map[key + "_dict"];
48
+ const out = {};
49
+ for (const keyChild in v) {
50
+ out[keyChild] = transformObjectFields(v[keyChild], mapChild);
51
+ }
52
+ v = out;
53
+ }
54
+ }
55
+ }
56
+ ret[mapped] = v;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ return ret;
62
+ }
63
+ var invertedMaps = /* @__PURE__ */ new WeakMap();
64
+ function invertFieldMap(obj) {
65
+ const existing = invertedMaps.get(obj);
66
+ if (existing)
67
+ return existing;
68
+ const target = {};
69
+ for (const key in obj) {
70
+ const val = obj[key];
71
+ if (key === "_dict") {
72
+ target[key] = invertFieldMap(val);
73
+ } else if (key.endsWith("_obj") || key.endsWith("_dict") || key.endsWith("_arr") || key.endsWith("_val")) {
74
+ const keyMapped = obj[key.replace(/_obj|_dict|_arr|_val$/, "")];
75
+ const suffix = key.match(/_obj|_dict|_arr|_val$/)[0];
76
+ target[keyMapped + suffix] = invertFieldMap(val);
77
+ } else if (typeof val === "string") {
78
+ target[val] = key;
79
+ }
80
+ }
81
+ invertedMaps.set(obj, target);
82
+ return target;
83
+ }
84
+ var fieldTransformToTransform = (fieldTransform) => ({
85
+ load(value) {
86
+ const inverted = invertFieldMap(fieldTransform);
87
+ return transformObjectFields(value, inverted);
88
+ },
89
+ save(value) {
90
+ return transformObjectFields(value, fieldTransform);
91
+ }
92
+ });
93
+ if (process.env.NODE_ENV === "development") {
94
+ validateMap = function(record) {
95
+ const values = Object.values(record).filter((value) => {
96
+ if (isObject(value)) {
97
+ validateMap(value);
98
+ } else {
99
+ return isString(value);
100
+ }
101
+ });
102
+ const uniques = Array.from(new Set(values));
103
+ if (values.length !== uniques.length) {
104
+ console.error("Field transform map has duplicate values", record, values.length, uniques.length);
105
+ }
106
+ return record;
107
+ };
108
+ }
109
+
110
+ export { fieldTransformToTransform, invertFieldMap, transformObjectFields };