Compare commits

..

18 Commits
0.8.0 ... 0.9.2

Author SHA1 Message Date
9db310a06b fix notifications (#109) 2024-02-16 21:54:51 +01:00
f70963d6bb fix notification chanels and more tests (#108)
* fix notification chanels and more tests

* fix code style
2024-02-16 21:10:17 +01:00
b75df8e1c5 temp - disable notifier 2024-02-05 00:33:06 +01:00
a22e9cb946 temp - disable notifications on installation 2024-02-05 00:23:44 +01:00
b2b9bea0b1 temp - disable ufw validation 2024-02-05 00:12:55 +01:00
3f4a2bce3a fix (#106) 2024-02-05 00:07:44 +01:00
8bffefabef Upgrade to Livewire 3 (#103)
* upgrade to livewire 3

* fix updater

* fix modal events

* fix modal events
2024-02-04 18:11:22 +01:00
3da1f4fe4c fix server not having default service (#100) 2024-01-30 20:45:17 +01:00
2214a76e09 Update README.md (#97) 2024-01-29 14:56:28 +01:00
55bf8b8ecf fix ipv6 (#96) 2024-01-27 21:34:36 +01:00
0420babdef Bump vite from 4.2.3 to 4.5.2 (#95)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.2.3 to 4.5.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.2/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-27 21:09:10 +01:00
1c3d78a5ed installation without domain 2024-01-21 21:53:26 +01:00
8665435bc4 add blank php site (#94)
* add blank php site

* fix frontend

* fix source control check
2024-01-18 19:45:58 +01:00
0ec6a9dea2 fix db transaction usage 2024-01-14 12:56:25 +01:00
bdfda05398 update Roadmap URLs (#91) 2024-01-14 08:57:00 +01:00
919cdc6892 Bump follow-redirects from 1.15.2 to 1.15.5 (#90)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.5.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.5)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-13 19:36:05 +01:00
902548e463 Fix roadmap link in README (#89) 2024-01-10 20:41:18 +01:00
2462b31f3b typo fix 2024-01-08 16:25:12 +01:00
228 changed files with 1525 additions and 718 deletions

View File

@ -4,6 +4,8 @@ # Vito
![image](https://github.com/vitodeploy/vito/assets/61919774/687d50e5-8a61-41b5-b708-752567e30aed) ![image](https://github.com/vitodeploy/vito/assets/61919774/687d50e5-8a61-41b5-b708-752567e30aed)
[[Discord](https://discord.gg/dcUWA5DV)]
Better Readme will come soon... :) Better Readme will come soon... :)
## Documentation ## Documentation
@ -12,11 +14,11 @@ ## Documentation
## Feedbacks ## Feedbacks
https://features.vitodeploy.com https://vitodeploy.featurebase.app
## Roadmap ## Roadmap
https://https://features.vitodeploy.com/roadmap https://vitodeploy.featurebase.app/roadmap
## Contribution ## Contribution

View File

@ -44,9 +44,8 @@ public function create(User $creator, array $input): Server
'progress_step' => 'Initializing', 'progress_step' => 'Initializing',
]); ]);
try {
DB::beginTransaction(); DB::beginTransaction();
try {
if ($server->provider != 'custom') { if ($server->provider != 'custom') {
$server->provider_id = $input['server_provider']; $server->provider_id = $input['server_provider'];
} }
@ -119,7 +118,6 @@ private function validateInputs(array $input): void
if ($input['provider'] == 'custom') { if ($input['provider'] == 'custom') {
$rules['ip'] = [ $rules['ip'] = [
'required', 'required',
'ip',
new RestrictedIPAddressesRule(), new RestrictedIPAddressesRule(),
]; ];
$rules['port'] = [ $rules['port'] = [

View File

@ -23,9 +23,8 @@ public function create(Server $server, array $input): Site
{ {
$this->validateInputs($server, $input); $this->validateInputs($server, $input);
try {
DB::beginTransaction(); DB::beginTransaction();
try {
$site = new Site([ $site = new Site([
'server_id' => $server->id, 'server_id' => $server->id,
'type' => $input['type'], 'type' => $input['type'],

View File

@ -8,7 +8,7 @@ interface Notification
{ {
public function rawText(): string; public function rawText(): string;
public function toMail(object $notifiable): MailMessage; public function toEmail(object $notifiable): MailMessage;
public function toSlack(object $notifiable): string; public function toSlack(object $notifiable): string;

View File

@ -8,6 +8,8 @@ final class SiteType extends Enum
{ {
const PHP = 'php'; const PHP = 'php';
const PHP_BLANK = 'php-blank';
const LARAVEL = 'laravel'; const LARAVEL = 'laravel';
const WORDPRESS = 'wordpress'; const WORDPRESS = 'wordpress';

View File

@ -8,7 +8,7 @@
class Notifier class Notifier
{ {
/** /**
* In the future we can send notifications based on the notifiable instance * In the future we can send notifications based on the notifiable instance,
* For example, If it was a server then we will send the channels specified by that server * For example, If it was a server then we will send the channels specified by that server
* For now, we will send all channels. * For now, we will send all channels.
*/ */

View File

@ -64,11 +64,15 @@ public function setLog(string $logType, $siteId = null): void
*/ */
public function connect(bool $sftp = false): void public function connect(bool $sftp = false): void
{ {
$ip = $this->server->ip;
if (str($ip)->contains(':')) {
$ip = '['.$ip.']';
}
try { try {
if ($sftp) { if ($sftp) {
$this->connection = new SFTP($this->server->ip, $this->server->port); $this->connection = new SFTP($ip, $this->server->port);
} else { } else {
$this->connection = new SSH2($this->server->ip, $this->server->port); $this->connection = new SSH2($ip, $this->server->port);
} }
$login = $this->connection->login($this->user, $this->privateKey); $login = $this->connection->login($this->user, $this->privateKey);

View File

@ -32,9 +32,6 @@ public function info(string $message): void
private function toast(string $type, string $message): void private function toast(string $type, string $message): void
{ {
$this->component->dispatchBrowserEvent('toast', [ $this->component->dispatch('toast', type: $type, message: $message);
'type' => $type,
'message' => $message,
]);
} }
} }

View File

@ -23,9 +23,9 @@ public function deploy(): void
$this->toast()->success(__('Deployment started!')); $this->toast()->success(__('Deployment started!'));
$this->emitTo(DeploymentsList::class, '$refresh'); $this->dispatch('$refresh')->to(DeploymentsList::class);
$this->emitTo(DeploymentScript::class, '$refresh'); $this->dispatch('$refresh')->to(DeploymentScript::class);
} catch (SourceControlIsNotConnected $e) { } catch (SourceControlIsNotConnected $e) {
session()->flash('toast.type', 'error'); session()->flash('toast.type', 'error');
session()->flash('toast.message', $e->getMessage()); session()->flash('toast.message', $e->getMessage());

View File

@ -27,8 +27,8 @@ public function save(): void
session()->flash('status', 'script-updated'); session()->flash('status', 'script-updated');
$this->emitTo(Deploy::class, '$refresh'); $this->dispatch('$refresh')->to(Deploy::class);
$this->emitTo(AutoDeployment::class, '$refresh'); $this->dispatch('$refresh')->to(AutoDeployment::class);
} }
public function render(): View public function render(): View

View File

@ -22,7 +22,7 @@ public function showLog(int $id): void
$deployment = $this->site->deployments()->findOrFail($id); $deployment = $this->site->deployments()->findOrFail($id);
$this->logContent = $deployment->log->content; $this->logContent = $deployment->log->content;
$this->dispatchBrowserEvent('open-modal', 'show-log'); $this->dispatch('open-modal', 'show-log');
} }
public function render(): View public function render(): View

View File

@ -27,7 +27,7 @@ public function save(): void
session()->flash('status', 'updating-env'); session()->flash('status', 'updating-env');
$this->emit(Deploy::class, '$refresh'); $this->dispatch('$refresh')->to(Deploy::class);
} }
public function render(): View public function render(): View

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Livewire\Application;
use App\Models\Site;
use App\Traits\RefreshComponentOnBroadcast;
use Livewire\Component;
class PhpBlankApp extends Component
{
use RefreshComponentOnBroadcast;
public Site $site;
public function render()
{
return view('livewire.application.php-blank-app');
}
}

View File

@ -13,7 +13,7 @@ public function render(): View
$event = Cache::get('broadcast'); $event = Cache::get('broadcast');
if ($event) { if ($event) {
Cache::forget('broadcast'); Cache::forget('broadcast');
$this->emit('broadcast', $event); $this->dispatch('broadcast', $event);
} }
return view('livewire.broadcast'); return view('livewire.broadcast');

View File

@ -22,9 +22,9 @@ public function create(): void
{ {
app(\App\Actions\CronJob\CreateCronJob::class)->create($this->server, $this->all()); app(\App\Actions\CronJob\CreateCronJob::class)->create($this->server, $this->all());
$this->emitTo(CronjobsList::class, '$refresh'); $this->dispatch('$refresh')->to(CronjobsList::class);
$this->dispatchBrowserEvent('created', true); $this->dispatch('created');
} }
public function render(): View public function render(): View

View File

@ -23,7 +23,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -45,7 +45,7 @@ public function restore(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('restored', true); $this->dispatch('restored');
} }
public function delete(): void public function delete(): void
@ -55,7 +55,7 @@ public function delete(): void
$file->delete(); $file->delete();
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -40,7 +40,7 @@ public function create(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('backup-created', true); $this->dispatch('backup-created');
} }
public function files(int $id): void public function files(int $id): void
@ -48,7 +48,7 @@ public function files(int $id): void
$backup = Backup::query()->findOrFail($id); $backup = Backup::query()->findOrFail($id);
$this->backup = $backup; $this->backup = $backup;
$this->files = $backup->files()->orderByDesc('id')->simplePaginate(1); $this->files = $backup->files()->orderByDesc('id')->simplePaginate(1);
$this->dispatchBrowserEvent('show-files', true); $this->dispatch('show-files');
} }
public function backup(): void public function backup(): void
@ -57,7 +57,7 @@ public function backup(): void
$this->files = $this->backup?->files()->orderByDesc('id')->simplePaginate(); $this->files = $this->backup?->files()->orderByDesc('id')->simplePaginate();
$this->dispatchBrowserEvent('backup-running', true); $this->dispatch('backup-running');
} }
public function delete(): void public function delete(): void
@ -67,7 +67,7 @@ public function delete(): void
$backup->delete(); $backup->delete();
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -40,7 +40,7 @@ public function create(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('database-created', true); $this->dispatch('database-created');
} }
public function delete(): void public function delete(): void
@ -52,9 +52,9 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->emitTo(DatabaseUserList::class, '$refresh'); $this->dispatch('$refresh')->to(DatabaseUserList::class);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -38,7 +38,7 @@ public function create(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('database-user-created', true); $this->dispatch('database-user-created');
} }
public function delete(): void public function delete(): void
@ -50,9 +50,9 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->emitTo(DatabaseList::class, '$refresh'); $this->dispatch('$refresh')->to(DatabaseList::class);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function viewPassword(int $id): void public function viewPassword(int $id): void
@ -62,7 +62,7 @@ public function viewPassword(int $id): void
$this->viewPassword = $databaseUser->password; $this->viewPassword = $databaseUser->password;
$this->dispatchBrowserEvent('open-modal', 'database-user-password'); $this->dispatch('open-modal', 'database-user-password');
} }
public function showLink(int $id): void public function showLink(int $id): void
@ -73,7 +73,7 @@ public function showLink(int $id): void
$this->linkId = $id; $this->linkId = $id;
$this->link = $databaseUser->databases ?? []; $this->link = $databaseUser->databases ?? [];
$this->dispatchBrowserEvent('open-modal', 'link-database-user'); $this->dispatch('open-modal', 'link-database-user');
} }
public function link(): void public function link(): void
@ -85,7 +85,7 @@ public function link(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('linked', true); $this->dispatch('linked');
} }
public function render(): View public function render(): View

View File

@ -28,9 +28,9 @@ public function create(): void
{ {
app(CreateRule::class)->create($this->server, $this->all()); app(CreateRule::class)->create($this->server, $this->all());
$this->emitTo(FirewallRulesList::class, '$refresh'); $this->dispatch('$refresh')->to(FirewallRulesList::class);
$this->dispatchBrowserEvent('created', true); $this->dispatch('created');
} }
public function render(): View public function render(): View

View File

@ -25,7 +25,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -26,9 +26,9 @@ public function add(): void
$this->all() $this->all()
); );
$this->emitTo(ChannelsList::class, '$refresh'); $this->dispatch('$refresh')->to(ChannelsList::class);
$this->dispatchBrowserEvent('added', true); $this->dispatch('added');
} }
public function render(): View public function render(): View

View File

@ -25,7 +25,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -56,7 +56,7 @@ public function uninstall(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function loadIni(int $id): void public function loadIni(int $id): void

View File

@ -33,7 +33,7 @@ public function submit(): void
session()->flash('status', 'profile-updated'); session()->flash('status', 'profile-updated');
$this->emitTo(UserDropdown::class, '$refresh'); $this->dispatch('$refresh')->to(UserDropdown::class);
} }
public function sendVerificationEmail(): void public function sendVerificationEmail(): void

View File

@ -21,9 +21,9 @@ public function create(): void
app(\App\Actions\Projects\CreateProject::class) app(\App\Actions\Projects\CreateProject::class)
->create(auth()->user(), $this->inputs); ->create(auth()->user(), $this->inputs);
$this->emitTo(ProjectsList::class, '$refresh'); $this->dispatch('$refresh')->to(ProjectsList::class);
$this->dispatchBrowserEvent('created', true); $this->dispatch('created');
} }
public function render(): View public function render(): View

View File

@ -24,9 +24,9 @@ public function create(): void
{ {
app(\App\Actions\Queue\CreateQueue::class)->create($this->site, $this->all()); app(\App\Actions\Queue\CreateQueue::class)->create($this->site, $this->all());
$this->emitTo(QueuesList::class, '$refresh'); $this->dispatch('$refresh')->to(QueuesList::class);
$this->dispatchBrowserEvent('created', true); $this->dispatch('created');
} }
public function render(): View public function render(): View

View File

@ -24,7 +24,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function start(Queue $queue): void public function start(Queue $queue): void

View File

@ -27,7 +27,7 @@ public function showLog(int $id): void
$log = $this->server->logs()->findOrFail($id); $log = $this->server->logs()->findOrFail($id);
$this->logContent = $log->content; $this->logContent = $log->content;
$this->dispatchBrowserEvent('open-modal', 'show-log'); $this->dispatch('open-modal', 'show-log');
} }
public function render(): View public function render(): View

View File

@ -22,9 +22,9 @@ public function connect(): void
{ {
app(CreateServerProvider::class)->create(auth()->user(), $this->all()); app(CreateServerProvider::class)->create(auth()->user(), $this->all());
$this->emitTo(ProvidersList::class, '$refresh'); $this->dispatch('$refresh')->to(ProvidersList::class);
$this->dispatchBrowserEvent('connected', true); $this->dispatch('connected');
} }
public function render(): View public function render(): View

View File

@ -25,7 +25,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -19,9 +19,9 @@ public function add(): void
$key->deployTo($this->server); $key->deployTo($this->server);
$this->emitTo(ServerKeysList::class, '$refresh'); $this->dispatch('$refresh')->to(ServerKeysList::class);
$this->dispatchBrowserEvent('added', true); $this->dispatch('added');
} }
public function render(): View public function render(): View

View File

@ -24,9 +24,9 @@ public function add(): void
$key->deployTo($this->server); $key->deployTo($this->server);
$this->emitTo(ServerKeysList::class, '$refresh'); $this->dispatch('$refresh')->to(ServerKeysList::class);
$this->dispatchBrowserEvent('added', true); $this->dispatch('added');
} }
public function render(): View public function render(): View

