@aws-amplify/graphql-model-transformer 0.7.0-graphql-vnext-dev-preview.2 → 0.7.0-graphql-vnext-dev-preview.8

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,4 +1,12 @@
1
- import { InvalidDirectiveError, MappingTemplate, SyncConfig, SyncUtils, TransformerModelBase } from '@aws-amplify/graphql-transformer-core';
1
+ import {
2
+ DirectiveWrapper,
3
+ InvalidDirectiveError,
4
+ MappingTemplate,
5
+ SyncConfig,
6
+ SyncUtils,
7
+ TransformerModelBase,
8
+ TransformerNestedStack,
9
+ } from '@aws-amplify/graphql-transformer-core';
2
10
  import {
3
11
  AppSyncDataSourceType,
4
12
  DataSourceInstance,
@@ -13,6 +21,7 @@ import {
13
21
  TransformerSchemaVisitStepContextProvider,
14
22
  TransformerTransformSchemaStepContextProvider,
15
23
  TransformerValidationStepContextProvider,
24
+ TransformerBeforeStepContextProvider,
16
25
  } from '@aws-amplify/graphql-transformer-interfaces';
17
26
  import { AttributeType, CfnTable, ITable, StreamViewType, Table, TableEncryption } from '@aws-cdk/aws-dynamodb';
18
27
  import * as iam from '@aws-cdk/aws-iam';
@@ -37,6 +46,7 @@ import {
37
46
  makeValueNode,
38
47
  ModelResourceIDs,
39
48
  plurality,
49
+ ResolverResourceIDs,
40
50
  ResourceConstants,
41
51
  SyncResourceIDs,
42
52
  toCamelCase,
@@ -71,12 +81,7 @@ import {
71
81
  generateListRequestTemplate,
72
82
  generateSyncRequestTemplate,
73
83
  } from './resolvers/query';
74
- import {
75
- DirectiveWrapper,
76
- FieldWrapper,
77
- InputObjectDefinitionWrapper,
78
- ObjectDefinitionWrapper,
79
- } from './wrappers/object-definition-wrapper';
84
+ import { FieldWrapper, InputObjectDefinitionWrapper, ObjectDefinitionWrapper } from './wrappers/object-definition-wrapper';
80
85
  import { CfnRole } from '@aws-cdk/aws-iam';
81
86
  import md5 from 'md5';
82
87
 
@@ -164,6 +169,37 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
164
169
  this.options = this.getOptions(options);
165
170
  }
166
171
 
172
+ before = (ctx: TransformerBeforeStepContextProvider) => {
173
+ // add model related-parameters to the root stack
174
+ ctx.stackManager.addParameter(ResourceConstants.PARAMETERS.DynamoDBModelTableReadIOPS, {
175
+ description: 'The number of read IOPS the table should support.',
176
+ type: 'Number',
177
+ default: 5,
178
+ });
179
+ ctx.stackManager.addParameter(ResourceConstants.PARAMETERS.DynamoDBModelTableWriteIOPS, {
180
+ description: 'The number of write IOPS the table should support.',
181
+ type: 'Number',
182
+ default: 5,
183
+ });
184
+ ctx.stackManager.addParameter(ResourceConstants.PARAMETERS.DynamoDBBillingMode, {
185
+ description: 'Configure @model types to create DynamoDB tables with PAY_PER_REQUEST or PROVISIONED billing modes.',
186
+ default: 'PAY_PER_REQUEST',
187
+ allowedValues: ['PAY_PER_REQUEST', 'PROVISIONED'],
188
+ });
189
+ ctx.stackManager.addParameter(ResourceConstants.PARAMETERS.DynamoDBEnablePointInTimeRecovery, {
190
+ description: 'Whether to enable Point in Time Recovery on the table.',
191
+ type: 'String',
192
+ default: 'false',
193
+ allowedValues: ['true', 'false'],
194
+ });
195
+ ctx.stackManager.addParameter(ResourceConstants.PARAMETERS.DynamoDBEnableServerSideEncryption, {
196
+ description: 'Enable server side encryption powered by KMS.',
197
+ type: 'String',
198
+ default: 'true',
199
+ allowedValues: ['true', 'false'],
200
+ });
201
+ };
202
+
167
203
  object = (definition: ObjectTypeDefinitionNode, directive: DirectiveNode, ctx: TransformerSchemaVisitStepContextProvider): void => {
168
204
  const isTypeNameReserved =
169
205
  definition.name.value === ctx.output.getQueryTypeName() ||
@@ -241,8 +277,6 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
241
277
  this.addAutoGeneratableFields(ctx, type);
242
278
 
243
279
  if (ctx.isProjectUsingDataStore()) {
244
- SyncUtils.validateResolverConfigForType(ctx, def!.name.value);
245
- this.options.SyncConfig = SyncUtils.getSyncConfig(ctx, def!.name.value);
246
280
  this.addModelSyncFields(ctx, type);
247
281
  }
248
282
  }
@@ -262,13 +296,13 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
262
296
  let resolver;
263
297
  switch (query.type) {
264
298
  case QueryFieldType.GET:
265
- resolver = this.generateGetResolver(context, def!, query.typeName, query.fieldName);
299
+ resolver = this.generateGetResolver(context, def!, query.typeName, query.fieldName, query.resolverLogicalId);
266
300
  break;
267
301
  case QueryFieldType.LIST:
268
- resolver = this.generateListResolver(context, def!, query.typeName, query.fieldName);
302
+ resolver = this.generateListResolver(context, def!, query.typeName, query.fieldName, query.resolverLogicalId);
269
303
  break;
270
304
  case QueryFieldType.SYNC:
271
- resolver = this.generateSyncResolver(context, def!, query.typeName, query.fieldName);
305
+ resolver = this.generateSyncResolver(context, def!, query.typeName, query.fieldName, query.resolverLogicalId);
272
306
  break;
273
307
  default:
274
308
  throw new Error('Unknown query field type');
@@ -289,13 +323,13 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
289
323
  let resolver;
290
324
  switch (mutation.type) {
291
325
  case MutationFieldType.CREATE:
292
- resolver = this.generateCreateResolver(context, def!, mutation.typeName, mutation.fieldName);
326
+ resolver = this.generateCreateResolver(context, def!, mutation.typeName, mutation.fieldName, mutation.resolverLogicalId);
293
327
  break;
294
328
  case MutationFieldType.DELETE:
295
- resolver = this.generateDeleteResolver(context, def!, mutation.typeName, mutation.fieldName);
329
+ resolver = this.generateDeleteResolver(context, def!, mutation.typeName, mutation.fieldName, mutation.resolverLogicalId);
296
330
  break;
297
331
  case MutationFieldType.UPDATE:
298
- resolver = this.generateUpdateResolver(context, def!, mutation.typeName, mutation.fieldName);
332
+ resolver = this.generateUpdateResolver(context, def!, mutation.typeName, mutation.fieldName, mutation.resolverLogicalId);
299
333
  break;
300
334
  default:
301
335
  throw new Error('Unknown mutation field type');
@@ -319,13 +353,31 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
319
353
  let resolver;
320
354
  switch (subscription.type) {
321
355
  case SubscriptionFieldType.ON_CREATE:
322
- resolver = this.generateOnCreateResolver(context, def, subscription.typeName, subscription.fieldName);
356
+ resolver = this.generateOnCreateResolver(
357
+ context,
358
+ def,
359
+ subscription.typeName,
360
+ subscription.fieldName,
361
+ subscription.resolverLogicalId,
362
+ );
323
363
  break;
324
364
  case SubscriptionFieldType.ON_UPDATE:
325
- resolver = this.generateOnUpdateResolver(context, def, subscription.typeName, subscription.fieldName);
365
+ resolver = this.generateOnUpdateResolver(
366
+ context,
367
+ def,
368
+ subscription.typeName,
369
+ subscription.fieldName,
370
+ subscription.resolverLogicalId,
371
+ );
326
372
  break;
327
373
  case SubscriptionFieldType.ON_DELETE:
328
- resolver = this.generateOnDeleteResolver(context, def, subscription.typeName, subscription.fieldName);
374
+ resolver = this.generateOnDeleteResolver(
375
+ context,
376
+ def,
377
+ subscription.typeName,
378
+ subscription.fieldName,
379
+ subscription.resolverLogicalId,
380
+ );
329
381
  break;
330
382
  default:
331
383
  throw new Error('Unknown subscription field type');
@@ -349,6 +401,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
349
401
  type: ObjectTypeDefinitionNode,
350
402
  typeName: string,
351
403
  fieldName: string,
404
+ resolverLogicalId: string,
352
405
  ): TransformerResolverProvider => {
353
406
  const isSyncEnabled = ctx.isProjectUsingDataStore();
354
407
  const dataSource = this.datasourceMap[type.name.value];
@@ -357,6 +410,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
357
410
  this.resolverMap[resolverKey] = ctx.resolvers.generateQueryResolver(
358
411
  typeName,
359
412
  fieldName,
413
+ resolverLogicalId,
360
414
  dataSource,
361
415
  MappingTemplate.s3MappingTemplateFromString(generateGetRequestTemplate(), `${typeName}.${fieldName}.req.vtl`),
362
416
  MappingTemplate.s3MappingTemplateFromString(generateGetResponseTemplate(isSyncEnabled), `${typeName}.${fieldName}.res.vtl`),
@@ -370,6 +424,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
370
424
  type: ObjectTypeDefinitionNode,
371
425
  typeName: string,
372
426
  fieldName: string,
427
+ resolverLogicalId: string,
373
428
  ): TransformerResolverProvider => {
374
429
  const isSyncEnabled = ctx.isProjectUsingDataStore();
375
430
  const dataSource = this.datasourceMap[type.name.value];
@@ -378,6 +433,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
378
433
  this.resolverMap[resolverKey] = ctx.resolvers.generateQueryResolver(
379
434
  typeName,
380
435
  fieldName,
436
+ resolverLogicalId,
381
437
  dataSource,
382
438
  MappingTemplate.s3MappingTemplateFromString(generateListRequestTemplate(), `${typeName}.${fieldName}.req.vtl`),
383
439
  MappingTemplate.s3MappingTemplateFromString(
@@ -394,6 +450,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
394
450
  type: ObjectTypeDefinitionNode,
395
451
  typeName: string,
396
452
  fieldName: string,
453
+ resolverLogicalId: string,
397
454
  ): TransformerResolverProvider => {
398
455
  const isSyncEnabled = ctx.isProjectUsingDataStore();
399
456
  const dataSource = this.datasourceMap[type.name.value];
@@ -402,6 +459,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
402
459
  const resolver = ctx.resolvers.generateMutationResolver(
403
460
  typeName,
404
461
  fieldName,
462
+ resolverLogicalId,
405
463
  dataSource,
406
464
  MappingTemplate.s3MappingTemplateFromString(
407
465
  generateUpdateRequestTemplate(typeName, isSyncEnabled),
@@ -429,6 +487,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
429
487
  type: ObjectTypeDefinitionNode,
430
488
  typeName: string,
431
489
  fieldName: string,
490
+ resolverLogicalId: string,
432
491
  ): TransformerResolverProvider => {
433
492
  const isSyncEnabled = ctx.isProjectUsingDataStore();
434
493
  const dataSource = this.datasourceMap[type.name.value];
@@ -437,6 +496,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
437
496
  this.resolverMap[resolverKey] = ctx.resolvers.generateMutationResolver(
438
497
  typeName,
439
498
  fieldName,
499
+ resolverLogicalId,
440
500
  dataSource,
441
501
  MappingTemplate.s3MappingTemplateFromString(generateDeleteRequestTemplate(isSyncEnabled), `${typeName}.${fieldName}.req.vtl`),
442
502
  MappingTemplate.s3MappingTemplateFromString(
@@ -453,12 +513,14 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
453
513
  type: ObjectTypeDefinitionNode,
454
514
  typeName: string,
455
515
  fieldName: string,
516
+ resolverLogicalId: string,
456
517
  ): TransformerResolverProvider => {
457
518
  const resolverKey = `OnCreate${generateResolverKey(typeName, fieldName)}`;
458
519
  if (!this.resolverMap[resolverKey]) {
459
520
  this.resolverMap[resolverKey] = ctx.resolvers.generateSubscriptionResolver(
460
521
  typeName,
461
522
  fieldName,
523
+ resolverLogicalId,
462
524
  MappingTemplate.s3MappingTemplateFromString(generateSubscriptionRequestTemplate(), `${typeName}.${fieldName}.req.vtl`),
463
525
  MappingTemplate.s3MappingTemplateFromString(generateSubscriptionResponseTemplate(), `${typeName}.${fieldName}.res.vtl`),
464
526
  );
@@ -470,12 +532,14 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
470
532
  type: ObjectTypeDefinitionNode,
471
533
  typeName: string,
472
534
  fieldName: string,
535
+ resolverLogicalId: string,
473
536
  ): TransformerResolverProvider => {
474
537
  const resolverKey = `OnUpdate${generateResolverKey(typeName, fieldName)}`;
475
538
  if (!this.resolverMap[resolverKey]) {
476
539
  this.resolverMap[resolverKey] = ctx.resolvers.generateSubscriptionResolver(
477
540
  typeName,
478
541
  fieldName,
542
+ resolverLogicalId,
479
543
  MappingTemplate.s3MappingTemplateFromString(generateSubscriptionRequestTemplate(), `${typeName}.${fieldName}.req.vtl`),
480
544
  MappingTemplate.s3MappingTemplateFromString(generateSubscriptionResponseTemplate(), `${typeName}.${fieldName}.res.vtl`),
481
545
  );
@@ -487,12 +551,14 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
487
551
  type: ObjectTypeDefinitionNode,
488
552
  typeName: string,
489
553
  fieldName: string,
554
+ resolverLogicalId: string,
490
555
  ): TransformerResolverProvider => {
491
556
  const resolverKey = `OnDelete${generateResolverKey(typeName, fieldName)}`;
492
557
  if (!this.resolverMap[resolverKey]) {
493
558
  this.resolverMap[resolverKey] = ctx.resolvers.generateSubscriptionResolver(
494
559
  typeName,
495
560
  fieldName,
561
+ resolverLogicalId,
496
562
  MappingTemplate.s3MappingTemplateFromString(generateSubscriptionRequestTemplate(), `${typeName}.${fieldName}.req.vtl`),
497
563
  MappingTemplate.s3MappingTemplateFromString(generateSubscriptionResponseTemplate(), `${typeName}.${fieldName}.res.vtl`),
498
564
  );
@@ -504,6 +570,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
504
570
  type: ObjectTypeDefinitionNode,
505
571
  typeName: string,
506
572
  fieldName: string,
573
+ resolverLogicalId: string,
507
574
  ): TransformerResolverProvider => {
508
575
  const isSyncEnabled = ctx.isProjectUsingDataStore();
509
576
  const dataSource = this.datasourceMap[type.name.value];
@@ -512,6 +579,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
512
579
  this.resolverMap[resolverKey] = ctx.resolvers.generateQueryResolver(
513
580
  typeName,
514
581
  fieldName,
582
+ resolverLogicalId,
515
583
  dataSource,
516
584
  MappingTemplate.s3MappingTemplateFromString(generateSyncRequestTemplate(), `${typeName}.${fieldName}.req.vtl`),
517
585
  MappingTemplate.s3MappingTemplateFromString(
@@ -526,15 +594,16 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
526
594
  getQueryFieldNames = (
527
595
  ctx: TransformerTransformSchemaStepContextProvider,
528
596
  type: ObjectTypeDefinitionNode,
529
- ): Set<{ fieldName: string; typeName: string; type: QueryFieldType }> => {
597
+ ): Set<{ fieldName: string; typeName: string; type: QueryFieldType; resolverLogicalId: string }> => {
530
598
  const typeName = type.name.value;
531
- const fields: Set<{ fieldName: string; typeName: string; type: QueryFieldType }> = new Set();
599
+ const fields: Set<{ fieldName: string; typeName: string; type: QueryFieldType; resolverLogicalId: string }> = new Set();
532
600
  const modelDirectiveConfig = this.modelDirectiveConfig.get(type.name.value);
533
601
  if (modelDirectiveConfig?.queries?.get) {
534
602
  fields.add({
535
603
  typeName: 'Query',
536
604
  fieldName: modelDirectiveConfig.queries.get || toCamelCase(['get', typeName]),
537
605
  type: QueryFieldType.GET,
606
+ resolverLogicalId: ResolverResourceIDs.DynamoDBGetResolverResourceID(typeName),
538
607
  });
539
608
  }
540
609
 
@@ -543,6 +612,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
543
612
  typeName: 'Query',
544
613
  fieldName: modelDirectiveConfig.queries.list || toCamelCase(['list', typeName]),
545
614
  type: QueryFieldType.LIST,
615
+ resolverLogicalId: ResolverResourceIDs.DynamoDBListResolverResourceID(typeName),
546
616
  });
547
617
  }
548
618
 
@@ -551,6 +621,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
551
621
  typeName: 'Query',
552
622
  fieldName: modelDirectiveConfig.queries.sync || toCamelCase(['sync', typeName]),
553
623
  type: QueryFieldType.SYNC,
624
+ resolverLogicalId: ResolverResourceIDs.SyncResolverResourceID(typeName),
554
625
  });
555
626
  }
556
627
 
@@ -560,7 +631,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
560
631
  getMutationFieldNames = (
561
632
  ctx: TransformerTransformSchemaStepContextProvider,
562
633
  type: ObjectTypeDefinitionNode,
563
- ): Set<{ fieldName: string; typeName: string; type: MutationFieldType }> => {
634
+ ): Set<{ fieldName: string; typeName: string; type: MutationFieldType; resolverLogicalId: string }> => {
564
635
  // Todo: get fields names from the directives
565
636
  const typeName = type.name.value;
566
637
  const modelDirectiveConfig = this.modelDirectiveConfig.get(typeName);
@@ -577,13 +648,27 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
577
648
  }
578
649
  };
579
650
 
580
- const fieldNames: Set<{ fieldName: string; typeName: string; type: MutationFieldType }> = new Set();
651
+ const getMutationResolverLogicalId = (type: string): string => {
652
+ switch (type) {
653
+ case 'create':
654
+ return ResolverResourceIDs.DynamoDBCreateResolverResourceID(typeName);
655
+ case 'update':
656
+ return ResolverResourceIDs.DynamoDBUpdateResolverResourceID(typeName);
657
+ case 'delete':
658
+ return ResolverResourceIDs.DynamoDBDeleteResolverResourceID(typeName);
659
+ default:
660
+ throw new Error('Unknown mutation type');
661
+ }
662
+ };
663
+
664
+ const fieldNames: Set<{ fieldName: string; typeName: string; type: MutationFieldType; resolverLogicalId: string }> = new Set();
581
665
  for (let [mutationType, mutationName] of Object.entries(modelDirectiveConfig?.mutations || {})) {
582
666
  if (mutationName) {
583
667
  fieldNames.add({
584
668
  typeName: 'Mutation',
585
669
  fieldName: mutationName,
586
670
  type: getMutationType(mutationType),
671
+ resolverLogicalId: getMutationResolverLogicalId(mutationType),
587
672
  });
588
673
  }
589
674
  }
@@ -597,6 +682,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
597
682
  fieldName: string;
598
683
  typeName: string;
599
684
  type: MutationFieldType;
685
+ resolverLogicalId: string;
600
686
  }>,
601
687
  ): string => {
602
688
  const mutationToSubscriptionTypeMap = {
@@ -682,11 +768,13 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
682
768
  fieldName: string;
683
769
  typeName: string;
684
770
  type: SubscriptionFieldType;
771
+ resolverLogicalId: string;
685
772
  }> => {
686
773
  const fields: Set<{
687
774
  fieldName: string;
688
775
  typeName: string;
689
776
  type: SubscriptionFieldType;
777
+ resolverLogicalId: string;
690
778
  }> = new Set();
691
779
 
692
780
  const modelDirectiveConfig = this.modelDirectiveConfig.get(type.name.value);
@@ -697,6 +785,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
697
785
  typeName: 'Subscription',
698
786
  fieldName: fieldName,
699
787
  type: SubscriptionFieldType.ON_CREATE,
788
+ resolverLogicalId: ResolverResourceIDs.ResolverResourceID('Subscription', fieldName),
700
789
  });
701
790
  }
702
791
  }
@@ -707,6 +796,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
707
796
  typeName: 'Subscription',
708
797
  fieldName: fieldName,
709
798
  type: SubscriptionFieldType.ON_UPDATE,
799
+ resolverLogicalId: ResolverResourceIDs.ResolverResourceID('Subscription', fieldName),
710
800
  });
711
801
  }
712
802
  }
@@ -717,6 +807,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
717
807
  typeName: 'Subscription',
718
808
  fieldName: fieldName,
719
809
  type: SubscriptionFieldType.ON_DELETE,
810
+ resolverLogicalId: ResolverResourceIDs.ResolverResourceID('Subscription', fieldName),
720
811
  });
