@aws-amplify/api-graphql 4.0.29-unstable.f37faeb.0 → 4.0.29

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 (129) hide show
  1. package/dist/cjs/internals/generateClient.js +4 -14
  2. package/dist/cjs/internals/generateClient.js.map +1 -1
  3. package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js +3 -8
  4. package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js.map +1 -1
  5. package/dist/cjs/internals/v6.js +6 -3
  6. package/dist/cjs/internals/v6.js.map +1 -1
  7. package/dist/cjs/types/index.js +11 -1
  8. package/dist/cjs/types/index.js.map +1 -1
  9. package/dist/cjs/utils/index.js +1 -5
  10. package/dist/cjs/utils/index.js.map +1 -1
  11. package/dist/esm/GraphQLAPI.d.ts +1 -1
  12. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +1 -1
  13. package/dist/esm/index.mjs +1 -1
  14. package/dist/esm/internals/InternalGraphQLAPI.d.ts +1 -1
  15. package/dist/esm/internals/generateClient.mjs +5 -15
  16. package/dist/esm/internals/generateClient.mjs.map +1 -1
  17. package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs +4 -9
  18. package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs.map +1 -1
  19. package/dist/esm/internals/types.d.ts +1 -1
  20. package/dist/esm/internals/v6.d.ts +1 -1
  21. package/dist/esm/internals/v6.mjs +7 -4
  22. package/dist/esm/internals/v6.mjs.map +1 -1
  23. package/dist/esm/types/index.d.ts +10 -40
  24. package/dist/esm/types/index.mjs +10 -1
  25. package/dist/esm/types/index.mjs.map +1 -1
  26. package/dist/esm/utils/index.d.ts +0 -2
  27. package/dist/esm/utils/index.mjs +0 -2
  28. package/dist/esm/utils/index.mjs.map +1 -1
  29. package/package.json +5 -6
  30. package/src/GraphQLAPI.ts +1 -1
  31. package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +4 -1
  32. package/src/internals/InternalGraphQLAPI.ts +4 -1
  33. package/src/internals/generateClient.ts +8 -36
  34. package/src/internals/server/generateClientWithAmplifyInstance.ts +6 -16
  35. package/src/internals/types.ts +1 -1
  36. package/src/internals/v6.ts +7 -7
  37. package/src/server/generateClient.ts +1 -1
  38. package/src/types/index.ts +36 -60
  39. package/src/utils/index.ts +0 -2
  40. package/dist/cjs/internals/APIClient.js +0 -733
  41. package/dist/cjs/internals/APIClient.js.map +0 -1
  42. package/dist/cjs/internals/clientUtils.js +0 -29
  43. package/dist/cjs/internals/clientUtils.js.map +0 -1
  44. package/dist/cjs/internals/generateCustomOperationsProperty.js +0 -50
  45. package/dist/cjs/internals/generateCustomOperationsProperty.js.map +0 -1
  46. package/dist/cjs/internals/operations/custom.js +0 -356
  47. package/dist/cjs/internals/operations/custom.js.map +0 -1
  48. package/dist/cjs/internals/operations/get.js +0 -62
  49. package/dist/cjs/internals/operations/get.js.map +0 -1
  50. package/dist/cjs/internals/operations/indexQuery.js +0 -75
  51. package/dist/cjs/internals/operations/indexQuery.js.map +0 -1
  52. package/dist/cjs/internals/operations/list.js +0 -74
  53. package/dist/cjs/internals/operations/list.js.map +0 -1
  54. package/dist/cjs/internals/operations/observeQuery.js +0 -121
  55. package/dist/cjs/internals/operations/observeQuery.js.map +0 -1
  56. package/dist/cjs/internals/operations/subscription.js +0 -31
  57. package/dist/cjs/internals/operations/subscription.js.map +0 -1
  58. package/dist/cjs/internals/server/generateModelsProperty.js +0 -53
  59. package/dist/cjs/internals/server/generateModelsProperty.js.map +0 -1
  60. package/dist/cjs/internals/utils/clientProperties/generateEnumsProperty.js +0 -21
  61. package/dist/cjs/internals/utils/clientProperties/generateEnumsProperty.js.map +0 -1
  62. package/dist/cjs/internals/utils/clientProperties/generateModelsProperty.js +0 -45
  63. package/dist/cjs/internals/utils/clientProperties/generateModelsProperty.js.map +0 -1
  64. package/dist/cjs/utils/findIndexByFields.js +0 -25
  65. package/dist/cjs/utils/findIndexByFields.js.map +0 -1
  66. package/dist/cjs/utils/resolveOwnerFields.js +0 -48
  67. package/dist/cjs/utils/resolveOwnerFields.js.map +0 -1
  68. package/dist/cjs/utils/resolvePKFields.js +0 -17
  69. package/dist/cjs/utils/resolvePKFields.js.map +0 -1
  70. package/dist/esm/internals/APIClient.d.ts +0 -126
  71. package/dist/esm/internals/APIClient.mjs +0 -721
  72. package/dist/esm/internals/APIClient.mjs.map +0 -1
  73. package/dist/esm/internals/clientUtils.d.ts +0 -6
  74. package/dist/esm/internals/clientUtils.mjs +0 -26
  75. package/dist/esm/internals/clientUtils.mjs.map +0 -1
  76. package/dist/esm/internals/generateCustomOperationsProperty.d.ts +0 -9
  77. package/dist/esm/internals/generateCustomOperationsProperty.mjs +0 -45
  78. package/dist/esm/internals/generateCustomOperationsProperty.mjs.map +0 -1
  79. package/dist/esm/internals/operations/custom.d.ts +0 -63
  80. package/dist/esm/internals/operations/custom.mjs +0 -354
  81. package/dist/esm/internals/operations/custom.mjs.map +0 -1
  82. package/dist/esm/internals/operations/get.d.ts +0 -5
  83. package/dist/esm/internals/operations/get.mjs +0 -60
  84. package/dist/esm/internals/operations/get.mjs.map +0 -1
  85. package/dist/esm/internals/operations/indexQuery.d.ts +0 -9
  86. package/dist/esm/internals/operations/indexQuery.mjs +0 -73
  87. package/dist/esm/internals/operations/indexQuery.mjs.map +0 -1
  88. package/dist/esm/internals/operations/list.d.ts +0 -4
  89. package/dist/esm/internals/operations/list.mjs +0 -72
  90. package/dist/esm/internals/operations/list.mjs.map +0 -1
  91. package/dist/esm/internals/operations/observeQuery.d.ts +0 -3
  92. package/dist/esm/internals/operations/observeQuery.mjs +0 -121
  93. package/dist/esm/internals/operations/observeQuery.mjs.map +0 -1
  94. package/dist/esm/internals/operations/subscription.d.ts +0 -3
  95. package/dist/esm/internals/operations/subscription.mjs +0 -29
  96. package/dist/esm/internals/operations/subscription.mjs.map +0 -1
  97. package/dist/esm/internals/server/generateModelsProperty.d.ts +0 -3
  98. package/dist/esm/internals/server/generateModelsProperty.mjs +0 -51
  99. package/dist/esm/internals/server/generateModelsProperty.mjs.map +0 -1
  100. package/dist/esm/internals/utils/clientProperties/generateEnumsProperty.d.ts +0 -3
  101. package/dist/esm/internals/utils/clientProperties/generateEnumsProperty.mjs +0 -18
  102. package/dist/esm/internals/utils/clientProperties/generateEnumsProperty.mjs.map +0 -1
  103. package/dist/esm/internals/utils/clientProperties/generateModelsProperty.d.ts +0 -4
  104. package/dist/esm/internals/utils/clientProperties/generateModelsProperty.mjs +0 -43
  105. package/dist/esm/internals/utils/clientProperties/generateModelsProperty.mjs.map +0 -1
  106. package/dist/esm/utils/findIndexByFields.d.ts +0 -9
  107. package/dist/esm/utils/findIndexByFields.mjs +0 -22
  108. package/dist/esm/utils/findIndexByFields.mjs.map +0 -1
  109. package/dist/esm/utils/resolveOwnerFields.d.ts +0 -12
  110. package/dist/esm/utils/resolveOwnerFields.mjs +0 -45
  111. package/dist/esm/utils/resolveOwnerFields.mjs.map +0 -1
  112. package/dist/esm/utils/resolvePKFields.d.ts +0 -13
  113. package/dist/esm/utils/resolvePKFields.mjs +0 -14
  114. package/dist/esm/utils/resolvePKFields.mjs.map +0 -1
  115. package/src/internals/APIClient.ts +0 -1076
  116. package/src/internals/clientUtils.ts +0 -37
  117. package/src/internals/generateCustomOperationsProperty.ts +0 -112
  118. package/src/internals/operations/custom.ts +0 -492
  119. package/src/internals/operations/get.ts +0 -140
  120. package/src/internals/operations/indexQuery.ts +0 -170
  121. package/src/internals/operations/list.ts +0 -135
  122. package/src/internals/operations/observeQuery.ts +0 -146
  123. package/src/internals/operations/subscription.ts +0 -75
  124. package/src/internals/server/generateModelsProperty.ts +0 -97
  125. package/src/internals/utils/clientProperties/generateEnumsProperty.ts +0 -34
  126. package/src/internals/utils/clientProperties/generateModelsProperty.ts +0 -81
  127. package/src/utils/findIndexByFields.ts +0 -31
  128. package/src/utils/resolveOwnerFields.ts +0 -77
  129. package/src/utils/resolvePKFields.ts +0 -23
