From 46aed422c8a6d5447edce22f58c44bef69e677e0 Mon Sep 17 00:00:00 2001 From: Quentin Cuvillier Date: Wed, 6 Jun 2018 12:38:57 -0700 Subject: [PATCH] warn when user try to use apollo-boost as an apollo-client --- .../__tests__/__snapshots__/config.ts.snap | 10 +++ packages/apollo-boost/src/__tests__/config.ts | 10 +++ packages/apollo-boost/src/index.ts | 70 ++++++++++++++----- 3 files changed, 72 insertions(+), 18 deletions(-) create mode 100644 packages/apollo-boost/src/__tests__/__snapshots__/config.ts.snap diff --git a/packages/apollo-boost/src/__tests__/__snapshots__/config.ts.snap b/packages/apollo-boost/src/__tests__/__snapshots__/config.ts.snap new file mode 100644 index 00000000000..13b374a415a --- /dev/null +++ b/packages/apollo-boost/src/__tests__/__snapshots__/config.ts.snap @@ -0,0 +1,10 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`config warns about unsupported parameter 1`] = ` +Array [ + Array [ + "ApolloBoost was initialized with unsupported options: link +https://github.com/apollographql/apollo-client/tree/master/packages/apollo-boost#apollo-boost-options", + ], +] +`; diff --git a/packages/apollo-boost/src/__tests__/config.ts b/packages/apollo-boost/src/__tests__/config.ts index 4ef1496c25d..0efe46852ca 100644 --- a/packages/apollo-boost/src/__tests__/config.ts +++ b/packages/apollo-boost/src/__tests__/config.ts @@ -22,6 +22,16 @@ describe('config', () => { }, }; + it('warns about unsupported parameter', () => { + jest.spyOn(global.console, 'warn'); + + const client = new ApolloClient({ + link: [], + }); + + expect(global.console.warn.mock.calls).toMatchSnapshot(); + }); + it('allows you to pass in a request handler', () => { let requestCalled; diff --git a/packages/apollo-boost/src/index.ts b/packages/apollo-boost/src/index.ts index 54741384ad2..3db7b6648e1 100644 --- a/packages/apollo-boost/src/index.ts +++ b/packages/apollo-boost/src/index.ts @@ -25,8 +25,41 @@ export interface PresetConfig { cacheRedirects?: CacheResolverMap; } +// infer this list from the above interface +// using a typescript transform at compilation time. +const PRESET_CONFIG_KEYS = [ + 'request', + 'uri', + 'credentials', + 'headers', + 'fetchOptions', + 'clientState', + 'onError', + 'cacheRedirects', +]; + +function include(b: T, a: Array): boolean { + return a.indexOf(b) >= 0; +} + +function difference(a: Array, b: Array): Array { + return a.filter(x => !include(x, b)); +} + export default class DefaultClient extends ApolloClient { constructor(config: PresetConfig) { + if (config) { + const diff = difference(Object.keys(config), PRESET_CONFIG_KEYS); + + if (diff.length > 0) { + // prettier-ignore + console.warn( + `ApolloBoost was initialized with unsupported options: ${diff.join(' ')}\n` + + `https://github.com/apollographql/apollo-client/tree/master/packages/apollo-boost#apollo-boost-options`, + ); + } + } + const cache = config && config.cacheRedirects ? new InMemoryCache({ cacheRedirects: config.cacheRedirects }) @@ -52,24 +85,25 @@ export default class DefaultClient extends ApolloClient { const requestHandler = config && config.request - ? new ApolloLink((operation, forward) => - new Observable(observer => { - let handle: any; - Promise.resolve(operation) - .then(oper => config.request(oper)) - .then(() => { - handle = forward(operation).subscribe({ - next: observer.next.bind(observer), - error: observer.error.bind(observer), - complete: observer.complete.bind(observer), - }); - }) - .catch(observer.error.bind(observer)); - - return () => { - if (handle) handle.unsubscribe; - }; - }) + ? new ApolloLink( + (operation, forward) => + new Observable(observer => { + let handle: any; + Promise.resolve(operation) + .then(oper => config.request(oper)) + .then(() => { + handle = forward(operation).subscribe({ + next: observer.next.bind(observer), + error: observer.error.bind(observer), + complete: observer.complete.bind(observer), + }); + }) + .catch(observer.error.bind(observer)); + + return () => { + if (handle) handle.unsubscribe; + }; + }), ) : false;