Document Transform
Document transform is a feature that allows you to modify documents before they are used by plugins.
You can use functions passed to the documentTransforms option to make changes to GraphQL documents.
Basic Usage
Document transform has transform function.
Let’s specify an object containing those functions as the documentTransforms option as follows:
import type { CodegenConfig } from '@graphql-codegen/cli'
const config: CodegenConfig = {
schema: 'https://localhost:4000/graphql',
documents: ['src/**/*.tsx'],
generates: {
'./src/gql/': {
preset: 'client',
documentTransforms: [
{
transform: ({ documents }) => {
// Make some changes to the documents
return documents
}
}
]
}
}
}
export default configFor instance, to remove a @localOnlyDirective directive from documents, you can write the following code:
import type { CodegenConfig } from '@graphql-codegen/cli'
import { visit } from 'graphql'
const config: CodegenConfig = {
schema: 'https://localhost:4000/graphql',
documents: ['src/**/*.tsx'],
generates: {
'./src/gql/': {
preset: 'client',
documentTransforms: [
{
transform: ({ documents }) => {
return documents.map(documentFile => {
documentFile.document = visit(documentFile.document, {
Directive: {
leave(node) {
if (node.name.value === 'localOnlyDirective') return null
}
}
})
return documentFile
})
}
}
]
}
}
}
export default configHow to specify by name
The document transform can also be specified by file name. You can create a custom file and pass it to documentTransforms.
Let’s create a file named ./my-document-transform.js:
module.exports = {
transform: ({ documents }) => {
// Make some changes to the documents
return documents
}
}Then, you can specify the file name as follows:
import type { CodegenConfig } from '@graphql-codegen/cli'
const config: CodegenConfig = {
schema: 'https://localhost:4000/graphql',
documents: ['src/**/*.tsx'],
generates: {
'./src/gql/': {
preset: 'client',
documentTransforms: ['./my-document-transform.js']
}
}
}
export default configConfiguration
If you want to change the behavior of a document transform at runtime, you can simply prepare a function that generates the document transform and write the configuration in its argument.
import type { CodegenConfig } from '@graphql-codegen/cli'
const generateDocumentTransform: (config: { queryName: string }) => Types.DocumentTransformObject = ({ queryName }) => {
return {
transform: ({ documents }) => {
// Modify something in documents using `queryName`.
return documents
}
}
}
const config: CodegenConfig = {
schema: 'https://localhost:4000/graphql',
documents: ['src/**/*.tsx'],
generates: {
'./src/gql/': {
preset: 'client',
documentTransforms: [generateDocumentTransform({ queryName: 'test' })]
}
}
}
export default configIf you want to specify the document transform by file, do the following:
import type { CodegenConfig } from '@graphql-codegen/cli'
const config: CodegenConfig = {
schema: 'https://localhost:4000/graphql',
documents: ['src/**/*.tsx'],
generates: {
'./src/gql/': {
preset: 'client',
documentTransforms: [
{
'./my-document-transform.js': {
queryName: 'test'
}
}
]
}
}
}
export default configIn this case, you can retrieve the queryName from the config argument of the transform function as follows:
module.exports = {
transform: ({ documents, config }) => {
// Modify something in documents using `config.queryName`.
return documents
}
}