diff --git a/packages/apollo-server-core/package.json b/packages/apollo-server-core/package.json index 2804cf25e0e..b322c8a3f92 100644 --- a/packages/apollo-server-core/package.json +++ b/packages/apollo-server-core/package.json @@ -24,6 +24,7 @@ "node": ">=6" }, "dependencies": { + "@apollographql/apollo-tools": "^0.2.0", "@apollographql/apollo-upload-server": "^5.0.3", "@apollographql/graphql-playground-html": "^1.6.4", "@types/ws": "^6.0.0", diff --git a/packages/apollo-server-core/src/ApolloServer.ts b/packages/apollo-server-core/src/ApolloServer.ts index 33d933f7ada..011e2160188 100644 --- a/packages/apollo-server-core/src/ApolloServer.ts +++ b/packages/apollo-server-core/src/ApolloServer.ts @@ -52,6 +52,7 @@ import { } from './requestPipeline'; import { Headers } from 'apollo-server-env'; +import { buildServiceDefinition } from '../../../../apollo-tooling/packages/apollo-tools/lib'; const NoIntrospection = (context: ValidationContext) => ({ Field(node: FieldDefinitionNode) { @@ -117,6 +118,7 @@ export class ApolloServerBase { resolvers, schema, schemaDirectives, + modules, typeDefs, introspection, mocks, @@ -215,10 +217,16 @@ export class ApolloServerBase { if (schema) { this.schema = schema; + } else if (modules) { + const { schema, errors } = buildServiceDefinition(modules); + if (errors && errors.length > 0) { + throw new Error(errors.map(error => error.message).join('\n\n')); + } + this.schema = schema!; } else { if (!typeDefs) { throw Error( - 'Apollo Server requires either an existing schema or typeDefs', + 'Apollo Server requires either an existing schema, modules or typeDefs', ); } diff --git a/packages/apollo-server-core/src/types.ts b/packages/apollo-server-core/src/types.ts index 8807c6ccd9d..275b6067c21 100644 --- a/packages/apollo-server-core/src/types.ts +++ b/packages/apollo-server-core/src/types.ts @@ -17,6 +17,9 @@ import { import { CacheControlExtensionOptions } from 'apollo-cache-control'; import { ApolloServerPlugin } from 'apollo-server-plugin-base'; +import { GraphQLSchemaModule } from '@apollographql/apollo-tools'; +export { GraphQLSchemaModule }; + export { KeyValueCache } from 'apollo-server-caching'; export type Context = T; @@ -54,6 +57,7 @@ export interface Config | 'dataSources' | 'cache' > { + modules?: GraphQLSchemaModule[]; typeDefs?: DocumentNode | Array; resolvers?: IResolvers; schema?: GraphQLSchema; diff --git a/packages/apollo-server/src/exports.ts b/packages/apollo-server/src/exports.ts index ded825c35c2..7a625e2cbe4 100644 --- a/packages/apollo-server/src/exports.ts +++ b/packages/apollo-server/src/exports.ts @@ -7,6 +7,7 @@ export { GraphQLOptions, GraphQLExtension, Config, + GraphQLSchemaModule, // Errors ApolloError, toApolloError, diff --git a/packages/graphql-extensions/package.json b/packages/graphql-extensions/package.json index d67f1682de5..c8c90d4551e 100644 --- a/packages/graphql-extensions/package.json +++ b/packages/graphql-extensions/package.json @@ -13,6 +13,9 @@ "engines": { "node": ">=6.0" }, + "dependencies": { + "@apollographql/apollo-tools": "^0.2.0" + }, "devDependencies": { "apollo-server-core": "file:../apollo-server-core", "apollo-server-env": "file:../apollo-server-env"