@aws-amplify/graphql-model-transformer 0.8.0-beta.2 → 0.9.4-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,20 @@
1
- import { TransformerTransformSchemaStepContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
1
+ import { TransformerContextProvider, TransformerTransformSchemaStepContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
2
2
  import {
3
+ DirectiveNode,
3
4
  EnumTypeDefinitionNode,
4
5
  FieldDefinitionNode,
5
6
  InputObjectTypeDefinitionNode,
6
7
  Kind,
8
+ NamedTypeNode,
7
9
  ObjectTypeDefinitionNode,
8
10
  TypeDefinitionNode,
9
11
  } from 'graphql';
10
12
  import {
13
+ blankObjectExtension,
11
14
  DEFAULT_SCALARS,
15
+ extendFieldWithDirectives,
16
+ extensionWithDirectives,
17
+ getBaseType,
12
18
  makeArgument,
13
19
  makeDirective,
14
20
  makeField,
@@ -29,6 +35,7 @@ import {
29
35
  SIZE_CONDITIONS,
30
36
  STRING_CONDITIONS,
31
37
  STRING_FUNCTIONS,
38
+ API_KEY_DIRECTIVE,
32
39
  } from '../definitions';
33
40
  import {
34
41
  EnumWrapper,
@@ -245,7 +252,96 @@ export function makeEnumFilterInput(fieldWrapper: FieldWrapper): InputObjectType
245
252
  return input.serialize();
246
253
  }
247
254
 
255
+ export const addDirectivesToField = (
256
+ ctx: TransformerTransformSchemaStepContextProvider,
257
+ typeName: string,
258
+ fieldName: string,
259
+ directives: Array<DirectiveNode>,
260
+ ) => {
261
+ const type = ctx.output.getType(typeName) as ObjectTypeDefinitionNode;
262
+ if (type) {
263
+ const field = type.fields?.find(f => f.name.value === fieldName);
264
+ if (field) {
265
+ const newFields = [...type.fields!.filter(f => f.name.value !== field.name.value), extendFieldWithDirectives(field, directives)];
266
+
267
+ const newType = {
268
+ ...type,
269
+ fields: newFields,
270
+ };
271
+
272
+ ctx.output.putType(newType);
273
+ }
274
+ }
275
+ };
276
+
277
+ export const addDirectivesToOperation = (
278
+ ctx: TransformerTransformSchemaStepContextProvider,
279
+ typeName: string,
280
+ operationName: string,
281
+ directives: Array<DirectiveNode>,
282
+ ) => {
283
+ // add directives to the given operation
284
+ addDirectivesToField(ctx, typeName, operationName, directives);
285
+
286
+ // add the directives to the result type of the operation
287
+ const type = ctx.output.getType(typeName) as ObjectTypeDefinitionNode;
288
+ if (type) {
289
+ const field = type.fields!.find(f => f.name.value === operationName);
290
+
291
+ if (field) {
292
+ const returnFieldType = field.type as NamedTypeNode;
293
+
294
+ if (returnFieldType.name) {
295
+ const returnTypeName = returnFieldType.name.value;
296
+
297
+ extendTypeWithDirectives(ctx, returnTypeName, directives);
298
+ }
299
+ }
300
+ }
301
+ };
302
+
303
+ export const extendTypeWithDirectives = (
304
+ ctx: TransformerTransformSchemaStepContextProvider,
305
+ typeName: string,
306
+ directives: Array<DirectiveNode>,
307
+ ): void => {
308
+ let objectTypeExtension = blankObjectExtension(typeName);
309
+ objectTypeExtension = extensionWithDirectives(objectTypeExtension, directives);
310
+ ctx.output.addObjectExtension(objectTypeExtension);
311
+ };
312
+
248
313
  export function makeModelSortDirectionEnumObject(): EnumTypeDefinitionNode {
249
314
  const name = 'ModelSortDirection';
250
315
  return EnumWrapper.create(name, ['ASC', 'DESC']).serialize();
251
316
  }
317
+ // the smaller version of it's @auth equivalent since we only support
318
+ // apikey as the only global auth rule
319
+ export const propagateApiKeyToNestedTypes = (
320
+ ctx: TransformerContextProvider,
321
+ def: ObjectTypeDefinitionNode,
322
+ seenNonModelTypes: Set<string>,
323
+ ) => {
324
+ const nonModelTypePredicate = (fieldType: TypeDefinitionNode): TypeDefinitionNode | undefined => {
325
+ if (fieldType) {
326
+ if (fieldType.kind !== 'ObjectTypeDefinition') {
327
+ return undefined;
328
+ }
329
+ const typeModel = fieldType.directives!.find(dir => dir.name.value === 'model');
330
+ return typeModel !== undefined ? undefined : fieldType;
331
+ }
332
+ return fieldType;
333
+ };
334
+ const nonModelFieldTypes = def
335
+ .fields!.map(f => ctx.output.getType(getBaseType(f.type)) as TypeDefinitionNode)
336
+ .filter(nonModelTypePredicate);
337
+ for (const nonModelFieldType of nonModelFieldTypes) {
338
+ const nonModelName = nonModelFieldType.name.value;
339
+ const hasSeenType = seenNonModelTypes.has(nonModelName);
340
+ const hasApiKey = nonModelFieldType.directives?.some(dir => dir.name.value === API_KEY_DIRECTIVE) ?? false;
341
+ if (!hasSeenType && !hasApiKey) {
342
+ seenNonModelTypes.add(nonModelName);
343
+ extendTypeWithDirectives(ctx, nonModelName, [makeDirective(API_KEY_DIRECTIVE, [])]);
344
+ propagateApiKeyToNestedTypes(ctx, nonModelFieldType as ObjectTypeDefinitionNode, seenNonModelTypes);
345
+ }
346
+ }
347
+ };
@@ -96,10 +96,8 @@ export const generateResolverKey = (typeName: string, fieldName: string): string
96
96
 
97
97
  /**
98
98
  * Util function to generate sandbox mode expression
99
- * @param ctx context to get sandbox mode
100
99
  */
101
- export const generateAuthExpressionForSandboxMode = (ctx: any): string => {
102
- const enabled = ctx.resourceHelper.api.sandboxModeEnabled;
100
+ export const generateAuthExpressionForSandboxMode = (enabled: boolean): string => {
103
101
  let exp;
104
102
 
105
103
  if (enabled) exp = iff(notEquals(methodCall(ref('util.authType')), str(API_KEY)), methodCall(ref('util.unauthorized')));