@aws-amplify/datastore 3.14.4 → 3.14.5-unstable.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +0 -8
  2. package/lib/authModeStrategies/defaultAuthStrategy.d.ts +2 -0
  3. package/lib/authModeStrategies/index.d.ts +2 -0
  4. package/lib/authModeStrategies/multiAuthStrategy.d.ts +13 -0
  5. package/lib/authModeStrategies/multiAuthStrategy.js +6 -64
  6. package/lib/authModeStrategies/multiAuthStrategy.js.map +1 -1
  7. package/lib/datastore/datastore.d.ts +207 -0
  8. package/lib/datastore/datastore.js +703 -297
  9. package/lib/datastore/datastore.js.map +1 -1
  10. package/lib/index.d.ts +16 -0
  11. package/lib/index.js +6 -4
  12. package/lib/index.js.map +1 -1
  13. package/lib/predicates/index.d.ts +30 -0
  14. package/lib/predicates/index.js +127 -6
  15. package/lib/predicates/index.js.map +1 -1
  16. package/lib/predicates/next.d.ts +301 -0
  17. package/lib/predicates/next.js +816 -0
  18. package/lib/predicates/next.js.map +1 -0
  19. package/lib/predicates/sort.d.ts +8 -0
  20. package/lib/predicates/sort.js +10 -4
  21. package/lib/predicates/sort.js.map +1 -1
  22. package/lib/ssr/index.d.ts +3 -0
  23. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +42 -0
  24. package/lib/storage/adapter/AsyncStorageAdapter.js +141 -382
  25. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  26. package/lib/storage/adapter/AsyncStorageDatabase.d.ts +39 -0
  27. package/lib/storage/adapter/AsyncStorageDatabase.js +37 -98
  28. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  29. package/lib/storage/adapter/InMemoryStore.d.ts +11 -0
  30. package/lib/storage/adapter/InMemoryStore.js +16 -67
  31. package/lib/storage/adapter/InMemoryStore.js.map +1 -1
  32. package/lib/storage/adapter/InMemoryStore.native.d.ts +1 -0
  33. package/lib/storage/adapter/InMemoryStore.native.js +2 -4
  34. package/lib/storage/adapter/InMemoryStore.native.js.map +1 -1
  35. package/lib/storage/adapter/IndexedDBAdapter.d.ts +61 -0
  36. package/lib/storage/adapter/IndexedDBAdapter.js +275 -419
  37. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  38. package/lib/storage/adapter/getDefaultAdapter/index.d.ts +3 -0
  39. package/lib/storage/adapter/getDefaultAdapter/index.js +3 -5
  40. package/lib/storage/adapter/getDefaultAdapter/index.js.map +1 -1
  41. package/lib/storage/adapter/getDefaultAdapter/index.native.d.ts +3 -0
  42. package/lib/storage/adapter/getDefaultAdapter/index.native.js +2 -4
  43. package/lib/storage/adapter/getDefaultAdapter/index.native.js.map +1 -1
  44. package/lib/storage/adapter/index.d.ts +9 -0
  45. package/lib/storage/relationship.d.ts +140 -0
  46. package/lib/storage/relationship.js +335 -0
  47. package/lib/storage/relationship.js.map +1 -0
  48. package/lib/storage/storage.d.ts +50 -0
  49. package/lib/storage/storage.js +72 -143
  50. package/lib/storage/storage.js.map +1 -1
  51. package/lib/sync/datastoreConnectivity.d.ts +16 -0
  52. package/lib/sync/datastoreConnectivity.js +6 -55
  53. package/lib/sync/datastoreConnectivity.js.map +1 -1
  54. package/lib/sync/datastoreReachability/index.d.ts +3 -0
  55. package/lib/sync/datastoreReachability/index.native.d.ts +3 -0
  56. package/lib/sync/datastoreReachability/index.native.js +2 -4
  57. package/lib/sync/datastoreReachability/index.native.js.map +1 -1
  58. package/lib/sync/index.d.ts +89 -0
  59. package/lib/sync/index.js +49 -124
  60. package/lib/sync/index.js.map +1 -1
  61. package/lib/sync/merger.d.ts +17 -0
  62. package/lib/sync/merger.js +8 -74
  63. package/lib/sync/merger.js.map +1 -1
  64. package/lib/sync/outbox.d.ts +27 -0
  65. package/lib/sync/outbox.js +24 -97
  66. package/lib/sync/outbox.js.map +1 -1
  67. package/lib/sync/processors/errorMaps.d.ts +17 -0
  68. package/lib/sync/processors/errorMaps.js +5 -35
  69. package/lib/sync/processors/errorMaps.js.map +1 -1
  70. package/lib/sync/processors/mutation.d.ts +58 -0
  71. package/lib/sync/processors/mutation.js +47 -131
  72. package/lib/sync/processors/mutation.js.map +1 -1
  73. package/lib/sync/processors/subscription.d.ts +33 -0
  74. package/lib/sync/processors/subscription.js +29 -102
  75. package/lib/sync/processors/subscription.js.map +1 -1
  76. package/lib/sync/processors/sync.d.ts +28 -0
  77. package/lib/sync/processors/sync.js +26 -102
  78. package/lib/sync/processors/sync.js.map +1 -1
  79. package/lib/sync/utils.d.ts +42 -0
  80. package/lib/sync/utils.js +40 -103
  81. package/lib/sync/utils.js.map +1 -1
  82. package/lib/types.d.ts +554 -0
  83. package/lib/types.js +9 -39
  84. package/lib/types.js.map +1 -1
  85. package/lib/util.d.ts +189 -0
  86. package/lib/util.js +192 -188
  87. package/lib/util.js.map +1 -1
  88. package/lib-esm/authModeStrategies/multiAuthStrategy.js +2 -57
  89. package/lib-esm/authModeStrategies/multiAuthStrategy.js.map +1 -1
  90. package/lib-esm/datastore/datastore.d.ts +59 -8
  91. package/lib-esm/datastore/datastore.js +642 -234
  92. package/lib-esm/datastore/datastore.js.map +1 -1
  93. package/lib-esm/index.d.ts +3 -2
  94. package/lib-esm/index.js +2 -1
  95. package/lib-esm/index.js.map +1 -1
  96. package/lib-esm/predicates/index.d.ts +16 -2
  97. package/lib-esm/predicates/index.js +128 -7
  98. package/lib-esm/predicates/index.js.map +1 -1
  99. package/lib-esm/predicates/next.d.ts +301 -0
  100. package/lib-esm/predicates/next.js +812 -0
  101. package/lib-esm/predicates/next.js.map +1 -0
  102. package/lib-esm/predicates/sort.js +10 -4
  103. package/lib-esm/predicates/sort.js.map +1 -1
  104. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +2 -1
  105. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +112 -350
  106. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  107. package/lib-esm/storage/adapter/AsyncStorageDatabase.js +7 -68
  108. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  109. package/lib-esm/storage/adapter/InMemoryStore.d.ts +1 -1
  110. package/lib-esm/storage/adapter/InMemoryStore.js +1 -52
  111. package/lib-esm/storage/adapter/InMemoryStore.js.map +1 -1
  112. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +4 -2
  113. package/lib-esm/storage/adapter/IndexedDBAdapter.js +230 -367
  114. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  115. package/lib-esm/storage/adapter/getDefaultAdapter/index.js.map +1 -1
  116. package/lib-esm/storage/relationship.d.ts +140 -0
  117. package/lib-esm/storage/relationship.js +333 -0
  118. package/lib-esm/storage/relationship.js.map +1 -0
  119. package/lib-esm/storage/storage.d.ts +7 -6
  120. package/lib-esm/storage/storage.js +33 -101
  121. package/lib-esm/storage/storage.js.map +1 -1
  122. package/lib-esm/sync/datastoreConnectivity.js +1 -47
  123. package/lib-esm/sync/datastoreConnectivity.js.map +1 -1
  124. package/lib-esm/sync/index.js +4 -76
  125. package/lib-esm/sync/index.js.map +1 -1
  126. package/lib-esm/sync/merger.js +1 -67
  127. package/lib-esm/sync/merger.js.map +1 -1
  128. package/lib-esm/sync/outbox.js +1 -74
  129. package/lib-esm/sync/outbox.js.map +1 -1
  130. package/lib-esm/sync/processors/errorMaps.js +2 -32
  131. package/lib-esm/sync/processors/errorMaps.js.map +1 -1
  132. package/lib-esm/sync/processors/mutation.js +12 -93
  133. package/lib-esm/sync/processors/mutation.js.map +1 -1
  134. package/lib-esm/sync/processors/subscription.js +6 -69
  135. package/lib-esm/sync/processors/subscription.js.map +1 -1
  136. package/lib-esm/sync/processors/sync.js +2 -75
  137. package/lib-esm/sync/processors/sync.js.map +1 -1
  138. package/lib-esm/sync/utils.d.ts +1 -1
  139. package/lib-esm/sync/utils.js +32 -95
  140. package/lib-esm/sync/utils.js.map +1 -1
  141. package/lib-esm/types.d.ts +63 -10
  142. package/lib-esm/types.js +7 -38
  143. package/lib-esm/types.js.map +1 -1
  144. package/lib-esm/util.d.ts +39 -6
  145. package/lib-esm/util.js +171 -171
  146. package/lib-esm/util.js.map +1 -1
  147. package/package.json +21 -14
  148. package/src/authModeStrategies/multiAuthStrategy.ts +2 -2
  149. package/src/datastore/datastore.ts +699 -206
  150. package/src/index.ts +4 -0
  151. package/src/predicates/index.ts +143 -17
  152. package/src/predicates/next.ts +967 -0
  153. package/src/predicates/sort.ts +8 -2
  154. package/src/storage/adapter/AsyncStorageAdapter.ts +59 -181
  155. package/src/storage/adapter/AsyncStorageDatabase.ts +16 -15
  156. package/src/storage/adapter/InMemoryStore.ts +5 -2
  157. package/src/storage/adapter/IndexedDBAdapter.ts +169 -192
  158. package/src/storage/adapter/getDefaultAdapter/index.ts +2 -2
  159. package/src/storage/relationship.ts +272 -0
  160. package/src/storage/storage.ts +56 -37
  161. package/src/sync/datastoreConnectivity.ts +4 -4
  162. package/src/sync/index.ts +22 -28
  163. package/src/sync/merger.ts +1 -1
  164. package/src/sync/outbox.ts +6 -6
  165. package/src/sync/processors/errorMaps.ts +1 -1
  166. package/src/sync/processors/mutation.ts +23 -19
  167. package/src/sync/processors/subscription.ts +20 -16
  168. package/src/sync/processors/sync.ts +17 -17
  169. package/src/sync/utils.ts +42 -48
  170. package/src/types.ts +128 -16
  171. package/src/util.ts +108 -150
  172. package/build.js +0 -5
  173. package/dist/aws-amplify-datastore.js +0 -92787
  174. package/dist/aws-amplify-datastore.js.map +0 -1
  175. package/dist/aws-amplify-datastore.min.js +0 -66
  176. package/dist/aws-amplify-datastore.min.js.map +0 -1
  177. package/index.js +0 -7
  178. package/webpack.config.dev.js +0 -6
