@legendapp/state 3.0.0-alpha.9 → 3.0.0-beta.0
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/.DS_Store +0 -0
- package/config/configureLegendState.d.mts +13 -0
- package/config/configureLegendState.d.ts +13 -0
- package/config/configureLegendState.js +45 -0
- package/config/configureLegendState.mjs +43 -0
- 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/helpers/trackHistory.js +2 -2
- package/helpers/trackHistory.mjs +2 -2
- package/index.d.mts +103 -79
- package/index.d.ts +103 -79
- package/index.js +326 -316
- package/index.mjs +323 -314
- package/package.json +36 -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 +8 -4
- package/persist-plugins/async-storage.mjs +8 -5
- package/persist-plugins/indexeddb.d.mts +6 -4
- package/persist-plugins/indexeddb.d.ts +6 -4
- package/persist-plugins/indexeddb.js +35 -15
- package/persist-plugins/indexeddb.mjs +35 -16
- package/persist-plugins/mmkv.d.mts +5 -1
- package/persist-plugins/mmkv.d.ts +5 -1
- package/persist-plugins/mmkv.js +10 -5
- package/persist-plugins/mmkv.mjs +10 -6
- package/react-reactive/enableReactComponents.d.mts +9 -0
- package/react-reactive/enableReactComponents.d.ts +9 -0
- package/react-reactive/enableReactComponents.js +19 -0
- package/react-reactive/enableReactComponents.mjs +17 -0
- package/react-reactive/enableReactNativeComponents.d.mts +22 -0
- package/react-reactive/enableReactNativeComponents.d.ts +22 -0
- package/react-reactive/enableReactNativeComponents.js +53 -0
- package/react-reactive/enableReactNativeComponents.mjs +51 -0
- package/react-reactive/enableReactive.d.mts +5 -0
- package/react-reactive/enableReactive.d.ts +5 -0
- package/react-reactive/enableReactive.js +24 -0
- package/react-reactive/enableReactive.mjs +22 -0
- package/react-reactive/enableReactive.native.d.mts +5 -0
- package/react-reactive/enableReactive.native.d.ts +5 -0
- package/react-reactive/enableReactive.native.js +58 -0
- package/react-reactive/enableReactive.native.mjs +56 -0
- package/react-reactive/enableReactive.web.d.mts +5 -0
- package/react-reactive/enableReactive.web.d.ts +5 -0
- package/react-reactive/enableReactive.web.js +58 -0
- package/react-reactive/enableReactive.web.mjs +56 -0
- package/react.d.mts +39 -34
- package/react.d.ts +39 -34
- package/react.js +39 -17
- package/react.mjs +39 -17
- package/sync-plugins/crud.d.mts +21 -23
- package/sync-plugins/crud.d.ts +21 -23
- package/sync-plugins/crud.js +224 -112
- package/sync-plugins/crud.mjs +226 -114
- package/sync-plugins/fetch.js +12 -8
- package/sync-plugins/fetch.mjs +13 -9
- package/sync-plugins/firebase.d.mts +27 -0
- package/sync-plugins/firebase.d.ts +27 -0
- package/sync-plugins/firebase.js +373 -0
- package/sync-plugins/firebase.mjs +368 -0
- package/sync-plugins/keel.d.mts +43 -26
- package/sync-plugins/keel.d.ts +43 -26
- package/sync-plugins/keel.js +145 -99
- package/sync-plugins/keel.mjs +147 -99
- package/sync-plugins/supabase.d.mts +19 -9
- package/sync-plugins/supabase.d.ts +19 -9
- package/sync-plugins/supabase.js +52 -21
- package/sync-plugins/supabase.mjs +53 -22
- package/sync-plugins/tanstack-query.d.mts +2 -2
- package/sync-plugins/tanstack-query.d.ts +2 -2
- package/sync-plugins/tanstack-query.js +22 -5
- package/sync-plugins/tanstack-query.mjs +22 -5
- package/sync-plugins/tanstack-react-query.d.mts +1 -1
- package/sync-plugins/tanstack-react-query.d.ts +1 -1
- package/sync-plugins/tanstack-react-query.js +8 -1
- package/sync-plugins/tanstack-react-query.mjs +8 -1
- package/sync.d.mts +74 -200
- package/sync.d.ts +74 -200
- package/sync.js +495 -281
- package/sync.mjs +500 -286
package/sync-plugins/crud.js
CHANGED
|
@@ -5,14 +5,25 @@ var sync = require('@legendapp/state/sync');
|
|
|
5
5
|
|
|
6
6
|
// src/sync-plugins/crud.ts
|
|
7
7
|
var { clone } = state.internal;
|
|
8
|
+
var { waitForSet } = sync.internal;
|
|
8
9
|
function transformOut(data, transform) {
|
|
9
10
|
return transform ? transform(clone(data)) : data;
|
|
10
11
|
}
|
|
11
|
-
function ensureId(obj, generateId) {
|
|
12
|
-
if (!obj
|
|
13
|
-
obj
|
|
12
|
+
function ensureId(obj, fieldId, generateId) {
|
|
13
|
+
if (!obj[fieldId]) {
|
|
14
|
+
obj[fieldId] = generateId();
|
|
14
15
|
}
|
|
15
|
-
return obj
|
|
16
|
+
return obj[fieldId];
|
|
17
|
+
}
|
|
18
|
+
function computeLastSync(data, fieldUpdatedAt, fieldCreatedAt) {
|
|
19
|
+
let newLastSync = 0;
|
|
20
|
+
for (let i = 0; i < data.length; i++) {
|
|
21
|
+
const updated = (fieldUpdatedAt ? data[i][fieldUpdatedAt] : 0) || (fieldCreatedAt ? data[i][fieldCreatedAt] : 0);
|
|
22
|
+
if (updated) {
|
|
23
|
+
newLastSync = Math.max(newLastSync, +new Date(updated));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return newLastSync;
|
|
16
27
|
}
|
|
17
28
|
function syncedCrud(props) {
|
|
18
29
|
const {
|
|
@@ -22,167 +33,233 @@ function syncedCrud(props) {
|
|
|
22
33
|
update: updateFn,
|
|
23
34
|
delete: deleteFn,
|
|
24
35
|
transform,
|
|
36
|
+
fieldId: fieldIdProp,
|
|
25
37
|
fieldCreatedAt,
|
|
26
38
|
fieldUpdatedAt,
|
|
27
39
|
fieldDeleted,
|
|
40
|
+
fieldDeletedList,
|
|
28
41
|
updatePartial,
|
|
42
|
+
subscribe: subscribeProp,
|
|
29
43
|
onSaved,
|
|
30
44
|
mode: modeParam,
|
|
31
45
|
changesSince,
|
|
32
46
|
generateId,
|
|
47
|
+
waitForSet: waitForSetParam,
|
|
33
48
|
...rest
|
|
34
49
|
} = props;
|
|
50
|
+
const fieldId = fieldIdProp || "id";
|
|
51
|
+
const pendingCreates = /* @__PURE__ */ new Set();
|
|
35
52
|
let asType = props.as;
|
|
36
53
|
if (!asType) {
|
|
37
54
|
asType = getFn ? "value" : "object";
|
|
38
55
|
}
|
|
39
56
|
const asMap = asType === "Map";
|
|
40
57
|
const asArray = asType === "array";
|
|
41
|
-
const
|
|
58
|
+
const resultsToOutType = (results) => {
|
|
59
|
+
if (asType === "value") {
|
|
60
|
+
return results[0];
|
|
61
|
+
}
|
|
62
|
+
const out = asType === "array" ? [] : asMap ? /* @__PURE__ */ new Map() : {};
|
|
63
|
+
for (let i = 0; i < results.length; i++) {
|
|
64
|
+
let result = results[i];
|
|
65
|
+
const value = result;
|
|
66
|
+
if (value) {
|
|
67
|
+
result = fieldDeleted && result[fieldDeleted] || fieldDeletedList && result[fieldDeletedList] || result[state.symbolDelete] ? state.internal.symbolDelete : result;
|
|
68
|
+
if (asArray) {
|
|
69
|
+
out.push(result);
|
|
70
|
+
} else if (asMap) {
|
|
71
|
+
out.set(value[fieldId], result);
|
|
72
|
+
} else {
|
|
73
|
+
out[value[fieldId]] = result;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return out;
|
|
78
|
+
};
|
|
79
|
+
const transformRows = (data) => {
|
|
80
|
+
return Promise.all(
|
|
81
|
+
data.map(
|
|
82
|
+
(value) => (
|
|
83
|
+
// Skip transforming any children with symbolDelete or fieldDeleted because they'll get deleted by resultsToOutType
|
|
84
|
+
value[state.symbolDelete] || fieldDeleted && value[fieldDeleted] || fieldDeletedList && value[fieldDeletedList] ? value : transform.load(value, "get")
|
|
85
|
+
)
|
|
86
|
+
)
|
|
87
|
+
);
|
|
88
|
+
};
|
|
89
|
+
const get = getFn || listFn ? (getParams) => {
|
|
42
90
|
const { updateLastSync, lastSync, value } = getParams;
|
|
43
91
|
if (listFn) {
|
|
44
92
|
const isLastSyncMode = changesSince === "last-sync";
|
|
45
93
|
if (isLastSyncMode && lastSync) {
|
|
46
94
|
getParams.mode = modeParam || (asType === "array" ? "append" : asType === "value" ? "set" : "assign");
|
|
47
95
|
}
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
96
|
+
const listPromise = listFn(getParams);
|
|
97
|
+
const toOut = (transformed) => {
|
|
98
|
+
var _a;
|
|
99
|
+
if (asType === "value") {
|
|
100
|
+
return transformed.length > 0 ? transformed[0] : (_a = (isLastSyncMode && lastSync || fieldDeleted) && value) != null ? _a : null;
|
|
101
|
+
} else {
|
|
102
|
+
return resultsToOutType(transformed);
|
|
54
103
|
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
if (asType === "value") {
|
|
64
|
-
return transformed.length > 0 ? transformed[0] : isLastSyncMode && lastSync && value || null;
|
|
65
|
-
} else {
|
|
66
|
-
const results = transformed.map(
|
|
67
|
-
(result) => result[fieldDeleted] || result.__deleted ? state.internal.symbolDelete : result
|
|
68
|
-
);
|
|
69
|
-
const out = asType === "array" ? [] : asMap ? /* @__PURE__ */ new Map() : {};
|
|
70
|
-
for (let i = 0; i < results.length; i++) {
|
|
71
|
-
let result = results[i];
|
|
72
|
-
result = result[fieldDeleted] || result.__deleted ? state.internal.symbolDelete : result;
|
|
73
|
-
if (asArray) {
|
|
74
|
-
out.push(result);
|
|
75
|
-
} else if (asMap) {
|
|
76
|
-
out.set(result.id, result);
|
|
77
|
-
} else {
|
|
78
|
-
out[result.id] = result;
|
|
104
|
+
};
|
|
105
|
+
const processResults = (data) => {
|
|
106
|
+
data || (data = []);
|
|
107
|
+
if (fieldUpdatedAt) {
|
|
108
|
+
const newLastSync = computeLastSync(data, fieldUpdatedAt, fieldCreatedAt);
|
|
109
|
+
if (newLastSync && newLastSync !== lastSync) {
|
|
110
|
+
updateLastSync(newLastSync);
|
|
79
111
|
}
|
|
80
112
|
}
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
} else if (getFn) {
|
|
84
|
-
const data = await getFn(getParams);
|
|
85
|
-
let transformed = data;
|
|
86
|
-
if (data) {
|
|
87
|
-
const newLastSync = data[fieldUpdatedAt] || data[fieldCreatedAt];
|
|
88
|
-
if (newLastSync && newLastSync !== lastSync) {
|
|
89
|
-
updateLastSync(newLastSync);
|
|
90
|
-
}
|
|
113
|
+
let transformed = data;
|
|
91
114
|
if (transform == null ? void 0 : transform.load) {
|
|
92
|
-
transformed =
|
|
115
|
+
transformed = transformRows(data);
|
|
93
116
|
}
|
|
94
|
-
|
|
95
|
-
|
|
117
|
+
return state.isPromise(transformed) ? transformed.then(toOut) : toOut(transformed);
|
|
118
|
+
};
|
|
119
|
+
return state.isPromise(listPromise) ? listPromise.then(processResults) : processResults(listPromise);
|
|
120
|
+
} else if (getFn) {
|
|
121
|
+
const dataPromise = getFn(getParams);
|
|
122
|
+
const processData = (data) => {
|
|
123
|
+
let transformed = data;
|
|
124
|
+
if (data) {
|
|
125
|
+
const newLastSync = data[fieldUpdatedAt] || data[fieldCreatedAt];
|
|
126
|
+
if (newLastSync && newLastSync !== lastSync) {
|
|
127
|
+
updateLastSync(newLastSync);
|
|
128
|
+
}
|
|
129
|
+
if (transform == null ? void 0 : transform.load) {
|
|
130
|
+
transformed = transform.load(data, "get");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return transformed;
|
|
134
|
+
};
|
|
135
|
+
return state.isPromise(dataPromise) ? dataPromise.then(processData) : processData(dataPromise);
|
|
96
136
|
}
|
|
97
137
|
} : void 0;
|
|
98
138
|
const set = createFn || updateFn || deleteFn ? async (params) => {
|
|
99
|
-
const { value, changes, update, retryAsCreate,
|
|
139
|
+
const { value, changes, update, retryAsCreate, node } = params;
|
|
100
140
|
const creates = /* @__PURE__ */ new Map();
|
|
101
141
|
const updates = /* @__PURE__ */ new Map();
|
|
102
142
|
const deletes = /* @__PURE__ */ new Set();
|
|
103
|
-
|
|
143
|
+
const getUpdateValue = (itemValue, prev) => {
|
|
144
|
+
return updatePartial ? Object.assign(
|
|
145
|
+
sync.diffObjects(
|
|
146
|
+
prev,
|
|
147
|
+
itemValue,
|
|
148
|
+
/*deep*/
|
|
149
|
+
true
|
|
150
|
+
),
|
|
151
|
+
itemValue[fieldId] ? { [fieldId]: itemValue[fieldId] } : {}
|
|
152
|
+
) : itemValue;
|
|
153
|
+
};
|
|
154
|
+
changes.forEach((change) => {
|
|
155
|
+
const { path, prevAtPath, valueAtPath, pathTypes } = change;
|
|
104
156
|
if (asType === "value") {
|
|
105
157
|
if (value) {
|
|
106
|
-
let id = value == null ? void 0 : value
|
|
107
|
-
|
|
158
|
+
let id = value == null ? void 0 : value[fieldId];
|
|
159
|
+
let isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
|
|
108
160
|
if (!id && generateId) {
|
|
109
|
-
id = ensureId(value, generateId);
|
|
161
|
+
id = ensureId(value, fieldId, generateId);
|
|
110
162
|
}
|
|
111
163
|
if (id) {
|
|
164
|
+
if (pendingCreates.has(id)) {
|
|
165
|
+
isCreate = false;
|
|
166
|
+
}
|
|
112
167
|
if (isCreate || retryAsCreate) {
|
|
113
|
-
|
|
168
|
+
if (createFn) {
|
|
169
|
+
creates.set(id, value);
|
|
170
|
+
} else {
|
|
171
|
+
console.warn("[legend-state] missing create function");
|
|
172
|
+
}
|
|
114
173
|
} else if (path.length === 0) {
|
|
115
174
|
if (valueAtPath) {
|
|
116
|
-
updates.set(id, valueAtPath);
|
|
175
|
+
updates.set(id, getUpdateValue(valueAtPath, prevAtPath));
|
|
117
176
|
} else if (prevAtPath) {
|
|
118
|
-
deletes.add(prevAtPath
|
|
177
|
+
deletes.add(prevAtPath);
|
|
119
178
|
}
|
|
120
|
-
} else {
|
|
121
|
-
|
|
179
|
+
} else if (!updates.has(id)) {
|
|
180
|
+
const previous = state.applyChanges(
|
|
181
|
+
clone(value),
|
|
182
|
+
changes,
|
|
183
|
+
/*applyPrevious*/
|
|
184
|
+
true
|
|
185
|
+
);
|
|
186
|
+
updates.set(id, getUpdateValue(value, previous));
|
|
122
187
|
}
|
|
123
188
|
} else {
|
|
124
189
|
console.error("[legend-state]: added synced item without an id");
|
|
125
190
|
}
|
|
126
191
|
} else if (path.length === 0) {
|
|
127
|
-
|
|
128
|
-
if (id) {
|
|
129
|
-
deletes.add(id);
|
|
130
|
-
}
|
|
192
|
+
deletes.add(prevAtPath);
|
|
131
193
|
}
|
|
132
194
|
} else {
|
|
133
|
-
let itemsChanged =
|
|
195
|
+
let itemsChanged = [];
|
|
134
196
|
if (path.length === 0) {
|
|
135
|
-
|
|
197
|
+
const changed = asMap ? Array.from(valueAtPath.entries()) : Object.entries(valueAtPath);
|
|
198
|
+
for (let i = 0; i < changed.length; i++) {
|
|
199
|
+
const [key, value2] = changed[i];
|
|
136
200
|
const prev = asMap ? prevAtPath.get(key) : prevAtPath[key];
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
201
|
+
if (state.isNullOrUndefined(value2) && !state.isNullOrUndefined(prev)) {
|
|
202
|
+
deletes.add(prev);
|
|
203
|
+
return false;
|
|
204
|
+
} else {
|
|
205
|
+
const isDiff = !prevAtPath || !sync.deepEqual(value2, prev);
|
|
206
|
+
if (isDiff) {
|
|
207
|
+
itemsChanged.push([getUpdateValue(value2, prev), prev]);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
140
211
|
} else {
|
|
141
212
|
const itemKey = path[0];
|
|
142
213
|
const itemValue = asMap ? value.get(itemKey) : value[itemKey];
|
|
143
214
|
if (!itemValue) {
|
|
144
215
|
if (path.length === 1 && prevAtPath) {
|
|
145
|
-
deletes.add(
|
|
216
|
+
deletes.add(prevAtPath);
|
|
146
217
|
}
|
|
147
218
|
} else {
|
|
148
|
-
|
|
219
|
+
const previous = state.setAtPath(
|
|
220
|
+
clone(itemValue),
|
|
221
|
+
path.slice(1),
|
|
222
|
+
pathTypes.slice(1),
|
|
223
|
+
prevAtPath
|
|
224
|
+
);
|
|
225
|
+
itemsChanged = [[getUpdateValue(itemValue, previous), previous]];
|
|
149
226
|
}
|
|
150
227
|
}
|
|
151
|
-
itemsChanged == null ? void 0 : itemsChanged.forEach(([
|
|
152
|
-
|
|
153
|
-
|
|
228
|
+
itemsChanged == null ? void 0 : itemsChanged.forEach(([item, prev]) => {
|
|
229
|
+
const isCreate = !pendingCreates.has(item[fieldId]) && (fieldCreatedAt ? !item[fieldCreatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : fieldUpdatedAt ? !item[fieldUpdatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : state.isNullOrUndefined(prev));
|
|
230
|
+
if (isCreate) {
|
|
231
|
+
if (generateId) {
|
|
232
|
+
ensureId(item, fieldId, generateId);
|
|
233
|
+
}
|
|
234
|
+
if (!item[fieldId]) {
|
|
235
|
+
console.error("[legend-state]: added item without an id");
|
|
236
|
+
}
|
|
237
|
+
if (createFn) {
|
|
238
|
+
pendingCreates.add(item[fieldId]);
|
|
239
|
+
creates.set(item[fieldId], item);
|
|
240
|
+
} else {
|
|
241
|
+
console.warn("[legend-state] missing create function");
|
|
242
|
+
}
|
|
154
243
|
} else {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
if (!item.id) {
|
|
162
|
-
console.error("[legend-state]: added item without an id");
|
|
163
|
-
}
|
|
164
|
-
if (createFn) {
|
|
165
|
-
creates.set(item.id, item);
|
|
166
|
-
} else {
|
|
167
|
-
console.log("[legend-state] missing create function");
|
|
168
|
-
}
|
|
244
|
+
if (updateFn) {
|
|
245
|
+
updates.set(
|
|
246
|
+
item[fieldId],
|
|
247
|
+
updates.has(item[fieldId]) ? Object.assign(updates.get(item[fieldId]), item) : item
|
|
248
|
+
);
|
|
169
249
|
} else {
|
|
170
|
-
|
|
171
|
-
updates.set(item.id, item);
|
|
172
|
-
} else {
|
|
173
|
-
console.log("[legend-state] missing update function");
|
|
174
|
-
}
|
|
250
|
+
console.warn("[legend-state] missing update function");
|
|
175
251
|
}
|
|
176
252
|
}
|
|
177
253
|
});
|
|
178
254
|
}
|
|
179
255
|
});
|
|
180
256
|
const saveResult = async (itemKey, input, data, isCreate) => {
|
|
257
|
+
var _a;
|
|
181
258
|
if (data) {
|
|
182
|
-
const saved = (transform == null ? void 0 : transform.load) ? transform.load(data, "set") : data;
|
|
259
|
+
const saved = (transform == null ? void 0 : transform.load) ? await transform.load(data, "set") : data;
|
|
183
260
|
const isChild = itemKey !== "undefined" && asType !== "value";
|
|
184
261
|
const currentPeeked = state.getNodeValue(node);
|
|
185
|
-
const currentValue = isChild ?
|
|
262
|
+
const currentValue = isChild ? (_a = asType === "array" && state.isArray(currentPeeked) ? currentPeeked.find((v) => v[fieldId] === itemKey) : void 0) != null ? _a : currentPeeked[itemKey] : currentPeeked;
|
|
186
263
|
const dataOnSaved = {
|
|
187
264
|
saved,
|
|
188
265
|
input,
|
|
@@ -191,7 +268,7 @@ function syncedCrud(props) {
|
|
|
191
268
|
props
|
|
192
269
|
};
|
|
193
270
|
let savedOut = saved;
|
|
194
|
-
if (savedOut) {
|
|
271
|
+
if (savedOut && !state.isNullOrUndefined(currentValue)) {
|
|
195
272
|
savedOut = clone(savedOut);
|
|
196
273
|
Object.keys(savedOut).forEach((key) => {
|
|
197
274
|
const i = input[key];
|
|
@@ -222,38 +299,73 @@ function syncedCrud(props) {
|
|
|
222
299
|
}
|
|
223
300
|
};
|
|
224
301
|
return Promise.all([
|
|
225
|
-
...Array.from(creates).map(([itemKey, itemValue]) => {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
);
|
|
302
|
+
...Array.from(creates).map(async ([itemKey, itemValue]) => {
|
|
303
|
+
if (waitForSetParam) {
|
|
304
|
+
await waitForSet(waitForSetParam, changes, itemValue, { type: "create" });
|
|
305
|
+
}
|
|
306
|
+
const createObj = await transformOut(itemValue, transform == null ? void 0 : transform.save);
|
|
307
|
+
return createFn(createObj, params).then((result) => {
|
|
308
|
+
return saveResult(itemKey, createObj, result, true);
|
|
309
|
+
}).finally(() => {
|
|
310
|
+
pendingCreates.delete(itemKey);
|
|
311
|
+
});
|
|
230
312
|
}),
|
|
231
|
-
...Array.from(updates).map(([itemKey, itemValue]) => {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const changed = transformOut(toSave, transform == null ? void 0 : transform.save);
|
|
313
|
+
...Array.from(updates).map(async ([itemKey, itemValue]) => {
|
|
314
|
+
if (waitForSetParam) {
|
|
315
|
+
await waitForSet(waitForSetParam, changes, itemValue, { type: "update" });
|
|
316
|
+
}
|
|
317
|
+
const toSave = itemValue;
|
|
318
|
+
const changed = await transformOut(toSave, transform == null ? void 0 : transform.save);
|
|
237
319
|
if (Object.keys(changed).length > 0) {
|
|
238
320
|
return updateFn(changed, params).then(
|
|
239
321
|
(result) => result && saveResult(itemKey, changed, result, false)
|
|
240
322
|
);
|
|
241
323
|
}
|
|
242
324
|
}),
|
|
243
|
-
...Array.from(deletes).map((
|
|
244
|
-
if (
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
325
|
+
...Array.from(deletes).map(async (valuePrevious) => {
|
|
326
|
+
if (valuePrevious !== state.symbolDelete) {
|
|
327
|
+
if (waitForSetParam) {
|
|
328
|
+
await waitForSet(waitForSetParam, changes, valuePrevious, { type: "delete" });
|
|
329
|
+
}
|
|
330
|
+
if (deleteFn) {
|
|
331
|
+
deleteFn(valuePrevious, params);
|
|
332
|
+
} else if (fieldDeleted && updateFn) {
|
|
333
|
+
const valueId = valuePrevious[fieldId];
|
|
334
|
+
if (valueId) {
|
|
335
|
+
updateFn({ ...{ [fieldId]: valueId }, [fieldDeleted]: true }, params);
|
|
336
|
+
} else {
|
|
337
|
+
console.error("[legend-state]: deleting item without an id");
|
|
338
|
+
}
|
|
339
|
+
} else {
|
|
340
|
+
console.warn("[legend-state] missing delete function");
|
|
341
|
+
}
|
|
250
342
|
}
|
|
251
343
|
})
|
|
252
344
|
]);
|
|
253
345
|
} : void 0;
|
|
346
|
+
const subscribe = subscribeProp ? (params) => subscribeProp({
|
|
347
|
+
...params,
|
|
348
|
+
update: async (paramsUpdate) => {
|
|
349
|
+
const paramsForUpdate = paramsUpdate;
|
|
350
|
+
const rows = paramsUpdate.value;
|
|
351
|
+
if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
|
|
352
|
+
if (!state.isArray(rows)) {
|
|
353
|
+
console.error("[legend-state] subscribe:update expects an array of changed items");
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const newLastSync = computeLastSync(rows, fieldUpdatedAt, fieldCreatedAt);
|
|
357
|
+
if (newLastSync) {
|
|
358
|
+
paramsForUpdate.lastSync = newLastSync;
|
|
359
|
+
}
|
|
360
|
+
const rowsTransformed = (transform == null ? void 0 : transform.load) ? await transformRows(rows) : rows;
|
|
361
|
+
paramsForUpdate.value = resultsToOutType(rowsTransformed);
|
|
362
|
+
params.update(paramsForUpdate);
|
|
363
|
+
}
|
|
364
|
+
}) : void 0;
|
|
254
365
|
return sync.synced({
|
|
255
366
|
set,
|
|
256
367
|
get,
|
|
368
|
+
subscribe,
|
|
257
369
|
mode: modeParam,
|
|
258
370
|
...rest
|
|
259
371
|
});
|