View File

@ -28,7 +28,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -21,7 +21,7 @@ public function refreshComponent(array $data): void
return; return;
} }
$this->emit('refreshComponent'); $this->dispatch('refreshComponent');
} }
public function render(): View public function render(): View

View File

@ -19,9 +19,9 @@ public function install(): void
{ {
app(InstallPHPMyAdminAction::class)->install($this->server, $this->all()); app(InstallPHPMyAdminAction::class)->install($this->server, $this->all());
$this->dispatchBrowserEvent('started', true); $this->dispatch('started');
$this->emitTo(ServicesList::class, '$refresh'); $this->dispatch('$refresh')->to(ServicesList::class);
} }
public function render(): View public function render(): View

View File

@ -26,7 +26,7 @@ public function refreshComponent(array $data): void
return; return;
} }
$this->emit('refreshComponent'); $this->dispatch('refreshComponent');
} }
public function render(): View public function render(): View

View File

@ -20,9 +20,9 @@ public function connect(): void
{ {
app(ConnectSourceControl::class)->connect($this->all()); app(ConnectSourceControl::class)->connect($this->all());
$this->emitTo(SourceControlsList::class, '$refresh'); $this->dispatch('$refresh')->to(SourceControlsList::class);
$this->dispatchBrowserEvent('connected', true); $this->dispatch('connected');
} }
public function render(): View public function render(): View

View File

@ -25,7 +25,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -19,9 +19,9 @@ public function add(): void
$this->all() $this->all()
); );
$this->emitTo(KeysList::class, '$refresh'); $this->dispatch('$refresh')->to(KeysList::class);
$this->dispatchBrowserEvent('added', true); $this->dispatch('added');
} }
public function render(): View public function render(): View

View File

@ -25,7 +25,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -23,9 +23,9 @@ public function create(): void
{ {
app(\App\Actions\SSL\CreateSSL::class)->create($this->site, $this->all()); app(\App\Actions\SSL\CreateSSL::class)->create($this->site, $this->all());
$this->emitTo(SslsList::class, '$refresh'); $this->dispatch('$refresh')->to(SslsList::class);
$this->dispatchBrowserEvent('created', true); $this->dispatch('created');
} }
public function render(): View public function render(): View

View File

@ -25,7 +25,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function refreshComponent(array $data): void public function refreshComponent(array $data): void
@ -34,7 +34,7 @@ public function refreshComponent(array $data): void
$this->toast()->error(__('SSL creation failed!')); $this->toast()->error(__('SSL creation failed!'));
} }
$this->emit('refreshComponent'); $this->dispatch('refreshComponent');
} }
public function render(): View public function render(): View

View File

@ -32,9 +32,9 @@ public function connect(): void
{ {
app(CreateStorageProvider::class)->create(auth()->user(), $this->all()); app(CreateStorageProvider::class)->create(auth()->user(), $this->all());
$this->emitTo(ProvidersList::class, '$refresh'); $this->dispatch('$refresh')->to(ProvidersList::class);
$this->dispatchBrowserEvent('connected', true); $this->dispatch('connected');
} }
public function render(): View public function render(): View

View File

@ -25,7 +25,7 @@ public function delete(): void
$this->refreshComponent([]); $this->refreshComponent([]);
$this->dispatchBrowserEvent('confirmed', true); $this->dispatch('confirmed');
} }
public function render(): View public function render(): View

View File

