@aws-amplify/datastore 3.7.4-custom-pk.79 → 3.7.4-custom-pk.87

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 (42) hide show
  1. package/dist/aws-amplify-datastore.js +458 -256
  2. package/dist/aws-amplify-datastore.js.map +1 -1
  3. package/dist/aws-amplify-datastore.min.js +3 -3
  4. package/dist/aws-amplify-datastore.min.js.map +1 -1
  5. package/lib/datastore/datastore.js +47 -11
  6. package/lib/datastore/datastore.js.map +1 -1
  7. package/lib/storage/adapter/AsyncStorageAdapter.js +229 -135
  8. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  9. package/lib/storage/adapter/AsyncStorageDatabase.js +3 -2
  10. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  11. package/lib/storage/adapter/IndexedDBAdapter.js +12 -17
  12. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  13. package/lib/sync/utils.js +7 -3
  14. package/lib/sync/utils.js.map +1 -1
  15. package/lib/types.d.ts +5 -1
  16. package/lib/types.js.map +1 -1
  17. package/lib/util.d.ts +7 -2
  18. package/lib/util.js +76 -54
  19. package/lib/util.js.map +1 -1
  20. package/lib-esm/datastore/datastore.js +48 -12
  21. package/lib-esm/datastore/datastore.js.map +1 -1
  22. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +229 -135
  23. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  24. package/lib-esm/storage/adapter/AsyncStorageDatabase.js +4 -3
  25. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  26. package/lib-esm/storage/adapter/IndexedDBAdapter.js +12 -17
  27. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  28. package/lib-esm/sync/utils.js +7 -3
  29. package/lib-esm/sync/utils.js.map +1 -1
  30. package/lib-esm/types.d.ts +5 -1
  31. package/lib-esm/types.js.map +1 -1
  32. package/lib-esm/util.d.ts +7 -2
  33. package/lib-esm/util.js +74 -54
  34. package/lib-esm/util.js.map +1 -1
  35. package/package.json +7 -7
  36. package/src/datastore/datastore.ts +60 -13
  37. package/src/storage/adapter/AsyncStorageAdapter.ts +162 -35
  38. package/src/storage/adapter/AsyncStorageDatabase.ts +4 -2
  39. package/src/storage/adapter/IndexedDBAdapter.ts +14 -25
  40. package/src/sync/utils.ts +7 -4
  41. package/src/types.ts +10 -1
  42. package/src/util.ts +71 -35
@@ -81825,6 +81825,7 @@ __webpack_require__.r(__webpack_exports__);
81825
81825
  /* harmony import */ var _sync__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../sync */ "./lib-esm/sync/index.js");
81826
81826
  /* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../types */ "./lib-esm/types.js");
81827
81827
  /* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../util */ "./lib-esm/util.js");
81828
+ /* harmony import */ var _sync_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../sync/utils */ "./lib-esm/sync/utils.js");
81828
81829
  function _typeof(obj) {
81829
81830
  "@babel/helpers - typeof";
81830
81831
 
@@ -82072,6 +82073,7 @@ var __spread = undefined && undefined.__spread || function () {
82072
82073
 
82073
82074
 
82074
82075
 
82076
+
82075
82077
  Object(immer__WEBPACK_IMPORTED_MODULE_4__["setAutoFreeze"])(true);
82076
82078
  Object(immer__WEBPACK_IMPORTED_MODULE_4__["enablePatches"])();
82077
82079
  var logger = new _aws_amplify_core__WEBPACK_IMPORTED_MODULE_1__["ConsoleLogger"]('DataStore');
@@ -82242,6 +82244,10 @@ function modelInstanceCreator(modelConstructor, init) {
82242
82244
  return new modelConstructor(init);
82243
82245
  }
82244
82246
 
82247
+ function isSchemaModel(m) {
82248
+ return m.attributes !== undefined;
82249
+ }
82250
+
82245
82251
  var validateModelFields = function validateModelFields(modelDefinition) {
82246
82252
  return function (k, v) {
82247
82253
  var fieldDefinition = modelDefinition.fields[k];
@@ -82257,6 +82263,18 @@ var validateModelFields = function validateModelFields(modelDefinition) {
82257
82263
  throw new Error("Field " + name_1 + " is required");
82258
82264
  }
82259
82265
 
82266
+ if (isSchemaModel(modelDefinition) && !Object(_util__WEBPACK_IMPORTED_MODULE_12__["isIdManaged"])(modelDefinition)) {
82267
+ var keys = Object(_util__WEBPACK_IMPORTED_MODULE_12__["extractPrimaryKeyFieldNames"])(modelDefinition);
82268
+
82269
+ if (keys.includes(k) && v === '') {
82270
+ logger.error(_util__WEBPACK_IMPORTED_MODULE_12__["errorMessages"].idEmptyString, {
82271
+ k: k,
82272
+ value: v
82273
+ });
82274
+ throw new Error(_util__WEBPACK_IMPORTED_MODULE_12__["errorMessages"].idEmptyString);
82275
+ }
82276
+ }
82277
+
82260
82278
  if (Object(_types__WEBPACK_IMPORTED_MODULE_11__["isGraphQLScalarType"])(type)) {
82261
82279
  var jsType_1 = _types__WEBPACK_IMPORTED_MODULE_11__["GraphQLScalarType"].getJSType(type);
82262
82280
  var validateScalar_1 = _types__WEBPACK_IMPORTED_MODULE_11__["GraphQLScalarType"].getValidationFunction(type);
@@ -82412,7 +82430,6 @@ var createModelClass = function createModelClass(modelDefinition) {
82412
82430
  var model = Object(immer__WEBPACK_IMPORTED_MODULE_4__["produce"])(source, function (draft) {
82413
82431
  fn(draft);
82414
82432
  var keyNames = Object(_util__WEBPACK_IMPORTED_MODULE_12__["extractPrimaryKeyFieldNames"])(modelDefinition); // Keys are immutable
82415
- // CPK TODO: Previous comment from Ivan:
82416
82433
  // @ts-ignore TODO: fix type
82417
82434
 
82418
82435
  keyNames.forEach(function (key) {
@@ -83205,7 +83222,7 @@ function () {
83205
83222
  }).subscribe({
83206
83223
  next: function next(item) {
83207
83224
  return __awaiter(_this, void 0, void 0, function () {
83208
- var message, freshElement;
83225
+ var message, modelDefinition, keyFields, primaryKeysAndValues, freshElement;
83209
83226
  return __generator(this, function (_a) {
83210
83227
  switch (_a.label) {
83211
83228
  case 0:
@@ -83213,9 +83230,12 @@ function () {
83213
83230
  if (!(item.opType !== 'DELETE')) return [3
83214
83231
  /*break*/
83215
83232
  , 2];
83233
+ modelDefinition = getModelDefinition(item.model);
83234
+ keyFields = Object(_util__WEBPACK_IMPORTED_MODULE_12__["extractPrimaryKeyFieldNames"])(modelDefinition);
83235
+ primaryKeysAndValues = Object(_util__WEBPACK_IMPORTED_MODULE_12__["extractPrimaryKeysAndValues"])(item.element, keyFields);
83216
83236
  return [4
83217
83237
  /*yield*/
83218
- , this.query(item.model, item.element.id)];
83238
+ , this.query(item.model, primaryKeysAndValues)];
83219
83239
 
83220
83240
  case 1:
83221
83241
  freshElement = _a.sent();
@@ -83328,7 +83348,15 @@ function () {
83328
83348
  case 1:
83329
83349
  // first, query and return any locally-available records
83330
83350
  _a.sent().forEach(function (item) {
83331
- return items.set(item.id, item);
83351
+ var record = item; // TODO: fix query
83352
+
83353
+ if (Array.isArray(item)) {
83354
+ record = item[0];
83355
+ }
83356
+
83357
+ var itemModelDefinition = getModelDefinition(model);
83358
+ var idOrPk = Object(_sync_utils__WEBPACK_IMPORTED_MODULE_13__["getIdentifierValue"])(itemModelDefinition, record);
83359
+ items.set(idOrPk, record);
83332
83360
  }); // Observe the model and send a stream of updates (debounced).
83333
83361
  // We need to post-filter results instead of passing criteria through
83334
83362
  // to have visibility into items that move from in-set to out-of-set.
@@ -83342,13 +83370,22 @@ function () {
83342
83370
 
83343
83371
  var _b, _c;
83344
83372
 
83345
- if (hasPredicate && !Object(_util__WEBPACK_IMPORTED_MODULE_12__["validatePredicate"])(element, predicateGroupType, predicates)) {
83346
- if (opType === 'UPDATE' && (items.has(element.id) || itemsChanged.has(element.id))) {
83373
+ var record = element; // TODO: fix query
83374
+
83375
+ if (Array.isArray(element)) {
83376
+ record = element[0];
83377
+ }
83378
+
83379
+ var itemModelDefinition = getModelDefinition(model);
83380
+ var idOrPk = Object(_sync_utils__WEBPACK_IMPORTED_MODULE_13__["getIdentifierValue"])(itemModelDefinition, record);
83381
+
83382
+ if (hasPredicate && !Object(_util__WEBPACK_IMPORTED_MODULE_12__["validatePredicate"])(record, predicateGroupType, predicates)) {
83383
+ if (opType === 'UPDATE' && (items.has(idOrPk) || itemsChanged.has(idOrPk))) {
83347
83384
  // tracking as a "deleted item" will include the item in
83348
83385
  // page limit calculations and ensure it is removed from the
83349
83386
  // final items collection, regardless of which collection(s)
83350
83387
  // it is currently in. (I mean, it could be in both, right!?)
83351
- deletedItemIds.push(element.id);
83388
+ deletedItemIds.push(idOrPk);
83352
83389
  } else {
83353
83390
  // ignore updates for irrelevant/filtered items.
83354
83391
  return;
@@ -83360,9 +83397,9 @@ function () {
83360
83397
 
83361
83398
 
83362
83399
  if (opType === 'DELETE') {
83363
- deletedItemIds.push(element.id);
83400
+ deletedItemIds.push(idOrPk);
83364
83401
  } else {
83365
- itemsChanged.set(element.id, element);
83402
+ itemsChanged.set(idOrPk, record);
83366
83403
  }
83367
83404
 
83368
83405
  var isSynced = (_c = (_b = _this.sync) === null || _b === void 0 ? void 0 : _b.getModelSyncedStatus(model)) !== null && _c !== void 0 ? _c : false;
@@ -83417,11 +83454,20 @@ function () {
83417
83454
 
83418
83455
  items.clear();
83419
83456
  itemsArray.forEach(function (item) {
83420
- return items.set(item.id, item);
83457
+ // CPK TODO: fix query
83458
+ var record = item;
83459
+
83460
+ if (Array.isArray(item)) {
83461
+ record = item[0];
83462
+ }
83463
+
83464
+ var itemModelDefinition = getModelDefinition(model);
83465
+ var idOrPk = Object(_sync_utils__WEBPACK_IMPORTED_MODULE_13__["getIdentifierValue"])(itemModelDefinition, record);
83466
+ items.set(idOrPk, record);
83421
83467
  }); // remove deleted items from the final result set
83422
83468
 
83423
- deletedItemIds.forEach(function (id) {
83424
- return items["delete"](id);
83469
+ deletedItemIds.forEach(function (idOrPk) {
83470
+ return items["delete"](idOrPk);
83425
83471
  });
83426
83472
  return {
83427
83473
  items: Array.from(items.values()),
@@ -84418,9 +84464,10 @@ function () {
84418
84464
 
84419
84465
 
84420
84466
  AsyncStorageAdapter.prototype.getIndexKeys = function (namespaceName, modelName) {
84421
- var _a, _b;
84467
+ var _a;
84422
84468
 
84423
- var keyPath = (_b = (_a = this.schema.namespaces[namespaceName]) === null || _a === void 0 ? void 0 : _a.keys[modelName]) === null || _b === void 0 ? void 0 : _b.primaryKey;
84469
+ var namespace = this.schema.namespaces[namespaceName];
84470
+ var keyPath = (_a = namespace === null || namespace === void 0 ? void 0 : namespace.keys[modelName]) === null || _a === void 0 ? void 0 : _a.primaryKey;
84424
84471
 
84425
84472
  if (keyPath) {
84426
84473
  return keyPath;
@@ -84712,7 +84759,7 @@ function () {
84712
84759
  var e_2, _a, e_3, _b, e_4, _c;
84713
84760
 
84714
84761
  return __awaiter(this, void 0, void 0, function () {
84715
- var namespace, relations, connectionStoreNames, modelConstructor, relations_1, relations_1_1, relation, fieldName, modelName, targetName, relationType, storeName, modelConstructor_1, _d, recordItem, getByfield, key, connectionRecord, e_3_1, recordItem, key, connectionRecord, e_4_1, e_2_1;
84762
+ 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;
84716
84763
 
84717
84764
  var _this = this;
84718
84765
 
@@ -84738,7 +84785,7 @@ function () {
84738
84785
  _e.label = 1;
84739
84786
 
84740
84787
  case 1:
84741
- _e.trys.push([1, 34, 35, 40]);
84788
+ _e.trys.push([1, 38, 39, 44]);
84742
84789
 
84743
84790
  relations_1 = __asyncValues(relations);
84744
84791
  _e.label = 2;
@@ -84751,9 +84798,9 @@ function () {
84751
84798
  case 3:
84752
84799
  if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3
84753
84800
  /*break*/
84754
- , 33];
84801
+ , 37];
84755
84802
  relation = relations_1_1.value;
84756
- fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, relationType = relation.relationType;
84803
+ fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, targetNames = relation.targetNames, relationType = relation.relationType;
84757
84804
  storeName = this.getStorename(namespaceName, modelName);
84758
84805
  modelConstructor_1 = this.getModelConstructorByModelName(namespaceName, modelName);
84759
84806
  _d = relationType;
@@ -84767,20 +84814,20 @@ function () {
84767
84814
  case 'BELONGS_TO':
84768
84815
  return [3
84769
84816
  /*break*/
84770
- , 17];
84817
+ , 19];
84771
84818
 
84772
84819
  case 'HAS_MANY':
84773
84820
  return [3
84774
84821
  /*break*/
84775
- , 30];
84822
+ , 34];
84776
84823
  }
84777
84824
 
84778
84825
  return [3
84779
84826
  /*break*/
84780
- , 31];
84827
+ , 35];
84781
84828
 
84782
84829
  case 4:
84783
- _e.trys.push([4, 10, 11, 16]);
84830
+ _e.trys.push([4, 12, 13, 18]);
84784
84831
 
84785
84832
  records_1 = __asyncValues(records);
84786
84833
  _e.label = 5;
@@ -84793,225 +84840,290 @@ function () {
84793
84840
  case 6:
84794
84841
  if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3
84795
84842
  /*break*/
84796
- , 9];
84843
+ , 11];
84797
84844
  recordItem = records_1_1.value;
84845
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3
84846
+ /*break*/
84847
+ , 8];
84848
+ getByFields = [];
84849
+ allPresent = void 0; // iterate through all targetnames to make sure they are all present in the recordItem
84850
+
84851
+ allPresent = targetNames.every(function (targetName) {
84852
+ return recordItem[targetName] != null;
84853
+ });
84854
+
84855
+ if (!allPresent) {
84856
+ return [3
84857
+ /*break*/
84858
+ , 11];
84859
+ }
84860
+
84861
+ getByFields = targetNames;
84862
+ keys = getByFields.map(function (getByField) {
84863
+ return recordItem[getByField];
84864
+ }).join(DEFAULT_PRIMARY_KEY_SEPARATOR);
84865
+ return [4
84866
+ /*yield*/
84867
+ , this.db.get(keys, storeName)];
84868
+
84869
+ case 7:
84870
+ connectionRecord = _e.sent();
84871
+ recordItem[fieldName] = connectionRecord && this.modelInstanceCreator(modelConstructor_1, connectionRecord);
84872
+ return [3
84873
+ /*break*/
84874
+ , 10];
84875
+
84876
+ case 8:
84798
84877
  getByfield = recordItem[targetName] ? targetName : fieldName;
84799
84878
  if (!recordItem[getByfield]) return [3
84800
84879
  /*break*/
84801
- , 9];
84880
+ , 11];
84802
84881
  key = recordItem[getByfield];
84803
84882
  return [4
84804
84883
  /*yield*/
84805
84884
  , this.db.get(key, storeName)];
84806
84885
 
84807
- case 7:
84886
+ case 9:
84808
84887
  connectionRecord = _e.sent();
84809
84888
  recordItem[fieldName] = connectionRecord && this.modelInstanceCreator(modelConstructor_1, connectionRecord);
84810
- _e.label = 8;
84889
+ _e.label = 10;
84811
84890
 
84812
- case 8:
84891
+ case 10:
84813
84892
  return [3
84814
84893
  /*break*/
84815
84894
  , 5];
84816
84895
 
84817
- case 9:
84896
+ case 11:
84818
84897
  return [3
84819
84898
  /*break*/
84820
- , 16];
84899
+ , 18];
84821
84900
 
84822
- case 10:
84901
+ case 12:
84823
84902
  e_3_1 = _e.sent();
84824
84903
  e_3 = {
84825
84904
  error: e_3_1
84826
84905
  };
84827
84906
  return [3
84828
84907
  /*break*/
84829
- , 16];
84908
+ , 18];
84830
84909
 
84831
- case 11:
84832
- _e.trys.push([11,, 14, 15]);
84910
+ case 13:
84911
+ _e.trys.push([13,, 16, 17]);
84833
84912
 
84834
84913
  if (!(records_1_1 && !records_1_1.done && (_b = records_1["return"]))) return [3
84835
84914
  /*break*/
84836
- , 13];
84915
+ , 15];
84837
84916
  return [4
84838
84917
  /*yield*/
84839
84918
  , _b.call(records_1)];
84840
84919
 
84841
- case 12:
84920
+ case 14:
84842
84921
  _e.sent();
84843
84922
 
84844
- _e.label = 13;
84923
+ _e.label = 15;
84845
84924
 
84846
- case 13:
84925
+ case 15:
84847
84926
  return [3
84848
84927
  /*break*/
84849
- , 15];
84928
+ , 17];
84850
84929
 
84851
- case 14:
84930
+ case 16:
84852
84931
  if (e_3) throw e_3.error;
84853
84932
  return [7
84854
84933
  /*endfinally*/
84855
84934
  ];
84856
84935
 
84857
- case 15:
84936
+ case 17:
84858
84937
  return [7
84859
84938
  /*endfinally*/
84860
84939
  ];
84861
84940
 
84862
- case 16:
84941
+ case 18:
84863
84942
  return [3
84864
84943
  /*break*/
84865
- , 32];
84944
+ , 36];
84866
84945
 
84867
- case 17:
84868
- _e.trys.push([17, 23, 24, 29]);
84946
+ case 19:
84947
+ _e.trys.push([19, 27, 28, 33]);
84869
84948
 
84870
84949
  records_2 = __asyncValues(records);
84871
- _e.label = 18;
84950
+ _e.label = 20;
84872
84951
 
84873
- case 18:
84952
+ case 20:
84874
84953
  return [4
84875
84954
  /*yield*/
84876
84955
  , records_2.next()];
84877
84956
 
84878
- case 19:
84957
+ case 21:
84879
84958
  if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3
84880
84959
  /*break*/
84881
- , 22];
84960
+ , 26];
84882
84961
  recordItem = records_2_1.value;
84962
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3
84963
+ /*break*/
84964
+ , 23];
84965
+ allPresent = void 0; // iterate through all targetnames to make sure they are all present in the recordItem
84966
+
84967
+ allPresent = targetNames.every(function (targetName) {
84968
+ return recordItem[targetName] != null;
84969
+ }); // If not present, there is not yet a connected record
84970
+
84971
+ if (!allPresent) {
84972
+ return [3
84973
+ /*break*/
84974
+ , 26];
84975
+ }
84976
+
84977
+ keys = targetNames.map(function (targetName) {
84978
+ return recordItem[targetName];
84979
+ }).join(DEFAULT_PRIMARY_KEY_SEPARATOR);
84980
+ return [4
84981
+ /*yield*/
84982
+ , this.db.get(keys, storeName)];
84983
+
84984
+ case 22:
84985
+ connectionRecord = _e.sent();
84986
+ recordItem[fieldName] = connectionRecord && this.modelInstanceCreator(modelConstructor_1, connectionRecord);
84987
+ targetNames === null || targetNames === void 0 ? void 0 : targetNames.map(function (targetName) {
84988
+ delete recordItem[targetName];
84989
+ });
84990
+ return [3
84991
+ /*break*/
84992
+ , 25];
84993
+
84994
+ case 23:
84883
84995
  if (!recordItem[targetName]) return [3
84884
84996
  /*break*/
84885
- , 21];
84997
+ , 25];
84886
84998
  key = recordItem[targetName];
84887
84999
  return [4
84888
85000
  /*yield*/
84889
85001
  , this.db.get(key, storeName)];
84890
85002
 
84891
- case 20:
85003
+ case 24:
84892
85004
  connectionRecord = _e.sent();
84893
85005
  recordItem[fieldName] = connectionRecord && this.modelInstanceCreator(modelConstructor_1, connectionRecord);
84894
85006
  delete recordItem[targetName];
84895
- _e.label = 21;
85007
+ _e.label = 25;
84896
85008
 
84897
- case 21:
85009
+ case 25:
84898
85010
  return [3
84899
85011
  /*break*/
84900
- , 18];
85012
+ , 20];
84901
85013
 
84902
- case 22:
85014
+ case 26:
84903
85015
  return [3
84904
85016
  /*break*/
84905
- , 29];
85017
+ , 33];
84906
85018
 
84907
- case 23:
85019
+ case 27:
84908
85020
  e_4_1 = _e.sent();
84909
85021
  e_4 = {
84910
85022
  error: e_4_1
84911
85023
  };
84912
85024
  return [3
84913
85025
  /*break*/
84914
- , 29];
85026
+ , 33];
84915
85027
 
84916
- case 24:
84917
- _e.trys.push([24,, 27, 28]);
85028
+ case 28:
85029
+ _e.trys.push([28,, 31, 32]);
84918
85030
 
84919
85031
  if (!(records_2_1 && !records_2_1.done && (_c = records_2["return"]))) return [3
84920
85032
  /*break*/
84921
- , 26];
85033
+ , 30];
84922
85034
  return [4
84923
85035
  /*yield*/
84924
85036
  , _c.call(records_2)];
84925
85037
 
84926
- case 25:
85038
+ case 29:
84927
85039
  _e.sent();
84928
85040
 
84929
- _e.label = 26;
85041
+ _e.label = 30;
84930
85042
 
84931
- case 26:
85043
+ case 30:
84932
85044
  return [3
84933
85045
  /*break*/
84934
- , 28];
85046
+ , 32];
84935
85047
 
84936
- case 27:
85048
+ case 31:
84937
85049
  if (e_4) throw e_4.error;
84938
85050
  return [7
84939
85051
  /*endfinally*/
84940
85052
  ];
84941
85053
 
84942
- case 28:
85054
+ case 32:
84943
85055
  return [7
84944
85056
  /*endfinally*/
84945
85057
  ];
84946
85058
 
84947
- case 29:
85059
+ case 33:
84948
85060
  return [3
84949
85061
  /*break*/
84950
- , 32];
85062
+ , 36];
84951
85063
 
84952
- case 30:
85064
+ case 34:
84953
85065
  // TODO: Lazy loading
84954
85066
  return [3
84955
85067
  /*break*/
84956
- , 32];
85068
+ , 36];
84957
85069
 
84958
- case 31:
85070
+ case 35:
84959
85071
  Object(_util__WEBPACK_IMPORTED_MODULE_4__["exhaustiveCheck"])(relationType);
84960
85072
  return [3
84961
85073
  /*break*/
84962
- , 32];
85074
+ , 36];
84963
85075
 
84964
- case 32:
85076
+ case 36:
84965
85077
  return [3
84966
85078
  /*break*/
84967
85079
  , 2];
84968
85080
 
84969
- case 33:
85081
+ case 37:
84970
85082
  return [3
84971
85083
  /*break*/
84972
- , 40];
85084
+ , 44];
84973
85085
 
84974
- case 34:
85086
+ case 38:
84975
85087
  e_2_1 = _e.sent();
84976
85088
  e_2 = {
84977
85089
  error: e_2_1
84978
85090
  };
84979
85091
  return [3
84980
85092
  /*break*/
84981
- , 40];
85093
+ , 44];
84982
85094
 
84983
- case 35:
84984
- _e.trys.push([35,, 38, 39]);
85095
+ case 39:
85096
+ _e.trys.push([39,, 42, 43]);
84985
85097
 
84986
85098
  if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1["return"]))) return [3
84987
85099
  /*break*/
84988
- , 37];
85100
+ , 41];
84989
85101
  return [4
84990
85102
  /*yield*/
84991
85103
  , _a.call(relations_1)];
84992
85104
 
84993
- case 36:
85105
+ case 40:
84994
85106
  _e.sent();
84995
85107
 
84996
- _e.label = 37;
85108
+ _e.label = 41;
84997
85109
 
84998
- case 37:
85110
+ case 41:
84999
85111
  return [3
85000
85112
  /*break*/
85001
- , 39];
85113
+ , 43];
85002
85114
 
85003
- case 38:
85115
+ case 42:
85004
85116
  if (e_2) throw e_2.error;
85005
85117
  return [7
85006
85118
  /*endfinally*/
85007
85119
  ];
85008
85120
 
85009
- case 39:
85121
+ case 43:
85010
85122
  return [7
85011
85123
  /*endfinally*/
85012
85124
  ];
85013
85125
 
85014
- case 40:
85126
+ case 44:
85015
85127
  return [2
85016
85128
  /*return*/
85017
85129
  , records.map(function (record) {
@@ -85603,14 +85715,14 @@ function () {
85603
85715
  var e_8, _a, e_9, _b, e_10, _c;
85604
85716
 
85605
85717
  return __awaiter(this, void 0, void 0, function () {
85606
- var rel, relationType, modelName, targetName, targetNames, associatedWith, storeName, index, _d, model, hasOneIndex, hasOneCustomField, keyValuesPath, value, allRecords, recordToDelete, e_9_1, model, keyValuesPath, allRecords, childrenArray, e_10_1, e_8_1;
85718
+ var rel, relationType, modelName, targetName, targetNames, associatedWith, storeName, index, _d, model, hasOneIndex_1, hasConnectedModelFields, keyValuesPath, values_1, allRecords, recordToDelete, hasOneIndex_2, hasOneCustomField, keyValuesPath, value_1, allRecords, recordToDelete, e_9_1, model, keyValues, allRecords, indices, childrenArray, e_10_1, e_8_1;
85607
85719
 
85608
85720
  var _this = this;
85609
85721
 
85610
85722
  return __generator(this, function (_e) {
85611
85723
  switch (_e.label) {
85612
85724
  case 0:
85613
- _e.trys.push([0, 35, 36, 41]);
85725
+ _e.trys.push([0, 38, 39, 44]);
85614
85726
 
85615
85727
  relations_2 = __asyncValues(relations);
85616
85728
  _e.label = 1;
@@ -85623,7 +85735,7 @@ function () {
85623
85735
  case 2:
85624
85736
  if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3
85625
85737
  /*break*/
85626
- , 34];
85738
+ , 37];
85627
85739
  rel = relations_2_1.value;
85628
85740
  relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
85629
85741
  storeName = this.getStorename(nameSpace, modelName);
@@ -85642,20 +85754,20 @@ function () {
85642
85754
  case 'HAS_MANY':
85643
85755
  return [3
85644
85756
  /*break*/
85645
- , 17];
85757
+ , 20];
85646
85758
 
85647
85759
  case 'BELONGS_TO':
85648
85760
  return [3
85649
85761
  /*break*/
85650
- , 31];
85762
+ , 34];
85651
85763
  }
85652
85764
 
85653
85765
  return [3
85654
85766
  /*break*/
85655
- , 32];
85767
+ , 35];
85656
85768
 
85657
85769
  case 3:
85658
- _e.trys.push([3, 10, 11, 16]);
85770
+ _e.trys.push([3, 13, 14, 19]);
85659
85771
 
85660
85772
  models_1 = __asyncValues(models);
85661
85773
  _e.label = 4;
@@ -85668,24 +85780,55 @@ function () {
85668
85780
  case 5:
85669
85781
  if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3
85670
85782
  /*break*/
85671
- , 9];
85783
+ , 12];
85672
85784
  model = models_1_1.value;
85673
- hasOneIndex = index || associatedWith;
85674
- hasOneCustomField = targetName in model;
85785
+ if (!(targetNames && (targetNames === null || targetNames === void 0 ? void 0 : targetNames.length))) return [3
85786
+ /*break*/
85787
+ , 8];
85788
+ hasOneIndex_1 = index || associatedWith;
85789
+ hasConnectedModelFields = targetNames.every(function (targetName) {
85790
+ return model.hasOwnProperty(targetName);
85791
+ });
85675
85792
  keyValuesPath = this.getIndexKeyValuesPath(model);
85676
- value = hasOneCustomField ? model[targetName] : keyValuesPath;
85677
- if (!value) return [3
85793
+
85794
+ if (hasConnectedModelFields) {
85795
+ // Values will be that of the child model
85796
+ values_1 = targetNames.map(function (targetName) {
85797
+ return model[targetName];
85798
+ });
85799
+ } else {
85800
+ // values will be that of the parent model
85801
+ values_1 = keyValuesPath;
85802
+ }
85803
+
85804
+ if (values_1.length === 0) return [3
85678
85805
  /*break*/
85679
- , 9];
85806
+ , 12];
85680
85807
  return [4
85681
85808
  /*yield*/
85682
85809
  , this.db.getAll(storeName)];
85683
85810
 
85684
85811
  case 6:
85685
85812
  allRecords = _e.sent();
85686
- recordToDelete = allRecords.filter(function (childItem) {
85687
- return childItem[hasOneIndex] === value;
85688
- });
85813
+ recordToDelete = void 0; // values === targetNames
85814
+
85815
+ if (hasConnectedModelFields) {
85816
+ /**
85817
+ * Retrieve record by finding the record where all
85818
+ * targetNames are present on the connected model
85819
+ */
85820
+ recordToDelete = allRecords.filter(function (childItem) {
85821
+ return values_1.every(function (value) {
85822
+ return childItem[value] != null;
85823
+ });
85824
+ });
85825
+ } else {
85826
+ // values === keyValuePath
85827
+ recordToDelete = allRecords.filter(function (childItem) {
85828
+ return childItem[hasOneIndex_1] === values_1;
85829
+ });
85830
+ }
85831
+
85689
85832
  return [4
85690
85833
  /*yield*/
85691
85834
  , this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName].relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
@@ -85693,216 +85836,247 @@ function () {
85693
85836
  case 7:
85694
85837
  _e.sent();
85695
85838
 
85696
- _e.label = 8;
85839
+ return [3
85840
+ /*break*/
85841
+ , 11];
85697
85842
 
85698
85843
  case 8:
85844
+ hasOneIndex_2 = index || associatedWith;
85845
+ hasOneCustomField = targetName in model;
85846
+ keyValuesPath = this.getIndexKeyValuesPath(model);
85847
+ value_1 = hasOneCustomField ? model[targetName] : keyValuesPath;
85848
+ if (!value_1) return [3
85849
+ /*break*/
85850
+ , 12];
85851
+ return [4
85852
+ /*yield*/
85853
+ , this.db.getAll(storeName)];
85854
+
85855
+ case 9:
85856
+ allRecords = _e.sent();
85857
+ recordToDelete = allRecords.filter(function (childItem) {
85858
+ return childItem[hasOneIndex_2] === value_1;
85859
+ });
85860
+ return [4
85861
+ /*yield*/
85862
+ , this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName].relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
85863
+
85864
+ case 10:
85865
+ _e.sent();
85866
+
85867
+ _e.label = 11;
85868
+
85869
+ case 11:
85699
85870
  return [3
85700
85871
  /*break*/
85701
85872
  , 4];
85702
85873
 
85703
- case 9:
85874
+ case 12:
85704
85875
  return [3
85705
85876
  /*break*/
85706
- , 16];
85877
+ , 19];
85707
85878
 
85708
- case 10:
85879
+ case 13:
85709
85880
  e_9_1 = _e.sent();
85710
85881
  e_9 = {
85711
85882
  error: e_9_1
85712
85883
  };
85713
85884
  return [3
85714
85885
  /*break*/
85715
- , 16];
85886
+ , 19];
85716
85887
 
85717
- case 11:
85718
- _e.trys.push([11,, 14, 15]);
85888
+ case 14:
85889
+ _e.trys.push([14,, 17, 18]);
85719
85890
 
85720
85891
  if (!(models_1_1 && !models_1_1.done && (_b = models_1["return"]))) return [3
85721
85892
  /*break*/
85722
- , 13];
85893
+ , 16];
85723
85894
  return [4
85724
85895
  /*yield*/
85725
85896
  , _b.call(models_1)];
85726
85897
 
85727
- case 12:
85898
+ case 15:
85728
85899
  _e.sent();
85729
85900
 
85730
- _e.label = 13;
85901
+ _e.label = 16;
85731
85902
 
85732
- case 13:
85903
+ case 16:
85733
85904
  return [3
85734
85905
  /*break*/
85735
- , 15];
85906
+ , 18];
85736
85907
 
85737
- case 14:
85908
+ case 17:
85738
85909
  if (e_9) throw e_9.error;
85739
85910
  return [7
85740
85911
  /*endfinally*/
85741
85912
  ];
85742
85913
 
85743
- case 15:
85914
+ case 18:
85744
85915
  return [7
85745
85916
  /*endfinally*/
85746
85917
  ];
85747
85918
 
85748
- case 16:
85919
+ case 19:
85749
85920
  return [3
85750
85921
  /*break*/
85751
- , 33];
85922
+ , 36];
85752
85923
 
85753
- case 17:
85754
- _e.trys.push([17, 24, 25, 30]);
85924
+ case 20:
85925
+ _e.trys.push([20, 27, 28, 33]);
85755
85926
 
85756
85927
  models_2 = __asyncValues(models);
85757
- _e.label = 18;
85928
+ _e.label = 21;
85758
85929
 
85759
- case 18:
85930
+ case 21:
85760
85931
  return [4
85761
85932
  /*yield*/
85762
85933
  , models_2.next()];
85763
85934
 
85764
- case 19:
85935
+ case 22:
85765
85936
  if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3
85766
85937
  /*break*/
85767
- , 23];
85938
+ , 26];
85768
85939
  model = models_2_1.value;
85769
- keyValuesPath = this.getIndexKeyValuesPath(model);
85940
+ keyValues = this.getIndexKeyValues(model);
85770
85941
  return [4
85771
85942
  /*yield*/
85772
85943
  , this.db.getAll(storeName)];
85773
85944
 
85774
- case 20:
85945
+ case 23:
85775
85946
  allRecords = _e.sent();
85947
+ indices = index.split('-');
85776
85948
  childrenArray = allRecords.filter(function (childItem) {
85777
- return childItem[index] === keyValuesPath;
85949
+ return indices.every(function (index) {
85950
+ return keyValues.includes(childItem[index]);
85951
+ });
85778
85952
  });
85779
85953
  return [4
85780
85954
  /*yield*/
85781
85955
  , this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName].relationTypes, childrenArray, modelName, nameSpace, deleteQueue)];
85782
85956
 
85783
- case 21:
85957
+ case 24:
85784
85958
  _e.sent();
85785
85959
 
85786
- _e.label = 22;
85960
+ _e.label = 25;
85787
85961
 
85788
- case 22:
85962
+ case 25:
85789
85963
  return [3
85790
85964
  /*break*/
85791
- , 18];
85965
+ , 21];
85792
85966
 
85793
- case 23:
85967
+ case 26:
85794
85968
  return [3
85795
85969
  /*break*/
85796
- , 30];
85970
+ , 33];
85797
85971
 
85798
- case 24:
85972
+ case 27:
85799
85973
  e_10_1 = _e.sent();
85800
85974
  e_10 = {
85801
85975
  error: e_10_1
85802
85976
  };
85803
85977
  return [3
85804
85978
  /*break*/
85805
- , 30];
85979
+ , 33];
85806
85980
 
85807
- case 25:
85808
- _e.trys.push([25,, 28, 29]);
85981
+ case 28:
85982
+ _e.trys.push([28,, 31, 32]);
85809
85983
 
85810
85984
  if (!(models_2_1 && !models_2_1.done && (_c = models_2["return"]))) return [3
85811
85985
  /*break*/
85812
- , 27];
85986
+ , 30];
85813
85987
  return [4
85814
85988
  /*yield*/
85815
85989
  , _c.call(models_2)];
85816
85990
 
85817
- case 26:
85991
+ case 29:
85818
85992
  _e.sent();
85819
85993
 
85820
- _e.label = 27;
85994
+ _e.label = 30;
85821
85995
 
85822
- case 27:
85996
+ case 30:
85823
85997
  return [3
85824
85998
  /*break*/
85825
- , 29];
85999
+ , 32];
85826
86000
 
85827
- case 28:
86001
+ case 31:
85828
86002
  if (e_10) throw e_10.error;
85829
86003
  return [7
85830
86004
  /*endfinally*/
85831
86005
  ];
85832
86006
 
85833
- case 29:
86007
+ case 32:
85834
86008
  return [7
85835
86009
  /*endfinally*/
85836
86010
  ];
85837
86011
 
85838
- case 30:
86012
+ case 33:
85839
86013
  return [3
85840
86014
  /*break*/
85841
- , 33];
86015
+ , 36];
85842
86016
 
85843
- case 31:
86017
+ case 34:
85844
86018
  // Intentionally blank
85845
86019
  return [3
85846
86020
  /*break*/
85847
- , 33];
86021
+ , 36];
85848
86022
 
85849
- case 32:
86023
+ case 35:
85850
86024
  Object(_util__WEBPACK_IMPORTED_MODULE_4__["exhaustiveCheck"])(relationType);
