diff --git a/CHANGELOG.md b/CHANGELOG.md index 8505e8746c7..f4de992dc82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ### vNEXT +- Fix typing for ContextFunction incorrectly requiring the context object the function produces to match the parameters of the function [PR #2350](https://github.com/apollographql/apollo-server/pull/2350) ### v2.4.3 diff --git a/packages/apollo-server-core/src/types.ts b/packages/apollo-server-core/src/types.ts index e083da43866..1affbeafe8a 100644 --- a/packages/apollo-server-core/src/types.ts +++ b/packages/apollo-server-core/src/types.ts @@ -29,10 +29,10 @@ export { GraphQLSchemaModule }; export { KeyValueCache } from 'apollo-server-caching'; -export type Context = T; -export type ContextFunction = ( - context: Context, -) => Context | Promise>; +export type Context = T; +export type ContextFunction = ( + context: FunctionParams, +) => Context | Promise>; // A plugin can return an interface that matches `ApolloServerPlugin`, or a // factory function that returns `ApolloServerPlugin`. @@ -50,7 +50,7 @@ export interface SubscriptionServerOptions { } type BaseConfig = Pick< - GraphQLOptions>, + GraphQLOptions, | 'formatError' | 'debug' | 'rootValue' @@ -71,11 +71,11 @@ export interface Config extends BaseConfig { resolvers?: IResolvers; schema?: GraphQLSchema; schemaDirectives?: Record; - context?: Context | ContextFunction; + context?: Context | ContextFunction; introspection?: boolean; mocks?: boolean | IMocks; mockEntireSchema?: boolean; - engine?: boolean | EngineReportingOptions>; + engine?: boolean | EngineReportingOptions; extensions?: Array<() => GraphQLExtension>; cacheControl?: CacheControlExtensionOptions | boolean; plugins?: PluginDefinition[]; diff --git a/packages/apollo-server-express/src/ApolloServer.ts b/packages/apollo-server-express/src/ApolloServer.ts index b432ec45672..c13c7ac0aa6 100644 --- a/packages/apollo-server-express/src/ApolloServer.ts +++ b/packages/apollo-server-express/src/ApolloServer.ts @@ -77,7 +77,7 @@ interface ExpressContext { export interface ApolloServerExpressConfig extends Config { cors?: CorsOptions | boolean; - context?: ContextFunction | Context; + context?: ContextFunction | Context; } export class ApolloServer extends ApolloServerBase { diff --git a/packages/apollo-server/src/__tests__/index.test.ts b/packages/apollo-server/src/__tests__/index.test.ts index 56001d97bff..0d739c2b166 100644 --- a/packages/apollo-server/src/__tests__/index.test.ts +++ b/packages/apollo-server/src/__tests__/index.test.ts @@ -24,6 +24,51 @@ describe('apollo-server', () => { it('accepts typeDefs and mocks', () => { expect(() => new ApolloServer({ typeDefs, mocks: true })).not.toThrow; }); + + describe('context field', () => { + describe('as a function', () => { + it('can accept and return `req`', () => { + expect( + new ApolloServer({ + typeDefs, + resolvers, + context: ({ req }) => ({ req }), + }), + ).not.toThrow; + }); + + it('can accept nothing and return an empty object', () => { + expect( + new ApolloServer({ + typeDefs, + resolvers, + context: () => ({}), + }), + ).not.toThrow; + }); + }); + }); + describe('as an object', () => { + it('can be an empty object', () => { + expect( + new ApolloServer({ + typeDefs, + resolvers, + context: {}, + }), + ).not.toThrow; + }); + + it('can contain arbitrary values', () => { + expect( + new ApolloServer({ + typeDefs, + resolvers, + context: { value: 'arbitrary' }, + }), + ).not.toThrow; + }); + }); }); describe('without registerServer', () => {