@@ -1,733 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.getCustomHeaders = exports.authModeParams = exports.normalizeMutationInput = exports.buildGraphQLVariables = exports.generateGraphQLDocument = exports.generateSelectionSet = exports.selectionSetIRToString = exports.customSelectionSetToIR = exports.getDefaultSelectionSetForNonModelWithIR = exports.graphQLOperationsInfo = exports.initializeModel = exports.flattenItems = void 0;
5
- const types_1 = require("../types");
6
- const resolveOwnerFields_1 = require("../utils/resolveOwnerFields");
7
- const connectionType = {
8
- HAS_ONE: 'HAS_ONE',
9
- HAS_MANY: 'HAS_MANY',
10
- BELONGS_TO: 'BELONGS_TO',
11
- };
12
- /**
13
- *
14
- * @param GraphQL response object
15
- * @returns response object with `items` properties flattened
16
- */
17
- const flattenItems = (obj) => {
18
- const res = {};
19
- Object.entries(obj).forEach(([prop, value]) => {
20
- if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
21
- if (value.items !== undefined) {
22
- res[prop] = value.items.map((item) => (0, exports.flattenItems)(item));
23
- return;
24
- }
25
- res[prop] = (0, exports.flattenItems)(value);
26
- return;
27
- }
28
- res[prop] = value;
29
- });
30
- return res;
31
- };
32
- exports.flattenItems = flattenItems;
33
- // TODO: this should accept single result to support CRUD methods; create helper for array/list
34
- function initializeModel(client, modelName, result, modelIntrospection, authMode, authToken, context = false) {
35
- const introModel = modelIntrospection.models[modelName];
36
- const introModelFields = introModel.fields;
37
- const modelFields = Object.entries(introModelFields)
38
- .filter(([_, field]) => field?.type?.model !== undefined)
39
- .map(([fieldName]) => fieldName);
40
- return result.map(record => {
41
- const initializedRelationalFields = {};
42
- for (const fieldName of modelFields) {
43
- const modelField = introModelFields[fieldName];
44
- const modelFieldType = modelField?.type;
45
- const relatedModelName = modelFieldType.model;
46
- const relatedModel = modelIntrospection.models[relatedModelName];
47
- const relatedModelPKFieldName = relatedModel.primaryKeyInfo.primaryKeyFieldName;
48
- const relatedModelSKFieldNames = relatedModel.primaryKeyInfo.sortKeyFieldNames;
49
- const relationType = modelField.association?.connectionType;
50
- let connectionFields = [];
51
- if (modelField.association &&
52
- 'associatedWith' in modelField.association) {
53
- connectionFields = modelField.association.associatedWith;
54
- }
55
- const targetNames = [];
56
- if (modelField.association && 'targetNames' in modelField.association) {
57
- targetNames.push(...modelField.association.targetNames);
58
- }
59
- switch (relationType) {
60
- case connectionType.HAS_ONE:
61
- case connectionType.BELONGS_TO: {
62
- const sortKeyValues = relatedModelSKFieldNames.reduce(
63
- // TODO(Eslint): is this implementation correct?
64
- // eslint-disable-next-line array-callback-return
65
- (acc, curVal) => {
66
- if (record[curVal]) {
67
- return (acc[curVal] = record[curVal]);
68
- }
69
- }, {});
70
- if (context) {
71
- initializedRelationalFields[fieldName] = (contextSpec, options) => {
72
- if (record[targetNames[0]]) {
73
- return client.models[relatedModelName].get(contextSpec, {
74
- [relatedModelPKFieldName]: record[targetNames[0]],
75
- ...sortKeyValues,
76
- }, {
77
- authMode: options?.authMode || authMode,
78
- authToken: options?.authToken || authToken,
79
- });
80
- }
81
- return undefined;
82
- };
83
- }
84
- else {
85
- initializedRelationalFields[fieldName] = (options) => {
86
- if (record[targetNames[0]]) {
87
- return client.models[relatedModelName].get({
88
- [relatedModelPKFieldName]: record[targetNames[0]],
89
- ...sortKeyValues,
90
- }, {
91
- authMode: options?.authMode || authMode,
92
- authToken: options?.authToken || authToken,
93
- });
94
- }
95
- return undefined;
96
- };
97
- }
98
- break;
99
- }
100
- case connectionType.HAS_MANY: {
101
- const parentPk = introModel.primaryKeyInfo.primaryKeyFieldName;
102
- const parentSK = introModel.primaryKeyInfo.sortKeyFieldNames;
103
- // M:N check - TODO: refactor
104
- const relatedModelField = relatedModel.fields[connectionFields[0]];
105
- const relatedModelFieldType = relatedModelField.type;
106
- if (relatedModelFieldType.model) {
107
- let relatedTargetNames = [];
108
- if (relatedModelField.association &&
109
- 'targetNames' in relatedModelField.association) {
110
- relatedTargetNames = relatedModelField.association?.targetNames;
111
- }
112
- const hasManyFilter = relatedTargetNames.map((field, idx) => {
113
- if (idx === 0) {
114
- return { [field]: { eq: record[parentPk] } };
115
- }
116
- return { [field]: { eq: record[parentSK[idx - 1]] } };
117
- });
118
- if (context) {
119
- initializedRelationalFields[fieldName] = (contextSpec, options) => {
120
- if (record[parentPk]) {
121
- return client.models[relatedModelName].list(contextSpec, {
122
- filter: { and: hasManyFilter },
123
- limit: options?.limit,
124
- nextToken: options?.nextToken,
125
- authMode: options?.authMode || authMode,
126
- authToken: options?.authToken || authToken,
127
- });
128
- }
129
- return [];
130
- };
131
- }
132
- else {
133
- initializedRelationalFields[fieldName] = (options) => {
134
- if (record[parentPk]) {
135
- return client.models[relatedModelName].list({
136
- filter: { and: hasManyFilter },
137
- limit: options?.limit,
138
- nextToken: options?.nextToken,
139
- authMode: options?.authMode || authMode,
140
- authToken: options?.authToken || authToken,
141
- });
142
- }
143
- return [];
144
- };
145
- }
146
- break;
147
- }
148
- const hasManyFilter = connectionFields.map((field, idx) => {
149
- if (idx === 0) {
150
- return { [field]: { eq: record[parentPk] } };
151
- }
152
- return { [field]: { eq: record[parentSK[idx - 1]] } };
153
- });
154
- if (context) {
155
- initializedRelationalFields[fieldName] = (contextSpec, options) => {
156
- if (record[parentPk]) {
157
- return client.models[relatedModelName].list(contextSpec, {
158
- filter: { and: hasManyFilter },
159
- limit: options?.limit,
160
- nextToken: options?.nextToken,
161
- authMode: options?.authMode || authMode,
162
- authToken: options?.authToken || authToken,
163
- });
164
- }
165
- return [];
166
- };
167
- }
168
- else {
169
- initializedRelationalFields[fieldName] = (options) => {
170
- if (record[parentPk]) {
171
- return client.models[relatedModelName].list({
172
- filter: { and: hasManyFilter },
173
- limit: options?.limit,
174
- nextToken: options?.nextToken,
175
- authMode: options?.authMode || authMode,
176
- authToken: options?.authToken || authToken,
177
- });
178
- }
179
- return [];
180
- };
181
- }
182
- break;
183
- }
184
- }
185
- }
186
- return { ...record, ...initializedRelationalFields };
187
- });
188
- }
189
- exports.initializeModel = initializeModel;
190
- exports.graphQLOperationsInfo = {
191
- CREATE: { operationPrefix: 'create', usePlural: false },
192
- READ: { operationPrefix: 'get', usePlural: false },
193
- UPDATE: { operationPrefix: 'update', usePlural: false },
194
- DELETE: { operationPrefix: 'delete', usePlural: false },
195
- LIST: { operationPrefix: 'list', usePlural: true },
196
- INDEX_QUERY: { operationPrefix: '', usePlural: false },
197
- ONCREATE: { operationPrefix: 'onCreate', usePlural: false },
198
- ONUPDATE: { operationPrefix: 'onUpdate', usePlural: false },
199
- ONDELETE: { operationPrefix: 'onDelete', usePlural: false },
200
- OBSERVE_QUERY: { operationPrefix: 'observeQuery', usePlural: false },
201
- };
202
- const SELECTION_SET_WILDCARD = '*';
203
- const getDefaultSelectionSetForNonModelWithIR = (nonModelDefinition, modelIntrospection) => {
204
- const { fields } = nonModelDefinition;
205
- const mappedFields = Object.values(fields)
206
- .map(({ type, name }) => {
207
- if (typeof type.enum === 'string') {
208
- return [name, FIELD_IR];
209
- }
210
- if (typeof type.nonModel === 'string') {
211
- return [
212
- name,
213
- (0, exports.getDefaultSelectionSetForNonModelWithIR)(modelIntrospection.nonModels[type.nonModel], modelIntrospection),
214
- ];
215
- }
216
- if (typeof type === 'string') {
217
- return [name, FIELD_IR];
218
- }
219
- return undefined;
220
- })
221
- .filter((pair) => pair !== undefined);
222
- return Object.fromEntries(mappedFields);
223
- };
224
- exports.getDefaultSelectionSetForNonModelWithIR = getDefaultSelectionSetForNonModelWithIR;
225
- const getDefaultSelectionSetForModelWithIR = (modelDefinition, modelIntrospection) => {
226
- const { fields } = modelDefinition;
227
- const mappedFields = Object.values(fields)
228
- .map(({ type, name }) => {
229
- if (typeof type.enum === 'string' ||
230
- typeof type === 'string') {
231
- return [name, FIELD_IR];
232
- }
233
- if (typeof type.nonModel === 'string') {
234
- return [
235
- name,
236
- (0, exports.getDefaultSelectionSetForNonModelWithIR)(modelIntrospection.nonModels[type.nonModel], modelIntrospection),
237
- ];
238
- }
239
- return undefined;
240
- })
241
- .filter((pair) => pair !== undefined);
242
- const ownerFields = (0, resolveOwnerFields_1.resolveOwnerFields)(modelDefinition).map(field => [
243
- field,
244
- FIELD_IR,
245
- ]);
246
- return Object.fromEntries(mappedFields.concat(ownerFields));
247
- };
248
- function defaultSelectionSetForModel(modelDefinition) {
249
- // fields that are explicitly part of the graphql schema; not
250
- // inferred from owner auth rules.
251
- const { fields } = modelDefinition;
252
- const explicitFields = Object.values(fields)
253
- // Default selection set omits model fields
254
- .map(({ type, name }) => {
255
- if (typeof type === 'string')
256
- return name;
257
- if (typeof type === 'object') {
258
- if (typeof type?.enum === 'string') {
259
- return name;
260
- }
261
- else if (typeof type?.nonModel === 'string') {
262
- return `${name}.${SELECTION_SET_WILDCARD}`;
263
- }
264
- }
265
- return undefined;
266
- })
267
- .filter(Boolean);
268
- // fields used for owner auth rules that may or may not also
269
- // be explicit on the model.
270
- const ownerFields = (0, resolveOwnerFields_1.resolveOwnerFields)(modelDefinition);
271
- return Array.from(new Set(explicitFields.concat(ownerFields)));
272
- }
273
- const FIELD_IR = '';
274
- /**
275
- * Generates nested Custom Selection Set IR from path
276
- *
277
- * @param modelDefinitions
278
- * @param modelName
279
- * @param selectionSet - array of object paths
280
- * @example
281
- * ### Given
282
- * `selectionSet = ['id', 'comments.post.id']`
283
- * ### Returns
284
- * ```ts
285
- * {
286
- * id: '',
287
- * comments: {
288
- * items: { post: { id: '' } }
289
- * }
290
- * }
291
- * ```
292
- */
293
- function customSelectionSetToIR(modelIntrospection, modelName, selectionSet) {
294
- const dotNotationToObject = (path, modelOrNonModelName) => {
295
- const [fieldName, ...rest] = path.split('.');
296
- const nested = rest[0];
297
- const modelOrNonModelDefinition = modelIntrospection.models[modelOrNonModelName] ??
298
- modelIntrospection.nonModels[modelOrNonModelName];
299
- const modelOrNonModelFields = modelOrNonModelDefinition?.fields;
300
- const relatedModel = modelOrNonModelFields?.[fieldName]?.type?.model;
301
- const relatedModelDefinition = modelIntrospection.models[relatedModel];
302
- const relatedNonModel = modelOrNonModelFields?.[fieldName]?.type?.nonModel;
303
- const relatedNonModelDefinition = modelIntrospection.nonModels[relatedNonModel];
304
- const isModelOrNonModelOrFieldType = relatedModelDefinition
305
- ? 'model'
306
- : relatedNonModelDefinition
307
- ? 'nonModel'
308
- : 'field';
309
- if (isModelOrNonModelOrFieldType === 'nonModel') {
310
- let result = {};
311
- if (!nested) {
312
- throw Error(`${fieldName} must declare a wildcard (*) or a field of custom type ${relatedNonModel}`);
313
- }
314
- if (nested === SELECTION_SET_WILDCARD) {
315
- result = {
316
- [fieldName]: (0, exports.getDefaultSelectionSetForNonModelWithIR)(relatedNonModelDefinition, modelIntrospection),
317
- };
318
- }
319
- else {
320
- result = {
321
- [fieldName]: dotNotationToObject(rest.join('.'), relatedNonModel),
322
- };
323
- }
324
- return result;
325
- }
326
- else if (isModelOrNonModelOrFieldType === 'model') {
327
- let result = {};
328
- if (!nested) {
329
- throw Error(`${fieldName} must declare a wildcard (*) or a field of model ${relatedModel}`);
330
- }
331
- if (nested === SELECTION_SET_WILDCARD) {
332
- const nestedRelatedModelDefinition = modelIntrospection.models[relatedModel];
333
- result = {
334
- [fieldName]: getDefaultSelectionSetForModelWithIR(nestedRelatedModelDefinition, modelIntrospection),
335
- };
336
- }
337
- else {
338
- result = {
339
- [fieldName]: dotNotationToObject(rest.join('.'), relatedModel),
340
- };
341
- }
342
- if (modelOrNonModelFields[fieldName]?.isArray) {
343
- result = {
344
- [fieldName]: {
345
- items: result[fieldName],
346
- },
347
- };
348
- }
349
- return result;
350
- }
351
- else {
352
- const modelField = modelOrNonModelFields?.[fieldName];
353
- const nonModelDefinition = modelIntrospection.nonModels[modelOrNonModelName];
354
- const nonModelField = nonModelDefinition?.fields?.[fieldName];
355
- if (!nonModelDefinition) {
356
- const isOwnerField = (0, resolveOwnerFields_1.resolveOwnerFields)(modelOrNonModelDefinition).includes(fieldName);
357
- if (!modelField && !isOwnerField) {
358
- throw Error(`${fieldName} is not a field of model ${modelOrNonModelName}`);
359
- }
360
- }
361
- else {
362
- if (!nonModelField) {
363
- throw Error(`${fieldName} is not a field of custom type ${modelOrNonModelName}`);
364
- }
365
- }
366
- return { [fieldName]: FIELD_IR };
367
- }
368
- };
369
- return selectionSet.reduce((resultObj, path) => deepMergeSelectionSetObjects(dotNotationToObject(path, modelName), resultObj), {});
370
- }
371
- exports.customSelectionSetToIR = customSelectionSetToIR;
372
- /**
373
- * Stringifies selection set IR
374
- * * @example
375
- * ### Given
376
- * ```ts
377
- * {
378
- * id: '',
379
- * comments: {
380
- * items: { post: { id: '' } }
381
- * }
382
- * }
383
- * ```
384
- * ### Returns
385
- * `'id comments { items { post { id } } }'`
386
- */
387
- function selectionSetIRToString(obj) {
388
- const res = [];
389
- Object.entries(obj).forEach(([fieldName, value]) => {
390
- if (value === FIELD_IR) {
391
- res.push(fieldName);
392
- }
393
- else if (typeof value === 'object' && value !== null) {
394
- if (value?.items) {
395
- res.push(fieldName, '{', 'items', '{', selectionSetIRToString(value.items), '}', '}');
396
- }
397
- else {
398
- res.push(fieldName, '{', selectionSetIRToString(value), '}');
399
- }
400
- }
401
- });
402
- return res.join(' ');
403
- }
404
- exports.selectionSetIRToString = selectionSetIRToString;
405
- /**
406
- * Recursively merges selection set objects from `source` onto `target`.
407
- *
408
- * `target` will be updated. `source` will be left alone.
409
- *
410
- * @param source The object to merge into target.
411
- * @param target The object to be mutated.
412
- */
413
- function deepMergeSelectionSetObjects(source, target) {
414
- const isObject = (obj) => obj && typeof obj === 'object';
415
- for (const key in source) {
416
- // This verification avoids 'Prototype Pollution' issue
417
- if (!Object.prototype.hasOwnProperty.call(source, key))
418
- continue;
419
- if (Object.prototype.hasOwnProperty.call(target, key) &&
420
- isObject(target[key])) {
421
- deepMergeSelectionSetObjects(source[key], target[key]);
422
- }
423
- else {
424
- target[key] = source[key];
425
- }
426
- }
427
- return target;
428
- }
429
- function generateSelectionSet(modelIntrospection, modelName, selectionSet) {
430
- const modelDefinition = modelIntrospection.models[modelName];
431
- const selSetIr = customSelectionSetToIR(modelIntrospection, modelName, selectionSet ?? defaultSelectionSetForModel(modelDefinition));
432
- const selSetString = selectionSetIRToString(selSetIr);
433
- return selSetString;
434
- }
435
- exports.generateSelectionSet = generateSelectionSet;
436
- function generateGraphQLDocument(modelIntrospection, modelName, modelOperation, listArgs, indexMeta) {
437
- const modelDefinition = modelIntrospection.models[modelName];
438
- const { name, pluralName, fields, primaryKeyInfo: { isCustomPrimaryKey, primaryKeyFieldName, sortKeyFieldNames, }, } = modelDefinition;
439
- const { operationPrefix, usePlural } = exports.graphQLOperationsInfo[modelOperation];
440
- const { selectionSet } = listArgs || {};
441
- let graphQLFieldName;
442
- let indexQueryArgs;
443
- if (operationPrefix) {
444
- graphQLFieldName = `${operationPrefix}${usePlural ? pluralName : name}`;
445
- }
446
- else if (indexMeta) {
447
- const { queryField, pk, sk = [] } = indexMeta;
448
- graphQLFieldName = queryField;
449
- const skQueryArgs = sk.reduce((acc, fieldName) => {
450
- const fieldType = fields[fieldName].type;
451
- acc[fieldName] = `Model${fieldType}KeyConditionInput`;
452
- return acc;
453
- }, {});
454
- indexQueryArgs = {
455
- [pk]: `${fields[pk].type}!`,
456
- ...skQueryArgs,
457
- };
458
- }
459
- else {
460
- throw new Error('Error generating GraphQL Document - invalid operation name');
461
- }
462
- let graphQLOperationType;
463
- let graphQLSelectionSet;
464
- let graphQLArguments;
465
- const selectionSetFields = generateSelectionSet(modelIntrospection, modelName, selectionSet);
466
- // default PK args for get and list operations
467
- // modified below for CPK
468
- const getPkArgs = {
469
- [primaryKeyFieldName]: `${fields[primaryKeyFieldName].type}!`,
470
- };
471
- const listPkArgs = {};
472
- const generateSkArgs = (op) => {
473
- return sortKeyFieldNames.reduce((acc, fieldName) => {
474
- const fieldType = fields[fieldName].type;
475
- if (op === 'get') {
476
- acc[fieldName] = `${fieldType}!`;
477
- }
478
- else if (op === 'list') {
479
- acc[fieldName] = `Model${fieldType}KeyConditionInput`;
480
- }
481
- return acc;
482
- }, {});
483
- };
484
- if (isCustomPrimaryKey) {
485
- Object.assign(getPkArgs, generateSkArgs('get'));
486
- Object.assign(listPkArgs, {
487
- // PK is only included in list query field args in the generated GQL
488
- // when explicitly specifying PK with .identifier(['fieldName']) or @primaryKey in the schema definition
489
- [primaryKeyFieldName]: `${fields[primaryKeyFieldName].type}`,
490
- sortDirection: 'ModelSortDirection',
491
- }, generateSkArgs('list'));
492
- }
493
- switch (modelOperation) {
494
- case 'CREATE':
495
- case 'UPDATE':
496
- case 'DELETE':
497
- graphQLArguments ??
498
- (graphQLArguments = {
499
- input: `${operationPrefix.charAt(0).toLocaleUpperCase() +
500
- operationPrefix.slice(1)}${name}Input!`,
501
- });
502
- graphQLOperationType ?? (graphQLOperationType = 'mutation');
503
- // TODO(Eslint): this this case clause correct without the break statement?
504
- // eslint-disable-next-line no-fallthrough
505
- case 'READ':
506
- graphQLArguments ?? (graphQLArguments = getPkArgs);
507
- graphQLSelectionSet ?? (graphQLSelectionSet = selectionSetFields);
508
- // TODO(Eslint): this this case clause correct without the break statement?
509
- // eslint-disable-next-line no-fallthrough
510
- case 'LIST':
511
- graphQLArguments ??
512
- (graphQLArguments = {
513
- ...listPkArgs,
514
- filter: `Model${name}FilterInput`,
515
- limit: 'Int',
516
- nextToken: 'String',
517
- });
518
- graphQLOperationType ?? (graphQLOperationType = 'query');
519
- graphQLSelectionSet ??
520
- (graphQLSelectionSet = `items { ${selectionSetFields} } nextToken __typename`);
521
- // TODO(Eslint): this this case clause correct without the break statement?
522
- // eslint-disable-next-line no-fallthrough
523
- case 'INDEX_QUERY':
524
- graphQLArguments ??
525
- (graphQLArguments = {
526
- ...indexQueryArgs,
527
- filter: `Model${name}FilterInput`,
528
- sortDirection: 'ModelSortDirection',
529
- limit: 'Int',
530
- nextToken: 'String',
531
- });
532
- graphQLOperationType ?? (graphQLOperationType = 'query');
533
- graphQLSelectionSet ??
534
- (graphQLSelectionSet = `items { ${selectionSetFields} } nextToken __typename`);
535
- // TODO(Eslint): this this case clause correct without the break statement?
536
- // eslint-disable-next-line no-fallthrough
537
- case 'ONCREATE':
538
- case 'ONUPDATE':
539
- case 'ONDELETE':
540
- graphQLArguments ??
541
- (graphQLArguments = {
542
- filter: `ModelSubscription${name}FilterInput`,
543
- });
544
- graphQLOperationType ?? (graphQLOperationType = 'subscription');
545
- graphQLSelectionSet ?? (graphQLSelectionSet = selectionSetFields);
546
- break;
547
- case 'OBSERVE_QUERY':
548
- default:
549
- throw new Error('Internal error: Attempted to generate graphql document for observeQuery. Please report this error.');
550
- }
551
- const graphQLDocument = `${graphQLOperationType}${graphQLArguments
552
- ? `(${Object.entries(graphQLArguments).map(([fieldName, type]) => `$${fieldName}: ${type}`)})`
553
- : ''} { ${graphQLFieldName}${graphQLArguments
554
- ? `(${Object.keys(graphQLArguments).map(fieldName => `${fieldName}: $${fieldName}`)})`
555
- : ''} { ${graphQLSelectionSet} } }`;
556
- return graphQLDocument;
557
- }
558
- exports.generateGraphQLDocument = generateGraphQLDocument;
559
- function buildGraphQLVariables(modelDefinition, operation, arg, modelIntrospection, indexMeta) {
560
- const { fields, primaryKeyInfo: { isCustomPrimaryKey, primaryKeyFieldName, sortKeyFieldNames, }, } = modelDefinition;
561
- let variables = {};
562
- // TODO: process input
563
- switch (operation) {
564
- case 'CREATE':
565
- variables = {
566
- input: arg
567
- ? normalizeMutationInput(arg, modelDefinition, modelIntrospection)
568
- : {},
569
- };
570
- break;
571
- case 'UPDATE':
572
- // readonly fields are not updated
573
- variables = {
574
- input: arg
575
- ? Object.fromEntries(Object.entries(normalizeMutationInput(arg, modelDefinition, modelIntrospection)).filter(([fieldName]) => {
576
- const { isReadOnly } = fields[fieldName];
577
- return !isReadOnly;
578
- }))
579
- : {},
580
- };
581
- break;
582
- case 'READ':
583
- case 'DELETE':
584
- // only identifiers are sent
585
- if (arg) {
586
- variables = isCustomPrimaryKey
587
- ? [primaryKeyFieldName, ...sortKeyFieldNames].reduce((acc, fieldName) => {
588
- acc[fieldName] = arg[fieldName];
589
- return acc;
590
- }, {})
591
- : { [primaryKeyFieldName]: arg[primaryKeyFieldName] };
592
- }
593
- if (operation === 'DELETE') {
594
- variables = { input: variables };
595
- }
596
- break;
597
- case 'LIST':
598
- if (arg?.filter) {
599
- variables.filter = arg.filter;
600
- }
601
- if (arg?.sortDirection) {
602
- variables.sortDirection = arg.sortDirection;
603
- variables[primaryKeyFieldName] = arg[primaryKeyFieldName];
604
- }
605
- if (arg?.nextToken) {
606
- variables.nextToken = arg.nextToken;
607
- }
608
- if (arg?.limit) {
609
- variables.limit = arg.limit;
610
- }
611
- break;
612
- case 'INDEX_QUERY': {
613
- const { pk, sk = [] } = indexMeta;
614
- variables[pk] = arg[pk];
615
- for (const skField of sk) {
616
- variables[skField] = arg[skField];
617
- }
618
- if (arg?.filter) {
619
- variables.filter = arg.filter;
620
- }
621
- if (arg?.sortDirection) {
622
- variables.sortDirection = arg.sortDirection;
623
- }
624
- if (arg?.nextToken) {
625
- variables.nextToken = arg.nextToken;
626
- }
627
- if (arg?.limit) {
628
- variables.limit = arg.limit;
629
- }
630
- break;
631
- }
632
- case 'ONCREATE':
633
- case 'ONUPDATE':
634
- case 'ONDELETE':
635
- if (arg?.filter) {
636
- variables = { filter: arg.filter };
637
- }
638
- break;
639
- case 'OBSERVE_QUERY':
640
- throw new Error('Internal error: Attempted to build variables for observeQuery. Please report this error.');
641
- default: {
642
- const exhaustiveCheck = operation;
643
- throw new Error(`Unhandled operation case: ${exhaustiveCheck}`);
644
- }
645
- }
646
- return variables;
647
- }
648
- exports.buildGraphQLVariables = buildGraphQLVariables;
649
- /**
650
- * Iterates over mutation input values and resolves any model inputs to their corresponding join fields/values
651
- *
652
- * @example
653
- * ### Usage
654
- * ```ts
655
- * const result = normalizeMutationInput({ post: post }, model, modelDefinition);
656
- * ```
657
- * ### Result
658
- * ```ts
659
- * { postId: "abc123" }
660
- * ```
661
- *
662
- */
663
- function normalizeMutationInput(mutationInput, model, modelIntrospection) {
664
- const { fields } = model;
665
- const normalized = {};
666
- Object.entries(mutationInput).forEach(([inputFieldName, inputValue]) => {
667
- const fieldType = fields[inputFieldName]?.type;
668
- const relatedModelName = fieldType?.model;
669
- if (relatedModelName) {
670
- const association = fields[inputFieldName]?.association;
671
- const relatedModelDef = modelIntrospection.models[relatedModelName];
672
- const relatedModelPkInfo = relatedModelDef.primaryKeyInfo;
673
- if (association?.connectionType === connectionType.HAS_ONE) {
674
- const associationHasOne = association;
675
- associationHasOne.targetNames.forEach((targetName, idx) => {
676
- const associatedFieldName = associationHasOne.associatedWith[idx];
677
- normalized[targetName] = inputValue[associatedFieldName];
678
- });
679
- }
680
- if (association?.connectionType === connectionType.BELONGS_TO) {
681
- const associationBelongsTo = association;
682
- associationBelongsTo.targetNames.forEach((targetName, idx) => {
683
- if (idx === 0) {
684
- const associatedFieldName = relatedModelPkInfo.primaryKeyFieldName;
685
- normalized[targetName] = inputValue[associatedFieldName];
686
- }
687
- else {
688
- const associatedFieldName = relatedModelPkInfo.sortKeyFieldNames[idx - 1];
689
- normalized[targetName] = inputValue[associatedFieldName];
690
- }
691
- });
692
- }
693
- }
694
- else {
695
- normalized[inputFieldName] = inputValue;
696
- }
697
- });
698
- return normalized;
699
- }
700
- exports.normalizeMutationInput = normalizeMutationInput;
701
- /**
702
- * Produces a parameter object that can contains auth mode/token overrides
703
- * only if present in either `options` (first) or configured on the `client`
704
- * as a fallback.
705
- *
706
- * @param client Configured client from `generateClient`
707
- * @param options Args/Options object from call site.
708
- * @returns
709
- */
710
- function authModeParams(client, options = {}) {
711
- return {
712
- authMode: options.authMode || client[types_1.__authMode],
713
- authToken: options.authToken || client[types_1.__authToken],
714
- };
715
- }
716
- exports.authModeParams = authModeParams;
717
- /**
718
- * Retrieves custom headers from either the client or request options.
719
- * @param client V6Client | V6ClientSSRRequest | V6ClientSSRCookies - for extracting client headers
720
- * @param requestHeaders {@link CustomHeaders} - request headers
721
- * @returns custom headers as {@link CustomHeaders}
722
- */
723
- function getCustomHeaders(client, requestHeaders) {
724
- let headers = client[types_1.__headers] || {};
725
- // Individual request headers will take precedence over client headers.
726
- // We intentionally do *not* merge client and request headers.
727
- if (requestHeaders) {
728
- headers = requestHeaders;
729
- }
730
- return headers;
731
- }
732
- exports.getCustomHeaders = getCustomHeaders;
733
- //# sourceMappingURL=APIClient.js.map