diff --git a/app-modules/bot-discord/config/bot-discord.php b/app-modules/bot-discord/config/bot-discord.php index 6f0931081..354be511e 100644 --- a/app-modules/bot-discord/config/bot-discord.php +++ b/app-modules/bot-discord/config/bot-discord.php @@ -4,6 +4,13 @@ return [ 'guild_id' => env('HE4RT_DISCORD_GUILD_ID'), + + /* + * The bot process has no session, so it never inherits the per-request + * locale. Every message the bot sends uses this locale. + */ + 'locale' => env('HE4RT_BOT_LOCALE', 'pt_BR'), + 'channels' => [ 'auto-report' => env('HE4RT_AUTO_REPORT_CHANNEL_ID', '1045804587195576451'), 'presentations' => env('HE4RT_PRESENTATIONS_CHANNEL_ID', '540993663468306433'), diff --git a/app-modules/bot-discord/lang/en/enums.php b/app-modules/bot-discord/lang/en/enums.php new file mode 100644 index 000000000..86fdd907d --- /dev/null +++ b/app-modules/bot-discord/lang/en/enums.php @@ -0,0 +1,16 @@ + [ + 'cannot_send_messages_to_user' => [ + 'label' => 'DM closed', + 'description' => 'The user blocks direct messages from the bot', + ], + 'no_mutual_guilds' => [ + 'label' => 'No mutual server', + 'description' => 'The user is no longer in any server of the bot', + ], + ], +]; diff --git a/app-modules/bot-discord/lang/en/welcome.php b/app-modules/bot-discord/lang/en/welcome.php new file mode 100644 index 000000000..db168b27a --- /dev/null +++ b/app-modules/bot-discord/lang/en/welcome.php @@ -0,0 +1,34 @@ + [ + 'description' => "Good to have you here, **:username**! 💜\n\nHe4rt is one of the largest developer communities in Brazil — a place to learn together, share ideas, join events and grow with people who love code. 💻", + ], + 'fallback' => [ + 'description' => "I tried to welcome you in your DM, but it looks closed 👀\n\nNo problem — you can start right here!", + 'body' => ':mention 👋', + ], + 'embed' => [ + 'title' => 'Welcome to He4rt! 💜', + 'cta_title' => '🙋 Start with an introduction', + 'cta' => 'Tap **Introduce me** below (it takes you to the right channel) and send `/apresentar`. It takes less than a minute — name, nickname and a few words about you. That is how the community meets you and how you unlock the rest of the server. 🚀', + 'footer' => ':year © He4rt Developers', + ], + 'buttons' => [ + 'present' => 'Introduce me', + 'portal' => 'Portal', + 'socials' => 'Our socials', + ], + 'announcement' => [ + 'title' => 'A new member arrived', + 'message' => 'Welcome, :username!', + 'body' => ':mention just arrived. To start, use the `/apresentar` command and tell the community a bit about you.', + ], + 'profile_failure' => [ + 'title' => 'New member', + 'message' => 'Welcome!', + 'body' => ':mention joined the server, but there was a problem starting their profile. If something does not work, talk to the moderation team.', + ], +]; diff --git a/app-modules/bot-discord/lang/pt_BR/enums.php b/app-modules/bot-discord/lang/pt_BR/enums.php new file mode 100644 index 000000000..844ffd1d9 --- /dev/null +++ b/app-modules/bot-discord/lang/pt_BR/enums.php @@ -0,0 +1,16 @@ + [ + 'cannot_send_messages_to_user' => [ + 'label' => 'DM fechada', + 'description' => 'O usuário bloqueou mensagens diretas do bot', + ], + 'no_mutual_guilds' => [ + 'label' => 'Sem servidor em comum', + 'description' => 'O usuário não está mais em nenhum servidor do bot', + ], + ], +]; diff --git a/app-modules/bot-discord/lang/pt_BR/welcome.php b/app-modules/bot-discord/lang/pt_BR/welcome.php new file mode 100644 index 000000000..01970ea4c --- /dev/null +++ b/app-modules/bot-discord/lang/pt_BR/welcome.php @@ -0,0 +1,34 @@ + [ + 'description' => "Que bom ter você por aqui, **:username**! 💜\n\nA He4rt é uma das maiores comunidades de desenvolvedores do Brasil — um lugar pra aprender junto, trocar ideia, participar de eventos e evoluir com gente que curte código. 💻", + ], + 'fallback' => [ + 'description' => "Tentei te dar as boas-vindas na sua DM, mas parece que ela está fechada 👀\n\nSem problema — dá pra começar por aqui mesmo!", + 'body' => ':mention 👋', + ], + 'embed' => [ + 'title' => 'Bem-vindo(a) à He4rt! 💜', + 'cta_title' => '🙋 Comece se apresentando', + 'cta' => 'Toca em **Me apresentar** aqui embaixo (te levo direto pro canal certo) e manda `/apresentar`. Leva menos de um minuto — nome, nickname e um pouco sobre você. É assim que a comunidade te conhece e você desbloqueia o resto do servidor. 🚀', + 'footer' => ':year © He4rt Developers', + ], + 'buttons' => [ + 'present' => 'Me apresentar', + 'portal' => 'Portal', + 'socials' => 'Nossas redes', + ], + 'announcement' => [ + 'title' => 'Novo membro chegou', + 'message' => 'Seja bem-vindo(a), :username!', + 'body' => ':mention acabou de chegar. Para começar, use o comando `/apresentar` e conte um pouco sobre você para a comunidade.', + ], + 'profile_failure' => [ + 'title' => 'Novo membro', + 'message' => 'Seja bem-vindo(a)!', + 'body' => ':mention entrou no servidor, mas houve um problema ao inicializar seu perfil. Caso algo não funcione, fale com a moderação.', + ], +]; diff --git a/app-modules/bot-discord/src/Actions/Welcome/AnnounceNewMemberAction.php b/app-modules/bot-discord/src/Actions/Welcome/AnnounceNewMemberAction.php new file mode 100644 index 000000000..3c81fbee2 --- /dev/null +++ b/app-modules/bot-discord/src/Actions/Welcome/AnnounceNewMemberAction.php @@ -0,0 +1,49 @@ +autoReportChannelId = config()->string('bot-discord.channels.auto-report'); + } + + public function execute(WelcomeContextDTO $context): void + { + $this + ->message(__('bot-discord::welcome.announcement.message', ['username' => $context->username])) + ->title(__('bot-discord::welcome.announcement.title')) + ->thumbnailUrl($context->avatarUrl) + ->body(__('bot-discord::welcome.announcement.body', ['mention' => $context->mention()])) + ->color('#5865F2') + ->send($this->autoReportChannelId); + } + + /** + * Announce a member whose internal profile could not be initialized, so the + * moderation team knows the welcome flow degraded. + */ + public function executeProfileFailure(WelcomeContextDTO $context): void + { + $this + ->message(__('bot-discord::welcome.profile_failure.message')) + ->title(__('bot-discord::welcome.profile_failure.title')) + ->body(__('bot-discord::welcome.profile_failure.body', ['mention' => $context->mention()])) + ->color('#ED4245') + ->send($this->autoReportChannelId); + } +} diff --git a/app-modules/bot-discord/src/Actions/Welcome/SendWelcomeDmAction.php b/app-modules/bot-discord/src/Actions/Welcome/SendWelcomeDmAction.php new file mode 100644 index 000000000..c8ff4e50a --- /dev/null +++ b/app-modules/bot-discord/src/Actions/Welcome/SendWelcomeDmAction.php @@ -0,0 +1,76 @@ +generalChannelId = config()->string('bot-discord.channels.general'); + } + + public function execute(Member $member, WelcomeContextDTO $context): void + { + $message = $this->builder->decorate($this->message(), $context, $this->generalChannelId); + + $message + ->sendTo($member->user) + ?->catch(fn (Throwable $throwable) => $this->announceFallback($message, $context, $throwable)); + } + + /** + * A member without mutual guilds has left the server, so the public mention + * reaches nobody. + */ + public function shouldAnnounceFallback(?DiscordErrorCode $errorCode): bool + { + return $errorCode !== DiscordErrorCode::NoMutualGuilds; + } + + private function announceFallback(Message $message, WelcomeContextDTO $context, Throwable $throwable): void + { + $errorCode = DiscordErrorCode::fromThrowable($throwable); + + $this->logFailure($context, $errorCode, $throwable); + + if (!$this->shouldAnnounceFallback($errorCode)) { + return; + } + + $this->builder + ->asFallback($message, $context) + ->send($this->generalChannelId); + } + + private function logFailure(WelcomeContextDTO $context, ?DiscordErrorCode $errorCode, Throwable $throwable): void + { + match ($errorCode) { + null => Log::channel('bot-discord')->warning('WelcomeMember: failed to deliver welcome DM', [ + 'external_account_id' => $context->userId, + 'exception' => $throwable, + ]), + default => Log::channel('bot-discord')->info('WelcomeMember: welcome DM not delivered', [ + 'external_account_id' => $context->userId, + 'reason' => $errorCode->name, + ]), + }; + } +} diff --git a/app-modules/bot-discord/src/BotDiscordServiceProvider.php b/app-modules/bot-discord/src/BotDiscordServiceProvider.php index 76fc5ff46..4e373ff06 100644 --- a/app-modules/bot-discord/src/BotDiscordServiceProvider.php +++ b/app-modules/bot-discord/src/BotDiscordServiceProvider.php @@ -37,6 +37,8 @@ public function boot(): void { parent::boot(); + $this->loadTranslationsFrom(__DIR__.'/../lang', 'bot-discord'); + // Domain event listeners: moderation module emits events, bot-discord reacts with Discord-specific behavior. Event::listen(CaseQueued::class, [NotifyModerationChannel::class, 'handle']); Event::listen(CaseReadyForEnforcement::class, [AutoExecuteAction::class, 'handle']); @@ -50,6 +52,8 @@ public function boot(): void public function bot(Laracord $bot): Laracord { + $this->app->setLocale(config()->string('bot-discord.locale')); + return $bot ->disableHttpServer() ->discoverEvents(__DIR__.'/Events', 'He4rt\BotDiscord\Events') diff --git a/app-modules/bot-discord/src/Concerns/ResolvesGuildIcon.php b/app-modules/bot-discord/src/Concerns/ResolvesGuildIcon.php new file mode 100644 index 000000000..2b71c33bb --- /dev/null +++ b/app-modules/bot-discord/src/Concerns/ResolvesGuildIcon.php @@ -0,0 +1,40 @@ +guild?->icon; + + return $this->guildIconUrl( + (string) $member->guild_id, + is_string($iconHash) ? $iconHash : null, + ); + } +} diff --git a/app-modules/bot-discord/src/DTO/WelcomeContextDTO.php b/app-modules/bot-discord/src/DTO/WelcomeContextDTO.php new file mode 100644 index 000000000..ed137a1bb --- /dev/null +++ b/app-modules/bot-discord/src/DTO/WelcomeContextDTO.php @@ -0,0 +1,34 @@ +user?->id, + guildId: (string) $member->guild_id, + username: (string) $member->user?->username, + avatarUrl: $member->user?->avatar, + serverIconUrl: $serverIconUrl, + ); + } + + public function mention(): string + { + return sprintf('<@%s>', $this->userId); + } +} diff --git a/app-modules/bot-discord/src/Enums/DiscordErrorCode.php b/app-modules/bot-discord/src/Enums/DiscordErrorCode.php new file mode 100644 index 000000000..8761a6d19 --- /dev/null +++ b/app-modules/bot-discord/src/Enums/DiscordErrorCode.php @@ -0,0 +1,50 @@ +getCode()); + } + + public function getLabel(): string + { + return match ($this) { + self::CannotSendMessagesToUser => __('bot-discord::enums.discord_error_code.cannot_send_messages_to_user.label'), + self::NoMutualGuilds => __('bot-discord::enums.discord_error_code.no_mutual_guilds.label'), + }; + } + + public function getColor(): string + { + return match ($this) { + self::CannotSendMessagesToUser => 'warning', + self::NoMutualGuilds => 'gray', + }; + } + + public function getDescription(): string + { + return match ($this) { + self::CannotSendMessagesToUser => __('bot-discord::enums.discord_error_code.cannot_send_messages_to_user.description'), + self::NoMutualGuilds => __('bot-discord::enums.discord_error_code.no_mutual_guilds.description'), + }; + } +} diff --git a/app-modules/bot-discord/src/Events/WelcomeMember.php b/app-modules/bot-discord/src/Events/WelcomeMember.php index 9514be585..fb49d91de 100644 --- a/app-modules/bot-discord/src/Events/WelcomeMember.php +++ b/app-modules/bot-discord/src/Events/WelcomeMember.php @@ -7,46 +7,40 @@ use Discord\Discord; use Discord\Parts\User\Member; use Discord\WebSockets\Event as Events; +use He4rt\BotDiscord\Actions\Welcome\AnnounceNewMemberAction; +use He4rt\BotDiscord\Actions\Welcome\SendWelcomeDmAction; +use He4rt\BotDiscord\Concerns\ResolvesGuildIcon; +use He4rt\BotDiscord\DTO\WelcomeContextDTO; use He4rt\Identity\ExternalIdentity\DTOs\ResolveUserProviderDTO; use He4rt\Identity\ExternalIdentity\Enums\IdentityProvider; use He4rt\Identity\User\Actions\ResolveUserContext; use He4rt\Identity\User\Models\User; use Illuminate\Support\Facades\Log; -use Laracord\Discord\Message; use Laracord\Events\Event; use Throwable; -/** - * @method Message message(string $content = '') - */ class WelcomeMember extends Event { + use ResolvesGuildIcon; + protected $handler = Events::GUILD_MEMBER_ADD; - /** - * Build the Discord CDN URL for a guild icon hash. Returns null when the - * guild has no icon; animated hashes (`a_…`) resolve to `.gif`. - */ - public static function guildIconUrl(string $guildId, ?string $iconHash): ?string + public function handle(Member $member, Discord $discord): void { - if (blank($guildId) || blank($iconHash)) { - return null; - } + $context = WelcomeContextDTO::fromMember($member, $this->resolveGuildIcon($member)); - $extension = str_starts_with($iconHash, 'a_') ? 'gif' : 'png'; + if (!$this->resolveProfile($member)) { + resolve(AnnounceNewMemberAction::class)->executeProfileFailure($context); - return sprintf( - 'https://cdn.discordapp.com/icons/%s/%s.%s', - $guildId, - $iconHash, - $extension - ); + return; + } + + resolve(AnnounceNewMemberAction::class)->execute($context); + resolve(SendWelcomeDmAction::class)->execute($member, $context); } - public function handle(Member $member, Discord $discord): void + private function resolveProfile(Member $member): bool { - $channelId = config('bot-discord.channels.auto-report'); - try { $userDto = ResolveUserProviderDTO::make([ 'provider' => IdentityProvider::Discord, @@ -57,6 +51,8 @@ public function handle(Member $member, Discord $discord): void ]); resolve(ResolveUserContext::class)->handle($userDto); + + return true; } catch (Throwable $throwable) { Log::channel('bot-discord')->error('WelcomeMember: failed to resolve user', [ 'provider' => IdentityProvider::Discord->value, @@ -64,130 +60,7 @@ public function handle(Member $member, Discord $discord): void 'exception' => $throwable, ]); - $this - ->message('Seja bem-vindo(a)!') - ->title('Novo membro') - ->body(sprintf( - '<@%s> entrou no servidor, mas houve um problema ao inicializar seu perfil. Caso algo não funcione, fale com a moderação.', - $member->user->id - )) - ->color('#ED4245') - ->send($channelId); - - return; + return false; } - - $username = $member->user->username; - $userId = $member->user->id; - $avatarUrl = $member->user->avatar; - - $this - ->message(sprintf('Seja bem-vindo(a), %s!', $username)) - ->title('Novo membro chegou') - ->thumbnailUrl($avatarUrl) - ->body(sprintf( - '<@%s> acabou de chegar. Para começar, use o comando `/apresentar` e conte um pouco sobre você para a comunidade.', - $userId - )) - ->color('#5865F2') - ->send($channelId); - - $this->sendWelcomeDm($member); - } - - /** - * Send the branded welcome DM to the new member, falling back to a public - * message in the `geral` channel when the user's DMs are closed. - */ - private function sendWelcomeDm(Member $member): void - { - $userId = (string) $member->user->id; - $guildId = (string) $member->guild_id; - $username = (string) $member->user->username; - $serverIconUrl = $this->resolveServerIconUrl($member); - - $dmDescription = sprintf( - <<<'MD' - Que bom ter você por aqui, **%s**! 💜 - - A He4rt é uma das maiores comunidades de desenvolvedores do Brasil — um lugar pra aprender junto, trocar ideia, participar de eventos e evoluir com gente que curte código. 💻 - MD, - $username, - ); - - $fallbackDescription = <<<'MD' - Tentei te dar as boas-vindas na sua DM, mas parece que ela está fechada 👀 - - Sem problema — dá pra começar por aqui mesmo! - MD; - - $this - ->buildWelcomeMessage($dmDescription, $guildId, $serverIconUrl) - ->sendTo($member->user) - ?->catch(function (Throwable $throwable) use ($userId, $guildId, $serverIconUrl, $fallbackDescription): void { - Log::channel('bot-discord')->warning('WelcomeMember: failed to deliver welcome DM', [ - 'external_account_id' => $userId, - 'exception' => $throwable, - ]); - - $geralChannelId = config('bot-discord.channels.geral'); - - if (blank($geralChannelId)) { - return; - } - - $this - ->buildWelcomeMessage($fallbackDescription, $guildId, $serverIconUrl) - ->body(sprintf('<@%s> 👋', $userId)) - ->send($geralChannelId); - }); - } - - /** - * Build the shared welcome embed (DM and channel fallback use the same - * layout, color, thumbnail, call-to-action field and buttons). The - * description sits inside the embed via `content()`; callers add a pinging - * mention via `body()` when the message is posted to a public channel. - */ - private function buildWelcomeMessage(string $description, string $guildId, ?string $serverIconUrl): Message - { - $presentationsChannelId = config()->string('bot-discord.channels.general'); - - $presentationDeepLink = sprintf( - 'https://discord.com/channels/%s/%s', - $guildId, - $presentationsChannelId - ); - - $callToAction = <<<'MD' - Toca em **Me apresentar** aqui embaixo (te levo direto pro canal certo) e manda `/apresentar`. Leva menos de um minuto — nome, nickname e um pouco sobre você. É assim que a comunidade te conhece e você desbloqueia o resto do servidor. 🚀 - MD; - - return $this - ->message() - ->title('Bem-vindo(a) à He4rt! 💜') - ->content($description) - ->thumbnailUrl($serverIconUrl) - ->field('🙋 Comece se apresentando', $callToAction, inline: false) - ->button('Me apresentar', $presentationDeepLink, '✍️') - ->button('Portal', 'https://heartdevs.com', '🌐') - ->button('Nossas redes', 'https://heartdevs.com/redes', '🔗') - ->footerText(now()->format('Y').' © He4rt Developers') - ->timestamp(now()) - ->color('#782bf1'); - } - - /** - * Resolve the guild icon as a Discord CDN URL, or null when the guild has - * no icon (the embed simply renders without a thumbnail). - */ - private function resolveServerIconUrl(Member $member): ?string - { - $iconHash = $member->guild?->icon; - - return self::guildIconUrl( - (string) $member->guild_id, - is_string($iconHash) ? $iconHash : null, - ); } } diff --git a/app-modules/bot-discord/src/Welcome/WelcomeEmbedBuilder.php b/app-modules/bot-discord/src/Welcome/WelcomeEmbedBuilder.php new file mode 100644 index 000000000..fb41ddc28 --- /dev/null +++ b/app-modules/bot-discord/src/Welcome/WelcomeEmbedBuilder.php @@ -0,0 +1,50 @@ +title(__('bot-discord::welcome.embed.title')) + ->content(__('bot-discord::welcome.dm.description', ['username' => $context->username])) + ->thumbnailUrl($context->serverIconUrl) + ->field( + __('bot-discord::welcome.embed.cta_title'), + __('bot-discord::welcome.embed.cta'), + inline: false + ) + ->button(__('bot-discord::welcome.buttons.present'), $this->deepLink($context->guildId, $generalChannelId), '✍️') + ->button(__('bot-discord::welcome.buttons.portal'), 'https://heartdevs.com', '🌐') + ->button(__('bot-discord::welcome.buttons.socials'), 'https://heartdevs.com/redes', '🔗') + ->footerText(__('bot-discord::welcome.embed.footer', ['year' => now()->format('Y')])) + ->timestamp(now()) + ->color('#782bf1'); + } + + /** + * Swap the decorated message into its public form: the fallback text inside + * the embed and a pinging mention above it. + */ + public function asFallback(Message $message, WelcomeContextDTO $context): Message + { + return $message + ->content(__('bot-discord::welcome.fallback.description')) + ->body(__('bot-discord::welcome.fallback.body', ['mention' => $context->mention()])); + } + + private function deepLink(string $guildId, string $channelId): string + { + return sprintf('https://discord.com/channels/%s/%s', $guildId, $channelId); + } +} diff --git a/app-modules/bot-discord/tests/Unit/Actions/Welcome/SendWelcomeDmActionTest.php b/app-modules/bot-discord/tests/Unit/Actions/Welcome/SendWelcomeDmActionTest.php new file mode 100644 index 000000000..73a3cfc4c --- /dev/null +++ b/app-modules/bot-discord/tests/Unit/Actions/Welcome/SendWelcomeDmActionTest.php @@ -0,0 +1,17 @@ +shouldAnnounceFallback($errorCode))->toBe($expected); +})->with([ + 'dm closed' => [DiscordErrorCode::CannotSendMessagesToUser, true], + 'no mutual guilds' => [DiscordErrorCode::NoMutualGuilds, false], + 'unknown code' => [null, true], +]); diff --git a/app-modules/bot-discord/tests/Unit/BotLocaleTest.php b/app-modules/bot-discord/tests/Unit/BotLocaleTest.php new file mode 100644 index 000000000..dee8788c1 --- /dev/null +++ b/app-modules/bot-discord/tests/Unit/BotLocaleTest.php @@ -0,0 +1,31 @@ +toBe('pt_BR'); +}); + +it('applies the bot locale when the bot boots', function (): void { + config()->set('bot-discord.locale', 'en'); + app()->setLocale('pt_BR'); + + $bot = Mockery::mock(Laracord::class); + $bot->shouldReceive('disableHttpServer', 'discoverEvents', 'discoverCommands', 'discoverSlashCommands', 'discoverTasks', 'registerHook') + ->andReturnSelf(); + + new BotDiscordServiceProvider(app())->bot($bot); + + expect(app()->getLocale())->toBe('en'); +}); + +it('translates the welcome copy in every supported locale', function (string $locale): void { + app()->setLocale($locale); + + expect(__('bot-discord::welcome.embed.title'))->not->toStartWith('bot-discord::') + ->and(__('bot-discord::welcome.dm.description', ['username' => 'valdirluz']))->toContain('valdirluz') + ->and(__('bot-discord::welcome.fallback.description'))->not->toStartWith('bot-discord::'); +})->with(['en', 'pt_BR']); diff --git a/app-modules/bot-discord/tests/Unit/Events/WelcomeMemberGuildIconTest.php b/app-modules/bot-discord/tests/Unit/Concerns/ResolvesGuildIconTest.php similarity index 52% rename from app-modules/bot-discord/tests/Unit/Events/WelcomeMemberGuildIconTest.php rename to app-modules/bot-discord/tests/Unit/Concerns/ResolvesGuildIconTest.php index 07d79ffe0..83e63cb23 100644 --- a/app-modules/bot-discord/tests/Unit/Events/WelcomeMemberGuildIconTest.php +++ b/app-modules/bot-discord/tests/Unit/Concerns/ResolvesGuildIconTest.php @@ -2,22 +2,29 @@ declare(strict_types=1); -use He4rt\BotDiscord\Events\WelcomeMember; +use He4rt\BotDiscord\Concerns\ResolvesGuildIcon; + +beforeEach(function (): void { + $this->resolver = new class + { + use ResolvesGuildIcon; + }; +}); test('builds a png cdn url for a static guild icon', function (): void { - expect(WelcomeMember::guildIconUrl('540000000000000000', 'abc123')) + expect($this->resolver->guildIconUrl('540000000000000000', 'abc123')) ->toBe('https://cdn.discordapp.com/icons/540000000000000000/abc123.png'); }); test('builds a gif cdn url for an animated guild icon', function (): void { - expect(WelcomeMember::guildIconUrl('540000000000000000', 'a_abc123')) + expect($this->resolver->guildIconUrl('540000000000000000', 'a_abc123')) ->toBe('https://cdn.discordapp.com/icons/540000000000000000/a_abc123.gif'); }); test('returns null when the guild has no icon', function (): void { - expect(WelcomeMember::guildIconUrl('540000000000000000', iconHash: null))->toBeNull(); + expect($this->resolver->guildIconUrl('540000000000000000', iconHash: null))->toBeNull(); }); test('returns null when the guild id is missing', function (): void { - expect(WelcomeMember::guildIconUrl('', 'abc123'))->toBeNull(); + expect($this->resolver->guildIconUrl('', 'abc123'))->toBeNull(); }); diff --git a/app-modules/bot-discord/tests/Unit/Enums/DiscordErrorCodeTest.php b/app-modules/bot-discord/tests/Unit/Enums/DiscordErrorCodeTest.php new file mode 100644 index 000000000..2a267b6f8 --- /dev/null +++ b/app-modules/bot-discord/tests/Unit/Enums/DiscordErrorCodeTest.php @@ -0,0 +1,32 @@ +value)->toBe(50_007) + ->and(DiscordErrorCode::NoMutualGuilds->value)->toBe(50_278); +}); + +it('resolves the error code from the exception', function (int $code, ?DiscordErrorCode $expected): void { + expect(DiscordErrorCode::fromThrowable(new NoPermissionsException('Forbidden', $code)))->toBe($expected); +})->with([ + 'cannot send messages to user' => [50_007, DiscordErrorCode::CannotSendMessagesToUser], + 'no mutual guilds' => [50_278, DiscordErrorCode::NoMutualGuilds], + 'unknown code' => [40_001, null], +]); + +it('translates a distinct label and description for every error code', function (string $locale): void { + app()->setLocale($locale); + + $cases = DiscordErrorCode::cases(); + + $labels = array_map(fn (DiscordErrorCode $code): string => $code->getLabel(), $cases); + $descriptions = array_map(fn (DiscordErrorCode $code): string => $code->getDescription(), $cases); + + expect([...$labels, ...$descriptions])->each->not->toStartWith('bot-discord::') + ->and(array_unique($labels))->toHaveSameSize($cases) + ->and(array_unique($descriptions))->toHaveSameSize($cases); +})->with(['en', 'pt_BR']); diff --git a/app-modules/bot-discord/tests/Unit/Welcome/WelcomeEmbedBuilderTest.php b/app-modules/bot-discord/tests/Unit/Welcome/WelcomeEmbedBuilderTest.php new file mode 100644 index 000000000..c84c8cdbd --- /dev/null +++ b/app-modules/bot-discord/tests/Unit/Welcome/WelcomeEmbedBuilderTest.php @@ -0,0 +1,70 @@ +username('he4rt')->avatar('https://cdn.discordapp.com/avatars/1/bot.png'); + } + }; +} + +function welcomeContext(?string $serverIconUrl = 'https://cdn.discordapp.com/icons/540/abc.png'): WelcomeContextDTO +{ + return new WelcomeContextDTO( + userId: '332648215004446720', + guildId: '540000000000000000', + username: 'valdirluz', + avatarUrl: null, + serverIconUrl: $serverIconUrl, + ); +} + +test('decorates the message with the welcome embed', function (): void { + $message = (new WelcomeEmbedBuilder)->decorate(welcomeMessage(), welcomeContext(), '541443469642563585'); + + $embed = $message->getEmbed(); + + expect($embed['title'])->toBe(__('bot-discord::welcome.embed.title')) + ->and($embed['description'])->toContain('valdirluz') + ->and($embed['thumbnail']['url'])->toBe('https://cdn.discordapp.com/icons/540/abc.png') + ->and($embed['fields'])->toHaveCount(1) + ->and($embed['footer']['text'])->toContain(now()->format('Y')); +}); + +test('links the presentation button to the general channel', function (): void { + $message = (new WelcomeEmbedBuilder)->decorate(welcomeMessage(), welcomeContext(), '541443469642563585'); + + expect($message->getButtons())->toHaveCount(1); +}); + +test('omits the thumbnail when the guild has no icon', function (): void { + $message = (new WelcomeEmbedBuilder)->decorate(welcomeMessage(), welcomeContext(serverIconUrl: null), '541443469642563585'); + + expect($message->getEmbed()['thumbnail']['url'])->toBeNull(); +}); + +test('reuses the same message for the public fallback', function (): void { + $builder = new WelcomeEmbedBuilder; + $context = welcomeContext(); + + $message = $builder->decorate(welcomeMessage(), $context, '541443469642563585'); + $fallback = $builder->asFallback($message, $context); + + expect($fallback->getEmbed()['description'])->toBe(__('bot-discord::welcome.fallback.description')) + ->and($fallback->getEmbed()['fields'])->toHaveCount(1) + ->and($fallback->getButtons())->toHaveCount(1) + ->and($fallback->build()->jsonSerialize()['content'])->toContain($context->mention()); +}); diff --git a/app-modules/panel-admin/tests/Feature/Marketing/ShortLinkResourceTest.php b/app-modules/panel-admin/tests/Feature/Marketing/ShortLinkResourceTest.php index f6fbdcef9..e1e288eba 100644 --- a/app-modules/panel-admin/tests/Feature/Marketing/ShortLinkResourceTest.php +++ b/app-modules/panel-admin/tests/Feature/Marketing/ShortLinkResourceTest.php @@ -223,7 +223,7 @@ function admin(): User $page->assertSee($humans)->assertDontSee($everyone); - $page->set('filters.'.ViewShortLink::INCLUDE_BOTS, true) + $page->set('filters.'.ViewShortLink::INCLUDE_BOTS, value: true) ->assertSee($everyone) ->assertDontSee($humans); }); @@ -242,7 +242,7 @@ function admin(): User $page->assertSeeHtml($key); } - $page->set('filters.'.ViewShortLink::INCLUDE_BOTS, true); + $page->set('filters.'.ViewShortLink::INCLUDE_BOTS, value: true); $withBots = array_map($page->instance()->islandKey(...), $islands); diff --git a/composer.json b/composer.json index 2deb4fd03..b25fb0d38 100644 --- a/composer.json +++ b/composer.json @@ -11,9 +11,9 @@ "php": "^8.4", "bacon/bacon-qr-code": "^2.0.8", "calebporzio/sushi": "^2.5.4", - "dedoc/scramble": "^0.13.43", - "filament/filament": "^5.8.1", - "filament/spatie-laravel-media-library-plugin": "^5.8.1", + "dedoc/scramble": "^0.13.45", + "filament/filament": "^5.8.4", + "filament/spatie-laravel-media-library-plugin": "^5.8.4", "guzzlehttp/guzzle": "^7.15.5", "he4rt/activity": "^1.0.0", "he4rt/bot-discord": "^1.0.0", @@ -40,23 +40,23 @@ "he4rt/squads": "^1.0.0", "internachi/modular": "^3.0.2", "laracord/framework": "dev-next#e7b64d6", - "laravel/framework": "^13.31.0", + "laravel/framework": "^13.33.0", "laravel/head": "^0.2.2", - "laravel/nightwatch": "^1.30.0", + "laravel/nightwatch": "^1.30.2", "laravel/sanctum": "^4.3.3", - "laravel/telescope": "^5.24.0", + "laravel/telescope": "^5.25.0", "laravel/tinker": "^3.0.2", "league/flysystem-sftp-v3": "^3.36.0", - "livewire/flux": "^2.19.0", + "livewire/flux": "^2.20.0", "marvinlabs/laravel-discord-logger": "^1.4.4", "matomo/device-detector": "^6.5.1", "monicahq/laravel-cloudflare": "^4.1", "owenvoke/blade-fontawesome": "^3.3.1", "phiki/phiki": "^2.2.1", "ryangjchandler/commonmark-blade-block": "^1.1.1", - "saloonphp/saloon": "^4.0.1", - "spatie/laravel-backup": "^10.3.2", - "spatie/laravel-medialibrary": "^11.23.7", + "saloonphp/saloon": "^4.3.0", + "spatie/laravel-backup": "^10.3.3", + "spatie/laravel-medialibrary": "^11.23.8", "spatie/laravel-permission": "^8.3.0", "symfony/dom-crawler": "^8.1.5", "symfony/yaml": "^8.1.6" @@ -65,20 +65,20 @@ "driftingly/rector-laravel": "^2.6.2", "fakerphp/faker": "^1.24.1", "fruitcake/laravel-debugbar": "^4.4.3", - "larastan/larastan": "^3.11.0", - "laravel/boost": "^2.8.0", + "larastan/larastan": "^3.12.2", + "laravel/boost": "^2.9.1", "laravel/pail": "^1.2.7", "laravel/pao": "^1.1.5", - "laravel/pint": "^1.32.0", + "laravel/pint": "^1.32.1", "mockery/mockery": "^1.6.15", "nunomaduro/collision": "^8.9.5", - "pestphp/pest": "^5.1.4", + "pestphp/pest": "^5.2.1", "pestphp/pest-plugin-faker": "^5.0.0", "pestphp/pest-plugin-laravel": "^5.0.1", "pestphp/pest-plugin-livewire": "^5.0.0", "pestphp/pest-plugin-rector": "^5.0.4", "phpstan/extension-installer": "^1.4.3", - "rector/rector": "^2.6.6" + "rector/rector": "^2.6.7" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index bf6cb9e98..99f1bd5bc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "25af23518b24f0cb163d843d734df60b", + "content-hash": "a3ce57b2ea4c2e6fec8821902b388ac9", "packages": [ { "name": "anourvalar/eloquent-serialize", - "version": "1.3.11", + "version": "1.3.12", "source": { "type": "git", "url": "https://github.com/AnourValar/eloquent-serialize.git", - "reference": "abd890c4d1ad8e90dd454d01283fbf342f80f1e5" + "reference": "eb46e698efe7e20c311f1f93830111fcdcdabd96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/abd890c4d1ad8e90dd454d01283fbf342f80f1e5", - "reference": "abd890c4d1ad8e90dd454d01283fbf342f80f1e5", + "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/eb46e698efe7e20c311f1f93830111fcdcdabd96", + "reference": "eb46e698efe7e20c311f1f93830111fcdcdabd96", "shasum": "" }, "require": { @@ -67,9 +67,9 @@ ], "support": { "issues": "https://github.com/AnourValar/eloquent-serialize/issues", - "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.3.11" + "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.3.12" }, - "time": "2026-08-07T06:14:19+00:00" + "time": "2026-09-13T06:25:37+00:00" }, { "name": "bacon/bacon-qr-code", @@ -277,23 +277,24 @@ }, { "name": "brick/math", - "version": "0.18.0", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "82944324d1c1bdb2c2618e89978d4e2ad78d69ad" + "reference": "2effe05d2177c451b86c6a073196a4034c02f211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/82944324d1c1bdb2c2618e89978d4e2ad78d69ad", - "reference": "82944324d1c1bdb2c2618e89978d4e2ad78d69ad", + "url": "https://api.github.com/repos/brick/math/zipball/2effe05d2177c451b86c6a073196a4034c02f211", + "reference": "2effe05d2177c451b86c6a073196a4034c02f211", "shasum": "" }, "require": { "php": "^8.2" }, "require-dev": { - "phpstan/phpstan": "2.1.22", + "phpstan/phpstan": "2.2.13", + "phpstan/phpstan-phpunit": "2.0.18", "phpunit/phpunit": "^11.5" }, "type": "library", @@ -324,7 +325,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.18.0" + "source": "https://github.com/brick/math/tree/1.0.0" }, "funding": [ { @@ -332,7 +333,7 @@ "type": "github" } ], - "time": "2026-06-14T18:21:03+00:00" + "time": "2026-09-12T10:28:18+00:00" }, { "name": "calebporzio/sushi", @@ -1293,16 +1294,16 @@ }, { "name": "danharrin/livewire-rate-limiting", - "version": "v2.2.1", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/danharrin/livewire-rate-limiting.git", - "reference": "69436717dc70e30f80d7f8fd02504c22992a9ad5" + "reference": "46c4ceaf7997c713c79afe7c507a39649f6c9d6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/69436717dc70e30f80d7f8fd02504c22992a9ad5", - "reference": "69436717dc70e30f80d7f8fd02504c22992a9ad5", + "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/46c4ceaf7997c713c79afe7c507a39649f6c9d6f", + "reference": "46c4ceaf7997c713c79afe7c507a39649f6c9d6f", "shasum": "" }, "require": { @@ -1343,7 +1344,7 @@ "type": "github" } ], - "time": "2026-08-06T08:41:51+00:00" + "time": "2026-09-18T07:38:01+00:00" }, { "name": "dasprid/enum", @@ -1397,16 +1398,16 @@ }, { "name": "dedoc/scramble", - "version": "0.13.43", + "version": "v0.13.45", "source": { "type": "git", "url": "https://github.com/dedoc/scramble.git", - "reference": "2226e6664b88b3af1e5c10693f8e63a07ffd8fc0" + "reference": "4f096c49d555c580d7ce7a978896bb3d8b28dc4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dedoc/scramble/zipball/2226e6664b88b3af1e5c10693f8e63a07ffd8fc0", - "reference": "2226e6664b88b3af1e5c10693f8e63a07ffd8fc0", + "url": "https://api.github.com/repos/dedoc/scramble/zipball/4f096c49d555c580d7ce7a978896bb3d8b28dc4d", + "reference": "4f096c49d555c580d7ce7a978896bb3d8b28dc4d", "shasum": "" }, "require": { @@ -1466,7 +1467,7 @@ ], "support": { "issues": "https://github.com/dedoc/scramble/issues", - "source": "https://github.com/dedoc/scramble/tree/0.13.43" + "source": "https://github.com/dedoc/scramble/tree/v0.13.45" }, "funding": [ { @@ -1474,7 +1475,7 @@ "type": "github" } ], - "time": "2026-09-08T18:27:41+00:00" + "time": "2026-09-18T15:47:56+00:00" }, { "name": "dflydev/dot-access-data", @@ -1672,16 +1673,16 @@ }, { "name": "discord-php/http", - "version": "v10.9.5", + "version": "v10.9.6", "source": { "type": "git", "url": "https://github.com/discord-php/DiscordPHP-Http.git", - "reference": "292d0c60e7b9d814b0c39f5067a66f5f0f1bf285" + "reference": "45ec0a137c609595a03c299711e95b1be1ef7185" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/discord-php/DiscordPHP-Http/zipball/292d0c60e7b9d814b0c39f5067a66f5f0f1bf285", - "reference": "292d0c60e7b9d814b0c39f5067a66f5f0f1bf285", + "url": "https://api.github.com/repos/discord-php/DiscordPHP-Http/zipball/45ec0a137c609595a03c299711e95b1be1ef7185", + "reference": "45ec0a137c609595a03c299711e95b1be1ef7185", "shasum": "" }, "require": { @@ -1722,9 +1723,23 @@ "description": "Handles HTTP requests to Discord servers", "support": { "issues": "https://github.com/discord-php/DiscordPHP-Http/issues", - "source": "https://github.com/discord-php/DiscordPHP-Http/tree/v10.9.5" + "source": "https://github.com/discord-php/DiscordPHP-Http/tree/v10.9.6" }, - "time": "2026-08-09T14:19:51+00:00" + "funding": [ + { + "url": "https://valgorithms.com", + "type": "custom" + }, + { + "url": "https://www.paypal.me/valithor", + "type": "custom" + }, + { + "url": "https://github.com/valzargaming", + "type": "github" + } + ], + "time": "2026-09-22T13:34:09+00:00" }, { "name": "discord/interactions", @@ -1867,27 +1882,25 @@ }, { "name": "doctrine/lexer", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + "reference": "e96fe45e92a54233726014a7cc7340abf29bb14c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e96fe45e92a54233726014a7cc7340abf29bb14c", + "reference": "e96fe45e92a54233726014a7cc7340abf29bb14c", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.21" + "doctrine/coding-standard": "^14", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^10.5.58 || ^12.5.4" }, "type": "library", "autoload": { @@ -1924,7 +1937,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.1" + "source": "https://github.com/doctrine/lexer/tree/3.0.2" }, "funding": [ { @@ -1940,7 +1953,7 @@ "type": "tidelift" } ], - "time": "2024-02-05T11:56:58+00:00" + "time": "2026-06-14T20:44:06+00:00" }, { "name": "dragonmantank/cron-expression", @@ -2178,16 +2191,16 @@ }, { "name": "filament/actions", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/actions.git", - "reference": "2a85c76d75854c5a633ea162ae541af6f9205f21" + "reference": "d52683c6624d7adbae5979dc5474632b3299f47f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/2a85c76d75854c5a633ea162ae541af6f9205f21", - "reference": "2a85c76d75854c5a633ea162ae541af6f9205f21", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/d52683c6624d7adbae5979dc5474632b3299f47f", + "reference": "d52683c6624d7adbae5979dc5474632b3299f47f", "shasum": "" }, "require": { @@ -2223,20 +2236,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-07T18:43:33+00:00" + "time": "2026-09-15T16:56:37+00:00" }, { "name": "filament/filament", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/panels.git", - "reference": "1c2d8ed04959da6da7b54bcd6e6b75aeb50ab19a" + "reference": "b5aad5862fe932c8013aa7c6cba2fd360711de0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/1c2d8ed04959da6da7b54bcd6e6b75aeb50ab19a", - "reference": "1c2d8ed04959da6da7b54bcd6e6b75aeb50ab19a", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/b5aad5862fe932c8013aa7c6cba2fd360711de0d", + "reference": "b5aad5862fe932c8013aa7c6cba2fd360711de0d", "shasum": "" }, "require": { @@ -2281,20 +2294,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-08T10:21:33+00:00" + "time": "2026-09-20T19:20:59+00:00" }, { "name": "filament/forms", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/forms.git", - "reference": "74b5cda7693267a55af24d314944c667d4669fab" + "reference": "d7567d2dd57222ac15700324bbaae38405196d46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/74b5cda7693267a55af24d314944c667d4669fab", - "reference": "74b5cda7693267a55af24d314944c667d4669fab", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/d7567d2dd57222ac15700324bbaae38405196d46", + "reference": "d7567d2dd57222ac15700324bbaae38405196d46", "shasum": "" }, "require": { @@ -2331,20 +2344,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-08T10:24:44+00:00" + "time": "2026-09-20T18:46:41+00:00" }, { "name": "filament/infolists", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/infolists.git", - "reference": "6ebe9b6831c82ca8eab131e41317648d0482fce0" + "reference": "1046d42cf71cf96732e4b830b62f6787564d55f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/infolists/zipball/6ebe9b6831c82ca8eab131e41317648d0482fce0", - "reference": "6ebe9b6831c82ca8eab131e41317648d0482fce0", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/1046d42cf71cf96732e4b830b62f6787564d55f1", + "reference": "1046d42cf71cf96732e4b830b62f6787564d55f1", "shasum": "" }, "require": { @@ -2376,20 +2389,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-07T18:43:33+00:00" + "time": "2026-09-20T18:47:13+00:00" }, { "name": "filament/notifications", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/notifications.git", - "reference": "a42cb3e6b217a5478bf974dbe4880daed2033cfd" + "reference": "1e4c9d6a781006550e18cd2f22d1d11b875b505b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/notifications/zipball/a42cb3e6b217a5478bf974dbe4880daed2033cfd", - "reference": "a42cb3e6b217a5478bf974dbe4880daed2033cfd", + "url": "https://api.github.com/repos/filamentphp/notifications/zipball/1e4c9d6a781006550e18cd2f22d1d11b875b505b", + "reference": "1e4c9d6a781006550e18cd2f22d1d11b875b505b", "shasum": "" }, "require": { @@ -2423,20 +2436,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-07T18:43:33+00:00" + "time": "2026-09-20T18:46:22+00:00" }, { "name": "filament/query-builder", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/query-builder.git", - "reference": "311c5015b529043e229beeb1c8a54b95f2180f00" + "reference": "f6aa1da14766f5eebbb3067061cda041c424054a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/query-builder/zipball/311c5015b529043e229beeb1c8a54b95f2180f00", - "reference": "311c5015b529043e229beeb1c8a54b95f2180f00", + "url": "https://api.github.com/repos/filamentphp/query-builder/zipball/f6aa1da14766f5eebbb3067061cda041c424054a", + "reference": "f6aa1da14766f5eebbb3067061cda041c424054a", "shasum": "" }, "require": { @@ -2469,20 +2482,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-07T18:43:22+00:00" + "time": "2026-09-20T18:46:45+00:00" }, { "name": "filament/schemas", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/schemas.git", - "reference": "ca4e860522d9149f3442468bf7eaebf04bccca67" + "reference": "59406389183fbdaccdae65a29f752fbfea4567bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/schemas/zipball/ca4e860522d9149f3442468bf7eaebf04bccca67", - "reference": "ca4e860522d9149f3442468bf7eaebf04bccca67", + "url": "https://api.github.com/repos/filamentphp/schemas/zipball/59406389183fbdaccdae65a29f752fbfea4567bd", + "reference": "59406389183fbdaccdae65a29f752fbfea4567bd", "shasum": "" }, "require": { @@ -2514,11 +2527,11 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-08T10:21:40+00:00" + "time": "2026-09-20T18:46:28+00:00" }, { "name": "filament/spatie-laravel-media-library-plugin", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/spatie-laravel-media-library-plugin.git", @@ -2555,16 +2568,16 @@ }, { "name": "filament/support", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/support.git", - "reference": "1feb02e2535bdcab7e6acbf9e56ca1f5411ed24a" + "reference": "c39b26bbcdad3086b1445590c5da955c7d1177d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/1feb02e2535bdcab7e6acbf9e56ca1f5411ed24a", - "reference": "1feb02e2535bdcab7e6acbf9e56ca1f5411ed24a", + "url": "https://api.github.com/repos/filamentphp/support/zipball/c39b26bbcdad3086b1445590c5da955c7d1177d6", + "reference": "c39b26bbcdad3086b1445590c5da955c7d1177d6", "shasum": "" }, "require": { @@ -2610,20 +2623,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-07T18:43:52+00:00" + "time": "2026-09-20T19:22:34+00:00" }, { "name": "filament/tables", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/tables.git", - "reference": "758e62c4f4690a1e1faedd7348e18c44b8145488" + "reference": "e07361e182118d85e02bce35653c19429f7a8349" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/758e62c4f4690a1e1faedd7348e18c44b8145488", - "reference": "758e62c4f4690a1e1faedd7348e18c44b8145488", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/e07361e182118d85e02bce35653c19429f7a8349", + "reference": "e07361e182118d85e02bce35653c19429f7a8349", "shasum": "" }, "require": { @@ -2656,20 +2669,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-07T18:44:28+00:00" + "time": "2026-09-20T18:52:31+00:00" }, { "name": "filament/widgets", - "version": "v5.8.1", + "version": "v5.8.4", "source": { "type": "git", "url": "https://github.com/filamentphp/widgets.git", - "reference": "20e52cc560b591d2e3cc01bf4a5e9aca8f176476" + "reference": "93f6f102b890376e68b609ba5bfce2781b5d5d33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/widgets/zipball/20e52cc560b591d2e3cc01bf4a5e9aca8f176476", - "reference": "20e52cc560b591d2e3cc01bf4a5e9aca8f176476", + "url": "https://api.github.com/repos/filamentphp/widgets/zipball/93f6f102b890376e68b609ba5bfce2781b5d5d33", + "reference": "93f6f102b890376e68b609ba5bfce2781b5d5d33", "shasum": "" }, "require": { @@ -2700,7 +2713,7 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-09-07T18:43:09+00:00" + "time": "2026-09-20T18:53:34+00:00" }, { "name": "fruitcake/php-cors", @@ -4484,20 +4497,20 @@ }, { "name": "laravel/framework", - "version": "v13.31.0", + "version": "v13.33.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "7c75fbf93f91fa077d3df1c820cc14f4e59a9774" + "reference": "91188a17ceaa3dbace6e8a5f7abd0d042e466359" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/7c75fbf93f91fa077d3df1c820cc14f4e59a9774", - "reference": "7c75fbf93f91fa077d3df1c820cc14f4e59a9774", + "url": "https://api.github.com/repos/laravel/framework/zipball/91188a17ceaa3dbace6e8a5f7abd0d042e466359", + "reference": "91188a17ceaa3dbace6e8a5f7abd0d042e466359", "shasum": "" }, "require": { - "brick/math": "^0.14.2 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19", + "brick/math": "^0.14.2 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19 || ^0.20 || ^1.0", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", @@ -4612,15 +4625,17 @@ "orchestra/testbench-core": "^11.0.0", "pda/pheanstalk": "^7.0.0 || ^8.0.0", "php-http/discovery": "^1.15", - "phpstan/phpstan": "^2.0", + "phpstan/phpstan": "^2.2.14", "phpunit/phpunit": "^11.5.50 || ^12.5.8 || ^13.0.3", "predis/predis": "^2.3 || ^3.0", "rector/rector": "2.6.3", "resend/resend-php": "^1.0", "symfony/cache": "^7.4.0 || ^8.0.0", "symfony/http-client": "^7.4.0 || ^8.0.0", + "symfony/mercure": "^0.8.0", "symfony/psr-http-message-bridge": "^7.4.0 || ^8.0.0", - "symfony/translation": "^7.4.0 || ^8.0.0" + "symfony/translation": "^7.4.0 || ^8.0.0", + "web-token/jwt-library": "^4.1" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", @@ -4656,8 +4671,10 @@ "symfony/filesystem": "Required to enable support for relative symbolic links (^7.4 || ^8.0).", "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.4 || ^8.0).", "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.4 || ^8.0).", + "symfony/mercure": "Required to use the Mercure broadcast driver (^0.8).", "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.4 || ^8.0).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.4 || ^8.0)." + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.4 || ^8.0).", + "web-token/jwt-library": "Required to sign Mercure JWTs and use end-to-end encrypted channels (^4.1)." }, "type": "library", "extra": { @@ -4707,7 +4724,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-09-08T14:22:55+00:00" + "time": "2026-09-22T14:12:33+00:00" }, { "name": "laravel/head", @@ -4782,16 +4799,16 @@ }, { "name": "laravel/nightwatch", - "version": "v1.30.0", + "version": "v1.30.2", "source": { "type": "git", "url": "https://github.com/laravel/nightwatch.git", - "reference": "f20bc54ac22347d393882de6b9f6948a27d1f41a" + "reference": "123f0f24e3e3f4b732f04cdac3a0c63156f8efec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/nightwatch/zipball/f20bc54ac22347d393882de6b9f6948a27d1f41a", - "reference": "f20bc54ac22347d393882de6b9f6948a27d1f41a", + "url": "https://api.github.com/repos/laravel/nightwatch/zipball/123f0f24e3e3f4b732f04cdac3a0c63156f8efec", + "reference": "123f0f24e3e3f4b732f04cdac3a0c63156f8efec", "shasum": "" }, "require": { @@ -4872,7 +4889,7 @@ "issues": "https://github.com/laravel/nightwatch/issues", "source": "https://github.com/laravel/nightwatch" }, - "time": "2026-08-26T00:31:27+00:00" + "time": "2026-09-18T00:37:28+00:00" }, { "name": "laravel/prompts", @@ -5054,16 +5071,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.16", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed" + "reference": "2d5869a838bbcf37e0d8b0568fc41914e81374b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed", - "reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/2d5869a838bbcf37e0d8b0568fc41914e81374b5", + "reference": "2d5869a838bbcf37e0d8b0568fc41914e81374b5", "shasum": "" }, "require": { @@ -5111,20 +5128,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-08-18T20:28:54+00:00" + "time": "2026-09-22T14:32:34+00:00" }, { "name": "laravel/telescope", - "version": "v5.24.0", + "version": "v5.25.0", "source": { "type": "git", "url": "https://github.com/laravel/telescope.git", - "reference": "50cbcf4553ddfd8d4bd456b04f97dfed923007d9" + "reference": "65fe6724f8688de01dfa74b28a0edc191bc3caa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/50cbcf4553ddfd8d4bd456b04f97dfed923007d9", - "reference": "50cbcf4553ddfd8d4bd456b04f97dfed923007d9", + "url": "https://api.github.com/repos/laravel/telescope/zipball/65fe6724f8688de01dfa74b28a0edc191bc3caa8", + "reference": "65fe6724f8688de01dfa74b28a0edc191bc3caa8", "shasum": "" }, "require": { @@ -5177,9 +5194,9 @@ "monitoring" ], "support": { - "source": "https://github.com/laravel/telescope/tree/v5.24.0" + "source": "https://github.com/laravel/telescope/tree/v5.25.0" }, - "time": "2026-09-08T16:15:16+00:00" + "time": "2026-09-09T14:16:19+00:00" }, { "name": "laravel/tinker", @@ -5252,16 +5269,16 @@ }, { "name": "league/commonmark", - "version": "2.10.1", + "version": "2.10.3", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "9d489ab67a02960fd8ffe624d93f751daf95439e" + "reference": "6efbd9c472b91db0a3350fcd601c8332c2382e1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/9d489ab67a02960fd8ffe624d93f751daf95439e", - "reference": "9d489ab67a02960fd8ffe624d93f751daf95439e", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/6efbd9c472b91db0a3350fcd601c8332c2382e1f", + "reference": "6efbd9c472b91db0a3350fcd601c8332c2382e1f", "shasum": "" }, "require": { @@ -5355,7 +5372,7 @@ "type": "tidelift" } ], - "time": "2026-09-07T13:44:26+00:00" + "time": "2026-09-21T13:07:34+00:00" }, { "name": "league/config", @@ -6035,16 +6052,16 @@ }, { "name": "livewire/flux", - "version": "v2.19.0", + "version": "v2.20.0", "source": { "type": "git", "url": "https://github.com/livewire/flux.git", - "reference": "f85b252e216c87e805c946f83e9b1529dbcc04bf" + "reference": "9c3645ce3eb11ddf42ec956dcea322447469826a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/flux/zipball/f85b252e216c87e805c946f83e9b1529dbcc04bf", - "reference": "f85b252e216c87e805c946f83e9b1529dbcc04bf", + "url": "https://api.github.com/repos/livewire/flux/zipball/9c3645ce3eb11ddf42ec956dcea322447469826a", + "reference": "9c3645ce3eb11ddf42ec956dcea322447469826a", "shasum": "" }, "require": { @@ -6095,22 +6112,22 @@ ], "support": { "issues": "https://github.com/livewire/flux/issues", - "source": "https://github.com/livewire/flux/tree/v2.19.0" + "source": "https://github.com/livewire/flux/tree/v2.20.0" }, - "time": "2026-09-07T16:33:46+00:00" + "time": "2026-09-15T13:15:09+00:00" }, { "name": "livewire/livewire", - "version": "v4.4.4", + "version": "v4.4.6", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "00bf1b9959807d7cbcf38fc088515a7261cb6fa8" + "reference": "c6b7db7a92103ac2738e8fdc926cecc93eb67853" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/00bf1b9959807d7cbcf38fc088515a7261cb6fa8", - "reference": "00bf1b9959807d7cbcf38fc088515a7261cb6fa8", + "url": "https://api.github.com/repos/livewire/livewire/zipball/c6b7db7a92103ac2738e8fdc926cecc93eb67853", + "reference": "c6b7db7a92103ac2738e8fdc926cecc93eb67853", "shasum": "" }, "require": { @@ -6165,7 +6182,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v4.4.4" + "source": "https://github.com/livewire/livewire/tree/v4.4.6" }, "funding": [ { @@ -6173,7 +6190,7 @@ "type": "github" } ], - "time": "2026-09-07T16:02:43+00:00" + "time": "2026-09-21T18:51:23+00:00" }, { "name": "maennchen/zipstream-php", @@ -6773,16 +6790,16 @@ }, { "name": "nesbot/carbon", - "version": "3.13.2", + "version": "3.14.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb" + "reference": "0023eaa2c9110e47446dd512a263c69c40cd41f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/a1c54919f5fff9800cd03c32bd01defd5a4061cb", - "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/0023eaa2c9110e47446dd512a263c69c40cd41f2", + "reference": "0023eaa2c9110e47446dd512a263c69c40cd41f2", "shasum": "" }, "require": { @@ -6874,7 +6891,7 @@ "type": "tidelift" } ], - "time": "2026-08-08T11:40:35+00:00" + "time": "2026-09-12T20:45:19+00:00" }, { "name": "nette/php-generator", @@ -7110,16 +7127,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.8.0", + "version": "v5.9.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", - "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def", + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def", "shasum": "" }, "require": { @@ -7161,9 +7178,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.9.0" }, - "time": "2026-07-04T14:30:18+00:00" + "time": "2026-09-13T18:51:52+00:00" }, { "name": "nunomaduro/termwind", @@ -8575,20 +8592,20 @@ }, { "name": "ramsey/uuid", - "version": "4.9.3", + "version": "4.9.4", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8" + "reference": "75d73f48d02797c2c285a7e9f348fadc0102ffe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/1df15849d00943a67d677dc9cfd80795f038c9f8", - "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/75d73f48d02797c2c285a7e9f348fadc0102ffe2", + "reference": "75d73f48d02797c2c285a7e9f348fadc0102ffe2", "shasum": "" }, "require": { - "brick/math": ">=0.8.16 <=0.18", + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19 || ^0.20 || ^1.0", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -8647,9 +8664,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.9.3" + "source": "https://github.com/ramsey/uuid/tree/4.9.4" }, - "time": "2026-06-18T03:57:49+00:00" + "time": "2026-09-16T11:39:30+00:00" }, { "name": "ratchet/pawl", @@ -9839,16 +9856,16 @@ }, { "name": "saloonphp/saloon", - "version": "v4.0.1", + "version": "v4.3.0", "source": { "type": "git", "url": "https://github.com/saloonphp/saloon.git", - "reference": "7eb41570730a3fb84bb434d3d88ae6b9c7dd6650" + "reference": "8476092949f1b544b2a04d7ecaa71d98c3c2f7fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/saloonphp/saloon/zipball/7eb41570730a3fb84bb434d3d88ae6b9c7dd6650", - "reference": "7eb41570730a3fb84bb434d3d88ae6b9c7dd6650", + "url": "https://api.github.com/repos/saloonphp/saloon/zipball/8476092949f1b544b2a04d7ecaa71d98c3c2f7fe", + "reference": "8476092949f1b544b2a04d7ecaa71d98c3c2f7fe", "shasum": "" }, "require": { @@ -9908,7 +9925,7 @@ ], "support": { "issues": "https://github.com/saloonphp/saloon/issues", - "source": "https://github.com/saloonphp/saloon/tree/v4.0.1" + "source": "https://github.com/saloonphp/saloon/tree/v4.3.0" }, "funding": [ { @@ -9916,7 +9933,7 @@ "type": "github" } ], - "time": "2026-09-04T20:48:33+00:00" + "time": "2026-09-18T21:37:59+00:00" }, { "name": "scrivo/highlight.php", @@ -10500,16 +10517,16 @@ }, { "name": "spatie/laravel-backup", - "version": "10.3.2", + "version": "10.3.3", "source": { "type": "git", "url": "https://github.com/spatie/laravel-backup.git", - "reference": "705147b2521c19b6e2a0cd598acbf8a0c5f3184f" + "reference": "1ab5c2211481d5f962d118d0d35c40b9abf5b3f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/705147b2521c19b6e2a0cd598acbf8a0c5f3184f", - "reference": "705147b2521c19b6e2a0cd598acbf8a0c5f3184f", + "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/1ab5c2211481d5f962d118d0d35c40b9abf5b3f0", + "reference": "1ab5c2211481d5f962d118d0d35c40b9abf5b3f0", "shasum": "" }, "require": { @@ -10584,7 +10601,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-backup/issues", - "source": "https://github.com/spatie/laravel-backup/tree/10.3.2" + "source": "https://github.com/spatie/laravel-backup/tree/10.3.3" }, "funding": [ { @@ -10596,20 +10613,20 @@ "type": "other" } ], - "time": "2026-08-20T12:06:47+00:00" + "time": "2026-09-14T12:01:22+00:00" }, { "name": "spatie/laravel-medialibrary", - "version": "11.23.7", + "version": "11.23.8", "source": { "type": "git", "url": "https://github.com/spatie/laravel-medialibrary.git", - "reference": "94b11766ea5e10b1e2a88159b24937eae89a5d5f" + "reference": "32bd3926b1065c4dc154789b9c6b17567acaaa15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/94b11766ea5e10b1e2a88159b24937eae89a5d5f", - "reference": "94b11766ea5e10b1e2a88159b24937eae89a5d5f", + "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/32bd3926b1065c4dc154789b9c6b17567acaaa15", + "reference": "32bd3926b1065c4dc154789b9c6b17567acaaa15", "shasum": "" }, "require": { @@ -10694,7 +10711,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-medialibrary/issues", - "source": "https://github.com/spatie/laravel-medialibrary/tree/11.23.7" + "source": "https://github.com/spatie/laravel-medialibrary/tree/11.23.8" }, "funding": [ { @@ -10706,7 +10723,7 @@ "type": "github" } ], - "time": "2026-09-03T13:52:57+00:00" + "time": "2026-09-14T11:54:24+00:00" }, { "name": "spatie/laravel-package-tools", @@ -11137,16 +11154,16 @@ }, { "name": "symfony/console", - "version": "v8.1.6", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "eb7d9957d66739649e931ce7a9d05dab69f8abac" + "reference": "29afb89f4e941f68a6e90f28e3f52ff1f6793a7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/eb7d9957d66739649e931ce7a9d05dab69f8abac", - "reference": "eb7d9957d66739649e931ce7a9d05dab69f8abac", + "url": "https://api.github.com/repos/symfony/console/zipball/29afb89f4e941f68a6e90f28e3f52ff1f6793a7d", + "reference": "29afb89f4e941f68a6e90f28e3f52ff1f6793a7d", "shasum": "" }, "require": { @@ -11213,7 +11230,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.1.6" + "source": "https://github.com/symfony/console/tree/v8.1.7" }, "funding": [ { @@ -11233,7 +11250,7 @@ "type": "tidelift" } ], - "time": "2026-08-25T14:18:42+00:00" + "time": "2026-09-13T10:55:57+00:00" }, { "name": "symfony/css-selector", @@ -11765,16 +11782,16 @@ }, { "name": "symfony/finder", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8d7acede2b2ae07605783d1c43e49b5767036474" + "reference": "4fbe46a3eb64abf8a57f0364075b91f4a233e062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8d7acede2b2ae07605783d1c43e49b5767036474", - "reference": "8d7acede2b2ae07605783d1c43e49b5767036474", + "url": "https://api.github.com/repos/symfony/finder/zipball/4fbe46a3eb64abf8a57f0364075b91f4a233e062", + "reference": "4fbe46a3eb64abf8a57f0364075b91f4a233e062", "shasum": "" }, "require": { @@ -11809,7 +11826,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.1.5" + "source": "https://github.com/symfony/finder/tree/v8.1.7" }, "funding": [ { @@ -11829,20 +11846,20 @@ "type": "tidelift" } ], - "time": "2026-08-21T12:16:08+00:00" + "time": "2026-09-10T19:14:39+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v8.1.6", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "f8bbdb0704e6b6e9a3412481c1a87886a0633199" + "reference": "3d79bdecd01f71bccc45ddfa1d33c024df347a1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/f8bbdb0704e6b6e9a3412481c1a87886a0633199", - "reference": "f8bbdb0704e6b6e9a3412481c1a87886a0633199", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/3d79bdecd01f71bccc45ddfa1d33c024df347a1f", + "reference": "3d79bdecd01f71bccc45ddfa1d33c024df347a1f", "shasum": "" }, "require": { @@ -11881,7 +11898,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v8.1.6" + "source": "https://github.com/symfony/html-sanitizer/tree/v8.1.7" }, "funding": [ { @@ -11901,20 +11918,20 @@ "type": "tidelift" } ], - "time": "2026-08-30T01:03:44+00:00" + "time": "2026-09-04T10:14:04+00:00" }, { "name": "symfony/http-foundation", - "version": "v8.1.6", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "093b78326f649c3a9db922b9f17123b6aeb3b8fb" + "reference": "d8fdc670ed510a69e3a9eb4f5eac89f5ed627e17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/093b78326f649c3a9db922b9f17123b6aeb3b8fb", - "reference": "093b78326f649c3a9db922b9f17123b6aeb3b8fb", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d8fdc670ed510a69e3a9eb4f5eac89f5ed627e17", + "reference": "d8fdc670ed510a69e3a9eb4f5eac89f5ed627e17", "shasum": "" }, "require": { @@ -11962,7 +11979,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v8.1.6" + "source": "https://github.com/symfony/http-foundation/tree/v8.1.7" }, "funding": [ { @@ -11982,20 +11999,20 @@ "type": "tidelift" } ], - "time": "2026-08-30T20:10:55+00:00" + "time": "2026-09-14T17:47:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v8.1.6", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "2f73beb7c6f1a97d2c17bbf4dbd59da8cc18b355" + "reference": "ec7a3a5832c22cf880cf27d2fdc7ad2e94838e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2f73beb7c6f1a97d2c17bbf4dbd59da8cc18b355", - "reference": "2f73beb7c6f1a97d2c17bbf4dbd59da8cc18b355", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ec7a3a5832c22cf880cf27d2fdc7ad2e94838e85", + "reference": "ec7a3a5832c22cf880cf27d2fdc7ad2e94838e85", "shasum": "" }, "require": { @@ -12072,7 +12089,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/v8.1.6" + "source": "https://github.com/symfony/http-kernel/tree/v8.1.7" }, "funding": [ { @@ -12092,20 +12109,20 @@ "type": "tidelift" } ], - "time": "2026-08-30T21:40:49+00:00" + "time": "2026-09-15T07:12:52+00:00" }, { "name": "symfony/mailer", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "89f43137da74b8f1aab37c99926482b7084f51b9" + "reference": "8783380ecdafa23d36fc90c5873fd44b635c6e10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/89f43137da74b8f1aab37c99926482b7084f51b9", - "reference": "89f43137da74b8f1aab37c99926482b7084f51b9", + "url": "https://api.github.com/repos/symfony/mailer/zipball/8783380ecdafa23d36fc90c5873fd44b635c6e10", + "reference": "8783380ecdafa23d36fc90c5873fd44b635c6e10", "shasum": "" }, "require": { @@ -12152,7 +12169,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v8.1.5" + "source": "https://github.com/symfony/mailer/tree/v8.1.7" }, "funding": [ { @@ -12172,20 +12189,20 @@ "type": "tidelift" } ], - "time": "2026-08-21T17:47:34+00:00" + "time": "2026-09-15T06:01:24+00:00" }, { "name": "symfony/mime", - "version": "v8.1.6", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f" + "reference": "773ac57f20e2795bdadb65b5b1b5f4850d498283" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f", - "reference": "1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f", + "url": "https://api.github.com/repos/symfony/mime/zipball/773ac57f20e2795bdadb65b5b1b5f4850d498283", + "reference": "773ac57f20e2795bdadb65b5b1b5f4850d498283", "shasum": "" }, "require": { @@ -12238,7 +12255,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v8.1.6" + "source": "https://github.com/symfony/mime/tree/v8.1.7" }, "funding": [ { @@ -12258,7 +12275,7 @@ "type": "tidelift" } ], - "time": "2026-08-22T09:06:25+00:00" + "time": "2026-09-04T11:02:17+00:00" }, { "name": "symfony/options-resolver", @@ -13322,16 +13339,16 @@ }, { "name": "symfony/process", - "version": "v8.1.6", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d863f5e70d7c87abb906ac11b61f83036093000b" + "reference": "10823b09358e690df4ff943e24e8492bb1019fc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d863f5e70d7c87abb906ac11b61f83036093000b", - "reference": "d863f5e70d7c87abb906ac11b61f83036093000b", + "url": "https://api.github.com/repos/symfony/process/zipball/10823b09358e690df4ff943e24e8492bb1019fc3", + "reference": "10823b09358e690df4ff943e24e8492bb1019fc3", "shasum": "" }, "require": { @@ -13363,7 +13380,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v8.1.6" + "source": "https://github.com/symfony/process/tree/v8.1.7" }, "funding": [ { @@ -13383,7 +13400,7 @@ "type": "tidelift" } ], - "time": "2026-08-21T17:47:34+00:00" + "time": "2026-09-02T12:40:29+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -13642,16 +13659,16 @@ }, { "name": "symfony/string", - "version": "v8.1.2", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc" + "reference": "d950140b5f56f31901e5b7a0c04ffc3a3deb943c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", - "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", + "url": "https://api.github.com/repos/symfony/string/zipball/d950140b5f56f31901e5b7a0c04ffc3a3deb943c", + "reference": "d950140b5f56f31901e5b7a0c04ffc3a3deb943c", "shasum": "" }, "require": { @@ -13708,7 +13725,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.1.2" + "source": "https://github.com/symfony/string/tree/v8.1.7" }, "funding": [ { @@ -13728,7 +13745,7 @@ "type": "tidelift" } ], - "time": "2026-07-28T07:35:25+00:00" + "time": "2026-09-11T14:51:16+00:00" }, { "name": "symfony/translation", @@ -13985,16 +14002,16 @@ }, { "name": "symfony/var-dumper", - "version": "v8.1.6", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "3783365b58972f4779254d98372af80fbf15e170" + "reference": "741a8c4c948b0bb9bd3653daacd3644c73c40ea5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3783365b58972f4779254d98372af80fbf15e170", - "reference": "3783365b58972f4779254d98372af80fbf15e170", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/741a8c4c948b0bb9bd3653daacd3644c73c40ea5", + "reference": "741a8c4c948b0bb9bd3653daacd3644c73c40ea5", "shasum": "" }, "require": { @@ -14048,7 +14065,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v8.1.6" + "source": "https://github.com/symfony/var-dumper/tree/v8.1.7" }, "funding": [ { @@ -14068,7 +14085,7 @@ "type": "tidelift" } ], - "time": "2026-08-30T20:10:55+00:00" + "time": "2026-09-03T16:02:27+00:00" }, { "name": "symfony/yaml", @@ -14148,16 +14165,16 @@ }, { "name": "team-reflex/discord-php", - "version": "v10.56.17", + "version": "v10.58.0", "source": { "type": "git", "url": "https://github.com/discord-php/DiscordPHP.git", - "reference": "976b8201ee98a277b3a6452f6d4370b08c157145" + "reference": "204a825a014e202488ebd9448358e877105620fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/discord-php/DiscordPHP/zipball/976b8201ee98a277b3a6452f6d4370b08c157145", - "reference": "976b8201ee98a277b3a6452f6d4370b08c157145", + "url": "https://api.github.com/repos/discord-php/DiscordPHP/zipball/204a825a014e202488ebd9448358e877105620fb", + "reference": "204a825a014e202488ebd9448358e877105620fb", "shasum": "" }, "require": { @@ -14229,7 +14246,7 @@ "chat": "https://discord.gg/dphp", "docs": "https://discord-php.github.io/DiscordPHP/", "issues": "https://github.com/discord-php/DiscordPHP/issues", - "source": "https://github.com/discord-php/DiscordPHP/tree/v10.56.17", + "source": "https://github.com/discord-php/DiscordPHP/tree/v10.58.0", "wiki": "https://github.com/discord-php/DiscordPHP/wiki" }, "funding": [ @@ -14244,13 +14261,9 @@ { "url": "https://github.com/valzargaming", "type": "github" - }, - { - "url": "https://www.patreon.com/DiscordPHP", - "type": "patreon" } ], - "time": "2026-09-07T09:45:45+00:00" + "time": "2026-09-22T13:56:38+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -14909,16 +14922,16 @@ }, { "name": "filp/whoops", - "version": "2.18.4", + "version": "2.18.5", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + "reference": "baec851ad6ae00db8bd0fdd30d208afc1b71c56e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", - "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "url": "https://api.github.com/repos/filp/whoops/zipball/baec851ad6ae00db8bd0fdd30d208afc1b71c56e", + "reference": "baec851ad6ae00db8bd0fdd30d208afc1b71c56e", "shasum": "" }, "require": { @@ -14927,8 +14940,8 @@ }, "require-dev": { "mockery/mockery": "^1.0", - "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^4.0 || ^5.0" + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3 || ^10.5.58", + "symfony/var-dumper": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0" }, "suggest": { "symfony/var-dumper": "Pretty print complex values better with var-dumper available", @@ -14968,7 +14981,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.18.4" + "source": "https://github.com/filp/whoops/tree/2.18.5" }, "funding": [ { @@ -14976,7 +14989,7 @@ "type": "github" } ], - "time": "2025-08-08T12:00:00+00:00" + "time": "2026-09-18T12:00:00+00:00" }, { "name": "fruitcake/laravel-debugbar", @@ -15239,16 +15252,16 @@ }, { "name": "larastan/larastan", - "version": "v3.11.0", + "version": "v3.12.2", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "9baa74074f17cc70feaef31616a06ea0faeebba5" + "reference": "c328727e6103c1147d1c64cc96b3aedfda26bc20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/9baa74074f17cc70feaef31616a06ea0faeebba5", - "reference": "9baa74074f17cc70feaef31616a06ea0faeebba5", + "url": "https://api.github.com/repos/larastan/larastan/zipball/c328727e6103c1147d1c64cc96b3aedfda26bc20", + "reference": "c328727e6103c1147d1c64cc96b3aedfda26bc20", "shasum": "" }, "require": { @@ -15261,7 +15274,7 @@ "illuminate/pipeline": "^11.44.2 || ^12.4.1 || ^13", "illuminate/support": "^11.44.2 || ^12.4.1 || ^13", "php": "^8.2", - "phpstan/phpstan": "^2.2.2" + "phpstan/phpstan": "^2.2.14" }, "require-dev": { "doctrine/coding-standard": "^14", @@ -15316,7 +15329,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v3.11.0" + "source": "https://github.com/larastan/larastan/tree/v3.12.2" }, "funding": [ { @@ -15324,7 +15337,7 @@ "type": "github" } ], - "time": "2026-09-01T16:35:48+00:00" + "time": "2026-09-19T10:46:58+00:00" }, { "name": "laravel/agent-detector", @@ -15390,16 +15403,16 @@ }, { "name": "laravel/boost", - "version": "v2.8.0", + "version": "v2.9.1", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "ac0b51fbaf3cc19453aef7a1b188bce19a1ec049" + "reference": "2da6cbfdc6399d69b49a2dfb1e4f4eaf6bb419f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/ac0b51fbaf3cc19453aef7a1b188bce19a1ec049", - "reference": "ac0b51fbaf3cc19453aef7a1b188bce19a1ec049", + "url": "https://api.github.com/repos/laravel/boost/zipball/2da6cbfdc6399d69b49a2dfb1e4f4eaf6bb419f0", + "reference": "2da6cbfdc6399d69b49a2dfb1e4f4eaf6bb419f0", "shasum": "" }, "require": { @@ -15408,7 +15421,7 @@ "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", "illuminate/routing": "^11.45.3|^12.41.1|^13.0", "illuminate/support": "^11.45.3|^12.41.1|^13.0", - "laravel/mcp": "^0.7.1|^0.8.0|^0.9.0", + "laravel/mcp": "^0.7.1|^0.8.0|^0.9.0|^1.0", "laravel/prompts": "^0.3.10", "laravel/roster": "^1.0.0", "php": "^8.2" @@ -15452,20 +15465,20 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-09-08T17:07:40+00:00" + "time": "2026-09-17T02:40:42+00:00" }, { "name": "laravel/mcp", - "version": "v0.9.5", + "version": "v1.0.0", "source": { "type": "git", "url": "https://github.com/laravel/mcp.git", - "reference": "923d8d8cd9ed46766d1a8b5269f8b4afc4c91c53" + "reference": "cfa4f38f82873eeb6848527883545f98f871e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/mcp/zipball/923d8d8cd9ed46766d1a8b5269f8b4afc4c91c53", - "reference": "923d8d8cd9ed46766d1a8b5269f8b4afc4c91c53", + "url": "https://api.github.com/repos/laravel/mcp/zipball/cfa4f38f82873eeb6848527883545f98f871e229", + "reference": "cfa4f38f82873eeb6848527883545f98f871e229", "shasum": "" }, "require": { @@ -15526,7 +15539,7 @@ "issues": "https://github.com/laravel/mcp/issues", "source": "https://github.com/laravel/mcp" }, - "time": "2026-09-09T12:56:57+00:00" + "time": "2026-09-14T14:35:19+00:00" }, { "name": "laravel/pail", @@ -15695,16 +15708,16 @@ }, { "name": "laravel/pint", - "version": "v1.32.0", + "version": "v1.32.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "dea4e95f0f1722b8fec9eaabc8fdd676d71e8841" + "reference": "006bd7825eb01daf92959d060b89cd9514fe4253" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/dea4e95f0f1722b8fec9eaabc8fdd676d71e8841", - "reference": "dea4e95f0f1722b8fec9eaabc8fdd676d71e8841", + "url": "https://api.github.com/repos/laravel/pint/zipball/006bd7825eb01daf92959d060b89cd9514fe4253", + "reference": "006bd7825eb01daf92959d060b89cd9514fe4253", "shasum": "" }, "require": { @@ -15761,7 +15774,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2026-09-09T16:26:47+00:00" + "time": "2026-09-10T10:47:55+00:00" }, { "name": "laravel/roster", @@ -16005,16 +16018,16 @@ }, { "name": "pestphp/pest", - "version": "v5.1.4", + "version": "v5.2.1", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "e68976ea9da26e57ce74bf6ac4d638ded9151771" + "reference": "94f4f1ff4835dae2519f8b13f349d1042318e076" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/e68976ea9da26e57ce74bf6ac4d638ded9151771", - "reference": "e68976ea9da26e57ce74bf6ac4d638ded9151771", + "url": "https://api.github.com/repos/pestphp/pest/zipball/94f4f1ff4835dae2519f8b13f349d1042318e076", + "reference": "94f4f1ff4835dae2519f8b13f349d1042318e076", "shasum": "" }, "require": { @@ -16026,13 +16039,13 @@ "pestphp/pest-plugin-mutate": "^5.0.2", "pestphp/pest-plugin-profanity": "^5.0.0", "php": "^8.4", - "phpunit/phpunit": "^13.3.2", - "symfony/process": "^8.1.6" + "phpunit/phpunit": "^13.3.4", + "symfony/process": "^8.1.7" }, "conflict": { "filp/whoops": "<2.18.3", "laravel/boost": "<2.6.0", - "phpunit/phpunit": ">13.3.2", + "phpunit/phpunit": ">13.3.4", "sebastian/exporter": "<7.0.0", "webmozart/assert": "<1.11.0" }, @@ -16109,7 +16122,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v5.1.4" + "source": "https://github.com/pestphp/pest/tree/v5.2.1" }, "funding": [ { @@ -16121,7 +16134,7 @@ "type": "github" } ], - "time": "2026-09-07T11:01:12+00:00" + "time": "2026-09-17T11:41:10+00:00" }, { "name": "pestphp/pest-plugin", @@ -17215,11 +17228,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.2.13", + "version": "2.2.14", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", - "reference": "9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9c672e7a8e791dfc3d30e55f683e73fc0b63a3ac", + "reference": "9c672e7a8e791dfc3d30e55f683e73fc0b63a3ac", "shasum": "" }, "require": { @@ -17275,20 +17288,20 @@ "type": "github" } ], - "time": "2026-09-03T20:38:19+00:00" + "time": "2026-09-12T21:39:33+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "14.3.2", + "version": "14.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "93d62632fb675b76c9b941fdcfcfa10ffb9dea75" + "reference": "f8640c238e930b914d0098a1edbad6652e61a64a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/93d62632fb675b76c9b941fdcfcfa10ffb9dea75", - "reference": "93d62632fb675b76c9b941fdcfcfa10ffb9dea75", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f8640c238e930b914d0098a1edbad6652e61a64a", + "reference": "f8640c238e930b914d0098a1edbad6652e61a64a", "shasum": "" }, "require": { @@ -17307,7 +17320,7 @@ "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^13.3.2" + "phpunit/phpunit": "^13.3.3" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -17345,7 +17358,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.3.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.3.3" }, "funding": [ { @@ -17365,7 +17378,7 @@ "type": "tidelift" } ], - "time": "2026-09-04T03:46:43+00:00" + "time": "2026-09-10T13:08:32+00:00" }, { "name": "phpunit/php-file-iterator", @@ -17662,16 +17675,16 @@ }, { "name": "phpunit/phpunit", - "version": "13.3.2", + "version": "13.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "22104a5ceb8d642e6b30ab00211d53d88e2db368" + "reference": "d19d90cf860efb7e4d96cee8243e06a248578085" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/22104a5ceb8d642e6b30ab00211d53d88e2db368", - "reference": "22104a5ceb8d642e6b30ab00211d53d88e2db368", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d19d90cf860efb7e4d96cee8243e06a248578085", + "reference": "d19d90cf860efb7e4d96cee8243e06a248578085", "shasum": "" }, "require": { @@ -17685,14 +17698,14 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.4.1", - "phpunit/php-code-coverage": "^14.3.1", + "phpunit/php-code-coverage": "^14.3.3", "phpunit/php-file-iterator": "^7.0.2", "phpunit/php-invoker": "^7.0.0", "phpunit/php-text-template": "^6.0.0", "phpunit/php-timer": "^9.0.0", "sebastian/cli-parser": "^5.0.1", "sebastian/comparator": "^8.4", - "sebastian/diff": "^9.0", + "sebastian/diff": "^9.0.1", "sebastian/environment": "^9.3.2", "sebastian/exporter": "^8.2.1", "sebastian/file-filter": "^1.0", @@ -17742,7 +17755,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/13.3.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.3.4" }, "funding": [ { @@ -17750,25 +17763,25 @@ "type": "other" } ], - "time": "2026-08-27T08:40:49+00:00" + "time": "2026-09-15T07:37:05+00:00" }, { "name": "rector/rector", - "version": "2.6.6", + "version": "2.6.7", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "ca069d6c79feaa6651b423c15d101a27a436093e" + "reference": "f4aa224edb9b0630fb43826d4cb6a49b62e48d4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/ca069d6c79feaa6651b423c15d101a27a436093e", - "reference": "ca069d6c79feaa6651b423c15d101a27a436093e", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/f4aa224edb9b0630fb43826d4cb6a49b62e48d4c", + "reference": "f4aa224edb9b0630fb43826d4cb6a49b62e48d4c", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.2.10" + "phpstan/phpstan": "^2.2.14" }, "conflict": { "rector/rector-doctrine": "*", @@ -17799,7 +17812,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.6.6" + "source": "https://github.com/rectorphp/rector/tree/2.6.7" }, "funding": [ { @@ -17807,7 +17820,7 @@ "type": "github" } ], - "time": "2026-09-02T09:38:46+00:00" + "time": "2026-09-13T20:17:44+00:00" }, { "name": "sebastian/cli-parser", diff --git a/package-lock.json b/package-lock.json index f3a679e13..1c4814415 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,12 +17,12 @@ "fontaine": "0.8.1", "husky": "9.1.7", "laravel-vite-plugin": "3.2.0", - "lint-staged": "17.5.0", + "lint-staged": "17.5.1", "npm-check-updates": "23.1.0", - "prettier": "3.9.6", + "prettier": "3.9.8", "tailwindcss": "4.3.3", "tw-animate-css": "1.4.0", - "vite": "8.2.1" + "vite": "8.3.0" }, "engines": { "node": "^24" @@ -123,9 +123,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.149.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.149.0.tgz", - "integrity": "sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA==", + "version": "0.150.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.150.0.tgz", + "integrity": "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==", "dev": true, "license": "MIT", "funding": { @@ -133,9 +133,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.8.tgz", - "integrity": "sha512-tN5aztYkKCte4i5SIrrz5yK/HMjEuCqCSCJa418jOV8tZ1cBY3YF2otxB1ktPxzsLA1BeTqwapK0bfjxNvHJVw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.9.tgz", + "integrity": "sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==", "cpu": [ "arm" ], @@ -150,9 +150,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.8.tgz", - "integrity": "sha512-dIYTWl9XprMUiQFoc55KUyk/oS8SKYH3zFl0LTR7RT0Xj4hgSVyuJcroH8JUu8RcpF8fTB6E0aOwCkZoYPcDSQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.9.tgz", + "integrity": "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==", "cpu": [ "arm64" ], @@ -167,9 +167,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.8.tgz", - "integrity": "sha512-PCSDQGXD2IyTEFrcgPyBM8jJuGmrbCMuoIOXdbEGVemruKACXoLQJrb+A45Z0L5t1RQkdfJprAYPkikbh7dzdA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.9.tgz", + "integrity": "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==", "cpu": [ "arm64" ], @@ -184,9 +184,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.8.tgz", - "integrity": "sha512-Uk7lRsGhPFHVX/sAUC6D5H9Ol30dFHd6iquokll2th3LpdJ3F5CzQB+7DHn0Ri2mG+U7k2zXiPHDrwZenXhwSA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.9.tgz", + "integrity": "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==", "cpu": [ "x64" ], @@ -201,9 +201,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.8.tgz", - "integrity": "sha512-DjszaTEVogPqA5bYzsEeqDCQxbcp2fexQwKcRspYji2yzR68fCf+e4fx6kBSRDwX5/brZaHw/hWS9+A/+/w9sQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.9.tgz", + "integrity": "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==", "cpu": [ "x64" ], @@ -218,9 +218,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.8.tgz", - "integrity": "sha512-zmwa7FTmdzB6aaEEuuls18H6Ap5JmJPSoPTuXixeJZV6tG40SyLkApQtz1g8ptZtiEKqj9OM0oNLPh1AgvE31Q==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.9.tgz", + "integrity": "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==", "cpu": [ "arm" ], @@ -235,9 +235,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.8.tgz", - "integrity": "sha512-KdYQDPHwJVnbFwdTGMgxsI9SqblBlz6STGM+w1We/d5B8OWWidYH0MwkU/uA1wM5fIpO2MkOVxXrNzzuZhw9ew==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.9.tgz", + "integrity": "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==", "cpu": [ "arm64" ], @@ -255,9 +255,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.8.tgz", - "integrity": "sha512-jFJTifHnNPY+yzOoNZQfSIysrVyXzEQPhPnOUjmD1bcQGHH6s7c8cViKWar8YplQImE5N9JRqMCLrM2CdxOrZA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.9.tgz", + "integrity": "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==", "cpu": [ "arm64" ], @@ -275,9 +275,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.8.tgz", - "integrity": "sha512-FhiOziBDWPBjbcmRzfLyIJnaP7AVMFXT7YCXPjXxj7wKU3vx24RjrCNN/zjvVa+N2vVoHJwCoUBvsrN/DG3zIA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.9.tgz", + "integrity": "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==", "cpu": [ "ppc64" ], @@ -295,9 +295,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.8.tgz", - "integrity": "sha512-WnHfADMzOV2Y55wlx1hzzQnar/wDt/VdvWSD99r18Mz9ylNieIGOkRx3UV21h7m/eJvjySYJkO26VvGNFkwsIQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.9.tgz", + "integrity": "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==", "cpu": [ "s390x" ], @@ -315,9 +315,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.8.tgz", - "integrity": "sha512-H9tRr5ibfXFVLxbPOseVewewFpl28zcEdjRDt2FTUZU7odxP0gEv1ki4/kGmcGOh78oRwZuuQllGLZ9zTJp84g==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.9.tgz", + "integrity": "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==", "cpu": [ "x64" ], @@ -335,9 +335,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.8.tgz", - "integrity": "sha512-UefiqfM3D6IVNlZ8tSGs9+Ejjud2T+oxO0IHADU45Y+lyEjD2dVFyZHbkfX0LUb5Zugo/oIv1eCO/KVYhgYJYA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.9.tgz", + "integrity": "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==", "cpu": [ "x64" ], @@ -355,9 +355,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.8.tgz", - "integrity": "sha512-637Ke4kWSy6rp9cxQ9gMOXlxPgIw/c1beASV4M//3+9I4uwBVOOl74G+e3zyU3u19U7RkRl/HuewixZ/Z6+Rjg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.9.tgz", + "integrity": "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==", "cpu": [ "arm64" ], @@ -372,9 +372,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.8.tgz", - "integrity": "sha512-xWBkPOF1Q9k/Gv1nQXnVdLxKu74jXppuOM4Z3mnypVUJJJwLsMl7hNJGRAUJoG8A5MgOI1ACKM+wBFxSJzKy4A==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.9.tgz", + "integrity": "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==", "cpu": [ "arm64" ], @@ -389,9 +389,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.8.tgz", - "integrity": "sha512-uz2ZvfgXbxqNwijjjbxrnvALwpyODDcgc1T1N8N3rf/DXKQmaFwmB4LX4yyjggpwN2obdQLb2rgirX5ffCWYng==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.9.tgz", + "integrity": "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==", "cpu": [ "x64" ], @@ -833,9 +833,9 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.24.5", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", - "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "version": "5.25.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", + "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", "dev": true, "license": "MIT", "dependencies": { @@ -902,9 +902,9 @@ } }, "node_modules/fontaine/node_modules/magic-string": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.3.1.tgz", - "integrity": "sha512-rm91zr2Ou+XueDTohjQQjdQEcYM6zVi8KVUCG8Ec3vHwUEKrhSdCNyfuIywkA6hcCAteIn0ZOtAHA6eGpiX+Pg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", + "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", "dev": true, "license": "MIT", "dependencies": { @@ -950,9 +950,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", "dev": true, "license": "MIT", "engines": { @@ -1296,9 +1296,9 @@ } }, "node_modules/lint-staged": { - "version": "17.5.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.5.0.tgz", - "integrity": "sha512-ah2qsNtvKP1+Ak4rAvEEIvcXDLjjbr/xmxCvlequxqEOFYk0qINcZcRxD3Ic8wRn7/oQ8+wC9s0DfDrdMVCRFg==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.5.1.tgz", + "integrity": "sha512-7EDuco1xnBMeVpvAbeMq1U5KXwJGLmY8q6l+Ye78r36C4mPc+Vg1Z2SK8gHyRTyvPro90A0q5/FAZ+Au23d6QQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1320,16 +1320,26 @@ } }, "node_modules/magic-regexp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/magic-regexp/-/magic-regexp-0.11.0.tgz", - "integrity": "sha512-LG77Z/gVnwz7oaDpD4heX6ryl+lcr4l1B2gnP4MMvt2pGhGC1Dfj7dl1pXpP4ih+VQFLuAadeKVa+lARAzfW+Q==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/magic-regexp/-/magic-regexp-0.11.2.tgz", + "integrity": "sha512-s4i7mq2jJnkB5J1HDX67GmdRoWrgo8tE0cL91bKO+HaquxyR5TiqkjVfLhgS2PXretsN/Gv9kSnRBgQxrLO/Qw==", "dev": true, "license": "MIT", "dependencies": { - "magic-string": "^0.30.21", + "magic-string": "^1.1.0", "regexp-tree": "^0.1.27", "type-level-regexp": "~0.1.17", - "unplugin": "^3.0.0" + "unplugin": "^3.3.0" + } + }, + "node_modules/magic-regexp/node_modules/magic-string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", + "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" } }, "node_modules/magic-string": { @@ -1350,9 +1360,9 @@ "license": "CC0-1.0" }, "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", "dev": true, "funding": [ { @@ -1454,9 +1464,9 @@ } }, "node_modules/prettier": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", - "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.8.tgz", + "integrity": "sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==", "dev": true, "license": "MIT", "bin": { @@ -1480,13 +1490,13 @@ } }, "node_modules/rolldown": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.8.tgz", - "integrity": "sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.9.tgz", + "integrity": "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.149.0", + "@oxc-project/types": "=0.150.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -1496,21 +1506,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.8", - "@rolldown/binding-android-arm64": "1.2.8", - "@rolldown/binding-darwin-arm64": "1.2.8", - "@rolldown/binding-darwin-x64": "1.2.8", - "@rolldown/binding-freebsd-x64": "1.2.8", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.8", - "@rolldown/binding-linux-arm64-gnu": "1.2.8", - "@rolldown/binding-linux-arm64-musl": "1.2.8", - "@rolldown/binding-linux-ppc64-gnu": "1.2.8", - "@rolldown/binding-linux-s390x-gnu": "1.2.8", - "@rolldown/binding-linux-x64-gnu": "1.2.8", - "@rolldown/binding-linux-x64-musl": "1.2.8", - "@rolldown/binding-openharmony-arm64": "1.2.8", - "@rolldown/binding-win32-arm64-msvc": "1.2.8", - "@rolldown/binding-win32-x64-msvc": "1.2.8" + "@rolldown/binding-android-arm-eabi": "1.2.9", + "@rolldown/binding-android-arm64": "1.2.9", + "@rolldown/binding-darwin-arm64": "1.2.9", + "@rolldown/binding-darwin-x64": "1.2.9", + "@rolldown/binding-freebsd-x64": "1.2.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", + "@rolldown/binding-linux-arm64-gnu": "1.2.9", + "@rolldown/binding-linux-arm64-musl": "1.2.9", + "@rolldown/binding-linux-ppc64-gnu": "1.2.9", + "@rolldown/binding-linux-s390x-gnu": "1.2.9", + "@rolldown/binding-linux-x64-gnu": "1.2.9", + "@rolldown/binding-linux-x64-musl": "1.2.9", + "@rolldown/binding-openharmony-arm64": "1.2.9", + "@rolldown/binding-win32-arm64-msvc": "1.2.9", + "@rolldown/binding-win32-x64-msvc": "1.2.9" } }, "node_modules/rxjs": { @@ -1700,14 +1710,14 @@ "license": "MIT" }, "node_modules/unplugin": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz", - "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.4.0.tgz", + "integrity": "sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "picomatch": "^4.0.4", + "picomatch": "^4.0.7", "webpack-virtual-modules": "^0.6.2" }, "engines": { @@ -1715,6 +1725,7 @@ }, "peerDependencies": { "@farmfe/core": "*", + "@rsbuild/core": "*", "@rspack/core": "*", "bun-types-no-globals": "*", "esbuild": "*", @@ -1728,6 +1739,9 @@ "@farmfe/core": { "optional": true }, + "@rsbuild/core": { + "optional": true + }, "@rspack/core": { "optional": true }, @@ -1762,16 +1776,16 @@ "license": "MIT" }, "node_modules/vite": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", - "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz", + "integrity": "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.25", - "rolldown": "~1.2.1", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.6", "tinyglobby": "^0.2.17" }, "bin": { @@ -1788,7 +1802,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", + "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -2172,9 +2186,9 @@ } }, "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", "dev": true, "license": "ISC", "optional": true, diff --git a/package.json b/package.json index 6c94758bb..ac4162460 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,12 @@ "fontaine": "0.8.1", "husky": "9.1.7", "laravel-vite-plugin": "3.2.0", - "lint-staged": "17.5.0", + "lint-staged": "17.5.1", "npm-check-updates": "23.1.0", - "prettier": "3.9.6", + "prettier": "3.9.8", "tailwindcss": "4.3.3", "tw-animate-css": "1.4.0", - "vite": "8.2.1" + "vite": "8.3.0" }, "lint-staged": { "*.{js,ts,json,yml,md,css}": [