From b3f5ed075a0f23a24d51651e24d2137a50d060cc Mon Sep 17 00:00:00 2001 From: Ben Bjurstrom Date: Tue, 11 Feb 2025 10:18:03 -0800 Subject: [PATCH 1/6] Add Typescript Collector and Transformer --- composer.json | 3 +- .../Typescript/ValidatedDtoCollector.php | 41 ++++++ .../Typescript/ValidatedDtoTransformer.php | 99 +++++++++++++ tests/Feature/ValidatedDtoCollectorTest.php | 46 ++++++ tests/Feature/ValidatedDtoTransformerTest.php | 136 ++++++++++++++++++ 5 files changed, 324 insertions(+), 1 deletion(-) create mode 100644 src/Support/Typescript/ValidatedDtoCollector.php create mode 100644 src/Support/Typescript/ValidatedDtoTransformer.php create mode 100644 tests/Feature/ValidatedDtoCollectorTest.php create mode 100644 tests/Feature/ValidatedDtoTransformerTest.php diff --git a/composer.json b/composer.json index c11499f..d9a4af7 100644 --- a/composer.json +++ b/composer.json @@ -41,7 +41,8 @@ "laravel/pint": "^1.14", "orchestra/testbench": "^7.0|^8.0|^9.0", "pestphp/pest": "^1.20|^2.0", - "pestphp/pest-plugin-faker": "^1.0|^2.0" + "pestphp/pest-plugin-faker": "^1.0|^2.0", + "spatie/typescript-transformer": "^2.4" }, "scripts": { "lint": "pint", diff --git a/src/Support/Typescript/ValidatedDtoCollector.php b/src/Support/Typescript/ValidatedDtoCollector.php new file mode 100644 index 0000000..acdb0a2 --- /dev/null +++ b/src/Support/Typescript/ValidatedDtoCollector.php @@ -0,0 +1,41 @@ +shouldCollect($class)) { + return null; + } + + $reflector = ClassTypeReflector::create($class); + + // Always use our ValidatedDtoTransformer + $transformer = $this->config->buildTransformer(ValidatedDtoTransformer::class); + + return $transformer->transform( + $reflector->getReflectionClass(), + $reflector->getName() + ); + } + + protected function shouldCollect(ReflectionClass $class): bool + { + // Only collect classes that extend ValidatedDTO + if (! $class->isSubclassOf(ValidatedDTO::class)) { + return false; + } + + return true; + } +} diff --git a/src/Support/Typescript/ValidatedDtoTransformer.php b/src/Support/Typescript/ValidatedDtoTransformer.php new file mode 100644 index 0000000..f093eec --- /dev/null +++ b/src/Support/Typescript/ValidatedDtoTransformer.php @@ -0,0 +1,99 @@ +config = $config; + } + + public function transform(ReflectionClass $class, string $name): ?TransformedType + { + if (! $this->canTransform($class)) { + return null; + } + + $missingSymbols = new MissingSymbolsCollection(); + $properties = $this->transformProperties($class, $missingSymbols); + + return TransformedType::create( + $class, + $name, + '{' . PHP_EOL . $properties . '}', + $missingSymbols + ); + } + + protected function canTransform(ReflectionClass $class): bool + { + return $class->isSubclassOf(ValidatedDTO::class); + } + + protected function transformProperties( + ReflectionClass $class, + MissingSymbolsCollection $missingSymbols + ): string { + $properties = array_filter( + $class->getProperties(ReflectionProperty::IS_PUBLIC), + function (ReflectionProperty $property) { + // Exclude static properties + if ($property->isStatic()) { + return false; + } + + // Exclude specific properties by name + if (in_array($property->getName(), $this->excludedProperties)) { + return false; + } + + return true; + } + ); + + return array_reduce( + $properties, + function (string $carry, ReflectionProperty $property) use ($missingSymbols) { + $transformed = $this->reflectionToTypeScript( + $property, + $missingSymbols, + false, + new ReplaceDefaultsTypeProcessor($this->config->getDefaultTypeReplacements()) + ); + + if ($transformed === null) { + return $carry; + } + + $propertyName = $property->getName(); + + return "{$carry}{$propertyName}: {$transformed};" . PHP_EOL; + }, + '' + ); + } +} diff --git a/tests/Feature/ValidatedDtoCollectorTest.php b/tests/Feature/ValidatedDtoCollectorTest.php new file mode 100644 index 0000000..c1bd068 --- /dev/null +++ b/tests/Feature/ValidatedDtoCollectorTest.php @@ -0,0 +1,46 @@ +getTransformedType($reflection); + + expect($type)->toBeNull(); +}); + +it('uses the ValidatedDtoTransformer for an eligible class', function () { + eval(' + namespace App\Data { + use WendellAdriel\ValidatedDTO\ValidatedDTO; + use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; + use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; + use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; + class TransformerTestDTO extends ValidatedDTO { + use EmptyRules, EmptyCasts, EmptyDefaults; + + public string $name; + } + } + '); + + $reflection = new ReflectionClass(\App\Data\TransformerTestDTO::class); + + // Provide a config with no other conflicting transformers + $config = TypeScriptTransformerConfig::create() + ->transformers([\WendellAdriel\ValidatedDTO\Support\Typescript\ValidatedDtoTransformer::class]); + + $collector = new ValidatedDtoCollector($config); + + $type = $collector->getTransformedType($reflection); + + expect($type)->not->toBeNull() + ->and($type->getTypeScriptName())->toBe('App.Data.TransformerTestDTO'); +}); diff --git a/tests/Feature/ValidatedDtoTransformerTest.php b/tests/Feature/ValidatedDtoTransformerTest.php new file mode 100644 index 0000000..7e5a291 --- /dev/null +++ b/tests/Feature/ValidatedDtoTransformerTest.php @@ -0,0 +1,136 @@ +transform($reflection, 'IrrelevantName'); + + expect($type)->toBeNull(); +}); + +it('transforms a ValidatedDTO with public properties into a TransformedType', function () { + eval(' + namespace App\Data { + use WendellAdriel\ValidatedDTO\ValidatedDTO; + use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; + use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; + use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; + class TestTransformerDTO extends ValidatedDTO { + use EmptyRules, EmptyCasts, EmptyDefaults; + + public string $name; + public int $age; + public static string $shouldNotAppear = "excluded"; + protected string $invisible = "excluded"; + } + } + '); + + $reflection = new ReflectionClass(\App\Data\TestTransformerDTO::class); + + $transformer = new ValidatedDtoTransformer(TypeScriptTransformerConfig::create()); + $type = $transformer->transform($reflection, 'TransformedDTO'); + + // Should only include public, non-static properties + expect($type)->toBeInstanceOf(TransformedType::class) + ->and($type->name)->toBe('TransformedDTO') + ->and($type->transformed)->toContain('name: string;') + ->and($type->transformed)->toContain('age: number;') + ->and($type->transformed)->not->toContain('shouldNotAppear') + ->and($type->transformed)->not->toContain('invisible'); +}); + +it('excludes properties listed in excludedProperties', function () { + eval(' + namespace App\Data { + use WendellAdriel\ValidatedDTO\ValidatedDTO; + use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; + use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; + use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; + class ExcludedPropertyDTO extends ValidatedDTO { + use EmptyRules, EmptyCasts, EmptyDefaults; + + public bool $lazyValidation = true; // excluded by default + public string $title; + } + } + '); + + $reflection = new ReflectionClass(\App\Data\ExcludedPropertyDTO::class); + + $transformer = new ValidatedDtoTransformer(TypeScriptTransformerConfig::create()); + $type = $transformer->transform($reflection, 'ExcludedProps'); + + expect($type->transformed)->not->toContain('lazyValidation:') + ->and($type->transformed)->toContain('title: string;') + ->and($type->getTypeScriptName())->toBe('App.Data.ExcludedProps'); +}); + +it('transforms a ValidatedDTO with nested DTO and enum property', function () { + eval(' + namespace App\Enums { + enum FakeStatusEnum: string { + case FIRST = "first"; + case SECOND = "second"; + } + } + '); + + eval(' + namespace App\Data { + use WendellAdriel\ValidatedDTO\ValidatedDTO; + use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; + use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; + use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; + class ChildDTO extends ValidatedDTO { + use EmptyRules, EmptyCasts, EmptyDefaults; + + public string $childField; + } + } + '); + + eval(' + namespace App\Data { + use WendellAdriel\ValidatedDTO\ValidatedDTO; + use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; + use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; + use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; + use App\Enums\FakeStatusEnum; + + class ParentDTO extends ValidatedDTO { + use EmptyRules, EmptyCasts, EmptyDefaults; + + public FakeStatusEnum $status; + public ChildDTO $child; + } + } + '); + + $reflection = new ReflectionClass(\App\Data\ParentDTO::class); + $transformer = new ValidatedDtoTransformer(TypeScriptTransformerConfig::create()); + $type = $transformer->transform($reflection, 'ComplexDTO'); + + expect($type)->toBeInstanceOf(TransformedType::class) + ->and($type->name)->toBe('ComplexDTO') + ->and($type->transformed)->toContain('status: {%App\Enums\FakeStatusEnum%};') + ->and($type->transformed)->toContain('child: {%App\Data\ChildDTO%};') + ->and($type->missingSymbols->all()) + // Missing Symbols contain references to other types. Once all types are + // transformed, the package will replace these references with their + // TypeScript types. When no type is found the type will default to any. + ->toContain(\App\Enums\FakeStatusEnum::class) + ->and($type->missingSymbols->all())->toContain(\App\Data\ChildDTO::class); +}); From 3ed8af90fcc0693f57ac5fb18f3a4a3c7c43e651 Mon Sep 17 00:00:00 2001 From: Ben Bjurstrom Date: Tue, 11 Feb 2025 10:37:59 -0800 Subject: [PATCH 2/6] Update file names --- ...lidatedDtoCollector.php => TypeScriptCollector.php} | 6 +++--- ...tedDtoTransformer.php => TypeScriptTransformer.php} | 4 ++-- ...toCollectorTest.php => TypeScriptCollectorTest.php} | 10 +++++----- ...ansformerTest.php => TypeScriptTransformerTest.php} | 10 +++++----- 4 files changed, 15 insertions(+), 15 deletions(-) rename src/Support/{Typescript/ValidatedDtoCollector.php => TypeScriptCollector.php} (82%) rename src/Support/{Typescript/ValidatedDtoTransformer.php => TypeScriptTransformer.php} (96%) rename tests/Feature/{ValidatedDtoCollectorTest.php => TypeScriptCollectorTest.php} (79%) rename tests/Feature/{ValidatedDtoTransformerTest.php => TypeScriptTransformerTest.php} (92%) diff --git a/src/Support/Typescript/ValidatedDtoCollector.php b/src/Support/TypeScriptCollector.php similarity index 82% rename from src/Support/Typescript/ValidatedDtoCollector.php rename to src/Support/TypeScriptCollector.php index acdb0a2..b91d23e 100644 --- a/src/Support/Typescript/ValidatedDtoCollector.php +++ b/src/Support/TypeScriptCollector.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace WendellAdriel\ValidatedDTO\Support\Typescript; +namespace WendellAdriel\ValidatedDTO\Support; use ReflectionClass; use Spatie\TypeScriptTransformer\Collectors\DefaultCollector; @@ -10,7 +10,7 @@ use Spatie\TypeScriptTransformer\TypeReflectors\ClassTypeReflector; use WendellAdriel\ValidatedDTO\ValidatedDTO; -class ValidatedDtoCollector extends DefaultCollector +class TypeScriptCollector extends DefaultCollector { public function getTransformedType(ReflectionClass $class): ?TransformedType { @@ -21,7 +21,7 @@ public function getTransformedType(ReflectionClass $class): ?TransformedType $reflector = ClassTypeReflector::create($class); // Always use our ValidatedDtoTransformer - $transformer = $this->config->buildTransformer(ValidatedDtoTransformer::class); + $transformer = $this->config->buildTransformer(TypeScriptTransformer::class); return $transformer->transform( $reflector->getReflectionClass(), diff --git a/src/Support/Typescript/ValidatedDtoTransformer.php b/src/Support/TypeScriptTransformer.php similarity index 96% rename from src/Support/Typescript/ValidatedDtoTransformer.php rename to src/Support/TypeScriptTransformer.php index f093eec..2658057 100644 --- a/src/Support/Typescript/ValidatedDtoTransformer.php +++ b/src/Support/TypeScriptTransformer.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace WendellAdriel\ValidatedDTO\Support\Typescript; +namespace WendellAdriel\ValidatedDTO\Support; use ReflectionClass; use ReflectionProperty; @@ -14,7 +14,7 @@ use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig; use WendellAdriel\ValidatedDTO\ValidatedDTO; -class ValidatedDtoTransformer implements Transformer +class TypeScriptTransformer implements Transformer { use TransformsTypes; diff --git a/tests/Feature/ValidatedDtoCollectorTest.php b/tests/Feature/TypeScriptCollectorTest.php similarity index 79% rename from tests/Feature/ValidatedDtoCollectorTest.php rename to tests/Feature/TypeScriptCollectorTest.php index c1bd068..9f4ec95 100644 --- a/tests/Feature/ValidatedDtoCollectorTest.php +++ b/tests/Feature/TypeScriptCollectorTest.php @@ -3,20 +3,20 @@ declare(strict_types=1); use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig; -use WendellAdriel\ValidatedDTO\Support\Typescript\ValidatedDtoCollector; +use WendellAdriel\ValidatedDTO\Support\TypeScriptCollector; it('returns null when class does not extend ValidatedDTO', function () { $class = new class() {}; $reflection = new ReflectionClass($class); - $collector = new ValidatedDtoCollector(TypeScriptTransformerConfig::create()); + $collector = new TypeScriptCollector(TypeScriptTransformerConfig::create()); $type = $collector->getTransformedType($reflection); expect($type)->toBeNull(); }); -it('uses the ValidatedDtoTransformer for an eligible class', function () { +it('uses the TypeScriptTransformer for an eligible class', function () { eval(' namespace App\Data { use WendellAdriel\ValidatedDTO\ValidatedDTO; @@ -35,9 +35,9 @@ class TransformerTestDTO extends ValidatedDTO { // Provide a config with no other conflicting transformers $config = TypeScriptTransformerConfig::create() - ->transformers([\WendellAdriel\ValidatedDTO\Support\Typescript\ValidatedDtoTransformer::class]); + ->transformers([\WendellAdriel\ValidatedDTO\Support\TypeScriptTransformer::class]); - $collector = new ValidatedDtoCollector($config); + $collector = new TypeScriptCollector($config); $type = $collector->getTransformedType($reflection); diff --git a/tests/Feature/ValidatedDtoTransformerTest.php b/tests/Feature/TypeScriptTransformerTest.php similarity index 92% rename from tests/Feature/ValidatedDtoTransformerTest.php rename to tests/Feature/TypeScriptTransformerTest.php index 7e5a291..e27b51c 100644 --- a/tests/Feature/ValidatedDtoTransformerTest.php +++ b/tests/Feature/TypeScriptTransformerTest.php @@ -4,7 +4,7 @@ use Spatie\TypeScriptTransformer\Structures\TransformedType; use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig; -use WendellAdriel\ValidatedDTO\Support\Typescript\ValidatedDtoTransformer; +use WendellAdriel\ValidatedDTO\Support\TypeScriptTransformer; it('returns null when class does not extend ValidatedDTO', function () { $class = new class() @@ -14,7 +14,7 @@ $reflection = new ReflectionClass($class); - $transformer = new ValidatedDtoTransformer(TypeScriptTransformerConfig::create()); + $transformer = new TypeScriptTransformer(TypeScriptTransformerConfig::create()); $type = $transformer->transform($reflection, 'IrrelevantName'); expect($type)->toBeNull(); @@ -40,7 +40,7 @@ class TestTransformerDTO extends ValidatedDTO { $reflection = new ReflectionClass(\App\Data\TestTransformerDTO::class); - $transformer = new ValidatedDtoTransformer(TypeScriptTransformerConfig::create()); + $transformer = new TypeScriptTransformer(TypeScriptTransformerConfig::create()); $type = $transformer->transform($reflection, 'TransformedDTO'); // Should only include public, non-static properties @@ -70,7 +70,7 @@ class ExcludedPropertyDTO extends ValidatedDTO { $reflection = new ReflectionClass(\App\Data\ExcludedPropertyDTO::class); - $transformer = new ValidatedDtoTransformer(TypeScriptTransformerConfig::create()); + $transformer = new TypeScriptTransformer(TypeScriptTransformerConfig::create()); $type = $transformer->transform($reflection, 'ExcludedProps'); expect($type->transformed)->not->toContain('lazyValidation:') @@ -120,7 +120,7 @@ class ParentDTO extends ValidatedDTO { '); $reflection = new ReflectionClass(\App\Data\ParentDTO::class); - $transformer = new ValidatedDtoTransformer(TypeScriptTransformerConfig::create()); + $transformer = new TypeScriptTransformer(TypeScriptTransformerConfig::create()); $type = $transformer->transform($reflection, 'ComplexDTO'); expect($type)->toBeInstanceOf(TransformedType::class) From 4665ec9486cb2db7d15ff994ab793b05334fde07 Mon Sep 17 00:00:00 2001 From: Ben Bjurstrom Date: Wed, 26 Feb 2025 13:32:02 -0800 Subject: [PATCH 3/6] Use SimpleDTO --- src/Support/TypeScriptCollector.php | 4 +-- src/Support/TypeScriptTransformer.php | 4 +-- tests/Feature/TypeScriptCollectorTest.php | 36 +++++++++++++++++++-- tests/Feature/TypeScriptTransformerTest.php | 8 ++--- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/Support/TypeScriptCollector.php b/src/Support/TypeScriptCollector.php index b91d23e..7c1f2b4 100644 --- a/src/Support/TypeScriptCollector.php +++ b/src/Support/TypeScriptCollector.php @@ -8,7 +8,7 @@ use Spatie\TypeScriptTransformer\Collectors\DefaultCollector; use Spatie\TypeScriptTransformer\Structures\TransformedType; use Spatie\TypeScriptTransformer\TypeReflectors\ClassTypeReflector; -use WendellAdriel\ValidatedDTO\ValidatedDTO; +use WendellAdriel\ValidatedDTO\SimpleDTO; class TypeScriptCollector extends DefaultCollector { @@ -32,7 +32,7 @@ public function getTransformedType(ReflectionClass $class): ?TransformedType protected function shouldCollect(ReflectionClass $class): bool { // Only collect classes that extend ValidatedDTO - if (! $class->isSubclassOf(ValidatedDTO::class)) { + if (! $class->isSubclassOf(SimpleDTO::class)) { return false; } diff --git a/src/Support/TypeScriptTransformer.php b/src/Support/TypeScriptTransformer.php index 2658057..9c6f2dc 100644 --- a/src/Support/TypeScriptTransformer.php +++ b/src/Support/TypeScriptTransformer.php @@ -12,7 +12,7 @@ use Spatie\TypeScriptTransformer\Transformers\TransformsTypes; use Spatie\TypeScriptTransformer\TypeProcessors\ReplaceDefaultsTypeProcessor; use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig; -use WendellAdriel\ValidatedDTO\ValidatedDTO; +use WendellAdriel\ValidatedDTO\SimpleDTO; class TypeScriptTransformer implements Transformer { @@ -51,7 +51,7 @@ public function transform(ReflectionClass $class, string $name): ?TransformedTyp protected function canTransform(ReflectionClass $class): bool { - return $class->isSubclassOf(ValidatedDTO::class); + return $class->isSubclassOf(SimpleDTO::class); } protected function transformProperties( diff --git a/tests/Feature/TypeScriptCollectorTest.php b/tests/Feature/TypeScriptCollectorTest.php index 9f4ec95..6013997 100644 --- a/tests/Feature/TypeScriptCollectorTest.php +++ b/tests/Feature/TypeScriptCollectorTest.php @@ -5,7 +5,7 @@ use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig; use WendellAdriel\ValidatedDTO\Support\TypeScriptCollector; -it('returns null when class does not extend ValidatedDTO', function () { +it('returns null when class does not extend SimpleDTO', function () { $class = new class() {}; $reflection = new ReflectionClass($class); @@ -19,11 +19,41 @@ it('uses the TypeScriptTransformer for an eligible class', function () { eval(' namespace App\Data { - use WendellAdriel\ValidatedDTO\ValidatedDTO; + use WendellAdriel\ValidatedDTO\SimpleDTO; use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; - class TransformerTestDTO extends ValidatedDTO { + class TransformerTestDTO extends SimpleDTO { + use EmptyRules, EmptyCasts, EmptyDefaults; + + public string $name; + } + } + '); + + $reflection = new ReflectionClass(\App\Data\TransformerTestDTO::class); + + // Provide a config with no other conflicting transformers + $config = TypeScriptTransformerConfig::create() + ->transformers([\WendellAdriel\ValidatedDTO\Support\TypeScriptTransformer::class]); + + $collector = new TypeScriptCollector($config); + + $type = $collector->getTransformedType($reflection); + + expect($type)->not->toBeNull() + ->and($type->getTypeScriptName())->toBe('App.Data.TransformerTestDTO'); +}); + + +it('uses the TypeScriptTransformer for ResourceDTO', function () { + eval(' + namespace App\Data { + use WendellAdriel\ValidatedDTO\ResourceDTO; + use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; + use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; + use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; + class TransformerTestDTO extends ResourceDTO { use EmptyRules, EmptyCasts, EmptyDefaults; public string $name; diff --git a/tests/Feature/TypeScriptTransformerTest.php b/tests/Feature/TypeScriptTransformerTest.php index e27b51c..eeea8fa 100644 --- a/tests/Feature/TypeScriptTransformerTest.php +++ b/tests/Feature/TypeScriptTransformerTest.php @@ -6,7 +6,7 @@ use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig; use WendellAdriel\ValidatedDTO\Support\TypeScriptTransformer; -it('returns null when class does not extend ValidatedDTO', function () { +it('returns null when class does not extend SimpleDTO', function () { $class = new class() { public string $name; @@ -20,14 +20,14 @@ expect($type)->toBeNull(); }); -it('transforms a ValidatedDTO with public properties into a TransformedType', function () { +it('transforms a SimpleDTO with public properties into a TransformedType', function () { eval(' namespace App\Data { - use WendellAdriel\ValidatedDTO\ValidatedDTO; + use WendellAdriel\ValidatedDTO\SimpleDTO; use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; - class TestTransformerDTO extends ValidatedDTO { + class TestTransformerDTO extends SimpleDTO { use EmptyRules, EmptyCasts, EmptyDefaults; public string $name; From c064640e3bedba27b31739b9641ea4ef98bed726 Mon Sep 17 00:00:00 2001 From: Ben Bjurstrom Date: Wed, 26 Feb 2025 13:34:26 -0800 Subject: [PATCH 4/6] Update composer --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8d8ecc6..2ed8b83 100644 --- a/composer.json +++ b/composer.json @@ -41,7 +41,8 @@ "laravel/pint": "^1.21", "orchestra/testbench": "^9.0|^10.0", "pestphp/pest": "^2.0|^3.0", - "pestphp/pest-plugin-faker": "^2.0|^3.0" + "pestphp/pest-plugin-faker": "^2.0|^3.0", + "spatie/typescript-transformer": "^2.4" }, "scripts": { "lint": "pint", From 7e93228c0529abbea496009be3d1f15a95a3d396 Mon Sep 17 00:00:00 2001 From: Ben Bjurstrom Date: Wed, 26 Feb 2025 13:36:31 -0800 Subject: [PATCH 5/6] Update tests --- tests/Feature/TypeScriptCollectorTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Feature/TypeScriptCollectorTest.php b/tests/Feature/TypeScriptCollectorTest.php index 6013997..40978c0 100644 --- a/tests/Feature/TypeScriptCollectorTest.php +++ b/tests/Feature/TypeScriptCollectorTest.php @@ -23,7 +23,7 @@ use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; - class TransformerTestDTO extends SimpleDTO { + class TransformerTestDTO1 extends SimpleDTO { use EmptyRules, EmptyCasts, EmptyDefaults; public string $name; @@ -31,7 +31,7 @@ class TransformerTestDTO extends SimpleDTO { } '); - $reflection = new ReflectionClass(\App\Data\TransformerTestDTO::class); + $reflection = new ReflectionClass(\App\Data\TransformerTestDTO1::class); // Provide a config with no other conflicting transformers $config = TypeScriptTransformerConfig::create() @@ -42,7 +42,7 @@ class TransformerTestDTO extends SimpleDTO { $type = $collector->getTransformedType($reflection); expect($type)->not->toBeNull() - ->and($type->getTypeScriptName())->toBe('App.Data.TransformerTestDTO'); + ->and($type->getTypeScriptName())->toBe('App.Data.TransformerTestDTO1'); }); @@ -53,7 +53,7 @@ class TransformerTestDTO extends SimpleDTO { use WendellAdriel\ValidatedDTO\Concerns\EmptyRules; use WendellAdriel\ValidatedDTO\Concerns\EmptyCasts; use WendellAdriel\ValidatedDTO\Concerns\EmptyDefaults; - class TransformerTestDTO extends ResourceDTO { + class TransformerTestDTO2 extends ResourceDTO { use EmptyRules, EmptyCasts, EmptyDefaults; public string $name; @@ -61,7 +61,7 @@ class TransformerTestDTO extends ResourceDTO { } '); - $reflection = new ReflectionClass(\App\Data\TransformerTestDTO::class); + $reflection = new ReflectionClass(\App\Data\TransformerTestDTO2::class); // Provide a config with no other conflicting transformers $config = TypeScriptTransformerConfig::create() @@ -72,5 +72,5 @@ class TransformerTestDTO extends ResourceDTO { $type = $collector->getTransformedType($reflection); expect($type)->not->toBeNull() - ->and($type->getTypeScriptName())->toBe('App.Data.TransformerTestDTO'); + ->and($type->getTypeScriptName())->toBe('App.Data.TransformerTestDTO2'); }); From 5e6ccb84beef63790dd98265cebdf5acc310aa8e Mon Sep 17 00:00:00 2001 From: Ben Bjurstrom Date: Mon, 3 Mar 2025 10:27:35 -0800 Subject: [PATCH 6/6] Pint --- tests/Feature/TypeScriptCollectorTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Feature/TypeScriptCollectorTest.php b/tests/Feature/TypeScriptCollectorTest.php index 40978c0..d7da5f9 100644 --- a/tests/Feature/TypeScriptCollectorTest.php +++ b/tests/Feature/TypeScriptCollectorTest.php @@ -45,7 +45,6 @@ class TransformerTestDTO1 extends SimpleDTO { ->and($type->getTypeScriptName())->toBe('App.Data.TransformerTestDTO1'); }); - it('uses the TypeScriptTransformer for ResourceDTO', function () { eval(' namespace App\Data {