mirror of
https://github.com/pelican-dev/panel.git
synced 2025-11-08 14:49:27 +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 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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user