Skip to content

Commit d937040

Browse files
Collections replacer
1 parent 4cfe740 commit d937040

File tree

4 files changed

+37
-22
lines changed

4 files changed

+37
-22
lines changed

src/Actions/ConnectReferencesAction.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@
99
use Spatie\TypeScriptTransformer\TypeScript\TypeReference;
1010
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
1111
use Spatie\TypeScriptTransformer\Visitor\Visitor;
12-
use Spatie\TypeScriptTransformer\Visitor\VisitTypeScriptTreeAction;
1312

1413
class ConnectReferencesAction
1514
{
1615
public function __construct(
1716
protected TypeScriptTransformerConfig $config,
1817
public TypeScriptTransformerLog $log,
19-
protected VisitTypeScriptTreeAction $visitTypeScriptTreeAction = new VisitTypeScriptTreeAction(),
2018
) {
2119
}
2220

src/Laravel/ClassPropertyProcessors/ReplaceLaravelCollectionByArrayClassPropertyProcessor.php

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,23 @@
88
use Spatie\TypeScriptTransformer\References\ClassStringReference;
99
use Spatie\TypeScriptTransformer\Transformers\ClassPropertyProcessors\ClassPropertyProcessor;
1010
use Spatie\TypeScriptTransformer\TypeScript\TypeReference;
11+
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptArray;
1112
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptGeneric;
13+
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptIdentifier;
1214
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptProperty;
1315
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptString;
1416
use Spatie\TypeScriptTransformer\TypeScript\TypeScriptUnion;
17+
use Spatie\TypeScriptTransformer\Visitor\Visitor;
18+
use Spatie\TypeScriptTransformer\Visitor\VisitorOperation;
1519
use Spatie\TypeScriptTransformer\Visitor\VisitTypeScriptTreeAction;
1620

1721
class ReplaceLaravelCollectionByArrayClassPropertyProcessor implements ClassPropertyProcessor
1822
{
19-
public function __construct(
20-
protected VisitTypeScriptTreeAction $visitTypeScriptTreeAction = new VisitTypeScriptTreeAction(),
21-
) {
22-
}
23+
protected Visitor $visitor;
2324

24-
public function execute(
25-
ReflectionProperty $reflection,
26-
?TypeNode $annotation,
27-
TypeScriptProperty $property
28-
): ?TypeScriptProperty {
29-
$this->visitTypeScriptTreeAction->execute($property->type, function (TypeScriptGeneric $generic) {
25+
public function __construct()
26+
{
27+
$this->visitor = Visitor::create()->before(function (TypeScriptGeneric $generic) {
3028
$isCollection = $generic->type instanceof TypeReference
3129
&& $generic->type->reference instanceof ClassStringReference
3230
&& is_a($generic->type->reference->classString, Collection::class, true);
@@ -42,12 +40,26 @@ public function execute(
4240

4341
$isRecord = $generic->genericTypes[0] instanceof TypeScriptUnion || $generic->genericTypes[0] instanceof TypeScriptString;
4442

45-
// $generic->type = new
46-
47-
if ($isCollection) {
48-
// $generic->type = new TypeReference(new TypeScriptArray());
43+
if($isRecord){
44+
return VisitorOperation::replace(new TypeScriptGeneric(
45+
new TypeScriptIdentifier('Record'),
46+
[
47+
$generic->genericTypes[0],
48+
$generic->genericTypes[1]
49+
]
50+
));
4951
}
52+
53+
return VisitorOperation::replace(new TypeScriptArray([$generic->genericTypes[1]]));
5054
}, [TypeScriptGeneric::class]);
55+
}
56+
57+
public function execute(
58+
ReflectionProperty $reflection,
59+
?TypeNode $annotation,
60+
TypeScriptProperty $property
61+
): ?TypeScriptProperty {
62+
$property->type = $this->visitor->execute($property->type);
5163

5264
return $property;
5365
}

src/TypeScript/TypeScriptUnion.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
class TypeScriptUnion implements TypeScriptNode, TypeScriptVisitableNode
1010
{
1111
/**
12-
* @param array<TypeScriptNode> $types
12+
* @param array<TypeScriptNode> $types
1313
*/
1414
public function __construct(
1515
public array $types,

src/Visitor/Visitor.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ public function after(
4545
public function execute(
4646
TypeScriptNode $node,
4747
array &$metadata = [],
48-
): ?TypeScriptNode
49-
{
48+
): ?TypeScriptNode {
5049
foreach ($this->beforeClosures as $beforeClosure) {
5150
if ($beforeClosure->shouldRun($node)) {
5251
$operation = $beforeClosure->run($node, $metadata);
@@ -65,7 +64,13 @@ public function execute(
6564
$profile = $node->visitorProfile();
6665

6766
foreach ($profile->singleNodes as $singleNodeName) {
68-
$visited = $this->execute($node->$singleNodeName, $metadata);
67+
$subNode = $node->$singleNodeName;
68+
69+
if ($subNode === null) {
70+
continue;
71+
}
72+
73+
$visited = $this->execute($subNode, $metadata);
6974

7075
try {
7176
$node->$singleNodeName = $visited;
@@ -75,8 +80,8 @@ public function execute(
7580
}
7681

7782
foreach ($profile->iterableNodes as $iterableNodeName) {
78-
for ($i = 0; $i < count($node->$iterableNodeName); $i++) {
79-
$node->$iterableNodeName[$i] = $this->execute($node->$iterableNodeName[$i], $metadata);
83+
foreach ($node->$iterableNodeName as $key => $subNode) {
84+
$node->$iterableNodeName[$key] = $this->execute($subNode, $metadata);
8085
}
8186

8287
$node->$iterableNodeName = array_values(array_filter($node->$iterableNodeName));

0 commit comments

Comments
 (0)