2rius / dart-transformer
Laravel package for converting PHP classes and types to Dart equivalents
Requires
- php: ^8.3
- illuminate/contracts: ^10.0||^11.0||^12.0
- roave/better-reflection: ^6.0
- spatie/laravel-data: ^4.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- larastan/larastan: ^2.9||^3.0
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^10.0.0||^9.0.0||^8.22.0
- pestphp/pest: ^2.0||^3.0
- pestphp/pest-plugin-arch: ^2.5||^3.0
- pestphp/pest-plugin-laravel: ^2.0||^3.0
- phpstan/extension-installer: ^1.3||^2.0
- phpstan/phpstan-deprecation-rules: ^1.1||^2.0
- phpstan/phpstan-phpunit: ^1.3||^2.0
README
Laravel package for converting PHP classes and types to Dart equivalents, with special support for Spatie Laravel Data classes and PHP enums.
This package is heavily inspired by Spatie's TypeScript Transformer, but targets Dart instead of TypeScript.
Features
- 🚀 Transform Spatie Laravel Data classes to Dart classes
- 🎯 Convert PHP enums to Dart enums
- 📦 Generate JSON serialization code with
json_annotation
- 🔧 Configurable output paths and transformers
- 🎨 Smart type mapping from PHP to Dart
- âš¡ Artisan command for easy transformation
Installation
You can install the package via composer:
composer require 2rius/dart-transformer
You can publish the config file with:
php artisan vendor:publish --tag="dart-transformer-config"
Usage
Generate aggregated Dart definitions
Run the command to generate a single aggregated file with all transformable classes and enums:
php artisan dart:transform
By default this writes to resources/dart/generated.dart
.
Example Transformations
Laravel Data Class
PHP:
<?php namespace App\Data; use Spatie\LaravelData\Data; class UserData extends Data { public function __construct( public int $id, public string $name, public ?string $email, public bool $isActive ) {} }
Generated Dart:
import 'package:json_annotation/json_annotation.dart'; part 'user_data.g.dart'; @JsonSerializable() class UserData { final int id; final String name; final String? email; final bool isActive; const UserData({ required this.id, required this.name, required this.email, required this.isActive, }); factory UserData.fromJson(Map<String, dynamic> json) => _$UserDataFromJson(json); Map<String, dynamic> toJson() => _$UserDataToJson(this); }
PHP Enum
PHP:
<?php namespace App\Enums; enum Status: string { case ACTIVE = 'active'; case INACTIVE = 'inactive'; case PENDING = 'pending'; }
Generated Dart:
import 'package:json_annotation/json_annotation.dart'; enum Status { @JsonValue('active') ACTIVE, @JsonValue('inactive') INACTIVE, @JsonValue('pending') PENDING, }
Configuration
The package provides several configuration options:
- auto_discover_types: Configure which directories to scan for classes
- collectors: Customize which collectors to use
- transformers: Customize which transformers to use
- default_type_replacements: Configure default type replacements when mapping from PHP to Dart types.
- output_file: Set the output file
- formatter: Format the generated Dart file.
- dart: Dart-specific options like nullable types and JSON annotations
Class naming and collisions
Dart does not have PHP-style namespaces inside a single file. When generating a single aggregated Dart file, two PHP classes that share the same short class name (e.g. App\Data\UserData
and App\Admin\UserData
) will collide.
- By default we use the short class name via
ShortClassNamingStrategy
. - If you run into collisions, either:
- switch to
FqcnUnderscoredNamingStrategy
in your config to produce names likeApp_Admin_UserData
, or - implement your own strategy by implementing
M2rius\\DartTransformer\\Naming\\NamingStrategy
and set it indart.naming_strategy
.
- switch to
Example config:
'dart' => [ 'naming_strategy' => \M2rius\DartTransformer\Naming\FqcnUnderscoredNamingStrategy::class, ],
Type Mapping
PHP Type | Dart Type |
---|---|
int |
int |
float , double |
double |
string |
String |
bool |
bool |
array |
List<dynamic> |
object |
Map<String, dynamic> |
mixed |
dynamic |
Custom classes | Preserved as-is |
Testing
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Credits
License
The MIT License (MIT). Please see License File for more information.