85851
86025
  return [3
85852
86026
  /*break*/
85853
- , 33];
86027
+ , 36];
85854
86028
 
85855
- case 33:
86029
+ case 36:
85856
86030
  return [3
85857
86031
  /*break*/
85858
86032
  , 1];
85859
86033
 
85860
- case 34:
86034
+ case 37:
85861
86035
  return [3
85862
86036
  /*break*/
85863
- , 41];
86037
+ , 44];
85864
86038
 
85865
- case 35:
86039
+ case 38:
85866
86040
  e_8_1 = _e.sent();
85867
86041
  e_8 = {
85868
86042
  error: e_8_1
85869
86043
  };
85870
86044
  return [3
85871
86045
  /*break*/
85872
- , 41];
86046
+ , 44];
85873
86047
 
85874
- case 36:
85875
- _e.trys.push([36,, 39, 40]);
86048
+ case 39:
86049
+ _e.trys.push([39,, 42, 43]);
85876
86050
 
85877
86051
  if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2["return"]))) return [3
85878
86052
  /*break*/
85879
- , 38];
86053
+ , 41];
85880
86054
  return [4
85881
86055
  /*yield*/
85882
86056
  , _a.call(relations_2)];
85883
86057
 
85884
- case 37:
86058
+ case 40:
85885
86059
  _e.sent();
