Skip to content

Commit 4cfe740

Browse files
Add visitor support
1 parent 3581d52 commit 4cfe740

File tree

52 files changed

+838
-409
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+838
-409
lines changed

src/Actions/ConnectReferencesAction.php

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
use Spatie\TypeScriptTransformer\Collections\ReferenceMap;
66
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
77
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
8+
use Spatie\TypeScriptTransformer\Transformed\Transformed;
89
use Spatie\TypeScriptTransformer\TypeScript\TypeReference;
910
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
11+
use Spatie\TypeScriptTransformer\Visitor\Visitor;
12+
use Spatie\TypeScriptTransformer\Visitor\VisitTypeScriptTreeAction;
1013

1114
class ConnectReferencesAction
1215
{
@@ -27,25 +30,30 @@ public function execute(TransformedCollection $collection): ReferenceMap
2730
}
2831
}
2932

30-
foreach ($collection as $transformed) {
31-
$references = [];
33+
$visitor = Visitor::create()->before(function (TypeReference $typeReference, array $metadata) use ($referenceMap, &$references) {
34+
$reference = $typeReference->reference;
35+
36+
if (! $referenceMap->has($reference)) {
37+
/** @var Transformed $transformed */
38+
$transformed = $metadata['transformed'];
39+
40+
$this->log->warning("Tried replacing reference to `{$reference->humanFriendlyName()}` in `{$transformed->reference->humanFriendlyName()}` but it was not found in the transformed types");
3241

33-
$this->visitTypeScriptTreeAction->execute(
34-
$transformed->typeScriptNode,
35-
function (TypeReference $typeReference) use ($referenceMap, &$references, $transformed) {
36-
$reference = $typeReference->reference;
42+
return;
43+
}
44+
45+
$references[] = $reference;
46+
$typeReference->connect($referenceMap->get($reference));
47+
}, [TypeReference::class]);
3748

38-
if (! $referenceMap->has($reference)) {
39-
$this->log->warning("Tried replacing reference to `{$reference->humanFriendlyName()}` in `{$transformed->reference->humanFriendlyName()}` but it was not found in the transformed types");
49+
foreach ($collection as $transformed) {
50+
$references = [];
4051

41-
return;
42-
}
52+
$metadata = [
53+
'transformed' => $transformed,
54+
];
4355

44-
$references[] = $reference;
45-
$typeReference->connect($referenceMap->get($reference));
46-
},
47-
[TypeReference::class]
48-
);
56+
$visitor->execute($transformed->typeScriptNode, $metadata);
4957

5058
$transformed->references = $references;
5159
}

src/Actions/DiscoverTypesAction.php

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,16 @@
99

1010
class DiscoverTypesAction
1111
{
12-
public function __construct(
13-
public TypeScriptTransformerConfig $config,
14-
public TypeScriptTransformerLog $log,
15-
) {
16-
}
17-
18-
/** @return array<string> */
19-
public function execute(): array
20-
{
12+
/**
13+
* @param array<string> $directories
14+
* @return array<class-string>
15+
*/
16+
public function execute(
17+
array $directories = [],
18+
): array {
2119
// Idea / TODO : make it possible for other packages to hook in to find types in other directories, like their vendor dir
2220

23-
return Discover::in(...$this->config->directories)
21+
return Discover::in(...$directories)
2422
->types(
2523
DiscoveredStructureType::ClassDefinition,
2624
DiscoveredStructureType::Enum,

src/Actions/AppendDefaultTypesAction.php renamed to src/Actions/ProvideTypesAction.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
namespace Spatie\TypeScriptTransformer\Actions;
44

5-
use Spatie\TypeScriptTransformer\DefaultTypeProviders\DefaultTypesProvider;
5+
use Spatie\TypeScriptTransformer\TypeProviders\TypesProvider;
66
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
77
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
88
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
99

10-
class AppendDefaultTypesAction
10+
class ProvideTypesAction
1111
{
1212
public function __construct(
1313
protected TypeScriptTransformerConfig $config,
@@ -17,12 +17,16 @@ public function __construct(
1717

1818
public function execute(TransformedCollection $collection): void
1919
{
20-
foreach ($this->config->defaultTypeProviders as $defaultTypeProvider) {
21-
$defaultTypeProvider = $defaultTypeProvider instanceof DefaultTypesProvider
20+
foreach ($this->config->typeProviders as $defaultTypeProvider) {
21+
$defaultTypeProvider = $defaultTypeProvider instanceof TypesProvider
2222
? $defaultTypeProvider
2323
: new $defaultTypeProvider;
2424

25-
$collection->add(...$defaultTypeProvider->provide());
25+
$defaultTypeProvider->provide(
26+
$this->config,
27+
$this->log,
28+
$collection
29+
);
2630
}
2731
}
2832
}

src/Actions/TransformTypeAction.php

Lines changed: 0 additions & 59 deletions
This file was deleted.

src/Actions/TransformTypesAction.php

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/Actions/VisitTypeScriptTreeAction.php

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/Actions/WatchFileSystemAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function __construct(
1616
public function execute(
1717
TransformedCollection $transformedCollection,
1818
) {
19-
Watch::paths($this->config->directories)
19+
Watch::paths($this->config->directoriesToWatch)
2020
->onAnyChange(function (string $type, string $path) {
2121
echo $type.'|'.$path;
2222
})

src/DefaultTypeProviders/DefaultTypesProvider.php

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Laravel\ClassPropertyProcessors;
4+
5+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
6+
use ReflectionProperty;
7+
use Spatie\TypeScriptTransformer\Transformers\ClassPropertyProcessors\ClassPropertyProcessor;
8+
use Spatie\TypeScriptTransformer\TypeScript\TypeReference;
9+
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptProperty;
10+
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptUnion;
11+
12+
class RemoveDataLazyTypeClassPropertyProcessor implements ClassPropertyProcessor
13+
{
14+
public function execute(ReflectionProperty $reflection, ?TypeNode $annotation, TypeScriptProperty $property): ?TypeScriptProperty
15+
{
16+
if (! $property->type instanceof TypeScriptUnion) {
17+
return $property;
18+
}
19+
20+
for ($i = 0; $i < count($property->type->types); $i++) {
21+
$subType = $property->type->types[$i];
22+
23+
if ($subType instanceof TypeReference && is_a($subType->reference, \Spatie\LaravelData\Lazy::class, true)) {
24+
$property->isOptional = true;
25+
26+
unset($property->type->types[$i]);
27+
}
28+
}
29+
30+
$property->type->types = array_values($property->type->types);
31+
32+
return $property;
33+
}
34+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Laravel\ClassPropertyProcessors;
4+
5+
use Illuminate\Support\Collection;
6+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
7+
use ReflectionProperty;
8+
use Spatie\TypeScriptTransformer\References\ClassStringReference;
9+
use Spatie\TypeScriptTransformer\Transformers\ClassPropertyProcessors\ClassPropertyProcessor;
10+
use Spatie\TypeScriptTransformer\TypeScript\TypeReference;
11+
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptGeneric;
12+
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptProperty;
13+
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptString;
14+
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptUnion;
15+
use Spatie\TypeScriptTransformer\Visitor\VisitTypeScriptTreeAction;
16+
17+
class ReplaceLaravelCollectionByArrayClassPropertyProcessor implements ClassPropertyProcessor
18+
{
19+
public function __construct(
20+
protected VisitTypeScriptTreeAction $visitTypeScriptTreeAction = new VisitTypeScriptTreeAction(),
21+
) {
22+
}
23+
24+
public function execute(
25+
ReflectionProperty $reflection,
26+
?TypeNode $annotation,
27+
TypeScriptProperty $property
28+
): ?TypeScriptProperty {
29+
$this->visitTypeScriptTreeAction->execute($property->type, function (TypeScriptGeneric $generic) {
30+
$isCollection = $generic->type instanceof TypeReference
31+
&& $generic->type->reference instanceof ClassStringReference
32+
&& is_a($generic->type->reference->classString, Collection::class, true);
33+
34+
if (! $isCollection) {
35+
return;
36+
}
37+
38+
if (count($generic->genericTypes) !== 2) {
39+
// Someone messed with the type, let's skip it
40+
return;
41+
}
42+
43+
$isRecord = $generic->genericTypes[0] instanceof TypeScriptUnion || $generic->genericTypes[0] instanceof TypeScriptString;
44+
45+
// $generic->type = new
46+
47+
if ($isCollection) {
48+
// $generic->type = new TypeReference(new TypeScriptArray());
49+
}
50+
}, [TypeScriptGeneric::class]);
51+
52+
return $property;
53+
}
54+
}

0 commit comments

Comments
 (0)