From 6a18ce1aa62a272e8d13b19ae9207a0efbc80dbb Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Sun, 18 Oct 2020 00:41:15 +0200 Subject: [PATCH] refactor: throw if no apollo client was resolved --- .../src/useApolloClient.ts | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/packages/vue-apollo-composable/src/useApolloClient.ts b/packages/vue-apollo-composable/src/useApolloClient.ts index 3fd7dca..b35a163 100644 --- a/packages/vue-apollo-composable/src/useApolloClient.ts +++ b/packages/vue-apollo-composable/src/useApolloClient.ts @@ -7,50 +7,53 @@ export const ApolloClients = Symbol('apollo-clients') type ClientId = string type ClientDict = Record> +type ResolveClient> = (clientId?: ClientId) => TReturn +type NullableApolloClient = ApolloClient | undefined + export interface UseApolloClientReturn { - resolveClient: (clientId?: ClientId) => ApolloClient + resolveClient: ResolveClient readonly client: ApolloClient } -function resolveDefaultClient (providedApolloClients: ClientDict, providedApolloClient: ApolloClient): ApolloClient { +function resolveDefaultClient (providedApolloClients: ClientDict, providedApolloClient: ApolloClient): NullableApolloClient { const resolvedClient = providedApolloClients ? providedApolloClients.default : providedApolloClient - if (!resolvedClient) { - throw new Error('Apollo Client with id default not found') - } return resolvedClient } -function resolveClientWithId (providedApolloClients: ClientDict, clientId: ClientId): ApolloClient { +function resolveClientWithId (providedApolloClients: ClientDict, clientId: ClientId): NullableApolloClient { if (!providedApolloClients) { throw new Error(`No apolloClients injection found, tried to resolve '${clientId}' clientId`) } - const resolvedClient = providedApolloClients[clientId] - if (!resolvedClient) { - throw new Error(`Apollo Client with id ${clientId} not found`) - } - return resolvedClient + return providedApolloClients[clientId] } export function useApolloClient (clientId?: ClientId): UseApolloClientReturn { + let resolveImpl: ResolveClient> + if (!getCurrentInstance()) { - return { - resolveClient: () => currentApolloClient, - get client () { return currentApolloClient }, + resolveImpl = () => currentApolloClient + } else { + const providedApolloClients: ClientDict = inject(ApolloClients, null) + const providedApolloClient: ApolloClient = inject(DefaultApolloClient, null) + + resolveImpl = (id: ClientId) => { + if (currentApolloClient) { + return currentApolloClient + } else if (id) { + return resolveClientWithId(providedApolloClients, id) + } + return resolveDefaultClient(providedApolloClients, providedApolloClient) } } - const providedApolloClients: ClientDict = inject(ApolloClients, null) - const providedApolloClient: ApolloClient = inject(DefaultApolloClient, null) - function resolveClient (id: ClientId = clientId) { - if (currentApolloClient) { - return currentApolloClient - } else if (id) { - return resolveClientWithId(providedApolloClients, id) + const client = resolveImpl(id) + if (!client) { + throw new Error(`Apollo client with id ${id || 'default'} not found. Use provideApolloClient() if you are outside of a component setup.`) } - return resolveDefaultClient(providedApolloClients, providedApolloClient) + return client } return {