Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Codifyo TypeScript Generator Bundle (ts-generator-bundle)

Bundle Symfony 7 & 8 permettant de générer automatiquement des fichiers de définitions TypeScript (.ts) à partir du Symfony Serializer, des Custom Normalizers, des groupes de sérialisation et de JMS Serializer.


🚀 Fonctionnalités

  • Multi-Projets & Multi-Répertoires : Configurez plusieurs projets cibles avec des dossiers de sortie distants (ex: assets/ts/types, public/ts/types).
  • Filtrage par Groupes de Sérialisation : Génération exacte des propriétés exposées par vos attributs #[Groups(['user:read'])].
  • Formats d'Export Configurables : Choisissez de générer des interface (par défaut), des class ou des type TypeScript via l'option kind.
  • Modes d'Extraction Flexibles (mode) :
    • runtime : Exécute la véritable chaîne de normalisation ($serializer->normalize()) pour capturer le résultat exact des Custom Normalizers, des NameConverter et des accesseurs dynamiques / getters calculés.
    • static : Analyse statique via ClassMetadataFactory et la réflexion PHP.
    • jms : Support des métadonnées JMS\Serializer.
    • auto (par défaut) : Teste d'abord le mode runtime, puis bascule automatiquement en static / jms en cas de fallback.
  • Support des Relations Doctrine ORM :
    • Interprétation automatique des relations OneToMany et ManyToMany en Array<Target>.
    • Interprétation des ManyToOne et OneToOne en Target | null.
    • Détection du typage générique PHPDoc @var Collection<int, Target> ou @var Target[].
  • Dépendances & Imports Automatiques :
    • Génération d'imports relatifs (import { Role } from './Role';).
    • Option auto_generate_deps: true pour découvrir et générer automatiquement toutes les entités référencées.

📦 Installation

Installez le bundle via Composer :

composer require codifyo/ts-generator-bundle

Si Symfony Flex n'enregistre pas le bundle automatiquement, ajoutez-le dans config/bundles.php :

return [
    // ...
    Codifyo\TsGeneratorBundle\CodifyoTsGeneratorBundle::class => ['all' => true],
];

⚙️ Configuration

Créez le fichier de configuration config/packages/codifyo_ts_generator.yaml :

codifyo_ts_generator:
    projects:
        frontend:
            dir: 'assets/ts/types'
            mode: 'auto' # 'auto' | 'runtime' | 'static' | 'jms' (optionnel, défaut: 'auto')
            types:
                - class: 'App\Entity\User'
                  groups: ['user:read']
                  kind: 'interface' # 'interface' | 'class' | 'type' (optionnel, défaut: 'interface')
                  auto_generate_deps: true # Découvre et génère automatiquement les entités liées (ex: Role)

                - class: 'App\Entity\Product'
                  groups: ['product:read', 'product:detail']
                  name: 'ProductDTO' # Nom du type TS personnalisé (optionnel)
                  mode: 'runtime' # Surchargé spécifiquement pour ce type

💻 Utilisation

Exécutez la commande console Symfony pour générer les fichiers TypeScript :

# Générer tous les projets configurés
php bin/console codifyo:ts-generator:generate

# Générer uniquement un projet spécifique
php bin/console codifyo:ts-generator:generate --project=frontend
# ou version courte
php bin/console codifyo:ts-generator:generate -p frontend

📄 Exemple de Rendu

Entité PHP (App\Entity\User.php)

namespace App\Entity;

use Doctrine\Common\Collections\Collection;
use Symfony\Component\Serializer\Annotation\Groups;

class User
{
    #[Groups(['user:read'])]
    private int $id;

    #[Groups(['user:read'])]
    private string $username;

    #[Groups(['user:read'])]
    private ?string $email = null;

    /**
     * @var Collection<int, Role>
     */
    #[Groups(['user:read'])]
    private Collection $roles;

    #[Groups(['user:read'])]
    public function getFullName(): string
    {
        return $this->firstName . ' ' . $this->lastName;
    }
}

Fichier TypeScript Généré (assets/ts/types/User.ts)

/* tslint:disable */
/* eslint-disable */
// Auto-generated by CodifyoTsGeneratorBundle. Do not edit manually.

import { Role } from './Role';

export interface User {
  id: number;
  username: string;
  email?: string | null;
  roles: Array<Role>;
  fullName: string;
}

🧪 Tests

Pour exécuter la suite de tests unitaires et d'intégration PHPUnit :

vendor/bin/phpunit

📜 Licence

Ce bundle est distribué sous la licence MIT.

About

Génération d'interfaces TypeScript depuis les entités Symfony (JMS / Serializer natif)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages