@aws-amplify/datastore 3.12.12 → 3.12.13-unstable.1

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 (105) hide show
  1. package/dist/aws-amplify-datastore.js +1854 -965
  2. package/dist/aws-amplify-datastore.js.map +1 -1
  3. package/dist/aws-amplify-datastore.min.js +7 -7
  4. package/dist/aws-amplify-datastore.min.js.map +1 -1
  5. package/lib/datastore/datastore.d.ts +13 -16
  6. package/lib/datastore/datastore.js +130 -63
  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 +5 -4
  19. package/lib/storage/adapter/IndexedDBAdapter.js +389 -267
  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 +92 -27
  24. package/lib/storage/storage.js.map +1 -1
  25. package/lib/sync/index.d.ts +21 -4
  26. package/lib/sync/index.js +13 -11
  27. package/lib/sync/index.js.map +1 -1
  28. package/lib/sync/merger.d.ts +3 -3
  29. package/lib/sync/merger.js +7 -6
  30. package/lib/sync/merger.js.map +1 -1
  31. package/lib/sync/outbox.d.ts +2 -2
  32. package/lib/sync/outbox.js +11 -9
  33. package/lib/sync/outbox.js.map +1 -1
  34. package/lib/sync/processors/mutation.js +60 -42
  35. package/lib/sync/processors/mutation.js.map +1 -1
  36. package/lib/sync/processors/subscription.js.map +1 -1
  37. package/lib/sync/processors/sync.js.map +1 -1
  38. package/lib/sync/utils.d.ts +3 -2
  39. package/lib/sync/utils.js +61 -8
  40. package/lib/sync/utils.js.map +1 -1
  41. package/lib/types.d.ts +64 -25
  42. package/lib/types.js +10 -1
  43. package/lib/types.js.map +1 -1
  44. package/lib/util.d.ts +56 -24
  45. package/lib/util.js +334 -170
  46. package/lib/util.js.map +1 -1
  47. package/lib-esm/datastore/datastore.d.ts +13 -16
  48. package/lib-esm/datastore/datastore.js +132 -65
  49. package/lib-esm/datastore/datastore.js.map +1 -1
  50. package/lib-esm/index.d.ts +3 -19
  51. package/lib-esm/predicates/index.d.ts +3 -2
  52. package/lib-esm/predicates/index.js +13 -3
  53. package/lib-esm/predicates/index.js.map +1 -1
  54. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +4 -3
  55. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +355 -204
  56. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  57. package/lib-esm/storage/adapter/AsyncStorageDatabase.d.ts +14 -4
  58. package/lib-esm/storage/adapter/AsyncStorageDatabase.js +66 -29
  59. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  60. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +5 -4
  61. package/lib-esm/storage/adapter/IndexedDBAdapter.js +390 -268
  62. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  63. package/lib-esm/storage/adapter/index.d.ts +1 -1
  64. package/lib-esm/storage/storage.d.ts +1 -1
  65. package/lib-esm/storage/storage.js +92 -27
  66. package/lib-esm/storage/storage.js.map +1 -1
  67. package/lib-esm/sync/index.d.ts +21 -4
  68. package/lib-esm/sync/index.js +15 -13
  69. package/lib-esm/sync/index.js.map +1 -1
  70. package/lib-esm/sync/merger.d.ts +3 -3
  71. package/lib-esm/sync/merger.js +7 -6
  72. package/lib-esm/sync/merger.js.map +1 -1
  73. package/lib-esm/sync/outbox.d.ts +2 -2
  74. package/lib-esm/sync/outbox.js +12 -10
  75. package/lib-esm/sync/outbox.js.map +1 -1
  76. package/lib-esm/sync/processors/mutation.js +61 -43
  77. package/lib-esm/sync/processors/mutation.js.map +1 -1
  78. package/lib-esm/sync/processors/subscription.js.map +1 -1
  79. package/lib-esm/sync/processors/sync.js.map +1 -1
  80. package/lib-esm/sync/utils.d.ts +3 -2
  81. package/lib-esm/sync/utils.js +62 -10
  82. package/lib-esm/sync/utils.js.map +1 -1
  83. package/lib-esm/types.d.ts +64 -25
  84. package/lib-esm/types.js +9 -2
  85. package/lib-esm/types.js.map +1 -1
  86. package/lib-esm/util.d.ts +56 -24
  87. package/lib-esm/util.js +334 -170
  88. package/lib-esm/util.js.map +1 -1
  89. package/package.json +7 -7
  90. package/src/datastore/datastore.ts +253 -113
  91. package/src/predicates/index.ts +32 -10
  92. package/src/storage/adapter/AsyncStorageAdapter.ts +309 -93
  93. package/src/storage/adapter/AsyncStorageDatabase.ts +74 -26
  94. package/src/storage/adapter/IndexedDBAdapter.ts +319 -136
  95. package/src/storage/adapter/index.ts +1 -1
  96. package/src/storage/storage.ts +68 -21
  97. package/src/sync/index.ts +41 -26
  98. package/src/sync/merger.ts +14 -4
  99. package/src/sync/outbox.ts +21 -8
  100. package/src/sync/processors/mutation.ts +49 -45
  101. package/src/sync/processors/subscription.ts +0 -1
  102. package/src/sync/processors/sync.ts +1 -3
  103. package/src/sync/utils.ts +69 -12
  104. package/src/types.ts +181 -29
  105. package/src/util.ts +415 -176
@@ -42,17 +42,6 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
42
42
  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
43
43
  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
44
44
  };
45
- var __values = (this && this.__values) || function(o) {
46
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
47
- if (m) return m.call(o);
48
- if (o && typeof o.length === "number") return {
49
- next: function () {
50
- if (o && i >= o.length) o = void 0;
51
- return { value: o && o[i++], done: !o };
52
- }
53
- };
54
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
55
- };
56
45
  var __read = (this && this.__read) || function (o, n) {
57
46
  var m = typeof Symbol === "function" && o[Symbol.iterator];
58
47
  if (!m) return o;
@@ -69,6 +58,17 @@ var __read = (this && this.__read) || function (o, n) {
69
58
  }
70
59
  return ar;
71
60
  };