@@ -1,116 +1,27 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (_) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
- var __rest = (this && this.__rest) || function (s, e) {
50
- var t = {};
51
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
52
- t[p] = s[p];
53
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
54
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
55
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
56
- t[p[i]] = s[p[i]];
57
- }
58
- return t;
59
- };
60
- var __read = (this && this.__read) || function (o, n) {
61
- var m = typeof Symbol === "function" && o[Symbol.iterator];
62
- if (!m) return o;
63
- var i = m.call(o), r, ar = [], e;
64
- try {
65
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
66
- }
67
- catch (error) { e = { error: error }; }
68
- finally {
69
- try {
70
- if (r && !r.done && (m = i["return"])) m.call(i);
71
- }
72
- finally { if (e) throw e.error; }
73
- }
74
- return ar;
75
- };
76
- var __values = (this && this.__values) || function(o) {
77
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
78
- if (m) return m.call(o);
79
- if (o && typeof o.length === "number") return {
80
- next: function () {
81
- if (o && i >= o.length) o = void 0;
82
- return { value: o && o[i++], done: !o };
83
- }
84
- };
85
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
86
- };
87
- var __spread = (this && this.__spread) || function () {
88
- for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
89
- return ar;
90
- };
91
- var __importDefault = (this && this.__importDefault) || function (mod) {
92
- return (mod && mod.__esModule) ? mod : { "default": mod };
93
- };
94
2
  Object.defineProperty(exports, "__esModule", { value: true });
95
- var api_1 = __importDefault(require("@aws-amplify/api"));
3
+ var tslib_1 = require("tslib");
4
+ var api_1 = require("@aws-amplify/api");
96
5
  var auth_1 = require("@aws-amplify/auth");
97
- var cache_1 = __importDefault(require("@aws-amplify/cache"));
6
+ var cache_1 = require("@aws-amplify/cache");
98
7
  var core_1 = require("@aws-amplify/core");
99
8
  var immer_1 = require("immer");
100
9
  var uuid_1 = require("uuid");
101
- var zen_observable_ts_1 = __importDefault(require("zen-observable-ts"));
10
+ var zen_observable_ts_1 = tslib_1.__importDefault(require("zen-observable-ts"));
102
11
  var authModeStrategies_1 = require("../authModeStrategies");
103
12
  var predicates_1 = require("../predicates");
104
13
  var storage_1 = require("../storage/storage");
14
+ var relationship_1 = require("../storage/relationship");
105
15
  var sync_1 = require("../sync");
106
16
  var types_1 = require("../types");
107
17
  var util_1 = require("../util");
18
+ var next_1 = require("../predicates/next");
108
19
  var utils_1 = require("../sync/utils");
109
20
  immer_1.setAutoFreeze(true);
110
21
  immer_1.enablePatches();
111
22
  var logger = new core_1.ConsoleLogger('DataStore');
112
23
  var ulid = util_1.monotonicUlidFactory(Date.now());
113
- var isNode = core_1.JS.browserOrNode().isNode;
24
+ var isNode = core_1.browserOrNode().isNode;
114
25
  var SETTING_SCHEMA_VERSION = 'schemaVersion';
115
26
  var schema;
116
27
  var modelNamespaceMap = new WeakMap();
@@ -119,18 +30,156 @@ var modelNamespaceMap = new WeakMap();
119
30
  // PersistentModel - the source model, used for diffing object-type fields
120
31
  var modelPatchesMap = new WeakMap();
121
32
  var getModelDefinition = function (modelConstructor) {
33
+ var e_1, _a, e_2, _b;
122
34
  var namespace = modelNamespaceMap.get(modelConstructor);
123
- return schema.namespaces[namespace].models[modelConstructor.name];
35
+ var definition = namespace
36
+ ? schema.namespaces[namespace].models[modelConstructor.name]
37
+ : undefined;
38
+ // compatibility with legacy/pre-PK codegen for lazy loading to inject
39
+ // index fields into the model definition.
40
+ if (definition) {
41
+ var indexes = schema.namespaces[namespace].relationships[modelConstructor.name]
42
+ .indexes;
43
+ var indexFields = new Set();
44
+ try {
45
+ for (var indexes_1 = tslib_1.__values(indexes), indexes_1_1 = indexes_1.next(); !indexes_1_1.done; indexes_1_1 = indexes_1.next()) {
46
+ var index = indexes_1_1.value;
47
+ try {
48
+ for (var _c = (e_2 = void 0, tslib_1.__values(index[1])), _d = _c.next(); !_d.done; _d = _c.next()) {
49
+ var indexField = _d.value;
50
+ indexFields.add(indexField);
51
+ }
52
+ }
53
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
54
+ finally {
55
+ try {
56
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
57
+ }
58
+ finally { if (e_2) throw e_2.error; }
59
+ }
60
+ }
61
+ }
62
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
63
+ finally {
64
+ try {
65
+ if (indexes_1_1 && !indexes_1_1.done && (_a = indexes_1.return)) _a.call(indexes_1);
66
+ }
67
+ finally { if (e_1) throw e_1.error; }
68
+ }
69
+ definition.fields = tslib_1.__assign(tslib_1.__assign({}, Object.fromEntries(tslib_1.__spread(indexFields.values()).map(function (name) { return [
70
+ name,
71
+ {
72
+ name: name,
73
+ type: 'ID',
74
+ isArray: false,
75
+ },
76
+ ]; }, []))), definition.fields);
77
+ }
78
+ return definition;
79
+ };
80
+ var getModelPKFieldName = function (modelConstructor) {
81
+ var _a, _b, _c;
82
+ var namespace = modelNamespaceMap.get(modelConstructor);
83
+ return ((namespace && ((_c = (_b = (_a = schema.namespaces) === null || _a === void 0 ? void 0 : _a[namespace]) === null || _b === void 0 ? void 0 : _b.keys) === null || _c === void 0 ? void 0 : _c[modelConstructor.name].primaryKey)) || ['id']);
124
84
  };
125
85
  var isValidModelConstructor = function (obj) {
126
- return util_1.isModelConstructor(obj) && modelNamespaceMap.has(obj);
86
+ if (util_1.isModelConstructor(obj) && modelNamespaceMap.has(obj)) {
87
+ return true;
88
+ }
89
+ else {
90
+ return false;
91
+ }
127
92
  };
128
93
  var namespaceResolver = function (modelConstructor) {
129
- return modelNamespaceMap.get(modelConstructor);
94
+ var resolver = modelNamespaceMap.get(modelConstructor);
95
+ if (!resolver) {
96
+ throw new Error("Namespace Resolver for '" + modelConstructor.name + "' not found! This is probably a bug in '@amplify-js/datastore'.");
97
+ }
98
+ return resolver;
99
+ };
100
+ var buildSeedPredicate = function (modelConstructor) {
101
+ if (!modelConstructor)
102
+ throw new Error('Missing modelConstructor');
103
+ var modelSchema = getModelDefinition(modelConstructor);
104
+ if (!modelSchema)
105
+ throw new Error('Missing modelSchema');
106
+ var pks = getModelPKFieldName(modelConstructor);
107
+ if (!pks)
108
+ throw new Error('Could not determine PK');
109
+ return next_1.recursivePredicateFor({
110
+ builder: modelConstructor,
111
+ schema: modelSchema,
112
+ pkField: pks,
113
+ });
130
114
  };
131
115
  var userClasses;
132
116
  var dataStoreClasses;
133
117
  var storageClasses;
118
+ /**
119
+ * Maps a model to its related models for memoization/immutability.
120
+ */
121
+ var modelInstanceAssociationsMap = new WeakMap();
122
+ /**
123
+ * Describes whether and to what a model is attached for lazy loading purposes.
124
+ */
125
+ var ModelAttachment;
126
+ (function (ModelAttachment) {
127
+ /**
128
+ * Model doesn't lazy load from any data source.
129
+ *
130
+ * Related entity properties provided at instantiation are returned
131
+ * via the respective lazy interfaces when their properties are invoked.
132
+ */
133
+ ModelAttachment["Detached"] = "Detached";
134
+ /**
135
+ * Model lazy loads from the global DataStore.
136
+ */
137
+ ModelAttachment["DataStore"] = "DataStore";
138
+ /**
139
+ * Demonstrative. Not yet implemented.
140
+ */
141
+ ModelAttachment["API"] = "API";
142
+ })(ModelAttachment || (ModelAttachment = {}));
143
+ /**
144
+ * Tells us which data source a model is attached to (lazy loads from).
145
+ *
146
+ * If `Deatched`, the model's lazy properties will only ever return properties
147
+ * from memory provided at construction time.
148
+ */
149
+ var attachedModelInstances = new WeakMap();
150
+ /**
151
+ * Registers a model instance against a data source (DataStore, API, or
152
+ * Detached/None).
153
+ *
154
+ * The API option is demonstrative. Lazy loading against API is not yet
155
+ * implemented.
156
+ *
157
+ * @param result A model instance or array of instances
158
+ * @param attachment A ModelAttachment data source
159
+ * @returns passes the `result` back through after attachment
160
+ */
161
+ function attached(result, attachment) {
162
+ if (Array.isArray(result)) {
163
+ result.map(function (record) { return attached(record, attachment); });
164
+ }
165
+ else {
166
+ result && attachedModelInstances.set(result, attachment);
167
+ }
168
+ return result;
169
+ }
170
+ exports.attached = attached;
171
+ /**
172
+ * Determines what source a model instance should lazy load from.
173
+ *
174
+ * If the instace was never explicitly registered, it is detached by default.
175
+ *
176
+ * @param instance A model instance
177
+ */
178
+ exports.getAttachment = function (instance) {
179
+ return attachedModelInstances.has(instance)
180
+ ? attachedModelInstances.get(instance)
181
+ : ModelAttachment.Detached;
182
+ };
134
183
  var initSchema = function (userSchema) {
135
184
  var _a;
136
185
  if (schema !== undefined) {
@@ -138,7 +187,8 @@ var initSchema = function (userSchema) {
138
187
  return userClasses;
139
188
  }
140
189
  logger.log('validating schema', { schema: userSchema });
141
- var internalUserNamespace = __assign({ name: util_1.USER }, userSchema);
190
+ checkSchemaCodegenVersion(userSchema.codegenVersion);
191
+ var internalUserNamespace = tslib_1.__assign({ name: util_1.USER }, userSchema);
142
192
  logger.log('DataStore', 'Init models');
143
193
  userClasses = createTypeClasses(internalUserNamespace);
144
194
  logger.log('DataStore', 'Models initialized');
@@ -156,10 +206,11 @@ var initSchema = function (userSchema) {
156
206
  _a[syncNamespace.name] = syncNamespace,
157
207
  _a),
158
208
  version: userSchema.version,
209
+ codegenVersion: userSchema.codegenVersion,
159
210
  };
160
211
  Object.keys(schema.namespaces).forEach(function (namespace) {
161
- var e_1, _a;
162
- var _b = __read(util_1.establishRelationAndKeys(schema.namespaces[namespace]), 2), relations = _b[0], keys = _b[1];
212
+ var e_3, _a;
213
+ var _b = tslib_1.__read(util_1.establishRelationAndKeys(schema.namespaces[namespace]), 2), relations = _b[0], keys = _b[1];
163
214
  schema.namespaces[namespace].relationships = relations;
164
215
  schema.namespaces[namespace].keys = keys;
165
216
  var modelAssociations = new Map();
@@ -175,6 +226,20 @@ var initSchema = function (userSchema) {
175
226
  return connectedModels.push(field.type.model);
176
227
  });
177
228
  modelAssociations.set(model.name, connectedModels);
229
+ Object.values(model.fields).forEach(function (field) {
230
+ if (typeof field.type === 'object' &&
231
+ !Object.getOwnPropertyDescriptor(field.type, 'modelConstructor')) {
232
+ Object.defineProperty(field.type, 'modelConstructor', {
233
+ get: function () {
234
+ return {
235
+ builder: userClasses[field.type.model],
236
+ schema: schema.namespaces[namespace].models[field.type.model],
237
+ pkField: getModelPKFieldName(userClasses[field.type.model]),
238
+ };
239
+ },
240
+ });
241
+ }
242
+ });
178
243
  });
