@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.
- package/CHANGELOG.md +831 -1
- package/LICENSE +21 -1
- package/README.md +141 -1
- package/babel.js +0 -2
- package/babel.mjs +0 -2
- package/config/enable$GetSet.js +2 -1
- package/config/enable$GetSet.mjs +2 -1
- package/config/enableReactTracking.js +2 -1
- package/config/enableReactTracking.mjs +2 -1
- package/config/enableReactUse.js +2 -1
- package/config/enableReactUse.mjs +2 -1
- package/config/enable_PeekAssign.js +2 -1
- package/config/enable_PeekAssign.mjs +2 -1
- package/config.d.mts +13 -0
- package/config.d.ts +13 -0
- package/config.js +2052 -0
- package/config.mjs +2050 -0
- package/helpers/trackHistory.js +2 -2
- package/helpers/trackHistory.mjs +2 -2
- package/index.d.mts +21 -302
- package/index.d.ts +21 -302
- package/index.js +274 -318
- package/index.mjs +275 -317
- package/observableInterfaces-Dilj6F92.d.mts +282 -0
- package/observableInterfaces-Dilj6F92.d.ts +282 -0
- package/package.json +11 -1
- package/persist-plugins/async-storage.d.mts +6 -3
- package/persist-plugins/async-storage.d.ts +6 -3
- package/persist-plugins/async-storage.js +12 -4
- package/persist-plugins/async-storage.mjs +12 -5
- package/persist-plugins/indexeddb.d.mts +6 -4
- package/persist-plugins/indexeddb.d.ts +6 -4
- package/persist-plugins/indexeddb.js +16 -6
- package/persist-plugins/indexeddb.mjs +16 -7
- package/persist-plugins/mmkv.d.mts +5 -1
- package/persist-plugins/mmkv.d.ts +5 -1
- package/persist-plugins/mmkv.js +14 -5
- package/persist-plugins/mmkv.mjs +14 -6
- package/react.d.mts +18 -14
- package/react.d.ts +18 -14
- package/react.js +57 -32
- package/react.mjs +58 -33
- package/sync-plugins/_transformObjectFields.d.mts +31 -0
- package/sync-plugins/_transformObjectFields.d.ts +31 -0
- package/sync-plugins/_transformObjectFields.js +114 -0
- package/sync-plugins/_transformObjectFields.mjs +110 -0
- package/sync-plugins/crud.d.mts +15 -23
- package/sync-plugins/crud.d.ts +15 -23
- package/sync-plugins/crud.js +213 -134
- package/sync-plugins/crud.mjs +214 -135
- package/sync-plugins/fetch.js +12 -8
- package/sync-plugins/fetch.mjs +13 -9
- package/sync-plugins/firebase.d.mts +26 -0
- package/sync-plugins/firebase.d.ts +26 -0
- package/sync-plugins/firebase.js +373 -0
- package/sync-plugins/firebase.mjs +368 -0
- package/sync-plugins/keel.d.mts +27 -10
- package/sync-plugins/keel.d.ts +27 -10
- package/sync-plugins/keel.js +40 -21
- package/sync-plugins/keel.mjs +40 -21
- package/sync-plugins/supabase.d.mts +12 -7
- package/sync-plugins/supabase.d.ts +12 -7
- package/sync-plugins/supabase.js +24 -13
- package/sync-plugins/supabase.mjs +25 -14
- package/sync-plugins/tanstack-query.d.mts +2 -2
- package/sync-plugins/tanstack-query.d.ts +2 -2
- package/sync-plugins/tanstack-query.js +3 -2
- package/sync-plugins/tanstack-query.mjs +3 -2
- package/sync-plugins/tanstack-react-query.d.mts +1 -1
- package/sync-plugins/tanstack-react-query.d.ts +1 -1
- package/sync.d.mts +68 -197
- package/sync.d.ts +68 -197
- package/sync.js +448 -283
- package/sync.mjs +454 -289
- package/types/babel.d.ts +12 -1
- package/.DS_Store +0 -0
- /package/config/{enable_GetSet.d.mts → enable$GetSet.d.mts} +0 -0
- /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
|
|
154
|
+
let useMemo4 = false;
|
|
153
155
|
let render = component;
|
|
154
156
|
if (ReactMemoSymbol && render["$$typeof"] === ReactMemoSymbol && render["type"]) {
|
|
155
|
-
|
|
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 ||
|
|
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
|
|
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
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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 =
|
|
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,
|
|
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
|
|
148
|
+
let useMemo4 = false;
|
|
147
149
|
let render = component;
|
|
148
150
|
if (ReactMemoSymbol && render["$$typeof"] === ReactMemoSymbol && render["type"]) {
|
|
149
|
-
|
|
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 ||
|
|
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
|
|
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
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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 =
|
|
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 };
|