diff --git a/docs/source/api/apollo-server.md b/docs/source/api/apollo-server.md index 5d4db3ae..3ebfd4c0 100644 --- a/docs/source/api/apollo-server.md +++ b/docs/source/api/apollo-server.md @@ -86,6 +86,10 @@ new ApolloServer({ The persisted queries option can be set to an object containing a `cache` field, which will be used to store the mapping between hash and query string. +* `cors`: <`Object` | `boolean`> ([apollo-server](https://github.com/expressjs/cors#cors)) + + Pass the integration-specific CORS options. `false` removes the CORS middleware and `true` uses the defaults. This option is only available to `apollo-server`. For other server integrations, place `cors` inside of `applyMiddleware`. + #### Returns `ApolloServer` diff --git a/packages/apollo-server-express/src/index.ts b/packages/apollo-server-express/src/index.ts index 839fcafe..10299306 100644 --- a/packages/apollo-server-express/src/index.ts +++ b/packages/apollo-server-express/src/index.ts @@ -21,3 +21,6 @@ export { registerServer, ServerRegistration, } from './ApolloServer'; + +export { CorsOptions } from 'cors'; +export { OptionsJson } from 'body-parser'; diff --git a/packages/apollo-server/src/index.test.ts b/packages/apollo-server/src/index.test.ts index 8afe2ce3..b43be735 100644 --- a/packages/apollo-server/src/index.test.ts +++ b/packages/apollo-server/src/index.test.ts @@ -102,6 +102,26 @@ describe('apollo-server', () => { await apolloFetch({ query: '{hello}' }); }); + it('configures cors', async () => { + server = new ApolloServer({ + typeDefs, + resolvers, + cors: { origin: 'localhost' }, + }); + + const { url: uri } = await server.listen(); + + const apolloFetch = createApolloFetch({ uri }).useAfter( + (response, next) => { + expect( + response.response.headers.get('access-control-allow-origin'), + ).to.equal('localhost'); + next(); + }, + ); + await apolloFetch({ query: '{hello}' }); + }); + it('creates a healthcheck endpoint', async () => { server = new ApolloServer({ typeDefs, diff --git a/packages/apollo-server/src/index.ts b/packages/apollo-server/src/index.ts index ff285cd7..99e88cc8 100644 --- a/packages/apollo-server/src/index.ts +++ b/packages/apollo-server/src/index.ts @@ -5,15 +5,22 @@ import * as express from 'express'; import * as http from 'http'; import * as net from 'net'; -import { ApolloServer as ApolloServerBase } from 'apollo-server-express'; +import { + ApolloServer as ApolloServerBase, + CorsOptions, +} from 'apollo-server-express'; +import { Config } from 'apollo-server-core'; export { GraphQLUpload, GraphQLOptions, GraphQLExtension, gql, + Config, } from 'apollo-server-core'; +export { CorsOptions } from 'apollo-server-express'; + export * from './exports'; export interface ServerInfo { @@ -27,7 +34,13 @@ export interface ServerInfo { } export class ApolloServer extends ApolloServerBase { - private httpServer: http.Server; + private httpServer!: http.Server; + private cors?: CorsOptions | boolean; + + constructor(config: Config & { cors?: CorsOptions | boolean }) { + super(config); + this.cors = config && config.cors; + } private createServerInfo( server: http.Server, @@ -78,9 +91,12 @@ export class ApolloServer extends ApolloServerBase { app, path: '/', bodyParserConfig: { limit: '50mb' }, - cors: { - origin: '*', - }, + cors: + typeof this.cors !== 'undefined' + ? this.cors + : { + origin: '*', + }, }); this.httpServer = http.createServer(app);