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