Skip to content

Commit bbafc67

Browse files
wip
1 parent 6c8e76f commit bbafc67

38 files changed

+805
-199
lines changed

src/Actions/DiscoverTypesAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public function execute(
2828
return array_values(array_filter(array_map(function (string $discovered) {
2929
try {
3030
return PhpClassNode::fromReflection(new ReflectionClass($discovered));
31-
} catch (\ReflectionException) {
31+
} catch (\Throwable) {
3232
return null;
3333
}
3434
}, $discovered)));

src/Actions/TransformTypesAction.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public function transformClassNode(
4343
if (count($node->getAttributes(Hidden::class)) > 0) {
4444
return null;
4545
}
46+
4647
$transformationContext = TransformationContext::createFromPhpClass($node);
4748

4849
foreach ($transformers as $transformer) {

src/Actions/WriteFilesAction.php

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

33
namespace Spatie\TypeScriptTransformer\Actions;
44

5+
use JsonException;
56
use Spatie\TypeScriptTransformer\Support\WriteableFile;
67
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
8+
use Spatie\TypeScriptTransformer\Writers\MultipleFilesWriter;
79

810
class WriteFilesAction
911
{
@@ -12,13 +14,34 @@ public function __construct(
1214
) {
1315
}
1416

15-
/** @param array<WriteableFile> $writeableFiles */
17+
/** @param array<WriteableFile> $writeableFiles */
1618
public function execute(
1719
array $writeableFiles
1820
): void {
21+
$oldManifest = $this->fetchManifest();
22+
1923
foreach ($writeableFiles as $writeableFile) {
24+
if ($oldManifest !== null
25+
&& array_key_exists($writeableFile->path, $oldManifest)
26+
&& $oldManifest[$writeableFile->path] === $writeableFile->hash
27+
) {
28+
continue;
29+
}
30+
2031
$this->writeFile($writeableFile);
2132
}
33+
34+
$writer = $this->config->writer;
35+
36+
if (! $writer instanceof MultipleFilesWriter) {
37+
return;
38+
}
39+
40+
$newManifest = $this->buildManifest($writeableFiles);
41+
42+
$this->deleteOldFiles($oldManifest, $newManifest);
43+
44+
$this->storeManifest($writer, $newManifest);
2245
}
2346

2447
protected function writeFile(WriteableFile $file): void
@@ -31,4 +54,88 @@ protected function writeFile(WriteableFile $file): void
3154

3255
file_put_contents($file->path, $file->contents);
3356
}
57+
58+
/** @return array<string, string>|null */
59+
protected function fetchManifest(): ?array
60+
{
61+
$writer = $this->config->writer;
62+
63+
if (! $writer instanceof MultipleFilesWriter) {
64+
return null;
65+
}
66+
67+
$manifestPath = $this->getManifestPath($writer);
68+
69+
if (! file_exists($manifestPath)) {
70+
return null;
71+
}
72+
73+
$manifestContent = file_get_contents($manifestPath);
74+
75+
if ($manifestContent === false) {
76+
return null;
77+
}
78+
79+
try {
80+
return json_decode($manifestContent, associative: true, flags: JSON_THROW_ON_ERROR);
81+
} catch (JsonException) {
82+
return null;
83+
}
84+
}
85+
86+
/**
87+
* @param array<WriteableFile> $writeableFiles
88+
*
89+
* @return array<string, string>
90+
*/
91+
protected function buildManifest(
92+
array $writeableFiles,
93+
): array {
94+
$manifest = [];
95+
96+
foreach ($writeableFiles as $writeableFile) {
97+
$manifest[$writeableFile->path] = $writeableFile->hash;
98+
}
99+
100+
return $manifest;
101+
}
102+
103+
/**
104+
* @param array<string, string>|null $oldManifest
105+
* @param array<string, string> $newManifest
106+
*/
107+
protected function deleteOldFiles(
108+
?array $oldManifest,
109+
array $newManifest,
110+
): void {
111+
if ($oldManifest === null) {
112+
return;
113+
}
114+
115+
$filesToDelete = array_keys(array_diff_key(
116+
$oldManifest,
117+
$newManifest,
118+
));
119+
120+
foreach ($filesToDelete as $fileToDelete) {
121+
if (file_exists($fileToDelete)) {
122+
unlink($fileToDelete);
123+
}
124+
}
125+
}
126+
127+
protected function storeManifest(
128+
MultipleFilesWriter $writer,
129+
array $manifest,
130+
): void {
131+
file_put_contents(
132+
$this->getManifestPath($writer),
133+
json_encode($manifest)
134+
);
135+
}
136+
137+
protected function getManifestPath(MultipleFilesWriter $writer): string
138+
{
139+
return "{$writer->getPath()}/typescript-transformer-manifest.json";
140+
}
34141
}

src/Collections/TransformedCollection.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use IteratorAggregate;
88
use Spatie\TypeScriptTransformer\References\FilesystemReference;
99
use Spatie\TypeScriptTransformer\References\Reference;
10+
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
1011
use Spatie\TypeScriptTransformer\Transformed\Transformed;
1112
use Traversable;
1213

@@ -21,22 +22,31 @@ class TransformedCollection implements IteratorAggregate
2122
/** @var array<string, Transformed> */
2223
protected array $fileMapping = [];
2324

25+
protected bool $requireCompleteRewrite = false;
26+
27+
protected TypeScriptTransformerLog $log;
28+
2429
public function __construct(
2530
array $items = [],
2631
) {
2732
$this->add(...$items);
33+
$this->log = TypeScriptTransformerLog::instance();
2834
}
2935

3036
public function add(Transformed ...$transformed): self
3137
{
3238
foreach ($transformed as $item) {
39+
$this->log->debug($item, 'Adding transformed');
40+
3341
$this->items[$item->reference->getKey()] = $item;
3442

3543
if ($item->reference instanceof FilesystemReference) {
3644
$this->fileMapping[$this->cleanupFilePath($item->reference->getFilesystemOriginPath())] = $item;
3745
}
3846
}
3947

48+
ray($this);
49+
4050
return $this;
4151
}
4252

@@ -54,10 +64,15 @@ public function remove(Reference|string $reference): void
5464
{
5565
$transformed = $this->get($reference);
5666

67+
$this->log->debug($reference, 'Removing reference');
68+
$this->log->debug($transformed, 'Removing transformed');
69+
5770
if ($transformed === null) {
5871
return;
5972
}
6073

74+
$this->log->debug($transformed->referencedBy, 'Marking references as missing');
75+
6176
foreach (array_unique($transformed->referencedBy) as $referencedBy) {
6277
$referencedBy = $this->get($referencedBy);
6378

@@ -72,6 +87,8 @@ public function remove(Reference|string $reference): void
7287

7388
unset($this->fileMapping[$path]);
7489
}
90+
91+
ray($this);
7592
}
7693

7794
public function getIterator(): Traversable
@@ -113,6 +130,10 @@ public function findTransformedByDirectory(string $path): Generator
113130

114131
public function hasChanges(): bool
115132
{
133+
if ($this->requireCompleteRewrite) {
134+
return true;
135+
}
136+
116137
foreach ($this->items as $item) {
117138
if ($item->changed) {
118139
return true;
@@ -122,6 +143,16 @@ public function hasChanges(): bool
122143
return false;
123144
}
124145

146+
public function requireCompleteRewrite(): void
147+
{
148+
$this->requireCompleteRewrite = true;
149+
}
150+
151+
public function rewriteExecuted(): void
152+
{
153+
$this->requireCompleteRewrite = false;
154+
}
155+
125156
protected function cleanupFilePath(string $path): string
126157
{
127158
return realpath($path);

src/FileSystemWatcher.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Spatie\TypeScriptTransformer\Events\Watch\FileDeletedWatchEvent;
1010
use Spatie\TypeScriptTransformer\Events\Watch\FileUpdatedWatchEvent;
1111
use Spatie\TypeScriptTransformer\Events\Watch\WatchEvent;
12+
use Spatie\TypeScriptTransformer\Handlers\Watch\DirectoryDeletedWatchEventHandler;
1213
use Spatie\TypeScriptTransformer\Handlers\Watch\FileDeletedWatchEventHandler;
1314
use Spatie\TypeScriptTransformer\Handlers\Watch\FileUpdatedOrCreatedWatchEventHandler;
1415
use Spatie\TypeScriptTransformer\Handlers\Watch\WatchEventHandler;
@@ -70,7 +71,7 @@ public function run(): void
7071
});
7172

7273
try {
73-
$this->typeScriptTransformer->log->info('Starting watcher');
74+
$this->typeScriptTransformer->log->info('Now watching for changes ...');
7475

7576
$watcher->start();
7677
} catch (CouldNotStartWatcher $e) {
@@ -82,8 +83,6 @@ public function run(): void
8283

8384
protected function initializeHandlers(): void
8485
{
85-
// TODO: handle directory deleted
86-
8786
$this->handlers[FileCreatedWatchEvent::class] = new FileUpdatedOrCreatedWatchEventHandler(
8887
$this->typeScriptTransformer,
8988
$this->transformedCollection,
@@ -98,6 +97,11 @@ protected function initializeHandlers(): void
9897
$this->typeScriptTransformer,
9998
$this->transformedCollection,
10099
);
100+
101+
$this->handlers[DirectoryDeletedWatchEvent::class] = new DirectoryDeletedWatchEventHandler(
102+
$this->typeScriptTransformer,
103+
$this->transformedCollection,
104+
);
101105
}
102106

103107
protected function processBuffer(): void
@@ -127,8 +131,6 @@ protected function processBuffer(): void
127131
$this->typeScriptTransformer->outputTransformed(
128132
$this->transformedCollection,
129133
);
130-
131-
$this->typeScriptTransformer->log->info('Processed events');
132134
}
133135

134136
protected function tryToConnectMissingReferencesWithNewTransformed(): void

src/Handlers/Watch/DirectoryDeletedWatchEventHandler.php

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

55
use Spatie\TypeScriptTransformer\Collections\TransformedCollection;
66
use Spatie\TypeScriptTransformer\Events\Watch\DirectoryDeletedWatchEvent;
7+
use Spatie\TypeScriptTransformer\Events\Watch\WatchEvent;
78
use Spatie\TypeScriptTransformer\TypeScriptTransformer;
89

10+
/**
11+
* @implements WatchEventHandler<DirectoryDeletedWatchEvent>
12+
*/
913
class DirectoryDeletedWatchEventHandler implements WatchEventHandler
1014
{
1115
public function __construct(
@@ -15,10 +19,12 @@ public function __construct(
1519
}
1620

1721
/**
18-
* @param DirectoryDeletedWatchEvent $event
22+
* @param WatchEvent $event
1923
*/
2024
public function handle($event): void
2125
{
26+
$this->typeScriptTransformer->log->debug($event->path, 'Directory Deleted');
27+
2228
$transformedItems = $this->transformedCollection->findTransformedByDirectory($event->path);
2329

2430
foreach ($transformedItems as $transformed) {

src/Handlers/Watch/FileDeletedWatchEventHandler.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
use Spatie\TypeScriptTransformer\Events\Watch\FileDeletedWatchEvent;
77
use Spatie\TypeScriptTransformer\TypeScriptTransformer;
88

9+
/**
10+
* @implements WatchEventHandler<FileDeletedWatchEvent>
11+
*/
912
class FileDeletedWatchEventHandler implements WatchEventHandler
1013
{
1114
public function __construct(
@@ -14,11 +17,10 @@ public function __construct(
1417
) {
1518
}
1619

17-
/**
18-
* @param FileDeletedWatchEvent $event
19-
*/
2020
public function handle($event): void
2121
{
22+
$this->typeScriptTransformer->log->debug($event->path, 'File Deleted');
23+
2224
$transformed = $this->transformedCollection->findTransformedByFile($event->path);
2325

2426
if ($transformed === null) {

0 commit comments

Comments
 (0)