improve parsing of plugin.json and handle error if provider/ commands dir is missing

This commit is contained in:
Boy132 2025-07-07 14:53:20 +02:00
parent 589b0bf4ed
commit c7c1b8b88c
2 changed files with 50 additions and 20 deletions

View File

@ -7,6 +7,7 @@ use App\Enums\PluginStatus;
use Exception; use Exception;
use Filament\Forms\Components\Component; use Filament\Forms\Components\Component;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\File;
use Sushi\Sushi; use Sushi\Sushi;
@ -69,17 +70,17 @@ class Plugin extends Model implements HasPluginSettings
* name: string, * name: string,
* author: string, * author: string,
* version: string, * version: string,
* description: string, * description: ?string,
* category: string, * category: ?string,
* url: string, * url: ?string,
* update_url: string, * update_url: ?string,
* namespace: string, * namespace: string,
* class: string, * class: string,
* panels: string, * panels: ?string,
* panel_version: string, * panel_version: ?string,
* composer_packages: string, * composer_packages: ?string,
* status: string, * status: string,
* status_message: string, * status_message: ?string,
* load_order: int * load_order: int
* }> * }>
*/ */
@ -98,17 +99,38 @@ class Plugin extends Model implements HasPluginSettings
$data = File::json($path, JSON_THROW_ON_ERROR); $data = File::json($path, JSON_THROW_ON_ERROR);
$data = array_merge($data, $data['meta']); $panels = null;
unset($data['meta']); if (array_key_exists('panels', $data)) {
$panels = $data['panels'];
if (array_key_exists('panels', $data) && is_array($data['panels'])) { $panels = is_array($panels) ? implode(',', $panels) : $panels;
$data['panels'] = implode(',', $data['panels']);
} }
if (array_key_exists('composer_packages', $data) && is_array($data['composer_packages'])) { $composerPackages = null;
$data['composer_packages'] = implode(',', $data['composer_packages']); if (array_key_exists('composer_packages', $data)) {
$composerPackages = $data['composer_packages'];
$composerPackages = is_array($composerPackages) ? implode(',', $composerPackages) : $composerPackages;
} }
$data = [
'id' => $data['id'],
'name' => $data['name'],
'author' => $data['author'],
'version' => Arr::get($data, 'version', '1.0.0'),
'description' => Arr::get($data, 'description', null),
'category' => Arr::get($data, 'category', null),
'url' => Arr::get($data, 'url', null),
'update_url' => Arr::get($data, 'update_url', null),
'namespace' => $data['namespace'],
'class' => $data['class'],
'panels' => $panels,
'panel_version' => Arr::get($data, 'update_url', null),
'composer_packages' => $composerPackages,
'status' => Arr::get($data, 'meta.status', PluginStatus::NotInstalled->value),
'status_message' => Arr::get($data, 'meta.status_message', null),
'load_order' => Arr::integer($data, 'meta.load_order', 0),
];
$plugins[] = $data; $plugins[] = $data;
} }
@ -274,9 +296,13 @@ class Plugin extends Model implements HasPluginSettings
*/ */
public function getProviders(): array public function getProviders(): array
{ {
$providers = File::allFiles(plugin_path($this->id, 'src', 'Providers')); $path = plugin_path($this->id, 'src', 'Providers');
return array_map(fn ($provider) => $this->namespace . '\\Providers\\' . str($provider->getRelativePathname())->remove('.php', false), $providers); if (File::missing($path)) {
return [];
}
return array_map(fn ($provider) => $this->namespace . '\\Providers\\' . str($provider->getRelativePathname())->remove('.php', false), File::allFiles($path));
} }
/** /**
@ -284,8 +310,12 @@ class Plugin extends Model implements HasPluginSettings
*/ */
public function getCommands(): array public function getCommands(): array
{ {
$providers = File::allFiles(plugin_path($this->id, 'src', 'Console', 'Commands')); $path = plugin_path($this->id, 'src', 'Console', 'Commands');
return array_map(fn ($provider) => $this->namespace . '\\Console\\Commands\\' . str($provider->getRelativePathname())->remove('.php', false), $providers); if (File::missing($path)) {
return [];
}
return array_map(fn ($provider) => $this->namespace . '\\Console\\Commands\\' . str($provider->getRelativePathname())->remove('.php', false), File::allFiles($path));
} }
} }

View File

@ -189,7 +189,7 @@ class PluginService
$path = plugin_path($plugin, 'plugin.json'); $path = plugin_path($plugin, 'plugin.json');
$pluginData = File::json($path, JSON_THROW_ON_ERROR); $pluginData = File::json($path, JSON_THROW_ON_ERROR);
$metaData = array_merge($pluginData['meta'], $data); $metaData = array_merge($pluginData['meta'] ?? [], $data);
$pluginData['meta'] = $metaData; $pluginData['meta'] = $metaData;
File::put($path, json_encode($pluginData, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); File::put($path, json_encode($pluginData, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));