codifyo / ts-generator-bundle
Symfony Bundle for generating TypeScript definitions from Symfony Serializer metadata
Package info
github.com/codifyo/ts-generator-bundle
Type:symfony-bundle
pkg:composer/codifyo/ts-generator-bundle
Requires
- php: >=8.2
- symfony/config: ^7.0 || ^8.0
- symfony/console: ^7.0 || ^8.0
- symfony/dependency-injection: ^7.0 || ^8.0
- symfony/filesystem: ^7.0 || ^8.0
- symfony/framework-bundle: ^7.0 || ^8.0
- symfony/property-access: ^7.0 || ^8.0
- symfony/property-info: ^7.0 || ^8.0
- symfony/serializer: ^7.0 || ^8.0
- symfony/string: ^7.0 || ^8.0
- symfony/yaml: ^7.0 || ^8.0
Requires (Dev)
- phpunit/phpunit: ^10.0 || ^11.0
README
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), desclassou destypeTypeScript via l'optionkind. - 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, desNameConverteret des accesseurs dynamiques / getters calculés.static: Analyse statique viaClassMetadataFactoryet la réflexion PHP.jms: Support des métadonnéesJMS\Serializer.auto(par défaut) : Teste d'abord le moderuntime, puis bascule automatiquement enstatic/jmsen cas de fallback.
- Support des Relations Doctrine ORM :
- Interprétation automatique des relations
OneToManyetManyToManyenArray<Target>. - Interprétation des
ManyToOneetOneToOneenTarget | null. - Détection du typage générique PHPDoc
@var Collection<int, Target>ou@var Target[].
- Interprétation automatique des relations
- Dépendances & Imports Automatiques :
- Génération d'imports relatifs (
import { Role } from './Role';). - Option
auto_generate_deps: truepour découvrir et générer automatiquement toutes les entités référencées.
- Génération d'imports relatifs (
📦 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.