diff --git a/.dockerignore b/.dockerignore
index 0adca0b32..6f3c903f0 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -3,7 +3,6 @@
/public/build
/public/hot
/public/storage
-/storage/*.key
/vendor
.env
.env.backup
@@ -25,3 +24,15 @@ yarn-error.log
.ignition.json
.env.dusk.local
docker/coolify-realtime/node_modules
+
+/storage/*.key
+/storage/app/backups
+/storage/app/ssh/keys
+/storage/app/ssh/mux
+/storage/app/tmp
+/storage/app/debugbar
+/storage/logs
+/storage/pail
+
+
+
diff --git a/.github/workflows/coolify-production-build.yml b/.github/workflows/coolify-production-build.yml
index 5271143ec..d7244fc84 100644
--- a/.github/workflows/coolify-production-build.yml
+++ b/.github/workflows/coolify-production-build.yml
@@ -47,7 +47,7 @@ jobs:
uses: docker/build-push-action@v6
with:
context: .
- file: docker/prod/Dockerfile
+ file: docker/production/Dockerfile
platforms: linux/amd64
push: true
tags: |
@@ -82,7 +82,7 @@ jobs:
uses: docker/build-push-action@v6
with:
context: .
- file: docker/prod/Dockerfile
+ file: docker/production/Dockerfile
platforms: linux/aarch64
push: true
tags: |
diff --git a/.github/workflows/coolify-staging-build.yml b/.github/workflows/coolify-staging-build.yml
index 2c57a36a3..bcb65ecbf 100644
--- a/.github/workflows/coolify-staging-build.yml
+++ b/.github/workflows/coolify-staging-build.yml
@@ -42,7 +42,7 @@ jobs:
uses: docker/build-push-action@v6
with:
context: .
- file: docker/prod/Dockerfile
+ file: docker/production/Dockerfile
platforms: linux/amd64
push: true
tags: |
@@ -75,7 +75,7 @@ jobs:
uses: docker/build-push-action@v6
with:
context: .
- file: docker/prod/Dockerfile
+ file: docker/production/Dockerfile
platforms: linux/aarch64
push: true
tags: |
diff --git a/app/Console/Commands/CleanupUnreachableServers.php b/app/Console/Commands/CleanupUnreachableServers.php
index df0c6b81b..def01b265 100644
--- a/app/Console/Commands/CleanupUnreachableServers.php
+++ b/app/Console/Commands/CleanupUnreachableServers.php
@@ -18,7 +18,6 @@ class CleanupUnreachableServers extends Command
if ($servers->count() > 0) {
foreach ($servers as $server) {
echo "Cleanup unreachable server ($server->id) with name $server->name";
- // send_internal_notification("Server $server->name is unreachable for 7 days. Cleaning up...");
$server->update([
'ip' => '1.2.3.4',
]);
diff --git a/app/Console/Commands/Dev.php b/app/Console/Commands/Dev.php
index 962000d07..257de0a92 100644
--- a/app/Console/Commands/Dev.php
+++ b/app/Console/Commands/Dev.php
@@ -76,7 +76,5 @@ class Dev extends Command
} else {
echo "Instance already initialized.\n";
}
- // Set permissions
- Process::run(['chmod', '-R', 'o+rwx', '.']);
}
}
diff --git a/app/Console/Commands/Emails.php b/app/Console/Commands/Emails.php
index f0e0e7fa0..33ddf3019 100644
--- a/app/Console/Commands/Emails.php
+++ b/app/Console/Commands/Emails.php
@@ -2,14 +2,12 @@
namespace App\Console\Commands;
-use App\Jobs\SendConfirmationForWaitlistJob;
use App\Models\Application;
use App\Models\ApplicationPreview;
use App\Models\ScheduledDatabaseBackup;
use App\Models\Server;
use App\Models\StandalonePostgresql;
use App\Models\Team;
-use App\Models\Waitlist;
use App\Notifications\Application\DeploymentFailed;
use App\Notifications\Application\DeploymentSuccess;
use App\Notifications\Application\StatusChanged;
@@ -64,8 +62,6 @@ class Emails extends Command
'backup-success' => 'Database - Backup Success',
'backup-failed' => 'Database - Backup Failed',
// 'invitation-link' => 'Invitation Link',
- 'waitlist-invitation-link' => 'Waitlist Invitation Link',
- 'waitlist-confirmation' => 'Waitlist Confirmation',
'realusers-before-trial' => 'REAL - Registered Users Before Trial without Subscription',
'realusers-server-lost-connection' => 'REAL - Server Lost Connection',
],
@@ -187,7 +183,7 @@ class Emails extends Command
'team_id' => 0,
]);
}
- // $this->mail = (new BackupSuccess($backup->frequency, $db->name))->toMail();
+ //$this->mail = (new BackupSuccess($backup->frequency, $db->name))->toMail();
$this->sendEmail();
break;
// case 'invitation-link':
@@ -204,23 +200,6 @@ class Emails extends Command
// $this->mail = (new InvitationLink($user))->toMail();
// $this->sendEmail();
// break;
- case 'waitlist-invitation-link':
- $this->mail = new MailMessage;
- $this->mail->view('emails.waitlist-invitation', [
- 'loginLink' => 'https://coolify.io',
- ]);
- $this->mail->subject('Congratulations! You are invited to join Coolify Cloud.');
- $this->sendEmail();
- break;
- case 'waitlist-confirmation':
- $found = Waitlist::where('email', $this->email)->first();
- if ($found) {
- SendConfirmationForWaitlistJob::dispatch($this->email, $found->uuid);
- } else {
- throw new Exception('Waitlist not found');
- }
-
- break;
case 'realusers-before-trial':
$this->mail = new MailMessage;
$this->mail->view('emails.before-trial-conversion');
diff --git a/app/Console/Commands/Horizon.php b/app/Console/Commands/Horizon.php
index 655729ec9..d3e35ca5a 100644
--- a/app/Console/Commands/Horizon.php
+++ b/app/Console/Commands/Horizon.php
@@ -13,7 +13,7 @@ class Horizon extends Command
public function handle()
{
if (config('constants.horizon.is_horizon_enabled')) {
- $this->info('[x]: Horizon is enabled. Starting.');
+ $this->info('Horizon is enabled on this server.');
$this->call('horizon');
exit(0);
} else {
diff --git a/app/Console/Commands/Init.php b/app/Console/Commands/Init.php
index 216262819..cc9bee0a5 100644
--- a/app/Console/Commands/Init.php
+++ b/app/Console/Commands/Init.php
@@ -55,10 +55,8 @@ class Init extends Command
} else {
$this->cleanup_in_progress_application_deployments();
}
- echo "[3]: Cleanup Redis keys.\n";
$this->call('cleanup:redis');
- echo "[4]: Cleanup stucked resources.\n";
$this->call('cleanup:stucked-resources');
try {
@@ -114,7 +112,6 @@ class Init extends Command
private function optimize()
{
- echo "[1]: Optimizing Laravel (caching config, routes, views).\n";
Artisan::call('optimize:clear');
Artisan::call('optimize');
}
@@ -189,7 +186,6 @@ class Init extends Command
}
}
if ($commands->isNotEmpty()) {
- echo "Cleaning up unused networks from coolify proxy\n";
remote_process(command: $commands, type: ActivityTypes::INLINE->value, server: $server, ignore_errors: false);
}
} catch (\Throwable $e) {
@@ -232,15 +228,14 @@ class Init extends Command
$settings = instanceSettings();
$do_not_track = data_get($settings, 'do_not_track');
if ($do_not_track == true) {
- echo "[2]: Skipping sending live signal as do_not_track is enabled\n";
+ echo "Do_not_track is enabled\n";
return;
}
try {
Http::get("https://undead.coolify.io/v4/alive?appId=$id&version=$version");
- echo "[2]: Sending live signal!\n";
} catch (\Throwable $e) {
- echo "[2]: Error in sending live signal: {$e->getMessage()}\n";
+ echo "Error in sending live signal: {$e->getMessage()}\n";
}
}
@@ -253,7 +248,6 @@ class Init extends Command
}
$queued_inprogress_deployments = ApplicationDeploymentQueue::whereIn('status', [ApplicationDeploymentStatus::IN_PROGRESS->value, ApplicationDeploymentStatus::QUEUED->value])->get();
foreach ($queued_inprogress_deployments as $deployment) {
- echo "Cleaning up deployment: {$deployment->id}\n";
$deployment->status = ApplicationDeploymentStatus::FAILED->value;
$deployment->save();
}
diff --git a/app/Console/Commands/Scheduler.php b/app/Console/Commands/Scheduler.php
index 9ee7b06e6..ee64368c3 100644
--- a/app/Console/Commands/Scheduler.php
+++ b/app/Console/Commands/Scheduler.php
@@ -13,7 +13,7 @@ class Scheduler extends Command
public function handle()
{
if (config('constants.horizon.is_scheduler_enabled')) {
- $this->info('[x]: Scheduler is enabled. Starting.');
+ $this->info('Scheduler is enabled on this server.');
$this->call('schedule:work');
exit(0);
} else {
diff --git a/app/Console/Commands/WaitlistInvite.php b/app/Console/Commands/WaitlistInvite.php
deleted file mode 100644
index 2e330068c..000000000
--- a/app/Console/Commands/WaitlistInvite.php
+++ /dev/null
@@ -1,114 +0,0 @@
-option('people');
- for ($i = 0; $i < $people; $i++) {
- $this->main();
- }
- }
-
- private function main()
- {
- if ($this->argument('email')) {
- if ($this->option('only-email')) {
- $this->next_patient = User::whereEmail($this->argument('email'))->first();
- $this->password = Str::password();
- $this->next_patient->update([
- 'password' => Hash::make($this->password),
- 'force_password_reset' => true,
- ]);
- } else {
- $this->next_patient = Waitlist::where('email', $this->argument('email'))->first();
- }
- if (! $this->next_patient) {
- $this->error("{$this->argument('email')} not found in the waitlist.");
-
- return;
- }
- } else {
- $this->next_patient = Waitlist::orderBy('created_at', 'asc')->where('verified', true)->first();
- }
- if ($this->next_patient) {
- if ($this->option('only-email')) {
- $this->send_email();
-
- return;
- }
- $this->register_user();
- $this->remove_from_waitlist();
- $this->send_email();
- } else {
- $this->info('No verified user found in the waitlist. 👀');
- }
- }
-
- private function register_user()
- {
- $already_registered = User::whereEmail($this->next_patient->email)->first();
- if (! $already_registered) {
- $this->password = Str::password();
- User::create([
- 'name' => str($this->next_patient->email)->before('@'),
- 'email' => $this->next_patient->email,
- 'password' => Hash::make($this->password),
- 'force_password_reset' => true,
- ]);
- $this->info("User registered ({$this->next_patient->email}) successfully. 🎉");
- } else {
- throw new \Exception('User already registered');
- }
- }
-
- private function remove_from_waitlist()
- {
- $this->next_patient->delete();
- $this->info('User removed from waitlist successfully.');
- }
-
- private function send_email()
- {
- $token = Crypt::encryptString("{$this->next_patient->email}@@@$this->password");
- $loginLink = route('auth.link', ['token' => $token]);
- $mail = new MailMessage;
- $mail->view('emails.waitlist-invitation', [
- 'loginLink' => $loginLink,
- ]);
- $mail->subject('Congratulations! You are invited to join Coolify Cloud.');
- send_user_an_email($mail, $this->next_patient->email);
- $this->info('Email sent successfully. 📧');
- }
-}
diff --git a/app/Console/Commands/Weird.php b/app/Console/Commands/Weird.php
deleted file mode 100644
index e471a5f96..000000000
--- a/app/Console/Commands/Weird.php
+++ /dev/null
@@ -1,58 +0,0 @@
-error('This command can only be run in development mode');
-
- return;
- }
- $run = $this->option('run');
- if ($run) {
- $servers = Server::all();
- foreach ($servers as $server) {
- ServerCheck::dispatch($server);
- }
-
- return;
- }
- $number = $this->option('number');
- for ($i = 0; $i < $number; $i++) {
- $uuid = Str::uuid();
- $server = Server::create([
- 'name' => 'localhost-'.$uuid,
- 'description' => 'This is a test docker container in development mode',
- 'ip' => 'coolify-testing-host',
- 'team_id' => 0,
- 'private_key_id' => 1,
- 'proxy' => [
- 'type' => ProxyTypes::NONE->value,
- 'status' => ProxyStatus::EXITED->value,
- ],
- ]);
- $server->settings->update([
- 'is_usable' => true,
- 'is_reachable' => true,
- ]);
- }
- } catch (\Exception $e) {
- $this->error($e->getMessage());
- }
- }
-}
diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php
index 9f1e4eeb8..522683efa 100644
--- a/app/Http/Controllers/Controller.php
+++ b/app/Http/Controllers/Controller.php
@@ -42,15 +42,13 @@ class Controller extends BaseController
public function email_verify(EmailVerificationRequest $request)
{
$request->fulfill();
- $name = request()->user()?->name;
- // send_internal_notification("User {$name} verified their email address.");
return redirect(RouteServiceProvider::HOME);
}
public function forgot_password(Request $request)
{
- if (is_transactional_emails_active()) {
+ if (is_transactional_emails_enabled()) {
$arrayOfRequest = $request->only(Fortify::email());
$request->merge([
'email' => Str::lower($arrayOfRequest['email']),
diff --git a/app/Http/Controllers/Webhook/Waitlist.php b/app/Http/Controllers/Webhook/Waitlist.php
deleted file mode 100644
index dec8ca72d..000000000
--- a/app/Http/Controllers/Webhook/Waitlist.php
+++ /dev/null
@@ -1,63 +0,0 @@
-get('email');
- $confirmation_code = request()->get('confirmation_code');
- try {
- $found = ModelsWaitlist::where('uuid', $confirmation_code)->where('email', $email)->first();
- if ($found) {
- if (! $found->verified) {
- if ($found->created_at > now()->subMinutes(config('constants.waitlist.expiration'))) {
- $found->verified = true;
- $found->save();
- send_internal_notification('Waitlist confirmed: '.$email);
-
- return 'Thank you for confirming your email address. We will notify you when you are next in line.';
- } else {
- $found->delete();
- send_internal_notification('Waitlist expired: '.$email);
-
- return 'Your confirmation code has expired. Please sign up again.';
- }
- }
- }
-
- return redirect()->route('dashboard');
- } catch (Exception $e) {
- send_internal_notification('Waitlist confirmation failed: '.$e->getMessage());
-
- return redirect()->route('dashboard');
- }
- }
-
- public function cancel(Request $request)
- {
- $email = request()->get('email');
- $confirmation_code = request()->get('confirmation_code');
- try {
- $found = ModelsWaitlist::where('uuid', $confirmation_code)->where('email', $email)->first();
- if ($found && ! $found->verified) {
- $found->delete();
- send_internal_notification('Waitlist cancelled: '.$email);
-
- return 'Your email address has been removed from the waitlist.';
- }
-
- return redirect()->route('dashboard');
- } catch (Exception $e) {
- send_internal_notification('Waitlist cancellation failed: '.$e->getMessage());
-
- return redirect()->route('dashboard');
- }
- }
-}
diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php
index 04e71c4e3..6b677fa0e 100644
--- a/app/Jobs/ApplicationDeploymentJob.php
+++ b/app/Jobs/ApplicationDeploymentJob.php
@@ -2409,7 +2409,7 @@ COPY ./nginx.conf /etc/nginx/conf.d/default.conf");
if (! $this->only_this_server) {
$this->deploy_to_additional_destinations();
}
- //$this->application->environment->project->team?->notify(new DeploymentSuccess($this->application, $this->deployment_uuid, $this->preview));
+ $this->application->environment->project->team?->notify(new DeploymentSuccess($this->application, $this->deployment_uuid, $this->preview));
}
}
diff --git a/app/Jobs/CheckResaleLicenseJob.php b/app/Jobs/CheckResaleLicenseJob.php
deleted file mode 100644
index 7479867b6..000000000
--- a/app/Jobs/CheckResaleLicenseJob.php
+++ /dev/null
@@ -1,28 +0,0 @@
-getMessage());
- throw $e;
- }
- }
-}
diff --git a/app/Jobs/DatabaseBackupJob.php b/app/Jobs/DatabaseBackupJob.php
index ee702202f..06aec5e49 100644
--- a/app/Jobs/DatabaseBackupJob.php
+++ b/app/Jobs/DatabaseBackupJob.php
@@ -306,7 +306,9 @@ class DatabaseBackupJob implements ShouldBeEncrypted, ShouldQueue
if ($this->backup->save_s3) {
$this->upload_to_s3();
}
- //$this->team?->notify(new BackupSuccess($this->backup, $this->database, $database));
+
+ $this->team->notify(new BackupSuccess($this->backup, $this->database, $database));
+
$this->backup_log->update([
'status' => 'success',
'message' => $this->backup_output,
diff --git a/app/Jobs/DockerCleanupJob.php b/app/Jobs/DockerCleanupJob.php
index 80542e03b..103c137b9 100644
--- a/app/Jobs/DockerCleanupJob.php
+++ b/app/Jobs/DockerCleanupJob.php
@@ -4,7 +4,8 @@ namespace App\Jobs;
use App\Actions\Server\CleanupDocker;
use App\Models\Server;
-use App\Notifications\Server\DockerCleanup;
+use App\Notifications\Server\DockerCleanupFailed;
+use App\Notifications\Server\DockerCleanupSuccess;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
use Illuminate\Contracts\Queue\ShouldQueue;
@@ -12,7 +13,6 @@ use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Queue\SerializesModels;
-use Illuminate\Support\Facades\Log;
class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue
{
@@ -38,35 +38,36 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue
return;
}
- if ($this->manualCleanup || $this->server->settings->force_docker_cleanup) {
- Log::info('DockerCleanupJob '.($this->manualCleanup ? 'manual' : 'force').' cleanup on '.$this->server->name);
- CleanupDocker::run(server: $this->server);
-
- return;
- }
-
$this->usageBefore = $this->server->getDiskUsage();
- if (str($this->usageBefore)->isEmpty() || $this->usageBefore === null || $this->usageBefore === 0) {
- Log::info('DockerCleanupJob force cleanup on '.$this->server->name);
+
+ if ($this->manualCleanup || $this->server->settings->force_docker_cleanup) {
CleanupDocker::run(server: $this->server);
+ $usageAfter = $this->server->getDiskUsage();
+ $this->server->team?->notify(new DockerCleanupSuccess($this->server, ($this->manualCleanup ? 'Manual' : 'Forced').' Docker cleanup job executed successfully. Disk usage before: '.$this->usageBefore.'%, Disk usage after: '.$usageAfter.'%.'));
return;
}
+
+ if (str($this->usageBefore)->isEmpty() || $this->usageBefore === null || $this->usageBefore === 0) {
+ CleanupDocker::run(server: $this->server);
+ $this->server->team?->notify(new DockerCleanupSuccess($this->server, 'Docker cleanup job executed successfully, but no disk usage could be determined.'));
+ }
+
if ($this->usageBefore >= $this->server->settings->docker_cleanup_threshold) {
CleanupDocker::run(server: $this->server);
$usageAfter = $this->server->getDiskUsage();
- if ($usageAfter < $this->usageBefore) {
- $this->server->team?->notify(new DockerCleanup($this->server, 'Saved '.($this->usageBefore - $usageAfter).'% disk space.'));
- Log::info('DockerCleanupJob done: Saved '.($this->usageBefore - $usageAfter).'% disk space on '.$this->server->name);
+ $diskSaved = $this->usageBefore - $usageAfter;
+
+ if ($diskSaved > 0) {
+ $this->server->team?->notify(new DockerCleanupSuccess($this->server, 'Saved '.$diskSaved.'% disk space. Disk usage before: '.$this->usageBefore.'%, Disk usage after: '.$usageAfter.'%.'));
} else {
- Log::info('DockerCleanupJob failed to save disk space on '.$this->server->name);
+ $this->server->team?->notify(new DockerCleanupSuccess($this->server, 'Docker cleanup job executed successfully, but no disk space was saved. Disk usage before: '.$this->usageBefore.'%, Disk usage after: '.$usageAfter.'%.'));
}
} else {
- Log::info('No need to clean up '.$this->server->name);
+ $this->server->team?->notify(new DockerCleanupSuccess($this->server, 'No cleanup needed for '.$this->server->name));
}
} catch (\Throwable $e) {
- CleanupDocker::run(server: $this->server);
- Log::error('DockerCleanupJob failed: '.$e->getMessage());
+ $this->server->team?->notify(new DockerCleanupFailed($this->server, 'Docker cleanup job failed with the following error: '.$e->getMessage()));
throw $e;
}
}
diff --git a/app/Jobs/ScheduledTaskJob.php b/app/Jobs/ScheduledTaskJob.php
index 00575e187..90a10f3e9 100644
--- a/app/Jobs/ScheduledTaskJob.php
+++ b/app/Jobs/ScheduledTaskJob.php
@@ -10,6 +10,7 @@ use App\Models\Server;
use App\Models\Service;
use App\Models\Team;
use App\Notifications\ScheduledTask\TaskFailed;
+use App\Notifications\ScheduledTask\TaskSuccess;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
@@ -111,6 +112,8 @@ class ScheduledTaskJob implements ShouldQueue
'message' => $this->task_output,
]);
+ $this->team?->notify(new TaskSuccess($this->task, $this->task_output));
+
return;
}
}
@@ -125,7 +128,6 @@ class ScheduledTaskJob implements ShouldQueue
]);
}
$this->team?->notify(new TaskFailed($this->task, $e->getMessage()));
- // send_internal_notification('ScheduledTaskJob failed with: ' . $e->getMessage());
throw $e;
} finally {
ScheduledTaskDone::dispatch($this->team->id);
diff --git a/app/Jobs/SendConfirmationForWaitlistJob.php b/app/Jobs/SendConfirmationForWaitlistJob.php
deleted file mode 100755
index 7af8205fc..000000000
--- a/app/Jobs/SendConfirmationForWaitlistJob.php
+++ /dev/null
@@ -1,37 +0,0 @@
-email.'&confirmation_code='.$this->uuid;
- $cancel_url = base_url().'/webhooks/waitlist/cancel?email='.$this->email.'&confirmation_code='.$this->uuid;
- $mail->view('emails.waitlist-confirmation',
- [
- 'confirmation_url' => $confirmation_url,
- 'cancel_url' => $cancel_url,
- ]);
- $mail->subject('You are on the waitlist!');
- send_user_an_email($mail, $this->email);
- } catch (\Throwable $e) {
- send_internal_notification("SendConfirmationForWaitlistJob failed for {$this->email} with error: ".$e->getMessage());
- throw $e;
- }
- }
-}
diff --git a/app/Livewire/Notifications/Discord.php b/app/Livewire/Notifications/Discord.php
index 7a177a227..57007813e 100644
--- a/app/Livewire/Notifications/Discord.php
+++ b/app/Livewire/Notifications/Discord.php
@@ -2,6 +2,7 @@
namespace App\Livewire\Notifications;
+use App\Models\DiscordNotificationSettings;
use App\Models\Team;
use App\Notifications\Test;
use Livewire\Attributes\Validate;
@@ -11,6 +12,8 @@ class Discord extends Component
{
public Team $team;
+ public DiscordNotificationSettings $settings;
+
#[Validate(['boolean'])]
public bool $discordEnabled = false;
@@ -18,27 +21,46 @@ class Discord extends Component
public ?string $discordWebhookUrl = null;
#[Validate(['boolean'])]
- public bool $discordNotificationsTest = false;
+ public bool $deploymentSuccessDiscordNotifications = false;
#[Validate(['boolean'])]
- public bool $discordNotificationsDeployments = false;
+ public bool $deploymentFailureDiscordNotifications = true;
#[Validate(['boolean'])]
- public bool $discordNotificationsStatusChanges = false;
+ public bool $statusChangeDiscordNotifications = false;
#[Validate(['boolean'])]
- public bool $discordNotificationsDatabaseBackups = false;
+ public bool $backupSuccessDiscordNotifications = false;
#[Validate(['boolean'])]
- public bool $discordNotificationsScheduledTasks = false;
+ public bool $backupFailureDiscordNotifications = true;
#[Validate(['boolean'])]
- public bool $discordNotificationsServerDiskUsage = false;
+ public bool $scheduledTaskSuccessDiscordNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $scheduledTaskFailureDiscordNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $dockerCleanupSuccessDiscordNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $dockerCleanupFailureDiscordNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $serverDiskUsageDiscordNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $serverReachableDiscordNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $serverUnreachableDiscordNotifications = true;
public function mount()
{
try {
$this->team = auth()->user()->currentTeam();
+ $this->settings = $this->team->discordNotificationSettings;
$this->syncData();
} catch (\Throwable $e) {
return handleError($e, $this);
@@ -49,25 +71,40 @@ class Discord extends Component
{
if ($toModel) {
$this->validate();
- $this->team->discord_enabled = $this->discordEnabled;
- $this->team->discord_webhook_url = $this->discordWebhookUrl;
- $this->team->discord_notifications_test = $this->discordNotificationsTest;
- $this->team->discord_notifications_deployments = $this->discordNotificationsDeployments;
- $this->team->discord_notifications_status_changes = $this->discordNotificationsStatusChanges;
- $this->team->discord_notifications_database_backups = $this->discordNotificationsDatabaseBackups;
- $this->team->discord_notifications_scheduled_tasks = $this->discordNotificationsScheduledTasks;
- $this->team->discord_notifications_server_disk_usage = $this->discordNotificationsServerDiskUsage;
- $this->team->save();
+ $this->settings->discord_enabled = $this->discordEnabled;
+ $this->settings->discord_webhook_url = $this->discordWebhookUrl;
+
+ $this->settings->deployment_success_discord_notifications = $this->deploymentSuccessDiscordNotifications;
+ $this->settings->deployment_failure_discord_notifications = $this->deploymentFailureDiscordNotifications;
+ $this->settings->status_change_discord_notifications = $this->statusChangeDiscordNotifications;
+ $this->settings->backup_success_discord_notifications = $this->backupSuccessDiscordNotifications;
+ $this->settings->backup_failure_discord_notifications = $this->backupFailureDiscordNotifications;
+ $this->settings->scheduled_task_success_discord_notifications = $this->scheduledTaskSuccessDiscordNotifications;
+ $this->settings->scheduled_task_failure_discord_notifications = $this->scheduledTaskFailureDiscordNotifications;
+ $this->settings->docker_cleanup_success_discord_notifications = $this->dockerCleanupSuccessDiscordNotifications;
+ $this->settings->docker_cleanup_failure_discord_notifications = $this->dockerCleanupFailureDiscordNotifications;
+ $this->settings->server_disk_usage_discord_notifications = $this->serverDiskUsageDiscordNotifications;
+ $this->settings->server_reachable_discord_notifications = $this->serverReachableDiscordNotifications;
+ $this->settings->server_unreachable_discord_notifications = $this->serverUnreachableDiscordNotifications;
+
+ $this->settings->save();
refreshSession();
} else {
- $this->discordEnabled = $this->team->discord_enabled;
- $this->discordWebhookUrl = $this->team->discord_webhook_url;
- $this->discordNotificationsTest = $this->team->discord_notifications_test;
- $this->discordNotificationsDeployments = $this->team->discord_notifications_deployments;
- $this->discordNotificationsStatusChanges = $this->team->discord_notifications_status_changes;
- $this->discordNotificationsDatabaseBackups = $this->team->discord_notifications_database_backups;
- $this->discordNotificationsScheduledTasks = $this->team->discord_notifications_scheduled_tasks;
- $this->discordNotificationsServerDiskUsage = $this->team->discord_notifications_server_disk_usage;
+ $this->discordEnabled = $this->settings->discord_enabled;
+ $this->discordWebhookUrl = $this->settings->discord_webhook_url;
+
+ $this->deploymentSuccessDiscordNotifications = $this->settings->deployment_success_discord_notifications;
+ $this->deploymentFailureDiscordNotifications = $this->settings->deployment_failure_discord_notifications;
+ $this->statusChangeDiscordNotifications = $this->settings->status_change_discord_notifications;
+ $this->backupSuccessDiscordNotifications = $this->settings->backup_success_discord_notifications;
+ $this->backupFailureDiscordNotifications = $this->settings->backup_failure_discord_notifications;
+ $this->scheduledTaskSuccessDiscordNotifications = $this->settings->scheduled_task_success_discord_notifications;
+ $this->scheduledTaskFailureDiscordNotifications = $this->settings->scheduled_task_failure_discord_notifications;
+ $this->dockerCleanupSuccessDiscordNotifications = $this->settings->docker_cleanup_success_discord_notifications;
+ $this->dockerCleanupFailureDiscordNotifications = $this->settings->docker_cleanup_failure_discord_notifications;
+ $this->serverDiskUsageDiscordNotifications = $this->settings->server_disk_usage_discord_notifications;
+ $this->serverReachableDiscordNotifications = $this->settings->server_reachable_discord_notifications;
+ $this->serverUnreachableDiscordNotifications = $this->settings->server_unreachable_discord_notifications;
}
}
@@ -117,7 +154,7 @@ class Discord extends Component
public function sendTestNotification()
{
try {
- $this->team->notify(new Test);
+ $this->team->notify(new Test(channel: 'discord'));
$this->dispatch('success', 'Test notification sent.');
} catch (\Throwable $e) {
return handleError($e, $this);
diff --git a/app/Livewire/Notifications/Email.php b/app/Livewire/Notifications/Email.php
index ab3768643..dc2a95e84 100644
--- a/app/Livewire/Notifications/Email.php
+++ b/app/Livewire/Notifications/Email.php
@@ -2,6 +2,7 @@
namespace App\Livewire\Notifications;
+use App\Models\EmailNotificationSettings;
use App\Models\Team;
use App\Notifications\Test;
use Illuminate\Support\Facades\RateLimiter;
@@ -11,17 +12,18 @@ use Livewire\Component;
class Email extends Component
{
+ protected $listeners = ['refresh' => '$refresh'];
+
public Team $team;
+ public EmailNotificationSettings $settings;
+
#[Locked]
public string $emails;
#[Validate(['boolean'])]
public bool $smtpEnabled = false;
- #[Validate(['boolean'])]
- public bool $useInstanceEmailSettings = false;
-
#[Validate(['nullable', 'email'])]
public ?string $smtpFromAddress = null;
@@ -34,11 +36,11 @@ class Email extends Component
#[Validate(['nullable', 'string'])]
public ?string $smtpHost = null;
- #[Validate(['nullable', 'numeric'])]
+ #[Validate(['nullable', 'numeric', 'min:1', 'max:65535'])]
public ?int $smtpPort = null;
#[Validate(['nullable', 'string', 'in:tls,ssl,none'])]
- public ?string $smtpEncryption = null;
+ public ?string $smtpEncryption = 'tls';
#[Validate(['nullable', 'string'])]
public ?string $smtpUsername = null;
@@ -50,29 +52,50 @@ class Email extends Component
public ?int $smtpTimeout = null;
#[Validate(['boolean'])]
- public bool $smtpNotificationsTest = false;
-
- #[Validate(['boolean'])]
- public bool $smtpNotificationsDeployments = false;
-
- #[Validate(['boolean'])]
- public bool $smtpNotificationsStatusChanges = false;
-
- #[Validate(['boolean'])]
- public bool $smtpNotificationsDatabaseBackups = false;
-
- #[Validate(['boolean'])]
- public bool $smtpNotificationsScheduledTasks = false;
-
- #[Validate(['boolean'])]
- public bool $smtpNotificationsServerDiskUsage = false;
-
- #[Validate(['boolean'])]
- public bool $resendEnabled;
+ public bool $resendEnabled = false;
#[Validate(['nullable', 'string'])]
public ?string $resendApiKey = null;
+ #[Validate(['boolean'])]
+ public bool $useInstanceEmailSettings = false;
+
+ #[Validate(['boolean'])]
+ public bool $deploymentSuccessEmailNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $deploymentFailureEmailNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $statusChangeEmailNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $backupSuccessEmailNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $backupFailureEmailNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $scheduledTaskSuccessEmailNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $scheduledTaskFailureEmailNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $dockerCleanupSuccessEmailNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $dockerCleanupFailureEmailNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $serverDiskUsageEmailNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $serverReachableEmailNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $serverUnreachableEmailNotifications = true;
+
#[Validate(['nullable', 'email'])]
public ?string $testEmailAddress = null;
@@ -81,7 +104,9 @@ class Email extends Component
try {
$this->team = auth()->user()->currentTeam();
$this->emails = auth()->user()->email;
+ $this->settings = $this->team->emailNotificationSettings;
$this->syncData();
+ $this->testEmailAddress = auth()->user()->email;
} catch (\Throwable $e) {
return handleError($e, $this);
}
@@ -91,47 +116,191 @@ class Email extends Component
{
if ($toModel) {
$this->validate();
- $this->team->smtp_enabled = $this->smtpEnabled;
- $this->team->smtp_from_address = $this->smtpFromAddress;
- $this->team->smtp_from_name = $this->smtpFromName;
- $this->team->smtp_host = $this->smtpHost;
- $this->team->smtp_port = $this->smtpPort;
- $this->team->smtp_encryption = $this->smtpEncryption;
- $this->team->smtp_username = $this->smtpUsername;
- $this->team->smtp_password = $this->smtpPassword;
- $this->team->smtp_timeout = $this->smtpTimeout;
- $this->team->smtp_recipients = $this->smtpRecipients;
- $this->team->smtp_notifications_test = $this->smtpNotificationsTest;
- $this->team->smtp_notifications_deployments = $this->smtpNotificationsDeployments;
- $this->team->smtp_notifications_status_changes = $this->smtpNotificationsStatusChanges;
- $this->team->smtp_notifications_database_backups = $this->smtpNotificationsDatabaseBackups;
- $this->team->smtp_notifications_scheduled_tasks = $this->smtpNotificationsScheduledTasks;
- $this->team->smtp_notifications_server_disk_usage = $this->smtpNotificationsServerDiskUsage;
- $this->team->use_instance_email_settings = $this->useInstanceEmailSettings;
- $this->team->resend_enabled = $this->resendEnabled;
- $this->team->resend_api_key = $this->resendApiKey;
- $this->team->save();
- refreshSession();
+ $this->settings->smtp_enabled = $this->smtpEnabled;
+ $this->settings->smtp_from_address = $this->smtpFromAddress;
+ $this->settings->smtp_from_name = $this->smtpFromName;
+ $this->settings->smtp_recipients = $this->smtpRecipients;
+ $this->settings->smtp_host = $this->smtpHost;
+ $this->settings->smtp_port = $this->smtpPort;
+ $this->settings->smtp_encryption = $this->smtpEncryption;
+ $this->settings->smtp_username = $this->smtpUsername;
+ $this->settings->smtp_password = $this->smtpPassword;
+ $this->settings->smtp_timeout = $this->smtpTimeout;
+
+ $this->settings->resend_enabled = $this->resendEnabled;
+ $this->settings->resend_api_key = $this->resendApiKey;
+
+ $this->settings->use_instance_email_settings = $this->useInstanceEmailSettings;
+
+ $this->settings->deployment_success_email_notifications = $this->deploymentSuccessEmailNotifications;
+ $this->settings->deployment_failure_email_notifications = $this->deploymentFailureEmailNotifications;
+ $this->settings->status_change_email_notifications = $this->statusChangeEmailNotifications;
+ $this->settings->backup_success_email_notifications = $this->backupSuccessEmailNotifications;
+ $this->settings->backup_failure_email_notifications = $this->backupFailureEmailNotifications;
+ $this->settings->scheduled_task_success_email_notifications = $this->scheduledTaskSuccessEmailNotifications;
+ $this->settings->scheduled_task_failure_email_notifications = $this->scheduledTaskFailureEmailNotifications;
+ $this->settings->docker_cleanup_success_email_notifications = $this->dockerCleanupSuccessEmailNotifications;
+ $this->settings->docker_cleanup_failure_email_notifications = $this->dockerCleanupFailureEmailNotifications;
+ $this->settings->server_disk_usage_email_notifications = $this->serverDiskUsageEmailNotifications;
+ $this->settings->server_reachable_email_notifications = $this->serverReachableEmailNotifications;
+ $this->settings->server_unreachable_email_notifications = $this->serverUnreachableEmailNotifications;
+ $this->settings->save();
+
} else {
- $this->smtpEnabled = $this->team->smtp_enabled;
- $this->smtpFromAddress = $this->team->smtp_from_address;
- $this->smtpFromName = $this->team->smtp_from_name;
- $this->smtpHost = $this->team->smtp_host;
- $this->smtpPort = $this->team->smtp_port;
- $this->smtpEncryption = $this->team->smtp_encryption;
- $this->smtpUsername = $this->team->smtp_username;
- $this->smtpPassword = $this->team->smtp_password;
- $this->smtpTimeout = $this->team->smtp_timeout;
- $this->smtpRecipients = $this->team->smtp_recipients;
- $this->smtpNotificationsTest = $this->team->smtp_notifications_test;
- $this->smtpNotificationsDeployments = $this->team->smtp_notifications_deployments;
- $this->smtpNotificationsStatusChanges = $this->team->smtp_notifications_status_changes;
- $this->smtpNotificationsDatabaseBackups = $this->team->smtp_notifications_database_backups;
- $this->smtpNotificationsScheduledTasks = $this->team->smtp_notifications_scheduled_tasks;
- $this->smtpNotificationsServerDiskUsage = $this->team->smtp_notifications_server_disk_usage;
- $this->useInstanceEmailSettings = $this->team->use_instance_email_settings;
- $this->resendEnabled = $this->team->resend_enabled;
- $this->resendApiKey = $this->team->resend_api_key;
+ $this->smtpEnabled = $this->settings->smtp_enabled;
+ $this->smtpFromAddress = $this->settings->smtp_from_address;
+ $this->smtpFromName = $this->settings->smtp_from_name;
+ $this->smtpRecipients = $this->settings->smtp_recipients;
+ $this->smtpHost = $this->settings->smtp_host;
+ $this->smtpPort = $this->settings->smtp_port;
+ $this->smtpEncryption = $this->settings->smtp_encryption;
+ $this->smtpUsername = $this->settings->smtp_username;
+ $this->smtpPassword = $this->settings->smtp_password;
+ $this->smtpTimeout = $this->settings->smtp_timeout;
+
+ $this->resendEnabled = $this->settings->resend_enabled;
+ $this->resendApiKey = $this->settings->resend_api_key;
+
+ $this->useInstanceEmailSettings = $this->settings->use_instance_email_settings;
+
+ $this->deploymentSuccessEmailNotifications = $this->settings->deployment_success_email_notifications;
+ $this->deploymentFailureEmailNotifications = $this->settings->deployment_failure_email_notifications;
+ $this->statusChangeEmailNotifications = $this->settings->status_change_email_notifications;
+ $this->backupSuccessEmailNotifications = $this->settings->backup_success_email_notifications;
+ $this->backupFailureEmailNotifications = $this->settings->backup_failure_email_notifications;
+ $this->scheduledTaskSuccessEmailNotifications = $this->settings->scheduled_task_success_email_notifications;
+ $this->scheduledTaskFailureEmailNotifications = $this->settings->scheduled_task_failure_email_notifications;
+ $this->dockerCleanupSuccessEmailNotifications = $this->settings->docker_cleanup_success_email_notifications;
+ $this->dockerCleanupFailureEmailNotifications = $this->settings->docker_cleanup_failure_email_notifications;
+ $this->serverDiskUsageEmailNotifications = $this->settings->server_disk_usage_email_notifications;
+ $this->serverReachableEmailNotifications = $this->settings->server_reachable_email_notifications;
+ $this->serverUnreachableEmailNotifications = $this->settings->server_unreachable_email_notifications;
+ }
+ }
+
+ public function submit()
+ {
+ try {
+ $this->resetErrorBag();
+ $this->saveModel();
+ } catch (\Throwable $e) {
+ return handleError($e, $this);
+ }
+ }
+
+ public function saveModel()
+ {
+ $this->syncData(true);
+ $this->dispatch('success', 'Email notifications settings updated.');
+ }
+
+ public function instantSave(?string $type = null)
+ {
+ try {
+ $this->resetErrorBag();
+
+ if ($type === 'SMTP') {
+ $this->submitSmtp();
+ } elseif ($type === 'Resend') {
+ $this->submitResend();
+ } else {
+ $this->smtpEnabled = false;
+ $this->resendEnabled = false;
+ $this->saveModel();
+
+ return;
+ }
+ } catch (\Throwable $e) {
+ if ($type === 'SMTP') {
+ $this->smtpEnabled = false;
+ } elseif ($type === 'Resend') {
+ $this->resendEnabled = false;
+ }
+
+ return handleError($e, $this);
+ } finally {
+ $this->dispatch('refresh');
+ }
+ }
+
+ public function submitSmtp()
+ {
+ try {
+ $this->resetErrorBag();
+ $this->validate([
+ 'smtpEnabled' => 'boolean',
+ 'smtpFromAddress' => 'required|email',
+ 'smtpFromName' => 'required|string',
+ 'smtpHost' => 'required|string',
+ 'smtpPort' => 'required|numeric',
+ 'smtpEncryption' => 'required|string|in:tls,ssl,none',
+ 'smtpUsername' => 'nullable|string',
+ 'smtpPassword' => 'nullable|string',
+ 'smtpTimeout' => 'nullable|numeric',
+ ], [
+ 'smtpFromAddress.required' => 'From Address is required.',
+ 'smtpFromAddress.email' => 'Please enter a valid email address.',
+ 'smtpFromName.required' => 'From Name is required.',
+ 'smtpHost.required' => 'SMTP Host is required.',
+ 'smtpPort.required' => 'SMTP Port is required.',
+ 'smtpPort.numeric' => 'SMTP Port must be a number.',
+ 'smtpEncryption.required' => 'Encryption type is required.',
+ ]);
+
+ $this->settings->resend_enabled = false;
+ $this->settings->use_instance_email_settings = false;
+ $this->resendEnabled = false;
+ $this->useInstanceEmailSettings = false;
+
+ $this->settings->smtp_enabled = $this->smtpEnabled;
+ $this->settings->smtp_from_address = $this->smtpFromAddress;
+ $this->settings->smtp_from_name = $this->smtpFromName;
+ $this->settings->smtp_host = $this->smtpHost;
+ $this->settings->smtp_port = $this->smtpPort;
+ $this->settings->smtp_encryption = $this->smtpEncryption;
+ $this->settings->smtp_username = $this->smtpUsername;
+ $this->settings->smtp_password = $this->smtpPassword;
+ $this->settings->smtp_timeout = $this->smtpTimeout;
+
+ $this->settings->save();
+ $this->dispatch('success', 'SMTP settings updated.');
+ } catch (\Throwable $e) {
+ $this->smtpEnabled = false;
+
+ return handleError($e);
+ }
+ }
+
+ public function submitResend()
+ {
+ try {
+ $this->resetErrorBag();
+ $this->validate([
+ 'resendEnabled' => 'boolean',
+ 'resendApiKey' => 'required|string',
+ 'smtpFromAddress' => 'required|email',
+ 'smtpFromName' => 'required|string',
+ ], [
+ 'resendApiKey.required' => 'Resend API Key is required.',
+ 'smtpFromAddress.required' => 'From Address is required.',
+ 'smtpFromAddress.email' => 'Please enter a valid email address.',
+ 'smtpFromName.required' => 'From Name is required.',
+ ]);
+
+ $this->settings->smtp_enabled = false;
+ $this->settings->use_instance_email_settings = false;
+ $this->smtpEnabled = false;
+ $this->useInstanceEmailSettings = false;
+
+ $this->settings->resend_enabled = $this->resendEnabled;
+ $this->settings->resend_api_key = $this->resendApiKey;
+ $this->settings->smtp_from_address = $this->smtpFromAddress;
+ $this->settings->smtp_from_name = $this->smtpFromName;
+
+ $this->settings->save();
+ $this->dispatch('success', 'Resend settings updated.');
+ } catch (\Throwable $e) {
+ return handleError($e, $this);
}
}
@@ -149,7 +318,7 @@ class Email extends Component
'test-email:'.$this->team->id,
$perMinute = 0,
function () {
- $this->team?->notify(new Test($this->testEmailAddress));
+ $this->team?->notify(new Test($this->testEmailAddress, 'email'));
$this->dispatch('success', 'Test Email sent.');
},
$decaySeconds = 10,
@@ -163,70 +332,6 @@ class Email extends Component
}
}
- public function instantSaveInstance()
- {
- try {
- $this->smtpEnabled = false;
- $this->resendEnabled = false;
- $this->saveModel();
- } catch (\Throwable $e) {
- return handleError($e, $this);
- }
- }
-
- public function instantSaveSmtpEnabled()
- {
- try {
- $this->validate([
- 'smtpHost' => 'required',
- 'smtpPort' => 'required|numeric',
- ], [
- 'smtpHost.required' => 'SMTP Host is required.',
- 'smtpPort.required' => 'SMTP Port is required.',
- ]);
- $this->resendEnabled = false;
- $this->saveModel();
- } catch (\Throwable $e) {
- $this->smtpEnabled = false;
-
- return handleError($e, $this);
- }
- }
-
- public function instantSaveResend()
- {
- try {
- $this->validate([
- 'resendApiKey' => 'required',
- ], [
- 'resendApiKey.required' => 'Resend API Key is required.',
- ]);
- $this->smtpEnabled = false;
- $this->saveModel();
- } catch (\Throwable $e) {
- $this->resendEnabled = false;
-
- return handleError($e, $this);
- }
- }
-
- public function saveModel()
- {
- $this->syncData(true);
- refreshSession();
- $this->dispatch('success', 'Settings saved.');
- }
-
- public function submit()
- {
- try {
- $this->resetErrorBag();
- $this->saveModel();
- } catch (\Throwable $e) {
- return handleError($e, $this);
- }
- }
-
public function copyFromInstanceSettings()
{
$settings = instanceSettings();
diff --git a/app/Livewire/Notifications/Slack.php b/app/Livewire/Notifications/Slack.php
index 06b7643ea..97464fa1c 100644
--- a/app/Livewire/Notifications/Slack.php
+++ b/app/Livewire/Notifications/Slack.php
@@ -2,6 +2,7 @@
namespace App\Livewire\Notifications;
+use App\Models\SlackNotificationSettings;
use App\Models\Team;
use App\Notifications\Test;
use Livewire\Attributes\Validate;
@@ -11,6 +12,8 @@ class Slack extends Component
{
public Team $team;
+ public SlackNotificationSettings $settings;
+
#[Validate(['boolean'])]
public bool $slackEnabled = false;
@@ -18,27 +21,46 @@ class Slack extends Component
public ?string $slackWebhookUrl = null;
#[Validate(['boolean'])]
- public bool $slackNotificationsTest = false;
+ public bool $deploymentSuccessSlackNotifications = false;
#[Validate(['boolean'])]
- public bool $slackNotificationsDeployments = false;
+ public bool $deploymentFailureSlackNotifications = true;
#[Validate(['boolean'])]
- public bool $slackNotificationsStatusChanges = false;
+ public bool $statusChangeSlackNotifications = false;
#[Validate(['boolean'])]
- public bool $slackNotificationsDatabaseBackups = false;
+ public bool $backupSuccessSlackNotifications = false;
#[Validate(['boolean'])]
- public bool $slackNotificationsScheduledTasks = false;
+ public bool $backupFailureSlackNotifications = true;
#[Validate(['boolean'])]
- public bool $slackNotificationsServerDiskUsage = false;
+ public bool $scheduledTaskSuccessSlackNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $scheduledTaskFailureSlackNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $dockerCleanupSuccessSlackNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $dockerCleanupFailureSlackNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $serverDiskUsageSlackNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $serverReachableSlackNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $serverUnreachableSlackNotifications = true;
public function mount()
{
try {
$this->team = auth()->user()->currentTeam();
+ $this->settings = $this->team->slackNotificationSettings;
$this->syncData();
} catch (\Throwable $e) {
return handleError($e, $this);
@@ -49,25 +71,40 @@ class Slack extends Component
{
if ($toModel) {
$this->validate();
- $this->team->slack_enabled = $this->slackEnabled;
- $this->team->slack_webhook_url = $this->slackWebhookUrl;
- $this->team->slack_notifications_test = $this->slackNotificationsTest;
- $this->team->slack_notifications_deployments = $this->slackNotificationsDeployments;
- $this->team->slack_notifications_status_changes = $this->slackNotificationsStatusChanges;
- $this->team->slack_notifications_database_backups = $this->slackNotificationsDatabaseBackups;
- $this->team->slack_notifications_scheduled_tasks = $this->slackNotificationsScheduledTasks;
- $this->team->slack_notifications_server_disk_usage = $this->slackNotificationsServerDiskUsage;
- $this->team->save();
+ $this->settings->slack_enabled = $this->slackEnabled;
+ $this->settings->slack_webhook_url = $this->slackWebhookUrl;
+
+ $this->settings->deployment_success_slack_notifications = $this->deploymentSuccessSlackNotifications;
+ $this->settings->deployment_failure_slack_notifications = $this->deploymentFailureSlackNotifications;
+ $this->settings->status_change_slack_notifications = $this->statusChangeSlackNotifications;
+ $this->settings->backup_success_slack_notifications = $this->backupSuccessSlackNotifications;
+ $this->settings->backup_failure_slack_notifications = $this->backupFailureSlackNotifications;
+ $this->settings->scheduled_task_success_slack_notifications = $this->scheduledTaskSuccessSlackNotifications;
+ $this->settings->scheduled_task_failure_slack_notifications = $this->scheduledTaskFailureSlackNotifications;
+ $this->settings->docker_cleanup_success_slack_notifications = $this->dockerCleanupSuccessSlackNotifications;
+ $this->settings->docker_cleanup_failure_slack_notifications = $this->dockerCleanupFailureSlackNotifications;
+ $this->settings->server_disk_usage_slack_notifications = $this->serverDiskUsageSlackNotifications;
+ $this->settings->server_reachable_slack_notifications = $this->serverReachableSlackNotifications;
+ $this->settings->server_unreachable_slack_notifications = $this->serverUnreachableSlackNotifications;
+
+ $this->settings->save();
refreshSession();
} else {
- $this->slackEnabled = $this->team->slack_enabled;
- $this->slackWebhookUrl = $this->team->slack_webhook_url;
- $this->slackNotificationsTest = $this->team->slack_notifications_test;
- $this->slackNotificationsDeployments = $this->team->slack_notifications_deployments;
- $this->slackNotificationsStatusChanges = $this->team->slack_notifications_status_changes;
- $this->slackNotificationsDatabaseBackups = $this->team->slack_notifications_database_backups;
- $this->slackNotificationsScheduledTasks = $this->team->slack_notifications_scheduled_tasks;
- $this->slackNotificationsServerDiskUsage = $this->team->slack_notifications_server_disk_usage;
+ $this->slackEnabled = $this->settings->slack_enabled;
+ $this->slackWebhookUrl = $this->settings->slack_webhook_url;
+
+ $this->deploymentSuccessSlackNotifications = $this->settings->deployment_success_slack_notifications;
+ $this->deploymentFailureSlackNotifications = $this->settings->deployment_failure_slack_notifications;
+ $this->statusChangeSlackNotifications = $this->settings->status_change_slack_notifications;
+ $this->backupSuccessSlackNotifications = $this->settings->backup_success_slack_notifications;
+ $this->backupFailureSlackNotifications = $this->settings->backup_failure_slack_notifications;
+ $this->scheduledTaskSuccessSlackNotifications = $this->settings->scheduled_task_success_slack_notifications;
+ $this->scheduledTaskFailureSlackNotifications = $this->settings->scheduled_task_failure_slack_notifications;
+ $this->dockerCleanupSuccessSlackNotifications = $this->settings->docker_cleanup_success_slack_notifications;
+ $this->dockerCleanupFailureSlackNotifications = $this->settings->docker_cleanup_failure_slack_notifications;
+ $this->serverDiskUsageSlackNotifications = $this->settings->server_disk_usage_slack_notifications;
+ $this->serverReachableSlackNotifications = $this->settings->server_reachable_slack_notifications;
+ $this->serverUnreachableSlackNotifications = $this->settings->server_unreachable_slack_notifications;
}
}
@@ -117,7 +154,7 @@ class Slack extends Component
public function sendTestNotification()
{
try {
- $this->team->notify(new Test);
+ $this->team->notify(new Test(channel: 'slack'));
$this->dispatch('success', 'Test notification sent.');
} catch (\Throwable $e) {
return handleError($e, $this);
diff --git a/app/Livewire/Notifications/Telegram.php b/app/Livewire/Notifications/Telegram.php
index 15ec20577..de2fa9cdc 100644
--- a/app/Livewire/Notifications/Telegram.php
+++ b/app/Livewire/Notifications/Telegram.php
@@ -3,6 +3,7 @@
namespace App\Livewire\Notifications;
use App\Models\Team;
+use App\Models\TelegramNotificationSettings;
use App\Notifications\Test;
use Livewire\Attributes\Validate;
use Livewire\Component;
@@ -11,6 +12,8 @@ class Telegram extends Component
{
public Team $team;
+ public TelegramNotificationSettings $settings;
+
#[Validate(['boolean'])]
public bool $telegramEnabled = false;
@@ -21,42 +24,82 @@ class Telegram extends Component
public ?string $telegramChatId = null;
#[Validate(['boolean'])]
- public bool $telegramNotificationsTest = false;
+ public bool $deploymentSuccessTelegramNotifications = false;
#[Validate(['boolean'])]
- public bool $telegramNotificationsDeployments = false;
+ public bool $deploymentFailureTelegramNotifications = true;
#[Validate(['boolean'])]
- public bool $telegramNotificationsStatusChanges = false;
+ public bool $statusChangeTelegramNotifications = false;
#[Validate(['boolean'])]
- public bool $telegramNotificationsDatabaseBackups = false;
+ public bool $backupSuccessTelegramNotifications = false;
#[Validate(['boolean'])]
- public bool $telegramNotificationsScheduledTasks = false;
-
- #[Validate(['nullable', 'string'])]
- public ?string $telegramNotificationsTestMessageThreadId = null;
-
- #[Validate(['nullable', 'string'])]
- public ?string $telegramNotificationsDeploymentsMessageThreadId = null;
-
- #[Validate(['nullable', 'string'])]
- public ?string $telegramNotificationsStatusChangesMessageThreadId = null;
-
- #[Validate(['nullable', 'string'])]
- public ?string $telegramNotificationsDatabaseBackupsMessageThreadId = null;
-
- #[Validate(['nullable', 'string'])]
- public ?string $telegramNotificationsScheduledTasksThreadId = null;
+ public bool $backupFailureTelegramNotifications = true;
#[Validate(['boolean'])]
- public bool $telegramNotificationsServerDiskUsage = false;
+ public bool $scheduledTaskSuccessTelegramNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $scheduledTaskFailureTelegramNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $dockerCleanupSuccessTelegramNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $dockerCleanupFailureTelegramNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $serverDiskUsageTelegramNotifications = true;
+
+ #[Validate(['boolean'])]
+ public bool $serverReachableTelegramNotifications = false;
+
+ #[Validate(['boolean'])]
+ public bool $serverUnreachableTelegramNotifications = true;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsDeploymentSuccessTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsDeploymentFailureTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsStatusChangeTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsBackupSuccessTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsBackupFailureTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsScheduledTaskSuccessTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsScheduledTaskFailureTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsDockerCleanupSuccessTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsDockerCleanupFailureTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsServerDiskUsageTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsServerReachableTopicId = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $telegramNotificationsServerUnreachableTopicId = null;
public function mount()
{
try {
$this->team = auth()->user()->currentTeam();
+ $this->settings = $this->team->telegramNotificationSettings;
$this->syncData();
} catch (\Throwable $e) {
return handleError($e, $this);
@@ -67,39 +110,69 @@ class Telegram extends Component
{
if ($toModel) {
$this->validate();
- $this->team->telegram_enabled = $this->telegramEnabled;
- $this->team->telegram_token = $this->telegramToken;
- $this->team->telegram_chat_id = $this->telegramChatId;
- $this->team->telegram_notifications_test = $this->telegramNotificationsTest;
- $this->team->telegram_notifications_deployments = $this->telegramNotificationsDeployments;
- $this->team->telegram_notifications_status_changes = $this->telegramNotificationsStatusChanges;
- $this->team->telegram_notifications_database_backups = $this->telegramNotificationsDatabaseBackups;
- $this->team->telegram_notifications_scheduled_tasks = $this->telegramNotificationsScheduledTasks;
- $this->team->telegram_notifications_test_message_thread_id = $this->telegramNotificationsTestMessageThreadId;
- $this->team->telegram_notifications_deployments_message_thread_id = $this->telegramNotificationsDeploymentsMessageThreadId;
- $this->team->telegram_notifications_status_changes_message_thread_id = $this->telegramNotificationsStatusChangesMessageThreadId;
- $this->team->telegram_notifications_database_backups_message_thread_id = $this->telegramNotificationsDatabaseBackupsMessageThreadId;
- $this->team->telegram_notifications_scheduled_tasks_thread_id = $this->telegramNotificationsScheduledTasksThreadId;
- $this->team->telegram_notifications_server_disk_usage = $this->telegramNotificationsServerDiskUsage;
- $this->team->save();
+ $this->settings->telegram_enabled = $this->telegramEnabled;
+ $this->settings->telegram_token = $this->telegramToken;
+ $this->settings->telegram_chat_id = $this->telegramChatId;
+
+ $this->settings->deployment_success_telegram_notifications = $this->deploymentSuccessTelegramNotifications;
+ $this->settings->deployment_failure_telegram_notifications = $this->deploymentFailureTelegramNotifications;
+ $this->settings->status_change_telegram_notifications = $this->statusChangeTelegramNotifications;
+ $this->settings->backup_success_telegram_notifications = $this->backupSuccessTelegramNotifications;
+ $this->settings->backup_failure_telegram_notifications = $this->backupFailureTelegramNotifications;
+ $this->settings->scheduled_task_success_telegram_notifications = $this->scheduledTaskSuccessTelegramNotifications;
+ $this->settings->scheduled_task_failure_telegram_notifications = $this->scheduledTaskFailureTelegramNotifications;
+ $this->settings->docker_cleanup_success_telegram_notifications = $this->dockerCleanupSuccessTelegramNotifications;
+ $this->settings->docker_cleanup_failure_telegram_notifications = $this->dockerCleanupFailureTelegramNotifications;
+ $this->settings->server_disk_usage_telegram_notifications = $this->serverDiskUsageTelegramNotifications;
+ $this->settings->server_reachable_telegram_notifications = $this->serverReachableTelegramNotifications;
+ $this->settings->server_unreachable_telegram_notifications = $this->serverUnreachableTelegramNotifications;
+
+ $this->settings->telegram_notifications_deployment_success_topic_id = $this->telegramNotificationsDeploymentSuccessTopicId;
+ $this->settings->telegram_notifications_deployment_failure_topic_id = $this->telegramNotificationsDeploymentFailureTopicId;
+ $this->settings->telegram_notifications_status_change_topic_id = $this->telegramNotificationsStatusChangeTopicId;
+ $this->settings->telegram_notifications_backup_success_topic_id = $this->telegramNotificationsBackupSuccessTopicId;
+ $this->settings->telegram_notifications_backup_failure_topic_id = $this->telegramNotificationsBackupFailureTopicId;
+ $this->settings->telegram_notifications_scheduled_task_success_topic_id = $this->telegramNotificationsScheduledTaskSuccessTopicId;
+ $this->settings->telegram_notifications_scheduled_task_failure_topic_id = $this->telegramNotificationsScheduledTaskFailureTopicId;
+ $this->settings->telegram_notifications_docker_cleanup_success_topic_id = $this->telegramNotificationsDockerCleanupSuccessTopicId;
+ $this->settings->telegram_notifications_docker_cleanup_failure_topic_id = $this->telegramNotificationsDockerCleanupFailureTopicId;
+ $this->settings->telegram_notifications_server_disk_usage_topic_id = $this->telegramNotificationsServerDiskUsageTopicId;
+ $this->settings->telegram_notifications_server_reachable_topic_id = $this->telegramNotificationsServerReachableTopicId;
+ $this->settings->telegram_notifications_server_unreachable_topic_id = $this->telegramNotificationsServerUnreachableTopicId;
+
+ $this->settings->save();
refreshSession();
} else {
- $this->telegramEnabled = $this->team->telegram_enabled;
- $this->telegramToken = $this->team->telegram_token;
- $this->telegramChatId = $this->team->telegram_chat_id;
- $this->telegramNotificationsTest = $this->team->telegram_notifications_test;
- $this->telegramNotificationsDeployments = $this->team->telegram_notifications_deployments;
- $this->telegramNotificationsStatusChanges = $this->team->telegram_notifications_status_changes;
- $this->telegramNotificationsDatabaseBackups = $this->team->telegram_notifications_database_backups;
- $this->telegramNotificationsScheduledTasks = $this->team->telegram_notifications_scheduled_tasks;
- $this->telegramNotificationsTestMessageThreadId = $this->team->telegram_notifications_test_message_thread_id;
- $this->telegramNotificationsDeploymentsMessageThreadId = $this->team->telegram_notifications_deployments_message_thread_id;
- $this->telegramNotificationsStatusChangesMessageThreadId = $this->team->telegram_notifications_status_changes_message_thread_id;
- $this->telegramNotificationsDatabaseBackupsMessageThreadId = $this->team->telegram_notifications_database_backups_message_thread_id;
- $this->telegramNotificationsScheduledTasksThreadId = $this->team->telegram_notifications_scheduled_tasks_thread_id;
- $this->telegramNotificationsServerDiskUsage = $this->team->telegram_notifications_server_disk_usage;
- }
+ $this->telegramEnabled = $this->settings->telegram_enabled;
+ $this->telegramToken = $this->settings->telegram_token;
+ $this->telegramChatId = $this->settings->telegram_chat_id;
+ $this->deploymentSuccessTelegramNotifications = $this->settings->deployment_success_telegram_notifications;
+ $this->deploymentFailureTelegramNotifications = $this->settings->deployment_failure_telegram_notifications;
+ $this->statusChangeTelegramNotifications = $this->settings->status_change_telegram_notifications;
+ $this->backupSuccessTelegramNotifications = $this->settings->backup_success_telegram_notifications;
+ $this->backupFailureTelegramNotifications = $this->settings->backup_failure_telegram_notifications;
+ $this->scheduledTaskSuccessTelegramNotifications = $this->settings->scheduled_task_success_telegram_notifications;
+ $this->scheduledTaskFailureTelegramNotifications = $this->settings->scheduled_task_failure_telegram_notifications;
+ $this->dockerCleanupSuccessTelegramNotifications = $this->settings->docker_cleanup_success_telegram_notifications;
+ $this->dockerCleanupFailureTelegramNotifications = $this->settings->docker_cleanup_failure_telegram_notifications;
+ $this->serverDiskUsageTelegramNotifications = $this->settings->server_disk_usage_telegram_notifications;
+ $this->serverReachableTelegramNotifications = $this->settings->server_reachable_telegram_notifications;
+ $this->serverUnreachableTelegramNotifications = $this->settings->server_unreachable_telegram_notifications;
+
+ $this->telegramNotificationsDeploymentSuccessTopicId = $this->settings->telegram_notifications_deployment_success_topic_id;
+ $this->telegramNotificationsDeploymentFailureTopicId = $this->settings->telegram_notifications_deployment_failure_topic_id;
+ $this->telegramNotificationsStatusChangeTopicId = $this->settings->telegram_notifications_status_change_topic_id;
+ $this->telegramNotificationsBackupSuccessTopicId = $this->settings->telegram_notifications_backup_success_topic_id;
+ $this->telegramNotificationsBackupFailureTopicId = $this->settings->telegram_notifications_backup_failure_topic_id;
+ $this->telegramNotificationsScheduledTaskSuccessTopicId = $this->settings->telegram_notifications_scheduled_task_success_topic_id;
+ $this->telegramNotificationsScheduledTaskFailureTopicId = $this->settings->telegram_notifications_scheduled_task_failure_topic_id;
+ $this->telegramNotificationsDockerCleanupSuccessTopicId = $this->settings->telegram_notifications_docker_cleanup_success_topic_id;
+ $this->telegramNotificationsDockerCleanupFailureTopicId = $this->settings->telegram_notifications_docker_cleanup_failure_topic_id;
+ $this->telegramNotificationsServerDiskUsageTopicId = $this->settings->telegram_notifications_server_disk_usage_topic_id;
+ $this->telegramNotificationsServerReachableTopicId = $this->settings->telegram_notifications_server_reachable_topic_id;
+ $this->telegramNotificationsServerUnreachableTopicId = $this->settings->telegram_notifications_server_unreachable_topic_id;
+ }
}
public function instantSave()
@@ -150,7 +223,7 @@ class Telegram extends Component
public function sendTestNotification()
{
try {
- $this->team->notify(new Test);
+ $this->team->notify(new Test(channel: 'telegram'));
$this->dispatch('success', 'Test notification sent.');
} catch (\Throwable $e) {
return handleError($e, $this);
diff --git a/app/Livewire/Settings/Index.php b/app/Livewire/Settings/Index.php
index c1be35ced..7adb0f8a7 100644
--- a/app/Livewire/Settings/Index.php
+++ b/app/Livewire/Settings/Index.php
@@ -23,9 +23,6 @@ class Index extends Component
#[Validate('nullable|string|max:255')]
public ?string $fqdn = null;
- #[Validate('nullable|string|max:255')]
- public ?string $resale_license = null;
-
#[Validate('required|integer|min:1025|max:65535')]
public int $public_port_min;
@@ -83,7 +80,6 @@ class Index extends Component
} else {
$this->settings = instanceSettings();
$this->fqdn = $this->settings->fqdn;
- $this->resale_license = $this->settings->resale_license;
$this->public_port_min = $this->settings->public_port_min;
$this->public_port_max = $this->settings->public_port_max;
$this->custom_dns_servers = $this->settings->custom_dns_servers;
@@ -122,7 +118,6 @@ class Index extends Component
}
$this->settings->fqdn = $this->fqdn;
- $this->settings->resale_license = $this->resale_license;
$this->settings->public_port_min = $this->public_port_min;
$this->settings->public_port_max = $this->public_port_max;
$this->settings->custom_dns_servers = $this->custom_dns_servers;
diff --git a/app/Livewire/SettingsEmail.php b/app/Livewire/SettingsEmail.php
index abf3a12f9..1c5edb108 100644
--- a/app/Livewire/SettingsEmail.php
+++ b/app/Livewire/SettingsEmail.php
@@ -3,6 +3,10 @@
namespace App\Livewire;
use App\Models\InstanceSettings;
+use App\Models\Team;
+use App\Notifications\Test;
+use Illuminate\Support\Facades\RateLimiter;
+use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate;
use Livewire\Component;
@@ -10,9 +14,21 @@ class SettingsEmail extends Component
{
public InstanceSettings $settings;
+ #[Locked]
+ public Team $team;
+
#[Validate(['boolean'])]
public bool $smtpEnabled = false;
+ #[Validate(['nullable', 'email'])]
+ public ?string $smtpFromAddress = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $smtpFromName = null;
+
+ #[Validate(['nullable', 'string'])]
+ public ?string $smtpRecipients = null;
+
#[Validate(['nullable', 'string'])]
public ?string $smtpHost = null;
@@ -20,29 +36,26 @@ class SettingsEmail extends Component
public ?int $smtpPort = null;
#[Validate(['nullable', 'string', 'in:tls,ssl,none'])]
- public ?string $smtpEncryption = null;
+ public ?string $smtpEncryption = 'tls';
#[Validate(['nullable', 'string'])]
public ?string $smtpUsername = null;
- #[Validate(['nullable'])]
+ #[Validate(['nullable', 'string'])]
public ?string $smtpPassword = null;
#[Validate(['nullable', 'numeric'])]
public ?int $smtpTimeout = null;
- #[Validate(['nullable', 'email'])]
- public ?string $smtpFromAddress = null;
-
- #[Validate(['nullable', 'string'])]
- public ?string $smtpFromName = null;
-
#[Validate(['boolean'])]
public bool $resendEnabled = false;
#[Validate(['nullable', 'string'])]
public ?string $resendApiKey = null;
+ #[Validate(['nullable', 'email'])]
+ public ?string $testEmailAddress = null;
+
public function mount()
{
if (isInstanceAdmin() === false) {
@@ -50,6 +63,8 @@ class SettingsEmail extends Component
}
$this->settings = instanceSettings();
$this->syncData();
+ $this->team = auth()->user()->currentTeam();
+ $this->testEmailAddress = auth()->user()->email;
}
public function syncData(bool $toModel = false)
@@ -90,7 +105,7 @@ class SettingsEmail extends Component
try {
$this->resetErrorBag();
$this->syncData(true);
- $this->dispatch('success', 'Settings saved.');
+ $this->dispatch('success', 'Transactional email settings updated.');
} catch (\Throwable $e) {
return handleError($e, $this);
}
@@ -99,19 +114,129 @@ class SettingsEmail extends Component
public function instantSave(string $type)
{
try {
+ $this->resetErrorBag();
+
if ($type === 'SMTP') {
- $this->resendEnabled = false;
- } else {
- $this->smtpEnabled = false;
- }
- $this->syncData(true);
- if ($this->smtpEnabled || $this->resendEnabled) {
- $this->dispatch('success', "{$type} enabled.");
- } else {
- $this->dispatch('success', "{$type} disabled.");
+ $this->submitSmtp();
+ } elseif ($type === 'Resend') {
+ $this->submitResend();
}
+
} catch (\Throwable $e) {
+ if ($type === 'SMTP') {
+ $this->smtpEnabled = false;
+ } elseif ($type === 'Resend') {
+ $this->resendEnabled = false;
+ }
+
return handleError($e, $this);
}
}
+
+ public function submitSmtp()
+ {
+ try {
+ $this->validate([
+ 'smtpEnabled' => 'boolean',
+ 'smtpFromAddress' => 'required|email',
+ 'smtpFromName' => 'required|string',
+ 'smtpHost' => 'required|string',
+ 'smtpPort' => 'required|numeric',
+ 'smtpEncryption' => 'required|string|in:tls,ssl,none',
+ 'smtpUsername' => 'nullable|string',
+ 'smtpPassword' => 'nullable|string',
+ 'smtpTimeout' => 'nullable|numeric',
+ ], [
+ 'smtpFromAddress.required' => 'From Address is required.',
+ 'smtpFromAddress.email' => 'Please enter a valid email address.',
+ 'smtpFromName.required' => 'From Name is required.',
+ 'smtpHost.required' => 'SMTP Host is required.',
+ 'smtpPort.required' => 'SMTP Port is required.',
+ 'smtpPort.numeric' => 'SMTP Port must be a number.',
+ 'smtpEncryption.required' => 'Encryption type is required.',
+ ]);
+
+ $this->resendEnabled = false;
+ $this->settings->resend_enabled = false;
+
+ $this->settings->smtp_enabled = $this->smtpEnabled;
+ $this->settings->smtp_host = $this->smtpHost;
+ $this->settings->smtp_port = $this->smtpPort;
+ $this->settings->smtp_encryption = $this->smtpEncryption;
+ $this->settings->smtp_username = $this->smtpUsername;
+ $this->settings->smtp_password = $this->smtpPassword;
+ $this->settings->smtp_timeout = $this->smtpTimeout;
+ $this->settings->smtp_from_address = $this->smtpFromAddress;
+ $this->settings->smtp_from_name = $this->smtpFromName;
+
+ $this->settings->save();
+
+ $this->dispatch('success', 'SMTP settings updated.');
+ } catch (\Throwable $e) {
+ $this->smtpEnabled = false;
+
+ return handleError($e);
+ }
+ }
+
+ public function submitResend()
+ {
+ try {
+ $this->validate([
+ 'resendEnabled' => 'boolean',
+ 'resendApiKey' => 'required|string',
+ 'smtpFromAddress' => 'required|email',
+ 'smtpFromName' => 'required|string',
+ ], [
+ 'resendApiKey.required' => 'Resend API Key is required.',
+ 'smtpFromAddress.required' => 'From Address is required.',
+ 'smtpFromAddress.email' => 'Please enter a valid email address.',
+ 'smtpFromName.required' => 'From Name is required.',
+ ]);
+
+ $this->smtpEnabled = false;
+ $this->settings->smtp_enabled = false;
+
+ $this->settings->resend_enabled = $this->resendEnabled;
+ $this->settings->resend_api_key = $this->resendApiKey;
+ $this->settings->smtp_from_address = $this->smtpFromAddress;
+ $this->settings->smtp_from_name = $this->smtpFromName;
+
+ $this->settings->save();
+
+ $this->dispatch('success', 'Resend settings updated.');
+ } catch (\Throwable $e) {
+ $this->resendEnabled = false;
+
+ return handleError($e);
+ }
+ }
+
+ public function sendTestEmail()
+ {
+ try {
+ $this->validate([
+ 'testEmailAddress' => 'required|email',
+ ], [
+ 'testEmailAddress.required' => 'Test email address is required.',
+ 'testEmailAddress.email' => 'Please enter a valid email address.',
+ ]);
+
+ $executed = RateLimiter::attempt(
+ 'test-email:'.$this->team->id,
+ $perMinute = 0,
+ function () {
+ $this->team?->notify(new Test($this->testEmailAddress, 'email'));
+ $this->dispatch('success', 'Test Email sent.');
+ },
+ $decaySeconds = 10,
+ );
+
+ if (! $executed) {
+ throw new \Exception('Too many messages sent!');
+ }
+ } catch (\Throwable $e) {
+ return handleError($e);
+ }
+ }
}
diff --git a/app/Livewire/Waitlist/Index.php b/app/Livewire/Waitlist/Index.php
deleted file mode 100644
index 0524b495c..000000000
--- a/app/Livewire/Waitlist/Index.php
+++ /dev/null
@@ -1,70 +0,0 @@
- 'required|email',
- ];
-
- public function render()
- {
- return view('livewire.waitlist.index')->layout('layouts.simple');
- }
-
- public function mount()
- {
- if (config('constants.waitlist.enabled') == false) {
- return redirect()->route('register');
- }
- $this->waitingInLine = Waitlist::whereVerified(true)->count();
- $this->users = User::count();
- if (isDev()) {
- $this->email = 'waitlist@example.com';
- }
- }
-
- public function submit()
- {
- $this->validate();
- try {
- $already_registered = User::whereEmail($this->email)->first();
- if ($already_registered) {
- throw new \Exception('You are already on the waitlist or registered.
Please check your email to verify your email address or contact support.');
- }
- $found = Waitlist::where('email', $this->email)->first();
- if ($found) {
- if (! $found->verified) {
- $this->dispatch('error', 'You are already on the waitlist.
Please check your email to verify your email address.');
-
- return;
- }
- $this->dispatch('error', 'You are already on the waitlist.
You will be notified when your turn comes.
Thank you.');
-
- return;
- }
- $waitlist = Waitlist::create([
- 'email' => Str::lower($this->email),
- 'type' => 'registration',
- ]);
-
- $this->dispatch('success', 'Check your email to verify your email address.');
- dispatch(new SendConfirmationForWaitlistJob($this->email, $waitlist->uuid));
- } catch (\Throwable $e) {
- return handleError($e, $this);
- }
- }
-}
diff --git a/app/Models/Application.php b/app/Models/Application.php
index d1efd3f33..82ad0c2d1 100644
--- a/app/Models/Application.php
+++ b/app/Models/Application.php
@@ -327,7 +327,7 @@ class Application extends BaseModel
return null;
}
- public function failedTaskLink($task_uuid)
+ public function taskLink($task_uuid)
{
if (data_get($this, 'environment.project.uuid')) {
$route = route('project.application.scheduled-tasks', [
diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php
index 79801987b..727abed5f 100644
--- a/app/Models/BaseModel.php
+++ b/app/Models/BaseModel.php
@@ -20,7 +20,7 @@ abstract class BaseModel extends Model
});
}
- public function name(): Attribute
+ public function sanitizedName(): Attribute
{
return new Attribute(
get: fn () => sanitize_string($this->getRawOriginal('name')),
diff --git a/app/Models/DiscordNotificationSettings.php b/app/Models/DiscordNotificationSettings.php
new file mode 100644
index 000000000..619393ddc
--- /dev/null
+++ b/app/Models/DiscordNotificationSettings.php
@@ -0,0 +1,59 @@
+ 'boolean',
+ 'discord_webhook_url' => 'encrypted',
+
+ 'deployment_success_discord_notifications' => 'boolean',
+ 'deployment_failure_discord_notifications' => 'boolean',
+ 'status_change_discord_notifications' => 'boolean',
+ 'backup_success_discord_notifications' => 'boolean',
+ 'backup_failure_discord_notifications' => 'boolean',
+ 'scheduled_task_success_discord_notifications' => 'boolean',
+ 'scheduled_task_failure_discord_notifications' => 'boolean',
+ 'docker_cleanup_discord_notifications' => 'boolean',
+ 'server_disk_usage_discord_notifications' => 'boolean',
+ 'server_reachable_discord_notifications' => 'boolean',
+ 'server_unreachable_discord_notifications' => 'boolean',
+ ];
+
+ public function team()
+ {
+ return $this->belongsTo(Team::class);
+ }
+
+ public function isEnabled()
+ {
+ return $this->discord_enabled;
+ }
+}
diff --git a/app/Models/EmailNotificationSettings.php b/app/Models/EmailNotificationSettings.php
new file mode 100644
index 000000000..ae118986f
--- /dev/null
+++ b/app/Models/EmailNotificationSettings.php
@@ -0,0 +1,79 @@
+ 'boolean',
+ 'smtp_from_address' => 'encrypted',
+ 'smtp_from_name' => 'encrypted',
+ 'smtp_recipients' => 'encrypted',
+ 'smtp_host' => 'encrypted',
+ 'smtp_port' => 'integer',
+ 'smtp_username' => 'encrypted',
+ 'smtp_password' => 'encrypted',
+ 'smtp_timeout' => 'integer',
+
+ 'resend_enabled' => 'boolean',
+ 'resend_api_key' => 'encrypted',
+
+ 'use_instance_email_settings' => 'boolean',
+
+ 'deployment_success_email_notifications' => 'boolean',
+ 'deployment_failure_email_notifications' => 'boolean',
+ 'status_change_email_notifications' => 'boolean',
+ 'backup_success_email_notifications' => 'boolean',
+ 'backup_failure_email_notifications' => 'boolean',
+ 'scheduled_task_success_email_notifications' => 'boolean',
+ 'scheduled_task_failure_email_notifications' => 'boolean',
+ 'server_disk_usage_email_notifications' => 'boolean',
+ ];
+
+ public function team()
+ {
+ return $this->belongsTo(Team::class);
+ }
+
+ public function isEnabled()
+ {
+ if (isCloud()) {
+ return true;
+ }
+
+ return $this->smtp_enabled || $this->resend_enabled || $this->use_instance_email_settings;
+ }
+}
diff --git a/app/Models/InstanceSettings.php b/app/Models/InstanceSettings.php
index eeb803925..5b89bb401 100644
--- a/app/Models/InstanceSettings.php
+++ b/app/Models/InstanceSettings.php
@@ -16,8 +16,19 @@ class InstanceSettings extends Model implements SendsEmail
protected $guarded = [];
protected $casts = [
- 'resale_license' => 'encrypted',
+ 'smtp_enabled' => 'boolean',
+ 'smtp_from_address' => 'encrypted',
+ 'smtp_from_name' => 'encrypted',
+ 'smtp_recipients' => 'encrypted',
+ 'smtp_host' => 'encrypted',
+ 'smtp_port' => 'integer',
+ 'smtp_username' => 'encrypted',
'smtp_password' => 'encrypted',
+ 'smtp_timeout' => 'integer',
+
+ 'resend_enabled' => 'boolean',
+ 'resend_api_key' => 'encrypted',
+
'allowed_ip_ranges' => 'array',
'is_auto_update_enabled' => 'boolean',
'auto_update_frequency' => 'string',
@@ -81,7 +92,7 @@ class InstanceSettings extends Model implements SendsEmail
return InstanceSettings::findOrFail(0);
}
- public function getRecepients($notification)
+ public function getRecipients($notification)
{
$recipients = data_get($notification, 'emails', null);
if (is_null($recipients) || $recipients === '') {
diff --git a/app/Models/S3Storage.php b/app/Models/S3Storage.php
index a432a6e9c..f1247e6f7 100644
--- a/app/Models/S3Storage.php
+++ b/app/Models/S3Storage.php
@@ -59,7 +59,7 @@ class S3Storage extends BaseModel
$this->is_usable = true;
} catch (\Throwable $e) {
$this->is_usable = false;
- if ($this->unusable_email_sent === false && is_transactional_emails_active()) {
+ if ($this->unusable_email_sent === false && is_transactional_emails_enabled()) {
$mail = new MailMessage;
$mail->subject('Coolify: S3 Storage Connection Error');
$mail->view('emails.s3-connection-error', ['name' => $this->name, 'reason' => $e->getMessage(), 'url' => route('storage.show', ['storage_uuid' => $this->uuid])]);
diff --git a/app/Models/Server.php b/app/Models/Server.php
index 909947db4..c4766abb0 100644
--- a/app/Models/Server.php
+++ b/app/Models/Server.php
@@ -1042,7 +1042,7 @@ $schema://$host {
$this->unreachable_notification_sent = false;
$this->save();
$this->refresh();
- // $this->team->notify(new Reachable($this));
+ $this->team->notify(new Reachable($this));
}
public function sendUnreachableNotification()
@@ -1050,7 +1050,7 @@ $schema://$host {
$this->unreachable_notification_sent = true;
$this->save();
$this->refresh();
- // $this->team->notify(new Unreachable($this));
+ $this->team->notify(new Unreachable($this));
}
public function validateConnection(bool $justCheckingNewKey = false)
diff --git a/app/Models/Service.php b/app/Models/Service.php
index 6d3d2024b..117677d53 100644
--- a/app/Models/Service.php
+++ b/app/Models/Service.php
@@ -1140,7 +1140,7 @@ class Service extends BaseModel
return null;
}
- public function failedTaskLink($task_uuid)
+ public function taskLink($task_uuid)
{
if (data_get($this, 'environment.project.uuid')) {
$route = route('project.service.scheduled-tasks', [
diff --git a/app/Models/SlackNotificationSettings.php b/app/Models/SlackNotificationSettings.php
new file mode 100644
index 000000000..48153f2ea
--- /dev/null
+++ b/app/Models/SlackNotificationSettings.php
@@ -0,0 +1,59 @@
+ 'boolean',
+ 'slack_webhook_url' => 'encrypted',
+
+ 'deployment_success_slack_notifications' => 'boolean',
+ 'deployment_failure_slack_notifications' => 'boolean',
+ 'status_change_slack_notifications' => 'boolean',
+ 'backup_success_slack_notifications' => 'boolean',
+ 'backup_failure_slack_notifications' => 'boolean',
+ 'scheduled_task_success_slack_notifications' => 'boolean',
+ 'scheduled_task_failure_slack_notifications' => 'boolean',
+ 'docker_cleanup_slack_notifications' => 'boolean',
+ 'server_disk_usage_slack_notifications' => 'boolean',
+ 'server_reachable_slack_notifications' => 'boolean',
+ 'server_unreachable_slack_notifications' => 'boolean',
+ ];
+
+ public function team()
+ {
+ return $this->belongsTo(Team::class);
+ }
+
+ public function isEnabled()
+ {
+ return $this->slack_enabled;
+ }
+}
diff --git a/app/Models/Team.php b/app/Models/Team.php
index ecf662787..07424a55f 100644
--- a/app/Models/Team.php
+++ b/app/Models/Team.php
@@ -5,6 +5,7 @@ namespace App\Models;
use App\Notifications\Channels\SendsDiscord;
use App\Notifications\Channels\SendsEmail;
use App\Notifications\Channels\SendsSlack;
+use App\Traits\HasNotificationSettings;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
@@ -20,49 +21,8 @@ use OpenApi\Attributes as OA;
'personal_team' => ['type' => 'boolean', 'description' => 'Whether the team is personal or not.'],
'created_at' => ['type' => 'string', 'description' => 'The date and time the team was created.'],
'updated_at' => ['type' => 'string', 'description' => 'The date and time the team was last updated.'],
- 'smtp_enabled' => ['type' => 'boolean', 'description' => 'Whether SMTP is enabled or not.'],
- 'smtp_from_address' => ['type' => 'string', 'description' => 'The email address to send emails from.'],
- 'smtp_from_name' => ['type' => 'string', 'description' => 'The name to send emails from.'],
- 'smtp_recipients' => ['type' => 'string', 'description' => 'The email addresses to send emails to.'],
- 'smtp_host' => ['type' => 'string', 'description' => 'The SMTP host.'],
- 'smtp_port' => ['type' => 'string', 'description' => 'The SMTP port.'],
- 'smtp_encryption' => ['type' => 'string', 'description' => 'The SMTP encryption.'],
- 'smtp_username' => ['type' => 'string', 'description' => 'The SMTP username.'],
- 'smtp_password' => ['type' => 'string', 'description' => 'The SMTP password.'],
- 'smtp_timeout' => ['type' => 'string', 'description' => 'The SMTP timeout.'],
- 'smtp_notifications_test' => ['type' => 'boolean', 'description' => 'Whether to send test notifications via SMTP.'],
- 'smtp_notifications_deployments' => ['type' => 'boolean', 'description' => 'Whether to send deployment notifications via SMTP.'],
- 'smtp_notifications_status_changes' => ['type' => 'boolean', 'description' => 'Whether to send status change notifications via SMTP.'],
- 'smtp_notifications_scheduled_tasks' => ['type' => 'boolean', 'description' => 'Whether to send scheduled task notifications via SMTP.'],
- 'smtp_notifications_database_backups' => ['type' => 'boolean', 'description' => 'Whether to send database backup notifications via SMTP.'],
- 'smtp_notifications_server_disk_usage' => ['type' => 'boolean', 'description' => 'Whether to send server disk usage notifications via SMTP.'],
- 'discord_enabled' => ['type' => 'boolean', 'description' => 'Whether Discord is enabled or not.'],
- 'discord_webhook_url' => ['type' => 'string', 'description' => 'The Discord webhook URL.'],
- 'discord_notifications_test' => ['type' => 'boolean', 'description' => 'Whether to send test notifications via Discord.'],
- 'discord_notifications_deployments' => ['type' => 'boolean', 'description' => 'Whether to send deployment notifications via Discord.'],
- 'discord_notifications_status_changes' => ['type' => 'boolean', 'description' => 'Whether to send status change notifications via Discord.'],
- 'discord_notifications_database_backups' => ['type' => 'boolean', 'description' => 'Whether to send database backup notifications via Discord.'],
- 'discord_notifications_scheduled_tasks' => ['type' => 'boolean', 'description' => 'Whether to send scheduled task notifications via Discord.'],
- 'discord_notifications_server_disk_usage' => ['type' => 'boolean', 'description' => 'Whether to send server disk usage notifications via Discord.'],
'show_boarding' => ['type' => 'boolean', 'description' => 'Whether to show the boarding screen or not.'],
- 'resend_enabled' => ['type' => 'boolean', 'description' => 'Whether to enable resending or not.'],
- 'resend_api_key' => ['type' => 'string', 'description' => 'The resending API key.'],
- 'use_instance_email_settings' => ['type' => 'boolean', 'description' => 'Whether to use instance email settings or not.'],
- 'telegram_enabled' => ['type' => 'boolean', 'description' => 'Whether Telegram is enabled or not.'],
- 'telegram_token' => ['type' => 'string', 'description' => 'The Telegram token.'],
- 'telegram_chat_id' => ['type' => 'string', 'description' => 'The Telegram chat ID.'],
- 'telegram_notifications_test' => ['type' => 'boolean', 'description' => 'Whether to send test notifications via Telegram.'],
- 'telegram_notifications_deployments' => ['type' => 'boolean', 'description' => 'Whether to send deployment notifications via Telegram.'],
- 'telegram_notifications_status_changes' => ['type' => 'boolean', 'description' => 'Whether to send status change notifications via Telegram.'],
- 'telegram_notifications_database_backups' => ['type' => 'boolean', 'description' => 'Whether to send database backup notifications via Telegram.'],
- 'telegram_notifications_test_message_thread_id' => ['type' => 'string', 'description' => 'The Telegram test message thread ID.'],
- 'telegram_notifications_deployments_message_thread_id' => ['type' => 'string', 'description' => 'The Telegram deployment message thread ID.'],
- 'telegram_notifications_status_changes_message_thread_id' => ['type' => 'string', 'description' => 'The Telegram status change message thread ID.'],
- 'telegram_notifications_database_backups_message_thread_id' => ['type' => 'string', 'description' => 'The Telegram database backup message thread ID.'],
-
'custom_server_limit' => ['type' => 'string', 'description' => 'The custom server limit.'],
- 'telegram_notifications_scheduled_tasks' => ['type' => 'boolean', 'description' => 'Whether to send scheduled task notifications via Telegram.'],
- 'telegram_notifications_scheduled_tasks_thread_id' => ['type' => 'string', 'description' => 'The Telegram scheduled task message thread ID.'],
'members' => new OA\Property(
property: 'members',
type: 'array',
@@ -71,20 +31,26 @@ use OpenApi\Attributes as OA;
),
]
)]
+
class Team extends Model implements SendsDiscord, SendsEmail, SendsSlack
{
- use Notifiable;
+ use HasNotificationSettings, Notifiable;
protected $guarded = [];
protected $casts = [
'personal_team' => 'boolean',
- 'smtp_password' => 'encrypted',
- 'resend_api_key' => 'encrypted',
];
protected static function booted()
{
+ static::created(function ($team) {
+ $team->emailNotificationSettings()->create();
+ $team->discordNotificationSettings()->create();
+ $team->slackNotificationSettings()->create();
+ $team->telegramNotificationSettings()->create();
+ });
+
static::saving(function ($team) {
if (auth()->user()?->isMember()) {
throw new \Exception('You are not allowed to update this team.');
@@ -115,34 +81,6 @@ class Team extends Model implements SendsDiscord, SendsEmail, SendsSlack
});
}
- public function routeNotificationForDiscord()
- {
- return data_get($this, 'discord_webhook_url', null);
- }
-
- public function routeNotificationForTelegram()
- {
- return [
- 'token' => data_get($this, 'telegram_token', null),
- 'chat_id' => data_get($this, 'telegram_chat_id', null),
- ];
- }
-
- public function routeNotificationForSlack()
- {
- return data_get($this, 'slack_webhook_url', null);
- }
-
- public function getRecepients($notification)
- {
- $recipients = data_get($notification, 'emails', null);
- if (is_null($recipients)) {
- return $this->members()->pluck('email')->toArray();
- }
-
- return explode(',', $recipients);
- }
-
public static function serverLimitReached()
{
$serverLimit = Team::serverLimit();
@@ -196,10 +134,66 @@ class Team extends Model implements SendsDiscord, SendsEmail, SendsSlack
return $serverLimit ?? 2;
}
-
);
}
+ public function routeNotificationForDiscord()
+ {
+ return data_get($this, 'discord_webhook_url', null);
+ }
+
+ public function routeNotificationForTelegram()
+ {
+ return [
+ 'token' => data_get($this, 'telegram_token', null),
+ 'chat_id' => data_get($this, 'telegram_chat_id', null),
+ ];
+ }
+
+ public function routeNotificationForSlack()
+ {
+ return data_get($this, 'slack_webhook_url', null);
+ }
+
+ public function getRecipients($notification)
+ {
+ $recipients = data_get($notification, 'emails', null);
+ if (is_null($recipients)) {
+ return $this->members()->pluck('email')->toArray();
+ }
+
+ return explode(',', $recipients);
+ }
+
+ public function isAnyNotificationEnabled()
+ {
+ if (isCloud()) {
+ return true;
+ }
+
+ return $this->getNotificationSettings('email')?->isEnabled() ||
+ $this->getNotificationSettings('discord')?->isEnabled() ||
+ $this->getNotificationSettings('slack')?->isEnabled() ||
+ $this->getNotificationSettings('telegram')?->isEnabled();
+ }
+
+ public function subscriptionEnded()
+ {
+ $this->subscription->update([
+ 'stripe_subscription_id' => null,
+ 'stripe_plan_id' => null,
+ 'stripe_cancel_at_period_end' => false,
+ 'stripe_invoice_paid' => false,
+ 'stripe_trial_already_ended' => false,
+ ]);
+ foreach ($this->servers as $server) {
+ $server->settings()->update([
+ 'is_usable' => false,
+ 'is_reachable' => false,
+ ]);
+ }
+ }
+
public function environment_variables()
{
return $this->hasMany(SharedEnvironmentVariable::class)->whereNull('project_id')->whereNull('environment_id');
@@ -263,32 +257,23 @@ class Team extends Model implements SendsDiscord, SendsEmail, SendsSlack
return $this->hasMany(S3Storage::class)->where('is_usable', true);
}
- public function subscriptionEnded()
+ public function emailNotificationSettings()
{
- $this->subscription->update([
- 'stripe_subscription_id' => null,
- 'stripe_plan_id' => null,
- 'stripe_cancel_at_period_end' => false,
- 'stripe_invoice_paid' => false,
- 'stripe_trial_already_ended' => false,
- ]);
- foreach ($this->servers as $server) {
- $server->settings()->update([
- 'is_usable' => false,
- 'is_reachable' => false,
- ]);
- }
+ return $this->hasOne(EmailNotificationSettings::class);
}
- public function isAnyNotificationEnabled()
+ public function discordNotificationSettings()
{
- if (isCloud()) {
- return true;
- }
- if ($this->smtp_enabled || $this->resend_enabled || $this->discord_enabled || $this->telegram_enabled || $this->use_instance_email_settings) {
- return true;
- }
+ return $this->hasOne(DiscordNotificationSettings::class);
+ }
- return false;
+ public function telegramNotificationSettings()
+ {
+ return $this->hasOne(TelegramNotificationSettings::class);
+ }
+
+ public function slackNotificationSettings()
+ {
+ return $this->hasOne(SlackNotificationSettings::class);
}
}
diff --git a/app/Models/TelegramNotificationSettings.php b/app/Models/TelegramNotificationSettings.php
new file mode 100644
index 000000000..2edca14ff
--- /dev/null
+++ b/app/Models/TelegramNotificationSettings.php
@@ -0,0 +1,85 @@
+ 'boolean',
+ 'telegram_token' => 'encrypted',
+ 'telegram_chat_id' => 'encrypted',
+
+ 'deployment_success_telegram_notifications' => 'boolean',
+ 'deployment_failure_telegram_notifications' => 'boolean',
+ 'status_change_telegram_notifications' => 'boolean',
+ 'backup_success_telegram_notifications' => 'boolean',
+ 'backup_failure_telegram_notifications' => 'boolean',
+ 'scheduled_task_success_telegram_notifications' => 'boolean',
+ 'scheduled_task_failure_telegram_notifications' => 'boolean',
+ 'docker_cleanup_telegram_notifications' => 'boolean',
+ 'server_disk_usage_telegram_notifications' => 'boolean',
+ 'server_reachable_telegram_notifications' => 'boolean',
+ 'server_unreachable_telegram_notifications' => 'boolean',
+
+ 'telegram_notifications_deployment_success_topic_id' => 'encrypted',
+ 'telegram_notifications_deployment_failure_topic_id' => 'encrypted',
+ 'telegram_notifications_status_change_topic_id' => 'encrypted',
+ 'telegram_notifications_backup_success_topic_id' => 'encrypted',
+ 'telegram_notifications_backup_failure_topic_id' => 'encrypted',
+ 'telegram_notifications_scheduled_task_success_topic_id' => 'encrypted',
+ 'telegram_notifications_scheduled_task_failure_topic_id' => 'encrypted',
+ 'telegram_notifications_docker_cleanup_topic_id' => 'encrypted',
+ 'telegram_notifications_server_disk_usage_topic_id' => 'encrypted',
+ 'telegram_notifications_server_reachable_topic_id' => 'encrypted',
+ 'telegram_notifications_server_unreachable_topic_id' => 'encrypted',
+ ];
+
+ public function team()
+ {
+ return $this->belongsTo(Team::class);
+ }
+
+ public function isEnabled()
+ {
+ return $this->telegram_enabled;
+ }
+}
diff --git a/app/Models/User.php b/app/Models/User.php
index 25fb33d66..7c23631c3 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -114,7 +114,7 @@ class User extends Authenticatable implements SendsEmail
return $this->belongsToMany(Team::class)->withPivot('role');
}
- public function getRecepients($notification)
+ public function getRecipients($notification)
{
return $this->email;
}
diff --git a/app/Models/Waitlist.php b/app/Models/Waitlist.php
deleted file mode 100644
index 28e5f01fd..000000000
--- a/app/Models/Waitlist.php
+++ /dev/null
@@ -1,12 +0,0 @@
-getEnabledChannels('deployment_failure');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Application/DeploymentSuccess.php b/app/Notifications/Application/DeploymentSuccess.php
index 79ae19f66..548f5c6e5 100644
--- a/app/Notifications/Application/DeploymentSuccess.php
+++ b/app/Notifications/Application/DeploymentSuccess.php
@@ -45,13 +45,7 @@ class DeploymentSuccess extends CustomEmailNotification
public function via(object $notifiable): array
{
- $channels = setNotificationChannels($notifiable, 'deployments');
- if (isCloud()) {
- // TODO: Make batch notifications work with email
- $channels = array_diff($channels, [\App\Notifications\Channels\EmailChannel::class]);
- }
-
- return $channels;
+ return $notifiable->getEnabledChannels('deployment_success');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Application/StatusChanged.php b/app/Notifications/Application/StatusChanged.php
index 2167e9f13..32a6a659a 100644
--- a/app/Notifications/Application/StatusChanged.php
+++ b/app/Notifications/Application/StatusChanged.php
@@ -35,7 +35,7 @@ class StatusChanged extends CustomEmailNotification
public function via(object $notifiable): array
{
- return setNotificationChannels($notifiable, 'status_changes');
+ return $notifiable->getEnabledChannels('status_change');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Channels/DiscordChannel.php b/app/Notifications/Channels/DiscordChannel.php
index df7040f8f..362006d8e 100644
--- a/app/Notifications/Channels/DiscordChannel.php
+++ b/app/Notifications/Channels/DiscordChannel.php
@@ -13,10 +13,13 @@ class DiscordChannel
public function send(SendsDiscord $notifiable, Notification $notification): void
{
$message = $notification->toDiscord();
- $webhookUrl = $notifiable->routeNotificationForDiscord();
- if (! $webhookUrl) {
+
+ $discordSettings = $notifiable->discordNotificationSettings;
+
+ if (! $discordSettings || ! $discordSettings->isEnabled() || ! $discordSettings->discord_webhook_url) {
return;
}
- SendMessageToDiscordJob::dispatch($message, $webhookUrl);
+
+ SendMessageToDiscordJob::dispatch($message, $discordSettings->discord_webhook_url);
}
}
diff --git a/app/Notifications/Channels/EmailChannel.php b/app/Notifications/Channels/EmailChannel.php
index 5394f6106..0985f4393 100644
--- a/app/Notifications/Channels/EmailChannel.php
+++ b/app/Notifications/Channels/EmailChannel.php
@@ -13,7 +13,7 @@ class EmailChannel
{
try {
$this->bootConfigs($notifiable);
- $recipients = $notifiable->getRecepients($notification);
+ $recipients = $notifiable->getRecipients($notification);
if (count($recipients) === 0) {
throw new Exception('No email recipients found');
}
@@ -46,7 +46,9 @@ class EmailChannel
private function bootConfigs($notifiable): void
{
- if (data_get($notifiable, 'use_instance_email_settings')) {
+ $emailSettings = $notifiable->emailNotificationSettings;
+
+ if ($emailSettings->use_instance_email_settings) {
$type = set_transanctional_email_settings();
if (! $type) {
throw new Exception('No email settings found.');
@@ -54,24 +56,27 @@ class EmailChannel
return;
}
- config()->set('mail.from.address', data_get($notifiable, 'smtp_from_address', 'test@example.com'));
- config()->set('mail.from.name', data_get($notifiable, 'smtp_from_name', 'Test'));
- if (data_get($notifiable, 'resend_enabled')) {
+
+ config()->set('mail.from.address', $emailSettings->smtp_from_address ?? 'test@example.com');
+ config()->set('mail.from.name', $emailSettings->smtp_from_name ?? 'Test');
+
+ if ($emailSettings->resend_enabled) {
config()->set('mail.default', 'resend');
- config()->set('resend.api_key', data_get($notifiable, 'resend_api_key'));
+ config()->set('resend.api_key', $emailSettings->resend_api_key);
}
- if (data_get($notifiable, 'smtp_enabled')) {
+
+ if ($emailSettings->smtp_enabled) {
config()->set('mail.default', 'smtp');
config()->set('mail.mailers.smtp', [
'transport' => 'smtp',
- 'host' => data_get($notifiable, 'smtp_host'),
- 'port' => data_get($notifiable, 'smtp_port'),
- 'encryption' => data_get($notifiable, 'smtp_encryption') === 'none' ? null : data_get($notifiable, 'smtp_encryption'),
- 'username' => data_get($notifiable, 'smtp_username'),
- 'password' => data_get($notifiable, 'smtp_password'),
- 'timeout' => data_get($notifiable, 'smtp_timeout'),
+ 'host' => $emailSettings->smtp_host,
+ 'port' => $emailSettings->smtp_port,
+ 'encryption' => $emailSettings->smtp_encryption === 'none' ? null : $emailSettings->smtp_encryption,
+ 'username' => $emailSettings->smtp_username,
+ 'password' => $emailSettings->smtp_password,
+ 'timeout' => $emailSettings->smtp_timeout,
'local_domain' => null,
- 'auto_tls' => data_get($notifiable, 'smtp_encryption') === 'none' ? '0' : '',
+ 'auto_tls' => $emailSettings->smtp_encryption === 'none' ? '0' : '',
]);
}
}
diff --git a/app/Notifications/Channels/SendsEmail.php b/app/Notifications/Channels/SendsEmail.php
index fc7528834..3adc6d0a2 100644
--- a/app/Notifications/Channels/SendsEmail.php
+++ b/app/Notifications/Channels/SendsEmail.php
@@ -4,5 +4,5 @@ namespace App\Notifications\Channels;
interface SendsEmail
{
- public function getRecepients($notification);
+ public function getRecipients($notification);
}
diff --git a/app/Notifications/Channels/SlackChannel.php b/app/Notifications/Channels/SlackChannel.php
index 32fdbe9cf..cddb7a561 100644
--- a/app/Notifications/Channels/SlackChannel.php
+++ b/app/Notifications/Channels/SlackChannel.php
@@ -13,10 +13,12 @@ class SlackChannel
public function send(SendsSlack $notifiable, Notification $notification): void
{
$message = $notification->toSlack();
- $webhookUrl = $notifiable->routeNotificationForSlack();
- if (! $webhookUrl) {
+ $slackSettings = $notifiable->slackNotificationSettings;
+
+ if (! $slackSettings || ! $slackSettings->isEnabled() || ! $slackSettings->slack_webhook_url) {
return;
}
- SendMessageToSlackJob::dispatch($message, $webhookUrl);
+
+ SendMessageToSlackJob::dispatch($message, $slackSettings->slack_webhook_url);
}
}
diff --git a/app/Notifications/Channels/TelegramChannel.php b/app/Notifications/Channels/TelegramChannel.php
index 958c46c21..17d76181a 100644
--- a/app/Notifications/Channels/TelegramChannel.php
+++ b/app/Notifications/Channels/TelegramChannel.php
@@ -9,38 +9,32 @@ class TelegramChannel
public function send($notifiable, $notification): void
{
$data = $notification->toTelegram($notifiable);
- $telegramData = $notifiable->routeNotificationForTelegram();
+ $settings = $notifiable->telegramNotificationSettings;
+
$message = data_get($data, 'message');
$buttons = data_get($data, 'buttons', []);
- $telegramToken = data_get($telegramData, 'token');
- $chatId = data_get($telegramData, 'chat_id');
- $topicId = null;
- $topicsInstance = get_class($notification);
+ $telegramToken = $settings->telegram_token;
+ $chatId = $settings->telegram_chat_id;
+
+ $topicId = match (get_class($notification)) {
+ \App\Notifications\Test::class => $settings->telegram_notifications_test_topic_id,
+ \App\Notifications\Application\StatusChanged::class,
+ \App\Notifications\Container\ContainerRestarted::class,
+ \App\Notifications\Container\ContainerStopped::class => $settings->telegram_notifications_status_change_topic_id,
+ \App\Notifications\Application\DeploymentSuccess::class => $settings->telegram_notifications_deployment_success_topic_id,
+ \App\Notifications\Application\DeploymentFailed::class => $settings->telegram_notifications_deployment_failure_topic_id,
+ \App\Notifications\Database\BackupSuccess::class => $settings->telegram_notifications_backup_success_topic_id,
+ \App\Notifications\Database\BackupFailed::class => $settings->telegram_notifications_backup_failure_topic_id,
+ \App\Notifications\ScheduledTask\TaskFailed::class => $settings->telegram_notifications_scheduled_task_failure_topic_id,
+ \App\Notifications\Server\Unreachable::class => $settings->telegram_notifications_server_unreachable_topic_id,
+ \App\Notifications\Server\Reachable::class => $settings->telegram_notifications_server_reachable_topic_id,
+ default => null,
+ };
- switch ($topicsInstance) {
- case \App\Notifications\Test::class:
- $topicId = data_get($notifiable, 'telegram_notifications_test_message_thread_id');
- break;
- case \App\Notifications\Application\StatusChanged::class:
- case \App\Notifications\Container\ContainerRestarted::class:
- case \App\Notifications\Container\ContainerStopped::class:
- $topicId = data_get($notifiable, 'telegram_notifications_status_changes_message_thread_id');
- break;
- case \App\Notifications\Application\DeploymentSuccess::class:
- case \App\Notifications\Application\DeploymentFailed::class:
- $topicId = data_get($notifiable, 'telegram_notifications_deployments_message_thread_id');
- break;
- case \App\Notifications\Database\BackupSuccess::class:
- case \App\Notifications\Database\BackupFailed::class:
- $topicId = data_get($notifiable, 'telegram_notifications_database_backups_message_thread_id');
- break;
- case \App\Notifications\ScheduledTask\TaskFailed::class:
- $topicId = data_get($notifiable, 'telegram_notifications_scheduled_tasks_thread_id');
- break;
- }
if (! $telegramToken || ! $chatId || ! $message) {
return;
}
+
SendMessageToTelegramJob::dispatch($message, $buttons, $telegramToken, $chatId, $topicId);
}
}
diff --git a/app/Notifications/Channels/TransactionalEmailChannel.php b/app/Notifications/Channels/TransactionalEmailChannel.php
index cc7d76ebf..761780231 100644
--- a/app/Notifications/Channels/TransactionalEmailChannel.php
+++ b/app/Notifications/Channels/TransactionalEmailChannel.php
@@ -7,7 +7,6 @@ use Exception;
use Illuminate\Mail\Message;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Mail;
-use Log;
class TransactionalEmailChannel
{
@@ -15,8 +14,6 @@ class TransactionalEmailChannel
{
$settings = instanceSettings();
if (! data_get($settings, 'smtp_enabled') && ! data_get($settings, 'resend_enabled')) {
- Log::info('SMTP/Resend not enabled');
-
return;
}
$email = $notifiable->email;
diff --git a/app/Notifications/Container/ContainerRestarted.php b/app/Notifications/Container/ContainerRestarted.php
index f9becd0e8..c25072ecf 100644
--- a/app/Notifications/Container/ContainerRestarted.php
+++ b/app/Notifications/Container/ContainerRestarted.php
@@ -17,7 +17,7 @@ class ContainerRestarted extends CustomEmailNotification
public function via(object $notifiable): array
{
- return setNotificationChannels($notifiable, 'status_changes');
+ return $notifiable->getEnabledChannels('status_change');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Container/ContainerStopped.php b/app/Notifications/Container/ContainerStopped.php
index eae2cf552..bc6e52b6d 100644
--- a/app/Notifications/Container/ContainerStopped.php
+++ b/app/Notifications/Container/ContainerStopped.php
@@ -17,7 +17,7 @@ class ContainerStopped extends CustomEmailNotification
public function via(object $notifiable): array
{
- return setNotificationChannels($notifiable, 'status_changes');
+ return $notifiable->getEnabledChannels('status_change');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Database/BackupFailed.php b/app/Notifications/Database/BackupFailed.php
index 2056255d6..2208f7b1d 100644
--- a/app/Notifications/Database/BackupFailed.php
+++ b/app/Notifications/Database/BackupFailed.php
@@ -23,13 +23,13 @@ class BackupFailed extends CustomEmailNotification
public function via(object $notifiable): array
{
- return setNotificationChannels($notifiable, 'database_backups');
+ return $notifiable->getEnabledChannels('backup_failure');
}
public function toMail(): MailMessage
{
$mail = new MailMessage;
- $mail->subject("Coolify: [ACTION REQUIRED] Backup FAILED for {$this->database->name}");
+ $mail->subject("Coolify: [ACTION REQUIRED] Database Backup FAILED for {$this->database->name}");
$mail->view('emails.backup-failed', [
'name' => $this->name,
'database_name' => $this->database_name,
diff --git a/app/Notifications/Database/BackupSuccess.php b/app/Notifications/Database/BackupSuccess.php
index 71866f9fc..10b4ff3df 100644
--- a/app/Notifications/Database/BackupSuccess.php
+++ b/app/Notifications/Database/BackupSuccess.php
@@ -24,7 +24,7 @@ class BackupSuccess extends CustomEmailNotification
public function via(object $notifiable): array
{
- return setNotificationChannels($notifiable, 'database_backups');
+ return $notifiable->getEnabledChannels('backup_success');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Internal/GeneralNotification.php b/app/Notifications/Internal/GeneralNotification.php
index 347f4a0dd..7049e3055 100644
--- a/app/Notifications/Internal/GeneralNotification.php
+++ b/app/Notifications/Internal/GeneralNotification.php
@@ -2,9 +2,6 @@
namespace App\Notifications\Internal;
-use App\Notifications\Channels\DiscordChannel;
-use App\Notifications\Channels\SlackChannel;
-use App\Notifications\Channels\TelegramChannel;
use App\Notifications\Dto\DiscordMessage;
use App\Notifications\Dto\SlackMessage;
use Illuminate\Bus\Queueable;
@@ -24,22 +21,7 @@ class GeneralNotification extends Notification implements ShouldQueue
public function via(object $notifiable): array
{
- $channels = [];
- $isDiscordEnabled = data_get($notifiable, 'discord_enabled');
- $isTelegramEnabled = data_get($notifiable, 'telegram_enabled');
- $isSlackEnabled = data_get($notifiable, 'slack_enabled');
-
- if ($isDiscordEnabled) {
- $channels[] = DiscordChannel::class;
- }
- if ($isTelegramEnabled) {
- $channels[] = TelegramChannel::class;
- }
- if ($isSlackEnabled) {
- $channels[] = SlackChannel::class;
- }
-
- return $channels;
+ return $notifiable->getEnabledChannels('general');
}
public function toDiscord(): DiscordMessage
diff --git a/app/Notifications/ScheduledTask/TaskFailed.php b/app/Notifications/ScheduledTask/TaskFailed.php
index 753da7ff0..56c410ecb 100644
--- a/app/Notifications/ScheduledTask/TaskFailed.php
+++ b/app/Notifications/ScheduledTask/TaskFailed.php
@@ -16,15 +16,15 @@ class TaskFailed extends CustomEmailNotification
{
$this->onQueue('high');
if ($task->application) {
- $this->url = $task->application->failedTaskLink($task->uuid);
+ $this->url = $task->application->taskLink($task->uuid);
} elseif ($task->service) {
- $this->url = $task->service->failedTaskLink($task->uuid);
+ $this->url = $task->service->taskLink($task->uuid);
}
}
public function via(object $notifiable): array
{
- return setNotificationChannels($notifiable, 'scheduled_tasks');
+ return $notifiable->getEnabledChannels('scheduled_task_failure');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/ScheduledTask/TaskSuccess.php b/app/Notifications/ScheduledTask/TaskSuccess.php
new file mode 100644
index 000000000..fc79aea37
--- /dev/null
+++ b/app/Notifications/ScheduledTask/TaskSuccess.php
@@ -0,0 +1,88 @@
+onQueue('high');
+ if ($task->application) {
+ $this->url = $task->application->taskLink($task->uuid);
+ } elseif ($task->service) {
+ $this->url = $task->service->taskLink($task->uuid);
+ }
+ }
+
+ public function via(object $notifiable): array
+ {
+ return $notifiable->getEnabledChannels('scheduled_task_success');
+ }
+
+ public function toMail(): MailMessage
+ {
+ $mail = new MailMessage;
+ $mail->subject("Coolify: Scheduled task ({$this->task->name}) succeeded.");
+ $mail->view('emails.scheduled-task-success', [
+ 'task' => $this->task,
+ 'url' => $this->url,
+ 'output' => $this->output,
+ ]);
+
+ return $mail;
+ }
+
+ public function toDiscord(): DiscordMessage
+ {
+ $message = new DiscordMessage(
+ title: ':white_check_mark: Scheduled task succeeded',
+ description: "Scheduled task ({$this->task->name}) succeeded.",
+ color: DiscordMessage::successColor(),
+ );
+
+ if ($this->url) {
+ $message->addField('Scheduled task', '[Link]('.$this->url.')');
+ }
+
+ return $message;
+ }
+
+ public function toTelegram(): array
+ {
+ $message = "Coolify: Scheduled task ({$this->task->name}) succeeded.";
+ if ($this->url) {
+ $buttons[] = [
+ 'text' => 'Open task in Coolify',
+ 'url' => (string) $this->url,
+ ];
+ }
+
+ return [
+ 'message' => $message,
+ ];
+ }
+
+ public function toSlack(): SlackMessage
+ {
+ $title = 'Scheduled task succeeded';
+ $description = "Scheduled task ({$this->task->name}) succeeded.";
+
+ if ($this->url) {
+ $description .= "\n\n**Task URL:** {$this->url}";
+ }
+
+ return new SlackMessage(
+ title: $title,
+ description: $description,
+ color: SlackMessage::successColor()
+ );
+ }
+}
diff --git a/app/Notifications/Server/DockerCleanup.php b/app/Notifications/Server/DockerCleanup.php
deleted file mode 100644
index 46b730c7b..000000000
--- a/app/Notifications/Server/DockerCleanup.php
+++ /dev/null
@@ -1,78 +0,0 @@
-onQueue('high');
- }
-
- public function via(object $notifiable): array
- {
- $channels = [];
- // $isEmailEnabled = isEmailEnabled($notifiable);
- $isDiscordEnabled = data_get($notifiable, 'discord_enabled');
- $isTelegramEnabled = data_get($notifiable, 'telegram_enabled');
- $isSlackEnabled = data_get($notifiable, 'slack_enabled');
- if ($isDiscordEnabled) {
- $channels[] = DiscordChannel::class;
- }
- // if ($isEmailEnabled) {
- // $channels[] = EmailChannel::class;
- // }
- if ($isTelegramEnabled) {
- $channels[] = TelegramChannel::class;
- }
- if ($isSlackEnabled) {
- $channels[] = SlackChannel::class;
- }
-
- return $channels;
- }
-
- // public function toMail(): MailMessage
- // {
- // $mail = new MailMessage();
- // $mail->subject("Coolify: Server ({$this->server->name}) high disk usage detected!");
- // $mail->view('emails.high-disk-usage', [
- // 'name' => $this->server->name,
- // 'disk_usage' => $this->disk_usage,
- // 'threshold' => $this->docker_cleanup_threshold,
- // ]);
- // return $mail;
- // }
-
- public function toDiscord(): DiscordMessage
- {
- return new DiscordMessage(
- title: ':white_check_mark: Server cleanup job done',
- description: $this->message,
- color: DiscordMessage::successColor(),
- );
- }
-
- public function toTelegram(): array
- {
- return [
- 'message' => "Coolify: Server '{$this->server->name}' cleanup job done!\n\n{$this->message}",
- ];
- }
-
- public function toSlack(): SlackMessage
- {
- return new SlackMessage(
- title: 'Server cleanup job done',
- description: "Server '{$this->server->name}' cleanup job done!\n\n{$this->message}",
- color: SlackMessage::successColor()
- );
- }
-}
diff --git a/app/Notifications/Server/DockerCleanupFailed.php b/app/Notifications/Server/DockerCleanupFailed.php
new file mode 100644
index 000000000..53714925c
--- /dev/null
+++ b/app/Notifications/Server/DockerCleanupFailed.php
@@ -0,0 +1,59 @@
+onQueue('high');
+ }
+
+ public function via(object $notifiable): array
+ {
+ return $notifiable->getEnabledChannels('docker_cleanup_failure');
+ }
+
+ public function toMail(): MailMessage
+ {
+ $mail = new MailMessage;
+ $mail->subject("Coolify: [ACTION REQUIRED] Docker cleanup job failed on {$this->server->name}");
+ $mail->view('emails.docker-cleanup-failed', [
+ 'name' => $this->server->name,
+ 'text' => $this->message,
+ ]);
+
+ return $mail;
+ }
+
+ public function toDiscord(): DiscordMessage
+ {
+ return new DiscordMessage(
+ title: ':cross_mark: Coolify: [ACTION REQUIRED] Docker cleanup job failed on '.$this->server->name,
+ description: $this->message,
+ color: DiscordMessage::errorColor(),
+ );
+ }
+
+ public function toTelegram(): array
+ {
+ return [
+ 'message' => "Coolify: [ACTION REQUIRED] Docker cleanup job failed on {$this->server->name}!\n\n{$this->message}",
+ ];
+ }
+
+ public function toSlack(): SlackMessage
+ {
+ return new SlackMessage(
+ title: 'Coolify: [ACTION REQUIRED] Docker cleanup job failed',
+ description: "Docker cleanup job failed on '{$this->server->name}'!\n\n{$this->message}",
+ color: SlackMessage::errorColor()
+ );
+ }
+}
diff --git a/app/Notifications/Server/DockerCleanupSuccess.php b/app/Notifications/Server/DockerCleanupSuccess.php
new file mode 100644
index 000000000..85a819da2
--- /dev/null
+++ b/app/Notifications/Server/DockerCleanupSuccess.php
@@ -0,0 +1,59 @@
+onQueue('high');
+ }
+
+ public function via(object $notifiable): array
+ {
+ return $notifiable->getEnabledChannels('docker_cleanup_success');
+ }
+
+ public function toMail(): MailMessage
+ {
+ $mail = new MailMessage;
+ $mail->subject("Coolify: Docker cleanup job succeeded on {$this->server->name}");
+ $mail->view('emails.docker-cleanup-success', [
+ 'name' => $this->server->name,
+ 'text' => $this->message,
+ ]);
+
+ return $mail;
+ }
+
+ public function toDiscord(): DiscordMessage
+ {
+ return new DiscordMessage(
+ title: ':white_check_mark: Coolify: Docker cleanup job succeeded on '.$this->server->name,
+ description: $this->message,
+ color: DiscordMessage::successColor(),
+ );
+ }
+
+ public function toTelegram(): array
+ {
+ return [
+ 'message' => "Coolify: Docker cleanup job succeeded on {$this->server->name}!\n\n{$this->message}",
+ ];
+ }
+
+ public function toSlack(): SlackMessage
+ {
+ return new SlackMessage(
+ title: 'Coolify: Docker cleanup job succeeded',
+ description: "Docker cleanup job succeeded on '{$this->server->name}'!\n\n{$this->message}",
+ color: SlackMessage::successColor()
+ );
+ }
+}
diff --git a/app/Notifications/Server/ForceDisabled.php b/app/Notifications/Server/ForceDisabled.php
index 143917dde..e122849da 100644
--- a/app/Notifications/Server/ForceDisabled.php
+++ b/app/Notifications/Server/ForceDisabled.php
@@ -3,10 +3,6 @@
namespace App\Notifications\Server;
use App\Models\Server;
-use App\Notifications\Channels\DiscordChannel;
-use App\Notifications\Channels\EmailChannel;
-use App\Notifications\Channels\SlackChannel;
-use App\Notifications\Channels\TelegramChannel;
use App\Notifications\CustomEmailNotification;
use App\Notifications\Dto\DiscordMessage;
use App\Notifications\Dto\SlackMessage;
@@ -21,25 +17,7 @@ class ForceDisabled extends CustomEmailNotification
public function via(object $notifiable): array
{
- $channels = [];
- $isEmailEnabled = isEmailEnabled($notifiable);
- $isDiscordEnabled = data_get($notifiable, 'discord_enabled');
- $isTelegramEnabled = data_get($notifiable, 'telegram_enabled');
- $isSlackEnabled = data_get($notifiable, 'slack_enabled');
- if ($isDiscordEnabled) {
- $channels[] = DiscordChannel::class;
- }
- if ($isEmailEnabled) {
- $channels[] = EmailChannel::class;
- }
- if ($isTelegramEnabled) {
- $channels[] = TelegramChannel::class;
- }
- if ($isSlackEnabled) {
- $channels[] = SlackChannel::class;
- }
-
- return $channels;
+ return $notifiable->getEnabledChannels('server_force_disabled');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Server/ForceEnabled.php b/app/Notifications/Server/ForceEnabled.php
index 3b83882d8..a0e0a8b59 100644
--- a/app/Notifications/Server/ForceEnabled.php
+++ b/app/Notifications/Server/ForceEnabled.php
@@ -3,10 +3,6 @@
namespace App\Notifications\Server;
use App\Models\Server;
-use App\Notifications\Channels\DiscordChannel;
-use App\Notifications\Channels\EmailChannel;
-use App\Notifications\Channels\SlackChannel;
-use App\Notifications\Channels\TelegramChannel;
use App\Notifications\CustomEmailNotification;
use App\Notifications\Dto\DiscordMessage;
use App\Notifications\Dto\SlackMessage;
@@ -21,25 +17,7 @@ class ForceEnabled extends CustomEmailNotification
public function via(object $notifiable): array
{
- $channels = [];
- $isEmailEnabled = isEmailEnabled($notifiable);
- $isDiscordEnabled = data_get($notifiable, 'discord_enabled');
- $isTelegramEnabled = data_get($notifiable, 'telegram_enabled');
- $isSlackEnabled = data_get($notifiable, 'slack_enabled');
- if ($isDiscordEnabled) {
- $channels[] = DiscordChannel::class;
- }
- if ($isEmailEnabled) {
- $channels[] = EmailChannel::class;
- }
- if ($isTelegramEnabled) {
- $channels[] = TelegramChannel::class;
- }
- if ($isSlackEnabled) {
- $channels[] = SlackChannel::class;
- }
-
- return $channels;
+ return $notifiable->getEnabledChannels('server_force_enabled');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Server/HighDiskUsage.php b/app/Notifications/Server/HighDiskUsage.php
index baff49508..9f4826689 100644
--- a/app/Notifications/Server/HighDiskUsage.php
+++ b/app/Notifications/Server/HighDiskUsage.php
@@ -17,7 +17,7 @@ class HighDiskUsage extends CustomEmailNotification
public function via(object $notifiable): array
{
- return setNotificationChannels($notifiable, 'server_disk_usage');
+ return $notifiable->getEnabledChannels('server_disk_usage');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Server/Reachable.php b/app/Notifications/Server/Reachable.php
index 62ece34e8..4917e04f8 100644
--- a/app/Notifications/Server/Reachable.php
+++ b/app/Notifications/Server/Reachable.php
@@ -3,10 +3,6 @@
namespace App\Notifications\Server;
use App\Models\Server;
-use App\Notifications\Channels\DiscordChannel;
-use App\Notifications\Channels\EmailChannel;
-use App\Notifications\Channels\SlackChannel;
-use App\Notifications\Channels\TelegramChannel;
use App\Notifications\CustomEmailNotification;
use App\Notifications\Dto\DiscordMessage;
use App\Notifications\Dto\SlackMessage;
@@ -30,25 +26,7 @@ class Reachable extends CustomEmailNotification
return [];
}
- $channels = [];
- $isEmailEnabled = isEmailEnabled($notifiable);
- $isDiscordEnabled = data_get($notifiable, 'discord_enabled');
- $isTelegramEnabled = data_get($notifiable, 'telegram_enabled');
- $isSlackEnabled = data_get($notifiable, 'slack_enabled');
- if ($isDiscordEnabled) {
- $channels[] = DiscordChannel::class;
- }
- if ($isEmailEnabled) {
- $channels[] = EmailChannel::class;
- }
- if ($isTelegramEnabled) {
- $channels[] = TelegramChannel::class;
- }
- if ($isSlackEnabled) {
- $channels[] = SlackChannel::class;
- }
-
- return $channels;
+ return $notifiable->getEnabledChannels('server_reachable');
}
public function toMail(): MailMessage
diff --git a/app/Notifications/Server/Unreachable.php b/app/Notifications/Server/Unreachable.php
index 2a90d7552..43f176d49 100644
--- a/app/Notifications/Server/Unreachable.php
+++ b/app/Notifications/Server/Unreachable.php
@@ -3,10 +3,6 @@
namespace App\Notifications\Server;
use App\Models\Server;
-use App\Notifications\Channels\DiscordChannel;
-use App\Notifications\Channels\EmailChannel;
-use App\Notifications\Channels\SlackChannel;
-use App\Notifications\Channels\TelegramChannel;
use App\Notifications\CustomEmailNotification;
use App\Notifications\Dto\DiscordMessage;
use App\Notifications\Dto\SlackMessage;
@@ -30,26 +26,7 @@ class Unreachable extends CustomEmailNotification
return [];
}
- $channels = [];
- $isEmailEnabled = isEmailEnabled($notifiable);
- $isDiscordEnabled = data_get($notifiable, 'discord_enabled');
- $isTelegramEnabled = data_get($notifiable, 'telegram_enabled');
- $isSlackEnabled = data_get($notifiable, 'slack_enabled');
-
- if ($isDiscordEnabled) {
- $channels[] = DiscordChannel::class;
- }
- if ($isEmailEnabled) {
- $channels[] = EmailChannel::class;
- }
- if ($isTelegramEnabled) {
- $channels[] = TelegramChannel::class;
- }
- if ($isSlackEnabled) {
- $channels[] = SlackChannel::class;
- }
-
- return $channels;
+ return $notifiable->getEnabledChannels('server_unreachable');
}
public function toMail(): ?MailMessage
diff --git a/app/Notifications/Test.php b/app/Notifications/Test.php
index 03f6c3296..da9098500 100644
--- a/app/Notifications/Test.php
+++ b/app/Notifications/Test.php
@@ -2,6 +2,10 @@
namespace App\Notifications;
+use App\Notifications\Channels\DiscordChannel;
+use App\Notifications\Channels\EmailChannel;
+use App\Notifications\Channels\SlackChannel;
+use App\Notifications\Channels\TelegramChannel;
use App\Notifications\Dto\DiscordMessage;
use App\Notifications\Dto\SlackMessage;
use Illuminate\Bus\Queueable;
@@ -16,20 +20,32 @@ class Test extends Notification implements ShouldQueue
public $tries = 5;
- public function __construct(public ?string $emails = null)
+ public function __construct(public ?string $emails = null, public ?string $channel = null)
{
$this->onQueue('high');
}
public function via(object $notifiable): array
{
- return setNotificationChannels($notifiable, 'test');
+ if ($this->channel) {
+ $channels = match ($this->channel) {
+ 'email' => [EmailChannel::class],
+ 'discord' => [DiscordChannel::class],
+ 'telegram' => [TelegramChannel::class],
+ 'slack' => [SlackChannel::class],
+ default => [],
+ };
+ } else {
+ $channels = $notifiable->getEnabledChannels('test');
+ }
+
+ return $channels;
}
public function middleware(object $notifiable, string $channel)
{
return match ($channel) {
- \App\Notifications\Channels\EmailChannel::class => [new RateLimited('email')],
+ EmailChannel::class => [new RateLimited('email')],
default => [],
};
}
diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php
index bbbf48345..ed27a158a 100644
--- a/app/Providers/FortifyServiceProvider.php
+++ b/app/Providers/FortifyServiceProvider.php
@@ -50,13 +50,10 @@ class FortifyServiceProvider extends ServiceProvider
if (! $settings->is_registration_enabled) {
return redirect()->route('login');
}
- if (config('constants.waitlist.enabled')) {
- return redirect()->route('waitlist.index');
- } else {
- return view('auth.register', [
- 'isFirstUser' => $isFirstUser,
- ]);
- }
+
+ return view('auth.register', [
+ 'isFirstUser' => $isFirstUser,
+ ]);
});
Fortify::loginView(function () {
diff --git a/app/Traits/HasNotificationSettings.php b/app/Traits/HasNotificationSettings.php
new file mode 100644
index 000000000..82cbda6ad
--- /dev/null
+++ b/app/Traits/HasNotificationSettings.php
@@ -0,0 +1,90 @@
+ $this->emailNotificationSettings,
+ 'discord' => $this->discordNotificationSettings,
+ 'telegram' => $this->telegramNotificationSettings,
+ 'slack' => $this->slackNotificationSettings,
+ default => null,
+ };
+ }
+
+ /**
+ * Check if a notification channel is enabled
+ */
+ public function isNotificationEnabled(string $channel): bool
+ {
+ $settings = $this->getNotificationSettings($channel);
+
+ return $settings?->isEnabled() ?? false;
+ }
+
+ /**
+ * Check if a specific notification type is enabled for a channel
+ */
+ public function isNotificationTypeEnabled(string $channel, string $event): bool
+ {
+ $settings = $this->getNotificationSettings($channel);
+
+ if (! $settings || ! $this->isNotificationEnabled($channel)) {
+ return false;
+ }
+
+ if (in_array($event, $this->alwaysSendEvents)) {
+ return true;
+ }
+
+ $settingKey = "{$event}_{$channel}_notifications";
+
+ return (bool) $settings->$settingKey;
+ }
+
+ /**
+ * Get all enabled notification channels for an event
+ */
+ public function getEnabledChannels(string $event): array
+ {
+ $channels = [];
+
+ $channelMap = [
+ 'email' => EmailChannel::class,
+ 'discord' => DiscordChannel::class,
+ 'telegram' => TelegramChannel::class,
+ 'slack' => SlackChannel::class,
+ ];
+
+ if ($event === 'general') {
+ unset($channelMap['email']);
+ }
+
+ foreach ($channelMap as $channel => $channelClass) {
+ if ($this->isNotificationEnabled($channel) && $this->isNotificationTypeEnabled($channel, $event)) {
+ $channels[] = $channelClass;
+ }
+ }
+
+ return $channels;
+ }
+}
diff --git a/bootstrap/helpers/notifications.php b/bootstrap/helpers/notifications.php
new file mode 100644
index 000000000..3b1eb758b
--- /dev/null
+++ b/bootstrap/helpers/notifications.php
@@ -0,0 +1,87 @@
+smtp_enabled || $settings->resend_enabled;
+}
+
+function send_internal_notification(string $message): void
+{
+ try {
+ $team = Team::find(0);
+ $team?->notify(new GeneralNotification($message));
+ } catch (\Throwable $e) {
+ ray($e->getMessage());
+ }
+}
+
+function send_user_an_email(MailMessage $mail, string $email, ?string $cc = null): void
+{
+ $settings = instanceSettings();
+ $type = set_transanctional_email_settings($settings);
+ if (! $type) {
+ throw new Exception('No email settings found.');
+ }
+ if ($cc) {
+ Mail::send(
+ [],
+ [],
+ fn (Message $message) => $message
+ ->to($email)
+ ->replyTo($email)
+ ->cc($cc)
+ ->subject($mail->subject)
+ ->html((string) $mail->render())
+ );
+ } else {
+ Mail::send(
+ [],
+ [],
+ fn (Message $message) => $message
+ ->to($email)
+ ->subject($mail->subject)
+ ->html((string) $mail->render())
+ );
+ }
+}
+
+function set_transanctional_email_settings(?InstanceSettings $settings = null): ?string //
+{
+ if (! $settings) {
+ $settings = instanceSettings();
+ }
+ config()->set('mail.from.address', data_get($settings, 'smtp_from_address'));
+ config()->set('mail.from.name', data_get($settings, 'smtp_from_name'));
+ if (data_get($settings, 'resend_enabled')) {
+ config()->set('mail.default', 'resend');
+ config()->set('resend.api_key', data_get($settings, 'resend_api_key'));
+
+ return 'resend';
+ }
+ if (data_get($settings, 'smtp_enabled')) {
+ config()->set('mail.default', 'smtp');
+ config()->set('mail.mailers.smtp', [
+ 'transport' => 'smtp',
+ 'host' => data_get($settings, 'smtp_host'),
+ 'port' => data_get($settings, 'smtp_port'),
+ 'encryption' => data_get($settings, 'smtp_encryption'),
+ 'username' => data_get($settings, 'smtp_username'),
+ 'password' => data_get($settings, 'smtp_password'),
+ 'timeout' => data_get($settings, 'smtp_timeout'),
+ 'local_domain' => null,
+ ]);
+
+ return 'smtp';
+ }
+
+ return null;
+}
diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php
index 835ead24c..ea051c84e 100644
--- a/bootstrap/helpers/shared.php
+++ b/bootstrap/helpers/shared.php
@@ -25,23 +25,15 @@ use App\Models\StandalonePostgresql;
use App\Models\StandaloneRedis;
use App\Models\Team;
use App\Models\User;
-use App\Notifications\Channels\DiscordChannel;
-use App\Notifications\Channels\EmailChannel;
-use App\Notifications\Channels\SlackChannel;
-use App\Notifications\Channels\TelegramChannel;
-use App\Notifications\Internal\GeneralNotification;
use Carbon\CarbonImmutable;
use DanHarrin\LivewireRateLimiting\Exceptions\TooManyRequestsException;
use Illuminate\Database\UniqueConstraintViolationException;
-use Illuminate\Mail\Message;
-use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Process\Pool;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Http;
-use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Process;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Request;
@@ -267,43 +259,6 @@ function generate_application_name(string $git_repository, string $git_branch, ?
return Str::kebab("$git_repository:$git_branch-$cuid");
}
-function is_transactional_emails_active(): bool
-{
- return isEmailEnabled(\App\Models\InstanceSettings::get());
-}
-
-function set_transanctional_email_settings(?InstanceSettings $settings = null): ?string
-{
- if (! $settings) {
- $settings = instanceSettings();
- }
- config()->set('mail.from.address', data_get($settings, 'smtp_from_address'));
- config()->set('mail.from.name', data_get($settings, 'smtp_from_name'));
- if (data_get($settings, 'resend_enabled')) {
- config()->set('mail.default', 'resend');
- config()->set('resend.api_key', data_get($settings, 'resend_api_key'));
-
- return 'resend';
- }
- if (data_get($settings, 'smtp_enabled')) {
- config()->set('mail.default', 'smtp');
- config()->set('mail.mailers.smtp', [
- 'transport' => 'smtp',
- 'host' => data_get($settings, 'smtp_host'),
- 'port' => data_get($settings, 'smtp_port'),
- 'encryption' => data_get($settings, 'smtp_encryption'),
- 'username' => data_get($settings, 'smtp_username'),
- 'password' => data_get($settings, 'smtp_password'),
- 'timeout' => data_get($settings, 'smtp_timeout'),
- 'local_domain' => null,
- ]);
-
- return 'smtp';
- }
-
- return null;
-}
-
function base_ip(): string
{
if (isDev()) {
@@ -414,85 +369,7 @@ function validate_timezone(string $timezone): bool
{
return in_array($timezone, timezone_identifiers_list());
}
-function send_internal_notification(string $message): void
-{
- try {
- $team = Team::find(0);
- $team?->notify(new GeneralNotification($message));
- } catch (\Throwable $e) {
- ray($e->getMessage());
- }
-}
-function send_user_an_email(MailMessage $mail, string $email, ?string $cc = null): void
-{
- $settings = instanceSettings();
- $type = set_transanctional_email_settings($settings);
- if (! $type) {
- throw new Exception('No email settings found.');
- }
- if ($cc) {
- Mail::send(
- [],
- [],
- fn (Message $message) => $message
- ->to($email)
- ->replyTo($email)
- ->cc($cc)
- ->subject($mail->subject)
- ->html((string) $mail->render())
- );
- } else {
- Mail::send(
- [],
- [],
- fn (Message $message) => $message
- ->to($email)
- ->subject($mail->subject)
- ->html((string) $mail->render())
- );
- }
-}
-function isTestEmailEnabled($notifiable)
-{
- if (data_get($notifiable, 'use_instance_email_settings') && isInstanceAdmin()) {
- return true;
- } elseif (data_get($notifiable, 'smtp_enabled') || data_get($notifiable, 'resend_enabled') && auth()->user()->isAdminFromSession()) {
- return true;
- }
- return false;
-}
-function isEmailEnabled($notifiable)
-{
- return data_get($notifiable, 'smtp_enabled') || data_get($notifiable, 'resend_enabled') || data_get($notifiable, 'use_instance_email_settings');
-}
-function setNotificationChannels($notifiable, $event)
-{
- $channels = [];
- $isEmailEnabled = isEmailEnabled($notifiable);
- $isSlackEnabled = data_get($notifiable, 'slack_enabled');
- $isDiscordEnabled = data_get($notifiable, 'discord_enabled');
- $isTelegramEnabled = data_get($notifiable, 'telegram_enabled');
- $isSubscribedToEmailEvent = data_get($notifiable, "smtp_notifications_$event");
- $isSubscribedToDiscordEvent = data_get($notifiable, "discord_notifications_$event");
- $isSubscribedToTelegramEvent = data_get($notifiable, "telegram_notifications_$event");
- $isSubscribedToSlackEvent = data_get($notifiable, "slack_notifications_$event");
-
- if ($isDiscordEnabled && $isSubscribedToDiscordEvent) {
- $channels[] = DiscordChannel::class;
- }
- if ($isEmailEnabled && $isSubscribedToEmailEvent) {
- $channels[] = EmailChannel::class;
- }
- if ($isTelegramEnabled && $isSubscribedToTelegramEvent) {
- $channels[] = TelegramChannel::class;
- }
- if ($isSlackEnabled && $isSubscribedToSlackEvent) {
- $channels[] = SlackChannel::class;
- }
-
- return $channels;
-}
function parseEnvFormatToArray($env_file_contents)
{
$env_array = [];
diff --git a/bootstrap/helpers/subscriptions.php b/bootstrap/helpers/subscriptions.php
index 8ddb1331c..ab9ee9b9d 100644
--- a/bootstrap/helpers/subscriptions.php
+++ b/bootstrap/helpers/subscriptions.php
@@ -67,7 +67,6 @@ function allowedPathsForUnsubscribedAccounts()
'subscription/new',
'login',
'logout',
- 'waitlist',
'force-password-reset',
'livewire/update',
];
diff --git a/composer.json b/composer.json
index 694bad882..d1c6f5e4f 100644
--- a/composer.json
+++ b/composer.json
@@ -13,7 +13,7 @@
"require": {
"php": "^8.2",
"3sidedcube/laravel-redoc": "^1.0",
- "danharrin/livewire-rate-limiting": "^1.1",
+ "danharrin/livewire-rate-limiting": "2.0.0",
"doctrine/dbal": "^4.2",
"guzzlehttp/guzzle": "^7.5.0",
"laravel/fortify": "^1.16.0",
diff --git a/composer.lock b/composer.lock
index 8ea0d9a5a..68044ab56 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "f50de759f43a3eefb58ce9ebbb02d33b",
+ "content-hash": "d96fe0aedd865274164c34a1b04195fe",
"packages": [
{
"name": "3sidedcube/laravel-redoc",
@@ -979,16 +979,16 @@
},
{
"name": "aws/aws-sdk-php",
- "version": "3.327.1",
+ "version": "3.334.2",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "3d52ec587989b136e486f94eff3dd316465aeb42"
+ "reference": "b19afc076bb1cc2617bdef76efd41587596109e7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3d52ec587989b136e486f94eff3dd316465aeb42",
- "reference": "3d52ec587989b136e486f94eff3dd316465aeb42",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b19afc076bb1cc2617bdef76efd41587596109e7",
+ "reference": "b19afc076bb1cc2617bdef76efd41587596109e7",
"shasum": ""
},
"require": {
@@ -1017,8 +1017,8 @@
"nette/neon": "^2.3",
"paragonie/random_compat": ">= 2",
"phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5",
- "psr/cache": "^1.0",
- "psr/simple-cache": "^1.0",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "psr/simple-cache": "^1.0 || ^2.0 || ^3.0",
"sebastian/comparator": "^1.2.3 || ^4.0",
"yoast/phpunit-polyfills": "^1.0"
},
@@ -1071,9 +1071,9 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
- "source": "https://github.com/aws/aws-sdk-php/tree/3.327.1"
+ "source": "https://github.com/aws/aws-sdk-php/tree/3.334.2"
},
- "time": "2024-11-15T01:53:30+00:00"
+ "time": "2024-12-09T19:30:23+00:00"
},
{
"name": "bacon/bacon-qr-code",
@@ -1260,16 +1260,16 @@
},
{
"name": "danharrin/livewire-rate-limiting",
- "version": "v1.3.1",
+ "version": "v2.0.0",
"source": {
"type": "git",
"url": "https://github.com/danharrin/livewire-rate-limiting.git",
- "reference": "1a1b299e20de61f88ed6e94ea0bbcfc33aab1ddb"
+ "reference": "0d9c1890174b3d1857dba6ce76de7c178fe20283"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/1a1b299e20de61f88ed6e94ea0bbcfc33aab1ddb",
- "reference": "1a1b299e20de61f88ed6e94ea0bbcfc33aab1ddb",
+ "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/0d9c1890174b3d1857dba6ce76de7c178fe20283",
+ "reference": "0d9c1890174b3d1857dba6ce76de7c178fe20283",
"shasum": ""
},
"require": {
@@ -1310,7 +1310,7 @@
"type": "github"
}
],
- "time": "2024-05-06T09:10:03+00:00"
+ "time": "2024-11-24T16:57:47+00:00"
},
{
"name": "dasprid/enum",
@@ -1591,29 +1591,27 @@
},
{
"name": "doctrine/deprecations",
- "version": "1.1.3",
+ "version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/doctrine/deprecations.git",
- "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab"
+ "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
- "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9",
+ "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
- "doctrine/coding-standard": "^9",
- "phpstan/phpstan": "1.4.10 || 1.10.15",
- "phpstan/phpstan-phpunit": "^1.0",
+ "doctrine/coding-standard": "^9 || ^12",
+ "phpstan/phpstan": "1.4.10 || 2.0.3",
+ "phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "psalm/plugin-phpunit": "0.18.4",
- "psr/log": "^1 || ^2 || ^3",
- "vimeo/psalm": "4.30.0 || 5.12.0"
+ "psr/log": "^1 || ^2 || ^3"
},
"suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation"
@@ -1621,7 +1619,7 @@
"type": "library",
"autoload": {
"psr-4": {
- "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
+ "Doctrine\\Deprecations\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1632,9 +1630,9 @@
"homepage": "https://www.doctrine-project.org/",
"support": {
"issues": "https://github.com/doctrine/deprecations/issues",
- "source": "https://github.com/doctrine/deprecations/tree/1.1.3"
+ "source": "https://github.com/doctrine/deprecations/tree/1.1.4"
},
- "time": "2024-01-30T19:34:25+00:00"
+ "time": "2024-12-07T21:18:45+00:00"
},
{
"name": "doctrine/inflector",
@@ -1938,16 +1936,16 @@
},
{
"name": "firebase/php-jwt",
- "version": "v6.10.1",
+ "version": "v6.10.2",
"source": {
"type": "git",
"url": "https://github.com/firebase/php-jwt.git",
- "reference": "500501c2ce893c824c801da135d02661199f60c5"
+ "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5",
- "reference": "500501c2ce893c824c801da135d02661199f60c5",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/30c19ed0f3264cb660ea496895cfb6ef7ee3653b",
+ "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b",
"shasum": ""
},
"require": {
@@ -1995,9 +1993,9 @@
],
"support": {
"issues": "https://github.com/firebase/php-jwt/issues",
- "source": "https://github.com/firebase/php-jwt/tree/v6.10.1"
+ "source": "https://github.com/firebase/php-jwt/tree/v6.10.2"
},
- "time": "2024-05-18T18:05:11+00:00"
+ "time": "2024-11-24T11:22:49+00:00"
},
{
"name": "fruitcake/php-cors",
@@ -2545,28 +2543,28 @@
},
{
"name": "jean85/pretty-package-versions",
- "version": "2.0.6",
+ "version": "2.1.0",
"source": {
"type": "git",
"url": "https://github.com/Jean85/pretty-package-versions.git",
- "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4"
+ "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4",
- "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4",
+ "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10",
+ "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10",
"shasum": ""
},
"require": {
- "composer-runtime-api": "^2.0.0",
- "php": "^7.1|^8.0"
+ "composer-runtime-api": "^2.1.0",
+ "php": "^7.4|^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.2",
"jean85/composer-provided-replaced-stub-package": "^1.0",
"phpstan/phpstan": "^1.4",
- "phpunit/phpunit": "^7.5|^8.5|^9.4",
- "vimeo/psalm": "^4.3"
+ "phpunit/phpunit": "^7.5|^8.5|^9.6",
+ "vimeo/psalm": "^4.3 || ^5.0"
},
"type": "library",
"extra": {
@@ -2598,9 +2596,9 @@
],
"support": {
"issues": "https://github.com/Jean85/pretty-package-versions/issues",
- "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6"
+ "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0"
},
- "time": "2024-03-08T09:58:59+00:00"
+ "time": "2024-11-18T16:19:46+00:00"
},
{
"name": "kelunik/certificate",
@@ -2662,16 +2660,16 @@
},
{
"name": "laravel/fortify",
- "version": "v1.24.5",
+ "version": "v1.25.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/fortify.git",
- "reference": "bba8c2ecc3fcc78e8632e0d719ae10bef6343eef"
+ "reference": "5022e7c01385fd6edcef91c12b19071f8f20d6d8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/fortify/zipball/bba8c2ecc3fcc78e8632e0d719ae10bef6343eef",
- "reference": "bba8c2ecc3fcc78e8632e0d719ae10bef6343eef",
+ "url": "https://api.github.com/repos/laravel/fortify/zipball/5022e7c01385fd6edcef91c12b19071f8f20d6d8",
+ "reference": "5022e7c01385fd6edcef91c12b19071f8f20d6d8",
"shasum": ""
},
"require": {
@@ -2690,13 +2688,13 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- },
"laravel": {
"providers": [
"Laravel\\Fortify\\FortifyServiceProvider"
]
+ },
+ "branch-alias": {
+ "dev-master": "1.x-dev"
}
},
"autoload": {
@@ -2723,27 +2721,27 @@
"issues": "https://github.com/laravel/fortify/issues",
"source": "https://github.com/laravel/fortify"
},
- "time": "2024-11-12T14:51:12+00:00"
+ "time": "2024-11-27T14:51:15+00:00"
},
{
"name": "laravel/framework",
- "version": "v11.31.0",
+ "version": "v11.35.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "365090ed2c68244e3141cdb5e247cdf3dfba2c40"
+ "reference": "f1a7aaa3c1235b7a95ccaa58db90e0cd9d8c3fcc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/365090ed2c68244e3141cdb5e247cdf3dfba2c40",
- "reference": "365090ed2c68244e3141cdb5e247cdf3dfba2c40",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/f1a7aaa3c1235b7a95ccaa58db90e0cd9d8c3fcc",
+ "reference": "f1a7aaa3c1235b7a95ccaa58db90e0cd9d8c3fcc",
"shasum": ""
},
"require": {
"brick/math": "^0.9.3|^0.10.2|^0.11|^0.12",
"composer-runtime-api": "^2.2",
"doctrine/inflector": "^2.0.5",
- "dragonmantank/cron-expression": "^3.3.2",
+ "dragonmantank/cron-expression": "^3.4",
"egulias/email-validator": "^3.2.1|^4.0",
"ext-ctype": "*",
"ext-filter": "*",
@@ -2753,35 +2751,37 @@
"ext-session": "*",
"ext-tokenizer": "*",
"fruitcake/php-cors": "^1.3",
- "guzzlehttp/guzzle": "^7.8",
+ "guzzlehttp/guzzle": "^7.8.2",
"guzzlehttp/uri-template": "^1.0",
"laravel/prompts": "^0.1.18|^0.2.0|^0.3.0",
- "laravel/serializable-closure": "^1.3",
+ "laravel/serializable-closure": "^1.3|^2.0",
"league/commonmark": "^2.2.1",
- "league/flysystem": "^3.8.0",
+ "league/flysystem": "^3.25.1",
+ "league/flysystem-local": "^3.25.1",
+ "league/uri": "^7.5.1",
"monolog/monolog": "^3.0",
- "nesbot/carbon": "^2.72.2|^3.0",
+ "nesbot/carbon": "^2.72.2|^3.4",
"nunomaduro/termwind": "^2.0",
"php": "^8.2",
"psr/container": "^1.1.1|^2.0.1",
"psr/log": "^1.0|^2.0|^3.0",
"psr/simple-cache": "^1.0|^2.0|^3.0",
"ramsey/uuid": "^4.7",
- "symfony/console": "^7.0",
- "symfony/error-handler": "^7.0",
- "symfony/finder": "^7.0",
- "symfony/http-foundation": "^7.0",
- "symfony/http-kernel": "^7.0",
- "symfony/mailer": "^7.0",
- "symfony/mime": "^7.0",
- "symfony/polyfill-php83": "^1.28",
- "symfony/process": "^7.0",
- "symfony/routing": "^7.0",
- "symfony/uid": "^7.0",
- "symfony/var-dumper": "^7.0",
+ "symfony/console": "^7.0.3",
+ "symfony/error-handler": "^7.0.3",
+ "symfony/finder": "^7.0.3",
+ "symfony/http-foundation": "^7.0.3",
+ "symfony/http-kernel": "^7.0.3",
+ "symfony/mailer": "^7.0.3",
+ "symfony/mime": "^7.0.3",
+ "symfony/polyfill-php83": "^1.31",
+ "symfony/process": "^7.0.3",
+ "symfony/routing": "^7.0.3",
+ "symfony/uid": "^7.0.3",
+ "symfony/var-dumper": "^7.0.3",
"tijsverkoyen/css-to-inline-styles": "^2.2.5",
- "vlucas/phpdotenv": "^5.4.1",
- "voku/portable-ascii": "^2.0"
+ "vlucas/phpdotenv": "^5.6.1",
+ "voku/portable-ascii": "^2.0.2"
},
"conflict": {
"mockery/mockery": "1.6.8",
@@ -2831,29 +2831,32 @@
},
"require-dev": {
"ably/ably-php": "^1.0",
- "aws/aws-sdk-php": "^3.235.5",
+ "aws/aws-sdk-php": "^3.322.9",
"ext-gmp": "*",
- "fakerphp/faker": "^1.23",
- "league/flysystem-aws-s3-v3": "^3.0",
- "league/flysystem-ftp": "^3.0",
- "league/flysystem-path-prefixing": "^3.3",
- "league/flysystem-read-only": "^3.3",
- "league/flysystem-sftp-v3": "^3.0",
- "mockery/mockery": "^1.6",
- "nyholm/psr7": "^1.2",
- "orchestra/testbench-core": "^9.5",
- "pda/pheanstalk": "^5.0",
+ "fakerphp/faker": "^1.24",
+ "guzzlehttp/promises": "^2.0.3",
+ "guzzlehttp/psr7": "^2.4",
+ "league/flysystem-aws-s3-v3": "^3.25.1",
+ "league/flysystem-ftp": "^3.25.1",
+ "league/flysystem-path-prefixing": "^3.25.1",
+ "league/flysystem-read-only": "^3.25.1",
+ "league/flysystem-sftp-v3": "^3.25.1",
+ "mockery/mockery": "^1.6.10",
+ "orchestra/testbench-core": "^9.6",
+ "pda/pheanstalk": "^5.0.6",
+ "php-http/discovery": "^1.15",
"phpstan/phpstan": "^1.11.5",
- "phpunit/phpunit": "^10.5|^11.0",
- "predis/predis": "^2.0.2",
+ "phpunit/phpunit": "^10.5.35|^11.3.6",
+ "predis/predis": "^2.3",
"resend/resend-php": "^0.10.0",
- "symfony/cache": "^7.0",
- "symfony/http-client": "^7.0",
- "symfony/psr-http-message-bridge": "^7.0"
+ "symfony/cache": "^7.0.3",
+ "symfony/http-client": "^7.0.3",
+ "symfony/psr-http-message-bridge": "^7.0.3",
+ "symfony/translation": "^7.0.3"
},
"suggest": {
"ably/ably-php": "Required to use the Ably broadcast driver (^1.0).",
- "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).",
+ "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).",
"brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).",
"ext-apcu": "Required to use the APC cache driver.",
"ext-fileinfo": "Required to use the Filesystem class.",
@@ -2867,16 +2870,16 @@
"fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
"filp/whoops": "Required for friendly error pages in development (^2.14.3).",
"laravel/tinker": "Required to use the tinker console command (^2.0).",
- "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).",
- "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).",
- "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).",
- "league/flysystem-read-only": "Required to use read-only disks (^3.3)",
- "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).",
+ "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).",
+ "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).",
+ "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).",
+ "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)",
+ "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).",
"mockery/mockery": "Required to use mocking (^1.6).",
- "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).",
"pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).",
+ "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).",
"phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).",
- "predis/predis": "Required to use the predis connector (^2.0.2).",
+ "predis/predis": "Required to use the predis connector (^2.3).",
"psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
"pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).",
"resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).",
@@ -2895,6 +2898,7 @@
},
"autoload": {
"files": [
+ "src/Illuminate/Collections/functions.php",
"src/Illuminate/Collections/helpers.php",
"src/Illuminate/Events/functions.php",
"src/Illuminate/Filesystem/functions.php",
@@ -2932,20 +2936,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2024-11-12T15:36:15+00:00"
+ "time": "2024-12-10T16:09:29+00:00"
},
{
"name": "laravel/horizon",
- "version": "v5.29.3",
+ "version": "v5.30.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/horizon.git",
- "reference": "a48d242759704e598242074daf0060bbeb6ed46d"
+ "reference": "37d1f29daa7500fcd170d5c45b98b592fcaab95a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/horizon/zipball/a48d242759704e598242074daf0060bbeb6ed46d",
- "reference": "a48d242759704e598242074daf0060bbeb6ed46d",
+ "url": "https://api.github.com/repos/laravel/horizon/zipball/37d1f29daa7500fcd170d5c45b98b592fcaab95a",
+ "reference": "37d1f29daa7500fcd170d5c45b98b592fcaab95a",
"shasum": ""
},
"require": {
@@ -2976,16 +2980,16 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "5.x-dev"
- },
"laravel": {
- "providers": [
- "Laravel\\Horizon\\HorizonServiceProvider"
- ],
"aliases": {
"Horizon": "Laravel\\Horizon\\Horizon"
- }
+ },
+ "providers": [
+ "Laravel\\Horizon\\HorizonServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "5.x-dev"
}
},
"autoload": {
@@ -3010,9 +3014,9 @@
],
"support": {
"issues": "https://github.com/laravel/horizon/issues",
- "source": "https://github.com/laravel/horizon/tree/v5.29.3"
+ "source": "https://github.com/laravel/horizon/tree/v5.30.0"
},
- "time": "2024-11-07T21:51:45+00:00"
+ "time": "2024-12-06T18:58:00+00:00"
},
{
"name": "laravel/pail",
@@ -3153,16 +3157,16 @@
},
{
"name": "laravel/sanctum",
- "version": "v4.0.3",
+ "version": "v4.0.6",
"source": {
"type": "git",
"url": "https://github.com/laravel/sanctum.git",
- "reference": "54aea9d13743ae8a6cdd3c28dbef128a17adecab"
+ "reference": "9e069e36d90b1e1f41886efa0fe9800a6b354694"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/sanctum/zipball/54aea9d13743ae8a6cdd3c28dbef128a17adecab",
- "reference": "54aea9d13743ae8a6cdd3c28dbef128a17adecab",
+ "url": "https://api.github.com/repos/laravel/sanctum/zipball/9e069e36d90b1e1f41886efa0fe9800a6b354694",
+ "reference": "9e069e36d90b1e1f41886efa0fe9800a6b354694",
"shasum": ""
},
"require": {
@@ -3213,36 +3217,36 @@
"issues": "https://github.com/laravel/sanctum/issues",
"source": "https://github.com/laravel/sanctum"
},
- "time": "2024-09-27T14:55:41+00:00"
+ "time": "2024-11-26T21:18:33+00:00"
},
{
"name": "laravel/serializable-closure",
- "version": "v1.3.6",
+ "version": "v2.0.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
- "reference": "f865a58ea3a0107c336b7045104c75243fa59d96"
+ "reference": "0d8d3d8086984996df86596a86dea60398093a81"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f865a58ea3a0107c336b7045104c75243fa59d96",
- "reference": "f865a58ea3a0107c336b7045104c75243fa59d96",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/0d8d3d8086984996df86596a86dea60398093a81",
+ "reference": "0d8d3d8086984996df86596a86dea60398093a81",
"shasum": ""
},
"require": {
- "php": "^7.3|^8.0"
+ "php": "^8.1"
},
"require-dev": {
- "illuminate/support": "^8.0|^9.0|^10.0|^11.0",
- "nesbot/carbon": "^2.61|^3.0",
- "pestphp/pest": "^1.21.3",
- "phpstan/phpstan": "^1.8.2",
- "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0"
+ "illuminate/support": "^10.0|^11.0",
+ "nesbot/carbon": "^2.67|^3.0",
+ "pestphp/pest": "^2.36",
+ "phpstan/phpstan": "^2.0",
+ "symfony/var-dumper": "^6.2.0|^7.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-master": "2.x-dev"
}
},
"autoload": {
@@ -3274,7 +3278,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
- "time": "2024-11-11T17:06:04+00:00"
+ "time": "2024-11-19T01:38:44+00:00"
},
{
"name": "laravel/socialite",
@@ -3416,16 +3420,16 @@
},
{
"name": "laravel/ui",
- "version": "v4.5.2",
+ "version": "v4.6.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/ui.git",
- "reference": "c75396f63268c95b053c8e4814eb70e0875e9628"
+ "reference": "a34609b15ae0c0512a0cf47a21695a2729cb7f93"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/ui/zipball/c75396f63268c95b053c8e4814eb70e0875e9628",
- "reference": "c75396f63268c95b053c8e4814eb70e0875e9628",
+ "url": "https://api.github.com/repos/laravel/ui/zipball/a34609b15ae0c0512a0cf47a21695a2729cb7f93",
+ "reference": "a34609b15ae0c0512a0cf47a21695a2729cb7f93",
"shasum": ""
},
"require": {
@@ -3473,9 +3477,9 @@
"ui"
],
"support": {
- "source": "https://github.com/laravel/ui/tree/v4.5.2"
+ "source": "https://github.com/laravel/ui/tree/v4.6.0"
},
- "time": "2024-05-08T18:07:10+00:00"
+ "time": "2024-11-21T15:06:41+00:00"
},
{
"name": "lcobucci/jwt",
@@ -3552,16 +3556,16 @@
},
{
"name": "league/commonmark",
- "version": "2.5.3",
+ "version": "2.6.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/commonmark.git",
- "reference": "b650144166dfa7703e62a22e493b853b58d874b0"
+ "reference": "d150f911e0079e90ae3c106734c93137c184f932"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0",
- "reference": "b650144166dfa7703e62a22e493b853b58d874b0",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d150f911e0079e90ae3c106734c93137c184f932",
+ "reference": "d150f911e0079e90ae3c106734c93137c184f932",
"shasum": ""
},
"require": {
@@ -3586,8 +3590,9 @@
"phpstan/phpstan": "^1.8.2",
"phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
"scrutinizer/ocular": "^1.8.1",
- "symfony/finder": "^5.3 | ^6.0 || ^7.0",
- "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0",
+ "symfony/finder": "^5.3 | ^6.0 | ^7.0",
+ "symfony/process": "^5.4 | ^6.0 | ^7.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
"unleashedtech/php-coding-standard": "^3.1.1",
"vimeo/psalm": "^4.24.0 || ^5.0.0"
},
@@ -3597,7 +3602,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.6-dev"
+ "dev-main": "2.7-dev"
}
},
"autoload": {
@@ -3654,7 +3659,7 @@
"type": "tidelift"
}
],
- "time": "2024-08-16T11:46:16+00:00"
+ "time": "2024-12-07T15:34:16+00:00"
},
{
"name": "league/config",
@@ -4108,20 +4113,20 @@
},
{
"name": "league/uri",
- "version": "7.4.1",
+ "version": "7.5.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/uri.git",
- "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4"
+ "reference": "81fb5145d2644324614cc532b28efd0215bda430"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/uri/zipball/bedb6e55eff0c933668addaa7efa1e1f2c417cc4",
- "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430",
+ "reference": "81fb5145d2644324614cc532b28efd0215bda430",
"shasum": ""
},
"require": {
- "league/uri-interfaces": "^7.3",
+ "league/uri-interfaces": "^7.5",
"php": "^8.1"
},
"conflict": {
@@ -4186,7 +4191,7 @@
"docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues",
- "source": "https://github.com/thephpleague/uri/tree/7.4.1"
+ "source": "https://github.com/thephpleague/uri/tree/7.5.1"
},
"funding": [
{
@@ -4194,20 +4199,20 @@
"type": "github"
}
],
- "time": "2024-03-23T07:42:40+00:00"
+ "time": "2024-12-08T08:40:02+00:00"
},
{
"name": "league/uri-interfaces",
- "version": "7.4.1",
+ "version": "7.5.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/uri-interfaces.git",
- "reference": "8d43ef5c841032c87e2de015972c06f3865ef718"
+ "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/8d43ef5c841032c87e2de015972c06f3865ef718",
- "reference": "8d43ef5c841032c87e2de015972c06f3865ef718",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742",
+ "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742",
"shasum": ""
},
"require": {
@@ -4270,7 +4275,7 @@
"docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues",
- "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.1"
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0"
},
"funding": [
{
@@ -4278,20 +4283,20 @@
"type": "github"
}
],
- "time": "2024-03-23T07:42:40+00:00"
+ "time": "2024-12-08T08:18:47+00:00"
},
{
"name": "livewire/livewire",
- "version": "v3.5.12",
+ "version": "v3.5.17",
"source": {
"type": "git",
"url": "https://github.com/livewire/livewire.git",
- "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d"
+ "reference": "7bbf80d93db9b866776bf957ca6229364bca8d87"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/livewire/livewire/zipball/3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d",
- "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d",
+ "url": "https://api.github.com/repos/livewire/livewire/zipball/7bbf80d93db9b866776bf957ca6229364bca8d87",
+ "reference": "7bbf80d93db9b866776bf957ca6229364bca8d87",
"shasum": ""
},
"require": {
@@ -4317,12 +4322,12 @@
"type": "library",
"extra": {
"laravel": {
- "providers": [
- "Livewire\\LivewireServiceProvider"
- ],
"aliases": {
"Livewire": "Livewire\\Livewire"
- }
+ },
+ "providers": [
+ "Livewire\\LivewireServiceProvider"
+ ]
}
},
"autoload": {
@@ -4346,7 +4351,7 @@
"description": "A front-end framework for Laravel.",
"support": {
"issues": "https://github.com/livewire/livewire/issues",
- "source": "https://github.com/livewire/livewire/tree/v3.5.12"
+ "source": "https://github.com/livewire/livewire/tree/v3.5.17"
},
"funding": [
{
@@ -4354,7 +4359,7 @@
"type": "github"
}
],
- "time": "2024-10-15T19:35:06+00:00"
+ "time": "2024-12-06T13:41:21+00:00"
},
{
"name": "log1x/laravel-webfonts",
@@ -4445,12 +4450,12 @@
"type": "library",
"extra": {
"laravel": {
- "providers": [
- "Lorisleiva\\Actions\\ActionServiceProvider"
- ],
"aliases": {
"Action": "Lorisleiva\\Actions\\Facades\\Actions"
- }
+ },
+ "providers": [
+ "Lorisleiva\\Actions\\ActionServiceProvider"
+ ]
}
},
"autoload": {
@@ -4568,16 +4573,16 @@
},
{
"name": "monolog/monolog",
- "version": "3.8.0",
+ "version": "3.8.1",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67"
+ "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/32e515fdc02cdafbe4593e30a9350d486b125b67",
- "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4",
+ "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4",
"shasum": ""
},
"require": {
@@ -4655,7 +4660,7 @@
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/3.8.0"
+ "source": "https://github.com/Seldaek/monolog/tree/3.8.1"
},
"funding": [
{
@@ -4667,7 +4672,7 @@
"type": "tidelift"
}
],
- "time": "2024-11-12T13:57:08+00:00"
+ "time": "2024-12-05T17:15:07+00:00"
},
{
"name": "mtdowling/jmespath.php",
@@ -5102,31 +5107,31 @@
},
{
"name": "nunomaduro/termwind",
- "version": "v2.2.0",
+ "version": "v2.3.0",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/termwind.git",
- "reference": "42c84e4e8090766bbd6445d06cd6e57650626ea3"
+ "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/42c84e4e8090766bbd6445d06cd6e57650626ea3",
- "reference": "42c84e4e8090766bbd6445d06cd6e57650626ea3",
+ "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda",
+ "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^8.2",
- "symfony/console": "^7.1.5"
+ "symfony/console": "^7.1.8"
},
"require-dev": {
- "illuminate/console": "^11.28.0",
- "laravel/pint": "^1.18.1",
+ "illuminate/console": "^11.33.2",
+ "laravel/pint": "^1.18.2",
"mockery/mockery": "^1.6.12",
"pestphp/pest": "^2.36.0",
- "phpstan/phpstan": "^1.12.6",
+ "phpstan/phpstan": "^1.12.11",
"phpstan/phpstan-strict-rules": "^1.6.1",
- "symfony/var-dumper": "^7.1.5",
+ "symfony/var-dumper": "^7.1.8",
"thecodingmachine/phpstan-strict-rules": "^1.0.0"
},
"type": "library",
@@ -5169,7 +5174,7 @@
],
"support": {
"issues": "https://github.com/nunomaduro/termwind/issues",
- "source": "https://github.com/nunomaduro/termwind/tree/v2.2.0"
+ "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0"
},
"funding": [
{
@@ -5185,7 +5190,7 @@
"type": "github"
}
],
- "time": "2024-10-15T16:15:16+00:00"
+ "time": "2024-11-21T10:39:51+00:00"
},
{
"name": "nyholm/psr7",
@@ -5473,151 +5478,23 @@
},
"time": "2024-09-04T12:51:01+00:00"
},
- {
- "name": "php-di/invoker",
- "version": "2.3.4",
- "source": {
- "type": "git",
- "url": "https://github.com/PHP-DI/Invoker.git",
- "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/33234b32dafa8eb69202f950a1fc92055ed76a86",
- "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86",
- "shasum": ""
- },
- "require": {
- "php": ">=7.3",
- "psr/container": "^1.0|^2.0"
- },
- "require-dev": {
- "athletic/athletic": "~0.1.8",
- "mnapoli/hard-mode": "~0.3.0",
- "phpunit/phpunit": "^9.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Invoker\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Generic and extensible callable invoker",
- "homepage": "https://github.com/PHP-DI/Invoker",
- "keywords": [
- "callable",
- "dependency",
- "dependency-injection",
- "injection",
- "invoke",
- "invoker"
- ],
- "support": {
- "issues": "https://github.com/PHP-DI/Invoker/issues",
- "source": "https://github.com/PHP-DI/Invoker/tree/2.3.4"
- },
- "funding": [
- {
- "url": "https://github.com/mnapoli",
- "type": "github"
- }
- ],
- "time": "2023-09-08T09:24:21+00:00"
- },
- {
- "name": "php-di/php-di",
- "version": "7.0.7",
- "source": {
- "type": "git",
- "url": "https://github.com/PHP-DI/PHP-DI.git",
- "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1",
- "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1",
- "shasum": ""
- },
- "require": {
- "laravel/serializable-closure": "^1.0",
- "php": ">=8.0",
- "php-di/invoker": "^2.0",
- "psr/container": "^1.1 || ^2.0"
- },
- "provide": {
- "psr/container-implementation": "^1.0"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^3",
- "friendsofphp/proxy-manager-lts": "^1",
- "mnapoli/phpunit-easymock": "^1.3",
- "phpunit/phpunit": "^9.5",
- "vimeo/psalm": "^4.6"
- },
- "suggest": {
- "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/functions.php"
- ],
- "psr-4": {
- "DI\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "The dependency injection container for humans",
- "homepage": "https://php-di.org/",
- "keywords": [
- "PSR-11",
- "container",
- "container-interop",
- "dependency injection",
- "di",
- "ioc",
- "psr11"
- ],
- "support": {
- "issues": "https://github.com/PHP-DI/PHP-DI/issues",
- "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7"
- },
- "funding": [
- {
- "url": "https://github.com/mnapoli",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/php-di/php-di",
- "type": "tidelift"
- }
- ],
- "time": "2024-07-21T15:55:45+00:00"
- },
{
"name": "phpdocumentor/reflection",
- "version": "6.0.0",
+ "version": "6.1.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/Reflection.git",
- "reference": "61e2f1fe7683e9647b9ed8d9e53d08699385267d"
+ "reference": "bb4dea805a645553d6d989b23dad9f8041f39502"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/61e2f1fe7683e9647b9ed8d9e53d08699385267d",
- "reference": "61e2f1fe7683e9647b9ed8d9e53d08699385267d",
+ "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/bb4dea805a645553d6d989b23dad9f8041f39502",
+ "reference": "bb4dea805a645553d6d989b23dad9f8041f39502",
"shasum": ""
},
"require": {
"nikic/php-parser": "~4.18 || ^5.0",
- "php": "8.1.*|8.2.*|8.3.*",
+ "php": "8.1.*|8.2.*|8.3.*|8.4.*",
"phpdocumentor/reflection-common": "^2.1",
"phpdocumentor/reflection-docblock": "^5",
"phpdocumentor/type-resolver": "^1.2",
@@ -5664,9 +5541,9 @@
],
"support": {
"issues": "https://github.com/phpDocumentor/Reflection/issues",
- "source": "https://github.com/phpDocumentor/Reflection/tree/6.0.0"
+ "source": "https://github.com/phpDocumentor/Reflection/tree/6.1.0"
},
- "time": "2024-05-23T19:28:12+00:00"
+ "time": "2024-11-22T15:11:54+00:00"
},
{
"name": "phpdocumentor/reflection-common",
@@ -5723,16 +5600,16 @@
},
{
"name": "phpdocumentor/reflection-docblock",
- "version": "5.6.0",
+ "version": "5.6.1",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c"
+ "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/f3558a4c23426d12bffeaab463f8a8d8b681193c",
- "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
+ "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
"shasum": ""
},
"require": {
@@ -5781,9 +5658,9 @@
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.0"
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1"
},
- "time": "2024-11-12T11:25:25+00:00"
+ "time": "2024-12-07T09:39:29+00:00"
},
{
"name": "phpdocumentor/type-resolver",
@@ -6077,16 +5954,16 @@
},
{
"name": "phpstan/phpstan",
- "version": "1.12.10",
+ "version": "1.12.12",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "fc463b5d0fe906dcf19689be692c65c50406a071"
+ "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/fc463b5d0fe906dcf19689be692c65c50406a071",
- "reference": "fc463b5d0fe906dcf19689be692c65c50406a071",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0",
+ "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0",
"shasum": ""
},
"require": {
@@ -6131,7 +6008,60 @@
"type": "github"
}
],
- "time": "2024-11-11T15:37:09+00:00"
+ "time": "2024-11-28T22:13:23+00:00"
+ },
+ {
+ "name": "pimple/pimple",
+ "version": "v3.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/silexphp/Pimple.git",
+ "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
+ "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/container": "^1.1 || ^2.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^5.4@dev"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Pimple": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Pimple, a simple Dependency Injection Container",
+ "homepage": "https://pimple.symfony.com",
+ "keywords": [
+ "container",
+ "dependency injection"
+ ],
+ "support": {
+ "source": "https://github.com/silexphp/Pimple/tree/v3.5.0"
+ },
+ "time": "2021-10-28T11:13:42+00:00"
},
{
"name": "pion/laravel-chunk-upload",
@@ -6201,23 +6131,23 @@
},
{
"name": "poliander/cron",
- "version": "3.1.0",
+ "version": "3.2.0",
"source": {
"type": "git",
"url": "https://github.com/poliander/cron.git",
- "reference": "9e037c06aab233787999dfba38f1a12d100510c1"
+ "reference": "213c477b3d9d6fcf8f0944298f481c1649a92b3b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/poliander/cron/zipball/9e037c06aab233787999dfba38f1a12d100510c1",
- "reference": "9e037c06aab233787999dfba38f1a12d100510c1",
+ "url": "https://api.github.com/repos/poliander/cron/zipball/213c477b3d9d6fcf8f0944298f481c1649a92b3b",
+ "reference": "213c477b3d9d6fcf8f0944298f481c1649a92b3b",
"shasum": ""
},
"require": {
- "php": "8.1.* || 8.2.* || 8.3.*"
+ "php": "8.2.* || 8.3.* || 8.4.*"
},
"require-dev": {
- "phpunit/phpunit": "~10.0"
+ "phpunit/phpunit": "~11.0"
},
"type": "library",
"autoload": {
@@ -6239,9 +6169,9 @@
"homepage": "https://github.com/poliander/cron",
"support": {
"issues": "https://github.com/poliander/cron/issues",
- "source": "https://github.com/poliander/cron/tree/3.1.0"
+ "source": "https://github.com/poliander/cron/tree/3.2.0"
},
- "time": "2023-11-23T21:56:03+00:00"
+ "time": "2024-11-22T08:35:47+00:00"
},
{
"name": "pragmarx/google2fa",
@@ -6758,16 +6688,16 @@
},
{
"name": "psy/psysh",
- "version": "v0.12.4",
+ "version": "v0.12.7",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "2fd717afa05341b4f8152547f142cd2f130f6818"
+ "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818",
- "reference": "2fd717afa05341b4f8152547f142cd2f130f6818",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c",
+ "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c",
"shasum": ""
},
"require": {
@@ -6794,12 +6724,12 @@
],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "0.12.x-dev"
- },
"bamarni-bin": {
"bin-links": false,
"forward-command": false
+ },
+ "branch-alias": {
+ "dev-main": "0.12.x-dev"
}
},
"autoload": {
@@ -6831,9 +6761,9 @@
],
"support": {
"issues": "https://github.com/bobthecow/psysh/issues",
- "source": "https://github.com/bobthecow/psysh/tree/v0.12.4"
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.7"
},
- "time": "2024-06-10T01:18:23+00:00"
+ "time": "2024-12-10T01:58:33+00:00"
},
{
"name": "purplepixie/phpdns",
@@ -7517,16 +7447,16 @@
},
{
"name": "sentry/sentry-laravel",
- "version": "4.10.0",
+ "version": "4.10.1",
"source": {
"type": "git",
"url": "https://github.com/getsentry/sentry-laravel.git",
- "reference": "cbdd224cc5a224528bf6b19507ad76187b3bccfa"
+ "reference": "1c007fb111ff00f02efba2aca022310dae412c3a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/cbdd224cc5a224528bf6b19507ad76187b3bccfa",
- "reference": "cbdd224cc5a224528bf6b19507ad76187b3bccfa",
+ "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/1c007fb111ff00f02efba2aca022310dae412c3a",
+ "reference": "1c007fb111ff00f02efba2aca022310dae412c3a",
"shasum": ""
},
"require": {
@@ -7550,13 +7480,13 @@
"type": "library",
"extra": {
"laravel": {
+ "aliases": {
+ "Sentry": "Sentry\\Laravel\\Facade"
+ },
"providers": [
"Sentry\\Laravel\\ServiceProvider",
"Sentry\\Laravel\\Tracing\\ServiceProvider"
- ],
- "aliases": {
- "Sentry": "Sentry\\Laravel\\Facade"
- }
+ ]
}
},
"autoload": {
@@ -7590,7 +7520,7 @@
],
"support": {
"issues": "https://github.com/getsentry/sentry-laravel/issues",
- "source": "https://github.com/getsentry/sentry-laravel/tree/4.10.0"
+ "source": "https://github.com/getsentry/sentry-laravel/tree/4.10.1"
},
"funding": [
{
@@ -7602,7 +7532,7 @@
"type": "custom"
}
],
- "time": "2024-11-07T08:05:24+00:00"
+ "time": "2024-11-24T11:02:20+00:00"
},
{
"name": "socialiteproviders/manager",
@@ -7731,27 +7661,27 @@
},
{
"name": "spatie/backtrace",
- "version": "1.6.2",
+ "version": "1.7.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/backtrace.git",
- "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9"
+ "reference": "0f2477c520e3729de58e061b8192f161c99f770b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9",
- "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9",
+ "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b",
+ "reference": "0f2477c520e3729de58e061b8192f161c99f770b",
"shasum": ""
},
"require": {
- "php": "^7.3|^8.0"
+ "php": "^7.3 || ^8.0"
},
"require-dev": {
"ext-json": "*",
- "laravel/serializable-closure": "^1.3",
- "phpunit/phpunit": "^9.3",
- "spatie/phpunit-snapshot-assertions": "^4.2",
- "symfony/var-dumper": "^5.1"
+ "laravel/serializable-closure": "^1.3 || ^2.0",
+ "phpunit/phpunit": "^9.3 || ^11.4.3",
+ "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6",
+ "symfony/var-dumper": "^5.1 || ^6.0 || ^7.0"
},
"type": "library",
"autoload": {
@@ -7778,7 +7708,7 @@
"spatie"
],
"support": {
- "source": "https://github.com/spatie/backtrace/tree/1.6.2"
+ "source": "https://github.com/spatie/backtrace/tree/1.7.1"
},
"funding": [
{
@@ -7790,20 +7720,20 @@
"type": "other"
}
],
- "time": "2024-07-22T08:21:24+00:00"
+ "time": "2024-12-02T13:28:15+00:00"
},
{
"name": "spatie/laravel-activitylog",
- "version": "4.9.0",
+ "version": "4.9.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-activitylog.git",
- "reference": "e0fc28178515a5396f48e107ed697719189bbe02"
+ "reference": "9abddaa9f2681d97943748c7fa04161cf4642e8c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/e0fc28178515a5396f48e107ed697719189bbe02",
- "reference": "e0fc28178515a5396f48e107ed697719189bbe02",
+ "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/9abddaa9f2681d97943748c7fa04161cf4642e8c",
+ "reference": "9abddaa9f2681d97943748c7fa04161cf4642e8c",
"shasum": ""
},
"require": {
@@ -7869,7 +7799,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-activitylog/issues",
- "source": "https://github.com/spatie/laravel-activitylog/tree/4.9.0"
+ "source": "https://github.com/spatie/laravel-activitylog/tree/4.9.1"
},
"funding": [
{
@@ -7881,7 +7811,7 @@
"type": "github"
}
],
- "time": "2024-10-18T13:38:47+00:00"
+ "time": "2024-11-18T11:31:57+00:00"
},
{
"name": "spatie/laravel-data",
@@ -7969,16 +7899,16 @@
},
{
"name": "spatie/laravel-package-tools",
- "version": "1.16.5",
+ "version": "1.17.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-package-tools.git",
- "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2"
+ "reference": "9ab30fd24f677e5aa370ea4cf6b41c517d16cf85"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/c7413972cf22ffdff97b68499c22baa04eddb6a2",
- "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2",
+ "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/9ab30fd24f677e5aa370ea4cf6b41c517d16cf85",
+ "reference": "9ab30fd24f677e5aa370ea4cf6b41c517d16cf85",
"shasum": ""
},
"require": {
@@ -7987,10 +7917,10 @@
},
"require-dev": {
"mockery/mockery": "^1.5",
- "orchestra/testbench": "^7.7|^8.0",
- "pestphp/pest": "^1.22",
- "phpunit/phpunit": "^9.5.24",
- "spatie/pest-plugin-test-time": "^1.1"
+ "orchestra/testbench": "^7.7|^8.0|^9.0",
+ "pestphp/pest": "^1.22|^2",
+ "phpunit/phpunit": "^9.5.24|^10.5",
+ "spatie/pest-plugin-test-time": "^1.1|^2.2"
},
"type": "library",
"autoload": {
@@ -8017,7 +7947,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-package-tools/issues",
- "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.5"
+ "source": "https://github.com/spatie/laravel-package-tools/tree/1.17.0"
},
"funding": [
{
@@ -8025,7 +7955,7 @@
"type": "github"
}
],
- "time": "2024-08-27T18:56:10+00:00"
+ "time": "2024-12-09T16:29:14+00:00"
},
{
"name": "spatie/laravel-ray",
@@ -8066,13 +7996,13 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.x-dev"
- },
"laravel": {
"providers": [
"Spatie\\LaravelRay\\RayServiceProvider"
]
+ },
+ "branch-alias": {
+ "dev-main": "1.x-dev"
}
},
"autoload": {
@@ -8322,35 +8252,35 @@
},
{
"name": "spatie/ray",
- "version": "1.41.2",
+ "version": "1.41.4",
"source": {
"type": "git",
"url": "https://github.com/spatie/ray.git",
- "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc"
+ "reference": "c5dbda0548c1881b30549ccc0b6d485f7471aaa5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/ray/zipball/c44f8cfbf82c69909b505de61d8d3f2d324e93fc",
- "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc",
+ "url": "https://api.github.com/repos/spatie/ray/zipball/c5dbda0548c1881b30549ccc0b6d485f7471aaa5",
+ "reference": "c5dbda0548c1881b30549ccc0b6d485f7471aaa5",
"shasum": ""
},
"require": {
"ext-curl": "*",
"ext-json": "*",
- "php": "^7.3|^8.0",
- "ramsey/uuid": "^3.0|^4.1",
+ "php": "^7.4 || ^8.0",
+ "ramsey/uuid": "^3.0 || ^4.1",
"spatie/backtrace": "^1.1",
- "spatie/macroable": "^1.0|^2.0",
- "symfony/stopwatch": "^4.0|^5.1|^6.0|^7.0",
- "symfony/var-dumper": "^4.2|^5.1|^6.0|^7.0.3"
+ "spatie/macroable": "^1.0 || ^2.0",
+ "symfony/stopwatch": "^4.2 || ^5.1 || ^6.0 || ^7.0",
+ "symfony/var-dumper": "^4.2 || ^5.1 || ^6.0 || ^7.0.3"
},
"require-dev": {
- "illuminate/support": "6.x|^8.18|^9.0",
+ "illuminate/support": "^7.20 || ^8.18 || ^9.0 || ^10.0 || ^11.0",
"nesbot/carbon": "^2.63",
"pestphp/pest": "^1.22",
- "phpstan/phpstan": "^1.10",
+ "phpstan/phpstan": "^1.10.57 || ^2.0.2",
"phpunit/phpunit": "^9.5",
- "rector/rector": "^0.19.2",
+ "rector/rector": "dev-main",
"spatie/phpunit-snapshot-assertions": "^4.2",
"spatie/test-time": "^1.2"
},
@@ -8391,7 +8321,7 @@
],
"support": {
"issues": "https://github.com/spatie/ray/issues",
- "source": "https://github.com/spatie/ray/tree/1.41.2"
+ "source": "https://github.com/spatie/ray/tree/1.41.4"
},
"funding": [
{
@@ -8403,7 +8333,7 @@
"type": "other"
}
],
- "time": "2024-04-24T14:21:46+00:00"
+ "time": "2024-12-09T11:32:15+00:00"
},
{
"name": "spatie/url",
@@ -8469,16 +8399,16 @@
},
{
"name": "stripe/stripe-php",
- "version": "v16.2.0",
+ "version": "v16.3.0",
"source": {
"type": "git",
"url": "https://github.com/stripe/stripe-php.git",
- "reference": "813ae4961755af28a13bda451689f7a6ed6498cb"
+ "reference": "48af6bc64ca8157b3fdce100e856069963bac466"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/stripe/stripe-php/zipball/813ae4961755af28a13bda451689f7a6ed6498cb",
- "reference": "813ae4961755af28a13bda451689f7a6ed6498cb",
+ "url": "https://api.github.com/repos/stripe/stripe-php/zipball/48af6bc64ca8157b3fdce100e856069963bac466",
+ "reference": "48af6bc64ca8157b3fdce100e856069963bac466",
"shasum": ""
},
"require": {
@@ -8522,22 +8452,22 @@
],
"support": {
"issues": "https://github.com/stripe/stripe-php/issues",
- "source": "https://github.com/stripe/stripe-php/tree/v16.2.0"
+ "source": "https://github.com/stripe/stripe-php/tree/v16.3.0"
},
- "time": "2024-10-29T21:15:53+00:00"
+ "time": "2024-11-20T23:30:16+00:00"
},
{
"name": "symfony/clock",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/clock.git",
- "reference": "97bebc53548684c17ed696bc8af016880f0f098d"
+ "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/clock/zipball/97bebc53548684c17ed696bc8af016880f0f098d",
- "reference": "97bebc53548684c17ed696bc8af016880f0f098d",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
+ "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
"shasum": ""
},
"require": {
@@ -8582,7 +8512,7 @@
"time"
],
"support": {
- "source": "https://github.com/symfony/clock/tree/v7.1.6"
+ "source": "https://github.com/symfony/clock/tree/v7.2.0"
},
"funding": [
{
@@ -8598,20 +8528,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-09-25T14:21:43+00:00"
},
{
"name": "symfony/console",
- "version": "v7.1.8",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5"
+ "reference": "23c8aae6d764e2bae02d2a99f7532a7f6ed619cf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/ff04e5b5ba043d2badfb308197b9e6b42883fcd5",
- "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5",
+ "url": "https://api.github.com/repos/symfony/console/zipball/23c8aae6d764e2bae02d2a99f7532a7f6ed619cf",
+ "reference": "23c8aae6d764e2bae02d2a99f7532a7f6ed619cf",
"shasum": ""
},
"require": {
@@ -8675,7 +8605,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.1.8"
+ "source": "https://github.com/symfony/console/tree/v7.2.0"
},
"funding": [
{
@@ -8691,20 +8621,20 @@
"type": "tidelift"
}
],
- "time": "2024-11-06T14:23:19+00:00"
+ "time": "2024-11-06T14:24:19+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66"
+ "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66",
- "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2",
+ "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2",
"shasum": ""
},
"require": {
@@ -8740,7 +8670,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v7.1.6"
+ "source": "https://github.com/symfony/css-selector/tree/v7.2.0"
},
"funding": [
{
@@ -8756,20 +8686,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-09-25T14:21:43+00:00"
},
{
"name": "symfony/deprecation-contracts",
- "version": "v3.5.0",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
- "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
"shasum": ""
},
"require": {
@@ -8807,7 +8737,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -8823,20 +8753,20 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/error-handler",
- "version": "v7.1.7",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "010e44661f4c6babaf8c4862fe68c24a53903342"
+ "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/010e44661f4c6babaf8c4862fe68c24a53903342",
- "reference": "010e44661f4c6babaf8c4862fe68c24a53903342",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/672b3dd1ef8b87119b446d67c58c106c43f965fe",
+ "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe",
"shasum": ""
},
"require": {
@@ -8882,7 +8812,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v7.1.7"
+ "source": "https://github.com/symfony/error-handler/tree/v7.2.0"
},
"funding": [
{
@@ -8898,20 +8828,20 @@
"type": "tidelift"
}
],
- "time": "2024-11-05T15:34:55+00:00"
+ "time": "2024-11-05T15:35:02+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "87254c78dd50721cfd015b62277a8281c5589702"
+ "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702",
- "reference": "87254c78dd50721cfd015b62277a8281c5589702",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1",
+ "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1",
"shasum": ""
},
"require": {
@@ -8962,7 +8892,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0"
},
"funding": [
{
@@ -8978,20 +8908,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-09-25T14:21:43+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
- "version": "v3.5.0",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50"
+ "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50",
- "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
+ "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
"shasum": ""
},
"require": {
@@ -9038,7 +8968,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0"
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -9054,20 +8984,20 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/finder",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8"
+ "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8",
- "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/6de263e5868b9a137602dd1e33e4d48bfae99c49",
+ "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49",
"shasum": ""
},
"require": {
@@ -9102,7 +9032,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.1.6"
+ "source": "https://github.com/symfony/finder/tree/v7.2.0"
},
"funding": [
{
@@ -9118,24 +9048,25 @@
"type": "tidelift"
}
],
- "time": "2024-10-01T08:31:23+00:00"
+ "time": "2024-10-23T06:56:12+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v7.1.8",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112"
+ "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f4419ec69ccfc3f725a4de7c20e4e57626d10112",
- "reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e88a66c3997859532bc2ddd6dd8f35aba2711744",
+ "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744",
"shasum": ""
},
"require": {
"php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
"symfony/polyfill-mbstring": "~1.1",
"symfony/polyfill-php83": "^1.27"
},
@@ -9179,7 +9110,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v7.1.8"
+ "source": "https://github.com/symfony/http-foundation/tree/v7.2.0"
},
"funding": [
{
@@ -9195,20 +9126,20 @@
"type": "tidelift"
}
],
- "time": "2024-11-09T09:16:45+00:00"
+ "time": "2024-11-13T18:58:46+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v7.1.8",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e"
+ "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/33fef24e3dc79d6d30bf4936531f2f4bd2ca189e",
- "reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d",
+ "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d",
"shasum": ""
},
"require": {
@@ -9237,7 +9168,7 @@
"symfony/twig-bridge": "<6.4",
"symfony/validator": "<6.4",
"symfony/var-dumper": "<6.4",
- "twig/twig": "<3.0.4"
+ "twig/twig": "<3.12"
},
"provide": {
"psr/log-implementation": "1.0|2.0|3.0"
@@ -9265,7 +9196,7 @@
"symfony/validator": "^6.4|^7.0",
"symfony/var-dumper": "^6.4|^7.0",
"symfony/var-exporter": "^6.4|^7.0",
- "twig/twig": "^3.0.4"
+ "twig/twig": "^3.12"
},
"type": "library",
"autoload": {
@@ -9293,7 +9224,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v7.1.8"
+ "source": "https://github.com/symfony/http-kernel/tree/v7.2.0"
},
"funding": [
{
@@ -9309,20 +9240,20 @@
"type": "tidelift"
}
],
- "time": "2024-11-13T14:25:32+00:00"
+ "time": "2024-11-29T08:42:40+00:00"
},
{
"name": "symfony/mailer",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
- "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd"
+ "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mailer/zipball/69c9948451fb3a6a4d47dc8261d1794734e76cdd",
- "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc",
+ "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc",
"shasum": ""
},
"require": {
@@ -9331,7 +9262,7 @@
"psr/event-dispatcher": "^1",
"psr/log": "^1|^2|^3",
"symfony/event-dispatcher": "^6.4|^7.0",
- "symfony/mime": "^6.4|^7.0",
+ "symfony/mime": "^7.2",
"symfony/service-contracts": "^2.5|^3"
},
"conflict": {
@@ -9373,7 +9304,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/mailer/tree/v7.1.6"
+ "source": "https://github.com/symfony/mailer/tree/v7.2.0"
},
"funding": [
{
@@ -9389,20 +9320,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-11-25T15:21:05+00:00"
},
{
"name": "symfony/mime",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "caa1e521edb2650b8470918dfe51708c237f0598"
+ "reference": "cc84a4b81f62158c3846ac7ff10f696aae2b524d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/caa1e521edb2650b8470918dfe51708c237f0598",
- "reference": "caa1e521edb2650b8470918dfe51708c237f0598",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/cc84a4b81f62158c3846ac7ff10f696aae2b524d",
+ "reference": "cc84a4b81f62158c3846ac7ff10f696aae2b524d",
"shasum": ""
},
"require": {
@@ -9457,7 +9388,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v7.1.6"
+ "source": "https://github.com/symfony/mime/tree/v7.2.0"
},
"funding": [
{
@@ -9473,20 +9404,20 @@
"type": "tidelift"
}
],
- "time": "2024-10-25T15:11:02+00:00"
+ "time": "2024-11-23T09:19:39+00:00"
},
{
"name": "symfony/options-resolver",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
- "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85"
+ "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/options-resolver/zipball/85e95eeede2d41cd146146e98c9c81d9214cae85",
- "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
+ "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
"shasum": ""
},
"require": {
@@ -9524,7 +9455,7 @@
"options"
],
"support": {
- "source": "https://github.com/symfony/options-resolver/tree/v7.1.6"
+ "source": "https://github.com/symfony/options-resolver/tree/v7.2.0"
},
"funding": [
{
@@ -9540,7 +9471,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-11-20T11:17:29+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -9568,8 +9499,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -9724,8 +9655,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -9803,8 +9734,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -9885,8 +9816,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -9969,8 +9900,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -10043,8 +9974,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -10123,8 +10054,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -10205,8 +10136,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -10260,16 +10191,16 @@
},
{
"name": "symfony/process",
- "version": "v7.1.8",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892"
+ "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892",
- "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892",
+ "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
+ "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
"shasum": ""
},
"require": {
@@ -10301,7 +10232,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.1.8"
+ "source": "https://github.com/symfony/process/tree/v7.2.0"
},
"funding": [
{
@@ -10317,20 +10248,20 @@
"type": "tidelift"
}
],
- "time": "2024-11-06T14:23:19+00:00"
+ "time": "2024-11-06T14:24:19+00:00"
},
{
"name": "symfony/psr-http-message-bridge",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/psr-http-message-bridge.git",
- "reference": "f16471bb19f6685b9ccf0a2c03c213840ae68cd6"
+ "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/f16471bb19f6685b9ccf0a2c03c213840ae68cd6",
- "reference": "f16471bb19f6685b9ccf0a2c03c213840ae68cd6",
+ "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/03f2f72319e7acaf2a9f6fcbe30ef17eec51594f",
+ "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f",
"shasum": ""
},
"require": {
@@ -10384,7 +10315,7 @@
"psr-7"
],
"support": {
- "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.1.6"
+ "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.2.0"
},
"funding": [
{
@@ -10400,20 +10331,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-09-26T08:57:56+00:00"
},
{
"name": "symfony/routing",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a"
+ "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/66a2c469f6c22d08603235c46a20007c0701ea0a",
- "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e",
+ "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e",
"shasum": ""
},
"require": {
@@ -10465,7 +10396,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v7.1.6"
+ "source": "https://github.com/symfony/routing/tree/v7.2.0"
},
"funding": [
{
@@ -10481,20 +10412,20 @@
"type": "tidelift"
}
],
- "time": "2024-10-01T08:31:23+00:00"
+ "time": "2024-11-25T11:08:51+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v3.5.0",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f"
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
- "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
"shasum": ""
},
"require": {
@@ -10548,7 +10479,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v3.5.0"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -10564,20 +10495,20 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/stopwatch",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
- "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05"
+ "reference": "696f418b0d722a4225e1c3d95489d262971ca924"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05",
- "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/696f418b0d722a4225e1c3d95489d262971ca924",
+ "reference": "696f418b0d722a4225e1c3d95489d262971ca924",
"shasum": ""
},
"require": {
@@ -10610,7 +10541,7 @@
"description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v7.1.6"
+ "source": "https://github.com/symfony/stopwatch/tree/v7.2.0"
},
"funding": [
{
@@ -10626,20 +10557,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-09-25T14:21:43+00:00"
},
{
"name": "symfony/string",
- "version": "v7.1.8",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281"
+ "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/591ebd41565f356fcd8b090fe64dbb5878f50281",
- "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281",
+ "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82",
+ "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82",
"shasum": ""
},
"require": {
@@ -10697,7 +10628,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.1.8"
+ "source": "https://github.com/symfony/string/tree/v7.2.0"
},
"funding": [
{
@@ -10713,24 +10644,25 @@
"type": "tidelift"
}
],
- "time": "2024-11-13T13:31:21+00:00"
+ "time": "2024-11-13T13:31:26+00:00"
},
{
"name": "symfony/translation",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f"
+ "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/b9f72ab14efdb6b772f85041fa12f820dee8d55f",
- "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/dc89e16b44048ceecc879054e5b7f38326ab6cc5",
+ "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5",
"shasum": ""
},
"require": {
"php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/translation-contracts": "^2.5|^3.0"
},
@@ -10791,7 +10723,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v7.1.6"
+ "source": "https://github.com/symfony/translation/tree/v7.2.0"
},
"funding": [
{
@@ -10807,20 +10739,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-28T12:35:13+00:00"
+ "time": "2024-11-12T20:47:56+00:00"
},
{
"name": "symfony/translation-contracts",
- "version": "v3.5.0",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
- "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a"
+ "reference": "4667ff3bd513750603a09c8dedbea942487fb07c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a",
- "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c",
+ "reference": "4667ff3bd513750603a09c8dedbea942487fb07c",
"shasum": ""
},
"require": {
@@ -10869,7 +10801,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0"
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -10885,20 +10817,20 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/uid",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/uid.git",
- "reference": "65befb3bb2d503bbffbd08c815aa38b472999917"
+ "reference": "2d294d0c48df244c71c105a169d0190bfb080426"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/uid/zipball/65befb3bb2d503bbffbd08c815aa38b472999917",
- "reference": "65befb3bb2d503bbffbd08c815aa38b472999917",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426",
+ "reference": "2d294d0c48df244c71c105a169d0190bfb080426",
"shasum": ""
},
"require": {
@@ -10943,7 +10875,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/uid/tree/v7.1.6"
+ "source": "https://github.com/symfony/uid/tree/v7.2.0"
},
"funding": [
{
@@ -10959,20 +10891,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-09-25T14:21:43+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v7.1.8",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8"
+ "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8",
- "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c",
+ "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c",
"shasum": ""
},
"require": {
@@ -10988,7 +10920,7 @@
"symfony/http-kernel": "^6.4|^7.0",
"symfony/process": "^6.4|^7.0",
"symfony/uid": "^6.4|^7.0",
- "twig/twig": "^3.0.4"
+ "twig/twig": "^3.12"
},
"bin": [
"Resources/bin/var-dump-server"
@@ -11026,7 +10958,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v7.1.8"
+ "source": "https://github.com/symfony/var-dumper/tree/v7.2.0"
},
"funding": [
{
@@ -11042,24 +10974,25 @@
"type": "tidelift"
}
],
- "time": "2024-11-08T15:46:42+00:00"
+ "time": "2024-11-08T15:48:14+00:00"
},
{
"name": "symfony/yaml",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671"
+ "reference": "099581e99f557e9f16b43c5916c26380b54abb22"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671",
- "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22",
+ "reference": "099581e99f557e9f16b43c5916c26380b54abb22",
"shasum": ""
},
"require": {
"php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
@@ -11097,7 +11030,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v7.1.6"
+ "source": "https://github.com/symfony/yaml/tree/v7.2.0"
},
"funding": [
{
@@ -11113,7 +11046,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-10-23T06:56:12+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -11312,16 +11245,16 @@
},
{
"name": "voku/portable-ascii",
- "version": "2.0.1",
+ "version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/voku/portable-ascii.git",
- "reference": "b56450eed252f6801410d810c8e1727224ae0743"
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743",
- "reference": "b56450eed252f6801410d810c8e1727224ae0743",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
"shasum": ""
},
"require": {
@@ -11346,7 +11279,7 @@
"authors": [
{
"name": "Lars Moelleken",
- "homepage": "http://www.moelleken.org/"
+ "homepage": "https://www.moelleken.org/"
}
],
"description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
@@ -11358,7 +11291,7 @@
],
"support": {
"issues": "https://github.com/voku/portable-ascii/issues",
- "source": "https://github.com/voku/portable-ascii/tree/2.0.1"
+ "source": "https://github.com/voku/portable-ascii/tree/2.0.3"
},
"funding": [
{
@@ -11382,7 +11315,7 @@
"type": "tidelift"
}
],
- "time": "2022-03-08T17:03:00+00:00"
+ "time": "2024-11-21T01:49:47+00:00"
},
{
"name": "webmozart/assert",
@@ -11554,31 +11487,30 @@
},
{
"name": "zbateson/mail-mime-parser",
- "version": "3.0.3",
+ "version": "2.4.1",
"source": {
"type": "git",
"url": "https://github.com/zbateson/mail-mime-parser.git",
- "reference": "e0d4423fe27850c9dd301190767dbc421acc2f19"
+ "reference": "ff49e02f6489b38f7cc3d1bd3971adc0f872569c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/e0d4423fe27850c9dd301190767dbc421acc2f19",
- "reference": "e0d4423fe27850c9dd301190767dbc421acc2f19",
+ "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/ff49e02f6489b38f7cc3d1bd3971adc0f872569c",
+ "reference": "ff49e02f6489b38f7cc3d1bd3971adc0f872569c",
"shasum": ""
},
"require": {
- "guzzlehttp/psr7": "^2.5",
- "php": ">=8.0",
- "php-di/php-di": "^6.0|^7.0",
- "psr/log": "^1|^2|^3",
- "zbateson/mb-wrapper": "^2.0",
- "zbateson/stream-decorators": "^2.1"
+ "guzzlehttp/psr7": "^1.7.0|^2.0",
+ "php": ">=7.1",
+ "pimple/pimple": "^3.0",
+ "zbateson/mb-wrapper": "^1.0.1",
+ "zbateson/stream-decorators": "^1.0.6"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "*",
- "monolog/monolog": "^2|^3",
+ "mikey179/vfsstream": "^1.6.0",
"phpstan/phpstan": "*",
- "phpunit/phpunit": "^9.6"
+ "phpunit/phpunit": "<10"
},
"suggest": {
"ext-iconv": "For best support/performance",
@@ -11626,24 +11558,24 @@
"type": "github"
}
],
- "time": "2024-08-10T18:44:09+00:00"
+ "time": "2024-04-28T00:58:54+00:00"
},
{
"name": "zbateson/mb-wrapper",
- "version": "2.0.0",
+ "version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/zbateson/mb-wrapper.git",
- "reference": "9e4373a153585d12b6c621ac4a6bb143264d4619"
+ "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/9e4373a153585d12b6c621ac4a6bb143264d4619",
- "reference": "9e4373a153585d12b6c621ac4a6bb143264d4619",
+ "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/09a8b77eb94af3823a9a6623dcc94f8d988da67f",
+ "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f",
"shasum": ""
},
"require": {
- "php": ">=8.0",
+ "php": ">=7.1",
"symfony/polyfill-iconv": "^1.9",
"symfony/polyfill-mbstring": "^1.9"
},
@@ -11687,7 +11619,7 @@
],
"support": {
"issues": "https://github.com/zbateson/mb-wrapper/issues",
- "source": "https://github.com/zbateson/mb-wrapper/tree/2.0.0"
+ "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.1"
},
"funding": [
{
@@ -11695,31 +11627,31 @@
"type": "github"
}
],
- "time": "2024-03-20T01:38:07+00:00"
+ "time": "2024-03-18T04:31:04+00:00"
},
{
"name": "zbateson/stream-decorators",
- "version": "2.1.1",
+ "version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/zbateson/stream-decorators.git",
- "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5"
+ "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/32a2a62fb0f26313395c996ebd658d33c3f9c4e5",
- "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5",
+ "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/783b034024fda8eafa19675fb2552f8654d3a3e9",
+ "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9",
"shasum": ""
},
"require": {
- "guzzlehttp/psr7": "^2.5",
- "php": ">=8.0",
- "zbateson/mb-wrapper": "^2.0"
+ "guzzlehttp/psr7": "^1.9 | ^2.0",
+ "php": ">=7.2",
+ "zbateson/mb-wrapper": "^1.0.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "*",
"phpstan/phpstan": "*",
- "phpunit/phpunit": "^9.6|^10.0"
+ "phpunit/phpunit": "<10.0"
},
"type": "library",
"autoload": {
@@ -11750,7 +11682,7 @@
],
"support": {
"issues": "https://github.com/zbateson/stream-decorators/issues",
- "source": "https://github.com/zbateson/stream-decorators/tree/2.1.1"
+ "source": "https://github.com/zbateson/stream-decorators/tree/1.2.1"
},
"funding": [
{
@@ -11758,7 +11690,7 @@
"type": "github"
}
],
- "time": "2024-04-29T21:42:39+00:00"
+ "time": "2023-05-30T22:51:52+00:00"
},
{
"name": "zircote/swagger-php",
@@ -11845,16 +11777,16 @@
"packages-dev": [
{
"name": "barryvdh/laravel-debugbar",
- "version": "v3.14.7",
+ "version": "v3.14.9",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-debugbar.git",
- "reference": "f484b8c9124de0b163da39958331098ffcd4a65e"
+ "reference": "2e805a6bd4e1aa83774316bb062703c65d0691ef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/f484b8c9124de0b163da39958331098ffcd4a65e",
- "reference": "f484b8c9124de0b163da39958331098ffcd4a65e",
+ "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/2e805a6bd4e1aa83774316bb062703c65d0691ef",
+ "reference": "2e805a6bd4e1aa83774316bb062703c65d0691ef",
"shasum": ""
},
"require": {
@@ -11873,16 +11805,16 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "3.14-dev"
- },
"laravel": {
- "providers": [
- "Barryvdh\\Debugbar\\ServiceProvider"
- ],
"aliases": {
"Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar"
- }
+ },
+ "providers": [
+ "Barryvdh\\Debugbar\\ServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "3.14-dev"
}
},
"autoload": {
@@ -11913,7 +11845,7 @@
],
"support": {
"issues": "https://github.com/barryvdh/laravel-debugbar/issues",
- "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.7"
+ "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.9"
},
"funding": [
{
@@ -11925,20 +11857,20 @@
"type": "github"
}
],
- "time": "2024-11-14T09:12:35+00:00"
+ "time": "2024-11-25T14:51:20+00:00"
},
{
"name": "brianium/paratest",
- "version": "v7.6.0",
+ "version": "v7.6.3",
"source": {
"type": "git",
"url": "https://github.com/paratestphp/paratest.git",
- "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254"
+ "reference": "ae3c9f1aeda7daa374c904b35ece8f574f56d176"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paratestphp/paratest/zipball/68ff89a8de47d086588e391a516d2a5b5fde6254",
- "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254",
+ "url": "https://api.github.com/repos/paratestphp/paratest/zipball/ae3c9f1aeda7daa374c904b35ece8f574f56d176",
+ "reference": "ae3c9f1aeda7daa374c904b35ece8f574f56d176",
"shasum": ""
},
"require": {
@@ -11947,26 +11879,26 @@
"ext-reflection": "*",
"ext-simplexml": "*",
"fidry/cpu-core-counter": "^1.2.0",
- "jean85/pretty-package-versions": "^2.0.6",
+ "jean85/pretty-package-versions": "^2.1.0",
"php": "~8.2.0 || ~8.3.0 || ~8.4.0",
"phpunit/php-code-coverage": "^11.0.7",
"phpunit/php-file-iterator": "^5.1.0",
"phpunit/php-timer": "^7.0.1",
- "phpunit/phpunit": "^11.4.1",
+ "phpunit/phpunit": "^11.5.0",
"sebastian/environment": "^7.2.0",
- "symfony/console": "^6.4.11 || ^7.1.5",
- "symfony/process": "^6.4.8 || ^7.1.5"
+ "symfony/console": "^6.4.14 || ^7.2.0",
+ "symfony/process": "^6.4.14 || ^7.2.0"
},
"require-dev": {
"doctrine/coding-standard": "^12.0.0",
"ext-pcov": "*",
"ext-posix": "*",
- "phpstan/phpstan": "^1.12.6",
- "phpstan/phpstan-deprecation-rules": "^1.2.1",
- "phpstan/phpstan-phpunit": "^1.4.0",
- "phpstan/phpstan-strict-rules": "^1.6.1",
- "squizlabs/php_codesniffer": "^3.10.3",
- "symfony/filesystem": "^6.4.9 || ^7.1.5"
+ "phpstan/phpstan": "^2.0.3",
+ "phpstan/phpstan-deprecation-rules": "^2.0.1",
+ "phpstan/phpstan-phpunit": "^2.0.1",
+ "phpstan/phpstan-strict-rules": "^2",
+ "squizlabs/php_codesniffer": "^3.11.1",
+ "symfony/filesystem": "^6.4.13 || ^7.2.0"
},
"bin": [
"bin/paratest",
@@ -12006,7 +11938,7 @@
],
"support": {
"issues": "https://github.com/paratestphp/paratest/issues",
- "source": "https://github.com/paratestphp/paratest/tree/v7.6.0"
+ "source": "https://github.com/paratestphp/paratest/tree/v7.6.3"
},
"funding": [
{
@@ -12018,20 +11950,20 @@
"type": "paypal"
}
],
- "time": "2024-10-15T12:38:31+00:00"
+ "time": "2024-12-10T13:59:28+00:00"
},
{
"name": "fakerphp/faker",
- "version": "v1.24.0",
+ "version": "v1.24.1",
"source": {
"type": "git",
"url": "https://github.com/FakerPHP/Faker.git",
- "reference": "a136842a532bac9ecd8a1c723852b09915d7db50"
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/a136842a532bac9ecd8a1c723852b09915d7db50",
- "reference": "a136842a532bac9ecd8a1c723852b09915d7db50",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
"shasum": ""
},
"require": {
@@ -12079,9 +12011,9 @@
],
"support": {
"issues": "https://github.com/FakerPHP/Faker/issues",
- "source": "https://github.com/FakerPHP/Faker/tree/v1.24.0"
+ "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
},
- "time": "2024-11-07T15:11:20+00:00"
+ "time": "2024-11-21T13:46:39+00:00"
},
{
"name": "fidry/cpu-core-counter",
@@ -12268,16 +12200,16 @@
},
{
"name": "laravel/dusk",
- "version": "v8.2.11",
+ "version": "v8.2.12",
"source": {
"type": "git",
"url": "https://github.com/laravel/dusk.git",
- "reference": "c667db6d8795f0ccc8f63d54a7780ce8a0cc3d3c"
+ "reference": "a399aa31c1c9cef793ad747403017e56df77396c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/dusk/zipball/c667db6d8795f0ccc8f63d54a7780ce8a0cc3d3c",
- "reference": "c667db6d8795f0ccc8f63d54a7780ce8a0cc3d3c",
+ "url": "https://api.github.com/repos/laravel/dusk/zipball/a399aa31c1c9cef793ad747403017e56df77396c",
+ "reference": "a399aa31c1c9cef793ad747403017e56df77396c",
"shasum": ""
},
"require": {
@@ -12287,7 +12219,7 @@
"illuminate/console": "^10.0|^11.0",
"illuminate/support": "^10.0|^11.0",
"php": "^8.1",
- "php-webdriver/webdriver": "^1.9.0",
+ "php-webdriver/webdriver": "^1.15.2",
"symfony/console": "^6.2|^7.0",
"symfony/finder": "^6.2|^7.0",
"symfony/process": "^6.2|^7.0",
@@ -12334,22 +12266,22 @@
],
"support": {
"issues": "https://github.com/laravel/dusk/issues",
- "source": "https://github.com/laravel/dusk/tree/v8.2.11"
+ "source": "https://github.com/laravel/dusk/tree/v8.2.12"
},
- "time": "2024-11-07T21:51:32+00:00"
+ "time": "2024-11-21T17:37:39+00:00"
},
{
"name": "laravel/pint",
- "version": "v1.18.1",
+ "version": "v1.18.3",
"source": {
"type": "git",
"url": "https://github.com/laravel/pint.git",
- "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9"
+ "reference": "cef51821608239040ab841ad6e1c6ae502ae3026"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9",
- "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9",
+ "url": "https://api.github.com/repos/laravel/pint/zipball/cef51821608239040ab841ad6e1c6ae502ae3026",
+ "reference": "cef51821608239040ab841ad6e1c6ae502ae3026",
"shasum": ""
},
"require": {
@@ -12360,13 +12292,13 @@
"php": "^8.1.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^3.64.0",
- "illuminate/view": "^10.48.20",
- "larastan/larastan": "^2.9.8",
+ "friendsofphp/php-cs-fixer": "^3.65.0",
+ "illuminate/view": "^10.48.24",
+ "larastan/larastan": "^2.9.11",
"laravel-zero/framework": "^10.4.0",
"mockery/mockery": "^1.6.12",
- "nunomaduro/termwind": "^1.15.1",
- "pestphp/pest": "^2.35.1"
+ "nunomaduro/termwind": "^1.17.0",
+ "pestphp/pest": "^2.36.0"
},
"bin": [
"builds/pint"
@@ -12402,20 +12334,20 @@
"issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint"
},
- "time": "2024-09-24T17:22:50+00:00"
+ "time": "2024-11-26T15:34:00+00:00"
},
{
"name": "laravel/telescope",
- "version": "v5.2.5",
+ "version": "v5.2.6",
"source": {
"type": "git",
"url": "https://github.com/laravel/telescope.git",
- "reference": "f68386a8d816c9e3a011b8301bfd263213bf00d4"
+ "reference": "7ee46fbea8e3b01108575c8edf7377abddfe8bb9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/telescope/zipball/f68386a8d816c9e3a011b8301bfd263213bf00d4",
- "reference": "f68386a8d816c9e3a011b8301bfd263213bf00d4",
+ "url": "https://api.github.com/repos/laravel/telescope/zipball/7ee46fbea8e3b01108575c8edf7377abddfe8bb9",
+ "reference": "7ee46fbea8e3b01108575c8edf7377abddfe8bb9",
"shasum": ""
},
"require": {
@@ -12469,22 +12401,22 @@
],
"support": {
"issues": "https://github.com/laravel/telescope/issues",
- "source": "https://github.com/laravel/telescope/tree/v5.2.5"
+ "source": "https://github.com/laravel/telescope/tree/v5.2.6"
},
- "time": "2024-10-31T17:06:07+00:00"
+ "time": "2024-11-25T20:34:58+00:00"
},
{
"name": "maximebf/debugbar",
- "version": "v1.23.3",
+ "version": "v1.23.4",
"source": {
"type": "git",
"url": "https://github.com/maximebf/php-debugbar.git",
- "reference": "687400043d77943ef95e8417cb44e1673ee57844"
+ "reference": "0815f47bdd867b816b4bf2ca1c7bd7f89e1527ca"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/687400043d77943ef95e8417cb44e1673ee57844",
- "reference": "687400043d77943ef95e8417cb44e1673ee57844",
+ "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/0815f47bdd867b816b4bf2ca1c7bd7f89e1527ca",
+ "reference": "0815f47bdd867b816b4bf2ca1c7bd7f89e1527ca",
"shasum": ""
},
"require": {
@@ -12537,9 +12469,9 @@
],
"support": {
"issues": "https://github.com/maximebf/php-debugbar/issues",
- "source": "https://github.com/maximebf/php-debugbar/tree/v1.23.3"
+ "source": "https://github.com/maximebf/php-debugbar/tree/v1.23.4"
},
- "time": "2024-10-29T12:24:25+00:00"
+ "time": "2024-12-05T10:36:51+00:00"
},
{
"name": "mockery/mockery",
@@ -12783,38 +12715,38 @@
},
{
"name": "pestphp/pest",
- "version": "v3.5.1",
+ "version": "v3.7.0",
"source": {
"type": "git",
"url": "https://github.com/pestphp/pest.git",
- "reference": "179d46ce97d52bcb3f791449ae94025c3f32e3e3"
+ "reference": "9688b83a3d7d0acdda21c01b8aeb933ec9fcd556"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pestphp/pest/zipball/179d46ce97d52bcb3f791449ae94025c3f32e3e3",
- "reference": "179d46ce97d52bcb3f791449ae94025c3f32e3e3",
+ "url": "https://api.github.com/repos/pestphp/pest/zipball/9688b83a3d7d0acdda21c01b8aeb933ec9fcd556",
+ "reference": "9688b83a3d7d0acdda21c01b8aeb933ec9fcd556",
"shasum": ""
},
"require": {
- "brianium/paratest": "^7.6.0",
+ "brianium/paratest": "^7.6.2",
"nunomaduro/collision": "^8.5.0",
- "nunomaduro/termwind": "^2.2.0",
+ "nunomaduro/termwind": "^2.3.0",
"pestphp/pest-plugin": "^3.0.0",
"pestphp/pest-plugin-arch": "^3.0.0",
"pestphp/pest-plugin-mutate": "^3.0.5",
"php": "^8.2.0",
- "phpunit/phpunit": "^11.4.3"
+ "phpunit/phpunit": "^11.5.0"
},
"conflict": {
"filp/whoops": "<2.16.0",
- "phpunit/phpunit": ">11.4.3",
+ "phpunit/phpunit": ">11.5.0",
"sebastian/exporter": "<6.0.0",
"webmozart/assert": "<1.11.0"
},
"require-dev": {
"pestphp/pest-dev-tools": "^3.3.0",
- "pestphp/pest-plugin-type-coverage": "^3.1.0",
- "symfony/process": "^7.1.6"
+ "pestphp/pest-plugin-type-coverage": "^3.2.0",
+ "symfony/process": "^7.2.0"
},
"bin": [
"bin/pest"
@@ -12879,7 +12811,7 @@
],
"support": {
"issues": "https://github.com/pestphp/pest/issues",
- "source": "https://github.com/pestphp/pest/tree/v3.5.1"
+ "source": "https://github.com/pestphp/pest/tree/v3.7.0"
},
"funding": [
{
@@ -12891,7 +12823,7 @@
"type": "github"
}
],
- "time": "2024-10-31T16:12:45+00:00"
+ "time": "2024-12-10T11:54:49+00:00"
},
{
"name": "pestphp/pest-plugin",
@@ -13225,16 +13157,16 @@
},
{
"name": "php-webdriver/webdriver",
- "version": "1.15.1",
+ "version": "1.15.2",
"source": {
"type": "git",
"url": "https://github.com/php-webdriver/php-webdriver.git",
- "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8"
+ "reference": "998e499b786805568deaf8cbf06f4044f05d91bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/cd52d9342c5aa738c2e75a67e47a1b6df97154e8",
- "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8",
+ "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/998e499b786805568deaf8cbf06f4044f05d91bf",
+ "reference": "998e499b786805568deaf8cbf06f4044f05d91bf",
"shasum": ""
},
"require": {
@@ -13256,7 +13188,7 @@
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpunit/phpunit": "^9.3",
"squizlabs/php_codesniffer": "^3.5",
- "symfony/var-dumper": "^5.0 || ^6.0"
+ "symfony/var-dumper": "^5.0 || ^6.0 || ^7.0"
},
"suggest": {
"ext-SimpleXML": "For Firefox profile creation"
@@ -13285,9 +13217,9 @@
],
"support": {
"issues": "https://github.com/php-webdriver/php-webdriver/issues",
- "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.1"
+ "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.2"
},
- "time": "2023-10-20T12:21:20+00:00"
+ "time": "2024-11-21T15:12:59+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -13614,16 +13546,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "11.4.3",
+ "version": "11.5.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76"
+ "reference": "0569902506a6c0878930b87ea79ec3b50ea563f7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e8e8ed1854de5d36c088ec1833beae40d2dedd76",
- "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0569902506a6c0878930b87ea79ec3b50ea563f7",
+ "reference": "0569902506a6c0878930b87ea79ec3b50ea563f7",
"shasum": ""
},
"require": {
@@ -13633,7 +13565,7 @@
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.12.0",
+ "myclabs/deep-copy": "^1.12.1",
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=8.2",
@@ -13644,14 +13576,15 @@
"phpunit/php-timer": "^7.0.1",
"sebastian/cli-parser": "^3.0.2",
"sebastian/code-unit": "^3.0.1",
- "sebastian/comparator": "^6.1.1",
+ "sebastian/comparator": "^6.2.1",
"sebastian/diff": "^6.0.2",
"sebastian/environment": "^7.2.0",
- "sebastian/exporter": "^6.1.3",
+ "sebastian/exporter": "^6.3.0",
"sebastian/global-state": "^7.0.2",
"sebastian/object-enumerator": "^6.0.1",
"sebastian/type": "^5.1.0",
- "sebastian/version": "^5.0.2"
+ "sebastian/version": "^5.0.2",
+ "staabm/side-effects-detector": "^1.0.5"
},
"suggest": {
"ext-soap": "To be able to generate mocks based on WSDL files"
@@ -13662,7 +13595,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "11.4-dev"
+ "dev-main": "11.5-dev"
}
},
"autoload": {
@@ -13694,7 +13627,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.3"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.0"
},
"funding": [
{
@@ -13710,7 +13643,7 @@
"type": "tidelift"
}
],
- "time": "2024-10-28T13:07:50+00:00"
+ "time": "2024-12-06T05:57:38+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -14150,16 +14083,16 @@
},
{
"name": "sebastian/exporter",
- "version": "6.1.3",
+ "version": "6.3.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e"
+ "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e",
- "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3",
+ "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3",
"shasum": ""
},
"require": {
@@ -14168,7 +14101,7 @@
"sebastian/recursion-context": "^6.0"
},
"require-dev": {
- "phpunit/phpunit": "^11.2"
+ "phpunit/phpunit": "^11.3"
},
"type": "library",
"extra": {
@@ -14216,7 +14149,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"security": "https://github.com/sebastianbergmann/exporter/security/policy",
- "source": "https://github.com/sebastianbergmann/exporter/tree/6.1.3"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0"
},
"funding": [
{
@@ -14224,7 +14157,7 @@
"type": "github"
}
],
- "time": "2024-07-03T04:56:19+00:00"
+ "time": "2024-12-05T09:17:50+00:00"
},
{
"name": "sebastian/global-state",
@@ -14756,16 +14689,16 @@
},
{
"name": "spatie/flare-client-php",
- "version": "1.8.0",
+ "version": "1.10.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/flare-client-php.git",
- "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122"
+ "reference": "140a42b2c5d59ac4ecf8f5b493386a4f2eb28272"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122",
- "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122",
+ "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/140a42b2c5d59ac4ecf8f5b493386a4f2eb28272",
+ "reference": "140a42b2c5d59ac4ecf8f5b493386a4f2eb28272",
"shasum": ""
},
"require": {
@@ -14813,7 +14746,7 @@
],
"support": {
"issues": "https://github.com/spatie/flare-client-php/issues",
- "source": "https://github.com/spatie/flare-client-php/tree/1.8.0"
+ "source": "https://github.com/spatie/flare-client-php/tree/1.10.0"
},
"funding": [
{
@@ -14821,7 +14754,7 @@
"type": "github"
}
],
- "time": "2024-08-01T08:27:26+00:00"
+ "time": "2024-12-02T14:30:06+00:00"
},
{
"name": "spatie/ignition",
@@ -14908,16 +14841,16 @@
},
{
"name": "spatie/laravel-ignition",
- "version": "2.8.0",
+ "version": "2.9.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-ignition.git",
- "reference": "3c067b75bfb50574db8f7e2c3978c65eed71126c"
+ "reference": "62042df15314b829d0f26e02108f559018e2aad0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/3c067b75bfb50574db8f7e2c3978c65eed71126c",
- "reference": "3c067b75bfb50574db8f7e2c3978c65eed71126c",
+ "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/62042df15314b829d0f26e02108f559018e2aad0",
+ "reference": "62042df15314b829d0f26e02108f559018e2aad0",
"shasum": ""
},
"require": {
@@ -14948,12 +14881,12 @@
"type": "library",
"extra": {
"laravel": {
- "providers": [
- "Spatie\\LaravelIgnition\\IgnitionServiceProvider"
- ],
"aliases": {
"Flare": "Spatie\\LaravelIgnition\\Facades\\Flare"
- }
+ },
+ "providers": [
+ "Spatie\\LaravelIgnition\\IgnitionServiceProvider"
+ ]
}
},
"autoload": {
@@ -14995,30 +14928,83 @@
"type": "github"
}
],
- "time": "2024-06-12T15:01:18+00:00"
+ "time": "2024-12-02T08:43:31+00:00"
},
{
- "name": "symfony/http-client",
- "version": "v7.1.8",
+ "name": "staabm/side-effects-detector",
+ "version": "1.0.5",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-client.git",
- "reference": "c30d91a1deac0dc3ed5e604683cf2e1dfc635b8a"
+ "url": "https://github.com/staabm/side-effects-detector.git",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client/zipball/c30d91a1deac0dc3ed5e604683cf2e1dfc635b8a",
- "reference": "c30d91a1deac0dc3ed5e604683cf2e1dfc635b8a",
+ "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^1.12.6",
+ "phpunit/phpunit": "^9.6.21",
+ "symfony/var-dumper": "^5.4.43",
+ "tomasvotruba/type-coverage": "1.0.0",
+ "tomasvotruba/unused-public": "1.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "lib/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A static analysis tool to detect side effects in PHP code",
+ "keywords": [
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/staabm/side-effects-detector/issues",
+ "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/staabm",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-20T05:08:20+00:00"
+ },
+ {
+ "name": "symfony/http-client",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client.git",
+ "reference": "955e43336aff03df1e8a8e17daefabb0127a313b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/955e43336aff03df1e8a8e17daefabb0127a313b",
+ "reference": "955e43336aff03df1e8a8e17daefabb0127a313b",
"shasum": ""
},
"require": {
"php": ">=8.2",
"psr/log": "^1|^2|^3",
"symfony/deprecation-contracts": "^2.5|^3",
- "symfony/http-client-contracts": "^3.4.1",
+ "symfony/http-client-contracts": "~3.4.3|^3.5.1",
"symfony/service-contracts": "^2.5|^3"
},
"conflict": {
+ "amphp/amp": "<2.5",
"php-http/discovery": "<1.15",
"symfony/http-foundation": "<6.4"
},
@@ -15029,14 +15015,14 @@
"symfony/http-client-implementation": "3.0"
},
"require-dev": {
- "amphp/amp": "^2.5",
- "amphp/http-client": "^4.2.1",
- "amphp/http-tunnel": "^1.0",
+ "amphp/http-client": "^4.2.1|^5.0",
+ "amphp/http-tunnel": "^1.0|^2.0",
"amphp/socket": "^1.1",
"guzzlehttp/promises": "^1.4|^2.0",
"nyholm/psr7": "^1.0",
"php-http/httplug": "^1.0|^2.0",
"psr/http-client": "^1.0",
+ "symfony/amphp-http-client-meta": "^1.0|^2.0",
"symfony/dependency-injection": "^6.4|^7.0",
"symfony/http-kernel": "^6.4|^7.0",
"symfony/messenger": "^6.4|^7.0",
@@ -15073,7 +15059,7 @@
"http"
],
"support": {
- "source": "https://github.com/symfony/http-client/tree/v7.1.8"
+ "source": "https://github.com/symfony/http-client/tree/v7.2.0"
},
"funding": [
{
@@ -15089,20 +15075,20 @@
"type": "tidelift"
}
],
- "time": "2024-11-13T13:40:27+00:00"
+ "time": "2024-11-29T08:22:02+00:00"
},
{
"name": "symfony/http-client-contracts",
- "version": "v3.5.0",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client-contracts.git",
- "reference": "20414d96f391677bf80078aa55baece78b82647d"
+ "reference": "c2f3ad828596624ca39ea40f83617ef51ca8bbf9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d",
- "reference": "20414d96f391677bf80078aa55baece78b82647d",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/c2f3ad828596624ca39ea40f83617ef51ca8bbf9",
+ "reference": "c2f3ad828596624ca39ea40f83617ef51ca8bbf9",
"shasum": ""
},
"require": {
@@ -15110,12 +15096,12 @@
},
"type": "library",
"extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
"branch-alias": {
"dev-main": "3.5-dev"
- },
- "thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
@@ -15151,7 +15137,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0"
+ "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -15167,7 +15153,7 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-11-25T12:02:18+00:00"
},
{
"name": "ta-tikoma/phpunit-architecture-test",
@@ -15281,12 +15267,12 @@
],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": [],
+ "stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^8.2"
},
- "platform-dev": [],
+ "platform-dev": {},
"plugin-api-version": "2.6.0"
}
diff --git a/config/constants.php b/config/constants.php
index 95b8c7c62..ba8aa0de5 100644
--- a/config/constants.php
+++ b/config/constants.php
@@ -78,11 +78,6 @@ return [
],
],
- 'waitlist' => [
- 'enabled' => env('WAITLIST', false),
- 'expiration' => 10,
- ],
-
'sentry' => [
'sentry_dsn' => env('SENTRY_DSN'),
],
diff --git a/database/migrations/2024_06_11_081614_add_www_non_www_redirect.php b/database/migrations/2024_06_11_081614_add_www_non_www_redirect.php
index 21ee4efcc..231c09ceb 100644
--- a/database/migrations/2024_06_11_081614_add_www_non_www_redirect.php
+++ b/database/migrations/2024_06_11_081614_add_www_non_www_redirect.php
@@ -12,7 +12,7 @@ return new class extends Migration
public function up(): void
{
Schema::table('applications', function (Blueprint $table) {
- $table->string('redirect')->enum('www', 'non-www', 'both')->default('both')->after('domain');
+ $table->enum('redirect', ['www', 'non-www', 'both'])->default('both')->after('domain');
});
}
diff --git a/database/migrations/2024_11_12_213200_add_slack_notifications_to_teams_table.php b/database/migrations/2024_11_12_213200_add_slack_notifications_to_teams_table.php
deleted file mode 100644
index a6457269a..000000000
--- a/database/migrations/2024_11_12_213200_add_slack_notifications_to_teams_table.php
+++ /dev/null
@@ -1,38 +0,0 @@
-boolean('slack_enabled')->default(false);
- $table->string('slack_webhook_url')->nullable();
- $table->boolean('slack_notifications_test')->default(true);
- $table->boolean('slack_notifications_deployments')->default(true);
- $table->boolean('slack_notifications_status_changes')->default(true);
- $table->boolean('slack_notifications_database_backups')->default(true);
- $table->boolean('slack_notifications_scheduled_tasks')->default(true);
- $table->boolean('slack_notifications_server_disk_usage')->default(true);
- });
- }
-
- public function down(): void
- {
- Schema::table('teams', function (Blueprint $table) {
- $table->dropColumn([
- 'slack_enabled',
- 'slack_webhook_url',
- 'slack_notifications_test',
- 'slack_notifications_deployments',
- 'slack_notifications_status_changes',
- 'slack_notifications_database_backups',
- 'slack_notifications_scheduled_tasks',
- 'slack_notifications_server_disk_usage',
- ]);
- });
- }
-};
diff --git a/database/migrations/2024_12_05_212355_create_email_notification_settings_table.php b/database/migrations/2024_12_05_212355_create_email_notification_settings_table.php
new file mode 100644
index 000000000..7338a8d0d
--- /dev/null
+++ b/database/migrations/2024_12_05_212355_create_email_notification_settings_table.php
@@ -0,0 +1,58 @@
+id();
+ $table->foreignId('team_id')->constrained()->cascadeOnDelete();
+
+ $table->boolean('smtp_enabled')->default(false);
+ $table->text('smtp_from_address')->nullable();
+ $table->text('smtp_from_name')->nullable();
+ $table->text('smtp_recipients')->nullable();
+ $table->text('smtp_host')->nullable();
+ $table->integer('smtp_port')->nullable();
+ $table->string('smtp_encryption')->nullable();
+ $table->text('smtp_username')->nullable();
+ $table->text('smtp_password')->nullable();
+ $table->integer('smtp_timeout')->nullable();
+
+ $table->boolean('resend_enabled')->default(false);
+ $table->text('resend_api_key')->nullable();
+
+ $table->boolean('use_instance_email_settings')->default(false);
+
+ $table->boolean('deployment_success_email_notifications')->default(false);
+ $table->boolean('deployment_failure_email_notifications')->default(true);
+ $table->boolean('status_change_email_notifications')->default(false);
+ $table->boolean('backup_success_email_notifications')->default(false);
+ $table->boolean('backup_failure_email_notifications')->default(true);
+ $table->boolean('scheduled_task_success_email_notifications')->default(false);
+ $table->boolean('scheduled_task_failure_email_notifications')->default(true);
+ $table->boolean('docker_cleanup_success_email_notifications')->default(false);
+ $table->boolean('docker_cleanup_failure_email_notifications')->default(true);
+ $table->boolean('server_disk_usage_email_notifications')->default(true);
+ $table->boolean('server_reachable_email_notifications')->default(false);
+ $table->boolean('server_unreachable_email_notifications')->default(true);
+
+ $table->unique(['team_id']);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('email_notification_settings');
+ }
+};
diff --git a/database/migrations/2024_12_05_212416_create_discord_notification_settings_table.php b/database/migrations/2024_12_05_212416_create_discord_notification_settings_table.php
new file mode 100644
index 000000000..0f2ced67f
--- /dev/null
+++ b/database/migrations/2024_12_05_212416_create_discord_notification_settings_table.php
@@ -0,0 +1,45 @@
+id();
+ $table->foreignId('team_id')->constrained()->cascadeOnDelete();
+
+ $table->boolean('discord_enabled')->default(false);
+ $table->text('discord_webhook_url')->nullable();
+
+ $table->boolean('deployment_success_discord_notifications')->default(false);
+ $table->boolean('deployment_failure_discord_notifications')->default(true);
+ $table->boolean('status_change_discord_notifications')->default(false);
+ $table->boolean('backup_success_discord_notifications')->default(false);
+ $table->boolean('backup_failure_discord_notifications')->default(true);
+ $table->boolean('scheduled_task_success_discord_notifications')->default(false);
+ $table->boolean('scheduled_task_failure_discord_notifications')->default(true);
+ $table->boolean('docker_cleanup_success_discord_notifications')->default(false);
+ $table->boolean('docker_cleanup_failure_discord_notifications')->default(true);
+ $table->boolean('server_disk_usage_discord_notifications')->default(true);
+ $table->boolean('server_reachable_discord_notifications')->default(false);
+ $table->boolean('server_unreachable_discord_notifications')->default(true);
+
+ $table->unique(['team_id']);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('discord_notification_settings');
+ }
+};
diff --git a/database/migrations/2024_12_05_212440_create_telegram_notification_settings_table.php b/database/migrations/2024_12_05_212440_create_telegram_notification_settings_table.php
new file mode 100644
index 000000000..190d148fc
--- /dev/null
+++ b/database/migrations/2024_12_05_212440_create_telegram_notification_settings_table.php
@@ -0,0 +1,59 @@
+id();
+ $table->foreignId('team_id')->constrained()->cascadeOnDelete();
+
+ $table->boolean('telegram_enabled')->default(false);
+ $table->text('telegram_token')->nullable();
+ $table->text('telegram_chat_id')->nullable();
+
+ $table->boolean('deployment_success_telegram_notifications')->default(false);
+ $table->boolean('deployment_failure_telegram_notifications')->default(true);
+ $table->boolean('status_change_telegram_notifications')->default(false);
+ $table->boolean('backup_success_telegram_notifications')->default(false);
+ $table->boolean('backup_failure_telegram_notifications')->default(true);
+ $table->boolean('scheduled_task_success_telegram_notifications')->default(false);
+ $table->boolean('scheduled_task_failure_telegram_notifications')->default(true);
+ $table->boolean('docker_cleanup_success_telegram_notifications')->default(false);
+ $table->boolean('docker_cleanup_failure_telegram_notifications')->default(true);
+ $table->boolean('server_disk_usage_telegram_notifications')->default(true);
+ $table->boolean('server_reachable_telegram_notifications')->default(false);
+ $table->boolean('server_unreachable_telegram_notifications')->default(true);
+
+ $table->text('telegram_notifications_deployment_success_topic_id')->nullable();
+ $table->text('telegram_notifications_deployment_failure_topic_id')->nullable();
+ $table->text('telegram_notifications_status_change_topic_id')->nullable();
+ $table->text('telegram_notifications_backup_success_topic_id')->nullable();
+ $table->text('telegram_notifications_backup_failure_topic_id')->nullable();
+ $table->text('telegram_notifications_scheduled_task_success_topic_id')->nullable();
+ $table->text('telegram_notifications_scheduled_task_failure_topic_id')->nullable();
+ $table->text('telegram_notifications_docker_cleanup_success_topic_id')->nullable();
+ $table->text('telegram_notifications_docker_cleanup_failure_topic_id')->nullable();
+ $table->text('telegram_notifications_server_disk_usage_topic_id')->nullable();
+ $table->text('telegram_notifications_server_reachable_topic_id')->nullable();
+ $table->text('telegram_notifications_server_unreachable_topic_id')->nullable();
+
+ $table->unique(['team_id']);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('telegram_notification_settings');
+ }
+};
diff --git a/database/migrations/2024_12_05_212546_migrate_email_notification_settings_from_teams_table.php b/database/migrations/2024_12_05_212546_migrate_email_notification_settings_from_teams_table.php
new file mode 100644
index 000000000..384f62f06
--- /dev/null
+++ b/database/migrations/2024_12_05_212546_migrate_email_notification_settings_from_teams_table.php
@@ -0,0 +1,135 @@
+get();
+
+ foreach ($teams as $team) {
+ try {
+ DB::table('email_notification_settings')->updateOrInsert(
+ ['team_id' => $team->id],
+ [
+ 'smtp_enabled' => $team->smtp_enabled ?? false,
+ 'smtp_from_address' => $team->smtp_from_address ? Crypt::encryptString($team->smtp_from_address) : null,
+ 'smtp_from_name' => $team->smtp_from_name ? Crypt::encryptString($team->smtp_from_name) : null,
+ 'smtp_recipients' => $team->smtp_recipients ? Crypt::encryptString($team->smtp_recipients) : null,
+ 'smtp_host' => $team->smtp_host ? Crypt::encryptString($team->smtp_host) : null,
+ 'smtp_port' => $team->smtp_port,
+ 'smtp_encryption' => $team->smtp_encryption,
+ 'smtp_username' => $team->smtp_username ? Crypt::encryptString($team->smtp_username) : null,
+ 'smtp_password' => $team->smtp_password,
+ 'smtp_timeout' => $team->smtp_timeout,
+
+ 'use_instance_email_settings' => $team->use_instance_email_settings ?? false,
+
+ 'resend_enabled' => $team->resend_enabled ?? false,
+ 'resend_api_key' => $team->resend_api_key,
+
+ 'deployment_success_email_notifications' => $team->smtp_notifications_deployments ?? false,
+ 'deployment_failure_email_notifications' => $team->smtp_notifications_deployments ?? true,
+ 'backup_success_email_notifications' => $team->smtp_notifications_database_backups ?? false,
+ 'backup_failure_email_notifications' => $team->smtp_notifications_database_backups ?? true,
+ 'scheduled_task_success_email_notifications' => $team->smtp_notifications_scheduled_tasks ?? false,
+ 'scheduled_task_failure_email_notifications' => $team->smtp_notifications_scheduled_tasks ?? true,
+ 'status_change_email_notifications' => $team->smtp_notifications_status_changes ?? false,
+ 'server_disk_usage_email_notifications' => $team->smtp_notifications_server_disk_usage ?? true,
+ ]
+ );
+ } catch (Exception $e) {
+ \Log::error('Error migrating email notification settings from teams table: '.$e->getMessage());
+ }
+ }
+
+ Schema::table('teams', function (Blueprint $table) {
+ $table->dropColumn([
+ 'smtp_enabled',
+ 'smtp_from_address',
+ 'smtp_from_name',
+ 'smtp_recipients',
+ 'smtp_host',
+ 'smtp_port',
+ 'smtp_encryption',
+ 'smtp_username',
+ 'smtp_password',
+ 'smtp_timeout',
+ 'use_instance_email_settings',
+ 'resend_enabled',
+ 'resend_api_key',
+ 'smtp_notifications_test',
+ 'smtp_notifications_deployments',
+ 'smtp_notifications_database_backups',
+ 'smtp_notifications_scheduled_tasks',
+ 'smtp_notifications_status_changes',
+ 'smtp_notifications_server_disk_usage',
+ ]);
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::table('teams', function (Blueprint $table) {
+ $table->boolean('smtp_enabled')->default(false);
+ $table->string('smtp_from_address')->nullable();
+ $table->string('smtp_from_name')->nullable();
+ $table->string('smtp_recipients')->nullable();
+ $table->string('smtp_host')->nullable();
+ $table->integer('smtp_port')->nullable();
+ $table->string('smtp_encryption')->nullable();
+ $table->text('smtp_username')->nullable();
+ $table->text('smtp_password')->nullable();
+ $table->integer('smtp_timeout')->nullable();
+
+ $table->boolean('use_instance_email_settings')->default(false);
+ $table->boolean('resend_enabled')->default(false);
+
+ $table->text('resend_api_key')->nullable();
+
+ $table->boolean('smtp_notifications_test')->default(false);
+ $table->boolean('smtp_notifications_deployments')->default(false);
+ $table->boolean('smtp_notifications_database_backups')->default(true);
+ $table->boolean('smtp_notifications_scheduled_tasks')->default(false);
+ $table->boolean('smtp_notifications_status_changes')->default(false);
+ $table->boolean('smtp_notifications_server_disk_usage')->default(true);
+ });
+
+ $settings = DB::table('email_notification_settings')->get();
+ foreach ($settings as $setting) {
+ try {
+ DB::table('teams')
+ ->where('id', $setting->team_id)
+ ->update([
+ 'smtp_enabled' => $setting->smtp_enabled,
+ 'smtp_from_address' => $setting->smtp_from_address ? Crypt::decryptString($setting->smtp_from_address) : null,
+ 'smtp_from_name' => $setting->smtp_from_name ? Crypt::decryptString($setting->smtp_from_name) : null,
+ 'smtp_recipients' => $setting->smtp_recipients ? Crypt::decryptString($setting->smtp_recipients) : null,
+ 'smtp_host' => $setting->smtp_host ? Crypt::decryptString($setting->smtp_host) : null,
+ 'smtp_port' => $setting->smtp_port,
+ 'smtp_encryption' => $setting->smtp_encryption,
+ 'smtp_username' => $setting->smtp_username ? Crypt::decryptString($setting->smtp_username) : null,
+ 'smtp_password' => $setting->smtp_password,
+ 'smtp_timeout' => $setting->smtp_timeout,
+
+ 'use_instance_email_settings' => $setting->use_instance_email_settings,
+
+ 'resend_enabled' => $setting->resend_enabled,
+ 'resend_api_key' => $setting->resend_api_key,
+
+ 'smtp_notifications_deployments' => $setting->deployment_success_email_notifications || $setting->deployment_failure_email_notifications,
+ 'smtp_notifications_database_backups' => $setting->backup_success_email_notifications || $setting->backup_failure_email_notifications,
+ 'smtp_notifications_scheduled_tasks' => $setting->scheduled_task_success_email_notifications || $setting->scheduled_task_failure_email_notifications,
+ 'smtp_notifications_status_changes' => $setting->status_change_email_notifications,
+ ]);
+ } catch (Exception $e) {
+ \Log::error('Error migrating email notification settings from teams table: '.$e->getMessage());
+ }
+ }
+ }
+};
diff --git a/database/migrations/2024_12_05_212631_migrate_discord_notification_settings_from_teams_table.php b/database/migrations/2024_12_05_212631_migrate_discord_notification_settings_from_teams_table.php
new file mode 100644
index 000000000..ed9e9af82
--- /dev/null
+++ b/database/migrations/2024_12_05_212631_migrate_discord_notification_settings_from_teams_table.php
@@ -0,0 +1,92 @@
+get();
+
+ foreach ($teams as $team) {
+ try {
+ DB::table('discord_notification_settings')->updateOrInsert(
+ ['team_id' => $team->id],
+ [
+ 'discord_enabled' => $team->discord_enabled ?? false,
+ 'discord_webhook_url' => $team->discord_webhook_url ? Crypt::encryptString($team->discord_webhook_url) : null,
+
+ 'deployment_success_discord_notifications' => $team->discord_notifications_deployments ?? false,
+ 'deployment_failure_discord_notifications' => $team->discord_notifications_deployments ?? true,
+ 'backup_success_discord_notifications' => $team->discord_notifications_database_backups ?? false,
+ 'backup_failure_discord_notifications' => $team->discord_notifications_database_backups ?? true,
+ 'scheduled_task_success_discord_notifications' => $team->discord_notifications_scheduled_tasks ?? false,
+ 'scheduled_task_failure_discord_notifications' => $team->discord_notifications_scheduled_tasks ?? true,
+ 'status_change_discord_notifications' => $team->discord_notifications_status_changes ?? false,
+ 'server_disk_usage_discord_notifications' => $team->discord_notifications_server_disk_usage ?? true,
+ ]
+ );
+ } catch (Exception $e) {
+ \Log::error('Error migrating discord notification settings from teams table: '.$e->getMessage());
+ }
+ }
+
+ Schema::table('teams', function (Blueprint $table) {
+ $table->dropColumn([
+ 'discord_enabled',
+ 'discord_webhook_url',
+ 'discord_notifications_test',
+ 'discord_notifications_deployments',
+ 'discord_notifications_status_changes',
+ 'discord_notifications_database_backups',
+ 'discord_notifications_scheduled_tasks',
+ 'discord_notifications_server_disk_usage',
+ ]);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('teams', function (Blueprint $table) {
+ $table->boolean('discord_enabled')->default(false);
+ $table->string('discord_webhook_url')->nullable();
+
+ $table->boolean('discord_notifications_test')->default(true);
+ $table->boolean('discord_notifications_deployments')->default(true);
+ $table->boolean('discord_notifications_status_changes')->default(true);
+ $table->boolean('discord_notifications_database_backups')->default(true);
+ $table->boolean('discord_notifications_scheduled_tasks')->default(true);
+ $table->boolean('discord_notifications_server_disk_usage')->default(true);
+ });
+
+ $settings = DB::table('discord_notification_settings')->get();
+ foreach ($settings as $setting) {
+ try {
+ DB::table('teams')
+ ->where('id', $setting->team_id)
+ ->update([
+ 'discord_enabled' => $setting->discord_enabled,
+ 'discord_webhook_url' => Crypt::decryptString($setting->discord_webhook_url),
+
+ 'discord_notifications_deployments' => $setting->deployment_success_discord_notifications || $setting->deployment_failure_discord_notifications,
+ 'discord_notifications_status_changes' => $setting->status_change_discord_notifications,
+ 'discord_notifications_database_backups' => $setting->backup_success_discord_notifications || $setting->backup_failure_discord_notifications,
+ 'discord_notifications_scheduled_tasks' => $setting->scheduled_task_success_discord_notifications || $setting->scheduled_task_failure_discord_notifications,
+ 'discord_notifications_server_disk_usage' => $setting->server_disk_usage_discord_notifications,
+ ]);
+ } catch (Exception $e) {
+ \Log::error('Error migrating discord notification settings from teams table: '.$e->getMessage());
+ }
+ }
+ }
+};
diff --git a/database/migrations/2024_12_05_212705_migrate_telegram_notification_settings_from_teams_table.php b/database/migrations/2024_12_05_212705_migrate_telegram_notification_settings_from_teams_table.php
new file mode 100644
index 000000000..0c10646b9
--- /dev/null
+++ b/database/migrations/2024_12_05_212705_migrate_telegram_notification_settings_from_teams_table.php
@@ -0,0 +1,114 @@
+get();
+
+ foreach ($teams as $team) {
+ try {
+ DB::table('telegram_notification_settings')->updateOrInsert(
+ ['team_id' => $team->id],
+ [
+ 'telegram_enabled' => $team->telegram_enabled ?? false,
+ 'telegram_token' => $team->telegram_token ? Crypt::encryptString($team->telegram_token) : null,
+ 'telegram_chat_id' => $team->telegram_chat_id ? Crypt::encryptString($team->telegram_chat_id) : null,
+
+ 'deployment_success_telegram_notifications' => $team->telegram_notifications_deployments ?? false,
+ 'deployment_failure_telegram_notifications' => $team->telegram_notifications_deployments ?? true,
+ 'backup_success_telegram_notifications' => $team->telegram_notifications_database_backups ?? false,
+ 'backup_failure_telegram_notifications' => $team->telegram_notifications_database_backups ?? true,
+ 'scheduled_task_success_telegram_notifications' => $team->telegram_notifications_scheduled_tasks ?? false,
+ 'scheduled_task_failure_telegram_notifications' => $team->telegram_notifications_scheduled_tasks ?? true,
+ 'status_change_telegram_notifications' => $team->telegram_notifications_status_changes ?? false,
+ 'server_disk_usage_telegram_notifications' => $team->telegram_notifications_server_disk_usage ?? true,
+
+ 'telegram_notifications_deployment_success_topic_id' => $team->telegram_notifications_deployments_message_thread_id ? Crypt::encryptString($team->telegram_notifications_deployments_message_thread_id) : null,
+ 'telegram_notifications_deployment_failure_topic_id' => $team->telegram_notifications_deployments_message_thread_id ? Crypt::encryptString($team->telegram_notifications_deployments_message_thread_id) : null,
+ 'telegram_notifications_backup_success_topic_id' => $team->telegram_notifications_database_backups_message_thread_id ? Crypt::encryptString($team->telegram_notifications_database_backups_message_thread_id) : null,
+ 'telegram_notifications_backup_failure_topic_id' => $team->telegram_notifications_database_backups_message_thread_id ? Crypt::encryptString($team->telegram_notifications_database_backups_message_thread_id) : null,
+ 'telegram_notifications_scheduled_task_success_topic_id' => $team->telegram_notifications_scheduled_tasks_thread_id ? Crypt::encryptString($team->telegram_notifications_scheduled_tasks_thread_id) : null,
+ 'telegram_notifications_scheduled_task_failure_topic_id' => $team->telegram_notifications_scheduled_tasks_thread_id ? Crypt::encryptString($team->telegram_notifications_scheduled_tasks_thread_id) : null,
+ 'telegram_notifications_status_change_topic_id' => $team->telegram_notifications_status_changes_message_thread_id ? Crypt::encryptString($team->telegram_notifications_status_changes_message_thread_id) : null,
+ ]
+ );
+ } catch (Exception $e) {
+ \Log::error('Error migrating telegram notification settings from teams table: '.$e->getMessage());
+ }
+ }
+
+ Schema::table('teams', function (Blueprint $table) {
+ $table->dropColumn([
+ 'telegram_enabled',
+ 'telegram_token',
+ 'telegram_chat_id',
+ 'telegram_notifications_test',
+ 'telegram_notifications_deployments',
+ 'telegram_notifications_status_changes',
+ 'telegram_notifications_database_backups',
+ 'telegram_notifications_scheduled_tasks',
+ 'telegram_notifications_server_disk_usage',
+ 'telegram_notifications_test_message_thread_id',
+ 'telegram_notifications_deployments_message_thread_id',
+ 'telegram_notifications_status_changes_message_thread_id',
+ 'telegram_notifications_database_backups_message_thread_id',
+ 'telegram_notifications_scheduled_tasks_thread_id',
+ ]);
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::table('teams', function (Blueprint $table) {
+ $table->boolean('telegram_enabled')->default(false);
+ $table->text('telegram_token')->nullable();
+ $table->text('telegram_chat_id')->nullable();
+
+ $table->boolean('telegram_notifications_test')->default(true);
+ $table->boolean('telegram_notifications_deployments')->default(true);
+ $table->boolean('telegram_notifications_status_changes')->default(true);
+ $table->boolean('telegram_notifications_database_backups')->default(true);
+ $table->boolean('telegram_notifications_scheduled_tasks')->default(true);
+ $table->boolean('telegram_notifications_server_disk_usage')->default(true);
+
+ $table->text('telegram_notifications_test_message_thread_id')->nullable();
+ $table->text('telegram_notifications_deployments_message_thread_id')->nullable();
+ $table->text('telegram_notifications_status_changes_message_thread_id')->nullable();
+ $table->text('telegram_notifications_database_backups_message_thread_id')->nullable();
+ $table->text('telegram_notifications_scheduled_tasks_thread_id')->nullable();
+ });
+
+ $settings = DB::table('telegram_notification_settings')->get();
+ foreach ($settings as $setting) {
+ try {
+ DB::table('teams')
+ ->where('id', $setting->team_id)
+ ->update([
+ 'telegram_enabled' => $setting->telegram_enabled,
+ 'telegram_token' => $setting->telegram_token ? Crypt::decryptString($setting->telegram_token) : null,
+ 'telegram_chat_id' => $setting->telegram_chat_id ? Crypt::decryptString($setting->telegram_chat_id) : null,
+
+ 'telegram_notifications_deployments' => $setting->deployment_success_telegram_notifications || $setting->deployment_failure_telegram_notifications,
+ 'telegram_notifications_status_changes' => $setting->status_change_telegram_notifications,
+ 'telegram_notifications_database_backups' => $setting->backup_success_telegram_notifications || $setting->backup_failure_telegram_notifications,
+ 'telegram_notifications_scheduled_tasks' => $setting->scheduled_task_success_telegram_notifications || $setting->scheduled_task_failure_telegram_notifications,
+ 'telegram_notifications_server_disk_usage' => $setting->server_disk_usage_telegram_notifications,
+
+ 'telegram_notifications_deployments_message_thread_id' => $setting->telegram_notifications_deployment_success_topic_id ? Crypt::decryptString($setting->telegram_notifications_deployment_success_topic_id) : null,
+ 'telegram_notifications_status_changes_message_thread_id' => $setting->telegram_notifications_status_change_topic_id ? Crypt::decryptString($setting->telegram_notifications_status_change_topic_id) : null,
+ 'telegram_notifications_database_backups_message_thread_id' => $setting->telegram_notifications_backup_success_topic_id ? Crypt::decryptString($setting->telegram_notifications_backup_success_topic_id) : null,
+ 'telegram_notifications_scheduled_tasks_thread_id' => $setting->telegram_notifications_scheduled_task_success_topic_id ? Crypt::decryptString($setting->telegram_notifications_scheduled_task_success_topic_id) : null,
+ ]);
+ } catch (Exception $e) {
+ \Log::error('Error migrating telegram notification settings from teams table: '.$e->getMessage());
+ }
+ }
+ }
+};
diff --git a/database/migrations/2024_12_06_142014_create_slack_notification_settings_table.php b/database/migrations/2024_12_06_142014_create_slack_notification_settings_table.php
new file mode 100644
index 000000000..790e0f667
--- /dev/null
+++ b/database/migrations/2024_12_06_142014_create_slack_notification_settings_table.php
@@ -0,0 +1,57 @@
+id();
+ $table->foreignId('team_id')->constrained()->cascadeOnDelete();
+
+ $table->boolean('slack_enabled')->default(false);
+ $table->text('slack_webhook_url')->nullable();
+
+ $table->boolean('deployment_success_slack_notifications')->default(false);
+ $table->boolean('deployment_failure_slack_notifications')->default(true);
+ $table->boolean('status_change_slack_notifications')->default(false);
+ $table->boolean('backup_success_slack_notifications')->default(false);
+ $table->boolean('backup_failure_slack_notifications')->default(true);
+ $table->boolean('scheduled_task_success_slack_notifications')->default(false);
+ $table->boolean('scheduled_task_failure_slack_notifications')->default(true);
+ $table->boolean('docker_cleanup_success_slack_notifications')->default(false);
+ $table->boolean('docker_cleanup_failure_slack_notifications')->default(true);
+ $table->boolean('server_disk_usage_slack_notifications')->default(true);
+ $table->boolean('server_reachable_slack_notifications')->default(false);
+ $table->boolean('server_unreachable_slack_notifications')->default(true);
+
+ $table->unique(['team_id']);
+ });
+ $teams = DB::table('teams')->get();
+
+ foreach ($teams as $team) {
+ try {
+ DB::table('slack_notification_settings')->insert([
+ 'team_id' => $team->id,
+ ]);
+ } catch (\Throwable $e) {
+ \Log::error('Error migrating slack notification settings from teams table: '.$e->getMessage());
+ }
+ }
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('slack_notification_settings');
+ }
+};
diff --git a/database/migrations/2024_12_09_105711_drop_waitlists_table.php b/database/migrations/2024_12_09_105711_drop_waitlists_table.php
new file mode 100644
index 000000000..0e319369d
--- /dev/null
+++ b/database/migrations/2024_12_09_105711_drop_waitlists_table.php
@@ -0,0 +1,31 @@
+id();
+ $table->string('uuid');
+ $table->string('type');
+ $table->string('email')->unique();
+ $table->boolean('verified')->default(false);
+ $table->timestamps();
+ });
+ }
+};
diff --git a/database/migrations/2024_12_10_122142_encrypt_instance_settings_email_columns.php b/database/migrations/2024_12_10_122142_encrypt_instance_settings_email_columns.php
new file mode 100644
index 000000000..44e0f2f47
--- /dev/null
+++ b/database/migrations/2024_12_10_122142_encrypt_instance_settings_email_columns.php
@@ -0,0 +1,72 @@
+exists()) {
+ Schema::table('instance_settings', function (Blueprint $table) {
+ $table->text('smtp_from_address')->nullable()->change();
+ $table->text('smtp_from_name')->nullable()->change();
+ $table->text('smtp_recipients')->nullable()->change();
+ $table->text('smtp_host')->nullable()->change();
+ $table->text('smtp_username')->nullable()->change();
+ });
+
+ $settings = DB::table('instance_settings')->get();
+ foreach ($settings as $setting) {
+ try {
+ DB::table('instance_settings')->where('id', $setting->id)->update([
+ 'smtp_from_address' => $setting->smtp_from_address ? Crypt::encryptString($setting->smtp_from_address) : null,
+ 'smtp_from_name' => $setting->smtp_from_name ? Crypt::encryptString($setting->smtp_from_name) : null,
+ 'smtp_recipients' => $setting->smtp_recipients ? Crypt::encryptString($setting->smtp_recipients) : null,
+ 'smtp_host' => $setting->smtp_host ? Crypt::encryptString($setting->smtp_host) : null,
+ 'smtp_username' => $setting->smtp_username ? Crypt::encryptString($setting->smtp_username) : null,
+ ]);
+ } catch (Exception $e) {
+ \Log::error('Error encrypting instance settings email columns: '.$e->getMessage());
+ }
+ }
+ }
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('instance_settings', function (Blueprint $table) {
+ $table->string('smtp_from_address')->nullable()->change();
+ $table->string('smtp_from_name')->nullable()->change();
+ $table->string('smtp_recipients')->nullable()->change();
+ $table->string('smtp_host')->nullable()->change();
+ $table->string('smtp_username')->nullable()->change();
+ });
+
+ if (DB::table('instance_settings')->exists()) {
+ $settings = DB::table('instance_settings')->get();
+ foreach ($settings as $setting) {
+ try {
+ DB::table('instance_settings')->where('id', $setting->id)->update([
+ 'smtp_from_address' => $setting->smtp_from_address ? Crypt::decryptString($setting->smtp_from_address) : null,
+ 'smtp_from_name' => $setting->smtp_from_name ? Crypt::decryptString($setting->smtp_from_name) : null,
+ 'smtp_recipients' => $setting->smtp_recipients ? Crypt::decryptString($setting->smtp_recipients) : null,
+ 'smtp_host' => $setting->smtp_host ? Crypt::decryptString($setting->smtp_host) : null,
+ 'smtp_username' => $setting->smtp_username ? Crypt::decryptString($setting->smtp_username) : null,
+ ]);
+ } catch (Exception $e) {
+ \Log::error('Error decrypting instance settings email columns: '.$e->getMessage());
+ }
+ }
+ }
+ }
+};
diff --git a/database/migrations/2024_12_10_122143_drop_resale_license.php b/database/migrations/2024_12_10_122143_drop_resale_license.php
new file mode 100644
index 000000000..aaf498c3b
--- /dev/null
+++ b/database/migrations/2024_12_10_122143_drop_resale_license.php
@@ -0,0 +1,30 @@
+dropColumn('is_resale_license_active');
+ $table->dropColumn('resale_license');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('instance_settings', function (Blueprint $table) {
+ $table->boolean('is_resale_license_active')->default(false);
+ $table->longText('resale_license')->nullable();
+ });
+ }
+};
diff --git a/database/seeders/InstanceSettingsSeeder.php b/database/seeders/InstanceSettingsSeeder.php
index 35fc8506b..7f2deb3a6 100644
--- a/database/seeders/InstanceSettingsSeeder.php
+++ b/database/seeders/InstanceSettingsSeeder.php
@@ -16,7 +16,6 @@ class InstanceSettingsSeeder extends Seeder
InstanceSettings::create([
'id' => 0,
'is_registration_enabled' => true,
- 'is_resale_license_active' => true,
'smtp_enabled' => true,
'smtp_host' => 'coolify-mail',
'smtp_port' => 1025,
diff --git a/database/seeders/ProductionSeeder.php b/database/seeders/ProductionSeeder.php
index 7acdef548..9a301aa67 100644
--- a/database/seeders/ProductionSeeder.php
+++ b/database/seeders/ProductionSeeder.php
@@ -22,9 +22,9 @@ class ProductionSeeder extends Seeder
public function run(): void
{
if (isCloud()) {
- echo "[x]: Running in cloud mode.\n";
+ echo " Running in cloud mode.\n";
} else {
- echo "[x]: Running in self-hosted mode.\n";
+ echo " Running in self-hosted mode.\n";
}
// Fix for 4.0.0-beta.37
diff --git a/database/seeders/TestTeamSeeder.php b/database/seeders/TestTeamSeeder.php
deleted file mode 100644
index 940c45cc5..000000000
--- a/database/seeders/TestTeamSeeder.php
+++ /dev/null
@@ -1,42 +0,0 @@
-create([
- 'name' => '1 personal, 1 other team, owner, no other members',
- 'email' => '1@example.com',
- ]);
- $team = Team::create([
- 'name' => '1@example.com',
- 'personal_team' => false,
- 'show_boarding' => true,
- ]);
- $user->teams()->attach($team, ['role' => 'owner']);
-
- // User has 2 teams, 1 personal, 1 other where it is the owner and 1 other member is in the team
- $user = User::factory()->create([
- 'name' => 'owner: 1 personal, 1 other team, owner, 1 other member',
- 'email' => '2@example.com',
- ]);
- $team = Team::create([
- 'name' => '2@example.com',
- 'personal_team' => false,
- 'show_boarding' => true,
- ]);
- $user->teams()->attach($team, ['role' => 'owner']);
- $user = User::factory()->create([
- 'name' => 'member: 1 personal, 1 other team, owner, 1 other member',
- 'email' => '3@example.com',
- ]);
- $team->members()->attach($user, ['role' => 'member']);
- }
-}
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
index 05b9f9cfb..76f8e9ca6 100644
--- a/docker-compose.dev.yml
+++ b/docker-compose.dev.yml
@@ -2,15 +2,14 @@ services:
coolify:
build:
context: .
- dockerfile: ./docker/dev/Dockerfile
+ dockerfile: ./docker/development/Dockerfile
+ args:
+ - USER_ID=${USERID:-1000}
+ - GROUP_ID=${GROUPID:-1000}
ports:
- "${APP_PORT:-8000}:80"
environment:
- PUID: "${USERID:-1000}"
- PGID: "${GROUPID:-1000}"
- SSL_MODE: "off"
- AUTORUN_LARAVEL_STORAGE_LINK: "false"
- AUTORUN_LARAVEL_MIGRATION: "false"
+ AUTORUN_ENABLED: false
PUSHER_HOST: "${PUSHER_HOST}"
PUSHER_PORT: "${PUSHER_PORT}"
PUSHER_SCHEME: "${PUSHER_SCHEME:-http}"
diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile
deleted file mode 100644
index e90521759..000000000
--- a/docker/dev/Dockerfile
+++ /dev/null
@@ -1,61 +0,0 @@
-# Versions
-# https://hub.docker.com/r/serversideup/php/tags?name=8.3-fpm-nginx-alpine
-ARG SERVERSIDEUP_PHP_VERSION=8.2-fpm-nginx-v2.2.1
-# https://github.com/minio/mc/releases
-ARG MINIO_VERSION=RELEASE.2024-11-05T11-29-45Z
-# https://github.com/cloudflare/cloudflared/releases
-ARG CLOUDFLARED_VERSION=2024.11.0
-# https://www.postgresql.org/support/versioning/ - Can not updated automatically so keep it at 15
-ARG POSTGRES_VERSION=15
-
-FROM minio/mc:${MINIO_VERSION} AS minio-client
-
-FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION}
-
-ARG TARGETPLATFORM
-ARG CLOUDFLARED_VERSION
-ARG MINIO_VERSION
-ARG POSTGRES_VERSION
-
-# Use build arguments for caching
-ARG BUILDTIME_DEPS="dirmngr ca-certificates software-properties-common gnupg gnupg2 apt-transport-https curl"
-ARG RUNTIME_DEPS="postgresql-client-$POSTGRES_VERSION php8.2-pgsql openssh-client git git-lfs jq lsof"
-
-# Install dependencies
-RUN --mount=type=cache,target=/var/cache/apt \
- apt-get update && \
- apt-get install -y $BUILDTIME_DEPS && \
- curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/postgresql.gpg > /dev/null && \
- echo deb [arch=amd64,arm64,ppc64el signed-by=/usr/share/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt/ jammy-pgdg main | tee -a /etc/apt/sources.list.d/postgresql.list && \
- apt-get update && \
- apt-get install -y $RUNTIME_DEPS && \
- apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
-
-COPY --chmod=755 docker/dev/etc/s6-overlay/ /etc/s6-overlay/
-
-COPY docker/dev/nginx.conf /etc/nginx/conf.d/custom.conf
-
-RUN echo "alias ll='ls -al'" >>/etc/bash.bashrc && \
- echo "alias a='php artisan'" >>/etc/bash.bashrc
-
-RUN mkdir -p /usr/local/bin
-
-RUN --mount=type=cache,target=/root/.cache \
- /bin/bash -c "if [[ ${TARGETPLATFORM} == 'linux/amd64' ]]; then \
- echo 'amd64' && \
- curl -sSL https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared \
- ;fi"
-
-RUN --mount=type=cache,target=/root/.cache \
- /bin/bash -c "if [[ ${TARGETPLATFORM} == 'linux/arm64' ]]; then \
- echo 'arm64' && \
- curl -L https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared \
- ;fi"
-
-COPY --from=minio-client /usr/bin/mc /usr/bin/mc
-RUN chmod +x /usr/bin/mc
-
-RUN { \
- echo 'upload_max_filesize=256M'; \
- echo 'post_max_size=256M'; \
- } > /etc/php/current_version/cli/conf.d/upload-limits.ini
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/horizon/run b/docker/dev/etc/s6-overlay/s6-rc.d/horizon/run
deleted file mode 100644
index 87471097e..000000000
--- a/docker/dev/etc/s6-overlay/s6-rc.d/horizon/run
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/command/execlineb -P
-foreground {
- s6-sleep 5
- su - webuser -c "php /var/www/html/artisan start:horizon"
-}
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/init-setup/up b/docker/dev/etc/s6-overlay/s6-rc.d/init-setup/up
deleted file mode 100644
index e02307e49..000000000
--- a/docker/dev/etc/s6-overlay/s6-rc.d/init-setup/up
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/command/execlineb -P
-foreground { composer -d /var/www/html/ install }
-foreground { php /var/www/html/artisan migrate --step }
-foreground { php /var/www/html/artisan dev --init }
-
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/scheduler-worker/run b/docker/dev/etc/s6-overlay/s6-rc.d/scheduler-worker/run
deleted file mode 100644
index 87ca0cae1..000000000
--- a/docker/dev/etc/s6-overlay/s6-rc.d/scheduler-worker/run
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/command/execlineb -P
-foreground {
- s6-sleep 5
- su - webuser -c "php /var/www/html/artisan start:scheduler"
-}
diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile
new file mode 100644
index 000000000..7d78e2854
--- /dev/null
+++ b/docker/development/Dockerfile
@@ -0,0 +1,81 @@
+# Versions
+# https://hub.docker.com/r/serversideup/php/tags?name=8.4-fpm-nginx-alpine
+ARG SERVERSIDEUP_PHP_VERSION=8.4-fpm-nginx-alpine
+# https://github.com/minio/mc/releases
+ARG MINIO_VERSION=RELEASE.2024-11-17T19-35-25Z
+# https://github.com/cloudflare/cloudflared/releases
+ARG CLOUDFLARED_VERSION=2024.11.1
+# https://www.postgresql.org/support/versioning/
+ARG POSTGRES_VERSION=15
+
+# =================================================================
+# Get MinIO client
+# =================================================================
+FROM minio/mc:${MINIO_VERSION} AS minio-client
+
+# =================================================================
+# Final Stage: Production image
+# =================================================================
+FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION}
+
+ARG USER_ID
+ARG GROUP_ID
+ARG TARGETPLATFORM
+ARG POSTGRES_VERSION
+ARG CLOUDFLARED_VERSION
+
+WORKDIR /var/www/html
+
+USER root
+
+RUN docker-php-serversideup-set-id www-data $USER_ID:$GROUP_ID && \
+ docker-php-serversideup-set-file-permissions --owner $USER_ID:$GROUP_ID --service nginx
+
+# Install PostgreSQL repository and keys
+RUN apk add --no-cache gnupg && \
+ mkdir -p /usr/share/keyrings && \
+ curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor > /usr/share/keyrings/postgresql.gpg
+
+# Install system dependencies
+RUN apk add --no-cache \
+ postgresql${POSTGRES_VERSION}-client \
+ openssh-client \
+ git \
+ git-lfs \
+ jq \
+ lsof \
+ vim
+
+# Configure shell aliases
+RUN echo "alias ll='ls -al'" >> /etc/profile && \
+ echo "alias a='php artisan'" >> /etc/profile && \
+ echo "alias logs='tail -f storage/logs/laravel.log'" >> /etc/profile
+
+# Install Cloudflared based on architecture
+RUN mkdir -p /usr/local/bin && \
+ if [ "${TARGETPLATFORM}" = "linux/amd64" ]; then \
+ curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-amd64" -o /usr/local/bin/cloudflared; \
+ elif [ "${TARGETPLATFORM}" = "linux/arm64" ]; then \
+ curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64" -o /usr/local/bin/cloudflared; \
+ fi && \
+ chmod +x /usr/local/bin/cloudflared
+
+# Configure PHP
+COPY docker/development/etc/php/conf.d/zzz-custom-php.ini /usr/local/etc/php/conf.d/zzz-custom-php.ini
+ENV PHP_OPCACHE_ENABLE=0
+
+# Configure Nginx and S6 overlay
+COPY docker/development/etc/nginx/conf.d/custom.conf /etc/nginx/conf.d/custom.conf
+COPY docker/development/etc/nginx/site-opts.d/http.conf /etc/nginx/site-opts.d/http.conf
+COPY --chmod=755 docker/development/etc/s6-overlay/ /etc/s6-overlay/
+
+RUN mkdir -p /etc/nginx/conf.d && \
+ chown -R www-data:www-data /etc/nginx && \
+ chmod -R 755 /etc/nginx
+
+# Install MinIO client
+COPY --from=minio-client /usr/bin/mc /usr/bin/mc
+RUN chmod +x /usr/bin/mc
+
+# Switch to non-root user
+USER www-data
diff --git a/docker/dev/nginx.conf b/docker/development/etc/nginx/conf.d/custom.conf
similarity index 100%
rename from docker/dev/nginx.conf
rename to docker/development/etc/nginx/conf.d/custom.conf
diff --git a/docker/development/etc/nginx/site-opts.d/http.conf b/docker/development/etc/nginx/site-opts.d/http.conf
new file mode 100644
index 000000000..41735cf06
--- /dev/null
+++ b/docker/development/etc/nginx/site-opts.d/http.conf
@@ -0,0 +1,45 @@
+listen 80 default_server;
+listen [::]:80 default_server;
+listen 8080 default_server;
+listen [::]:8080 default_server;
+
+root /var/www/html/public;
+
+# Set allowed "index" files
+index index.html index.htm index.php;
+
+server_name _;
+
+charset utf-8;
+
+# Set max upload to 2048M
+client_max_body_size 2048M;
+
+# Healthchecks: Set /healthcheck to be the healthcheck URL
+location /healthcheck {
+ access_log off;
+
+ # set max 5 seconds for healthcheck
+ fastcgi_read_timeout 5s;
+
+ include fastcgi_params;
+ fastcgi_param SCRIPT_NAME /healthcheck;
+ fastcgi_param SCRIPT_FILENAME /healthcheck;
+ fastcgi_pass 127.0.0.1:9000;
+}
+
+# Have NGINX try searching for PHP files as well
+location / {
+ try_files $uri $uri/ /index.php?$query_string;
+}
+
+# Pass "*.php" files to PHP-FPM
+location ~ \.php$ {
+ fastcgi_pass 127.0.0.1:9000;
+ fastcgi_index index.php;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ include fastcgi_params;
+ fastcgi_buffers 8 8k;
+ fastcgi_buffer_size 8k;
+ fastcgi_read_timeout 99;
+}
diff --git a/docker/development/etc/php/conf.d/zzz-custom-php.ini b/docker/development/etc/php/conf.d/zzz-custom-php.ini
new file mode 100644
index 000000000..33fb865e0
--- /dev/null
+++ b/docker/development/etc/php/conf.d/zzz-custom-php.ini
@@ -0,0 +1,9 @@
+error_reporting = E_ERROR
+error_log = /dev/stderr
+log_errors = On
+log_errors_max_len = 8192
+ignore_repeated_errors = On
+ignore_repeated_source = On
+
+upload_max_filesize = 256M
+post_max_size = 256M
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-setup b/docker/development/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-setup
similarity index 100%
rename from docker/dev/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-setup
rename to docker/development/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-setup
diff --git a/docker/development/etc/s6-overlay/s6-rc.d/horizon/run b/docker/development/etc/s6-overlay/s6-rc.d/horizon/run
new file mode 100644
index 000000000..ada19b3a3
--- /dev/null
+++ b/docker/development/etc/s6-overlay/s6-rc.d/horizon/run
@@ -0,0 +1,12 @@
+#!/command/execlineb -P
+
+# Use with-contenv to ensure environment variables are available
+with-contenv
+cd /var/www/html
+
+foreground {
+ php
+ artisan
+ start:horizon
+}
+
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/horizon/type b/docker/development/etc/s6-overlay/s6-rc.d/horizon/type
similarity index 100%
rename from docker/dev/etc/s6-overlay/s6-rc.d/horizon/type
rename to docker/development/etc/s6-overlay/s6-rc.d/horizon/type
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/init-setup/type b/docker/development/etc/s6-overlay/s6-rc.d/init-setup/type
similarity index 100%
rename from docker/dev/etc/s6-overlay/s6-rc.d/init-setup/type
rename to docker/development/etc/s6-overlay/s6-rc.d/init-setup/type
diff --git a/docker/development/etc/s6-overlay/s6-rc.d/init-setup/up b/docker/development/etc/s6-overlay/s6-rc.d/init-setup/up
new file mode 100644
index 000000000..67e0f5c1a
--- /dev/null
+++ b/docker/development/etc/s6-overlay/s6-rc.d/init-setup/up
@@ -0,0 +1,22 @@
+#!/command/execlineb -P
+
+# Use with-contenv to ensure environment variables are available
+with-contenv
+cd /var/www/html
+foreground {
+ composer
+ install
+}
+foreground {
+ php
+ artisan
+ migrate
+ --step
+}
+foreground {
+ php
+ artisan
+ dev
+ --init
+}
+
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-setup b/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-setup
similarity index 100%
rename from docker/dev/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-setup
rename to docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-setup
diff --git a/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/run b/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/run
new file mode 100644
index 000000000..b81a44833
--- /dev/null
+++ b/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/run
@@ -0,0 +1,13 @@
+#!/command/execlineb -P
+
+# Use with-contenv to ensure environment variables are available
+with-contenv
+cd /var/www/html
+
+foreground {
+ php
+ artisan
+ start:scheduler
+}
+
+
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/scheduler-worker/type b/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/type
similarity index 100%
rename from docker/dev/etc/s6-overlay/s6-rc.d/scheduler-worker/type
rename to docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/type
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/user/contents.d/horizon b/docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/horizon
similarity index 100%
rename from docker/dev/etc/s6-overlay/s6-rc.d/user/contents.d/horizon
rename to docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/horizon
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/user/contents.d/init-setup b/docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/init-setup
similarity index 100%
rename from docker/dev/etc/s6-overlay/s6-rc.d/user/contents.d/init-setup
rename to docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/init-setup
diff --git a/docker/dev/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker b/docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker
similarity index 100%
rename from docker/dev/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker
rename to docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker
diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile
deleted file mode 100644
index 36be6cf06..000000000
--- a/docker/prod/Dockerfile
+++ /dev/null
@@ -1,82 +0,0 @@
-# Versions
-# https://hub.docker.com/r/serversideup/php/tags?name=8.3-fpm-nginx-alpine
-ARG SERVERSIDEUP_PHP_VERSION=8.2-fpm-nginx-v2.2.1
-# https://github.com/minio/mc/releases
-ARG MINIO_VERSION=RELEASE.2024-11-05T11-29-45Z
-# https://github.com/cloudflare/cloudflared/releases
-ARG CLOUDFLARED_VERSION=2024.11.0
-# https://www.postgresql.org/support/versioning/ - Can not updated automatically so keep it at 15
-ARG POSTGRES_VERSION=15
-
-
-FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION} AS base
-WORKDIR /var/www/html
-
-COPY composer.json composer.lock ./
-RUN composer install --no-dev --no-interaction --no-plugins --no-scripts --prefer-dist
-
-FROM node:20 AS static-assets
-WORKDIR /app
-COPY . .
-COPY --from=base --chown=9999:9999 /var/www/html .
-RUN npm install
-RUN npm run build
-
-FROM minio/mc:${MINIO_VERSION} AS minio-client
-
-FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION}
-
-ARG TARGETPLATFORM
-ARG CLOUDFLARED_VERSION
-ARG POSTGRES_VERSION
-ARG CI=true
-
-WORKDIR /var/www/html
-
-RUN apt-get update
-# Postgres version requirements
-RUN apt install dirmngr ca-certificates software-properties-common gnupg gnupg2 apt-transport-https curl -y
-RUN curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/postgresql.gpg > /dev/null
-
-RUN echo deb [arch=amd64,arm64,ppc64el signed-by=/usr/share/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt/ jammy-pgdg main | tee -a /etc/apt/sources.list.d/postgresql.list
-
-RUN apt-get update
-RUN apt-get install postgresql-client-${POSTGRES_VERSION} -y
-
-# Coolify requirements
-RUN apt-get install -y php8.2-pgsql openssh-client git git-lfs jq lsof vim
-RUN apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
-
-COPY docker/prod/nginx.conf /etc/nginx/conf.d/custom.conf
-
-COPY --from=base --chown=9999:9999 /var/www/html .
-
-COPY --chown=9999:9999 . .
-RUN composer dump-autoload
-
-COPY --from=static-assets --chown=9999:9999 /app/public/build ./public/build
-COPY --chmod=755 docker/prod/etc/s6-overlay/ /etc/s6-overlay/
-
-RUN echo "alias ll='ls -al'" >>/etc/bash.bashrc
-RUN echo "alias a='php artisan'" >>/etc/bash.bashrc
-RUN echo "alias logs='tail -f storage/logs/laravel.log'" >>/etc/bash.bashrc
-
-RUN mkdir -p /usr/local/bin
-
-RUN /bin/bash -c "if [[ ${TARGETPLATFORM} == 'linux/amd64' ]]; then \
- echo 'amd64' && \
- curl -sSL https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared \
- ;fi"
-
-RUN /bin/bash -c "if [[ ${TARGETPLATFORM} == 'linux/arm64' ]]; then \
- echo 'arm64' && \
- curl -L https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared \
- ;fi"
-
-RUN { \
- echo 'upload_max_filesize=256M'; \
- echo 'post_max_size=256M'; \
- } > /etc/php/current_version/cli/conf.d/upload-limits.ini
-
-COPY --from=minio-client /usr/bin/mc /usr/bin/mc
-RUN chmod +x /usr/bin/mc
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/db-migration/up b/docker/prod/etc/s6-overlay/s6-rc.d/db-migration/up
deleted file mode 100644
index 250d5d8b1..000000000
--- a/docker/prod/etc/s6-overlay/s6-rc.d/db-migration/up
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/command/execlineb -P
-php /var/www/html/artisan migrate --force --isolated
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/horizon/run b/docker/prod/etc/s6-overlay/s6-rc.d/horizon/run
deleted file mode 100644
index 87471097e..000000000
--- a/docker/prod/etc/s6-overlay/s6-rc.d/horizon/run
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/command/execlineb -P
-foreground {
- s6-sleep 5
- su - webuser -c "php /var/www/html/artisan start:horizon"
-}
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/init-script/up b/docker/prod/etc/s6-overlay/s6-rc.d/init-script/up
deleted file mode 100644
index 3b252b782..000000000
--- a/docker/prod/etc/s6-overlay/s6-rc.d/init-script/up
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/command/execlineb -P
-s6-setuidgid webuser
-php /var/www/html/artisan app:init
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/init-seeder/up b/docker/prod/etc/s6-overlay/s6-rc.d/init-seeder/up
deleted file mode 100644
index 44645c11f..000000000
--- a/docker/prod/etc/s6-overlay/s6-rc.d/init-seeder/up
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/command/execlineb -P
-php /var/www/html/artisan db:seed --class ProductionSeeder --force
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/scheduler-worker/run b/docker/prod/etc/s6-overlay/s6-rc.d/scheduler-worker/run
deleted file mode 100644
index 87ca0cae1..000000000
--- a/docker/prod/etc/s6-overlay/s6-rc.d/scheduler-worker/run
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/command/execlineb -P
-foreground {
- s6-sleep 5
- su - webuser -c "php /var/www/html/artisan start:scheduler"
-}
diff --git a/docker/production/Dockerfile b/docker/production/Dockerfile
new file mode 100644
index 000000000..09281a666
--- /dev/null
+++ b/docker/production/Dockerfile
@@ -0,0 +1,136 @@
+# Versions
+# https://hub.docker.com/r/serversideup/php/tags?name=8.4-fpm-nginx-alpine
+ARG SERVERSIDEUP_PHP_VERSION=8.4-fpm-nginx-alpine
+# https://github.com/minio/mc/releases
+ARG MINIO_VERSION=RELEASE.2024-11-17T19-35-25Z
+# https://github.com/cloudflare/cloudflared/releases
+ARG CLOUDFLARED_VERSION=2024.11.1
+# https://www.postgresql.org/support/versioning/
+ARG POSTGRES_VERSION=15
+
+# Add user/group
+ARG USER_ID=9999
+ARG GROUP_ID=9999
+
+# =================================================================
+# Stage 1: Composer dependencies
+# =================================================================
+FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION} AS base
+
+USER root
+
+ARG USER_ID
+ARG GROUP_ID
+
+RUN docker-php-serversideup-set-id www-data $USER_ID:$GROUP_ID && \
+ docker-php-serversideup-set-file-permissions --owner $USER_ID:$GROUP_ID --service nginx
+
+WORKDIR /var/www/html
+COPY --chown=www-data:www-data composer.json composer.lock ./
+RUN composer install --no-dev --no-interaction --no-plugins --no-scripts --prefer-dist
+
+USER www-data
+
+# =================================================================
+# Stage 2: Frontend assets compilation
+# =================================================================
+FROM node:20-alpine AS static-assets
+
+WORKDIR /app
+COPY package*.json vite.config.js tailwind.config.js postcss.config.cjs ./
+RUN npm ci
+COPY . .
+RUN npm run build
+
+# =================================================================
+# Stage 3: Get MinIO client
+# =================================================================
+FROM minio/mc:${MINIO_VERSION} AS minio-client
+
+# =================================================================
+# Final Stage: Production image
+# =================================================================
+FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION}
+
+ARG USER_ID
+ARG GROUP_ID
+ARG TARGETPLATFORM
+ARG POSTGRES_VERSION
+ARG CLOUDFLARED_VERSION
+ARG CI=true
+
+WORKDIR /var/www/html
+
+USER root
+
+RUN docker-php-serversideup-set-id www-data $USER_ID:$GROUP_ID && \
+ docker-php-serversideup-set-file-permissions --owner $USER_ID:$GROUP_ID --service nginx
+
+# Install PostgreSQL repository and keys
+RUN apk add --no-cache gnupg && \
+ mkdir -p /usr/share/keyrings && \
+ curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor > /usr/share/keyrings/postgresql.gpg
+
+# Install system dependencies
+RUN apk add --no-cache \
+ postgresql${POSTGRES_VERSION}-client \
+ openssh-client \
+ git \
+ git-lfs \
+ jq \
+ lsof \
+ vim
+
+# Configure shell aliases
+RUN echo "alias ll='ls -al'" >> /etc/profile && \
+ echo "alias a='php artisan'" >> /etc/profile && \
+ echo "alias logs='tail -f storage/logs/laravel.log'" >> /etc/profile
+
+# Install Cloudflared based on architecture
+RUN mkdir -p /usr/local/bin && \
+ if [ "${TARGETPLATFORM}" = "linux/amd64" ]; then \
+ curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-amd64" -o /usr/local/bin/cloudflared; \
+ elif [ "${TARGETPLATFORM}" = "linux/arm64" ]; then \
+ curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64" -o /usr/local/bin/cloudflared; \
+ fi && \
+ chmod +x /usr/local/bin/cloudflared
+
+# Configure PHP
+COPY docker/production/etc/php/conf.d/zzz-custom-php.ini /usr/local/etc/php/conf.d/zzz-custom-php.ini
+ENV PHP_OPCACHE_ENABLE=1
+
+# Copy application files from previous stages
+COPY --from=base --chown=www-data:www-data /var/www/html/vendor ./vendor
+COPY --from=static-assets --chown=www-data:www-data /app/public/build ./public/build
+
+# Copy application source code
+COPY --chown=www-data:www-data composer.json composer.lock ./
+COPY --chown=www-data:www-data app ./app
+COPY --chown=www-data:www-data bootstrap ./bootstrap
+COPY --chown=www-data:www-data config ./config
+COPY --chown=www-data:www-data database ./database
+COPY --chown=www-data:www-data lang ./lang
+COPY --chown=www-data:www-data public ./public
+COPY --chown=www-data:www-data routes ./routes
+COPY --chown=www-data:www-data storage ./storage
+COPY --chown=www-data:www-data templates ./templates
+COPY --chown=www-data:www-data resources/views ./resources/views
+COPY --chown=www-data:www-data artisan artisan
+
+RUN composer dump-autoload
+
+# Configure Nginx and S6 overlay
+COPY docker/production/etc/nginx/conf.d/custom.conf /etc/nginx/conf.d/custom.conf
+COPY docker/production/etc/nginx/site-opts.d/http.conf /etc/nginx/site-opts.d/http.conf
+COPY --chmod=755 docker/production/etc/s6-overlay/ /etc/s6-overlay/
+
+RUN mkdir -p /etc/nginx/conf.d && \
+ chown -R www-data:www-data /etc/nginx && \
+ chmod -R 755 /etc/nginx
+
+# Install MinIO client
+COPY --from=minio-client /usr/bin/mc /usr/bin/mc
+RUN chmod +x /usr/bin/mc
+
+# Switch to non-root user
+USER www-data
diff --git a/docker/prod/nginx.conf b/docker/production/etc/nginx/conf.d/custom.conf
similarity index 100%
rename from docker/prod/nginx.conf
rename to docker/production/etc/nginx/conf.d/custom.conf
diff --git a/docker/production/etc/nginx/site-opts.d/http.conf b/docker/production/etc/nginx/site-opts.d/http.conf
new file mode 100644
index 000000000..41735cf06
--- /dev/null
+++ b/docker/production/etc/nginx/site-opts.d/http.conf
@@ -0,0 +1,45 @@
+listen 80 default_server;
+listen [::]:80 default_server;
+listen 8080 default_server;
+listen [::]:8080 default_server;
+
+root /var/www/html/public;
+
+# Set allowed "index" files
+index index.html index.htm index.php;
+
+server_name _;
+
+charset utf-8;
+
+# Set max upload to 2048M
+client_max_body_size 2048M;
+
+# Healthchecks: Set /healthcheck to be the healthcheck URL
+location /healthcheck {
+ access_log off;
+
+ # set max 5 seconds for healthcheck
+ fastcgi_read_timeout 5s;
+
+ include fastcgi_params;
+ fastcgi_param SCRIPT_NAME /healthcheck;
+ fastcgi_param SCRIPT_FILENAME /healthcheck;
+ fastcgi_pass 127.0.0.1:9000;
+}
+
+# Have NGINX try searching for PHP files as well
+location / {
+ try_files $uri $uri/ /index.php?$query_string;
+}
+
+# Pass "*.php" files to PHP-FPM
+location ~ \.php$ {
+ fastcgi_pass 127.0.0.1:9000;
+ fastcgi_index index.php;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ include fastcgi_params;
+ fastcgi_buffers 8 8k;
+ fastcgi_buffer_size 8k;
+ fastcgi_read_timeout 99;
+}
diff --git a/docker/production/etc/php/conf.d/zzz-custom-php.ini b/docker/production/etc/php/conf.d/zzz-custom-php.ini
new file mode 100644
index 000000000..a2297ad0d
--- /dev/null
+++ b/docker/production/etc/php/conf.d/zzz-custom-php.ini
@@ -0,0 +1,9 @@
+error_reporting = E_ERROR
+error_log = /var/www/html/storage/logs/php-error.log
+log_errors = Off
+log_errors_max_len = 8192
+ignore_repeated_errors = On
+ignore_repeated_source = On
+
+upload_max_filesize = 256M
+post_max_size = 256M
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/db-migration/type b/docker/production/etc/s6-overlay/s6-rc.d/db-migration/type
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/db-migration/type
rename to docker/production/etc/s6-overlay/s6-rc.d/db-migration/type
diff --git a/docker/production/etc/s6-overlay/s6-rc.d/db-migration/up b/docker/production/etc/s6-overlay/s6-rc.d/db-migration/up
new file mode 100644
index 000000000..f1a5006f1
--- /dev/null
+++ b/docker/production/etc/s6-overlay/s6-rc.d/db-migration/up
@@ -0,0 +1,13 @@
+#!/command/execlineb -P
+
+# Use with-contenv to ensure environment variables are available
+with-contenv
+cd /var/www/html
+foreground {
+ php
+ artisan
+ migrate
+ --force
+ --isolated
+}
+
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/init-script b/docker/production/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-script
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/init-script
rename to docker/production/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-script
diff --git a/docker/production/etc/s6-overlay/s6-rc.d/horizon/run b/docker/production/etc/s6-overlay/s6-rc.d/horizon/run
new file mode 100644
index 000000000..be6647607
--- /dev/null
+++ b/docker/production/etc/s6-overlay/s6-rc.d/horizon/run
@@ -0,0 +1,11 @@
+#!/command/execlineb -P
+
+# Use with-contenv to ensure environment variables are available
+with-contenv
+cd /var/www/html
+foreground {
+ php
+ artisan
+ start:horizon
+}
+
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/horizon/type b/docker/production/etc/s6-overlay/s6-rc.d/horizon/type
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/horizon/type
rename to docker/production/etc/s6-overlay/s6-rc.d/horizon/type
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/init-script/dependencies.d/init-seeder b/docker/production/etc/s6-overlay/s6-rc.d/init-script/dependencies.d/init-seeder
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/init-script/dependencies.d/init-seeder
rename to docker/production/etc/s6-overlay/s6-rc.d/init-script/dependencies.d/init-seeder
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/init-script/type b/docker/production/etc/s6-overlay/s6-rc.d/init-script/type
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/init-script/type
rename to docker/production/etc/s6-overlay/s6-rc.d/init-script/type
diff --git a/docker/production/etc/s6-overlay/s6-rc.d/init-script/up b/docker/production/etc/s6-overlay/s6-rc.d/init-script/up
new file mode 100644
index 000000000..3fad5f2c5
--- /dev/null
+++ b/docker/production/etc/s6-overlay/s6-rc.d/init-script/up
@@ -0,0 +1,12 @@
+#!/command/execlineb -P
+
+# Use with-contenv to ensure environment variables are available
+with-contenv
+cd /var/www/html
+foreground {
+ php
+ artisan
+ app:init
+}
+
+
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/init-seeder/dependencies.d/db-migration b/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/dependencies.d/db-migration
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/init-seeder/dependencies.d/db-migration
rename to docker/production/etc/s6-overlay/s6-rc.d/init-seeder/dependencies.d/db-migration
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/init-seeder/type b/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/type
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/init-seeder/type
rename to docker/production/etc/s6-overlay/s6-rc.d/init-seeder/type
diff --git a/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/up b/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/up
new file mode 100644
index 000000000..20d17c58b
--- /dev/null
+++ b/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/up
@@ -0,0 +1,15 @@
+#!/command/execlineb -P
+
+# Use with-contenv to ensure environment variables are available
+with-contenv
+cd /var/www/html
+foreground {
+ php
+ artisan
+ db:seed
+ --class
+ ProductionSeeder
+ --force
+}
+
+
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/db-migration b/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-script
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/db-migration
rename to docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-script
diff --git a/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/run b/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/run
new file mode 100644
index 000000000..a2ecb0a73
--- /dev/null
+++ b/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/run
@@ -0,0 +1,10 @@
+#!/command/execlineb -P
+
+# Use with-contenv to ensure environment variables are available
+with-contenv
+cd /var/www/html
+foreground {
+ php
+ artisan
+ start:scheduler
+}
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/scheduler-worker/type b/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/type
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/scheduler-worker/type
rename to docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/type
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/horizon b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/db-migration
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/horizon
rename to docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/db-migration
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/init-seeder b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/horizon
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/init-seeder
rename to docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/horizon
diff --git a/docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/init-script
similarity index 100%
rename from docker/prod/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker
rename to docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/init-script
diff --git a/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/init-seeder b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/init-seeder
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker
new file mode 100644
index 000000000..e69de29bb
diff --git a/package-lock.json b/package-lock.json
index 22398dcf5..e88e191b2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,21 +10,21 @@
"@tailwindcss/typography": "0.5.15",
"@xterm/addon-fit": "^0.10.0",
"@xterm/xterm": "^5.5.0",
- "alpinejs": "3.14.3",
+ "alpinejs": "3.14.7",
"ioredis": "5.4.1"
},
"devDependencies": {
- "@vitejs/plugin-vue": "5.2.0",
+ "@vitejs/plugin-vue": "5.2.1",
"autoprefixer": "10.4.20",
- "axios": "1.7.7",
- "laravel-echo": "1.17.0",
- "laravel-vite-plugin": "1.0.6",
+ "axios": "1.7.9",
+ "laravel-echo": "1.17.1",
+ "laravel-vite-plugin": "1.1.1",
"postcss": "8.4.49",
"pusher-js": "8.4.0-rc2",
"tailwind-scrollbar": "^3.1.0",
- "tailwindcss": "3.4.14",
- "vite": "5.4.11",
- "vue": "3.5.12"
+ "tailwindcss": "3.4.16",
+ "vite": "6.0.3",
+ "vue": "3.5.13"
}
},
"node_modules/@alloc/quick-lru": {
@@ -59,13 +59,13 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
- "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
+ "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.0"
+ "@babel/types": "^7.26.3"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -75,9 +75,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
- "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+ "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -89,9 +89,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
- "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+ "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
"cpu": [
"ppc64"
],
@@ -102,13 +102,13 @@
"aix"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
- "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+ "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
"cpu": [
"arm"
],
@@ -119,13 +119,13 @@
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
- "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+ "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
"cpu": [
"arm64"
],
@@ -136,13 +136,13 @@
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
- "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+ "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
"cpu": [
"x64"
],
@@ -153,13 +153,13 @@
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
- "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+ "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
"cpu": [
"arm64"
],
@@ -170,13 +170,13 @@
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
- "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+ "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
"cpu": [
"x64"
],
@@ -187,13 +187,13 @@
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
- "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
"cpu": [
"arm64"
],
@@ -204,13 +204,13 @@
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
- "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+ "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
"cpu": [
"x64"
],
@@ -221,13 +221,13 @@
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
- "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+ "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
"cpu": [
"arm"
],
@@ -238,13 +238,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
- "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+ "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
"cpu": [
"arm64"
],
@@ -255,13 +255,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
- "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+ "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
"cpu": [
"ia32"
],
@@ -272,13 +272,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
- "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+ "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
"cpu": [
"loong64"
],
@@ -289,13 +289,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
- "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+ "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
"cpu": [
"mips64el"
],
@@ -306,13 +306,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
- "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+ "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
"cpu": [
"ppc64"
],
@@ -323,13 +323,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
- "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+ "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
"cpu": [
"riscv64"
],
@@ -340,13 +340,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
- "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+ "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
"cpu": [
"s390x"
],
@@ -357,13 +357,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
- "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+ "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
"cpu": [
"x64"
],
@@ -374,13 +374,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
- "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
"cpu": [
"x64"
],
@@ -391,13 +391,30 @@
"netbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
- "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
"cpu": [
"x64"
],
@@ -408,13 +425,13 @@
"openbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
- "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+ "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
"cpu": [
"x64"
],
@@ -425,13 +442,13 @@
"sunos"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
- "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+ "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
"cpu": [
"arm64"
],
@@ -442,13 +459,13 @@
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
- "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+ "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
"cpu": [
"ia32"
],
@@ -459,13 +476,13 @@
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
- "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+ "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
"cpu": [
"x64"
],
@@ -476,7 +493,7 @@
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@ioredis/commands": {
@@ -484,31 +501,51 @@
"resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz",
"integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg=="
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
"dependencies": {
- "@jridgewell/set-array": "^1.0.1",
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "license": "MIT",
"engines": {
"node": ">=6.0.0"
}
@@ -520,19 +557,15 @@
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.18",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
- "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
- },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -565,6 +598,16 @@
"node": ">= 8"
}
},
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.25.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.25.0.tgz",
@@ -864,98 +907,98 @@
"license": "MIT"
},
"node_modules/@vitejs/plugin-vue": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.0.tgz",
- "integrity": "sha512-7n7KdUEtx/7Yl7I/WVAMZ1bEb0eVvXF3ummWTeLcs/9gvo9pJhuLdouSXGjdZ/MKD1acf1I272+X0RMua4/R3g==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
+ "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^18.0.0 || >=20.0.0"
},
"peerDependencies": {
- "vite": "^5.0.0",
+ "vite": "^5.0.0 || ^6.0.0",
"vue": "^3.2.25"
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz",
- "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+ "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.25.3",
- "@vue/shared": "3.5.12",
+ "@vue/shared": "3.5.13",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-core/node_modules/@vue/shared": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
- "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@vue/compiler-dom": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz",
- "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+ "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/compiler-core": "3.5.12",
- "@vue/shared": "3.5.12"
+ "@vue/compiler-core": "3.5.13",
+ "@vue/shared": "3.5.13"
}
},
"node_modules/@vue/compiler-dom/node_modules/@vue/shared": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
- "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz",
- "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+ "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.25.3",
- "@vue/compiler-core": "3.5.12",
- "@vue/compiler-dom": "3.5.12",
- "@vue/compiler-ssr": "3.5.12",
- "@vue/shared": "3.5.12",
+ "@vue/compiler-core": "3.5.13",
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.11",
- "postcss": "^8.4.47",
+ "postcss": "^8.4.48",
"source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-sfc/node_modules/@vue/shared": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
- "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz",
- "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+ "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.12",
- "@vue/shared": "3.5.12"
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/shared": "3.5.13"
}
},
"node_modules/@vue/compiler-ssr/node_modules/@vue/shared": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
- "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
"dev": true,
"license": "MIT"
},
@@ -968,81 +1011,81 @@
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz",
- "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+ "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.12",
- "@vue/shared": "3.5.12"
+ "@vue/reactivity": "3.5.13",
+ "@vue/shared": "3.5.13"
}
},
"node_modules/@vue/runtime-core/node_modules/@vue/reactivity": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz",
- "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz",
+ "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/shared": "3.5.12"
+ "@vue/shared": "3.5.13"
}
},
"node_modules/@vue/runtime-core/node_modules/@vue/shared": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
- "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@vue/runtime-dom": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz",
- "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+ "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.12",
- "@vue/runtime-core": "3.5.12",
- "@vue/shared": "3.5.12",
+ "@vue/reactivity": "3.5.13",
+ "@vue/runtime-core": "3.5.13",
+ "@vue/shared": "3.5.13",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/runtime-dom/node_modules/@vue/reactivity": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz",
- "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz",
+ "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/shared": "3.5.12"
+ "@vue/shared": "3.5.13"
}
},
"node_modules/@vue/runtime-dom/node_modules/@vue/shared": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
- "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@vue/server-renderer": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz",
- "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+ "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/compiler-ssr": "3.5.12",
- "@vue/shared": "3.5.12"
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13"
},
"peerDependencies": {
- "vue": "3.5.12"
+ "vue": "3.5.13"
}
},
"node_modules/@vue/server-renderer/node_modules/@vue/shared": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
- "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
"dev": true,
"license": "MIT"
},
@@ -1065,18 +1108,43 @@
"integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A=="
},
"node_modules/alpinejs": {
- "version": "3.14.3",
- "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.3.tgz",
- "integrity": "sha512-cL8JBEDAm4UeVjTN5QnFl8QgMGUwxFn1GvQvu3RtfAHUrAPRahGihrsWpKnEK9L0QMqsAPk/R8MylMWKHaK33A==",
+ "version": "3.14.7",
+ "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.7.tgz",
+ "integrity": "sha512-ScnbydNBcWVnCiVupD3wWUvoMPm8244xkvDNMxVCspgmap9m4QuJ7pjc+77UtByU+1+Ejg0wzYkP4mQaOMcvng==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "~3.1.1"
}
},
+ "node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "license": "MIT"
},
"node_modules/anymatch": {
"version": "3.1.3",
@@ -1140,9 +1208,9 @@
}
},
"node_modules/axios": {
- "version": "1.7.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1154,7 +1222,8 @@
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
},
"node_modules/binary-extensions": {
"version": "2.2.0",
@@ -1165,12 +1234,12 @@
}
},
"node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "balanced-match": "^1.0.0"
}
},
"node_modules/braces": {
@@ -1247,15 +1316,10 @@
"license": "CC-BY-4.0"
},
"node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@@ -1268,6 +1332,9 @@
"engines": {
"node": ">= 8.10.0"
},
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
"optionalDependencies": {
"fsevents": "~2.3.2"
}
@@ -1291,6 +1358,24 @@
"node": ">=0.10.0"
}
},
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -1307,14 +1392,24 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "license": "MIT",
"engines": {
"node": ">= 6"
}
},
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
},
"node_modules/cssesc": {
"version": "3.0.0",
@@ -1377,6 +1472,12 @@
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
},
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
"node_modules/electron-to-chromium": {
"version": "1.5.55",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.55.tgz",
@@ -1384,6 +1485,12 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -1398,9 +1505,9 @@
}
},
"node_modules/esbuild": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
- "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
+ "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -1408,32 +1515,33 @@
"esbuild": "bin/esbuild"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.21.5",
- "@esbuild/android-arm": "0.21.5",
- "@esbuild/android-arm64": "0.21.5",
- "@esbuild/android-x64": "0.21.5",
- "@esbuild/darwin-arm64": "0.21.5",
- "@esbuild/darwin-x64": "0.21.5",
- "@esbuild/freebsd-arm64": "0.21.5",
- "@esbuild/freebsd-x64": "0.21.5",
- "@esbuild/linux-arm": "0.21.5",
- "@esbuild/linux-arm64": "0.21.5",
- "@esbuild/linux-ia32": "0.21.5",
- "@esbuild/linux-loong64": "0.21.5",
- "@esbuild/linux-mips64el": "0.21.5",
- "@esbuild/linux-ppc64": "0.21.5",
- "@esbuild/linux-riscv64": "0.21.5",
- "@esbuild/linux-s390x": "0.21.5",
- "@esbuild/linux-x64": "0.21.5",
- "@esbuild/netbsd-x64": "0.21.5",
- "@esbuild/openbsd-x64": "0.21.5",
- "@esbuild/sunos-x64": "0.21.5",
- "@esbuild/win32-arm64": "0.21.5",
- "@esbuild/win32-ia32": "0.21.5",
- "@esbuild/win32-x64": "0.21.5"
+ "@esbuild/aix-ppc64": "0.24.0",
+ "@esbuild/android-arm": "0.24.0",
+ "@esbuild/android-arm64": "0.24.0",
+ "@esbuild/android-x64": "0.24.0",
+ "@esbuild/darwin-arm64": "0.24.0",
+ "@esbuild/darwin-x64": "0.24.0",
+ "@esbuild/freebsd-arm64": "0.24.0",
+ "@esbuild/freebsd-x64": "0.24.0",
+ "@esbuild/linux-arm": "0.24.0",
+ "@esbuild/linux-arm64": "0.24.0",
+ "@esbuild/linux-ia32": "0.24.0",
+ "@esbuild/linux-loong64": "0.24.0",
+ "@esbuild/linux-mips64el": "0.24.0",
+ "@esbuild/linux-ppc64": "0.24.0",
+ "@esbuild/linux-riscv64": "0.24.0",
+ "@esbuild/linux-s390x": "0.24.0",
+ "@esbuild/linux-x64": "0.24.0",
+ "@esbuild/netbsd-x64": "0.24.0",
+ "@esbuild/openbsd-arm64": "0.24.0",
+ "@esbuild/openbsd-x64": "0.24.0",
+ "@esbuild/sunos-x64": "0.24.0",
+ "@esbuild/win32-arm64": "0.24.0",
+ "@esbuild/win32-ia32": "0.24.0",
+ "@esbuild/win32-x64": "0.24.0"
}
},
"node_modules/escalade": {
@@ -1518,6 +1626,22 @@
}
}
},
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -1545,11 +1669,6 @@
"url": "https://github.com/sponsors/rawify"
}
},
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
- },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -1564,24 +1683,29 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "license": "ISC",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
},
- "engines": {
- "node": "*"
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -1598,15 +1722,16 @@
"node": ">=10.13.0"
}
},
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
"dependencies": {
- "function-bind": "^1.1.1"
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">= 0.4.0"
+ "node": ">= 0.4"
}
},
"node_modules/immutable": {
@@ -1617,20 +1742,6 @@
"optional": true,
"peer": true
},
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
"node_modules/ioredis": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz",
@@ -1666,11 +1777,15 @@
}
},
"node_modules/is-core-module": {
- "version": "2.12.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
- "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "license": "MIT",
"dependencies": {
- "has": "^1.0.3"
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -1684,6 +1799,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -1703,18 +1827,40 @@
"node": ">=0.12.0"
}
},
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/jiti": {
- "version": "1.21.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
- "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
+ "version": "1.21.6",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
+ "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
+ "license": "MIT",
"bin": {
"jiti": "bin/jiti.js"
}
},
"node_modules/laravel-echo": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.17.0.tgz",
- "integrity": "sha512-uf+BVZMkXc7+pzxS2dG5v1P+MT3yWS+/9oDSJUcQ4KqnDKLYfM1lc7yUmnxvLtwPksGuQJv6XBtzvWLHSEheNQ==",
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.17.1.tgz",
+ "integrity": "sha512-ORWc4vDfnBj/Oe5ThZ5kYyGItRjLDqAQUyhD/7UhehUOqc+s5x9HEBjtMVludNMP6VuXw6t7Uxt8bp63kaTofg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1722,9 +1868,9 @@
}
},
"node_modules/laravel-vite-plugin": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.0.6.tgz",
- "integrity": "sha512-B34OqmZc/rV1KvSjst8SsUm/LKHsuDusw8jiZCIhlnTHXbXnK89JUM9pTJuk6E/Vc/1DT2gX7qNfhipak1WS8w==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.1.1.tgz",
+ "integrity": "sha512-HMZXpoSs1OR+7Lw1+g4Iy/s3HF3Ldl8KxxYT2Ot8pEB4XB/QRuZeWgDYJdu552UN03YRSRNK84CLC9NzYRtncA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1735,24 +1881,29 @@
"clean-orphaned-assets": "bin/clean.js"
},
"engines": {
- "node": "^18.0.0 || >=20.0.0"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
},
"peerDependencies": {
- "vite": "^5.0.0"
+ "vite": "^5.0.0 || ^6.0.0"
}
},
"node_modules/lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
}
},
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
},
"node_modules/lodash.castarray": {
"version": "4.4.0",
@@ -1779,10 +1930,16 @@
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
},
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
"node_modules/magic-string": {
- "version": "0.30.12",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
- "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+ "version": "0.30.15",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz",
+ "integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1839,14 +1996,27 @@
}
},
"node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "brace-expansion": "^2.0.1"
},
"engines": {
- "node": "*"
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
}
},
"node_modules/ms": {
@@ -1858,6 +2028,7 @@
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "license": "MIT",
"dependencies": {
"any-promise": "^1.0.0",
"object-assign": "^4.0.1",
@@ -1865,15 +2036,16 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@@ -1909,6 +2081,7 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -1921,20 +2094,19 @@
"node": ">= 6"
}
},
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/path-is-absolute": {
+ "node_modules/package-json-from-dist": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
"node_modules/path-parse": {
@@ -1942,6 +2114,22 @@
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -1968,9 +2156,10 @@
}
},
"node_modules/pirates": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
- "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "license": "MIT",
"engines": {
"node": ">= 6"
}
@@ -2038,20 +2227,27 @@
}
},
"node_modules/postcss-load-config": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
- "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "lilconfig": "^2.0.5",
- "yaml": "^2.1.1"
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
},
"engines": {
"node": ">= 14"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
"peerDependencies": {
"postcss": ">=8.0.9",
"ts-node": ">=9.0.0"
@@ -2066,27 +2262,35 @@
}
},
"node_modules/postcss-nested": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
- "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "postcss-selector-parser": "^6.0.11"
+ "postcss-selector-parser": "^6.1.1"
},
"engines": {
"node": ">=12.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
"peerDependencies": {
"postcss": "^8.2.14"
}
},
"node_modules/postcss-selector-parser": {
- "version": "6.0.13",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
- "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -2173,11 +2377,12 @@
}
},
"node_modules/resolve": {
- "version": "1.22.2",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
- "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "license": "MIT",
"dependencies": {
- "is-core-module": "^2.11.0",
+ "is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
@@ -2276,6 +2481,39 @@
"node": ">=14.0.0"
}
},
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -2290,14 +2528,111 @@
"resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
"integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="
},
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/sucrase": {
- "version": "3.32.0",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz",
- "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==",
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.2",
"commander": "^4.0.0",
- "glob": "7.1.6",
+ "glob": "^10.3.10",
"lines-and-columns": "^1.1.6",
"mz": "^2.7.0",
"pirates": "^4.0.1",
@@ -2308,7 +2643,7 @@
"sucrase-node": "bin/sucrase-node"
},
"engines": {
- "node": ">=8"
+ "node": ">=16 || 14 >=14.17"
}
},
"node_modules/supports-preserve-symlinks-flag": {
@@ -2336,33 +2671,33 @@
}
},
"node_modules/tailwindcss": {
- "version": "3.4.14",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz",
- "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==",
+ "version": "3.4.16",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz",
+ "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==",
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
- "chokidar": "^3.5.3",
+ "chokidar": "^3.6.0",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
- "fast-glob": "^3.3.0",
+ "fast-glob": "^3.3.2",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
- "jiti": "^1.21.0",
- "lilconfig": "^2.1.0",
- "micromatch": "^4.0.5",
+ "jiti": "^1.21.6",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.23",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
"postcss-import": "^15.1.0",
"postcss-js": "^4.0.1",
- "postcss-load-config": "^4.0.1",
- "postcss-nested": "^6.0.1",
- "postcss-selector-parser": "^6.0.11",
- "resolve": "^1.22.2",
- "sucrase": "^3.32.0"
+ "postcss-load-config": "^4.0.2",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
},
"bin": {
"tailwind": "lib/cli.js",
@@ -2376,6 +2711,7 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "license": "MIT",
"dependencies": {
"any-promise": "^1.0.0"
}
@@ -2384,6 +2720,7 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "license": "MIT",
"dependencies": {
"thenify": ">= 3.1.0 < 4"
},
@@ -2405,7 +2742,8 @@
"node_modules/ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "license": "Apache-2.0"
},
"node_modules/tweetnacl": {
"version": "1.0.3",
@@ -2450,21 +2788,21 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"node_modules/vite": {
- "version": "5.4.11",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
- "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.3.tgz",
+ "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "esbuild": "^0.21.3",
- "postcss": "^8.4.43",
- "rollup": "^4.20.0"
+ "esbuild": "^0.24.0",
+ "postcss": "^8.4.49",
+ "rollup": "^4.23.0"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
- "node": "^18.0.0 || >=20.0.0"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
@@ -2473,19 +2811,25 @@
"fsevents": "~2.3.3"
},
"peerDependencies": {
- "@types/node": "^18.0.0 || >=20.0.0",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
"less": "*",
"lightningcss": "^1.21.0",
"sass": "*",
"sass-embedded": "*",
"stylus": "*",
"sugarss": "*",
- "terser": "^5.4.0"
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
+ "jiti": {
+ "optional": true
+ },
"less": {
"optional": true
},
@@ -2506,6 +2850,12 @@
},
"terser": {
"optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
}
}
},
@@ -2520,17 +2870,17 @@
}
},
"node_modules/vue": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz",
- "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz",
+ "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.12",
- "@vue/compiler-sfc": "3.5.12",
- "@vue/runtime-dom": "3.5.12",
- "@vue/server-renderer": "3.5.12",
- "@vue/shared": "3.5.12"
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-sfc": "3.5.13",
+ "@vue/runtime-dom": "3.5.13",
+ "@vue/server-renderer": "3.5.13",
+ "@vue/shared": "3.5.13"
},
"peerDependencies": {
"typescript": "*"
@@ -2542,21 +2892,126 @@
}
},
"node_modules/vue/node_modules/@vue/shared": {
- "version": "3.5.12",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
- "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
"dev": true,
"license": "MIT"
},
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
"node_modules/yaml": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
- "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz",
+ "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
"engines": {
"node": ">= 14"
}
diff --git a/package.json b/package.json
index a174d73c7..50197706a 100644
--- a/package.json
+++ b/package.json
@@ -7,24 +7,24 @@
"build": "vite build"
},
"devDependencies": {
- "@vitejs/plugin-vue": "5.2.0",
+ "@vitejs/plugin-vue": "5.2.1",
"autoprefixer": "10.4.20",
- "axios": "1.7.7",
- "laravel-echo": "1.17.0",
- "laravel-vite-plugin": "1.0.6",
+ "axios": "1.7.9",
+ "laravel-echo": "1.17.1",
+ "laravel-vite-plugin": "1.1.1",
"postcss": "8.4.49",
"pusher-js": "8.4.0-rc2",
"tailwind-scrollbar": "^3.1.0",
- "tailwindcss": "3.4.14",
- "vite": "5.4.11",
- "vue": "3.5.12"
+ "tailwindcss": "3.4.16",
+ "vite": "6.0.3",
+ "vue": "3.5.13"
},
"dependencies": {
"@tailwindcss/forms": "0.5.9",
"@tailwindcss/typography": "0.5.15",
"@xterm/addon-fit": "^0.10.0",
"@xterm/xterm": "^5.5.0",
- "alpinejs": "3.14.3",
+ "alpinejs": "3.14.7",
"ioredis": "5.4.1"
}
}
diff --git a/public/svgs/fileflows.svg b/public/svgs/fileflows.svg
new file mode 100644
index 000000000..ee37e9ba2
--- /dev/null
+++ b/public/svgs/fileflows.svg
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/resources/views/auth/forgot-password.blade.php b/resources/views/auth/forgot-password.blade.php
index 00cf95a44..a61a8fb32 100644
--- a/resources/views/auth/forgot-password.blade.php
+++ b/resources/views/auth/forgot-password.blade.php
@@ -9,7 +9,7 @@
+ Select events for which you would like to receive Discord notifications. +
+