nuxt-apollo
Version:
Apollo client for Nuxt 3
51 lines (50 loc) • 1.67 kB
JavaScript
import { ApolloClient, InMemoryCache, HttpLink, split } from "@apollo/client/core";
import { createClient } from "graphql-ws";
import { GraphQLWsLink } from "@apollo/client/link/subscriptions";
import { getMainDefinition } from "@apollo/client/utilities";
import { DefaultApolloClient } from "@vue/apollo-composable";
import { setContext } from "@apollo/client/link/context";
import { defineNuxtPlugin } from "#imports";
export default defineNuxtPlugin({
enforce: "post",
setup: (nuxtApp) => {
const config = nuxtApp.$config.public.apollo;
const httpLink = new HttpLink({
uri: config.httpEndpoint,
credentials: config.credentials
});
const authLink = setContext(async (_, { headers }) => {
const args = { authorization: void 0 };
await nuxtApp.callHook("apollo:http-auth", args);
return {
headers: {
...headers,
authorization: args.authorization
}
};
});
const wsLink = new GraphQLWsLink(
createClient({
url: config.wsEndpoint,
connectionParams: async () => {
const args = { params: {} };
await nuxtApp.callHook("apollo:ws-auth", args);
return args.params;
}
})
);
const link = split(
({ query }) => {
const definition = getMainDefinition(query);
return definition.kind === "OperationDefinition" && definition.operation === "subscription";
},
wsLink,
authLink.concat(httpLink)
);
const apolloClient = new ApolloClient({
link,
cache: new InMemoryCache()
});
nuxtApp.vueApp.provide(DefaultApolloClient, apolloClient);
}
});