85886
86060
 
85887
- _e.label = 38;
86061
+ _e.label = 41;
85888
86062
 
85889
- case 38:
86063
+ case 41:
85890
86064
  return [3
85891
86065
  /*break*/
85892
- , 40];
86066
+ , 43];
85893
86067
 
85894
- case 39:
86068
+ case 42:
85895
86069
  if (e_8) throw e_8.error;
85896
86070
  return [7
85897
86071
  /*endfinally*/
85898
86072
  ];
85899
86073
 
85900
- case 40:
86074
+ case 43:
85901
86075
  return [7
85902
86076
  /*endfinally*/
85903
86077
  ];
85904
86078
 
85905
- case 41:
86079
+ case 44:
85906
86080
  deleteQueue.push({
85907
86081
  storeName: this.getStorename(nameSpace, srcModel),
85908
86082
  items: models.map(function (record) {
@@ -86392,11 +86566,12 @@ function () {
86392
86566
 
86393
86567
  AsyncStorageDatabase.prototype.save = function (item, storeName, keys, keyValuesPath) {
86394
86568
  return __awaiter(this, void 0, void 0, function () {
86395
- var ulid, itemKey;
86569
+ var idxName, ulid, itemKey;
86396
86570
  return __generator(this, function (_a) {
86397
86571
  switch (_a.label) {
86398
86572
  case 0:
86399
- ulid = this.getCollectionIndex(storeName).get(keys[0]) || this.getMonotonicFactory(storeName)();
86573
+ idxName = Object(_util__WEBPACK_IMPORTED_MODULE_1__["indexNameFromKeys"])(keys);
86574
+ ulid = this.getCollectionIndex(storeName).get(idxName) || this.getMonotonicFactory(storeName)();
86400
86575
  itemKey = this.getKeyForItem(storeName, keyValuesPath, ulid); // Set key in collection index
86401
86576
 
86402
86577
  this.getCollectionIndex(storeName).set(keyValuesPath, ulid); // Save item in db
@@ -87463,9 +87638,10 @@ function () {
87463
87638
  };
87464
87639
 
87465
87640
  IndexedDBAdapter.prototype.getIndexKeyPath = function (namespaceName, modelName) {
87466
- var _a, _b;
87641
+ var _a;
87467
87642
 
87468
- var keyPath = (_b = (_a = this.schema.namespaces[namespaceName]) === null || _a === void 0 ? void 0 : _a.keys[modelName]) === null || _b === void 0 ? void 0 : _b.primaryKey;
87643
+ var namespace = this.schema.namespaces[namespaceName];
87644
+ var keyPath = (_a = namespace === null || namespace === void 0 ? void 0 : namespace.keys[modelName]) === null || _a === void 0 ? void 0 : _a.primaryKey;
87469
87645
 
87470
87646
  if (keyPath) {
87471
87647
  return keyPath;
@@ -89108,7 +89284,7 @@ function () {
89108
89284
  var e_10, _a, e_11, _b, e_12, _c;
89109
89285
 
89110
89286
  return __awaiter(this, void 0, void 0, function () {
89111
- var rel, relationType, fieldName, modelName, targetName, targetNames, storeName, index, _d, model, hasOneIndex, hasConnectedModelFields, keyValues, values, recordToDelete, hasOneIndex_1, hasOneCustomField, keyValues, value, recordToDelete, e_11_1, model, keyValues, hasManyIndex, childrenArray, e_12_1, e_10_1;
89287
+ var rel, relationType, fieldName, modelName, targetName, targetNames, storeName, index, _d, model, hasOneIndex, hasConnectedModelFields, keyValues, values, recordToDelete, hasOneIndex_1, hasOneCustomField, keyValues, value, recordToDelete, e_11_1, model, keyValues, childrenArray, e_12_1, e_10_1;
89112
89288
 
89113
89289
  var _this = this;
89114
89290
 
@@ -89219,13 +89395,7 @@ function () {
89219
89395
  hasOneIndex_1 = index || 'byPk';
89220
89396
  hasOneCustomField = targetName in model;
89221
89397
  keyValues = this.getIndexKeyValues(model);
89222
- value = hasOneCustomField ? model[targetName] : keyValues[0];
89223
-
89224
- if (hasOneIndex_1 === 'byPk') {
89225
- // byPk requires an array keyValue
89226
- value = [value];
89227
- }
89228
-
89398
+ value = hasOneCustomField ? [model[targetName]] : keyValues;
89229
89399
  if (!value) return [3
89230
89400
  /*break*/
89231
89401
  , 12];
@@ -89316,20 +89486,17 @@ function () {
89316
89486
  , 26];
89317
89487
  model = models_2_1.value;
89318
89488
  keyValues = this.getIndexKeyValues(model);
89319
- hasManyIndex = index || 'byPk';
89320
89489
  return [4
89321
89490
  /*yield*/
89322
- , this.db.transaction(storeName, 'readwrite').objectStore(storeName).index(hasManyIndex).getAll(keyValues[0])];
89491
+ , this.db.transaction(storeName, 'readwrite').objectStore(storeName).index(index).getAll(keyValues)];
89323
89492
 
89324
89493
  case 23:
89325
- childrenArray = _e.sent(); // .getAll(keyValues); // TODO
89326
-
89494
+ childrenArray = _e.sent();
89327
89495
  return [4
89328
89496
  /*yield*/
89329
89497
  , this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName].relationTypes, childrenArray, modelName, nameSpace, deleteQueue)];
89330
89498
 
89331
89499
  case 24:
89332
- // .getAll(keyValues); // TODO
89333
89500
  _e.sent();
89334
89501
 
89335
89502
  _e.label = 25;
@@ -89660,18 +89827,19 @@ function () {
89660
89827
 
89661
89828
  IndexedDBAdapter.prototype.createObjectStoreForModel = function (db, namespaceName, storeName, modelName) {
89662
89829
  return __awaiter(this, void 0, void 0, function () {
89663
- var store, indexes, keyPath;
89830
+ var store, indexes;
89664
89831
  return __generator(this, function (_a) {
89665
89832
  store = db.createObjectStore(storeName, {
89666
89833
  autoIncrement: true
89667
89834
  });
89668
89835
  indexes = this.schema.namespaces[namespaceName].relationships[modelName].indexes;
89669
- indexes.forEach(function (index) {
89670
- return store.createIndex(index, index);
89671
- });
89672
- keyPath = this.getIndexKeyPath(namespaceName, modelName);
89673
- store.createIndex('byPk', keyPath, {
89674
- unique: true
89836
+ indexes.forEach(function (_a) {
89837
+ var _b = __read(_a, 3),
89838
+ idxName = _b[0],
89839
+ keyPath = _b[1],
89840
+ options = _b[2];
89841
+
89842
+ store.createIndex(idxName, keyPath, options);
89675
89843
  });
89676
89844
  return [2
89677
89845
  /*return*/
@@ -96161,11 +96329,17 @@ function getConnectionFields(modelDefinition, namespace) {
96161
96329
  var _b = __read(Object(_util__WEBPACK_IMPORTED_MODULE_4__["establishRelationAndKeys"])(namespace), 1),
96162
96330
  relations = _b[0];
96163
96331
 
96164
- var connectedModelName = modelDefinition.fields[name].type['model']; // keyFields are fields of the connected model
96332
+ var connectedModelName = modelDefinition.fields[name].type['model'];
96333
+ var byPkIndex = relations[connectedModelName].indexes.find(function (_a) {
96334
+ var _b = __read(_a, 1),
96335
+ name = _b[0];
96165
96336
 
96166
- var keyFields = relations[connectedModelName].indexes; // We rely on `_deleted` when we process the sync query (e.g. in batchSave in the adapters)
96337
+ return name === 'byPk';
96338
+ });
96339
+ var keyFields = byPkIndex && byPkIndex[1];
96340
+ var keyFieldSelectionSet = keyFields === null || keyFields === void 0 ? void 0 : keyFields.join(' '); // We rely on `_deleted` when we process the sync query (e.g. in batchSave in the adapters)
96167
96341
 
96168
- result.push(name + " { " + keyFields + " _deleted }");
96342
+ result.push(name + " { " + keyFieldSelectionSet + " _deleted }");
96169
96343
  } else {
96170
96344
  // backwards-compatability for schema generated prior to custom primary key support
96171
96345
  result.push(name + " { id _deleted }");
@@ -97094,14 +97268,16 @@ var LimitTimerRaceResolvedValues;
97094
97268
  /*!*************************!*\
97095
97269
  !*** ./lib-esm/util.js ***!
97096
97270
  \*************************/
97097
- /*! exports provided: extractKeyIfExists, extractPrimaryKeyFieldNames, extractPrimaryKeyValues, isIdManaged, isIdOptionallyManaged, NAMESPACES, USER, SYNC, STORAGE, DATASTORE, USER_AGENT_SUFFIX_DATASTORE, exhaustiveCheck, isNullOrUndefined, validatePredicate, validatePredicateField, isModelConstructor, registerNonModelClass, isNonModelConstructor, processCompositeKeys, establishRelationAndKeys, traverseModel, getIndex, getIndexFromAssociation, isPrivateMode, monotonicUlidFactory, getNow, sortCompareFunction, valuesEqual, isAWSDate, isAWSTime, isAWSDateTime, isAWSTimestamp, isAWSEmail, isAWSJSON, isAWSURL, isAWSPhone, isAWSIPAddress, DeferredPromise, DeferredCallbackResolver, mergePatches, extractTargetNamesFromSrc */
97271
+ /*! exports provided: errorMessages, extractKeyIfExists, extractPrimaryKeyFieldNames, extractPrimaryKeyValues, extractPrimaryKeysAndValues, isIdManaged, isIdOptionallyManaged, NAMESPACES, USER, SYNC, STORAGE, DATASTORE, USER_AGENT_SUFFIX_DATASTORE, exhaustiveCheck, isNullOrUndefined, validatePredicate, validatePredicateField, isModelConstructor, registerNonModelClass, isNonModelConstructor, processCompositeKeys, establishRelationAndKeys, traverseModel, getIndex, getIndexFromAssociation, isPrivateMode, monotonicUlidFactory, getNow, sortCompareFunction, valuesEqual, isAWSDate, isAWSTime, isAWSDateTime, isAWSTimestamp, isAWSEmail, isAWSJSON, isAWSURL, isAWSPhone, isAWSIPAddress, DeferredPromise, DeferredCallbackResolver, mergePatches, extractTargetNamesFromSrc, indexNameFromKeys */
97098
97272
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
97099
97273
 
97100
97274
  "use strict";
97101
97275
  __webpack_require__.r(__webpack_exports__);
97276
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "errorMessages", function() { return errorMessages; });
97102
97277
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractKeyIfExists", function() { return extractKeyIfExists; });
97103
97278
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractPrimaryKeyFieldNames", function() { return extractPrimaryKeyFieldNames; });
97104
97279
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractPrimaryKeyValues", function() { return extractPrimaryKeyValues; });
97280
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractPrimaryKeysAndValues", function() { return extractPrimaryKeysAndValues; });
97105
97281
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIdManaged", function() { return isIdManaged; });
97106
97282
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIdOptionallyManaged", function() { return isIdOptionallyManaged; });
97107
97283
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NAMESPACES", function() { return NAMESPACES; });
@@ -97140,6 +97316,7 @@ __webpack_require__.r(__webpack_exports__);
97140
97316
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DeferredCallbackResolver", function() { return DeferredCallbackResolver; });
97141
97317
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergePatches", function() { return mergePatches; });
97142
97318
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractTargetNamesFromSrc", function() { return extractTargetNamesFromSrc; });
97319
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "indexNameFromKeys", function() { return indexNameFromKeys; });
97143
97320
  /* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! buffer */ "../../node_modules/buffer/index.js");
97144
97321
  /* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(buffer__WEBPACK_IMPORTED_MODULE_0__);
97145
97322
  /* harmony import */ var ulid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ulid */ "../../node_modules/ulid/dist/index.esm.js");
@@ -97360,6 +97537,9 @@ var __values = undefined && undefined.__values || function (o) {
97360
97537
 
97361
97538
 
97362
97539
  var ID = 'id';
97540
+ var errorMessages = {
97541
+ idEmptyString: 'An index field cannot contain an empty string value'
97542
+ };
97363
97543
  function extractKeyIfExists(modelDefinition) {
97364
97544
  var _c;
97365
97545
 
@@ -97379,6 +97559,13 @@ function extractPrimaryKeyValues(model, keyFields) {
97379
97559
  return keyFields.map(function (key) {
97380
97560
  return model[key];
97381
97561
  });
97562
+ }
97563
+ function extractPrimaryKeysAndValues(model, keyFields) {
97564
+ var primaryKeysAndValues = {};
97565
+ keyFields.forEach(function (key) {
97566
+ return primaryKeysAndValues[key] = model[key];
97567
+ });
97568
+ return primaryKeysAndValues;
97382
97569
  } // IdentifierFields<ManagedIdentifier>
97383
97570
  // Default behavior without explicit @primaryKey defined
97384
97571
 
@@ -97616,7 +97803,7 @@ var establishRelationAndKeys = function establishRelationAndKeys(namespace) {
97616
97803
  var relationship = {};
97617
97804
  var keys = {};
97618
97805
  Object.keys(namespace.models).forEach(function (mKey) {
97619
- var e_1, _c, e_2, _d;
97806
+ var e_1, _c;
97620
97807
 
97621
97808
  relationship[mKey] = {
97622
97809
  indexes: [],
@@ -97639,20 +97826,11 @@ var establishRelationAndKeys = function establishRelationAndKeys(namespace) {
97639
97826
  });
97640
97827
 
97641
97828
  if (connectionType === 'BELONGS_TO') {
97642
- // const targetNames: string[] = extractTargetNamesFromSrc(
97643
- // fieldAttribute.association
97644
- // );
97645
- // targetNames.forEach((targetName: string) => {
97646
- // relationship[mKey].indexes.push(targetName);
97647
- // });
97648
- if (fieldAttribute.association.targetName) {
97649
- // backwards-compatability for schema generated prior to custom primary key support
97650
- relationship[mKey].indexes.push(fieldAttribute.association['targetName']);
97651
- } else {
97652
- // iterate through fieldAttribute.association.targetNames, and push to relationship[mKey].indexes
97653
- fieldAttribute.association.targetNames.forEach(function (targetName) {
97654
- relationship[mKey].indexes.push(targetName);
97655
- });
97829
+ var targetNames = extractTargetNamesFromSrc(fieldAttribute.association);
97830
+
97831
+ if (targetNames) {
97832
+ var idxName = indexNameFromKeys(targetNames);
97833
+ relationship[mKey].indexes.push([idxName, targetNames]);
97656
97834
  }
97657
97835
  }
97658
97836
  }
@@ -97661,41 +97839,37 @@ var establishRelationAndKeys = function establishRelationAndKeys(namespace) {
97661
97839
  if (model.attributes) {
97662
97840
  keys[mKey].compositeKeys = processCompositeKeys(model.attributes);
97663
97841
 
97664
- try {
97665
- for (var _e = __values(model.attributes), _f = _e.next(); !_f.done; _f = _e.next()) {
97666
- var attribute = _f.value;
97842
+ var _loop_1 = function _loop_1(attribute) {
97843
+ if (!Object(_types__WEBPACK_IMPORTED_MODULE_4__["isModelAttributeKey"])(attribute)) {
97844
+ return "continue";
97845
+ }
97667
97846
 
97668
- if (!Object(_types__WEBPACK_IMPORTED_MODULE_4__["isModelAttributeKey"])(attribute)) {
97669
- continue;
97670
- }
97847
+ var fields = attribute.properties.fields;
97671
97848
 
97672
- if (Object(_types__WEBPACK_IMPORTED_MODULE_4__["isModelAttributePrimaryKey"])(attribute)) {
97673
- keys[mKey].primaryKey = attribute.properties.fields;
97674
- }
97849
+ if (Object(_types__WEBPACK_IMPORTED_MODULE_4__["isModelAttributePrimaryKey"])(attribute)) {
97850
+ keys[mKey].primaryKey = fields;
97851
+ return "continue";
97852
+ } // create indexes for all other keys
97675
97853
 
97676
- var fields = attribute.properties.fields;
97677
97854
 
97678
- try {
97679
- for (var fields_1 = (e_2 = void 0, __values(fields)), fields_1_1 = fields_1.next(); !fields_1_1.done; fields_1_1 = fields_1.next()) {
97680
- var field = fields_1_1.value; // only add index if it hasn't already been added
97855
+ var idxName = indexNameFromKeys(fields);
97856
+ var idxExists = relationship[mKey].indexes.find(function (_c) {
97857
+ var _d = __read(_c, 1),
97858
+ index = _d[0];
97681
97859
 
97682
- var exists = relationship[mKey].indexes.includes(field);
97860
+ return index === idxName;
97861
+ });
97683
97862
 
97684
- if (!exists) {
97685
- relationship[mKey].indexes.push(field);
97686
- }
97687
- }
97688
- } catch (e_2_1) {
97689
- e_2 = {
97690
- error: e_2_1
97691
- };
97692
- } finally {
97693
- try {
97694
- if (fields_1_1 && !fields_1_1.done && (_d = fields_1["return"])) _d.call(fields_1);
97695
- } finally {
97696
- if (e_2) throw e_2.error;
97697
- }
97698
- }
97863
+ if (!idxExists) {
97864
+ relationship[mKey].indexes.push([idxName, fields]);
97865
+ }
97866
+ };
97867
+
97868
+ try {
97869
+ for (var _d = __values(model.attributes), _e = _d.next(); !_e.done; _e = _d.next()) {
97870
+ var attribute = _e.value;
97871
+
97872
+ _loop_1(attribute);
97699
97873
  }
97700
97874
  } catch (e_1_1) {
97701
97875
  e_1 = {
@@ -97703,16 +97877,22 @@ var establishRelationAndKeys = function establishRelationAndKeys(namespace) {
97703
97877
  };
97704
97878
  } finally {
97705
97879
  try {
97706
- if (_f && !_f.done && (_c = _e["return"])) _c.call(_e);
97880
+ if (_e && !_e.done && (_c = _d["return"])) _c.call(_d);
97707
97881
  } finally {
97708
97882
  if (e_1) throw e_1.error;
97709
97883
  }
97710
97884
  }
97885
+ } // set 'id' as the PK for models without a custom PK explicitly defined
97711
97886
 
97712
- if (!keys[mKey].primaryKey) {
97713
- keys[mKey].primaryKey = [ID];
97714
- }
97715
- }
97887
+
97888
+ if (!keys[mKey].primaryKey) {
97889
+ keys[mKey].primaryKey = [ID];
97890
+ } // create primary index
97891
+
97892
+
97893
+ relationship[mKey].indexes.push(['byPk', keys[mKey].primaryKey, {
97894
+ unique: true
97895
+ }]);
97716
97896
  });
97717
97897
  return [relationship, keys];
97718
97898
  };
@@ -97852,10 +98032,21 @@ var getIndex = function getIndex(rel, src) {
97852
98032
  return index;
97853
98033
  };
97854
98034
  var getIndexFromAssociation = function getIndexFromAssociation(indexes, src) {
97855
- var index = indexes.find(function (idx) {
97856
- return idx === src;
98035
+ var indexName;
98036
+
98037
+ if (Array.isArray(src)) {
98038
+ indexName = indexNameFromKeys(src);
98039
+ } else {
98040
+ indexName = src;
98041
+ }
98042
+
98043
+ var associationIndex = indexes.find(function (_c) {
98044
+ var _d = __read(_c, 1),
98045
+ idxName = _d[0];
98046
+
98047
+ return idxName === indexName;
97857
98048
  });
97858
- return index;
98049
+ return associationIndex && associationIndex[0];
97859
98050
  };
97860
98051
  var privateModeCheckResult;
97861
98052
  var isPrivateMode = function isPrivateMode() {
@@ -97953,7 +98144,7 @@ function getNow() {
97953
98144
  }
97954
98145
  function sortCompareFunction(sortPredicates) {
97955
98146
  return function compareFunction(a, b) {
97956
- var e_3, _c;
98147
+ var e_2, _c;
97957
98148
 
97958
98149
  try {
97959
98150
  // enable multi-field sort by iterating over predicates until
@@ -97973,15 +98164,15 @@ function sortCompareFunction(sortPredicates) {
97973
98164
  return 1 * sortMultiplier;
97974
98165
  }
97975
98166
  }
97976
- } catch (e_3_1) {
97977
- e_3 = {
97978
- error: e_3_1
98167
+ } catch (e_2_1) {
98168
+ e_2 = {
98169
+ error: e_2_1
97979
98170
  };
97980
98171
  } finally {
97981
98172
  try {
97982
98173
  if (sortPredicates_1_1 && !sortPredicates_1_1.done && (_c = sortPredicates_1["return"])) _c.call(sortPredicates_1);
97983
98174
  } finally {
97984
- if (e_3) throw e_3.error;
98175
+ if (e_2) throw e_2.error;
97985
98176
  }
97986
98177
  }
97987
98178
 
@@ -97994,7 +98185,7 @@ function sortCompareFunction(sortPredicates) {
97994
98185
  // to normalize for GQL response values for undefined fields
97995
98186
 
97996
98187
  function valuesEqual(valA, valB, nullish) {
97997
- var e_4, _c;
98188
+ var e_3, _c;
97998
98189
 
97999
98190
  if (nullish === void 0) {
98000
98191
  nullish = false;
@@ -98058,15 +98249,15 @@ function valuesEqual(valA, valB, nullish) {
98058
98249
  return false;
98059
98250
  }
98060
98251
  }
98061
- } catch (e_4_1) {
98062
- e_4 = {
98063
- error: e_4_1
98252
+ } catch (e_3_1) {
98253
+ e_3 = {
98254
+ error: e_3_1
98064
98255
  };
98065
98256
  } finally {
98066
98257
  try {
98067
98258
  if (keys_1_1 && !keys_1_1.done && (_c = keys_1["return"])) _c.call(keys_1);
98068
98259
  } finally {
98069
- if (e_4) throw e_4.error;
98260
+ if (e_3) throw e_3.error;
98070
98261
  }
98071
98262
  }
98072
98263
 
@@ -98262,6 +98453,17 @@ function extractTargetNamesFromSrc(src) {
98262
98453
  } else {
98263
98454
  return undefined;
98264
98455
  }
98456
+ } // Generates snake-cased index name from an aray of key field names
98457
+ // E.g. for keys `[id, title]` => 'id-title'
98458
+
98459
+ function indexNameFromKeys(keys) {
98460
+ return keys.reduce(function (prev, cur, idx) {
98461
+ if (idx === 0) {
98462
+ return cur;
98463
+ }
98464
+
98465
+ return prev + "-" + cur;
98466
+ }, '');
98265
98467
  }
98266
98468
 
98267
98469
  /***/ }),