Skip to main content

Code Generation

Overview

Code generation tools untuk frontend development, khususnya untuk generate TypeScript code dari OpenAPI specification. Menggunakan Kubb sebagai main code generator dengan custom filtering dan configuration.

Komponen

Filter OpenAPI

Script untuk filtering OpenAPI specification sebelum di-generate. Berguna untuk:

  • Memilih endpoint tertentu yang akan di-generate
  • Menghapus schema yang tidak diperlukan
  • Optimasi ukuran generated code
  • Custom transformation OpenAPI spec

File: filter-openapi.mjs

// Contoh filtering endpoint tertentu
const filteredPaths = Object.keys(openapi.paths).filter(path =>
path.startsWith('/api/v1')
);

Kubb Configuration

Konfigurasi lengkap untuk Kubb code generator:

  • Generate TypeScript types dari OpenAPI schemas
  • Generate React Query hooks untuk API calls
  • Kustomisasi output directory dan file naming
  • Plugin configuration untuk berbagai format output

File: kubb.config.ts

import { defineConfig } from '@kubb/core'
import { pluginOas } from '@kubb/plugin-oas'
import { pluginReactQuery } from '@kubb/plugin-react-query'

export default defineConfig({
input: {
path: './openapi.json',
},
output: {
path: './src/gen',
clean: true,
},
plugins: [
pluginOas(),
pluginReactQuery({
output: {
path: './hooks',
},
}),
],
})

Workflow

1. Download OpenAPI Spec

# Download dari remote server
curl https://api.example.com/openapi.json -o openapi.json

2. Filter Specification (Optional)

# Jalankan filter script
node filter-openapi.mjs

3. Generate Code

# Generate types dan hooks
npx kubb generate

4. Import Generated Code

// Import types
import type { User, UserResponse } from '@/gen/types'

// Import hooks
import { useGetUsers, useCreateUser } from '@/gen/hooks'

// Gunakan di component
function UserList() {
const { data, isLoading } = useGetUsers()

if (isLoading) return <div>Loading...</div>

return (
<ul>
{data?.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
)
}

Benefits

Type Safety

  • Automatic TypeScript types dari OpenAPI schema
  • IntelliSense support di IDE
  • Compile-time error detection
  • Consistent types antara backend dan frontend

Development Speed

  • No manual API client writing
  • Auto-generated React Query hooks
  • Ready-to-use CRUD operations
  • Consistent naming convention

Maintainability

  • Single source of truth (OpenAPI spec)
  • Easy to update saat API changes
  • Automated regeneration
  • Reduced human error

Best Practices

1. Version Control

# Jangan commit generated code
echo "src/gen/" >> .gitignore

# Commit configuration files
git add kubb.config.ts filter-openapi.mjs

2. CI/CD Integration

# .github/workflows/generate-api.yml
name: Generate API Client

on:
push:
branches: [main]

jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
- name: Install dependencies
run: npm install
- name: Generate API client
run: npm run generate:api

3. Pre-commit Hook

// package.json
{
"scripts": {
"generate:api": "node filter-openapi.mjs && npx kubb generate",
"prepare": "husky install"
},
"husky": {
"hooks": {
"pre-commit": "npm run generate:api"
}
}
}

4. Documentation

/**
* Generated API hooks dari OpenAPI specification
*
* @see {@link https://api.example.com/docs} API Documentation
* @generated Last generated: 2025-11-05
*/
export * from './hooks'
export * from './types'

Troubleshooting

Generate Failed

Problem: Kubb generate error atau crash

Solution:

# Clear cache
rm -rf node_modules/.cache

# Reinstall dependencies
npm install

# Try generate again
npx kubb generate

Type Mismatch

Problem: Generated types tidak match dengan API response

Solution:

# Update OpenAPI spec
curl https://api.example.com/openapi.json -o openapi.json

# Regenerate
npm run generate:api

Missing Endpoints

Problem: Beberapa endpoint tidak ter-generate

Solution:

// Check filter-openapi.mjs
// Pastikan endpoint tidak ter-filter

// Atau disable filtering sementara
// const filteredPaths = openapi.paths; // Include all

Technology Stack: Kubb, OpenAPI, TypeScript, React Query
Use Case: API client generation, Type safety, Development automation
Last Updated: November 2025