Skip to content

Commit d363866

Browse files
wip
1 parent c28f1bf commit d363866

Some content is hidden

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

44 files changed

+393
-551
lines changed

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -817,8 +817,7 @@ A `TypesProvider` implements the `TypeProvider` interface:
817817
```php
818818
namespace Spatie\TypeScriptTransformer\TypeProviders;
819819

820-
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
821-
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
820+
use Spatie\TypeScriptTransformer\Collections\TransformedCollection;use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
822821

823822
interface TypesProvider
824823
{

src/Actions/ConnectReferencesAction.php

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
namespace Spatie\TypeScriptTransformer\Actions;
44

5-
use Spatie\TypeScriptTransformer\Collections\ReferenceMap;
6-
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
5+
use Spatie\TypeScriptTransformer\Collections\TransformedCollection;
76
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
87
use Spatie\TypeScriptTransformer\Transformed\Transformed;
98
use Spatie\TypeScriptTransformer\TypeScriptNodes\TypeReference;
@@ -20,58 +19,50 @@ public function __construct(
2019
}
2120

2221
/**
23-
* @param TransformedCollection|array<Transformed> $collection
22+
* @param TransformedCollection $collection
2423
*/
25-
public function execute(TransformedCollection|array $collection): ReferenceMap
24+
public function execute(TransformedCollection $collection): void
2625
{
27-
$referenceMap = new ReferenceMap();
28-
29-
foreach ($collection as $transformed) {
30-
$referenceMap->add($transformed);
31-
}
32-
33-
foreach ($collection as $transformed) {
26+
foreach ($collection->onlyChanged() as $transformed) {
3427
$metadata = [
3528
'transformed' => $transformed,
36-
'referenceMap' => $referenceMap,
29+
'collection' => $collection,
3730
];
3831

3932
$this->visitor->execute($transformed->typeScriptNode, $metadata);
4033
}
41-
42-
return $referenceMap;
4334
}
4435

4536
protected function resolveVisitor(): Visitor
4637
{
4738
return Visitor::create()->before(function (TypeReference $typeReference, array &$metadata) {
48-
/** @var Transformed $transformed */
49-
$transformed = $metadata['transformed'];
39+
/** @var Transformed $currentTransformed */
40+
$currentTransformed = $metadata['transformed'];
41+
42+
/** @var TransformedCollection $collection */
43+
$collection = $metadata['collection'];
5044

51-
/** @var ReferenceMap $referenceMap */
52-
$referenceMap = $metadata['referenceMap'];
45+
$foundTransformed = $collection->get($typeReference->reference);
5346

54-
if (! $referenceMap->has($typeReference->reference)) {
55-
$transformed->addMissingReference($typeReference->reference, $typeReference);
47+
if ($foundTransformed === null) {
48+
$currentTransformed->addMissingReference($typeReference->reference, $typeReference);
5649

57-
$this->log->warning("Tried replacing reference to `{$typeReference->reference->humanFriendlyName()}` in `{$transformed->reference->humanFriendlyName()}` but it was not found in the transformed types");
50+
$this->log->warning("Tried replacing reference to `{$typeReference->reference->humanFriendlyName()}` in `{$currentTransformed->reference->humanFriendlyName()}` but it was not found in the transformed types");
5851

5952
return;
6053
}
6154

62-
$transformedReference = $referenceMap->get($typeReference->reference);
63-
64-
if(! $transformed->references->offsetExists($transformedReference)) {
65-
$transformed->references[$transformedReference] = [];
55+
if (! array_key_exists($foundTransformed->reference->getKey(), $currentTransformed->references)) {
56+
$currentTransformed->references[$foundTransformed->reference->getKey()] = [];
6657
}
6758

68-
$transformed->references[$transformedReference][] = $typeReference;
69-
$transformedReference->referencedBy[$transformed] = $transformed->reference->getKey();
59+
$currentTransformed->references[$foundTransformed->reference->getKey()][] = $typeReference;
60+
$foundTransformed->referencedBy[] = $currentTransformed->reference->getKey();
7061

71-
$typeReference->connect($transformedReference);
62+
$typeReference->connect($foundTransformed);
7263

73-
if (array_key_exists($typeReference->reference->getKey(), $transformed->missingReferences)) {
74-
unset($transformed->missingReferences[$typeReference->reference->getKey()]);
64+
if (array_key_exists($foundTransformed->reference->getKey(), $currentTransformed->missingReferences)) {
65+
unset($currentTransformed->missingReferences[$foundTransformed->reference->getKey()]);
7566
}
7667
}, [TypeReference::class]);
7768
}

src/Actions/ExecuteConnectedClosuresAction.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
namespace Spatie\TypeScriptTransformer\Actions;
44

5-
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
6-
use Spatie\TypeScriptTransformer\TypeScriptNodes\TypeScriptNode;
5+
use Spatie\TypeScriptTransformer\Collections\TransformedCollection;
6+
use Spatie\TypeScriptTransformer\Transformed\Transformed;
77
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
88
use Spatie\TypeScriptTransformer\Visitor\Visitor;
9+
use Traversable;
910

1011
class ExecuteConnectedClosuresAction
1112
{
@@ -18,19 +19,17 @@ public function __construct(
1819
}
1920

2021
/**
21-
* @param TransformedCollection|array<TypeScriptNode> $nodes
22+
* @param TransformedCollection|Traversable<Transformed> $nodes
2223
*/
2324
public function execute(
24-
TransformedCollection|array $nodes,
25+
TransformedCollection|Traversable $nodes,
2526
): void {
2627
if (empty($this->config->providedVisitorClosures)) {
2728
return;
2829
}
2930

30-
$isTransformedCollection = $nodes instanceof TransformedCollection;
31-
3231
foreach ($nodes as $node) {
33-
$this->visitor->execute($isTransformedCollection ? $node->typeScriptNode : $node);
32+
$this->visitor->execute($node->typeScriptNode);
3433
}
3534
}
3635
}

src/Actions/ExecuteProvidedClosuresAction.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
namespace Spatie\TypeScriptTransformer\Actions;
44

5-
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
6-
use Spatie\TypeScriptTransformer\TypeScriptNodes\TypeScriptNode;
5+
use Spatie\TypeScriptTransformer\Collections\TransformedCollection;
6+
use Spatie\TypeScriptTransformer\Transformed\Transformed;
77
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
88
use Spatie\TypeScriptTransformer\Visitor\Visitor;
9+
use Traversable;
910

1011
class ExecuteProvidedClosuresAction
1112
{
@@ -18,19 +19,17 @@ public function __construct(
1819
}
1920

2021
/**
21-
* @param TransformedCollection|array<TypeScriptNode> $nodes
22+
* @param TransformedCollection|Traversable<Transformed> $nodes
2223
*/
2324
public function execute(
24-
TransformedCollection|array $nodes,
25+
TransformedCollection|Traversable $nodes,
2526
): void {
2627
if (empty($this->config->providedVisitorClosures)) {
2728
return;
2829
}
2930

30-
$isTransformedCollection = $nodes instanceof TransformedCollection;
31-
3231
foreach ($nodes as $node) {
33-
$this->visitor->execute($isTransformedCollection ? $node->typeScriptNode : $node);
32+
$this->visitor->execute($node->typeScriptNode);
3433
}
3534
}
3635
}

src/Actions/ProvideTypesAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Spatie\TypeScriptTransformer\Actions;
44

5-
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
5+
use Spatie\TypeScriptTransformer\Collections\TransformedCollection;
66
use Spatie\TypeScriptTransformer\TypeProviders\TypesProvider;
77
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
88

src/Actions/ResolveModuleImportsAction.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Closure;
66
use Spatie\TypeScriptTransformer\Collections\ImportsCollection;
7+
use Spatie\TypeScriptTransformer\Collections\TransformedCollection;
78
use Spatie\TypeScriptTransformer\Support\ImportName;
89
use Spatie\TypeScriptTransformer\Support\Location;
910
use Spatie\TypeScriptTransformer\Transformed\Transformed;
@@ -21,6 +22,7 @@ public function __construct(
2122

2223
public function execute(
2324
Location $location,
25+
TransformedCollection $transformedCollection,
2426
): ImportsCollection {
2527
$collection = new ImportsCollection();
2628

@@ -29,7 +31,9 @@ public function execute(
2931
);
3032

3133
foreach ($location->transformed as $transformedItem) {
32-
foreach ($transformedItem->references as $referencedTransformed => $typeReferences) {
34+
foreach ($transformedItem->references as $referencedTransformedKey => $typeReferences) {
35+
$referencedTransformed = $transformedCollection->get($referencedTransformedKey);
36+
3337
if ($referencedTransformed->location === $location->segments) {
3438
continue;
3539
}

src/Actions/SplitTransformedPerLocationAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
namespace Spatie\TypeScriptTransformer\Actions;
44

5+
use Spatie\TypeScriptTransformer\Collections\TransformedCollection;
56
use Spatie\TypeScriptTransformer\Support\Location;
6-
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
77
use Spatie\TypeScriptTransformer\Transformed\Transformed;
88

99
class SplitTransformedPerLocationAction

src/Collections/ReferenceMap.php

Lines changed: 0 additions & 60 deletions
This file was deleted.
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Collections;
4+
5+
use ArrayIterator;
6+
use Generator;
7+
use IteratorAggregate;
8+
use Spatie\TypeScriptTransformer\References\FilesystemReference;
9+
use Spatie\TypeScriptTransformer\References\Reference;
10+
use Spatie\TypeScriptTransformer\Transformed\Transformed;
11+
use Traversable;
12+
13+
/**
14+
* @implements IteratorAggregate<Transformed>
15+
*/
16+
class TransformedCollection implements IteratorAggregate
17+
{
18+
/** @var array<string, Transformed> */
19+
protected array $items = [];
20+
21+
/** @var array<string, Transformed> */
22+
protected array $fileMapping = [];
23+
24+
public function __construct(
25+
array $items = [],
26+
) {
27+
$this->add(...$items);
28+
}
29+
30+
public function add(Transformed ...$transformed): self
31+
{
32+
foreach ($transformed as $item) {
33+
$this->items[$item->reference->getKey()] = $item;
34+
35+
if ($item->reference instanceof FilesystemReference) {
36+
$this->fileMapping[$this->cleanupFilePath($item->reference->getFilesystemOriginPath())] = $item;
37+
}
38+
}
39+
40+
return $this;
41+
}
42+
43+
public function has(Reference|string $reference): bool
44+
{
45+
return array_key_exists(is_string($reference) ? $reference : $reference->getKey(), $this->items);
46+
}
47+
48+
public function get(Reference|string $reference): ?Transformed
49+
{
50+
return $this->items[is_string($reference) ? $reference : $reference->getKey()] ?? null;
51+
}
52+
53+
public function remove(Reference|string $reference): void
54+
{
55+
$transformed = $this->get($reference);
56+
57+
if ($transformed === null) {
58+
return;
59+
}
60+
61+
foreach (array_unique($transformed->referencedBy) as $referencedBy) {
62+
$referencedBy = $this->get($referencedBy);
63+
64+
$referencedBy->markReferenceMissing($transformed);
65+
$referencedBy->markAsChanged();
66+
}
67+
68+
unset($this->items[$transformed->reference->getKey()]);
69+
70+
if($transformed->reference instanceof FilesystemReference) {
71+
$path = $this->cleanupFilePath($transformed->reference->getFilesystemOriginPath());
72+
73+
unset($this->fileMapping[$path]);
74+
}
75+
}
76+
77+
public function getIterator(): Traversable
78+
{
79+
return new ArrayIterator($this->items);
80+
}
81+
82+
public function all(): array
83+
{
84+
return $this->items;
85+
}
86+
87+
public function onlyChanged(): Generator
88+
{
89+
foreach ($this->items as $item) {
90+
if ($item->changed) {
91+
yield $item;
92+
}
93+
}
94+
}
95+
96+
public function findTransformedByPath(string $path): ?Transformed
97+
{
98+
$path = $this->cleanupFilePath($path);
99+
100+
return $this->fileMapping[$path] ?? null;
101+
}
102+
103+
public function hasChanges(): bool
104+
{
105+
foreach ($this->items as $item) {
106+
if ($item->changed) {
107+
return true;
108+
}
109+
}
110+
111+
return false;
112+
}
113+
114+
protected function cleanupFilePath(string $path): string
115+
{
116+
return realpath($path);
117+
}
118+
}

0 commit comments

Comments
 (0)