@aws-amplify/graphql-model-transformer 0.11.0-beta.0 → 0.13.0-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.
- package/CHANGELOG.md +86 -1
- package/lib/graphql-model-transformer.d.ts.map +1 -1
- package/lib/graphql-model-transformer.js +33 -22
- 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 +4 -1
- 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/resolvers/mutation.d.ts.map +1 -1
- package/lib/resolvers/mutation.js +13 -9
- package/lib/resolvers/mutation.js.map +1 -1
- package/lib/resolvers/query.d.ts.map +1 -1
- package/lib/resolvers/query.js +14 -12
- package/lib/resolvers/query.js.map +1 -1
- package/package.json +7 -20
- package/src/__tests__/__snapshots__/model-transformer.test.ts.snap +672 -563
- package/src/__tests__/model-transformer.test.ts +102 -0
- package/src/graphql-model-transformer.ts +37 -22
- package/src/graphql-types/mutation.ts +4 -2
- package/src/graphql-types/query.ts +1 -1
- package/src/resolvers/mutation.ts +13 -11
- package/src/resolvers/query.ts +17 -15
- package/tsconfig.json +3 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1261,4 +1261,106 @@ describe('ModelTransformer: ', () => {
|
|
|
1261
1261
|
expect(field.directives!.some(dir => dir.name.value === 'aws_api_key')).toEqual(true);
|
|
1262
1262
|
}
|
|
1263
1263
|
});
|
|
1264
|
+
|
|
1265
|
+
it('maps model resolvers to specified stack', () => {
|
|
1266
|
+
const inputSchema = /* GraphQL */ `
|
|
1267
|
+
type Blog @model {
|
|
1268
|
+
id: ID!
|
|
1269
|
+
name: String!
|
|
1270
|
+
}
|
|
1271
|
+
`;
|
|
1272
|
+
const transformer = new GraphQLTransform({
|
|
1273
|
+
transformers: [new ModelTransformer()],
|
|
1274
|
+
stackMapping: {
|
|
1275
|
+
CreateBlogResolver: 'myCustomStack1',
|
|
1276
|
+
UpdateBlogResolver: 'myCustomStack2',
|
|
1277
|
+
},
|
|
1278
|
+
});
|
|
1279
|
+
|
|
1280
|
+
const result = transformer.transform(inputSchema);
|
|
1281
|
+
expect(Object.keys(result.stacks.myCustomStack1.Resources!).includes('CreateBlogResolver')).toBe(true);
|
|
1282
|
+
expect(Object.keys(result.stacks.myCustomStack2.Resources!).includes('UpdateBlogResolver')).toBe(true);
|
|
1283
|
+
|
|
1284
|
+
expect(Object.keys(result.stacks.Blog.Resources!).includes('CreateBlogResolver')).toBe(false);
|
|
1285
|
+
expect(Object.keys(result.stacks.Blog.Resources!).includes('UpdateBlogResolver')).toBe(false);
|
|
1286
|
+
});
|
|
1287
|
+
|
|
1288
|
+
it('allow aws_lambda to pass through', () => {
|
|
1289
|
+
const validSchema = `
|
|
1290
|
+
type Todo @aws_lambda {
|
|
1291
|
+
id: ID!
|
|
1292
|
+
name: String!
|
|
1293
|
+
description: String
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
schema {
|
|
1297
|
+
query: Query
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
type Query {
|
|
1301
|
+
todo: Todo @aws_lambda
|
|
1302
|
+
}`;
|
|
1303
|
+
const transformer = new GraphQLTransform({
|
|
1304
|
+
transformers: [new ModelTransformer()],
|
|
1305
|
+
});
|
|
1306
|
+
const out = transformer.transform(validSchema);
|
|
1307
|
+
expect(out).toBeDefined();
|
|
1308
|
+
|
|
1309
|
+
const schema = parse(out.schema);
|
|
1310
|
+
validateModelSchema(schema);
|
|
1311
|
+
});
|
|
1312
|
+
|
|
1313
|
+
it('handles custom subscriptions passed as strings', () => {
|
|
1314
|
+
const validSchema = `type Post @model(subscriptions: {
|
|
1315
|
+
onCreate: "onFeedCreated",
|
|
1316
|
+
onUpdate: "onFeedUpdated",
|
|
1317
|
+
onDelete: "onFeedDeleted"
|
|
1318
|
+
}) {
|
|
1319
|
+
id: ID!
|
|
1320
|
+
}
|
|
1321
|
+
`;
|
|
1322
|
+
const transformer = new GraphQLTransform({
|
|
1323
|
+
transformers: [new ModelTransformer()],
|
|
1324
|
+
featureFlags,
|
|
1325
|
+
});
|
|
1326
|
+
const out = transformer.transform(validSchema);
|
|
1327
|
+
expect(out).toBeDefined();
|
|
1328
|
+
const definition = out.schema;
|
|
1329
|
+
expect(definition).toBeDefined();
|
|
1330
|
+
const parsed = parse(definition);
|
|
1331
|
+
validateModelSchema(parsed);
|
|
1332
|
+
|
|
1333
|
+
const subscriptionType = getObjectType(parsed, 'Subscription');
|
|
1334
|
+
expect(subscriptionType).toBeDefined();
|
|
1335
|
+
expect(subscriptionType!.fields!.length).toEqual(3);
|
|
1336
|
+
expectFields(subscriptionType!, ['onFeedCreated', 'onFeedUpdated', 'onFeedDeleted']);
|
|
1337
|
+
});
|
|
1338
|
+
|
|
1339
|
+
it('should generate id for the update input object', async () => {
|
|
1340
|
+
const validSchema = `
|
|
1341
|
+
type Todo @model {
|
|
1342
|
+
uid: String!
|
|
1343
|
+
username: String
|
|
1344
|
+
}
|
|
1345
|
+
`;
|
|
1346
|
+
|
|
1347
|
+
const transformer = new GraphQLTransform({
|
|
1348
|
+
transformers: [new ModelTransformer()],
|
|
1349
|
+
featureFlags,
|
|
1350
|
+
});
|
|
1351
|
+
const out = transformer.transform(validSchema);
|
|
1352
|
+
expect(out).toBeDefined();
|
|
1353
|
+
const definition = out.schema;
|
|
1354
|
+
expect(definition).toBeDefined();
|
|
1355
|
+
|
|
1356
|
+
const parsed = parse(definition);
|
|
1357
|
+
validateModelSchema(parsed);
|
|
1358
|
+
|
|
1359
|
+
const updateTodoInput = getInputType(parsed, 'UpdateTodoInput');
|
|
1360
|
+
expect(updateTodoInput).toBeDefined();
|
|
1361
|
+
|
|
1362
|
+
expectFieldsOnInputType(updateTodoInput!, ['id']);
|
|
1363
|
+
const updateTodoIdField = getFieldOnInputType(updateTodoInput!, 'id');
|
|
1364
|
+
expect(updateTodoIdField.type.kind).toBe('NonNullType');
|
|
1365
|
+
});
|
|
1264
1366
|
});
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
FieldWrapper,
|
|
10
10
|
InputObjectDefinitionWrapper,
|
|
11
11
|
ObjectDefinitionWrapper,
|
|
12
|
+
getFieldNameFor,
|
|
12
13
|
} from '@aws-amplify/graphql-transformer-core';
|
|
13
14
|
import {
|
|
14
15
|
AppSyncDataSourceType,
|
|
@@ -48,7 +49,6 @@ import {
|
|
|
48
49
|
makeNonNullType,
|
|
49
50
|
makeValueNode,
|
|
50
51
|
ModelResourceIDs,
|
|
51
|
-
plurality,
|
|
52
52
|
ResolverResourceIDs,
|
|
53
53
|
ResourceConstants,
|
|
54
54
|
SyncResourceIDs,
|
|
@@ -227,26 +227,39 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
227
227
|
const directiveWrapped: DirectiveWrapper = new DirectiveWrapper(directive);
|
|
228
228
|
const options = directiveWrapped.getArguments({
|
|
229
229
|
queries: {
|
|
230
|
-
get:
|
|
231
|
-
list:
|
|
232
|
-
...(ctx.isProjectUsingDataStore() ? { sync:
|
|
230
|
+
get: getFieldNameFor('get', typeName),
|
|
231
|
+
list: getFieldNameFor('list', typeName),
|
|
232
|
+
...(ctx.isProjectUsingDataStore() ? { sync: getFieldNameFor('sync', typeName) } : undefined),
|
|
233
233
|
},
|
|
234
234
|
mutations: {
|
|
235
|
-
create:
|
|
236
|
-
update:
|
|
237
|
-
delete:
|
|
235
|
+
create: getFieldNameFor('create', typeName),
|
|
236
|
+
update: getFieldNameFor('update', typeName),
|
|
237
|
+
delete: getFieldNameFor('delete', typeName),
|
|
238
238
|
},
|
|
239
239
|
subscriptions: {
|
|
240
240
|
level: SubscriptionLevel.on,
|
|
241
|
-
onCreate: [
|
|
242
|
-
onDelete: [
|
|
243
|
-
onUpdate: [
|
|
241
|
+
onCreate: [getFieldNameFor('onCreate', typeName)],
|
|
242
|
+
onDelete: [getFieldNameFor('onDelete', typeName)],
|
|
243
|
+
onUpdate: [getFieldNameFor('onUpdate', typeName)],
|
|
244
244
|
},
|
|
245
245
|
timestamps: {
|
|
246
246
|
createdAt: 'createdAt',
|
|
247
247
|
updatedAt: 'updatedAt',
|
|
248
248
|
},
|
|
249
249
|
});
|
|
250
|
+
|
|
251
|
+
if (options.subscriptions?.onCreate && !Array.isArray(options.subscriptions.onCreate)) {
|
|
252
|
+
options.subscriptions.onCreate = [options.subscriptions.onCreate];
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (options.subscriptions?.onDelete && !Array.isArray(options.subscriptions.onDelete)) {
|
|
256
|
+
options.subscriptions.onDelete = [options.subscriptions.onDelete];
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (options.subscriptions?.onUpdate && !Array.isArray(options.subscriptions.onUpdate)) {
|
|
260
|
+
options.subscriptions.onUpdate = [options.subscriptions.onUpdate];
|
|
261
|
+
}
|
|
262
|
+
|
|
250
263
|
this.modelDirectiveConfig.set(typeName, options);
|
|
251
264
|
this.typesWithModelDirective.add(typeName);
|
|
252
265
|
};
|
|
@@ -311,8 +324,9 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
311
324
|
for (let type of this.typesWithModelDirective) {
|
|
312
325
|
const def = context.output.getObject(type)!;
|
|
313
326
|
// This name is used by the mock functionality. Changing this can break mock.
|
|
314
|
-
const
|
|
315
|
-
const
|
|
327
|
+
const tableBaseName = context.resourceHelper.getModelNameMapping(def!.name.value);
|
|
328
|
+
const tableLogicalName = ModelResourceIDs.ModelTableResourceID(tableBaseName);
|
|
329
|
+
const stack = context.stackManager.getStackFor(tableLogicalName, tableBaseName);
|
|
316
330
|
|
|
317
331
|
this.createModelTable(stack, def!, context);
|
|
318
332
|
|
|
@@ -341,7 +355,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
341
355
|
`${query.typeName}.${query.fieldName}.{slotName}.{slotIndex}.req.vtl`,
|
|
342
356
|
),
|
|
343
357
|
);
|
|
344
|
-
resolver.mapToStack(
|
|
358
|
+
resolver.mapToStack(context.stackManager.getStackFor(query.resolverLogicalId, def!.name.value));
|
|
345
359
|
context.resolvers.addResolver(query.typeName, query.fieldName, resolver);
|
|
346
360
|
}
|
|
347
361
|
|
|
@@ -368,7 +382,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
368
382
|
`${mutation.typeName}.${mutation.fieldName}.{slotName}.{slotIndex}.req.vtl`,
|
|
369
383
|
),
|
|
370
384
|
);
|
|
371
|
-
resolver.mapToStack(
|
|
385
|
+
resolver.mapToStack(context.stackManager.getStackFor(mutation.resolverLogicalId, def!.name.value));
|
|
372
386
|
context.resolvers.addResolver(mutation.typeName, mutation.fieldName, resolver);
|
|
373
387
|
}
|
|
374
388
|
|
|
@@ -416,7 +430,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
416
430
|
`${subscription.typeName}.${subscription.fieldName}.{slotName}.{slotIndex}.req.vtl`,
|
|
417
431
|
),
|
|
418
432
|
);
|
|
419
|
-
resolver.mapToStack(
|
|
433
|
+
resolver.mapToStack(context.stackManager.getStackFor(subscription.resolverLogicalId, def!.name.value));
|
|
420
434
|
context.resolvers.addResolver(subscription.typeName, subscription.fieldName, resolver);
|
|
421
435
|
}
|
|
422
436
|
}
|
|
@@ -1136,8 +1150,8 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
1136
1150
|
};
|
|
1137
1151
|
|
|
1138
1152
|
private createModelTable(stack: cdk.Stack, def: ObjectTypeDefinitionNode, context: TransformerContextProvider) {
|
|
1139
|
-
const tableLogicalName =
|
|
1140
|
-
const tableName = context.resourceHelper.
|
|
1153
|
+
const tableLogicalName = ModelResourceIDs.ModelTableResourceID(def!.name.value);
|
|
1154
|
+
const tableName = context.resourceHelper.generateTableName(def!.name.value);
|
|
1141
1155
|
|
|
1142
1156
|
// Add parameters.
|
|
1143
1157
|
const env = context.stackManager.getParameter(ResourceConstants.PARAMETERS.Env) as cdk.CfnParameter;
|
|
@@ -1244,7 +1258,8 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
1244
1258
|
});
|
|
1245
1259
|
|
|
1246
1260
|
const role = this.createIAMRole(context, def, stack, tableName);
|
|
1247
|
-
|
|
1261
|
+
const tableDataSourceLogicalName = `${def!.name.value}Table`;
|
|
1262
|
+
this.createModelTableDataSource(def, context, table, stack, role, tableDataSourceLogicalName);
|
|
1248
1263
|
}
|
|
1249
1264
|
|
|
1250
1265
|
private createModelTableDataSource(
|
|
@@ -1253,13 +1268,13 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
1253
1268
|
table: Table,
|
|
1254
1269
|
stack: cdk.Stack,
|
|
1255
1270
|
role: iam.Role,
|
|
1271
|
+
dataSourceLogicalName: string,
|
|
1256
1272
|
) {
|
|
1257
|
-
const tableLogicalName = `${def!.name.value}Table`;
|
|
1258
1273
|
const datasourceRoleLogicalID = ModelResourceIDs.ModelTableDataSourceID(def!.name.value);
|
|
1259
1274
|
const dataSource = context.api.host.addDynamoDbDataSource(
|
|
1260
1275
|
datasourceRoleLogicalID,
|
|
1261
1276
|
table,
|
|
1262
|
-
{ name:
|
|
1277
|
+
{ name: dataSourceLogicalName, serviceRole: role },
|
|
1263
1278
|
stack,
|
|
1264
1279
|
);
|
|
1265
1280
|
|
|
@@ -1269,7 +1284,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
1269
1284
|
if (context.isProjectUsingDataStore()) {
|
|
1270
1285
|
const datasourceDynamoDb = cfnDataSource.dynamoDbConfig as any;
|
|
1271
1286
|
datasourceDynamoDb.deltaSyncConfig = {
|
|
1272
|
-
deltaSyncTableName: context.resourceHelper.
|
|
1287
|
+
deltaSyncTableName: context.resourceHelper.generateTableName(SyncResourceIDs.syncTableName),
|
|
1273
1288
|
deltaSyncTableTtl: '30',
|
|
1274
1289
|
baseTableTtl: '43200',
|
|
1275
1290
|
};
|
|
@@ -1296,7 +1311,7 @@ export class ModelTransformer extends TransformerModelBase implements Transforme
|
|
|
1296
1311
|
assumedBy: new iam.ServicePrincipal('appsync.amazonaws.com'),
|
|
1297
1312
|
});
|
|
1298
1313
|
|
|
1299
|
-
const amplifyDataStoreTableName = context.resourceHelper.
|
|
1314
|
+
const amplifyDataStoreTableName = context.resourceHelper.generateTableName(SyncResourceIDs.syncTableName);
|
|
1300
1315
|
role.attachInlinePolicy(
|
|
1301
1316
|
new iam.Policy(stack, 'DynamoDBAccess', {
|
|
1302
1317
|
statements: [
|
|
@@ -44,8 +44,10 @@ export const makeUpdateInputField = (
|
|
|
44
44
|
// make all the fields optional
|
|
45
45
|
input.fields.forEach(f => f.makeNullable());
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
if (!hasIdField) {
|
|
48
|
+
// Add id field and make it optional
|
|
49
|
+
input.addField(InputFieldWrapper.create('id', 'ID', false));
|
|
50
|
+
} else {
|
|
49
51
|
const idField = input.fields.find(f => f.name === 'id');
|
|
50
52
|
if (idField) {
|
|
51
53
|
idField.makeNonNullable();
|
|
@@ -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, true, true));
|
|
17
17
|
outputType.addField(FieldWrapper.create('nextToken', 'String', true, false));
|
|
18
18
|
|
|
19
19
|
if (isSyncEnabled) {
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
toJson,
|
|
19
19
|
printBlock,
|
|
20
20
|
} from 'graphql-mapping-template';
|
|
21
|
+
import { setArgs } from 'graphql-transformer-common';
|
|
21
22
|
import { ModelDirectiveConfiguration } from '../graphql-model-transformer';
|
|
22
23
|
import { generateConditionSlot } from './common';
|
|
23
24
|
|
|
@@ -34,10 +35,11 @@ export const generateUpdateRequestTemplate = (modelName: string, isSyncEnabled:
|
|
|
34
35
|
keyFields.push(str('_lastChangedAt'));
|
|
35
36
|
}
|
|
36
37
|
const statements: Expression[] = [
|
|
38
|
+
setArgs,
|
|
37
39
|
comment('Set the default values to put request'),
|
|
38
40
|
set(ref('mergedValues'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.defaultValues'), obj({}))),
|
|
39
41
|
comment('copy the values from input'),
|
|
40
|
-
qref(methodCall(ref('mergedValues.putAll'), methodCall(ref('util.defaultIfNull'), ref('
|
|
42
|
+
qref(methodCall(ref('mergedValues.putAll'), methodCall(ref('util.defaultIfNull'), ref('args.input'), obj({})))),
|
|
41
43
|
comment('set the typename'),
|
|
42
44
|
// Initialize object as placeholder for expressions
|
|
43
45
|
comment('Initialize the vars for creating ddb expression'),
|
|
@@ -50,7 +52,7 @@ export const generateUpdateRequestTemplate = (modelName: string, isSyncEnabled:
|
|
|
50
52
|
ifElse(
|
|
51
53
|
ref(objectKeyVariable),
|
|
52
54
|
set(ref('Key'), ref(objectKeyVariable)),
|
|
53
|
-
set(ref('Key'), obj({ id: methodCall(ref('util.dynamodb.toDynamoDB'), ref('
|
|
55
|
+
set(ref('Key'), obj({ id: methodCall(ref('util.dynamodb.toDynamoDB'), ref('args.input.id')) })),
|
|
54
56
|
),
|
|
55
57
|
comment('Model key'),
|
|
56
58
|
ifElse(
|
|
@@ -121,7 +123,7 @@ export const generateUpdateRequestTemplate = (modelName: string, isSyncEnabled:
|
|
|
121
123
|
// add conditions
|
|
122
124
|
// set key the condition
|
|
123
125
|
...generateKeyConditionTemplate(true),
|
|
124
|
-
iff(ref('
|
|
126
|
+
iff(ref('args.condition'), qref(methodCall(ref('ctx.stash.conditions.add'), ref('args.condition')))),
|
|
125
127
|
// Generate conditions
|
|
126
128
|
generateConditionSlot('ctx.stash.conditions', 'Conditions'),
|
|
127
129
|
set(
|
|
@@ -131,7 +133,7 @@ export const generateUpdateRequestTemplate = (modelName: string, isSyncEnabled:
|
|
|
131
133
|
operation: str('UpdateItem'),
|
|
132
134
|
key: ref('Key'),
|
|
133
135
|
update: ref('update'),
|
|
134
|
-
...(isSyncEnabled && { _version: ref('util.defaultIfNull($
|
|
136
|
+
...(isSyncEnabled && { _version: ref('util.defaultIfNull($args.input["_version"], 0)') }),
|
|
135
137
|
}),
|
|
136
138
|
),
|
|
137
139
|
iff(
|
|
@@ -152,11 +154,12 @@ export const generateUpdateRequestTemplate = (modelName: string, isSyncEnabled:
|
|
|
152
154
|
*/
|
|
153
155
|
export const generateCreateRequestTemplate = (modelName: string): string => {
|
|
154
156
|
const statements: Expression[] = [
|
|
157
|
+
setArgs,
|
|
155
158
|
// Generate conditions
|
|
156
159
|
comment('Set the default values to put request'),
|
|
157
160
|
set(ref('mergedValues'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.defaultValues'), obj({}))),
|
|
158
161
|
comment('copy the values from input'),
|
|
159
|
-
qref(methodCall(ref('mergedValues.putAll'), methodCall(ref('util.defaultIfNull'), ref('
|
|
162
|
+
qref(methodCall(ref('mergedValues.putAll'), methodCall(ref('util.defaultIfNull'), ref('args.input'), obj({})))),
|
|
160
163
|
comment('set the typename'),
|
|
161
164
|
qref(methodCall(ref('mergedValues.put'), str('__typename'), str(modelName))),
|
|
162
165
|
|
|
@@ -172,7 +175,7 @@ export const generateCreateRequestTemplate = (modelName: string): string => {
|
|
|
172
175
|
),
|
|
173
176
|
|
|
174
177
|
// add conditions
|
|
175
|
-
iff(ref('
|
|
178
|
+
iff(ref('args.condition'), qref(methodCall(ref('ctx.stash.conditions.add'), ref('args.condition')))),
|
|
176
179
|
// key conditions
|
|
177
180
|
...generateKeyConditionTemplate(false),
|
|
178
181
|
// Generate conditions
|
|
@@ -245,6 +248,7 @@ export const generateCreateInitSlotTemplate = (name: string, modelConfig: ModelD
|
|
|
245
248
|
*/
|
|
246
249
|
export const generateDeleteRequestTemplate = (isSyncEnabled: boolean): string => {
|
|
247
250
|
const statements: Expression[] = [
|
|
251
|
+
setArgs,
|
|
248
252
|
set(
|
|
249
253
|
ref('DeleteRequest'),
|
|
250
254
|
obj({
|
|
@@ -255,11 +259,11 @@ export const generateDeleteRequestTemplate = (isSyncEnabled: boolean): string =>
|
|
|
255
259
|
ifElse(
|
|
256
260
|
ref('ctx.stash.metadata.modelObjectKey'),
|
|
257
261
|
set(ref('Key'), ref('ctx.stash.metadata.modelObjectKey')),
|
|
258
|
-
set(ref('Key'), obj({ id: methodCall(ref('util.dynamodb.toDynamoDB'), ref('
|
|
262
|
+
set(ref('Key'), obj({ id: methodCall(ref('util.dynamodb.toDynamoDB'), ref('args.input.id')) })),
|
|
259
263
|
),
|
|
260
264
|
qref(methodCall(ref('DeleteRequest.put'), str('key'), ref('Key'))),
|
|
261
265
|
...generateKeyConditionTemplate(true),
|
|
262
|
-
iff(ref('
|
|
266
|
+
iff(ref('args.condition'), qref(methodCall(ref('ctx.stash.conditions.add'), ref('args.condition')))),
|
|
263
267
|
// Generate conditions
|
|
264
268
|
generateConditionSlot('ctx.stash.conditions', 'Conditions'),
|
|
265
269
|
iff(
|
|
@@ -271,9 +275,7 @@ export const generateDeleteRequestTemplate = (isSyncEnabled: boolean): string =>
|
|
|
271
275
|
),
|
|
272
276
|
];
|
|
273
277
|
if (isSyncEnabled) {
|
|
274
|
-
statements.push(
|
|
275
|
-
qref(methodCall(ref('DeleteRequest.put'), str('_version'), ref('util.defaultIfNull($ctx.args.input["_version"], "0")'))),
|
|
276
|
-
);
|
|
278
|
+
statements.push(qref(methodCall(ref('DeleteRequest.put'), str('_version'), ref('util.defaultIfNull($args.input["_version"], 0)'))));
|
|
277
279
|
}
|
|
278
280
|
|
|
279
281
|
statements.push(toJson(ref('DeleteRequest')));
|
package/src/resolvers/query.ts
CHANGED
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
forEach,
|
|
22
22
|
nul,
|
|
23
23
|
} from 'graphql-mapping-template';
|
|
24
|
-
import { ResourceConstants } from 'graphql-transformer-common';
|
|
24
|
+
import { ResourceConstants, setArgs } from 'graphql-transformer-common';
|
|
25
25
|
const authFilter = ref('ctx.stash.authFilter');
|
|
26
26
|
|
|
27
27
|
/**
|
|
@@ -101,7 +101,8 @@ export const generateListRequestTemplate = (): string => {
|
|
|
101
101
|
const modelQueryObj = 'ctx.stash.modelQueryExpression';
|
|
102
102
|
const indexNameVariable = 'ctx.stash.metadata.index';
|
|
103
103
|
const expression = compoundExpression([
|
|
104
|
-
|
|
104
|
+
setArgs,
|
|
105
|
+
set(ref('limit'), methodCall(ref(`util.defaultIfNull`), ref('args.limit'), int(100))),
|
|
105
106
|
set(
|
|
106
107
|
ref(requestVariable),
|
|
107
108
|
obj({
|
|
@@ -109,14 +110,14 @@ export const generateListRequestTemplate = (): string => {
|
|
|
109
110
|
limit: ref('limit'),
|
|
110
111
|
}),
|
|
111
112
|
),
|
|
112
|
-
iff(ref('
|
|
113
|
+
iff(ref('args.nextToken'), set(ref(`${requestVariable}.nextToken`), ref('args.nextToken'))),
|
|
113
114
|
ifElse(
|
|
114
115
|
not(isNullOrEmpty(authFilter)),
|
|
115
116
|
compoundExpression([
|
|
116
117
|
set(ref('filter'), authFilter),
|
|
117
|
-
iff(not(isNullOrEmpty(ref('
|
|
118
|
+
iff(not(isNullOrEmpty(ref('args.filter'))), set(ref('filter'), obj({ and: list([ref('filter'), ref('args.filter')]) }))),
|
|
118
119
|
]),
|
|
119
|
-
iff(not(isNullOrEmpty(ref('
|
|
120
|
+
iff(not(isNullOrEmpty(ref('args.filter'))), set(ref('filter'), ref('args.filter'))),
|
|
120
121
|
),
|
|
121
122
|
iff(
|
|
122
123
|
not(isNullOrEmpty(ref('filter'))),
|
|
@@ -129,8 +130,8 @@ export const generateListRequestTemplate = (): string => {
|
|
|
129
130
|
not(methodCall(ref('util.isNullOrBlank'), ref('filterExpression.expression'))),
|
|
130
131
|
compoundExpression([
|
|
131
132
|
iff(
|
|
132
|
-
equals(methodCall(ref('
|
|
133
|
-
qref(methodCall(ref('
|
|
133
|
+
equals(methodCall(ref('filterExpression.expressionValues.size')), int(0)),
|
|
134
|
+
qref(methodCall(ref('filterExpression.remove'), str('expressionValues'))),
|
|
134
135
|
),
|
|
135
136
|
set(ref(`${requestVariable}.filter`), ref(`filterExpression`)),
|
|
136
137
|
]),
|
|
@@ -146,7 +147,7 @@ export const generateListRequestTemplate = (): string => {
|
|
|
146
147
|
qref(methodCall(ref(`${requestVariable}.put`), str('operation'), str('Query'))),
|
|
147
148
|
qref(methodCall(ref(`${requestVariable}.put`), str('query'), ref(modelQueryObj))),
|
|
148
149
|
ifElse(
|
|
149
|
-
and([not(methodCall(ref('util.isNull'), ref('
|
|
150
|
+
and([not(methodCall(ref('util.isNull'), ref('args.sortDirection'))), equals(ref('args.sortDirection'), str('DESC'))]),
|
|
150
151
|
set(ref(`${requestVariable}.scanIndexForward`), bool(false)),
|
|
151
152
|
set(ref(`${requestVariable}.scanIndexForward`), bool(true)),
|
|
152
153
|
),
|
|
@@ -162,13 +163,14 @@ export const generateListRequestTemplate = (): string => {
|
|
|
162
163
|
export const generateSyncRequestTemplate = (): string => {
|
|
163
164
|
return printBlock('Sync Request template')(
|
|
164
165
|
compoundExpression([
|
|
166
|
+
setArgs,
|
|
165
167
|
ifElse(
|
|
166
168
|
not(isNullOrEmpty(authFilter)),
|
|
167
169
|
compoundExpression([
|
|
168
170
|
set(ref('filter'), authFilter),
|
|
169
|
-
iff(not(isNullOrEmpty(ref('
|
|
171
|
+
iff(not(isNullOrEmpty(ref('args.filter'))), set(ref('filter'), obj({ and: list([ref('filter'), ref('args.filter')]) }))),
|
|
170
172
|
]),
|
|
171
|
-
iff(not(isNullOrEmpty(ref('
|
|
173
|
+
iff(not(isNullOrEmpty(ref('args.filter'))), set(ref('filter'), ref('args.filter'))),
|
|
172
174
|
),
|
|
173
175
|
iff(
|
|
174
176
|
not(isNullOrEmpty(ref('filter'))),
|
|
@@ -181,8 +183,8 @@ export const generateSyncRequestTemplate = (): string => {
|
|
|
181
183
|
not(methodCall(ref('util.isNullOrBlank'), ref('filterExpression.expression'))),
|
|
182
184
|
compoundExpression([
|
|
183
185
|
iff(
|
|
184
|
-
equals(methodCall(ref('
|
|
185
|
-
qref(methodCall(ref('
|
|
186
|
+
equals(methodCall(ref('filterExpression.expressionValues.size')), int(0)),
|
|
187
|
+
qref(methodCall(ref('filterExpression.remove'), str('expressionValues'))),
|
|
186
188
|
),
|
|
187
189
|
set(ref('filter'), ref('filterExpression')),
|
|
188
190
|
]),
|
|
@@ -193,9 +195,9 @@ export const generateSyncRequestTemplate = (): string => {
|
|
|
193
195
|
version: str('2018-05-29'),
|
|
194
196
|
operation: str('Sync'),
|
|
195
197
|
filter: ifElse(ref('filter'), ref('util.toJson($filter)'), nul()),
|
|
196
|
-
limit: ref(`util.defaultIfNull($
|
|
197
|
-
lastSync: ref('util.toJson($util.defaultIfNull($
|
|
198
|
-
nextToken: ref('util.toJson($util.defaultIfNull($
|
|
198
|
+
limit: ref(`util.defaultIfNull($args.limit, ${ResourceConstants.DEFAULT_SYNC_QUERY_PAGE_LIMIT})`),
|
|
199
|
+
lastSync: ref('util.toJson($util.defaultIfNull($args.lastSync, null))'),
|
|
200
|
+
nextToken: ref('util.toJson($util.defaultIfNull($args.nextToken, null))'),
|
|
199
201
|
}),
|
|
200
202
|
]),
|
|
201
203
|
);
|
package/tsconfig.json
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
},
|
|
7
7
|
"references": [
|
|
8
8
|
{"path": "../amplify-graphql-transformer-interfaces"},
|
|
9
|
-
{"path": "../graphql-mapping-template"}
|
|
9
|
+
{"path": "../graphql-mapping-template"},
|
|
10
|
+
{"path": "../amplify-graphql-transformer-core"},
|
|
11
|
+
{"path": "../graphql-transformer-common"},
|
|
10
12
|
]
|
|
11
13
|
}
|