@aws-amplify/api-graphql 4.0.1-console-preview.be08038.0 → 4.0.1-server-generate-client.1e317a1.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.
Files changed (80) hide show
  1. package/lib/GraphQLAPI.d.ts +2 -2
  2. package/lib/GraphQLAPI.js +4 -6
  3. package/lib/Providers/AWSAppSyncRealTimeProvider/index.d.ts +1 -1
  4. package/lib/Providers/AWSAppSyncRealTimeProvider/index.js +36 -36
  5. package/lib/Providers/constants.js +5 -4
  6. package/lib/index.js +5 -4
  7. package/lib/internals/APIClient.d.ts +101 -0
  8. package/lib/internals/APIClient.js +443 -0
  9. package/lib/internals/InternalGraphQLAPI.d.ts +2 -2
  10. package/lib/internals/InternalGraphQLAPI.js +35 -17
  11. package/lib/internals/generateClient.d.ts +12 -0
  12. package/lib/internals/generateClient.js +30 -0
  13. package/lib/internals/generateModelsProperty.d.ts +4 -0
  14. package/lib/internals/generateModelsProperty.js +169 -0
  15. package/lib/internals/index.d.ts +1 -0
  16. package/lib/internals/index.js +8 -5
  17. package/lib/internals/types.d.ts +10 -0
  18. package/lib/internals/types.js +2 -0
  19. package/lib/internals/v6.js +1 -0
  20. package/lib/tsconfig.tsbuildinfo +1 -6619
  21. package/lib/types/PubSub.d.ts +2 -2
  22. package/lib/types/PubSub.js +3 -2
  23. package/lib/types/index.d.ts +25 -22
  24. package/lib/types/index.js +4 -3
  25. package/lib/utils/ConnectionStateMonitor.d.ts +3 -3
  26. package/lib/utils/ConnectionStateMonitor.js +7 -6
  27. package/lib/utils/ReachabilityMonitor/index.d.ts +1 -1
  28. package/lib/utils/ReachabilityMonitor/index.js +3 -1
  29. package/lib/utils/ReachabilityMonitor/index.native.d.ts +1 -1
  30. package/lib/utils/ReachabilityMonitor/index.native.js +3 -1
  31. package/lib/utils/ReconnectionMonitor.js +2 -1
  32. package/lib/utils/errors/APIError.js +1 -0
  33. package/lib/utils/errors/assertValidationError.js +1 -0
  34. package/lib/utils/errors/index.js +5 -4
  35. package/lib/utils/errors/validation.js +2 -1
  36. package/lib/utils/index.js +3 -2
  37. package/lib/utils/resolveConfig.d.ts +1 -1
  38. package/lib/utils/resolveConfig.js +4 -2
  39. package/lib/utils/resolveLibraryOptions.d.ts +1 -1
  40. package/lib/utils/resolveLibraryOptions.js +3 -1
  41. package/lib/utils/resolveOwnerFields.d.ts +12 -0
  42. package/lib/utils/resolveOwnerFields.js +63 -0
  43. package/lib-esm/GraphQLAPI.d.ts +2 -2
  44. package/lib-esm/GraphQLAPI.js +1 -5
  45. package/lib-esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +1 -1
  46. package/lib-esm/Providers/AWSAppSyncRealTimeProvider/index.js +28 -29
  47. package/lib-esm/internals/APIClient.d.ts +101 -0
  48. package/lib-esm/internals/APIClient.js +432 -0
  49. package/lib-esm/internals/InternalGraphQLAPI.d.ts +2 -2
  50. package/lib-esm/internals/InternalGraphQLAPI.js +21 -5
  51. package/lib-esm/internals/generateClient.d.ts +12 -0
  52. package/lib-esm/internals/generateClient.js +26 -0
  53. package/lib-esm/internals/generateModelsProperty.d.ts +4 -0
  54. package/lib-esm/internals/generateModelsProperty.js +165 -0
  55. package/lib-esm/internals/index.d.ts +1 -0
  56. package/lib-esm/internals/index.js +1 -0
  57. package/lib-esm/internals/types.d.ts +10 -0
  58. package/lib-esm/internals/types.js +1 -0
  59. package/lib-esm/tsconfig.tsbuildinfo +1 -6619
  60. package/lib-esm/types/PubSub.d.ts +2 -2
  61. package/lib-esm/types/index.d.ts +25 -22
  62. package/lib-esm/utils/ConnectionStateMonitor.d.ts +3 -3
  63. package/lib-esm/utils/ConnectionStateMonitor.js +2 -2
  64. package/lib-esm/utils/ReachabilityMonitor/index.d.ts +1 -1
  65. package/lib-esm/utils/ReachabilityMonitor/index.native.d.ts +1 -1
  66. package/lib-esm/utils/resolveConfig.d.ts +1 -1
  67. package/lib-esm/utils/resolveLibraryOptions.d.ts +1 -1
  68. package/lib-esm/utils/resolveOwnerFields.d.ts +12 -0
  69. package/lib-esm/utils/resolveOwnerFields.js +59 -0
  70. package/package.json +12 -6
  71. package/src/GraphQLAPI.ts +2 -6
  72. package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +2 -3
  73. package/src/internals/APIClient.ts +583 -0
  74. package/src/internals/InternalGraphQLAPI.ts +35 -9
  75. package/src/internals/generateClient.ts +30 -0
  76. package/src/internals/generateModelsProperty.ts +192 -0
  77. package/src/internals/index.ts +1 -0
  78. package/src/internals/types.ts +15 -0
  79. package/src/types/index.ts +7 -1
  80. package/src/utils/resolveOwnerFields.ts +65 -0