179
244
  var result = new Map();
180
245
  var count = 1000;
@@ -187,20 +252,20 @@ var initSchema = function (userSchema) {
187
252
  throw new Error('Models are not topologically sortable. Please verify your schema.');
188
253
  }
189
254
  try {
190
- for (var _c = (e_1 = void 0, __values(Array.from(modelAssociations.keys()))), _d = _c.next(); !_d.done; _d = _c.next()) {
255
+ for (var _c = (e_3 = void 0, tslib_1.__values(Array.from(modelAssociations.keys()))), _d = _c.next(); !_d.done; _d = _c.next()) {
191
256
  var modelName = _d.value;
192
257
  var parents = modelAssociations.get(modelName);
193
- if (parents.every(function (x) { return result.has(x); })) {
258
+ if (parents === null || parents === void 0 ? void 0 : parents.every(function (x) { return result.has(x); })) {
194
259
  result.set(modelName, parents);
195
260
  }
196
261
  }
197
262
  }
198
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
263
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
199
264
  finally {
200
265
  try {
201
266
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
202
267
  }
203
- finally { if (e_1) throw e_1.error; }
268
+ finally { if (e_3) throw e_3.error; }
204
269
  }
205
270
  Array.from(result.keys()).forEach(function (x) { return modelAssociations.delete(x); });
206
271
  }
@@ -225,16 +290,54 @@ var checkSchemaInitialized = function () {
225
290
  throw new Error(message);
226
291
  }
227
292
  };
