@aws-amplify/api-graphql 4.0.17 → 4.0.18-experimental-lerna-test.d2b0b08.55

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 (170) hide show
  1. package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js +40 -31
  2. package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js.map +1 -1
  3. package/dist/cjs/internals/APIClient.js +145 -54
  4. package/dist/cjs/internals/APIClient.js.map +1 -1
  5. package/dist/cjs/internals/InternalGraphQLAPI.js +41 -42
  6. package/dist/cjs/internals/InternalGraphQLAPI.js.map +1 -1
  7. package/dist/cjs/internals/generateClient.js +15 -5
  8. package/dist/cjs/internals/generateClient.js.map +1 -1
  9. package/dist/cjs/internals/generateCustomOperationsProperty.js +50 -0
  10. package/dist/cjs/internals/generateCustomOperationsProperty.js.map +1 -0
  11. package/dist/cjs/internals/operations/custom.js +356 -0
  12. package/dist/cjs/internals/operations/custom.js.map +1 -0
  13. package/dist/cjs/internals/operations/get.js +1 -1
  14. package/dist/cjs/internals/operations/get.js.map +1 -1
  15. package/dist/cjs/internals/operations/indexQuery.js +1 -1
  16. package/dist/cjs/internals/operations/indexQuery.js.map +1 -1
  17. package/dist/cjs/internals/operations/list.js +2 -2
  18. package/dist/cjs/internals/operations/list.js.map +1 -1
  19. package/dist/cjs/internals/operations/subscription.js +1 -1
  20. package/dist/cjs/internals/operations/subscription.js.map +1 -1
  21. package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js +12 -2
  22. package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js.map +1 -1
  23. package/dist/cjs/internals/server/generateModelsProperty.js +1 -1
  24. package/dist/cjs/internals/server/generateModelsProperty.js.map +1 -1
  25. package/dist/cjs/internals/utils/clientProperties/generateEnumsProperty.js.map +1 -0
  26. package/dist/cjs/internals/utils/{generateModelsProperty.js → clientProperties/generateModelsProperty.js} +7 -7
  27. package/dist/cjs/internals/utils/clientProperties/generateModelsProperty.js.map +1 -0
  28. package/dist/cjs/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js.map +1 -0
  29. package/dist/cjs/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js.map +1 -0
  30. package/dist/cjs/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js +15 -0
  31. package/dist/cjs/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js.map +1 -0
  32. package/dist/cjs/internals/v6.js +0 -2
  33. package/dist/cjs/internals/v6.js.map +1 -1
  34. package/dist/cjs/utils/errors/constants.js +47 -0
  35. package/dist/cjs/utils/errors/constants.js.map +1 -0
  36. package/dist/cjs/utils/errors/createGraphQLResultWithError.js +15 -0
  37. package/dist/cjs/utils/errors/createGraphQLResultWithError.js.map +1 -0
  38. package/dist/cjs/utils/errors/index.js +3 -1
  39. package/dist/cjs/utils/errors/index.js.map +1 -1
  40. package/dist/cjs/utils/errors/repackageAuthError.js +7 -7
  41. package/dist/cjs/utils/errors/repackageAuthError.js.map +1 -1
  42. package/dist/cjs/utils/resolveOwnerFields.js +6 -0
  43. package/dist/cjs/utils/resolveOwnerFields.js.map +1 -1
  44. package/dist/esm/GraphQLAPI.d.ts +2 -2
  45. package/dist/esm/GraphQLAPI.mjs.map +1 -1
  46. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +8 -8
  47. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs +40 -31
  48. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs.map +1 -1
  49. package/dist/esm/internals/APIClient.d.ts +10 -9
  50. package/dist/esm/internals/APIClient.mjs +144 -54
  51. package/dist/esm/internals/APIClient.mjs.map +1 -1
  52. package/dist/esm/internals/InternalGraphQLAPI.d.ts +1 -1
  53. package/dist/esm/internals/InternalGraphQLAPI.mjs +45 -44
  54. package/dist/esm/internals/InternalGraphQLAPI.mjs.map +1 -1
  55. package/dist/esm/internals/generateClient.mjs +15 -5
  56. package/dist/esm/internals/generateClient.mjs.map +1 -1
  57. package/dist/esm/internals/generateCustomOperationsProperty.d.ts +9 -0
  58. package/dist/esm/internals/generateCustomOperationsProperty.mjs +45 -0
  59. package/dist/esm/internals/generateCustomOperationsProperty.mjs.map +1 -0
  60. package/dist/esm/internals/operations/custom.d.ts +63 -0
  61. package/dist/esm/internals/operations/custom.mjs +354 -0
  62. package/dist/esm/internals/operations/custom.mjs.map +1 -0
  63. package/dist/esm/internals/operations/get.d.ts +1 -1
  64. package/dist/esm/internals/operations/get.mjs +1 -1
  65. package/dist/esm/internals/operations/get.mjs.map +1 -1
  66. package/dist/esm/internals/operations/indexQuery.d.ts +3 -3
  67. package/dist/esm/internals/operations/indexQuery.mjs +1 -1
  68. package/dist/esm/internals/operations/indexQuery.mjs.map +1 -1
  69. package/dist/esm/internals/operations/list.d.ts +1 -1
  70. package/dist/esm/internals/operations/list.mjs +2 -2
  71. package/dist/esm/internals/operations/list.mjs.map +1 -1
  72. package/dist/esm/internals/operations/subscription.d.ts +1 -1
  73. package/dist/esm/internals/operations/subscription.mjs +1 -1
  74. package/dist/esm/internals/operations/subscription.mjs.map +1 -1
  75. package/dist/esm/internals/server/generateClientWithAmplifyInstance.d.ts +1 -1
  76. package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs +12 -2
  77. package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs.map +1 -1
  78. package/dist/esm/internals/server/generateModelsProperty.d.ts +3 -3
  79. package/dist/esm/internals/server/generateModelsProperty.mjs +1 -1
  80. package/dist/esm/internals/server/generateModelsProperty.mjs.map +1 -1
  81. package/dist/esm/internals/types.d.ts +2 -2
  82. package/dist/esm/internals/utils/clientProperties/generateEnumsProperty.mjs.map +1 -0
  83. package/dist/esm/internals/utils/{generateModelsProperty.d.ts → clientProperties/generateModelsProperty.d.ts} +2 -2
  84. package/dist/esm/internals/utils/{generateModelsProperty.mjs → clientProperties/generateModelsProperty.mjs} +7 -7
  85. package/dist/esm/internals/utils/clientProperties/generateModelsProperty.mjs.map +1 -0
  86. package/dist/esm/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.mjs.map +1 -0
  87. package/dist/esm/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs.map +1 -0
  88. package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.d.ts +2 -0
  89. package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs +12 -0
  90. package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs.map +1 -0
  91. package/dist/esm/internals/v6.d.ts +1 -1
  92. package/dist/esm/internals/v6.mjs +0 -2
  93. package/dist/esm/internals/v6.mjs.map +1 -1
  94. package/dist/esm/types/index.d.ts +43 -35
  95. package/dist/esm/utils/ConnectionStateMonitor.d.ts +2 -2
  96. package/dist/esm/utils/ConnectionStateMonitor.mjs.map +1 -1
  97. package/dist/esm/utils/ReachabilityMonitor/index.native.mjs.map +1 -1
  98. package/dist/esm/utils/errors/constants.d.ts +7 -0
  99. package/dist/esm/utils/errors/constants.mjs +46 -0
  100. package/dist/esm/utils/errors/constants.mjs.map +1 -0
  101. package/dist/esm/utils/errors/createGraphQLResultWithError.d.ts +2 -0
  102. package/dist/esm/utils/errors/createGraphQLResultWithError.mjs +13 -0
  103. package/dist/esm/utils/errors/createGraphQLResultWithError.mjs.map +1 -0
  104. package/dist/esm/utils/errors/index.d.ts +1 -0
  105. package/dist/esm/utils/errors/index.mjs +1 -0
  106. package/dist/esm/utils/errors/index.mjs.map +1 -1
  107. package/dist/esm/utils/errors/repackageAuthError.d.ts +3 -7
  108. package/dist/esm/utils/errors/repackageAuthError.mjs +6 -6
  109. package/dist/esm/utils/errors/repackageAuthError.mjs.map +1 -1
  110. package/dist/esm/utils/findIndexByFields.d.ts +1 -1
  111. package/dist/esm/utils/resolveConfig.mjs +1 -0
  112. package/dist/esm/utils/resolveConfig.mjs.map +1 -1
  113. package/dist/esm/utils/resolveOwnerFields.mjs +6 -0
  114. package/dist/esm/utils/resolveOwnerFields.mjs.map +1 -1
  115. package/package.json +8 -7
  116. package/src/GraphQLAPI.ts +4 -3
  117. package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +84 -64
  118. package/src/internals/APIClient.ts +242 -104
  119. package/src/internals/InternalGraphQLAPI.ts +65 -75
  120. package/src/internals/clientUtils.ts +1 -1
  121. package/src/internals/generateClient.ts +43 -6
  122. package/src/internals/generateCustomOperationsProperty.ts +112 -0
  123. package/src/internals/operations/custom.ts +492 -0
  124. package/src/internals/operations/get.ts +10 -9
  125. package/src/internals/operations/indexQuery.ts +13 -12
  126. package/src/internals/operations/list.ts +11 -15
  127. package/src/internals/operations/observeQuery.ts +3 -1
  128. package/src/internals/operations/subscription.ts +14 -10
  129. package/src/internals/server/generateClientWithAmplifyInstance.ts +26 -7
  130. package/src/internals/server/generateModelsProperty.ts +12 -6
  131. package/src/internals/types.ts +2 -2
  132. package/src/internals/utils/{generateEnumsProperty.ts → clientProperties/generateEnumsProperty.ts} +7 -6
  133. package/src/internals/utils/{generateModelsProperty.ts → clientProperties/generateModelsProperty.ts} +11 -10
  134. package/src/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.ts +15 -0
  135. package/src/internals/v6.ts +6 -4
  136. package/src/server/generateClient.ts +4 -1
  137. package/src/types/PubSub.ts +1 -0
  138. package/src/types/index.ts +61 -45
  139. package/src/utils/ConnectionStateMonitor.ts +8 -3
  140. package/src/utils/ReachabilityMonitor/index.native.ts +1 -1
  141. package/src/utils/ReachabilityMonitor/index.ts +1 -0
  142. package/src/utils/ReconnectionMonitor.ts +1 -0
  143. package/src/utils/errors/constants.ts +56 -0
  144. package/src/utils/errors/createGraphQLResultWithError.ts +15 -0
  145. package/src/utils/errors/index.ts +1 -0
  146. package/src/utils/errors/repackageAuthError.ts +11 -14
  147. package/src/utils/findIndexByFields.ts +1 -1
  148. package/src/utils/resolveConfig.ts +1 -0
  149. package/src/utils/resolveLibraryOptions.ts +1 -0
  150. package/src/utils/resolveOwnerFields.ts +19 -7
  151. package/src/utils/resolvePKFields.ts +1 -0
  152. package/dist/cjs/internals/utils/generateEnumsProperty.js.map +0 -1
  153. package/dist/cjs/internals/utils/generateModelsProperty.js.map +0 -1
  154. package/dist/cjs/internals/utils/isApiGraphQLProviderConfig.js.map +0 -1
  155. package/dist/cjs/internals/utils/isConfigureEventWithResourceConfig.js.map +0 -1
  156. package/dist/esm/internals/utils/generateEnumsProperty.mjs.map +0 -1
  157. package/dist/esm/internals/utils/generateModelsProperty.mjs.map +0 -1
  158. package/dist/esm/internals/utils/isApiGraphQLProviderConfig.mjs.map +0 -1
  159. package/dist/esm/internals/utils/isConfigureEventWithResourceConfig.mjs.map +0 -1
  160. /package/dist/cjs/internals/utils/{generateEnumsProperty.js → clientProperties/generateEnumsProperty.js} +0 -0
  161. /package/dist/cjs/internals/utils/{isApiGraphQLProviderConfig.js → runtimeTypeGuards/isApiGraphQLProviderConfig.js} +0 -0
  162. /package/dist/cjs/internals/utils/{isConfigureEventWithResourceConfig.js → runtimeTypeGuards/isConfigureEventWithResourceConfig.js} +0 -0
  163. /package/dist/esm/internals/utils/{generateEnumsProperty.d.ts → clientProperties/generateEnumsProperty.d.ts} +0 -0
  164. /package/dist/esm/internals/utils/{generateEnumsProperty.mjs → clientProperties/generateEnumsProperty.mjs} +0 -0
  165. /package/dist/esm/internals/utils/{isApiGraphQLProviderConfig.d.ts → runtimeTypeGuards/isApiGraphQLProviderConfig.d.ts} +0 -0
  166. /package/dist/esm/internals/utils/{isApiGraphQLProviderConfig.mjs → runtimeTypeGuards/isApiGraphQLProviderConfig.mjs} +0 -0
  167. /package/dist/esm/internals/utils/{isConfigureEventWithResourceConfig.d.ts → runtimeTypeGuards/isConfigureEventWithResourceConfig.d.ts} +0 -0
  168. /package/dist/esm/internals/utils/{isConfigureEventWithResourceConfig.mjs → runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs} +0 -0
  169. /package/src/internals/utils/{isApiGraphQLProviderConfig.ts → runtimeTypeGuards/isApiGraphQLProviderConfig.ts} +0 -0
  170. /package/src/internals/utils/{isConfigureEventWithResourceConfig.ts → runtimeTypeGuards/isConfigureEventWithResourceConfig.ts} +0 -0
