@legendapp/state 3.0.0-alpha.2 → 3.0.0-alpha.20

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 (54) 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/helpers/trackHistory.js +2 -2
  7. package/helpers/trackHistory.mjs +2 -2
  8. package/index.d.mts +45 -32
  9. package/index.d.ts +45 -32
  10. package/index.js +234 -156
  11. package/index.mjs +234 -156
  12. package/package.json +6 -1
  13. package/persist-plugins/async-storage.d.mts +2 -2
  14. package/persist-plugins/async-storage.d.ts +2 -2
  15. package/persist-plugins/indexeddb.js +1 -1
  16. package/persist-plugins/indexeddb.mjs +1 -1
  17. package/react.d.mts +17 -14
  18. package/react.d.ts +17 -14
  19. package/react.js +55 -30
  20. package/react.mjs +56 -31
  21. package/sync-plugins/_transformObjectFields.d.mts +31 -0
  22. package/sync-plugins/_transformObjectFields.d.ts +31 -0
  23. package/sync-plugins/_transformObjectFields.js +114 -0
  24. package/sync-plugins/_transformObjectFields.mjs +110 -0
  25. package/sync-plugins/crud.d.mts +14 -23
  26. package/sync-plugins/crud.d.ts +14 -23
  27. package/sync-plugins/crud.js +194 -129
  28. package/sync-plugins/crud.mjs +195 -130
  29. package/sync-plugins/firebase.d.mts +26 -0
  30. package/sync-plugins/firebase.d.ts +26 -0
  31. package/sync-plugins/firebase.js +365 -0
  32. package/sync-plugins/firebase.mjs +360 -0
  33. package/sync-plugins/keel.d.mts +24 -8
  34. package/sync-plugins/keel.d.ts +24 -8
  35. package/sync-plugins/keel.js +32 -16
  36. package/sync-plugins/keel.mjs +32 -16
  37. package/sync-plugins/supabase.d.mts +1 -1
  38. package/sync-plugins/supabase.d.ts +1 -1
  39. package/sync-plugins/supabase.js +5 -4
  40. package/sync-plugins/supabase.mjs +6 -5
  41. package/sync-plugins/tanstack-query.d.mts +2 -2
  42. package/sync-plugins/tanstack-query.d.ts +2 -2
  43. package/sync-plugins/tanstack-query.js +3 -2
  44. package/sync-plugins/tanstack-query.mjs +3 -2
  45. package/sync-plugins/tanstack-react-query.d.mts +1 -1
  46. package/sync-plugins/tanstack-react-query.d.ts +1 -1
  47. package/sync.d.mts +38 -185
  48. package/sync.d.ts +38 -185
  49. package/sync.js +354 -296
  50. package/sync.mjs +356 -297
  51. package/types/babel.d.ts +12 -1
  52. package/.DS_Store +0 -0
  53. /package/config/{enable_GetSet.d.mts → enable$GetSet.d.mts} +0 -0
  54. /package/config/{enable_GetSet.d.ts → enable$GetSet.d.ts} +0 -0
@@ -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 };
@@ -1,42 +1,37 @@
1
- import { SyncedGetParams, SyncedOptions, SyncedSetParams } from '@legendapp/state/sync';
1
+ import { SyncedGetParams, SyncedOptions, SyncedSetParams, SyncedSubscribeParams } from '@legendapp/state/sync';
2
2
 
3
3
  type CrudAsOption = 'Map' | 'object' | 'value' | 'array';
4
4
  type CrudResult<T> = T;
