@aws-amplify/api-graphql 4.0.1-api-v6-models.3eb7748.0 → 4.0.1-api-v6-models.01b2bb8.0

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.
@@ -42,6 +42,10 @@ export declare const graphQLOperationsInfo: {
42
42
  operationPrefix: "onDelete";
43
43
  usePlural: boolean;
44
44
  };
45
+ OBSERVE_QUERY: {
46
+ operationPrefix: "observeQuery";
47
+ usePlural: boolean;
48
+ };
45
49
  };
46
50
  export type ModelOperation = keyof typeof graphQLOperationsInfo;
47
51
  /**
@@ -145,9 +145,10 @@ exports.graphQLOperationsInfo = {
145
145
  ONCREATE: { operationPrefix: 'onCreate', usePlural: false },
146
146
  ONUPDATE: { operationPrefix: 'onUpdate', usePlural: false },
147
147
  ONDELETE: { operationPrefix: 'onDelete', usePlural: false },
148
+ OBSERVE_QUERY: { operationPrefix: 'observeQuery', usePlural: false },
148
149
  };
149
150
  var graphQLDocumentsCache = new Map();
150
- var SELECTION_SET_ALL_NESTED = '*';
151
+ var SELECTION_SET_WILDCARD = '*';
151
152
  function defaultSelectionSetForModel(modelDefinition) {
152
153
  // fields that are explicitly part of the graphql schema; not
153
154
  // inferred from owner auth rules.
@@ -184,71 +185,54 @@ var FIELD_IR = '';
184
185
  * ```
185
186
  */
