tutorial

107 Menjalankan Code Generation untuk Resolver dan Model

107 Menjalankan Code Generation untuk Resolver dan Model

Jika kamu membangun aplikasi modern dengan GraphQL dan TypeScript—katakanlah menggunakan stack kebanggaan seperti Apollo Server, NestJS, atau GraphQL Yoga—pasti pernah merasakan manual repetitive task seperti membuat resolver, model, dan map tipe GraphQL ke TypeScript. Untungnya, dunia modern engineering telah menyediakan “ramuan otomatis” berupa code generation tools.

Pada artikel kali ini, kita akan membahas end-to-end cara menjalankan code generation untuk resolver dan model, kamu akan menemukan contoh kode, simulasi, dan bahkan diagram alur prosedur codegen menggunakan mermaid.


Mengapa Perlu Code Generation?

Sebelum membahas “cara”, mari bahas dulu “mengapa”. Dengan code generation:

  • Produktivitas meningkat: Tidak perlu menulis file resolver dan model secara manual setiap ada perubahan schema.
  • Konsistensi tipe: Tidak ada lagi typo tipe data atau flow data/response yang tidak sinkron.
  • Scalability: Ketika skema membesar, codegen menghemat ratusan menit kerja manusia.

Tool: @graphql-codegen/cli

Tool paling populer untuk code generation di ekosistem JavaScript/TypeScript adalah @graphql-codegen/cli. Ia fleksibel, banyak plugin, mendukung berbagai framework, mudah diintegrasikan ke dalam CI/CD, dan komunitasnya aktif.


Skema Diagram: Proses Code Generation

Mari mulai dari big picture—begini alur proses code generation untuk resolver dan model biasanya berlangsung:

flowchart TD
    A[Write GraphQL Schema (.graphql)] --> B[Konfigurasi codegen.yml]
    B --> C[Run Codegen Command]
    C --> D[Generate Typescript Models]
    C --> E[Generate Typed Resolvers]
    D --> F[Import Model/Types di Project]
    E --> F

Setup Proyek Simulasi

Misal, penggunaan di aplikasi TypeScript sederhana.

Struktur directory:

/project-root
 ├── src/
 │    ├── resolvers/
 │    ├── models/
 │    └── schema.graphql
 ├── codegen.yml
 └── package.json

Kita mulai dari schema:

src/schema.graphql:

type User {
  id: ID!
  name: String!
  email: String!
}

type Query {
  users: [User!]!
  user(id: ID!): User
}

Instalasi Paket Codegen

Install dependency yang dibutuhkan:

npm install --save-dev @graphql-codegen/cli @graphql-codegen/typescript @graphql-codegen/typescript-resolvers

Penjelasan singkat plugin:

  • typescript: Generate tipe TypeScript dari skema GraphQL.
  • typescript-resolvers: Generate resolver type signatures lengkap.

Membuat Konfigurasi codegen.yml

codegen.yml:

schema: ./src/schema.graphql
generates:
  ./src/generated/types.ts:
    plugins:
      - typescript
      - typescript-resolvers
    config:
      contextType: ../context#Context
      maybeValue: T | null // allow null response

Penjelasan penting:

  • schema: path ke schema GraphQL.
  • generates: target file output.
  • contextType: menyesuaikan dengan context resolver.
  • plugins: yang akan dijalankan untuk generate kode.

Menjalankan Code Generation

Command untuk generate kode:

npx graphql-codegen

Setelah dijalankan, kamu akan mendapatkan file src/generated/types.ts berisi dua hal besar:

  • Model cukup otomatis sesuai tipe di schema.
  • Type signature untuk setiap resolver.

Contoh Hasil Generate

1. Generated Model Types

Sebagian dari types.ts yang dihasilkan akan tampak seperti ini:

export type User = {
  __typename?: 'User';
  id: string;
  name: string;
  email: string;
};

2. Generated Resolver Types

Juga tersedia signature resolver yang aman secara tipe:

export type QueryResolvers<ContextType = Context, ParentType = ResolversParentTypes['Query']> = {
  users?: Resolver<Array<User>, ParentType, ContextType>,
  user?: Resolver<Maybe<User>, ParentType, ContextType, RequireFields<QueryUserArgs, 'id'>>,
};

Dengan model ini, setiap implementasi resolver otomatis mendapat autocomplete tipe sekeren ini:

import { QueryResolvers } from './generated/types';

export const queryResolvers: QueryResolvers = {
  users: (parent, args, context, info) => {
    // context: strongly typed!
    return context.dataSources.userAPI.getAllUsers();
  },
  user: (parent, { id }, context) => {
    return context.dataSources.userAPI.getUserById(id);
  },
};

Simulasi Perubahan Skema

Salah satu selling point codegen: ketika schema berubah, tinggal generate ulang!

Misal tambahkan field isActive:

type User {
  id: ID!
  name: String!
  email: String!
  isActive: Boolean!
}

Cukup jalankan ulang:

npx graphql-codegen

Maka seluruh model dan resolver signature otomatis diperbarui, tanpa perlu manual sync.


Tabel Perbandingan Manual vs Code Generation

KategoriManualDengan Codegen
SpeedLambat, banyak boilerplateSangat cepat, tinggal generate
Human ErrorRawan typo dan missing fieldHampir tidak mungkin typo
Tipe KonsistensiSering out of sync schema-kode100% mengikuti Schema
SkalabilitasCepat chaos jika schema bertambahSkala besar tetap manageable
Integrasi CI/CDMaupun bisa, rawan missSangat mudah, tinggal npx

Best Practices dalam Implementasi

1. Ignore hasil generate di VCS
Tambahkan /src/generated ke .gitignore agar hasil generate tidak membanjiri repository.

2. Integrasi dalam CI/CD
Di pipeline, jalankan codegen sebelum kompilasi atau testing, pastikan semua code up-to-date.

3. Cek Breaking Change schema
Perubahan schema = wajib generate ulang, lint dan build gagal jika tipe tak sesuai.

4. Custom Plugin
Gunakan plugin lain seperti typescript-operations jika perlu generate kode untuk query/mutation dari frontend.


Penutup

Dengan melakukan code generation untuk resolver dan model, development menjadi lebih scalable, aman dari typo, dan mudah untuk kolaborasi tim besar. Begitu pipeline codegen terintegrasi, productivitas engineermu akan naik berkali lipat.

Jadi, jika “musuh klasik” project GraphQL kamu adalah boilerplate manual, sudah waktunya hijrah ke code generation. Tidak perlu khawatir berapa besar schema yang kamu punya, karena automation siap menanganinya.


Referensi


Happy coding & automating! 🚀

comments powered by Disqus