diff --git a/CHANGELOG.md b/CHANGELOG.md index 4df1d00e1d..920add50be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## Upcoming - `apollo` - - + - Add `ApolloConfig` type to exports from `apollo` [#1413](https://github.com/apollographql/apollo-tooling/pull/1413) - `apollo-codegen-core` - - `apollo-codegen-flow` @@ -19,12 +19,12 @@ - `apollo-graphql` - - `apollo-language-server` - - + - Add error message for service lookup failure [#1413](https://github.com/apollographql/apollo-tooling/pull/1413) - `apollo-tools` - - `vscode-apollo` - Only activate extension on apollo.config.js/ts [#1411](https://github.com/apollographql/apollo-tooling/pull/1411) - - Changed the status bar title to be "Apollo" to save space. + - Changed the status bar title to be "Apollo" to save space. [#1415](https://github.com/apollographql/apollo-tooling/pull/1415) ## `apollo@2.16.0`, `apollo-codegen-swift@0.34.0`, `apollo-language-server@1.13.0`, `apollo-tools@0.4.0`, `vscode-apollo@1.8.0` diff --git a/packages/apollo-language-server/src/engine/index.ts b/packages/apollo-language-server/src/engine/index.ts index c17a3ce865..284e8e03b2 100644 --- a/packages/apollo-language-server/src/engine/index.ts +++ b/packages/apollo-language-server/src/engine/index.ts @@ -274,8 +274,12 @@ export class ApolloEngineClient extends GraphQLDataSource { } }); - if (!(data && data.service)) { - throw new Error(); + if (!(data && data.service) || errors) { + throw new Error( + errors + ? errors.map(error => error.message).join("\n") + : "No service returned. Make sure your service name and API key match" + ); } const schemaTags: string[] = data.service.schemaTags.map( diff --git a/packages/apollo-language-server/src/project/client.ts b/packages/apollo-language-server/src/project/client.ts index 49846940d7..e6baf0b1fb 100644 --- a/packages/apollo-language-server/src/project/client.ts +++ b/packages/apollo-language-server/src/project/client.ts @@ -169,7 +169,7 @@ export class GraphQLClientProject extends GraphQLProject { total: totalTypes }, tag: this.config.tag, - loaded: this.serviceID ? true : false, + loaded: Boolean(this.serviceID && (this.schema || this.serviceSchema)), lastFetch: this.lastLoadDate }; } @@ -271,15 +271,19 @@ export class GraphQLClientProject extends GraphQLProject { await this.loadingHandler.handle( `Loading Engine data for ${this.displayName}`, (async () => { - const { - schemaTags, - fieldStats - } = await engineClient.loadSchemaTagsAndFieldStats(serviceID); - this._onSchemaTags && this._onSchemaTags([serviceID, schemaTags]); - this.fieldStats = fieldStats; - this.lastLoadDate = +new Date(); - - this.generateDecorations(); + try { + const { + schemaTags, + fieldStats + } = await engineClient.loadSchemaTagsAndFieldStats(serviceID); + this._onSchemaTags && this._onSchemaTags([serviceID, schemaTags]); + this.fieldStats = fieldStats; + this.lastLoadDate = +new Date(); + + this.generateDecorations(); + } catch (e) { + console.error(e); + } })() ); } diff --git a/packages/apollo-language-server/src/providers/schema/engine.ts b/packages/apollo-language-server/src/providers/schema/engine.ts index 48331fcd62..5fb0a5da2a 100644 --- a/packages/apollo-language-server/src/providers/schema/engine.ts +++ b/packages/apollo-language-server/src/providers/schema/engine.ts @@ -4,6 +4,7 @@ import gql from "graphql-tag"; import { GraphQLSchema, buildClientSchema } from "graphql"; import { ApolloEngineClient, ClientIdentity } from "../../engine"; import { ClientConfig, parseServiceSpecifier } from "../../config"; +import { getServiceFromKey } from "../../config/utils"; import { GraphQLSchemaProvider, SchemaChangeUnsubscribeHandler, @@ -44,6 +45,15 @@ export class EngineSchemaProvider implements GraphQLSchemaProvider { } const [id, tag = "current"] = parseServiceSpecifier(client.service); + + // make sure the API key is valid for the service we're requesting a schema of. + const keyServiceName = getServiceFromKey(engine.apiKey); + if (id !== keyServiceName) { + throw new Error( + `API key service name (${keyServiceName}) does not match the service name in your config (${id}). Try changing the service name in your config to ${keyServiceName} or get a new key.` + ); + } + const { data, errors } = await this.client.execute({ query: SCHEMA_QUERY, variables: { diff --git a/packages/apollo/src/index.ts b/packages/apollo/src/index.ts index a93d39d153..5dd08fb23f 100644 --- a/packages/apollo/src/index.ts +++ b/packages/apollo/src/index.ts @@ -6,3 +6,5 @@ export * from "./Command"; // export git utils export * from "./git"; + +export { ApolloConfigFormat as ApolloConfig } from "apollo-language-server";