@aws-amplify/datastore 4.1.1 → 4.1.2

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 (26) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +52 -28
  3. package/lib/storage/adapter/AsyncStorageAdapter.js +212 -476
  4. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  5. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  6. package/lib/storage/adapter/IndexedDBAdapter.d.ts +53 -28
  7. package/lib/storage/adapter/IndexedDBAdapter.js +589 -892
  8. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  9. package/lib/storage/adapter/StorageAdapterBase.d.ts +146 -0
  10. package/lib/storage/adapter/StorageAdapterBase.js +479 -0
  11. package/lib/storage/adapter/StorageAdapterBase.js.map +1 -0
  12. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +52 -28
  13. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +215 -479
  14. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  15. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  16. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +53 -28
  17. package/lib-esm/storage/adapter/IndexedDBAdapter.js +588 -891
  18. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  19. package/lib-esm/storage/adapter/StorageAdapterBase.d.ts +146 -0
  20. package/lib-esm/storage/adapter/StorageAdapterBase.js +477 -0
  21. package/lib-esm/storage/adapter/StorageAdapterBase.js.map +1 -0
  22. package/package.json +6 -6
  23. package/src/storage/adapter/AsyncStorageAdapter.ts +239 -543
  24. package/src/storage/adapter/AsyncStorageDatabase.ts +2 -2
  25. package/src/storage/adapter/IndexedDBAdapter.ts +423 -786
  26. package/src/storage/adapter/StorageAdapterBase.ts +639 -0
@@ -1,107 +1,133 @@
1
- import { __asyncValues, __awaiter, __generator, __values } from "tslib";
2
- import { ConsoleLogger as Logger } from '@aws-amplify/core';
1
+ import { __asyncValues, __awaiter, __extends, __generator, __values } from "tslib";
3
2
  import AsyncStorageDatabase from './AsyncStorageDatabase';
4
- import { ModelPredicateCreator } from '../../predicates';
5
- import { isPredicateObj, OpType, QueryOne, } from '../../types';
6
- import { DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR, getIndex, getIndexFromAssociation, isModelConstructor, traverseModel, validatePredicate, inMemoryPagination, keysEqual, getStorename, getIndexKeys, extractPrimaryKeyValues, IDENTIFIER_KEY_SEPARATOR, } from '../../util';
7
- var logger = new Logger('DataStore');
8
- var AsyncStorageAdapter = /** @class */ (function () {
3
+ import { OpType, QueryOne, } from '../../types';
4
+ import { DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR, getIndex, getIndexFromAssociation, traverseModel, validatePredicate, inMemoryPagination, keysEqual, getStorename, getIndexKeys, IDENTIFIER_KEY_SEPARATOR, } from '../../util';
5
+ import { StorageAdapterBase } from './StorageAdapterBase';
6
+ var AsyncStorageAdapter = /** @class */ (function (_super) {
7
+ __extends(AsyncStorageAdapter, _super);
9
8
  function AsyncStorageAdapter() {
9
+ return _super !== null && _super.apply(this, arguments) || this;
10
10
  }
11
- AsyncStorageAdapter.prototype.getStorenameForModel = function (modelConstructor) {
12
- var namespace = this.namespaceResolver(modelConstructor);
13
- var modelName = modelConstructor.name;
14
- return getStorename(namespace, modelName);
11
+ // no-ops for this adapter
12
+ AsyncStorageAdapter.prototype.preSetUpChecks = function () {
13
+ return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
14
+ return [2 /*return*/];
15
+ }); });
15
16
  };
16
- // Retrieves primary key values from a model
17
- AsyncStorageAdapter.prototype.getIndexKeyValuesFromModel = function (model) {
18
- var modelConstructor = Object.getPrototypeOf(model)
19
- .constructor;
20
- var namespaceName = this.namespaceResolver(modelConstructor);
21
- var keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
22
- return extractPrimaryKeyValues(model, keys);
17
+ AsyncStorageAdapter.prototype.preOpCheck = function () {
18
+ return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
19
+ return [2 /*return*/];
20
+ }); });
23
21
  };