293
+ /**
294
+ * Throws an exception if the schema is using a codegen version that is not supported.
295
+ *
296
+ * Set the supported version by setting majorVersion and minorVersion
297
+ * This functions similar to ^ version range.
298
+ * The tested codegenVersion major version must exactly match the set majorVersion
299
+ * The tested codegenVersion minor version must be gt or equal to the set minorVersion
300
+ * Example: For a min supported version of 5.4.0 set majorVersion = 5 and minorVersion = 4
301
+ *
302
+ * This regex will not work when setting a supported range with minor version
303
+ * of 2 or more digits.
304
+ * i.e. minorVersion = 10 will not work
305
+ * The regex will work for testing a codegenVersion with multi digit minor
306
+ * versions as long as the minimum minorVersion is single digit.
307
+ * i.e. codegenVersion = 5.30.1, majorVersion = 5, minorVersion = 4 PASSES
308
+ *
309
+ * @param codegenVersion schema codegenVersion
310
+ */
311
+ var checkSchemaCodegenVersion = function (codegenVersion) {
312
+ // TODO: set to correct version when released in codegen
313
+ var majorVersion = 3;
314
+ var minorVersion = 2;
315
+ var isValid = false;
316
+ try {
317
+ var versionParts = codegenVersion.split('.');
318
+ var _a = tslib_1.__read(versionParts, 4), major = _a[0], minor = _a[1], patch = _a[2], patchrevision = _a[3];
319
+ isValid = Number(major) === majorVersion && Number(minor) >= minorVersion;
320
+ }
321
+ catch (err) {
322
+ console.log("Error parsing codegen version: " + codegenVersion + "\n" + err);
323
+ }
324
+ if (!isValid) {
325
+ var message = "Models were generated with an unsupported version of codegen. Codegen artifacts are from " + (codegenVersion || 'an unknown version') + ", whereas ^" + majorVersion + "." + minorVersion + ".0 is required. " +
326
+ "Update to the latest CLI and run 'amplify codegen models'.";
327
+ logger.error(message);
328
+ throw new Error(message);
329
+ }
330
+ };
228
331
  var createTypeClasses = function (namespace) {
229
332
  var classes = {};
230
333
  Object.entries(namespace.models).forEach(function (_a) {
231
- var _b = __read(_a, 2), modelName = _b[0], modelDefinition = _b[1];
334
+ var _b = tslib_1.__read(_a, 2), modelName = _b[0], modelDefinition = _b[1];
232
335
  var clazz = createModelClass(modelDefinition);
233
336
  classes[modelName] = clazz;
234
337
  modelNamespaceMap.set(clazz, namespace.name);
235
338
  });
236
339
  Object.entries(namespace.nonModels || {}).forEach(function (_a) {
237
- var _b = __read(_a, 2), typeName = _b[0], typeDefinition = _b[1];
340
+ var _b = tslib_1.__read(_a, 2), typeName = _b[0], typeDefinition = _b[1];
238
341
  var clazz = createNonModelClass(typeDefinition);
239
342
  classes[typeName] = clazz;
240
343
  });
@@ -325,7 +428,8 @@ var validateModelFields = function (modelDefinition) { return function (k, v) {
325
428
  }
326
429
  else if (!util_1.isNullOrUndefined(v) &&
327
430
  validateScalar_1 &&
328
- !validateScalar_1(v)) {
431
+ !validateScalar_1(v) // TODO: why never, TS ... why ...
432
+ ) {
329
433
  throw new Error("Field " + name_1 + " should be of type " + type_1 + ", validation failed. " + v);
330
434
  }
331
435
  }
@@ -390,7 +494,7 @@ var castInstanceType = function (modelDefinition, k, v) {
390
494
  var initializeInstance = function (init, modelDefinition, draft) {
391
495
  var modelValidator = validateModelFields(modelDefinition);
392
496
  Object.entries(init).forEach(function (_a) {
393
- var _b = __read(_a, 2), k = _b[0], v = _b[1];
497
+ var _b = tslib_1.__read(_a, 2), k = _b[0], v = _b[1];
394
498
  var parsedValue = castInstanceType(modelDefinition, k, v);
395
499
  modelValidator(k, parsedValue);
396
500
  draft[k] = parsedValue;
@@ -447,7 +551,7 @@ var createModelClass = function (modelDefinition) {
447
551
  keyNames.forEach(function (key) { return (draft[key] = source[key]); });
448
552
  var modelValidator = validateModelFields(modelDefinition);
449
553
  Object.entries(draft).forEach(function (_a) {
450
- var _b = __read(_a, 2), k = _b[0], v = _b[1];
554
+ var _b = tslib_1.__read(_a, 2), k = _b[0], v = _b[1];
451
555
  var parsedValue = castInstanceType(modelDefinition, k, v);
452
556
  modelValidator(k, parsedValue);
453
557
  });
@@ -455,7 +559,7 @@ var createModelClass = function (modelDefinition) {
455
559
  var hasExistingPatches = modelPatchesMap.has(source);
456
560
  if (patches.length || hasExistingPatches) {
457
561
  if (hasExistingPatches) {
458
- var _a = __read(modelPatchesMap.get(source), 2), existingPatches = _a[0], existingSource = _a[1];
562
+ var _a = tslib_1.__read(modelPatchesMap.get(source), 2), existingPatches = _a[0], existingSource = _a[1];
459
563
  var mergedPatches = util_1.mergePatches(existingSource, existingPatches, patches);
460
564
  modelPatchesMap.set(model, [mergedPatches, existingSource]);
461
565
  checkReadOnlyPropertyOnUpdate(mergedPatches, modelDefinition);
@@ -465,7 +569,7 @@ var createModelClass = function (modelDefinition) {
465
569
  checkReadOnlyPropertyOnUpdate(patches, modelDefinition);
466
570
  }
467
571
  }
468
- return model;
572
+ return attached(model, ModelAttachment.DataStore);
469
573
  };
470
574
  // "private" method (that's hidden via `Setting`) for `withSSRContext` to use
471
575
  // to gain access to `modelInstanceCreator` and `clazz` for persisting IDs from server to client.
@@ -477,17 +581,208 @@ var createModelClass = function (modelDefinition) {
477
581
  var instance = modelInstanceCreator(clazz, json);
478
582
  var modelValidator = validateModelFields(modelDefinition);
479
583
  Object.entries(instance).forEach(function (_a) {
480
- var _b = __read(_a, 2), k = _b[0], v = _b[1];
584
+ var _b = tslib_1.__read(_a, 2), k = _b[0], v = _b[1];
481
585
  modelValidator(k, v);
482
586
  });
483
- return instance;
587
+ return attached(instance, ModelAttachment.DataStore);
484
588
  };
485
589
  return Model;
486
590
  }());
487
591
  clazz[immer_1.immerable] = true;
488
592
  Object.defineProperty(clazz, 'name', { value: modelDefinition.name });
593
+ var _loop_1 = function (field) {
594
+ if (!types_1.isFieldAssociation(modelDefinition, field)) {
595
+ return "continue";
596
+ }
597
+ var _a = modelDefinition.fields[field], type = _a.type, localAssociation = _a.association, _b = _a.association, targetName = _b.targetName, targetNames = _b.targetNames;
598
+ var relationship = new relationship_1.ModelRelationship({
599
+ builder: clazz,
600
+ schema: modelDefinition,
601
+ pkField: util_1.extractPrimaryKeyFieldNames(modelDefinition),
602
+ }, field);
603
+ Object.defineProperty(clazz.prototype, modelDefinition.fields[field].name, {
604
+ set: function (model) {
605
+ if (!model || !(typeof model === 'object'))
606
+ return;
607
+ // Avoid validation error when processing AppSync response with nested
608
+ // selection set. Nested entitites lack version field and can not be validated
609
+ // TODO: explore a more reliable method to solve this
610
+ if (model.hasOwnProperty('_version')) {
611
+ var modelConstructor = Object.getPrototypeOf(model || {})
612
+ .constructor;
613
+ if (!isValidModelConstructor(modelConstructor)) {
614
+ var msg = "Value passed to " + modelDefinition.name + "." + field + " is not a valid instance of a model";
615
+ logger.error(msg, { model: model });
616
+ throw new Error(msg);
617
+ }
618
+ if (modelConstructor.name.toLowerCase() !==
619
+ relationship.remoteModelConstructor.name.toLowerCase()) {
620
+ var msg = "Value passed to " + modelDefinition.name + "." + field + " is not an instance of " + relationship.remoteModelConstructor.name;
621
+ logger.error(msg, { model: model });
622
+ throw new Error(msg);
623
+ }
624
+ }
625
+ if (relationship.isComplete) {
626
+ for (var i = 0; i < relationship.localJoinFields.length; i++) {
627
+ this[relationship.localJoinFields[i]] =
628
+ model[relationship.remoteJoinFields[i]];
629
+ }
630
+ var instanceMemos = modelInstanceAssociationsMap.has(this)
631
+ ? modelInstanceAssociationsMap.get(this)
632
+ : modelInstanceAssociationsMap.set(this, {}).get(this);
633
+ instanceMemos[field] = model;
634
+ }
635
+ },
636
+ get: function () {
637
+ var _this = this;
638
+ var instanceMemos = modelInstanceAssociationsMap.has(this)
639
+ ? modelInstanceAssociationsMap.get(this)
640
+ : modelInstanceAssociationsMap.set(this, {}).get(this);
641
+ if (!instanceMemos.hasOwnProperty(field)) {
642
+ if (exports.getAttachment(this) === ModelAttachment.DataStore) {
643
+ var resultPromise = instance.query(relationship.remoteModelConstructor, function (base) {
644
+ return base.and(function (q) {
645
+ return relationship.remoteJoinFields.map(function (field, index) {
646
+ return q[field].eq(_this[relationship.localJoinFields[index]]);
647
+ });
648
+ });
649
+ });
650
+ if (relationship.type === 'HAS_MANY') {
651
+ instanceMemos[field] = new AsyncCollection(resultPromise);
652
+ }
653
+ else {
654
+ instanceMemos[field] = resultPromise.then(function (rows) {
655
+ if (rows.length > 1) {
656
+ // should never happen for a HAS_ONE or BELONGS_TO.
657
+ var err = new Error("\n\t\t\t\t\t\t\t\t\tData integrity error.\n\t\t\t\t\t\t\t\t\tToo many records found for a HAS_ONE/BELONGS_TO field '" + modelDefinition.name + "." + field + "'\n\t\t\t\t\t\t\t\t");
658
+ console.error(err);
659
+ throw err;
660
+ }
661
+ else {
662
+ return rows[0];
663
+ }
664
+ });
665
+ }
666
+ }
667
+ else if (exports.getAttachment(this) === ModelAttachment.API) {
668
+ throw new Error('Lazy loading from API is not yet supported!');
669
+ }
670
+ else {
671
+ if (relationship.type === 'HAS_MANY') {
672
+ return new AsyncCollection([]);
673
+ }
674
+ else {
675
+ return Promise.resolve(undefined);
676
+ }
677
+ }
678
+ }
679
+ return instanceMemos[field];
680
+ },
681
+ });
682
+ };
683
+ for (var field in modelDefinition.fields) {
684
+ _loop_1(field);
685
+ }
489
686
  return clazz;
490
687
  };
688
+ var AsyncItem = /** @class */ (function (_super) {
689
+ tslib_1.__extends(AsyncItem, _super);
690
+ function AsyncItem() {
691
+ return _super !== null && _super.apply(this, arguments) || this;
692
+ }
693
+ return AsyncItem;
694
+ }(Promise));
695
+ exports.AsyncItem = AsyncItem;
696
+ var AsyncCollection = /** @class */ (function () {
697
+ function AsyncCollection(values) {
698
+ this.values = values;
699
+ }
700
+ AsyncCollection.prototype[Symbol.asyncIterator] = function () {
701
+ var _this = this;
702
+ var values;
703
+ var index = 0;
704
+ return {
705
+ next: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
706
+ var result;
707
+ return tslib_1.__generator(this, function (_a) {
708
+ switch (_a.label) {
709
+ case 0:
710
+ if (!!values) return [3 /*break*/, 2];
711
+ return [4 /*yield*/, this.values];
712
+ case 1:
713
+ values = _a.sent();
714
+ _a.label = 2;
715
+ case 2:
716
+ if (index < values.length) {
717
+ result = {
718
+ value: values[index],
719
+ done: false,
720
+ };
721
+ index++;
722
+ return [2 /*return*/, result];
723
+ }
724
+ return [2 /*return*/, {
725
+ value: null,
726
+ done: true,
727
+ }];
728
+ }
729
+ });
730
+ }); },
731
+ };
732
+ };
733
+ AsyncCollection.prototype.toArray = function (_a) {
734
+ var _b = (_a === void 0 ? {} : _a).max, max = _b === void 0 ? Number.MAX_SAFE_INTEGER : _b;
735
+ var e_4, _c;
736
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
737
+ var output, i, _d, _e, element, e_4_1;
738
+ return tslib_1.__generator(this, function (_f) {
739
+ switch (_f.label) {
740
+ case 0:
741
+ output = [];
742
+ i = 0;
743
+ _f.label = 1;
744
+ case 1:
745
+ _f.trys.push([1, 6, 7, 12]);
746
+ _d = tslib_1.__asyncValues(this);
747
+ _f.label = 2;
748
+ case 2: return [4 /*yield*/, _d.next()];
749
+ case 3:
750
+ if (!(_e = _f.sent(), !_e.done)) return [3 /*break*/, 5];
751
+ element = _e.value;
752
+ if (i < max) {
753
+ output.push(element);
754
+ i++;
755
+ }
756
+ else {
757
+ return [3 /*break*/, 5];
758
+ }
759
+ _f.label = 4;
760
+ case 4: return [3 /*break*/, 2];
761
+ case 5: return [3 /*break*/, 12];
762
+ case 6:
763
+ e_4_1 = _f.sent();
764
+ e_4 = { error: e_4_1 };
765
+ return [3 /*break*/, 12];
766
+ case 7:
767
+ _f.trys.push([7, , 10, 11]);
768
+ if (!(_e && !_e.done && (_c = _d.return))) return [3 /*break*/, 9];
769
+ return [4 /*yield*/, _c.call(_d)];
770
+ case 8:
771
+ _f.sent();
772
+ _f.label = 9;
773
+ case 9: return [3 /*break*/, 11];
774
+ case 10:
775
+ if (e_4) throw e_4.error;
776
+ return [7 /*endfinally*/];
777
+ case 11: return [7 /*endfinally*/];
778
+ case 12: return [2 /*return*/, output];
779
+ }
780
+ });
781
+ });
782
+ };
783
+ return AsyncCollection;
784
+ }());
785
+ exports.AsyncCollection = AsyncCollection;
491
786
  var checkReadOnlyPropertyOnCreate = function (draft, modelDefinition) {
492
787
  var modelKeys = Object.keys(draft);
493
788
  var fields = modelDefinition.fields;
@@ -501,7 +796,7 @@ var checkReadOnlyPropertyOnUpdate = function (patches, modelDefinition) {
501
796
  var patchArray = patches.map(function (p) { return [p.path[0], p.value]; });
502
797
  var fields = modelDefinition.fields;
503
798
  patchArray.forEach(function (_a) {
504
- var _b = __read(_a, 2), key = _b[0], val = _b[1];
799
+ var _b = tslib_1.__read(_a, 2), key = _b[0], val = _b[1];
505
800
  if (!val || !fields[key])
506
801
  return;
507
802
  if (fields[key].isReadOnly) {
@@ -530,7 +825,7 @@ function isQueryOne(obj) {
530
825
  function defaultConflictHandler(conflictData) {
531
826
  var localModel = conflictData.localModel, modelConstructor = conflictData.modelConstructor, remoteModel = conflictData.remoteModel;
532
827
  var _version = remoteModel._version;
533
- return modelInstanceCreator(modelConstructor, __assign(__assign({}, localModel), { _version: _version }));
828
+ return modelInstanceCreator(modelConstructor, tslib_1.__assign(tslib_1.__assign({}, localModel), { _version: _version }));
534
829
  }
535
830
  function defaultErrorHandler(error) {
536
831
  logger.warn(error);
@@ -551,8 +846,7 @@ function getModelConstructorByModelName(namespaceName, modelName) {
551
846
  result = storageClasses[modelName];
552
847
  break;
553
848
  default:
554
- util_1.exhaustiveCheck(namespaceName);
555
- break;
849
+ throw new Error("Invalid namespace: " + namespaceName);
556
850
  }
557
851
  if (isValidModelConstructor(result)) {
558
852
  return result;
@@ -576,23 +870,23 @@ function getModelConstructorByModelName(namespaceName, modelName) {
576
870
  * @param version The expected schema version.
577
871
  */
578
872
  function checkSchemaVersion(storage, version) {
579
- return __awaiter(this, void 0, void 0, function () {
873
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
580
874
  var Setting, modelDefinition;
581
875
  var _this = this;
582
- return __generator(this, function (_a) {
876
+ return tslib_1.__generator(this, function (_a) {
583
877
  switch (_a.label) {
584
878
  case 0:
585
879
  Setting = dataStoreClasses.Setting;
586
880
  modelDefinition = schema.namespaces[util_1.DATASTORE].models.Setting;
587
- return [4 /*yield*/, storage.runExclusive(function (s) { return __awaiter(_this, void 0, void 0, function () {
881
+ return [4 /*yield*/, storage.runExclusive(function (s) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
588
882
  var _a, schemaVersionSetting, storedValue;
589
- return __generator(this, function (_b) {
883
+ return tslib_1.__generator(this, function (_b) {
590
884
  switch (_b.label) {
591
885
  case 0: return [4 /*yield*/, s.query(Setting, predicates_1.ModelPredicateCreator.createFromExisting(modelDefinition, function (c) {
592
886
  return c.key('eq', SETTING_SCHEMA_VERSION);
593
887
  }), { page: 0, limit: 1 })];
594
888
  case 1:
595
- _a = __read.apply(void 0, [_b.sent(), 1]), schemaVersionSetting = _a[0];
889
+ _a = tslib_1.__read.apply(void 0, [_b.sent(), 1]), schemaVersionSetting = _a[0];
596
890
  if (!(schemaVersionSetting !== undefined &&
597
891
  schemaVersionSetting.value !== undefined)) return [3 /*break*/, 4];
598
892
  storedValue = JSON.parse(schemaVersionSetting.value);
@@ -670,8 +964,14 @@ var DataStore = /** @class */ (function () {
670
964
  var _this = this;
671
965
  // reference to configured category instances. Used for preserving SSR context
672
966
  this.Auth = auth_1.Auth;
673
- this.API = api_1.default;
674
- this.Cache = cache_1.default;
967
+ this.API = api_1.API;
968
+ this.Cache = cache_1.Cache;
969
+ // Non-null assertions (bang operator) have been added to most of these properties
970
+ // to make TS happy. These properties are all expected to be set immediately after
971
+ // construction.
972
+ // TODO: Refactor to use proper DI if possible. If not possible, change these to
973
+ // optionals and implement conditional checks throughout. Rinse/repeat on all
974
+ // sync engine processors, storage engine, adapters, etc..
675
975
  this.amplifyConfig = {};
676
976
  this.syncPredicates = new WeakMap();
677
977
  // object that gets passed to descendent classes. Allows us to pass these down by reference
@@ -726,14 +1026,14 @@ var DataStore = /** @class */ (function () {
726
1026
  * 1. If `this.amplifyConfig.aws_appsync_graphqlEndpoint` contains a URL,
727
1027
  * attaches a sync engine, starts it, and subscribes.
728
1028
  */
729
- this.start = function () { return __awaiter(_this, void 0, void 0, function () {
1029
+ this.start = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
730
1030
  var _this = this;
731
- return __generator(this, function (_a) {
1031
+ return tslib_1.__generator(this, function (_a) {
732
1032
  return [2 /*return*/, this.runningProcesses
733
- .add(function () { return __awaiter(_this, void 0, void 0, function () {
1033
+ .add(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
734
1034
  var aws_appsync_graphqlEndpoint, _a, fullSyncIntervalInMilliseconds;
735
1035
  var _this = this;
736
- return __generator(this, function (_b) {
1036
+ return tslib_1.__generator(this, function (_b) {
737
1037
  switch (_b.label) {
738
1038
  case 0:
739
1039
  this.state = DataStoreState.Starting;
@@ -807,17 +1107,21 @@ var DataStore = /** @class */ (function () {
807
1107
  .catch(this.handleAddProcError('DataStore.start()'))];
808
1108
  });
809
1109
  }); };
810
- this.query = function (modelConstructor, identifierOrCriteria, paginationProducer) { return __awaiter(_this, void 0, void 0, function () {
1110
+ this.query = function (modelConstructor, identifierOrCriteria, paginationProducer) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
811
1111
  var _this = this;
812
- return __generator(this, function (_a) {
1112
+ return tslib_1.__generator(this, function (_a) {
813
1113
  return [2 /*return*/, this.runningProcesses
814
- .add(function () { return __awaiter(_this, void 0, void 0, function () {
815
- var msg, modelDefinition, keyFields, predicate, msg, pagination, result, returnOne;
816
- return __generator(this, function (_a) {
817
- switch (_a.label) {
1114
+ .add(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1115
+ var result, msg, modelDefinition, pagination, keyFields, msg, predicate, predicate, seedPredicate, predicate, returnOne;
1116
+ var _a;
1117
+ return tslib_1.__generator(this, function (_b) {
1118
+ switch (_b.label) {
818
1119
  case 0: return [4 /*yield*/, this.start()];
819
1120
  case 1:
820
- _a.sent();
1121
+ _b.sent();
1122
+ if (!this.storage) {
1123
+ throw new Error('No storage to query');
1124
+ }
821
1125
  //#region Input validation
822
1126
  if (!isValidModelConstructor(modelConstructor)) {
823
1127
  msg = 'Constructor is not for a valid model';
@@ -830,59 +1134,73 @@ var DataStore = /** @class */ (function () {
830
1134
  }
831
1135
  }
832
1136
  modelDefinition = getModelDefinition(modelConstructor);
833
- keyFields = util_1.extractPrimaryKeyFieldNames(modelDefinition);
834
- if (isQueryOne(identifierOrCriteria)) {
835
- if (keyFields.length > 1) {
836
- msg = util_1.errorMessages.queryByPkWithCompositeKeyPresent;
837
- logger.error(msg, { keyFields: keyFields });
838
- throw new Error(msg);
839
- }
840
- predicate = predicates_1.ModelPredicateCreator.createForSingleField(modelDefinition, keyFields[0], identifierOrCriteria);
841
- }
842
- else {
843
- // Object is being queried using object literal syntax
844
- if (types_1.isIdentifierObject(identifierOrCriteria, modelDefinition)) {
845
- predicate = predicates_1.ModelPredicateCreator.createForPk(modelDefinition, identifierOrCriteria);
846
- }
847
- else if (predicates_1.isPredicatesAll(identifierOrCriteria)) {
848
- // Predicates.ALL means "all records", so no predicate (undefined)
849
- predicate = undefined;
850
- }
851
- else {
852
- predicate = predicates_1.ModelPredicateCreator.createFromExisting(modelDefinition, identifierOrCriteria);
853
- }
1137
+ if (!modelDefinition) {
1138
+ throw new Error('Invalid model definition provided!');
854
1139
  }
855
1140
  pagination = this.processPagination(modelDefinition, paginationProducer);
856
- //#endregion
857
- logger.debug('params ready', {
858
- modelConstructor: modelConstructor,
859
- predicate: predicates_1.ModelPredicateCreator.getPredicates(predicate, false),
860
- pagination: __assign(__assign({}, pagination), { sort: predicates_1.ModelSortPredicateCreator.getPredicates(pagination && pagination.sort, false) }),
861
- });
1141
+ keyFields = util_1.extractPrimaryKeyFieldNames(modelDefinition);
1142
+ if (!isQueryOne(identifierOrCriteria)) return [3 /*break*/, 3];
1143
+ if (keyFields.length > 1) {
1144
+ msg = util_1.errorMessages.queryByPkWithCompositeKeyPresent;
1145
+ logger.error(msg, { keyFields: keyFields });
1146
+ throw new Error(msg);
1147
+ }
1148
+ predicate = predicates_1.ModelPredicateCreator.createForSingleField(modelDefinition, keyFields[0], identifierOrCriteria);
862
1149
  return [4 /*yield*/, this.storage.query(modelConstructor, predicate, pagination)];
863
1150
  case 2:
864
- result = _a.sent();
1151
+ result = _b.sent();
1152
+ return [3 /*break*/, 9];
1153
+ case 3:
1154
+ if (!types_1.isIdentifierObject(identifierOrCriteria, modelDefinition)) return [3 /*break*/, 5];
1155
+ predicate = predicates_1.ModelPredicateCreator.createForPk(modelDefinition, identifierOrCriteria);
1156
+ return [4 /*yield*/, this.storage.query(modelConstructor, predicate, pagination)];
1157
+ case 4:
1158
+ result = _b.sent();
1159
+ return [3 /*break*/, 9];
1160
+ case 5:
1161
+ if (!(!identifierOrCriteria ||
1162
+ predicates_1.isPredicatesAll(identifierOrCriteria))) return [3 /*break*/, 7];
1163
+ return [4 /*yield*/, ((_a = this.storage) === null || _a === void 0 ? void 0 : _a.query(modelConstructor, undefined, pagination))];
1164
+ case 6:
1165
+ result = _b.sent();
1166
+ return [3 /*break*/, 9];
1167
+ case 7:
1168
+ seedPredicate = next_1.recursivePredicateFor({
1169
+ builder: modelConstructor,
1170
+ schema: modelDefinition,
1171
+ pkField: getModelPKFieldName(modelConstructor),
1172
+ });
1173
+ predicate = next_1.internals(identifierOrCriteria(seedPredicate));
1174
+ return [4 /*yield*/, predicate.fetch(this.storage)];
1175
+ case 8:
1176
+ result = (_b.sent());
1177
+ result = util_1.inMemoryPagination(result, pagination);
1178
+ _b.label = 9;
1179
+ case 9:
865
1180
  returnOne = isQueryOne(identifierOrCriteria) ||
866
1181
  types_1.isIdentifierObject(identifierOrCriteria, modelDefinition);
867
- return [2 /*return*/, returnOne ? result[0] : result];
1182
+ return [2 /*return*/, attached(returnOne ? result[0] : result, ModelAttachment.DataStore)];
868
1183
  }
869
1184
  });
870
1185
  }); }, 'datastore query')
871
1186
  .catch(this.handleAddProcError('DataStore.query()'))];
872
1187
  });
873
1188
  }); };
874
- this.save = function (model, condition) { return __awaiter(_this, void 0, void 0, function () {
1189
+ this.save = function (model, condition) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
875
1190
  var _this = this;
876
- return __generator(this, function (_a) {
1191
+ return tslib_1.__generator(this, function (_a) {
877
1192
  return [2 /*return*/, this.runningProcesses
878
- .add(function () { return __awaiter(_this, void 0, void 0, function () {
879
- var patchesTuple, modelConstructor, msg, modelDefinition, producedCondition, _a, savedModel;
1193
+ .add(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1194
+ var patchesTuple, modelConstructor, msg, modelDefinition, modelMeta, producedCondition, _a, savedModel;
880
1195
  var _this = this;
881
- return __generator(this, function (_b) {
1196
+ return tslib_1.__generator(this, function (_b) {
882
1197
  switch (_b.label) {
883
1198
  case 0: return [4 /*yield*/, this.start()];
884
1199
  case 1:
885
1200
  _b.sent();
1201
+ if (!this.storage) {
1202
+ throw new Error('No storage to save to');
1203
+ }
886
1204
  patchesTuple = modelPatchesMap.get(model);
887
1205
  modelConstructor = model ? model.constructor : undefined;
888
1206
  if (!isValidModelConstructor(modelConstructor)) {
@@ -891,20 +1209,81 @@ var DataStore = /** @class */ (function () {
891
1209
  throw new Error(msg);
892
1210
  }
893
1211
  modelDefinition = getModelDefinition(modelConstructor);
894
- producedCondition = predicates_1.ModelPredicateCreator.createFromExisting(modelDefinition, condition);
895
- return [4 /*yield*/, this.storage.runExclusive(function (s) { return __awaiter(_this, void 0, void 0, function () {
896
- return __generator(this, function (_a) {
1212
+ if (!modelDefinition) {
1213
+ throw new Error('Model Definition could not be found for model');
1214
+ }
1215
+ modelMeta = {
1216
+ builder: modelConstructor,
1217
+ schema: modelDefinition,
1218
+ pkField: util_1.extractPrimaryKeyFieldNames(modelDefinition),
1219
+ };
1220
+ return [4 /*yield*/, this.storage.runExclusive(function (s) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1221
+ var nonHasManyRelationships, nonHasManyRelationships_1, nonHasManyRelationships_1_1, relationship, queryObject, related, e_5_1;
1222
+ var e_5, _a;
1223
+ var _b;
1224
+ return tslib_1.__generator(this, function (_c) {
1225
+ switch (_c.label) {
1226
+ case 0:
1227
+ nonHasManyRelationships = relationship_1.ModelRelationship.allFrom(modelMeta).filter(function (r) { return r.type === 'BELONGS_TO'; });
1228
+ _c.label = 1;
1229
+ case 1:
1230
+ _c.trys.push([1, 6, 7, 8]);
1231
+ nonHasManyRelationships_1 = tslib_1.__values(nonHasManyRelationships), nonHasManyRelationships_1_1 = nonHasManyRelationships_1.next();
1232
+ _c.label = 2;
1233
+ case 2:
1234
+ if (!!nonHasManyRelationships_1_1.done) return [3 /*break*/, 5];
1235
+ relationship = nonHasManyRelationships_1_1.value;
1236
+ queryObject = relationship.createRemoteQueryObject(model);
1237
+ if (!(queryObject !== null)) return [3 /*break*/, 4];
1238
+ return [4 /*yield*/, s.query(relationship.remoteModelConstructor, predicates_1.ModelPredicateCreator.createFromFlatEqualities(relationship.remoteDefinition, queryObject))];
1239
+ case 3:
1240
+ related = _c.sent();
1241
+ if (related.length === 0) {
1242
+ throw new Error([
1243
+ "Data integrity error. You tried to save a " + modelDefinition.name + " (" + JSON.stringify(model) + ")",
1244
+ "but the instance assigned to the \"" + relationship.field + "\" property",
1245
+ "does not exist in the local database. If you're trying to create the related",
1246
+ "\"" + ((_b = relationship.remoteDefinition) === null || _b === void 0 ? void 0 : _b.name) + "\", you must save it independently first.",
1247
+ ].join(' '));
1248
+ }
1249
+ _c.label = 4;
1250
+ case 4:
1251
+ nonHasManyRelationships_1_1 = nonHasManyRelationships_1.next();
1252
+ return [3 /*break*/, 2];
1253
+ case 5: return [3 /*break*/, 8];
1254
+ case 6:
1255
+ e_5_1 = _c.sent();
1256
+ e_5 = { error: e_5_1 };
1257
+ return [3 /*break*/, 8];
1258
+ case 7:
1259
+ try {
1260
+ if (nonHasManyRelationships_1_1 && !nonHasManyRelationships_1_1.done && (_a = nonHasManyRelationships_1.return)) _a.call(nonHasManyRelationships_1);
1261
+ }
1262
+ finally { if (e_5) throw e_5.error; }
1263
+ return [7 /*endfinally*/];
1264
+ case 8: return [2 /*return*/];
1265
+ }
1266
+ });
1267
+ }); })];
1268
+ case 2:
1269
+ _b.sent();
1270
+ producedCondition = condition
1271
+ ? next_1.internals(condition(next_1.predicateFor(modelMeta))).toStoragePredicate()
1272
+ : undefined;
1273
+ return [4 /*yield*/, this.storage.runExclusive(function (s) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1274
+ var saved;
1275
+ return tslib_1.__generator(this, function (_a) {
897
1276
  switch (_a.label) {
898
1277
  case 0: return [4 /*yield*/, s.save(model, producedCondition, undefined, patchesTuple)];
899
1278
  case 1:
900
- _a.sent();
1279
+ saved = _a.sent();
901
1280
  return [2 /*return*/, s.query(modelConstructor, predicates_1.ModelPredicateCreator.createForPk(modelDefinition, model))];
902
1281
  }
903
1282
  });
904
1283
  }); })];
905
- case 2:
906
- _a = __read.apply(void 0, [_b.sent(), 1]), savedModel = _a[0];
907
- return [2 /*return*/, savedModel];
1284
+ case 3:
1285
+ _a = tslib_1.__read.apply(void 0, [_b.sent(), 1]), savedModel = _a[0];
1286
+ return [2 /*return*/, attached(savedModel, ModelAttachment.DataStore)];
908
1287
  }
909
1288
  });
910
1289
  }); }, 'datastore save')
@@ -937,17 +1316,20 @@ var DataStore = /** @class */ (function () {
937
1316
  }
938
1317
  return _this.errorHandler || defaultErrorHandler;
939
1318
  };
940
- this.delete = function (modelOrConstructor, identifierOrCriteria) { return __awaiter(_this, void 0, void 0, function () {
1319
+ this.delete = function (modelOrConstructor, identifierOrCriteria) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
941
1320
  var _this = this;
942
- return __generator(this, function (_a) {
1321
+ return tslib_1.__generator(this, function (_a) {
943
1322
  return [2 /*return*/, this.runningProcesses
944
- .add(function () { return __awaiter(_this, void 0, void 0, function () {
1323
+ .add(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
945
1324
  var condition, msg, modelConstructor, msg, modelDefinition, keyFields, msg, msg, _a, deleted, model, modelConstructor, msg, modelDefinition, pkPredicate, msg, _b, _c, deleted;
946
- return __generator(this, function (_d) {
1325
+ return tslib_1.__generator(this, function (_d) {
947
1326
  switch (_d.label) {
948
1327
  case 0: return [4 /*yield*/, this.start()];
949
1328
  case 1:
950
1329
  _d.sent();
1330
+ if (!this.storage) {
1331
+ throw new Error('No storage to delete from');
1332
+ }
951
1333
  if (!modelOrConstructor) {
952
1334
  msg = 'Model or Model Constructor required';
953
1335
  logger.error(msg, { modelOrConstructor: modelOrConstructor });
@@ -961,6 +1343,9 @@ var DataStore = /** @class */ (function () {
961
1343
  throw new Error(msg);
962
1344
  }
963
1345
  modelDefinition = getModelDefinition(modelConstructor);
1346
+ if (!modelDefinition) {
1347
+ throw new Error('Could not find model definition for modelConstructor.');
1348
+ }
964
1349
  if (typeof identifierOrCriteria === 'string') {
965
1350
  keyFields = util_1.extractPrimaryKeyFieldNames(modelDefinition);
966
1351
  if (keyFields.length > 1) {
@@ -968,19 +1353,18 @@ var DataStore = /** @class */ (function () {
968
1353
  logger.error(msg, { keyFields: keyFields });
969
1354
  throw new Error(msg);
970
1355
  }
971
- condition = predicates_1.ModelPredicateCreator.createForSingleField(getModelDefinition(modelConstructor), keyFields[0], identifierOrCriteria);
1356
+ condition = predicates_1.ModelPredicateCreator.createForSingleField(modelDefinition, keyFields[0], identifierOrCriteria);
972
1357
  }
973
1358
  else {
974
1359
  if (types_1.isIdentifierObject(identifierOrCriteria, modelDefinition)) {
975
1360
  condition = predicates_1.ModelPredicateCreator.createForPk(modelDefinition, identifierOrCriteria);
976
1361
  }
977
1362
  else {
978
- condition = predicates_1.ModelPredicateCreator.createFromExisting(modelDefinition,
979
- /**
980
- * idOrCriteria is always a ProducerModelPredicate<T>, never a symbol.
981
- * The symbol is used only for typing purposes. e.g. see Predicates.ALL
982
- */
983
- identifierOrCriteria);
1363
+ condition = next_1.internals(identifierOrCriteria(next_1.predicateFor({
1364
+ builder: modelConstructor,
1365
+ schema: modelDefinition,
1366
+ pkField: util_1.extractPrimaryKeyFieldNames(modelDefinition),
1367
+ }))).toStoragePredicate();
984
1368
  }
985
1369
  if (!condition ||
986
1370
  !predicates_1.ModelPredicateCreator.isValidPredicate(condition)) {
@@ -991,8 +1375,8 @@ var DataStore = /** @class */ (function () {
991
1375
  }
992
1376
  return [4 /*yield*/, this.storage.delete(modelConstructor, condition)];
993
1377
  case 2:
994
- _a = __read.apply(void 0, [_d.sent(), 1]), deleted = _a[0];
995
- return [2 /*return*/, deleted];
1378
+ _a = tslib_1.__read.apply(void 0, [_d.sent(), 1]), deleted = _a[0];
1379
+ return [2 /*return*/, attached(deleted, ModelAttachment.DataStore)];
996
1380
  case 3:
997
1381
  model = modelOrConstructor;
998
1382
  modelConstructor = Object.getPrototypeOf(model || {})
@@ -1003,6 +1387,9 @@ var DataStore = /** @class */ (function () {
1003
1387
  throw new Error(msg);
1004
1388
  }
1005
1389
  modelDefinition = getModelDefinition(modelConstructor);
1390
+ if (!modelDefinition) {
1391
+ throw new Error('Could not find model definition for modelConstructor.');
1392
+ }
1006
1393
  pkPredicate = predicates_1.ModelPredicateCreator.createForPk(modelDefinition, model);
1007
1394
  if (identifierOrCriteria) {
1008
1395
  if (typeof identifierOrCriteria !== 'function') {
@@ -1010,15 +1397,19 @@ var DataStore = /** @class */ (function () {
1010
1397
  logger.error(msg, { identifierOrCriteria: identifierOrCriteria });
1011
1398
  throw new Error(msg);
1012
1399
  }
1013
- condition = identifierOrCriteria(pkPredicate);
1400
+ condition = next_1.internals(identifierOrCriteria(next_1.predicateFor({
1401
+ builder: modelConstructor,
1402
+ schema: modelDefinition,
1403
+ pkField: util_1.extractPrimaryKeyFieldNames(modelDefinition),
1404
+ }))).toStoragePredicate(pkPredicate);
1014
1405
  }
1015
1406
  else {
1016
1407
  condition = pkPredicate;
1017
1408
  }
1018
1409
  return [4 /*yield*/, this.storage.delete(model, condition)];
1019
1410
  case 4:
1020
- _b = __read.apply(void 0, [_d.sent(), 1]), _c = __read(_b[0], 1), deleted = _c[0];
1021
- return [2 /*return*/, deleted];
1411
+ _b = tslib_1.__read.apply(void 0, [_d.sent(), 1]), _c = tslib_1.__read(_b[0], 1), deleted = _c[0];
1412
+ return [2 /*return*/, attached(deleted, ModelAttachment.DataStore)];
1022
1413
  }
1023
1414
  });
1024
1415
  }); }, 'datastore delete')
@@ -1026,7 +1417,7 @@ var DataStore = /** @class */ (function () {
1026
1417
  });
1027
1418
  }); };
1028
1419
  this.observe = function (modelOrConstructor, identifierOrCriteria) {
1029
- var predicate;
1420
+ var executivePredicate;
1030
1421
  var modelConstructor = modelOrConstructor && isValidModelConstructor(modelOrConstructor)
1031
1422
  ? modelOrConstructor
1032
1423
  : undefined;
@@ -1066,35 +1457,26 @@ var DataStore = /** @class */ (function () {
1066
1457
  logger.error(msg, { modelConstructor: modelConstructor });
1067
1458
  throw new Error(msg);
1068
1459
  }
1069
- if (typeof identifierOrCriteria === 'string') {
1070
- var modelDefinition = getModelDefinition(modelConstructor);
1071
- var _a = __read(util_1.extractPrimaryKeyFieldNames(modelDefinition), 1), keyField = _a[0];
1072
- predicate = predicates_1.ModelPredicateCreator.createForSingleField(getModelDefinition(modelConstructor), keyField, identifierOrCriteria);
1460
+ if (modelConstructor && typeof identifierOrCriteria === 'string') {
1461
+ var buildIdPredicate = function (seed) { return seed.id.eq(identifierOrCriteria); };
1462
+ executivePredicate = next_1.internals(buildIdPredicate(buildSeedPredicate(modelConstructor)));
1073
1463
  }
1074
- else {
1075
- if (predicates_1.isPredicatesAll(identifierOrCriteria)) {
1076
- predicate = undefined;
1077
- }
1078
- else {
1079
- predicate =
1080
- modelConstructor &&
1081
- predicates_1.ModelPredicateCreator.createFromExisting(getModelDefinition(modelConstructor), identifierOrCriteria);
1082
- }
1464
+ else if (modelConstructor && typeof identifierOrCriteria === 'function') {
1465
+ executivePredicate = next_1.internals(identifierOrCriteria(buildSeedPredicate(modelConstructor)));
1083
1466
  }
1084
1467
  return new zen_observable_ts_1.default(function (observer) {
1085
- var handle;
1468
+ var source;
1086
1469
  _this.runningProcesses
1087
- .add(function () { return __awaiter(_this, void 0, void 0, function () {
1470
+ .add(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1088
1471
  var _this = this;
1089
- return __generator(this, function (_a) {
1472
+ return tslib_1.__generator(this, function (_a) {
1090
1473
  switch (_a.label) {
1091
1474
  case 0: return [4 /*yield*/, this.start()];
1092
1475
  case 1:
1093
1476
  _a.sent();
1094
1477
  // Filter the events returned by Storage according to namespace,
1095
1478
  // append original element data, and subscribe to the observable
1096
- handle = this.storage
1097
- .observe(modelConstructor, predicate)
1479
+ source = this.storage.observe(modelConstructor)
1098
1480
  .filter(function (_a) {
1099
1481
  var model = _a.model;
1100
1482
  return namespaceResolver(model) === util_1.USER;
@@ -1102,10 +1484,10 @@ var DataStore = /** @class */ (function () {
1102
1484
  .subscribe({
1103
1485
  next: function (item) {
1104
1486
  return _this.runningProcesses.isOpen &&
1105
- _this.runningProcesses.add(function () { return __awaiter(_this, void 0, void 0, function () {
1106
- var message, modelDefinition, keyFields, primaryKeysAndValues, freshElement;
1107
- return __generator(this, function (_a) {
1108
- switch (_a.label) {
1487
+ _this.runningProcesses.add(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1488
+ var message, modelDefinition, keyFields, primaryKeysAndValues, freshElement, _a;
1489
+ return tslib_1.__generator(this, function (_b) {
1490
+ switch (_b.label) {
1109
1491
  case 0:
1110
1492
  message = item;
1111
1493
  if (!(item.opType !== 'DELETE')) return [3 /*break*/, 2];
@@ -1114,11 +1496,20 @@ var DataStore = /** @class */ (function () {
1114
1496
  primaryKeysAndValues = util_1.extractPrimaryKeysAndValues(item.element, keyFields);
1115
1497
  return [4 /*yield*/, this.query(item.model, primaryKeysAndValues)];
1116
1498
  case 1:
1117
- freshElement = _a.sent();
1118
- message = __assign(__assign({}, message), { element: freshElement });
1119
- _a.label = 2;
1499
+ freshElement = _b.sent();
1500
+ message = tslib_1.__assign(tslib_1.__assign({}, message), { element: freshElement });
1501
+ _b.label = 2;
1120
1502
  case 2:
1121
- observer.next(message);
1503
+ _a = !executivePredicate;
1504
+ if (_a) return [3 /*break*/, 4];
1505
+ return [4 /*yield*/, executivePredicate.matches(message.element)];
1506
+ case 3:
1507
+ _a = (_b.sent());
1508
+ _b.label = 4;
1509
+ case 4:
1510
+ if (_a) {
1511
+ observer.next(message);
1512
+ }
1122
1513
  return [2 /*return*/];
1123
1514
  }
1124
1515
  });
@@ -1138,10 +1529,10 @@ var DataStore = /** @class */ (function () {
1138
1529
  // better than no cleaner, but if the subscriber is handling the
1139
1530
  // complete() message async and not registering with the context,
1140
1531
  // this will still be problematic.
1141
- return _this.runningProcesses.addCleaner(function () { return __awaiter(_this, void 0, void 0, function () {
1142
- return __generator(this, function (_a) {
1143
- if (handle) {
1144
- handle.unsubscribe();
1532
+ return _this.runningProcesses.addCleaner(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1533
+ return tslib_1.__generator(this, function (_a) {
1534
+ if (source) {
1535
+ source.unsubscribe();
1145
1536
  }
1146
1537
  return [2 /*return*/];
1147
1538
  });
@@ -1154,7 +1545,8 @@ var DataStore = /** @class */ (function () {
1154
1545
  var itemsChanged = new Map();
1155
1546
  var deletedItemIds = [];
1156
1547
  var handle;
1157
- var predicate;
1548
+ // let predicate: ModelPredicate<T> | undefined;
1549
+ var executivePredicate;
1158
1550
  /**
1159
1551
  * As the name suggests, this geneates a snapshot in the form of
1160
1552
  * `{items: T[], isSynced: boolean}`
@@ -1179,26 +1571,20 @@ var DataStore = /** @class */ (function () {
1179
1571
  var sort = (options || {}).sort;
1180
1572
  var sortOptions = sort ? { sort: sort } : undefined;
1181
1573
  var modelDefinition = getModelDefinition(model);
1182
- var keyFields = util_1.extractPrimaryKeyFieldNames(modelDefinition);
1183
- if (isQueryOne(criteria)) {
1184
- predicate = predicates_1.ModelPredicateCreator.createForSingleField(modelDefinition, keyFields[0], criteria);
1574
+ if (!modelDefinition) {
1575
+ throw new Error('Could not find model definition.');
1185
1576
  }
1186
- else {
1187
- if (predicates_1.isPredicatesAll(criteria)) {
1188
- // Predicates.ALL means "all records", so no predicate (undefined)
1189
- predicate = undefined;
1190
- }
1191
- else {
1192
- predicate = predicates_1.ModelPredicateCreator.createFromExisting(modelDefinition, criteria);
1193
- }
1577
+ if (model && typeof criteria === 'function') {
1578
+ executivePredicate = next_1.internals(criteria(buildSeedPredicate(model)));
1579
+ }
1580
+ else if (predicates_1.isPredicatesAll(criteria)) {
1581
+ executivePredicate = undefined;
1194
1582
  }
1195
- var _a = predicates_1.ModelPredicateCreator.getPredicates(predicate, false) || {}, predicates = _a.predicates, predicateGroupType = _a.type;
1196
- var hasPredicate = !!predicates;
1197
1583
  _this.runningProcesses
1198
- .add(function () { return __awaiter(_this, void 0, void 0, function () {
1584
+ .add(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1199
1585
  var err_1;
1200
1586
  var _this = this;
1201
- return __generator(this, function (_a) {
1587
+ return tslib_1.__generator(this, function (_a) {
1202
1588
  switch (_a.label) {
1203
1589
  case 0:
1204
1590
  _a.trys.push([0, 2, , 3]);
@@ -1216,42 +1602,58 @@ var DataStore = /** @class */ (function () {
1216
1602
  // We need to explicitly remove those items from the existing snapshot.
1217
1603
  handle = this.observe(model).subscribe(function (_a) {
1218
1604
  var element = _a.element, model = _a.model, opType = _a.opType;
1219
- var _b, _c;
1220
- var itemModelDefinition = getModelDefinition(model);
1221
- var idOrPk = utils_1.getIdentifierValue(itemModelDefinition, element);
1222
- if (hasPredicate &&
1223
- !util_1.validatePredicate(element, predicateGroupType, predicates)) {
1224
- if (opType === 'UPDATE' &&
1225
- (items.has(idOrPk) || itemsChanged.has(idOrPk))) {
1226
- // tracking as a "deleted item" will include the item in
1227
- // page limit calculations and ensure it is removed from the
1228
- // final items collection, regardless of which collection(s)
1229
- // it is currently in. (I mean, it could be in both, right!?)
1230
- deletedItemIds.push(idOrPk);
1231
- }
1232
- else {
1233
- // ignore updates for irrelevant/filtered items.
1234
- return;
1235
- }
1236
- }
1237
- // Flag items which have been recently deleted
1238
- // NOTE: Merging of separate operations to the same model instance is handled upstream
1239
- // in the `mergePage` method within src/sync/merger.ts. The final state of a model instance
1240
- // depends on the LATEST record (for a given id).
1241
- if (opType === 'DELETE') {
1242
- deletedItemIds.push(idOrPk);
1243
- }
1244
- else {
1245
- itemsChanged.set(idOrPk, element);
1246
- }
1247
- var isSynced = (_c = (_b = _this.sync) === null || _b === void 0 ? void 0 : _b.getModelSyncedStatus(model)) !== null && _c !== void 0 ? _c : false;
1248
- var limit = itemsChanged.size - deletedItemIds.length >=
1249
- _this.syncPageSize;
1250
- if (limit || isSynced) {
1251
- limitTimerRace.resolve();
1252
- }
1253
- // kicks off every subsequent race as results sync down
1254
- limitTimerRace.start();
1605
+ return _this.runningProcesses.isOpen &&
1606
+ _this.runningProcesses.add(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1607
+ var itemModelDefinition, idOrPk, _a, isSynced, limit;
1608
+ var _b, _c;
1609
+ return tslib_1.__generator(this, function (_d) {
1610
+ switch (_d.label) {
1611
+ case 0:
1612
+ itemModelDefinition = getModelDefinition(model);
1613
+ idOrPk = utils_1.getIdentifierValue(itemModelDefinition, element);
1614
+ _a = executivePredicate;
1615
+ if (!_a) return [3 /*break*/, 2];
1616
+ return [4 /*yield*/, executivePredicate.matches(element)];
1617
+ case 1:
1618
+ _a = !(_d.sent());
1619
+ _d.label = 2;
1620
+ case 2:
1621
+ if (_a) {
1622
+ if (opType === 'UPDATE' &&
1623
+ (items.has(idOrPk) || itemsChanged.has(idOrPk))) {
1624
+ // tracking as a "deleted item" will include the item in
1625
+ // page limit calculations and ensure it is removed from the
1626
+ // final items collection, regardless of which collection(s)
1627
+ // it is currently in. (I mean, it could be in both, right!?)
1628
+ deletedItemIds.push(idOrPk);
1629
+ }
1630
+ else {
1631
+ // ignore updates for irrelevant/filtered items.
1632
+ return [2 /*return*/];
1633
+ }
1634
+ }
1635
+ // Flag items which have been recently deleted
1636
+ // NOTE: Merging of separate operations to the same model instance is handled upstream
1637
+ // in the `mergePage` method within src/sync/merger.ts. The final state of a model instance
1638
+ // depends on the LATEST record (for a given id).
1639
+ if (opType === 'DELETE') {
1640
+ deletedItemIds.push(idOrPk);
1641
+ }
1642
+ else {
1643
+ itemsChanged.set(idOrPk, element);
1644
+ }
1645
+ isSynced = (_c = (_b = this.sync) === null || _b === void 0 ? void 0 : _b.getModelSyncedStatus(model)) !== null && _c !== void 0 ? _c : false;
1646
+ limit = itemsChanged.size - deletedItemIds.length >=
1647
+ this.syncPageSize;
1648
+ if (limit || isSynced) {
1649
+ limitTimerRace.resolve();
1650
+ }
1651
+ // kicks off every subsequent race as results sync down
1652
+ limitTimerRace.start();
1653
+ return [2 /*return*/];
1654
+ }
1655
+ });
1656
+ }); }, 'handle observeQuery observed event');
1255
1657
  });
1256
1658
  // returns a set of initial/locally-available results
1257
1659
  generateAndEmitSnapshot();
@@ -1277,7 +1679,7 @@ var DataStore = /** @class */ (function () {
1277
1679
  var generateSnapshot = function () {
1278
1680
  var _a, _b;
1279
1681
  var isSynced = (_b = (_a = _this.sync) === null || _a === void 0 ? void 0 : _a.getModelSyncedStatus(model)) !== null && _b !== void 0 ? _b : false;
1280
- var itemsArray = __spread(Array.from(items.values()), Array.from(itemsChanged.values()));
1682
+ var itemsArray = tslib_1.__spread(Array.from(items.values()), Array.from(itemsChanged.values()));
1281
1683
  if (options === null || options === void 0 ? void 0 : options.sort) {
1282
1684
  sortItems(itemsArray);
1283
1685
  }
@@ -1344,8 +1746,8 @@ var DataStore = /** @class */ (function () {
1344
1746
  }
1345
1747
  };
1346
1748
  core_1.Hub.listen('datastore', hubCallback);
1347
- return _this.runningProcesses.addCleaner(function () { return __awaiter(_this, void 0, void 0, function () {
1348
- return __generator(this, function (_a) {
1749
+ return _this.runningProcesses.addCleaner(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1750
+ return tslib_1.__generator(this, function (_a) {
1349
1751
  if (handle) {
1350
1752
  handle.unsubscribe();
1351
1753
  }
@@ -1359,8 +1761,8 @@ var DataStore = /** @class */ (function () {
1359
1761
  _this.amplifyContext.Auth = _this.Auth;
1360
1762
  _this.amplifyContext.API = _this.API;
1361
1763
  _this.amplifyContext.Cache = _this.Cache;
1362
- var configDataStore = config.DataStore, configAuthModeStrategyType = config.authModeStrategyType, configConflictHandler = config.conflictHandler, configErrorHandler = config.errorHandler, configMaxRecordsToSync = config.maxRecordsToSync, configSyncPageSize = config.syncPageSize, configFullSyncInterval = config.fullSyncInterval, configSyncExpressions = config.syncExpressions, configAuthProviders = config.authProviders, configStorageAdapter = config.storageAdapter, configFromAmplify = __rest(config, ["DataStore", "authModeStrategyType", "conflictHandler", "errorHandler", "maxRecordsToSync", "syncPageSize", "fullSyncInterval", "syncExpressions", "authProviders", "storageAdapter"]);
1363
- _this.amplifyConfig = __assign(__assign({}, configFromAmplify), _this.amplifyConfig);
1764
+ var configDataStore = config.DataStore, configAuthModeStrategyType = config.authModeStrategyType, configConflictHandler = config.conflictHandler, configErrorHandler = config.errorHandler, configMaxRecordsToSync = config.maxRecordsToSync, configSyncPageSize = config.syncPageSize, configFullSyncInterval = config.fullSyncInterval, configSyncExpressions = config.syncExpressions, configAuthProviders = config.authProviders, configStorageAdapter = config.storageAdapter, configFromAmplify = tslib_1.__rest(config, ["DataStore", "authModeStrategyType", "conflictHandler", "errorHandler", "maxRecordsToSync", "syncPageSize", "fullSyncInterval", "syncExpressions", "authProviders", "storageAdapter"]);
1765
+ _this.amplifyConfig = tslib_1.__assign(tslib_1.__assign({}, configFromAmplify), _this.amplifyConfig);
1364
1766
  _this.conflictHandler = _this.setConflictHandler(config);
1365
1767
  _this.errorHandler = _this.setErrorHandler(config);
1366
1768
  var authModeStrategyType = (configDataStore && configDataStore.authModeStrategyType) ||
@@ -1453,8 +1855,8 @@ var DataStore = /** @class */ (function () {
1453
1855
  * DataStore, such as `query()`, `save()`, or `delete()`.
1454
1856
  */
1455
1857
  DataStore.prototype.clear = function () {
1456
- return __awaiter(this, void 0, void 0, function () {
1457
- return __generator(this, function (_a) {
1858
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
1859
+ return tslib_1.__generator(this, function (_a) {
1458
1860
  switch (_a.label) {
1459
1861
  case 0:
1460
1862
  checkSchemaInitialized();
@@ -1501,8 +1903,8 @@ var DataStore = /** @class */ (function () {
1501
1903
  * running queries and terminates subscriptions."
1502
1904
  */
1503
1905
  DataStore.prototype.stop = function () {
1504
- return __awaiter(this, void 0, void 0, function () {
1505
- return __generator(this, function (_a) {
1906
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
1907
+ return tslib_1.__generator(this, function (_a) {
1506
1908
  switch (_a.label) {
1507
1909
  case 0:
1508
1910
  this.state = DataStoreState.Stopping;
@@ -1562,7 +1964,7 @@ var DataStore = /** @class */ (function () {
1562
1964
  }
1563
1965
  }
1564
1966
  if (sort) {
1565
- sortPredicate = predicates_1.ModelSortPredicateCreator.createFromExisting(modelDefinition, paginationProducer.sort);
1967
+ sortPredicate = predicates_1.ModelSortPredicateCreator.createFromExisting(modelDefinition, sort);
1566
1968
  }
1567
1969
  return {
1568
1970
  limit: limit,
@@ -1575,18 +1977,18 @@ var DataStore = /** @class */ (function () {
1575
1977
  * SchemaModel -> predicate to use during sync.
1576
1978
  */
1577
1979
  DataStore.prototype.processSyncExpressions = function () {
1578
- return __awaiter(this, void 0, void 0, function () {
1980
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
1579
1981
  var syncPredicates;
1580
1982
  var _this = this;
1581
- return __generator(this, function (_a) {
1983
+ return tslib_1.__generator(this, function (_a) {
1582
1984
  switch (_a.label) {
1583
1985
  case 0:
1584
1986
  if (!this.syncExpressions || !this.syncExpressions.length) {
1585
1987
  return [2 /*return*/, new WeakMap()];
1586
1988
  }
1587
- return [4 /*yield*/, Promise.all(this.syncExpressions.map(function (syncExpression) { return __awaiter(_this, void 0, void 0, function () {
1989
+ return [4 /*yield*/, Promise.all(this.syncExpressions.map(function (syncExpression) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
1588
1990
  var _a, modelConstructor, conditionProducer, modelDefinition, condition, predicate;
1589
- return __generator(this, function (_b) {
1991
+ return tslib_1.__generator(this, function (_b) {
1590
1992
  switch (_b.label) {
1591
1993
  case 0: return [4 /*yield*/, syncExpression];
1592
1994
  case 1:
@@ -1598,7 +2000,11 @@ var DataStore = /** @class */ (function () {
1598
2000
  if (predicates_1.isPredicatesAll(condition)) {
1599
2001
  return [2 /*return*/, [modelDefinition, null]];
1600
2002
  }
1601
- predicate = this.createFromCondition(modelDefinition, condition);
2003
+ predicate = next_1.internals(condition(next_1.predicateFor({
2004
+ builder: modelConstructor,
2005
+ schema: modelDefinition,
2006
+ pkField: util_1.extractPrimaryKeyFieldNames(modelDefinition),
2007
+ }))).toStoragePredicate();
1602
2008
  return [2 /*return*/, [modelDefinition, predicate]];
1603
2009
  }
1604
2010
  });
@@ -1620,16 +2026,16 @@ var DataStore = /** @class */ (function () {
1620
2026
  }
1621
2027
  };
1622
2028
  DataStore.prototype.unwrapPromise = function (conditionProducer) {
1623
- return __awaiter(this, void 0, void 0, function () {
2029
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
1624
2030
  var condition, error_1;
1625
- return __generator(this, function (_a) {
2031
+ return tslib_1.__generator(this, function (_a) {
1626
2032
  switch (_a.label) {
1627
2033
  case 0:
1628
2034
  _a.trys.push([0, 2, , 3]);
1629
2035
  return [4 /*yield*/, conditionProducer()];
1630
2036
  case 1:
1631
2037
  condition = _a.sent();
1632
- return [2 /*return*/, condition];
2038
+ return [2 /*return*/, condition || conditionProducer];
1633
2039
  case 2:
1634
2040
  error_1 = _a.sent();
1635
2041
  if (error_1 instanceof TypeError) {
@@ -1643,7 +2049,7 @@ var DataStore = /** @class */ (function () {
1643
2049
  };
1644
2050
  DataStore.prototype.weakMapFromEntries = function (entries) {
1645
2051
  return entries.reduce(function (map, _a) {
1646
- var _b = __read(_a, 2), modelDefinition = _b[0], predicate = _b[1];
2052
+ var _b = tslib_1.__read(_a, 2), modelDefinition = _b[0], predicate = _b[1];
1647
2053
  if (map.has(modelDefinition)) {
1648
2054
  var name_2 = modelDefinition.name;
1649
2055
  logger.warn("You can only utilize one Sync Expression per model.\n Subsequent sync expressions for the " + name_2 + " model will be ignored.");
@@ -1665,7 +2071,7 @@ var DataStore = /** @class */ (function () {
1665
2071
  if (sessionId) {
1666
2072
  var aws_appsync_graphqlEndpoint = this.amplifyConfig.aws_appsync_graphqlEndpoint;
1667
2073
  var appSyncUrl = aws_appsync_graphqlEndpoint.split('/')[2];
1668
- var _a = __read(appSyncUrl.split('.'), 1), appSyncId = _a[0];
2074
+ var _a = tslib_1.__read(appSyncUrl.split('.'), 1), appSyncId = _a[0];
1669
2075
  return sessionId + "-" + appSyncId;
1670
2076
  }
1671
2077
  }