61
+ var __values = (this && this.__values) || function(o) {
62
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
63
+ if (m) return m.call(o);
64
+ if (o && typeof o.length === "number") return {
65
+ next: function () {
66
+ if (o && i >= o.length) o = void 0;
67
+ return { value: o && o[i++], done: !o };
68
+ }
69
+ };
70
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
71
+ };
72
72
  var __spread = (this && this.__spread) || function () {
73
73
  for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
74
74
  return ar;
@@ -92,6 +92,19 @@ var IndexedDBAdapter = /** @class */ (function () {
92
92
  function IndexedDBAdapter() {
93
93
  this.dbName = DB_NAME;
94
94
  }
95
+ IndexedDBAdapter.prototype.getStorenameForModel = function (modelConstructor) {
96
+ var namespace = this.namespaceResolver(modelConstructor);
97
+ var modelName = modelConstructor.name;
98
+ return util_1.getStorename(namespace, modelName);
99
+ };
100
+ // Retrieves primary key values from a model
101
+ IndexedDBAdapter.prototype.getIndexKeyValuesFromModel = function (model) {
102
+ var modelConstructor = Object.getPrototypeOf(model)
103
+ .constructor;
104
+ var namespaceName = this.namespaceResolver(modelConstructor);
105
+ var keys = util_1.getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
106
+ return util_1.extractPrimaryKeyValues(model, keys);
107
+ };
95
108
  IndexedDBAdapter.prototype.checkPrivate = function () {
96
109
  return __awaiter(this, void 0, void 0, function () {
97
110
  var isPrivate;
@@ -114,14 +127,12 @@ var IndexedDBAdapter = /** @class */ (function () {
114
127
  });
115
128
  });
116
129
  };
117
- IndexedDBAdapter.prototype.getStorenameForModel = function (modelConstructor) {
118
- var namespace = this.namespaceResolver(modelConstructor);
119
- var modelName = modelConstructor.name;
120
- return this.getStorename(namespace, modelName);
121
- };
122
- IndexedDBAdapter.prototype.getStorename = function (namespace, modelName) {
123
- var storeName = namespace + "_" + modelName;
124
- return storeName;
130
+ IndexedDBAdapter.prototype.getNamespaceAndModelFromStorename = function (storeName) {
131
+ var _a = __read(storeName.split('_')), namespaceName = _a[0], modelNameArr = _a.slice(1);
132
+ return {
133
+ namespaceName: namespaceName,
134
+ modelName: modelNameArr.join('_'),
135
+ };
125
136
  };
126
137
  IndexedDBAdapter.prototype.setUp = function (theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName, sessionId) {
127
138
  return __awaiter(this, void 0, void 0, function () {
@@ -154,79 +165,76 @@ var IndexedDBAdapter = /** @class */ (function () {
154
165
  case 5:
155
166
  _b.trys.push([5, 8, , 9]);
156
167
  if (!!this.db) return [3 /*break*/, 7];
157
- VERSION = 2;
168
+ VERSION = 3;
158
169
  _a = this;
159
170
  return [4 /*yield*/, idb.openDB(this.dbName, VERSION, {
160
171
  upgrade: function (db, oldVersion, newVersion, txn) { return __awaiter(_this, void 0, void 0, function () {
161
- var _a, _b, storeName, origStore, tmpName, newStore, cursor, count, e_1_1, error_2;
162
- var e_1, _c;
172
+ var _a, _b, storeName, origStore, tmpName, _c, namespaceName, modelName, newStore, cursor, count, e_1_1, error_2;
173
+ var e_1, _d;
163
174
  var _this = this;
164
- return __generator(this, function (_d) {
165
- switch (_d.label) {
175
+ return __generator(this, function (_e) {
176
+ switch (_e.label) {
166
177
  case 0:
167
178
  if (oldVersion === 0) {
168
179
  Object.keys(theSchema.namespaces).forEach(function (namespaceName) {
169
180
  var namespace = theSchema.namespaces[namespaceName];
170
181
  Object.keys(namespace.models).forEach(function (modelName) {
171
- var storeName = _this.getStorename(namespaceName, modelName);
182
+ var storeName = util_1.getStorename(namespaceName, modelName);
172
183
  _this.createObjectStoreForModel(db, namespaceName, storeName, modelName);
173
184
  });
174
185
  });
175
186
  return [2 /*return*/];
176
187
  }
177
- if (!(oldVersion === 1 && newVersion === 2)) return [3 /*break*/, 16];
178
- _d.label = 1;
188
+ if (!((oldVersion === 1 || oldVersion === 2) && newVersion === 3)) return [3 /*break*/, 16];
189
+ _e.label = 1;
179
190
  case 1:
180
- _d.trys.push([1, 14, , 15]);
181
- _d.label = 2;
191
+ _e.trys.push([1, 14, , 15]);
192
+ _e.label = 2;
182
193
  case 2:
183
- _d.trys.push([2, 11, 12, 13]);
194
+ _e.trys.push([2, 11, 12, 13]);
184
195
  _a = __values(txn.objectStoreNames), _b = _a.next();
185
- _d.label = 3;
196
+ _e.label = 3;
186
197
  case 3:
187
198
  if (!!_b.done) return [3 /*break*/, 10];
188
199
  storeName = _b.value;
189
200
  origStore = txn.objectStore(storeName);
190
201
  tmpName = "tmp_" + storeName;
191
202
  origStore.name = tmpName;
192
- newStore = db.createObjectStore(storeName, {
193
- keyPath: undefined,
194
- autoIncrement: true,
195
- });
196
- newStore.createIndex('byId', 'id', { unique: true });
203
+ _c = this.getNamespaceAndModelFromStorename(storeName), namespaceName = _c.namespaceName, modelName = _c.modelName;
204
+ newStore = this.createObjectStoreForModel(db, namespaceName, storeName, modelName);
197
205
  return [4 /*yield*/, origStore.openCursor()];
198
206
  case 4:
199
- cursor = _d.sent();
207
+ cursor = _e.sent();
200
208
  count = 0;
201
- _d.label = 5;
209
+ _e.label = 5;
202
210
  case 5:
203
211
  if (!(cursor && cursor.value)) return [3 /*break*/, 8];
204
212
  // we don't pass key, since they are all new entries in the new store
205
213
  return [4 /*yield*/, newStore.put(cursor.value)];
206
214
  case 6:
207
215
  // we don't pass key, since they are all new entries in the new store
208
- _d.sent();
216
+ _e.sent();
209
217
  return [4 /*yield*/, cursor.continue()];
210
218
  case 7:
211
- cursor = _d.sent();
219
+ cursor = _e.sent();
212
220
  count++;
213
221
  return [3 /*break*/, 5];
214
222
  case 8:
215
223
  // delete original
216
224
  db.deleteObjectStore(tmpName);
217
225
  logger.debug(count + " " + storeName + " records migrated");
218
- _d.label = 9;
226
+ _e.label = 9;
219
227
  case 9:
220
228
  _b = _a.next();
221
229
  return [3 /*break*/, 3];
222
230
  case 10: return [3 /*break*/, 13];
223
231
  case 11:
224
- e_1_1 = _d.sent();
232
+ e_1_1 = _e.sent();
225
233
  e_1 = { error: e_1_1 };
226
234
  return [3 /*break*/, 13];
227
235
  case 12:
228
236
  try {
229
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
237
+ if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
230
238
  }
231
239
  finally { if (e_1) throw e_1.error; }
232
240
  return [7 /*endfinally*/];
@@ -241,7 +249,7 @@ var IndexedDBAdapter = /** @class */ (function () {
241
249
  .map(function (modelName) {
242
250
  return [
243
251
  modelName,
244
- _this.getStorename(namespaceName, modelName),
252
+ util_1.getStorename(namespaceName, modelName),
245
253
  ];
246
254
  })
247
255
  .filter(function (_a) {
@@ -255,7 +263,7 @@ var IndexedDBAdapter = /** @class */ (function () {
255
263
  });
256
264
  return [3 /*break*/, 15];
257
265
  case 14:
258
- error_2 = _d.sent();
266
+ error_2 = _e.sent();
259
267
  logger.error('Error migrating IndexedDB data', error_2);
260
268
  txn.abort();
261
269
  throw error_2;
@@ -279,7 +287,7 @@ var IndexedDBAdapter = /** @class */ (function () {
279
287
  });
280
288
  });
281
289
  };
282
- IndexedDBAdapter.prototype._get = function (storeOrStoreName, id) {
290
+ IndexedDBAdapter.prototype._get = function (storeOrStoreName, keyArr) {
283
291
  return __awaiter(this, void 0, void 0, function () {
284
292
  var index, storeName, store, result;
285
293
  return __generator(this, function (_a) {
@@ -287,13 +295,13 @@ var IndexedDBAdapter = /** @class */ (function () {
287
295
  case 0:
288
296
  if (typeof storeOrStoreName === 'string') {
289
297
  storeName = storeOrStoreName;
290
- index = this.db.transaction(storeName, 'readonly').store.index('byId');
298
+ index = this.db.transaction(storeName, 'readonly').store.index('byPk');
291
299
  }
292
300
  else {
293
301
  store = storeOrStoreName;
294
- index = store.index('byId');
302
+ index = store.index('byPk');
295
303
  }
296
- return [4 /*yield*/, index.get(id)];
304
+ return [4 /*yield*/, index.get(keyArr)];
297
305
  case 1:
298
306
  result = _a.sent();
299
307
  return [2 /*return*/, result];
@@ -304,7 +312,7 @@ var IndexedDBAdapter = /** @class */ (function () {
304
312
  IndexedDBAdapter.prototype.save = function (model, condition) {
305
313
  var e_2, _a;
306
314
  return __awaiter(this, void 0, void 0, function () {
307
- var modelConstructor, storeName, connectedModels, namespaceName, set, connectionStoreNames, tx, store, fromDB, predicates, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, store_1, id, fromDB_1, opType, key, e_2_1;
315
+ var modelConstructor, storeName, namespaceName, connectedModels, set, connectionStoreNames, tx, store, keyValues, fromDB, predicates, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, keys, store_1, itemKeyValues, fromDB_1, opType, modelKeyValues, key, e_2_1;
308
316
  var _this = this;
309
317
  return __generator(this, function (_b) {
310
318
  switch (_b.label) {
@@ -314,18 +322,20 @@ var IndexedDBAdapter = /** @class */ (function () {
314
322
  modelConstructor = Object.getPrototypeOf(model)
315
323
  .constructor;
316
324
  storeName = this.getStorenameForModel(modelConstructor);
317
- connectedModels = util_1.traverseModel(modelConstructor.name, model, this.schema.namespaces[this.namespaceResolver(modelConstructor)], this.modelInstanceCreator, this.getModelConstructorByModelName);
318
325
  namespaceName = this.namespaceResolver(modelConstructor);
326
+ connectedModels = util_1.traverseModel(modelConstructor.name, model, this.schema.namespaces[namespaceName], this.modelInstanceCreator, this.getModelConstructorByModelName);
319
327
  set = new Set();
320
328
  connectionStoreNames = Object.values(connectedModels).map(function (_a) {
321
329
  var modelName = _a.modelName, item = _a.item, instance = _a.instance;
322
- var storeName = _this.getStorename(namespaceName, modelName);
330
+ var storeName = util_1.getStorename(namespaceName, modelName);
323
331
  set.add(storeName);
324
- return { storeName: storeName, item: item, instance: instance };
332
+ var keys = util_1.getIndexKeys(_this.schema.namespaces[namespaceName], modelName);
333
+ return { storeName: storeName, item: item, instance: instance, keys: keys };
325
334
  });
326
335
  tx = this.db.transaction(__spread([storeName], Array.from(set.values())), 'readwrite');
327
336
  store = tx.objectStore(storeName);
328
- return [4 /*yield*/, this._get(store, model.id)];
337
+ keyValues = this.getIndexKeyValuesFromModel(model);
338
+ return [4 /*yield*/, this._get(store, keyValues)];
329
339
  case 2:
330
340
  fromDB = _b.sent();
331
341
  if (condition && fromDB) {
@@ -348,15 +358,20 @@ var IndexedDBAdapter = /** @class */ (function () {
348
358
  case 5:
349
359
  if (!(connectionStoreNames_1_1 = _b.sent(), !connectionStoreNames_1_1.done)) return [3 /*break*/, 10];
350
360
  resItem = connectionStoreNames_1_1.value;
351
- storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance;
361
+ storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance, keys = resItem.keys;
352
362
  store_1 = tx.objectStore(storeName_1);
353
- id = item.id;
354
- return [4 /*yield*/, this._get(store_1, id)];
363
+ itemKeyValues = keys.map(function (key) {
364
+ var value = item[key];
365
+ return value;
366
+ });
367
+ return [4 /*yield*/, this._get(store_1, itemKeyValues)];
355
368
  case 6:
356
369
  fromDB_1 = _b.sent();
357
370
  opType = fromDB_1 === undefined ? types_1.OpType.INSERT : types_1.OpType.UPDATE;
358
- if (!(id === model.id || opType === types_1.OpType.INSERT)) return [3 /*break*/, 9];
359
- return [4 /*yield*/, store_1.index('byId').getKey(item.id)];
371
+ modelKeyValues = this.getIndexKeyValuesFromModel(model);
372
+ if (!(util_1.keysEqual(itemKeyValues, modelKeyValues) ||
373
+ opType === types_1.OpType.INSERT)) return [3 /*break*/, 9];
374
+ return [4 /*yield*/, store_1.index('byPk').getKey(itemKeyValues)];
360
375
  case 7:
361
376
  key = _b.sent();
362
377
  return [4 /*yield*/, store_1.put(item, key)];
@@ -394,7 +409,7 @@ var IndexedDBAdapter = /** @class */ (function () {
394
409
  var records_1, records_1_1, records_2, records_2_1;
395
410
  var e_3, _a, e_4, _b, e_5, _c;
396
411
  return __awaiter(this, void 0, void 0, function () {
397
- var namespace, relations, connectionStoreNames, modelConstructor, tx, relations_1, relations_1_1, relation, fieldName, modelName, targetName, storeName, store, modelConstructor_1, _d, recordItem, getByfield, connectionRecord, e_4_1, recordItem, connectionRecord, e_5_1, e_3_1;
412
+ var namespace, relations, connectionStoreNames, modelConstructor, tx, relations_1, relations_1_1, relation, fieldName, modelName, targetName, targetNames, storeName, store, modelConstructor_1, _d, recordItem, getByFields, allPresent, keys, connectionRecord, getByfield, key, connectionRecord, e_4_1, recordItem, allPresent, keys, connectionRecord, key, connectionRecord, e_5_1, e_3_1;
398
413
  var _this = this;
399
414
  return __generator(this, function (_e) {
400
415
  switch (_e.label) {
@@ -403,7 +418,7 @@ var IndexedDBAdapter = /** @class */ (function () {
403
418
  relations = namespace.relationships[srcModelName].relationTypes;
404
419
  connectionStoreNames = relations.map(function (_a) {
405
420
  var modelName = _a.modelName;
406
- return _this.getStorename(namespaceName, modelName);
421
+ return util_1.getStorename(namespaceName, modelName);
407
422
  });
408
423
  modelConstructor = this.getModelConstructorByModelName(namespaceName, srcModelName);
409
424
  if (connectionStoreNames.length === 0) {
@@ -414,122 +429,170 @@ var IndexedDBAdapter = /** @class */ (function () {
414
429
  tx = this.db.transaction(__spread(connectionStoreNames), 'readonly');
415
430
  _e.label = 1;
416
431
  case 1:
417
- _e.trys.push([1, 34, 35, 40]);
432
+ _e.trys.push([1, 38, 39, 44]);
418
433
  relations_1 = __asyncValues(relations);
419
434
  _e.label = 2;
420
435
  case 2: return [4 /*yield*/, relations_1.next()];
421
436
  case 3:
422
- if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 33];
437
+ if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 37];
423
438
  relation = relations_1_1.value;
424
- fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName;
425
- storeName = this.getStorename(namespaceName, modelName);
439
+ fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, targetNames = relation.targetNames;
440
+ storeName = util_1.getStorename(namespaceName, modelName);
426
441
  store = tx.objectStore(storeName);
427
442
  modelConstructor_1 = this.getModelConstructorByModelName(namespaceName, modelName);
428
443
  _d = relation.relationType;
429
444
  switch (_d) {
430
445
  case 'HAS_ONE': return [3 /*break*/, 4];
431
- case 'BELONGS_TO': return [3 /*break*/, 17];
432
- case 'HAS_MANY': return [3 /*break*/, 30];
446
+ case 'BELONGS_TO': return [3 /*break*/, 19];
447
+ case 'HAS_MANY': return [3 /*break*/, 34];
433
448
  }
434
- return [3 /*break*/, 31];
449
+ return [3 /*break*/, 35];
435
450
  case 4:
436
- _e.trys.push([4, 10, 11, 16]);
451
+ _e.trys.push([4, 12, 13, 18]);
437
452
  records_1 = __asyncValues(records);
438
453
  _e.label = 5;
439
454
  case 5: return [4 /*yield*/, records_1.next()];
440
455
  case 6:
441
- if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 9];
456
+ if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 11];
442
457
  recordItem = records_1_1.value;
443
- getByfield = recordItem[targetName] ? targetName : fieldName;
444
- if (!recordItem[getByfield])
445
- return [3 /*break*/, 9];
446
- return [4 /*yield*/, this._get(store, recordItem[getByfield])];
458
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 8];
459
+ getByFields = [];
460
+ allPresent = void 0;
461
+ // iterate through all targetnames to make sure they are all present in the recordItem
462
+ allPresent = targetNames.every(function (targetName) {
463
+ return recordItem[targetName] != null;
464
+ });
465
+ if (!allPresent) {
466
+ return [3 /*break*/, 11];
467
+ }
468
+ getByFields = targetNames;
469
+ keys = getByFields.map(function (getByField) { return recordItem[getByField]; });
470
+ return [4 /*yield*/, this._get(store, keys)];
447
471
  case 7:
448
472
  connectionRecord = _e.sent();
449
473
  recordItem[fieldName] =
450
474
  connectionRecord &&
451
475
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
452
- _e.label = 8;
453
- case 8: return [3 /*break*/, 5];
454
- case 9: return [3 /*break*/, 16];
455
- case 10:
476
+ return [3 /*break*/, 10];
477
+ case 8:
478
+ getByfield = recordItem[targetName]
479
+ ? targetName
480
+ : fieldName;
481
+ // We break here, because the recordItem does not have 'team', the `getByField`
482
+ // extract the keys on the related model.
483
+ if (!recordItem[getByfield])
484
+ return [3 /*break*/, 11];
485
+ key = [recordItem[getByfield]];
486
+ return [4 /*yield*/, this._get(store, key)];
487
+ case 9:
488
+ connectionRecord = _e.sent();
489
+ recordItem[fieldName] =
490
+ connectionRecord &&
491
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
492
+ _e.label = 10;
493
+ case 10: return [3 /*break*/, 5];
494
+ case 11: return [3 /*break*/, 18];
495
+ case 12:
456
496
  e_4_1 = _e.sent();
457
497
  e_4 = { error: e_4_1 };
458
- return [3 /*break*/, 16];
459
- case 11:
460
- _e.trys.push([11, , 14, 15]);
461
- if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 13];
498
+ return [3 /*break*/, 18];
499
+ case 13:
500
+ _e.trys.push([13, , 16, 17]);
501
+ if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 15];
462
502
  return [4 /*yield*/, _b.call(records_1)];
463
- case 12:
464
- _e.sent();
465
- _e.label = 13;
466
- case 13: return [3 /*break*/, 15];
467
503
  case 14:
504
+ _e.sent();
505
+ _e.label = 15;
506
+ case 15: return [3 /*break*/, 17];
507
+ case 16:
468
508
  if (e_4) throw e_4.error;
469
509
  return [7 /*endfinally*/];
470
- case 15: return [7 /*endfinally*/];
471
- case 16: return [3 /*break*/, 32];
472
- case 17:
473
- _e.trys.push([17, 23, 24, 29]);
474
- records_2 = __asyncValues(records);
475
- _e.label = 18;
476
- case 18: return [4 /*yield*/, records_2.next()];
510
+ case 17: return [7 /*endfinally*/];
511
+ case 18: return [3 /*break*/, 36];
477
512
  case 19:
478
- if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 22];
513
+ _e.trys.push([19, 27, 28, 33]);
514
+ records_2 = __asyncValues(records);
515
+ _e.label = 20;
516
+ case 20: return [4 /*yield*/, records_2.next()];
517
+ case 21:
518
+ if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 26];
479
519
  recordItem = records_2_1.value;
480
- if (!recordItem[targetName]) return [3 /*break*/, 21];
481
- return [4 /*yield*/, this._get(store, recordItem[targetName])];
482
- case 20:
520
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 23];
521
+ allPresent = void 0;
522
+ // iterate through all targetnames to make sure they are all present in the recordItem
523
+ allPresent = targetNames.every(function (targetName) {
524
+ return recordItem[targetName] != null;
525
+ });
526
+ // If not present, there is not yet a connected record
527
+ if (!allPresent) {
528
+ return [3 /*break*/, 26];
529
+ }
530
+ keys = targetNames.map(function (targetName) { return recordItem[targetName]; });
531
+ return [4 /*yield*/, this._get(store, keys)];
532
+ case 22:
483
533
  connectionRecord = _e.sent();
484
534
  recordItem[fieldName] =
485
535
  connectionRecord &&
486
536
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
487
- delete recordItem[targetName];
488
- _e.label = 21;
489
- case 21: return [3 /*break*/, 18];
490
- case 22: return [3 /*break*/, 29];
537
+ targetNames === null || targetNames === void 0 ? void 0 : targetNames.map(function (targetName) {
538
+ delete recordItem[targetName];
539
+ });
540
+ return [3 /*break*/, 25];
491
541
  case 23:
542
+ if (!recordItem[targetName]) return [3 /*break*/, 25];
543
+ key = [recordItem[targetName]];
544
+ return [4 /*yield*/, this._get(store, key)];
545
+ case 24:
546
+ connectionRecord = _e.sent();
547
+ recordItem[fieldName] =
548
+ connectionRecord &&
549
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
550
+ delete recordItem[targetName];
551
+ _e.label = 25;
552
+ case 25: return [3 /*break*/, 20];
553
+ case 26: return [3 /*break*/, 33];
554
+ case 27:
492
555
  e_5_1 = _e.sent();
493
556
  e_5 = { error: e_5_1 };
494
- return [3 /*break*/, 29];
495
- case 24:
496
- _e.trys.push([24, , 27, 28]);
497
- if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 26];
557
+ return [3 /*break*/, 33];
558
+ case 28:
559
+ _e.trys.push([28, , 31, 32]);
560
+ if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 30];
498
561
  return [4 /*yield*/, _c.call(records_2)];
499
- case 25:
562
+ case 29:
500
563
  _e.sent();
501
- _e.label = 26;
502
- case 26: return [3 /*break*/, 28];
503
- case 27:
564
+ _e.label = 30;
565
+ case 30: return [3 /*break*/, 32];
566
+ case 31:
504
567
  if (e_5) throw e_5.error;
505
568
  return [7 /*endfinally*/];
506
- case 28: return [7 /*endfinally*/];
507
- case 29: return [3 /*break*/, 32];
508
- case 30:
569
+ case 32: return [7 /*endfinally*/];
570
+ case 33: return [3 /*break*/, 36];
571
+ case 34:
509
572
  // TODO: Lazy loading
510
- return [3 /*break*/, 32];
511
- case 31:
573
+ return [3 /*break*/, 36];
574
+ case 35:
512
575
  util_1.exhaustiveCheck(relation.relationType);
513
- return [3 /*break*/, 32];
514
- case 32: return [3 /*break*/, 2];
515
- case 33: return [3 /*break*/, 40];
516
- case 34:
576
+ return [3 /*break*/, 36];
577
+ case 36: return [3 /*break*/, 2];
578
+ case 37: return [3 /*break*/, 44];
579
+ case 38:
517
580
  e_3_1 = _e.sent();
518
581
  e_3 = { error: e_3_1 };
519
- return [3 /*break*/, 40];
520
- case 35:
521
- _e.trys.push([35, , 38, 39]);
522
- if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 37];
582
+ return [3 /*break*/, 44];
583
+ case 39:
584
+ _e.trys.push([39, , 42, 43]);
585
+ if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 41];
523
586
  return [4 /*yield*/, _a.call(relations_1)];
524
- case 36:
587
+ case 40:
525
588
  _e.sent();
526
- _e.label = 37;
527
- case 37: return [3 /*break*/, 39];
528
- case 38:
589
+ _e.label = 41;
590
+ case 41: return [3 /*break*/, 43];
591
+ case 42:
529
592
  if (e_3) throw e_3.error;
530
593
  return [7 /*endfinally*/];
531
- case 39: return [7 /*endfinally*/];
532
- case 40: return [2 /*return*/, records.map(function (record) {
594
+ case 43: return [7 /*endfinally*/];
595
+ case 44: return [2 /*return*/, records.map(function (record) {
533
596
  return _this.modelInstanceCreator(modelConstructor, record);
534
597
  })];
535
598
  }
@@ -538,7 +601,7 @@ var IndexedDBAdapter = /** @class */ (function () {
538
601
  };
539
602
  IndexedDBAdapter.prototype.query = function (modelConstructor, predicate, pagination) {
540
603
  return __awaiter(this, void 0, void 0, function () {
541
- var storeName, namespaceName, predicates, queryById, hasSort, hasPagination, records;
604
+ var storeName, namespaceName, predicates, keyPath, queryByKey, hasSort, hasPagination, records;
542
605
  var _this = this;
543
606
  return __generator(this, function (_a) {
544
607
  switch (_a.label) {
@@ -548,7 +611,8 @@ var IndexedDBAdapter = /** @class */ (function () {
548
611
  storeName = this.getStorenameForModel(modelConstructor);
549
612
  namespaceName = this.namespaceResolver(modelConstructor);
550
613
  predicates = predicate && predicates_1.ModelPredicateCreator.getPredicates(predicate);
551
- queryById = predicates && this.idFromPredicate(predicates);
614
+ keyPath = util_1.getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
615
+ queryByKey = predicates && this.keyValueFromPredicate(predicates, keyPath);
552
616
  hasSort = pagination && pagination.sort;
553
617
  hasPagination = pagination && pagination.limit;
554
618
  return [4 /*yield*/, (function () { return __awaiter(_this, void 0, void 0, function () {
@@ -556,8 +620,8 @@ var IndexedDBAdapter = /** @class */ (function () {
556
620
  return __generator(this, function (_a) {
557
621
  switch (_a.label) {
558
622
  case 0:
559
- if (!queryById) return [3 /*break*/, 2];
560
- return [4 /*yield*/, this.getById(storeName, queryById)];
623
+ if (!queryByKey) return [3 /*break*/, 2];
624
+ return [4 /*yield*/, this.getByKey(storeName, queryByKey)];
561
625
  case 1:
562
626
  record = _a.sent();
563
627
  return [2 /*return*/, record ? [record] : []];
@@ -589,12 +653,12 @@ var IndexedDBAdapter = /** @class */ (function () {
589
653
  });
590
654
  });
591
655
  };
592
- IndexedDBAdapter.prototype.getById = function (storeName, id) {
656
+ IndexedDBAdapter.prototype.getByKey = function (storeName, keyValue) {
593
657
  return __awaiter(this, void 0, void 0, function () {
594
658
  var record;
595
659
  return __generator(this, function (_a) {
596
660
  switch (_a.label) {
597
- case 0: return [4 /*yield*/, this._get(storeName, id)];
661
+ case 0: return [4 /*yield*/, this._get(storeName, keyValue)];
598
662
  case 1:
599
663
  record = _a.sent();
600
664
  return [2 /*return*/, record];
@@ -612,11 +676,31 @@ var IndexedDBAdapter = /** @class */ (function () {
612
676
  });
613
677
  });
614
678
  };
615
- IndexedDBAdapter.prototype.idFromPredicate = function (predicates) {
679
+ IndexedDBAdapter.prototype.keyValueFromPredicate = function (predicates, keyPath) {
680
+ var e_6, _a;
616
681
  var predicateObjs = predicates.predicates;
617
- var idPredicate = predicateObjs.length === 1 &&
618
- predicateObjs.find(function (p) { return types_1.isPredicateObj(p) && p.field === 'id' && p.operator === 'eq'; });
619
- return idPredicate && idPredicate.operand;
682
+ if (predicateObjs.length !== keyPath.length) {
683
+ return;
684
+ }
685
+ var keyValues = [];
686
+ var _loop_1 = function (key) {
687
+ var predicateObj = predicateObjs.find(function (p) { return types_1.isPredicateObj(p) && p.field === key && p.operator === 'eq'; });
688
+ predicateObj && keyValues.push(predicateObj.operand);
689
+ };
690
+ try {
691
+ for (var keyPath_1 = __values(keyPath), keyPath_1_1 = keyPath_1.next(); !keyPath_1_1.done; keyPath_1_1 = keyPath_1.next()) {
692
+ var key = keyPath_1_1.value;
693
+ _loop_1(key);
694
+ }
695
+ }
696
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
697
+ finally {
698
+ try {
699
+ if (keyPath_1_1 && !keyPath_1_1.done && (_a = keyPath_1.return)) _a.call(keyPath_1);
700
+ }
701
+ finally { if (e_6) throw e_6.error; }
702
+ }
703
+ return keyValues.length === keyPath.length ? keyValues : undefined;
620
704
  };
621
705
  IndexedDBAdapter.prototype.filterOnPredicate = function (storeName, predicates) {
622
706
  return __awaiter(this, void 0, void 0, function () {
@@ -722,7 +806,7 @@ var IndexedDBAdapter = /** @class */ (function () {
722
806
  };
723
807
  IndexedDBAdapter.prototype.delete = function (modelOrModelConstructor, condition) {
724
808
  return __awaiter(this, void 0, void 0, function () {
725
- var deleteQueue, modelConstructor, nameSpace, storeName, models, relations, deletedModels, deletedModels, model, modelConstructor, nameSpace, storeName, tx, store, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
809
+ var deleteQueue, modelConstructor, nameSpace, storeName, models, relations, deletedModels, deletedModels, model, modelConstructor, namespaceName, storeName, tx, store, keyValues, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
726
810
  return __generator(this, function (_a) {
727
811
  switch (_a.label) {
728
812
  case 0: return [4 /*yield*/, this.checkPrivate()];
@@ -771,12 +855,13 @@ var IndexedDBAdapter = /** @class */ (function () {
771
855
  model = modelOrModelConstructor;
772
856
  modelConstructor = Object.getPrototypeOf(model)
773
857
  .constructor;
774
- nameSpace = this.namespaceResolver(modelConstructor);
858
+ namespaceName = this.namespaceResolver(modelConstructor);
775
859
  storeName = this.getStorenameForModel(modelConstructor);
776
860
  if (!condition) return [3 /*break*/, 13];
777
861
  tx = this.db.transaction([storeName], 'readwrite');
778
862
  store = tx.objectStore(storeName);
779
- return [4 /*yield*/, this._get(store, model.id)];
863
+ keyValues = this.getIndexKeyValuesFromModel(model);
864
+ return [4 /*yield*/, this._get(store, keyValues)];
780
865
  case 10:
781
866
  fromDB = _a.sent();
782
867
  if (fromDB === undefined) {
@@ -795,16 +880,14 @@ var IndexedDBAdapter = /** @class */ (function () {
795
880
  return [4 /*yield*/, tx.done];
796
881
  case 11:
797
882
  _a.sent();
798
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
799
- .relationTypes;
800
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
883
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
884
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
801
885
  case 12:
802
886
  _a.sent();
803
887
  return [3 /*break*/, 15];
804
888
  case 13:
805
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
806
- .relationTypes;
807
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
889
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
890
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
808
891
  case 14:
809
892
  _a.sent();
810
893
  _a.label = 15;
@@ -823,9 +906,9 @@ var IndexedDBAdapter = /** @class */ (function () {
823
906
  };
824
907
  IndexedDBAdapter.prototype.deleteItem = function (deleteQueue) {
825
908
  var deleteQueue_1, deleteQueue_1_1;
826
- var e_6, _a, e_7, _b;
909
+ var e_7, _a, e_8, _b;
827
910
  return __awaiter(this, void 0, void 0, function () {
828
- var connectionStoreNames, tx, deleteItem, storeName, items, store, items_1, items_1_1, item, key, e_7_1, e_6_1;
911
+ var connectionStoreNames, tx, deleteItem, storeName, items, store, items_1, items_1_1, item, key, keyValues, itemKey, e_8_1, e_7_1;
829
912
  return __generator(this, function (_c) {
830
913
  switch (_c.label) {
831
914
  case 0:
@@ -857,11 +940,14 @@ var IndexedDBAdapter = /** @class */ (function () {
857
940
  if (!item) return [3 /*break*/, 12];
858
941
  key = void 0;
859
942
  if (!(typeof item === 'object')) return [3 /*break*/, 8];
860
- return [4 /*yield*/, store.index('byId').getKey(item['id'])];
943
+ keyValues = this.getIndexKeyValuesFromModel(item);
944
+ return [4 /*yield*/, store.index('byPk').getKey(keyValues)];
861
945
  case 7:
862
946
  key = _c.sent();
863
947
  return [3 /*break*/, 10];
864
- case 8: return [4 /*yield*/, store.index('byId').getKey(item.toString())];
948
+ case 8:
949
+ itemKey = [item.toString()];
950
+ return [4 /*yield*/, store.index('byPk').getKey([itemKey])];
865
951
  case 9:
866
952
  key = _c.sent();
867
953
  _c.label = 10;
@@ -874,8 +960,8 @@ var IndexedDBAdapter = /** @class */ (function () {
874
960
  case 12: return [3 /*break*/, 5];
875
961
  case 13: return [3 /*break*/, 20];
876
962
  case 14:
877
- e_7_1 = _c.sent();
878
- e_7 = { error: e_7_1 };
963
+ e_8_1 = _c.sent();
964
+ e_8 = { error: e_8_1 };
879
965
  return [3 /*break*/, 20];
880
966
  case 15:
881
967
  _c.trys.push([15, , 18, 19]);
@@ -886,14 +972,14 @@ var IndexedDBAdapter = /** @class */ (function () {
886
972
  _c.label = 17;
887
973
  case 17: return [3 /*break*/, 19];
888
974
  case 18:
889
- if (e_7) throw e_7.error;
975
+ if (e_8) throw e_8.error;
890
976
  return [7 /*endfinally*/];
891
977
  case 19: return [7 /*endfinally*/];
892
978
  case 20: return [3 /*break*/, 2];
893
979
  case 21: return [3 /*break*/, 28];
894
980
  case 22:
895
- e_6_1 = _c.sent();
896
- e_6 = { error: e_6_1 };
981
+ e_7_1 = _c.sent();
982
+ e_7 = { error: e_7_1 };
897
983
  return [3 /*break*/, 28];
898
984
  case 23:
899
985
  _c.trys.push([23, , 26, 27]);
@@ -904,7 +990,7 @@ var IndexedDBAdapter = /** @class */ (function () {
904
990
  _c.label = 25;
905
991
  case 25: return [3 /*break*/, 27];
906
992
  case 26:
907
- if (e_6) throw e_6.error;
993
+ if (e_7) throw e_7.error;
908
994
  return [7 /*endfinally*/];
909
995
  case 27: return [7 /*endfinally*/];
910
996
  case 28: return [2 /*return*/];
@@ -914,145 +1000,178 @@ var IndexedDBAdapter = /** @class */ (function () {
914
1000
  };
915
1001
  IndexedDBAdapter.prototype.deleteTraverse = function (relations, models, srcModel, nameSpace, deleteQueue) {
916
1002
  var relations_2, relations_2_1, models_1, models_1_1, models_2, models_2_1;
917
- var e_8, _a, e_9, _b, e_10, _c;
1003
+ var e_9, _a, e_10, _b, e_11, _c;
918
1004
  return __awaiter(this, void 0, void 0, function () {
919
- var rel, relationType, fieldName, modelName, targetName, storeName, index, _d, model, hasOneIndex, hasOneCustomField, value, recordToDelete, e_9_1, model, childrenArray, e_10_1, e_8_1;
1005
+ var rel, relationType, modelName, targetName, targetNames, associatedWith, storeName, _d, model, hasOneIndex, values, recordToDelete, index, values, value, recordToDelete, e_10_1, model, index, keyValues, childrenArray, e_11_1, e_9_1;
920
1006
  var _this = this;
921
1007
  return __generator(this, function (_e) {
922
1008
  switch (_e.label) {
923
1009
  case 0:
924
- _e.trys.push([0, 35, 36, 41]);
1010
+ _e.trys.push([0, 38, 39, 44]);
925
1011
  relations_2 = __asyncValues(relations);
926
1012
  _e.label = 1;
927
1013
  case 1: return [4 /*yield*/, relations_2.next()];
928
1014
  case 2:
929
- if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 34];
1015
+ if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 37];
930
1016
  rel = relations_2_1.value;
931
- relationType = rel.relationType, fieldName = rel.fieldName, modelName = rel.modelName, targetName = rel.targetName;
932
- storeName = this.getStorename(nameSpace, modelName);
933
- index = util_1.getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
934
- .relationTypes, srcModel) ||
935
- // if we were unable to find an index via relationTypes
936
- // i.e. for keyName connections, attempt to find one by the
937
- // associatedWith property
938
- util_1.getIndexFromAssociation(this.schema.namespaces[nameSpace].relationships[modelName].indexes, rel.associatedWith);
1017
+ relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
1018
+ storeName = util_1.getStorename(nameSpace, modelName);
939
1019
  _d = relationType;
940
1020
  switch (_d) {
941
1021
  case 'HAS_ONE': return [3 /*break*/, 3];
942
- case 'HAS_MANY': return [3 /*break*/, 17];
943
- case 'BELONGS_TO': return [3 /*break*/, 31];
1022
+ case 'HAS_MANY': return [3 /*break*/, 20];
1023
+ case 'BELONGS_TO': return [3 /*break*/, 34];
944
1024
  }
945
- return [3 /*break*/, 32];
1025
+ return [3 /*break*/, 35];
946
1026
  case 3:
947
- _e.trys.push([3, 10, 11, 16]);
1027
+ _e.trys.push([3, 13, 14, 19]);
948
1028
  models_1 = __asyncValues(models);
949
1029
  _e.label = 4;
950
1030
  case 4: return [4 /*yield*/, models_1.next()];
951
1031
  case 5:
952
- if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 9];
1032
+ if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 12];
953
1033
  model = models_1_1.value;
954
- hasOneIndex = index || 'byId';
955
- hasOneCustomField = targetName in model;
956
- value = hasOneCustomField ? model[targetName] : model.id;
957
- if (!value)
958
- return [3 /*break*/, 9];
1034
+ hasOneIndex = 'byPk';
1035
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 8];
1036
+ values = targetNames.map(function (targetName) { return model[targetName]; });
1037
+ if (values.length === 0)
1038
+ return [3 /*break*/, 12];
959
1039
  return [4 /*yield*/, this.db
960
1040
  .transaction(storeName, 'readwrite')
961
1041
  .objectStore(storeName)
962
1042
  .index(hasOneIndex)
963
- .get(value)];
1043
+ .get(values)];
964
1044
  case 6:
965
1045
  recordToDelete = (_e.sent());
966
1046
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
967
1047
  .relationTypes, recordToDelete ? [recordToDelete] : [], modelName, nameSpace, deleteQueue)];
968
1048
  case 7:
969
1049
  _e.sent();
970
- _e.label = 8;
971
- case 8: return [3 /*break*/, 4];
972
- case 9: return [3 /*break*/, 16];
1050
+ return [3 /*break*/, 12];
1051
+ case 8:
1052
+ index = void 0;
1053
+ values = void 0;
1054
+ if (targetName && targetName in model) {
1055
+ index = hasOneIndex;
1056
+ value = model[targetName];
1057
+ values = [value];
1058
+ }
1059
+ else {
1060
+ // backwards compatability for older versions of codegen that did not emit targetName for HAS_ONE relations
1061
+ // TODO: can we deprecate this? it's been ~2 years since codegen started including targetName for HAS_ONE
1062
+ // If we deprecate, we'll need to re-gen the MIPR in __tests__/schema.ts > newSchema
1063
+ // otherwise some unit tests will fail
1064
+ index = util_1.getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
1065
+ .relationTypes, srcModel);
1066
+ values = this.getIndexKeyValuesFromModel(model);
1067
+ }
1068
+ if (!values || !index)
1069
+ return [3 /*break*/, 12];
1070
+ return [4 /*yield*/, this.db
1071
+ .transaction(storeName, 'readwrite')
1072
+ .objectStore(storeName)
1073
+ .index(index)
1074
+ .get(values)];
1075
+ case 9:
1076
+ recordToDelete = (_e.sent());
1077
+ return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
1078
+ .relationTypes, recordToDelete ? [recordToDelete] : [], modelName, nameSpace, deleteQueue)];
973
1079
  case 10:
974
- e_9_1 = _e.sent();
975
- e_9 = { error: e_9_1 };
976
- return [3 /*break*/, 16];
977
- case 11:
978
- _e.trys.push([11, , 14, 15]);
979
- if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 13];
980
- return [4 /*yield*/, _b.call(models_1)];
981
- case 12:
982
1080
  _e.sent();
983
- _e.label = 13;
984
- case 13: return [3 /*break*/, 15];
1081
+ _e.label = 11;
1082
+ case 11: return [3 /*break*/, 4];
1083
+ case 12: return [3 /*break*/, 19];
1084
+ case 13:
1085
+ e_10_1 = _e.sent();
1086
+ e_10 = { error: e_10_1 };
1087
+ return [3 /*break*/, 19];
985
1088
  case 14:
986
- if (e_9) throw e_9.error;
987
- return [7 /*endfinally*/];
988
- case 15: return [7 /*endfinally*/];
989
- case 16: return [3 /*break*/, 33];
1089
+ _e.trys.push([14, , 17, 18]);
1090
+ if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 16];
1091
+ return [4 /*yield*/, _b.call(models_1)];
1092
+ case 15:
1093
+ _e.sent();
1094
+ _e.label = 16;
1095
+ case 16: return [3 /*break*/, 18];
990
1096
  case 17:
991
- _e.trys.push([17, 24, 25, 30]);
1097
+ if (e_10) throw e_10.error;
1098
+ return [7 /*endfinally*/];
1099
+ case 18: return [7 /*endfinally*/];
1100
+ case 19: return [3 /*break*/, 36];
1101
+ case 20:
1102
+ _e.trys.push([20, 27, 28, 33]);
992
1103
  models_2 = __asyncValues(models);
993
- _e.label = 18;
994
- case 18: return [4 /*yield*/, models_2.next()];
995
- case 19:
996
- if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 23];
1104
+ _e.label = 21;
1105
+ case 21: return [4 /*yield*/, models_2.next()];
1106
+ case 22:
1107
+ if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 26];
997
1108
  model = models_2_1.value;
1109
+ index =
1110
+ // explicit bi-directional @hasMany and @manyToMany
1111
+ util_1.getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
1112
+ .relationTypes, srcModel) ||
1113
+ // uni and/or implicit @hasMany
1114
+ util_1.getIndexFromAssociation(this.schema.namespaces[nameSpace].relationships[modelName]
1115
+ .indexes, associatedWith);
1116
+ keyValues = this.getIndexKeyValuesFromModel(model);
998
1117
  return [4 /*yield*/, this.db
999
1118
  .transaction(storeName, 'readwrite')
1000
1119
  .objectStore(storeName)
1001
1120
  .index(index)
1002
- .getAll(model['id'])];
1003
- case 20:
1121
+ .getAll(keyValues)];
1122
+ case 23:
1004
1123
  childrenArray = _e.sent();
1005
1124
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
1006
1125
  .relationTypes, childrenArray, modelName, nameSpace, deleteQueue)];
1007
- case 21:
1008
- _e.sent();
1009
- _e.label = 22;
1010
- case 22: return [3 /*break*/, 18];
1011
- case 23: return [3 /*break*/, 30];
1012
1126
  case 24:
1013
- e_10_1 = _e.sent();
1014
- e_10 = { error: e_10_1 };
1015
- return [3 /*break*/, 30];
1016
- case 25:
1017
- _e.trys.push([25, , 28, 29]);
1018
- if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 27];
1019
- return [4 /*yield*/, _c.call(models_2)];
1020
- case 26:
1021
1127
  _e.sent();
1022
- _e.label = 27;
1023
- case 27: return [3 /*break*/, 29];
1128
+ _e.label = 25;
1129
+ case 25: return [3 /*break*/, 21];
1130
+ case 26: return [3 /*break*/, 33];
1131
+ case 27:
1132
+ e_11_1 = _e.sent();
1133
+ e_11 = { error: e_11_1 };
1134
+ return [3 /*break*/, 33];
1024
1135
  case 28:
1025
- if (e_10) throw e_10.error;
1136
+ _e.trys.push([28, , 31, 32]);
1137
+ if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 30];
1138
+ return [4 /*yield*/, _c.call(models_2)];
1139
+ case 29:
1140
+ _e.sent();
1141
+ _e.label = 30;
1142
+ case 30: return [3 /*break*/, 32];
1143
+ case 31:
1144
+ if (e_11) throw e_11.error;
1026
1145
  return [7 /*endfinally*/];
1027
- case 29: return [7 /*endfinally*/];
1028
- case 30: return [3 /*break*/, 33];
1029
- case 31:
1146
+ case 32: return [7 /*endfinally*/];
1147
+ case 33: return [3 /*break*/, 36];
1148
+ case 34:
1030
1149
  // Intentionally blank
1031
- return [3 /*break*/, 33];
1032
- case 32:
1033
- util_1.exhaustiveCheck(relationType);
1034
- return [3 /*break*/, 33];
1035
- case 33: return [3 /*break*/, 1];
1036
- case 34: return [3 /*break*/, 41];
1150
+ return [3 /*break*/, 36];
1037
1151
  case 35:
1038
- e_8_1 = _e.sent();
1039
- e_8 = { error: e_8_1 };
1040
- return [3 /*break*/, 41];
1041
- case 36:
1042
- _e.trys.push([36, , 39, 40]);
1043
- if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 38];
1152
+ util_1.exhaustiveCheck(relationType);
1153
+ return [3 /*break*/, 36];
1154
+ case 36: return [3 /*break*/, 1];
1155
+ case 37: return [3 /*break*/, 44];
1156
+ case 38:
1157
+ e_9_1 = _e.sent();
1158
+ e_9 = { error: e_9_1 };
1159
+ return [3 /*break*/, 44];
1160
+ case 39:
1161
+ _e.trys.push([39, , 42, 43]);
1162
+ if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 41];
1044
1163
  return [4 /*yield*/, _a.call(relations_2)];
1045
- case 37:
1164
+ case 40:
1046
1165
  _e.sent();
1047
- _e.label = 38;
1048
- case 38: return [3 /*break*/, 40];
1049
- case 39:
1050
- if (e_8) throw e_8.error;
1166
+ _e.label = 41;
1167
+ case 41: return [3 /*break*/, 43];
1168
+ case 42:
1169
+ if (e_9) throw e_9.error;
1051
1170
  return [7 /*endfinally*/];
1052
- case 40: return [7 /*endfinally*/];
1053
- case 41:
1171
+ case 43: return [7 /*endfinally*/];
1172
+ case 44:
1054
1173
  deleteQueue.push({
1055
- storeName: this.getStorename(nameSpace, srcModel),
1174
+ storeName: util_1.getStorename(nameSpace, srcModel),
1056
1175
  items: models.map(function (record) {
1057
1176
  return _this.modelInstanceCreator(_this.getModelConstructorByModelName(nameSpace, srcModel), record);
1058
1177
  }),
@@ -1083,8 +1202,9 @@ var IndexedDBAdapter = /** @class */ (function () {
1083
1202
  };
1084
1203
  IndexedDBAdapter.prototype.batchSave = function (modelConstructor, items) {
1085
1204
  return __awaiter(this, void 0, void 0, function () {
1086
- var result, storeName, txn, store, _loop_1, this_1, items_2, items_2_1, item, e_11_1;
1087
- var e_11, _a;
1205
+ var result, storeName, txn, store, _loop_2, this_1, items_2, items_2_1, item, e_12_1;
1206
+ var e_12, _a;
1207
+ var _this = this;
1088
1208
  return __generator(this, function (_b) {
1089
1209
  switch (_b.label) {
1090
1210
  case 0:
@@ -1098,21 +1218,26 @@ var IndexedDBAdapter = /** @class */ (function () {
1098
1218
  storeName = this.getStorenameForModel(modelConstructor);
1099
1219
  txn = this.db.transaction(storeName, 'readwrite');
1100
1220
  store = txn.store;
1101
- _loop_1 = function (item) {
1102
- var connectedModels, id, _deleted, index, key, instance;
1221
+ _loop_2 = function (item) {
1222
+ var namespaceName, modelName, model, connectedModels, keyValues, _deleted, index, key, instance;
1103
1223
  return __generator(this, function (_a) {
1104
1224
  switch (_a.label) {
1105
1225
  case 0:
1106
- 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);
1107
- id = item.id, _deleted = item._deleted;
1108
- index = store.index('byId');
1109
- return [4 /*yield*/, index.getKey(id)];
1226
+ namespaceName = this_1.namespaceResolver(modelConstructor);
1227
+ modelName = modelConstructor.name;
1228
+ model = this_1.modelInstanceCreator(modelConstructor, item);
1229
+ connectedModels = util_1.traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
1230
+ keyValues = this_1.getIndexKeyValuesFromModel(model);
1231
+ _deleted = item._deleted;
1232
+ index = store.index('byPk');
1233
+ return [4 /*yield*/, index.getKey(keyValues)];
1110
1234
  case 1:
1111
1235
  key = _a.sent();
1112
1236
  if (!!_deleted) return [3 /*break*/, 3];
1113
1237
  instance = connectedModels.find(function (_a) {
1114
1238
  var instance = _a.instance;
1115
- return instance.id === id;
1239
+ var instanceKeyValues = _this.getIndexKeyValuesFromModel(instance);
1240
+ return util_1.keysEqual(instanceKeyValues, keyValues);
1116
1241
  }).instance;
1117
1242
  result.push([
1118
1243
  instance,
@@ -1142,7 +1267,7 @@ var IndexedDBAdapter = /** @class */ (function () {
1142
1267
  case 3:
1143
1268
  if (!!items_2_1.done) return [3 /*break*/, 6];
1144
1269
  item = items_2_1.value;
1145
- return [5 /*yield**/, _loop_1(item)];
1270
+ return [5 /*yield**/, _loop_2(item)];
1146
1271
  case 4:
1147
1272
  _b.sent();
1148
1273
  _b.label = 5;
@@ -1151,14 +1276,14 @@ var IndexedDBAdapter = /** @class */ (function () {
1151
1276
  return [3 /*break*/, 3];
1152
1277
  case 6: return [3 /*break*/, 9];
1153
1278
  case 7:
1154
- e_11_1 = _b.sent();
1155
- e_11 = { error: e_11_1 };
1279
+ e_12_1 = _b.sent();
1280
+ e_12 = { error: e_12_1 };
1156
1281
  return [3 /*break*/, 9];
1157
1282
  case 8:
1158
1283
  try {
1159
1284
  if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
1160
1285
  }
1161
- finally { if (e_11) throw e_11.error; }
1286
+ finally { if (e_12) throw e_12.error; }
1162
1287
  return [7 /*endfinally*/];
1163
1288
  case 9: return [4 /*yield*/, txn.done];
1164
1289
  case 10:
@@ -1169,18 +1294,15 @@ var IndexedDBAdapter = /** @class */ (function () {
1169
1294
  });
1170
1295
  };
1171
1296
  IndexedDBAdapter.prototype.createObjectStoreForModel = function (db, namespaceName, storeName, modelName) {
1172
- return __awaiter(this, void 0, void 0, function () {
1173
- var store, indexes;
1174
- return __generator(this, function (_a) {
1175
- store = db.createObjectStore(storeName, {
1176
- autoIncrement: true,
1177
- });
1178
- indexes = this.schema.namespaces[namespaceName].relationships[modelName].indexes;
1179
- indexes.forEach(function (index) { return store.createIndex(index, index); });
1180
- store.createIndex('byId', 'id', { unique: true });
1181
- return [2 /*return*/];
1182
- });
1297
+ var store = db.createObjectStore(storeName, {
1298
+ autoIncrement: true,
1299
+ });
1300
+ var indexes = this.schema.namespaces[namespaceName].relationships[modelName].indexes;
1301
+ indexes.forEach(function (_a) {
1302
+ var _b = __read(_a, 3), idxName = _b[0], keyPath = _b[1], options = _b[2];
1303
+ store.createIndex(idxName, keyPath, options);
1183
1304
  });
1305
+ return store;
1184
1306
  };
1185
1307
  return IndexedDBAdapter;
1186
1308
  }());