@aws-amplify/datastore 3.7.3 → 3.7.4-custom-pk.86

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 (137) hide show
  1. package/CHANGELOG.md +144 -17
  2. package/README.md +154 -0
  3. package/dist/aws-amplify-datastore.js +3740 -1599
  4. package/dist/aws-amplify-datastore.js.map +1 -1
  5. package/dist/aws-amplify-datastore.min.js +25 -95
  6. package/dist/aws-amplify-datastore.min.js.map +1 -1
  7. package/lib/authModeStrategies/multiAuthStrategy.d.ts +2 -2
  8. package/lib/authModeStrategies/multiAuthStrategy.js +32 -26
  9. package/lib/authModeStrategies/multiAuthStrategy.js.map +1 -1
  10. package/lib/datastore/datastore.d.ts +17 -16
  11. package/lib/datastore/datastore.js +291 -83
  12. package/lib/datastore/datastore.js.map +1 -1
  13. package/lib/index.d.ts +3 -19
  14. package/lib/predicates/index.d.ts +3 -2
  15. package/lib/predicates/index.js +12 -2
  16. package/lib/predicates/index.js.map +1 -1
  17. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +6 -2
  18. package/lib/storage/adapter/AsyncStorageAdapter.js +361 -193
  19. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  20. package/lib/storage/adapter/AsyncStorageDatabase.d.ts +4 -4
  21. package/lib/storage/adapter/AsyncStorageDatabase.js +59 -28
  22. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  23. package/lib/storage/adapter/InMemoryStore.js +2 -2
  24. package/lib/storage/adapter/InMemoryStore.js.map +1 -1
  25. package/lib/storage/adapter/IndexedDBAdapter.d.ts +7 -2
  26. package/lib/storage/adapter/IndexedDBAdapter.js +454 -252
  27. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  28. package/lib/storage/adapter/index.d.ts +1 -1
  29. package/lib/storage/storage.d.ts +3 -3
  30. package/lib/storage/storage.js +106 -28
  31. package/lib/storage/storage.js.map +1 -1
  32. package/lib/sync/index.d.ts +23 -7
  33. package/lib/sync/index.js +18 -17
  34. package/lib/sync/index.js.map +1 -1
  35. package/lib/sync/merger.d.ts +3 -3
  36. package/lib/sync/merger.js +8 -6
  37. package/lib/sync/merger.js.map +1 -1
  38. package/lib/sync/outbox.d.ts +2 -2
  39. package/lib/sync/outbox.js +12 -9
  40. package/lib/sync/outbox.js.map +1 -1
  41. package/lib/sync/processors/errorMaps.d.ts +17 -0
  42. package/lib/sync/processors/errorMaps.js +125 -0
  43. package/lib/sync/processors/errorMaps.js.map +1 -0
  44. package/lib/sync/processors/mutation.d.ts +22 -4
  45. package/lib/sync/processors/mutation.js +119 -51
  46. package/lib/sync/processors/mutation.js.map +1 -1
  47. package/lib/sync/processors/subscription.d.ts +4 -2
  48. package/lib/sync/processors/subscription.js +76 -41
  49. package/lib/sync/processors/subscription.js.map +1 -1
  50. package/lib/sync/processors/sync.d.ts +4 -2
  51. package/lib/sync/processors/sync.js +62 -27
  52. package/lib/sync/processors/sync.js.map +1 -1
  53. package/lib/sync/utils.d.ts +3 -2
  54. package/lib/sync/utils.js +58 -7
  55. package/lib/sync/utils.js.map +1 -1
  56. package/lib/types.d.ts +90 -34
  57. package/lib/types.js +31 -2
  58. package/lib/types.js.map +1 -1
  59. package/lib/util.d.ts +48 -33
  60. package/lib/util.js +219 -57
  61. package/lib/util.js.map +1 -1
  62. package/lib-esm/authModeStrategies/multiAuthStrategy.d.ts +2 -2
  63. package/lib-esm/authModeStrategies/multiAuthStrategy.js +32 -26
  64. package/lib-esm/authModeStrategies/multiAuthStrategy.js.map +1 -1
  65. package/lib-esm/datastore/datastore.d.ts +17 -16
  66. package/lib-esm/datastore/datastore.js +293 -85
  67. package/lib-esm/datastore/datastore.js.map +1 -1
  68. package/lib-esm/index.d.ts +3 -19
  69. package/lib-esm/predicates/index.d.ts +3 -2
  70. package/lib-esm/predicates/index.js +13 -3
  71. package/lib-esm/predicates/index.js.map +1 -1
  72. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +6 -2
  73. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +361 -193
  74. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  75. package/lib-esm/storage/adapter/AsyncStorageDatabase.d.ts +4 -4
  76. package/lib-esm/storage/adapter/AsyncStorageDatabase.js +60 -29
  77. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  78. package/lib-esm/storage/adapter/InMemoryStore.js +2 -2
  79. package/lib-esm/storage/adapter/InMemoryStore.js.map +1 -1
  80. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +7 -2
  81. package/lib-esm/storage/adapter/IndexedDBAdapter.js +454 -252
  82. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  83. package/lib-esm/storage/adapter/index.d.ts +1 -1
  84. package/lib-esm/storage/storage.d.ts +3 -3
  85. package/lib-esm/storage/storage.js +106 -28
  86. package/lib-esm/storage/storage.js.map +1 -1
  87. package/lib-esm/sync/index.d.ts +23 -7
  88. package/lib-esm/sync/index.js +20 -19
  89. package/lib-esm/sync/index.js.map +1 -1
  90. package/lib-esm/sync/merger.d.ts +3 -3
  91. package/lib-esm/sync/merger.js +8 -6
  92. package/lib-esm/sync/merger.js.map +1 -1
  93. package/lib-esm/sync/outbox.d.ts +2 -2
  94. package/lib-esm/sync/outbox.js +13 -10
  95. package/lib-esm/sync/outbox.js.map +1 -1
  96. package/lib-esm/sync/processors/errorMaps.d.ts +17 -0
  97. package/lib-esm/sync/processors/errorMaps.js +119 -0
  98. package/lib-esm/sync/processors/errorMaps.js.map +1 -0
  99. package/lib-esm/sync/processors/mutation.d.ts +22 -4
  100. package/lib-esm/sync/processors/mutation.js +122 -54
  101. package/lib-esm/sync/processors/mutation.js.map +1 -1
  102. package/lib-esm/sync/processors/subscription.d.ts +4 -2
  103. package/lib-esm/sync/processors/subscription.js +77 -42
  104. package/lib-esm/sync/processors/subscription.js.map +1 -1
  105. package/lib-esm/sync/processors/sync.d.ts +4 -2
  106. package/lib-esm/sync/processors/sync.js +62 -27
  107. package/lib-esm/sync/processors/sync.js.map +1 -1
  108. package/lib-esm/sync/utils.d.ts +3 -2
  109. package/lib-esm/sync/utils.js +58 -8
  110. package/lib-esm/sync/utils.js.map +1 -1
  111. package/lib-esm/types.d.ts +90 -34
  112. package/lib-esm/types.js +29 -3
  113. package/lib-esm/types.js.map +1 -1
  114. package/lib-esm/util.d.ts +48 -33
  115. package/lib-esm/util.js +207 -54
  116. package/lib-esm/util.js.map +1 -1
  117. package/package.json +10 -9
  118. package/src/authModeStrategies/multiAuthStrategy.ts +24 -21
  119. package/src/datastore/datastore.ts +448 -148
  120. package/src/predicates/index.ts +32 -10
  121. package/src/storage/adapter/AsyncStorageAdapter.ts +305 -78
  122. package/src/storage/adapter/AsyncStorageDatabase.ts +65 -26
  123. package/src/storage/adapter/InMemoryStore.ts +2 -2
  124. package/src/storage/adapter/IndexedDBAdapter.ts +344 -101
  125. package/src/storage/adapter/index.ts +1 -1
  126. package/src/storage/storage.ts +85 -24
  127. package/src/sync/index.ts +74 -58
  128. package/src/sync/merger.ts +16 -4
  129. package/src/sync/outbox.ts +22 -8
  130. package/src/sync/processors/errorMaps.ts +93 -0
  131. package/src/sync/processors/mutation.ts +143 -84
  132. package/src/sync/processors/subscription.ts +67 -36
  133. package/src/sync/processors/sync.ts +37 -12
  134. package/src/sync/utils.ts +67 -16
  135. package/src/types.ts +252 -50
  136. package/src/util.ts +256 -42
  137. package/ssr/package.json +1 -1