@@ -1,38 +1,39 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { resolveOwnerFields } from '../utils/resolveOwnerFields';
4
3
  import {
4
+ AssociationBelongsTo,
5
+ AssociationHasOne,
5
6
  GraphQLAuthMode,
6
- ModelIntrospectionSchema,
7
7
  ModelFieldType,
8
+ ModelIntrospectionSchema,
9
+ NonModelFieldType,
8
10
  SchemaModel,
9
- SchemaModels,
10
- AssociationHasOne,
11
- AssociationBelongsTo,
11
+ SchemaNonModel,
12
12
  } from '@aws-amplify/core/internals/utils';
13
+ import { AmplifyServer } from '@aws-amplify/core/internals/adapter-core';
14
+ import { CustomHeaders } from '@aws-amplify/data-schema-types';
15
+
13
16
  import {
14
17
  AuthModeParams,
15
18
  ClientWithModels,
16
19
  ListArgs,
17
20
  QueryArgs,
18
21
  V6Client,
19
- V6ClientSSRCookies,
20
- V6ClientSSRRequest,
21
22
  __authMode,
22
23
  __authToken,
23
24
  __headers,
24
25
  } from '../types';
25
- import { AmplifyServer } from '@aws-amplify/core/internals/adapter-core';
26
- import { CustomHeaders } from '@aws-amplify/data-schema-types';
26
+ import { resolveOwnerFields } from '../utils/resolveOwnerFields';
27
+
27
28
  import type { IndexMeta } from './operations/indexQuery';
