Directives
Customize GraphQL behavior on the client side with special directives.
What are Directives?
Directives are annotations you add to GraphQL operations (queries, mutations, subscriptions) and fragments that change how Mearie processes and types your data. Unlike standard GraphQL directives (like @include
, @skip
), these are processed during code generation and don't affect the actual query sent to the server.
TIP
These are also known as client directives to distinguish them from server-side GraphQL directives. They only exist on the client and are stripped out before sending queries to the server.
Available Directives
@required
Control field nullability on the client side. Your schema might mark fields as nullable for flexibility, but your client can enforce stricter requirements.
const UserProfile = ({ userId }: { userId: string }) => {
const { data } = useQuery(
graphql(`
query GetUser($id: ID!) {
user(id: $id) {
id
name @required
email @required
}
}
`),
{ id: userId },
);
// TypeScript knows these are non-null
return (
<div>
<h1>{data.user.name}</h1>
<p>{data.user.email}</p>
</div>
);
};
How Directives Work
Directives operate at two levels:
1. Code Generation Time
During code generation, Mearie analyzes your directives and generates appropriate TypeScript types:
// Without @required
type UserQuery$data = {
name?: string | null;
};
// With @required
type UserQuery$data = {
name: string; // Now non-null
};
2. Runtime Execution
Some directives also affect runtime behavior. For example, @required
throws an error if a field is unexpectedly null:
// If name is null, this will throw
const data = useQuery(
graphql(`
query GetUser($id: ID!) {
user(id: $id) {
name @required
}
}
`),
);