SyntaxStudy
Sign Up
GraphQL Schema Stitching and Modular SDL
GraphQL Beginner 1 min read

Schema Stitching and Modular SDL

As a GraphQL API grows, keeping all type definitions in one string becomes unwieldy. The graphql-tools library (part of The Guild ecosystem) provides mergeTypeDefs and mergeResolvers utilities that let you split your schema into domain modules—users, products, orders—and stitch them together at startup. Apollo Federation takes this further by letting separate microservices each own a slice of the graph. A gateway service composes the subgraph schemas into a unified supergraph that clients query as if it were a single API, while each subservice independently deploys its own resolver logic.
Example
// npm install @graphql-tools/merge @graphql-tools/schema

import { mergeTypeDefs, mergeResolvers } from '@graphql-tools/merge';
import { makeExecutableSchema } from '@graphql-tools/schema';

// user.typedefs.js
export const userTypeDefs = `#graphql
  type User { id: ID!  name: String!  email: String! }
  type Query { users: [User!]!  user(id: ID!): User }
  type Mutation { createUser(name: String!, email: String!): User! }
`;

// product.typedefs.js
export const productTypeDefs = `#graphql
  type Product { id: ID!  title: String!  price: Float! }
  type Query { products: [Product!]! }
`;

// user.resolvers.js
export const userResolvers = {
  Query: {
    users: () => db.users.findAll(),
    user: (_, { id }) => db.users.findById(id),
  },
  Mutation: {
    createUser: (_, args) => db.users.create(args),
  },
};

// product.resolvers.js
export const productResolvers = {
  Query: { products: () => db.products.findAll() },
};

// schema.js — merge everything
const typeDefs = mergeTypeDefs([userTypeDefs, productTypeDefs]);
const resolvers = mergeResolvers([userResolvers, productResolvers]);
export const schema = makeExecutableSchema({ typeDefs, resolvers });