28
29
 
29
- type LazyLoadOptions = {
30
+ interface LazyLoadOptions {
30
31
  authMode?: GraphQLAuthMode;
31
32
  authToken?: string | undefined;
32
33
  limit?: number | undefined;
33
34
  nextToken?: string | undefined | null;
34
35
  headers?: CustomHeaders | undefined;
35
- };
36
+ }
36
37
 
37
38
  const connectionType = {
38
39
  HAS_ONE: 'HAS_ONE',
@@ -54,9 +55,11 @@ export const flattenItems = (obj: Record<string, any>): Record<string, any> => {
54
55
  res[prop] = value.items.map((item: Record<string, any>) =>
55
56
  flattenItems(item),
56
57
  );
58
+
57
59
  return;
58
60
  }
59
61
  res[prop] = flattenItems(value);
62
+
60
63
  return;
61
64
  }
62
65
 
@@ -109,15 +112,17 @@ export function initializeModel(
109
112
  connectionFields = modelField.association.associatedWith;
110
113
  }
111
114
 
112
- let targetNames: string[] = [];
115
+ const targetNames: string[] = [];
113
116
  if (modelField.association && 'targetNames' in modelField.association) {
114
- targetNames = modelField.association.targetNames;
117
+ targetNames.push(...modelField.association.targetNames);
115
118
  }
