Skip to main content

kysera generate

Generate type-safe code from database schema.

Commands

model

Generate model interfaces.

kysera generate model [table]
kysera g model [table]

Options:

-o, --output <path>       Output directory (default: ./src/models)
--overwrite Overwrite existing files
--timestamps Include timestamp fields (default: true)
--soft-delete Include soft delete fields

Generated:

// src/models/user.ts
import { Generated } from 'kysely'

export interface User {
id: number
email: string
name: string
createdAt: Date
}

export interface UserTable {
id: Generated<number>
email: string
name: string
created_at: Generated<Date>
}

export type NewUser = Omit<User, 'id' | 'createdAt'>
export type UserUpdate = Partial<NewUser>

repository

Generate repository class.

kysera generate repository <table>

Options:

-o, --output <path>       Output directory (default: ./src/repositories)
--overwrite Overwrite existing files
--with-validation Include Zod validation (default: true)
--with-pagination Include pagination methods (default: true)

Generated:

// src/repositories/user.repository.ts
import { createRepositoryFactory } from '@kysera/repository'
import { UserSchema, CreateUserSchema, UpdateUserSchema } from '../schemas/user.schema'

export function createUserRepository(executor: Executor<Database>) {
const factory = createRepositoryFactory(executor)

return factory.create({
tableName: 'users' as const,
mapRow: (row) => ({ ... }),
schemas: {
entity: UserSchema,
create: CreateUserSchema,
update: UpdateUserSchema
}
})
}

schema

Generate Zod validation schemas.

kysera generate schema <table>

Options:

-o, --output <path>       Output directory (default: ./src/schemas)
--overwrite Overwrite existing files

Generated:

// src/schemas/user.schema.ts
import { z } from 'zod'

export const UserSchema = z.object({
id: z.number(),
email: z.string().email(),
name: z.string(),
createdAt: z.date()
})

export const CreateUserSchema = z.object({
email: z.string().email(),
name: z.string().min(1).max(100)
})

export const UpdateUserSchema = CreateUserSchema.partial()

export type User = z.infer<typeof UserSchema>
export type CreateUser = z.infer<typeof CreateUserSchema>
export type UpdateUser = z.infer<typeof UpdateUserSchema>

crud

Generate complete CRUD stack.

kysera generate crud <table>

Options:

-o, --output-dir <path>   Base output directory (default: ./src)
--overwrite Overwrite existing files
--with-validation Include Zod validation (default: true)
--with-pagination Include pagination (default: true)
--with-soft-delete Include soft delete support
--with-timestamps Include timestamp support (default: true)
--format Format with Prettier (default: true)

Generated Files:

src/
├── models/user.ts
├── schemas/user.schema.ts
├── repositories/user.repository.ts
└── index.ts (exports)

Examples

# Generate model for users table
kysera generate model User

# Generate full CRUD with soft delete
kysera generate crud Post --with-soft-delete

# Generate to custom directory
kysera generate crud Order --output-dir ./src/domain

# Regenerate existing files
kysera generate crud User --overwrite

Type Mapping

Database TypeTypeScript Type
serial, int, bigintnumber
varchar, textstring
boolean, boolboolean
timestamp, datetimeDate
json, jsonbunknown
uuidstring

Best Practices

1. Generate After Schema Changes

kysera migrate up
kysera generate crud User --overwrite

2. Customize Generated Code

Generated code is a starting point. Customize:

  • Validation rules
  • Row mapping logic
  • Additional methods

3. Use Consistent Naming

# Singular table names generate better code
kysera generate crud User # → user.ts
kysera generate crud Post # → post.ts