@@ -0,0 +1,443 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeMutationInput = exports.buildGraphQLVariables = exports.generateGraphQLDocument = exports.generateSelectionSet = exports.selectionSetIRToString = exports.customSelectionSetToIR = exports.graphQLOperationsInfo = exports.initializeModel = exports.flattenItems = void 0;
4
+ var tslib_1 = require("tslib");
5
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
6
+ // SPDX-License-Identifier: Apache-2.0
7
+ var resolveOwnerFields_1 = require("../utils/resolveOwnerFields");
8
+ var connectionType = {
9
+ HAS_ONE: 'HAS_ONE',
10
+ HAS_MANY: 'HAS_MANY',
11
+ BELONGS_TO: 'BELONGS_TO',
12
+ };
13
+ /**
14
+ *
15
+ * @param GraphQL response object
16
+ * @returns response object with `items` properties flattened
17
+ */
18
+ var flattenItems = function (obj) {
19
+ var res = {};
20
+ Object.entries(obj).forEach(function (_a) {
21
+ var _b = tslib_1.__read(_a, 2), prop = _b[0], value = _b[1];
22
+ if (typeof value === 'object' && value !== null) {
23
+ if (value.items !== undefined) {
24
+ res[prop] = value.items.map(function (item) {
25
+ return (0, exports.flattenItems)(item);
26
+ });
27
+ return;
28
+ }
29
+ res[prop] = (0, exports.flattenItems)(value);
30
+ return;
31
+ }
32
+ res[prop] = value;
33
+ });
34
+ return res;
35
+ };
36
+ exports.flattenItems = flattenItems;
37
+ // TODO: this should accept single result to support CRUD methods; create helper for array/list
38
+ function initializeModel(client, modelName, result, modelIntrospection) {
39
+ var introModel = modelIntrospection.models[modelName];
40
+ var introModelFields = introModel.fields;
41
+ var modelFields = Object.entries(introModelFields)
42
+ .filter(function (_a) {
43
+ var _b;
44
+ var _c = tslib_1.__read(_a, 2), _ = _c[0], field = _c[1];
45
+ return ((_b = field === null || field === void 0 ? void 0 : field.type) === null || _b === void 0 ? void 0 : _b.model) !== undefined;
46
+ })
47
+ .map(function (_a) {
48
+ var _b = tslib_1.__read(_a, 1), fieldName = _b[0];
49
+ return fieldName;
50
+ });
51
+ return result.map(function (record) {
52
+ var e_1, _a;
53
+ var _b, _c;
54
+ var initializedRelationalFields = {};
55
+ var _loop_1 = function (field) {
56
+ var relatedModelName = introModelFields[field].type.model;
57
+ var relatedModel = modelIntrospection.models[relatedModelName];
58
+ var relatedModelPKFieldName = relatedModel.primaryKeyInfo.primaryKeyFieldName;
59
+ var relatedModelSKFieldNames = relatedModel.primaryKeyInfo.sortKeyFieldNames;
60
+ var relationType = introModelFields[field].association.connectionType;
61
+ var connectionFields = introModelFields[field].association.associatedWith;
62
+ var targetNames = ((_b = introModelFields[field].association) === null || _b === void 0 ? void 0 : _b.targetNames) || [];
63
+ switch (relationType) {
64
+ case connectionType.HAS_ONE:
65
+ case connectionType.BELONGS_TO:
66
+ var sortKeyValues_1 = relatedModelSKFieldNames.reduce(function (acc, curVal) {
67
+ if (record[curVal]) {
68
+ return (acc[curVal] = record[curVal]);
69
+ }
70
+ }, {});
71
+ initializedRelationalFields[field] = function () {
72
+ var _a;
73
+ if (record[targetNames[0]]) {
74
+ return client.models[relatedModelName].get(tslib_1.__assign((_a = {}, _a[relatedModelPKFieldName] = record[targetNames[0]], _a), sortKeyValues_1));
75
+ }
76
+ return undefined;
77
+ };
78
+ break;
79
+ case connectionType.HAS_MANY:
80
+ var parentPk_1 = introModel.primaryKeyInfo.primaryKeyFieldName;
81
+ var parentSK_1 = introModel.primaryKeyInfo.sortKeyFieldNames;
82
+ // M:N check - TODO: refactor
83
+ if ((_c = relatedModel.fields[connectionFields[0]]) === null || _c === void 0 ? void 0 : _c.type.model) {
84
+ var relatedTargetNames = relatedModel.fields[connectionFields[0]].association.targetNames;
85
+ var hasManyFilter_1 = relatedTargetNames.map(function (field, idx) {
86
+ var _a, _b;
87
+ if (idx === 0) {
88
+ return _a = {}, _a[field] = { eq: record[parentPk_1] }, _a;
89
+ }
90
+ return _b = {}, _b[field] = { eq: record[parentSK_1[idx - 1]] }, _b;
91
+ });
92
+ initializedRelationalFields[field] = function () {
93
+ if (record[parentPk_1]) {
94
+ return client.models[relatedModelName].list({
95
+ filter: { and: hasManyFilter_1 },
96
+ });
97
+ }
98
+ return [];
99
+ };
100
+ break;
101
+ }
102
+ var hasManyFilter_2 = connectionFields.map(function (field, idx) {
103
+ var _a, _b;
104
+ if (idx === 0) {
105
+ return _a = {}, _a[field] = { eq: record[parentPk_1] }, _a;
106
+ }
107
+ return _b = {}, _b[field] = { eq: record[parentSK_1[idx - 1]] }, _b;
108
+ });
109
+ initializedRelationalFields[field] = function () {
110
+ if (record[parentPk_1]) {
111
+ return client.models[relatedModelName].list({
112
+ filter: { and: hasManyFilter_2 },
113
+ });
114
+ }
115
+ return [];
116
+ };
117
+ break;
118
+ default:
119
+ break;
120
+ }
121
+ };
122
+ try {
123
+ for (var modelFields_1 = tslib_1.__values(modelFields), modelFields_1_1 = modelFields_1.next(); !modelFields_1_1.done; modelFields_1_1 = modelFields_1.next()) {
124
+ var field = modelFields_1_1.value;
125
+ _loop_1(field);
126
+ }
127
+ }
128
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
129
+ finally {
130
+ try {
131
+ if (modelFields_1_1 && !modelFields_1_1.done && (_a = modelFields_1.return)) _a.call(modelFields_1);
132
+ }
133
+ finally { if (e_1) throw e_1.error; }
134
+ }
135
+ return tslib_1.__assign(tslib_1.__assign({}, record), initializedRelationalFields);
136
+ });
137
+ }
138
+ exports.initializeModel = initializeModel;
139
+ exports.graphQLOperationsInfo = {
140
+ CREATE: { operationPrefix: 'create', usePlural: false },
141
+ READ: { operationPrefix: 'get', usePlural: false },
142
+ UPDATE: { operationPrefix: 'update', usePlural: false },
143
+ DELETE: { operationPrefix: 'delete', usePlural: false },
144
+ LIST: { operationPrefix: 'list', usePlural: true },
145
+ ONCREATE: { operationPrefix: 'onCreate', usePlural: false },
146
+ ONUPDATE: { operationPrefix: 'onUpdate', usePlural: false },
147
+ ONDELETE: { operationPrefix: 'onDelete', usePlural: false },
148
+ };
149
+ var graphQLDocumentsCache = new Map();
150
+ var SELECTION_SET_WILDCARD = '*';
151
+ function defaultSelectionSetForModel(modelDefinition) {
152
+ // fields that are explicitly part of the graphql schema; not
153
+ // inferred from owner auth rules.
154
+ var fields = modelDefinition.fields;
155
+ var explicitFields = Object.values(fields)
156
+ .map(function (_a) {
157
+ var type = _a.type, name = _a.name;
158
+ return typeof type === 'string' && name;
159
+ }) // Default selection set omits model fields
160
+ .filter(Boolean);
161
+ // fields used for owner auth rules that may or may not also
162
+ // be explicit on the model.
163
+ var ownerFields = (0, resolveOwnerFields_1.resolveOwnerFields)(modelDefinition);
164
+ return Array.from(new Set(explicitFields.concat(ownerFields)));
165
+ }
166
+ var FIELD_IR = '';
167
+ /**
168
+ * Generates nested Custom Selection Set IR from path
169
+ *
170
+ * @param modelIntrospection
171
+ * @param modelName
172
+ * @param selectionSet - array of object paths
173
+ * @example
174
+ * ### Given
175
+ * `selectionSet = ['id', 'comments.post.id']`
176
+ * ### Returns
177
+ * ```ts
178
+ * {
179
+ * id: '',
180
+ * comments: {
181
+ * items: { post: { id: '' } }
182
+ * }
183
+ * }
184
+ * ```
185
+ */
186
+ function customSelectionSetToIR(modelIntrospection, modelName, selectionSet) {
187
+ var modelDefinition = modelIntrospection[modelName];
188
+ var modelFields = modelDefinition.fields;
189
+ return selectionSet.reduce(function (resultObj, path) {
190
+ var _a, _b, _c;
191
+ var _d = tslib_1.__read(path.split('.')), fieldName = _d[0], nested = _d[1], rest = _d.slice(2);
192
+ if (nested) {
193
+ var relatedModel = (_b = (_a = modelFields[fieldName]) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.model;
194
+ if (!relatedModel) {
195
+ // TODO: may need to change this to support custom types
196
+ throw Error("".concat(fieldName, " is not a model field"));
197
+ }
198
+ var relatedModelDefinition = modelIntrospection[relatedModel];
199
+ var selectionSet_1 = nested === SELECTION_SET_WILDCARD
200
+ ? defaultSelectionSetIR(relatedModelDefinition)
201
+ : // if we have a path like 'field.anotherField' recursively build up selection set IR
202
+ customSelectionSetToIR(modelIntrospection, relatedModel, [
203
+ tslib_1.__spreadArray([nested], tslib_1.__read(rest), false).join('.'),
204
+ ]);
205
+ if ((_c = modelFields[fieldName]) === null || _c === void 0 ? void 0 : _c.isArray) {
206
+ var existing = resultObj[fieldName] || {
207
+ items: {},
208
+ };
209
+ var merged_1 = tslib_1.__assign(tslib_1.__assign({}, existing.items), selectionSet_1);
210
+ resultObj[fieldName] = { items: merged_1 };
211
+ return resultObj;
212
+ }
213
+ var existingItems = resultObj[fieldName] || {};
214
+ var merged = tslib_1.__assign(tslib_1.__assign({}, existingItems), selectionSet_1);
215
+ resultObj[fieldName] = merged;
216
+ return resultObj;
217
+ }
218
+ var exists = Boolean(modelFields[fieldName]);
219
+ if (!exists) {
220
+ throw Error("".concat(fieldName, " is not a field of model ").concat(modelName));
221
+ }
222
+ resultObj[fieldName] = FIELD_IR;
223
+ return resultObj;
224
+ }, {});
225
+ }
226
+ exports.customSelectionSetToIR = customSelectionSetToIR;
227
+ var defaultSelectionSetIR = function (relatedModelDefinition) {
228
+ var defaultSelectionSet = defaultSelectionSetForModel(relatedModelDefinition);
229
+ var reduced = defaultSelectionSet.reduce(function (acc, curVal) {
230
+ acc[curVal] = FIELD_IR;
231
+ return acc;
232
+ }, {});
233
+ return reduced;
234
+ };
235
+ /**
236
+ * Stringifies selection set IR
237
+ * * @example
238
+ * ### Given
239
+ * ```ts
240
+ * {
241
+ * id: '',
242
+ * comments: {
243
+ * items: { post: { id: '' } }
244
+ * }
245
+ * }
246
+ * ```
247
+ * ### Returns
248
+ * `'id comments { items { post { id } } }'`
249
+ */
250
+ function selectionSetIRToString(obj) {
251
+ var res = [];
252
+ Object.entries(obj).forEach(function (_a) {
253
+ var _b = tslib_1.__read(_a, 2), fieldName = _b[0], value = _b[1];
254
+ if (value === FIELD_IR) {
255
+ res.push(fieldName);
256
+ }
257
+ else if (typeof value === 'object' && value !== null) {
258
+ if (value === null || value === void 0 ? void 0 : value.items) {
259
+ res.push(fieldName, '{', 'items', '{', selectionSetIRToString(value.items), '}', '}');
260
+ }
261
+ else {
262
+ res.push(fieldName, '{', selectionSetIRToString(value), '}');
263
+ }
264
+ }
265
+ });
266
+ return res.join(' ');
267
+ }
268
+ exports.selectionSetIRToString = selectionSetIRToString;
269
+ function generateSelectionSet(modelIntrospection, modelName, selectionSet) {
270
+ var modelDefinition = modelIntrospection[modelName];
271
+ if (!selectionSet) {
272
+ return defaultSelectionSetForModel(modelDefinition).join(' ');
273
+ }
274
+ var selSetIr = customSelectionSetToIR(modelIntrospection, modelName, selectionSet);
275
+ var selSetString = selectionSetIRToString(selSetIr);
276
+ return selSetString;
277
+ }
278
+ exports.generateSelectionSet = generateSelectionSet;
279
+ function generateGraphQLDocument(modelIntrospection, modelName, modelOperation, listArgs) {
280
+ var _a;
281
+ var _b, _c;
282
+ var modelDefinition = modelIntrospection[modelName];
283
+ var name = modelDefinition.name, pluralName = modelDefinition.pluralName, fields = modelDefinition.fields, _d = modelDefinition.primaryKeyInfo, isCustomPrimaryKey = _d.isCustomPrimaryKey, primaryKeyFieldName = _d.primaryKeyFieldName, sortKeyFieldNames = _d.sortKeyFieldNames;
284
+ var _e = exports.graphQLOperationsInfo[modelOperation], operationPrefix = _e.operationPrefix, usePlural = _e.usePlural;
285
+ var selectionSet = (listArgs || {}).selectionSet;
286
+ var fromCache = (_b = graphQLDocumentsCache.get(name)) === null || _b === void 0 ? void 0 : _b.get(modelOperation);
287
+ if (fromCache !== undefined) {
288
+ return fromCache;
289
+ }
290
+ if (!graphQLDocumentsCache.has(name)) {
291
+ graphQLDocumentsCache.set(name, new Map());
292
+ }
293
+ var graphQLFieldName = "".concat(operationPrefix).concat(usePlural ? pluralName : name);
294
+ var graphQLOperationType;
295
+ var graphQLSelectionSet;
296
+ var graphQLArguments;
297
+ var selectionSetFields = generateSelectionSet(modelIntrospection, modelName, selectionSet);
298
+ switch (modelOperation) {
299
+ case 'CREATE':
300
+ case 'UPDATE':
301
+ case 'DELETE':
302
+ graphQLArguments !== null && graphQLArguments !== void 0 ? graphQLArguments : (graphQLArguments = {
303
+ input: "".concat(operationPrefix.charAt(0).toLocaleUpperCase() +
304
+ operationPrefix.slice(1)).concat(name, "Input!"),
305
+ });
306
+ graphQLOperationType !== null && graphQLOperationType !== void 0 ? graphQLOperationType : (graphQLOperationType = 'mutation');
307
+ case 'READ':
308
+ graphQLArguments !== null && graphQLArguments !== void 0 ? graphQLArguments : (graphQLArguments = isCustomPrimaryKey
309
+ ? tslib_1.__spreadArray([primaryKeyFieldName], tslib_1.__read(sortKeyFieldNames), false).reduce(function (acc, fieldName) {
310
+ acc[fieldName] = fields[fieldName].type;
311
+ return acc;
312
+ }, {})
313
+ : (_a = {},
314
+ _a[primaryKeyFieldName] = "".concat(fields[primaryKeyFieldName].type, "!"),
315
+ _a));
316
+ graphQLSelectionSet !== null && graphQLSelectionSet !== void 0 ? graphQLSelectionSet : (graphQLSelectionSet = selectionSetFields);
317
+ case 'LIST':
318
+ graphQLArguments !== null && graphQLArguments !== void 0 ? graphQLArguments : (graphQLArguments = {
319
+ filter: "Model".concat(name, "FilterInput"),
320
+ });
321
+ graphQLOperationType !== null && graphQLOperationType !== void 0 ? graphQLOperationType : (graphQLOperationType = 'query');
322
+ graphQLSelectionSet !== null && graphQLSelectionSet !== void 0 ? graphQLSelectionSet : (graphQLSelectionSet = "items { ".concat(selectionSetFields, " }"));
323
+ case 'ONCREATE':
324
+ case 'ONUPDATE':
325
+ case 'ONDELETE':
326
+ graphQLArguments !== null && graphQLArguments !== void 0 ? graphQLArguments : (graphQLArguments = {
327
+ filter: "ModelSubscription".concat(name, "FilterInput"),
328
+ });
329
+ graphQLOperationType !== null && graphQLOperationType !== void 0 ? graphQLOperationType : (graphQLOperationType = 'subscription');
330
+ graphQLSelectionSet !== null && graphQLSelectionSet !== void 0 ? graphQLSelectionSet : (graphQLSelectionSet = selectionSetFields);
331
+ }
332
+ var graphQLDocument = "".concat(graphQLOperationType).concat(graphQLArguments
333
+ ? "(".concat(Object.entries(graphQLArguments).map(function (_a) {
334
+ var _b = tslib_1.__read(_a, 2), fieldName = _b[0], type = _b[1];
335
+ return "$".concat(fieldName, ": ").concat(type);
336
+ }), ")")
337
+ : '', " { ").concat(graphQLFieldName).concat(graphQLArguments
338
+ ? "(".concat(Object.keys(graphQLArguments).map(function (fieldName) { return "".concat(fieldName, ": $").concat(fieldName); }), ")")
339
+ : '', " { ").concat(graphQLSelectionSet, " } }");
340
+ (_c = graphQLDocumentsCache.get(name)) === null || _c === void 0 ? void 0 : _c.set(modelOperation, graphQLDocument);
341
+ return graphQLDocument;
342
+ }
343
+ exports.generateGraphQLDocument = generateGraphQLDocument;
344
+ function buildGraphQLVariables(modelDefinition, operation, arg, modelIntrospection) {
345
+ var _a;
346
+ var fields = modelDefinition.fields, _b = modelDefinition.primaryKeyInfo, isCustomPrimaryKey = _b.isCustomPrimaryKey, primaryKeyFieldName = _b.primaryKeyFieldName, sortKeyFieldNames = _b.sortKeyFieldNames;
347
+ var variables = {};
348
+ // TODO: process input
349
+ switch (operation) {
350
+ case 'CREATE':
351
+ variables = {
352
+ input: normalizeMutationInput(arg, modelDefinition, modelIntrospection),
353
+ };
354
+ break;
355
+ case 'UPDATE':
356
+ // readonly fields are not updated
357
+ variables = {
358
+ input: Object.fromEntries(Object.entries(normalizeMutationInput(arg, modelDefinition, modelIntrospection)).filter(function (_a) {
359
+ var _b = tslib_1.__read(_a, 1), fieldName = _b[0];
360
+ var isReadOnly = fields[fieldName].isReadOnly;
361
+ return !isReadOnly;
362
+ })),
363
+ };
364
+ break;
365
+ case 'READ':
366
+ case 'DELETE':
367
+ // only identifiers are sent
368
+ variables = isCustomPrimaryKey
369
+ ? tslib_1.__spreadArray([primaryKeyFieldName], tslib_1.__read(sortKeyFieldNames), false).reduce(function (acc, fieldName) {
370
+ acc[fieldName] = arg[fieldName];
371
+ return acc;
372
+ }, {})
373
+ : (_a = {}, _a[primaryKeyFieldName] = arg[primaryKeyFieldName], _a);
374
+ if (operation === 'DELETE') {
375
+ variables = { input: variables };
376
+ }
377
+ break;
378
+ case 'LIST':
379
+ case 'ONCREATE':
380
+ case 'ONUPDATE':
381
+ case 'ONDELETE':
382
+ if (arg === null || arg === void 0 ? void 0 : arg.filter) {
383
+ variables = { filter: arg.filter };
384
+ }
385
+ break;
386
+ default:
387
+ var exhaustiveCheck = operation;
388
+ throw new Error("Unhandled operation case: ".concat(exhaustiveCheck));
389
+ }
390
+ return variables;
391
+ }
392
+ exports.buildGraphQLVariables = buildGraphQLVariables;
393
+ /**
394
+ * Iterates over mutation input values and resolves any model inputs to their corresponding join fields/values
395
+ *
396
+ * @example
397
+ * ### Usage
398
+ * ```ts
399
+ * const result = normalizeMutationInput({ post: post }, model, modelDefinition);
400
+ * ```
401
+ * ### Result
402
+ * ```ts
403
+ * { postId: "abc123" }
404
+ * ```
405
+ *
406
+ */
407
+ function normalizeMutationInput(mutationInput, model, modelDefinition) {
408
+ var fields = model.fields;
409
+ var normalized = {};
410
+ Object.entries(mutationInput).forEach(function (_a) {
411
+ var _b, _c, _d;
412
+ var _e = tslib_1.__read(_a, 2), inputFieldName = _e[0], inputValue = _e[1];
413
+ var relatedModelName = (_c = (_b = fields[inputFieldName]) === null || _b === void 0 ? void 0 : _b.type) === null || _c === void 0 ? void 0 : _c.model;
414
+ if (relatedModelName) {
415
+ var association_1 = (_d = fields[inputFieldName]) === null || _d === void 0 ? void 0 : _d.association;
416
+ var relatedModelDef = modelDefinition.models[relatedModelName];
417
+ var relatedModelPkInfo_1 = relatedModelDef.primaryKeyInfo;
418
+ if (association_1.connectionType === connectionType.HAS_ONE) {
419
+ association_1.targetNames.forEach(function (targetName, idx) {
420
+ var associatedFieldName = association_1.associatedWith[idx];
421
+ normalized[targetName] = inputValue[associatedFieldName];
422
+ });
423
+ }
424
+ if (association_1.connectionType === connectionType.BELONGS_TO) {
425
+ association_1.targetNames.forEach(function (targetName, idx) {
426
+ if (idx === 0) {
427
+ var associatedFieldName = relatedModelPkInfo_1.primaryKeyFieldName;
428
+ normalized[targetName] = inputValue[associatedFieldName];
429
+ }
430
+ else {
431
+ var associatedFieldName = relatedModelPkInfo_1.sortKeyFieldNames[idx - 1];
432
+ normalized[targetName] = inputValue[associatedFieldName];
433
+ }
434
+ });
435
+ }
436
+ }
437
+ else {
438
+ normalized[inputFieldName] = inputValue;
439
+ }
440
+ });
441
+ return normalized;
442
+ }
443
+ exports.normalizeMutationInput = normalizeMutationInput;
@@ -3,7 +3,7 @@ import { Observable } from 'rxjs';
3
3
  import { AmplifyClassV6 } from '@aws-amplify/core';
4
4
  import { CustomUserAgentDetails } from '@aws-amplify/core/internals/utils';
5
5
  import { GraphQLResult, GraphQLOperation, GraphQLOptions } from '../types';
6
- export declare const graphqlOperation: (query: any, variables?: {}, authToken?: string | undefined) => {
6
+ export declare const graphqlOperation: (query: any, variables?: {}, authToken?: string) => {
7
7
  query: any;
8
8
  variables: {};
9
9
  authToken: string | undefined;
@@ -37,7 +37,7 @@ export declare class InternalGraphQLAPIClass {
37
37
  * @param [additionalHeaders] - headers to merge in after any `graphql_headers` set in the config
38
38
  * @returns An Observable if the query is a subscription query, else a promise of the graphql result.
39
39
  */
40
- graphql<T = any>(amplify: AmplifyClassV6, { query: paramQuery, variables, authMode, authToken }: GraphQLOptions, additionalHeaders?: {
40
+ graphql<T = any>(amplify: AmplifyClassV6 | ((fn: (amplify: any) => Promise<any>) => Promise<AmplifyClassV6>), { query: paramQuery, variables, authMode, authToken }: GraphQLOptions, additionalHeaders?: {
41
41
  [key: string]: string;
42
42
  }, customUserAgentDetails?: CustomUserAgentDetails): Observable<GraphQLResult<T>> | Promise<GraphQLResult<T>>;
43
43
  private _graphql;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InternalGraphQLAPI = exports.InternalGraphQLAPIClass = exports.graphqlOperation = void 0;
3
4
  var tslib_1 = require("tslib");
4
5
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
5
6
  // SPDX-License-Identifier: Apache-2.0
@@ -13,7 +14,7 @@ var AWSAppSyncRealTimeProvider_1 = require("../Providers/AWSAppSyncRealTimeProvi
13
14
  var utils_2 = require("../utils");
14
15
  var USER_AGENT_HEADER = 'x-amz-user-agent';
15
16
  var logger = new core_1.ConsoleLogger('GraphQLAPI');
16
- exports.graphqlOperation = function (query, variables, authToken) {
17
+ var graphqlOperation = function (query, variables, authToken) {
17
18
  if (variables === void 0) { variables = {}; }
18
19
  return ({
19
20
  query: query,
@@ -21,6 +22,13 @@ exports.graphqlOperation = function (query, variables, authToken) {
21
22
  authToken: authToken,
22
23
  });
23
24
  };
25
+ exports.graphqlOperation = graphqlOperation;
26
+ var isAmplifyInstance = function (amplify) {
27
+ if (typeof amplify !== 'function') {
28
+ return true;
29
+ }
30
+ return false;
31
+ };
24
32
  /**
25
33
  * Export Cloud Logic APIs
26
34
  */
@@ -43,15 +51,15 @@ var InternalGraphQLAPIClass = /** @class */ (function () {
43
51
  return 'InternalGraphQLAPI';
44
52
  };
45
53
  InternalGraphQLAPIClass.prototype._headerBasedAuth = function (amplify, authMode, additionalHeaders) {
46
- if (additionalHeaders === void 0) { additionalHeaders = {}; }
47
54
  var _a;
55
+ if (additionalHeaders === void 0) { additionalHeaders = {}; }
48
56
  return tslib_1.__awaiter(this, void 0, void 0, function () {
49
57
  var config, _b, region, appSyncGraphqlEndpoint, apiKey, defaultAuthMode, authenticationType, headers, _c, session, token, e_1;
50
58
  return tslib_1.__generator(this, function (_d) {
51
59
  switch (_d.label) {
52
60
  case 0:
53
61
  config = amplify.getConfig();
54
- _b = utils_2.resolveConfig(amplify), region = _b.region, appSyncGraphqlEndpoint = _b.endpoint, apiKey = _b.apiKey, defaultAuthMode = _b.defaultAuthMode;
62
+ _b = (0, utils_2.resolveConfig)(amplify), region = _b.region, appSyncGraphqlEndpoint = _b.endpoint, apiKey = _b.apiKey, defaultAuthMode = _b.defaultAuthMode;
55
63
  authenticationType = authMode || defaultAuthMode || 'iam';
56
64
  headers = {};
57
65
  _c = authenticationType;
@@ -116,7 +124,7 @@ var InternalGraphQLAPIClass = /** @class */ (function () {
116
124
  * @param operation
117
125
  */
118
126
  InternalGraphQLAPIClass.prototype.getGraphqlOperationType = function (operation) {
119
- var doc = graphql_1.parse(operation);
127
+ var doc = (0, graphql_1.parse)(operation);
120
128
  var definitions = doc.definitions;
121
129
  var _a = tslib_1.__read(definitions, 1), operationType = _a[0].operation;
122
130
  return operationType;
@@ -129,10 +137,11 @@ var InternalGraphQLAPIClass = /** @class */ (function () {
129
137
  * @returns An Observable if the query is a subscription query, else a promise of the graphql result.
130
138
  */
131
139
  InternalGraphQLAPIClass.prototype.graphql = function (amplify, _a, additionalHeaders, customUserAgentDetails) {
140
+ var _this = this;
132
141
  var paramQuery = _a.query, _b = _a.variables, variables = _b === void 0 ? {} : _b, authMode = _a.authMode, authToken = _a.authToken;
133
142
  var query = typeof paramQuery === 'string'
134
- ? graphql_1.parse(paramQuery)
135
- : graphql_1.parse(graphql_1.print(paramQuery));
143
+ ? (0, graphql_1.parse)(paramQuery)
144
+ : (0, graphql_1.parse)((0, graphql_1.print)(paramQuery));
136
145
  var _c = tslib_1.__read(query.definitions.filter(function (def) { return def.kind === 'OperationDefinition'; }), 1), _d = _c[0], operationDef = _d === void 0 ? {} : _d;
137
146
  var operationType = operationDef.operation;
138
147
  var headers = additionalHeaders || {};
@@ -143,14 +152,23 @@ var InternalGraphQLAPIClass = /** @class */ (function () {
143
152
  switch (operationType) {
144
153
  case 'query':
145
154
  case 'mutation':
146
- var abortController = new AbortController();
147
- var responsePromise = this._graphql(amplify, { query: query, variables: variables, authMode: authMode }, headers, abortController, customUserAgentDetails);
148
- this._api.updateRequestToBeCancellable(responsePromise, abortController);
155
+ var abortController_1 = new AbortController();
156
+ var responsePromise = void 0;
157
+ if (isAmplifyInstance(amplify)) {
158
+ responsePromise = this._graphql(amplify, { query: query, variables: variables, authMode: authMode }, headers, abortController_1, customUserAgentDetails);
159
+ }
160
+ else {
161
+ var wrapper = function (amplifyInstance) {
162
+ return _this._graphql(amplifyInstance, { query: query, variables: variables, authMode: authMode }, headers, abortController_1, customUserAgentDetails);
163
+ };
164
+ responsePromise = amplify(wrapper);
165
+ }
166
+ this._api.updateRequestToBeCancellable(responsePromise, abortController_1);
149
167
  return responsePromise;
150
168
  case 'subscription':
151
169
  return this._graphqlSubscribe(amplify, { query: query, variables: variables, authMode: authMode }, headers, customUserAgentDetails);
152
170
  default:
153
- throw new Error("invalid operation type: " + operationType);
171
+ throw new Error("invalid operation type: ".concat(operationType));
154
172
  }
155
173
  };
156
174
  InternalGraphQLAPIClass.prototype._graphql = function (amplify, _a, additionalHeaders, abortController, customUserAgentDetails) {
@@ -162,8 +180,8 @@ var InternalGraphQLAPIClass = /** @class */ (function () {
162
180
  return tslib_1.__generator(this, function (_m) {
163
181
  switch (_m.label) {
164
182
  case 0:
165
- _b = utils_2.resolveConfig(amplify), region = _b.region, appSyncGraphqlEndpoint = _b.endpoint, customEndpoint = _b.customEndpoint, customEndpointRegion = _b.customEndpointRegion;
166
- _c = utils_2.resolveLibraryOptions(amplify), customHeaders = _c.headers, withCredentials = _c.withCredentials;
183
+ _b = (0, utils_2.resolveConfig)(amplify), region = _b.region, appSyncGraphqlEndpoint = _b.endpoint, customEndpoint = _b.customEndpoint, customEndpointRegion = _b.customEndpointRegion;
184
+ _c = (0, utils_2.resolveLibraryOptions)(amplify), customHeaders = _c.headers, withCredentials = _c.withCredentials;
167
185
  _d = [{}];
168
186
  _e = !customEndpoint;
169
187
  if (!_e) return [3 /*break*/, 2];
@@ -192,7 +210,7 @@ var InternalGraphQLAPIClass = /** @class */ (function () {
192
210
  _k = customHeaders;
193
211
  if (!_k) return [3 /*break*/, 8];
194
212
  return [4 /*yield*/, customHeaders({
195
- query: graphql_1.print(query),
213
+ query: (0, graphql_1.print)(query),
196
214
  variables: variables,
197
215
  })];
198
216
  case 7:
@@ -200,10 +218,10 @@ var InternalGraphQLAPIClass = /** @class */ (function () {
200
218
  _m.label = 8;
201
219
  case 8:
202
220
  headers = tslib_1.__assign.apply(void 0, [tslib_1.__assign.apply(void 0, [tslib_1.__assign.apply(void 0, _j.concat([(_k)])), additionalHeaders]), (!customEndpoint && (_l = {},
203
- _l[USER_AGENT_HEADER] = utils_1.getAmplifyUserAgent(customUserAgentDetails),
221
+ _l[USER_AGENT_HEADER] = (0, utils_1.getAmplifyUserAgent)(customUserAgentDetails),
204
222
  _l))]);
205
223
  body = {
206
- query: graphql_1.print(query),
224
+ query: (0, graphql_1.print)(query),
207
225
  variables: variables || null,
208
226
  };
209
227
  /**
@@ -296,12 +314,12 @@ var InternalGraphQLAPIClass = /** @class */ (function () {
296
314
  InternalGraphQLAPIClass.prototype._graphqlSubscribe = function (amplify, _a, additionalHeaders, customUserAgentDetails) {
297
315
  var query = _a.query, variables = _a.variables, authMode = _a.authMode;
298
316
  if (additionalHeaders === void 0) { additionalHeaders = {}; }
299
- var config = utils_2.resolveConfig(amplify);
317
+ var config = (0, utils_2.resolveConfig)(amplify);
300
318
  if (!this.appSyncRealTime) {
301
319
  this.appSyncRealTime = new AWSAppSyncRealTimeProvider_1.AWSAppSyncRealTimeProvider();
302
320
  }
303
321
  return this.appSyncRealTime.subscribe({
304
- query: graphql_1.print(query),
322
+ query: (0, graphql_1.print)(query),
305
323
  variables: variables,
306
324
  appSyncGraphqlEndpoint: config === null || config === void 0 ? void 0 : config.endpoint,
307
325
  region: config === null || config === void 0 ? void 0 : config.region,
@@ -0,0 +1,12 @@
1
+ import { V6Client } from '../types';
2
+ import { ClientGenerationParams } from './types';
3
+ /**
4
+ * @private
5
+ *
6
+ * Creates a client that can be used to make GraphQL requests, using a provided `AmplifyClassV6`
7
+ * compatible context object for config and auth fetching.
8
+ *
9
+ * @param params
10
+ * @returns
11
+ */
12
+ export declare function generateClient<T extends Record<any, any> = never>(params: ClientGenerationParams): V6Client<T>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateClient = void 0;
4
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
5
+ // SPDX-License-Identifier: Apache-2.0
6
+ var v6_1 = require("./v6");
7
+ var generateModelsProperty_1 = require("./generateModelsProperty");
8
+ var types_1 = require("../types");
9
+ /**
10
+ * @private
11
+ *
12
+ * Creates a client that can be used to make GraphQL requests, using a provided `AmplifyClassV6`
13
+ * compatible context object for config and auth fetching.
14
+ *
15
+ * @param params
16
+ * @returns
17
+ */
18
+ function generateClient(params) {
19
+ var _a;
20
+ var client = (_a = {},
21
+ _a[types_1.__amplify] = params.amplify,
22
+ _a.graphql = v6_1.graphql,
23
+ _a.cancel = v6_1.cancel,
24
+ _a.isCancelError = v6_1.isCancelError,
25
+ _a.models = {},
26
+ _a);
27
+ client.models = (0, generateModelsProperty_1.generateModelsProperty)(client, params);
28
+ return client;
29
+ }
30
+ exports.generateClient = generateClient;
@@ -0,0 +1,4 @@
1
+ import { ModelTypes } from '@aws-amplify/amplify-api-next-types-alpha';
2
+ import { ClientGenerationParams } from './types';
3
+ import { V6Client } from '../types';
4
+ export declare function generateModelsProperty<T extends Record<any, any> = never>(client: V6Client, params: ClientGenerationParams): ModelTypes<T>;