721
812
  }
722
813
  }
@@ -739,6 +830,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
739
830
  type: ObjectTypeDefinitionNode,
740
831
  typeName: string,
741
832
  fieldName: string,
833
+ resolverLogicalId: string,
742
834
  ): TransformerResolverProvider => {
743
835
  const isSyncEnabled = ctx.isProjectUsingDataStore();
744
836
  const dataSource = this.datasourceMap[type.name.value];
@@ -747,6 +839,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
747
839
  const resolver = ctx.resolvers.generateMutationResolver(
748
840
  typeName,
749
841
  fieldName,
842
+ resolverLogicalId,
750
843
  dataSource,
751
844
  MappingTemplate.s3MappingTemplateFromString(generateCreateRequestTemplate(type.name.value), `${typeName}.${fieldName}.req.vtl`),
752
845
  MappingTemplate.s3MappingTemplateFromString(
@@ -1025,30 +1118,42 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
1025
1118
  description: 'The number of read IOPS the table should support.',
1026
1119
  type: 'Number',
1027
1120
  default: 5,
1028
- }).valueAsString;
1121
+ });
1029
1122
  const writeIops = new cdk.CfnParameter(stack, ResourceConstants.PARAMETERS.DynamoDBModelTableWriteIOPS, {
1030
1123
  description: 'The number of write IOPS the table should support.',
1031
1124
  type: 'Number',
1032
1125
  default: 5,
1033
- }).valueAsString;
1126
+ });
1034
1127
  const billingMode = new cdk.CfnParameter(stack, ResourceConstants.PARAMETERS.DynamoDBBillingMode, {
1035
1128
  description: 'Configure @model types to create DynamoDB tables with PAY_PER_REQUEST or PROVISIONED billing modes.',
1036
1129
  type: 'String',
1037
1130
  default: 'PAY_PER_REQUEST',
1038
1131
  allowedValues: ['PAY_PER_REQUEST', 'PROVISIONED'],
1039
- }).valueAsString;
1132
+ });
1040
1133
  const pointInTimeRecovery = new cdk.CfnParameter(stack, ResourceConstants.PARAMETERS.DynamoDBEnablePointInTimeRecovery, {
1041
1134
  description: 'Whether to enable Point in Time Recovery on the table.',
1042
1135
  type: 'String',
1043
1136
  default: 'false',
1044
1137
  allowedValues: ['true', 'false'],
1045
- }).valueAsString;
1138
+ });
1046
1139
  const enableSSE = new cdk.CfnParameter(stack, ResourceConstants.PARAMETERS.DynamoDBEnableServerSideEncryption, {
1047
1140
  description: 'Enable server side encryption powered by KMS.',
1048
1141
  type: 'String',
1049
1142
  default: 'true',
1050
1143
  allowedValues: ['true', 'false'],
1051
- }).valueAsString;
1144
+ });
1145
+ // add the connection between the root and nested stack so the values can be passed down
1146
+ (stack as TransformerNestedStack).setParameter(readIops.node.id, cdk.Fn.ref(ResourceConstants.PARAMETERS.DynamoDBModelTableReadIOPS));
1147
+ (stack as TransformerNestedStack).setParameter(writeIops.node.id, cdk.Fn.ref(ResourceConstants.PARAMETERS.DynamoDBModelTableWriteIOPS));
1148
+ (stack as TransformerNestedStack).setParameter(billingMode.node.id, cdk.Fn.ref(ResourceConstants.PARAMETERS.DynamoDBBillingMode));
1149
+ (stack as TransformerNestedStack).setParameter(
1150
+ pointInTimeRecovery.node.id,
1151
+ cdk.Fn.ref(ResourceConstants.PARAMETERS.DynamoDBEnablePointInTimeRecovery),
1152
+ );
1153
+ (stack as TransformerNestedStack).setParameter(
1154
+ enableSSE.node.id,
1155
+ cdk.Fn.ref(ResourceConstants.PARAMETERS.DynamoDBEnableServerSideEncryption),
1156
+ );
1052
1157
 
