DEV Community

Arnaldo Tomo
Arnaldo Tomo

Posted on

🚀 Criei uma biblioteca que gera tipos TypeScript automaticamente dos seus Models Laravel

Olá, dev community! 👋

Sou o Arnaldo Tomo, desenvolvedor em Moçambique 🇲🇿, e quero compartilhar com vocês uma biblioteca que desenvolvi para resolver um problema que me incomodava há muito tempo no desenvolvimento full-stack.

😤 A Frustração que me Motivou

Como muitos de vocês, trabalho frequentemente com Laravel no backend e React/Vue no frontend. E sempre me deparava com a mesma situação frustrante:

  1. Criava um model no Laravel
  2. Precisava recriar manualmente a interface TypeScript correspondente
  3. Toda vez que o model mudava, tinha que lembrar de atualizar o TypeScript
  4. Invariavelmente esquecia, causando bugs em produção

Pensava: "Deve haver uma forma melhor de fazer isso!"

💡 A Ideia

Após mais uma tarde perdida debuggando um erro causado por tipos desatualizados, decidi: vou automatizar isso de uma vez por todas!

A ideia era simples: analisar os models Laravel e gerar automaticamente os tipos TypeScript correspondentes. Mas queria que fosse:

  • Zero configuração - Funcionar imediatamente
  • 🔄 Sempre sincronizado - Nunca mais tipos desatualizados
  • 🧠 Inteligente - Entender relacionamentos, casts, validações
  • Rápido - Integração perfeita com o workflow

🛠️ Nasceu o Laravel AutoSchema

Depois de várias semanas de desenvolvimento (e muitas xícaras de café ☕), nasceu o Laravel AutoSchema.

O que a biblioteca faz:

# Instalação simples
composer require arnaldo-tomo/laravel-autoscema

# Um comando e pronto!
php artisan schema:generate
Enter fullscreen mode Exit fullscreen mode

Exemplo do que consegue fazer:

Meu Model Laravel:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $fillable = ['name', 'price', 'description'];

    protected $casts = [
        'price' => 'decimal:2',
        'metadata' => 'json',
        'status' => ProductStatus::class,
    ];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function reviews()
    {
        return $this->hasMany(Review::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

TypeScript gerado automaticamente:

export interface Product {
  id: number;
  name: string;
  price: number;
  description: string;
  metadata: Record<string, any> | null;
  status: ProductStatus;
  created_at: Date;
  updated_at: Date;

  // Relacionamentos detectados automaticamente!
  category?: Category;
  reviews?: Review[];
}

export enum ProductStatus {
  ACTIVE = 'active',
  INACTIVE = 'inactive',
  DRAFT = 'draft',
}
Enter fullscreen mode Exit fullscreen mode

🎯 Funcionalidades que Desenvolvi

1. Análise Inteligente de Models

A biblioteca analisa seus models e detecta:

  • Campos e tipos automaticamente
  • Relacionamentos Eloquent
  • Casts personalizados
  • Enums PHP 8.1+

2. Geração de Schemas de Validação

A partir dos Form Requests:

class CreateProductRequest extends FormRequest
{
    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'price' => 'required|numeric|min:0',
        ];
    }
}
Enter fullscreen mode Exit fullscreen mode

Gera automaticamente:

export const createProductSchema = z.object({
  name: z.string().max(255),
  price: z.number().min(0),
});
Enter fullscreen mode Exit fullscreen mode

3. Cliente API Tipado

Quando habilitado, gera um cliente API completo:

// Uso super simples e tipado!
const products = await productApi.getAll();
const product = await productApi.getById(1);
const newProduct = await productApi.create({
  name: 'Novo Produto',
  price: 99.99
});
Enter fullscreen mode Exit fullscreen mode

4. File Watcher em Tempo Real

# Fica observando mudanças e regenera automaticamente
php artisan schema:watch
Enter fullscreen mode Exit fullscreen mode

🌟 O que me Orgulha Mais

Zero Configuração

Funciona imediatamente após a instalação. Detecto automaticamente:

  • Diretórios de models
  • Relacionamentos
  • Tipos de dados
  • Estrutura do projeto

Compatibilidade Total

Testei extensivamente com:

  • ✅ Laravel 9, 10, 11+
  • ✅ Inertia.js
  • ✅ React, Vue, Angular
  • ✅ Diferentes estruturas de projeto

