diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b78d61186..23866de7a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -27,3 +27,9 @@ updates: allow: - dependency-type: direct versioning-strategy: increase-if-necessary + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: friday diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8146c7687..01a52a1b7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -32,7 +32,7 @@ jobs: coverage: none - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '22.x' @@ -51,7 +51,21 @@ jobs: DB_CONNECTION: mysql DB_COLLATION: utf8mb4_unicode_ci DB_DATABASE: laravel + + dependabot: + needs: [tests] + permissions: + pull-requests: write + contents: write + uses: driesvints/github-workflows/.github/workflows/dependabot.yml@main + secrets: + gh_token: ${{ secrets.GITHUB_TOKEN }} + deploy: + needs: [tests] + runs-on: ubuntu-latest + + steps: - name: Deploy if: github.repository == 'laravelio/laravel.io' && github.ref_name == 'main' run: curl ${{ secrets.ENVOYER_HOOK }}?sha=${{ github.sha }} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 663133b58..e1eac2bb7 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -44,7 +44,7 @@ event. Representation of a project may be further defined and clarified by proje ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at -dries.vints@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it +hello@laravel.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. diff --git a/README.md b/README.md index 4e58a8e45..1bd6bd7aa 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ We'd like to thank these **amazing companies** for sponsoring us. If you are int - [Fathom](https://usefathom.com) - [Tinkerwell](https://tinkerwell.app) - [BairesDev](https://www.bairesdev.com/sponsoring-open-source-projects/) +- [N-iX](https://www.n-ix.com/) ## Requirements diff --git a/app/Actions/ConnectGitHubAccount.php b/app/Actions/ConnectGitHubAccount.php new file mode 100644 index 000000000..c028622a9 --- /dev/null +++ b/app/Actions/ConnectGitHubAccount.php @@ -0,0 +1,22 @@ +update([ + 'github_id' => $socialiteUser->getId(), + 'github_username' => $socialiteUser->getNickname(), + ]); + + dispatch(new UpdateUserIdenticonStatus($user)); + } +} diff --git a/app/Actions/DisconnectGitHubAccount.php b/app/Actions/DisconnectGitHubAccount.php new file mode 100644 index 000000000..15373a9ad --- /dev/null +++ b/app/Actions/DisconnectGitHubAccount.php @@ -0,0 +1,17 @@ +update([ + 'github_id' => null, + 'github_username' => null, + 'github_has_identicon' => false, + ]); + } +} diff --git a/app/Console/Commands/SyncArticleImages.php b/app/Console/Commands/SyncArticleImages.php deleted file mode 100644 index 740ab53aa..000000000 --- a/app/Console/Commands/SyncArticleImages.php +++ /dev/null @@ -1,67 +0,0 @@ -error('Unsplash access key must be configured'); - - return; - } - - Article::unsyncedImages()->chunk(100, function ($articles) { - $articles->each(function ($article) { - $imageData = $this->fetchUnsplashImageDataFromId($article); - - if (! is_null($imageData)) { - $article->hero_image_url = $imageData['image_url']; - $article->hero_image_author_name = $imageData['author_name']; - $article->hero_image_author_url = $imageData['author_url']; - $article->save(); - } else { - $this->warn("Failed to fetch image data for image {$article->hero_image_id}"); - } - }); - }); - } - - protected function fetchUnsplashImageDataFromId(Article $article): ?array - { - $response = Http::retry(3, 100, throw: false) - ->withToken(config('services.unsplash.access_key'), 'Client-ID') - ->get("https://api.unsplash.com/photos/{$article->hero_image_id}"); - - if ($response->failed()) { - $article->hero_image_id = null; - $article->save(); - - $this->warn("Failed to fetch image data for image {$article->hero_image_id}"); - - return null; - } - - $response = $response->json(); - - // Trigger as Unsplash download... - Http::retry(3, 100, throw: false) - ->withToken(config('services.unsplash.access_key'), 'Client-ID') - ->get($response['links']['download_location']); - - return [ - 'image_url' => $response['urls']['raw'], - 'author_name' => $response['user']['name'], - 'author_url' => $response['user']['links']['html'], - ]; - } -} diff --git a/app/Crawler.php b/app/Crawler.php new file mode 100644 index 000000000..2f3e22176 --- /dev/null +++ b/app/Crawler.php @@ -0,0 +1,81 @@ + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:73.0) Gecko/20100101 Firefox/73.0', + 'Cache-Control' => 'max-age=0', + ]; + + public function __construct(?ClientInterface $client = null, ?RequestFactoryInterface $requestFactory = null, ?UriFactoryInterface $uriFactory = null) + { + $this->client = $client ?: new CurlClient; + $this->requestFactory = $requestFactory ?: FactoryDiscovery::getRequestFactory(); + $this->uriFactory = $uriFactory ?: FactoryDiscovery::getUriFactory(); + } + + public function addDefaultHeaders(array $headers): void + { + $this->defaultHeaders = $headers + $this->defaultHeaders; + } + + /** + * @param UriInterface|string $uri The URI associated with the request. + */ + public function createRequest(string $method, $uri): RequestInterface + { + $request = $this->requestFactory->createRequest($method, $uri); + + foreach ($this->defaultHeaders as $name => $value) { + $request = $request->withHeader($name, $value); + } + + return $request; + } + + public function createUri(string $uri = ''): UriInterface + { + return $this->uriFactory->createUri($uri); + } + + public function sendRequest(RequestInterface $request): ResponseInterface + { + return $this->client->sendRequest($request); + } + + public function sendRequests(RequestInterface ...$requests): array + { + if ($this->client instanceof CurlClient) { + return $this->client->sendRequests(...$requests); + } + + return array_map( + fn ($request) => $this->client->sendRequest($request), + $requests + ); + } + + public function getResponseUri(ResponseInterface $response): ?UriInterface + { + $location = $response->getHeaderLine('Content-Location'); + + return $location ? $this->uriFactory->createUri($location) : null; + } +} diff --git a/app/DomainFilteringAdapter.php b/app/DomainFilteringAdapter.php new file mode 100644 index 000000000..864581570 --- /dev/null +++ b/app/DomainFilteringAdapter.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App; + +use League\CommonMark\Extension\Embed\Embed; +use League\CommonMark\Extension\Embed\EmbedAdapterInterface; + +class DomainFilteringAdapter implements EmbedAdapterInterface +{ + private EmbedAdapterInterface $decorated; + + /** @psalm-var non-empty-string */ + private string $regex; + + /** + * @param string[] $allowedDomains + */ + public function __construct(EmbedAdapterInterface $decorated, array $allowedDomains) + { + $this->decorated = $decorated; + $this->regex = self::createRegex($allowedDomains); + } + + /** + * {@inheritDoc} + */ + public function updateEmbeds(array $embeds): void + { + $this->decorated->updateEmbeds(\array_values(\array_filter($embeds, function (Embed $embed): bool { + return \preg_match($this->regex, $embed->getUrl()) === 1; + }))); + } + + /** + * @param string[] $allowedDomains + * + * @psalm-return non-empty-string + */ + private static function createRegex(array $allowedDomains): string + { + $allowedDomains = \array_map('preg_quote', $allowedDomains); + + return '/^(?:https?:\/\/)?(?:[^.]+\.)*('.\implode('|', $allowedDomains).')/'; + } +} diff --git a/app/EmbedExtension.php b/app/EmbedExtension.php new file mode 100644 index 000000000..dbbb2a490 --- /dev/null +++ b/app/EmbedExtension.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App; + +use League\CommonMark\Environment\EnvironmentBuilderInterface; +use League\CommonMark\Event\DocumentParsedEvent; +use League\CommonMark\Extension\ConfigurableExtensionInterface; +use League\CommonMark\Extension\Embed\Embed; +use League\CommonMark\Extension\Embed\EmbedAdapterInterface; +use League\CommonMark\Extension\Embed\EmbedRenderer; +use League\CommonMark\Extension\Embed\EmbedStartParser; +use League\Config\ConfigurationBuilderInterface; +use Nette\Schema\Expect; + +final class EmbedExtension implements ConfigurableExtensionInterface +{ + public function configureSchema(ConfigurationBuilderInterface $builder): void + { + $builder->addSchema('embed', Expect::structure([ + 'adapter' => Expect::type(EmbedAdapterInterface::class), + 'allowed_domains' => Expect::arrayOf('string')->default([]), + 'fallback' => Expect::anyOf('link', 'remove')->default('link'), + ])); + } + + public function register(EnvironmentBuilderInterface $environment): void + { + $adapter = $environment->getConfiguration()->get('embed.adapter'); + \assert($adapter instanceof EmbedAdapterInterface); + + $allowedDomains = $environment->getConfiguration()->get('embed.allowed_domains'); + if ($allowedDomains !== []) { + $adapter = new DomainFilteringAdapter($adapter, $allowedDomains); + } + + $environment + ->addBlockStartParser(new EmbedStartParser, 300) + ->addEventListener(DocumentParsedEvent::class, new EmbedProcessor($adapter, $environment->getConfiguration()->get('embed.fallback')), 1010) + ->addRenderer(Embed::class, new EmbedRenderer); + } +} diff --git a/app/EmbedProcessor.php b/app/EmbedProcessor.php new file mode 100644 index 000000000..c37a88116 --- /dev/null +++ b/app/EmbedProcessor.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App; + +use League\CommonMark\Event\DocumentParsedEvent; +use League\CommonMark\Extension\CommonMark\Node\Inline\Link; +use League\CommonMark\Extension\Embed\Embed; +use League\CommonMark\Extension\Embed\EmbedAdapterInterface; +use League\CommonMark\Node\Block\Paragraph; +use League\CommonMark\Node\Inline\Text; +use League\CommonMark\Node\NodeIterator; + +final class EmbedProcessor +{ + public const FALLBACK_REMOVE = 'remove'; + + public const FALLBACK_LINK = 'link'; + + private EmbedAdapterInterface $adapter; + + private string $fallback; + + public function __construct(EmbedAdapterInterface $adapter, string $fallback = self::FALLBACK_REMOVE) + { + $this->adapter = $adapter; + $this->fallback = $fallback; + } + + public function __invoke(DocumentParsedEvent $event): void + { + $document = $event->getDocument(); + $embeds = []; + + foreach (new NodeIterator($document) as $node) { + if (! ($node instanceof Embed)) { + continue; + } + + if ($node->parent() !== $document) { + $replacement = new Paragraph; + $replacement->appendChild(new Text($node->getUrl())); + $node->replaceWith($replacement); + } else { + $embeds[] = $node; + } + } + + if (! empty($embeds)) { + $this->adapter->updateEmbeds($embeds); + } + + foreach ($embeds as $embed) { + if ($embed->getEmbedCode() !== null) { + continue; + } + + if ($this->fallback === self::FALLBACK_REMOVE) { + $embed->detach(); + } elseif ($this->fallback === self::FALLBACK_LINK) { + $paragraph = new Paragraph; + $paragraph->appendChild(new Link($embed->getUrl(), $embed->getUrl())); + $embed->replaceWith($paragraph); + } + } + } +} diff --git a/app/Filament/Resources/Articles/ArticleResource.php b/app/Filament/Resources/Articles/ArticleResource.php new file mode 100644 index 000000000..31bfdcdc0 --- /dev/null +++ b/app/Filament/Resources/Articles/ArticleResource.php @@ -0,0 +1,39 @@ + ListArticles::route('/'), + ]; + } +} diff --git a/app/Filament/Resources/Articles/Pages/ListArticles.php b/app/Filament/Resources/Articles/Pages/ListArticles.php new file mode 100644 index 000000000..2b985ff8d --- /dev/null +++ b/app/Filament/Resources/Articles/Pages/ListArticles.php @@ -0,0 +1,16 @@ +defaultSort('submitted_at', 'desc') + ->openRecordUrlInNewTab() + ->columns([ + ImageColumn::make('authorRelation.github_id') + ->label('Author') + ->circular() + ->width('1%') + ->defaultImageUrl(fn (?string $state): string => $state ? sprintf('https://avatars.githubusercontent.com/u/%s', $state) : asset('images/laravelio-icon-gray.svg')), + + TextColumn::make('authorRelation.name') + ->label('') + ->description(fn (Article $article): ?string => $article->authorRelation->username), + + TextColumn::make('title') + ->searchable(['title', 'slug', 'body']), + + TextColumn::make('submitted_at') + ->label('Submitted on') + ->dateTime() + ->sortable(), + ]) + ->filters([ + Filter::make('awaiting_approvals') + ->query(fn (Builder $query): Builder => $query->awaitingApproval()) + ->default(), + ]) + ->recordActions([ + Action::make('view') + ->url(fn (Article $article): string => route('articles.show', $article->slug())) + ->openUrlInNewTab() + ->icon('heroicon-s-eye'), + ]) + ->toolbarActions([ + // + ]); + } +} diff --git a/app/Filament/Resources/Replies/Pages/ListReplies.php b/app/Filament/Resources/Replies/Pages/ListReplies.php new file mode 100644 index 000000000..26e03bac8 --- /dev/null +++ b/app/Filament/Resources/Replies/Pages/ListReplies.php @@ -0,0 +1,18 @@ + ListReplies::route('/'), + ]; + } + + public static function getRecordRouteBindingEloquentQuery(): Builder + { + return parent::getRecordRouteBindingEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Resources/Replies/Tables/RepliesTable.php b/app/Filament/Resources/Replies/Tables/RepliesTable.php new file mode 100644 index 000000000..52cc8defd --- /dev/null +++ b/app/Filament/Resources/Replies/Tables/RepliesTable.php @@ -0,0 +1,85 @@ +defaultSort('updated_at', 'desc') + ->openRecordUrlInNewTab() + ->columns([ + ImageColumn::make('authorRelation.github_id') + ->label('Author') + ->circular() + ->defaultImageUrl(fn (?string $state): string => $state ? sprintf('https://avatars.githubusercontent.com/u/%s', $state) : asset('images/laravelio-icon-gray.svg')), + + TextColumn::make('authorRelation.name') + ->label('') + ->description(fn (Reply $reply): ?string => $reply->authorRelation->username), + + TextColumn::make('replyAbleRelation.subject') + ->label('Thread') + ->searchable(), + + TextColumn::make('body') + ->label('Content') + ->limit(250) + ->wrap() + ->searchable(), + + IconColumn::make('updated_by') + ->label('Updated') + ->boolean() + ->default(false), + + TextColumn::make('created_at') + ->label('Created on') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + + TextColumn::make('updated_at') + ->label('Last updated on') + ->dateTime() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + TrashedFilter::make(), + + TernaryFilter::make('updated_by') + ->label('Updated') + ->nullable(), + ]) + ->recordActions([ + Action::make('view') + ->url(fn (Reply $reply): string => route('thread', $reply->replyAble()->slug()).'#'.$reply->id()) + ->openUrlInNewTab() + ->icon('heroicon-s-eye'), + + DeleteAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ForceDeleteBulkAction::make(), + RestoreBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Users/Pages/ListUsers.php b/app/Filament/Resources/Users/Pages/ListUsers.php new file mode 100644 index 000000000..9de7f5b08 --- /dev/null +++ b/app/Filament/Resources/Users/Pages/ListUsers.php @@ -0,0 +1,18 @@ +defaultSort('created_at', 'desc') + ->openRecordUrlInNewTab() + ->columns([ + ImageColumn::make('github_id') + ->label('Name') + ->circular() + ->width('0%') + ->defaultImageUrl(fn (?string $state): string => $state ? sprintf('https://avatars.githubusercontent.com/u/%s', $state) : asset('images/laravelio-icon-gray.svg')), + + TextColumn::make('username') + ->label('') + ->searchable() + ->formatStateUsing(fn (User $user): ?string => $user->name) + ->description(fn (User $user): ?string => $user->username), + + TextColumn::make('email') + ->searchable() + ->toggleable(isToggledHiddenByDefault: true), + + TextColumn::make('type') + ->label('Role') + ->badge() + ->formatStateUsing(fn (string $state): string => match ($state) { + '1' => 'User', + '2' => 'Moderator', + '3' => 'Admin', + }), + + IconColumn::make('banned_at') + ->label('Banned') + ->boolean() + ->default(false), + + TextColumn::make('created_at') + ->label('Joined on') + ->dateTime() + ->sortable(), + ]) + ->filters([ + SelectFilter::make('type') + ->options([ + '1' => 'User', + '2' => 'Moderator', + '3' => 'Admin', + ]), + + TernaryFilter::make('banned_at') + ->label('Banned') + ->nullable(), + ]) + ->recordActions([ + Action::make('view') + ->url(fn (User $user): string => route('profile', $user->username)) + ->openUrlInNewTab() + ->icon('heroicon-s-eye'), + + ActionGroup::make([ + Action::make('verify_author') + ->action(function (User $user) { + VerifyAuthor::dispatchSync($user); + + Notification::make() + ->title($user->name.' is now a verified author.') + ->success() + ->send(); + }) + ->openUrlInNewTab() + ->color('primary') + ->icon('heroicon-s-check-circle') + ->requiresConfirmation() + ->visible(fn (User $user): bool => auth()->user()->can(UserPolicy::ADMIN, $user) && ! $user->isVerifiedAuthor()), + + Action::make('unverify_author') + ->action(function (User $user) { + UnVerifyAuthor::dispatchSync($user); + + Notification::make() + ->title($user->name.'\'s threads have been deleted.') + ->success() + ->send(); + }) + ->openUrlInNewTab() + ->color('danger') + ->icon('heroicon-s-x-circle') + ->requiresConfirmation() + ->visible(fn (User $user): bool => auth()->user()->can(UserPolicy::ADMIN, $user) && $user->isVerifiedAuthor()), + + Action::make('ban_author') + ->schema([ + TextInput::make('reason') + ->label('Reason') + ->required() + ->placeholder('Provide a reason for banning this user...'), + + Checkbox::make('delete_threads') + ->label('Delete all threads') + ->default(false), + ]) + ->action(function (User $user, array $data) { + BanUser::dispatchSync($user, $data['reason']); + + if ($data['delete_threads']) { + DeleteUserThreads::dispatchSync($user); + } + + Notification::make() + ->title( + $user->name.' is now banned.'.($data['delete_threads'] ? ' And all his threads are now deleted.' : '') + ) + ->success() + ->send(); + }) + ->modalDescription('Are you sure you\'d like to ban this user? This will prevent him from logging in, posting threads and replying to threads.') + ->openUrlInNewTab() + ->color('danger') + ->icon('heroicon-s-check-circle') + ->requiresConfirmation() + ->visible(fn (User $user): bool => auth()->user()->can(UserPolicy::BAN, $user) && ! $user->isBanned()), + + Action::make('unban_author') + ->action(function (User $user) { + + UnbanUser::dispatchSync($user); + + Notification::make() + ->title($user->name.' is no longer a banned user.') + ->success() + ->send(); + }) + ->openUrlInNewTab() + ->color('primary') + ->icon('heroicon-s-x-circle') + ->requiresConfirmation() + ->visible(fn (User $user): bool => auth()->user()->can(UserPolicy::BAN, $user) && $user->isBanned()), + + Action::make('delete_threads') + ->action(function (User $user) { + DeleteUserThreads::dispatchSync($user); + + Notification::make() + ->title($user->name.'\'s threads have been deleted.') + ->success() + ->send(); + }) + ->openUrlInNewTab() + ->color('danger') + ->icon('heroicon-s-archive-box-x-mark') + ->requiresConfirmation() + ->visible(fn (User $user): bool => auth()->user()->can(UserPolicy::DELETE, $user)), + + DeleteAction::make() + ->visible(fn (User $user): bool => auth()->user()->can(UserPolicy::DELETE, $user)), + ]), + ]) + ->toolbarActions([ + // + ]); + } +} diff --git a/app/Filament/Resources/Users/UserResource.php b/app/Filament/Resources/Users/UserResource.php new file mode 100644 index 000000000..34f784bfa --- /dev/null +++ b/app/Filament/Resources/Users/UserResource.php @@ -0,0 +1,39 @@ + ListUsers::route('/'), + ]; + } +} diff --git a/app/Filament/Widgets/ArticlesStatsOverview.php b/app/Filament/Widgets/ArticlesStatsOverview.php new file mode 100644 index 000000000..5fa88a3d9 --- /dev/null +++ b/app/Filament/Widgets/ArticlesStatsOverview.php @@ -0,0 +1,66 @@ +remember( + 'widgets:articles:total', + now()->addSeconds($cacheTtlSeconds), + fn () => Article::query()->count(), + ); + + $publishedTotal = cache()->remember( + 'widgets:articles:published:total', + now()->addSeconds($cacheTtlSeconds), + fn () => Article::query()->published()->count(), + ); + + $publishedWindow = cache()->remember( + "widgets:articles:published:{$window}", + now()->addSeconds($cacheTtlSeconds), + fn () => Article::query() + ->published() + ->where('submitted_at', '>=', now()->subDays($window)) + ->count(), + ); + + $awaiting = cache()->remember( + 'widgets:articles:awaiting', + now()->addSeconds(60), + fn () => Article::query()->awaitingApproval()->count(), + ); + + return [ + Stat::make('Articles', number_format($total)) + ->description('Total articles') + ->icon('heroicon-o-newspaper'), + + Stat::make('Published', number_format($publishedTotal)) + ->description('All-time approved') + ->color('success') + ->icon('heroicon-o-check-circle'), + + Stat::make("Published ({$window}d)", number_format($publishedWindow)) + ->description("Approved in last {$window} days") + ->color('info') + ->icon('heroicon-o-check-badge'), + + Stat::make('Awaiting Approval', number_format($awaiting)) + ->description('Submitted but not approved') + ->color('warning') + ->icon('heroicon-o-clock'), + ]; + } +} diff --git a/app/Filament/Widgets/ArticlesTrendChart.php b/app/Filament/Widgets/ArticlesTrendChart.php new file mode 100644 index 000000000..aa0da196c --- /dev/null +++ b/app/Filament/Widgets/ArticlesTrendChart.php @@ -0,0 +1,43 @@ +between( + start: now()->startOfYear(), + end: now()->endOfYear(), + ) + ->perMonth() + ->count(); + + return [ + 'datasets' => [ + [ + 'label' => 'Submitted', + 'data' => $data->map(fn (TrendValue $value) => $value->aggregate), + 'tension' => 0.35, + ], + ], + 'labels' => $data->map(fn (TrendValue $value) => Carbon::parse($value->date)->format('M Y')), + ]; + } +} diff --git a/app/Filament/Widgets/RepliesStatsOverview.php b/app/Filament/Widgets/RepliesStatsOverview.php new file mode 100644 index 000000000..53bd83156 --- /dev/null +++ b/app/Filament/Widgets/RepliesStatsOverview.php @@ -0,0 +1,52 @@ +remember( + 'widgets:replies:total', + now()->addSeconds($cacheTtlSeconds), + fn () => Reply::query()->count(), + ); + + $lastWindow = cache()->remember( + "widgets:replies:new:{$window}", + now()->addSeconds($cacheTtlSeconds), + fn () => Reply::query()->where('created_at', '>=', now()->subDays($window))->count(), + ); + + $solutions = cache()->remember( + 'widgets:replies:solutions', + now()->addSeconds($cacheTtlSeconds), + fn () => Reply::query()->isSolution()->count(), + ); + + return [ + Stat::make('Replies', number_format($total)) + ->description('Total replies') + ->icon('heroicon-o-chat-bubble-left-right'), + + Stat::make("New ({$window}d)", number_format($lastWindow)) + ->description("Replies in last {$window} days") + ->color('info') + ->icon('heroicon-o-chat-bubble-left-ellipsis'), + + Stat::make('Solutions', number_format($solutions)) + ->description('Marked as solution') + ->color('success') + ->icon('heroicon-o-sparkles'), + ]; + } +} diff --git a/app/Filament/Widgets/RepliesTrendChart.php b/app/Filament/Widgets/RepliesTrendChart.php new file mode 100644 index 000000000..3801b25fd --- /dev/null +++ b/app/Filament/Widgets/RepliesTrendChart.php @@ -0,0 +1,43 @@ +between( + start: now()->startOfYear(), + end: now()->endOfYear(), + ) + ->perMonth() + ->count(); + + return [ + 'datasets' => [ + [ + 'label' => 'Submitted', + 'data' => $data->map(fn (TrendValue $value) => $value->aggregate), + 'tension' => 0.35, + ], + ], + 'labels' => $data->map(fn (TrendValue $value) => Carbon::parse($value->date)->format('M Y')), + ]; + } +} diff --git a/app/Filament/Widgets/UsersStatsOverview.php b/app/Filament/Widgets/UsersStatsOverview.php new file mode 100644 index 000000000..a2617084d --- /dev/null +++ b/app/Filament/Widgets/UsersStatsOverview.php @@ -0,0 +1,53 @@ +remember( + 'widgets:users:total', + now()->addSeconds($cacheTtlSeconds), + fn () => User::query()->count(), + ); + + $lastWindow = cache()->remember( + "widgets:users:new:{$window}", + now()->addSeconds($cacheTtlSeconds), + fn () => User::query()->where('created_at', '>=', now()->subDays($window))->count(), + ); + + $verified = cache()->remember( + 'widgets:users:verified', + now()->addSeconds($cacheTtlSeconds), + fn () => User::query()->whereNotNull('author_verified_at')->count(), + ); + + return [ + Stat::make('Users', number_format($total)) + ->description('Total registered') + ->icon('heroicon-o-users'), + + Stat::make("New ({$window}d)", number_format($lastWindow)) + ->description("Joined in last {$window} days") + ->color('info') + ->icon('heroicon-o-user-plus'), + + Stat::make('Verified Authors', number_format($verified)) + ->description('Users verified as authors') + ->color('success') + ->icon('heroicon-o-check'), + ]; + } +} diff --git a/app/Filament/Widgets/UsersTrendChart.php b/app/Filament/Widgets/UsersTrendChart.php new file mode 100644 index 000000000..13189f4af --- /dev/null +++ b/app/Filament/Widgets/UsersTrendChart.php @@ -0,0 +1,43 @@ +between( + start: now()->startOfYear(), + end: now()->endOfYear(), + ) + ->perMonth() + ->count(); + + return [ + 'datasets' => [ + [ + 'label' => 'Submitted', + 'data' => $data->map(fn (TrendValue $value) => $value->aggregate), + 'tension' => 0.35, + ], + ], + 'labels' => $data->map(fn (TrendValue $value) => Carbon::parse($value->date)->format('M Y')), + ]; + } +} diff --git a/app/Http/Controllers/Admin/ArticlesController.php b/app/Http/Controllers/Admin/ArticlesController.php index a8433dc1f..8d928645e 100644 --- a/app/Http/Controllers/Admin/ArticlesController.php +++ b/app/Http/Controllers/Admin/ArticlesController.php @@ -9,10 +9,8 @@ use App\Jobs\DisapproveArticle; use App\Models\Article; use App\Policies\ArticlePolicy; -use App\Queries\SearchArticles; use Illuminate\Auth\Middleware\Authenticate; use Illuminate\Http\RedirectResponse; -use Illuminate\View\View; class ArticlesController extends Controller { @@ -21,19 +19,6 @@ public function __construct() $this->middleware([Authenticate::class, VerifyAdmins::class]); } - public function index(): View - { - if ($adminSearch = request('admin_search')) { - $articles = SearchArticles::get($adminSearch)->appends(['admin_search' => $adminSearch]); - } else { - $articles = Article::awaitingApproval() - ->orderByDesc('submitted_at') - ->paginate(); - } - - return view('admin.articles', compact('articles', 'adminSearch')); - } - public function approve(Article $article): RedirectResponse { $this->authorize(ArticlePolicy::APPROVE, $article); diff --git a/app/Http/Controllers/Admin/RepliesController.php b/app/Http/Controllers/Admin/RepliesController.php deleted file mode 100644 index 50f431a96..000000000 --- a/app/Http/Controllers/Admin/RepliesController.php +++ /dev/null @@ -1,21 +0,0 @@ -appends(['admin_search' => $adminSearch]); - } else { - $replies = Reply::with('replyAbleRelation')->orderByDesc('updated_at')->paginate(); - } - - return view('admin.replies', compact('replies', 'adminSearch')); - } -} diff --git a/app/Http/Controllers/Admin/UsersController.php b/app/Http/Controllers/Admin/UsersController.php index 9474ccb0b..e03c2ecf5 100644 --- a/app/Http/Controllers/Admin/UsersController.php +++ b/app/Http/Controllers/Admin/UsersController.php @@ -6,15 +6,12 @@ use App\Http\Middleware\VerifyAdmins; use App\Http\Requests\BanRequest; use App\Jobs\BanUser; -use App\Jobs\DeleteUser; use App\Jobs\DeleteUserThreads; use App\Jobs\UnbanUser; use App\Models\User; use App\Policies\UserPolicy; -use App\Queries\SearchUsers; use Illuminate\Auth\Middleware\Authenticate; use Illuminate\Http\RedirectResponse; -use Illuminate\View\View; class UsersController extends Controller { @@ -23,17 +20,6 @@ public function __construct() $this->middleware([Authenticate::class, VerifyAdmins::class]); } - public function index(): View - { - if ($adminSearch = request('admin_search')) { - $users = SearchUsers::get($adminSearch)->appends(['admin_search' => $adminSearch]); - } else { - $users = User::latest()->paginate(20); - } - - return view('admin.users', compact('users', 'adminSearch')); - } - public function ban(BanRequest $request, User $user): RedirectResponse { $this->authorize(UserPolicy::BAN, $user); @@ -59,26 +45,4 @@ public function unban(User $user): RedirectResponse return redirect()->route('profile', $user->username()); } - - public function delete(User $user): RedirectResponse - { - $this->authorize(UserPolicy::DELETE, $user); - - $this->dispatchSync(new DeleteUser($user)); - - $this->success($user->name().' was deleted and all of their content was removed!'); - - return redirect()->route('admin.users'); - } - - public function deleteThreads(User $user): RedirectResponse - { - $this->authorize(UserPolicy::DELETE, $user); - - $this->dispatchSync(new DeleteUserThreads($user)); - - $this->success($user->name().' threads were deleted!'); - - return redirect()->route('admin.users'); - } } diff --git a/app/Http/Controllers/Articles/ArticlesController.php b/app/Http/Controllers/Articles/ArticlesController.php index b876e4461..7a1757fc7 100644 --- a/app/Http/Controllers/Articles/ArticlesController.php +++ b/app/Http/Controllers/Articles/ArticlesController.php @@ -45,22 +45,20 @@ public function index(Request $request) ->latest('approved_at') ->{$filter}(); - $tags = Tag::whereHas('articles', function ($query) { - $query->published(); - })->orderBy('name')->get(); + $tags = Tag::whereHas('articles', fn ($query) => $query->published()) + ->orderBy('name') + ->get(); if ($activeTag = Tag::where('slug', $request->tag)->first()) { $articles->forTag($activeTag->slug()); } - $moderators = Cache::remember('moderators', now()->addMinutes(30), function () { - return User::moderators()->get(); - }); - $canonical = canonical('articles', ['filter' => $filter, 'tag' => $activeTag?->slug()]); - $topAuthors = Cache::remember('topAuthors', now()->addMinutes(30), function () { - return User::mostSubmissionsInLastDays(365)->take(5)->get(); - }); + $topAuthors = Cache::remember( + 'topAuthors', + now()->addMinutes(30), + fn () => User::mostSubmissionsInLastDays(365)->take(5)->get() + ); return view('articles.overview', [ 'pinnedArticles' => $pinnedArticles, @@ -68,7 +66,6 @@ public function index(Request $request) 'tags' => $tags, 'activeTag' => $activeTag, 'filter' => $filter, - 'moderators' => $moderators, 'canonical' => $canonical, 'topAuthors' => $topAuthors, ]); @@ -115,11 +112,13 @@ public function store(ArticleRequest $request) $article = Article::findByUuidOrFail($uuid); - $this->success( - $request->shouldBeSubmitted() - ? 'Thank you for submitting, unfortunately we can\'t accept every submission. You\'ll only hear back from us when we accept your article.' - : 'Article successfully created!' - ); + if ($article->isNotApproved()) { + $this->success( + $request->shouldBeSubmitted() + ? 'Thank you for submitting, unfortunately we can\'t accept every submission. You\'ll only hear back from us when we accept your article.' + : 'Article successfully created!' + ); + } return $request->wantsJson() ? ArticleResource::make($article) @@ -153,7 +152,7 @@ public function update(ArticleRequest $request, Article $article) $article = $article->fresh(); - if ($wasNotPreviouslySubmitted && $request->shouldBeSubmitted()) { + if ($wasNotPreviouslySubmitted && $request->shouldBeSubmitted() && $article->isNotApproved()) { $this->success('Thank you for submitting, unfortunately we can\'t accept every submission. You\'ll only hear back from us when we accept your article.'); } else { $this->success('Article successfully updated!'); diff --git a/app/Http/Controllers/Auth/GitHubController.php b/app/Http/Controllers/Auth/GitHubController.php index cb8fa20d0..5b5797605 100644 --- a/app/Http/Controllers/Auth/GitHubController.php +++ b/app/Http/Controllers/Auth/GitHubController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Auth; +use App\Actions\ConnectGitHubAccount; use App\Http\Controllers\Controller; use App\Jobs\UpdateProfile; use App\Models\User; @@ -28,7 +29,7 @@ public function redirectToProvider() /** * Obtain the user information from GitHub. */ - public function handleProviderCallback() + public function handleProviderCallback(ConnectGitHubAccount $connectGitHubAccount) { try { $socialiteUser = $this->getSocialiteUser(); @@ -42,6 +43,27 @@ public function handleProviderCallback() return $socialiteUser; } + $isConnectingAttempt = session()->pull('settings.github.connect.intended', false); + + if ($isConnectingAttempt) { + $currentUser = auth()->user(); + + // Check if the GitHub account is already connected to another user. + $existingUser = User::where('github_id', $socialiteUser->getId()) + ->where('id', '!=', $currentUser->id) + ->first(); + + if ($existingUser) { + $this->error('This GitHub account is already connected to another user.'); + } else { + $connectGitHubAccount($currentUser, $socialiteUser); + + $this->success('Your GitHub account has been connected.'); + } + + return redirect(route('settings.profile')); + } + try { $user = User::findByGitHubId($socialiteUser->getId()); } catch (ModelNotFoundException $exception) { diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 6627f6889..97d415547 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -5,12 +5,14 @@ use App\Http\Controllers\Controller; use App\Http\Requests\RegisterRequest; use App\Jobs\RegisterUser; +use App\Jobs\UpdateUserIdenticonStatus; use App\Models\User; use App\Providers\AppServiceProvider; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Middleware\RedirectIfAuthenticated; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Http\JsonResponse; +use Symfony\Component\Mailer\Exception\HttpTransportException; class RegisterController extends Controller { @@ -51,7 +53,11 @@ public function __construct() */ public function register(RegisterRequest $request) { - event(new Registered($user = $this->create($request))); + try { + event(new Registered($user = $this->create($request))); + } catch (HttpTransportException $e) { + // Failed to send email verification... + } session()->forget('githubData'); @@ -66,6 +72,10 @@ protected function create(RegisterRequest $request): User { $this->dispatchSync(RegisterUser::fromRequest($request)); - return User::findByEmailAddress($request->emailAddress()); + $user = User::findByEmailAddress($request->emailAddress()); + + $this->dispatch(new UpdateUserIdenticonStatus($user)); + + return $user; } } diff --git a/app/Http/Controllers/Forum/TagsController.php b/app/Http/Controllers/Forum/TagsController.php index 727688b05..a36af5906 100644 --- a/app/Http/Controllers/Forum/TagsController.php +++ b/app/Http/Controllers/Forum/TagsController.php @@ -7,6 +7,7 @@ use App\Models\Tag; use App\Models\Thread; use App\Models\User; +use Illuminate\Support\Facades\Cache; use Illuminate\View\View; class TagsController extends Controller @@ -35,8 +36,12 @@ public function show(Tag $tag): View } $tags = Tag::orderBy('name')->get(); - $topMembers = User::mostSolutionsInLastDays(365)->take(5)->get(); - $moderators = User::moderators()->get(); + $topMembers = Cache::remember('topMembers', now()->addHour(), function () { + return User::mostSolutionsInLastDays(365)->take(5)->get(); + }); + $moderators = Cache::remember('moderators', now()->addDay(), function () { + return User::moderators()->get(); + }); $canonical = canonical('forum.tag', [$tag->name, 'filter' => $filter]); return view('forum.overview', compact('threads', 'filter', 'tags', 'topMembers', 'moderators', 'canonical') + ['activeTag' => $tag]); diff --git a/app/Http/Controllers/Forum/ThreadsController.php b/app/Http/Controllers/Forum/ThreadsController.php index fdf9d76da..2ef0628bc 100644 --- a/app/Http/Controllers/Forum/ThreadsController.php +++ b/app/Http/Controllers/Forum/ThreadsController.php @@ -61,10 +61,10 @@ public function overview() } $tags = Tag::orderBy('name')->get(); - $topMembers = Cache::remember('topMembers', now()->addMinutes(30), function () { + $topMembers = Cache::remember('topMembers', now()->addHour(), function () { return User::mostSolutionsInLastDays(365)->take(5)->get(); }); - $moderators = Cache::remember('moderators', now()->addMinutes(30), function () { + $moderators = Cache::remember('moderators', now()->addDay(), function () { return User::moderators()->get(); }); $canonical = canonical('forum', ['filter' => $filter]); @@ -74,7 +74,7 @@ public function overview() public function show(Thread $thread) { - $moderators = Cache::remember('moderators', now()->addMinutes(30), function () { + $moderators = Cache::remember('moderators', now()->addDay(), function () { return User::moderators()->get(); }); @@ -140,7 +140,7 @@ public function delete(Request $request, Thread $thread): RedirectResponse $request->whenFilled('reason', function () use ($thread) { $thread->author()?->notify( - new ThreadDeletedNotification($thread, request('reason')), + new ThreadDeletedNotification($thread->subject(), request('reason')), ); }); diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 7fa9fdd22..269dcb9c1 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -13,43 +13,34 @@ class HomeController extends Controller { public function show() { - $communityMembers = Cache::remember('communityMembers', now()->addMinutes(5), function () { - return User::withCounts() - ->hasActivity() - ->notBanned() - ->inRandomOrder() - ->take(100) - ->get() - ->chunk(20); - }); + $communityMembers = Cache::remember( + 'communityMembers', + now()->addMinutes(5), + fn () => User::notBanned()->withAvatar()->inRandomOrder()->take(100)->get()->chunk(20) + ); - $totalUsers = Cache::remember('totalUsers', now()->addDay(), function () { - return number_format(User::notBanned()->count()); - }); + $totalUsers = Cache::remember('totalUsers', now()->addDay(), fn () => number_format(User::notBanned()->count())); - $totalThreads = Cache::remember('totalThreads', now()->addDay(), function () { - return number_format(Thread::count()); - }); + $totalThreads = Cache::remember('totalThreads', now()->addDay(), fn () => number_format(Thread::count())); - $totalReplies = Cache::remember('totalReplies', now()->addDay(), function () { - return number_format(Reply::count()); - }); + $totalReplies = Cache::remember('totalReplies', now()->addDay(), fn () => number_format(Reply::count())); - $latestThreads = Cache::remember('latestThreads', now()->addHour(), function () { - return Thread::whereNull('solution_reply_id') + $latestThreads = Cache::remember( + 'latestThreads', + now()->addHour(), + fn () => Thread::whereNull('solution_reply_id') ->whereBetween('threads.created_at', [now()->subMonth(), now()]) ->unlocked() ->inRandomOrder() ->limit(3) - ->get(); - }); + ->get() + ); - $latestArticles = Cache::remember('latestArticles', now()->addHour(), function () { - return Article::published() - ->recent() - ->limit(4) - ->get(); - }); + $latestArticles = Cache::remember( + 'latestArticles', + now()->addHour(), + fn () => Article::published()->recent()->limit(4)->get() + ); return view('home', [ 'communityMembers' => $communityMembers, diff --git a/app/Http/Controllers/Settings/GitHubAccountController.php b/app/Http/Controllers/Settings/GitHubAccountController.php new file mode 100644 index 000000000..8465b62f1 --- /dev/null +++ b/app/Http/Controllers/Settings/GitHubAccountController.php @@ -0,0 +1,40 @@ +middleware(Authenticate::class); + } + + public function connect(): RedirectResponse + { + session()->put('settings.github.connect.intended', true); + + return redirect(route('login.github')); + } + + public function disconnect(DisconnectGitHubAccount $disconnectGitHubAccount): RedirectResponse + { + $user = auth()->user(); + + if (! $user->password) { + $this->error('You must set a password before disconnecting your GitHub account, otherwise, you will not be able to log in again.'); + + return redirect(route('settings.profile')); + } + + $disconnectGitHubAccount($user); + + $this->success('Your GitHub account has been disconnected.'); + + return redirect(route('settings.profile')); + } +} diff --git a/app/Http/Requests/ArticleRequest.php b/app/Http/Requests/ArticleRequest.php index db953e8c9..0c2e5d470 100644 --- a/app/Http/Requests/ArticleRequest.php +++ b/app/Http/Requests/ArticleRequest.php @@ -5,6 +5,7 @@ use App\Models\User; use App\Rules\HttpImageRule; use Illuminate\Http\Concerns\InteractsWithInput; +use Illuminate\Validation\Rules\RequiredIf; class ArticleRequest extends Request { @@ -14,6 +15,7 @@ public function rules(): array { return [ 'title' => ['required', 'max:100'], + 'hero_image_id' => ['nullable', new RequiredIf(auth()->user()->isVerifiedAuthor())], 'body' => ['required', new HttpImageRule], 'tags' => 'array|nullable', 'tags.*' => 'exists:tags,id', @@ -58,4 +60,9 @@ public function shouldBeSubmitted(): bool { return $this->boolean('submitted'); } + + public function heroImageId(): ?string + { + return $this->get('hero_image_id'); + } } diff --git a/app/Jobs/BanUser.php b/app/Jobs/BanUser.php index 50f8288d1..b0fcb5a51 100644 --- a/app/Jobs/BanUser.php +++ b/app/Jobs/BanUser.php @@ -4,9 +4,13 @@ use App\Models\User; use Carbon\Carbon; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Foundation\Queue\Queueable; -final class BanUser +final class BanUser implements ShouldQueue { + use Queueable; + public function __construct(private User $user, private $reason) {} public function handle(): void diff --git a/app/Jobs/CreateArticle.php b/app/Jobs/CreateArticle.php index 840e7d0df..25b5236c7 100644 --- a/app/Jobs/CreateArticle.php +++ b/app/Jobs/CreateArticle.php @@ -20,6 +20,7 @@ public function __construct( private string $body, private User $author, private bool $shouldBeSubmitted, + private ?string $heroImageId = null, array $options = [] ) { $this->originalUrl = $options['original_url'] ?? null; @@ -34,6 +35,7 @@ public static function fromRequest(ArticleRequest $request, UuidInterface $uuid) $request->body(), $request->author(), $request->shouldBeSubmitted(), + $request->heroImageId(), [ 'original_url' => $request->originalUrl(), 'tags' => $request->tags(), @@ -46,16 +48,27 @@ public function handle(): void $article = new Article([ 'uuid' => $this->uuid->toString(), 'title' => $this->title, + 'hero_image_id' => $this->heroImageId, 'body' => $this->body, 'original_url' => $this->originalUrl, 'slug' => $this->title, 'submitted_at' => $this->shouldBeSubmitted ? now() : null, + 'approved_at' => $this->canBeAutoApproved() ? now() : null, ]); $article->authoredBy($this->author); $article->syncTags($this->tags); + if ($article->hero_image_id) { + SyncArticleImage::dispatch($article); + } + if ($article->isAwaitingApproval()) { event(new ArticleWasSubmittedForApproval($article)); } } + + private function canBeAutoApproved(): bool + { + return $this->shouldBeSubmitted && $this->author->canVerifiedAuthorPublishMoreArticlesToday(); + } } diff --git a/app/Jobs/DeleteUserThreads.php b/app/Jobs/DeleteUserThreads.php index 445b9dc4f..33dec1176 100644 --- a/app/Jobs/DeleteUserThreads.php +++ b/app/Jobs/DeleteUserThreads.php @@ -3,9 +3,13 @@ namespace App\Jobs; use App\Models\User; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Foundation\Queue\Queueable; -final class DeleteUserThreads +final class DeleteUserThreads implements ShouldQueue { + use Queueable; + public function __construct(private User $user) {} public function handle(): void diff --git a/app/Jobs/SyncArticleImage.php b/app/Jobs/SyncArticleImage.php new file mode 100644 index 000000000..97405cdd5 --- /dev/null +++ b/app/Jobs/SyncArticleImage.php @@ -0,0 +1,60 @@ +fetchUnsplashImageDataFromId($this->article); + + if (! is_null($imageData)) { + $this->article->hero_image_url = $imageData['image_url']; + $this->article->hero_image_author_name = $imageData['author_name']; + $this->article->hero_image_author_url = $imageData['author_url']; + $this->article->save(); + } + } + + protected function fetchUnsplashImageDataFromId(Article $article): ?array + { + $response = Http::retry(3, 100, throw: false) + ->withToken(config('services.unsplash.access_key'), 'Client-ID') + ->get("https://api.unsplash.com/photos/{$article->hero_image_id}"); + + if ($response->failed()) { + $article->hero_image_id = null; + $article->save(); + + return null; + } + + $response = $response->json(); + + // Trigger as Unsplash download... + Http::retry(3, 100, throw: false) + ->withToken(config('services.unsplash.access_key'), 'Client-ID') + ->get($response['links']['download_location']); + + return [ + 'image_url' => $response['urls']['raw'], + 'author_name' => $response['user']['name'], + 'author_url' => $response['user']['links']['html'], + ]; + } +} diff --git a/app/Jobs/UnVerifyAuthor.php b/app/Jobs/UnVerifyAuthor.php new file mode 100644 index 000000000..9ab35b19c --- /dev/null +++ b/app/Jobs/UnVerifyAuthor.php @@ -0,0 +1,29 @@ +user->author_verified_at = null; + $this->user->save(); + } +} diff --git a/app/Jobs/UnbanUser.php b/app/Jobs/UnbanUser.php index 49b1bdfb7..8e3173d45 100644 --- a/app/Jobs/UnbanUser.php +++ b/app/Jobs/UnbanUser.php @@ -3,9 +3,13 @@ namespace App\Jobs; use App\Models\User; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Foundation\Queue\Queueable; -final class UnbanUser +final class UnbanUser implements ShouldQueue { + use Queueable; + public function __construct(private User $user) {} public function handle(): void diff --git a/app/Jobs/UpdateArticle.php b/app/Jobs/UpdateArticle.php index 7a62c245d..a73d03f14 100644 --- a/app/Jobs/UpdateArticle.php +++ b/app/Jobs/UpdateArticle.php @@ -17,6 +17,7 @@ public function __construct( private string $title, private string $body, private bool $shouldBeSubmitted, + private ?string $heroImageId = null, array $options = [] ) { $this->originalUrl = $options['original_url'] ?? null; @@ -30,6 +31,7 @@ public static function fromRequest(Article $article, ArticleRequest $request): s $request->title(), $request->body(), $request->shouldBeSubmitted(), + $request->heroImageId(), [ 'original_url' => $request->originalUrl(), 'tags' => $request->tags(), @@ -39,25 +41,40 @@ public static function fromRequest(Article $article, ArticleRequest $request): s public function handle(): void { + $originalImage = $this->article->hero_image_id; + $this->article->update([ 'title' => $this->title, 'body' => $this->body, + 'hero_image_id' => $this->heroImageId, 'original_url' => $this->originalUrl, 'slug' => $this->title, ]); if ($this->shouldUpdateSubmittedAt()) { $this->article->submitted_at = now(); + $this->article->approved_at = $this->canBeAutoApproved() ? now() : null; $this->article->save(); - event(new ArticleWasSubmittedForApproval($this->article)); + if ($this->article->isAwaitingApproval()) { + event(new ArticleWasSubmittedForApproval($this->article)); + } } $this->article->syncTags($this->tags); + + if ($this->article->hero_image_id !== $originalImage) { + SyncArticleImage::dispatch($this->article); + } } private function shouldUpdateSubmittedAt(): bool { return $this->shouldBeSubmitted && $this->article->isNotSubmitted(); } + + private function canBeAutoApproved(): bool + { + return $this->article->author()->canVerifiedAuthorPublishMoreArticlesToday(); + } } diff --git a/app/Jobs/UpdateUserIdenticonStatus.php b/app/Jobs/UpdateUserIdenticonStatus.php new file mode 100644 index 000000000..f0bc399fd --- /dev/null +++ b/app/Jobs/UpdateUserIdenticonStatus.php @@ -0,0 +1,27 @@ +hasIdenticon($this->user->githubId()); + + User::withoutSyncingToSearch(function () use ($hasIdenticon) { + $this->user->update(['github_has_identicon' => $hasIdenticon]); + }); + } +} diff --git a/app/Jobs/VerifyAuthor.php b/app/Jobs/VerifyAuthor.php new file mode 100644 index 000000000..6ffc319a3 --- /dev/null +++ b/app/Jobs/VerifyAuthor.php @@ -0,0 +1,29 @@ +user->author_verified_at = now(); + $this->user->save(); + } +} diff --git a/app/Livewire/Likes.php b/app/Livewire/Likes.php index 1aca23a4e..fbc583b3e 100644 --- a/app/Livewire/Likes.php +++ b/app/Livewire/Likes.php @@ -33,7 +33,7 @@ public function mount($subject): void public function getLikers(): array { - $likers = $this->subject->likersRelation()->limit($this->limit + 1)->pluck('username')->toArray(); + $likers = $this->subject->likes()->slice($this->limit + 1)->pluck('username')->toArray(); if (auth()->check() && in_array($authUsername = auth()->user()->username, $likers)) { $likers = array_diff($likers, [$authUsername]); diff --git a/app/Livewire/Notifications.php b/app/Livewire/UserNotifications.php similarity index 92% rename from app/Livewire/Notifications.php rename to app/Livewire/UserNotifications.php index e86e8235e..9badf6f48 100644 --- a/app/Livewire/Notifications.php +++ b/app/Livewire/UserNotifications.php @@ -10,7 +10,7 @@ use Livewire\Component; use Livewire\WithPagination; -final class Notifications extends Component +final class UserNotifications extends Component { use AuthorizesRequests; use WithPagination; @@ -22,7 +22,7 @@ public function render(): View $notifications = Auth::user()->unreadNotifications()->paginate(10); $lastPage = count($notifications) == 0 ? $notifications->lastPage() : null; - return view('livewire.notifications', [ + return view('livewire.user-notifications', [ 'notifications' => Auth::user()->unreadNotifications()->paginate(10, ['*'], 'page', $lastPage), ]); } diff --git a/app/Mail/ArticleApprovedEmail.php b/app/Mail/ArticleApprovedEmail.php index a8e1bef07..4994073a4 100644 --- a/app/Mail/ArticleApprovedEmail.php +++ b/app/Mail/ArticleApprovedEmail.php @@ -2,12 +2,11 @@ namespace App\Mail; -use App\Models\Article; use Illuminate\Mail\Mailable; final class ArticleApprovedEmail extends Mailable { - public function __construct(public Article $article) {} + public function __construct(public string $title, public string $slug) {} public function build() { diff --git a/app/Mail/NewReplyEmail.php b/app/Mail/NewReplyEmail.php index 2cfd6c670..a1f04adf8 100644 --- a/app/Mail/NewReplyEmail.php +++ b/app/Mail/NewReplyEmail.php @@ -10,6 +10,8 @@ final class NewReplyEmail extends Mailable { + public bool $deleteWhenMissingModels = true; + public Thread $thread; public function __construct( diff --git a/app/Mail/ThreadDeletedEmail.php b/app/Mail/ThreadDeletedEmail.php index 10460fef4..5b58bb20e 100644 --- a/app/Mail/ThreadDeletedEmail.php +++ b/app/Mail/ThreadDeletedEmail.php @@ -2,12 +2,11 @@ namespace App\Mail; -use App\Models\Thread; use Illuminate\Mail\Mailable; final class ThreadDeletedEmail extends Mailable { - public function __construct(public Thread $thread, public string $reason) {} + public function __construct(public string $threadSubject, public string $reason) {} public function build() { diff --git a/app/Markdown/MarkdownServiceProvider.php b/app/Markdown/MarkdownServiceProvider.php index 0244f35c4..fa6b239e6 100644 --- a/app/Markdown/MarkdownServiceProvider.php +++ b/app/Markdown/MarkdownServiceProvider.php @@ -2,6 +2,11 @@ namespace App\Markdown; +use App\Crawler; +use App\EmbedExtension; +use App\OscaroteroEmbedAdapter; +use Embed\Embed; +use Embed\Http\CurlClient; use Illuminate\Support\ServiceProvider; use League\CommonMark\Environment\Environment; use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; @@ -15,6 +20,14 @@ class MarkdownServiceProvider extends ServiceProvider public function register(): void { $this->app->singleton(Converter::class, function ($app, array $params = []) { + $client = new CurlClient; + $client->setSettings([ + // 'follow_location' => false, + // 'ignored_errors' => true, + ]); + + $embed = new Embed(new Crawler($client)); + $environment = new Environment([ 'html_input' => 'escape', 'max_nesting_level' => 10, @@ -31,12 +44,20 @@ public function register(): void 'open_in_new_window' => true, 'nofollow' => ($params['nofollow'] ?? true) ? 'external' : '', ], + 'embed' => [ + // 'adapter' => new OscaroteroEmbedAdapter, + 'adapter' => new OscaroteroEmbedAdapter($embed), + // 'allowed_domains' => ['youtube.com'], + 'allowed_domains' => ['youtube.com', 'twitter.com', 'x.com'], + 'fallback' => 'link', + ], ]); $environment->addExtension(new CommonMarkCoreExtension); $environment->addExtension(new GithubFlavoredMarkdownExtension); $environment->addExtension(new MentionExtension); $environment->addExtension(new ExternalLinkExtension); + $environment->addExtension(new EmbedExtension); return new LeagueConverter(new MarkdownConverter($environment)); }); diff --git a/app/Models/Article.php b/app/Models/Article.php index 475466893..ad6aad1da 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -100,7 +100,7 @@ public function body(): string public function excerpt(int $limit = 100): string { - return Str::limit(strip_tags(md_to_html($this->body(), false)), $limit); + return Str::limit(strip_tags(md_to_html($this->body())), $limit); } public function hasHeroImageAuthor(): bool diff --git a/app/Models/Thread.php b/app/Models/Thread.php index 1d19a39bb..c06c84956 100644 --- a/app/Models/Thread.php +++ b/app/Models/Thread.php @@ -294,11 +294,8 @@ public static function feedByTagQuery(Tag $tag): Builder */ public static function feedQuery(): Builder { - return self::withOnly([ - 'tagsRelation', - 'authorRelation', - ]) - ->withCount(['repliesRelation as reply_count', 'likesRelation as like_count']) + return self::query() + ->select('threads.*') ->latest('last_activity_at'); } diff --git a/app/Models/User.php b/app/Models/User.php index cda596775..87e841cfc 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -5,19 +5,23 @@ use App\Concerns\HasTimestamps; use App\Concerns\PreparesSearch; use App\Enums\NotificationType; +use App\Policies\UserPolicy; use Carbon\Carbon; +use Filament\Models\Contracts\FilamentUser; +use Filament\Panel; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Query\JoinClause; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Auth; use Laravel\Sanctum\HasApiTokens; use Laravel\Scout\Searchable; -final class User extends Authenticatable implements MustVerifyEmail +final class User extends Authenticatable implements FilamentUser, MustVerifyEmail { use HasApiTokens; use HasFactory; @@ -57,6 +61,7 @@ final class User extends Authenticatable implements MustVerifyEmail 'remember_token', 'bio', 'banned_reason', + 'github_has_identicon', ]; /** @@ -73,6 +78,8 @@ protected function casts(): array { return [ 'allowed_notifications' => 'array', + 'author_verified_at' => 'datetime', + 'github_has_identicon' => 'boolean', ]; } @@ -101,11 +108,26 @@ public function bio(): string return $this->bio; } + public function githubId(): ?string + { + return $this->github_id; + } + public function githubUsername(): string { return $this->github_username ?? ''; } + public function hasConnectedGitHubAccount(): bool + { + return ! is_null($this->githubId()); + } + + public function hasIdenticon(): bool + { + return (bool) $this->github_has_identicon; + } + public function twitter(): ?string { return $this->twitter; @@ -151,6 +173,11 @@ public function type(): int return (int) $this->type; } + public function isRegularUser(): bool + { + return $this->type() === self::DEFAULT; + } + public function isModerator(): bool { return $this->type() === self::MODERATOR; @@ -300,6 +327,28 @@ public function delete() parent::delete(); } + public function isVerifiedAuthor(): bool + { + return ! is_null($this->author_verified_at) || $this->isAdmin(); + } + + public function canVerifiedAuthorPublishMoreArticlesToday(): bool + { + if ($this->isAdmin()) { + return true; + } + + if (! $this->isVerifiedAuthor()) { + return false; + } + + $publishedTodayCount = $this->articles() + ->whereDate('submitted_at', today()) + ->count(); + + return $publishedTodayCount < 2; + } + public function countSolutions(): int { return $this->replyAble()->isSolution()->count(); @@ -307,32 +356,42 @@ public function countSolutions(): int public function scopeMostSolutions(Builder $query, ?int $inLastDays = null) { - return $query->withCount(['replyAble as solutions_count' => function ($query) use ($inLastDays) { - $query->where('replyable_type', 'threads') - ->join('threads', function ($join) { - $join->on('threads.solution_reply_id', '=', 'replies.id') - ->on('threads.author_id', '!=', 'replies.author_id'); - }); - - if ($inLastDays) { - $query->where('replies.created_at', '>', now()->subDays($inLastDays)); - } - - return $query; - }]) + return $query + ->selectRaw('users.*, COUNT(DISTINCT replies.id) AS solutions_count') + ->join('replies', 'replies.author_id', '=', 'users.id') + ->join('threads', function (JoinClause $join) { + $join->on('threads.solution_reply_id', '=', 'replies.id') + ->on('threads.author_id', '!=', 'replies.author_id'); + }) + ->where(function ($query) use ($inLastDays) { + $query->where('replyable_type', 'threads'); + + if ($inLastDays) { + $query->where('replies.created_at', '>', now()->subDays($inLastDays)); + } + + return $query; + }) + ->groupBy('users.id') ->having('solutions_count', '>', 0) ->orderBy('solutions_count', 'desc'); } public function scopeMostSubmissions(Builder $query, ?int $inLastDays = null) { - return $query->withCount(['articles as articles_count' => function ($query) use ($inLastDays) { - if ($inLastDays) { - $query->where('articles.approved_at', '>', now()->subDays($inLastDays)); - } + return $query + ->selectRaw('users.*, COUNT(DISTINCT articles.id) AS articles_count') + ->join('articles', 'articles.author_id', '=', 'users.id') + ->where(function ($query) use ($inLastDays) { + if ($inLastDays) { + $query->where('articles.approved_at', '>', now()->subDays($inLastDays)); + } - return $query; - }])->orderBy('articles_count', 'desc'); + return $query; + }) + ->groupBy('users.id') + ->having('articles_count', '>', 0) + ->orderBy('articles_count', 'desc'); } public function scopeMostSolutionsInLastDays(Builder $query, int $days) @@ -359,26 +418,6 @@ public function toSearchableArray(): array ]; } - public function scopeWithCounts(Builder $query) - { - return $query->withCount([ - 'threadsRelation as threads_count', - 'replyAble as replies_count', - 'replyAble as solutions_count' => function (Builder $query) { - return $query->join('threads', 'threads.solution_reply_id', '=', 'replies.id') - ->where('replyable_type', 'threads'); - }, - ]); - } - - public function scopeHasActivity(Builder $query) - { - return $query->where(function ($query) { - $query->has('threadsRelation') - ->orHas('replyAble'); - }); - } - public function scopeModerators(Builder $query) { return $query->whereIn('type', [ @@ -387,6 +426,11 @@ public function scopeModerators(Builder $query) ]); } + public function scopeWithAvatar(Builder $query) + { + return $query->where('github_has_identicon', false)->whereNotNull('github_id'); + } + public function scopeNotBanned(Builder $query) { return $query->whereNull('banned_at'); @@ -423,4 +467,9 @@ public function isNotificationAllowed(string $notification): bool return NotificationType::from($notificationType)->getClass() === $notification; }); } + + public function canAccessPanel(Panel $panel): bool + { + return $this->can(UserPolicy::ADMIN, User::class); + } } diff --git a/app/Notifications/ArticleApprovedNotification.php b/app/Notifications/ArticleApprovedNotification.php index 4174c3bde..1047b542d 100644 --- a/app/Notifications/ArticleApprovedNotification.php +++ b/app/Notifications/ArticleApprovedNotification.php @@ -22,7 +22,7 @@ public function via(User $user): array public function toMail(User $user): ArticleApprovedEmail { - return (new ArticleApprovedEmail($this->article)) + return (new ArticleApprovedEmail($this->article->title(), $this->article->slug())) ->to($user->emailAddress(), $user->name()); } diff --git a/app/Notifications/ArticleSubmitted.php b/app/Notifications/ArticleSubmitted.php index 28d11c72a..f049e819b 100644 --- a/app/Notifications/ArticleSubmitted.php +++ b/app/Notifications/ArticleSubmitted.php @@ -35,9 +35,17 @@ public function toTelegram($notifiable) private function content(): string { + if ($this->article->author()->isVerifiedAuthor()) { + $content = "*New Article Published by verified author!*\n\n"; + $content .= 'Title: '.$this->article->title()."\n"; + $content .= 'By: '.$this->article->author()->username(); + + return $content; + } + $content = "*New Article Submitted!*\n\n"; $content .= 'Title: '.$this->article->title()."\n"; - $content .= 'By: @'.$this->article->author()->username(); + $content .= 'By: '.$this->article->author()->username(); return $content; } diff --git a/app/Notifications/ThreadDeletedNotification.php b/app/Notifications/ThreadDeletedNotification.php index 9ee40f690..5d6379761 100644 --- a/app/Notifications/ThreadDeletedNotification.php +++ b/app/Notifications/ThreadDeletedNotification.php @@ -3,7 +3,6 @@ namespace App\Notifications; use App\Mail\ThreadDeletedEmail; -use App\Models\Thread; use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; @@ -13,7 +12,7 @@ class ThreadDeletedNotification extends Notification implements ShouldQueue { use Queueable; - public function __construct(public Thread $thread, public ?string $reason = null) {} + public function __construct(public string $threadSubject, public ?string $reason = null) {} public function via($notifiable): array { @@ -22,7 +21,7 @@ public function via($notifiable): array public function toMail(User $user): ThreadDeletedEmail { - return (new ThreadDeletedEmail($this->thread, $this->reason)) + return (new ThreadDeletedEmail($this->threadSubject, $this->reason)) ->to($user->emailAddress(), $user->name()); } } diff --git a/app/OscaroteroEmbedAdapter.php b/app/OscaroteroEmbedAdapter.php new file mode 100644 index 000000000..72b43f3ee --- /dev/null +++ b/app/OscaroteroEmbedAdapter.php @@ -0,0 +1,42 @@ +embedLib = $embed; + } + + /** + * {@inheritDoc} + */ + public function updateEmbeds(array $embeds): void + { + $urls = \array_map(static fn (Embed $embed) => $embed->getUrl(), $embeds); + + $extractors = $this->embedLib->getMulti(...$urls); + + foreach ($extractors as $i => $extractor) { + if ($extractor->code !== null) { + $embeds[$i]->setEmbedCode($extractor->code->html); + } + } + } +} diff --git a/app/Policies/ArticlePolicy.php b/app/Policies/ArticlePolicy.php index 96e71c912..7ddde4e23 100644 --- a/app/Policies/ArticlePolicy.php +++ b/app/Policies/ArticlePolicy.php @@ -28,7 +28,7 @@ public function update(User $user, Article $article): bool public function delete(User $user, Article $article): bool { - return $article->isAuthoredBy($user) || $user->isModerator() || $user->isAdmin(); + return ($article->isAuthoredBy($user) && ! $article->isSponsored()) || $user->isModerator() || $user->isAdmin(); } public function approve(User $user, Article $article): bool diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 519a218ec..d01f52908 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -21,13 +21,16 @@ public function admin(User $user): bool public function ban(User $user, User $subject): bool { - return ($user->isAdmin() && ! $subject->isAdmin()) || - ($user->isModerator() && ! $subject->isAdmin() && ! $subject->isModerator()); + if ($subject->isAdmin()) { + return false; + } + + return $user->isAdmin() || ($user->isModerator() && ! $subject->isModerator()); } public function block(User $user, User $subject): bool { - return ! $user->is($subject) && ! $subject->isModerator() && ! $subject->isAdmin(); + return ! $user->is($subject) && $subject->isRegularUser(); } public function delete(User $user, User $subject): bool diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php new file mode 100644 index 000000000..1e60cae2e --- /dev/null +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -0,0 +1,79 @@ +default() + ->id('admin') + ->path('admin') + ->login() + ->colors([ + 'primary' => '#18bc9c', + ]) + ->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources') + ->discoverPages(in: app_path('Filament/Pages'), for: 'App\Filament\Pages') + ->pages([ + Dashboard::class, + ]) + ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets') + ->widgets([ + ArticlesStatsOverview::class, + UsersStatsOverview::class, + RepliesStatsOverview::class, + ArticlesTrendChart::class, + UsersTrendChart::class, + RepliesTrendChart::class, + ]) + ->middleware([ + EncryptCookies::class, + AddQueuedCookiesToResponse::class, + StartSession::class, + AuthenticateSession::class, + ShareErrorsFromSession::class, + VerifyCsrfToken::class, + SubstituteBindings::class, + DisableBladeIconComponents::class, + DispatchServingFilamentEvent::class, + ]) + ->authMiddleware([ + Authenticate::class, + ]) + ->userMenuItems([ + Action::make('Horizon') + ->url(fn (): string => route('horizon.index')) + ->icon('heroicon-o-presentation-chart-bar') + ->openUrlInNewTab(), + ]) + ->brandLogo(asset('images/laravelio-logo.svg')) + ->homeUrl('/') + ->unsavedChangesAlerts() + ->globalSearch(false) + ->topNavigation() + ->spa(); + } +} diff --git a/app/Social/GithubUserApi.php b/app/Social/GithubUserApi.php index e7580ca21..66aec97a6 100644 --- a/app/Social/GithubUserApi.php +++ b/app/Social/GithubUserApi.php @@ -5,7 +5,7 @@ use Illuminate\Http\Client\ConnectionException; use Illuminate\Support\Facades\Http; -class GithubUserApi +final class GithubUserApi { public function find(int|string $id): ?GitHubUser { @@ -14,4 +14,22 @@ public function find(int|string $id): ?GitHubUser return $response->failed() ? null : new GitHubUser($response->json()); } + + public function hasIdenticon(int|string $id): bool + { + $response = Http::retry(3, 300, fn ($exception) => $exception instanceof ConnectionException) + ->get("https://avatars.githubusercontent.com/u/{$id}?v=4&s=40"); + + if ($response->failed()) { + return true; + } + + if (! $info = getimagesizefromstring($response->body())) { + return true; + } + + [$width, $height] = $info; + + return $width === 420 && $height === 420; + } } diff --git a/bootstrap/providers.php b/bootstrap/providers.php index 7ad1b7b6b..e590a976d 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -1,6 +1,7 @@ =4.0", + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "ML\\IRI": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Markus Lanthaler", + "email": "mail@markus-lanthaler.com", + "homepage": "http://www.markus-lanthaler.com", + "role": "Developer" + } + ], + "description": "IRI handling for PHP", + "homepage": "http://www.markus-lanthaler.com", + "keywords": [ + "URN", + "iri", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/lanthaler/IRI/issues", + "source": "https://github.com/lanthaler/IRI/tree/master" + }, + "time": "2014-01-21T13:43:39+00:00" + }, + { + "name": "ml/json-ld", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/lanthaler/JsonLD.git", + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/537e68e87a6bce23e57c575cd5dcac1f67ce25d8", + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ml/iri": "^1.1.1", + "php": ">=5.3.0" + }, + "require-dev": { + "json-ld/tests": "1.0", + "phpunit/phpunit": "^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ML\\JsonLD\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Markus Lanthaler", + "email": "mail@markus-lanthaler.com", + "homepage": "http://www.markus-lanthaler.com", + "role": "Developer" + } + ], + "description": "JSON-LD Processor for PHP", + "homepage": "http://www.markus-lanthaler.com", + "keywords": [ + "JSON-LD", + "jsonld" + ], + "support": { + "issues": "https://github.com/lanthaler/JsonLD/issues", + "source": "https://github.com/lanthaler/JsonLD/tree/1.2.1" }, - "time": "2024-03-31T07:05:07+00:00" + "time": "2022-09-29T08:45:17+00:00" }, { "name": "monolog/monolog", @@ -4191,16 +5470,16 @@ }, { "name": "nesbot/carbon", - "version": "3.9.1", + "version": "3.10.3", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ced71f79398ece168e24f7f7710462f462310d4d" + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ced71f79398ece168e24f7f7710462f462310d4d", - "reference": "ced71f79398ece168e24f7f7710462f462310d4d", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", "shasum": "" }, "require": { @@ -4208,9 +5487,9 @@ "ext-json": "*", "php": "^8.1", "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", + "symfony/clock": "^6.3.12 || ^7.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -4218,14 +5497,13 @@ "require-dev": { "doctrine/dbal": "^3.6.3 || ^4.0", "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", + "friendsofphp/php-cs-fixer": "^v3.87.1", "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" }, "bin": [ "bin/carbon" @@ -4293,7 +5571,79 @@ "type": "tidelift" } ], - "time": "2025-05-01T19:51:51+00:00" + "time": "2025-09-06T13:39:36+00:00" + }, + { + "name": "nette/php-generator", + "version": "v4.2.0", + "source": { + "type": "git", + "url": "https://github.com/nette/php-generator.git", + "reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/php-generator/zipball/4707546a1f11badd72f5d82af4f8a6bc64bd56ac", + "reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0.6", + "php": "8.1 - 8.5" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/tester": "^2.4", + "nikic/php-parser": "^5.0", + "phpstan/phpstan-nette": "^2.0@stable", + "tracy/tracy": "^2.8" + }, + "suggest": { + "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.5 features.", + "homepage": "https://nette.org", + "keywords": [ + "code", + "nette", + "php", + "scaffolding" + ], + "support": { + "issues": "https://github.com/nette/php-generator/issues", + "source": "https://github.com/nette/php-generator/tree/v4.2.0" + }, + "time": "2025-08-06T18:24:31+00:00" }, { "name": "nette/schema", @@ -4359,29 +5709,29 @@ }, { "name": "nette/utils", - "version": "v4.0.6", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "ce708655043c7050eb050df361c5e313cf708309" + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309", - "reference": "ce708655043c7050eb050df361c5e313cf708309", + "url": "https://api.github.com/repos/nette/utils/zipball/c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede", "shasum": "" }, "require": { - "php": "8.0 - 8.4" + "php": "8.0 - 8.5" }, "conflict": { "nette/finder": "<3", "nette/schema": "<1.2.2" }, "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", + "jetbrains/phpstorm-attributes": "^1.2", "nette/tester": "^2.5", - "phpstan/phpstan": "^1.0", + "phpstan/phpstan-nette": "^2.0@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -4399,6 +5749,9 @@ } }, "autoload": { + "psr-4": { + "Nette\\": "src" + }, "classmap": [ "src/" ] @@ -4439,9 +5792,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.6" + "source": "https://github.com/nette/utils/tree/v4.0.8" }, - "time": "2025-03-30T21:06:30+00:00" + "time": "2025-08-06T21:43:34+00:00" }, { "name": "nicmart/tree", @@ -4499,16 +5852,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", "shasum": "" }, "require": { @@ -4527,7 +5880,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -4551,37 +5904,37 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-08-13T20:13:15+00:00" }, { "name": "nunomaduro/termwind", - "version": "v2.3.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda" + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda", - "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dfa08f390e509967a15c22493dc0bac5733d9123", + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^8.2", - "symfony/console": "^7.1.8" + "symfony/console": "^7.2.6" }, "require-dev": { - "illuminate/console": "^11.33.2", - "laravel/pint": "^1.18.2", + "illuminate/console": "^11.44.7", + "laravel/pint": "^1.22.0", "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0", - "phpstan/phpstan": "^1.12.11", - "phpstan/phpstan-strict-rules": "^1.6.1", - "symfony/var-dumper": "^7.1.8", + "pestphp/pest": "^2.36.0 || ^3.8.2", + "phpstan/phpstan": "^1.12.25", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.2.6", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -4624,7 +5977,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0" + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.1" }, "funding": [ { @@ -4640,7 +5993,7 @@ "type": "github" } ], - "time": "2024-11-21T10:39:51+00:00" + "time": "2025-05-08T08:14:37+00:00" }, { "name": "nyholm/psr7", @@ -4721,33 +6074,51 @@ "time": "2024-09-09T07:06:30+00:00" }, { - "name": "ohdearapp/ohdear-php-sdk", - "version": "3.10.3", + "name": "openspout/openspout", + "version": "v4.32.0", "source": { "type": "git", - "url": "https://github.com/ohdearapp/ohdear-php-sdk.git", - "reference": "8d9294927b08a70a3d402682b32b51a23eb4cfff" + "url": "https://github.com/openspout/openspout.git", + "reference": "41f045c1f632e1474e15d4c7bc3abcb4a153563d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ohdearapp/ohdear-php-sdk/zipball/8d9294927b08a70a3d402682b32b51a23eb4cfff", - "reference": "8d9294927b08a70a3d402682b32b51a23eb4cfff", + "url": "https://api.github.com/repos/openspout/openspout/zipball/41f045c1f632e1474e15d4c7bc3abcb4a153563d", + "reference": "41f045c1f632e1474e15d4c7bc3abcb4a153563d", "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^6.5.8|^7.8.1", - "php": "^8.1" + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-filter": "*", + "ext-libxml": "*", + "ext-xmlreader": "*", + "ext-zip": "*", + "php": "~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { - "laravel/pint": "^1.15.1", - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^2.34.7", - "vlucas/phpdotenv": "^5.6" + "ext-zlib": "*", + "friendsofphp/php-cs-fixer": "^3.86.0", + "infection/infection": "^0.31.2", + "phpbench/phpbench": "^1.4.1", + "phpstan/phpstan": "^2.1.22", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-strict-rules": "^2.0.6", + "phpunit/phpunit": "^12.3.7" + }, + "suggest": { + "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", + "ext-mbstring": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, "autoload": { "psr-4": { - "OhDear\\PhpSdk\\": "src" + "OpenSpout\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4756,46 +6127,120 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "support@ohdear.app", - "homepage": "https://ohdear.app", + "name": "Adrien Loison", + "email": "adrien@box.com" + } + ], + "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", + "homepage": "https://github.com/openspout/openspout", + "keywords": [ + "OOXML", + "csv", + "excel", + "memory", + "odf", + "ods", + "office", + "open", + "php", + "read", + "scale", + "spreadsheet", + "stream", + "write", + "xlsx" + ], + "support": { + "issues": "https://github.com/openspout/openspout/issues", + "source": "https://github.com/openspout/openspout/tree/v4.32.0" + }, + "funding": [ + { + "url": "https://paypal.me/filippotessarotto", + "type": "custom" + }, + { + "url": "https://github.com/Slamdunk", + "type": "github" + } + ], + "time": "2025-09-03T16:03:54+00:00" + }, + { + "name": "oscarotero/html-parser", + "version": "v0.1.8", + "source": { + "type": "git", + "url": "https://github.com/oscarotero/html-parser.git", + "reference": "10f3219267a365d9433f2f7d1694209c9d436c8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oscarotero/html-parser/zipball/10f3219267a365d9433f2f7d1694209c9d436c8d", + "reference": "10f3219267a365d9433f2f7d1694209c9d436c8d", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.11", + "phpunit/phpunit": "^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "HtmlParser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", "role": "Developer" } ], - "description": "An SDK to easily work with the Oh Dear API", - "homepage": "https://github.com/ohdearapp/ohdear-php-sdk", + "description": "Parse html strings to DOMDocument", + "homepage": "https://github.com/oscarotero/html-parser", "keywords": [ - "api", - "monitoring", - "oh dear", - "sdk" + "dom", + "html", + "parser" ], "support": { - "issues": "https://github.com/ohdearapp/ohdear-php-sdk/issues", - "source": "https://github.com/ohdearapp/ohdear-php-sdk/tree/3.10.3" + "email": "oom@oscarotero.com", + "issues": "https://github.com/oscarotero/html-parser/issues", + "source": "https://github.com/oscarotero/html-parser/tree/v0.1.8" }, - "time": "2024-12-18T20:57:38+00:00" + "time": "2023-11-29T20:28:41+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v3.0.0", + "version": "v3.1.3", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", - "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", "shasum": "" }, "require": { "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^9", - "vimeo/psalm": "^4|^5" + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" }, "type": "library", "autoload": { @@ -4841,7 +6286,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2024-05-08T12:36:18+00:00" + "time": "2025-09-24T15:06:41+00:00" }, { "name": "paragonie/random_compat", @@ -4895,16 +6340,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.3", + "version": "1.9.4", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", "shasum": "" }, "require": { @@ -4912,7 +6357,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" }, "type": "library", "extra": { @@ -4954,7 +6399,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" }, "funding": [ { @@ -4966,20 +6411,20 @@ "type": "tidelift" } ], - "time": "2024-07-20T21:41:07+00:00" + "time": "2025-08-21T11:53:16+00:00" }, { "name": "phpseclib/phpseclib", - "version": "3.0.43", + "version": "3.0.46", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02" + "reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/709ec107af3cb2f385b9617be72af8cf62441d02", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6", + "reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6", "shasum": "" }, "require": { @@ -5060,7 +6505,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.43" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.46" }, "funding": [ { @@ -5076,30 +6521,150 @@ "type": "tidelift" } ], - "time": "2024-12-14T21:12:59+00:00" + "time": "2025-06-26T16:29:55+00:00" + }, + { + "name": "pragmarx/google2fa", + "version": "v8.0.3", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", + "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.3" + }, + "time": "2024-09-05T11:56:40+00:00" + }, + { + "name": "pragmarx/google2fa-qrcode", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa-qrcode.git", + "reference": "c23ebcc3a50de0d1566016a6dd1486e183bb78e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/c23ebcc3a50de0d1566016a6dd1486e183bb78e1", + "reference": "c23ebcc3a50de0d1566016a6dd1486e183bb78e1", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "pragmarx/google2fa": "^4.0|^5.0|^6.0|^7.0|^8.0" + }, + "require-dev": { + "bacon/bacon-qr-code": "^2.0", + "chillerlan/php-qrcode": "^1.0|^2.0|^3.0|^4.0", + "khanamiryan/qrcode-detector-decoder": "^1.0", + "phpunit/phpunit": "~4|~5|~6|~7|~8|~9" + }, + "suggest": { + "bacon/bacon-qr-code": "For QR Code generation, requires imagick", + "chillerlan/php-qrcode": "For QR Code generation" + }, + "type": "library", + "extra": { + "component": "package", + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Google2FAQRCode\\": "src/", + "PragmaRX\\Google2FAQRCode\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "QR Code package for Google2FA", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa", + "qr code", + "qrcode" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa-qrcode/issues", + "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v3.0.1" + }, + "time": "2025-09-19T23:02:26+00:00" }, { "name": "predis/predis", - "version": "v2.4.0", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/predis/predis.git", - "reference": "f49e13ee3a2a825631562aa0223ac922ec5d058b" + "reference": "9e9deec4dfd3ebf65d32eb368f498c646ba2ecd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/f49e13ee3a2a825631562aa0223ac922ec5d058b", - "reference": "f49e13ee3a2a825631562aa0223ac922ec5d058b", + "url": "https://api.github.com/repos/predis/predis/zipball/9e9deec4dfd3ebf65d32eb368f498c646ba2ecd8", + "reference": "9e9deec4dfd3ebf65d32eb368f498c646ba2ecd8", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.0|^2.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.3", "phpstan/phpstan": "^1.9", "phpunit/phpcov": "^6.0 || ^8.0", - "phpunit/phpunit": "^8.0 || ^9.4" + "phpunit/phpunit": "^8.0 || ~9.4.4" }, "suggest": { "ext-relay": "Faster connection with in-memory caching (>=0.6.2)" @@ -5130,7 +6695,7 @@ ], "support": { "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v2.4.0" + "source": "https://github.com/predis/predis/tree/v3.2.0" }, "funding": [ { @@ -5138,7 +6703,7 @@ "type": "github" } ], - "time": "2025-04-30T15:16:02+00:00" + "time": "2025-08-06T06:41:24+00:00" }, { "name": "psr/clock", @@ -5554,16 +7119,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.7", + "version": "v0.12.10", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22", "shasum": "" }, "require": { @@ -5613,12 +7178,11 @@ "authors": [ { "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" + "email": "justin@justinhileman.info" } ], "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", + "homepage": "https://psysh.org", "keywords": [ "REPL", "console", @@ -5627,9 +7191,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.10" }, - "time": "2024-12-10T01:58:33+00:00" + "time": "2025-08-04T12:39:37+00:00" }, { "name": "ralouphie/getallheaders", @@ -5753,21 +7317,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.6", + "version": "4.9.1", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/81f941f6f729b1e3ceea61d9d014f8b6c6800440", + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", - "ext-json": "*", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -5775,26 +7338,23 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "captainhook/captainhook": "^5.10", + "captainhook/captainhook": "^5.25", "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -5814,96 +7374,242 @@ "src/functions.php" ], "psr-4": { - "Ramsey\\Uuid\\": "src/" + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.1" + }, + "time": "2025-09-04T20:59:21+00:00" + }, + { + "name": "riimu/kit-phpencoder", + "version": "v2.4.2", + "source": { + "type": "git", + "url": "https://github.com/Riimu/Kit-PHPEncoder.git", + "reference": "72ff7825de193b272e17b228394819dbfc638e72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Riimu/Kit-PHPEncoder/zipball/72ff7825de193b272e17b228394819dbfc638e72", + "reference": "72ff7825de193b272e17b228394819dbfc638e72", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Riimu\\Kit\\PHPEncoder\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Riikka Kalliomäki", + "email": "riikka.kalliomaki@gmail.com", + "homepage": "http://riimu.net" + } + ], + "description": "Highly customizable alternative to var_export for PHP code generation", + "homepage": "http://kit.riimu.net", + "keywords": [ + "code", + "encoder", + "export", + "generator", + "variable" + ], + "support": { + "issues": "https://github.com/Riimu/Kit-PHPEncoder/issues", + "source": "https://github.com/Riimu/Kit-PHPEncoder/tree/v2.4.2" + }, + "time": "2022-12-10T18:12:25+00:00" + }, + { + "name": "ryangjchandler/blade-capture-directive", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/ryangjchandler/blade-capture-directive.git", + "reference": "bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ryangjchandler/blade-capture-directive/zipball/bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d", + "reference": "bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0|^12.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9.2" + }, + "require-dev": { + "nunomaduro/collision": "^7.0|^8.0", + "nunomaduro/larastan": "^2.0|^3.0", + "orchestra/testbench": "^8.0|^9.0|^10.0", + "pestphp/pest": "^2.0|^3.7", + "pestphp/pest-plugin-laravel": "^2.0|^3.1", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.0|^2.0", + "phpunit/phpunit": "^10.0|^11.5.3", + "spatie/laravel-ray": "^1.26" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "BladeCaptureDirective": "RyanChandler\\BladeCaptureDirective\\Facades\\BladeCaptureDirective" + }, + "providers": [ + "RyanChandler\\BladeCaptureDirective\\BladeCaptureDirectiveServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "RyanChandler\\BladeCaptureDirective\\": "src", + "RyanChandler\\BladeCaptureDirective\\Database\\Factories\\": "database/factories" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "authors": [ + { + "name": "Ryan Chandler", + "email": "support@ryangjchandler.co.uk", + "role": "Developer" + } + ], + "description": "Create inline partials in your Blade templates with ease.", + "homepage": "https://github.com/ryangjchandler/blade-capture-directive", "keywords": [ - "guid", - "identifier", - "uuid" + "blade-capture-directive", + "laravel", + "ryangjchandler" ], "support": { - "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.6" + "issues": "https://github.com/ryangjchandler/blade-capture-directive/issues", + "source": "https://github.com/ryangjchandler/blade-capture-directive/tree/v1.1.0" }, "funding": [ { - "url": "https://github.com/ramsey", + "url": "https://github.com/ryangjchandler", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" } ], - "time": "2024-04-27T21:32:50+00:00" + "time": "2025-02-25T09:09:36+00:00" }, { - "name": "riimu/kit-phpencoder", - "version": "v2.4.2", + "name": "scrivo/highlight.php", + "version": "v9.18.1.10", "source": { "type": "git", - "url": "https://github.com/Riimu/Kit-PHPEncoder.git", - "reference": "72ff7825de193b272e17b228394819dbfc638e72" + "url": "https://github.com/scrivo/highlight.php.git", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Riimu/Kit-PHPEncoder/zipball/72ff7825de193b272e17b228394819dbfc638e72", - "reference": "72ff7825de193b272e17b228394819dbfc638e72", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/850f4b44697a2552e892ffe71490ba2733c2fc6e", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e", "shasum": "" }, "require": { - "php": ">=5.6.0" + "ext-json": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "sabberworm/php-css-parser": "^8.3", + "symfony/finder": "^2.8|^3.4|^5.4", + "symfony/var-dumper": "^2.8|^3.4|^5.4" + }, + "suggest": { + "ext-mbstring": "Allows highlighting code with unicode characters and supports language with unicode keywords" }, "type": "library", "autoload": { - "psr-4": { - "Riimu\\Kit\\PHPEncoder\\": "src/" + "files": [ + "HighlightUtilities/functions.php" + ], + "psr-0": { + "Highlight\\": "", + "HighlightUtilities\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Riikka Kalliomäki", - "email": "riikka.kalliomaki@gmail.com", - "homepage": "http://riimu.net" + "name": "Geert Bergman", + "homepage": "http://www.scrivo.org/", + "role": "Project Author" + }, + { + "name": "Vladimir Jimenez", + "homepage": "https://allejo.io", + "role": "Maintainer" + }, + { + "name": "Martin Folkers", + "homepage": "https://twobrain.io", + "role": "Contributor" } ], - "description": "Highly customizable alternative to var_export for PHP code generation", - "homepage": "http://kit.riimu.net", + "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", "keywords": [ "code", - "encoder", - "export", - "generator", - "variable" + "highlight", + "highlight.js", + "highlight.php", + "syntax" ], "support": { - "issues": "https://github.com/Riimu/Kit-PHPEncoder/issues", - "source": "https://github.com/Riimu/Kit-PHPEncoder/tree/v2.4.2" + "issues": "https://github.com/scrivo/highlight.php/issues", + "source": "https://github.com/scrivo/highlight.php" }, - "time": "2022-12-10T18:12:25+00:00" + "funding": [ + { + "url": "https://github.com/allejo", + "type": "github" + } + ], + "time": "2022-12-17T21:53:22+00:00" }, { "name": "sentry/sentry", - "version": "4.10.0", + "version": "4.16.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856" + "reference": "c5b086e4235762da175034bc463b0d31cbb38d2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/2af937d47d8aadb8dab0b1d7b9557e495dd12856", - "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/c5b086e4235762da175034bc463b0d31cbb38d2e", + "reference": "c5b086e4235762da175034bc463b0d31cbb38d2e", "shasum": "" }, "require": { @@ -5967,7 +7673,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.10.0" + "source": "https://github.com/getsentry/sentry-php/tree/4.16.0" }, "funding": [ { @@ -5979,27 +7685,27 @@ "type": "custom" } ], - "time": "2024-11-06T07:44:19+00:00" + "time": "2025-09-22T13:38:03+00:00" }, { "name": "sentry/sentry-laravel", - "version": "4.13.0", + "version": "4.17.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "d232ac494258e0d50a77c575a5af5f1a426d3f87" + "reference": "f321c450f1ff31fc97cf42c249de4a47d593d216" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/d232ac494258e0d50a77c575a5af5f1a426d3f87", - "reference": "d232ac494258e0d50a77c575a5af5f1a426d3f87", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/f321c450f1ff31fc97cf42c249de4a47d593d216", + "reference": "f321c450f1ff31fc97cf42c249de4a47d593d216", "shasum": "" }, "require": { "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", "nyholm/psr7": "^1.0", "php": "^7.2 | ^8.0", - "sentry/sentry": "^4.10", + "sentry/sentry": "^4.15.2", "symfony/psr-http-message-bridge": "^1.0 | ^2.0 | ^6.0 | ^7.0" }, "require-dev": { @@ -6056,7 +7762,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/4.13.0" + "source": "https://github.com/getsentry/sentry-laravel/tree/4.17.0" }, "funding": [ { @@ -6068,20 +7774,20 @@ "type": "custom" } ], - "time": "2025-02-18T10:09:29+00:00" + "time": "2025-10-15T09:58:47+00:00" }, { "name": "spatie/backtrace", - "version": "1.7.1", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "0f2477c520e3729de58e061b8192f161c99f770b" + "reference": "8c0f16a59ae35ec8c62d85c3c17585158f430110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b", - "reference": "0f2477c520e3729de58e061b8192f161c99f770b", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/8c0f16a59ae35ec8c62d85c3c17585158f430110", + "reference": "8c0f16a59ae35ec8c62d85c3c17585158f430110", "shasum": "" }, "require": { @@ -6119,7 +7825,8 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/backtrace/tree/1.7.1" + "issues": "https://github.com/spatie/backtrace/issues", + "source": "https://github.com/spatie/backtrace/tree/1.8.1" }, "funding": [ { @@ -6131,20 +7838,20 @@ "type": "other" } ], - "time": "2024-12-02T13:28:15+00:00" + "time": "2025-08-26T08:22:30+00:00" }, { "name": "spatie/browsershot", - "version": "5.0.8", + "version": "5.0.10", "source": { "type": "git", "url": "https://github.com/spatie/browsershot.git", - "reference": "0102971ae974022ec4a7a149e8924ea355b52cc3" + "reference": "9e5ae15487b3cdc3eb03318c1c8ac38971f60e58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/browsershot/zipball/0102971ae974022ec4a7a149e8924ea355b52cc3", - "reference": "0102971ae974022ec4a7a149e8924ea355b52cc3", + "url": "https://api.github.com/repos/spatie/browsershot/zipball/9e5ae15487b3cdc3eb03318c1c8ac38971f60e58", + "reference": "9e5ae15487b3cdc3eb03318c1c8ac38971f60e58", "shasum": "" }, "require": { @@ -6191,7 +7898,7 @@ "webpage" ], "support": { - "source": "https://github.com/spatie/browsershot/tree/5.0.8" + "source": "https://github.com/spatie/browsershot/tree/5.0.10" }, "funding": [ { @@ -6199,20 +7906,20 @@ "type": "github" } ], - "time": "2025-02-17T09:56:12+00:00" + "time": "2025-05-15T07:10:57+00:00" }, { "name": "spatie/crawler", - "version": "8.4.2", + "version": "8.4.3", "source": { "type": "git", "url": "https://github.com/spatie/crawler.git", - "reference": "4dc593040018885229dfc8df7cc4bf12cd470cf3" + "reference": "4f4c3ead439e7e57085c0b802bc4e5b44fb7d751" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/crawler/zipball/4dc593040018885229dfc8df7cc4bf12cd470cf3", - "reference": "4dc593040018885229dfc8df7cc4bf12cd470cf3", + "url": "https://api.github.com/repos/spatie/crawler/zipball/4f4c3ead439e7e57085c0b802bc4e5b44fb7d751", + "reference": "4f4c3ead439e7e57085c0b802bc4e5b44fb7d751", "shasum": "" }, "require": { @@ -6226,7 +7933,7 @@ "symfony/dom-crawler": "^6.0|^7.0" }, "require-dev": { - "pestphp/pest": "^2.0", + "pestphp/pest": "^2.0|^3.0", "spatie/ray": "^1.37" }, "type": "library", @@ -6255,7 +7962,7 @@ ], "support": { "issues": "https://github.com/spatie/crawler/issues", - "source": "https://github.com/spatie/crawler/tree/8.4.2" + "source": "https://github.com/spatie/crawler/tree/8.4.3" }, "funding": [ { @@ -6267,7 +7974,7 @@ "type": "github" } ], - "time": "2025-02-24T09:20:47+00:00" + "time": "2025-05-20T09:00:51+00:00" }, { "name": "spatie/error-solutions", @@ -6495,6 +8202,65 @@ ], "time": "2025-02-21T14:31:39+00:00" }, + { + "name": "spatie/invade", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/invade.git", + "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/invade/zipball/b920f6411d21df4e8610a138e2e87ae4957d7f63", + "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.20", + "phpstan/phpstan": "^1.4", + "spatie/ray": "^1.28" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Spatie\\Invade\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "A PHP function to work with private properties and methods", + "homepage": "https://github.com/spatie/invade", + "keywords": [ + "invade", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/invade/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-05-17T09:06:10+00:00" + }, { "name": "spatie/laravel-feed", "version": "4.4.2", @@ -6678,18 +8444,92 @@ ], "time": "2025-02-20T13:13:55+00:00" }, + { + "name": "spatie/laravel-mailcoach-mailer", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-mailcoach-mailer.git", + "reference": "0779aa2a2a8265de91e4a05221ed838a2fadb64a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-mailcoach-mailer/zipball/0779aa2a2a8265de91e4a05221ed838a2fadb64a", + "reference": "0779aa2a2a8265de91e4a05221ed838a2fadb64a", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.42|^10.0|^11.0|^12.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.13.7", + "spatie/mailcoach-mailer": "^1.2" + }, + "require-dev": { + "laravel/pint": "^1.2.1", + "nunomaduro/collision": "^6.3.1|^7.0|^8.0", + "orchestra/testbench": "^7.15|^8.0|^9.0|^10.0", + "pestphp/pest": "^1.22.2|^2.0|^3.7", + "pestphp/pest-plugin-laravel": "^1.3|^2.0|^3.1", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.2.2|^2.0", + "spatie/invade": "^1.1.1|^2.1", + "spatie/laravel-ray": "^1.31" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "MailcoachMailer": "Spatie\\MailcoachMailer\\Facades\\MailcoachMailer" + }, + "providers": [ + "Spatie\\MailcoachMailer\\MailcoachMailerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\MailcoachMailer\\": "src", + "Spatie\\MailcoachMailer\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "The driver for sending transactional mails using Mailcoach in Laravel", + "homepage": "https://github.com/spatie/laravel-mailcoach-mailer", + "keywords": [ + "laravel", + "laravel-mailcoach-mailer", + "mailcoach", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-mailcoach-mailer/issues", + "source": "https://github.com/spatie/laravel-mailcoach-mailer/tree/1.5.3" + }, + "time": "2025-04-08T07:33:25+00:00" + }, { "name": "spatie/laravel-package-tools", - "version": "1.92.4", + "version": "1.92.7", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "d20b1969f836d210459b78683d85c9cd5c5f508c" + "reference": "f09a799850b1ed765103a4f0b4355006360c49a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d20b1969f836d210459b78683d85c9cd5c5f508c", - "reference": "d20b1969f836d210459b78683d85c9cd5c5f508c", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5", + "reference": "f09a799850b1ed765103a4f0b4355006360c49a5", "shasum": "" }, "require": { @@ -6729,7 +8569,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.4" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.7" }, "funding": [ { @@ -6737,20 +8577,20 @@ "type": "github" } ], - "time": "2025-04-11T15:27:14+00:00" + "time": "2025-07-17T15:46:43+00:00" }, { "name": "spatie/laravel-schedule-monitor", - "version": "3.10.3", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-schedule-monitor.git", - "reference": "8731755b91d5d724a5bd2c7028e3d0c8c930e8a1" + "reference": "a1c2b8c671505c6ef502456d24d96b905b3f2601" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-schedule-monitor/zipball/8731755b91d5d724a5bd2c7028e3d0c8c930e8a1", - "reference": "8731755b91d5d724a5bd2c7028e3d0c8c930e8a1", + "url": "https://api.github.com/repos/spatie/laravel-schedule-monitor/zipball/a1c2b8c671505c6ef502456d24d96b905b3f2601", + "reference": "a1c2b8c671505c6ef502456d24d96b905b3f2601", "shasum": "" }, "require": { @@ -6763,7 +8603,6 @@ }, "require-dev": { "mockery/mockery": "^1.4", - "ohdearapp/ohdear-php-sdk": "^3.0", "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", "pestphp/pest": "^1.20|^2.34|^3.7", "pestphp/pest-plugin-laravel": "^1.2|^2.3|^3.1", @@ -6771,15 +8610,15 @@ "spatie/phpunit-snapshot-assertions": "^4.2|^5.1", "spatie/test-time": "^1.2" }, - "suggest": { - "ohdearapp/ohdear-php-sdk": "Needed to sync your schedule with Oh Dear" - }, "type": "library", "extra": { "laravel": { "providers": [ "Spatie\\ScheduleMonitor\\ScheduleMonitorServiceProvider" ] + }, + "branch-alias": { + "dev-ohdear-monitor": "4.0.x-dev" } }, "autoload": { @@ -6808,7 +8647,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-schedule-monitor/issues", - "source": "https://github.com/spatie/laravel-schedule-monitor/tree/3.10.3" + "source": "https://github.com/spatie/laravel-schedule-monitor/tree/4.1.0" }, "funding": [ { @@ -6816,20 +8655,20 @@ "type": "github" } ], - "time": "2025-02-21T19:56:48+00:00" + "time": "2025-09-11T09:03:31+00:00" }, { "name": "spatie/laravel-sitemap", - "version": "7.3.6", + "version": "7.3.7", "source": { "type": "git", "url": "https://github.com/spatie/laravel-sitemap.git", - "reference": "506b2acdd350c7ff868a7711b4f30e486b20e9b0" + "reference": "077b36c64bc4f373f4d95a1ac6ee1c0624acfdd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-sitemap/zipball/506b2acdd350c7ff868a7711b4f30e486b20e9b0", - "reference": "506b2acdd350c7ff868a7711b4f30e486b20e9b0", + "url": "https://api.github.com/repos/spatie/laravel-sitemap/zipball/077b36c64bc4f373f4d95a1ac6ee1c0624acfdd3", + "reference": "077b36c64bc4f373f4d95a1ac6ee1c0624acfdd3", "shasum": "" }, "require": { @@ -6881,7 +8720,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-sitemap/tree/7.3.6" + "source": "https://github.com/spatie/laravel-sitemap/tree/7.3.7" }, "funding": [ { @@ -6889,20 +8728,79 @@ "type": "custom" } ], - "time": "2025-04-10T12:13:41+00:00" + "time": "2025-08-25T08:07:09+00:00" + }, + { + "name": "spatie/mailcoach-mailer", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/mailcoach-mailer.git", + "reference": "46b9452332d2b127f2565f6a08288a9afb22866f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/mailcoach-mailer/zipball/46b9452332d2b127f2565f6a08288a9afb22866f", + "reference": "46b9452332d2b127f2565f6a08288a9afb22866f", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/http-client": "^6.0 || ^7.0", + "symfony/mailer": "^6.0 || ^7.0" + }, + "require-dev": { + "laravel/pint": "^1.2", + "pestphp/pest": "^1.20", + "spatie/ray": "^1.28" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Spatie\\MailcoachMailer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "The Mailcoach transport for Symfony Mailer", + "homepage": "https://mailcoach.app", + "keywords": [ + "mailcoach-mailer", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/mailcoach-mailer/issues", + "source": "https://github.com/spatie/mailcoach-mailer/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-12-09T15:05:12+00:00" }, { "name": "spatie/robots-txt", - "version": "2.3.1", + "version": "2.5.1", "source": { "type": "git", "url": "https://github.com/spatie/robots-txt.git", - "reference": "58ed7b61c2a59e72f57b46e4d025967dd5f16000" + "reference": "ef85dfaa48372c0a7fdfb144592f95de1a2e9b79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/robots-txt/zipball/58ed7b61c2a59e72f57b46e4d025967dd5f16000", - "reference": "58ed7b61c2a59e72f57b46e4d025967dd5f16000", + "url": "https://api.github.com/repos/spatie/robots-txt/zipball/ef85dfaa48372c0a7fdfb144592f95de1a2e9b79", + "reference": "ef85dfaa48372c0a7fdfb144592f95de1a2e9b79", "shasum": "" }, "require": { @@ -6937,7 +8835,7 @@ ], "support": { "issues": "https://github.com/spatie/robots-txt/issues", - "source": "https://github.com/spatie/robots-txt/tree/2.3.1" + "source": "https://github.com/spatie/robots-txt/tree/2.5.1" }, "funding": [ { @@ -6949,7 +8847,72 @@ "type": "github" } ], - "time": "2025-01-31T09:33:25+00:00" + "time": "2025-07-01T07:07:44+00:00" + }, + { + "name": "spatie/shiki-php", + "version": "2.3.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/shiki-php.git", + "reference": "a2e78a9ff8a1290b25d550be8fbf8285c13175c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/shiki-php/zipball/a2e78a9ff8a1290b25d550be8fbf8285c13175c5", + "reference": "a2e78a9ff8a1290b25d550be8fbf8285c13175c5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.0", + "symfony/process": "^5.4|^6.4|^7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v3.0", + "pestphp/pest": "^1.8", + "phpunit/phpunit": "^9.5", + "spatie/pest-plugin-snapshots": "^1.1", + "spatie/ray": "^1.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ShikiPhp\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rias Van der Veken", + "email": "rias@spatie.be", + "role": "Developer" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Highlight code using Shiki in PHP", + "homepage": "https://github.com/spatie/shiki-php", + "keywords": [ + "shiki", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/shiki-php/tree/2.3.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-02-21T14:16:57+00:00" }, { "name": "spatie/temporary-directory", @@ -7014,7 +8977,7 @@ }, { "name": "symfony/clock", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", @@ -7068,7 +9031,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" + "source": "https://github.com/symfony/clock/tree/v7.3.0" }, "funding": [ { @@ -7088,23 +9051,24 @@ }, { "name": "symfony/console", - "version": "v7.2.5", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88" + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88", + "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" + "symfony/string": "^7.2" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -7161,7 +9125,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.5" + "source": "https://github.com/symfony/console/tree/v7.3.4" }, "funding": [ { @@ -7172,16 +9136,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-12T08:11:12+00:00" + "time": "2025-09-22T15:31:00+00:00" }, { "name": "symfony/css-selector", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -7226,7 +9194,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" }, "funding": [ { @@ -7246,16 +9214,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -7268,7 +9236,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7293,7 +9261,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -7309,20 +9277,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.2.4", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "19cc7b08efe9ad1ab1b56e0948e8d02e15ed3ef7" + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/19cc7b08efe9ad1ab1b56e0948e8d02e15ed3ef7", - "reference": "19cc7b08efe9ad1ab1b56e0948e8d02e15ed3ef7", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/efa076ea0eeff504383ff0dcf827ea5ce15690ba", + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba", "shasum": "" }, "require": { @@ -7360,7 +9328,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.2.4" + "source": "https://github.com/symfony/dom-crawler/tree/v7.3.3" }, "funding": [ { @@ -7371,25 +9339,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-17T15:53:07+00:00" + "time": "2025-08-06T20:13:54+00:00" }, { "name": "symfony/error-handler", - "version": "v7.2.5", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b" + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", "shasum": "" }, "require": { @@ -7402,9 +9374,11 @@ "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -7435,7 +9409,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.2.5" + "source": "https://github.com/symfony/error-handler/tree/v7.3.4" }, "funding": [ { @@ -7446,25 +9420,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.2.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", "shasum": "" }, "require": { @@ -7515,7 +9493,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" }, "funding": [ { @@ -7526,25 +9504,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { @@ -7558,7 +9540,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7591,7 +9573,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -7607,20 +9589,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/finder", - "version": "v7.2.2", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", "shasum": "" }, "require": { @@ -7655,7 +9637,80 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.2.2" + "source": "https://github.com/symfony/finder/tree/v7.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/html-sanitizer", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/html-sanitizer.git", + "reference": "8740fc48979f649dee8b8fc51a2698e5c190bf12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/8740fc48979f649dee8b8fc51a2698e5c190bf12", + "reference": "8740fc48979f649dee8b8fc51a2698e5c190bf12", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "league/uri": "^6.5|^7.0", + "masterminds/html5": "^2.7.2", + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HtmlSanitizer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Titouan Galopin", + "email": "galopintitouan@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to sanitize untrusted HTML input for safe insertion into a document's DOM.", + "homepage": "https://symfony.com", + "keywords": [ + "Purifier", + "html", + "sanitizer" + ], + "support": { + "source": "https://github.com/symfony/html-sanitizer/tree/v7.3.3" }, "funding": [ { @@ -7666,25 +9721,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-30T19:00:17+00:00" + "time": "2025-08-12T10:34:03+00:00" }, { "name": "symfony/http-client", - "version": "v7.2.4", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6" + "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", + "url": "https://api.github.com/repos/symfony/http-client/zipball/4b62871a01c49457cf2a8e560af7ee8a94b87a62", + "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62", "shasum": "" }, "require": { @@ -7692,10 +9751,12 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", "symfony/service-contracts": "^2.5|^3" }, "conflict": { "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", "symfony/http-foundation": "<6.4" }, @@ -7708,7 +9769,6 @@ "require-dev": { "amphp/http-client": "^4.2.1|^5.0", "amphp/http-tunnel": "^1.0|^2.0", - "amphp/socket": "^1.1", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", @@ -7750,7 +9810,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.2.4" + "source": "https://github.com/symfony/http-client/tree/v7.3.4" }, "funding": [ { @@ -7761,25 +9821,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.5.2", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645" + "reference": "75d7043853a42837e68111812f4d964b01e5101c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", "shasum": "" }, "require": { @@ -7792,7 +9856,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7828,7 +9892,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" }, "funding": [ { @@ -7844,20 +9908,20 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:49:48+00:00" + "time": "2025-04-29T11:18:49+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.2.5", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126" + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/371272aeb6286f8135e028ca535f8e4d6f114126", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c061c7c18918b1b64268771aad04b40be41dd2e6", + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6", "shasum": "" }, "require": { @@ -7874,6 +9938,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -7906,7 +9971,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.4" }, "funding": [ { @@ -7917,25 +9982,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2025-09-16T08:38:17+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.5", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54" + "reference": "b796dffea7821f035047235e076b60ca2446e3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b1fe91bc1fa454a806d3f98db4ba826eb9941a54", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b796dffea7821f035047235e076b60ca2446e3cf", + "reference": "b796dffea7821f035047235e076b60ca2446e3cf", "shasum": "" }, "require": { @@ -7943,8 +10012,8 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -8020,7 +10089,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.4" }, "funding": [ { @@ -8031,25 +10100,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-28T13:32:50+00:00" + "time": "2025-09-27T12:32:17+00:00" }, { "name": "symfony/mailer", - "version": "v7.2.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3" + "reference": "ab97ef2f7acf0216955f5845484235113047a31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f3871b182c44997cf039f3b462af4a48fb85f9d3", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3", + "url": "https://api.github.com/repos/symfony/mailer/zipball/ab97ef2f7acf0216955f5845484235113047a31d", + "reference": "ab97ef2f7acf0216955f5845484235113047a31d", "shasum": "" }, "require": { @@ -8100,7 +10173,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.2.3" + "source": "https://github.com/symfony/mailer/tree/v7.3.4" }, "funding": [ { @@ -8111,25 +10184,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T11:08:17+00:00" + "time": "2025-09-17T05:51:54+00:00" }, { "name": "symfony/mailgun-mailer", - "version": "v7.2.0", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "3c1dfd9ff0a487a4116baec42d11ae21a061e3f1" + "reference": "8c18f2bff4e70ed5669ab8228302edd2fecd689b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/3c1dfd9ff0a487a4116baec42d11ae21a061e3f1", - "reference": "3c1dfd9ff0a487a4116baec42d11ae21a061e3f1", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/8c18f2bff4e70ed5669ab8228302edd2fecd689b", + "reference": "8c18f2bff4e70ed5669ab8228302edd2fecd689b", "shasum": "" }, "require": { @@ -8169,7 +10246,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v7.2.0" + "source": "https://github.com/symfony/mailgun-mailer/tree/v7.3.1" }, "funding": [ { @@ -8185,20 +10262,20 @@ "type": "tidelift" } ], - "time": "2024-09-28T08:24:38+00:00" + "time": "2025-06-20T16:15:52+00:00" }, { "name": "symfony/mime", - "version": "v7.2.4", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b" + "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/87ca22046b78c3feaff04b337f33b38510fd686b", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b", + "url": "https://api.github.com/repos/symfony/mime/zipball/b1b828f69cbaf887fa835a091869e55df91d0e35", + "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35", "shasum": "" }, "require": { @@ -8253,7 +10330,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.2.4" + "source": "https://github.com/symfony/mime/tree/v7.3.4" }, "funding": [ { @@ -8264,25 +10341,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-19T08:51:20+00:00" + "time": "2025-09-16T08:38:17+00:00" }, { "name": "symfony/options-resolver", - "version": "v7.2.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d", + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d", "shasum": "" }, "require": { @@ -8320,7 +10401,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.3" }, "funding": [ { @@ -8331,16 +10412,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-20T11:17:29+00:00" + "time": "2025-08-05T10:16:07+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -8399,7 +10484,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -8410,6 +10495,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8419,16 +10508,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { @@ -8477,7 +10566,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -8488,25 +10577,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { @@ -8560,7 +10653,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -8571,16 +10664,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-10T14:38:51+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -8641,7 +10738,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -8652,6 +10749,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8661,19 +10762,20 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -8721,7 +10823,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -8732,16 +10834,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", @@ -8801,7 +10907,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -8812,6 +10918,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8821,16 +10931,16 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { @@ -8877,7 +10987,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -8888,16 +10998,100 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", @@ -8956,7 +11150,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" }, "funding": [ { @@ -8967,6 +11161,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8976,16 +11174,16 @@ }, { "name": "symfony/process", - "version": "v7.2.5", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", + "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b", + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b", "shasum": "" }, "require": { @@ -9017,7 +11215,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.5" + "source": "https://github.com/symfony/process/tree/v7.3.4" }, "funding": [ { @@ -9028,16 +11226,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", @@ -9100,7 +11302,7 @@ "psr-7" ], "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.2.0" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.3.0" }, "funding": [ { @@ -9120,16 +11322,16 @@ }, { "name": "symfony/routing", - "version": "v7.2.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996" + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996", + "url": "https://api.github.com/repos/symfony/routing/zipball/8dc648e159e9bac02b703b9fbd937f19ba13d07c", + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c", "shasum": "" }, "require": { @@ -9181,7 +11383,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.2.3" + "source": "https://github.com/symfony/routing/tree/v7.3.4" }, "funding": [ { @@ -9192,25 +11394,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", "shasum": "" }, "require": { @@ -9228,7 +11434,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -9264,7 +11470,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" }, "funding": [ { @@ -9280,20 +11486,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-04-25T09:37:31+00:00" }, { "name": "symfony/string", - "version": "v7.2.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + "reference": "f96476035142921000338bad71e5247fbc138872" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", + "reference": "f96476035142921000338bad71e5247fbc138872", "shasum": "" }, "require": { @@ -9308,7 +11514,6 @@ }, "require-dev": { "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", @@ -9351,7 +11556,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.2.0" + "source": "https://github.com/symfony/string/tree/v7.3.4" }, "funding": [ { @@ -9362,25 +11567,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-13T13:31:26+00:00" + "time": "2025-09-11T14:36:48+00:00" }, { "name": "symfony/translation", - "version": "v7.2.4", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a" + "reference": "ec25870502d0c7072d086e8ffba1420c85965174" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a", + "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174", "shasum": "" }, "require": { @@ -9390,6 +11599,7 @@ "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { + "nikic/php-parser": "<5.0", "symfony/config": "<6.4", "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", @@ -9403,7 +11613,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -9446,7 +11656,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.2.4" + "source": "https://github.com/symfony/translation/tree/v7.3.4" }, "funding": [ { @@ -9457,25 +11667,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-09-07T11:39:36+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", "shasum": "" }, "require": { @@ -9488,7 +11702,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -9524,7 +11738,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" }, "funding": [ { @@ -9540,20 +11754,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-27T08:32:26+00:00" }, { "name": "symfony/uid", - "version": "v7.2.0", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426" + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426", + "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb", "shasum": "" }, "require": { @@ -9598,7 +11812,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.2.0" + "source": "https://github.com/symfony/uid/tree/v7.3.1" }, "funding": [ { @@ -9614,31 +11828,31 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.2.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/console": "<6.4" }, "require-dev": { - "ext-iconv": "*", "symfony/console": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", @@ -9681,7 +11895,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.4" }, "funding": [ { @@ -9692,67 +11906,140 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-17T11:39:41+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" + }, + "time": "2024-12-21T16:25:41+00:00" + }, + { + "name": "ueberdosis/tiptap-php", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ueberdosis/tiptap-php.git", + "reference": "458194ad0f8b0cf616fecdf451a84f9a6c1f3056" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", - "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/458194ad0f8b0cf616fecdf451a84f9a6c1f3056", + "reference": "458194ad0f8b0cf616fecdf451a84f9a6c1f3056", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "php": "^7.4 || ^8.0", - "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + "php": "^8.0", + "scrivo/highlight.php": "^9.18", + "spatie/shiki-php": "^2.0" }, "require-dev": { - "phpstan/phpstan": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^8.5.21 || ^9.5.10" + "friendsofphp/php-cs-fixer": "^3.5", + "pestphp/pest": "^1.21", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, "autoload": { "psr-4": { - "TijsVerkoyen\\CssToInlineStyles\\": "src" + "Tiptap\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Tijs Verkoyen", - "email": "css_to_inline_styles@verkoyen.eu", + "name": "Hans Pagel", + "email": "humans@tiptap.dev", "role": "Developer" } ], - "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", - "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "description": "A PHP package to work with Tiptap output", + "homepage": "https://github.com/ueberdosis/tiptap-php", + "keywords": [ + "prosemirror", + "tiptap", + "ueberdosis" + ], "support": { - "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" + "issues": "https://github.com/ueberdosis/tiptap-php/issues", + "source": "https://github.com/ueberdosis/tiptap-php/tree/2.0.0" }, - "time": "2024-12-21T16:25:41+00:00" + "funding": [ + { + "url": "https://tiptap.dev/pricing", + "type": "custom" + }, + { + "url": "https://github.com/ueberdosis", + "type": "github" + }, + { + "url": "https://opencollective.com/tiptap", + "type": "open_collective" + } + ], + "time": "2025-06-26T14:11:46+00:00" }, { "name": "vlucas/phpdotenv", @@ -9972,18 +12259,103 @@ } ], "packages-dev": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v3.16.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "f265cf5e38577d42311f1a90d619bcd3740bea23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/f265cf5e38577d42311f1a90d619bcd3740bea23", + "reference": "f265cf5e38577d42311f1a90d619bcd3740bea23", + "shasum": "" + }, + "require": { + "illuminate/routing": "^9|^10|^11|^12", + "illuminate/session": "^9|^10|^11|^12", + "illuminate/support": "^9|^10|^11|^12", + "php": "^8.1", + "php-debugbar/php-debugbar": "~2.2.0", + "symfony/finder": "^6|^7" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "orchestra/testbench-dusk": "^7|^8|^9|^10", + "phpunit/phpunit": "^9.5.10|^10|^11", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" + }, + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.16-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "dev", + "laravel", + "profiler", + "webprofiler" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-debugbar/issues", + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.16.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-07-14T11:56:43+00:00" + }, { "name": "brianium/paratest", - "version": "v7.8.3", + "version": "v7.8.4", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "a585c346ddf1bec22e51e20b5387607905604a71" + "reference": "130a9bf0e269ee5f5b320108f794ad03e275cad4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/a585c346ddf1bec22e51e20b5387607905604a71", - "reference": "a585c346ddf1bec22e51e20b5387607905604a71", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/130a9bf0e269ee5f5b320108f794ad03e275cad4", + "reference": "130a9bf0e269ee5f5b320108f794ad03e275cad4", "shasum": "" }, "require": { @@ -9992,26 +12364,26 @@ "ext-reflection": "*", "ext-simplexml": "*", "fidry/cpu-core-counter": "^1.2.0", - "jean85/pretty-package-versions": "^2.1.0", + "jean85/pretty-package-versions": "^2.1.1", "php": "~8.2.0 || ~8.3.0 || ~8.4.0", - "phpunit/php-code-coverage": "^11.0.9 || ^12.0.4", - "phpunit/php-file-iterator": "^5.1.0 || ^6", - "phpunit/php-timer": "^7.0.1 || ^8", - "phpunit/phpunit": "^11.5.11 || ^12.0.6", - "sebastian/environment": "^7.2.0 || ^8", - "symfony/console": "^6.4.17 || ^7.2.1", - "symfony/process": "^6.4.19 || ^7.2.4" + "phpunit/php-code-coverage": "^11.0.10", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-timer": "^7.0.1", + "phpunit/phpunit": "^11.5.24", + "sebastian/environment": "^7.2.1", + "symfony/console": "^6.4.22 || ^7.3.0", + "symfony/process": "^6.4.20 || ^7.3.0" }, "require-dev": { "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^2.1.6", - "phpstan/phpstan-deprecation-rules": "^2.0.1", - "phpstan/phpstan-phpunit": "^2.0.4", - "phpstan/phpstan-strict-rules": "^2.0.3", - "squizlabs/php_codesniffer": "^3.11.3", - "symfony/filesystem": "^6.4.13 || ^7.2.0" + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.6", + "phpstan/phpstan-strict-rules": "^2.0.4", + "squizlabs/php_codesniffer": "^3.13.2", + "symfony/filesystem": "^6.4.13 || ^7.3.0" }, "bin": [ "bin/paratest", @@ -10051,7 +12423,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.8.3" + "source": "https://github.com/paratestphp/paratest/tree/v7.8.4" }, "funding": [ { @@ -10063,7 +12435,7 @@ "type": "paypal" } ], - "time": "2025-03-05T08:29:11+00:00" + "time": "2025-06-23T06:07:21+00:00" }, { "name": "doctrine/deprecations", @@ -10178,16 +12550,16 @@ }, { "name": "fidry/cpu-core-counter", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", "shasum": "" }, "require": { @@ -10197,10 +12569,10 @@ "fidry/makefile": "^0.2.0", "fidry/php-cs-fixer-config": "^1.1.2", "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^8.5.31 || ^9.5.26", "webmozarts/strict-phpunit": "^7.5" }, @@ -10227,7 +12599,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" }, "funding": [ { @@ -10235,20 +12607,20 @@ "type": "github" } ], - "time": "2024-08-06T10:04:20+00:00" + "time": "2025-08-14T07:29:31+00:00" }, { "name": "filp/whoops", - "version": "2.18.0", + "version": "2.18.4", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e" + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", "shasum": "" }, "require": { @@ -10298,7 +12670,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.18.0" + "source": "https://github.com/filp/whoops/tree/2.18.4" }, "funding": [ { @@ -10306,24 +12678,24 @@ "type": "github" } ], - "time": "2025-03-15T12:00:00+00:00" + "time": "2025-08-08T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", "shasum": "" }, "require": { - "php": "^5.3|^7.0|^8.0" + "php": "^7.4|^8.0" }, "replace": { "cordoval/hamcrest-php": "*", @@ -10331,8 +12703,8 @@ "kodova/hamcrest-php": "*" }, "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { @@ -10355,9 +12727,9 @@ ], "support": { "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" }, - "time": "2020-07-09T08:09:16+00:00" + "time": "2025-04-30T06:54:44+00:00" }, { "name": "mockery/mockery", @@ -10444,16 +12816,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.13.0", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -10492,7 +12864,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -10500,27 +12872,27 @@ "type": "tidelift" } ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nunomaduro/collision", - "version": "v8.8.0", + "version": "v8.8.2", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8" + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/4cf9f3b47afff38b139fb79ce54fc71799022ce8", - "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", "shasum": "" }, "require": { - "filp/whoops": "^2.18.0", - "nunomaduro/termwind": "^2.3.0", + "filp/whoops": "^2.18.1", + "nunomaduro/termwind": "^2.3.1", "php": "^8.2.0", - "symfony/console": "^7.2.5" + "symfony/console": "^7.3.0" }, "conflict": { "laravel/framework": "<11.44.2 || >=13.0.0", @@ -10528,15 +12900,15 @@ }, "require-dev": { "brianium/paratest": "^7.8.3", - "larastan/larastan": "^3.2", - "laravel/framework": "^11.44.2 || ^12.6", - "laravel/pint": "^1.21.2", - "laravel/sail": "^1.41.0", - "laravel/sanctum": "^4.0.8", + "larastan/larastan": "^3.4.2", + "laravel/framework": "^11.44.2 || ^12.18", + "laravel/pint": "^1.22.1", + "laravel/sail": "^1.43.1", + "laravel/sanctum": "^4.1.1", "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0 || ^10.1", - "pestphp/pest": "^3.8.0", - "sebastian/environment": "^7.2.0 || ^8.0" + "orchestra/testbench-core": "^9.12.0 || ^10.4", + "pestphp/pest": "^3.8.2", + "sebastian/environment": "^7.2.1 || ^8.0" }, "type": "library", "extra": { @@ -10599,42 +12971,42 @@ "type": "patreon" } ], - "time": "2025-04-03T14:33:09+00:00" + "time": "2025-06-25T02:12:12+00:00" }, { "name": "pestphp/pest", - "version": "v3.8.2", + "version": "v3.8.4", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d" + "reference": "72cf695554420e21858cda831d5db193db102574" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/c6244a8712968dbac88eb998e7ff3b5caa556b0d", - "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d", + "url": "https://api.github.com/repos/pestphp/pest/zipball/72cf695554420e21858cda831d5db193db102574", + "reference": "72cf695554420e21858cda831d5db193db102574", "shasum": "" }, "require": { - "brianium/paratest": "^7.8.3", - "nunomaduro/collision": "^8.8.0", - "nunomaduro/termwind": "^2.3.0", + "brianium/paratest": "^7.8.4", + "nunomaduro/collision": "^8.8.2", + "nunomaduro/termwind": "^2.3.1", "pestphp/pest-plugin": "^3.0.0", - "pestphp/pest-plugin-arch": "^3.1.0", + "pestphp/pest-plugin-arch": "^3.1.1", "pestphp/pest-plugin-mutate": "^3.0.5", "php": "^8.2.0", - "phpunit/phpunit": "^11.5.15" + "phpunit/phpunit": "^11.5.33" }, "conflict": { "filp/whoops": "<2.16.0", - "phpunit/phpunit": ">11.5.15", + "phpunit/phpunit": ">11.5.33", "sebastian/exporter": "<6.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { "pestphp/pest-dev-tools": "^3.4.0", - "pestphp/pest-plugin-type-coverage": "^3.5.0", - "symfony/process": "^7.2.5" + "pestphp/pest-plugin-type-coverage": "^3.6.1", + "symfony/process": "^7.3.0" }, "bin": [ "bin/pest" @@ -10699,7 +13071,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.8.2" + "source": "https://github.com/pestphp/pest/tree/v3.8.4" }, "funding": [ { @@ -10711,7 +13083,7 @@ "type": "github" } ], - "time": "2025-04-17T10:53:02+00:00" + "time": "2025-08-20T19:12:42+00:00" }, { "name": "pestphp/pest-plugin", @@ -10927,6 +13299,72 @@ ], "time": "2025-04-21T07:40:53+00:00" }, + { + "name": "pestphp/pest-plugin-livewire", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-livewire.git", + "reference": "e2f2edb0a7d414d6837d87908a0e148256d3bf89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-livewire/zipball/e2f2edb0a7d414d6837d87908a0e148256d3bf89", + "reference": "e2f2edb0a7d414d6837d87908a0e148256d3bf89", + "shasum": "" + }, + "require": { + "livewire/livewire": "^3.5.6", + "pestphp/pest": "^3.0.0", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^9.4.0", + "pestphp/pest-dev-tools": "^3.0.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Livewire Plugin", + "keywords": [ + "framework", + "livewire", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-livewire/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-09-09T00:05:59+00:00" + }, { "name": "pestphp/pest-plugin-mutate", "version": "v3.0.5", @@ -11117,6 +13555,79 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "php-debugbar/php-debugbar", + "version": "v2.2.4", + "source": { + "type": "git", + "url": "https://github.com/php-debugbar/php-debugbar.git", + "reference": "3146d04671f51f69ffec2a4207ac3bdcf13a9f35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/3146d04671f51f69ffec2a4207ac3bdcf13a9f35", + "reference": "3146d04671f51f69ffec2a4207ac3bdcf13a9f35", + "shasum": "" + }, + "require": { + "php": "^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6|^7" + }, + "replace": { + "maximebf/debugbar": "self.version" + }, + "require-dev": { + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/php-debugbar/php-debugbar", + "keywords": [ + "debug", + "debug bar", + "debugbar", + "dev" + ], + "support": { + "issues": "https://github.com/php-debugbar/php-debugbar/issues", + "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.2.4" + }, + "time": "2025-07-22T14:01:30+00:00" + }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", @@ -11172,16 +13683,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.2", + "version": "5.6.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94f8051919d1b0369a6bcc7931d679a511c03fe9", + "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9", "shasum": "" }, "require": { @@ -11230,9 +13741,9 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.3" }, - "time": "2025-04-13T19:20:35+00:00" + "time": "2025-08-01T19:43:32+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -11294,16 +13805,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.1.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", "shasum": "" }, "require": { @@ -11335,22 +13846,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" }, - "time": "2025-02-19T13:28:12+00:00" + "time": "2025-08-30T15:50:23+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "11.0.9", + "version": "11.0.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7" + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", "shasum": "" }, "require": { @@ -11407,15 +13918,27 @@ "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/11.0.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2025-02-25T13:26:39+00:00" + "time": "2025-08-27T14:37:49+00:00" }, { "name": "phpunit/php-file-iterator", @@ -11664,16 +14187,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.15", + "version": "11.5.33", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c" + "reference": "5965e9ff57546cb9137c0ff6aa78cb7442b05cf6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", - "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5965e9ff57546cb9137c0ff6aa78cb7442b05cf6", + "reference": "5965e9ff57546cb9137c0ff6aa78cb7442b05cf6", "shasum": "" }, "require": { @@ -11683,24 +14206,24 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.0", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.9", + "phpunit/php-code-coverage": "^11.0.10", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-invoker": "^5.0.1", "phpunit/php-text-template": "^4.0.1", "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.1", + "sebastian/comparator": "^6.3.2", "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.0", + "sebastian/environment": "^7.2.1", "sebastian/exporter": "^6.3.0", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.2", + "sebastian/type": "^5.1.3", "sebastian/version": "^5.0.2", "staabm/side-effects-detector": "^1.0.5" }, @@ -11745,7 +14268,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.15" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.33" }, "funding": [ { @@ -11756,12 +14279,20 @@ "url": "https://github.com/sebastianbergmann", "type": "github" }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2025-03-23T16:02:11+00:00" + "time": "2025-08-16T05:19:02+00:00" }, { "name": "sebastian/cli-parser", @@ -11935,16 +14466,16 @@ }, { "name": "sebastian/comparator", - "version": "6.3.1", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", "shasum": "" }, "require": { @@ -12003,15 +14534,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2025-03-07T06:57:01+00:00" + "time": "2025-08-10T08:07:46+00:00" }, { "name": "sebastian/complexity", @@ -12140,23 +14683,23 @@ }, { "name": "sebastian/environment", - "version": "7.2.0", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "suggest": { "ext-posix": "*" @@ -12192,15 +14735,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2024-07-03T04:54:44+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { "name": "sebastian/exporter", @@ -12516,23 +15071,23 @@ }, { "name": "sebastian/recursion-context", - "version": "6.0.2", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { @@ -12568,28 +15123,40 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2024-07-03T05:10:34+00:00" + "time": "2025-08-13T04:42:22+00:00" }, { "name": "sebastian/type", - "version": "5.1.2", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", "shasum": "" }, "require": { @@ -12625,15 +15192,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2025-03-18T13:35:50+00:00" + "time": "2025-08-09T06:55:48+00:00" }, { "name": "sebastian/version", @@ -12919,12 +15498,12 @@ ], "aliases": [], "minimum-stability": "dev", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "8.3.*" + "php": "^8.3 || ^8.4" }, - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/config/lio.php b/config/lio.php index f317718c1..3e98790cc 100644 --- a/config/lio.php +++ b/config/lio.php @@ -2,11 +2,15 @@ return [ 'ads' => [ + // [ + // 'url' => 'https://eventy.io/?utm_source=Laravel.io&utm_campaign=eventy&utm_medium=advertisement', + // 'image' => 'eventy', + // 'alt' => 'Eventy', + // ], [ - 'url' => 'https://eventy.io/?utm_source=Laravel.io&utm_campaign=eventy&utm_medium=advertisement', - 'image' => 'eventy', - 'alt' => 'Eventy', - 'goal' => 'PSA8VL6S', + 'url' => 'https://nativephp.com/mobile?ref=laravel.io', + 'image' => 'nativephp', + 'alt' => 'Native PHP', ], ], diff --git a/config/mail.php b/config/mail.php index 77815a619..b161131b7 100644 --- a/config/mail.php +++ b/config/mail.php @@ -3,11 +3,10 @@ return [ 'mailers' => [ - 'mailgun' => [ - 'transport' => 'mailgun', - // 'client' => [ - // 'timeout' => 5, - // ], + 'mailcoach' => [ + 'transport' => 'mailcoach', + 'domain' => env('MAILCOACH_DOMAIN'), + 'token' => env('MAILCOACH_TOKEN'), ], ], diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index f434385cc..406393cb4 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -23,6 +23,7 @@ public function definition(): array 'remember_token' => Str::random(10), 'github_id' => $this->faker->unique()->numberBetween(10000, 99999), 'github_username' => $this->faker->unique()->userName(), + 'github_has_identicon' => $this->faker->boolean(), 'twitter' => $this->faker->unique()->userName(), 'bluesky' => $this->faker->unique()->userName(), 'website' => 'https://laravel.io', @@ -51,4 +52,11 @@ public function moderator(): self return ['type' => User::MODERATOR]; }); } + + public function verifiedAuthor(): self + { + return $this->state(function () { + return ['author_verified_at' => now()]; + }); + } } diff --git a/database/migrations/2025_06_14_222049_add_verified_author_at_to_users_table.php b/database/migrations/2025_06_14_222049_add_verified_author_at_to_users_table.php new file mode 100644 index 000000000..f36d1c48d --- /dev/null +++ b/database/migrations/2025_06_14_222049_add_verified_author_at_to_users_table.php @@ -0,0 +1,17 @@ +timestamp('author_verified_at') + ->nullable() + ->after('email_verified_at'); + }); + } +}; diff --git a/database/migrations/2025_09_11_152525_add_has_identicon_to_users_table.php b/database/migrations/2025_09_11_152525_add_has_identicon_to_users_table.php new file mode 100644 index 000000000..dedb4763d --- /dev/null +++ b/database/migrations/2025_09_11_152525_add_has_identicon_to_users_table.php @@ -0,0 +1,15 @@ +boolean('github_has_identicon')->after('github_username')->default(false); + }); + } +}; diff --git a/database/migrations/2025_09_12_073227_add_new_indexes.php b/database/migrations/2025_09_12_073227_add_new_indexes.php new file mode 100644 index 000000000..981993446 --- /dev/null +++ b/database/migrations/2025_09_12_073227_add_new_indexes.php @@ -0,0 +1,29 @@ +index(['likeable_id', 'likeable_type']); + $table->index(['likeable_id', 'likeable_type', 'created_at']); + }); + + Schema::table('taggables', function (Blueprint $table) { + $table->dropIndex(['taggable_id']); + + $table->index(['taggable_id', 'taggable_type']); + }); + + Schema::table('replies', function (Blueprint $table) { + $table->dropIndex(['replyable_id']); + $table->dropIndex(['replyable_type']); + + $table->index(['replyable_id', 'replyable_type']); + }); + } +}; diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index 5c3fe18a4..d30dfdd4d 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -34,7 +34,7 @@ public function run(): void DB::beginTransaction(); User::factory() - ->count(100) + ->count(300) ->has(Thread::factory()->count(2), 'threadsRelation') ->has( Article::factory() diff --git a/package-lock.json b/package-lock.json index 02a284a1b..d847fa324 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,173 +14,158 @@ "choices.js": "^11.0.6", "highlight.js": "^11.9.0", "laravel-vite-plugin": "^1.0.1", - "pixelmatch": "^5.0.0", + "pixelmatch": "^7.1.0", "tailwindcss": "^4.1.4", "textarea-caret": "^3.1.0", "vite": "^6.2.0" } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", - "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.25.2.tgz", + "integrity": "sha512-tA1rqAafI+gUdewjZwyTsZVxesl22MTgLWRKt1+TBiL26NiKx7SjRqTI3pzm8ngx1ftM5LSgXkVIgk2+SRgPTg==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.24.0" + "@algolia/cache-common": "4.25.2" } }, "node_modules/@algolia/cache-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", - "dev": true, - "license": "MIT" + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.25.2.tgz", + "integrity": "sha512-E+aZwwwmhvZXsRA1+8DhH2JJIwugBzHivASTnoq7bmv0nmForLyH7rMG5cOTiDK36DDLnKq1rMGzxWZZ70KZag==", + "dev": true }, "node_modules/@algolia/cache-in-memory": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", - "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.25.2.tgz", + "integrity": "sha512-KYcenhfPKgR+WJ6IEwKVEFMKKCWLZdnYuw08+3Pn1cxAXbJcTIKjoYgEXzEW6gJmDaau2l55qNrZo6MBbX7+sw==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.24.0" + "@algolia/cache-common": "4.25.2" } }, "node_modules/@algolia/client-account": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", - "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.25.2.tgz", + "integrity": "sha512-IfRGhBxvjli9mdexrCxX2N4XT9NBN3tvZK5zCaL8zkDcgsthiM9WPvGIZS/pl/FuXB7hA0lE5kqOzsQDP6OmGQ==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "4.25.2", + "@algolia/client-search": "4.25.2", + "@algolia/transporter": "4.25.2" } }, "node_modules/@algolia/client-analytics": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", - "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.25.2.tgz", + "integrity": "sha512-4Yxxhxh+XjXY8zPyo+h6tQuyoJWDBn8E3YLr8j+YAEy5p+r3/5Tp+ANvQ+hNaQXbwZpyf5d4ViYOBjJ8+bWNEg==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "4.25.2", + "@algolia/client-search": "4.25.2", + "@algolia/requester-common": "4.25.2", + "@algolia/transporter": "4.25.2" } }, "node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.25.2.tgz", + "integrity": "sha512-HXX8vbJPYW29P18GxciiwaDpQid6UhpPP9nW9WE181uGUgFhyP5zaEkYWf9oYBrjMubrGwXi5YEzJOz6Oa4faA==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/requester-common": "4.25.2", + "@algolia/transporter": "4.25.2" } }, "node_modules/@algolia/client-personalization": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", - "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.25.2.tgz", + "integrity": "sha512-K81PRaHF77mHv2u8foWTHnIf5c+QNf/SnKNM7rB8JPi7TMYi4E5o2mFbgdU1ovd8eg9YMOEAuLkl1Nz1vbM3zQ==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "4.25.2", + "@algolia/requester-common": "4.25.2", + "@algolia/transporter": "4.25.2" } }, "node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.25.2.tgz", + "integrity": "sha512-pO/LpVnQlbJpcHRk+AroWyyFnh01eOlO6/uLZRUmYvr/hpKZKxI6n7ufgTawbo0KrAu2CePfiOkStYOmDuRjzQ==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "4.25.2", + "@algolia/requester-common": "4.25.2", + "@algolia/transporter": "4.25.2" } }, "node_modules/@algolia/logger-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", - "dev": true, - "license": "MIT" + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.25.2.tgz", + "integrity": "sha512-aUXpcodoIpLPsnVc2OHgC9E156R7yXWLW2l+Zn24Cyepfq3IvmuVckBvJDpp7nPnXkEzeMuvnVxQfQsk+zP/BA==", + "dev": true }, "node_modules/@algolia/logger-console": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", - "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.25.2.tgz", + "integrity": "sha512-H3Y+UB0Ty0htvMJ6zDSufhFTSDlg3Pyj3AXilfDdDRcvfhH4C/cJNVm+CTaGORxL5uKABGsBp+SZjsEMTyAunQ==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/logger-common": "4.24.0" + "@algolia/logger-common": "4.25.2" } }, "node_modules/@algolia/recommend": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", - "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.25.2.tgz", + "integrity": "sha512-puRrGeXwAuVa4mLdvXvmxHRFz9MkcCOLPcjz7MjU4NihlpIa+lZYgikJ7z0SUAaYgd6l5Bh00hXiU/OlX5ffXQ==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/cache-browser-local-storage": "4.25.2", + "@algolia/cache-common": "4.25.2", + "@algolia/cache-in-memory": "4.25.2", + "@algolia/client-common": "4.25.2", + "@algolia/client-search": "4.25.2", + "@algolia/logger-common": "4.25.2", + "@algolia/logger-console": "4.25.2", + "@algolia/requester-browser-xhr": "4.25.2", + "@algolia/requester-common": "4.25.2", + "@algolia/requester-node-http": "4.25.2", + "@algolia/transporter": "4.25.2" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.25.2.tgz", + "integrity": "sha512-aAjfsI0AjWgXLh/xr9eoR8/9HekBkIER3bxGoBf9d1XWMMoTo/q92Da2fewkxwLE6mla95QJ9suJGOtMOewXXQ==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.24.0" + "@algolia/requester-common": "4.25.2" } }, "node_modules/@algolia/requester-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", - "dev": true, - "license": "MIT" + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.25.2.tgz", + "integrity": "sha512-Q4wC3sgY0UFjV3Rb3icRLTpPB5/M44A8IxzJHM9PNeK1T3iX7X/fmz7ATUYQYZTpwHCYATlsQKWiTpql1hHjVg==", + "dev": true }, "node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.25.2.tgz", + "integrity": "sha512-Ja/FYB7W9ZM+m8UrMIlawNUAKpncvb9Mo+D8Jq5WepGTUyQ9CBYLsjwxv9O8wbj3TSWqTInf4uUBJ2FKR8G7xw==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.24.0" + "@algolia/requester-common": "4.25.2" } }, "node_modules/@algolia/transporter": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", - "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.25.2.tgz", + "integrity": "sha512-yw3RLHWc6V+pbdsFtq8b6T5bJqLDqnfKWS7nac1Vzcmgvs/V/Lfy7/6iOF9XRilu5aBDOBHoP1SOeIDghguzWw==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/requester-common": "4.24.0" + "@algolia/cache-common": "4.25.2", + "@algolia/logger-common": "4.25.2", + "@algolia/requester-common": "4.25.2" } }, "node_modules/@esbuild/aix-ppc64": { @@ -608,6 +593,69 @@ "node": ">=18" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", @@ -912,46 +960,54 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", - "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", "dev": true, "license": "MIT", "dependencies": { - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.29.2", - "tailwindcss": "4.1.5" + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.1", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.14" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", - "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.5.1" + }, "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-x64": "4.1.5", - "@tailwindcss/oxide-freebsd-x64": "4.1.5", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-x64-musl": "4.1.5", - "@tailwindcss/oxide-wasm32-wasi": "4.1.5", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", - "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", "cpu": [ "arm64" ], @@ -966,9 +1022,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", - "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", "cpu": [ "arm64" ], @@ -983,9 +1039,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", - "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", "cpu": [ "x64" ], @@ -1000,9 +1056,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", - "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", "cpu": [ "x64" ], @@ -1017,9 +1073,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", - "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", "cpu": [ "arm" ], @@ -1034,9 +1090,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", - "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", "cpu": [ "arm64" ], @@ -1051,9 +1107,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", - "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", "cpu": [ "arm64" ], @@ -1068,9 +1124,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", - "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", "cpu": [ "x64" ], @@ -1085,9 +1141,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", - "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", "cpu": [ "x64" ], @@ -1102,9 +1158,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", - "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1120,30 +1176,30 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.9", - "@tybys/wasm-util": "^0.9.0", - "tslib": "^2.8.0" + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.4.3", + "version": "1.5.0", "dev": true, "inBundle": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.2", + "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.4.3", + "version": "1.5.0", "dev": true, "inBundle": true, "license": "MIT", @@ -1153,7 +1209,7 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.0.2", + "version": "1.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -1163,19 +1219,19 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.9", + "version": "1.0.5", "dev": true, "inBundle": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.4.0", - "@emnapi/runtime": "^1.4.0", - "@tybys/wasm-util": "^0.9.0" + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" } }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { - "version": "0.9.0", + "version": "0.10.1", "dev": true, "inBundle": true, "license": "MIT", @@ -1185,16 +1241,16 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { - "version": "2.8.0", + "version": "2.8.1", "dev": true, "inBundle": true, "license": "0BSD", "optional": true }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", - "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", "cpu": [ "arm64" ], @@ -1209,9 +1265,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", - "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", "cpu": [ "x64" ], @@ -1226,15 +1282,12 @@ } }, "node_modules/@tailwindcss/typography": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", - "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", "dev": true, "license": "MIT", "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { @@ -1242,18 +1295,18 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.5.tgz", - "integrity": "sha512-FE1stRoqdHSb7RxesMfCXE8icwI1W6zGE/512ae3ZDrpkQYTTYeSyUJPRCjZd8CwVAhpDUbi1YR8pcZioFJQ/w==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.14.tgz", + "integrity": "sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.1.5", - "@tailwindcss/oxide": "4.1.5", - "tailwindcss": "4.1.5" + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", + "tailwindcss": "4.1.14" }, "peerDependencies": { - "vite": "^5.2.0 || ^6" + "vite": "^5.2.0 || ^6 || ^7" } }, "node_modules/@types/estree": { @@ -1264,27 +1317,26 @@ "license": "MIT" }, "node_modules/algoliasearch": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", - "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.25.2.tgz", + "integrity": "sha512-lYx98L6kb1VvXypbPI7Z54C4BJB2VT5QvOYthvPq6/POufZj+YdyeZSKjoLBKHJgGmYWQTHOKtcCTdKf98WOCA==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-account": "4.24.0", - "@algolia/client-analytics": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-personalization": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/recommend": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/cache-browser-local-storage": "4.25.2", + "@algolia/cache-common": "4.25.2", + "@algolia/cache-in-memory": "4.25.2", + "@algolia/client-account": "4.25.2", + "@algolia/client-analytics": "4.25.2", + "@algolia/client-common": "4.25.2", + "@algolia/client-personalization": "4.25.2", + "@algolia/client-search": "4.25.2", + "@algolia/logger-common": "4.25.2", + "@algolia/logger-console": "4.25.2", + "@algolia/recommend": "4.25.2", + "@algolia/requester-browser-xhr": "4.25.2", + "@algolia/requester-common": "4.25.2", + "@algolia/requester-node-http": "4.25.2", + "@algolia/transporter": "4.25.2" } }, "node_modules/asynckit": { @@ -1295,14 +1347,14 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -1330,6 +1382,16 @@ "fuse.js": "^7.0.0" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1367,9 +1429,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1392,9 +1454,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "license": "MIT", "dependencies": { @@ -1532,15 +1594,16 @@ } }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -1694,9 +1757,9 @@ } }, "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", "bin": { @@ -1704,9 +1767,9 @@ } }, "node_modules/laravel-vite-plugin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.2.0.tgz", - "integrity": "sha512-R0pJ+IcTVeqEMoKz/B2Ij57QVq3sFTABiFmb06gAwFdivbOgsUtuhX6N2MGLEArajrS3U5JbberzwOe7uXHMHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.3.0.tgz", + "integrity": "sha512-P5qyG56YbYxM8OuYmK2OkhcKe0AksNVJUjq9LUZ5tOekU9fBn9LujYyctI4t9XoLjuMvHJXXpCoPntY1oKltuA==", "dev": true, "license": "MIT", "dependencies": { @@ -1724,9 +1787,9 @@ } }, "node_modules/lightningcss": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", - "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -1740,22 +1803,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.2", - "lightningcss-darwin-x64": "1.29.2", - "lightningcss-freebsd-x64": "1.29.2", - "lightningcss-linux-arm-gnueabihf": "1.29.2", - "lightningcss-linux-arm64-gnu": "1.29.2", - "lightningcss-linux-arm64-musl": "1.29.2", - "lightningcss-linux-x64-gnu": "1.29.2", - "lightningcss-linux-x64-musl": "1.29.2", - "lightningcss-win32-arm64-msvc": "1.29.2", - "lightningcss-win32-x64-msvc": "1.29.2" + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", - "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", "cpu": [ "arm64" ], @@ -1774,9 +1837,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", - "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", "cpu": [ "x64" ], @@ -1795,9 +1858,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", - "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", "cpu": [ "x64" ], @@ -1816,9 +1879,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", - "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", "cpu": [ "arm" ], @@ -1837,9 +1900,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", - "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", "cpu": [ "arm64" ], @@ -1858,9 +1921,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", - "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", "cpu": [ "arm64" ], @@ -1879,9 +1942,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", "cpu": [ "x64" ], @@ -1900,9 +1963,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", "cpu": [ "x64" ], @@ -1921,9 +1984,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", "cpu": [ "arm64" ], @@ -1942,9 +2005,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", - "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", "cpu": [ "x64" ], @@ -1962,26 +2025,15 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -2026,6 +2078,29 @@ "mini-svg-data-uri": "cli.js" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -2066,26 +2141,26 @@ } }, "node_modules/pixelmatch": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", - "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", + "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", "dev": true, "license": "ISC", "dependencies": { - "pngjs": "^6.0.0" + "pngjs": "^7.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" } }, "node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.13.0" + "node": ">=14.19.0" } }, "node_modules/postcss": { @@ -2189,20 +2264,41 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", - "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", "dev": true, "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/textarea-caret": { @@ -2237,9 +2333,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", "dev": true, "license": "MIT", "dependencies": { @@ -2334,6 +2430,16 @@ "funding": { "url": "https://github.com/sponsors/jonschlinkert" } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } } } } diff --git a/package.json b/package.json index 6f55dfb4d..aaf7f0881 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "choices.js": "^11.0.6", "highlight.js": "^11.9.0", "laravel-vite-plugin": "^1.0.1", - "pixelmatch": "^5.0.0", + "pixelmatch": "^7.1.0", "tailwindcss": "^4.1.4", "textarea-caret": "^3.1.0", "vite": "^6.2.0" diff --git a/public/images/showcase/nativephp-long.png b/public/images/showcase/nativephp-long.png new file mode 100644 index 000000000..e3f7563af Binary files /dev/null and b/public/images/showcase/nativephp-long.png differ diff --git a/public/images/showcase/nativephp-small.png b/public/images/showcase/nativephp-small.png new file mode 100644 index 000000000..74e65030a Binary files /dev/null and b/public/images/showcase/nativephp-small.png differ diff --git a/public/images/showcase/phpverse-long.png b/public/images/showcase/phpverse-long.png new file mode 100644 index 000000000..20caf3912 Binary files /dev/null and b/public/images/showcase/phpverse-long.png differ diff --git a/public/images/showcase/phpverse-small.png b/public/images/showcase/phpverse-small.png new file mode 100644 index 000000000..22d428d23 Binary files /dev/null and b/public/images/showcase/phpverse-small.png differ diff --git a/public/images/sponsors/n-ix.png b/public/images/sponsors/n-ix.png new file mode 100644 index 000000000..cbf91ca85 Binary files /dev/null and b/public/images/sponsors/n-ix.png differ diff --git a/public/images/sponsors/phpstorm.svg b/public/images/sponsors/phpstorm.svg deleted file mode 100644 index 9b6f53883..000000000 --- a/public/images/sponsors/phpstorm.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/resources/css/app.css b/resources/css/app.css index 4291b72f0..60e68b32b 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -3,7 +3,6 @@ @import 'highlight.js/styles/hybrid.css' layer(base); -@import './articles.css' layer(utilities); @import './buttons.css' layer(utilities); @import './labels.css' layer(utilities); @import './modal.css' layer(utilities); @@ -104,17 +103,6 @@ svg .secondary { @apply outline-hidden bg-gray-100; } -.member:after { - bottom: -1rem; - content: ' '; - display: block; - left: 7rem; - position: absolute; - border-color: #f9fafb transparent transparent transparent; - border-style: solid; - border-width: 0.5rem; -} - /** Choices.js **/ .choices__input.choices__input--cloned { @apply hidden; @@ -171,3 +159,13 @@ svg .secondary { .editor li[aria-selected='true'] { @apply bg-lio-100; } + +article iframe { + @apply w-full h-64; +} + +@media (width >= theme(--breakpoint-sm)) { + article iframe { + @apply h-96; + } +} \ No newline at end of file diff --git a/resources/css/articles.css b/resources/css/articles.css deleted file mode 100644 index 6c4207beb..000000000 --- a/resources/css/articles.css +++ /dev/null @@ -1,73 +0,0 @@ -.article p, -.article ul, -.article ol, -.article hr { - @apply mb-4; -} - -.article h1, -.article h2, -.article h3, -.article h4, -.article h5, -.article h6 { - @apply mb-1 mt-12; -} - -.article h1 { - @apply text-4xl font-bold; -} - -.article h2 { - @apply text-3xl font-bold; -} - -.article h3 { - @apply text-2xl font-bold; -} - -.article h4, -.article h5, -.article h6 { - @apply text-xl font-bold; -} - -.article img, -.article pre, -.article blockquote { - @apply my-8; -} - -.article img { - @apply shadow-lg mx-auto; -} - -.article p code { - @apply bg-lio-200 px-1 text-base; -} - -.article ul { - @apply list-disc list-inside; -} - -.article ol { - @apply list-decimal list-inside; -} - -.article ul p, -.article ol p { - @apply inline; -} - -.article ul ol, -.article ol ul { - @apply mb-0 ml-4; -} - -.article blockquote { - @apply border-l-4 border-lio-500 pl-4 ml-4; -} - -.article a { - @apply underline text-lio-700; -} diff --git a/resources/helpers.php b/resources/helpers.php index 9f7ed2df8..7eac47fea 100644 --- a/resources/helpers.php +++ b/resources/helpers.php @@ -24,9 +24,9 @@ function is_active(mixed $routes): bool /** * Converts Markdown to a safe HTML string. */ - function md_to_html(string $markdown, bool $nofollow = true): string + function md_to_html(string $markdown, array $params = []): string { - return app(App\Markdown\Converter::class, ['nofollow' => $nofollow])->toHtml($markdown); + return app(App\Markdown\Converter::class, $params)->toHtml($markdown); } } diff --git a/resources/views/_partials/_search.blade.php b/resources/views/_partials/_search.blade.php index 92a5962c5..61b110406 100644 --- a/resources/views/_partials/_search.blade.php +++ b/resources/views/_partials/_search.blade.php @@ -1,6 +1,6 @@