@@ -63,6 +63,7 @@ var predicates_1 = require("../../predicates");
63
63
  var types_1 = require("../../types");
64
64
  var util_1 = require("../../util");
65
65
  var logger = new core_1.ConsoleLogger('DataStore');
66
+ var DEFAULT_PRIMARY_KEY_SEPARATOR = '#';
66
67
  var AsyncStorageAdapter = /** @class */ (function () {
67
68
  function AsyncStorageAdapter() {
68
69
  }
@@ -75,6 +76,45 @@ var AsyncStorageAdapter = /** @class */ (function () {
75
76
  var storeName = namespace + "_" + modelName;
76
77
  return storeName;
77
78
  };
79
+ // Returns primary keys for a model
80
+ AsyncStorageAdapter.prototype.getIndexKeys = function (namespaceName, modelName) {
81
+ var _a;
82
+ var namespace = this.schema.namespaces[namespaceName];
83
+ var keyPath = (_a = namespace === null || namespace === void 0 ? void 0 : namespace.keys[modelName]) === null || _a === void 0 ? void 0 : _a.primaryKey;
84
+ if (keyPath) {
85
+ return keyPath;
86
+ }
87
+ return ['id'];
88
+ };
89
+ // Retrieves concatenated primary key values from a model
90
+ AsyncStorageAdapter.prototype.getIndexKeyValuesPath = function (model) {
91
+ var modelConstructor = Object.getPrototypeOf(model)
92
+ .constructor;
93
+ var namespaceName = this.namespaceResolver(modelConstructor);
94
+ var keys = this.getIndexKeys(namespaceName, modelConstructor.name);
95
+ // Retrieve key values from model
96
+ var keyValues = keys.map(function (field) { return model[field]; });
97
+ // Return concatenated key values
98
+ return keyValues.join(DEFAULT_PRIMARY_KEY_SEPARATOR);
99
+ };
100
+ // Retrieves concatenated primary key values from a model
101
+ AsyncStorageAdapter.prototype.getIndexKeyValues = function (model) {
102
+ var modelConstructor = Object.getPrototypeOf(model)
103
+ .constructor;
104
+ var namespaceName = this.namespaceResolver(modelConstructor);
105
+ var keys = this.getIndexKeys(namespaceName, modelConstructor.name);
106
+ // Retrieve key values from model
107
+ return keys.map(function (field) { return model[field]; });
108
+ };
109
+ AsyncStorageAdapter.prototype.keysEqual = function (keysA, keysB) {
110
+ if (keysA.length !== keysB.length) {
111
+ return false;
112
+ }
113
+ if (keysA.length === 1) {
114
+ return keysA[0] === keysB[0];
115
+ }
116
+ return keysA.every(function (key, idx) { return key === keysB[idx]; });
117
+ };
78
118
  AsyncStorageAdapter.prototype.setUp = function (theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName) {
79
119
  return __awaiter(this, void 0, void 0, function () {
80
120
  var error_1;
@@ -120,7 +160,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
120
160
  AsyncStorageAdapter.prototype.save = function (model, condition) {
121
161
  var e_1, _a;
122
162
  return __awaiter(this, void 0, void 0, function () {
123
- var modelConstructor, storeName, connectedModels, namespaceName, set, connectionStoreNames, fromDB, predicates, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, id, fromDB_1, opType, e_1_1;
163
+ var modelConstructor, storeName, namespaceName, connectedModels, set, connectionStoreNames, keyValuesPath, fromDB, predicates, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, keys, itemKeyValues, itemKeyValuesPath, fromDB_1, opType, modelKeyValues, keysEqual, e_1_1;
124
164
  var _this = this;
125
165
  return __generator(this, function (_b) {
126
166
  switch (_b.label) {
@@ -128,16 +168,18 @@ var AsyncStorageAdapter = /** @class */ (function () {
128
168
  modelConstructor = Object.getPrototypeOf(model)
129
169
  .constructor;
130
170
  storeName = this.getStorenameForModel(modelConstructor);
131
- connectedModels = util_1.traverseModel(modelConstructor.name, model, this.schema.namespaces[this.namespaceResolver(modelConstructor)], this.modelInstanceCreator, this.getModelConstructorByModelName);
132
171
  namespaceName = this.namespaceResolver(modelConstructor);
172
+ connectedModels = util_1.traverseModel(modelConstructor.name, model, this.schema.namespaces[namespaceName], this.modelInstanceCreator, this.getModelConstructorByModelName);
133
173
  set = new Set();
134
174
  connectionStoreNames = Object.values(connectedModels).map(function (_a) {
135
175
  var modelName = _a.modelName, item = _a.item, instance = _a.instance;
136
176
  var storeName = _this.getStorename(namespaceName, modelName);
137
177
  set.add(storeName);
138
- return { storeName: storeName, item: item, instance: instance };
178
+ var keys = _this.getIndexKeys(namespaceName, modelName);
179
+ return { storeName: storeName, item: item, instance: instance, keys: keys };
139
180
  });
140
- return [4 /*yield*/, this.db.get(model.id, storeName)];
181
+ keyValuesPath = this.getIndexKeyValuesPath(model);
182
+ return [4 /*yield*/, this.db.get(keyValuesPath, storeName)];
141
183
  case 1:
142
184
  fromDB = _b.sent();
143
185
  if (condition && fromDB) {
@@ -160,14 +202,17 @@ var AsyncStorageAdapter = /** @class */ (function () {
160
202
  case 4:
161
203
  if (!(connectionStoreNames_1_1 = _b.sent(), !connectionStoreNames_1_1.done)) return [3 /*break*/, 8];
162
204
  resItem = connectionStoreNames_1_1.value;
163
- storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance;
164
- id = item.id;
165
- return [4 /*yield*/, this.db.get(id, storeName_1)];
205
+ storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance, keys = resItem.keys;
206
+ itemKeyValues = keys.map(function (key) { return item[key]; });
207
+ itemKeyValuesPath = itemKeyValues.join(DEFAULT_PRIMARY_KEY_SEPARATOR);
208
+ return [4 /*yield*/, this.db.get(itemKeyValuesPath, storeName_1)];
166
209
  case 5:
167
210
  fromDB_1 = _b.sent();
168
211
  opType = fromDB_1 ? types_1.OpType.UPDATE : types_1.OpType.INSERT;
169
- if (!(id === model.id || opType === types_1.OpType.INSERT)) return [3 /*break*/, 7];
170
- return [4 /*yield*/, this.db.save(item, storeName_1)];
212
+ modelKeyValues = this.getIndexKeyValues(model);
213
+ keysEqual = this.keysEqual(itemKeyValues, modelKeyValues);
214
+ if (!(keysEqual || opType === types_1.OpType.INSERT)) return [3 /*break*/, 7];
215
+ return [4 /*yield*/, this.db.save(item, storeName_1, keys, itemKeyValuesPath)];
171
216
  case 6:
172
217
  _b.sent();
173
218
  result.push([instance, opType]);
@@ -199,7 +244,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
199
244
  var records_1, records_1_1, records_2, records_2_1;
200
245
  var e_2, _a, e_3, _b, e_4, _c;
201
246
  return __awaiter(this, void 0, void 0, function () {
202
- var namespace, relations, connectionStoreNames, modelConstructor, relations_1, relations_1_1, relation, fieldName, modelName, targetName, relationType, storeName, modelConstructor_1, _d, recordItem, getByfield, connectionRecord, e_3_1, recordItem, connectionRecord, e_4_1, e_2_1;
247
+ var namespace, relations, connectionStoreNames, modelConstructor, relations_1, relations_1_1, relation, fieldName, modelName, targetName, targetNames, relationType, storeName, modelConstructor_1, _d, recordItem, getByFields, allPresent, keys, connectionRecord, getByfield, key, connectionRecord, e_3_1, recordItem, allPresent, keys, connectionRecord, key, connectionRecord, e_4_1, e_2_1;
203
248
  var _this = this;
204
249
  return __generator(this, function (_e) {
205
250
  switch (_e.label) {
@@ -218,121 +263,171 @@ var AsyncStorageAdapter = /** @class */ (function () {
218
263
  }
219
264
  _e.label = 1;
220
265
  case 1:
221
- _e.trys.push([1, 34, 35, 40]);
266
+ _e.trys.push([1, 38, 39, 44]);
222
267
  relations_1 = __asyncValues(relations);
223
268
  _e.label = 2;
224
269
  case 2: return [4 /*yield*/, relations_1.next()];
225
270
  case 3:
226
- if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 33];
271
+ if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 37];
227
272
  relation = relations_1_1.value;
228
- fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, relationType = relation.relationType;
273
+ fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, targetNames = relation.targetNames, relationType = relation.relationType;
229
274
  storeName = this.getStorename(namespaceName, modelName);
230
275
  modelConstructor_1 = this.getModelConstructorByModelName(namespaceName, modelName);
231
276
  _d = relationType;
232
277
  switch (_d) {
233
278
  case 'HAS_ONE': return [3 /*break*/, 4];
234
- case 'BELONGS_TO': return [3 /*break*/, 17];
235
- case 'HAS_MANY': return [3 /*break*/, 30];
279
+ case 'BELONGS_TO': return [3 /*break*/, 19];
280
+ case 'HAS_MANY': return [3 /*break*/, 34];
236
281
  }
237
- return [3 /*break*/, 31];
282
+ return [3 /*break*/, 35];
238
283
  case 4:
239
- _e.trys.push([4, 10, 11, 16]);
284
+ _e.trys.push([4, 12, 13, 18]);
240
285
  records_1 = __asyncValues(records);
241
286
  _e.label = 5;
242
287
  case 5: return [4 /*yield*/, records_1.next()];
243
288
  case 6:
244
- if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 9];
289
+ if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 11];
245
290
  recordItem = records_1_1.value;
246
- getByfield = recordItem[targetName] ? targetName : fieldName;
247
- if (!recordItem[getByfield])
248
- return [3 /*break*/, 9];
249
- return [4 /*yield*/, this.db.get(recordItem[getByfield], storeName)];
291
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 8];
292
+ getByFields = [];
293
+ allPresent = void 0;
294
+ // iterate through all targetnames to make sure they are all present in the recordItem
295
+ allPresent = targetNames.every(function (targetName) {
296
+ return recordItem[targetName] != null;
297
+ });
298
+ if (!allPresent) {
299
+ return [3 /*break*/, 11];
300
+ }
301
+ getByFields = targetNames;
302
+ keys = getByFields
303
+ .map(function (getByField) { return recordItem[getByField]; })
304
+ .join(DEFAULT_PRIMARY_KEY_SEPARATOR);
305
+ return [4 /*yield*/, this.db.get(keys, storeName)];
250
306
  case 7:
251
307
  connectionRecord = _e.sent();
252
308
  recordItem[fieldName] =
253
309
  connectionRecord &&
254
310
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
255
- _e.label = 8;
256
- case 8: return [3 /*break*/, 5];
257
- case 9: return [3 /*break*/, 16];
258
- case 10:
311
+ return [3 /*break*/, 10];
312
+ case 8:
313
+ getByfield = recordItem[targetName]
314
+ ? targetName
315
+ : fieldName;
316
+ if (!recordItem[getByfield])
317
+ return [3 /*break*/, 11];
318
+ key = recordItem[getByfield];
319
+ return [4 /*yield*/, this.db.get(key, storeName)];
320
+ case 9:
321
+ connectionRecord = _e.sent();
322
+ recordItem[fieldName] =
323
+ connectionRecord &&
324
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
325
+ _e.label = 10;
326
+ case 10: return [3 /*break*/, 5];
327
+ case 11: return [3 /*break*/, 18];
328
+ case 12:
259
329
  e_3_1 = _e.sent();
260
330
  e_3 = { error: e_3_1 };
261
- return [3 /*break*/, 16];
262
- case 11:
263
- _e.trys.push([11, , 14, 15]);
264
- if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 13];
331
+ return [3 /*break*/, 18];
332
+ case 13:
333
+ _e.trys.push([13, , 16, 17]);
334
+ if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 15];
265
335
  return [4 /*yield*/, _b.call(records_1)];
266
- case 12:
267
- _e.sent();
268
- _e.label = 13;
269
- case 13: return [3 /*break*/, 15];
270
336
  case 14:
337
+ _e.sent();
338
+ _e.label = 15;
339
+ case 15: return [3 /*break*/, 17];
340
+ case 16:
271
341
  if (e_3) throw e_3.error;
272
342
  return [7 /*endfinally*/];
273
- case 15: return [7 /*endfinally*/];
274
- case 16: return [3 /*break*/, 32];
275
- case 17:
276
- _e.trys.push([17, 23, 24, 29]);
277
- records_2 = __asyncValues(records);
278
- _e.label = 18;
279
- case 18: return [4 /*yield*/, records_2.next()];
343
+ case 17: return [7 /*endfinally*/];
344
+ case 18: return [3 /*break*/, 36];
280
345
  case 19:
281
- if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 22];
346
+ _e.trys.push([19, 27, 28, 33]);
347
+ records_2 = __asyncValues(records);
348
+ _e.label = 20;
349
+ case 20: return [4 /*yield*/, records_2.next()];
350
+ case 21:
351
+ if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 26];
282
352
  recordItem = records_2_1.value;
283
- if (!recordItem[targetName]) return [3 /*break*/, 21];
284
- return [4 /*yield*/, this.db.get(recordItem[targetName], storeName)];
285
- case 20:
353
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 23];
354
+ allPresent = void 0;
355
+ // iterate through all targetnames to make sure they are all present in the recordItem
356
+ allPresent = targetNames.every(function (targetName) {
357
+ return recordItem[targetName] != null;
358
+ });
359
+ // If not present, there is not yet a connected record
360
+ if (!allPresent) {
361
+ return [3 /*break*/, 26];
362
+ }
363
+ keys = targetNames
364
+ .map(function (targetName) { return recordItem[targetName]; })
365
+ .join(DEFAULT_PRIMARY_KEY_SEPARATOR);
366
+ return [4 /*yield*/, this.db.get(keys, storeName)];
367
+ case 22:
286
368
  connectionRecord = _e.sent();
287
369
  recordItem[fieldName] =
288
370
  connectionRecord &&
289
371
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
290
- delete recordItem[targetName];
291
- _e.label = 21;
292
- case 21: return [3 /*break*/, 18];
293
- case 22: return [3 /*break*/, 29];
372
+ targetNames === null || targetNames === void 0 ? void 0 : targetNames.map(function (targetName) {
373
+ delete recordItem[targetName];
374
+ });
375
+ return [3 /*break*/, 25];
294
376
  case 23:
377
+ if (!recordItem[targetName]) return [3 /*break*/, 25];
378
+ key = recordItem[targetName];
379
+ return [4 /*yield*/, this.db.get(key, storeName)];
380
+ case 24:
381
+ connectionRecord = _e.sent();
382
+ recordItem[fieldName] =
383
+ connectionRecord &&
384
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
385
+ delete recordItem[targetName];
386
+ _e.label = 25;
387
+ case 25: return [3 /*break*/, 20];
388
+ case 26: return [3 /*break*/, 33];
389
+ case 27:
295
390
  e_4_1 = _e.sent();
296
391
  e_4 = { error: e_4_1 };
297
- return [3 /*break*/, 29];
298
- case 24:
299
- _e.trys.push([24, , 27, 28]);
300
- if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 26];
392
+ return [3 /*break*/, 33];
393
+ case 28:
394
+ _e.trys.push([28, , 31, 32]);
395
+ if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 30];
301
396
  return [4 /*yield*/, _c.call(records_2)];
302
- case 25:
397
+ case 29:
303
398
  _e.sent();
304
- _e.label = 26;
305
- case 26: return [3 /*break*/, 28];
306
- case 27:
399
+ _e.label = 30;
400
+ case 30: return [3 /*break*/, 32];
401
+ case 31:
307
402
  if (e_4) throw e_4.error;
308
403
  return [7 /*endfinally*/];
309
- case 28: return [7 /*endfinally*/];
310
- case 29: return [3 /*break*/, 32];
311
- case 30:
404
+ case 32: return [7 /*endfinally*/];
405
+ case 33: return [3 /*break*/, 36];
406
+ case 34:
312
407
  // TODO: Lazy loading
313
- return [3 /*break*/, 32];
314
- case 31:
408
+ return [3 /*break*/, 36];
409
+ case 35:
315
410
  util_1.exhaustiveCheck(relationType);
316
- return [3 /*break*/, 32];
317
- case 32: return [3 /*break*/, 2];
318
- case 33: return [3 /*break*/, 40];
319
- case 34:
411
+ return [3 /*break*/, 36];
412
+ case 36: return [3 /*break*/, 2];
413
+ case 37: return [3 /*break*/, 44];
414
+ case 38:
320
415
  e_2_1 = _e.sent();
321
416
  e_2 = { error: e_2_1 };
322
- return [3 /*break*/, 40];
323
- case 35:
324
- _e.trys.push([35, , 38, 39]);
325
- if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 37];
417
+ return [3 /*break*/, 44];
418
+ case 39:
419
+ _e.trys.push([39, , 42, 43]);
420
+ if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 41];
326
421
  return [4 /*yield*/, _a.call(relations_1)];
327
- case 36:
422
+ case 40:
328
423
  _e.sent();
329
- _e.label = 37;
330
- case 37: return [3 /*break*/, 39];
331
- case 38:
424
+ _e.label = 41;
425
+ case 41: return [3 /*break*/, 43];
426
+ case 42:
332
427
  if (e_2) throw e_2.error;
333
428
  return [7 /*endfinally*/];
334
- case 39: return [7 /*endfinally*/];
335
- case 40: return [2 /*return*/, records.map(function (record) {
429
+ case 43: return [7 /*endfinally*/];
430
+ case 44: return [2 /*return*/, records.map(function (record) {
336
431
  return _this.modelInstanceCreator(modelConstructor, record);
337
432
  })];
338
433
  }
@@ -341,7 +436,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
341
436
  };
342
437
  AsyncStorageAdapter.prototype.query = function (modelConstructor, predicate, pagination) {
343
438
  return __awaiter(this, void 0, void 0, function () {
344
- var storeName, namespaceName, predicates, queryById, hasSort, hasPagination, records;
439
+ var storeName, namespaceName, predicates, keys, queryByKey, hasSort, hasPagination, records;
345
440
  var _this = this;
346
441
  return __generator(this, function (_a) {
347
442
  switch (_a.label) {
@@ -349,7 +444,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
349
444
  storeName = this.getStorenameForModel(modelConstructor);
350
445
  namespaceName = this.namespaceResolver(modelConstructor);
351
446
  predicates = predicate && predicates_1.ModelPredicateCreator.getPredicates(predicate);
352
- queryById = predicates && this.idFromPredicate(predicates);
447
+ keys = this.getIndexKeys(namespaceName, modelConstructor.name);
448
+ queryByKey = predicates && this.keyValueFromPredicate(predicates, keys);
353
449
  hasSort = pagination && pagination.sort;
354
450
  hasPagination = pagination && pagination.limit;
355
451
  return [4 /*yield*/, (function () { return __awaiter(_this, void 0, void 0, function () {
@@ -357,8 +453,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
357
453
  return __generator(this, function (_a) {
358
454
  switch (_a.label) {
359
455
  case 0:
360
- if (!queryById) return [3 /*break*/, 2];
361
- return [4 /*yield*/, this.getById(storeName, queryById)];
456
+ if (!queryByKey) return [3 /*break*/, 2];
457
+ return [4 /*yield*/, this.getByKey(storeName, queryByKey)];
362
458
  case 1:
363
459
  record = _a.sent();
364
460
  return [2 /*return*/, record ? [record] : []];
@@ -386,12 +482,12 @@ var AsyncStorageAdapter = /** @class */ (function () {
386
482
  });
387
483
  });
388
484
  };
389
- AsyncStorageAdapter.prototype.getById = function (storeName, id) {
485
+ AsyncStorageAdapter.prototype.getByKey = function (storeName, keyValuePath) {
390
486
  return __awaiter(this, void 0, void 0, function () {
391
487
  var record;
392
488
  return __generator(this, function (_a) {
393
489
  switch (_a.label) {
394
- case 0: return [4 /*yield*/, this.db.get(id, storeName)];
490
+ case 0: return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
395
491
  case 1:
396
492
  record = _a.sent();
397
493
  return [2 /*return*/, record];
@@ -409,11 +505,33 @@ var AsyncStorageAdapter = /** @class */ (function () {
409
505
  });
410
506
  });
411
507
  };
412
- AsyncStorageAdapter.prototype.idFromPredicate = function (predicates) {
508
+ AsyncStorageAdapter.prototype.keyValueFromPredicate = function (predicates, keys) {
509
+ var e_5, _a;
413
510
  var predicateObjs = predicates.predicates;
414
- var idPredicate = predicateObjs.length === 1 &&
415
- predicateObjs.find(function (p) { return types_1.isPredicateObj(p) && p.field === 'id' && p.operator === 'eq'; });
416
- return idPredicate && idPredicate.operand;
511
+ if (predicateObjs.length !== keys.length) {
512
+ return;
513
+ }
514
+ var keyValues = [];
515
+ var _loop_1 = function (key) {
516
+ var predicateObj = predicateObjs.find(function (p) { return types_1.isPredicateObj(p) && p.field === key && p.operator === 'eq'; });
517
+ predicateObj && keyValues.push(predicateObj.operand);
518
+ };
519
+ try {
520
+ for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
521
+ var key = keys_1_1.value;
522
+ _loop_1(key);
523
+ }
524
+ }
525
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
526
+ finally {
527
+ try {
528
+ if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
529
+ }
530
+ finally { if (e_5) throw e_5.error; }
531
+ }
532
+ return keyValues.length === keys.length
533
+ ? keyValues.join(DEFAULT_PRIMARY_KEY_SEPARATOR)
534
+ : undefined;
417
535
  };
418
536
  AsyncStorageAdapter.prototype.filterOnPredicate = function (storeName, predicates) {
419
537
  return __awaiter(this, void 0, void 0, function () {
@@ -467,7 +585,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
467
585
  };
468
586
  AsyncStorageAdapter.prototype.delete = function (modelOrModelConstructor, condition) {
469
587
  return __awaiter(this, void 0, void 0, function () {
470
- var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, nameSpace, storeName, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
588
+ var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, namespaceName, storeName, keyValuePath, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
471
589
  return __generator(this, function (_a) {
472
590
  switch (_a.label) {
473
591
  case 0:
@@ -508,10 +626,11 @@ var AsyncStorageAdapter = /** @class */ (function () {
508
626
  model = modelOrModelConstructor;
509
627
  modelConstructor = Object.getPrototypeOf(model)
510
628
  .constructor;
511
- nameSpace = this.namespaceResolver(modelConstructor);
629
+ namespaceName = this.namespaceResolver(modelConstructor);
512
630
  storeName = this.getStorenameForModel(modelConstructor);
513
631
  if (!condition) return [3 /*break*/, 11];
514
- return [4 /*yield*/, this.db.get(model.id, storeName)];
632
+ keyValuePath = this.getIndexKeyValuesPath(model);
633
+ return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
515
634
  case 9:
516
635
  fromDB = _a.sent();
517
636
  if (fromDB === undefined) {
@@ -527,16 +646,14 @@ var AsyncStorageAdapter = /** @class */ (function () {
527
646
  logger.error(msg, { model: fromDB, condition: predicateObjs });
528
647
  throw new Error(msg);
529
648
  }
530
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
531
- .relationTypes;
532
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
649
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
650
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
533
651
  case 10:
534
652
  _a.sent();
535
653
  return [3 /*break*/, 13];
536
654
  case 11:
537
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
538
- .relationTypes;
539
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
655
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
656
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
540
657
  case 12:
541
658
  _a.sent();
542
659
  _a.label = 13;
@@ -555,9 +672,9 @@ var AsyncStorageAdapter = /** @class */ (function () {
555
672
  };
556
673
  AsyncStorageAdapter.prototype.deleteItem = function (deleteQueue) {
557
674
  var deleteQueue_1, deleteQueue_1_1;
558
- var e_5, _a, e_6, _b;
675
+ var e_6, _a, e_7, _b;
559
676
  return __awaiter(this, void 0, void 0, function () {
560
- var deleteItem, storeName, items, items_1, items_1_1, item, id, e_6_1, e_5_1;
677
+ var deleteItem, storeName, items, items_1, items_1_1, item, keyValuesPath, e_7_1, e_6_1;
561
678
  return __generator(this, function (_c) {
562
679
  switch (_c.label) {
563
680
  case 0:
@@ -580,16 +697,16 @@ var AsyncStorageAdapter = /** @class */ (function () {
580
697
  item = items_1_1.value;
581
698
  if (!item) return [3 /*break*/, 7];
582
699
  if (!(typeof item === 'object')) return [3 /*break*/, 7];
583
- id = item['id'];
584
- return [4 /*yield*/, this.db.delete(id, storeName)];
700
+ keyValuesPath = this.getIndexKeyValuesPath(item);
701
+ return [4 /*yield*/, this.db.delete(keyValuesPath, storeName)];
585
702
  case 6:
586
703
  _c.sent();
587
704
  _c.label = 7;
588
705
  case 7: return [3 /*break*/, 4];
589
706
  case 8: return [3 /*break*/, 15];
590
707
  case 9:
591
- e_6_1 = _c.sent();
592
- e_6 = { error: e_6_1 };
708
+ e_7_1 = _c.sent();
709
+ e_7 = { error: e_7_1 };
593
710
  return [3 /*break*/, 15];
594
711
  case 10:
595
712
  _c.trys.push([10, , 13, 14]);
@@ -600,14 +717,14 @@ var AsyncStorageAdapter = /** @class */ (function () {
600
717
  _c.label = 12;
601
718
  case 12: return [3 /*break*/, 14];
602
719
  case 13:
603
- if (e_6) throw e_6.error;
720
+ if (e_7) throw e_7.error;
604
721
  return [7 /*endfinally*/];
605
722
  case 14: return [7 /*endfinally*/];
606
723
  case 15: return [3 /*break*/, 1];
607
724
  case 16: return [3 /*break*/, 23];
608
725
  case 17:
609
- e_5_1 = _c.sent();
610
- e_5 = { error: e_5_1 };
726
+ e_6_1 = _c.sent();
727
+ e_6 = { error: e_6_1 };
611
728
  return [3 /*break*/, 23];
612
729
  case 18:
613
730
  _c.trys.push([18, , 21, 22]);
@@ -618,7 +735,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
618
735
  _c.label = 20;
619
736
  case 20: return [3 /*break*/, 22];
620
737
  case 21:
621
- if (e_5) throw e_5.error;
738
+ if (e_6) throw e_6.error;
622
739
  return [7 /*endfinally*/];
623
740
  case 22: return [7 /*endfinally*/];
624
741
  case 23: return [2 /*return*/];
@@ -636,21 +753,21 @@ var AsyncStorageAdapter = /** @class */ (function () {
636
753
  */
637
754
  AsyncStorageAdapter.prototype.deleteTraverse = function (relations, models, srcModel, nameSpace, deleteQueue) {
638
755
  var relations_2, relations_2_1, models_1, models_1_1, models_2, models_2_1;
639
- var e_7, _a, e_8, _b, e_9, _c;
756
+ var e_8, _a, e_9, _b, e_10, _c;
640
757
  return __awaiter(this, void 0, void 0, function () {
641
- var rel, relationType, modelName, targetName, storeName, index, _d, model, hasOneIndex, hasOneCustomField, value, allRecords, recordToDelete, e_8_1, model, allRecords, childrenArray, e_9_1, e_7_1;
758
+ var rel, relationType, modelName, targetName, targetNames, associatedWith, storeName, index, _d, model, hasOneIndex_1, hasConnectedModelFields, keyValuesPath, values_1, allRecords, recordToDelete, hasOneIndex_2, hasOneCustomField, keyValuesPath, value_1, allRecords, recordToDelete, e_9_1, model, keyValues, allRecords, indices, childrenArray, e_10_1, e_8_1;
642
759
  var _this = this;
643
760
  return __generator(this, function (_e) {
644
761
  switch (_e.label) {
645
762
  case 0:
646
- _e.trys.push([0, 35, 36, 41]);
763
+ _e.trys.push([0, 38, 39, 44]);
647
764
  relations_2 = __asyncValues(relations);
648
765
  _e.label = 1;
649
766
  case 1: return [4 /*yield*/, relations_2.next()];
650
767
  case 2:
651
- if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 34];
768
+ if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 37];
652
769
  rel = relations_2_1.value;
653
- relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName;
770
+ relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
654
771
  storeName = this.getStorename(nameSpace, modelName);
655
772
  index = util_1.getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
656
773
  .relationTypes, srcModel) ||
@@ -661,112 +778,159 @@ var AsyncStorageAdapter = /** @class */ (function () {
661
778
  _d = relationType;
662
779
  switch (_d) {
663
780
  case 'HAS_ONE': return [3 /*break*/, 3];
664
- case 'HAS_MANY': return [3 /*break*/, 17];
665
- case 'BELONGS_TO': return [3 /*break*/, 31];
781
+ case 'HAS_MANY': return [3 /*break*/, 20];
782
+ case 'BELONGS_TO': return [3 /*break*/, 34];
666
783
  }
667
- return [3 /*break*/, 32];
784
+ return [3 /*break*/, 35];
668
785
  case 3:
669
- _e.trys.push([3, 10, 11, 16]);
786
+ _e.trys.push([3, 13, 14, 19]);
670
787
  models_1 = __asyncValues(models);
671
788
  _e.label = 4;
672
789
  case 4: return [4 /*yield*/, models_1.next()];
673
790
  case 5:
674
- if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 9];
791
+ if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 12];
675
792
  model = models_1_1.value;
676
- hasOneIndex = index || 'byId';
677
- hasOneCustomField = targetName in model;
678
- value = hasOneCustomField ? model[targetName] : model.id;
679
- if (!value)
680
- return [3 /*break*/, 9];
793
+ if (!(targetNames && (targetNames === null || targetNames === void 0 ? void 0 : targetNames.length))) return [3 /*break*/, 8];
794
+ hasOneIndex_1 = index || associatedWith;
795
+ hasConnectedModelFields = targetNames.every(function (targetName) {
796
+ return model.hasOwnProperty(targetName);
797
+ });
798
+ keyValuesPath = this.getIndexKeyValuesPath(model);
799
+ if (hasConnectedModelFields) {
800
+ // Values will be that of the child model
801
+ values_1 = targetNames.map(function (targetName) { return model[targetName]; });
802
+ }
803
+ else {
804
+ // values will be that of the parent model
805
+ values_1 = keyValuesPath;
806
+ }
807
+ if (values_1.length === 0)
808
+ return [3 /*break*/, 12];
681
809
  return [4 /*yield*/, this.db.getAll(storeName)];
682
810
  case 6:
683
811
  allRecords = _e.sent();
684
- recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex] === value; });
812
+ recordToDelete = void 0;
813
+ // values === targetNames
814
+ if (hasConnectedModelFields) {
815
+ /**
816
+ * Retrieve record by finding the record where all
817
+ * targetNames are present on the connected model
818
+ */
819
+ recordToDelete = allRecords.filter(function (childItem) {
820
+ return values_1.every(function (value) { return childItem[value] != null; });
821
+ });
822
+ }
823
+ else {
824
+ // values === keyValuePath
825
+ recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_1] === values_1; });
826
+ }
685
827
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
686
828
  .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
687
829
  case 7:
688
830
  _e.sent();
689
- _e.label = 8;
690
- case 8: return [3 /*break*/, 4];
691
- case 9: return [3 /*break*/, 16];
831
+ return [3 /*break*/, 11];
832
+ case 8:
833
+ hasOneIndex_2 = index || associatedWith;
834
+ hasOneCustomField = targetName in model;
835
+ keyValuesPath = this.getIndexKeyValuesPath(model);
836
+ value_1 = hasOneCustomField
837
+ ? model[targetName]
838
+ : keyValuesPath;
839
+ if (!value_1)
840
+ return [3 /*break*/, 12];
841
+ return [4 /*yield*/, this.db.getAll(storeName)];
842
+ case 9:
843
+ allRecords = _e.sent();
844
+ recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_2] === value_1; });
845
+ return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
846
+ .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
692
847
  case 10:
693
- e_8_1 = _e.sent();
694
- e_8 = { error: e_8_1 };
695
- return [3 /*break*/, 16];
696
- case 11:
697
- _e.trys.push([11, , 14, 15]);
698
- if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 13];
699
- return [4 /*yield*/, _b.call(models_1)];
700
- case 12:
701
848
  _e.sent();
702
- _e.label = 13;
703
- case 13: return [3 /*break*/, 15];
849
+ _e.label = 11;
850
+ case 11: return [3 /*break*/, 4];
851
+ case 12: return [3 /*break*/, 19];
852
+ case 13:
853
+ e_9_1 = _e.sent();
854
+ e_9 = { error: e_9_1 };
855
+ return [3 /*break*/, 19];
704
856
  case 14:
705
- if (e_8) throw e_8.error;
706
- return [7 /*endfinally*/];
707
- case 15: return [7 /*endfinally*/];
708
- case 16: return [3 /*break*/, 33];
857
+ _e.trys.push([14, , 17, 18]);
858
+ if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 16];
859
+ return [4 /*yield*/, _b.call(models_1)];
860
+ case 15:
861
+ _e.sent();
862
+ _e.label = 16;
863
+ case 16: return [3 /*break*/, 18];
709
864
  case 17:
710
- _e.trys.push([17, 24, 25, 30]);
865
+ if (e_9) throw e_9.error;
866
+ return [7 /*endfinally*/];
867
+ case 18: return [7 /*endfinally*/];
868
+ case 19: return [3 /*break*/, 36];
869
+ case 20:
870
+ _e.trys.push([20, 27, 28, 33]);
711
871
  models_2 = __asyncValues(models);
712
- _e.label = 18;
713
- case 18: return [4 /*yield*/, models_2.next()];
714
- case 19:
715
- if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 23];
872
+ _e.label = 21;
873
+ case 21: return [4 /*yield*/, models_2.next()];
874
+ case 22:
875
+ if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 26];
716
876
  model = models_2_1.value;
877
+ keyValues = this.getIndexKeyValues(model);
717
878
  return [4 /*yield*/, this.db.getAll(storeName)];
718
- case 20:
879
+ case 23:
719
880
  allRecords = _e.sent();
720
- childrenArray = allRecords.filter(function (childItem) { return childItem[index] === model.id; });
881
+ indices = index.split('-');
882
+ childrenArray = allRecords.filter(function (childItem) {
883
+ return indices.every(function (index) { return keyValues.includes(childItem[index]); });
884
+ });
721
885
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
722
886
  .relationTypes, childrenArray, modelName, nameSpace, deleteQueue)];
723
- case 21:
724
- _e.sent();
725
- _e.label = 22;
726
- case 22: return [3 /*break*/, 18];
727
- case 23: return [3 /*break*/, 30];
728
887
  case 24:
729
- e_9_1 = _e.sent();
730
- e_9 = { error: e_9_1 };
731
- return [3 /*break*/, 30];
732
- case 25:
733
- _e.trys.push([25, , 28, 29]);
734
- if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 27];
735
- return [4 /*yield*/, _c.call(models_2)];
736
- case 26:
737
888
  _e.sent();
738
- _e.label = 27;
739
- case 27: return [3 /*break*/, 29];
889
+ _e.label = 25;
890
+ case 25: return [3 /*break*/, 21];
891
+ case 26: return [3 /*break*/, 33];
892
+ case 27:
893
+ e_10_1 = _e.sent();
894
+ e_10 = { error: e_10_1 };
895
+ return [3 /*break*/, 33];
740
896
  case 28:
741
- if (e_9) throw e_9.error;
897
+ _e.trys.push([28, , 31, 32]);
898
+ if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 30];
899
+ return [4 /*yield*/, _c.call(models_2)];
900
+ case 29:
901
+ _e.sent();
902
+ _e.label = 30;
903
+ case 30: return [3 /*break*/, 32];
904
+ case 31:
905
+ if (e_10) throw e_10.error;
742
906
  return [7 /*endfinally*/];
743
- case 29: return [7 /*endfinally*/];
744
- case 30: return [3 /*break*/, 33];
745
- case 31:
907
+ case 32: return [7 /*endfinally*/];
908
+ case 33: return [3 /*break*/, 36];
909
+ case 34:
746
910
  // Intentionally blank
747
- return [3 /*break*/, 33];
748
- case 32:
749
- util_1.exhaustiveCheck(relationType);
750
- return [3 /*break*/, 33];
751
- case 33: return [3 /*break*/, 1];
752
- case 34: return [3 /*break*/, 41];
911
+ return [3 /*break*/, 36];
753
912
  case 35:
754
- e_7_1 = _e.sent();
755
- e_7 = { error: e_7_1 };
756
- return [3 /*break*/, 41];
757
- case 36:
758
- _e.trys.push([36, , 39, 40]);
759
- if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 38];
913
+ util_1.exhaustiveCheck(relationType);
914
+ return [3 /*break*/, 36];
915
+ case 36: return [3 /*break*/, 1];
916
+ case 37: return [3 /*break*/, 44];
917
+ case 38:
918
+ e_8_1 = _e.sent();
919
+ e_8 = { error: e_8_1 };
920
+ return [3 /*break*/, 44];
921
+ case 39:
922
+ _e.trys.push([39, , 42, 43]);
923
+ if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 41];
760
924
  return [4 /*yield*/, _a.call(relations_2)];
761
- case 37:
925
+ case 40:
762
926
  _e.sent();
763
- _e.label = 38;
764
- case 38: return [3 /*break*/, 40];
765
- case 39:
766
- if (e_7) throw e_7.error;
927
+ _e.label = 41;
928
+ case 41: return [3 /*break*/, 43];
929
+ case 42:
930
+ if (e_8) throw e_8.error;
767
931
  return [7 /*endfinally*/];
768
- case 40: return [7 /*endfinally*/];
769
- case 41:
932
+ case 43: return [7 /*endfinally*/];
933
+ case 44:
770
934
  deleteQueue.push({
771
935
  storeName: this.getStorename(nameSpace, srcModel),
772
936
  items: models.map(function (record) {
@@ -794,21 +958,25 @@ var AsyncStorageAdapter = /** @class */ (function () {
794
958
  };
795
959
  AsyncStorageAdapter.prototype.batchSave = function (modelConstructor, items) {
796
960
  return __awaiter(this, void 0, void 0, function () {
797
- var modelName, namespaceName, storeName, batch, _loop_1, this_1, items_2, items_2_1, item;
798
- var e_10, _a;
961
+ var modelName, namespaceName, storeName, keys, batch, _loop_2, this_1, items_2, items_2_1, item;
962
+ var e_11, _a;
963
+ var _this = this;
799
964
  return __generator(this, function (_b) {
800
965
  switch (_b.label) {
801
966
  case 0:
802
967
  modelName = modelConstructor.name;
803
968
  namespaceName = this.namespaceResolver(modelConstructor);
804
969
  storeName = this.getStorename(namespaceName, modelName);
970
+ keys = this.getIndexKeys(namespaceName, modelName);
805
971
  batch = [];
806
- _loop_1 = function (item) {
807
- var id = item.id;
808
- var connectedModels = util_1.traverseModel(modelConstructor.name, this_1.modelInstanceCreator(modelConstructor, item), this_1.schema.namespaces[this_1.namespaceResolver(modelConstructor)], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
972
+ _loop_2 = function (item) {
973
+ var model = this_1.modelInstanceCreator(modelConstructor, item);
974
+ var connectedModels = util_1.traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
975
+ var keyValuesPath = this_1.getIndexKeyValuesPath(model);
809
976
  var instance = connectedModels.find(function (_a) {
810
977
  var instance = _a.instance;
811
- return instance.id === id;
978
+ var instanceKeyValuesPath = _this.getIndexKeyValuesPath(instance);
979
+ return _this.keysEqual([instanceKeyValuesPath], [keyValuesPath]);
812
980
  }).instance;
813
981
  batch.push(instance);
814
982
  };
@@ -816,17 +984,17 @@ var AsyncStorageAdapter = /** @class */ (function () {
816
984
  try {
817
985
  for (items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
818
986
  item = items_2_1.value;
819
- _loop_1(item);
987
+ _loop_2(item);
820
988
  }
821
989
  }
822
- catch (e_10_1) { e_10 = { error: e_10_1 }; }
990
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
823
991
  finally {
824
992
  try {
825
993
  if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
826
994
  }
827
- finally { if (e_10) throw e_10.error; }
995
+ finally { if (e_11) throw e_11.error; }
828
996
  }
829
- return [4 /*yield*/, this.db.batchSave(storeName, batch)];
997
+ return [4 /*yield*/, this.db.batchSave(storeName, batch, keys)];
830
998
  case 1: return [2 /*return*/, _b.sent()];
831
999
  }
832
1000
  });