Performance

Otimizei para ser super rápido. Mesmo em projetos com centenas de models, a geração é praticamente instantânea.

📈 Números que me Motivam

Desde o lançamento:

  • 🚀 48 instalações (crescendo!)
  • Feedback positivo da comunidade
  • 🐛 Zero issues críticos reportados
  • 🌍 Usado em vários países

🔄 Integração com CI/CD

Uma das funcionalidades que mais me orgulho é a integração perfeita com CI/CD:

# GitHub Action que criei
- name: Generate TypeScript types
  run: php artisan schema:generate

- name: Commit if changes
  run: |
    git add resources/js/types/
    git commit -m "Auto-update types" || exit 0
Enter fullscreen mode Exit fullscreen mode

🎯 Casos de Uso Reais

Estou vendo a biblioteca sendo usada em:

E-commerce

// Checkout tipado e seguro
const order = await orderApi.create({
  products: selectedProducts,
  shipping_address: address,
  payment_method: 'credit_card'
});
Enter fullscreen mode Exit fullscreen mode

Dashboards

// Forms com validação automática
const ProductForm: React.FC = () => {
  const { register, handleSubmit } = useForm<CreateProductInput>({
    resolver: zodResolver(createProductSchema) // Schema gerado!
  });

  // Todo o form é tipado automaticamente
};
Enter fullscreen mode Exit fullscreen mode

APIs REST

Desenvolvedores usando para criar SDKs tipados dos seus APIs Laravel.

🚧 Desafios que Superei

Análise de AST PHP

Tive que mergulhar fundo na análise de código PHP para entender:

  • Estrutura dos models
  • Relacionamentos dinâmicos
  • Casts personalizados

Mapeamento de Tipos

Criar o mapeamento perfeito entre tipos PHP/Laravel e TypeScript foi complexo:

  • CarbonDate
  • json cast → Record<string, any>
  • Relacionamentos opcionais → Type | undefined

Performance com Projetos Grandes

Otimizei algoritmos para funcionar bem mesmo com:

  • Centenas de models
  • Relacionamentos complexos
  • Projetos monolíticos

🤝 Feedback da Comunidade

O que mais me motiva são mensagens como:

"Economizou horas do meu tempo!"

"Finalmente posso refatorar sem medo!"

"Integração perfeita com Inertia.js!"

🔮 Próximos Passos

Estou trabalhando em:

v2.0 Features

  • 🔧 Suporte a GraphQL - Gerar tipos para schemas GraphQL
  • 🎨 Themes customizáveis - Diferentes formatos de output
  • 📱 Plugin para IDEs - Integração com VS Code
  • 🌐 API Documentation - Gerar docs automaticamente

Melhorias de Performance

  • Cache inteligente
  • Geração incremental
  • Paralelização

📦 Como Experimentar

# Instalação
composer require arnaldo-tomo/laravel-autoscema

# Inicialização
php artisan schema:init

# Geração
php artisan schema:generate

# Watch mode para desenvolvimento
php artisan schema:watch
Enter fullscreen mode Exit fullscreen mode

🙏 Pedindo Apoio da Comunidade

Como criador indie em Moçambique, cada:

  • Star no GitHub me motiva muito
  • 🐛 Issue reportado me ajuda a melhorar
  • 💡 Sugestão me inspira para novas features
  • 🗣️ Compartilhamento ajuda outros desenvolvedores

GitHub: https://github.com/arnaldo-tomo/laravel-autoscema

💭 Reflexão Final

Desenvolver o Laravel AutoSchema me ensinou muito sobre:

  • Análise estática de código
  • Developer Experience (DX)
  • Importância da automação
  • Como uma ferramenta simples pode impactar produtividade

Mas o mais gratificante é saber que estou resolvendo um problema real que eu e muitos outros desenvolvedores enfrentamos diariamente.

🎉 Vamos Conectar!

Sou apaixonado por desenvolvimento e adoro conversar sobre:

  • Full-stack development
  • Laravel ecosystem
  • TypeScript
  • Developer tools
  • Open source

Me encontre em:


Se você testa a biblioteca, me conta sua experiência! Feedback é sempre bem-vindo! 🚀

Top comments (0)