Skip to content

Commit b89615c

Browse files
Config updates
1 parent 157584c commit b89615c

13 files changed

+431
-43
lines changed

src/Laravel/Actions/ResolveLaravelRoutControllerCollectionsAction.php

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,38 @@
55
use Illuminate\Routing\Route;
66
use Illuminate\Routing\Router;
77
use Illuminate\Support\Str;
8+
use Illuminate\Support\Stringable;
89
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteClosure;
910
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteCollection;
1011
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteController;
1112
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteControllerAction;
1213
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteInvokableController;
1314
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteParameter;
1415
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteParameterCollection;
16+
use Spatie\TypeScriptTransformer\Laravel\Support\WithoutRoutes;
1517

1618
class ResolveLaravelRoutControllerCollectionsAction
1719
{
20+
/**
21+
* @param array<WithoutRoutes> $filters
22+
*/
1823
public function execute(
1924
?string $defaultNamespace,
2025
bool $includeRouteClosures,
26+
array $filters = [],
2127
): RouteCollection {
2228
/** @var array<string, RouteController> $controllers */
2329
$controllers = [];
2430
/** @var array<RouteClosure> $closures */
2531
$closures = [];
2632

2733
foreach (app(Router::class)->getRoutes()->getRoutes() as $route) {
34+
foreach ($filters as $filter) {
35+
if ($filter->shouldHide($route)) {
36+
continue 2;
37+
}
38+
}
39+
2840
$controllerClass = $route->getControllerClass();
2941

3042
if ($controllerClass === null && ! $includeRouteClosures) {
@@ -44,15 +56,13 @@ public function execute(
4456
continue;
4557
}
4658

47-
if ($defaultNamespace !== null) {
48-
$controllerClass = Str::of($controllerClass)
49-
->trim('\\')
50-
->replace($defaultNamespace, '')
51-
->trim('\\')
52-
->toString();
59+
$controllerClass = Str::of($controllerClass)->trim('\\');
60+
61+
if ($defaultNamespace) {
62+
$controllerClass = $this->replaceDefaultNamespace($controllerClass, $defaultNamespace);
5363
}
5464

55-
$controllerClass = str_replace('\\', '.', $controllerClass);
65+
$controllerClass = (string) $controllerClass->replace('\\', '.');
5666

5767
if ($route->getActionMethod() === $route->getControllerClass()) {
5868
$controllers[$controllerClass] = new RouteInvokableController(
@@ -80,6 +90,19 @@ public function execute(
8090
return new RouteCollection($controllers, $closures);
8191
}
8292

93+
protected function replaceDefaultNamespace(
94+
Stringable $controllerClass,
95+
string $defaultNamespace
96+
): Stringable {
97+
$defaultNamespace = Str::of($defaultNamespace)->trim('\\');
98+
99+
if (! $controllerClass->contains($defaultNamespace)) {
100+
return $controllerClass;
101+
}
102+
103+
return $controllerClass->replace($defaultNamespace, '')->trim('\\')->prepend('.');
104+
}
105+
83106
protected function resolveRouteParameters(
84107
Route $route
85108
): RouteParameterCollection {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Laravel\Commands;
4+
5+
use Illuminate\Console\Command;
6+
use Illuminate\Support\Str;
7+
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
8+
9+
/**
10+
* @note Taken from the Laravel Horizon package
11+
*/
12+
class InstallTypeScriptTransformerCommand extends Command
13+
{
14+
public $signature = 'typescript:install';
15+
16+
public $description = 'Installs TypeScript transformer within your Laravel application.';
17+
18+
public function handle(): void
19+
{
20+
$this->comment('Publishing TypeScript Transformer Service Provider...');
21+
$this->callSilent('vendor:publish', ['--tag' => 'typescript-transformer-provider']);
22+
23+
$this->registerTypescriptTransformerServiceProvider();
24+
25+
$this->info('TypeScript Transformer scaffolding installed successfully.');
26+
}
27+
28+
protected function registerTypescriptTransformerServiceProvider(): void
29+
{
30+
$namespace = Str::replaceLast('\\', '', $this->laravel->getNamespace());
31+
32+
$appConfig = file_get_contents(config_path('app.php'));
33+
34+
if (Str::contains($appConfig, $namespace.'\\Providers\\TypeScriptTransformerServiceProvider::class')) {
35+
return;
36+
}
37+
38+
file_put_contents(config_path('app.php'), str_replace(
39+
"{$namespace}\\Providers\RouteServiceProvider::class,".PHP_EOL,
40+
"{$namespace}\\Providers\RouteServiceProvider::class,".PHP_EOL.PHP_EOL."{$namespace}\Providers\TypeScriptTransformerServiceProvider::class,".PHP_EOL,
41+
$appConfig
42+
));
43+
44+
file_put_contents(app_path('Providers/TypeScriptTransformerServiceProvider.php'), str_replace(
45+
"namespace App\Providers;",
46+
"namespace {$namespace}\Providers;",
47+
file_get_contents(app_path('Providers/TypeScriptTransformerServiceProvider.php'))
48+
));
49+
}
50+
}

src/Laravel/LaravelNamedRouteTypesProvider.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteInvokableController;
1111
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteParameter;
1212
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteParameterCollection;
13+
use Spatie\TypeScriptTransformer\Laravel\Support\WithoutRoutes;
1314
use Spatie\TypeScriptTransformer\References\CustomReference;
1415
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
1516
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
@@ -35,17 +36,23 @@
3536

3637
class LaravelNamedRouteTypesProvider implements TypesProvider
3738
{
39+
/**
40+
* @param array<string> $location
41+
* @param array<WithoutRoutes> $filters
42+
*/
3843
public function __construct(
3944
protected ResolveLaravelRoutControllerCollectionsAction $resolveLaravelRoutControllerCollectionsAction = new ResolveLaravelRoutControllerCollectionsAction(),
4045
protected array $location = [],
46+
protected array $filters = [],
4147
) {
4248
}
4349

4450
public function provide(TypeScriptTransformerConfig $config, TypeScriptTransformerLog $log, TransformedCollection $types): void
4551
{
4652
$routeCollection = $this->resolveLaravelRoutControllerCollectionsAction->execute(
47-
null,
53+
defaultNamespace: null,
4854
includeRouteClosures: true,
55+
filters: $this->filters,
4956
);
5057

5158
$transformedRoutes = new Transformed(

src/Laravel/LaravelRouteActionTypesProvider.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteInvokableController;
1010
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteParameter;
1111
use Spatie\TypeScriptTransformer\Laravel\Routes\RouteParameterCollection;
12+
use Spatie\TypeScriptTransformer\Laravel\Support\WithoutRoutes;
1213
use Spatie\TypeScriptTransformer\References\CustomReference;
1314
use Spatie\TypeScriptTransformer\Support\TransformedCollection;
1415
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
@@ -36,18 +37,24 @@
3637

3738
class LaravelRouteActionTypesProvider implements TypesProvider
3839
{
40+
/**
41+
* @param array<string> $location
42+
* @param array<WithoutRoutes> $filters
43+
*/
3944
public function __construct(
4045
protected ResolveLaravelRoutControllerCollectionsAction $resolveLaravelRoutControllerCollectionsAction = new ResolveLaravelRoutControllerCollectionsAction(),
4146
protected ?string $defaultNamespace = null,
4247
protected array $location = [],
48+
protected array $filters = [],
4349
) {
4450
}
4551

4652
public function provide(TypeScriptTransformerConfig $config, TypeScriptTransformerLog $log, TransformedCollection $types): void
4753
{
4854
$routeCollection = $this->resolveLaravelRoutControllerCollectionsAction->execute(
49-
$this->defaultNamespace,
55+
defaultNamespace: $this->defaultNamespace,
5056
includeRouteClosures: false,
57+
filters: $this->filters,
5158
);
5259

5360
$transformedRoutes = new Transformed(

src/Laravel/Support/WithoutRoutes.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Laravel\Support;
4+
5+
use Closure;
6+
use Illuminate\Routing\Route;
7+
use Illuminate\Support\Str;
8+
9+
class WithoutRoutes
10+
{
11+
protected function __construct(protected Closure $closure)
12+
{
13+
}
14+
15+
public function shouldHide(Route $route): bool
16+
{
17+
return ($this->closure)($route);
18+
}
19+
20+
public static function satisfying(Closure $closure): self
21+
{
22+
return new static($closure);
23+
}
24+
25+
public static function named(string ...$names): self
26+
{
27+
return new self(function (Route $route) use ($names): bool {
28+
if ($route->getName() === null) {
29+
return false;
30+
}
31+
32+
foreach ($names as $name) {
33+
if (Str::is($name, $route->getName())) {
34+
return true;
35+
}
36+
}
37+
38+
return false;
39+
});
40+
}
41+
42+
public static function controller(string|array ...$controllers): self
43+
{
44+
return new self(function (Route $route) use ($controllers): bool {
45+
if ($route->getControllerClass() === null) {
46+
return false;
47+
}
48+
49+
foreach ($controllers as $controller) {
50+
if (is_string($controller) && Str::is($controller, $route->getControllerClass())) {
51+
return true;
52+
}
53+
54+
if (is_array($controller)
55+
&& Str::is($controller[0], $route->getControllerClass())
56+
&& Str::is($controller[1], $route->getActionMethod())
57+
) {
58+
return true;
59+
}
60+
}
61+
62+
return false;
63+
});
64+
}
65+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Laravel;
4+
5+
use Illuminate\Support\ServiceProvider;
6+
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
7+
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfigBuilder;
8+
9+
abstract class TypeScriptTransformerApplicationServiceProvider extends ServiceProvider
10+
{
11+
abstract protected function configure(TypeScriptTransformerConfigBuilder $config): void;
12+
13+
public function register(): void
14+
{
15+
$builder = new TypeScriptTransformerConfigBuilder();
16+
17+
$this->configure($builder);
18+
19+
$config = $builder->get();
20+
21+
$this->app->singleton(TypeScriptTransformerConfig::class, fn () => $config);
22+
}
23+
}

src/Laravel/TypeScriptTransformerServiceProvider.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
use Spatie\LaravelPackageTools\Package;
66
use Spatie\LaravelPackageTools\PackageServiceProvider;
7+
use Spatie\TypeScriptTransformer\Laravel\Commands\InstallTypeScriptTransformerCommand;
78
use Spatie\TypeScriptTransformer\Laravel\Commands\TransformTypeScriptCommand;
89
use Spatie\TypeScriptTransformer\Laravel\Commands\WatchTypeScriptCommand;
910
use Spatie\TypeScriptTransformer\Support\TypeScriptTransformerLog;
10-
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
1111

1212
class TypeScriptTransformerServiceProvider extends PackageServiceProvider
1313
{
@@ -16,17 +16,17 @@ public function configurePackage(Package $package): void
1616
$package
1717
->name('typescript-transformer')
1818
->hasCommand(WatchTypeScriptCommand::class)
19-
->hasCommand(TransformTypeScriptCommand::class);
19+
->hasCommand(TransformTypeScriptCommand::class)
20+
->hasCommand(InstallTypeScriptTransformerCommand::class);
2021
}
2122

2223
public function bootingPackage(): void
2324
{
24-
// TODO: use a laravel config file or something better here
25-
26-
$this->app->singleton(
27-
TypeScriptTransformerConfig::class,
28-
fn () => LaravelTypeScriptTransformerConfig::$defined
29-
);
25+
if ($this->app->runningInConsole()) {
26+
$this->publishes([
27+
__DIR__.'/../../stubs/TypeScriptTransformerServiceProvider.stub' => app_path('Providers/TypeScriptTransformerServiceProvider.php'),
28+
], 'typescript-transformer-provider');
29+
}
3030

3131
$this->app->singleton(
3232
TypeScriptTransformerLog::class,

src/TypeProviders/TransformerTypesProvider.php

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

1515
class TransformerTypesProvider implements TypesProvider
1616
{
17-
/** @var array<Transformer> */
18-
protected array $transformers;
19-
2017
/**
21-
* @param array<class-string<Transformer>|Transformer> $transformers
18+
* @param array<Transformer> $transformers
2219
* @param array<string> $directories
2320
*/
2421
public function __construct(
25-
array $transformers,
22+
protected array $transformers,
2623
protected array $directories,
2724
) {
28-
foreach ($transformers as $transformer) {
29-
$this->transformers[] = $transformer instanceof Transformer
30-
? $transformer
31-
: new $transformer;
32-
}
3325
}
3426

3527
public function provide(
@@ -39,8 +31,6 @@ public function provide(
3931
): void {
4032
$discoveredClasses = (new DiscoverTypesAction())->execute($this->directories);
4133

42-
array_push($config->directoriesToWatch, ...$this->directories);
43-
4434
foreach ($discoveredClasses as $discoveredClass) {
4535
$transformed = $this->transformType($discoveredClass);
4636

src/TypeScriptTransformerConfig.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88

99
class TypeScriptTransformerConfig
1010
{
11-
public array $directoriesToWatch = [];
12-
1311
/**
14-
* @param array<class-string<TypesProvider>|TypesProvider> $typeProviders
12+
* @param array<class-string<TypesProvider> $typeProviders
13+
* @param array<string> $directoriesToWatch
1514
*/
1615
public function __construct(
1716
readonly public array $typeProviders,
1817
readonly public Writer $writer,
19-
readonly public ?Formatter $formatter
18+
readonly public ?Formatter $formatter,
19+
readonly public array $directoriesToWatch = [],
2020
) {
2121
}
2222
}

0 commit comments

Comments
 (0)