diff --git a/src/__tests__/resolvers.test.ts b/src/__tests__/resolvers.test.ts index 28ea5fe5..6dc687b6 100644 --- a/src/__tests__/resolvers.test.ts +++ b/src/__tests__/resolvers.test.ts @@ -76,6 +76,68 @@ describe('Resolvers', () => { `); }); + it('should generate JS Resources with specific code', () => { + const api = new Api( + given.appSyncConfig({ + dataSources: { + myTable: { + name: 'myTable', + type: 'AMAZON_DYNAMODB', + config: { tableName: 'data' }, + }, + }, + pipelineFunctions: { + getUser: { + name: 'getUser', + dataSource: 'myTable', + }, + }, + }), + plugin, + ); + expect( + api.compileResolver({ + type: 'Query', + kind: 'UNIT', + field: 'user', + dataSource: 'myTable', + code: 'resolvers/getUserFunction.js', + }), + ).toMatchInlineSnapshot(` + Object { + "GraphQlResolverQueryuser": Object { + "DependsOn": Array [ + "GraphQlSchema", + ], + "Properties": Object { + "ApiId": Object { + "Fn::GetAtt": Array [ + "GraphQlApi", + "ApiId", + ], + }, + "Code": "Content of resolvers/getUserFunction.js", + "DataSourceName": Object { + "Fn::GetAtt": Array [ + "GraphQlDsmyTable", + "Name", + ], + }, + "FieldName": "user", + "Kind": "UNIT", + "MaxBatchSize": undefined, + "Runtime": Object { + "Name": "APPSYNC_JS", + "RuntimeVersion": "1.0.0", + }, + "TypeName": "Query", + }, + "Type": "AWS::AppSync::Resolver", + }, + } + `); + }); + it('should generate Resources with direct Lambda', () => { const api = new Api( given.appSyncConfig({ diff --git a/src/resources/Resolver.ts b/src/resources/Resolver.ts index 249777d1..3daa8c5e 100644 --- a/src/resources/Resolver.ts +++ b/src/resources/Resolver.ts @@ -31,13 +31,16 @@ export class Resolver { FieldName: this.config.field, }; - const isJsResolver = !( + const isUnitJsResolver = + this.config.kind === 'UNIT' && 'code' in this.config; + + const isPipelineJsResolver = !( this.config.kind === 'UNIT' || 'request' in this.config || 'response' in this.config ); - if (!isJsResolver) { + if (!isUnitJsResolver && !isPipelineJsResolver) { const requestMappingTemplates = this.resolveMappingTemplate('request'); if (requestMappingTemplates) { Properties.RequestMappingTemplate = requestMappingTemplates; @@ -47,6 +50,16 @@ export class Resolver { if (responseMappingTemplate) { Properties.ResponseMappingTemplate = responseMappingTemplate; } + } else { + if (this.config.code) { + Properties.Code = this.resolveJsCode(this.config.code); + } else if (!this.config.code) { + Properties.Code = DEFAULT_JS_RESOLVERS; + } + Properties.Runtime = { + Name: 'APPSYNC_JS', + RuntimeVersion: '1.0.0', + }; } if (this.config.caching) { @@ -85,18 +98,6 @@ export class Resolver { MaxBatchSize: this.config.maxBatchSize, }; } else { - if (isJsResolver) { - if (this.config.code) { - Properties.Code = this.resolveJsCode(this.config.code); - } else if (!this.config.code) { - Properties.Code = DEFAULT_JS_RESOLVERS; - } - Properties.Runtime = { - Name: 'APPSYNC_JS', - RuntimeVersion: '1.0.0', - }; - } - Properties = { ...Properties, Kind: 'PIPELINE', diff --git a/src/types/plugin.ts b/src/types/plugin.ts index ea56c8b5..f29fbed1 100644 --- a/src/types/plugin.ts +++ b/src/types/plugin.ts @@ -151,6 +151,7 @@ export type BaseResolverConfig = { type: string; request?: string | false; response?: string | false; + code?: string; caching?: | { ttl?: number; @@ -171,7 +172,6 @@ export type UnitResolverConfig = BaseResolverConfig & { export type PipelineResolverConfig = BaseResolverConfig & { kind?: 'PIPELINE'; - code?: string; functions: string[]; };