@ -69,8 +69,8 @@ public function deployHook(): void
*/ */
public function destroyHook(): void public function destroyHook(): void
{ {
try {
DB::beginTransaction(); DB::beginTransaction();
try {
$this->sourceControl->provider()->destroyHook($this->site->repository, $this->hook_id); $this->sourceControl->provider()->destroyHook($this->site->repository, $this->hook_id);
$this->delete(); $this->delete();
DB::commit(); DB::commit();

View File

@ -4,6 +4,7 @@
use App\Contracts\ServerType; use App\Contracts\ServerType;
use App\Enums\ServerStatus; use App\Enums\ServerStatus;
use App\Enums\ServiceStatus;
use App\Facades\Notifier; use App\Facades\Notifier;
use App\Facades\SSH; use App\Facades\SSH;
use App\Jobs\Installation\Upgrade; use App\Jobs\Installation\Upgrade;
@ -227,6 +228,18 @@ public function defaultService($type): ?Service
->where('is_default', 1) ->where('is_default', 1)
->first(); ->first();
// If no default service found, get the first service with status ready or stopped
if (! $service) {
$service = $this->services()
->where('type', $type)
->whereIn('status', [ServiceStatus::READY, ServiceStatus::STOPPED])
->first();
if ($service) {
$service->is_default = 1;
$service->save();
}
}
return $service; return $service;
} }

View File

@ -357,8 +357,8 @@ public function enableAutoDeployment(): void
throw new SourceControlIsNotConnected($this->source_control); throw new SourceControlIsNotConnected($this->source_control);
} }
try {
DB::beginTransaction(); DB::beginTransaction();
try {
$gitHook = new GitHook([ $gitHook = new GitHook([
'site_id' => $this->id, 'site_id' => $this->id,
'source_control_id' => $this->sourceControl()->id, 'source_control_id' => $this->sourceControl()->id,

View File

@ -3,15 +3,11 @@
namespace App\NotificationChannels; namespace App\NotificationChannels;
use App\Contracts\Notification; use App\Contracts\Notification;
use App\Models\NotificationChannel;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
class Discord extends AbstractNotificationChannel class Discord extends AbstractNotificationChannel
{ {
public function channel(): string
{
return 'discord';
}
public function createRules(array $input): array public function createRules(array $input): array
{ {
return [ return [
@ -65,6 +61,8 @@ private function checkConnection(string $subject, string $text): bool
public function send(object $notifiable, Notification $notification): void public function send(object $notifiable, Notification $notification): void
{ {
/** @var NotificationChannel $notifiable */
$this->notificationChannel = $notifiable;
$data = $this->notificationChannel->data; $data = $this->notificationChannel->data;
Http::post($data['webhook_url'], [ Http::post($data['webhook_url'], [
'content' => $notification->toSlack($notifiable), 'content' => $notification->toSlack($notifiable),

View File

@ -35,7 +35,10 @@ public function connect(): bool
{ {
try { try {
Mail::to($this->data()['email'])->send( Mail::to($this->data()['email'])->send(
new NotificationMail('Test VitoDeploy', 'This is a test email!') new NotificationMail(
'Connected to VitoDeploy',
'This email confirms that you have connected your email to VitoDeploy.'
)
); );
} catch (Throwable) { } catch (Throwable) {
return false; return false;
@ -48,8 +51,7 @@ public function send(object $notifiable, Notification $notification): void
{ {
/** @var NotificationChannel $notifiable */ /** @var NotificationChannel $notifiable */
$this->notificationChannel = $notifiable; $this->notificationChannel = $notifiable;
$message = $notification->toMail($notifiable); $message = $notification->toEmail($notifiable);
Mail::to($this->data()['email'])->send( Mail::to($this->data()['email'])->send(
new NotificationMail($message->subject, $message->render()) new NotificationMail($message->subject, $message->render())
); );

View File

@ -3,15 +3,11 @@
namespace App\NotificationChannels; namespace App\NotificationChannels;
use App\Contracts\Notification; use App\Contracts\Notification;
use App\Models\NotificationChannel;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
class Slack extends AbstractNotificationChannel class Slack extends AbstractNotificationChannel
{ {
public function channel(): string
{
return 'slack';
}
public function createRules(array $input): array public function createRules(array $input): array
{ {
return [ return [
@ -65,6 +61,8 @@ private function checkConnection(string $subject, string $text): bool
public function send(object $notifiable, Notification $notification): void public function send(object $notifiable, Notification $notification): void
{ {
/** @var NotificationChannel $notifiable */
$this->notificationChannel = $notifiable;
$data = $this->notificationChannel->data; $data = $this->notificationChannel->data;
Http::post($data['webhook_url'], [ Http::post($data['webhook_url'], [
'text' => $notification->toSlack($notifiable), 'text' => $notification->toSlack($notifiable),

View File

@ -3,6 +3,7 @@
namespace App\NotificationChannels; namespace App\NotificationChannels;
use App\Contracts\Notification; use App\Contracts\Notification;
use App\Models\NotificationChannel;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Throwable; use Throwable;
@ -10,11 +11,6 @@ class Telegram extends AbstractNotificationChannel
{ {
protected string $apiUrl = 'https://api.telegram.org/bot'; protected string $apiUrl = 'https://api.telegram.org/bot';
public function channel(): string
{
return 'telegram';
}
public function createRules(array $input): array public function createRules(array $input): array
{ {
return [ return [
@ -52,6 +48,8 @@ public function connect(): bool
public function send(object $notifiable, Notification $notification): void public function send(object $notifiable, Notification $notification): void
{ {
/** @var NotificationChannel $notifiable */
$this->notificationChannel = $notifiable;
$this->sendToTelegram($notification->toTelegram($notifiable)); $this->sendToTelegram($notification->toTelegram($notifiable));
} }

View File

@ -3,6 +3,7 @@
namespace App\Notifications; namespace App\Notifications;
use App\Contracts\Notification as NotificationInterface; use App\Contracts\Notification as NotificationInterface;
use App\Models\NotificationChannel;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\MailMessage;
@ -13,9 +14,16 @@ abstract class AbstractNotification extends Notification implements Notification
{ {
use Queueable, SerializesModels; use Queueable, SerializesModels;
public function toMail(object $notifiable): MailMessage public function via(object $notifiable): string
{
/** @var NotificationChannel $notifiable */
return get_class($notifiable->provider());
}
public function toEmail(object $notifiable): MailMessage
{ {
return (new MailMessage()) return (new MailMessage())
->subject('Notification')
->line($this->rawText()); ->line($this->rawText());
} }

View File

@ -25,7 +25,7 @@ public function rawText(): string
]); ]);
} }
public function toMail(object $notifiable): MailMessage public function toEmail(object $notifiable): MailMessage
{ {
return (new MailMessage) return (new MailMessage)
->subject(__('Failed to delete the server from the provider!')) ->subject(__('Failed to delete the server from the provider!'))

View File

@ -21,7 +21,7 @@ public function rawText(): string
]); ]);
} }
public function toMail(object $notifiable): MailMessage public function toEmail(object $notifiable): MailMessage
{ {
return (new MailMessage) return (new MailMessage)
->subject(__('Server disconnected!')) ->subject(__('Server disconnected!'))

View File

@ -22,7 +22,7 @@ public function rawText(): string
]); ]);
} }
public function toMail(object $notifiable): MailMessage public function toEmail(object $notifiable): MailMessage
{ {
return (new MailMessage) return (new MailMessage)
->subject(__('Server installation failed!')) ->subject(__('Server installation failed!'))

View File

@ -22,7 +22,7 @@ public function rawText(): string
]); ]);
} }
public function toMail(object $notifiable): MailMessage public function toEmail(object $notifiable): MailMessage
{ {
return (new MailMessage) return (new MailMessage)
->subject(__('Server installation started!')) ->subject(__('Server installation started!'))

View File

@ -32,7 +32,7 @@ public function rawText(): string
]); ]);
} }
public function toMail(object $notifiable): MailMessage public function toEmail(object $notifiable): MailMessage
{ {
$this->server->refresh(); $this->server->refresh();

View File

@ -19,7 +19,7 @@ public function rawText(): string
]); ]);
} }
public function toMail(object $notifiable): MailMessage public function toEmail(object $notifiable): MailMessage
{ {
return (new MailMessage) return (new MailMessage)
->subject(__('Site installation failed!')) ->subject(__('Site installation failed!'))

View File

@ -18,7 +18,7 @@ public function rawText(): string
]); ]);
} }
public function toMail(object $notifiable): MailMessage public function toEmail(object $notifiable): MailMessage
{ {
return (new MailMessage) return (new MailMessage)
->subject(__('Site installation succeed!')) ->subject(__('Site installation succeed!'))

View File

@ -18,7 +18,7 @@ public function rawText(): string
]); ]);
} }
public function toMail(object $notifiable): MailMessage public function toEmail(object $notifiable): MailMessage
{ {
return (new MailMessage) return (new MailMessage)
->subject(__('Source control disconnected!')) ->subject(__('Source control disconnected!'))

View File

@ -14,7 +14,6 @@ public function createValidationRules(array $input): array
return [ return [
'ip' => [ 'ip' => [
'required', 'required',
'ip',
Rule::unique('servers', 'ip'), Rule::unique('servers', 'ip'),
new RestrictedIPAddressesRule(), new RestrictedIPAddressesRule(),
], ],

View File

@ -163,7 +163,7 @@ protected function addSupervisor(): void
} }
/** /**
* add supervisor * add redis
*/ */
protected function addRedis(): void protected function addRedis(): void
{ {
@ -175,7 +175,7 @@ protected function addRedis(): void
} }
/** /**
* add supervisor * add ufw
*/ */
protected function addUfw(): void protected function addUfw(): void
{ {

67
app/SiteTypes/PHPBlank.php Executable file
View File

@ -0,0 +1,67 @@
<?php
namespace App\SiteTypes;
use App\Enums\SiteFeature;
use App\Jobs\Site\CreateVHost;
use Illuminate\Support\Facades\Bus;
use Illuminate\Validation\Rule;
use Throwable;
class PHPBlank extends PHPSite
{
public function supportedFeatures(): array
{
return [
SiteFeature::DEPLOYMENT,
SiteFeature::ENV,
SiteFeature::SSL,
SiteFeature::QUEUES,
];
}
public function createValidationRules(array $input): array
{
return [
'php_version' => [
'required',
Rule::in($this->site->server->installedPHPVersions()),
],
];
}
public function createFields(array $input): array
{
return [
'web_directory' => $input['web_directory'] ?? '',
'php_version' => $input['php_version'] ?? '',
];
}
public function data(array $input): array
{
return [];
}
public function install(): void
{
$chain = [
new CreateVHost($this->site),
$this->progress(65),
function () {
$this->site->php()?->restart();
},
];
$chain[] = function () {
$this->site->installationFinished();
};
Bus::chain($chain)
->catch(function (Throwable $e) {
$this->site->installationFailed($e);
})
->onConnection('ssh-long')
->dispatch();
}
}

View File

@ -15,6 +15,6 @@ public function getListeners(): array
public function refreshComponent(array $data): void public function refreshComponent(array $data): void
{ {
$this->emit('refreshComponent'); $this->dispatch('refreshComponent');
} }
} }

View File

@ -18,7 +18,7 @@
"laravel/sanctum": "^3.2", "laravel/sanctum": "^3.2",
"laravel/socialite": "^5.2", "laravel/socialite": "^5.2",
"laravel/tinker": "^2.8", "laravel/tinker": "^2.8",
"livewire/livewire": "^2.12", "livewire/livewire": "^3.0",
"opcodesio/log-viewer": "^2.5", "opcodesio/log-viewer": "^2.5",
"owenvoke/blade-fontawesome": "^2.5", "owenvoke/blade-fontawesome": "^2.5",
"phpseclib/phpseclib": "~3.0" "phpseclib/phpseclib": "~3.0"

36
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "b3f98cafe7fcc5d3ce67ad09a8f66661", "content-hash": "2c898cb3ae37c6267db77c5c95d0f926",
"packages": [ "packages": [
{ {
"name": "aws/aws-crt-php", "name": "aws/aws-crt-php",
@ -2931,34 +2931,36 @@
}, },
{ {
"name": "livewire/livewire", "name": "livewire/livewire",
"version": "v2.12.6", "version": "v3.4.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/livewire/livewire.git", "url": "https://github.com/livewire/livewire.git",
"reference": "7d3a57b3193299cf1a0639a3935c696f4da2cf92" "reference": "c0489d4a76382f6dcf6e2702112f86aa089d0c8d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/livewire/livewire/zipball/7d3a57b3193299cf1a0639a3935c696f4da2cf92", "url": "https://api.github.com/repos/livewire/livewire/zipball/c0489d4a76382f6dcf6e2702112f86aa089d0c8d",
"reference": "7d3a57b3193299cf1a0639a3935c696f4da2cf92", "reference": "c0489d4a76382f6dcf6e2702112f86aa089d0c8d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"illuminate/database": "^7.0|^8.0|^9.0|^10.0", "illuminate/database": "^10.0|^11.0",
"illuminate/support": "^7.0|^8.0|^9.0|^10.0", "illuminate/routing": "^10.0|^11.0",
"illuminate/validation": "^7.0|^8.0|^9.0|^10.0", "illuminate/support": "^10.0|^11.0",
"illuminate/validation": "^10.0|^11.0",
"league/mime-type-detection": "^1.9", "league/mime-type-detection": "^1.9",
"php": "^7.2.5|^8.0", "php": "^8.1",
"symfony/http-kernel": "^5.0|^6.0" "symfony/http-kernel": "^6.2|^7.0"
}, },
"require-dev": { "require-dev": {
"calebporzio/sushi": "^2.1", "calebporzio/sushi": "^2.1",
"laravel/framework": "^7.0|^8.0|^9.0|^10.0", "laravel/framework": "^10.0|^11.0",
"laravel/prompts": "^0.1.6",
"mockery/mockery": "^1.3.1", "mockery/mockery": "^1.3.1",
"orchestra/testbench": "^5.0|^6.0|^7.0|^8.0", "orchestra/testbench": "8.20.0|^9.0",
"orchestra/testbench-dusk": "^5.2|^6.0|^7.0|^8.0", "orchestra/testbench-dusk": "8.20.0|^9.0",
"phpunit/phpunit": "^8.4|^9.0", "phpunit/phpunit": "^10.4",
"psy/psysh": "@stable" "psy/psysh": "^0.11.22|^0.12"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -2992,7 +2994,7 @@
"description": "A front-end framework for Laravel.", "description": "A front-end framework for Laravel.",
"support": { "support": {
"issues": "https://github.com/livewire/livewire/issues", "issues": "https://github.com/livewire/livewire/issues",
"source": "https://github.com/livewire/livewire/tree/v2.12.6" "source": "https://github.com/livewire/livewire/tree/v3.4.4"
}, },
"funding": [ "funding": [
{ {
@ -3000,7 +3002,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-08-11T04:02:34+00:00" "time": "2024-01-28T19:07:11+00:00"
}, },
{ {
"name": "monolog/monolog", "name": "monolog/monolog",

View File

@ -25,6 +25,7 @@
use App\ServiceHandlers\ProcessManager\Supervisor; use App\ServiceHandlers\ProcessManager\Supervisor;
use App\ServiceHandlers\Webserver\Nginx; use App\ServiceHandlers\Webserver\Nginx;
use App\SiteTypes\Laravel; use App\SiteTypes\Laravel;
use App\SiteTypes\PHPBlank;
use App\SiteTypes\PHPSite; use App\SiteTypes\PHPSite;
use App\SiteTypes\Wordpress; use App\SiteTypes\Wordpress;
use App\SourceControlProviders\Bitbucket; use App\SourceControlProviders\Bitbucket;
@ -263,11 +264,13 @@
*/ */
'site_types' => [ 'site_types' => [
\App\Enums\SiteType::PHP, \App\Enums\SiteType::PHP,
\App\Enums\SiteType::PHP_BLANK,
\App\Enums\SiteType::LARAVEL, \App\Enums\SiteType::LARAVEL,
\App\Enums\SiteType::WORDPRESS, \App\Enums\SiteType::WORDPRESS,
], ],
'site_types_class' => [ 'site_types_class' => [
\App\Enums\SiteType::PHP => PHPSite::class, \App\Enums\SiteType::PHP => PHPSite::class,
\App\Enums\SiteType::PHP_BLANK => PHPBlank::class,
\App\Enums\SiteType::LARAVEL => Laravel::class, \App\Enums\SiteType::LARAVEL => Laravel::class,
\App\Enums\SiteType::WORDPRESS => Wordpress::class, \App\Enums\SiteType::WORDPRESS => Wordpress::class,
], ],

159
config/livewire.php Normal file
View File

@ -0,0 +1,159 @@
<?php
return [
/*
|---------------------------------------------------------------------------
| Class Namespace
|---------------------------------------------------------------------------
|
| This value sets the root class namespace for Livewire component classes in
| your application. This value will change where component auto-discovery
| finds components. It's also referenced by the file creation commands.
|
*/
'class_namespace' => 'App\\Http\\Livewire',
/*
|---------------------------------------------------------------------------
| View Path
|---------------------------------------------------------------------------
|
| This value is used to specify where Livewire component Blade templates are
| stored when running file creation commands like `artisan make:livewire`.
| It is also used if you choose to omit a component's render() method.
|
*/
'view_path' => resource_path('views/livewire'),
/*
|---------------------------------------------------------------------------
| Layout
|---------------------------------------------------------------------------
| The view that will be used as the layout when rendering a single component
| as an entire page via `Route::get('/post/create', CreatePost::class);`.
| In this case, the view returned by CreatePost will render into $slot.
|
*/
'layout' => 'layouts.app',
/*
|---------------------------------------------------------------------------
| Lazy Loading Placeholder
|---------------------------------------------------------------------------
| Livewire allows you to lazy load components that would otherwise slow down
| the initial page load. Every component can have a custom placeholder or
| you can define the default placeholder view for all components below.
|
*/
'lazy_placeholder' => null,
/*
|---------------------------------------------------------------------------
| Temporary File Uploads
|---------------------------------------------------------------------------
|
| Livewire handles file uploads by storing uploads in a temporary directory
| before the file is stored permanently. All file uploads are directed to
| a global endpoint for temporary storage. You may configure this below:
|
*/
'temporary_file_upload' => [
'disk' => null, // Example: 'local', 's3' | Default: 'default'
'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp'
'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs...
'png', 'gif', 'bmp', 'svg', 'wav', 'mp4',
'mov', 'avi', 'wmv', 'mp3', 'm4a',
'jpg', 'jpeg', 'mpga', 'webp', 'wma',
],
'max_upload_time' => 5, // Max duration (in minutes) before an upload is invalidated...
],
/*
|---------------------------------------------------------------------------
| Render On Redirect
|---------------------------------------------------------------------------
|
| This value determines if Livewire will run a component's `render()` method
| after a redirect has been triggered using something like `redirect(...)`
| Setting this to true will render the view once more before redirecting
|
*/
'render_on_redirect' => false,
/*
|---------------------------------------------------------------------------
| Eloquent Model Binding
|---------------------------------------------------------------------------
|
| Previous versions of Livewire supported binding directly to eloquent model
| properties using wire:model by default. However, this behavior has been
| deemed too "magical" and has therefore been put under a feature flag.
|
*/
'legacy_model_binding' => false,
/*
|---------------------------------------------------------------------------
| Auto-inject Frontend Assets
|---------------------------------------------------------------------------
|
| By default, Livewire automatically injects its JavaScript and CSS into the
| <head> and <body> of pages containing Livewire components. By disabling
| this behavior, you need to use @livewireStyles and @livewireScripts.
|
*/
'inject_assets' => true,
/*
|---------------------------------------------------------------------------
| Navigate (SPA mode)
|---------------------------------------------------------------------------
|
| By adding `wire:navigate` to links in your Livewire application, Livewire
| will prevent the default link handling and instead request those pages
| via AJAX, creating an SPA-like effect. Configure this behavior here.
|
*/
'navigate' => [
'show_progress_bar' => true,
'progress_bar_color' => '#2299dd',
],
/*
|---------------------------------------------------------------------------
| HTML Morph Markers
|---------------------------------------------------------------------------
|
| Livewire intelligently "morphs" existing HTML into the newly rendered HTML
| after each update. To make this process more reliable, Livewire injects
| "markers" into the rendered Blade surrounding @if, @class & @foreach.
|
*/
'inject_morph_markers' => true,
/*
|---------------------------------------------------------------------------
| Pagination Theme
|---------------------------------------------------------------------------
|
| When enabling Livewire's pagination feature by using the `WithPagination`
| trait, Livewire will use Tailwind templates to render pagination views
| on the page. If you want Bootstrap CSS, you can specify: "bootstrap"
|
*/
'pagination_theme' => 'tailwind',
];

View File

@ -4,11 +4,19 @@ export DEBIAN_FRONTEND=noninteractive
export NEEDRESTART_MODE=a export NEEDRESTART_MODE=a
export V_USERNAME=vito export V_USERNAME=vito
export V_PASSWORD=$(openssl rand -base64 12) export V_PASSWORD=$(openssl rand -base64 12)
export V_IP_ADDRESS=$(curl https://freeipapi.com --silent)
export V_IS_DOMAIN=1
echo "Enter the domain you want to install Vito? (your-domain.com)" echo "Enter the domain you want to install Vito? (your-domain.com)"
echo "Hit enter to use your IP address (${V_IP_ADDRESS}):"
read V_DOMAIN read V_DOMAIN
if [[ -z "${V_DOMAIN}" ]]; then
export V_DOMAIN=${V_IP_ADDRESS}
export V_IS_DOMAIN=0
fi
echo "Enter your email address:" echo "Enter your email address:"
read V_ADMIN_EMAIL read V_ADMIN_EMAIL

423
package-lock.json generated
View File

@ -17,13 +17,13 @@
"pusher-js": "^4.3.1", "pusher-js": "^4.3.1",
"tailwindcss": "^3.1.0", "tailwindcss": "^3.1.0",
"toastr": "^2.1.4", "toastr": "^2.1.4",
"vite": "^4.2.3" "vite": "^4.5.2"
} }
}, },
"node_modules/@esbuild/android-arm": { "node_modules/@esbuild/android-arm": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
"integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==", "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -37,9 +37,9 @@
} }
}, },
"node_modules/@esbuild/android-arm64": { "node_modules/@esbuild/android-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
"integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==", "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -53,9 +53,9 @@
} }
}, },
"node_modules/@esbuild/android-x64": { "node_modules/@esbuild/android-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
"integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==", "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -69,9 +69,9 @@
} }
}, },
"node_modules/@esbuild/darwin-arm64": { "node_modules/@esbuild/darwin-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
"integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==", "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -85,9 +85,9 @@
} }
}, },
"node_modules/@esbuild/darwin-x64": { "node_modules/@esbuild/darwin-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
"integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==", "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -101,9 +101,9 @@
} }
}, },
"node_modules/@esbuild/freebsd-arm64": { "node_modules/@esbuild/freebsd-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
"integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==", "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -117,9 +117,9 @@
} }
}, },
"node_modules/@esbuild/freebsd-x64": { "node_modules/@esbuild/freebsd-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
"integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==", "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -133,9 +133,9 @@
} }
}, },
"node_modules/@esbuild/linux-arm": { "node_modules/@esbuild/linux-arm": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
"integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==", "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -149,9 +149,9 @@
} }
}, },
"node_modules/@esbuild/linux-arm64": { "node_modules/@esbuild/linux-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
"integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==", "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -165,9 +165,9 @@
} }
}, },
"node_modules/@esbuild/linux-ia32": { "node_modules/@esbuild/linux-ia32": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
"integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==", "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -181,9 +181,9 @@
} }
}, },
"node_modules/@esbuild/linux-loong64": { "node_modules/@esbuild/linux-loong64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
"integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==", "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
"cpu": [ "cpu": [
"loong64" "loong64"
], ],
@ -197,9 +197,9 @@
} }
}, },
"node_modules/@esbuild/linux-mips64el": { "node_modules/@esbuild/linux-mips64el": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
"integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==", "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
"cpu": [ "cpu": [
"mips64el" "mips64el"
], ],
@ -213,9 +213,9 @@
} }
}, },
"node_modules/@esbuild/linux-ppc64": { "node_modules/@esbuild/linux-ppc64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
"integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==", "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
@ -229,9 +229,9 @@
} }
}, },
"node_modules/@esbuild/linux-riscv64": { "node_modules/@esbuild/linux-riscv64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
"integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==", "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@ -245,9 +245,9 @@
} }
}, },
"node_modules/@esbuild/linux-s390x": { "node_modules/@esbuild/linux-s390x": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
"integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==", "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
@ -261,9 +261,9 @@
} }
}, },
"node_modules/@esbuild/linux-x64": { "node_modules/@esbuild/linux-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
"integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==", "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -277,9 +277,9 @@
} }
}, },
"node_modules/@esbuild/netbsd-x64": { "node_modules/@esbuild/netbsd-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
"integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==", "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -293,9 +293,9 @@
} }
}, },
"node_modules/@esbuild/openbsd-x64": { "node_modules/@esbuild/openbsd-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
"integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==", "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -309,9 +309,9 @@
} }
}, },
"node_modules/@esbuild/sunos-x64": { "node_modules/@esbuild/sunos-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
"integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==", "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -325,9 +325,9 @@
} }
}, },
"node_modules/@esbuild/win32-arm64": { "node_modules/@esbuild/win32-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
"integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==", "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -341,9 +341,9 @@
} }
}, },
"node_modules/@esbuild/win32-ia32": { "node_modules/@esbuild/win32-ia32": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
"integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==", "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -357,9 +357,9 @@
} }
}, },
"node_modules/@esbuild/win32-x64": { "node_modules/@esbuild/win32-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
"integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==", "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -812,9 +812,9 @@
"dev": true "dev": true
}, },
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
"integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==", "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"bin": { "bin": {
@ -824,28 +824,28 @@
"node": ">=12" "node": ">=12"
}, },
"optionalDependencies": { "optionalDependencies": {
"@esbuild/android-arm": "0.17.16", "@esbuild/android-arm": "0.18.20",
"@esbuild/android-arm64": "0.17.16", "@esbuild/android-arm64": "0.18.20",
"@esbuild/android-x64": "0.17.16", "@esbuild/android-x64": "0.18.20",
"@esbuild/darwin-arm64": "0.17.16", "@esbuild/darwin-arm64": "0.18.20",
"@esbuild/darwin-x64": "0.17.16", "@esbuild/darwin-x64": "0.18.20",
"@esbuild/freebsd-arm64": "0.17.16", "@esbuild/freebsd-arm64": "0.18.20",
"@esbuild/freebsd-x64": "0.17.16", "@esbuild/freebsd-x64": "0.18.20",
"@esbuild/linux-arm": "0.17.16", "@esbuild/linux-arm": "0.18.20",
"@esbuild/linux-arm64": "0.17.16", "@esbuild/linux-arm64": "0.18.20",
"@esbuild/linux-ia32": "0.17.16", "@esbuild/linux-ia32": "0.18.20",
"@esbuild/linux-loong64": "0.17.16", "@esbuild/linux-loong64": "0.18.20",
"@esbuild/linux-mips64el": "0.17.16", "@esbuild/linux-mips64el": "0.18.20",
"@esbuild/linux-ppc64": "0.17.16", "@esbuild/linux-ppc64": "0.18.20",
"@esbuild/linux-riscv64": "0.17.16", "@esbuild/linux-riscv64": "0.18.20",
"@esbuild/linux-s390x": "0.17.16", "@esbuild/linux-s390x": "0.18.20",
"@esbuild/linux-x64": "0.17.16", "@esbuild/linux-x64": "0.18.20",
"@esbuild/netbsd-x64": "0.17.16", "@esbuild/netbsd-x64": "0.18.20",
"@esbuild/openbsd-x64": "0.17.16", "@esbuild/openbsd-x64": "0.18.20",
"@esbuild/sunos-x64": "0.17.16", "@esbuild/sunos-x64": "0.18.20",
"@esbuild/win32-arm64": "0.17.16", "@esbuild/win32-arm64": "0.18.20",
"@esbuild/win32-ia32": "0.17.16", "@esbuild/win32-ia32": "0.18.20",
"@esbuild/win32-x64": "0.17.16" "@esbuild/win32-x64": "0.18.20"
} }
}, },
"node_modules/escalade": { "node_modules/escalade": {
@ -919,9 +919,9 @@
} }
}, },
"node_modules/follow-redirects": { "node_modules/follow-redirects": {
"version": "1.15.2", "version": "1.15.5",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -1609,9 +1609,9 @@
} }
}, },
"node_modules/rollup": { "node_modules/rollup": {
"version": "3.20.2", "version": "3.29.4",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
"integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
"dev": true, "dev": true,
"bin": { "bin": {
"rollup": "dist/bin/rollup" "rollup": "dist/bin/rollup"
@ -1845,15 +1845,14 @@
"dev": true "dev": true
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "4.2.3", "version": "4.5.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.2.3.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
"integrity": "sha512-kLU+m2q0Y434Y1kCy3TchefAdtFso0ILi0dLyFV8Us3InXTU11H/B5ZTqCKIQHzSKNxVG/yEx813EA9f1imQ9A==", "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"esbuild": "^0.17.5", "esbuild": "^0.18.10",
"postcss": "^8.4.21", "postcss": "^8.4.27",
"resolve": "^1.22.1", "rollup": "^3.27.1"
"rollup": "^3.18.0"
}, },
"bin": { "bin": {
"vite": "bin/vite.js" "vite": "bin/vite.js"
@ -1861,12 +1860,16 @@
"engines": { "engines": {
"node": "^14.18.0 || >=16.0.0" "node": "^14.18.0 || >=16.0.0"
}, },
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": { "optionalDependencies": {
"fsevents": "~2.3.2" "fsevents": "~2.3.2"
}, },
"peerDependencies": { "peerDependencies": {
"@types/node": ">= 14", "@types/node": ">= 14",
"less": "*", "less": "*",
"lightningcss": "^1.21.0",
"sass": "*", "sass": "*",
"stylus": "*", "stylus": "*",
"sugarss": "*", "sugarss": "*",
@ -1879,6 +1882,9 @@
"less": { "less": {
"optional": true "optional": true
}, },
"lightningcss": {
"optional": true
},
"sass": { "sass": {
"optional": true "optional": true
}, },
@ -1956,156 +1962,156 @@
}, },
"dependencies": { "dependencies": {
"@esbuild/android-arm": { "@esbuild/android-arm": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
"integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==", "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/android-arm64": { "@esbuild/android-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
"integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==", "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/android-x64": { "@esbuild/android-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
"integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==", "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/darwin-arm64": { "@esbuild/darwin-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
"integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==", "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/darwin-x64": { "@esbuild/darwin-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
"integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==", "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/freebsd-arm64": { "@esbuild/freebsd-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
"integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==", "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/freebsd-x64": { "@esbuild/freebsd-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
"integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==", "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/linux-arm": { "@esbuild/linux-arm": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
"integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==", "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/linux-arm64": { "@esbuild/linux-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
"integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==", "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/linux-ia32": { "@esbuild/linux-ia32": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
"integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==", "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/linux-loong64": { "@esbuild/linux-loong64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
"integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==", "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/linux-mips64el": { "@esbuild/linux-mips64el": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
"integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==", "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/linux-ppc64": { "@esbuild/linux-ppc64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
"integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==", "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/linux-riscv64": { "@esbuild/linux-riscv64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
"integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==", "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/linux-s390x": { "@esbuild/linux-s390x": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
"integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==", "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/linux-x64": { "@esbuild/linux-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
"integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==", "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/netbsd-x64": { "@esbuild/netbsd-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
"integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==", "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/openbsd-x64": { "@esbuild/openbsd-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
"integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==", "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/sunos-x64": { "@esbuild/sunos-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
"integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==", "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/win32-arm64": { "@esbuild/win32-arm64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
"integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==", "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/win32-ia32": { "@esbuild/win32-ia32": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
"integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==", "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@esbuild/win32-x64": { "@esbuild/win32-x64": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
"integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==", "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
@ -2438,33 +2444,33 @@
"dev": true "dev": true
}, },
"esbuild": { "esbuild": {
"version": "0.17.16", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
"integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==", "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@esbuild/android-arm": "0.17.16", "@esbuild/android-arm": "0.18.20",
"@esbuild/android-arm64": "0.17.16", "@esbuild/android-arm64": "0.18.20",
"@esbuild/android-x64": "0.17.16", "@esbuild/android-x64": "0.18.20",
"@esbuild/darwin-arm64": "0.17.16", "@esbuild/darwin-arm64": "0.18.20",
"@esbuild/darwin-x64": "0.17.16", "@esbuild/darwin-x64": "0.18.20",
"@esbuild/freebsd-arm64": "0.17.16", "@esbuild/freebsd-arm64": "0.18.20",
"@esbuild/freebsd-x64": "0.17.16", "@esbuild/freebsd-x64": "0.18.20",
"@esbuild/linux-arm": "0.17.16", "@esbuild/linux-arm": "0.18.20",
"@esbuild/linux-arm64": "0.17.16", "@esbuild/linux-arm64": "0.18.20",
"@esbuild/linux-ia32": "0.17.16", "@esbuild/linux-ia32": "0.18.20",
"@esbuild/linux-loong64": "0.17.16", "@esbuild/linux-loong64": "0.18.20",
"@esbuild/linux-mips64el": "0.17.16", "@esbuild/linux-mips64el": "0.18.20",
"@esbuild/linux-ppc64": "0.17.16", "@esbuild/linux-ppc64": "0.18.20",
"@esbuild/linux-riscv64": "0.17.16", "@esbuild/linux-riscv64": "0.18.20",
"@esbuild/linux-s390x": "0.17.16", "@esbuild/linux-s390x": "0.18.20",
"@esbuild/linux-x64": "0.17.16", "@esbuild/linux-x64": "0.18.20",
"@esbuild/netbsd-x64": "0.17.16", "@esbuild/netbsd-x64": "0.18.20",
"@esbuild/openbsd-x64": "0.17.16", "@esbuild/openbsd-x64": "0.18.20",
"@esbuild/sunos-x64": "0.17.16", "@esbuild/sunos-x64": "0.18.20",
"@esbuild/win32-arm64": "0.17.16", "@esbuild/win32-arm64": "0.18.20",
"@esbuild/win32-ia32": "0.17.16", "@esbuild/win32-ia32": "0.18.20",
"@esbuild/win32-x64": "0.17.16" "@esbuild/win32-x64": "0.18.20"
} }
}, },
"escalade": { "escalade": {
@ -2525,9 +2531,9 @@
} }
}, },
"follow-redirects": { "follow-redirects": {
"version": "1.15.2", "version": "1.15.5",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
"dev": true "dev": true
}, },
"form-data": { "form-data": {
@ -2987,9 +2993,9 @@
"dev": true "dev": true
}, },
"rollup": { "rollup": {
"version": "3.20.2", "version": "3.29.4",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
"integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
"dev": true, "dev": true,
"requires": { "requires": {
"fsevents": "~2.3.2" "fsevents": "~2.3.2"
@ -3140,16 +3146,15 @@
"dev": true "dev": true
}, },
"vite": { "vite": {
"version": "4.2.3", "version": "4.5.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.2.3.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
"integrity": "sha512-kLU+m2q0Y434Y1kCy3TchefAdtFso0ILi0dLyFV8Us3InXTU11H/B5ZTqCKIQHzSKNxVG/yEx813EA9f1imQ9A==", "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
"dev": true, "dev": true,
"requires": { "requires": {
"esbuild": "^0.17.5", "esbuild": "^0.18.10",
"fsevents": "~2.3.2", "fsevents": "~2.3.2",
"postcss": "^8.4.21", "postcss": "^8.4.27",
"resolve": "^1.22.1", "rollup": "^3.27.1"
"rollup": "^3.18.0"
} }
}, },
"vite-plugin-full-reload": { "vite-plugin-full-reload": {

View File

@ -2,9 +2,7 @@
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build"
"queue:listen": "php artisan queue:listen --timeout=600 --queue=default,ssh,ssh-long",
"scheduler:run": "php artisan schedule:run"
}, },
"devDependencies": { "devDependencies": {
"@ryangjchandler/alpine-clipboard": "^2.2.0", "@ryangjchandler/alpine-clipboard": "^2.2.0",
@ -19,6 +17,6 @@
"pusher-js": "^4.3.1", "pusher-js": "^4.3.1",
"tailwindcss": "^3.1.0", "tailwindcss": "^3.1.0",
"toastr": "^2.1.4", "toastr": "^2.1.4",
"vite": "^4.2.3" "vite": "^4.5.2"
} }
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,11 +1,11 @@
{ {
"resources/css/app.css": { "resources/css/app.css": {
"file": "assets/app-8b808e33.css", "file": "assets/app-887de6f7.css",
"isEntry": true, "isEntry": true,
"src": "resources/css/app.css" "src": "resources/css/app.css"
}, },
"resources/js/app.js": { "resources/js/app.js": {
"file": "assets/app-9aa488bb.js", "file": "assets/app-e6b0cd9c.js",
"isEntry": true, "isEntry": true,
"src": "resources/js/app.js" "src": "resources/js/app.js"
} }

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="256px" height="135px" viewBox="0 0 256 135" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<defs>
<radialGradient id="radialGradient-1" cx="0.8366" cy="-125.811" r="363.0565" gradientTransform="matrix(0.463 0 0 0.463 76.4644 81.9182)" gradientUnits="userSpaceOnUse">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.5" style="stop-color:#4C6B97"/>
<stop offset="1" style="stop-color:#231F20"/>
</radialGradient>
</defs>
<g>
<ellipse fill="url(#radialGradient-1)" cx="128" cy="67.3" rx="128" ry="67.3"/>
<ellipse fill="#6181B6" cx="128" cy="67.3" rx="123" ry="62.3"/>
<g>
<path fill="#FFFFFF" d="M152.9,87.5c0,0,6.1-31.4,6.1-31.4c1.4-7.1,0.2-12.4-3.4-15.7c-3.5-3.2-9.5-4.8-18.3-4.8h-10.6l3-15.6
c0.1-0.6,0-1.2-0.4-1.7c-0.4-0.5-0.9-0.7-1.5-0.7h-14.6c-1,0-1.8,0.7-2,1.6l-6.5,33.3c-0.6-3.8-2-7-4.4-9.6
c-4.3-4.9-11-7.4-20.1-7.4H52.1c-1,0-1.8,0.7-2,1.6L37,104.7c-0.1,0.6,0,1.2,0.4,1.7c0.4,0.5,0.9,0.7,1.5,0.7h14.7
c1,0,1.8-0.7,2-1.6l3.2-16.3h10.9c5.7,0,10.6-0.6,14.3-1.8c3.9-1.3,7.4-3.4,10.5-6.3c2.5-2.3,4.6-4.9,6.2-7.7l-2.6,13.5
c-0.1,0.6,0,1.2,0.4,1.7s0.9,0.7,1.5,0.7h14.6c1,0,1.8-0.7,2-1.6l7.2-37h10c4.3,0,5.5,0.8,5.9,1.2c0.3,0.3,0.9,1.5,0.2,5.2
l-5.8,29.9c-0.1,0.6,0,1.2,0.4,1.7c0.4,0.5,0.9,0.7,1.5,0.7H151C151.9,89.1,152.7,88.4,152.9,87.5z M85.3,61.5
c-0.9,4.7-2.6,8.1-5.1,10c-2.5,1.9-6.6,2.9-12,2.9h-6.5l4.7-24.2h8.4c6.2,0,8.7,1.3,9.7,2.4C85.8,54.2,86.1,57.3,85.3,61.5z"/>
<path fill="#FFFFFF" d="M215.3,42.9c-4.3-4.9-11-7.4-20.1-7.4h-28.3c-1,0-1.8,0.7-2,1.6l-13.1,67.5c-0.1,0.6,0,1.2,0.4,1.7
c0.4,0.5,0.9,0.7,1.5,0.7h14.7c1,0,1.8-0.7,2-1.6l3.2-16.3h10.9c5.7,0,10.6-0.6,14.3-1.8c3.9-1.3,7.4-3.4,10.5-6.3
c2.6-2.4,4.8-5.1,6.4-8c1.6-2.9,2.8-6.1,3.5-9.6C220.9,54.7,219.6,47.9,215.3,42.9z M200,61.5c-0.9,4.7-2.6,8.1-5.1,10
c-2.5,1.9-6.6,2.9-12,2.9h-6.5l4.7-24.2h8.4c6.2,0,8.7,1.3,9.7,2.4C200.6,54.2,200.9,57.3,200,61.5z"/>
</g>
<g>
<path fill="#000004" d="M74.8,48.2c5.6,0,9.3,1,11.2,3.1c1.9,2.1,2.3,5.6,1.3,10.6c-1,5.2-3,9-5.9,11.2c-2.9,2.2-7.3,3.3-13.2,3.3
h-8.9l5.5-28.2H74.8z M39,105h14.7l3.5-17.9h12.6c5.6,0,10.1-0.6,13.7-1.8c3.6-1.2,6.8-3.1,9.8-5.9c2.5-2.3,4.5-4.8,6-7.5
c1.5-2.7,2.6-5.7,3.2-9c1.6-8,0.4-14.2-3.5-18.7c-3.9-4.5-10.1-6.7-18.6-6.7H52.1L39,105z"/>
<path fill="#000004" d="M113.3,19.6h14.6l-3.5,17.9h13c8.2,0,13.8,1.4,16.9,4.3c3.1,2.9,4,7.5,2.8,13.9L151,87.1h-14.8l5.8-29.9
c0.7-3.4,0.4-5.7-0.7-6.9c-1.1-1.2-3.6-1.9-7.3-1.9h-11.7l-7.5,38.7h-14.6L113.3,19.6z"/>
<path fill="#000004" d="M189.5,48.2c5.6,0,9.3,1,11.2,3.1c1.9,2.1,2.3,5.6,1.3,10.6c-1,5.2-3,9-5.9,11.2c-2.9,2.2-7.3,3.3-13.2,3.3
h-8.9l5.5-28.2H189.5z M153.7,105h14.7l3.5-17.9h12.6c5.6,0,10.1-0.6,13.7-1.8c3.6-1.2,6.8-3.1,9.8-5.9c2.5-2.3,4.5-4.8,6-7.5
c1.5-2.7,2.6-5.7,3.2-9c1.6-8,0.4-14.2-3.5-18.7c-3.9-4.5-10.1-6.7-18.6-6.7h-28.3L153.7,105z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -1,24 +1,11 @@
import './bootstrap'; import { Livewire, Alpine } from '../../vendor/livewire/livewire/dist/livewire.esm';
// import Echo from "laravel-echo"
// import Pusher from "pusher-js"
import Alpine from 'alpinejs';
import Clipboard from "@ryangjchandler/alpine-clipboard";
Alpine.plugin(Clipboard) Alpine.directive('clipboard', (el) => {
let text = el.textContent
// window.Echo = new Echo({ el.addEventListener('click', () => {
// broadcaster: 'pusher', navigator.clipboard.writeText(text)
// key: 'app-key', })
// wsHost: 'localhost', })
// wsPort: 6001,
// cluster: '',
// forceTLS: false,
// disableStats: true,
// });
//
// window.Pusher = Pusher;
window.Alpine = Alpine;
Alpine.start();
Livewire.start()

View File

@ -1,7 +1,7 @@
@props(['name', 'input', 'title', 'description', 'method']) @props(['name', 'input', 'title', 'description', 'method'])
<x-modal :name="$name"> <x-modal :name="$name">
<form wire:submit.prevent="{{ $method }}" class="p-6"> <form wire:submit="{{ $method }}" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Confirm') }} {{ __('Confirm') }}
</h2> </h2>

View File

@ -189,15 +189,15 @@ class="min-h-screen w-64 flex-none border-r border-gray-200 bg-white dark:border
</div> </div>
<x-toast /> <x-toast />
<livewire:broadcast /> <livewire:broadcast />
@livewireScripts @livewireScriptConfig
<script> <script>
document.addEventListener('livewire:load', () => { // document.addEventListener('livewire:init', () => {
Livewire.onPageExpired((response, message) => { // Livewire.onPageExpired((response, message) => {
({ // ({
href: window.location.href // href: window.location.href
} = window.location); // } = window.location);
}) // })
}) // })
// On page load or when changing themes, best to add inline in `head` to avoid FOUC // On page load or when changing themes, best to add inline in `head` to avoid FOUC
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia( if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia(

View File

@ -4,7 +4,6 @@
if (this.theme === 'dark') { if (this.theme === 'dark') {
return true return true
} }
console.log(window.matchMedia('(prefers-color-scheme: dark)'))
return this.theme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches; return this.theme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches;
}, },
changeTheme(theme) { changeTheme(theme) {

View File

@ -1,13 +1,13 @@
<div x-data=""> <div x-data="">
<x-modal name="change-branch"> <x-modal name="change-branch">
<form wire:submit.prevent="change" class="p-6"> <form wire:submit="change" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Change Branch') }} {{ __('Change Branch') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="branch" :value="__('Branch')" /> <x-input-label for="branch" :value="__('Branch')" />
<x-text-input wire:model.defer="branch" id="branch" name="branch" type="text" class="mt-1 w-full" /> <x-text-input wire:model="branch" id="branch" name="branch" type="text" class="mt-1 w-full" />
@error('branch') @error('branch')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror

View File

@ -1,13 +1,13 @@
<div x-data=""> <div x-data="">
<x-modal name="deployment-script"> <x-modal name="deployment-script">
<form wire:submit.prevent="save" class="p-6"> <form wire:submit="save" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Deployment Script') }} {{ __('Deployment Script') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="script" :value="__('Script')" /> <x-input-label for="script" :value="__('Script')" />
<x-textarea wire:model.defer="script" rows="10" id="script" name="script" class="mt-1 w-full" /> <x-textarea wire:model="script" rows="10" id="script" name="script" class="mt-1 w-full" />
@error('script') @error('script')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror

View File

@ -1,13 +1,13 @@
<div x-data=""> <div x-data="">
<x-modal name="update-env"> <x-modal name="update-env">
<form wire:submit.prevent="save" class="p-6"> <form wire:submit="save" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Update .env File') }} {{ __('Update .env File') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="env" :value="__('.env')" /> <x-input-label for="env" :value="__('.env')" />
<x-textarea wire:model.defer="env" rows="10" id="env" name="env" class="mt-1 w-full" /> <x-textarea wire:model="env" rows="10" id="env" name="env" class="mt-1 w-full" />
@error('env') @error('env')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror

View File

@ -1,36 +1 @@
<div> @include('livewire.application.php-app')
<x-card-header>
<x-slot name="title">{{ __("Application") }}</x-slot>
<x-slot name="description">{{ __("Here you can manage your application") }}</x-slot>
<x-slot name="aside">
<div class="flex items-center">
<div class="mr-2">
<livewire:application.deploy :site="$site" />
</div>
<div class="mr-2">
<livewire:application.auto-deployment :site="$site" />
</div>
<x-dropdown>
<x-slot name="trigger">
<x-secondary-button>
{{ __('Manage') }}
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-5 h-5 ml-1">
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 15L12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" />
</svg>
</x-secondary-button>
</x-slot>
<x-slot name="content">
<x-dropdown-link class="cursor-pointer" x-on:click="$dispatch('open-modal', 'change-branch')">{{ __("Branch") }}</x-dropdown-link>
<x-dropdown-link class="cursor-pointer" x-on:click="$dispatch('open-modal', 'deployment-script')">{{ __("Deployment Script") }}</x-dropdown-link>
<x-dropdown-link class="cursor-pointer" x-on:click="$dispatch('open-modal', 'update-env')">{{ __(".env") }}</x-dropdown-link>
</x-slot>
</x-dropdown>
<livewire:application.change-branch :site="$site" />
<livewire:application.deployment-script :site="$site" />
<livewire:application.env :site="$site" />
</div>
</x-slot>
</x-card-header>
<livewire:application.deployments-list :site="$site" />
</div>

View File

@ -1,3 +1,62 @@
<div> <div>
<x-card-header>
<x-slot name="title">{{ __('Application') }}</x-slot>
<x-slot name="description">{{ __('Here you can manage your application') }}</x-slot>
<x-slot name="aside">
<div class="flex items-center">
<div class="mr-2">
<livewire:application.deploy :site="$site" />
</div>
@if ($site->source_control_id)
<div class="mr-2">
<livewire:application.auto-deployment :site="$site" />
</div>
@endif
<x-dropdown>
<x-slot name="trigger">
<x-secondary-button>
{{ __('Manage') }}
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="ml-1 h-5 w-5"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M8.25 15L12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9"
/>
</svg>
</x-secondary-button>
</x-slot>
<x-slot name="content">
@if ($site->source_control_id)
<x-dropdown-link
class="cursor-pointer"
x-on:click="$dispatch('open-modal', 'change-branch')"
>{{ __('Branch') }}</x-dropdown-link>
@endif
<x-dropdown-link
class="cursor-pointer"
x-on:click="$dispatch('open-modal', 'deployment-script')"
>{{ __('Deployment Script') }}</x-dropdown-link>
<x-dropdown-link
class="cursor-pointer"
x-on:click="$dispatch('open-modal', 'update-env')"
>{{ __('.env') }}</x-dropdown-link>
</x-slot>
</x-dropdown>
@if ($site->source_control_id)
<livewire:application.change-branch :site="$site" />
@endif
<livewire:application.deployment-script :site="$site" />
<livewire:application.env :site="$site" />
</div>
</x-slot>
</x-card-header>
<livewire:application.deployments-list :site="$site" />
</div> </div>

View File

@ -0,0 +1 @@
@include('livewire.application.php-app')

View File

@ -4,14 +4,14 @@
</x-primary-button> </x-primary-button>
<x-modal name="create-cronjob"> <x-modal name="create-cronjob">
<form wire:submit.prevent="create" class="p-6"> <form wire:submit="create" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Create Cronjob') }} {{ __('Create Cronjob') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="command" :value="__('Command')" /> <x-input-label for="command" :value="__('Command')" />
<x-text-input wire:model.defer="command" id="command" name="command" type="text" class="mt-1 w-full" /> <x-text-input wire:model="command" id="command" name="command" type="text" class="mt-1 w-full" />
@error('command') @error('command')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -19,7 +19,7 @@
<div class="mt-6"> <div class="mt-6">
<x-input-label for="user" :value="__('User')" /> <x-input-label for="user" :value="__('User')" />
<x-select-input wire:model.defer="user" id="user" name="user" class="mt-1 w-full"> <x-select-input wire:model="user" id="user" name="user" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option> <option value="" selected disabled>{{ __("Select") }}</option>
<option value="root" @if($user === 'root') selected @endif>root</option> <option value="root" @if($user === 'root') selected @endif>root</option>
<option value="{{ $server->ssh_user }}" @if($user === $server->ssh_user) selected @endif>{{ $server->ssh_user }}</option> <option value="{{ $server->ssh_user }}" @if($user === $server->ssh_user) selected @endif>{{ $server->ssh_user }}</option>
@ -31,7 +31,7 @@
<div class="mt-6"> <div class="mt-6">
<x-input-label for="frequency" :value="__('Frequency')" /> <x-input-label for="frequency" :value="__('Frequency')" />
<x-select-input wire:model="frequency" id="frequency" name="frequency" class="mt-1 w-full"> <x-select-input wire:model.live="frequency" id="frequency" name="frequency" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option> <option value="" selected disabled>{{ __("Select") }}</option>
<option value="* * * * *" @if($frequency === '* * * * *') selected @endif>{{ __("Every minute") }}</option> <option value="* * * * *" @if($frequency === '* * * * *') selected @endif>{{ __("Every minute") }}</option>
<option value="0 * * * *" @if($frequency === '0 * * * *') selected @endif>{{ __("Hourly") }}</option> <option value="0 * * * *" @if($frequency === '0 * * * *') selected @endif>{{ __("Hourly") }}</option>
@ -48,7 +48,7 @@
@if($frequency === 'custom') @if($frequency === 'custom')
<div class="mt-6"> <div class="mt-6">
<x-input-label for="custom" :value="__('Custom Frequency')" /> <x-input-label for="custom" :value="__('Custom Frequency')" />
<x-text-input wire:model.defer="custom" id="custom" name="custom" type="text" class="mt-1 w-full" placeholder="* * * * *" /> <x-text-input wire:model="custom" id="custom" name="custom" type="text" class="mt-1 w-full" placeholder="* * * * *" />
@error('custom') @error('custom')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror

View File

@ -1,12 +1,12 @@
<x-modal name="create-backup"> <x-modal name="create-backup">
<form wire:submit.prevent="create" class="p-6" x-data="{user: false, remote: false}"> <form wire:submit="create" class="p-6" x-data="{user: false, remote: false}">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Create Backup') }} {{ __('Create Backup') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="database" :value="__('Database')" /> <x-input-label for="database" :value="__('Database')" />
<x-select-input wire:model="database" id="database" name="database" class="mt-1 w-full"> <x-select-input wire:model.live="database" id="database" name="database" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option> <option value="" selected disabled>{{ __("Select") }}</option>
@foreach($databases as $db) @foreach($databases as $db)
<option value="{{ $db->id }}" @if($database == $db->id) selected @endif>{{ $db->name }}</option> <option value="{{ $db->id }}" @if($database == $db->id) selected @endif>{{ $db->name }}</option>
@ -19,7 +19,7 @@
<div class="mt-6"> <div class="mt-6">
<x-input-label for="storage" :value="__('Storage')" /> <x-input-label for="storage" :value="__('Storage')" />
<x-select-input wire:model="storage" id="storage" name="storage" class="mt-1 w-full"> <x-select-input wire:model.live="storage" id="storage" name="storage" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option> <option value="" selected disabled>{{ __("Select") }}</option>
@foreach(auth()->user()->storageProviders as $st) @foreach(auth()->user()->storageProviders as $st)
<option value="{{ $st->id }}" @if($storage == $st->id) selected @endif>{{ $st->profile }} - {{ $st->provider }}</option> <option value="{{ $st->id }}" @if($storage == $st->id) selected @endif>{{ $st->profile }} - {{ $st->provider }}</option>
@ -33,7 +33,7 @@
<div class="mt-6"> <div class="mt-6">
<x-input-label for="interval" :value="__('Interval')" /> <x-input-label for="interval" :value="__('Interval')" />
<x-select-input wire:model="interval" id="interval" name="interval" class="mt-1 w-full"> <x-select-input wire:model.live="interval" id="interval" name="interval" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option> <option value="" selected disabled>{{ __("Select") }}</option>
<option value="0 * * * *" @if($interval === '0 * * * *') selected @endif>{{ __("Hourly") }}</option> <option value="0 * * * *" @if($interval === '0 * * * *') selected @endif>{{ __("Hourly") }}</option>
<option value="0 0 * * *" @if($interval === '0 0 * * *') selected @endif>{{ __("Daily") }}</option> <option value="0 0 * * *" @if($interval === '0 0 * * *') selected @endif>{{ __("Daily") }}</option>
@ -50,7 +50,7 @@
@if($interval === 'custom') @if($interval === 'custom')
<div class="mt-6"> <div class="mt-6">
<x-input-label for="custom" :value="__('Custom interval (Cron)')" /> <x-input-label for="custom" :value="__('Custom interval (Cron)')" />
<x-text-input wire:model.defer="custom" id="custom" name="custom" type="text" class="mt-1 w-full" placeholder="* * * * *" /> <x-text-input wire:model="custom" id="custom" name="custom" type="text" class="mt-1 w-full" placeholder="* * * * *" />
@error('custom') @error('custom')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -59,7 +59,7 @@
<div class="mt-6"> <div class="mt-6">
<x-input-label for="keep" :value="__('Backups to Keep')" /> <x-input-label for="keep" :value="__('Backups to Keep')" />
<x-text-input wire:model.defer="keep" id="keep" name="keep" type="text" class="mt-1 w-full" /> <x-text-input wire:model="keep" id="keep" name="keep" type="text" class="mt-1 w-full" />
@error('keep') @error('keep')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror

View File

@ -1,12 +1,12 @@
<x-modal name="create-database"> <x-modal name="create-database">
<form wire:submit.prevent="create" class="p-6" x-data="{user: false, remote: false}"> <form wire:submit="create" class="p-6" x-data="{user: false, remote: false}">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Create Database') }} {{ __('Create Database') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="name" :value="__('Name')" /> <x-input-label for="name" :value="__('Name')" />
<x-text-input wire:model.defer="name" id="name" name="name" type="text" class="mt-1 w-full" /> <x-text-input wire:model="name" id="name" name="name" type="text" class="mt-1 w-full" />
@error('name') @error('name')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -14,7 +14,7 @@
<div class="mt-6"> <div class="mt-6">
<label for="create_user" class="inline-flex items-center"> <label for="create_user" class="inline-flex items-center">
<input id="create_user" wire:model.defer="user" type="checkbox" x-model="user" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="create_user"> <input id="create_user" wire:model="user" type="checkbox" x-model="user" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="create_user">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Create a user for this database') }}</span> <span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Create a user for this database') }}</span>
</label> </label>
</div> </div>
@ -22,7 +22,7 @@
<div x-show="user"> <div x-show="user">
<div class="mt-6"> <div class="mt-6">
<x-input-label for="db-username" :value="__('Username')" /> <x-input-label for="db-username" :value="__('Username')" />
<x-text-input wire:model.defer="username" id="db-username" name="username" type="text" class="mt-1 w-full" /> <x-text-input wire:model="username" id="db-username" name="username" type="text" class="mt-1 w-full" />
@error('username') @error('username')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -30,7 +30,7 @@
<div class="mt-6"> <div class="mt-6">
<x-input-label for="db-password" :value="__('Password')" /> <x-input-label for="db-password" :value="__('Password')" />
<x-text-input wire:model.defer="password" id="db-password" name="password" type="text" class="mt-1 w-full" /> <x-text-input wire:model="password" id="db-password" name="password" type="text" class="mt-1 w-full" />
@error('password') @error('password')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -38,7 +38,7 @@
<div class="mt-6"> <div class="mt-6">
<label for="db-remote" class="inline-flex items-center"> <label for="db-remote" class="inline-flex items-center">
<input id="db-remote" wire:model="remote" type="checkbox" x-model="remote" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="remote"> <input id="db-remote" wire:model.live="remote" type="checkbox" x-model="remote" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="remote">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Enable remote access') }}</span> <span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Enable remote access') }}</span>
</label> </label>
</div> </div>
@ -46,7 +46,7 @@
<div x-show="remote"> <div x-show="remote">
<div class="mt-6"> <div class="mt-6">
<x-input-label for="db-host" :value="__('Host')" /> <x-input-label for="db-host" :value="__('Host')" />
<x-text-input wire:model.defer="host" id="db-host" name="host" type="text" class="mt-1 w-full" /> <x-text-input wire:model="host" id="db-host" name="host" type="text" class="mt-1 w-full" />
<x-input-label for="db-host" :value="__('You might also need to open the database port in Firewall')" class="mt-1"/> <x-input-label for="db-host" :value="__('You might also need to open the database port in Firewall')" class="mt-1"/>
@error('host') @error('host')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />

View File

@ -1,12 +1,12 @@
<x-modal name="create-database-user"> <x-modal name="create-database-user">
<form wire:submit.prevent="create" class="p-6" x-data="{remote: false}"> <form wire:submit="create" class="p-6" x-data="{remote: false}">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Create Database User') }} {{ __('Create Database User') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="user-username" :value="__('Username')" /> <x-input-label for="user-username" :value="__('Username')" />
<x-text-input wire:model.defer="username" id="user-username" name="username" type="text" class="mt-1 w-full" /> <x-text-input wire:model="username" id="user-username" name="username" type="text" class="mt-1 w-full" />
@error('username') @error('username')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -14,7 +14,7 @@
<div class="mt-6"> <div class="mt-6">
<x-input-label for="user-password" :value="__('Password')" /> <x-input-label for="user-password" :value="__('Password')" />
<x-text-input wire:model.defer="password" id="user-password" name="password" type="text" class="mt-1 w-full" /> <x-text-input wire:model="password" id="user-password" name="password" type="text" class="mt-1 w-full" />
@error('password') @error('password')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -22,7 +22,7 @@
<div class="mt-6"> <div class="mt-6">
<label for="user-remote" class="inline-flex items-center"> <label for="user-remote" class="inline-flex items-center">
<input id="user-remote" wire:model="remote" type="checkbox" x-model="remote" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="remote"> <input id="user-remote" wire:model.live="remote" type="checkbox" x-model="remote" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="remote">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Enable remote access') }}</span> <span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Enable remote access') }}</span>
</label> </label>
</div> </div>
@ -30,7 +30,7 @@
<div x-show="remote"> <div x-show="remote">
<div class="mt-6"> <div class="mt-6">
<x-input-label for="user-host" :value="__('Host')" /> <x-input-label for="user-host" :value="__('Host')" />
<x-text-input wire:model.defer="host" id="user-host" name="host" type="text" class="mt-1 w-full" /> <x-text-input wire:model="host" id="user-host" name="host" type="text" class="mt-1 w-full" />
<x-input-label for="user-host" :value="__('You might also need to open the database port in Firewall')" class="mt-1"/> <x-input-label for="user-host" :value="__('You might also need to open the database port in Firewall')" class="mt-1"/>
@error('host') @error('host')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />

View File

@ -1,12 +1,12 @@
<x-modal name="database-user-password"> <x-modal name="database-user-password">
<form wire:submit.prevent="create" class="p-6" x-data="{remote: false}"> <form wire:submit="create" class="p-6" x-data="{remote: false}">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('View Password') }} {{ __('View Password') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label :value="__('Password')" /> <x-input-label :value="__('Password')" />
<x-text-input wire:model.defer="viewPassword" type="text" class="mt-1 w-full" disabled /> <x-text-input wire:model="viewPassword" type="text" class="mt-1 w-full" disabled />
</div> </div>
<div class="mt-6 flex justify-end"> <div class="mt-6 flex justify-end">

View File

@ -1,5 +1,5 @@
<x-modal name="link-database-user"> <x-modal name="link-database-user">
<form wire:submit.prevent="link" class="p-6"> <form wire:submit="link" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Link User to Databases') }} {{ __('Link User to Databases') }}
</h2> </h2>
@ -8,7 +8,7 @@
@foreach($databases as $database) @foreach($databases as $database)
<div class="mb-2"> <div class="mb-2">
<label for="db-{{ $database->id }}" class="inline-flex items-center"> <label for="db-{{ $database->id }}" class="inline-flex items-center">
<input id="db-{{ $database->id }}" wire:model.defer="link" value="{{ $database->name }}" type="checkbox" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="link"> <input id="db-{{ $database->id }}" wire:model="link" value="{{ $database->name }}" type="checkbox" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="link">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ $database->name }}</span> <span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ $database->name }}</span>
</label> </label>
</div> </div>

View File

@ -1,12 +1,12 @@
<x-modal name="restore-backup"> <x-modal name="restore-backup">
<form wire:submit.prevent="restore" class="p-6" x-data="{}"> <form wire:submit="restore" class="p-6" x-data="{}">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Restore Backup') }} {{ __('Restore Backup') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="database" :value="__('Database')" /> <x-input-label for="database" :value="__('Database')" />
<x-select-input wire:model="restoreDatabaseId" id="restoreDatabaseId" name="restoreDatabaseId" class="mt-1 w-full"> <x-select-input wire:model.live="restoreDatabaseId" id="restoreDatabaseId" name="restoreDatabaseId" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option> <option value="" selected disabled>{{ __("Select") }}</option>
@foreach($databases as $db) @foreach($databases as $db)
<option value="{{ $db->id }}" @if($restoreDatabaseId == $db->id) selected @endif>{{ $db->name }}</option> <option value="{{ $db->id }}" @if($restoreDatabaseId == $db->id) selected @endif>{{ $db->name }}</option>

View File

@ -4,14 +4,14 @@
</x-primary-button> </x-primary-button>
<x-modal name="create-rule"> <x-modal name="create-rule">
<form wire:submit.prevent="create" class="p-6"> <form wire:submit="create" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Create new Rule') }} {{ __('Create new Rule') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="type" :value="__('Rule Type')" /> <x-input-label for="type" :value="__('Rule Type')" />
<x-select-input wire:model.defer="type" id="type" name="type" class="mt-1 w-full"> <x-select-input wire:model="type" id="type" name="type" class="mt-1 w-full">
<option value="allow" @if($type === 'allow') selected @endif>{{ __("Allow") }}</option> <option value="allow" @if($type === 'allow') selected @endif>{{ __("Allow") }}</option>
<option value="deny" @if($type === 'deny') selected @endif>{{ __("Deny") }}</option> <option value="deny" @if($type === 'deny') selected @endif>{{ __("Deny") }}</option>
</x-select-input> </x-select-input>
@ -23,7 +23,7 @@
<div class="mt-6 grid grid-cols-1 lg:grid-cols-2 gap-3"> <div class="mt-6 grid grid-cols-1 lg:grid-cols-2 gap-3">
<div> <div>
<x-input-label for="protocol" :value="__('Protocol')" /> <x-input-label for="protocol" :value="__('Protocol')" />
<x-select-input wire:model="protocol" id="protocol" name="protocol" class="mt-1 w-full"> <x-select-input wire:model.live="protocol" id="protocol" name="protocol" class="mt-1 w-full">
@foreach(config('core.firewall_protocols_port') as $key => $value) @foreach(config('core.firewall_protocols_port') as $key => $value)
<option value="{{ $key }}" @if($key === $protocol) selected @endif>{{ $key }}</option> <option value="{{ $key }}" @if($key === $protocol) selected @endif>{{ $key }}</option>
@endforeach @endforeach
@ -35,7 +35,7 @@
<div> <div>
<x-input-label for="port" :value="__('Port')" /> <x-input-label for="port" :value="__('Port')" />
<x-text-input wire:model.defer="port" id="port" name="port" type="text" class="mt-1 w-full" /> <x-text-input wire:model="port" id="port" name="port" type="text" class="mt-1 w-full" />
@error('port') @error('port')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -43,7 +43,7 @@
<div> <div>
<x-input-label for="source" :value="__('Source')" /> <x-input-label for="source" :value="__('Source')" />
<x-text-input wire:model.defer="source" id="source" name="source" type="text" class="mt-1 w-full" /> <x-text-input wire:model="source" id="source" name="source" type="text" class="mt-1 w-full" />
@error('source') @error('source')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -51,7 +51,7 @@
<div> <div>
<x-input-label for="mask" :value="__('Mask')" /> <x-input-label for="mask" :value="__('Mask')" />
<x-text-input wire:model.defer="mask" id="mask" name="mask" type="text" class="mt-1 w-full" /> <x-text-input wire:model="mask" id="mask" name="mask" type="text" class="mt-1 w-full" />
@error('mask') @error('mask')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror

View File

@ -4,14 +4,14 @@
</x-primary-button> </x-primary-button>
<x-modal name="add-channel"> <x-modal name="add-channel">
<form wire:submit.prevent="add" class="p-6"> <form wire:submit="add" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Add new Channel') }} {{ __('Add new Channel') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="provider" value="Provider" /> <x-input-label for="provider" value="Provider" />
<x-select-input wire:model="provider" id="provider" name="provider" class="mt-1 w-full"> <x-select-input wire:model.live="provider" id="provider" name="provider" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option> <option value="" selected disabled>{{ __("Select") }}</option>
@foreach(config('core.notification_channels_providers') as $p) @foreach(config('core.notification_channels_providers') as $p)
@if($p !== 'custom') @if($p !== 'custom')
@ -26,7 +26,7 @@
<div class="mt-6"> <div class="mt-6">
<x-input-label for="label" :value="__('Label')" /> <x-input-label for="label" :value="__('Label')" />
<x-text-input wire:model.defer="label" id="label" name="label" type="text" class="mt-1 w-full" /> <x-text-input wire:model="label" id="label" name="label" type="text" class="mt-1 w-full" />
@error('label') @error('label')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -35,7 +35,7 @@
@if($provider == \App\Enums\NotificationChannel::EMAIL) @if($provider == \App\Enums\NotificationChannel::EMAIL)
<div class="mt-6"> <div class="mt-6">
<x-input-label for="email" :value="__('Email')" /> <x-input-label for="email" :value="__('Email')" />
<x-text-input wire:model.defer="email" id="email" name="email" type="text" class="mt-1 w-full" /> <x-text-input wire:model="email" id="email" name="email" type="text" class="mt-1 w-full" />
@error('email') @error('email')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -45,7 +45,7 @@
@if(in_array($provider, [\App\Enums\NotificationChannel::SLACK, \App\Enums\NotificationChannel::DISCORD])) @if(in_array($provider, [\App\Enums\NotificationChannel::SLACK, \App\Enums\NotificationChannel::DISCORD]))
<div class="mt-6"> <div class="mt-6">
<x-input-label for="webhook_url" :value="__('Webhook URL')" /> <x-input-label for="webhook_url" :value="__('Webhook URL')" />
<x-text-input wire:model.defer="webhook_url" id="webhook_url" name="webhook_url" type="text" class="mt-1 w-full" /> <x-text-input wire:model="webhook_url" id="webhook_url" name="webhook_url" type="text" class="mt-1 w-full" />
@error('webhook_url') @error('webhook_url')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -55,7 +55,7 @@
@if($provider == \App\Enums\NotificationChannel::TELEGRAM) @if($provider == \App\Enums\NotificationChannel::TELEGRAM)
<div class="mt-6"> <div class="mt-6">
<x-input-label for="bot_token" :value="__('Bot Token')" /> <x-input-label for="bot_token" :value="__('Bot Token')" />
<x-text-input wire:model.defer="bot_token" id="bot_token" name="bot_token" type="text" class="mt-1 w-full" /> <x-text-input wire:model="bot_token" id="bot_token" name="bot_token" type="text" class="mt-1 w-full" />
@error('bot_token') @error('bot_token')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror
@ -63,7 +63,7 @@
<div class="mt-6"> <div class="mt-6">
<x-input-label for="chat_id" :value="__('Chat ID')" /> <x-input-label for="chat_id" :value="__('Chat ID')" />
<x-text-input wire:model.defer="chat_id" id="chat_id" name="chat_id" type="text" class="mt-1 w-full" /> <x-text-input wire:model="chat_id" id="chat_id" name="chat_id" type="text" class="mt-1 w-full" />
@error('chat_id') @error('chat_id')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror

View File

@ -1,12 +1,12 @@
<x-modal name="install-extension"> <x-modal name="install-extension">
<form wire:submit.prevent="installExtension" class="p-6"> <form wire:submit="installExtension" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Install Extension') }} {{ __('Install Extension') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="extension" value="Name" /> <x-input-label for="extension" value="Name" />
<x-select-input wire:model.defer="extension" name="extension" class="mt-1 w-full"> <x-select-input wire:model="extension" name="extension" class="mt-1 w-full">
<option value="" selected>{{ __("Select") }}</option> <option value="" selected>{{ __("Select") }}</option>
@foreach(config('core.php_extensions') as $extension) @foreach(config('core.php_extensions') as $extension)
<option value="{{ $extension }}" @if(in_array($extension, $installedExtensions)) disabled @endif> <option value="{{ $extension }}" @if(in_array($extension, $installedExtensions)) disabled @endif>

View File

@ -1,12 +1,12 @@
<x-modal name="update-php-ini"> <x-modal name="update-php-ini">
<form wire:submit.prevent="saveIni" class="p-6"> <form wire:submit="saveIni" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100"> <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Update php.ini') }} {{ __('Update php.ini') }}
</h2> </h2>
<div class="mt-6"> <div class="mt-6">
<x-input-label for="ini" value="php.ini" /> <x-input-label for="ini" value="php.ini" />
<x-textarea wire:model.defer="ini" id="ini" name="ini" class="mt-1 w-full" rows="15" /> <x-textarea wire:model="ini" id="ini" name="ini" class="mt-1 w-full" rows="15" />
@error('ini') @error('ini')
<x-input-error class="mt-2" :messages="$message" /> <x-input-error class="mt-2" :messages="$message" />
@enderror @enderror

Some files were not shown because too many files have changed in this diff Show More