DocumentationDocuments Loading

Loading GraphQL Operation Documents from Different Sources

Similar to schema loading - but meant to use for GraphQL documents (query/mutation/subscription/fragment).

Any input provided as a source will be recognized by utils automatically.

It also extracts usages of gql from code files using @graphql-tools/graphql-tag-pluck.

For notes on typescript, refer to Schema Loading > Loaders

Usage

const { loadDocuments } = require('@graphql-tools/load')
const { GraphQLFileLoader } = require('@graphql-tools/graphql-file-loader')
const { CodeFileLoader } = require('@graphql-tools/code-file-loader')
 
// Load from string
const document1 = loadDocuments('query { f }', { loaders: [] })
 
// Load from a single file
const document2 = loadDocuments('./users.query.graphql', { loaders: [new GraphQLFileLoader()] })
 
// Load from multiple files using glob
const document3 = loadDocuments('./src/**/*.graphql', { loaders: [new GraphQLFileLoader()] })
 
// Load from code file
const document4 = loadDocuments('./src/my-component.ts', { loaders: [new CodeFileLoader()] })

loadDocuments returns an array of document sources. Each source object has the following structure:

interface DocumentSource {
  document: DocumentNode // Object representation of GraphQL Content
  rawSDL: string // SDL in text
  location: string // Way to access to that source
}

loadDocuments takes in additional configuration via the options object (the second argument). There are some defaults to be aware of - to learn more, see the full API documentation.

💡

You can learn more about loaders to load documents from different sources.

Error Handling

No Files Found

In case no documents were found and loaded via the provided glob an exception is thrown.

import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'
import { loadDocuments } from '@graphql-tools/load'
 
const documents = await loadDocuments(['i-do-not-exist.graphql'], {
  loaders: [new GraphQLFileLoader()]
})

If i-do-not-exist.graphql does not exist this throws the following error:

Error:
      Unable to find any GraphQL type definitions for the following pointers:

          - *.graphql

Syntax Error within a File

In case you try to load a GraphQL file with invalid syntax, the loadDocuments function will throw a GraphQLError.

You can identify the exact file that caused this GraphQLError by using the errors source property.

import { GraphQLError } from 'graphql'
import { CodeFileLoader } from '@graphql-tools/code-file-loader'
import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'
import { loadDocuments } from '@graphql-tools/load'
 
try {
  const documents = await loadDocuments(['packages/**/*.graphql', 'packages/**/*.ts(x)'], {
    loaders: [new GraphQLFileLoader(), new CodeFileLoader()]
  })
  console.log(documents)
} catch (error) {
  if (error instanceof GraphQLError) {
    console.log(error.message + `\n in ${error.source?.name}`)
  }
  throw error
}