Skip to content

Commit 0e31e09

Browse files
wip
1 parent 809cfac commit 0e31e09

23 files changed

+352
-86
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
"require": {
1818
"php": "^8.2",
1919
"illuminate/contracts": "^10.0",
20-
"spatie/laravel-package-tools": "^1.14.0",
2120
"phpstan/phpdoc-parser": "^1.13",
21+
"spatie/file-system-watcher": "^1.1",
22+
"spatie/laravel-package-tools": "^1.14.0",
2223
"spatie/php-structure-discoverer": "^1.1"
2324
},
2425
"require-dev": {

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
{
22
"devDependencies": {
33
"typescript": "^5.1.6"
4+
},
5+
"dependencies": {
6+
"chokidar": "^3.5.3"
47
}
58
}

src/Actions/AppendDefaultTypesAction.php

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
namespace Spatie\TypeScriptTransformer\Actions;
44

55
use Spatie\TypeScriptTransformer\DefaultTypeProviders\DefaultTypesProvider;
6+
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
67
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
7-
use Spatie\TypeScriptTransformer\Transformed\Transformed;
88
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
99

1010
class AppendDefaultTypesAction
@@ -15,21 +15,13 @@ public function __construct(
1515
) {
1616
}
1717

18-
/**
19-
* @param array<Transformed> $transformed
20-
* @return array<Transformed>
21-
*/
22-
public function execute(array $transformed): array
18+
public function execute(TransformedCollection $collection): void
2319
{
24-
$defaults = [];
25-
2620
foreach ($this->config->defaultTypeProviders as $defaultTypeProviderClass) {
2721
/** @var DefaultTypesProvider $defaultTypeProvider */
2822
$defaultTypeProvider = new $defaultTypeProviderClass;
2923

30-
array_push($defaults, ...$defaultTypeProvider->provide());
24+
$collection->add(...$defaultTypeProvider->provide());
3125
}
32-
33-
return array_merge($transformed, $defaults);
3426
}
3527
}

src/Actions/ConnectReferencesAction.php

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
namespace Spatie\TypeScriptTransformer\Actions;
44

55
use Spatie\TypeScriptTransformer\Collections\ReferenceMap;
6+
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
67
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
7-
use Spatie\TypeScriptTransformer\Transformed\Transformed;
88
use Spatie\TypeScriptTransformer\TypeScript\TypeReference;
99
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
1010

@@ -17,29 +17,26 @@ public function __construct(
1717
) {
1818
}
1919

