mirror of
https://github.com/pelican-dev/panel.git
synced 2025-11-08 12:29:26 +01:00
improve parsing of plugin.json and handle error if provider/ commands dir is missing
This commit is contained in:
parent
589b0bf4ed
commit
c7c1b8b88c
@ -7,6 +7,7 @@ use App\Enums\PluginStatus;
|
||||
use Exception;
|
||||
use Filament\Forms\Components\Component;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Sushi\Sushi;
|
||||
|
||||
@ -69,17 +70,17 @@ class Plugin extends Model implements HasPluginSettings
|
||||
* name: string,
|
||||
* author: string,
|
||||
* version: string,
|
||||
* description: string,
|
||||
* category: string,
|
||||
* url: string,
|
||||
* update_url: string,
|
||||
* description: ?string,
|
||||
* category: ?string,
|
||||
* url: ?string,
|
||||
* update_url: ?string,
|
||||
* namespace: string,
|
||||
* class: string,
|
||||
* panels: string,
|
||||
* panel_version: string,
|
||||
* composer_packages: string,
|
||||
* panels: ?string,
|
||||
* panel_version: ?string,
|
||||
* composer_packages: ?string,
|
||||
* status: string,
|
||||
* status_message: string,
|
||||
* status_message: ?string,
|
||||
* load_order: int
|
||||
* }>
|
||||
*/
|
||||
@ -98,17 +99,38 @@ class Plugin extends Model implements HasPluginSettings
|
||||
|
||||
$data = File::json($path, JSON_THROW_ON_ERROR);
|
||||
|
||||
$data = array_merge($data, $data['meta']);
|
||||
unset($data['meta']);
|
||||
|
||||
if (array_key_exists('panels', $data) && is_array($data['panels'])) {
|
||||
$data['panels'] = implode(',', $data['panels']);
|
||||
$panels = null;
|
||||
if (array_key_exists('panels', $data)) {
|
||||
$panels = $data['panels'];
|
||||
$panels = is_array($panels) ? implode(',', $panels) : $panels;
|
||||
}
|
||||
|
||||
if (array_key_exists('composer_packages', $data) && is_array($data['composer_packages'])) {
|
||||
$data['composer_packages'] = implode(',', $data['composer_packages']);
|
||||
$composerPackages = null;
|
||||
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;
|
||||
}
|
||||
|
||||
@ -274,9 +296,13 @@ class Plugin extends Model implements HasPluginSettings
|
||||
*/
|
||||
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
|
||||
{
|
||||
$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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -189,7 +189,7 @@ class PluginService
|
||||
$path = plugin_path($plugin, 'plugin.json');
|
||||
|
||||
$pluginData = File::json($path, JSON_THROW_ON_ERROR);
|
||||
$metaData = array_merge($pluginData['meta'], $data);
|
||||
$metaData = array_merge($pluginData['meta'] ?? [], $data);
|
||||
$pluginData['meta'] = $metaData;
|
||||
|
||||
File::put($path, json_encode($pluginData, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user