GithubHelp home page GithubHelp logo

graphql-schema-modules's Introduction

graphql-schema-modules Build Status

Modularize and decouple GraphQL schema and resolvers.

Installation

$ npm install --save graphql-schema-modules

Features

  • Keep different query/mutation/subscription definitions in separate files
  • Keep resolvers and GraphQL definitions modularized
  • Load GraphQL from directory

Usage

graphql/shared.js

export const typeDefs = `
  enum UserType { MEMBER, ADMIN }

  type schema {
    query: Query
    mutation: Mutation
  }
`;

graphql/users.js

export const typeDefs = `
  type User {
    id: Int!
    type: UserType!
  }

  input UserInput {
    type: UserType!
  }

  input UserFilters {
    type: UserType
  }

  type Query {
    user: User!
    users (filters: UserFilters = {}): [User!]!
  }
  type Mutation {
    userCreate (input: UserInput!): User!
  }
`;

export const resolvers = {
  Query: {
    async user () {
      return { id: 1, type: 'MEMBER' };
    },
    async users () {
      return [];
    },
  },
  Mutation: {
    async userCreate () {
      return { id: 1, type: 'MEMBER' };
    },
  },
};

graphql/posts.js

export const typeDefs = `
  type Post {
    id: Int!
    title: String!
  }

  input PostInput {
    title: String!
  }

  type Mutation {
    postCreate (input: PostInput!): Post!
  }

  type Query {
    posts: [Post!]!
  }
`;

export const resolvers = {
  Mutation: {
    async postCreate () {
      return { id: 1, title: 'Post1' };
    },
  },
  Query: {
    async posts () {
      return [];
    },
  },
};

buildSchema.js

import { mergeModules, loadModules } from 'graphql-schema-modules';
import { makeExecutableSchema } from 'graphql-tools';
import * as shared from './graphql/shared.js';
import * as posts from './graphql/posts.js';
import * as users from './graphql/users.js';

const { typeDefs, resolvers } = mergeModules([ shared, posts, users ]);
// OR
// const { typeDefs, resolvers } = loadModules(__dirname + '/graphql');

console.log(typeDefs[0]);

const schema = makeExecutableSchema({ typeDefs, resolvers });

export default schema;

The output will be:

type Post {
  id: Int!
  title: String!
}

input PostInput {
  title: String!
}

# This is where magic happens - mutations are merged
type Mutation {
  postCreate(input: PostInput!): Post!
  userCreate(inut: UserInput!): User!
}

# This is where magic happens - queries are merged
type Query {
  posts: [Post!]!
  user: User!
  users(filters: UserFilters = {}): [User!]!
}

enum UserType {
  MEMBER
  ADMIN
}

type schema {
  query: Query
  mutation: Mutation
}

type User {
  id: Int!
  type: UserType!
}

input UserInput {
  type: UserType!
}

input UserFilters {
  type: UserType
}

graphql-schema-modules's People

Contributors

alekbarszczewski avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

graphql-schema-modules's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.