From d4106038c8ea95b17e7fd2cca9a6feaa991fe60e Mon Sep 17 00:00:00 2001 From: Aaron Porter Date: Tue, 19 Dec 2023 15:35:16 +0000 Subject: [PATCH 1/3] =?UTF-8?q?Create=20Blog=20=E2=80=9Chow-we-implemented?= =?UTF-8?q?-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool?= =?UTF-8?q?/index=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../index.md | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/index.md diff --git a/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/index.md b/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/index.md new file mode 100644 index 0000000..f210769 --- /dev/null +++ b/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/index.md @@ -0,0 +1,162 @@ +--- +title: How We Implemented Type-Safe GraphQL With Hasura and the graphql-codegen + CLI Tool +author: Aaron Porter +authorTitle: Software Engineer +date: 2023-12-19T15:32:38.270Z +description: TBD +--- +In the last few months, the Catalog Engineering team has been hard at work on a new app to improve our customer's course curation process. This app connects to our new Hasura GraphQL API, to which we make requests for, and to mutate, data. Early on, we made the decision to not use a dedicated GraphQL client (e.g., apollo) and so we got used to creating TypeScript types for our GraphQL requests/responses as we needed them. This worked fine in the beginning as our app only had a few simple requests. However, as the number and complexity of these requests/responses grew, it became apparent that we needed a better solution. + +Enter [graphql-codegen](https://the-guild.dev/graphql/codegen) - a CLI tool that allows you to generate typed queries, mutations, subscriptions, and more based on your GraphQL schema. With graphql-codegen we were able to remove all of our manual types and generate new (and better!) types on the fly. This post will walk through how we connected the tool to our Hasura GraphQL schema, how we're able to make use of those types, and walkthrough setting up a custom 'SDK' that makes calling our methods a breeze. Let's get started! + +## Installation + +Note: _the following steps assume you have a working TypeScript app that is connected to an established Hasura GraphQL API with at least one GraphQL query/mutation/subscription_ + +First, you'll need to install the tool and a few dependencies. Run the following: + +```shell +npm i graphql graphql-config +``` + +And a few dev dependencies (we'll talk a bit more about some of these later): + +```shell +npm i -D @graphql-codegen/cli @graphql-codegen/typescript @graphql-codegen/typescript-operations @graphql-codegen/typescript-generic-sdk +``` + +## Configuration + +Next, create a GraphQL config file (detailed information on `graphql-config` can be found [here](https://the-guild.dev/graphql/config/docs)): + +```typescript +// graphql.config.ts + +import type { IGraphQLConfig } from 'graphql-config'; +import { loadEnv } from 'vite'; + +const { HASURA_ADMIN_SECRET, VITE_GRAPHQL_API_URL } = loadEnv('', process.cwd(), ''); + +const config: IGraphQLConfig = { + schema: [ + { + [VITE_GRAPHQL_API_URL]: { + headers: { + 'x-hasura-admin-secret': HASURA_ADMIN_SECRET, + }, + }, + }, + ], + documents: 'src/**/*.graphql', + extensions: { + codegen: { + overwrite: true, + generates: { + 'src/__generated__/graphql.ts': { + plugins: ['typescript', 'typescript-operations', 'typescript-generic-sdk'], + config: { + skipTypename: true, + namingConvention: { + typeNames: 'change-case-all#pascalCase', + enumValues: 'change-case-all#upperCase', + }, + rawRequest: true, + scalars: { + uuid: 'string', + }, + }, + }, + }, + }, + }, +}; + +export default config; + +``` + +A few notes about the above config: + +- We are using Vite as our build tool. We import several environment variables via Vite's `loadEnv`. The `schema` config will be the same for you - just pop in your Hasura GraphQL API URL and admin secret and you should be set +- Plugins allows for tons of custom configuration. We've chosen several customization that work well for us, but you might choose something differe. Also, make note of the `typescript-generic-sdk` plugin - we'll talk more about that later + +## An Example Mutation + +Let's quickly walk through the example mutation that we'll be reference moving forward. Our Hasura GraphQL schema has a table called `users`, so we'll need a way to add new `users`. In order to do that, we'll use the following mutation: + +```graphql +# src/graphql/createUser.graphql + +mutation createUser($organization_id: String, $user_id: uuid) { + insert_user_detail_one(object: { organization_id: $organization_id, id: $user_id }) { + id + } +} +``` + +As you can see, this mutation takes an `organization_id` and `user_id` and returns the user's `id` + +## Generating Types + +Now that we have our mutation and the tool is configured, let's see what our generated output looks like. We can run `npm run graphql-codegen` to kick that off + +Once finished, you should see `src/__generated__/graphql.ts`. Looking inside, we can see types for the mutation and the mutation's variables: + +![Generated types for the mutation's return type and variables](mutation_return_type_and_variables.png) + +as well as a `const` for the GraphQL document: + +![An exported const of the GraphQL document](mutation_document.png) + +Pretty cool, right?! Now, how can we make use of these types? Since we're not using something like Apollo, we'd need to wire up our Hasura requester to handle our newly generated mutation variables, return types, and the GraphQL document - that sounds like a lot of work, right?! This is where we can make use of that 'SDK' mentioned earlier + +## Putting Everything Together + +If we continue searching in `graphql.ts`, we'll see that we also have a type for a requester and an 'SDK' which has everything neatly typed and ready to go: + +![Types for a generic requester and an SDK with a method called createUser that makes use of the associated types](generic_sdk_with_mutation.png) + +All we need to do at this point is to implement the requester and we should be able to call the `createUser` method from the 'SDK'. That might look something like this: + +```typescript +// hasuraRequester.ts + +import { DocumentNode, ExecutionResult } from 'graphql'; +import { getSdk } from '../__generated__/graphql'; + +const requester = async (doc: DocumentNode, variables?: V, options?: { jwt: string }) => { + const requestBody = { query: doc.loc?.source.body, variables }; + const requestOptions = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${options?.jwt}`, + }, + body: JSON.stringify(requestBody), + }; + + const response = await fetch(import.meta.env.HASURA_API_URL, requestOptions); + return (await response.json()) as ExecutionResult; +}; + +const sdk = getSdk(requester); + +const createHasuraUser = (userId: string, orgId: string) => { + return sdk.createUser({ organization_id: orgId, user_id: userId }); +}; + +export default createHasuraUser; +``` + +If we import the 'SDK', we should now have typing around calling the `createHasuraUser` method: + +![The type of the createHasuraUser method](requester_typed_method.png) + +and we see the typed response: + +![The typed response from Hasura](requester_typed_response.png) + +and if we keep going, we also see the `id` mentioned earlier would be available to us + +![The typed payload from our GraphQL mutation](requester_typed_response_data.png) From 5adf7d7ccb15e653a4344beae7742c1c10db07cb Mon Sep 17 00:00:00 2001 From: Aaron Porter Date: Tue, 19 Dec 2023 15:44:34 +0000 Subject: [PATCH 2/3] =?UTF-8?q?Update=20Blog=20=E2=80=9Chow-we-implemented?= =?UTF-8?q?-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool?= =?UTF-8?q?/index=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generic_sdk_with_mutation.png | Bin 0 -> 32981 bytes .../index.md | 9 ++++----- .../mutation_document.png | Bin 0 -> 12674 bytes .../mutation_return_type_and_variables.png | Bin 0 -> 15235 bytes .../requester_typed_method.png | Bin 0 -> 12845 bytes .../requester_typed_response.png | Bin 0 -> 15074 bytes .../requester_typed_response_data.png | Bin 0 -> 12740 bytes 7 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/generic_sdk_with_mutation.png create mode 100644 content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/mutation_document.png create mode 100644 content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/mutation_return_type_and_variables.png create mode 100644 content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/requester_typed_method.png create mode 100644 content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/requester_typed_response.png create mode 100644 content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/requester_typed_response_data.png diff --git a/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/generic_sdk_with_mutation.png b/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/generic_sdk_with_mutation.png new file mode 100644 index 0000000000000000000000000000000000000000..542c1be5a6ebc1bb8bef1a019402959f592763f7 GIT binary patch literal 32981 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 HW?}ya@6oF~ literal 0 HcmV?d00001 diff --git a/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/mutation_return_type_and_variables.png b/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/mutation_return_type_and_variables.png new file mode 100644 index 0000000000000000000000000000000000000000..1cac0d8b0475e7dec8e8e7feca8745f58f2971de GIT binary patch literal 15235 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 literal 0 HcmV?d00001 diff --git a/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/requester_typed_method.png b/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/requester_typed_method.png new file mode 100644 index 0000000000000000000000000000000000000000..87863959c45b52d173b23831a3730be34b18cee0 GIT binary patch literal 12845 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 IgGuoJ0ybuNZ~y=R literal 0 HcmV?d00001 diff --git a/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/requester_typed_response_data.png b/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/requester_typed_response_data.png new file mode 100644 index 0000000000000000000000000000000000000000..d0651ef27544684a16cd8a7e16fd70869b2c5f0b GIT binary patch literal 12740 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 BK+pgH literal 0 HcmV?d00001 From 1ec8c82b181ed911e22931544eb644a5fb5bc980 Mon Sep 17 00:00:00 2001 From: Aaron Porter Date: Tue, 19 Dec 2023 15:46:31 +0000 Subject: [PATCH 3/3] =?UTF-8?q?Update=20Blog=20=E2=80=9Chow-we-implemented?= =?UTF-8?q?-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool?= =?UTF-8?q?/index=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/index.md b/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/index.md index 476ae32..e48f6bb 100644 --- a/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/index.md +++ b/content/blog/how-we-implemented-type-safe-graphql-with-hasura-and-the-graphql-codegen-cli-tool/index.md @@ -1,10 +1,10 @@ --- -title: How We Implemented Type-Safe GraphQL With Hasura and the graphql-codegen - CLI Tool +title: Type-Safe GraphQL With Hasura and the graphql-codegen CLI Tool author: Aaron Porter authorTitle: Software Engineer date: 2023-12-19T15:32:38.270Z -description: TBD +description: Learn how we transitioned from creating manual TypeScript types for + our GraphQL by using the graphql-codegen CLI tool --- In the last few months, the Catalog Engineering team has been hard at work on a new app to improve our customer's course curation process. This app connects to our new Hasura GraphQL API, to which we make requests for, and to mutate, data. Early on, we made the decision to not use a dedicated GraphQL client (e.g., apollo) and so we got used to creating TypeScript types for our GraphQL requests/responses as we needed them. This worked fine in the beginning as our app only had a few simple requests. However, as the number and complexity of these requests/responses grew, it became apparent that we needed a better solution.