Skip to content
This repository has been archived by the owner on Mar 4, 2020. It is now read-only.

Commit

Permalink
allow to use **.* as wildcard for all files including sub-directories (
Browse files Browse the repository at this point in the history
#86)

* unify/improve component directories

* allow to register multiple components and prefix them separately
allow to prefix single components

* fix and add unittests

* improve bladex facade

* replace registerComponents by components method
flag registerComponents as internal

* allow to register components by list of paths

* fix php cs

* allow to use **.* as wildcard for all files including sub-directories

* fix php cs
  • Loading branch information
Gummibeer authored and AlexVanderbist committed Oct 17, 2019
1 parent 112ad46 commit c215581
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 13 deletions.
12 changes: 7 additions & 5 deletions src/BladeX.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace Spatie\BladeX;

use Illuminate\Support\Str;
use Illuminate\Support\Facades\File;
use Symfony\Component\Finder\SplFileInfo;
use Spatie\BladeX\ComponentDirectory\RegularDirectory;
use Spatie\BladeX\Exceptions\CouldNotRegisterComponent;
Expand Down Expand Up @@ -111,18 +110,21 @@ public function getPrefix(): string
*
* @return \Spatie\BladeX\ComponentCollection|\Spatie\BladeX\Component[]
*/
public function registerComponents(string $viewDirectory): ComponentCollection
public function registerComponents(string $viewDirectory)
{
if (! Str::endsWith($viewDirectory, '*')) {
throw CouldNotRegisterComponent::viewDirectoryWithoutWildcard($viewDirectory);
}

$includeSubdirectories = Str::endsWith($viewDirectory, '**.*');

$componentDirectory = Str::contains($viewDirectory, '::')
? new NamespacedDirectory($viewDirectory)
: new RegularDirectory($viewDirectory);
? new NamespacedDirectory($viewDirectory, $includeSubdirectories)
: new RegularDirectory($viewDirectory, $includeSubdirectories);

return $this->registerViews(
ComponentCollection::make(File::files($componentDirectory->getAbsoluteDirectory()))
ComponentCollection::make($componentDirectory->getFiles())

->filter(function (SplFileInfo $file) {
return Str::endsWith($file->getFilename(), '.blade.php');
})
Expand Down
19 changes: 18 additions & 1 deletion src/ComponentDirectory/ComponentDirectory.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,36 @@
namespace Spatie\BladeX\ComponentDirectory;

use Illuminate\Support\Str;
use Illuminate\Support\Facades\File;
use Symfony\Component\Finder\SplFileInfo;

abstract class ComponentDirectory
{
/** @var string */
protected $viewDirectory;

/** @var bool */
protected $includeSubdirectories;

abstract public function getAbsoluteDirectory(): string;

public function getViewName(SplFileInfo $viewFile): string
{
$subDirectory = $viewFile->getRelativePath();

$view = Str::replaceLast('.blade.php', '', $viewFile->getFilename());

return empty($this->viewDirectory) ? $view : "{$this->viewDirectory}.{$view}";
return implode('.', array_filter([
$this->viewDirectory,
$subDirectory,
$view,
]));
}

public function getFiles(): array
{
return $this->includeSubdirectories
? File::allFiles($this->getAbsoluteDirectory())
: File::files($this->getAbsoluteDirectory());
}
}
3 changes: 2 additions & 1 deletion src/ComponentDirectory/NamespacedDirectory.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ class NamespacedDirectory extends ComponentDirectory
/** @var string */
protected $namespace;

public function __construct(string $viewDirectory)
public function __construct(string $viewDirectory, bool $includeSubdirectories)
{
[$this->namespace, $viewDirectory] = explode('::', $viewDirectory);
$this->viewDirectory = trim(Str::before($viewDirectory, '*'), '.');
$this->includeSubdirectories = $includeSubdirectories;
}

public function getAbsoluteDirectory(): string
Expand Down
3 changes: 2 additions & 1 deletion src/ComponentDirectory/RegularDirectory.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@

class RegularDirectory extends ComponentDirectory
{
public function __construct(string $viewDirectory)
public function __construct(string $viewDirectory, bool $includeSubdirectories)
{
$this->viewDirectory = Str::before($viewDirectory, '.*');
$this->includeSubdirectories = $includeSubdirectories;
}

public function getAbsoluteDirectory(): string
Expand Down
32 changes: 27 additions & 5 deletions tests/Features/Registration/RegistrationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ public function it_can_register_a_subdirectory_containing_namespaced_view_compon

$this->assertEquals([
'context' => 'bladex::context',
'subdirectory-namespaced-test::namespaced-view1' => 'subdirectory-namespaced-test::components.namespacedView1',
'subdirectory-namespaced-test::namespaced-view4' => 'subdirectory-namespaced-test::components.namespacedView4',
], $registeredComponents);
}

Expand Down Expand Up @@ -313,7 +313,7 @@ public function it_can_register_a_directory_containing_namespaced_view_component
'namespaced-view1' => 'namespaced-test::namespacedView1',
'namespaced-view2' => 'namespaced-test::namespacedView2',
'namespaced-view3' => 'namespaced-test::namespacedView3',
'namespaced-test::namespaced-view1' => 'namespaced-test::components.namespacedView1',
'namespaced-test::namespaced-view4' => 'namespaced-test::components.namespacedView4',
], $registeredComponents);
}

