gqg v0.1.1
GQG
Schema-first GraphQL code generator
Usage
gqg (SCHEMA_DIR) (OUTPUT_FILE)
# example: gqg schema/ src/__test__/testSchema.ts@resolve and @source
A GraphQL implementation is a composition of resolvers and sources.
type Post implements Node {
  id: ID!
  title: String!
  publishedAt: Date!
  content: String!
  author: User!
}When you define a type like Post, you would have a blueprint of
how its resolver and source type should be.
GQG helps you to explicitly annotate the resolvers and source.
type Post implements Node {
  # "Our post entity already have id field (which is a string),
  # but it should be resolved to a Relay global ID."
  id: ID!
    @resolve @source(name: "id", type: "String!")
  # "title, publishedAt, and content are simple scalars
  # and our Post entity have the exact same names."
  title: String!
  publishedAt: Date!
  content: String!
  author: User!
    @resolve @source(name: "authorId", type: "String!")
    # "We store post-author relation as `authorId` field in `Post` entity.
    # This author resolver will load the actual User entity from the database."
}Based on the schema, GQG generates its source and resolver types like below:
export interface PostSource {
  __typename?: "Post"
  readonly id: string
  readonly title: string
  readonly publishedAt: any
  readonly content: string
  readonly authorId: string
}export interface PostResolver<TContext> {
  __type?: (source: any, context: TContext, info: graphql.GraphQLResolveInfo) => boolean
  id!: (src:  PostSource, args: {}, context: TContext, info: graphql.GraphQLResolveInfo) => string | null | undefined | Promise<string | null | undefined>
  author!: (src:  PostSource, args: {}, context: TContext, info: graphql.GraphQLResolveInfo) => UserSource | null | undefined | Promise<UserSource | null | undefined>
}Now, You can implement PostResolver and pass the resolver instance to a function createGraphQLSchema
which is also created by GQG.
const schema: graphql.Schema = createGraphQLSchema({
  Post: {
    id: source => {
      return encodeGlobalId(PostTypename, source.id)
    },
    author: async source => {
      return users.find(item => item.id === source.authorId)
    },
  },
})Schema directory structure
When you execute gqg (SCHEMA_DIR) (OUTPUT_FILE), GQG collects all files in SCHEMA directory.
Let's run it on the test schema.
schema/
├── Post.graphql
├── User.graphql
├── relay.graphql
└── root.graphqlExecution of gqg schema/ src/__test__/testSchema.ts creates a single file to the
location of src/__test__/testSchema.ts. You can check the generated code.
It should be much more complex in a real application though, you can also find the test implementation of the resolvers.