116
119
 
117
120
  switch (relationType) {
118
121
  case connectionType.HAS_ONE:
119
- case connectionType.BELONGS_TO:
122
+ case connectionType.BELONGS_TO: {
120
123
  const sortKeyValues = relatedModelSKFieldNames.reduce(
124
+ // TODO(Eslint): is this implementation correct?
125
+ // eslint-disable-next-line array-callback-return
121
126
  (acc: Record<string, any>, curVal) => {
122
127
  if (record[curVal]) {
123
128
  return (acc[curVal] = record[curVal]);
@@ -132,9 +137,7 @@ export function initializeModel(
132
137
  options?: LazyLoadOptions,
133
138
  ) => {
134
139
  if (record[targetNames[0]]) {
135
- return (
136
- client as V6ClientSSRRequest<Record<string, any>>
137
- ).models[relatedModelName].get(
140
+ return (client as any).models[relatedModelName].get(
138
141
  contextSpec,
139
142
  {
140
143
  [relatedModelPKFieldName]: record[targetNames[0]],
@@ -146,6 +149,7 @@ export function initializeModel(
146
149
  },
147
150
  );
148
151
  }
152
+
149
153
  return undefined;
150
154
  };
151
155
  } else {
@@ -153,9 +157,7 @@ export function initializeModel(
153
157
  options?: LazyLoadOptions,
154
158
  ) => {
155
159
  if (record[targetNames[0]]) {
156
- return (client as V6Client<Record<string, any>>).models[
157
- relatedModelName
158
- ].get(
160
+ return (client as any).models[relatedModelName].get(
159
161
  {
160
162
  [relatedModelPKFieldName]: record[targetNames[0]],
161
163
  ...sortKeyValues,
@@ -166,12 +168,14 @@ export function initializeModel(
166
168
  },
167
169
  );
168
170
  }
171
+
169
172
  return undefined;
170
173
  };
171
174
  }
172
175
 
173
176
  break;
174
- case connectionType.HAS_MANY:
177
+ }
178
+ case connectionType.HAS_MANY: {
175
179
  const parentPk = introModel.primaryKeyInfo.primaryKeyFieldName;
176
180
  const parentSK = introModel.primaryKeyInfo.sortKeyFieldNames;
177
181
 
@@ -204,16 +208,18 @@ export function initializeModel(
204
208
  options?: LazyLoadOptions,
205
209
  ) => {
206
210
  if (record[parentPk]) {
207
- return (
208
- client as V6ClientSSRRequest<Record<string, any>>
209
- ).models[relatedModelName].list(contextSpec, {
210
- filter: { and: hasManyFilter },
211
- limit: options?.limit,
212
- nextToken: options?.nextToken,
213
- authMode: options?.authMode || authMode,
214
- authToken: options?.authToken || authToken,
215
- });
211
+ return (client as any).models[relatedModelName].list(
212
+ contextSpec,
213
+ {
214
+ filter: { and: hasManyFilter },
215
+ limit: options?.limit,
216
+ nextToken: options?.nextToken,
217
+ authMode: options?.authMode || authMode,
218
+ authToken: options?.authToken || authToken,
219
+ },
220
+ );
216
221
  }
222
+
217
223
  return [];
218
224
  };
219
225
  } else {
@@ -221,9 +227,7 @@ export function initializeModel(
221
227
  options?: LazyLoadOptions,
222
228
  ) => {
223
229
  if (record[parentPk]) {
224
- return (client as V6Client<Record<string, any>>).models[
225
- relatedModelName
226
- ].list({
230
+ return (client as any).models[relatedModelName].list({
227
231
  filter: { and: hasManyFilter },
228
232
  limit: options?.limit,
229
233
  nextToken: options?.nextToken,
@@ -231,6 +235,7 @@ export function initializeModel(
231
235
  authToken: options?.authToken || authToken,
232
236
  });
233
237
  }
238
+
234
239
  return [];
235
240
  };
236
241
  }
@@ -254,16 +259,18 @@ export function initializeModel(
254
259
  options?: LazyLoadOptions,
255
260
  ) => {
256
261
  if (record[parentPk]) {
257
- return (
258
- client as V6ClientSSRRequest<Record<string, any>>
259
- ).models[relatedModelName].list(contextSpec, {
260
- filter: { and: hasManyFilter },
261
- limit: options?.limit,
262
- nextToken: options?.nextToken,
263
- authMode: options?.authMode || authMode,
264
- authToken: options?.authToken || authToken,
265
- });
262
+ return (client as any).models[relatedModelName].list(
263
+ contextSpec,
264
+ {
265
+ filter: { and: hasManyFilter },
266
+ limit: options?.limit,
267
+ nextToken: options?.nextToken,
268
+ authMode: options?.authMode || authMode,
269
+ authToken: options?.authToken || authToken,
270
+ },
271
+ );
266
272
  }
273
+
267
274
  return [];
268
275
  };
269
276
  } else {
@@ -271,9 +278,7 @@ export function initializeModel(
271
278
  options?: LazyLoadOptions,
272
279
  ) => {
273
280
  if (record[parentPk]) {
274
- return (client as V6Client<Record<string, any>>).models[
275
- relatedModelName
276
- ].list({
281
+ return (client as any).models[relatedModelName].list({
277
282
  filter: { and: hasManyFilter },
278
283
  limit: options?.limit,
279
284
  nextToken: options?.nextToken,
@@ -281,11 +286,13 @@ export function initializeModel(
281
286
  authToken: options?.authToken || authToken,
282
287
  });
283
288
  }
289
+
284
290
  return [];
285
291
  };
286
292
  }
287
293
 
288
294
  break;
295
+ }
289
296
  default:
290
297
  break;
291
298
  }
@@ -309,23 +316,63 @@ export const graphQLOperationsInfo = {
309
316
  } as const;
310
317
  export type ModelOperation = keyof typeof graphQLOperationsInfo;
311
318
 
312
- type OperationPrefix =
313
- (typeof graphQLOperationsInfo)[ModelOperation]['operationPrefix'];
314
-
315
319
  const SELECTION_SET_WILDCARD = '*';
316
320
 
321
+ export function defaultSelectionSetForNonModelWithIR(
322
+ nonModelDefinition: SchemaNonModel,
323
+ modelIntrospection: ModelIntrospectionSchema,
324
+ ): Record<string, unknown> {
325
+ const { fields } = nonModelDefinition;
326
+ const mappedFields = Object.values(fields)
327
+ .map(({ type, name }) => {
328
+ if (typeof (type as { enum: string }).enum === 'string') {
329
+ return [name, FIELD_IR];
330
+ }
331
+
332
+ if (typeof (type as NonModelFieldType).nonModel === 'string') {
333
+ return [
334
+ name,
335
+ defaultSelectionSetForNonModelWithIR(
336
+ modelIntrospection.nonModels[(type as NonModelFieldType).nonModel],
337
+ modelIntrospection,
338
+ ),
339
+ ];
340
+ }
341
+
342
+ if (typeof type === 'string') {
343
+ return [name, FIELD_IR];
344
+ }
345
+
346
+ return undefined;
347
+ })
348
+ .filter(
349
+ (
350
+ pair: (string | Record<string, unknown>)[] | undefined,
351
+ ): pair is (string | Record<string, unknown>)[] => pair !== undefined,
352
+ );
353
+
354
+ return Object.fromEntries(mappedFields);
355
+ }
356
+
317
357
  function defaultSelectionSetForModel(modelDefinition: SchemaModel): string[] {
318
358
  // fields that are explicitly part of the graphql schema; not
319
359
  // inferred from owner auth rules.
320
360
  const { fields } = modelDefinition;
321
361
  const explicitFields = Object.values<any>(fields)
322
362
  // Default selection set omits model fields
323
- .map(
324
- ({ type, name }) =>
325
- (typeof type === 'string' ||
326
- (typeof type === 'object' && typeof type?.enum === 'string')) &&
327
- name,
328
- )
363
+ .map(({ type, name }) => {
364
+ if (typeof type === 'string') return name;
365
+
366
+ if (typeof type === 'object') {
367
+ if (typeof type?.enum === 'string') {
368
+ return name;
369
+ } else if (typeof type?.nonModel === 'string') {
370
+ return `${name}.${SELECTION_SET_WILDCARD}`;
371
+ }
372
+ }
373
+
374
+ return undefined;
375
+ })
329
376
  .filter(Boolean);
330
377
 
331
378
  // fields used for owner auth rules that may or may not also
@@ -357,59 +404,119 @@ const FIELD_IR = '';
357
404
  * ```
358
405
  */
359
406
  export function customSelectionSetToIR(
360
- modelDefinitions: SchemaModels,
407
+ modelIntrospection: ModelIntrospectionSchema,
361
408
  modelName: string,
362
409
  selectionSet: string[],
363
410
  ): Record<string, string | object> {
364
- const dotNotationToObject = (
365
- path: string,
366
- modelName: string,
367
- ): Record<string, any> => {
411
+ const dotNotationToObject = (path: string, modelOrNonModelName: string) => {
368
412
  const [fieldName, ...rest] = path.split('.');
369
413
 
370
- let result: Record<string, any> = {};
414
+ const nested = rest[0];
415
+ const modelOrNonModelDefinition =
416
+ modelIntrospection.models[modelOrNonModelName] ??
417
+ modelIntrospection.nonModels[modelOrNonModelName];
418
+
419
+ const modelOrNonModelFields = modelOrNonModelDefinition?.fields;
420
+ const relatedModel = (
421
+ modelOrNonModelFields?.[fieldName]?.type as ModelFieldType
422
+ )?.model;
423
+
424
+ const relatedModelDefinition = modelIntrospection.models[relatedModel];
425
+ const relatedNonModel = (
426
+ modelOrNonModelFields?.[fieldName]?.type as NonModelFieldType
427
+ )?.nonModel;
428
+ const relatedNonModelDefinition =
429
+ modelIntrospection.nonModels[relatedNonModel];
430
+
431
+ const isModelOrNonModelOrFieldType = relatedModelDefinition
432
+ ? 'model'
433
+ : relatedNonModelDefinition
434
+ ? 'nonModel'
435
+ : 'field';
436
+
437
+ if (isModelOrNonModelOrFieldType === 'nonModel') {
438
+ let result: Record<string, any> = {};
439
+
440
+ if (!nested) {
441
+ throw Error(
442
+ `${fieldName} must declare a wildcard (*) or a field of custom type ${relatedNonModel}`,
443
+ );
444
+ }
371
445
 
372
- if (rest.length === 0) {
373
- result = { [fieldName]: FIELD_IR };
374
- } else {
375
- const nested = rest[0];
376
- const modelDefinition = modelDefinitions[modelName];
377
- const modelFields = modelDefinition.fields;
378
- const relatedModel = (modelFields[fieldName]?.type as ModelFieldType)
379
- ?.model;
380
-
381
- if (!relatedModel) {
382
- // TODO: may need to change this to support custom types
383
- throw Error(`${fieldName} is not a model field`);
446
+ if (nested === SELECTION_SET_WILDCARD) {
447
+ result = {
448
+ [fieldName]: defaultSelectionSetForNonModelWithIR(
449
+ relatedNonModelDefinition,
450
+ modelIntrospection,
451
+ ),
452
+ };
453
+ } else {
454
+ result = {
455
+ [fieldName]: dotNotationToObject(rest.join('.'), relatedNonModel),
456
+ };
457
+ }
458
+
459
+ return result;
460
+ } else if (isModelOrNonModelOrFieldType === 'model') {
461
+ let result: Record<string, any> = {};
462
+
463
+ if (!nested) {
464
+ throw Error(
465
+ `${fieldName} must declare a wildcard (*) or a field of model ${relatedModel}`,
466
+ );
384
467
  }
385
468
 
386
469
  if (nested === SELECTION_SET_WILDCARD) {
387
- const relatedModelDefinition = modelDefinitions[relatedModel];
470
+ const nestedRelatedModelDefinition =
471
+ modelIntrospection.models[relatedModel];
388
472
 
389
473
  result = {
390
- [fieldName]: defaultSelectionSetIR(relatedModelDefinition),
474
+ [fieldName]: modelsDefaultSelectionSetIR(
475
+ nestedRelatedModelDefinition,
476
+ ),
391
477
  };
392
478
  } else {
393
- const exists = Boolean(modelFields[fieldName]);
394
- if (!exists) {
395
- throw Error(`${fieldName} is not a field of model ${modelName}`);
396
- }
397
-
398
479
  result = {
399
480
  [fieldName]: dotNotationToObject(rest.join('.'), relatedModel),
400
481
  };
401
482
  }
402
483
 
403
- if (modelFields[fieldName]?.isArray) {
484
+ if (modelOrNonModelFields[fieldName]?.isArray) {
404
485
  result = {
405
486
  [fieldName]: {
406
487
  items: result[fieldName],
407
488
  },
408
489
  };
409
490
  }
410
- }
411
491
 
412
- return result;
492
+ return result;
493
+ } else {
494
+ const modelField = modelOrNonModelFields?.[fieldName];
495
+
496
+ const nonModelDefinition =
497
+ modelIntrospection.nonModels[modelOrNonModelName];
498
+ const nonModelField = nonModelDefinition?.fields?.[fieldName];
499
+
500
+ if (!nonModelDefinition) {
501
+ const isOwnerField = resolveOwnerFields(
502
+ modelOrNonModelDefinition,
503
+ ).includes(fieldName);
504
+
505
+ if (!modelField && !isOwnerField) {
506
+ throw Error(
507
+ `${fieldName} is not a field of model ${modelOrNonModelName}`,
508
+ );
509
+ }
510
+ } else {
511
+ if (!nonModelField) {
512
+ throw Error(
513
+ `${fieldName} is not a field of custom type ${modelOrNonModelName}`,
514
+ );
515
+ }
516
+ }
517
+
518
+ return { [fieldName]: FIELD_IR };
519
+ }
413
520
  };
414
521
 
415
522
  return selectionSet.reduce(
@@ -422,7 +529,7 @@ export function customSelectionSetToIR(
422
529
  );
423
530
  }
424
531
 
425
- const defaultSelectionSetIR = (relatedModelDefinition: SchemaModel) => {
532
+ const modelsDefaultSelectionSetIR = (relatedModelDefinition: SchemaModel) => {
426
533
  const defaultSelectionSet = defaultSelectionSetForModel(
427
534
  relatedModelDefinition,
428
535
  );
@@ -430,6 +537,7 @@ const defaultSelectionSetIR = (relatedModelDefinition: SchemaModel) => {
430
537
  const reduced = defaultSelectionSet.reduce(
431
538
  (acc: Record<string, any>, curVal) => {
432
539
  acc[curVal] = FIELD_IR;
540
+
433
541
  return acc;
434
542
  },
435
543
  {},
@@ -497,9 +605,12 @@ function deepMergeSelectionSetObjects<T extends Record<string, any>>(
497
605
 
498
606
  for (const key in source) {
499
607
  // This verification avoids 'Prototype Pollution' issue
500
- if (!source.hasOwnProperty(key)) continue;
608
+ if (!Object.prototype.hasOwnProperty.call(source, key)) continue;
501
609
 
502
- if (target.hasOwnProperty(key) && isObject(target[key])) {
610
+ if (
611
+ Object.prototype.hasOwnProperty.call(target, key) &&
612
+ isObject(target[key])
613
+ ) {
503
614
  deepMergeSelectionSetObjects(source[key], target[key]);
504
615
  } else {
505
616
  target[key] = source[key];
@@ -510,20 +621,16 @@ function deepMergeSelectionSetObjects<T extends Record<string, any>>(
510
621
  }
511
622
 
512
623
  export function generateSelectionSet(
513
- modelDefinitions: SchemaModels,
624
+ modelIntrospection: ModelIntrospectionSchema,
514
625
  modelName: string,
515
626
  selectionSet?: string[],
516
627
  ) {
517
- const modelDefinition = modelDefinitions[modelName];
518
-
519
- if (!selectionSet) {
520
- return defaultSelectionSetForModel(modelDefinition).join(' ');
521
- }
628
+ const modelDefinition = modelIntrospection.models[modelName];
522
629
 
523
630
  const selSetIr = customSelectionSetToIR(
524
- modelDefinitions,
631
+ modelIntrospection,
525
632
  modelName,
526
- selectionSet,
633
+ selectionSet ?? defaultSelectionSetForModel(modelDefinition),
527
634
  );
528
635
  const selSetString = selectionSetIRToString(selSetIr);
529
636
 
@@ -531,13 +638,13 @@ export function generateSelectionSet(
531
638
  }
532
639
 
533
640
  export function generateGraphQLDocument(
534
- modelDefinitions: SchemaModels,
641
+ modelIntrospection: ModelIntrospectionSchema,
535
642
  modelName: string,
536
643
  modelOperation: ModelOperation,
537
644
  listArgs?: ListArgs | QueryArgs,
538
645
  indexMeta?: IndexMeta,
539
646
  ): string {
540
- const modelDefinition = modelDefinitions[modelName];
647
+ const modelDefinition = modelIntrospection.models[modelName];
541
648
 
542
649
  const {
543
650
  name,
@@ -566,6 +673,7 @@ export function generateGraphQLDocument(
566
673
  const skQueryArgs = sk.reduce((acc: Record<string, any>, fieldName) => {
567
674
  const fieldType = fields[fieldName].type;
568
675
  acc[fieldName] = `Model${fieldType}KeyConditionInput`;
676
+
569
677
  return acc;
570
678
  }, {});
571
679
 
@@ -584,7 +692,7 @@ export function generateGraphQLDocument(
584
692
  let graphQLArguments: Record<string, any> | undefined;
585
693
 
586
694
  const selectionSetFields = generateSelectionSet(
587
- modelDefinitions,
695
+ modelIntrospection,
588
696
  modelName,
589
697
  selectionSet as ListArgs['selectionSet'],
590
698
  );
@@ -601,6 +709,8 @@ export function generateGraphQLDocument(
601
709
  }${name}Input!`,
602
710
  });
603
711
  graphQLOperationType ?? (graphQLOperationType = 'mutation');
712
+ // TODO(Eslint): this this case clause correct without the break statement?
713
+ // eslint-disable-next-line no-fallthrough
604
714
  case 'READ':
605
715
  graphQLArguments ??
606
716
  (graphQLArguments = isCustomPrimaryKey
@@ -616,27 +726,44 @@ export function generateGraphQLDocument(
616
726
  [primaryKeyFieldName]: `${fields[primaryKeyFieldName].type}!`,
617
727
  });
618
728
  graphQLSelectionSet ?? (graphQLSelectionSet = selectionSetFields);
729
+ // TODO(Eslint): this this case clause correct without the break statement?
730
+ // eslint-disable-next-line no-fallthrough
619
731
  case 'LIST':
620
732
  graphQLArguments ??
621
733
  (graphQLArguments = {
622
734
  filter: `Model${name}FilterInput`,
735
+ ...(sortKeyFieldNames.length > 0
736
+ ? [primaryKeyFieldName, ...sortKeyFieldNames].reduce(
737
+ (acc: Record<string, any>, fieldName) => {
738
+ acc[fieldName] = `${fields[fieldName].type}`;
739
+
740
+ return acc;
741
+ },
742
+ { sortDirection: 'ModelSortDirection' },
743
+ )
744
+ : []),
623
745
  limit: 'Int',
624
746
  nextToken: 'String',
625
747
  });
626
748
  graphQLOperationType ?? (graphQLOperationType = 'query');
627
749
  graphQLSelectionSet ??
628
750
  (graphQLSelectionSet = `items { ${selectionSetFields} } nextToken __typename`);
751
+ // TODO(Eslint): this this case clause correct without the break statement?
752
+ // eslint-disable-next-line no-fallthrough
629
753
  case 'INDEX_QUERY':
630
754
  graphQLArguments ??
631
755
  (graphQLArguments = {
632
756
  ...indexQueryArgs!,
633
757
  filter: `Model${name}FilterInput`,
758
+ sortDirection: 'ModelSortDirection',
634
759
  limit: 'Int',
635
760
  nextToken: 'String',
636
761
  });
637
762
  graphQLOperationType ?? (graphQLOperationType = 'query');
638
763
  graphQLSelectionSet ??
639
764
  (graphQLSelectionSet = `items { ${selectionSetFields} } nextToken __typename`);
765
+ // TODO(Eslint): this this case clause correct without the break statement?
766
+ // eslint-disable-next-line no-fallthrough
640
767
  case 'ONCREATE':
641
768
  case 'ONUPDATE':
642
769
  case 'ONDELETE':
@@ -657,13 +784,13 @@ export function generateGraphQLDocument(
657
784
  const graphQLDocument = `${graphQLOperationType}${
658
785
  graphQLArguments
659
786
  ? `(${Object.entries(graphQLArguments).map(
660
- ([fieldName, type]) => `\$${fieldName}: ${type}`,
787
+ ([fieldName, type]) => `$${fieldName}: ${type}`,
661
788
  )})`
662
789
  : ''
663
790
  } { ${graphQLFieldName}${
664
791
  graphQLArguments
665
792
  ? `(${Object.keys(graphQLArguments).map(
666
- fieldName => `${fieldName}: \$${fieldName}`,
793
+ fieldName => `${fieldName}: $${fieldName}`,
667
794
  )})`
668
795
  : ''
669
796
  } { ${graphQLSelectionSet} } }`;
@@ -742,6 +869,10 @@ export function buildGraphQLVariables(
742
869
  if (arg?.filter) {
743
870
  variables.filter = arg.filter;
744
871
  }
872
+ if (arg?.sortDirection) {
873
+ variables.sortDirection = arg.sortDirection;
874
+ variables[primaryKeyFieldName] = arg[primaryKeyFieldName];
875
+ }
745
876
  if (arg?.nextToken) {
746
877
  variables.nextToken = arg.nextToken;
747
878
  }
@@ -749,7 +880,7 @@ export function buildGraphQLVariables(
749
880
  variables.limit = arg.limit;
750
881
  }
751
882
  break;
752
- case 'INDEX_QUERY':
883
+ case 'INDEX_QUERY': {
753
884
  const { pk, sk = [] } = indexMeta!;
754
885
 
755
886
  variables[pk] = arg![pk];
@@ -761,6 +892,11 @@ export function buildGraphQLVariables(
761
892
  if (arg?.filter) {
762
893
  variables.filter = arg.filter;
763
894
  }
895
+
896
+ if (arg?.sortDirection) {
897
+ variables.sortDirection = arg.sortDirection;
898
+ }
899
+
764
900
  if (arg?.nextToken) {
765
901
  variables.nextToken = arg.nextToken;
766
902
  }
@@ -768,6 +904,7 @@ export function buildGraphQLVariables(
768
904
  variables.limit = arg.limit;
769
905
  }
770
906
  break;
907
+ }
771
908
  case 'ONCREATE':
772
909
  case 'ONUPDATE':
773
910
  case 'ONDELETE':
@@ -780,9 +917,10 @@ export function buildGraphQLVariables(
780
917
  'Internal error: Attempted to build variables for observeQuery. Please report this error.',
781
918
  );
782
919
  break;
783
- default:
920
+ default: {
784
921
  const exhaustiveCheck: never = operation;
785
922
  throw new Error(`Unhandled operation case: ${exhaustiveCheck}`);
923
+ }
786
924
  }
787
925
 
788
926
  return variables;
@@ -861,7 +999,7 @@ export function normalizeMutationInput(
861
999
  * as a fallback.
862
1000
  *
863
1001
  * @param client Configured client from `generateClient`
864
- * @param options Args/Options obect from call site.
1002
+ * @param options Args/Options object from call site.
865
1003
  * @returns
866
1004
  */
867
1005
  export function authModeParams(
@@ -876,9 +1014,9 @@ export function authModeParams(
876
1014
 
877
1015
  /**
878
1016
  * Retrieves custom headers from either the client or request options.
879
- * @param {client} V6Client | V6ClientSSRRequest | V6ClientSSRCookies - for extracting client headers
880
- * @param {requestHeaders} [CustomHeaders] - request headers
881
- * @returns {CustomHeaders} - custom headers
1017
+ * @param client V6Client | V6ClientSSRRequest | V6ClientSSRCookies - for extracting client headers
1018
+ * @param requestHeaders {@link CustomHeaders} - request headers
1019
+ * @returns custom headers as {@link CustomHeaders}
882
1020
  */
883
1021
  export function getCustomHeaders(
884
1022
  client: V6Client | ClientWithModels,