Grats: Implementation-First GraphQL for TypeScript
The simplest way to build a GraphQL server in TypeScript
When you write your GraphQL server in TypeScript, your fields and resolvers are _already_ annotated with type information. _Grats leverages your existing type annotations to automatically extract an executable GraphQL schema from your generic TypeScript resolver code._
By making your TypeScript implementation the source of truth, you never have to worry about validating that your implementation matches your schema. Your implementation _is_ your schema!
Read the blog post.
Example
Here's what it looks like to define a User type with a greeting field using Grats:
/* @gqlType /
class User {
/* @gqlField /
name: string;
/* @gqlField /
greet(greeting: string): string {
return ${greeting}, ${this.name};
}
}
After running npx grats, you'll find a schema.ts module that exports an executable schema, and a schema.graphql file contains your GraphQL schema definition:
type User {
name: String
greet(greeting: String!): String
}
That's just the beginning! To learn more, Read the docs: https://grats.capt.dev/
Contributing
See CONTRIBUTING.md in the repo root for details on how to make changes to this project.
Acknowledgements
- @mofeiZ and @alunyov for their Relay hack-week project exploring a similar idea.
- @josephsavona for input on the design of Relay Resolvers which inspired this project.
- @bradzacher for tips on how to handle TypeScript ASTs.
- Everyone who worked on Meta's Hack GraphQL server, the developer experience of which inspired this project.
- A number of other projects which seem to have explored similar ideas in the past:
License
Grats is MIT licensed.