@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.
- package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js +40 -31
- package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js.map +1 -1
- package/dist/cjs/internals/APIClient.js +145 -54
- package/dist/cjs/internals/APIClient.js.map +1 -1
- package/dist/cjs/internals/InternalGraphQLAPI.js +41 -42
- package/dist/cjs/internals/InternalGraphQLAPI.js.map +1 -1
- package/dist/cjs/internals/generateClient.js +15 -5
- package/dist/cjs/internals/generateClient.js.map +1 -1
- package/dist/cjs/internals/generateCustomOperationsProperty.js +50 -0
- package/dist/cjs/internals/generateCustomOperationsProperty.js.map +1 -0
- package/dist/cjs/internals/operations/custom.js +356 -0
- package/dist/cjs/internals/operations/custom.js.map +1 -0
- package/dist/cjs/internals/operations/get.js +1 -1
- package/dist/cjs/internals/operations/get.js.map +1 -1
- package/dist/cjs/internals/operations/indexQuery.js +1 -1
- package/dist/cjs/internals/operations/indexQuery.js.map +1 -1
- package/dist/cjs/internals/operations/list.js +2 -2
- package/dist/cjs/internals/operations/list.js.map +1 -1
- package/dist/cjs/internals/operations/subscription.js +1 -1
- package/dist/cjs/internals/operations/subscription.js.map +1 -1
- package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js +12 -2
- package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js.map +1 -1
- package/dist/cjs/internals/server/generateModelsProperty.js +1 -1
- package/dist/cjs/internals/server/generateModelsProperty.js.map +1 -1
- package/dist/cjs/internals/utils/clientProperties/generateEnumsProperty.js.map +1 -0
- package/dist/cjs/internals/utils/{generateModelsProperty.js → clientProperties/generateModelsProperty.js} +7 -7
- package/dist/cjs/internals/utils/clientProperties/generateModelsProperty.js.map +1 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js.map +1 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js.map +1 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js +15 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js.map +1 -0
- package/dist/cjs/internals/v6.js +0 -2
- package/dist/cjs/internals/v6.js.map +1 -1
- package/dist/cjs/utils/errors/constants.js +47 -0
- package/dist/cjs/utils/errors/constants.js.map +1 -0
- package/dist/cjs/utils/errors/createGraphQLResultWithError.js +15 -0
- package/dist/cjs/utils/errors/createGraphQLResultWithError.js.map +1 -0
- package/dist/cjs/utils/errors/index.js +3 -1
- package/dist/cjs/utils/errors/index.js.map +1 -1
- package/dist/cjs/utils/errors/repackageAuthError.js +7 -7
- package/dist/cjs/utils/errors/repackageAuthError.js.map +1 -1
- package/dist/cjs/utils/resolveOwnerFields.js +6 -0
- package/dist/cjs/utils/resolveOwnerFields.js.map +1 -1
- package/dist/esm/GraphQLAPI.d.ts +2 -2
- package/dist/esm/GraphQLAPI.mjs.map +1 -1
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +8 -8
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs +40 -31
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs.map +1 -1
- package/dist/esm/internals/APIClient.d.ts +10 -9
- package/dist/esm/internals/APIClient.mjs +144 -54
- package/dist/esm/internals/APIClient.mjs.map +1 -1
- package/dist/esm/internals/InternalGraphQLAPI.d.ts +1 -1
- package/dist/esm/internals/InternalGraphQLAPI.mjs +45 -44
- package/dist/esm/internals/InternalGraphQLAPI.mjs.map +1 -1
- package/dist/esm/internals/generateClient.mjs +15 -5
- package/dist/esm/internals/generateClient.mjs.map +1 -1
- package/dist/esm/internals/generateCustomOperationsProperty.d.ts +9 -0
- package/dist/esm/internals/generateCustomOperationsProperty.mjs +45 -0
- package/dist/esm/internals/generateCustomOperationsProperty.mjs.map +1 -0
- package/dist/esm/internals/operations/custom.d.ts +63 -0
- package/dist/esm/internals/operations/custom.mjs +354 -0
- package/dist/esm/internals/operations/custom.mjs.map +1 -0
- package/dist/esm/internals/operations/get.d.ts +1 -1
- package/dist/esm/internals/operations/get.mjs +1 -1
- package/dist/esm/internals/operations/get.mjs.map +1 -1
- package/dist/esm/internals/operations/indexQuery.d.ts +3 -3
- package/dist/esm/internals/operations/indexQuery.mjs +1 -1
- package/dist/esm/internals/operations/indexQuery.mjs.map +1 -1
- package/dist/esm/internals/operations/list.d.ts +1 -1
- package/dist/esm/internals/operations/list.mjs +2 -2
- package/dist/esm/internals/operations/list.mjs.map +1 -1
- package/dist/esm/internals/operations/subscription.d.ts +1 -1
- package/dist/esm/internals/operations/subscription.mjs +1 -1
- package/dist/esm/internals/operations/subscription.mjs.map +1 -1
- package/dist/esm/internals/server/generateClientWithAmplifyInstance.d.ts +1 -1
- package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs +12 -2
- package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs.map +1 -1
- package/dist/esm/internals/server/generateModelsProperty.d.ts +3 -3
- package/dist/esm/internals/server/generateModelsProperty.mjs +1 -1
- package/dist/esm/internals/server/generateModelsProperty.mjs.map +1 -1
- package/dist/esm/internals/types.d.ts +2 -2
- package/dist/esm/internals/utils/clientProperties/generateEnumsProperty.mjs.map +1 -0
- package/dist/esm/internals/utils/{generateModelsProperty.d.ts → clientProperties/generateModelsProperty.d.ts} +2 -2
- package/dist/esm/internals/utils/{generateModelsProperty.mjs → clientProperties/generateModelsProperty.mjs} +7 -7
- package/dist/esm/internals/utils/clientProperties/generateModelsProperty.mjs.map +1 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.mjs.map +1 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs.map +1 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.d.ts +2 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs +12 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs.map +1 -0
- package/dist/esm/internals/v6.d.ts +1 -1
- package/dist/esm/internals/v6.mjs +0 -2
- package/dist/esm/internals/v6.mjs.map +1 -1
- package/dist/esm/types/index.d.ts +43 -35
- package/dist/esm/utils/ConnectionStateMonitor.d.ts +2 -2
- package/dist/esm/utils/ConnectionStateMonitor.mjs.map +1 -1
- package/dist/esm/utils/ReachabilityMonitor/index.native.mjs.map +1 -1
- package/dist/esm/utils/errors/constants.d.ts +7 -0
- package/dist/esm/utils/errors/constants.mjs +46 -0
- package/dist/esm/utils/errors/constants.mjs.map +1 -0
- package/dist/esm/utils/errors/createGraphQLResultWithError.d.ts +2 -0
- package/dist/esm/utils/errors/createGraphQLResultWithError.mjs +13 -0
- package/dist/esm/utils/errors/createGraphQLResultWithError.mjs.map +1 -0
- package/dist/esm/utils/errors/index.d.ts +1 -0
- package/dist/esm/utils/errors/index.mjs +1 -0
- package/dist/esm/utils/errors/index.mjs.map +1 -1
- package/dist/esm/utils/errors/repackageAuthError.d.ts +3 -7
- package/dist/esm/utils/errors/repackageAuthError.mjs +6 -6
- package/dist/esm/utils/errors/repackageAuthError.mjs.map +1 -1
- package/dist/esm/utils/findIndexByFields.d.ts +1 -1
- package/dist/esm/utils/resolveConfig.mjs +1 -0
- package/dist/esm/utils/resolveConfig.mjs.map +1 -1
- package/dist/esm/utils/resolveOwnerFields.mjs +6 -0
- package/dist/esm/utils/resolveOwnerFields.mjs.map +1 -1
- package/package.json +8 -7
- package/src/GraphQLAPI.ts +4 -3
- package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +84 -64
- package/src/internals/APIClient.ts +242 -104
- package/src/internals/InternalGraphQLAPI.ts +65 -75
- package/src/internals/clientUtils.ts +1 -1
- package/src/internals/generateClient.ts +43 -6
- package/src/internals/generateCustomOperationsProperty.ts +112 -0
- package/src/internals/operations/custom.ts +492 -0
- package/src/internals/operations/get.ts +10 -9
- package/src/internals/operations/indexQuery.ts +13 -12
- package/src/internals/operations/list.ts +11 -15
- package/src/internals/operations/observeQuery.ts +3 -1
- package/src/internals/operations/subscription.ts +14 -10
- package/src/internals/server/generateClientWithAmplifyInstance.ts +26 -7
- package/src/internals/server/generateModelsProperty.ts +12 -6
- package/src/internals/types.ts +2 -2
- package/src/internals/utils/{generateEnumsProperty.ts → clientProperties/generateEnumsProperty.ts} +7 -6
- package/src/internals/utils/{generateModelsProperty.ts → clientProperties/generateModelsProperty.ts} +11 -10
- package/src/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.ts +15 -0
- package/src/internals/v6.ts +6 -4
- package/src/server/generateClient.ts +4 -1
- package/src/types/PubSub.ts +1 -0
- package/src/types/index.ts +61 -45
- package/src/utils/ConnectionStateMonitor.ts +8 -3
- package/src/utils/ReachabilityMonitor/index.native.ts +1 -1
- package/src/utils/ReachabilityMonitor/index.ts +1 -0
- package/src/utils/ReconnectionMonitor.ts +1 -0
- package/src/utils/errors/constants.ts +56 -0
- package/src/utils/errors/createGraphQLResultWithError.ts +15 -0
- package/src/utils/errors/index.ts +1 -0
- package/src/utils/errors/repackageAuthError.ts +11 -14
- package/src/utils/findIndexByFields.ts +1 -1
- package/src/utils/resolveConfig.ts +1 -0
- package/src/utils/resolveLibraryOptions.ts +1 -0
- package/src/utils/resolveOwnerFields.ts +19 -7
- package/src/utils/resolvePKFields.ts +1 -0
- package/dist/cjs/internals/utils/generateEnumsProperty.js.map +0 -1
- package/dist/cjs/internals/utils/generateModelsProperty.js.map +0 -1
- package/dist/cjs/internals/utils/isApiGraphQLProviderConfig.js.map +0 -1
- package/dist/cjs/internals/utils/isConfigureEventWithResourceConfig.js.map +0 -1
- package/dist/esm/internals/utils/generateEnumsProperty.mjs.map +0 -1
- package/dist/esm/internals/utils/generateModelsProperty.mjs.map +0 -1
- package/dist/esm/internals/utils/isApiGraphQLProviderConfig.mjs.map +0 -1
- package/dist/esm/internals/utils/isConfigureEventWithResourceConfig.mjs.map +0 -1
- /package/dist/cjs/internals/utils/{generateEnumsProperty.js → clientProperties/generateEnumsProperty.js} +0 -0
- /package/dist/cjs/internals/utils/{isApiGraphQLProviderConfig.js → runtimeTypeGuards/isApiGraphQLProviderConfig.js} +0 -0
- /package/dist/cjs/internals/utils/{isConfigureEventWithResourceConfig.js → runtimeTypeGuards/isConfigureEventWithResourceConfig.js} +0 -0
- /package/dist/esm/internals/utils/{generateEnumsProperty.d.ts → clientProperties/generateEnumsProperty.d.ts} +0 -0
- /package/dist/esm/internals/utils/{generateEnumsProperty.mjs → clientProperties/generateEnumsProperty.mjs} +0 -0
- /package/dist/esm/internals/utils/{isApiGraphQLProviderConfig.d.ts → runtimeTypeGuards/isApiGraphQLProviderConfig.d.ts} +0 -0
- /package/dist/esm/internals/utils/{isApiGraphQLProviderConfig.mjs → runtimeTypeGuards/isApiGraphQLProviderConfig.mjs} +0 -0
- /package/dist/esm/internals/utils/{isConfigureEventWithResourceConfig.d.ts → runtimeTypeGuards/isConfigureEventWithResourceConfig.d.ts} +0 -0
- /package/dist/esm/internals/utils/{isConfigureEventWithResourceConfig.mjs → runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs} +0 -0
- /package/src/internals/utils/{isApiGraphQLProviderConfig.ts → runtimeTypeGuards/isApiGraphQLProviderConfig.ts} +0 -0
- /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
|
-
|
|
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 {
|
|
26
|
-
|
|
26
|
+
import { resolveOwnerFields } from '../utils/resolveOwnerFields';
|
|
27
|
+
|
|
27
28
|
import type { IndexMeta } from './operations/indexQuery';
|
|
28
29
|
|
|
29
|
-
|
|
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
|
-
|
|
115
|
+
const targetNames: string[] = [];
|
|
113
116
|
if (modelField.association && 'targetNames' in modelField.association) {
|
|
114
|
-
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
|
|
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
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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
|
|
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
|
-
(
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
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
|
|
470
|
+
const nestedRelatedModelDefinition =
|
|
471
|
+
modelIntrospection.models[relatedModel];
|
|
388
472
|
|
|
389
473
|
result = {
|
|
390
|
-
[fieldName]:
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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 (!
|
|
608
|
+
if (!Object.prototype.hasOwnProperty.call(source, key)) continue;
|
|
501
609
|
|
|
502
|
-
if (
|
|
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
|
-
|
|
624
|
+
modelIntrospection: ModelIntrospectionSchema,
|
|
514
625
|
modelName: string,
|
|
515
626
|
selectionSet?: string[],
|
|
516
627
|
) {
|
|
517
|
-
const modelDefinition =
|
|
518
|
-
|
|
519
|
-
if (!selectionSet) {
|
|
520
|
-
return defaultSelectionSetForModel(modelDefinition).join(' ');
|
|
521
|
-
}
|
|
628
|
+
const modelDefinition = modelIntrospection.models[modelName];
|
|
522
629
|
|
|
523
630
|
const selSetIr = customSelectionSetToIR(
|
|
524
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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]) =>
|
|
787
|
+
([fieldName, type]) => `$${fieldName}: ${type}`,
|
|
661
788
|
)})`
|
|
662
789
|
: ''
|
|
663
790
|
} { ${graphQLFieldName}${
|
|
664
791
|
graphQLArguments
|
|
665
792
|
? `(${Object.keys(graphQLArguments).map(
|
|
666
|
-
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
|
|
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
|
|
880
|
-
* @param
|
|
881
|
-
* @returns {CustomHeaders}
|
|
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,
|