5
- interface SyncedCrudPropsSingle<TRemote, TLocal> {
6
- get?: (params: SyncedGetParams) => Promise<CrudResult<TRemote | null>> | CrudResult<TRemote | null>;
5
+ interface SyncedCrudPropsSingle<TRemote extends object, TLocal> {
6
+ get?: (params: SyncedGetParams<TRemote>) => Promise<CrudResult<TRemote | null>> | CrudResult<TRemote | null>;
7
7
  initial?: InitialValue<TLocal, 'value'>;
8
8
  as?: never | 'value';
9
9
  }
10
- interface SyncedCrudPropsMany<TRemote, TLocal, TAsOption extends CrudAsOption> {
11
- list?: (params: SyncedGetParams) => Promise<CrudResult<TRemote[] | null>> | CrudResult<TRemote[] | null>;
10
+ interface SyncedCrudPropsMany<TRemote extends object, TLocal, TAsOption extends CrudAsOption> {
11
+ list?: (params: SyncedGetParams<TRemote>) => Promise<CrudResult<TRemote[] | null>> | CrudResult<TRemote[] | null>;
12
12
  as?: TAsOption;
13
13
  initial?: InitialValue<TLocal, TAsOption>;
14
14
  }
15
- interface SyncedCrudOnSavedParams<TRemote extends {
16
- id: string | number;
17
- }, TLocal> {
15
+ interface SyncedCrudOnSavedParams<TRemote extends object, TLocal> {
18
16
  saved: TLocal;
19
17
  input: TRemote;
20
18
  currentValue: TLocal;
21
19
  isCreate: boolean;
22
20
  props: SyncedCrudPropsBase<TRemote, TLocal>;
23
21
  }
24
- interface SyncedCrudPropsBase<TRemote extends {
25
- id: string | number;
26
- }, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial'> {
27
- create?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<TRemote> | null | undefined>;
28
- update?(input: Partial<TRemote>, params: SyncedSetParams<TRemote>): Promise<CrudResult<Partial<TRemote> | null | undefined>>;
29
- delete?(input: {
30
- id: TRemote['id'];
31
- }, params: SyncedSetParams<TRemote>): Promise<CrudResult<any>>;
22
+ interface SyncedCrudPropsBase<TRemote extends object, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial' | 'subscribe'> {
23
+ create?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<TRemote> | null | undefined | void>;
24
+ update?(input: Partial<TRemote>, params: SyncedSetParams<TRemote>): Promise<CrudResult<Partial<TRemote> | null | undefined | void>>;
25
+ delete?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<any>>;
32
26
  onSaved?(params: SyncedCrudOnSavedParams<TRemote, TLocal>): Partial<TLocal> | void;
33
- onSavedUpdate?: 'createdUpdatedAt';
27
+ fieldId?: string;
34
28
  fieldUpdatedAt?: string;
35
29
  fieldCreatedAt?: string;
36
30
  fieldDeleted?: string;
37
31
  updatePartial?: boolean;
38
32
  changesSince?: 'all' | 'last-sync';
39
33
  generateId?: () => string | number;
34
+ subscribe?: (params: SyncedSubscribeParams<TRemote[]>) => (() => void) | void;
40
35
  }
41
36
  type InitialValue<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<string | number, TLocal> : TAsOption extends 'object' ? Record<string | number, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
42
37
  type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<TLocal extends {
@@ -44,11 +39,7 @@ type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption ex
44
39
  } ? number : string, TLocal> : TAsOption extends 'object' ? Record<TLocal extends {
45
40
  id: number;
46
41
  } ? number : string, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
47
- declare function syncedCrud<TRemote extends {
48
- id: string | number;
49
- }, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
50
- declare function syncedCrud<TRemote extends {
51
- id: string | number;
52
- }, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
42
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
43
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
53
44
 
54
45
  export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, syncedCrud };
@@ -1,42 +1,37 @@
1
- import { SyncedGetParams, SyncedOptions, SyncedSetParams } from '@legendapp/state/sync';
1
+ import { SyncedGetParams, SyncedOptions, SyncedSetParams, SyncedSubscribeParams } from '@legendapp/state/sync';
2
2
 
3
3
  type CrudAsOption = 'Map' | 'object' | 'value' | 'array';
4
4
  type CrudResult<T> = T;
5
- interface SyncedCrudPropsSingle<TRemote, TLocal> {
6
- get?: (params: SyncedGetParams) => Promise<CrudResult<TRemote | null>> | CrudResult<TRemote | null>;
5
+ interface SyncedCrudPropsSingle<TRemote extends object, TLocal> {
6
+ get?: (params: SyncedGetParams<TRemote>) => Promise<CrudResult<TRemote | null>> | CrudResult<TRemote | null>;
7
7
  initial?: InitialValue<TLocal, 'value'>;
8
8
  as?: never | 'value';
9
9
  }
10
- interface SyncedCrudPropsMany<TRemote, TLocal, TAsOption extends CrudAsOption> {
11
- list?: (params: SyncedGetParams) => Promise<CrudResult<TRemote[] | null>> | CrudResult<TRemote[] | null>;
10
+ interface SyncedCrudPropsMany<TRemote extends object, TLocal, TAsOption extends CrudAsOption> {
11
+ list?: (params: SyncedGetParams<TRemote>) => Promise<CrudResult<TRemote[] | null>> | CrudResult<TRemote[] | null>;
12
12
  as?: TAsOption;
13
13
  initial?: InitialValue<TLocal, TAsOption>;
14
14
  }
15
- interface SyncedCrudOnSavedParams<TRemote extends {
16
- id: string | number;
17
- }, TLocal> {
15
+ interface SyncedCrudOnSavedParams<TRemote extends object, TLocal> {
18
16
  saved: TLocal;
19
17
  input: TRemote;
20
18
  currentValue: TLocal;
21
19
  isCreate: boolean;
22
20
  props: SyncedCrudPropsBase<TRemote, TLocal>;
23
21
  }
24
- interface SyncedCrudPropsBase<TRemote extends {
25
- id: string | number;
26
- }, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial'> {
27
- create?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<TRemote> | null | undefined>;
28
- update?(input: Partial<TRemote>, params: SyncedSetParams<TRemote>): Promise<CrudResult<Partial<TRemote> | null | undefined>>;
29
- delete?(input: {
30
- id: TRemote['id'];
31
- }, params: SyncedSetParams<TRemote>): Promise<CrudResult<any>>;
22
+ interface SyncedCrudPropsBase<TRemote extends object, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial' | 'subscribe'> {
23
+ create?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<TRemote> | null | undefined | void>;
24
+ update?(input: Partial<TRemote>, params: SyncedSetParams<TRemote>): Promise<CrudResult<Partial<TRemote> | null | undefined | void>>;
25
+ delete?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<any>>;
32
26
  onSaved?(params: SyncedCrudOnSavedParams<TRemote, TLocal>): Partial<TLocal> | void;
33
- onSavedUpdate?: 'createdUpdatedAt';
27
+ fieldId?: string;
34
28
  fieldUpdatedAt?: string;
35
29
  fieldCreatedAt?: string;
36
30
  fieldDeleted?: string;
37
31
  updatePartial?: boolean;
38
32
  changesSince?: 'all' | 'last-sync';
39
33
  generateId?: () => string | number;
34
+ subscribe?: (params: SyncedSubscribeParams<TRemote[]>) => (() => void) | void;
40
35
  }
41
36
  type InitialValue<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<string | number, TLocal> : TAsOption extends 'object' ? Record<string | number, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
42
37
  type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<TLocal extends {
@@ -44,11 +39,7 @@ type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption ex
44
39
  } ? number : string, TLocal> : TAsOption extends 'object' ? Record<TLocal extends {
45
40
  id: number;
46
41
  } ? number : string, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
47
- declare function syncedCrud<TRemote extends {
48
- id: string | number;
49
- }, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
50
- declare function syncedCrud<TRemote extends {
51
- id: string | number;
52
- }, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
42
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
43
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
53
44
 
54
45
  export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, syncedCrud };