Set up @data-client/graphql for GraphQL APIs. Configures GQLEndpoint with auth and custom options. Use after data-client-setup detects GraphQL patterns.
Resources
1Install
npx skillscat add reactive/data-client/data-client-graphql-setup Install via the SkillsCat registry.
We need to produce a 2-3 sentence plain-text summary, objective, factual, no marketing, no superlatives, no calls to action. At most 60 words. Must be only the summary text, no quotes, no markdown. So just plain text. We need to explain: what this skill does, what problem it solves, when to use it. We can write something like: "The skill configures the @data-client/graphql package by creating a GQLEndpoint instance with authentication and custom options, enabling GraphQL API integration after a GraphQL pattern is detected.
GraphQL Protocol Setup
This skill configures @data-client/graphql for a project. It should be applied after data-client-setup detects GraphQL patterns.
Installation
Install the GraphQL package alongside the core package:
# npm
npm install @data-client/graphql
# yarn
yarn add @data-client/graphql
# pnpm
pnpm add @data-client/graphqlGQLEndpoint Setup
Basic Configuration
Create a file at src/api/gql.ts (or similar):
import { GQLEndpoint } from '@data-client/graphql';
export const gql = new GQLEndpoint('/graphql');Detection Checklist
Scan the existing codebase for GraphQL patterns:
- GraphQL endpoint URL: Look for
/graphqlor custom paths - Authentication: Check for auth headers in existing GraphQL client setup
- Custom headers: API keys, tenant IDs, etc.
- Error handling: GraphQL error parsing patterns
With Authentication
import { GQLEndpoint } from '@data-client/graphql';
export const gql = new GQLEndpoint('/graphql', {
getHeaders() {
const token = localStorage.getItem('authToken');
return {
'Content-Type': 'application/json',
...(token && { Authorization: `Bearer ${token}` }),
};
},
});Async Authentication (token refresh)
import { GQLEndpoint } from '@data-client/graphql';
export const gql = new GQLEndpoint('/graphql', {
async getHeaders() {
const token = await getValidToken();
return {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
};
},
});Custom Error Handling
import { GQLEndpoint } from '@data-client/graphql';
class CustomGQLEndpoint extends GQLEndpoint {
async fetchResponse(input: RequestInfo, init: RequestInit): Promise<any> {
const response = await super.fetchResponse(input, init);
// Handle GraphQL errors
if (response.errors?.length) {
const authError = response.errors.find(
e => e.extensions?.code === 'UNAUTHENTICATED'
);
if (authError) {
window.dispatchEvent(new CustomEvent('auth:expired'));
}
}
return response;
}
}
export const gql = new CustomGQLEndpoint('/graphql');Defining Queries and Mutations
Query Example
import { gql } from './gql';
import { User } from '../schemas/User';
export const getUser = gql.query(
(v: { id: string }) => `
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
`,
{ schema: User },
);Mutation Example
import { gql } from './gql';
import { User } from '../schemas/User';
export const updateUser = gql.mutation(
(v: { id: string; name: string }) => `
mutation UpdateUser($id: ID!, $name: String!) {
updateUser(id: $id, name: $name) {
id
name
}
}
`,
{ schema: User },
);With Collection
import { gql } from './gql';
import { User, UserCollection } from '../schemas/User';
export const listUsers = gql.query(
() => `
query ListUsers {
users {
id
name
email
}
}
`,
{ schema: UserCollection },
);
export const createUser = gql.mutation(
(v: { name: string; email: string }) => `
mutation CreateUser($name: String!, $email: String!) {
createUser(name: $name, email: $email) {
id
name
email
}
}
`,
{ schema: UserCollection.push },
);Usage in Components
import { useSuspense, useController } from '@data-client/react';
import { getUser, updateUser } from './api/users';
function UserProfile({ id }: { id: string }) {
const user = useSuspense(getUser, { id });
const ctrl = useController();
const handleUpdate = async (name: string) => {
await ctrl.fetch(updateUser, { id, name });
};
return (
<div>
<h1>{user.name}</h1>
<button onClick={() => handleUpdate('New Name')}>Update</button>
</div>
);
}Next Steps
- Apply skill "data-client-schema" to define Entity classes
- Apply skill "data-client-react" or "data-client-vue" for usage
References
- GQLEndpoint - Full GQLEndpoint API
- GraphQL Guide - GraphQL usage guide
- Authentication Guide - Auth patterns for GraphQL