Type Definitions
GraphQL Schema is built out of type
s, enum
s, interface
s and so on. Defining or extending them in GraphQL Modules is fairly simple.
Just like GraphQL Schema, GraphQL Modules follow the same rules of writing SDL (Schema Definition Language), a single definition per type and multiple extensions. This way we force a good pattern and clarify ownership of each type.
To get started with type definitions in your module, make sure to use gql
(you can import it from graphql-modules
) or parse
(from graphql
) to convert your string SDL definition into a DocumentNode
object.
import { createModule, gql } from 'graphql-modules'
export const myModule = createModule({
id: 'my-module',
dirname: __dirname,
typeDefs: gql`
type Query {
user(id: ID!): User
}
type User {
id: ID!
username: String!
}
`
})
Using string
s could be possible, but we decided to force a better pattern.
Using gql
tag means your IDE can highlight the GraphQL SDL and in general
works better with other tools from the GraphQL ecosystem.
TIP: typeDefs
can be a single item or an array of multiple.
Storing SDL in .graphql
Files
If you wish to write your GraphQL SDL in a .graphql
file, you need to make sure you can load it correctly in a Node.js environment.
To do so, use graphql-import-node
to make this process easier:
Start by installing it, and follow the installation instructions, based on your environment and your setup.
Now, store your SDL in a .graphql
file(s), and load it this way, with import
or require
:
import MyQueryType from './query.type.graphql'
import { createModule } from 'graphql-modules'
export const myModule = createModule({
id: 'my-module',
dirname: __dirname,
typeDefs: [MyQueryType]
})
Dynamically Load SDL Files
If you have too many SDL files, and you wish to load them dynamically, you can use loaders from @graphql-tools/load-files
!
Start by installing this package:
npm i @graphql-tools/load-files
Next, use it to load your files dynamically:
import MyQueryType from './query.type.graphql'
import { createModule } from 'graphql-modules'
import { loadFilesSync } from '@graphql-tools/load-files'
import { join } from 'node:path'
export const myModule = createModule({
id: 'my-module',
dirname: __dirname,
typeDefs: loadFilesSync(join(__dirname, './typeDefs/*.graphql'))
})
Note: the default implementation of loadFilesSync
is using fs
module. If you are using graphql-import-node
, you can add a 2nd parameter with configuration: { useRequire: true }
.