@aws-amplify/datastore 3.12.6-next.20 → 3.12.6-next.36

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