Phred/src/commands/module_list.php
Funky Waddle 54303282d7
Some checks failed
CI / PHP ${{ matrix.php }} (8.1) (push) Has been cancelled
CI / PHP ${{ matrix.php }} (8.2) (push) Has been cancelled
CI / PHP ${{ matrix.php }} (8.3) (push) Has been cancelled
Too many things
2026-01-06 11:02:05 -06:00

71 lines
2.4 KiB
PHP

<?php
declare(strict_types=1);
use Phred\Console\Command;
use Symfony\Component\Console\Input\InputInterface as Input;
use Symfony\Component\Console\Output\OutputInterface as Output;
use Symfony\Component\Console\Helper\Table;
return new class extends Command {
protected string $command = 'module:list';
protected string $description = 'List all modules and their registration status.';
public function handle(Input $input, Output $output): int
{
$root = getcwd();
$modulesDir = $root . '/modules';
$providersFile = $root . '/config/providers.php';
$webFile = $root . '/routes/web.php';
$registeredProviders = [];
if (is_file($providersFile)) {
$arr = require $providersFile;
$registeredProviders = (array)($arr['modules'] ?? []);
}
$webContent = is_file($webFile) ? file_get_contents($webFile) : '';
$baseNamespace = \Phred\Support\Config::get('MODULE_NAMESPACE', 'Modules');
$modules = [];
if (is_dir($modulesDir)) {
foreach (scandir($modulesDir) ?: [] as $entry) {
if ($entry === '.' || $entry === '..' || !is_dir($modulesDir . '/' . $entry)) {
continue;
}
$isManualProvider = false;
foreach ($registeredProviders as $p) {
if (str_contains($p, "\\{$baseNamespace}\\$entry\\")) {
$isManualProvider = true;
break;
}
}
$isManualRoute = str_contains($webContent, "modules/$entry/Routes/web.php");
$status = ($isManualProvider && $isManualRoute) ? '<info>Manual</info>' :
(($isManualProvider || $isManualRoute) ? '<comment>Partial</comment>' : '<fg=cyan>Discovered</fg=cyan>');
$modules[] = [
$entry,
$status,
$isManualProvider ? 'Yes' : 'No',
$isManualRoute ? 'Yes' : 'No',
];
}
}
if (empty($modules)) {
$output->writeln('<info>No modules found.</info>');
return 0;
}
$table = new Table($output);
$table->setHeaders(['Module', 'Status', 'Provider Reg.', 'Route Reg.'])
->setRows($modules);
$table->render();
return 0;
}
};