@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.
- package/CHANGELOG.md +191 -11
- package/lib/graphql-model-transformer.d.ts +15 -10
- package/lib/graphql-model-transformer.d.ts.map +1 -1
- package/lib/graphql-model-transformer.js +89 -37
- package/lib/graphql-model-transformer.js.map +1 -1
- package/lib/graphql-types/mutation.d.ts.map +1 -1
- package/lib/graphql-types/mutation.js +2 -5
- package/lib/graphql-types/mutation.js.map +1 -1
- package/lib/graphql-types/query.js +1 -1
- package/lib/graphql-types/query.js.map +1 -1
- package/lib/wrappers/object-definition-wrapper.d.ts +2 -15
- package/lib/wrappers/object-definition-wrapper.d.ts.map +1 -1
- package/lib/wrappers/object-definition-wrapper.js +7 -43
- package/lib/wrappers/object-definition-wrapper.js.map +1 -1
- package/package.json +6 -6
- package/src/__tests__/__snapshots__/model-transformer.test.ts.snap +62 -14
- package/src/__tests__/model-transformer.test.ts +173 -14
- package/src/graphql-model-transformer.ts +135 -33
- package/src/graphql-types/mutation.ts +2 -4
- package/src/graphql-types/query.ts +1 -1
- package/src/wrappers/object-definition-wrapper.ts +2 -52
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
|
|
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 (
|
|
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,
|
|
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
|
};
|