186
187
  function customSelectionSetToIR(modelIntrospection, modelName, selectionSet) {
187
- var e_2, _a;
188
- var _b, _c, _d, _e;
189
188
  var modelDefinition = modelIntrospection[modelName];
190
- var fields = modelDefinition.fields;
191
- var intermediateSelectionSet = {};
192
- try {
193
- for (var selectionSet_1 = tslib_1.__values(selectionSet), selectionSet_1_1 = selectionSet_1.next(); !selectionSet_1_1.done; selectionSet_1_1 = selectionSet_1.next()) {
194
- var f = selectionSet_1_1.value;
195
- var nested = f.includes('.');
196
- if (nested) {
197
- var _f = tslib_1.__read(f.split('.'), 2), modelFieldName = _f[0], selectedField = _f[1];
198
- var relatedModel = (_c = (_b = fields[modelFieldName]) === null || _b === void 0 ? void 0 : _b.type) === null || _c === void 0 ? void 0 : _c.model;
199
- if (!relatedModel) {
200
- // TODO: may need to change this to support custom types
201
- throw Error("".concat(modelFieldName, " is not a model field"));
202
- }
203
- if (selectedField === SELECTION_SET_ALL_NESTED) {
204
- var relatedModelDefinition = modelIntrospection[relatedModel];
205
- var defaultSelectionSet = defaultSelectionSetForModel(relatedModelDefinition);
206
- var reduced = defaultSelectionSet.reduce(function (acc, curVal) {
207
- acc[curVal] = FIELD_IR;
208
- return acc;
209
- }, {});
210
- if ((_d = fields[modelFieldName]) === null || _d === void 0 ? void 0 : _d.isArray) {
211
- intermediateSelectionSet[modelFieldName] = {
212
- items: reduced,
213
- };
214
- }
215
- else {
216
- intermediateSelectionSet[modelFieldName] = reduced;
217
- }
218
- }
219
- else {
220
- var getNestedSelSet = customSelectionSetToIR(modelIntrospection, relatedModel, [selectedField]);
221
- if ((_e = fields[modelFieldName]) === null || _e === void 0 ? void 0 : _e.isArray) {
222
- var existing = intermediateSelectionSet[modelFieldName] || { items: {} };
223
- var merged = tslib_1.__assign(tslib_1.__assign({}, existing.items), getNestedSelSet);
224
- intermediateSelectionSet[modelFieldName] = { items: merged };
225
- }
226
- else {
227
- var existingItems = intermediateSelectionSet[modelFieldName] || {};
228
- var merged = tslib_1.__assign(tslib_1.__assign({}, existingItems), getNestedSelSet);
229
- intermediateSelectionSet[modelFieldName] = merged;
230
- }
231
- }
189
+ var modelFields = modelDefinition.fields;
190
+ return selectionSet.reduce(function (resultObj, path) {
191
+ var _a, _b, _c;
192
+ var _d = tslib_1.__read(path.split('.')), fieldName = _d[0], nested = _d[1], rest = _d.slice(2);
193
+ if (nested) {
194
+ var relatedModel = (_b = (_a = modelFields[fieldName]) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.model;
195
+ if (!relatedModel) {
196
+ // TODO: may need to change this to support custom types
197
+ throw Error("".concat(fieldName, " is not a model field"));
232
198
  }
233
- else {
234
- var exists = Boolean(fields[f]);
235
- if (!exists) {
236
- throw Error("".concat(f, " is not a field of model ").concat(modelName));
237
- }
238
- intermediateSelectionSet[f] = FIELD_IR;
199
+ var relatedModelDefinition = modelIntrospection[relatedModel];
200
+ var selectionSet_1 = nested === SELECTION_SET_WILDCARD
201
+ ? defaultSelectionSetIR(relatedModelDefinition)
202
+ : // if we have a path like 'field.anotherField' recursively build up selection set IR
203
+ customSelectionSetToIR(modelIntrospection, relatedModel, [
204
+ tslib_1.__spreadArray([nested], tslib_1.__read(rest), false).join('.'),
205
+ ]);
206
+ if ((_c = modelFields[fieldName]) === null || _c === void 0 ? void 0 : _c.isArray) {
207
+ var existing = resultObj[fieldName] || {
208
+ items: {},
209
+ };
210
+ var merged_1 = tslib_1.__assign(tslib_1.__assign({}, existing.items), selectionSet_1);
211
+ resultObj[fieldName] = { items: merged_1 };
212
+ return resultObj;
239
213
  }
214
+ var existingItems = resultObj[fieldName] || {};
215
+ var merged = tslib_1.__assign(tslib_1.__assign({}, existingItems), selectionSet_1);
216
+ resultObj[fieldName] = merged;
217
+ return resultObj;
240
218
  }
241
- }
242
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
243
- finally {
244
- try {
245
- if (selectionSet_1_1 && !selectionSet_1_1.done && (_a = selectionSet_1.return)) _a.call(selectionSet_1);
219
+ var exists = Boolean(modelFields[fieldName]);
220
+ if (!exists) {
221
+ throw Error("".concat(fieldName, " is not a field of model ").concat(modelName));
246
222
  }
247
- finally { if (e_2) throw e_2.error; }
248
- }
249
- return intermediateSelectionSet;
223
+ resultObj[fieldName] = FIELD_IR;
224
+ return resultObj;
225
+ }, {});
250
226
  }
251
227
  exports.customSelectionSetToIR = customSelectionSetToIR;
228
+ var defaultSelectionSetIR = function (relatedModelDefinition) {
229
+ var defaultSelectionSet = defaultSelectionSetForModel(relatedModelDefinition);
230
+ var reduced = defaultSelectionSet.reduce(function (acc, curVal) {
231
+ acc[curVal] = FIELD_IR;
232
+ return acc;
233
+ }, {});
234
+ return reduced;
235
+ };
252
236
  /**
253
237
  * Stringifies selection set IR
254
238
  * * @example
@@ -334,9 +318,11 @@ function generateGraphQLDocument(modelIntrospection, modelName, modelOperation,
334
318
  case 'LIST':
335
319
  graphQLArguments !== null && graphQLArguments !== void 0 ? graphQLArguments : (graphQLArguments = {
336
320
  filter: "Model".concat(name, "FilterInput"),
321
+ limit: 'Int',
322
+ nextToken: 'String',
337
323
  });
338
324
  graphQLOperationType !== null && graphQLOperationType !== void 0 ? graphQLOperationType : (graphQLOperationType = 'query');
339
- graphQLSelectionSet !== null && graphQLSelectionSet !== void 0 ? graphQLSelectionSet : (graphQLSelectionSet = "items { ".concat(selectionSetFields, " }"));
325
+ graphQLSelectionSet !== null && graphQLSelectionSet !== void 0 ? graphQLSelectionSet : (graphQLSelectionSet = "items { ".concat(selectionSetFields, " } nextToken __typename"));
340
326
  case 'ONCREATE':
341
327
  case 'ONUPDATE':
342
328
  case 'ONDELETE':
@@ -345,6 +331,10 @@ function generateGraphQLDocument(modelIntrospection, modelName, modelOperation,
345
331
  });
346
332
  graphQLOperationType !== null && graphQLOperationType !== void 0 ? graphQLOperationType : (graphQLOperationType = 'subscription');
347
333
  graphQLSelectionSet !== null && graphQLSelectionSet !== void 0 ? graphQLSelectionSet : (graphQLSelectionSet = selectionSetFields);
334
+ break;
335
+ case 'OBSERVE_QUERY':
336
+ default:
337
+ throw new Error('Internal error: Attempted to generate graphql document for observeQuery. Please report this error.');
348
338
  }
349
339
  var graphQLDocument = "".concat(graphQLOperationType).concat(graphQLArguments
350
340
  ? "(".concat(Object.entries(graphQLArguments).map(function (_a) {
@@ -393,6 +383,13 @@ function buildGraphQLVariables(modelDefinition, operation, arg, modelIntrospecti
393
383
  }
394
384
  break;
395
385
  case 'LIST':
386
+ if (arg === null || arg === void 0 ? void 0 : arg.filter) {
387
+ variables.filter = arg.filter;
388
+ }
389
+ if (arg === null || arg === void 0 ? void 0 : arg.nextToken) {
390
+ variables.nextToken = arg.nextToken;
391
+ }
392
+ break;
396
393
  case 'ONCREATE':
397
394
  case 'ONUPDATE':
398
395
  case 'ONDELETE':
@@ -400,6 +397,9 @@ function buildGraphQLVariables(modelDefinition, operation, arg, modelIntrospecti
400
397
  variables = { filter: arg.filter };
401
398
  }
402
399
  break;
400
+ case 'OBSERVE_QUERY':
401
+ throw new Error('Internal error: Attempted to build variables for observeQuery. Please report this error.');
402
+ break;
403
403
  default:
404
404
  var exhaustiveCheck = operation;
405
405
  throw new Error("Unhandled operation case: ".concat(exhaustiveCheck));
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateModelsProperty = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var APIClient_1 = require("./APIClient");
6
+ var utils_1 = require("../utils");
6
7
  var rxjs_1 = require("rxjs");
7
8
  function generateModelsProperty(client, params) {
8
9
  var e_1, _a;
@@ -22,7 +23,7 @@ function generateModelsProperty(client, params) {
22
23
  var operation = key;
23
24
  if (operation === 'LIST') {
24
25
  models[name_1][operationPrefix] = function (args) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
25
- var query, variables, _a, data, nextToken, extensions, _b, key_1, flattenedResult, initialized, error_1;
26
+ var query, variables, _a, data, extensions, _b, key_1, flattenedResult, initialized, error_1;
26
27
  return tslib_1.__generator(this, function (_c) {
27
28
  switch (_c.label) {
28
29
  case 0:
@@ -36,7 +37,7 @@ function generateModelsProperty(client, params) {
36
37
  variables: variables,
37
38
  })];
38
39
  case 2:
39
- _a = (_c.sent()), data = _a.data, nextToken = _a.nextToken, extensions = _a.extensions;
40
+ _a = (_c.sent()), data = _a.data, extensions = _a.extensions;
40
41
  // flatten response
41
42
  if (data !== undefined) {
42
43
  _b = tslib_1.__read(Object.keys(data), 1), key_1 = _b[0];
@@ -46,7 +47,7 @@ function generateModelsProperty(client, params) {
46
47
  if (args === null || args === void 0 ? void 0 : args.selectionSet) {
47
48
  return [2 /*return*/, {
48
49
  data: flattenedResult,
49
- nextToken: nextToken,
50
+ nextToken: data[key_1].nextToken,
50
51
  extensions: extensions,
51
52
  }];
52
53
  }
@@ -54,14 +55,14 @@ function generateModelsProperty(client, params) {
54
55
  initialized = (0, APIClient_1.initializeModel)(client, name_1, flattenedResult, modelIntrospection);
55
56
  return [2 /*return*/, {
56
57
  data: initialized,
57
- nextToken: nextToken,
58
+ nextToken: data[key_1].nextToken,
58
59
  extensions: extensions,
59
60
  }];
60
61
  }
61
62
  }
62
63
  return [2 /*return*/, {
63
64
  data: data[key_1],
64
- nextToken: nextToken,
65
+ nextToken: data[key_1].nextToken,
65
66
  extensions: extensions,
66
67
  }];
67
68
  }
@@ -96,6 +97,163 @@ function generateModelsProperty(client, params) {
96
97
  }));
