javascriptgraphql

How to split a long GraphQL schema


I am trying to create a Schema, however is going to get too long and confusing, what are the best practices to split the different queries, mutations and inputs so I can just require them and organize them to make it easy to read.

I have tried to find information online but there is nothing clear at all and I am trying not to use Apollo.

const { buildSchema } = require('graphql');

module.exports = buildSchema(`
type Region {
  _id: ID!
  name: String!
  countries: [Country!]
}

type Country {
  _id: ID!
  name: String!
  region: [Region!]!
}

type City {
  _id: ID!
  name: String!
  country: [Country!]!
}

type Attraction {
  _id: ID!
  name: String!
  price: Float!
  description: String!
  city: [City!]!
}

type Eatery {
  _id: ID!
  name: String!
  cuisine: String!
  priceRange: String!
  location: [Location!]!
  typeOfEatery: String!
  city: [City!]!
}

type Location {
  _id: ID!
  latitude: String!
  longitude: String!
  address: Float
}

type User {
  _id: ID!
  email: String!
  password: String!
}

type AuthData {
  userId: ID!
  token: String!
  tokenExpiration: String!
}

type RegionInput {
  name: String!
}

type CountryInput {
  name: String!
}

type CityInput {
  name: String!
}

type RootQuery {
  regions: [Region!]!
  countries: [Country!]!
  login(email: String!, password: String!): AuthData!
}

type RootMutation {
  createRegion(regionInput: RegionInput): Region
  createCountry(countryInput: CountryInput): Country
  createCity(cityInput: CityInput): City
}

schema {
  query: RootQuery
  mutation: RootMutation
}
`);

I need something that is very organized and allows me to get everything in order and clear, merge all files in one index is the best solution.


Solution

  • There are multiple options, here are three of them:

    1. You can take a look at Apollo's blog - they show a way to modularize the schema: Modularizing your GraphQL schema code If you want an example, you can take a look at this github repository

    2. Of course you can always just use the template literals to embed parts of the schema as strings:

    const countryType = `
    type Country {
      _id: ID!
      name: String!
      region: [Region!]!
    }
    `
    
    const regionType = `
    type Region {
      _id: ID!
      name: String!
      countries: [Country!]
    }
    `
    
    const schema = `
    ${countryType}
    ${regionType}
    
    # ... more stuff ...
    `
    
    module.exports = buildSchema(schema);
    
    1. Another way is to use the code first approach and write the schemas in javascript instead of graphql schema language.