hemilrajput / laravel-typegen
Generate TypeScript types from Eloquent models, Enums & FormRequests.
Requires
- php: ^8.3
- illuminate/console: ^11.0|^12.0|^13.0
- illuminate/contracts: ^11.0|^12.0|^13.0
- illuminate/database: ^11.0|^12.0|^13.0
- illuminate/support: ^11.0|^12.0|^13.0
Requires (Dev)
- larastan/larastan: ^3.9
- laravel/pint: ^1.29
- orchestra/testbench: ^9.0|^10.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
README
Laravel TypeGen — one artisan command turns your Eloquent models, Enums, and FormRequests into a single typed
.tsfile. No more hand-syncing PHP and TypeScript.
📖 Documentation
For complete documentation, guides, and setup instructions, visit laravel-typegen.github.io.
Why Laravel TypeGen?
- Keeps types in sync: Automatically reflect changes in your PHP models in your TypeScript interfaces. Generate TypeScript types from Eloquent models, Enums, and FormRequests. Built for the Laravel 13 + Inertia + React/Vue stack.
⚡️ The Killer Feature: Synchronized Types
Laravel TypeGen doesn't just generate standalone interfaces. It understands your application's logic.
PHP Enum + Model Cast:
enum UserRole: string { case Admin = 'admin'; } class User extends Model { protected $casts = ['role' => UserRole::class]; }
TypeScript Output:
export type UserRole = 'admin'; export interface User { id: number; role: UserRole; // Automatically linked! }
🚀 Features
- Eloquent Models: Generates interfaces from
$fillable,$casts, and timestamps. - Enums: Generates union types from backed and pure PHP enums.
- FormRequests: Generates request DTOs from your
rules()method. - Attribute-Driven: Opt-in to generation using the
#[TypeScript]attribute. - Zero-Config: Smart defaults for standard Laravel projects.
📊 Comparison
| Feature | TypeGen | Spatie TS Transformer |
|---|---|---|
| Eloquent Support | ✅ | ✅ |
| Enum Support | ✅ | ✅ |
| FormRequest → DTO | ✅ | ❌ |
| Relationship Auto-Discovery | ✅ | ❌ |
| Linked Enum Casts | ✅ | ⚠️ (Manual) |
| Attribute Driven | ✅ | ✅ |
| Inertia Native | ✅ | ⚠️ |
📦 Installation
composer require hemilrajput/laravel-typegen
🛠 Usage
1. Tag your classes
use Hemilrajput\TypeGen\Attributes\TypeScript; #[TypeScript] class User extends Model { ... }
2. Generate
php artisan typescript:generate
🔗 Relationships
Opt into relationship type generation per-model:
#[TypeScript(includeRelations: ['posts', 'profile'])] class User extends Model { /* ... */ }
Related models (Post, Profile) are auto-discovered — no need to mark them separately. Generated output:
export interface User { id: number; posts?: Post[]; profile?: Profile | null; } export interface Post { /* ... */ } export interface Profile { /* ... */ }
Relations are always emitted as optional (?) because they're only present when eager-loaded. This matches runtime reality.
Polymorphic relations
MorphTo is auto-supported when you register a morph map:
Relation::enforceMorphMap([ 'post' => Post::class, 'video' => Video::class, ]);
Generates:
export interface Comment { commentable?: (Post | Video) | null; }
Without a morph map, emits unknown | null with a comment.
🗺 Roadmap
- Enum support (v0.2)
- FormRequest → DTO (v0.2)
- Eloquent relationships (v0.3)
- Route parameter types (v0.4)
- Watch mode (v0.4)
- Custom Cast class resolver (v0.4)
- VitePress documentation site (v1.0.0)
- Stable release (v1.0.0)
Configuration
See config/typegen.php for all available options, including:
- Output path and style (interface vs type).
- Custom cast mapping.
- Prefix/suffix for generated names.
- Including/excluding timestamps and hidden fields.
License
MIT