97
98
  };
98
99
  }
100
+ else if (operation === 'OBSERVE_QUERY') {
101
+ models[name_1][operationPrefix] = function (arg, options) {
102
+ return new rxjs_1.Observable(function (subscriber) {
103
+ // what we'll be sending to our subscribers
104
+ var items = [];
105
+ // To enqueue subscription messages while we collect our initial
106
+ // result set.
107
+ var messageQueue = [];
108
+ // operation to take when message(s) arrive.
109
+ // this operation will be swapped out once initial "sync" is complete
110
+ // to immediately ingest messsages.
111
+ var receiveMessages = function () {
112
+ var messages = [];
113
+ for (var _i = 0; _i < arguments.length; _i++) {
114
+ messages[_i] = arguments[_i];
115
+ }
116
+ return messageQueue.push.apply(messageQueue, tslib_1.__spreadArray([], tslib_1.__read(messages), false));
117
+ };
118
+ // start subscriptions
119
+ var onCreateSub = models[name_1]
120
+ .onCreate(arg, options)
121
+ .subscribe({
122
+ next: function (item) {
123
+ receiveMessages({ item: item, type: 'create' });
124
+ },
125
+ error: function (error) {
126
+ subscriber.error({ type: 'onCreate', error: error });
127
+ },
128
+ });
129
+ var onUpdateSub = models[name_1]
130
+ .onUpdate(arg, options)
131
+ .subscribe({
132
+ next: function (item) {
133
+ receiveMessages({ item: item, type: 'update' });
134
+ },
135
+ error: function (error) {
136
+ subscriber.error({ type: 'onUpdate', error: error });
137
+ },
138
+ });
139
+ var onDeleteSub = models[name_1]
140
+ .onDelete(arg, options)
141
+ .subscribe({
142
+ next: function (item) {
143
+ receiveMessages({ item: item, type: 'delete' });
144
+ },
145
+ error: function (error) {
146
+ subscriber.error({ type: 'onDelete', error: error });
147
+ },
148
+ });
149
+ // consumes a list of messages and sends a snapshot
150
+ function ingestMessages(messages) {
151
+ var e_2, _a;
152
+ try {
153
+ for (var messages_1 = tslib_1.__values(messages), messages_1_1 = messages_1.next(); !messages_1_1.done; messages_1_1 = messages_1.next()) {
154
+ var message = messages_1_1.value;
155
+ var idx = (0, utils_1.findIndexByFields)(message.item, items, pkFields);
156
+ switch (message.type) {
157
+ case 'create':
158
+ if (idx < 0)
159
+ items.push(message.item);
160
+ break;
161
+ case 'update':
162
+ if (idx >= 0)
163
+ items[idx] = message.item;
164
+ break;
165
+ case 'delete':
166
+ if (idx >= 0)
167
+ items.splice(idx, 1);
168
+ break;
169
+ default:
170
+ console.error('Unrecognized message in observeQuery.', message);
171
+ }
172
+ }
173
+ }
174
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
175
+ finally {
176
+ try {
177
+ if (messages_1_1 && !messages_1_1.done && (_a = messages_1.return)) _a.call(messages_1);
178
+ }
179
+ finally { if (e_2) throw e_2.error; }
180
+ }
181
+ subscriber.next({
182
+ items: items,
183
+ isSynced: true,
184
+ });
185
+ }
186
+ var pkFields = (0, utils_1.resolvePKFields)(model);
187
+ // initial results
188
+ (function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
189
+ var firstPage, nextToken, _a, page, errors, _nextToken, isSynced, errors_1, errors_1_1, error;
190
+ var e_3, _b;
191
+ return tslib_1.__generator(this, function (_c) {
192
+ switch (_c.label) {
193
+ case 0:
194
+ firstPage = true;
195
+ nextToken = null;
196
+ _c.label = 1;
197
+ case 1:
198
+ if (!(!subscriber.closed && (firstPage || nextToken))) return [3 /*break*/, 3];
199
+ firstPage = false;
200
+ return [4 /*yield*/, models[name_1].list(tslib_1.__assign(tslib_1.__assign({}, arg), { nextToken: nextToken }), options)];
201
+ case 2:
202
+ _a = _c.sent(), page = _a.data, errors = _a.errors, _nextToken = _a.nextToken;
203
+ nextToken = _nextToken;
204
+ items.push.apply(items, tslib_1.__spreadArray([], tslib_1.__read(page), false));
205
+ isSynced = messageQueue.length === 0 &&
206
+ (nextToken === null || nextToken === undefined);
207
+ subscriber.next({
208
+ items: items,
209
+ isSynced: isSynced,
210
+ });
211
+ if (Array.isArray(errors)) {
212
+ try {
213
+ for (errors_1 = (e_3 = void 0, tslib_1.__values(errors)), errors_1_1 = errors_1.next(); !errors_1_1.done; errors_1_1 = errors_1.next()) {
214
+ error = errors_1_1.value;
215
+ subscriber.error(error);
216
+ }
217
+ }
218
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
219
+ finally {
220
+ try {
221
+ if (errors_1_1 && !errors_1_1.done && (_b = errors_1.return)) _b.call(errors_1);
222
+ }
223
+ finally { if (e_3) throw e_3.error; }
224
+ }
225
+ }
226
+ return [3 /*break*/, 1];
227
+ case 3:
228
+ // play through the queue
229
+ if (messageQueue.length > 0) {
230
+ ingestMessages(messageQueue);
231
+ }
232
+ // switch the queue to write directly to the items collection
233
+ receiveMessages = function () {
234
+ var messages = [];
235
+ for (var _i = 0; _i < arguments.length; _i++) {
236
+ messages[_i] = arguments[_i];
237
+ }
238
+ ingestMessages(messages);
239
+ return items.length;
240
+ };
241
+ return [2 /*return*/];
242
+ }
243
+ });
244
+ }); })();
245
+ // when subscriber unsubscribes, tear down internal subs
246
+ return function () {
247
+ // 1. tear down internal subs
248
+ onCreateSub.unsubscribe();
249
+ onUpdateSub.unsubscribe();
250
+ onDeleteSub.unsubscribe();
251
+ // 2. there is no need to explicitly stop paging. instead, we
252
+ // just check `subscriber.closed` above before fetching each page.
253
+ };
254
+ });
255
+ };
256
+ }
99
257
  else {
100
258
  models[name_1][operationPrefix] = function (arg, options) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
101
259
  var query, variables, _a, data, extensions, _b, key_2, flattenedResult, _c, initialized, error_2;