Skip to content

Commit 1784661

Browse files
committed
refactor: ensure optional types are processed correctly
1 parent 2b9a2cb commit 1784661

5 files changed

Lines changed: 27 additions & 8 deletions

File tree

src/Converters/AbstractConverter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ protected function runModifiers(TypescriptType $type, $instance): TypescriptType
4343
$instance = app($modifier)->modify($instance);
4444
$modifiedType = app(static::class)->handle($instance);
4545

46-
$type = $type->merge($modifiedType);
46+
$type = $type->merge($modifiedType, $type->listProperties());
4747
}
4848

4949
return $type;

src/Values/TypescriptType.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ public function getClass(): string
4545
return $this->class;
4646
}
4747

48-
public function merge(TypescriptType $type): self
48+
public function merge(TypescriptType $type, Collection $originalProperties): self
4949
{
5050
$newProperties = $type->listProperties()
5151
->filter(fn ($prop) => ! $this->listProperties()->contains($prop));
5252

5353
$this->addProperties($newProperties);
5454

5555
$optionalProperties = $this->listProperties()
56-
->filter(fn ($prop) => ! $type->listProperties()->contains($prop));
56+
->filter(fn ($prop) => ! $originalProperties->contains($prop));
5757

5858
$optionalProperties->each(fn ($prop) => $prop->setOptional(true));
5959

tests/Actions/ConvertEntitiesTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,5 @@
4545

4646
$hiddenProperty = $type->listProperties()->last();
4747

48-
expect($hiddenProperty->getName())->toBe('hidden');
48+
expect($hiddenProperty->getName())->toBe('hidden?');
4949
});

tests/Converters/ResourceConverterTest.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
use Vagebond\Runtype\Converters\ResourceConverter;
44
use Vagebond\Runtype\Processors\ResourceProcessor;
55
use Vagebond\Runtype\Tests\Fakes\Models\User;
6+
use Vagebond\Runtype\Tests\Fakes\Modifiers\FeatureModifier;
7+
use Vagebond\Runtype\Tests\Fakes\Resources\FeatureResource;
68
use Vagebond\Runtype\Tests\Fakes\Resources\ProductResource;
79
use Vagebond\Runtype\Tests\Fakes\Resources\ProductResourceCollection;
810
use Vagebond\Runtype\Tests\Fakes\Resources\UserResource;
@@ -55,4 +57,19 @@
5557
expect($userBoundProperty->getType())->toBe('{edit:boolean}');
5658
});
5759

58-
// TODO: Add tests for modifiers.
60+
it('can detect optional properties', function () {
61+
$config = getConfig();
62+
$config->modifiers([
63+
FeatureResource::class => FeatureModifier::class,
64+
]);
65+
66+
$instance = (new ResourceProcessor($config))->process(FeatureResource::class);
67+
$processed = (new ResourceConverter($config))->convert($instance);
68+
69+
expect($processed->getName())->toBe('FeatureResourceType');
70+
71+
$modifiedProperty = $processed->listProperties()->last();
72+
73+
expect($modifiedProperty->getName())->toBe('hidden?');
74+
expect($modifiedProperty->getType())->toBe('boolean');
75+
});

tests/Values/TypescriptTypeTest.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@
5050
),
5151
]);
5252

53-
$type = $type->merge($mergeType);
53+
$type = $type->merge($mergeType, $type->listProperties());
5454

55-
expect($type->listProperties()->firstWhere(fn ($property) => $property->getName() === 'address'))->not->toBeNull();
56-
expect($type->listProperties()->firstWhere(fn ($property) => $property->getName() === 'age?')->isOptional())->toBeTrue();
55+
expect($type->listProperties()->firstWhere(fn ($property) => $property->getName() === 'address?'))->not->toBeNull();
56+
expect($type->listProperties()->firstWhere(fn ($property) => $property->getName() === 'address?')->isOptional())->toBeTrue();
57+
expect($type->listProperties()->firstWhere(fn ($property) => $property->getName() === 'age')->isOptional())->toBeFalse();
58+
expect($type->listProperties()->firstWhere(fn ($property) => $property->getName() === 'name')->isOptional())->toBeFalse();
5759
});

0 commit comments

Comments
 (0)