1053
1158
  // Add conditions.
1054
1159
  // eslint-disable-next-line no-new
@@ -1207,13 +1312,10 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
1207
1312
  }),
1208
1313
  );
1209
1314
 
1210
- if (this.options.SyncConfig && SyncUtils.isLambdaSyncConfig(this.options.SyncConfig)) {
1315
+ const syncConfig = SyncUtils.getSyncConfig(context, def!.name.value);
1316
+ if (syncConfig && SyncUtils.isLambdaSyncConfig(syncConfig)) {
1211
1317
  role.attachInlinePolicy(
1212
- SyncUtils.createSyncLambdaIAMPolicy(
1213
- stack,
1214
- this.options.SyncConfig.LambdaConflictHandler.name,
1215
- this.options.SyncConfig.LambdaConflictHandler.region,
1216
- ),
1318
+ SyncUtils.createSyncLambdaIAMPolicy(stack, syncConfig.LambdaConflictHandler.name, syncConfig.LambdaConflictHandler.region),
1217
1319
  );
1218
1320
  }
1219
1321
  return role;
@@ -45,9 +45,7 @@ export const makeUpdateInputField = (
45
45
  input.fields.forEach(f => f.makeNullable());
46
46
 
47
47
  // Add id field and make it optional
48
- if (!hasIdField) {
49
- input.addField(InputFieldWrapper.create('id', 'ID', false));
50
- } else {
48
+ if (hasIdField) {
51
49
  const idField = input.fields.find(f => f.name === 'id');
52
50
  if (idField) {
53
51
  idField.makeNonNullable();
@@ -127,7 +125,7 @@ export const makeCreateInputField = (
127
125
 
128
126
  // Add id field and make it optional
129
127
  if (!hasIdField) {
130
- input.addField(InputFieldWrapper.create('id', 'ID'));
128
+ input.addField(InputFieldWrapper.create('id', 'ID', true));
131
129
  } else {
132
130
  const idField = input.fields.find(f => f.name === 'id');
133
131
  if (idField) {
@@ -13,7 +13,7 @@ export const makeListQueryFilterInput = (
13
13
  export const makeListQueryModel = (type: ObjectTypeDefinitionNode, modelName: string, isSyncEnabled: boolean): ObjectTypeDefinitionNode => {
14
14
  const outputType = ObjectDefinitionWrapper.create(modelName);
15
15
 
16
- outputType.addField(FieldWrapper.create('items', type.name.value, true, true));
16
+ outputType.addField(FieldWrapper.create('items', type.name.value, false, true));
17
17
  outputType.addField(FieldWrapper.create('nextToken', 'String', true, false));
18
18
 
19
19
  if (isSyncEnabled) {
@@ -1,5 +1,5 @@
1
+ import { DirectiveWrapper } from '@aws-amplify/graphql-transformer-core';
1
2
  import {
2
- ArgumentNode,
3
3
  DirectiveNode,
4
4
  DocumentNode,
5
5
  EnumTypeDefinitionNode,
@@ -11,13 +11,10 @@ import {
11
11
  ListTypeNode,
12
12
  Location,
13
13
  NamedTypeNode,
14
- NameNode,
15
14
  NonNullTypeNode,
16
15
  ObjectTypeDefinitionNode,
17
16
  StringValueNode,
18
17
  TypeNode,
19
- valueFromASTUntyped,
20
- ValueNode,
21
18
  } from 'graphql';
22
19
  import {
23
20
  DEFAULT_SCALARS,
@@ -29,53 +26,6 @@ import {
29
26
  withNamedNodeNamed,
30
27
  } from 'graphql-transformer-common';
31
28
 
32
- // Todo: to be moved to core later. context.output.getObject would return wrapper type so its easier to manipulate
33
- // objects
34
-
35
- export class ArgumentWrapper {
36
- public readonly name: NameNode;
37
- public readonly value: ValueNode;
38
- constructor(argument: ArgumentNode) {
39
- this.name = argument.name;
40
- this.value = argument.value;
41
- }
42
- serialize = (): ArgumentNode => {
43
- return {
44
- kind: 'Argument',
45
- name: this.name,
46
- value: this.value,
47
- };
48
- };
49
- }
50
-
51
- export class DirectiveWrapper {
52
- private arguments: ArgumentWrapper[] = [];
53
- private name: NameNode;
54
- private location?: Location;
55
- constructor(node: DirectiveNode) {
56
- this.name = node.name;
57
- this.arguments = (node.arguments || []).map(arg => new ArgumentWrapper(arg));
58
- this.location = this.location;
59
- }
60
- public serialize = (): DirectiveNode => {
61
- return {
62
- kind: 'Directive',
63
- name: this.name,
64
- arguments: this.arguments.map(arg => arg.serialize()),
65
- };
66
- };
67
- public getArguments = <T>(defaultValue: Required<T>): Required<T> => {
68
- const argValues = this.arguments.reduce(
69
- (acc: Record<string, any>, arg: ArgumentWrapper) => ({
70
- ...acc,
71
- [arg.name.value]: valueFromASTUntyped(arg.value),
72
- }),
73
- {},
74
- );
75
- return Object.assign(defaultValue, argValues);
76
- };
77
- }
78
-
79
29
  export class GenericFieldWrapper {
80
30
  protected type: TypeNode;
81
31
  public readonly directives: DirectiveWrapper[];
@@ -295,7 +245,7 @@ export class FieldWrapper extends GenericFieldWrapper {
295
245
  field.makeNonNullable();
296
246
  }
297
247
  if (isList) {
298
- field.wrapListType();
248
+ field.wrapListType().makeNonNullable();
299
249
  }
300
250
  return field;
301
251
  };