24
- // Retrieves concatenated primary key values from a model
25
- AsyncStorageAdapter.prototype.getIndexKeyValuesPath = function (model) {
26
- return this.getIndexKeyValuesFromModel(model).join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
27
- };
28
- AsyncStorageAdapter.prototype.setUp = function (theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName) {
22
+ /**
23
+ * Open AsyncStorage database
24
+ * Create new DB if one doesn't exist
25
+ *
26
+ * Called by `StorageAdapterBase.setUp()`
27
+ *
28
+ * @returns AsyncStorageDatabase instance
29
+ */
30
+ AsyncStorageAdapter.prototype.initDb = function () {
29
31
  return __awaiter(this, void 0, void 0, function () {
30
- var error_1;
31
- var _this = this;
32
+ var db;
32
33
  return __generator(this, function (_a) {
33
34
  switch (_a.label) {
34
35
  case 0:
35
- if (!!this.initPromise) return [3 /*break*/, 1];
36
- this.initPromise = new Promise(function (res, rej) {
37
- _this.resolve = res;
38
- _this.reject = rej;
39
- });
40
- return [3 /*break*/, 3];
41
- case 1: return [4 /*yield*/, this.initPromise];
42
- case 2:
36
+ db = new AsyncStorageDatabase();
37
+ return [4 /*yield*/, db.init()];
38
+ case 1:
43
39
  _a.sent();
44
- return [2 /*return*/];
45
- case 3:
46
- this.schema = theSchema;
47
- this.namespaceResolver = namespaceResolver;
48
- this.modelInstanceCreator = modelInstanceCreator;
49
- this.getModelConstructorByModelName = getModelConstructorByModelName;
50
- _a.label = 4;
51
- case 4:
52
- _a.trys.push([4, 7, , 8]);
53
- if (!!this.db) return [3 /*break*/, 6];
54
- this.db = new AsyncStorageDatabase();
55
- return [4 /*yield*/, this.db.init()];
56
- case 5:
40
+ return [2 /*return*/, db];
41
+ }
42
+ });
43
+ });
44
+ };
45
+ AsyncStorageAdapter.prototype.clear = function () {
46
+ return __awaiter(this, void 0, void 0, function () {
47
+ return __generator(this, function (_a) {
48
+ switch (_a.label) {
49
+ case 0: return [4 /*yield*/, this.db.clear()];
50
+ case 1:
57
51
  _a.sent();
58
- this.resolve();
59
- _a.label = 6;
60
- case 6: return [3 /*break*/, 8];
61
- case 7:
62
- error_1 = _a.sent();
63
- this.reject(error_1);
64
- return [3 /*break*/, 8];
65
- case 8: return [2 /*return*/];
52
+ this.db = undefined;
53
+ this.initPromise = undefined;
54
+ return [2 /*return*/];
66
55
  }
67
56
  });
68
57
  });
69
58
  };
70
- AsyncStorageAdapter.prototype.save = function (model, condition) {
71
- var e_1, _a;
59
+ AsyncStorageAdapter.prototype.batchSave = function (modelConstructor, items) {
72
60
  return __awaiter(this, void 0, void 0, function () {
73
- var modelConstructor, storeName, namespaceName, connectedModels, set, connectionStoreNames, keyValuesPath, fromDB, predicates, _b, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, keys, itemKeyValues, itemKeyValuesPath, fromDB_1, opType, modelKeyValues, e_1_1;
61
+ var modelName, namespaceName, storeName, keys, batch, _loop_1, this_1, items_1, items_1_1, item;
62
+ var e_1, _a;
74
63
  var _this = this;
64
+ return __generator(this, function (_b) {
65
+ switch (_b.label) {
66
+ case 0:
67
+ if (items.length === 0) {
68
+ return [2 /*return*/, []];
69
+ }
70
+ modelName = modelConstructor.name;
71
+ namespaceName = this.namespaceResolver(modelConstructor);
72
+ storeName = getStorename(namespaceName, modelName);
73
+ keys = getIndexKeys(this.schema.namespaces[namespaceName], modelName);
74
+ batch = [];
75
+ _loop_1 = function (item) {
76
+ var model = this_1.modelInstanceCreator(modelConstructor, item);
77
+ var connectedModels = traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
78
+ var keyValuesPath = this_1.getIndexKeyValuesPath(model);
79
+ var instance = connectedModels.find(function (_a) {
80
+ var instance = _a.instance;
81
+ var instanceKeyValuesPath = _this.getIndexKeyValuesPath(instance);
82
+ return keysEqual([instanceKeyValuesPath], [keyValuesPath]);
83
+ }).instance;
84
+ batch.push(instance);
85
+ };
86
+ this_1 = this;
87
+ try {
88
+ for (items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
89
+ item = items_1_1.value;
90
+ _loop_1(item);
91
+ }
92
+ }
93
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
94
+ finally {
95
+ try {
96
+ if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
97
+ }
98
+ finally { if (e_1) throw e_1.error; }
99
+ }
100
+ return [4 /*yield*/, this.db.batchSave(storeName, batch, keys)];
101
+ case 1: return [2 /*return*/, _b.sent()];
102
+ }
103
+ });
104
+ });
105
+ };
106
+ AsyncStorageAdapter.prototype._get = function (storeName, keyArr) {
107
+ return __awaiter(this, void 0, void 0, function () {
108
+ var itemKeyValuesPath;
109
+ return __generator(this, function (_a) {
110
+ switch (_a.label) {
111
+ case 0:
112
+ itemKeyValuesPath = keyArr.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
113
+ return [4 /*yield*/, this.db.get(itemKeyValuesPath, storeName)];
114
+ case 1: return [2 /*return*/, _a.sent()];
115
+ }
116
+ });
117
+ });
118
+ };
119
+ AsyncStorageAdapter.prototype.save = function (model, condition) {
120
+ var e_2, _a;
121
+ return __awaiter(this, void 0, void 0, function () {
122
+ var _b, storeName, connectionStoreNames, modelKeyValues, fromDB, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, keys, itemKeyValues, fromDB_1, opType, e_2_1;
75
123
  return __generator(this, function (_c) {
76
124
  switch (_c.label) {
77
125
  case 0:
78
- modelConstructor = Object.getPrototypeOf(model)
79
- .constructor;
80
- storeName = this.getStorenameForModel(modelConstructor);
81
- namespaceName = this.namespaceResolver(modelConstructor);
82
- connectedModels = traverseModel(modelConstructor.name, model, this.schema.namespaces[namespaceName], this.modelInstanceCreator, this.getModelConstructorByModelName);
83
- set = new Set();
84
- connectionStoreNames = Object.values(connectedModels).map(function (_a) {
85
- var modelName = _a.modelName, item = _a.item, instance = _a.instance;
86
- var storeName = getStorename(namespaceName, modelName);
87
- set.add(storeName);
88
- var keys = getIndexKeys(_this.schema.namespaces[namespaceName], modelName);
89
- return { storeName: storeName, item: item, instance: instance, keys: keys };
90
- });
91
- keyValuesPath = this.getIndexKeyValuesPath(model);
92
- return [4 /*yield*/, this.db.get(keyValuesPath, storeName)];
126
+ _b = this.saveMetadata(model), storeName = _b.storeName, connectionStoreNames = _b.connectionStoreNames, modelKeyValues = _b.modelKeyValues;
127
+ return [4 /*yield*/, this._get(storeName, modelKeyValues)];
93
128
  case 1:
94
129
  fromDB = _c.sent();
95
- if (condition && fromDB) {
96
- predicates = ModelPredicateCreator.getPredicates(condition);
97
- _b = predicates, predicateObjs = _b.predicates, type = _b.type;
98
- isValid = validatePredicate(fromDB, type, predicateObjs);
99
- if (!isValid) {
100
- msg = 'Conditional update failed';
101
- logger.error(msg, { model: fromDB, condition: predicateObjs });
102
- throw new Error(msg);
103
- }
104
- }
130
+ this.validateSaveCondition(condition, fromDB);
105
131
  result = [];
106
132
  _c.label = 2;
107
133
  case 2:
@@ -114,15 +140,13 @@ var AsyncStorageAdapter = /** @class */ (function () {
114
140
  resItem = connectionStoreNames_1_1.value;
115
141
  storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance, keys = resItem.keys;
116
142
  itemKeyValues = keys.map(function (key) { return item[key]; });
117
- itemKeyValuesPath = itemKeyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
118
- return [4 /*yield*/, this.db.get(itemKeyValuesPath, storeName_1)];
143
+ return [4 /*yield*/, this._get(storeName_1, itemKeyValues)];
119
144
  case 5:
120
145
  fromDB_1 = _c.sent();
121
146
  opType = fromDB_1 ? OpType.UPDATE : OpType.INSERT;
122
- modelKeyValues = this.getIndexKeyValuesFromModel(model);
123
147
  if (!(keysEqual(itemKeyValues, modelKeyValues) ||
124
148
  opType === OpType.INSERT)) return [3 /*break*/, 7];
125
- return [4 /*yield*/, this.db.save(item, storeName_1, keys, itemKeyValuesPath)];
149
+ return [4 /*yield*/, this.db.save(item, storeName_1, keys, itemKeyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR))];
126
150
  case 6:
127
151
  _c.sent();
128
152
  result.push([instance, opType]);
@@ -130,8 +154,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
130
154
  case 7: return [3 /*break*/, 3];
131
155
  case 8: return [3 /*break*/, 15];
132
156
  case 9:
133
- e_1_1 = _c.sent();
134
- e_1 = { error: e_1_1 };
157
+ e_2_1 = _c.sent();
158
+ e_2 = { error: e_2_1 };
135
159
  return [3 /*break*/, 15];
136
160
  case 10:
137
161
  _c.trys.push([10, , 13, 14]);
@@ -142,7 +166,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
142
166
  _c.label = 12;
143
167
  case 12: return [3 /*break*/, 14];
144
168
  case 13:
145
- if (e_1) throw e_1.error;
169
+ if (e_2) throw e_2.error;
146
170
  return [7 /*endfinally*/];
147
171
  case 14: return [7 /*endfinally*/];
148
172
  case 15: return [2 /*return*/, result];
@@ -150,50 +174,22 @@ var AsyncStorageAdapter = /** @class */ (function () {
150
174
  });
151
175
  });
152
176
  };
153
- AsyncStorageAdapter.prototype.load = function (namespaceName, srcModelName, records) {
154
- return __awaiter(this, void 0, void 0, function () {
155
- var namespace, relations, connectionStoreNames, modelConstructor;
156
- var _this = this;
157
- return __generator(this, function (_a) {
158
- namespace = this.schema.namespaces[namespaceName];
159
- relations = namespace.relationships[srcModelName].relationTypes;
160
- connectionStoreNames = relations.map(function (_a) {
161
- var modelName = _a.modelName;
162
- return getStorename(namespaceName, modelName);
163
- });
164
- modelConstructor = this.getModelConstructorByModelName(namespaceName, srcModelName);
165
- if (connectionStoreNames.length === 0) {
166
- return [2 /*return*/, records.map(function (record) {
167
- return _this.modelInstanceCreator(modelConstructor, record);
168
- })];
169
- }
170
- return [2 /*return*/, records.map(function (record) {
171
- return _this.modelInstanceCreator(modelConstructor, record);
172
- })];
173
- });
174
- });
175
- };
176
177
  AsyncStorageAdapter.prototype.query = function (modelConstructor, predicate, pagination) {
177
178
  return __awaiter(this, void 0, void 0, function () {
178
- var storeName, namespaceName, predicates, keys, queryByKey, hasSort, hasPagination, records;
179
+ var _a, storeName, namespaceName, queryByKey, predicates, hasSort, hasPagination, records;
179
180
  var _this = this;
180
- return __generator(this, function (_a) {
181
- switch (_a.label) {
181
+ return __generator(this, function (_b) {
182
+ switch (_b.label) {
182
183
  case 0:
183
- storeName = this.getStorenameForModel(modelConstructor);
184
- namespaceName = this.namespaceResolver(modelConstructor);
185
- predicates = predicate && ModelPredicateCreator.getPredicates(predicate);
186
- keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
187
- queryByKey = predicates && this.keyValueFromPredicate(predicates, keys);
188
- hasSort = pagination && pagination.sort;
189
- hasPagination = pagination && pagination.limit;
184
+ _a = this.queryMetadata(modelConstructor, predicate, pagination), storeName = _a.storeName, namespaceName = _a.namespaceName, queryByKey = _a.queryByKey, predicates = _a.predicates, hasSort = _a.hasSort, hasPagination = _a.hasPagination;
190
185
  return [4 /*yield*/, (function () { return __awaiter(_this, void 0, void 0, function () {
191
- var record, filtered, all;
186
+ var keyValues, record, filtered, all;
192
187
  return __generator(this, function (_a) {
193
188
  switch (_a.label) {
194
189
  case 0:
195
190
  if (!queryByKey) return [3 /*break*/, 2];
196
- return [4 /*yield*/, this.getByKey(storeName, queryByKey)];
191
+ keyValues = queryByKey.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
192
+ return [4 /*yield*/, this.getByKey(storeName, keyValues)];
197
193
  case 1:
198
194
  record = _a.sent();
199
195
  return [2 /*return*/, record ? [record] : []];
@@ -214,22 +210,19 @@ var AsyncStorageAdapter = /** @class */ (function () {
214
210
  });
215
211
  }); })()];
216
212
  case 1:
217
- records = (_a.sent());
213
+ records = (_b.sent());
218
214
  return [4 /*yield*/, this.load(namespaceName, modelConstructor.name, records)];
219
- case 2: return [2 /*return*/, _a.sent()];
215
+ case 2: return [2 /*return*/, _b.sent()];
220
216
  }
221
217
  });
222
218
  });
223
219
  };
224
220
  AsyncStorageAdapter.prototype.getByKey = function (storeName, keyValuePath) {
225
221
  return __awaiter(this, void 0, void 0, function () {
226
- var record;
227
222
  return __generator(this, function (_a) {
228
223
  switch (_a.label) {
229
224
  case 0: return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
230
- case 1:
231
- record = _a.sent();
232
- return [2 /*return*/, record];
225
+ case 1: return [2 /*return*/, _a.sent()];
233
226
  }
234
227
  });
235
228
  });
@@ -244,34 +237,6 @@ var AsyncStorageAdapter = /** @class */ (function () {
244
237
  });
245
238
  });
246
239
  };
247
- AsyncStorageAdapter.prototype.keyValueFromPredicate = function (predicates, keys) {
248
- var e_2, _a;
249
- var predicateObjs = predicates.predicates;
250
- if (predicateObjs.length !== keys.length) {
251
- return;
252
- }
253
- var keyValues = [];
254
- var _loop_1 = function (key) {
255
- var predicateObj = predicateObjs.find(function (p) { return isPredicateObj(p) && p.field === key && p.operator === 'eq'; });
256
- predicateObj && keyValues.push(predicateObj.operand);
257
- };
258
- try {
259
- for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
260
- var key = keys_1_1.value;
261
- _loop_1(key);
262
- }
263
- }
264
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
265
- finally {
266
- try {
267
- if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
268
- }
269
- finally { if (e_2) throw e_2.error; }
270
- }
271
- return keyValues.length === keys.length
272
- ? keyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR)
273
- : undefined;
274
- };
275
240
  AsyncStorageAdapter.prototype.filterOnPredicate = function (storeName, predicates) {
276
241
  return __awaiter(this, void 0, void 0, function () {
277
242
  var predicateObjs, type, all, filtered;
@@ -309,97 +274,10 @@ var AsyncStorageAdapter = /** @class */ (function () {
309
274
  });
310
275
  });
311
276
  };
312
- AsyncStorageAdapter.prototype.delete = function (modelOrModelConstructor, condition) {
313
- return __awaiter(this, void 0, void 0, function () {
314
- var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, nameSpace, storeName, keyValuePath, fromDB, msg, predicates, _a, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
315
- return __generator(this, function (_b) {
316
- switch (_b.label) {
317
- case 0:
318
- deleteQueue = [];
319
- if (!isModelConstructor(modelOrModelConstructor)) return [3 /*break*/, 8];
320
- modelConstructor = modelOrModelConstructor;
321
- nameSpace = this.namespaceResolver(modelConstructor);
322
- return [4 /*yield*/, this.query(modelConstructor, condition)];
323
- case 1:
324
- models = _b.sent();
325
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
326
- .relationTypes;
327
- if (!(condition !== undefined)) return [3 /*break*/, 4];
328
- return [4 /*yield*/, this.deleteTraverse(relations, models, modelConstructor.name, nameSpace, deleteQueue)];
329
- case 2:
330
- _b.sent();
331
- return [4 /*yield*/, this.deleteItem(deleteQueue)];
332
- case 3:
333
- _b.sent();
334
- deletedModels = deleteQueue.reduce(function (acc, _a) {
335
- var items = _a.items;
336
- return acc.concat(items);
337
- }, []);
338
- return [2 /*return*/, [models, deletedModels]];
339
- case 4: return [4 /*yield*/, this.deleteTraverse(relations, models, modelConstructor.name, nameSpace, deleteQueue)];
340
- case 5:
341
- _b.sent();
342
- return [4 /*yield*/, this.deleteItem(deleteQueue)];
343
- case 6:
344
- _b.sent();
345
- deletedModels = deleteQueue.reduce(function (acc, _a) {
346
- var items = _a.items;
347
- return acc.concat(items);
348
- }, []);
349
- return [2 /*return*/, [models, deletedModels]];
350
- case 7: return [3 /*break*/, 15];
351
- case 8:
352
- model = modelOrModelConstructor;
353
- modelConstructor = Object.getPrototypeOf(model)
354
- .constructor;
355
- nameSpace = this.namespaceResolver(modelConstructor);
356
- storeName = this.getStorenameForModel(modelConstructor);
357
- if (!condition) return [3 /*break*/, 11];
358
- keyValuePath = this.getIndexKeyValuesPath(model);
359
- return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
360
- case 9:
361
- fromDB = _b.sent();
362
- if (fromDB === undefined) {
363
- msg = 'Model instance not found in storage';
364
- logger.warn(msg, { model: model });
365
- return [2 /*return*/, [[model], []]];
366
- }
367
- predicates = ModelPredicateCreator.getPredicates(condition);
368
- _a = predicates, predicateObjs = _a.predicates, type = _a.type;
369
- isValid = validatePredicate(fromDB, type, predicateObjs);
370
- if (!isValid) {
371
- msg = 'Conditional update failed';
372
- logger.error(msg, { model: fromDB, condition: predicateObjs });
373
- throw new Error(msg);
374
- }
375
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name].relationTypes;
376
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
377
- case 10:
378
- _b.sent();
379
- return [3 /*break*/, 13];
380
- case 11:
381
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name].relationTypes;
382
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
383
- case 12:
384
- _b.sent();
385
- _b.label = 13;
386
- case 13: return [4 /*yield*/, this.deleteItem(deleteQueue)];
387
- case 14:
388
- _b.sent();
389
- deletedModels = deleteQueue.reduce(function (acc, _a) {
390
- var items = _a.items;
391
- return acc.concat(items);
392
- }, []);
393
- return [2 /*return*/, [[model], deletedModels]];
394
- case 15: return [2 /*return*/];
395
- }
396
- });
397
- });
398
- };
399
277
  AsyncStorageAdapter.prototype.deleteItem = function (deleteQueue) {
400
278
  var e_3, _a, e_4, _b;
401
279
  return __awaiter(this, void 0, void 0, function () {
402
- var _c, _d, deleteItem, storeName, items, items_1, items_1_1, item, keyValuesPath, e_4_1, e_3_1;
280
+ var _c, _d, deleteItem, storeName, items, items_2, items_2_1, item, keyValuesPath, e_4_1, e_3_1;
403
281
  return __generator(this, function (_e) {
404
282
  switch (_e.label) {
405
283
  case 0:
@@ -414,12 +292,12 @@ var AsyncStorageAdapter = /** @class */ (function () {
414
292
  _e.label = 3;
415
293
  case 3:
416
294
  _e.trys.push([3, 9, 10, 15]);
417
- items_1 = __asyncValues(items);
295
+ items_2 = __asyncValues(items);
418
296
  _e.label = 4;
419
- case 4: return [4 /*yield*/, items_1.next()];
297
+ case 4: return [4 /*yield*/, items_2.next()];
420
298
  case 5:
421
- if (!(items_1_1 = _e.sent(), !items_1_1.done)) return [3 /*break*/, 8];
422
- item = items_1_1.value;
299
+ if (!(items_2_1 = _e.sent(), !items_2_1.done)) return [3 /*break*/, 8];
300
+ item = items_2_1.value;
423
301
  if (!item) return [3 /*break*/, 7];
424
302
  if (!(typeof item === 'object')) return [3 /*break*/, 7];
425
303
  keyValuesPath = this.getIndexKeyValuesPath(item);
@@ -435,8 +313,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
435
313
  return [3 /*break*/, 15];
436
314
  case 10:
437
315
  _e.trys.push([10, , 13, 14]);
438
- if (!(items_1_1 && !items_1_1.done && (_b = items_1.return))) return [3 /*break*/, 12];
439
- return [4 /*yield*/, _b.call(items_1)];
316
+ if (!(items_2_1 && !items_2_1.done && (_b = items_2.return))) return [3 /*break*/, 12];
317
+ return [4 /*yield*/, _b.call(items_2)];
440
318
  case 11:
441
319
  _e.sent();
442
320
  _e.label = 12;
@@ -469,85 +347,59 @@ var AsyncStorageAdapter = /** @class */ (function () {
469
347
  });
470
348
  };
471
349
  /**
472
- * Populates the delete Queue with all the items to delete
473
- * @param relations
474
- * @param models
350
+ * Gets related Has One record for `model`
351
+ *
352
+ * @param model
475
353
  * @param srcModel
476
- * @param nameSpace
477
- * @param deleteQueue
354
+ * @param namespace
355
+ * @param rel
356
+ * @returns
478
357
  */
479
- AsyncStorageAdapter.prototype.deleteTraverse = function (relations, models, srcModel, nameSpace, deleteQueue) {
480
- var relations_1, relations_1_1, models_1, models_1_1, models_2, models_2_1;
481
- var e_5, _a, e_6, _b, e_7, _c;
358
+ AsyncStorageAdapter.prototype.getHasOneChild = function (model, srcModel, namespace, rel) {
482
359
  return __awaiter(this, void 0, void 0, function () {
483
- var rel, relationType, modelName, targetName, targetNames, associatedWith, storeName, index, _d, model, hasOneIndex_1, hasConnectedModelFields, keyValuesPath, values_1, isUnidirectionalConnection, allRecords, recordToDelete, hasOneIndex_2, hasOneCustomField, keyValuesPath, value_1, allRecords, recordsToDelete, modelsToDelete, _e, e_6_1, model, keyValues, allRecords, indices, childRecords, childModels, e_7_1, e_5_1;
484
- var _this = this;
485
- return __generator(this, function (_f) {
486
- switch (_f.label) {
360
+ var hasOneIndex, modelName, targetNames, associatedWith, storeName, index, hasConnectedModelFields, keyValuesPath, values, isUnidirectionalConnection, allRecords, recordToDelete;
361
+ return __generator(this, function (_a) {
362
+ switch (_a.label) {
487
363
  case 0:
488
- _f.trys.push([0, 42, 43, 48]);
489
- relations_1 = __asyncValues(relations);
490
- _f.label = 1;
491
- case 1: return [4 /*yield*/, relations_1.next()];
492
- case 2:
493
- if (!(relations_1_1 = _f.sent(), !relations_1_1.done)) return [3 /*break*/, 41];
494
- rel = relations_1_1.value;
495
- relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
496
- storeName = getStorename(nameSpace, modelName);
497
- index = getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
364
+ modelName = rel.modelName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
365
+ storeName = getStorename(namespace, modelName);
366
+ index = getIndex(this.schema.namespaces[namespace].relationships[modelName]
498
367
  .relationTypes, srcModel) ||
499
368
  // if we were unable to find an index via relationTypes
500
369
  // i.e. for keyName connections, attempt to find one by the
501
370
  // associatedWith property
502
- getIndexFromAssociation(this.schema.namespaces[nameSpace].relationships[modelName].indexes, rel.associatedWith);
503
- _d = relationType;
504
- switch (_d) {
505
- case 'HAS_ONE': return [3 /*break*/, 3];
506
- case 'HAS_MANY': return [3 /*break*/, 23];
507
- case 'BELONGS_TO': return [3 /*break*/, 38];
508
- }
509
- return [3 /*break*/, 39];
510
- case 3:
511
- _f.trys.push([3, 16, 17, 22]);
512
- models_1 = __asyncValues(models);
513
- _f.label = 4;
514
- case 4: return [4 /*yield*/, models_1.next()];
515
- case 5:
516
- if (!(models_1_1 = _f.sent(), !models_1_1.done)) return [3 /*break*/, 15];
517
- model = models_1_1.value;
518
- if (!(targetNames && (targetNames === null || targetNames === void 0 ? void 0 : targetNames.length))) return [3 /*break*/, 8];
371
+ getIndexFromAssociation(this.schema.namespaces[namespace].relationships[modelName].indexes, rel.associatedWith);
519
372
  if (index) {
520
- hasOneIndex_1 = index.split(IDENTIFIER_KEY_SEPARATOR);
373
+ hasOneIndex = index.split(IDENTIFIER_KEY_SEPARATOR);
521
374
  }
522
375
  else if (associatedWith) {
523
376
  if (Array.isArray(associatedWith)) {
524
- hasOneIndex_1 = associatedWith;
377
+ hasOneIndex = associatedWith;
525
378
  }
526
379
  else {
527
- hasOneIndex_1 = [associatedWith];
380
+ hasOneIndex = [associatedWith];
528
381
  }
529
382
  }
530
383
  hasConnectedModelFields = targetNames.every(function (targetName) {
531
384
  return model.hasOwnProperty(targetName);
532
385
  });
533
386
  keyValuesPath = this.getIndexKeyValuesPath(model);
534
- isUnidirectionalConnection = hasOneIndex_1 === associatedWith;
387
+ isUnidirectionalConnection = hasOneIndex === associatedWith;
535
388
  if (hasConnectedModelFields && isUnidirectionalConnection) {
536
389
  // Values will be that of the child model
537
- values_1 = targetNames
390
+ values = targetNames
538
391
  .filter(function (targetName) { var _a; return (_a = model[targetName]) !== null && _a !== void 0 ? _a : false; })
539
392
  .map(function (targetName) { return model[targetName]; });
540
393
  }
541
394
  else {
542
395
  // values will be that of the parent model
543
- values_1 = keyValuesPath.split(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
396
+ values = keyValuesPath.split(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
544
397
  }
545
- if (values_1.length === 0)
546
- return [3 /*break*/, 15];
398
+ if (values.length === 0)
399
+ return [2 /*return*/];
547
400
  return [4 /*yield*/, this.db.getAll(storeName)];
548
- case 6:
549
- allRecords = _f.sent();
550
- recordToDelete = void 0;
401
+ case 1:
402
+ allRecords = _a.sent();
551
403
  // values === targetNames
552
404
  if (hasConnectedModelFields) {
553
405
  /**
@@ -555,206 +407,90 @@ var AsyncStorageAdapter = /** @class */ (function () {
555
407
  * targetNames are present on the connected model.
556
408
  *
557
409
  */
558
- // recordToDelete = allRecords.filter(childItem =>
559
- // values.every(value => childItem[value] != null)
560
- // ) as T[];
561
- recordToDelete = allRecords.filter(function (childItem) {
562
- return hasOneIndex_1.every(function (index) { return values_1.includes(childItem[index]); });
410
+ recordToDelete = allRecords.find(function (childItem) {
411
+ return hasOneIndex.every(function (index) { return values.includes(childItem[index]); });
563
412
  });
564
413
  }
565
414
  else {
566
415
  // values === keyValuePath
567
- recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_1] === values_1; });
416
+ recordToDelete = allRecords.find(function (childItem) { return childItem[hasOneIndex] === values; });
568
417
  }
569
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
570
- .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
571
- case 7:
572
- _f.sent();
573
- return [3 /*break*/, 14];
574
- case 8:
575
- hasOneIndex_2 = index || associatedWith;
576
- hasOneCustomField = targetName in model;
577
- keyValuesPath = this.getIndexKeyValuesPath(model);
578
- value_1 = hasOneCustomField
579
- ? model[targetName]
580
- : keyValuesPath;
581
- if (!value_1)
582
- return [3 /*break*/, 15];
583
- return [4 /*yield*/, this.db.getAll(storeName)];
584
- case 9:
585
- allRecords = _f.sent();
586
- recordsToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_2] === value_1; });
587
- if (!recordsToDelete.length) return [3 /*break*/, 11];
588
- return [4 /*yield*/, this.load(nameSpace, modelName, recordsToDelete)];
589
- case 10:
590
- _e = _f.sent();
591
- return [3 /*break*/, 12];
592
- case 11:
593
- _e = [];
594
- _f.label = 12;
595
- case 12:
596
- modelsToDelete = _e;
597
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
598
- .relationTypes, modelsToDelete, modelName, nameSpace, deleteQueue)];
599
- case 13:
600
- _f.sent();
601
- _f.label = 14;
602
- case 14: return [3 /*break*/, 4];
603
- case 15: return [3 /*break*/, 22];
604
- case 16:
605
- e_6_1 = _f.sent();
606
- e_6 = { error: e_6_1 };
607
- return [3 /*break*/, 22];
608
- case 17:
609
- _f.trys.push([17, , 20, 21]);
610
- if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 19];
611
- return [4 /*yield*/, _b.call(models_1)];
612
- case 18:
613
- _f.sent();
614
- _f.label = 19;
615
- case 19: return [3 /*break*/, 21];
616
- case 20:
617
- if (e_6) throw e_6.error;
618
- return [7 /*endfinally*/];
619
- case 21: return [7 /*endfinally*/];
620
- case 22: return [3 /*break*/, 40];
621
- case 23:
622
- _f.trys.push([23, 31, 32, 37]);
623
- models_2 = __asyncValues(models);
624
- _f.label = 24;
625
- case 24: return [4 /*yield*/, models_2.next()];
626
- case 25:
627
- if (!(models_2_1 = _f.sent(), !models_2_1.done)) return [3 /*break*/, 30];
628
- model = models_2_1.value;
629
- keyValues = this.getIndexKeyValuesFromModel(model);
630
- return [4 /*yield*/, this.db.getAll(storeName)];
631
- case 26:
632
- allRecords = _f.sent();
633
- indices = index.split(IDENTIFIER_KEY_SEPARATOR);
634
- childRecords = allRecords.filter(function (childItem) {
635
- return indices.every(function (index) { return keyValues.includes(childItem[index]); });
636
- });
637
- return [4 /*yield*/, this.load(nameSpace, modelName, childRecords)];
638
- case 27:
639
- childModels = _f.sent();
640
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
641
- .relationTypes, childModels, modelName, nameSpace, deleteQueue)];
642
- case 28:
643
- _f.sent();
644
- _f.label = 29;
645
- case 29: return [3 /*break*/, 24];
646
- case 30: return [3 /*break*/, 37];
647
- case 31:
648
- e_7_1 = _f.sent();
649
- e_7 = { error: e_7_1 };
650
- return [3 /*break*/, 37];
651
- case 32:
652
- _f.trys.push([32, , 35, 36]);
653
- if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 34];
654
- return [4 /*yield*/, _c.call(models_2)];
655
- case 33:
656
- _f.sent();
657
- _f.label = 34;
658
- case 34: return [3 /*break*/, 36];
659
- case 35:
660
- if (e_7) throw e_7.error;
661
- return [7 /*endfinally*/];
662
- case 36: return [7 /*endfinally*/];
663
- case 37: return [3 /*break*/, 40];
664
- case 38:
665
- // Intentionally blank
666
- return [3 /*break*/, 40];
667
- case 39: throw new Error("Invalid relationType " + relationType);
668
- case 40: return [3 /*break*/, 1];
669
- case 41: return [3 /*break*/, 48];
670
- case 42:
671
- e_5_1 = _f.sent();
672
- e_5 = { error: e_5_1 };
673
- return [3 /*break*/, 48];
674
- case 43:
675
- _f.trys.push([43, , 46, 47]);
676
- if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 45];
677
- return [4 /*yield*/, _a.call(relations_1)];
678
- case 44:
679
- _f.sent();
680
- _f.label = 45;
681
- case 45: return [3 /*break*/, 47];
682
- case 46:
683
- if (e_5) throw e_5.error;
684
- return [7 /*endfinally*/];
685
- case 47: return [7 /*endfinally*/];
686
- case 48:
687
- deleteQueue.push({
688
- storeName: getStorename(nameSpace, srcModel),
689
- items: models.map(function (record) {
690
- return _this.modelInstanceCreator(_this.getModelConstructorByModelName(nameSpace, srcModel), record);
691
- }),
692
- });
693
- return [2 /*return*/];
418
+ return [2 /*return*/, recordToDelete];
694
419
  }
695
420
  });
696
421
  });
697
422
  };
698
- AsyncStorageAdapter.prototype.clear = function () {
423
+ /**
424
+ * Backwards compatability for pre-CPK codegen
425
+ * TODO - deprecate this in v6; will need to re-gen MIPR for older unit
426
+ * tests that hit this path
427
+ */
428
+ AsyncStorageAdapter.prototype.getHasOneChildLegacy = function (model, srcModel, namespace, rel) {
699
429
  return __awaiter(this, void 0, void 0, function () {
430
+ var modelName, targetName, associatedWith, storeName, index, hasOneIndex, hasOneCustomField, keyValuesPath, value, allRecords, recordToDelete;
700
431
  return __generator(this, function (_a) {
701
432
  switch (_a.label) {
702
- case 0: return [4 /*yield*/, this.db.clear()];
433
+ case 0:
434
+ modelName = rel.modelName, targetName = rel.targetName, associatedWith = rel.associatedWith;
435
+ storeName = getStorename(namespace, modelName);
436
+ index = getIndex(this.schema.namespaces[namespace].relationships[modelName]
437
+ .relationTypes, srcModel) ||
438
+ // if we were unable to find an index via relationTypes
439
+ // i.e. for keyName connections, attempt to find one by the
440
+ // associatedWith property
441
+ getIndexFromAssociation(this.schema.namespaces[namespace].relationships[modelName].indexes, rel.associatedWith);
442
+ hasOneIndex = index || associatedWith;
443
+ hasOneCustomField = targetName in model;
444
+ keyValuesPath = this.getIndexKeyValuesPath(model);
445
+ value = hasOneCustomField ? model[targetName] : keyValuesPath;
446
+ if (!value)
447
+ return [2 /*return*/];
448
+ return [4 /*yield*/, this.db.getAll(storeName)];
703
449
  case 1:
704
- _a.sent();
705
- this.db = undefined;
706
- this.initPromise = undefined;
707
- return [2 /*return*/];
450
+ allRecords = _a.sent();
451
+ recordToDelete = allRecords.find(function (childItem) { return childItem[hasOneIndex] === value; });
452
+ return [2 /*return*/, recordToDelete];
708
453
  }
709
454
  });
710
455
  });
711
456
  };
712
- AsyncStorageAdapter.prototype.batchSave = function (modelConstructor, items) {
457
+ /**
458
+ * Gets related Has Many records by given `storeName`, `index`, and `keyValues`
459
+ *
460
+ * @param storeName
461
+ * @param index
462
+ * @param keyValues
463
+ * @returns
464
+ */
465
+ AsyncStorageAdapter.prototype.getHasManyChildren = function (storeName, index, keyValues) {
713
466
  return __awaiter(this, void 0, void 0, function () {
714
- var modelName, namespaceName, storeName, keys, batch, _loop_2, this_1, items_2, items_2_1, item;
715
- var e_8, _a;
716
- var _this = this;
717
- return __generator(this, function (_b) {
718
- switch (_b.label) {
719
- case 0:
720
- modelName = modelConstructor.name;
721
- namespaceName = this.namespaceResolver(modelConstructor);
722
- storeName = getStorename(namespaceName, modelName);
723
- keys = getIndexKeys(this.schema.namespaces[namespaceName], modelName);
724
- batch = [];
725
- _loop_2 = function (item) {
726
- var model = this_1.modelInstanceCreator(modelConstructor, item);
727
- var connectedModels = traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
728
- var keyValuesPath = this_1.getIndexKeyValuesPath(model);
729
- var instance = connectedModels.find(function (_a) {
730
- var instance = _a.instance;
731
- var instanceKeyValuesPath = _this.getIndexKeyValuesPath(instance);
732
- return keysEqual([instanceKeyValuesPath], [keyValuesPath]);
733
- }).instance;
734
- batch.push(instance);
735
- };
736
- this_1 = this;
737
- try {
738
- for (items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
739
- item = items_2_1.value;
740
- _loop_2(item);
741
- }
742
- }
743
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
744
- finally {
745
- try {
746
- if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
747
- }
748
- finally { if (e_8) throw e_8.error; }
749
- }
750
- return [4 /*yield*/, this.db.batchSave(storeName, batch, keys)];
751
- case 1: return [2 /*return*/, _b.sent()];
467
+ var allRecords, indices, childRecords;
468
+ return __generator(this, function (_a) {
469
+ switch (_a.label) {
470
+ case 0: return [4 /*yield*/, this.db.getAll(storeName)];
471
+ case 1:
472
+ allRecords = _a.sent();
473
+ indices = index.split(IDENTIFIER_KEY_SEPARATOR);
474
+ childRecords = allRecords.filter(function (childItem) {
475
+ return indices.every(function (index) { return keyValues.includes(childItem[index]); });
476
+ });
477
+ return [2 /*return*/, childRecords];
752
478
  }
753
479
  });
754
480
  });
755
481
  };
482
+ //#region platform-specific helper methods
483
+ /**
484
+ * Retrieves concatenated primary key values from a model
485
+ *
486
+ * @param model
487
+ * @returns
488
+ */
489
+ AsyncStorageAdapter.prototype.getIndexKeyValuesPath = function (model) {
490
+ return this.getIndexKeyValuesFromModel(model).join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
491
+ };
756
492
  return AsyncStorageAdapter;
757
- }());
493
+ }(StorageAdapterBase));
758
494
  export { AsyncStorageAdapter };
759
495
  export default new AsyncStorageAdapter();
760
496
  //# sourceMappingURL=AsyncStorageAdapter.js.map