Expand All @@ -339,7 +339,7 @@ public function it_can_register_a_directory_containing_namespaced_view_component
'x-namespaced-view1' => 'namespaced-test::namespacedView1',
'x-namespaced-view2' => 'namespaced-test::namespacedView2',
'x-namespaced-view3' => 'namespaced-test::namespacedView3',
'x-namespaced-test::namespaced-view1' => 'namespaced-test::components.namespacedView1',
'x-namespaced-test::namespaced-view4' => 'namespaced-test::components.namespacedView4',
], $registeredComponents);
}

Expand All @@ -363,7 +363,7 @@ public function it_can_register_a_directory_containing_namespaced_view_component
'ns-namespaced-view1' => 'namespaced-test::namespacedView1',
'ns-namespaced-view2' => 'namespaced-test::namespacedView2',
'ns-namespaced-view3' => 'namespaced-test::namespacedView3',
'namespaced-test::namespaced-view1' => 'namespaced-test::components.namespacedView1',
'namespaced-test::namespaced-view4' => 'namespaced-test::components.namespacedView4',
], $registeredComponents);
}

Expand All @@ -389,7 +389,7 @@ public function it_can_register_a_directory_containing_namespaced_view_component
'ns-namespaced-view1' => 'namespaced-test::namespacedView1',
'ns-namespaced-view2' => 'namespaced-test::namespacedView2',
'ns-namespaced-view3' => 'namespaced-test::namespacedView3',
'nsc-namespaced-view1' => 'namespaced-test::components.namespacedView1',
'nsc-namespaced-view4' => 'namespaced-test::components.namespacedView4',
], $registeredComponents);
}

Expand Down Expand Up @@ -449,4 +449,26 @@ public function it_can_register_multiple_views_with_prefix()
'context' => 'bladex::context',
], $registeredComponents);
}

/** @test */
public function it_can_register_a_directory_and_subdirectories_containing_namespaced_view_components()
{
View::addNamespace('namespaced-test', __DIR__.'/stubs/components/namespacedComponents');

BladeX::component('namespaced-test::**.*');

$registeredComponents = collect(BladeX::registeredComponents())
->mapWithKeys(function (Component $bladeXComponent) {
return [$bladeXComponent->getTag() => $bladeXComponent->view];
})
->toArray();

$this->assertEquals([
'context' => 'bladex::context',
'namespaced-test::namespaced-view1' => 'namespaced-test::namespacedView1',
'namespaced-test::namespaced-view2' => 'namespaced-test::namespacedView2',
'namespaced-test::namespaced-view3' => 'namespaced-test::namespacedView3',
'namespaced-test::namespaced-view4' => 'namespaced-test::components.namespacedView4',
], $registeredComponents);
}
}

0 comments on commit c215581

Please sign in to comment.