diff --git a/src/Support/AutoDiscoveryHelper.php b/src/Support/AutoDiscoveryHelper.php index a59996e..316116f 100644 --- a/src/Support/AutoDiscoveryHelper.php +++ b/src/Support/AutoDiscoveryHelper.php @@ -2,24 +2,41 @@ namespace InterNACHI\Modular\Support; +use Composer\InstalledVersions; use Illuminate\Filesystem\Filesystem; +use Illuminate\Support\Str; class AutoDiscoveryHelper { protected string $base_path; + protected array $installed_packages = []; + public function __construct( protected ModuleRegistry $module_registry, protected Filesystem $filesystem ) { $this->base_path = $module_registry->getModulesPath(); + $this->installed_packages = InstalledVersions::getInstalledPackages(); + } + + private function dirs(string $postfix): array|string + { + $directories = []; + foreach ($this->installed_packages as $installed_package) { + if (Str::startsWith($installed_package, config('app-modules.modules_directory'))) { + $directories[] = base_path($installed_package.'/'.$postfix); + } + } + + return $directories; } public function commandFileFinder(): FinderCollection { return FinderCollection::forFiles() ->name('*.php') - ->inOrEmpty($this->base_path.'/*/src/Console/Commands'); + ->inOrEmpty($this->dirs('src/Console/Commands')); } public function factoryDirectoryFinder(): FinderCollection @@ -27,7 +44,7 @@ public function factoryDirectoryFinder(): FinderCollection return FinderCollection::forDirectories() ->depth(0) ->name('factories') - ->inOrEmpty($this->base_path.'/*/database/'); + ->inOrEmpty($this->dirs('database/')); } public function migrationDirectoryFinder(): FinderCollection @@ -35,28 +52,28 @@ public function migrationDirectoryFinder(): FinderCollection return FinderCollection::forDirectories() ->depth(0) ->name('migrations') - ->inOrEmpty($this->base_path.'/*/database/'); + ->inOrEmpty($this->dirs('database/')); } public function modelFileFinder(): FinderCollection { return FinderCollection::forFiles() ->name('*.php') - ->inOrEmpty($this->base_path.'/*/src/Models'); + ->inOrEmpty($this->dirs('src/Models')); } public function bladeComponentFileFinder(): FinderCollection { return FinderCollection::forFiles() ->name('*.php') - ->inOrEmpty($this->base_path.'/*/src/View/Components'); + ->inOrEmpty($this->dirs('src/View/Components')); } public function bladeComponentDirectoryFinder(): FinderCollection { return FinderCollection::forDirectories() ->name('Components') - ->inOrEmpty($this->base_path.'/*/src/View'); + ->inOrEmpty($this->dirs('src/View')); } public function routeFileFinder(): FinderCollection @@ -65,7 +82,7 @@ public function routeFileFinder(): FinderCollection ->depth(0) ->name('*.php') ->sortByName() - ->inOrEmpty($this->base_path.'/*/routes'); + ->inOrEmpty($this->dirs('routes')); } public function viewDirectoryFinder(): FinderCollection @@ -73,7 +90,7 @@ public function viewDirectoryFinder(): FinderCollection return FinderCollection::forDirectories() ->depth(0) ->name('views') - ->inOrEmpty($this->base_path.'/*/resources/'); + ->inOrEmpty($this->dirs('resources/')); } public function langDirectoryFinder(): FinderCollection @@ -81,28 +98,28 @@ public function langDirectoryFinder(): FinderCollection return FinderCollection::forDirectories() ->depth(0) ->name('lang') - ->inOrEmpty($this->base_path.'/*/resources/'); + ->inOrEmpty($this->dirs('resources/')); } public function listenerDirectoryFinder(): FinderCollection { return FinderCollection::forDirectories() ->name('Listeners') - ->inOrEmpty($this->base_path.'/*/src'); + ->inOrEmpty($this->dirs('src')); } public function livewireComponentFileFinder(): FinderCollection { - $directory = $this->base_path.'/*/src'; - + $directory = 'src'; + if (str_contains(config('livewire.class_namespace'), '\\Http\\')) { $directory .= '/Http'; } - + $directory .= '/Livewire'; - + return FinderCollection::forFiles() ->name('*.php') - ->inOrEmpty($directory); + ->inOrEmpty($this->dirs($directory)); } }