20-
/**
21-
* @param array<Transformed> $transformed
22-
*/
23-
public function execute(array $transformed): ReferenceMap
20+
public function execute(TransformedCollection $collection): ReferenceMap
2421
{
2522
$referenceMap = new ReferenceMap();
2623

27-
foreach ($transformed as $transformedItem) {
28-
if ($transformedItem->reference) {
29-
$referenceMap->add($transformedItem);
24+
foreach ($collection as $transformed) {
25+
if ($transformed->reference) {
26+
$referenceMap->add($transformed);
3027
}
3128
}
3229

33-
foreach ($transformed as $transformedItem) {
30+
foreach ($collection as $transformed) {
3431
$references = [];
3532

3633
$this->visitTypeScriptTreeAction->execute(
37-
$transformedItem->typeScriptNode,
38-
function (TypeReference $typeReference) use ($referenceMap, &$references, $transformedItem) {
34+
$transformed->typeScriptNode,
35+
function (TypeReference $typeReference) use ($referenceMap, &$references, $transformed) {
3936
$reference = $typeReference->reference;
4037

4138
if (! $referenceMap->has($reference)) {
42-
$this->log->warning("Tried replacing reference to `{$reference->humanFriendlyName()}` in `{$transformedItem->reference->humanFriendlyName()}` but it was not found in the transformed types");
39+
$this->log->warning("Tried replacing reference to `{$reference->humanFriendlyName()}` in `{$transformed->reference->humanFriendlyName()}` but it was not found in the transformed types");
4340

4441
return;
4542
}
@@ -50,7 +47,7 @@ function (TypeReference $typeReference) use ($referenceMap, &$references, $trans
5047
[TypeReference::class]
5148
);
5249

53-
$transformedItem->references = $references;
50+
$transformed->references = $references;
5451
}
5552

5653
return $referenceMap;

src/Actions/SplitTransformedPerLocationAction.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@
33
namespace Spatie\TypeScriptTransformer\Actions;
44

55
use Spatie\TypeScriptTransformer\Support\Location;
6+
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
67
use Spatie\TypeScriptTransformer\Transformed\Transformed;
78

89
class SplitTransformedPerLocationAction
910
{
1011
/**
11-
* @param array<Transformed> $transformedTypes
1212
* @return array<Location>
1313
*/
14-
public function execute(array $transformedTypes): array
14+
public function execute(TransformedCollection $collection): array
1515
{
1616
$split = [];
1717

18-
foreach ($transformedTypes as $transformedType) {
19-
$splitKey = count($transformedType->location) > 0
20-
? implode('.', $transformedType->location)
18+
foreach ($collection as $transformed) {
19+
$splitKey = count($transformed->location) > 0
20+
? implode('.', $transformed->location)
2121
: '';
2222

2323
if (! array_key_exists($splitKey, $split)) {
24-
$split[$splitKey] = new Location($transformedType->location, []);
24+
$split[$splitKey] = new Location($transformed->location, []);
2525
}
2626

27-
$split[$splitKey]->transformed[] = $transformedType;
27+
$split[$splitKey]->transformed[] = $transformed;
2828
}
2929

3030
ksort($split);

src/Actions/TransformTypeAction.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Actions;
4+
5+
use ReflectionClass;
6+
use ReflectionException;
7+
use Spatie\TypeScriptTransformer\Support\TransformationContext;
8+
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
9+
use Spatie\TypeScriptTransformer\Transformed\Transformed;
10+
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
11+
12+
class TransformTypeAction
13+
{
14+
public function __construct(
15+
protected TypeScriptTransformerConfig $config,
16+
protected TypeScriptTransformerLog $log,
17+
) {
18+
}
19+
20+
/**
21+
* @param class-string $type
22+
*/
23+
public function execute(string $type): ?Transformed
24+
{
25+
try {
26+
$reflection = new ReflectionClass($type);
27+
} catch (ReflectionException) {
28+
// TODO: maybe add some kind of log?
29+
30+
return null;
31+
}
32+
33+
foreach ($this->config->transformers as $transformer) {
34+
$transformed = $transformer->transform(
35+
$reflection,
36+
$this->createTransformationContext($reflection),
37+
);
38+
39+
if ($transformed instanceof Transformed) {
40+
return $transformed;
41+
}
42+
}
43+
44+
return null;
45+
}
46+
47+
protected function createTransformationContext(
48+
ReflectionClass $reflection
49+
): TransformationContext {
50+
$name = $reflection->getShortName();
51+
52+
$nameSpaceSegments = explode('\\', $reflection->getNamespaceName());
53+
54+
return new TransformationContext(
55+
$name,
56+
$nameSpaceSegments,
57+
);
58+
}
59+
}

src/Actions/TransformTypesAction.php

Lines changed: 12 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,36 @@
22

33
namespace Spatie\TypeScriptTransformer\Actions;
44

5-
use ReflectionClass;
6-
use ReflectionException;
7-
use Spatie\TypeScriptTransformer\Support\TransformationContext;
5+
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
86
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
9-
use Spatie\TypeScriptTransformer\Transformed\Transformed;
107
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
118

129
class TransformTypesAction
1310
{
11+
protected TransformTypeAction $transformTypeAction;
12+
1413
public function __construct(
1514
protected TypeScriptTransformerConfig $config,
16-
public TypeScriptTransformerLog $log,
15+
protected TypeScriptTransformerLog $log,
1716
) {
17+
$this->transformTypeAction = new TransformTypeAction($config, $log);
1818
}
1919

2020
/**
21-
* @param array<string> $types
22-
* @return array<Transformed>
21+
* @param array<string> $types
2322
*/
24-
public function execute(array $types): array
23+
public function execute(array $types): TransformedCollection
2524
{
26-
$transformedTypes = [];
25+
$collection = new TransformedCollection();
2726

2827
foreach ($types as $type) {
29-
try {
30-
$reflection = new ReflectionClass($type);
31-
} catch (ReflectionException) {
32-
// TODO: maybe add some kind of log?
33-
34-
continue;
35-
}
36-
37-
foreach ($this->config->transformers as $transformer) {
38-
$transformed = $transformer->transform(
39-
$reflection,
40-
$this->createTransformationContext($reflection),
41-
);
42-
43-
if ($transformed instanceof Transformed) {
44-
$transformedTypes[] = $transformed;
28+
$transformed = $this->transformTypeAction->execute($type);
4529

46-
break;
47-
}
30+
if ($transformed) {
31+
$collection->add($transformed);
4832
}
4933
}
5034

51-
return $transformedTypes;
52-
}
53-
54-
protected function createTransformationContext(
55-
ReflectionClass $reflection
56-
): TransformationContext {
57-
$name = $reflection->getShortName();
58-
59-
$nameSpaceSegments = explode('\\', $reflection->getNamespaceName());
60-
61-
return new TransformationContext(
62-
$name,
63-
$nameSpaceSegments,
64-
);
35+
return $collection;
6536
}
6637
}

src/Actions/WatchFileSystemAction.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Actions;
4+
5+
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
6+
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
7+
use Spatie\Watcher\Watch;
8+
9+
class WatchFileSystemAction
10+
{
11+
public function __construct(
12+
public TypeScriptTransformerConfig $config
13+
) {
14+
}
15+
16+
public function execute(
17+
TransformedCollection $transformedCollection,
18+
) {
19+
Watch::paths($this->config->directories)
20+
->onAnyChange(function (string $type, string $path) {
21+
echo $type.'|'.$path;
22+
})
23+
->start();
24+
}
25+
}

src/Actions/WriteTypesAction.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Spatie\TypeScriptTransformer\Actions;
44

55
use Spatie\TypeScriptTransformer\Collections\ReferenceMap;
6+
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
67
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
78
use Spatie\TypeScriptTransformer\Support\WrittenFile;
89
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
@@ -17,9 +18,9 @@ public function __construct(
1718

1819
/** @return array<WrittenFile> */
1920
public function execute(
20-
array $transformed,
21+
TransformedCollection $collection,
2122
ReferenceMap $referenceMap
2223
): array {
23-
return $this->config->writer->output($transformed, $referenceMap);
24+
return $this->config->writer->output($collection, $referenceMap);
2425
}
2526
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Events\Watch;
4+
5+
class DirectoryCreatedWatchEvent extends WatchEvent
6+
{
7+
8+
}

0 commit comments

Comments
 (0)