Skip to main content

Custom schema directives handling

For directives applied to the schema, you can select which ones to be rendered for the types or in the locations they are declared. Information about the custom directives includes a custom description.

For example, we have one query called searchRole, and we want to limit access to ADMIN user roles only.

We can accomplish this by adding a directive called auth with an argument requires to the query.

directive @auth(requires: Roles = ADMIN) on OBJECT | FIELD_DEFINITION

enum Roles {
ADMIN
USER
}

type Query {
searchRole(roles: [Roles!]! = [ADMIN]): Int! @auth
}

Usage​

Add the option customDirective to the @graphql-markdown/docusaurus configuration.

The descriptor and tag functions receive 2 arguments:

type DirectiveName = string & { _opaque: typeof DirectiveName };

type CustomDirective = {
[name: DirectiveName]: {
descriptor?: (directive?: GraphQLDirective, node?: unknown): string;
tag?: (directive?: GraphQLDirective, node?: unknown): Badge;
};
};

type Badge = {
text: string | TypeLocale;
classname: string;
};

descriptor​

The descriptor allows rendering the custom directive's description applicable to entities.

docusaurus.config.js
plugins: [
[
"@graphql-markdown/docusaurus",
/** @type {import('@graphql-markdown/types').ConfigOptions} */
{
// ... other options
customDirective: {
auth: {
descriptor: (directive, node) =>
directiveDescriptor(
directive,
node,
"This requires the current user to be in `${requires}` role.",
),
}
// ... other custom directive options
},
},
],
],

tag​

The tag allows rendering custom badges (tags) based on the custom directive applicable to entities.

docusaurus.config.js
plugins: [
[
"@graphql-markdown/docusaurus",
/** @type {import('@graphql-markdown/types').ConfigOptions} */
{
// ... other options
customDirective: {
beta: {
tag: (directive, node) => ({ text: directive.name, classname: "badge--info" }),
}
// ... other custom directive options
},
},
],
],

Wildcard​

You can use "*" as a wildcard for the directive name. This will allow all directives not declared with their name under customDirective to be handled by the wildcard descriptor and/or tag.

docusaurus.config.js
const { directiveDescriptor, tagDescriptor } = require("@graphql-markdown/helpers");

//...//

plugins: [
[
"@graphql-markdown/docusaurus",
/** @type {import('@graphql-markdown/types').ConfigOptions} */
{
// ... other options
customDirective: {
"*": {
descriptor: directiveDescriptor,
tag: tagDescriptor,
},
// ... optionally specific custom directive options
},
},
],
],

Helpers​

The packages @graphql-markdown/helpers and @graphql-markdown/graphql provide a few helper functions to quickly start.

info

@graphql-markdown/helpers is an optional peer dependency, and it needs to be installed before using it.

shell
npm i @graphql-markdown/helpers

@graphql-markdown/helpers​

@graphql-markdown/graphql​