From 86db7e569be70736b28267c6b979fce9790376bc Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Wed, 17 Dec 2025 21:48:52 +0100 Subject: [PATCH 01/50] feat: Add Person and Casting functionality - Introduced Person and Casting entities with respective repositories. - Implemented PersonService to manage person-related operations including adding to casting for movies, episodes, seasons, and series. - Enhanced MovieService, EpisodeService, SeasonService, and SerieService to update credits and manage castings. - Created message classes for asynchronous processing of person-related tasks. - Added message handlers to process person messages and handle casting updates. - Updated various paragraph classes to improve translation handling. - Added Twig templates for displaying castings in the admin interface. - Updated French translations for new terms related to persons and castings. --- Taskfile.yml | 9 - apps/config/packages/flysystem.yaml | 4 + apps/config/packages/framework.yaml | 2 +- apps/config/packages/vich_uploader.yaml | 10 + .../2025/12/Version20251217202932.php | 45 ++++ apps/src/Api/TheMovieDbApi.php | 43 ++- apps/src/Api/Tmdb/TmdbImagesApi.php | 13 + apps/src/Api/Tmdb/TmdbPersonApi.php | 56 ++++ apps/src/Api/Tmdb/TmdbTvApi.php | 130 +++++++++ apps/src/Block/HtmlBlock.php | 4 +- apps/src/Command/ExecuteMessageCommand.php | 39 ++- .../Controller/Admin/BanIpCrudController.php | 6 +- .../Controller/Admin/BlockCrudController.php | 4 +- .../Admin/ChapterCrudController.php | 6 +- .../Admin/ConfigurationCrudController.php | 16 +- .../Controller/Admin/DashboardController.php | 5 + .../Admin/EpisodeCrudController.php | 11 +- .../Admin/Factory/CrudFieldFactory.php | 13 +- .../Controller/Admin/GameCrudController.php | 9 +- .../Controller/Admin/MediaCrudController.php | 4 +- .../Controller/Admin/MetaCrudController.php | 4 +- .../Controller/Admin/MovieCrudController.php | 16 +- .../Admin/NotificationCrudController.php | 1 + .../Controller/Admin/PageCrudController.php | 6 +- .../Admin/ParagraphCrudController.php | 8 +- .../Controller/Admin/PersonCrudController.php | 169 ++++++++++++ .../Admin/PlatformCrudController.php | 5 +- .../Controller/Admin/PostCrudController.php | 4 +- .../Controller/Admin/SagaCrudController.php | 5 +- .../Controller/Admin/SeasonCrudController.php | 11 +- .../Controller/Admin/SerieCrudController.php | 16 +- .../Controller/Admin/StoryCrudController.php | 4 +- .../Admin/TemplateCrudController.php | 4 +- apps/src/Entity/Casting.php | 129 +++++++++ apps/src/Entity/Episode.php | 41 +++ apps/src/Entity/Meta.php | 20 ++ apps/src/Entity/Movie.php | 35 +++ apps/src/Entity/Person.php | 250 ++++++++++++++++++ apps/src/Entity/Season.php | 35 +++ apps/src/Entity/Serie.php | 35 +++ apps/src/Field/UploadImageField.php | 8 +- apps/src/Form/Front/MovieType.php | 71 +++-- apps/src/Generate/CinemaGenerate.php | 4 +- apps/src/Message/PersonAllMessage.php | 19 ++ apps/src/Message/PersonMessage.php | 20 ++ .../MessageHandler/FilesMessageHandler.php | 8 +- .../src/MessageHandler/MetaMessageHandler.php | 37 +-- .../NotificationMessageHandler.php | 7 +- .../PersonAllMessageHandler.php | 29 ++ .../MessageHandler/PersonMessageHandler.php | 32 +++ apps/src/Paragraph/ExperiencesParagraph.php | 5 +- apps/src/Paragraph/FormParagraph.php | 4 +- apps/src/Paragraph/HtmlParagraph.php | 4 +- apps/src/Paragraph/ParagraphAbstract.php | 8 +- apps/src/Paragraph/SiblingParagraph.php | 4 +- apps/src/Paragraph/SkillsParagraph.php | 5 +- apps/src/Paragraph/TextImgParagraph.php | 4 +- apps/src/Paragraph/TextMediaParagraph.php | 4 +- apps/src/Paragraph/TextParagraph.php | 4 +- .../Paragraph/TrainingCoursesParagraph.php | 5 +- apps/src/Repository/CastingRepository.php | 17 ++ .../src/Repository/NotificationRepository.php | 10 +- apps/src/Repository/PersonRepository.php | 17 ++ apps/src/Security/Voter/EasyadminVoter.php | 1 + apps/src/Service/Imdb/EpisodeService.php | 27 ++ apps/src/Service/Imdb/MovieService.php | 36 ++- apps/src/Service/Imdb/PersonService.php | 189 +++++++++++++ apps/src/Service/Imdb/SeasonService.php | 27 ++ apps/src/Service/Imdb/SerieService.php | 42 +-- .../Twig/Runtime/BlockExtensionRuntime.php | 7 +- .../Runtime/ParagraphExtensionRuntime.php | 7 +- apps/templates/admin/field/castings.html.twig | 18 ++ apps/translations/EasyAdminBundle.fr.xlf | 4 + apps/translations/messages.fr.xlf | 60 +++++ 74 files changed, 1758 insertions(+), 213 deletions(-) create mode 100644 apps/migrations/2025/12/Version20251217202932.php create mode 100644 apps/src/Api/Tmdb/TmdbPersonApi.php create mode 100644 apps/src/Controller/Admin/PersonCrudController.php create mode 100644 apps/src/Entity/Casting.php create mode 100644 apps/src/Entity/Person.php create mode 100644 apps/src/Message/PersonAllMessage.php create mode 100644 apps/src/Message/PersonMessage.php create mode 100644 apps/src/MessageHandler/PersonAllMessageHandler.php create mode 100644 apps/src/MessageHandler/PersonMessageHandler.php create mode 100644 apps/src/Repository/CastingRepository.php create mode 100644 apps/src/Repository/PersonRepository.php create mode 100644 apps/src/Service/Imdb/PersonService.php create mode 100644 apps/templates/admin/field/castings.html.twig diff --git a/Taskfile.yml b/Taskfile.yml index a2281008a..6c8b23c0f 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -338,14 +338,6 @@ tasks: vars: CMD: "run ecs-fix" - labstag:delete-oldfiles: - desc: "Delete old temporary files" - silent: true - cmds: - - task: symfony:console - vars: - CMD: "labstag:delete-oldfiles" - labstag:geocode-install: desc: "Install geocoding data" silent: true @@ -667,7 +659,6 @@ tasks: silent: true cmds: - task: doctrine:fixtures - - task: labstag:delete-oldfiles - task: star:add labstag:set-env-ids: diff --git a/apps/config/packages/flysystem.yaml b/apps/config/packages/flysystem.yaml index b3d982181..e92813e16 100644 --- a/apps/config/packages/flysystem.yaml +++ b/apps/config/packages/flysystem.yaml @@ -13,6 +13,10 @@ flysystem: adapter: 'local' options: directory: '%kernel.project_dir%/public/assets' + person.storage: + adapter: 'local' + options: + directory: '%kernel.project_dir%/public/uploads/person' game.storage: adapter: 'local' options: diff --git a/apps/config/packages/framework.yaml b/apps/config/packages/framework.yaml index bb2e18572..05a9ed737 100644 --- a/apps/config/packages/framework.yaml +++ b/apps/config/packages/framework.yaml @@ -1,6 +1,6 @@ # see https://symfony.com/doc/current/reference/configuration/framework.html framework: - error_controller: Labstag\Controller\FrontController::error + # error_controller: Labstag\Controller\FrontController::error cache: pools: doctrine.result_cache_pool: diff --git a/apps/config/packages/vich_uploader.yaml b/apps/config/packages/vich_uploader.yaml index 8b047c519..cfed4d471 100644 --- a/apps/config/packages/vich_uploader.yaml +++ b/apps/config/packages/vich_uploader.yaml @@ -13,6 +13,16 @@ vich_uploader: inject_on_load: false delete_on_update: true delete_on_remove: true + person: + uri_prefix: /uploads/person + upload_destination: person.storage + namer: + service: Vich\UploaderBundle\Naming\PropertyNamer + options: + property: slug + inject_on_load: false + delete_on_update: true + delete_on_remove: true media: uri_prefix: /uploads/media upload_destination: media.storage diff --git a/apps/migrations/2025/12/Version20251217202932.php b/apps/migrations/2025/12/Version20251217202932.php new file mode 100644 index 000000000..62fa6b095 --- /dev/null +++ b/apps/migrations/2025/12/Version20251217202932.php @@ -0,0 +1,45 @@ +addSql('CREATE TABLE casting (id CHAR(36) NOT NULL, known_for_department VARCHAR(255) DEFAULT NULL, figure VARCHAR(255) DEFAULT NULL, ref_person_id CHAR(36) DEFAULT NULL, ref_season_id CHAR(36) DEFAULT NULL, ref_episode_id CHAR(36) DEFAULT NULL, ref_movie_id CHAR(36) DEFAULT NULL, ref_serie_id CHAR(36) DEFAULT NULL, INDEX IDX_D11BBA505221BA02 (ref_person_id), INDEX IDX_D11BBA503D9A0094 (ref_season_id), INDEX IDX_D11BBA5030EE8DBE (ref_episode_id), INDEX IDX_D11BBA50984707B (ref_movie_id), INDEX IDX_D11BBA505F544E3A (ref_serie_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`'); + $this->addSql('CREATE TABLE person (id CHAR(36) NOT NULL, slug VARCHAR(255) DEFAULT NULL, title VARCHAR(255) NOT NULL, birthday DATE DEFAULT NULL, deathday DATE DEFAULT NULL, gender SMALLINT DEFAULT NULL, biography LONGTEXT DEFAULT NULL, tmdb VARCHAR(255) DEFAULT NULL, place_of_birth VARCHAR(255) DEFAULT NULL, profile VARCHAR(255) DEFAULT NULL, deleted_at DATETIME DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, meta_id CHAR(36) DEFAULT NULL, UNIQUE INDEX UNIQ_34DCD17639FCA6F9 (meta_id), INDEX IDX_PERSORN_SLUG (slug), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA505221BA02 FOREIGN KEY (ref_person_id) REFERENCES person (id)'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA503D9A0094 FOREIGN KEY (ref_season_id) REFERENCES season (id)'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA5030EE8DBE FOREIGN KEY (ref_episode_id) REFERENCES episode (id)'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA50984707B FOREIGN KEY (ref_movie_id) REFERENCES movie (id)'); + $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA505F544E3A FOREIGN KEY (ref_serie_id) REFERENCES serie (id)'); + $this->addSql('ALTER TABLE person ADD CONSTRAINT FK_34DCD17639FCA6F9 FOREIGN KEY (meta_id) REFERENCES meta (id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA505221BA02'); + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA503D9A0094'); + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA5030EE8DBE'); + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA50984707B'); + $this->addSql('ALTER TABLE casting DROP FOREIGN KEY FK_D11BBA505F544E3A'); + $this->addSql('ALTER TABLE person DROP FOREIGN KEY FK_34DCD17639FCA6F9'); + $this->addSql('DROP TABLE casting'); + $this->addSql('DROP TABLE person'); + } +} diff --git a/apps/src/Api/TheMovieDbApi.php b/apps/src/Api/TheMovieDbApi.php index c374fe028..4e68b1c68 100644 --- a/apps/src/Api/TheMovieDbApi.php +++ b/apps/src/Api/TheMovieDbApi.php @@ -5,10 +5,12 @@ use Labstag\Api\Tmdb\TmdbImagesApi; use Labstag\Api\Tmdb\TmdbMoviesApi; use Labstag\Api\Tmdb\TmdbOtherApi; +use Labstag\Api\Tmdb\TmdbPersonApi; use Labstag\Api\Tmdb\TmdbTvApi; use Labstag\Entity\Company; use Labstag\Entity\Episode; use Labstag\Entity\Movie; +use Labstag\Entity\Person; use Labstag\Entity\Saga; use Labstag\Entity\Season; use Labstag\Entity\Serie; @@ -33,6 +35,8 @@ class TheMovieDbApi private TmdbOtherApi $tmdbOtherApi; + private TmdbPersonApi $tmdbPersonApi; + private TmdbTvApi $tmdbTvApi; public function __construct( @@ -47,6 +51,22 @@ public function __construct( $this->tmdbMoviesApi = new TmdbMoviesApi($cacheService, $httpClient, $tmdbBearerToken); $this->tmdbImagesApi = new TmdbImagesApi($cacheService, $httpClient, $tmdbBearerToken); $this->tmdbTvApi = new TmdbTvApi($cacheService, $httpClient, $tmdbBearerToken); + $this->tmdbPersonApi = new TmdbPersonApi($cacheService, $httpClient, $tmdbBearerToken); + } + + public function getDetailPerson(Person $person): ?array + { + $json = $this->getJson($person); + if (0 !== count($json)) { + return $json; + } + + $locale = $this->configurationService->getLocaleTmdb(); + $details['tmdb'] = $this->tmdbPersonApi->getDetails($person->getTmdb(), $locale); + + $this->setJson($person, $details); + + return $details; } public function getDetailsCompany(Company $company): array @@ -74,11 +94,12 @@ public function getDetailsEpisode(Episode $episode): array $details = []; $tmdb = $episode->getRefseason()->getRefserie()->getTmdb(); $seasonNumber = $episode->getRefseason()->getNumber(); - $episodeNumber = $episode->getNumber(); - $locale = $this->configurationService->getLocaleTmdb(); - $details['tmdb'] = $this->tvserie()->getEpisodeDetails($tmdb, $seasonNumber, $episodeNumber, $locale); - $details['other'] = $this->tvserie()->getEpisodeExternalIds($tmdb, $seasonNumber, $episodeNumber); - $details['images'] = $this->tvserie()->getEpisodeImages($tmdb, $seasonNumber, $episodeNumber, $locale); + $episodeNumber = $episode->getNumber(); + $locale = $this->configurationService->getLocaleTmdb(); + $details['tmdb'] = $this->tvserie()->getEpisodeDetails($tmdb, $seasonNumber, $episodeNumber, $locale); + $details['other'] = $this->tvserie()->getEpisodeExternalIds($tmdb, $seasonNumber, $episodeNumber); + $details['images'] = $this->tvserie()->getEpisodeImages($tmdb, $seasonNumber, $episodeNumber, $locale); + $details['credits'] = $this->tvserie()->getEpisodeCredits($tmdb, $seasonNumber, $episodeNumber, $locale); $this->setJson($episode, $details); return $details; @@ -159,11 +180,12 @@ public function getDetailsSeason(Season $season): array $details = []; $tmdb = $season->getRefserie()->getTmdb(); - $numberSeason = $season->getNumber(); - $locale = $this->configurationService->getLocaleTmdb(); - $details['tmdb'] = $this->tvserie()->getSeasonDetails($tmdb, $numberSeason, $locale); - $details['videos'] = $this->getVideosSeason($tmdb, $numberSeason); - $details['other'] = $this->tvserie()->getTvExternalIds($tmdb); + $numberSeason = $season->getNumber(); + $locale = $this->configurationService->getLocaleTmdb(); + $details['tmdb'] = $this->tvserie()->getSeasonDetails($tmdb, $numberSeason, $locale); + $details['videos'] = $this->getVideosSeason($tmdb, $numberSeason); + $details['other'] = $this->tvserie()->getTvExternalIds($tmdb); + $details['credits'] = $this->tvserie()->getSeasonCredits($tmdb, $numberSeason, $locale); $this->setJson($season, $details); return $details; @@ -204,6 +226,7 @@ public function getDetailsSerie(Serie $serie): array $tmdbId, ['language' => $locale] ); + $details['credits'] = $this->tvserie()->getCredits($tmdbId, $locale); $this->setJson($serie, $details); return $details; diff --git a/apps/src/Api/Tmdb/TmdbImagesApi.php b/apps/src/Api/Tmdb/TmdbImagesApi.php index 6ea18daf1..a4d47a87b 100644 --- a/apps/src/Api/Tmdb/TmdbImagesApi.php +++ b/apps/src/Api/Tmdb/TmdbImagesApi.php @@ -76,6 +76,19 @@ public function getPosterUrl(string $posterPath, int $targetWidth = 342): ?strin return $this->getOptimizedUrl($posterPath, 'poster', $targetWidth); } + /** + * Get poster URL with optimal size. + * + * @param string $profilePath The profile path from TMDB API + * @param int $targetWidth Desired width (default: 185px) + * + * @return string|null Complete profile URL + */ + public function getProfileUrl(string $profilePath, int $targetWidth = 185): ?string + { + return $this->getOptimizedUrl($profilePath, 'profile', $targetWidth); + } + /** * Get episode still image URL with optimal size. * diff --git a/apps/src/Api/Tmdb/TmdbPersonApi.php b/apps/src/Api/Tmdb/TmdbPersonApi.php new file mode 100644 index 000000000..e78aa359a --- /dev/null +++ b/apps/src/Api/Tmdb/TmdbPersonApi.php @@ -0,0 +1,56 @@ +|null + */ + public function getDetails(string $personId, ?string $language = null, ?string $appendToResponse = null): ?array + { + if ('' === trim($personId)) { + return null; + } + + $params = [ + 'language' => $language ?? 'fr-FR', + 'append_to_response' => $appendToResponse, + ]; + + $query = $this->buildQueryParams($params); + $cacheKey = 'tmdb_person_details_' . $personId . '_' . md5($query); + + return $this->getCached( + $cacheKey, + function (ItemInterface $item) use ($personId, $query): ?array { + $url = self::BASE_URL . '/person/' . $personId . $query; + $data = $this->makeRequest($url); + + if (null === $data || empty($data['name'])) { + $item->expiresAfter(0); + + return null; + } + + $item->expiresAfter(86400); + // 24 hours cache + + return $data; + }, + 86400 + ); + } +} diff --git a/apps/src/Api/Tmdb/TmdbTvApi.php b/apps/src/Api/Tmdb/TmdbTvApi.php index 198c2f760..b54ed335f 100644 --- a/apps/src/Api/Tmdb/TmdbTvApi.php +++ b/apps/src/Api/Tmdb/TmdbTvApi.php @@ -69,6 +69,46 @@ public function discovers(array $filters = [], ?string $language = null, int $pa return $data; } + /** + * Get TV series credits (cast and crew). + * + * @param string $seriesId TV series ID + * @param string|null $language Language (e.g., 'en-US', 'fr-FR') + * + * @return array|null + */ + public function getCredits(string $seriesId, ?string $language = null): ?array + { + $params = array_filter( + [ + 'language' => $language ?? 'fr-FR', + ] + ); + + $query = $this->buildQueryParams($params); + $cacheKey = 'tmdb_tv_credits_' . $seriesId . '_' . md5($query); + + return $this->getCached( + $cacheKey, + function (ItemInterface $item) use ($seriesId, $query): ?array { + $url = self::BASE_URL . '/tv/' . $seriesId . '/credits' . $query; + $data = $this->makeRequest($url); + + if (null === $data || (empty($data['cast']) && empty($data['crew']))) { + $item->expiresAfter(0); + + return null; + } + + $item->expiresAfter(86400); + // 24 hours cache + + return $data; + }, + 86400 + ); + } + /** * Get TV series details by ID. * @@ -109,6 +149,55 @@ function (ItemInterface $item) use ($seriesId, $query) { ); } + /** + * Get episode credits (cast and crew). + * + * @param string $seriesId TV series ID + * @param int $seasonNumber Season number + * @param int $episodeNumber Episode number + * @param string|null $language Language (e.g., 'en-US', 'fr-FR') + * + * @return array|null + */ + public function getEpisodeCredits( + string $seriesId, + int $seasonNumber, + int $episodeNumber, + ?string $language = null, + ): ?array + { + $params = array_filter( + [ + 'language' => $language ?? 'en-US', + ] + ); + + $query = $this->buildQueryParams($params); + $cacheKey = 'tmdb_tv_episode_credits_' . $seriesId . '_s' . $seasonNumber . 'e' . $episodeNumber . '_' . md5( + $query + ); + + return $this->getCached( + $cacheKey, + function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber, $query): ?array { + $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/episode/' . $episodeNumber . '/credits' . $query; + $data = $this->makeRequest($url); + + if (null === $data || (empty($data['cast']) && empty($data['crew']) && empty($data['guest_stars']))) { + $item->expiresAfter(0); + + return null; + } + + $item->expiresAfter(86400); + // 24 hours cache + + return $data; + }, + 86400 + ); + } + /** * @param string $seriesId TV series ID * @param int $seasonNumber Season number @@ -314,6 +403,47 @@ function (ItemInterface $item) use ($query): ?array { ); } + /** + * Get TV season credits (cast and crew). + * + * @param string $seriesId TV series ID + * @param int $seasonNumber Season number + * @param string|null $language Language (e.g., 'en-US', 'fr-FR') + * + * @return array|null + */ + public function getSeasonCredits(string $seriesId, int $seasonNumber, ?string $language = null): ?array + { + $params = array_filter( + [ + 'language' => $language ?? 'fr-FR', + ] + ); + + $query = $this->buildQueryParams($params); + $cacheKey = 'tmdb_tv_season_credits_' . $seriesId . '_s' . $seasonNumber . '_' . md5($query); + + return $this->getCached( + $cacheKey, + function (ItemInterface $item) use ($seriesId, $seasonNumber, $query): ?array { + $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/credits' . $query; + $data = $this->makeRequest($url); + + if (null === $data || (empty($data['cast']) && empty($data['crew']))) { + $item->expiresAfter(0); + + return null; + } + + $item->expiresAfter(86400); + // 24 hours cache + + return $data; + }, + 86400 + ); + } + /** * Get TV season details. * diff --git a/apps/src/Block/HtmlBlock.php b/apps/src/Block/HtmlBlock.php index 90de15226..289053fcc 100644 --- a/apps/src/Block/HtmlBlock.php +++ b/apps/src/Block/HtmlBlock.php @@ -24,8 +24,8 @@ public function getClass(): string public function getFields(Block $block, string $pageName): mixed { unset($block, $pageName); - $wysiwygTranslation = new TranslatableMessage('Content'); - $wysiwygField = WysiwygField::new('content', $wysiwygTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Content'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Command/ExecuteMessageCommand.php b/apps/src/Command/ExecuteMessageCommand.php index 0a9bb2959..0bd9c24b9 100644 --- a/apps/src/Command/ExecuteMessageCommand.php +++ b/apps/src/Command/ExecuteMessageCommand.php @@ -25,41 +25,38 @@ public function __construct( public function __invoke(SymfonyStyle $symfonyStyle): int { $choices = [ - 'PageCinema' => 'Generate cinema pages', - 'BanIp' => 'Ban IP addresses', - 'UpdateSerie' => 'Update series', + 'PageCinema' => 'Generate cinema pages', + 'BanIp' => 'Ban IP addresses', + 'UpdateSerie' => 'Update series', 'Notification' => 'Send notifications', - 'Meta' => 'Clean meta entries', - 'Files' => 'Clean files', - 'All' => 'Execute all tasks', - 'Cancel' => 'Cancel execution', + 'Meta' => 'Clean meta entries', + 'Files' => 'Clean files', + 'All' => 'Execute all tasks', + 'Cancel' => 'Cancel execution', ]; - $selected = $symfonyStyle->choice( - 'Which task do you want to execute?', - array_values($choices), - 6 - ); + $selected = $symfonyStyle->choice('Which task do you want to execute?', array_values($choices), 6); - $selectedKey = array_search($selected, $choices); + $selectedKey = array_search($selected, $choices, true); $messages = [ - 'PageCinema' => PageCinemaMessage::class, - 'BanIp' => BanIpMessage::class, - 'UpdateSerie' => UpdateSerieMessage::class, - 'Meta' => MetaMessage::class, - 'Files' => FilesMessage::class, + 'PageCinema' => PageCinemaMessage::class, + 'BanIp' => BanIpMessage::class, + 'UpdateSerie' => UpdateSerieMessage::class, + 'Meta' => MetaMessage::class, + 'Files' => FilesMessage::class, 'Notification' => NotificationMessage::class, ]; - $toExecute = $selectedKey === 'All' ? array_keys($messages) : [$selectedKey]; - if ($selectedKey === 'Cancel') { + $toExecute = 'All' === $selectedKey ? array_keys($messages) : [$selectedKey]; + if ('Cancel' === $selectedKey) { $symfonyStyle->warning('Execution cancelled by user.'); + return Command::SUCCESS; } foreach ($toExecute as $key) { - $symfonyStyle->section("Dispatching {$key}Message"); + $symfonyStyle->section(sprintf('Dispatching %sMessage', $key)); $this->messageBus->dispatch(new $messages[$key]()); } diff --git a/apps/src/Controller/Admin/BanIpCrudController.php b/apps/src/Controller/Admin/BanIpCrudController.php index 46f13b0ce..f47db46cc 100644 --- a/apps/src/Controller/Admin/BanIpCrudController.php +++ b/apps/src/Controller/Admin/BanIpCrudController.php @@ -38,11 +38,11 @@ public function configureCrud(Crud $crud): Crud public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); - $wysiwygTranslation = new TranslatableMessage('Reason'); - $fields = [ + $translatableMessage = new TranslatableMessage('Reason'); + $fields = [ $this->crudFieldFactory->booleanField('enable', new TranslatableMessage('Enable')), TextField::new('InternetProtocol', new TranslatableMessage('IP')), - WysiwygField::new('reason', $wysiwygTranslation->getMessage()), + WysiwygField::new('reason', $translatableMessage->getMessage()), ]; $this->crudFieldFactory->addFieldsToTab('principal', $fields); $this->crudFieldFactory->setTabDate($pageName); diff --git a/apps/src/Controller/Admin/BlockCrudController.php b/apps/src/Controller/Admin/BlockCrudController.php index c23a8a945..1ab9ec6d4 100644 --- a/apps/src/Controller/Admin/BlockCrudController.php +++ b/apps/src/Controller/Admin/BlockCrudController.php @@ -172,8 +172,8 @@ public function configureFilters(Filters $filters): Filters return $filters; } - $typeTranslation = new TranslatableMessage('Type'); - $discriminatorTypeFilter = DiscriminatorTypeFilter::new('type', $typeTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Type'); + $discriminatorTypeFilter = DiscriminatorTypeFilter::new('type', $translatableMessage->getMessage()); $discriminatorTypeFilter->setBlockService($this->blockService); $discriminatorTypeFilter->setChoices( array_merge( diff --git a/apps/src/Controller/Admin/ChapterCrudController.php b/apps/src/Controller/Admin/ChapterCrudController.php index 263388f1a..ff6edeb46 100644 --- a/apps/src/Controller/Admin/ChapterCrudController.php +++ b/apps/src/Controller/Admin/ChapterCrudController.php @@ -47,14 +47,14 @@ public function configureCrud(Crud $crud): Crud public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); - $wysiwygTranslation = new TranslatableMessage('resume'); - $fields = [ + $translatableMessage = new TranslatableMessage('resume'); + $fields = [ $this->crudFieldFactory->slugField(readOnly: true), $this->crudFieldFactory->booleanField('enable', new TranslatableMessage('Enable')), $this->crudFieldFactory->titleField(), $this->crudFieldFactory->imageField('img', $pageName, self::getEntityFqcn()), $this->addFieldRefStory(), - WysiwygField::new('resume', $wysiwygTranslation->getMessage())->hideOnIndex(), + WysiwygField::new('resume', $translatableMessage->getMessage())->hideOnIndex(), ]; $this->crudFieldFactory->addFieldsToTab('principal', $fields); diff --git a/apps/src/Controller/Admin/ConfigurationCrudController.php b/apps/src/Controller/Admin/ConfigurationCrudController.php index cb33eb074..475947f24 100644 --- a/apps/src/Controller/Admin/ConfigurationCrudController.php +++ b/apps/src/Controller/Admin/ConfigurationCrudController.php @@ -38,7 +38,7 @@ public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); $copyrightTranslation = new TranslatableMessage('Copyright'); - $fields = [ + $fields = [ TextField::new('titleFormat', new TranslatableMessage('Title format')), TextField::new('name', new TranslatableMessage('Site name')), EmailField::new('email', new TranslatableMessage('Email')), @@ -83,7 +83,8 @@ public function configureFields(string $pageName): iterable ); $this->crudFieldFactory->addTab('medias', FormField::addTab(new TranslatableMessage('Medias'))); - $logoTranslation = new TranslatableMessage('Logo'); + + $logoTranslation = new TranslatableMessage('Logo'); $placeHolderTranslation = new TranslatableMessage('Placeholder'); $this->crudFieldFactory->addFieldsToTab( 'medias', @@ -120,7 +121,7 @@ public static function getEntityFqcn(): string private function addConfigureFieldsPlaceHolders(string $pageName): array { $chapterTranslation = new TranslatableMessage('Chapter'); - $editoTranslation = new TranslatableMessage('Edito'); + $editoTranslation = new TranslatableMessage('Edito'); $episodeTranslation = new TranslatableMessage('Episode'); $memoTranslation = new TranslatableMessage('Memo'); $movieTranslation = new TranslatableMessage('Movie'); @@ -129,10 +130,11 @@ private function addConfigureFieldsPlaceHolders(string $pageName): array $postTranslation = new TranslatableMessage('Post'); $sagaTranslation = new TranslatableMessage('Saga'); $seasonTranslation = new TranslatableMessage('Season'); - $serieTranslation = new TranslatableMessage('Serie'); - $starTranslation = new TranslatableMessage('Star'); - $storyTranslation = new TranslatableMessage('Story'); - $userTranslation = new TranslatableMessage('User'); + $serieTranslation = new TranslatableMessage('Serie'); + $starTranslation = new TranslatableMessage('Star'); + $storyTranslation = new TranslatableMessage('Story'); + $userTranslation = new TranslatableMessage('User'); + return [ FormField::addColumn(6), $this->crudFieldFactory->imageField( diff --git a/apps/src/Controller/Admin/DashboardController.php b/apps/src/Controller/Admin/DashboardController.php index fb9d36cf6..904e44231 100644 --- a/apps/src/Controller/Admin/DashboardController.php +++ b/apps/src/Controller/Admin/DashboardController.php @@ -369,6 +369,11 @@ private function buildContentMenus(array $categories, array $tags): iterable private function buildSimpleCrudMenus(): iterable { $items = [ + [ + new TranslatableMessage('Person'), + 'fas fa-users', + PersonCrudController::getEntityFqcn(), + ], [ new TranslatableMessage('Company'), 'fas fa-building', diff --git a/apps/src/Controller/Admin/EpisodeCrudController.php b/apps/src/Controller/Admin/EpisodeCrudController.php index 320ef9c68..cd117bf5a 100644 --- a/apps/src/Controller/Admin/EpisodeCrudController.php +++ b/apps/src/Controller/Admin/EpisodeCrudController.php @@ -79,9 +79,13 @@ function ($value, $entity) { $integerField = IntegerField::new('runtime', new TranslatableMessage('Runtime')); $integerField->setTemplatePath('admin/field/runtime-episode.html.twig'); - $wysiwgTranslation = new TranslatableMessage('Overview'); - $wysiwgField = WysiwygField::new('overview', $wysiwgTranslation->getMessage()); - $wysiwgField->hideOnIndex(); + $translatableMessage = new TranslatableMessage('Overview'); + $wysiwygField = WysiwygField::new('overview', $translatableMessage->getMessage()); + $wysiwygField->hideOnIndex(); + + $associationField = AssociationField::new('castings', new TranslatableMessage('Casting')); + $associationField->setTemplatePath('admin/field/castings.html.twig'); + $associationField->onlyOnDetail(); $this->crudFieldFactory->addFieldsToTab( 'principal', @@ -96,6 +100,7 @@ function ($value, $entity) { DateField::new('air_date', new TranslatableMessage('Air date')), $integerField, $wysiwygField, + $associationField, ] ); diff --git a/apps/src/Controller/Admin/Factory/CrudFieldFactory.php b/apps/src/Controller/Admin/Factory/CrudFieldFactory.php index 14986c5af..f5b76877f 100644 --- a/apps/src/Controller/Admin/Factory/CrudFieldFactory.php +++ b/apps/src/Controller/Admin/Factory/CrudFieldFactory.php @@ -283,8 +283,9 @@ public function fileField( ): TextField|UploadFileField { if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { - $fileTranslation = new TranslatableMessage('File'); - return UploadFileField::new($type . 'File', $label ?? $fileTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('File'); + + return UploadFileField::new($type . 'File', $label ?? $translatableMessage->getMessage()); } $this->fileService->getBasePath($entityFqcn, $type . 'File'); @@ -324,8 +325,8 @@ public function imageField( ): ImageField|UploadImageField { if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { - $fileTranslation = new TranslatableMessage('Image'); - $uploadImageField = UploadImageField::new($type . 'File', $label ?? $fileTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Image'); + $uploadImageField = UploadImageField::new($type . 'File', $label ?? $translatableMessage->getMessage()); $uploadImageField->setTranslator($this->translator); return $uploadImageField; @@ -579,8 +580,8 @@ private function setTabParagraphs(string $pageName): void $key = 'paragraphs'; $this->addTab($key, FormField::addTab(new TranslatableMessage('Paragraphs'))); - $paragraphsTranslation = new TranslatableMessage('Paragraphs'); - $paragraphsField = ParagraphsField::new('paragraphs', $paragraphsTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Paragraphs'); + $paragraphsField = ParagraphsField::new('paragraphs', $translatableMessage->getMessage()); $paragraphsField->hideWhenCreating(); $paragraphsField->hideOnIndex(); $this->addFieldsToTab($key, [$paragraphsField]); diff --git a/apps/src/Controller/Admin/GameCrudController.php b/apps/src/Controller/Admin/GameCrudController.php index 10233810f..9bed22941 100644 --- a/apps/src/Controller/Admin/GameCrudController.php +++ b/apps/src/Controller/Admin/GameCrudController.php @@ -98,7 +98,10 @@ public function addByApi(Request $request): JsonResponse [ 'status' => 'success', 'id' => $id, - 'message' => $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()), + 'message' => $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ), ] ); } @@ -202,8 +205,8 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->setTabDate($pageName); - $wysiwgTranslation = new TranslatableMessage('Summary'); - $wysiwygField = WysiwygField::new('summary', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Summary'); + $wysiwygField = WysiwygField::new('summary', $translatableMessage->getMessage()); $wysiwygField->hideOnIndex(); $this->crudFieldFactory->addFieldsToTab( diff --git a/apps/src/Controller/Admin/MediaCrudController.php b/apps/src/Controller/Admin/MediaCrudController.php index 098ccdc7a..6f7c07c74 100644 --- a/apps/src/Controller/Admin/MediaCrudController.php +++ b/apps/src/Controller/Admin/MediaCrudController.php @@ -48,8 +48,8 @@ function ($value, Media $media): string { ); $integerField->hideOnForm(); - $fileTranslation = new TranslatableMessage('File'); - $uploadFileField = UploadFileField::new('file', $fileTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('File'); + $uploadFileField = UploadFileField::new('file', $translatableMessage->getMessage()); $uploadFileField->setTranslator($this->translator); $uploadFileField->onlyOnForms(); diff --git a/apps/src/Controller/Admin/MetaCrudController.php b/apps/src/Controller/Admin/MetaCrudController.php index 453dc22fe..092cbc86c 100644 --- a/apps/src/Controller/Admin/MetaCrudController.php +++ b/apps/src/Controller/Admin/MetaCrudController.php @@ -26,14 +26,14 @@ public function configureActions(Actions $actions): Actions public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); - $metaParentTranslation = new TranslatableMessage('Parent'); + $translatableMessage = new TranslatableMessage('Parent'); $this->crudFieldFactory->addFieldsToTab( 'principal', [ $this->crudFieldFactory->titleField(), TextField::new('keywords', new TranslatableMessage('Keywords')), TextField::new('description', new TranslatableMessage('Description')), - MetaParentField::new('parent', $metaParentTranslation->getMessage()), + MetaParentField::new('parent', $translatableMessage->getMessage()), ] ); diff --git a/apps/src/Controller/Admin/MovieCrudController.php b/apps/src/Controller/Admin/MovieCrudController.php index 2a3aa16e6..1531e7b35 100644 --- a/apps/src/Controller/Admin/MovieCrudController.php +++ b/apps/src/Controller/Admin/MovieCrudController.php @@ -175,18 +175,23 @@ public function configureFields(string $pageName): iterable $trailerField->hideOnIndex(); $wysiwgTranslation = new TranslatableMessage('Citation'); - $wysiwygField = WysiwygField::new('citation', $wysiwgTranslation->getMessage()); + $wysiwygField = WysiwygField::new('citation', $wysiwgTranslation->getMessage()); $wysiwygField->hideOnIndex(); $descriptionTranslation = new TranslatableMessage('Description'); - $descriptionField = WysiwygField::new('description', $descriptionTranslation->getMessage()); + $descriptionField = WysiwygField::new('description', $descriptionTranslation->getMessage()); $descriptionField->hideOnIndex(); $booleanField = $this->crudFieldFactory->booleanField('file', new TranslatableMessage('File')); $booleanField->hideOnIndex(); - $posterTranslation = new TranslatableMessage('Poster'); + $posterTranslation = new TranslatableMessage('Poster'); $backdropTranslation = new TranslatableMessage('Backdrop'); + + $associationField = AssociationField::new('castings', new TranslatableMessage('Casting')); + $associationField->setTemplatePath('admin/field/castings.html.twig'); + $associationField->onlyOnDetail(); + $this->crudFieldFactory->addFieldsToTab( 'principal', [ @@ -221,6 +226,7 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->companiesFieldForPage(self::getEntityFqcn(), $pageName), // image field déjà incluse dans baseIdentitySet $booleanField, + $associationField, $this->crudFieldFactory->booleanField('adult', new TranslatableMessage('Adult')), ] ); @@ -238,8 +244,8 @@ public function configureFilters(Filters $filters): Filters $filters->add('releaseDate'); $countries = $repositoryAbstract->getCountries(); if ([] != $countries) { - $countriesTranslation = new TranslatableMessage('Countries'); - $countriesFilter = CountriesFilter::new('countries', $countriesTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Countries'); + $countriesFilter = CountriesFilter::new('countries', $translatableMessage->getMessage()); $countriesFilter->setChoices( array_merge( ['' => ''], diff --git a/apps/src/Controller/Admin/NotificationCrudController.php b/apps/src/Controller/Admin/NotificationCrudController.php index 77504d7be..b8bf818ad 100644 --- a/apps/src/Controller/Admin/NotificationCrudController.php +++ b/apps/src/Controller/Admin/NotificationCrudController.php @@ -43,6 +43,7 @@ public function configureCrud(Crud $crud): Crud #[Override] public function configureFields(string $pageName): iterable { + unset($pageName); yield TextField::new('title', new TranslatableMessage('Title')); yield TextEditorField::new('message', new TranslatableMessage('Message')); yield DateTimeField::new('createdAt', new TranslatableMessage('Created At')); diff --git a/apps/src/Controller/Admin/PageCrudController.php b/apps/src/Controller/Admin/PageCrudController.php index 0a1030da7..8284e15be 100644 --- a/apps/src/Controller/Admin/PageCrudController.php +++ b/apps/src/Controller/Admin/PageCrudController.php @@ -44,9 +44,9 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->setTabPrincipal($this->getContext()); $this->crudFieldFactory->addFieldsToTab('principal', $this->getIdEntity($pageName, $currentEntity)); - $fieldChoice = $this->addFieldIsHome($currentEntity, $pageName); - $wysiwgTranslation = new TranslatableMessage('resume'); - $wysiwygField = WysiwygField::new('resume', $wysiwgTranslation->getMessage()); + $fieldChoice = $this->addFieldIsHome($currentEntity, $pageName); + $translatableMessage = new TranslatableMessage('resume'); + $wysiwygField = WysiwygField::new('resume', $translatableMessage->getMessage()); $wysiwygField->hideOnIndex(); if ($fieldChoice instanceof ChoiceField) { $this->crudFieldFactory->addFieldsToTab('principal', [$fieldChoice, $wysiwygField]); diff --git a/apps/src/Controller/Admin/ParagraphCrudController.php b/apps/src/Controller/Admin/ParagraphCrudController.php index f25e227d1..59467ac85 100644 --- a/apps/src/Controller/Admin/ParagraphCrudController.php +++ b/apps/src/Controller/Admin/ParagraphCrudController.php @@ -70,10 +70,10 @@ public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); $currentEntity = $this->getContext()->getEntity()->getInstance(); - $parentTranslation = new TranslatableMessage('Parent'); + $translatableMessage = new TranslatableMessage('Parent'); $this->crudFieldFactory->addFieldsToTab( 'principal', - [ParagraphParentField::new('parent', $parentTranslation->getMessage())] + [ParagraphParentField::new('parent', $translatableMessage->getMessage())] ); $this->crudFieldFactory->addFieldsToTab( 'principal', @@ -117,8 +117,8 @@ public function configureFilters(Filters $filters): Filters return $filters; } - $typeTranslation = new TranslatableMessage('Type'); - $discriminatorTypeFilter = DiscriminatorTypeFilter::new('type', $typeTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Type'); + $discriminatorTypeFilter = DiscriminatorTypeFilter::new('type', $translatableMessage->getMessage()); $discriminatorTypeFilter->setParagraphService($this->paragraphService); $discriminatorTypeFilter->setChoices( array_merge( diff --git a/apps/src/Controller/Admin/PersonCrudController.php b/apps/src/Controller/Admin/PersonCrudController.php new file mode 100644 index 000000000..01d3b72e4 --- /dev/null +++ b/apps/src/Controller/Admin/PersonCrudController.php @@ -0,0 +1,169 @@ +actionsFactory->init($actions, self::getEntityFqcn(), static::class); + $this->actionsFactory->remove(Crud::PAGE_INDEX, Action::NEW); + $this->actionsFactory->setLinkTmdbAction(); + $this->setUpdateAction(); + $this->actionsFactory->setActionUpdateAll('updateAllPerson'); + + return $this->actionsFactory->show(); + } + + #[Override] + public function configureCrud(Crud $crud): Crud + { + $crud = parent::configureCrud($crud); + $crud->setEntityLabelInSingular(new TranslatableMessage('Person')); + $crud->setEntityLabelInPlural(new TranslatableMessage('Persons')); + $crud->setDefaultSort( + ['title' => 'ASC'] + ); + + return $crud; + } + + #[Override] + public function configureFields(string $pageName): iterable + { + $this->crudFieldFactory->setTabPrincipal($this->getContext()); + $choiceField = ChoiceField::new('gender', new TranslatableMessage('Gender')); + $choices = [ + 0 => new TranslatableMessage('Not set / not specified'), + 1 => new TranslatableMessage('Female'), + 2 => new TranslatableMessage('Male'), + 3 => new TranslatableMessage('Non-binary'), + ]; + $data = []; + foreach ($choices as $value => $label) { + $data[$label->getMessage()] = $value; + } + + $choiceField->setChoices($data); + $choiceField->hideOnIndex(); + + $wysiwgTranslation = new TranslatableMessage('Biography'); + $wysiwygField = WysiwygField::new('biography', $wysiwgTranslation->getMessage()); + $wysiwygField->hideOnIndex(); + + $textField = TextField::new('placeOfBirth', new TranslatableMessage('Place of birth')); + $textField->hideOnIndex(); + + $profileTranslation = new TranslatableMessage('Profile'); + $this->crudFieldFactory->addFieldsToTab( + 'principal', + [ + $this->crudFieldFactory->slugField(), + $this->crudFieldFactory->titleField(), + $choiceField, + $this->crudFieldFactory->imageField( + 'profile', + $pageName, + self::getEntityFqcn(), + $profileTranslation->getMessage() + ), + DateField::new('birthday', new TranslatableMessage('Birthday')), + DateField::new('deathday', new TranslatableMessage('Deathday')), + $textField, + $wysiwygField, + ] + ); + + yield from $this->crudFieldFactory->getConfigureFields($pageName); + } + + public static function getEntityFqcn(): string + { + return Person::class; + } + + public function jsonPerson(Request $request): JsonResponse + { + $entityId = $request->query->get('entityId'); + $repositoryAbstract = $this->getRepository(); + $person = $repositoryAbstract->find($entityId); + $details = $this->theMovieDbApi->getDetailPerson($person); + + return new JsonResponse($details); + } + + public function tmdb(Request $request): RedirectResponse + { + $entityId = $request->query->get('entityId'); + $repositoryAbstract = $this->getRepository(); + $movie = $repositoryAbstract->find($entityId); + + return $this->redirect('https://www.themoviedb.org/person/' . $movie->getTmdb()); + } + + public function updateAllPerson(): RedirectResponse + { + $this->messageBus->dispatch(new PersonAllMessage()); + + return $this->redirectToRoute('admin_person_index'); + } + + public function updatePerson(Request $request): RedirectResponse + { + $entityId = $request->query->get('entityId'); + $repositoryAbstract = $this->getRepository(); + $person = $repositoryAbstract->find($entityId); + $this->messageBus->dispatch(new PersonMessage($person->getId())); + if ($request->headers->has('referer')) { + $url = $request->headers->get('referer'); + if (is_string($url) && '' !== $url) { + return $this->redirect($url); + } + } + + return $this->redirectToRoute('admin_person_index'); + } + + private function setUpdateAction(): void + { + if (!$this->actionsFactory->isTrash()) { + return; + } + + $action = Action::new('updatePerson', new TranslatableMessage('Update'), 'fas fa-sync-alt'); + $action->linkToCrudAction('updatePerson'); + $action->displayIf(static fn ($entity): bool => is_null($entity->getDeletedAt())); + + $this->actionsFactory->add(Crud::PAGE_DETAIL, $action); + $this->actionsFactory->add(Crud::PAGE_EDIT, $action); + $this->actionsFactory->add(Crud::PAGE_INDEX, $action); + + $action = Action::new('jsonPerson', new TranslatableMessage('Json'), 'fas fa-server'); + $action->linkToCrudAction('jsonPerson'); + $action->setHtmlAttributes( + ['target' => '_blank'] + ); + $action->displayIf(static fn ($entity): bool => is_null($entity->getDeletedAt())); + + $this->actionsFactory->add(Crud::PAGE_DETAIL, $action); + $this->actionsFactory->add(Crud::PAGE_EDIT, $action); + $this->actionsFactory->add(Crud::PAGE_INDEX, $action); + } +} diff --git a/apps/src/Controller/Admin/PlatformCrudController.php b/apps/src/Controller/Admin/PlatformCrudController.php index ca47a1986..eda345f41 100644 --- a/apps/src/Controller/Admin/PlatformCrudController.php +++ b/apps/src/Controller/Admin/PlatformCrudController.php @@ -29,7 +29,10 @@ public function addByApi(Request $request): JsonResponse [ 'status' => 'success', 'id' => $id, - 'message' => $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()), + 'message' => $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ), ] ); } diff --git a/apps/src/Controller/Admin/PostCrudController.php b/apps/src/Controller/Admin/PostCrudController.php index 55a6b9417..1a789d964 100644 --- a/apps/src/Controller/Admin/PostCrudController.php +++ b/apps/src/Controller/Admin/PostCrudController.php @@ -53,8 +53,8 @@ public function configureFields(string $pageName): iterable ); // Additional specific field (resume) not yet in factory bundle - placed at end of principal tab - $wysiwgTranslation = new TranslatableMessage('resume'); - $wysiwygField = WysiwygField::new('resume', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('resume'); + $wysiwygField = WysiwygField::new('resume', $translatableMessage->getMessage()); $wysiwygField->hideOnIndex(); $this->crudFieldFactory->addFieldsToTab('principal', [$wysiwygField]); diff --git a/apps/src/Controller/Admin/SagaCrudController.php b/apps/src/Controller/Admin/SagaCrudController.php index a1168d9a4..ba7fadbc0 100644 --- a/apps/src/Controller/Admin/SagaCrudController.php +++ b/apps/src/Controller/Admin/SagaCrudController.php @@ -53,9 +53,10 @@ public function configureFields(string $pageName): iterable $textField = TextField::new('tmdb', new TranslatableMessage('Tmdb')); $wysiwgTranslation = new TranslatableMessage('Description'); - $wysiwygField = WysiwygField::new('description', $wysiwgTranslation->getMessage()); + $wysiwygField = WysiwygField::new('description', $wysiwgTranslation->getMessage()); $wysiwygField->hideOnIndex(); - $posterTranslation = new TranslatableMessage('Poster'); + + $posterTranslation = new TranslatableMessage('Poster'); $backdropTranslation = new TranslatableMessage('Backdrop'); $this->crudFieldFactory->addFieldsToTab( 'principal', diff --git a/apps/src/Controller/Admin/SeasonCrudController.php b/apps/src/Controller/Admin/SeasonCrudController.php index 6a2e1ea07..d9bcc3c72 100644 --- a/apps/src/Controller/Admin/SeasonCrudController.php +++ b/apps/src/Controller/Admin/SeasonCrudController.php @@ -62,10 +62,16 @@ public function configureFields(string $pageName): iterable $collectionField->hideOnForm(); $wysiwgTranslation = new TranslatableMessage('Overview'); - $wysiwygField = WysiwygField::new('overview', $wysiwgTranslation->getMessage()); + $wysiwygField = WysiwygField::new('overview', $wysiwgTranslation->getMessage()); $wysiwygField->hideOnIndex(); - $posterTranslation = new TranslatableMessage('Poster'); + + $posterTranslation = new TranslatableMessage('Poster'); $backdropTranslation = new TranslatableMessage('Backdrop'); + + $associationField = AssociationField::new('castings', new TranslatableMessage('Casting')); + $associationField->setTemplatePath('admin/field/castings.html.twig'); + $associationField->onlyOnDetail(); + $this->crudFieldFactory->addFieldsToTab( 'principal', [ @@ -91,6 +97,7 @@ public function configureFields(string $pageName): iterable $this->episodesFieldForPage(self::getEntityFqcn(), $pageName), $collectionField, $wysiwygField, + $associationField, ] ); $this->crudFieldFactory->setTabDate($pageName); diff --git a/apps/src/Controller/Admin/SerieCrudController.php b/apps/src/Controller/Admin/SerieCrudController.php index 2903d5ce5..802dbc8fc 100644 --- a/apps/src/Controller/Admin/SerieCrudController.php +++ b/apps/src/Controller/Admin/SerieCrudController.php @@ -180,18 +180,23 @@ public function configureFields(string $pageName): iterable $trailerField->hideOnIndex(); $wysiwgTranslation = new TranslatableMessage('Citation'); - $wysiwygField = WysiwygField::new('citation', $wysiwgTranslation->getMessage()); + $wysiwygField = WysiwygField::new('citation', $wysiwgTranslation->getMessage()); $wysiwygField->hideOnIndex(); $descriptionTranslation = new TranslatableMessage('Description'); - $descriptionField = WysiwygField::new('description', $descriptionTranslation->getMessage()); + $descriptionField = WysiwygField::new('description', $descriptionTranslation->getMessage()); $descriptionField->hideOnIndex(); $booleanField = $this->crudFieldFactory->booleanField('file', new TranslatableMessage('File')); $booleanField->hideOnIndex(); - $posterTranslation = new TranslatableMessage('Poster'); + + $posterTranslation = new TranslatableMessage('Poster'); $backdropTranslation = new TranslatableMessage('Backdrop'); + $castingField = AssociationField::new('castings', new TranslatableMessage('Casting')); + $castingField->setTemplatePath('admin/field/castings.html.twig'); + $castingField->onlyOnDetail(); + $this->crudFieldFactory->addFieldsToTab( 'principal', [ @@ -227,6 +232,7 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->companiesFieldForPage(self::getEntityFqcn(), $pageName), $associationField, $booleanField, + $castingField, $this->crudFieldFactory->booleanField('adult', new TranslatableMessage('Adult')), ] ); @@ -243,8 +249,8 @@ public function configureFilters(Filters $filters): Filters $filters->add('releaseDate'); $countries = $this->getRepository()->getCountries(); if ([] != $countries) { - $countriesTranslation = new TranslatableMessage('Countries'); - $countriesFilter = CountriesFilter::new('countries', $countriesTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Countries'); + $countriesFilter = CountriesFilter::new('countries', $translatableMessage->getMessage()); $countriesFilter->setChoices( array_merge( ['' => ''], diff --git a/apps/src/Controller/Admin/StoryCrudController.php b/apps/src/Controller/Admin/StoryCrudController.php index 13859153d..7929651e0 100644 --- a/apps/src/Controller/Admin/StoryCrudController.php +++ b/apps/src/Controller/Admin/StoryCrudController.php @@ -97,8 +97,8 @@ public function configureCrud(Crud $crud): Crud public function configureFields(string $pageName): iterable { $this->crudFieldFactory->setTabPrincipal($this->getContext()); - $wysiwgTranslation = new TranslatableMessage('resume'); - $wysiwygField = WysiwygField::new('resume', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('resume'); + $wysiwygField = WysiwygField::new('resume', $translatableMessage->getMessage()); $wysiwygField->hideOnIndex(); $this->crudFieldFactory->addFieldsToTab( diff --git a/apps/src/Controller/Admin/TemplateCrudController.php b/apps/src/Controller/Admin/TemplateCrudController.php index 5ea322a33..48b8d8bf5 100644 --- a/apps/src/Controller/Admin/TemplateCrudController.php +++ b/apps/src/Controller/Admin/TemplateCrudController.php @@ -45,8 +45,8 @@ public function configureFields(string $pageName): iterable $textField->setDisabled(true); } - $wysiwgTranslation = new TranslatableMessage('HTML'); - $wysiwygField = WysiwygField::new('html', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('HTML'); + $wysiwygField = WysiwygField::new('html', $translatableMessage->getMessage()); $wysiwygField->onlyOnForms(); $textareaField = TextareaField::new('text', new TranslatableMessage('Texte brut')); diff --git a/apps/src/Entity/Casting.php b/apps/src/Entity/Casting.php new file mode 100644 index 000000000..5c28a2ed4 --- /dev/null +++ b/apps/src/Entity/Casting.php @@ -0,0 +1,129 @@ +figure; + } + + public function getId(): ?string + { + return $this->id; + } + + public function getKnownForDepartment(): ?string + { + return $this->knownForDepartment; + } + + public function getRefEpisode(): ?Episode + { + return $this->refEpisode; + } + + public function getRefMovie(): ?Movie + { + return $this->refMovie; + } + + public function getRefPerson(): ?Person + { + return $this->refPerson; + } + + public function getRefSeason(): ?Season + { + return $this->refSeason; + } + + public function getRefSerie(): ?Serie + { + return $this->refSerie; + } + + public function setFigure(?string $figure): static + { + $this->figure = $figure; + + return $this; + } + + public function setKnownForDepartment(?string $knownForDepartment): static + { + $this->knownForDepartment = $knownForDepartment; + + return $this; + } + + public function setRefEpisode(?Episode $refEpisode): static + { + $this->refEpisode = $refEpisode; + + return $this; + } + + public function setRefMovie(?Movie $refMovie): static + { + $this->refMovie = $refMovie; + + return $this; + } + + public function setRefPerson(?Person $refPerson): static + { + $this->refPerson = $refPerson; + + return $this; + } + + public function setRefSeason(?Season $refSeason): static + { + $this->refSeason = $refSeason; + + return $this; + } + + public function setRefSerie(?Serie $refSerie): static + { + $this->refSerie = $refSerie; + + return $this; + } +} diff --git a/apps/src/Entity/Episode.php b/apps/src/Entity/Episode.php index c6ee37066..9e162ddf9 100644 --- a/apps/src/Entity/Episode.php +++ b/apps/src/Entity/Episode.php @@ -4,6 +4,8 @@ use DateTime; use DateTimeImmutable; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as Gedmo; @@ -69,16 +71,45 @@ class Episode implements Stringable #[ORM\Column(name: 'vote_count', nullable: true)] protected ?int $voteCount = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refEpisode')] + private Collection $castings; + + public function __construct() + { + $this->castings = new ArrayCollection(); + } + public function __toString(): string { return (string) $this->getTitle(); } + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefEpisode($this); + } + + return $this; + } + public function getAirDate(): ?DateTime { return $this->airDate; } + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + public function getId(): ?string { return $this->id; @@ -139,6 +170,16 @@ public function isEnable(): ?bool return $this->enable; } + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefEpisode() === $this) { + $casting->setRefEpisode(null); + } + + return $this; + } + public function setAirDate(?DateTime $airDate): static { $this->airDate = $airDate; diff --git a/apps/src/Entity/Meta.php b/apps/src/Entity/Meta.php index 6cd10edd7..1cbbf23f5 100644 --- a/apps/src/Entity/Meta.php +++ b/apps/src/Entity/Meta.php @@ -43,6 +43,9 @@ class Meta implements Stringable #[ORM\OneToOne(mappedBy: 'meta', cascade: ['persist', 'remove'], orphanRemoval: true)] protected ?Page $page = null; + #[ORM\OneToOne(mappedBy: 'meta', cascade: ['persist', 'remove'], orphanRemoval: true)] + protected ?Person $person = null; + #[ORM\OneToOne(mappedBy: 'meta', cascade: ['persist', 'remove'], orphanRemoval: true)] protected ?Post $post = null; @@ -102,6 +105,11 @@ public function getPage(): ?Page return $this->page; } + public function getPerson(): ?Person + { + return $this->person; + } + public function getPost(): ?Post { return $this->post; @@ -194,6 +202,18 @@ public function setPage(Page $page): static return $this; } + public function setPerson(Person $person): static + { + // set the owning side of the relation if necessary + if ($person->getMeta() !== $this) { + $person->setMeta($this); + } + + $this->person = $person; + + return $this; + } + public function setPost(Post $post): static { // set the owning side of the relation if necessary diff --git a/apps/src/Entity/Movie.php b/apps/src/Entity/Movie.php index 77761107c..3fefff2fb 100644 --- a/apps/src/Entity/Movie.php +++ b/apps/src/Entity/Movie.php @@ -135,6 +135,12 @@ class Movie implements Stringable, EntityWithParagraphsInterface #[ORM\Column(nullable: true)] protected ?int $votes = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refMovie')] + private Collection $castings; + /** * @var Collection */ @@ -149,6 +155,7 @@ public function __construct() $this->categories = new ArrayCollection(); $this->paragraphs = new ArrayCollection(); $this->companies = new ArrayCollection(); + $this->castings = new ArrayCollection(); } #[Override] @@ -157,6 +164,16 @@ public function __toString(): string return (string) $this->getTitle(); } + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefMovie($this); + } + + return $this; + } + public function addCategory(MovieCategory $movieCategory): static { if (!$this->categories->contains($movieCategory)) { @@ -197,6 +214,14 @@ public function getBackdropFile(): ?File return $this->backdropFile; } + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + /** * @return Collection */ @@ -329,6 +354,16 @@ public function isFile(): ?bool return $this->file; } + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefMovie() === $this) { + $casting->setRefMovie(null); + } + + return $this; + } + public function removeCategory(MovieCategory $movieCategory): static { if ($this->categories->removeElement($movieCategory)) { diff --git a/apps/src/Entity/Person.php b/apps/src/Entity/Person.php new file mode 100644 index 000000000..d1256fb2c --- /dev/null +++ b/apps/src/Entity/Person.php @@ -0,0 +1,250 @@ + + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refPerson')] + private Collection $castings; + + #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] + private ?DateTime $deathday = null; + + #[ORM\Column(type: Types::SMALLINT, nullable: true)] + private ?int $gender = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $placeOfBirth = null; + + #[ORM\Column(length: 255)] + private ?string $title = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $tmdb = null; + + public function __construct() + { + $this->castings = new ArrayCollection(); + } + + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefPerson($this); + } + + return $this; + } + + public function getBiography(): ?string + { + return $this->biography; + } + + public function getBirthday(): ?DateTime + { + return $this->birthday; + } + + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + + public function getDeathday(): ?DateTime + { + return $this->deathday; + } + + public function getGender(): ?int + { + return $this->gender; + } + + public function getId(): ?string + { + return $this->id; + } + + public function getMeta(): ?Meta + { + return $this->meta; + } + + public function getPlaceOfBirth(): ?string + { + return $this->placeOfBirth; + } + + public function getProfile(): ?string + { + return $this->profile; + } + + public function getProfileFile(): ?File + { + return $this->profileFile; + } + + public function getSlug(): ?string + { + return $this->slug; + } + + public function getTitle(): ?string + { + return $this->title; + } + + public function getTmdb(): ?string + { + return $this->tmdb; + } + + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefPerson() === $this) { + $casting->setRefPerson(null); + } + + return $this; + } + + public function setBiography(?string $biography): static + { + $this->biography = $biography; + + return $this; + } + + public function setBirthday(?DateTime $birthday): static + { + $this->birthday = $birthday; + + return $this; + } + + public function setDeathday(?DateTime $deathday): static + { + $this->deathday = $deathday; + + return $this; + } + + public function setGender(?int $gender): static + { + $this->gender = $gender; + + return $this; + } + + public function setMeta(Meta $meta): static + { + $this->meta = $meta; + + return $this; + } + + public function setPlaceOfBirth(?string $placeOfBirth): static + { + $this->placeOfBirth = $placeOfBirth; + + return $this; + } + + public function setProfile(?string $profile): void + { + $this->profile = $profile; + + if (null === $profile) { + $this->updatedAt = DateTime::createFromImmutable(new DateTimeImmutable()); + } + } + + public function setProfileFile(?File $profileFile = null): void + { + $this->profileFile = $profileFile; + + if ($profileFile instanceof File) { + // It is required that at least one field changes if you are using doctrine + // otherwise the event listeners won't be called and the file is lost + $this->updatedAt = DateTime::createFromImmutable(new DateTimeImmutable()); + } + } + + public function setSlug(?string $slug): static + { + $this->slug = $slug; + + return $this; + } + + public function setTitle(string $title): static + { + $this->title = $title; + + return $this; + } + + public function setTmdb(?string $tmdb): static + { + $this->tmdb = $tmdb; + + return $this; + } +} diff --git a/apps/src/Entity/Season.php b/apps/src/Entity/Season.php index 48019fc3f..d615cc871 100644 --- a/apps/src/Entity/Season.php +++ b/apps/src/Entity/Season.php @@ -115,10 +115,17 @@ class Season implements Stringable, EntityWithParagraphsInterface #[ORM\Column(name: 'vote_average', nullable: true)] protected ?float $voteAverage = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refSeason')] + private Collection $castings; + public function __construct() { $this->paragraphs = new ArrayCollection(); $this->episodes = new ArrayCollection(); + $this->castings = new ArrayCollection(); } public function __toString(): string @@ -126,6 +133,16 @@ public function __toString(): string return (string) $this->getTitle(); } + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefSeason($this); + } + + return $this; + } + public function addEpisode(Episode $episode): static { if (!$this->episodes->contains($episode)) { @@ -161,6 +178,14 @@ public function getBackdropFile(): ?File return $this->backdropFile; } + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + /** * @return Collection */ @@ -237,6 +262,16 @@ public function isEnable(): ?bool return $this->enable; } + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefSeason() === $this) { + $casting->setRefSeason(null); + } + + return $this; + } + public function removeEpisode(Episode $episode): static { // set the owning side to null (unless already changed) diff --git a/apps/src/Entity/Serie.php b/apps/src/Entity/Serie.php index 2c4b7079d..2c3fc1569 100644 --- a/apps/src/Entity/Serie.php +++ b/apps/src/Entity/Serie.php @@ -150,6 +150,12 @@ class Serie implements Stringable, EntityWithParagraphsInterface #[ORM\Column(nullable: true)] protected ?int $votes = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Casting::class, mappedBy: 'refSerie')] + private Collection $castings; + /** * @var Collection */ @@ -165,6 +171,7 @@ public function __construct() $this->seasons = new ArrayCollection(); $this->paragraphs = new ArrayCollection(); $this->companies = new ArrayCollection(); + $this->castings = new ArrayCollection(); } #[Override] @@ -173,6 +180,16 @@ public function __toString(): string return (string) $this->getTitle(); } + public function addCasting(Casting $casting): static + { + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefSerie($this); + } + + return $this; + } + public function addCategory(SerieCategory $serieCategory): static { if (!$this->categories->contains($serieCategory)) { @@ -223,6 +240,14 @@ public function getBackdropFile(): ?File return $this->backdropFile; } + /** + * @return Collection + */ + public function getCastings(): Collection + { + return $this->castings; + } + /** * @return Collection */ @@ -363,6 +388,16 @@ public function isInProduction(): ?bool return $this->inProduction; } + public function removeCasting(Casting $casting): static + { + // set the owning side to null (unless already changed) + if ($this->castings->removeElement($casting) && $casting->getRefSerie() === $this) { + $casting->setRefSerie(null); + } + + return $this; + } + public function removeCategory(SerieCategory $serieCategory): static { if ($this->categories->removeElement($serieCategory)) { diff --git a/apps/src/Field/UploadImageField.php b/apps/src/Field/UploadImageField.php index e48f5188f..838c5b3c0 100644 --- a/apps/src/Field/UploadImageField.php +++ b/apps/src/Field/UploadImageField.php @@ -51,14 +51,14 @@ public function setTranslator(TranslatorInterface $translator): void new File( maxSize: ini_get('upload_max_filesize'), mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'], - mimeTypesMessage: $translator->trans( - $mimeTypesMessage->getMessage(), - $mimeTypesMessage->getParameters() - ), maxSizeMessage: $translator->trans( $maxSizeMessage->getMessage(), $maxSizeMessage->getParameters() ), + mimeTypesMessage: $translator->trans( + $mimeTypesMessage->getMessage(), + $mimeTypesMessage->getParameters() + ), ), ], ] diff --git a/apps/src/Form/Front/MovieType.php b/apps/src/Form/Front/MovieType.php index 1155bdf79..bd8eb6ad9 100644 --- a/apps/src/Form/Front/MovieType.php +++ b/apps/src/Form/Front/MovieType.php @@ -37,9 +37,11 @@ public function __construct( public function buildForm(FormBuilderInterface $formBuilder, array $options): void { unset($options); - $formBuilder->add('title', TextType::class, [ - 'required' => false, - ]); + $formBuilder->add( + 'title', + TextType::class, + ['required' => false] + ); $formBuilder->add( 'country', ChoiceType::class, @@ -73,9 +75,18 @@ public function buildForm(FormBuilderInterface $formBuilder, array $options): vo 'choices' => $this->movieService->getYearForForm(), ] ); - $title = new TranslatableMessage('Title'); - $releaseDate = new TranslatableMessage('Release date'); - $dateAdded = new TranslatableMessage('Date added'); + $titleTranslation = new TranslatableMessage('Title'); + $title = $this->translator->trans($titleTranslation->getMessage(), $titleTranslation->getParameters()); + $releaseDateTranslation = new TranslatableMessage('Release date'); + $releaseDate = $this->translator->trans( + $releaseDateTranslation->getMessage(), + $releaseDateTranslation->getParameters() + ); + $dateAddedTranslation = new TranslatableMessage('Date added'); + $dateAdded = $this->translator->trans( + $dateAddedTranslation->getMessage(), + $dateAddedTranslation->getParameters() + ); $formBuilder->add( 'order', ChoiceType::class, @@ -83,17 +94,22 @@ public function buildForm(FormBuilderInterface $formBuilder, array $options): vo 'required' => false, 'label' => new TranslatableMessage('Order'), 'choices' => [ - $this->translator->trans($title->getMessage(), $title->getParameters()) => 'title', - $this->translator->trans( - $releaseDate->getMessage(), - $releaseDate->getParameters() - ) => 'releaseDate', - $this->translator->trans($dateAdded->getMessage(), $dateAdded->getParameters()) => 'createdAt', + $title => 'title', + $releaseDate => 'releaseDate', + $dateAdded => 'createdAt', ], ] ); - $ascending = new TranslatableMessage('Ascending'); - $descending = new TranslatableMessage('Descending'); + $ascendingTranslation = new TranslatableMessage('Ascending'); + $ascending = $this->translator->trans( + $ascendingTranslation->getMessage(), + $ascendingTranslation->getParameters() + ); + $descendingTranslation = new TranslatableMessage('Descending'); + $descending = $this->translator->trans( + $descendingTranslation->getMessage(), + $descendingTranslation->getParameters() + ); $formBuilder->add( 'orderby', ChoiceType::class, @@ -101,17 +117,25 @@ public function buildForm(FormBuilderInterface $formBuilder, array $options): vo 'required' => false, 'label' => new TranslatableMessage('Sort'), 'choices' => [ - $this->translator->trans($ascending->getMessage(), $ascending->getParameters()) => 'ASC', - $this->translator->trans($descending->getMessage(), $descending->getParameters()) => 'DESC', + $ascending => 'ASC', + $descending => 'DESC', ], ] ); - $formBuilder->add('submit', SubmitType::class, [ + $formBuilder->add( + 'submit', + SubmitType::class, + [ 'label' => new TranslatableMessage('Search'), - ]); - $formBuilder->add('reset', ResetType::class, [ + ] + ); + $formBuilder->add( + 'reset', + ResetType::class, + [ 'label' => new TranslatableMessage('Reset'), - ]); + ] + ); } public function configureOptions(OptionsResolver $optionsResolver): void @@ -122,9 +146,10 @@ public function configureOptions(OptionsResolver $optionsResolver): void $optionsResolver->setDefaults( [ 'csrf_protection' => false, - 'action' => $this->router->generate('front', [ - 'slug' => $slug, - ]), + 'action' => $this->router->generate( + 'front', + ['slug' => $slug] + ), 'method' => 'GET', 'data_class' => null, ] diff --git a/apps/src/Generate/CinemaGenerate.php b/apps/src/Generate/CinemaGenerate.php index 475d5223c..4a7ca562e 100644 --- a/apps/src/Generate/CinemaGenerate.php +++ b/apps/src/Generate/CinemaGenerate.php @@ -153,7 +153,7 @@ private function setMovie(Page $page, array $movieData, string $locale, array &$ $paragraph->setLeftposition(($key % 2) === 0); $html = $this->pageMovieInfoTemplate->getTemplate()->getHtml(); $casts = $cast['cast'] ?? []; - $html = str_replace( + $html = str_replace( [ '%title%', '%release_date%', @@ -191,7 +191,7 @@ private function setMovies(Page $page, array $movies, string $locale): void private function setVideo(Page $page, array $movieData): void { - $videos = $this->theMovieDbApi->getVideosMovie($movieData['id']); + $videos = $this->theMovieDbApi->getVideosMovie($movieData['id']); $backdrop = $this->theMovieDbApi->images()->getBackdropUrl($movieData['backdrop_path'] ?? ''); $trailer = $this->videoService->getTrailer($videos); if (is_null($trailer)) { diff --git a/apps/src/Message/PersonAllMessage.php b/apps/src/Message/PersonAllMessage.php new file mode 100644 index 000000000..5afddbcc2 --- /dev/null +++ b/apps/src/Message/PersonAllMessage.php @@ -0,0 +1,19 @@ +person; + } +} diff --git a/apps/src/MessageHandler/FilesMessageHandler.php b/apps/src/MessageHandler/FilesMessageHandler.php index 0e8178d5c..c20a07571 100644 --- a/apps/src/MessageHandler/FilesMessageHandler.php +++ b/apps/src/MessageHandler/FilesMessageHandler.php @@ -10,14 +10,14 @@ final class FilesMessageHandler { public function __construct( - protected FileService $fileService, + private FileService $fileService, ) { } - public function __invoke(FilesMessage $message): void + public function __invoke(FilesMessage $filesMessage): void { - unset($message); - $total = $this->fileService->deletedFileByEntities(); + unset($filesMessage); + $this->fileService->deletedFileByEntities(); } } diff --git a/apps/src/MessageHandler/MetaMessageHandler.php b/apps/src/MessageHandler/MetaMessageHandler.php index 2f30d8e39..0e1b66243 100644 --- a/apps/src/MessageHandler/MetaMessageHandler.php +++ b/apps/src/MessageHandler/MetaMessageHandler.php @@ -7,6 +7,7 @@ use Labstag\Entity\Meta; use Labstag\Entity\Movie; use Labstag\Entity\Page; +use Labstag\Entity\Person; use Labstag\Entity\Post; use Labstag\Entity\Saga; use Labstag\Entity\Season; @@ -21,38 +22,27 @@ final class MetaMessageHandler { public function __construct( - protected MetaService $metaService, - protected EntityManagerInterface $entityManager, - protected MetaRepository $metaRepository, + private MetaService $metaService, + private EntityManagerInterface $entityManager, + private MetaRepository $metaRepository, ) { } - public function __invoke(MetaMessage $message): void + public function __invoke(MetaMessage $metaMessage): void { - unset($message); + unset($metaMessage); $this->deleteUselessMeta(); $this->correctionMeta(); } - private function deleteUselessMeta(): void - { - $repository = $this->entityManager->getRepository(Meta::class); - $metas = $repository->findAll(); - foreach ($metas as $meta) { - $object = $this->metaService->getEntityParent($meta); - if (is_null($object->value) || is_null($object->name) || is_null($object)) { - $repository->delete($meta); - } - } - } - private function correctionMeta(): void { $entities = [ Game::class, Movie::class, Page::class, + Person::class, Post::class, Saga::class, Season::class, @@ -61,7 +51,6 @@ private function correctionMeta(): void ]; foreach ($entities as $entity) { - $repository = $this->entityManager->getRepository($entity); $items = $repository->findAll(); @@ -85,4 +74,16 @@ private function correctionMeta(): void } } } + + private function deleteUselessMeta(): void + { + $entityRepository = $this->entityManager->getRepository(Meta::class); + $metas = $entityRepository->findAll(); + foreach ($metas as $meta) { + $object = $this->metaService->getEntityParent($meta); + if (is_null($object->value) || is_null($object->name) || is_null($object)) { + $entityRepository->delete($meta); + } + } + } } diff --git a/apps/src/MessageHandler/NotificationMessageHandler.php b/apps/src/MessageHandler/NotificationMessageHandler.php index 76a5b418c..d3fa15053 100644 --- a/apps/src/MessageHandler/NotificationMessageHandler.php +++ b/apps/src/MessageHandler/NotificationMessageHandler.php @@ -10,15 +10,14 @@ final class NotificationMessageHandler { public function __construct( - private NotificationRepository $notificationRepository + private NotificationRepository $notificationRepository, ) { - } - public function __invoke(NotificationMessage $message): void + public function __invoke(NotificationMessage $notificationMessage): void { - unset($message); + unset($notificationMessage); $notifications = $this->notificationRepository->getAllBefore1week(); foreach ($notifications as $notification) { diff --git a/apps/src/MessageHandler/PersonAllMessageHandler.php b/apps/src/MessageHandler/PersonAllMessageHandler.php new file mode 100644 index 000000000..39d2446b4 --- /dev/null +++ b/apps/src/MessageHandler/PersonAllMessageHandler.php @@ -0,0 +1,29 @@ +personRepository->findAll(); + foreach ($persons as $person) { + $this->messageBus->dispatch(new PersonMessage($person->getId())); + } + } +} diff --git a/apps/src/MessageHandler/PersonMessageHandler.php b/apps/src/MessageHandler/PersonMessageHandler.php new file mode 100644 index 000000000..737faf4fe --- /dev/null +++ b/apps/src/MessageHandler/PersonMessageHandler.php @@ -0,0 +1,32 @@ +getPerson(); + $person = $this->personRepository->find($personId); + if (!$person instanceof Person) { + return; + } + + $this->personService->update($person); + $this->personRepository->save($person); + } +} diff --git a/apps/src/Paragraph/ExperiencesParagraph.php b/apps/src/Paragraph/ExperiencesParagraph.php index d39064a78..d46985af4 100644 --- a/apps/src/Paragraph/ExperiencesParagraph.php +++ b/apps/src/Paragraph/ExperiencesParagraph.php @@ -63,7 +63,10 @@ function ($link): string { unset($link); $translatableMessage = new TranslatableMessage('Skill'); - return $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + return $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); } ); $collectionField->setFormTypeOption( diff --git a/apps/src/Paragraph/FormParagraph.php b/apps/src/Paragraph/FormParagraph.php index 9897eadb4..2b12fd424 100644 --- a/apps/src/Paragraph/FormParagraph.php +++ b/apps/src/Paragraph/FormParagraph.php @@ -65,8 +65,8 @@ public function getFields(Paragraph $paragraph, string $pageName): mixed $choiceField->setChoices($this->formService->all()); yield $choiceField; yield BooleanField::new('save', new TranslatableMessage('Save data in database')); - $wysiwgTranslation = new TranslatableMessage('Confirm message'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Confirm message'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/HtmlParagraph.php b/apps/src/Paragraph/HtmlParagraph.php index 27f69a8d6..3d77a1f99 100644 --- a/apps/src/Paragraph/HtmlParagraph.php +++ b/apps/src/Paragraph/HtmlParagraph.php @@ -48,8 +48,8 @@ public function getFields(Paragraph $paragraph, string $pageName): mixed unset($paragraph, $pageName); yield TextField::new('title', new TranslatableMessage('Title')); - $wysiwgTranslation = new TranslatableMessage('Content'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Content'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/ParagraphAbstract.php b/apps/src/Paragraph/ParagraphAbstract.php index f992efdc6..765e6c220 100644 --- a/apps/src/Paragraph/ParagraphAbstract.php +++ b/apps/src/Paragraph/ParagraphAbstract.php @@ -172,14 +172,14 @@ public function addFieldImageUpload(string $type, string $pageName, Paragraph $p 'image/gif', 'image/webp', ], - mimeTypesMessage: $this->translator->trans( - $mimeTypesMessage->getMessage(), - $mimeTypesMessage->getParameters() - ), maxSizeMessage: $this->translator->trans( $maxSizeMessage->getMessage(), $maxSizeMessage->getParameters() ), + mimeTypesMessage: $this->translator->trans( + $mimeTypesMessage->getMessage(), + $mimeTypesMessage->getParameters() + ), ), ], ] diff --git a/apps/src/Paragraph/SiblingParagraph.php b/apps/src/Paragraph/SiblingParagraph.php index f551ad8b0..ff034bf24 100644 --- a/apps/src/Paragraph/SiblingParagraph.php +++ b/apps/src/Paragraph/SiblingParagraph.php @@ -58,8 +58,8 @@ public function getClass(): string public function getFields(Paragraph $paragraph, string $pageName): mixed { unset($paragraph, $pageName); - $wysiwgTranslation = new TranslatableMessage('Description'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Description'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/SkillsParagraph.php b/apps/src/Paragraph/SkillsParagraph.php index 5252a110b..8b12e25ea 100644 --- a/apps/src/Paragraph/SkillsParagraph.php +++ b/apps/src/Paragraph/SkillsParagraph.php @@ -62,7 +62,10 @@ function ($link): string { unset($link); $translatableMessage = new TranslatableMessage('Skill'); - return $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + return $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); } ); $collectionField->setFormTypeOption( diff --git a/apps/src/Paragraph/TextImgParagraph.php b/apps/src/Paragraph/TextImgParagraph.php index 8f50f9d3f..142546a99 100644 --- a/apps/src/Paragraph/TextImgParagraph.php +++ b/apps/src/Paragraph/TextImgParagraph.php @@ -58,8 +58,8 @@ public function getFields(Paragraph $paragraph, string $pageName): Generator { yield $this->addFieldImageUpload('img', $pageName, $paragraph); yield BooleanField::new('leftposition', new TranslatableMessage('Image on the left')); - $wysiwgTranslation = new TranslatableMessage('Text'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Text'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/TextMediaParagraph.php b/apps/src/Paragraph/TextMediaParagraph.php index cbf9b5ddf..4c5ecc90e 100644 --- a/apps/src/Paragraph/TextMediaParagraph.php +++ b/apps/src/Paragraph/TextMediaParagraph.php @@ -81,8 +81,8 @@ public function getFields(Paragraph $paragraph, string $pageName): Generator yield BooleanField::new('leftposition', new TranslatableMessage('Media on the left')); yield UrlField::new('url', new TranslatableMessage('Url')); - $wysiwgTranslation = new TranslatableMessage('Text'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Text'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/TextParagraph.php b/apps/src/Paragraph/TextParagraph.php index a9cbe9d7b..9317e17f3 100644 --- a/apps/src/Paragraph/TextParagraph.php +++ b/apps/src/Paragraph/TextParagraph.php @@ -48,8 +48,8 @@ public function getClass(): string public function getFields(Paragraph $paragraph, string $pageName): mixed { unset($paragraph, $pageName); - $wysiwgTranslation = new TranslatableMessage('Text'); - $wysiwygField = WysiwygField::new('content', $wysiwgTranslation->getMessage()); + $translatableMessage = new TranslatableMessage('Text'); + $wysiwygField = WysiwygField::new('content', $translatableMessage->getMessage()); yield $wysiwygField; } diff --git a/apps/src/Paragraph/TrainingCoursesParagraph.php b/apps/src/Paragraph/TrainingCoursesParagraph.php index 7c8a0cdf3..471165f15 100644 --- a/apps/src/Paragraph/TrainingCoursesParagraph.php +++ b/apps/src/Paragraph/TrainingCoursesParagraph.php @@ -62,7 +62,10 @@ function ($link): string { unset($link); $translatableMessage = new TranslatableMessage('Training course'); - return $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + return $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); } ); $collectionField->setFormTypeOption( diff --git a/apps/src/Repository/CastingRepository.php b/apps/src/Repository/CastingRepository.php new file mode 100644 index 000000000..22e8b7e36 --- /dev/null +++ b/apps/src/Repository/CastingRepository.php @@ -0,0 +1,17 @@ + + */ +class CastingRepository extends RepositoryAbstract +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Casting::class); + } +} diff --git a/apps/src/Repository/NotificationRepository.php b/apps/src/Repository/NotificationRepository.php index 59f48f5a0..484377a89 100644 --- a/apps/src/Repository/NotificationRepository.php +++ b/apps/src/Repository/NotificationRepository.php @@ -16,12 +16,12 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Notification::class); } - public function getAllBefore1week() + public function getAllBefore1week(): mixed { - $qb = $this->createQueryBuilder('n'); - $qb->where('n.createdAt <= :date'); - $qb->setParameter('date', new DateTime('-7 days')); + $queryBuilder = $this->createQueryBuilder('n'); + $queryBuilder->where('n.createdAt <= :date'); + $queryBuilder->setParameter('date', new DateTime('-7 days')); - return $qb->getQuery()->getResult(); + return $queryBuilder->getQuery()->getResult(); } } diff --git a/apps/src/Repository/PersonRepository.php b/apps/src/Repository/PersonRepository.php new file mode 100644 index 000000000..44c8660bd --- /dev/null +++ b/apps/src/Repository/PersonRepository.php @@ -0,0 +1,17 @@ + + */ +class PersonRepository extends RepositoryAbstract +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Person::class); + } +} diff --git a/apps/src/Security/Voter/EasyadminVoter.php b/apps/src/Security/Voter/EasyadminVoter.php index 1d555fe00..bffe7eaab 100644 --- a/apps/src/Security/Voter/EasyadminVoter.php +++ b/apps/src/Security/Voter/EasyadminVoter.php @@ -48,6 +48,7 @@ protected function voteOnAttribute( ?Vote $vote = null, ): bool { + unset($vote); $user = $token->getUser(); // if the user is anonymous, do not grant access if (!$user instanceof UserInterface) { diff --git a/apps/src/Service/Imdb/EpisodeService.php b/apps/src/Service/Imdb/EpisodeService.php index c84fde32d..ffa867633 100644 --- a/apps/src/Service/Imdb/EpisodeService.php +++ b/apps/src/Service/Imdb/EpisodeService.php @@ -15,6 +15,7 @@ public function __construct( private FileService $fileService, private EpisodeRepository $episodeRepository, private TheMovieDbApi $theMovieDbApi, + private PersonService $personService, ) { } @@ -70,12 +71,38 @@ public function update(Episode $episode): bool $statuses = [ $this->updateEpisode($episode, $details), + $this->updateCredits($episode, $details), $this->updateImage($episode, $details), ]; return in_array(true, $statuses, true); } + private function updateCredits(Episode $episode, array $details): bool + { + foreach ($episode->getCastings() as $casting) { + $episode->removeCasting($casting); + } + + if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { + foreach ($details['credits']['cast'] as $cast) { + $person = $this->personService->getPerson($cast); + $this->personService->addToCastingEpisode($person, $episode, $cast); + $episode->addCasting($casting); + } + } + + if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { + foreach ($details['credits']['crew'] as $crew) { + $person = $this->personService->getPerson($crew); + $this->personService->addToCastingEpisode($person, $episode, $crew); + $episode->addCasting($casting); + } + } + + return true; + } + private function updateEpisode(Episode $episode, array $details): bool { $episode->setOverview($details['tmdb']['overview']); diff --git a/apps/src/Service/Imdb/MovieService.php b/apps/src/Service/Imdb/MovieService.php index 36f14eb91..c46c5fbbd 100644 --- a/apps/src/Service/Imdb/MovieService.php +++ b/apps/src/Service/Imdb/MovieService.php @@ -7,18 +7,11 @@ use Labstag\Api\TheMovieDbApi; use Labstag\Entity\Movie; use Labstag\Entity\MovieCategory; -use Labstag\Message\MovieMessage; use Labstag\Repository\MovieRepository; use Labstag\Service\CategoryService; use Labstag\Service\ConfigurationService; use Labstag\Service\FileService; use Labstag\Service\VideoService; -use Symfony\Component\HttpFoundation\RedirectResponse; -use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; -use Symfony\Component\Messenger\MessageBusInterface; -use Symfony\Component\Routing\RouterInterface; -use Symfony\Component\Translation\TranslatableMessage; final class MovieService { @@ -36,16 +29,14 @@ final class MovieService public function __construct( private ConfigurationService $configurationService, private FileService $fileService, + private PersonService $personService, private CompanyService $companyService, private CategoryService $categoryService, private SagaService $sagaService, private EntityManagerInterface $entityManager, private MovieRepository $movieRepository, private VideoService $videoService, - private MessageBusInterface $messageBus, private TheMovieDbApi $theMovieDbApi, - private RequestStack $requestStack, - private RouterInterface $router, ) { } @@ -135,17 +126,36 @@ public function update(Movie $movie): bool $this->updateSaga($movie, $details), $this->updateCategory($movie, $details), $this->updateCompany($movie, $details), + $this->updateCredits($movie, $details), $this->updateTrailer($movie, $details), ]; return in_array(true, $statuses, true); } - private function getFlashBag(): FlashBagInterface + public function updateCredits(Movie $movie, array $details): bool { - $session = $this->requestStack->getSession(); + foreach ($movie->getCastings() as $casting) { + $movie->removeCasting($casting); + } + + if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { + foreach ($details['credits']['cast'] as $cast) { + $person = $this->personService->getPerson($cast); + $this->personService->addToCastingMovie($person, $movie, $cast); + $movie->addCasting($casting); + } + } - return $session->getFlashBag(); + if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { + foreach ($details['credits']['crew'] as $crew) { + $person = $this->personService->getPerson($crew); + $this->personService->addToCastingMovie($person, $movie, $crew); + $movie->addCasting($casting); + } + } + + return true; } /** diff --git a/apps/src/Service/Imdb/PersonService.php b/apps/src/Service/Imdb/PersonService.php new file mode 100644 index 000000000..32316ae8b --- /dev/null +++ b/apps/src/Service/Imdb/PersonService.php @@ -0,0 +1,189 @@ +entityManager->getRepository(Casting::class); + $casting = $entityRepository->findOneBy( + [ + 'refEpisode' => $episode, + 'refPerson' => $person, + ] + ); + if (!$casting instanceof Casting) { + $casting = new Casting(); + $casting->setRefEpisode($episode); + $casting->setRefPerson($person); + } + + $casting->setKnownForDepartment($data['known_for_department'] ?? null); + $casting->setFigure($data['character'] ?? null); + + $entityRepository->save($casting); + } + + public function addToCastingMovie(Person $person, Movie $movie, array $data): void + { + $entityRepository = $this->entityManager->getRepository(Casting::class); + $casting = $entityRepository->findOneBy( + [ + 'refMovie' => $movie, + 'refPerson' => $person, + ] + ); + if (!$casting instanceof Casting) { + $casting = new Casting(); + $casting->setRefMovie($movie); + $casting->setRefPerson($person); + } + + $this->addToCasting($casting, $data); + } + + public function addToCastingSeason(Person $person, Season $season, array $data): void + { + $entityRepository = $this->entityManager->getRepository(Casting::class); + $casting = $entityRepository->findOneBy( + [ + 'refSeason' => $season, + 'refPerson' => $person, + ] + ); + if (!$casting instanceof Casting) { + $casting = new Casting(); + $casting->setRefSeason($season); + $casting->setRefPerson($person); + } + + $this->addToCasting($casting, $data); + } + + public function addToCastingSerie(Person $person, Serie $serie, array $data): void + { + $entityRepository = $this->entityManager->getRepository(Casting::class); + $casting = $entityRepository->findOneBy( + [ + 'refSerie' => $serie, + 'refPerson' => $person, + ] + ); + if (!$casting instanceof Casting) { + $casting = new Casting(); + $casting->setRefSerie($serie); + $casting->setRefPerson($person); + } + + $this->addToCasting($casting, $data); + } + + public function getPerson(array $data): Person + { + $entityRepository = $this->entityManager->getRepository(Person::class); + $person = $entityRepository->findOneBy( + [ + 'tmdb' => $data['id'], + ] + ); + if (!$person instanceof Person) { + $person = new Person(); + $person->setTmdb($data['id']); + $person->setTitle($data['name']); + $entityRepository->save($person); + $this->messageBus->dispatch(new PersonMessage($person->getId())); + } + + return $person; + } + + public function update(Person $person): bool + { + $entityRepository = $this->entityManager->getRepository(Person::class); + $details = $this->theMovieDbApi->getDetailPerson($person); + if (!isset($details['tmdb']) || is_null($details['tmdb'])) { + $entityRepository->delete($person); + + return false; + } + + $statuses = [ + $this->updatePerson($person, $details), + $this->updateImageProfile($person, $details), + ]; + + return in_array(true, $statuses, true); + } + + private function addToCasting(Casting $casting, array $data): void + { + $entityRepository = $this->entityManager->getRepository(Casting::class); + $casting->setKnownForDepartment($data['known_for_department'] ?? null); + $casting->setFigure($data['character'] ?? null); + + $entityRepository->save($casting); + } + + /** + * @param array $details + */ + private function updateImageProfile(Person $person, array $details): bool + { + $poster = $this->theMovieDbApi->images()->getProfileUrl($details['tmdb']['profile_path'] ?? ''); + if (is_null($poster)) { + $person->setProfileFile(); + $person->setProfile(null); + + return false; + } + + $this->fileService->setUploadedFile($poster, $person, 'profileFile'); + + return true; + } + + private function updatePerson(Person $person, array $data): bool + { + if (!isset($data['tmdb'])) { + return false; + } + + $person->setGender($data['tmdb']['gender'] ?? null); + $person->setPlaceOfBirth($data['tmdb']['place_of_birth'] ?: null); + $person->setBiography($data['tmdb']['biography'] ?? null); + if (!is_null($data['tmdb']['birthday'])) { + $birthday = new DateTime($data['tmdb']['birthday']); + $person->setBirthday($birthday); + } + + if (!is_null($data['tmdb']['deathday'])) { + $deathday = new DateTime($data['tmdb']['deathday']); + $person->setDeathday($deathday); + } + + return true; + } +} diff --git a/apps/src/Service/Imdb/SeasonService.php b/apps/src/Service/Imdb/SeasonService.php index 86da95789..510aa006a 100644 --- a/apps/src/Service/Imdb/SeasonService.php +++ b/apps/src/Service/Imdb/SeasonService.php @@ -19,6 +19,7 @@ public function __construct( private SeasonRepository $seasonRepository, private EpisodeService $episodeService, private TheMovieDbApi $theMovieDbApi, + private PersonService $personService, ) { } @@ -100,12 +101,38 @@ public function update(Season $season): bool $this->updateSeason($season, $details), $this->updateImagePoster($season, $details), $this->updateImageBackdrop($season), + $this->updateCredits($season, $details), $this->updateEpisodes($season, $details), ]; return in_array(true, $statuses, true); } + private function updateCredits(Season $season, array $details): bool + { + foreach ($season->getCastings() as $casting) { + $season->removeCasting($casting); + } + + if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { + foreach ($details['credits']['cast'] as $cast) { + $person = $this->personService->getPerson($cast); + $this->personService->addToCastingSeason($person, $season, $cast); + $season->addCasting($casting); + } + } + + if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { + foreach ($details['credits']['crew'] as $crew) { + $person = $this->personService->getPerson($crew); + $this->personService->addToCastingSeason($person, $season, $crew); + $season->addCasting($casting); + } + } + + return true; + } + private function updateEpisodes(Season $season, array $details): bool { if (isset($details['tmdb']['episodes']) && is_array($details['tmdb']['episodes'])) { diff --git a/apps/src/Service/Imdb/SerieService.php b/apps/src/Service/Imdb/SerieService.php index af3d497d5..e3930adb6 100644 --- a/apps/src/Service/Imdb/SerieService.php +++ b/apps/src/Service/Imdb/SerieService.php @@ -8,18 +8,12 @@ use Labstag\Entity\Serie; use Labstag\Entity\SerieCategory; use Labstag\Message\SeasonMessage; -use Labstag\Message\SerieMessage; use Labstag\Repository\SerieRepository; use Labstag\Service\CategoryService; use Labstag\Service\ConfigurationService; use Labstag\Service\FileService; use Labstag\Service\VideoService; -use Symfony\Component\HttpFoundation\RedirectResponse; -use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; use Symfony\Component\Messenger\MessageBusInterface; -use Symfony\Component\Routing\RouterInterface; -use Symfony\Component\Translation\TranslatableMessage; final class SerieService { @@ -43,9 +37,8 @@ public function __construct( private SerieRepository $serieRepository, private CategoryService $categoryService, private TheMovieDbApi $theMovieDbApi, - private RequestStack $requestStack, private VideoService $videoService, - private RouterInterface $router, + private PersonService $personService, ) { } @@ -155,19 +148,13 @@ public function update(Serie $serie): bool $this->updateCategory($serie, $details), $this->updateTrailer($serie, $details), $this->updateCompany($serie, $details), + $this->updateCredits($serie, $details), $this->updateSeasons($serie, $details), ]; return in_array(true, $statuses, true); } - private function getFlashBag(): FlashBagInterface - { - $session = $this->requestStack->getSession(); - - return $session->getFlashBag(); - } - /** * @param array $details */ @@ -277,6 +264,31 @@ private function updateCompany(Serie $serie, array $details): bool return true; } + private function updateCredits(Serie $serie, array $details): bool + { + foreach ($serie->getCastings() as $casting) { + $serie->removeCasting($casting); + } + + if (isset($details['credits']['cast']) || is_array($details['credits']['cast'])) { + foreach ($details['credits']['cast'] as $cast) { + $person = $this->personService->getPerson($cast); + $this->personService->addToCastingSerie($person, $serie, $cast); + $serie->addCasting($casting); + } + } + + if (isset($details['credits']['crew']) || is_array($details['credits']['crew'])) { + foreach ($details['credits']['crew'] as $crew) { + $person = $this->personService->getPerson($crew); + $this->personService->addToCastingSerie($person, $serie, $crew); + $serie->addCasting($casting); + } + } + + return true; + } + /** * @param array $details */ diff --git a/apps/src/Twig/Runtime/BlockExtensionRuntime.php b/apps/src/Twig/Runtime/BlockExtensionRuntime.php index 0619c8f17..f6787fbce 100644 --- a/apps/src/Twig/Runtime/BlockExtensionRuntime.php +++ b/apps/src/Twig/Runtime/BlockExtensionRuntime.php @@ -33,7 +33,7 @@ public function getContextMenu(Block $block): array return $data; } - $data['data-context_url'] = $urlAdmin; + $data['data-context_url'] = $urlAdmin; $translatableMessage = new TranslatableMessage( 'Update block (%name%) #%type%', [ @@ -41,7 +41,10 @@ public function getContextMenu(Block $block): array '%type%' => $this->blockService->getType($block), ] ); - $data['data-context_text'] = $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + $data['data-context_text'] = $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); return $data; } diff --git a/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php b/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php index 3c05726eb..af1193bdf 100644 --- a/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php +++ b/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php @@ -33,7 +33,7 @@ public function getContextMenu(Paragraph $paragraph): array return $data; } - $data['data-context_url'] = $urlAdmin; + $data['data-context_url'] = $urlAdmin; $translatableMessage = new TranslatableMessage( 'Update paragraph (%name%) #%type%', [ @@ -41,7 +41,10 @@ public function getContextMenu(Paragraph $paragraph): array '%type%' => $this->paragraphService->getType($paragraph), ] ); - $data['data-context_text'] = $this->translator->trans($translatableMessage->getMessage(), $translatableMessage->getParameters()); + $data['data-context_text'] = $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); return $data; } diff --git a/apps/templates/admin/field/castings.html.twig b/apps/templates/admin/field/castings.html.twig new file mode 100644 index 000000000..868bd60bf --- /dev/null +++ b/apps/templates/admin/field/castings.html.twig @@ -0,0 +1,18 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + + {% for casting in instance.castings %} + + + + + + {% endfor %} +
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }}
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/translations/EasyAdminBundle.fr.xlf b/apps/translations/EasyAdminBundle.fr.xlf index acbe91c3b..b24507dff 100644 --- a/apps/translations/EasyAdminBundle.fr.xlf +++ b/apps/translations/EasyAdminBundle.fr.xlf @@ -173,6 +173,10 @@ action.save_and_continue Sauvegarder et continuer + + action.toggle_dropdown + Basculer le menu déroulant + batch_action_modal.title Vous allez appliquer l'action "%action_name%" à %num_items% élément(s). diff --git a/apps/translations/messages.fr.xlf b/apps/translations/messages.fr.xlf index e4b0d4c4f..c1a35c12a 100644 --- a/apps/translations/messages.fr.xlf +++ b/apps/translations/messages.fr.xlf @@ -2293,6 +2293,66 @@ No episodes found. Aucun épisode trouvé. + + Person + Personne + + + Persons + Personnes + + + Gender + Genre + + + Not set / not specified + Non défini / non spécifié + + + Female + Féminin + + + Male + Masculin + + + Non-binary + Non-binaire + + + Biography + Biographie + + + Place of birth + Lieu de naissance + + + Profile + Profil + + + Birthday + Date de naissance + + + Deathday + Date de décès + + + Reason + Raison + + + Serie is being added + La série est en cours d'ajout + + + Casting + Distribution + From 30d89b2a5fd007ed9677272d6bf729af48ba3d90 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Wed, 17 Dec 2025 21:56:28 +0100 Subject: [PATCH 02/50] =?UTF-8?q?refactor:=20modifier=20les=20m=C3=A9thode?= =?UTF-8?q?s=20d'ajout=20de=20casting=20pour=20retourner=20l'objet=20Casti?= =?UTF-8?q?ng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/config/packages/framework.yaml | 2 +- apps/src/Service/Imdb/EpisodeService.php | 4 ++-- apps/src/Service/Imdb/MovieService.php | 4 ++-- apps/src/Service/Imdb/PersonService.php | 16 +++++++++------- apps/src/Service/Imdb/SeasonService.php | 4 ++-- apps/src/Service/Imdb/SerieService.php | 4 ++-- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/apps/config/packages/framework.yaml b/apps/config/packages/framework.yaml index 05a9ed737..bb2e18572 100644 --- a/apps/config/packages/framework.yaml +++ b/apps/config/packages/framework.yaml @@ -1,6 +1,6 @@ # see https://symfony.com/doc/current/reference/configuration/framework.html framework: - # error_controller: Labstag\Controller\FrontController::error + error_controller: Labstag\Controller\FrontController::error cache: pools: doctrine.result_cache_pool: diff --git a/apps/src/Service/Imdb/EpisodeService.php b/apps/src/Service/Imdb/EpisodeService.php index ffa867633..cc4f4c0fb 100644 --- a/apps/src/Service/Imdb/EpisodeService.php +++ b/apps/src/Service/Imdb/EpisodeService.php @@ -87,7 +87,7 @@ private function updateCredits(Episode $episode, array $details): bool if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { foreach ($details['credits']['cast'] as $cast) { $person = $this->personService->getPerson($cast); - $this->personService->addToCastingEpisode($person, $episode, $cast); + $casting = $this->personService->addToCastingEpisode($person, $episode, $cast); $episode->addCasting($casting); } } @@ -95,7 +95,7 @@ private function updateCredits(Episode $episode, array $details): bool if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { foreach ($details['credits']['crew'] as $crew) { $person = $this->personService->getPerson($crew); - $this->personService->addToCastingEpisode($person, $episode, $crew); + $casting = $this->personService->addToCastingEpisode($person, $episode, $crew); $episode->addCasting($casting); } } diff --git a/apps/src/Service/Imdb/MovieService.php b/apps/src/Service/Imdb/MovieService.php index c46c5fbbd..72f03a160 100644 --- a/apps/src/Service/Imdb/MovieService.php +++ b/apps/src/Service/Imdb/MovieService.php @@ -142,7 +142,7 @@ public function updateCredits(Movie $movie, array $details): bool if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { foreach ($details['credits']['cast'] as $cast) { $person = $this->personService->getPerson($cast); - $this->personService->addToCastingMovie($person, $movie, $cast); + $casting = $this->personService->addToCastingMovie($person, $movie, $cast); $movie->addCasting($casting); } } @@ -150,7 +150,7 @@ public function updateCredits(Movie $movie, array $details): bool if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { foreach ($details['credits']['crew'] as $crew) { $person = $this->personService->getPerson($crew); - $this->personService->addToCastingMovie($person, $movie, $crew); + $casting = $this->personService->addToCastingMovie($person, $movie, $crew); $movie->addCasting($casting); } } diff --git a/apps/src/Service/Imdb/PersonService.php b/apps/src/Service/Imdb/PersonService.php index 32316ae8b..cc54fd173 100644 --- a/apps/src/Service/Imdb/PersonService.php +++ b/apps/src/Service/Imdb/PersonService.php @@ -47,7 +47,7 @@ public function addToCastingEpisode(Person $person, Episode $episode, array $dat $entityRepository->save($casting); } - public function addToCastingMovie(Person $person, Movie $movie, array $data): void + public function addToCastingMovie(Person $person, Movie $movie, array $data): Casting { $entityRepository = $this->entityManager->getRepository(Casting::class); $casting = $entityRepository->findOneBy( @@ -62,10 +62,10 @@ public function addToCastingMovie(Person $person, Movie $movie, array $data): vo $casting->setRefPerson($person); } - $this->addToCasting($casting, $data); + return $this->addToCasting($casting, $data); } - public function addToCastingSeason(Person $person, Season $season, array $data): void + public function addToCastingSeason(Person $person, Season $season, array $data): Casting { $entityRepository = $this->entityManager->getRepository(Casting::class); $casting = $entityRepository->findOneBy( @@ -80,10 +80,10 @@ public function addToCastingSeason(Person $person, Season $season, array $data): $casting->setRefPerson($person); } - $this->addToCasting($casting, $data); + return $this->addToCasting($casting, $data); } - public function addToCastingSerie(Person $person, Serie $serie, array $data): void + public function addToCastingSerie(Person $person, Serie $serie, array $data): Casting { $entityRepository = $this->entityManager->getRepository(Casting::class); $casting = $entityRepository->findOneBy( @@ -98,7 +98,7 @@ public function addToCastingSerie(Person $person, Serie $serie, array $data): vo $casting->setRefPerson($person); } - $this->addToCasting($casting, $data); + return $this->addToCasting($casting, $data); } public function getPerson(array $data): Person @@ -138,13 +138,15 @@ public function update(Person $person): bool return in_array(true, $statuses, true); } - private function addToCasting(Casting $casting, array $data): void + private function addToCasting(Casting $casting, array $data): Casting { $entityRepository = $this->entityManager->getRepository(Casting::class); $casting->setKnownForDepartment($data['known_for_department'] ?? null); $casting->setFigure($data['character'] ?? null); $entityRepository->save($casting); + + return $casting; } /** diff --git a/apps/src/Service/Imdb/SeasonService.php b/apps/src/Service/Imdb/SeasonService.php index 510aa006a..6b11d61e0 100644 --- a/apps/src/Service/Imdb/SeasonService.php +++ b/apps/src/Service/Imdb/SeasonService.php @@ -117,7 +117,7 @@ private function updateCredits(Season $season, array $details): bool if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { foreach ($details['credits']['cast'] as $cast) { $person = $this->personService->getPerson($cast); - $this->personService->addToCastingSeason($person, $season, $cast); + $casting = $this->personService->addToCastingSeason($person, $season, $cast); $season->addCasting($casting); } } @@ -125,7 +125,7 @@ private function updateCredits(Season $season, array $details): bool if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { foreach ($details['credits']['crew'] as $crew) { $person = $this->personService->getPerson($crew); - $this->personService->addToCastingSeason($person, $season, $crew); + $casting =$this->personService->addToCastingSeason($person, $season, $crew); $season->addCasting($casting); } } diff --git a/apps/src/Service/Imdb/SerieService.php b/apps/src/Service/Imdb/SerieService.php index e3930adb6..014b31c54 100644 --- a/apps/src/Service/Imdb/SerieService.php +++ b/apps/src/Service/Imdb/SerieService.php @@ -273,7 +273,7 @@ private function updateCredits(Serie $serie, array $details): bool if (isset($details['credits']['cast']) || is_array($details['credits']['cast'])) { foreach ($details['credits']['cast'] as $cast) { $person = $this->personService->getPerson($cast); - $this->personService->addToCastingSerie($person, $serie, $cast); + $casting = $this->personService->addToCastingSerie($person, $serie, $cast); $serie->addCasting($casting); } } @@ -281,7 +281,7 @@ private function updateCredits(Serie $serie, array $details): bool if (isset($details['credits']['crew']) || is_array($details['credits']['crew'])) { foreach ($details['credits']['crew'] as $crew) { $person = $this->personService->getPerson($crew); - $this->personService->addToCastingSerie($person, $serie, $crew); + $casting = $this->personService->addToCastingSerie($person, $serie, $crew); $serie->addCasting($casting); } } From 8e21daee59f886f2b953aec11a87765e8868c2d8 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 18 Dec 2025 10:52:33 +0100 Subject: [PATCH 03/50] fix: modifier le type des colonnes 'figure' et 'knownForDepartment' en TEXT --- apps/src/Entity/Casting.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/src/Entity/Casting.php b/apps/src/Entity/Casting.php index 5c28a2ed4..add860e05 100644 --- a/apps/src/Entity/Casting.php +++ b/apps/src/Entity/Casting.php @@ -17,10 +17,10 @@ class Casting #[ORM\CustomIdGenerator(class: UuidGenerator::class)] protected ?string $id = null; - #[ORM\Column(length: 255, nullable: true)] + #[ORM\Column(type: Types::TEXT, nullable: true)] private ?string $figure = null; - #[ORM\Column(length: 255, nullable: true)] + #[ORM\Column(type: Types::TEXT, nullable: true)] private ?string $knownForDepartment = null; #[ORM\ManyToOne(inversedBy: 'castings')] From e2a0a306b974d44800b30efe3b07304a59b2d04d Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 18 Dec 2025 22:05:11 +0100 Subject: [PATCH 04/50] fix: modifier le type des colonnes 'known_for_department' et 'figure' en LONGTEXT --- apps/migrations/2025/12/Version20251217202932.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/migrations/2025/12/Version20251217202932.php b/apps/migrations/2025/12/Version20251217202932.php index 62fa6b095..38dad5a9b 100644 --- a/apps/migrations/2025/12/Version20251217202932.php +++ b/apps/migrations/2025/12/Version20251217202932.php @@ -20,7 +20,7 @@ public function getDescription(): string public function up(Schema $schema): void { // this up() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TABLE casting (id CHAR(36) NOT NULL, known_for_department VARCHAR(255) DEFAULT NULL, figure VARCHAR(255) DEFAULT NULL, ref_person_id CHAR(36) DEFAULT NULL, ref_season_id CHAR(36) DEFAULT NULL, ref_episode_id CHAR(36) DEFAULT NULL, ref_movie_id CHAR(36) DEFAULT NULL, ref_serie_id CHAR(36) DEFAULT NULL, INDEX IDX_D11BBA505221BA02 (ref_person_id), INDEX IDX_D11BBA503D9A0094 (ref_season_id), INDEX IDX_D11BBA5030EE8DBE (ref_episode_id), INDEX IDX_D11BBA50984707B (ref_movie_id), INDEX IDX_D11BBA505F544E3A (ref_serie_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`'); + $this->addSql('CREATE TABLE casting (id CHAR(36) NOT NULL, known_for_department LONGTEXT DEFAULT NULL, figure LONGTEXT DEFAULT NULL, ref_person_id CHAR(36) DEFAULT NULL, ref_season_id CHAR(36) DEFAULT NULL, ref_episode_id CHAR(36) DEFAULT NULL, ref_movie_id CHAR(36) DEFAULT NULL, ref_serie_id CHAR(36) DEFAULT NULL, INDEX IDX_D11BBA505221BA02 (ref_person_id), INDEX IDX_D11BBA503D9A0094 (ref_season_id), INDEX IDX_D11BBA5030EE8DBE (ref_episode_id), INDEX IDX_D11BBA50984707B (ref_movie_id), INDEX IDX_D11BBA505F544E3A (ref_serie_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`'); $this->addSql('CREATE TABLE person (id CHAR(36) NOT NULL, slug VARCHAR(255) DEFAULT NULL, title VARCHAR(255) NOT NULL, birthday DATE DEFAULT NULL, deathday DATE DEFAULT NULL, gender SMALLINT DEFAULT NULL, biography LONGTEXT DEFAULT NULL, tmdb VARCHAR(255) DEFAULT NULL, place_of_birth VARCHAR(255) DEFAULT NULL, profile VARCHAR(255) DEFAULT NULL, deleted_at DATETIME DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, meta_id CHAR(36) DEFAULT NULL, UNIQUE INDEX UNIQ_34DCD17639FCA6F9 (meta_id), INDEX IDX_PERSORN_SLUG (slug), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`'); $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA505221BA02 FOREIGN KEY (ref_person_id) REFERENCES person (id)'); $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA503D9A0094 FOREIGN KEY (ref_season_id) REFERENCES season (id)'); From e2dcf9aac0f8146a7df7ae185a3d5eaf291df219 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Fri, 19 Dec 2025 09:56:17 +0100 Subject: [PATCH 05/50] =?UTF-8?q?fix:=20modifier=20le=20type=20de=20retour?= =?UTF-8?q?=20de=20la=20m=C3=A9thode=20addToCastingEpisode=20pour=20retour?= =?UTF-8?q?ner=20un=20objet=20Casting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Service/Imdb/PersonService.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/src/Service/Imdb/PersonService.php b/apps/src/Service/Imdb/PersonService.php index cc54fd173..393828235 100644 --- a/apps/src/Service/Imdb/PersonService.php +++ b/apps/src/Service/Imdb/PersonService.php @@ -26,7 +26,7 @@ public function __construct( { } - public function addToCastingEpisode(Person $person, Episode $episode, array $data): void + public function addToCastingEpisode(Person $person, Episode $episode, array $data): Casting { $entityRepository = $this->entityManager->getRepository(Casting::class); $casting = $entityRepository->findOneBy( @@ -41,10 +41,7 @@ public function addToCastingEpisode(Person $person, Episode $episode, array $dat $casting->setRefPerson($person); } - $casting->setKnownForDepartment($data['known_for_department'] ?? null); - $casting->setFigure($data['character'] ?? null); - - $entityRepository->save($casting); + return $this->addToCasting($casting, $data); } public function addToCastingMovie(Person $person, Movie $movie, array $data): Casting From ad8670544c040816c9e3b6967e6e32530a9dba3f Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Fri, 19 Dec 2025 11:48:36 +0100 Subject: [PATCH 06/50] =?UTF-8?q?feat:=20ajouter=20des=20fonctionnalit?= =?UTF-8?q?=C3=A9s=20de=20casting=20et=20des=20champs=20associ=C3=A9s=20po?= =?UTF-8?q?ur=20les=20s=C3=A9ries,=20films,=20saisons=20et=20=C3=A9pisodes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller/Admin/PersonCrudController.php | 29 +++++++++++ apps/src/Data/PersonData.php | 16 ++++++ apps/src/Twig/Extension/CastingExtension.php | 23 ++++++++ .../Twig/Runtime/CastingExtensionRuntime.php | 52 +++++++++++++++++++ .../admin/field/casting-episodes.html.twig | 25 +++++++++ .../admin/field/casting-movies.html.twig | 25 +++++++++ .../admin/field/casting-seasons.html.twig | 25 +++++++++ .../admin/field/casting-series.html.twig | 25 +++++++++ .../paragraphs/content/head-movie.html.twig | 23 ++++++++ assets/front/paragraphs/_head-movie.scss | 52 +++++++++++++++++++ 10 files changed, 295 insertions(+) create mode 100644 apps/src/Data/PersonData.php create mode 100644 apps/src/Twig/Extension/CastingExtension.php create mode 100644 apps/src/Twig/Runtime/CastingExtensionRuntime.php create mode 100644 apps/templates/admin/field/casting-episodes.html.twig create mode 100644 apps/templates/admin/field/casting-movies.html.twig create mode 100644 apps/templates/admin/field/casting-seasons.html.twig create mode 100644 apps/templates/admin/field/casting-series.html.twig diff --git a/apps/src/Controller/Admin/PersonCrudController.php b/apps/src/Controller/Admin/PersonCrudController.php index 01d3b72e4..808759533 100644 --- a/apps/src/Controller/Admin/PersonCrudController.php +++ b/apps/src/Controller/Admin/PersonCrudController.php @@ -5,8 +5,10 @@ use EasyCorp\Bundle\EasyAdminBundle\Config\Action; use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; +use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; use EasyCorp\Bundle\EasyAdminBundle\Field\DateField; +use EasyCorp\Bundle\EasyAdminBundle\Field\FormField; use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; use Labstag\Entity\Person; use Labstag\Field\WysiwygField; @@ -71,6 +73,22 @@ public function configureFields(string $pageName): iterable $textField = TextField::new('placeOfBirth', new TranslatableMessage('Place of birth')); $textField->hideOnIndex(); + $serieField = AssociationField::new('castings', new TranslatableMessage('Series')); + $serieField->setTemplatePath('admin/field/casting-series.html.twig'); + $serieField->onlyOnDetail(); + + $movieField = AssociationField::new('castings', new TranslatableMessage('Movies')); + $movieField->setTemplatePath('admin/field/casting-movies.html.twig'); + $movieField->onlyOnDetail(); + + $seasonField = AssociationField::new('castings', new TranslatableMessage('Seasons')); + $seasonField->setTemplatePath('admin/field/casting-seasons.html.twig'); + $seasonField->onlyOnDetail(); + + $episodeField = AssociationField::new('castings', new TranslatableMessage('Episodes')); + $episodeField->setTemplatePath('admin/field/casting-episodes.html.twig'); + $episodeField->onlyOnDetail(); + $profileTranslation = new TranslatableMessage('Profile'); $this->crudFieldFactory->addFieldsToTab( 'principal', @@ -90,6 +108,17 @@ public function configureFields(string $pageName): iterable $wysiwygField, ] ); + $this->crudFieldFactory->addTab('casting', FormField::addTab(new TranslatableMessage('Casting'))); + $this->crudFieldFactory->addFieldsToTab( + 'casting', + [ + $serieField, + $movieField, + $seasonField, + $episodeField, + ] + ); + $this->crudFieldFactory->setTabDate($pageName); yield from $this->crudFieldFactory->getConfigureFields($pageName); } diff --git a/apps/src/Data/PersonData.php b/apps/src/Data/PersonData.php new file mode 100644 index 000000000..5d9b8e461 --- /dev/null +++ b/apps/src/Data/PersonData.php @@ -0,0 +1,16 @@ +getByType('Acting', $data); + } + + public function writing(PersistentCollection $data): array + { + return $this->getByType('Writing', $data); + } + + public function directing(PersistentCollection $data): array + { + return $this->getByType('Directing', $data); + } + + public function production(PersistentCollection $data): array + { + return $this->getByType('Production', $data); + } + + public function editing(PersistentCollection $data): array + { + return $this->getByType('Editing', $data); + } + + private function getByType(string $type, PersistentCollection $data): array + { + $casting = []; + foreach ($data as $row) { + if ($row->getKnownForDepartment() != $type) { + continue; + } + $casting[] = $row; + } + + return $casting; + } +} diff --git a/apps/templates/admin/field/casting-episodes.html.twig b/apps/templates/admin/field/casting-episodes.html.twig new file mode 100644 index 000000000..a1729f7d9 --- /dev/null +++ b/apps/templates/admin/field/casting-episodes.html.twig @@ -0,0 +1,25 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + + {% for casting in instance.castings %} + {% if casting.refEpisode is not null %} + + + + + + + {% endif %} + {% endfor %} +
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }} + + {{ casting.refEpisode.title }} + +
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/templates/admin/field/casting-movies.html.twig b/apps/templates/admin/field/casting-movies.html.twig new file mode 100644 index 000000000..187c031f7 --- /dev/null +++ b/apps/templates/admin/field/casting-movies.html.twig @@ -0,0 +1,25 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + + {% for casting in instance.castings %} + {% if casting.refMovie is not null %} + + + + + + + {% endif %} + {% endfor %} +
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }} + + {{ casting.refMovie.title }} + +
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/templates/admin/field/casting-seasons.html.twig b/apps/templates/admin/field/casting-seasons.html.twig new file mode 100644 index 000000000..dd5a89186 --- /dev/null +++ b/apps/templates/admin/field/casting-seasons.html.twig @@ -0,0 +1,25 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + + {% for casting in instance.castings %} + {% if casting.refSeason is not null %} + + + + + + + {% endif %} + {% endfor %} +
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }} + + {{ casting.refSeason.title }} + +
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/templates/admin/field/casting-series.html.twig b/apps/templates/admin/field/casting-series.html.twig new file mode 100644 index 000000000..0e429f33c --- /dev/null +++ b/apps/templates/admin/field/casting-series.html.twig @@ -0,0 +1,25 @@ +{% set instance = entity.instance %} +{% if ea().crud.currentAction == 'detail' %} + + {% for casting in instance.castings %} + {% if casting.refSerie is not null %} + + + + + + + {% endif %} + {% endfor %} +
+ + {{ casting.refPerson.title }} + + {{ casting.knownForDepartment }}{{ casting.figure }} + + {{ casting.refSerie.title }} + +
+{% else %} + {{ instance.castings|length }} +{% endif %} diff --git a/apps/templates/paragraphs/content/head-movie.html.twig b/apps/templates/paragraphs/content/head-movie.html.twig index d769d58c8..64f9b17ea 100644 --- a/apps/templates/paragraphs/content/head-movie.html.twig +++ b/apps/templates/paragraphs/content/head-movie.html.twig @@ -112,5 +112,28 @@ {% endif %} {% endif %} + {% set actings = casting_acting(movie.castings) %} + {% if actings|length > 0 %} +
+

+ {{ 'Cast'|trans }} +

+
+ {% for acting in actings %} +
+
+
+
+ {{ acting.refperson.title }} +
+
+
+ {{ acting.figure }} +
+
+ {% endfor %} +
+
+ {% endif %} diff --git a/assets/front/paragraphs/_head-movie.scss b/assets/front/paragraphs/_head-movie.scss index 26fd33e0a..3b70b6123 100644 --- a/assets/front/paragraphs/_head-movie.scss +++ b/assets/front/paragraphs/_head-movie.scss @@ -32,4 +32,56 @@ margin-bottom: 11px; @extend %video; } + + .actings { + margin: 20px 0; + padding: 20px; + + .subtitle { + margin-bottom: 20px; + font-size: 1.5rem; + font-weight: bold; + } + + .wrapper { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); + gap: 20px; + } + + .acting { + display: flex; + flex-direction: column; + text-align: center; + + .actor { + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 10px; + + .profile { + width: 120px; + height: 120px; + border-radius: 50%; + background-image: var(--image-url); + background-size: cover; + background-position: center; + margin-bottom: 10px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + } + + .name { + font-weight: 600; + font-size: 0.95rem; + } + } + + .character { + font-size: 0.85rem; + color: #666; + font-style: italic; + } + } + } } \ No newline at end of file From 87b287bcd3c4479558f7ce1ae942f9d3f2acefde Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sat, 20 Dec 2025 09:37:35 +0100 Subject: [PATCH 07/50] =?UTF-8?q?feat:=20ajouter=20la=20classe=20PersonFil?= =?UTF-8?q?eStorage=20pour=20g=C3=A9rer=20le=20stockage=20des=20entit?= =?UTF-8?q?=C3=A9s=20Person?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/FileStorage/PersonFileStorage.php | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 apps/src/FileStorage/PersonFileStorage.php diff --git a/apps/src/FileStorage/PersonFileStorage.php b/apps/src/FileStorage/PersonFileStorage.php new file mode 100644 index 000000000..2ff33e23b --- /dev/null +++ b/apps/src/FileStorage/PersonFileStorage.php @@ -0,0 +1,29 @@ +setAdapter($localFilesystemAdapter); + $this->setType('person'); + } + + #[Override] + public function getEntity(): array + { + return [Person::class]; + } +} From f3f49edef219564501acef0e9726d8d4c2fe8fcd Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sat, 20 Dec 2025 10:37:29 +0100 Subject: [PATCH 08/50] =?UTF-8?q?feat:=20ajouter=20des=20en-t=C3=AAtes=20e?= =?UTF-8?q?t=20des=20traductions=20pour=20les=20tableaux=20de=20distributi?= =?UTF-8?q?on=20dans=20les=20templates=20de=20casting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/field/casting-episodes.html.twig | 22 +++++++++++++++++++ .../admin/field/casting-movies.html.twig | 10 +++++++++ .../admin/field/casting-seasons.html.twig | 16 ++++++++++++++ .../admin/field/casting-series.html.twig | 10 +++++++++ apps/translations/messages.fr.xlf | 12 ++++++++++ 5 files changed, 70 insertions(+) diff --git a/apps/templates/admin/field/casting-episodes.html.twig b/apps/templates/admin/field/casting-episodes.html.twig index a1729f7d9..3d8c5072e 100644 --- a/apps/templates/admin/field/casting-episodes.html.twig +++ b/apps/templates/admin/field/casting-episodes.html.twig @@ -1,6 +1,17 @@ {% set instance = entity.instance %} {% if ea().crud.currentAction == 'detail' %} + + + + + + + + + + + {% for casting in instance.castings %} {% if casting.refEpisode is not null %} @@ -11,6 +22,16 @@ + + {% endif %} {% endfor %} +
{{ 'Person'|trans }}{{ 'Known For Department'|trans }}{{ 'Figure'|trans }}{{ 'Serie'|trans }}{{ 'Season'|trans }}{{ 'Episode'|trans }}
{{ casting.knownForDepartment }} {{ casting.figure }} + + {{ casting.refEpisode.refseason.refserie.title }} + + + + {{ casting.refEpisode.refseason.title }} + + {{ casting.refEpisode.title }} @@ -19,6 +40,7 @@
{% else %} {{ instance.castings|length }} diff --git a/apps/templates/admin/field/casting-movies.html.twig b/apps/templates/admin/field/casting-movies.html.twig index 187c031f7..04048b5b6 100644 --- a/apps/templates/admin/field/casting-movies.html.twig +++ b/apps/templates/admin/field/casting-movies.html.twig @@ -1,6 +1,15 @@ {% set instance = entity.instance %} {% if ea().crud.currentAction == 'detail' %} + + + + + + + + + {% for casting in instance.castings %} {% if casting.refMovie is not null %} @@ -19,6 +28,7 @@ {% endif %} {% endfor %} +
{{ 'Person'|trans }}{{ 'Known For Department'|trans }}{{ 'Figure'|trans }}{{ 'Movie'|trans }}
{% else %} {{ instance.castings|length }} diff --git a/apps/templates/admin/field/casting-seasons.html.twig b/apps/templates/admin/field/casting-seasons.html.twig index dd5a89186..a03249a0d 100644 --- a/apps/templates/admin/field/casting-seasons.html.twig +++ b/apps/templates/admin/field/casting-seasons.html.twig @@ -1,6 +1,16 @@ {% set instance = entity.instance %} {% if ea().crud.currentAction == 'detail' %} + + + + + + + + + + {% for casting in instance.castings %} {% if casting.refSeason is not null %} @@ -11,6 +21,11 @@ + {% endif %} {% endfor %} +
{{ 'Person'|trans }}{{ 'Known For Department'|trans }}{{ 'Figure'|trans }}{{ 'Serie'|trans }}{{ 'Season'|trans }}
{{ casting.knownForDepartment }} {{ casting.figure }} + + {{ casting.refSeason.refserie.title }} + + {{ casting.refSeason.title }} @@ -19,6 +34,7 @@
{% else %} {{ instance.castings|length }} diff --git a/apps/templates/admin/field/casting-series.html.twig b/apps/templates/admin/field/casting-series.html.twig index 0e429f33c..e8c87530b 100644 --- a/apps/templates/admin/field/casting-series.html.twig +++ b/apps/templates/admin/field/casting-series.html.twig @@ -1,6 +1,15 @@ {% set instance = entity.instance %} {% if ea().crud.currentAction == 'detail' %} + + + + + + + + + {% for casting in instance.castings %} {% if casting.refSerie is not null %} @@ -19,6 +28,7 @@ {% endif %} {% endfor %} +
{{ 'Person'|trans }}{{ 'Known For Department'|trans }}{{ 'Figure'|trans }}{{ 'Serie'|trans }}
{% else %} {{ instance.castings|length }} diff --git a/apps/translations/messages.fr.xlf b/apps/translations/messages.fr.xlf index c1a35c12a..ebe67265c 100644 --- a/apps/translations/messages.fr.xlf +++ b/apps/translations/messages.fr.xlf @@ -2353,6 +2353,18 @@ Casting Distribution + + Cast + Acteurs + + + Known For Department + Connu pour + + + Figure + Personnage + From 5a03f2ae0474e4338efcdd32ee6c354cf4ae3365 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sun, 21 Dec 2025 12:35:19 +0100 Subject: [PATCH 09/50] =?UTF-8?q?feat:=20ajouter=20la=20classe=20SerieFile?= =?UTF-8?q?Storage=20pour=20g=C3=A9rer=20le=20stockage=20des=20entit=C3=A9?= =?UTF-8?q?s=20Serie=20et=20am=C3=A9liorer=20la=20gestion=20des=20fichiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/FileStorage/SerieFileStorage.php | 29 ++++++++ apps/src/Service/FileService.php | 83 ++++++++++++++--------- 2 files changed, 81 insertions(+), 31 deletions(-) create mode 100644 apps/src/FileStorage/SerieFileStorage.php diff --git a/apps/src/FileStorage/SerieFileStorage.php b/apps/src/FileStorage/SerieFileStorage.php new file mode 100644 index 000000000..cd022a15e --- /dev/null +++ b/apps/src/FileStorage/SerieFileStorage.php @@ -0,0 +1,29 @@ +setAdapter($localFilesystemAdapter); + $this->setType('serie'); + } + + #[Override] + public function getEntity(): array + { + return [Serie::class]; + } +} diff --git a/apps/src/Service/FileService.php b/apps/src/Service/FileService.php index 7a4fdac30..d2fe83e30 100644 --- a/apps/src/Service/FileService.php +++ b/apps/src/Service/FileService.php @@ -8,10 +8,13 @@ use Essence\Media; use Exception; use GdImage; +use Labstag\Entity\Block; +use Labstag\Entity\Paragraph; use Labstag\Message\FileDeleteMessage; use PhpOffice\PhpSpreadsheet\Reader\Csv; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use Psr\Log\LoggerInterface; +use ReflectionClass; use Symfony\Component\DependencyInjection\Attribute\AutowireIterator; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\HttpFoundation\File\UploadedFile; @@ -74,49 +77,67 @@ public function deleteAll(): void } } - public function deletedFileByEntities(): int + public function deletedFileByEntities(): void { - $total = 0; $this->entityManager->getFilters()->disable('softdeleteable'); foreach ($this->fileStorages as $fileStorage) { - $deletes = []; - $entities = $fileStorage->getEntity(); + $deletes = []; + $entities = $fileStorage->getEntity(); if (0 === count($entities)) { continue; } - foreach ($entities as $entityClass) { - $repository = $this->getRepository($entityClass); - $mappings = $this->propertyMappingFactory->fromObject(new $entityClass()); - $files = $fileStorage->getFilesByDirectory($fileStorage->getFilesystem(), ''); - foreach ($files as $row) { - $file = $row['path']; - $find = 0; - foreach ($mappings as $mapping) { - $field = $mapping->getFileNamePropertyName(); - $entity = $repository->findOneBy( - [$field => $file] - ); - if (!$entity instanceof $entityClass) { - continue; - } - - $find = 1; - - break; - } - - if (0 === $find) { - $deletes[] = $file; - } + $files = $fileStorage->getFilesByDirectory($fileStorage->getFilesystem(), ''); + foreach ($files as $row) { + $find = $this->findInEntities($entities, $row['path']); + if (!$find) { + $deletes[] = $row['path']; } + } - $total += count($deletes); - $fileStorage->deleteFilesByType($deletes); + $fileStorage->deleteFilesByType($deletes); + } + } + + private function findInEntities(array $entities, string $file): bool + { + $find = false; + foreach ($entities as $entityClass) { + $find = $this->findInEntity($entityClass, $file); + if ($find) { + break; } } - return $total; + return $find; + } + + private function findInEntity(string $entityClass, string $file): bool + { + $repository = $this->getRepository($entityClass); + $mappings = $this->propertyMappingFactory->fromObject(new $entityClass()); + $search = []; + foreach ($mappings as $mapping) { + $field = $mapping->getFileNamePropertyName(); + $search[$field] = $file; + } + + $entity = $this->findInFields($repository, $search); + + return (0 !== count($entity)); + } + + private function findInFields($repository, array $fields) + { + $queryBuilder = $repository->createQueryBuilder('entity'); + foreach ($fields as $field => $value) { + $queryBuilder->orWhere("entity.$field = :$field"); + $queryBuilder->setParameter($field, $value); + } + + $query = $queryBuilder->getQuery(); + + return $query->getResult(); } public function getBasePath(mixed $entity, string $type): string From c427fa39b6bdaa78dbe263e8d6ce0539853674ad Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sun, 21 Dec 2025 13:06:26 +0100 Subject: [PATCH 10/50] =?UTF-8?q?feat:=20ajouter=20le=20service=20MessageD?= =?UTF-8?q?ispatcher=20pour=20g=C3=A9rer=20le=20dispatch=20de=20messages?= =?UTF-8?q?=20avec=20d=C3=A9duplication=20et=20=C3=A9viter=20les=20doublon?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/config/packages/messenger.yaml | 5 + apps/src/Command/ExecuteMessageCommand.php | 3 +- apps/src/Command/GeocodeInstallCommand.php | 3 +- apps/src/Command/StarAddCommand.php | 3 +- apps/src/Command/StoryPdfCommand.php | 3 +- .../Admin/CrudControllerAbstract.php | 3 +- apps/src/Controller/BackController.php | 3 +- apps/src/Event/Abstract/EventEntityLib.php | 3 +- apps/src/Event/Workflow/WorkflowAbstract.php | 3 +- .../MessageDispatcherResetListener.php | 30 ++++ .../MessageHandler/AddMovieMessageHandler.php | 3 +- .../MessageHandler/AddSerieMessageHandler.php | 3 +- .../CompanyAllMessageHandler.php | 3 +- .../MessageHandler/GameAllMessageHandler.php | 3 +- .../MessageHandler/ImportMessageHandler.php | 3 +- .../MessageHandler/MovieAllMessageHandler.php | 3 +- .../PersonAllMessageHandler.php | 3 +- .../MessageHandler/SagaAllMessageHandler.php | 3 +- .../SearchGameMessageHandler.php | 3 +- .../SeasonAllMessageHandler.php | 3 +- .../MessageHandler/SerieAllMessageHandler.php | 3 +- .../MessageHandler/StoryAllMessageHandler.php | 3 +- .../UpdateSerieMessageHandler.php | 3 +- .../Middleware/DeduplicationMiddleware.php | 63 +++++++++ apps/src/Service/FileService.php | 2 +- apps/src/Service/FrontService.php | 2 +- apps/src/Service/Imdb/CompanyService.php | 3 +- apps/src/Service/Imdb/PersonService.php | 3 +- apps/src/Service/Imdb/SagaService.php | 3 +- apps/src/Service/Imdb/SeasonService.php | 3 +- apps/src/Service/Imdb/SerieService.php | 3 +- apps/src/Service/MessageDispatcherService.php | 132 ++++++++++++++++++ 32 files changed, 284 insertions(+), 28 deletions(-) create mode 100644 apps/src/EventListener/MessageDispatcherResetListener.php create mode 100644 apps/src/Middleware/DeduplicationMiddleware.php create mode 100644 apps/src/Service/MessageDispatcherService.php diff --git a/apps/config/packages/messenger.yaml b/apps/config/packages/messenger.yaml index 7c717d356..0748e71c6 100644 --- a/apps/config/packages/messenger.yaml +++ b/apps/config/packages/messenger.yaml @@ -20,6 +20,11 @@ framework: # Route your messages to the transports # 'Labstag\Message\YourMessage': async + buses: + messenger.bus.default: + middleware: + - Labstag\Middleware\DeduplicationMiddleware + # when@test: # framework: # messenger: diff --git a/apps/src/Command/ExecuteMessageCommand.php b/apps/src/Command/ExecuteMessageCommand.php index 0bd9c24b9..3a8a9eb7d 100644 --- a/apps/src/Command/ExecuteMessageCommand.php +++ b/apps/src/Command/ExecuteMessageCommand.php @@ -8,6 +8,7 @@ use Labstag\Message\NotificationMessage; use Labstag\Message\PageCinemaMessage; use Labstag\Message\UpdateSerieMessage; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Style\SymfonyStyle; @@ -17,7 +18,7 @@ class ExecuteMessageCommand { public function __construct( - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, ) { } diff --git a/apps/src/Command/GeocodeInstallCommand.php b/apps/src/Command/GeocodeInstallCommand.php index a8052b0a0..4c602d017 100644 --- a/apps/src/Command/GeocodeInstallCommand.php +++ b/apps/src/Command/GeocodeInstallCommand.php @@ -6,6 +6,7 @@ use Labstag\Entity\GeoCode; use Labstag\Message\GeocodeMessage; use Labstag\Service\GeocodeService; +use Labstag\Service\MessageDispatcherService; use NumberFormatter; use Symfony\Component\Console\Attribute\Argument; use Symfony\Component\Console\Attribute\AsCommand; @@ -25,7 +26,7 @@ class GeocodeInstallCommand public function __construct( private readonly GeocodeService $geocodeService, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, ) { } diff --git a/apps/src/Command/StarAddCommand.php b/apps/src/Command/StarAddCommand.php index c8191d2f4..bb4b908ee 100644 --- a/apps/src/Command/StarAddCommand.php +++ b/apps/src/Command/StarAddCommand.php @@ -6,6 +6,7 @@ use Labstag\Message\StarMessage; use Labstag\Repository\StarRepository; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; @@ -23,7 +24,7 @@ class StarAddCommand public function __construct( protected FileService $fileService, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected StarRepository $starRepository, ) { diff --git a/apps/src/Command/StoryPdfCommand.php b/apps/src/Command/StoryPdfCommand.php index aa4eea347..e08245805 100644 --- a/apps/src/Command/StoryPdfCommand.php +++ b/apps/src/Command/StoryPdfCommand.php @@ -4,6 +4,7 @@ use Labstag\Message\StoryMessage; use Labstag\Repository\StoryRepository; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\StoryService; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; @@ -18,7 +19,7 @@ class StoryPdfCommand { public function __construct( protected StoryRepository $storyRepository, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected StoryService $storyService, ) { diff --git a/apps/src/Controller/Admin/CrudControllerAbstract.php b/apps/src/Controller/Admin/CrudControllerAbstract.php index 54e56a0cf..8049492b6 100644 --- a/apps/src/Controller/Admin/CrudControllerAbstract.php +++ b/apps/src/Controller/Admin/CrudControllerAbstract.php @@ -34,6 +34,7 @@ use Labstag\Service\Imdb\SagaService; use Labstag\Service\Imdb\SeasonService; use Labstag\Service\Imdb\SerieService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\ParagraphService; use Labstag\Service\SecurityService; use Labstag\Service\SiteService; @@ -71,7 +72,7 @@ public function __construct( protected FileService $fileService, protected SiteService $siteService, protected SlugService $slugService, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected SeasonService $seasonService, protected SecurityService $securityService, protected BlockService $blockService, diff --git a/apps/src/Controller/BackController.php b/apps/src/Controller/BackController.php index 1329c3592..fedebac56 100644 --- a/apps/src/Controller/BackController.php +++ b/apps/src/Controller/BackController.php @@ -12,6 +12,7 @@ use Labstag\Message\DeleteOldFileMessage; use Labstag\Repository\RepositoryAbstract; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\SiteService; use Labstag\Service\UserService; use Labstag\Service\WorkflowService; @@ -32,7 +33,7 @@ public function __construct( protected WorkflowService $workflowService, protected SiteService $siteService, protected IgdbApi $igdbApi, - private readonly MessageBusInterface $messageBus, + private readonly MessageDispatcherService $messageBus, ) { } diff --git a/apps/src/Event/Abstract/EventEntityLib.php b/apps/src/Event/Abstract/EventEntityLib.php index 613f14f1a..7dc54c032 100644 --- a/apps/src/Event/Abstract/EventEntityLib.php +++ b/apps/src/Event/Abstract/EventEntityLib.php @@ -22,6 +22,7 @@ use Labstag\Message\StoryMessage; use Labstag\Service\BlockService; use Labstag\Service\Imdb\MovieService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\ParagraphService; use Labstag\Service\WorkflowService; use ReflectionClass; @@ -34,7 +35,7 @@ abstract class EventEntityLib public function __construct( #[Autowire(service: 'workflow.registry')] private Registry $workflowRegistry, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected WorkflowService $workflowService, protected EntityManagerInterface $entityManager, protected ParagraphService $paragraphService, diff --git a/apps/src/Event/Workflow/WorkflowAbstract.php b/apps/src/Event/Workflow/WorkflowAbstract.php index 075785242..08724c775 100644 --- a/apps/src/Event/Workflow/WorkflowAbstract.php +++ b/apps/src/Event/Workflow/WorkflowAbstract.php @@ -2,12 +2,13 @@ namespace Labstag\Event\Workflow; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\MessageBusInterface; abstract class WorkflowAbstract { public function __construct( - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, ) { } diff --git a/apps/src/EventListener/MessageDispatcherResetListener.php b/apps/src/EventListener/MessageDispatcherResetListener.php new file mode 100644 index 000000000..f35435f95 --- /dev/null +++ b/apps/src/EventListener/MessageDispatcherResetListener.php @@ -0,0 +1,30 @@ +isMainRequest()) { + return; + } + + $this->messageDispatcherService->reset(); + } +} diff --git a/apps/src/MessageHandler/AddMovieMessageHandler.php b/apps/src/MessageHandler/AddMovieMessageHandler.php index 7ff807ea6..44b2c7ced 100644 --- a/apps/src/MessageHandler/AddMovieMessageHandler.php +++ b/apps/src/MessageHandler/AddMovieMessageHandler.php @@ -6,6 +6,7 @@ use Labstag\Message\AddMovieMessage; use Labstag\Message\MovieMessage; use Labstag\Repository\MovieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -13,7 +14,7 @@ final class AddMovieMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private MovieRepository $movieRepository, ) { diff --git a/apps/src/MessageHandler/AddSerieMessageHandler.php b/apps/src/MessageHandler/AddSerieMessageHandler.php index 9edb098c9..e5ab286bd 100644 --- a/apps/src/MessageHandler/AddSerieMessageHandler.php +++ b/apps/src/MessageHandler/AddSerieMessageHandler.php @@ -6,6 +6,7 @@ use Labstag\Message\AddSerieMessage; use Labstag\Message\SerieMessage; use Labstag\Repository\SerieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -13,7 +14,7 @@ final class AddSerieMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private SerieRepository $serieRepository, ) { diff --git a/apps/src/MessageHandler/CompanyAllMessageHandler.php b/apps/src/MessageHandler/CompanyAllMessageHandler.php index 1bcb22efe..066f15cab 100644 --- a/apps/src/MessageHandler/CompanyAllMessageHandler.php +++ b/apps/src/MessageHandler/CompanyAllMessageHandler.php @@ -5,6 +5,7 @@ use Labstag\Message\CompanyAllMessage; use Labstag\Message\CompanyMessage; use Labstag\Repository\CompanyRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -12,7 +13,7 @@ final class CompanyAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private CompanyRepository $companyRepository, ) { diff --git a/apps/src/MessageHandler/GameAllMessageHandler.php b/apps/src/MessageHandler/GameAllMessageHandler.php index da58c1dd0..e25ba247e 100644 --- a/apps/src/MessageHandler/GameAllMessageHandler.php +++ b/apps/src/MessageHandler/GameAllMessageHandler.php @@ -5,6 +5,7 @@ use Labstag\Message\GameAllMessage; use Labstag\Message\GameMessage; use Labstag\Repository\GameRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -12,7 +13,7 @@ final class GameAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private GameRepository $gameRepository, ) { diff --git a/apps/src/MessageHandler/ImportMessageHandler.php b/apps/src/MessageHandler/ImportMessageHandler.php index 1cc5079c3..0c30aeb91 100644 --- a/apps/src/MessageHandler/ImportMessageHandler.php +++ b/apps/src/MessageHandler/ImportMessageHandler.php @@ -7,6 +7,7 @@ use Labstag\Message\ImportMessage; use Labstag\Message\SearchGameMessage; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -15,7 +16,7 @@ final class ImportMessageHandler { public function __construct( private FileService $fileService, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, ) { } diff --git a/apps/src/MessageHandler/MovieAllMessageHandler.php b/apps/src/MessageHandler/MovieAllMessageHandler.php index cb79693b9..94c273b44 100644 --- a/apps/src/MessageHandler/MovieAllMessageHandler.php +++ b/apps/src/MessageHandler/MovieAllMessageHandler.php @@ -5,6 +5,7 @@ use Labstag\Message\MovieAllMessage; use Labstag\Message\MovieMessage; use Labstag\Repository\MovieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -12,7 +13,7 @@ final class MovieAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private MovieRepository $movieRepository, ) { diff --git a/apps/src/MessageHandler/PersonAllMessageHandler.php b/apps/src/MessageHandler/PersonAllMessageHandler.php index 39d2446b4..8c4c22544 100644 --- a/apps/src/MessageHandler/PersonAllMessageHandler.php +++ b/apps/src/MessageHandler/PersonAllMessageHandler.php @@ -5,6 +5,7 @@ use Labstag\Message\PersonAllMessage; use Labstag\Message\PersonMessage; use Labstag\Repository\PersonRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -12,7 +13,7 @@ final class PersonAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private PersonRepository $personRepository, ) { diff --git a/apps/src/MessageHandler/SagaAllMessageHandler.php b/apps/src/MessageHandler/SagaAllMessageHandler.php index f8240568c..58399574e 100644 --- a/apps/src/MessageHandler/SagaAllMessageHandler.php +++ b/apps/src/MessageHandler/SagaAllMessageHandler.php @@ -5,6 +5,7 @@ use Labstag\Message\SagaAllMessage; use Labstag\Message\SagaMessage; use Labstag\Repository\SagaRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -12,7 +13,7 @@ final class SagaAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private SagaRepository $sagaRepository, ) { diff --git a/apps/src/MessageHandler/SearchGameMessageHandler.php b/apps/src/MessageHandler/SearchGameMessageHandler.php index cc008edfe..2e0928559 100644 --- a/apps/src/MessageHandler/SearchGameMessageHandler.php +++ b/apps/src/MessageHandler/SearchGameMessageHandler.php @@ -8,6 +8,7 @@ use Labstag\Message\AddGameMessage; use Labstag\Message\SearchGameMessage; use Labstag\Service\Igdb\GameService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\NotificationService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -16,7 +17,7 @@ final class SearchGameMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private GameService $gameService, private NotificationService $notificationService, private EntityManagerInterface $entityManager, diff --git a/apps/src/MessageHandler/SeasonAllMessageHandler.php b/apps/src/MessageHandler/SeasonAllMessageHandler.php index d50b945a2..4bd64ff7f 100644 --- a/apps/src/MessageHandler/SeasonAllMessageHandler.php +++ b/apps/src/MessageHandler/SeasonAllMessageHandler.php @@ -5,6 +5,7 @@ use Labstag\Message\SeasonAllMessage; use Labstag\Message\SeasonMessage; use Labstag\Repository\SeasonRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -12,7 +13,7 @@ final class SeasonAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private SeasonRepository $seasonRepository, ) { diff --git a/apps/src/MessageHandler/SerieAllMessageHandler.php b/apps/src/MessageHandler/SerieAllMessageHandler.php index ecd6ea4aa..6b72afad0 100644 --- a/apps/src/MessageHandler/SerieAllMessageHandler.php +++ b/apps/src/MessageHandler/SerieAllMessageHandler.php @@ -5,6 +5,7 @@ use Labstag\Message\SerieAllMessage; use Labstag\Message\SerieMessage; use Labstag\Repository\SerieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -12,7 +13,7 @@ final class SerieAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private SerieRepository $serieRepository, ) { diff --git a/apps/src/MessageHandler/StoryAllMessageHandler.php b/apps/src/MessageHandler/StoryAllMessageHandler.php index 1a9add5e3..643cc6be8 100644 --- a/apps/src/MessageHandler/StoryAllMessageHandler.php +++ b/apps/src/MessageHandler/StoryAllMessageHandler.php @@ -5,6 +5,7 @@ use Labstag\Message\StoryAllMessage; use Labstag\Message\StoryMessage; use Labstag\Repository\StoryRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -12,7 +13,7 @@ final class StoryAllMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private StoryRepository $storyRepository, ) { diff --git a/apps/src/MessageHandler/UpdateSerieMessageHandler.php b/apps/src/MessageHandler/UpdateSerieMessageHandler.php index bc4bd7286..d1cab6417 100644 --- a/apps/src/MessageHandler/UpdateSerieMessageHandler.php +++ b/apps/src/MessageHandler/UpdateSerieMessageHandler.php @@ -5,6 +5,7 @@ use Labstag\Message\SerieMessage; use Labstag\Message\UpdateSerieMessage; use Labstag\Repository\SerieRepository; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; @@ -12,7 +13,7 @@ final class UpdateSerieMessageHandler { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private SerieRepository $serieRepository, ) { diff --git a/apps/src/Middleware/DeduplicationMiddleware.php b/apps/src/Middleware/DeduplicationMiddleware.php new file mode 100644 index 000000000..0144d49cb --- /dev/null +++ b/apps/src/Middleware/DeduplicationMiddleware.php @@ -0,0 +1,63 @@ +getMessage(); + $messageKey = $this->getMessageKey($message); + + // Si le message a déjà été dispatché, on ne le traite pas + if ($this->messageDispatcherService->isAlreadyDispatched($messageKey)) { + return $envelope; + } + + // Marquer comme dispatché + $this->messageDispatcherService->markAsDispatched($messageKey); + + // Continuer le traitement + return $stack->next()->handle($envelope, $stack); + } + + private function getMessageKey(object $message): string + { + $className = get_class($message); + $reflection = new \ReflectionClass($message); + $properties = []; + + foreach ($reflection->getProperties() as $property) { + $property->setAccessible(true); + $value = $property->getValue($message); + $properties[$property->getName()] = $this->serializeValue($value); + } + + ksort($properties); + + return $className . '::' . md5(serialize($properties)); + } + + private function serializeValue(mixed $value): mixed + { + if (is_object($value)) { + return spl_object_hash($value); + } + + return $value; + } +} diff --git a/apps/src/Service/FileService.php b/apps/src/Service/FileService.php index d2fe83e30..1ac1edaf9 100644 --- a/apps/src/Service/FileService.php +++ b/apps/src/Service/FileService.php @@ -31,7 +31,7 @@ final class FileService public function __construct( #[AutowireIterator('labstag.filestorage')] private readonly iterable $fileStorages, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private LoggerInterface $logger, private EntityManagerInterface $entityManager, private ParameterBagInterface $parameterBag, diff --git a/apps/src/Service/FrontService.php b/apps/src/Service/FrontService.php index 24184892b..c74fa6aad 100644 --- a/apps/src/Service/FrontService.php +++ b/apps/src/Service/FrontService.php @@ -21,7 +21,7 @@ public function __construct( private readonly iterable $datas, protected CacheService $cacheService, protected EntityManagerInterface $entityManager, - protected MessageBusInterface $messageBus, + protected MessageDispatcherService $messageBus, protected FileService $fileService, protected ConfigurationService $configurationService, protected SlugService $slugService, diff --git a/apps/src/Service/Imdb/CompanyService.php b/apps/src/Service/Imdb/CompanyService.php index 28e22fd44..aa3837f91 100644 --- a/apps/src/Service/Imdb/CompanyService.php +++ b/apps/src/Service/Imdb/CompanyService.php @@ -7,6 +7,7 @@ use Labstag\Message\CompanyMessage; use Labstag\Repository\CompanyRepository; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Psr\Log\LoggerInterface; use Symfony\Component\Messenger\MessageBusInterface; @@ -14,7 +15,7 @@ final class CompanyService { public function __construct( private LoggerInterface $logger, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private CompanyRepository $companyRepository, private FileService $fileService, private TheMovieDbApi $theMovieDbApi, diff --git a/apps/src/Service/Imdb/PersonService.php b/apps/src/Service/Imdb/PersonService.php index 393828235..0f724facc 100644 --- a/apps/src/Service/Imdb/PersonService.php +++ b/apps/src/Service/Imdb/PersonService.php @@ -13,12 +13,13 @@ use Labstag\Entity\Serie; use Labstag\Message\PersonMessage; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\MessageBusInterface; final class PersonService { public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private EntityManagerInterface $entityManager, private FileService $fileService, private TheMovieDbApi $theMovieDbApi, diff --git a/apps/src/Service/Imdb/SagaService.php b/apps/src/Service/Imdb/SagaService.php index 1c58960d0..ed404638d 100644 --- a/apps/src/Service/Imdb/SagaService.php +++ b/apps/src/Service/Imdb/SagaService.php @@ -7,6 +7,7 @@ use Labstag\Message\SagaMessage; use Labstag\Repository\SagaRepository; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Psr\Log\LoggerInterface; use Symfony\Component\Messenger\MessageBusInterface; @@ -14,7 +15,7 @@ final class SagaService { public function __construct( private LoggerInterface $logger, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private SagaRepository $sagaRepository, private FileService $fileService, private TheMovieDbApi $theMovieDbApi, diff --git a/apps/src/Service/Imdb/SeasonService.php b/apps/src/Service/Imdb/SeasonService.php index 6b11d61e0..f103b1a4e 100644 --- a/apps/src/Service/Imdb/SeasonService.php +++ b/apps/src/Service/Imdb/SeasonService.php @@ -9,13 +9,14 @@ use Labstag\Message\EpisodeMessage; use Labstag\Repository\SeasonRepository; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\MessageBusInterface; final class SeasonService { public function __construct( private FileService $fileService, - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private SeasonRepository $seasonRepository, private EpisodeService $episodeService, private TheMovieDbApi $theMovieDbApi, diff --git a/apps/src/Service/Imdb/SerieService.php b/apps/src/Service/Imdb/SerieService.php index 014b31c54..1fdc598b2 100644 --- a/apps/src/Service/Imdb/SerieService.php +++ b/apps/src/Service/Imdb/SerieService.php @@ -12,6 +12,7 @@ use Labstag\Service\CategoryService; use Labstag\Service\ConfigurationService; use Labstag\Service\FileService; +use Labstag\Service\MessageDispatcherService; use Labstag\Service\VideoService; use Symfony\Component\Messenger\MessageBusInterface; @@ -29,7 +30,7 @@ final class SerieService private array $year = []; public function __construct( - private MessageBusInterface $messageBus, + private MessageDispatcherService $messageBus, private ConfigurationService $configurationService, private FileService $fileService, private CompanyService $companyService, diff --git a/apps/src/Service/MessageDispatcherService.php b/apps/src/Service/MessageDispatcherService.php new file mode 100644 index 000000000..0436da858 --- /dev/null +++ b/apps/src/Service/MessageDispatcherService.php @@ -0,0 +1,132 @@ +> + */ + private array $dispatchedMessages = []; + + public function __construct( + private MessageDispatcherService $messageBus, + ) + { + } + + /** + * Dispatch un message seulement s'il n'a pas déjà été dispatché. + * + * @param object $message Le message à dispatcher + * @param array $stamps Les stamps Symfony Messenger optionnels + * @param bool $forceDispatch Force le dispatch même si déjà dispatché + */ + public function dispatch(object $message, array $stamps = [], bool $forceDispatch = false): void + { + $messageKey = $this->getMessageKey($message); + + if (!$forceDispatch && $this->isAlreadyDispatched($messageKey)) { + return; + } + + $this->markAsDispatched($messageKey); + $this->messageBus->dispatch($message, $stamps); + } + + /** + * Vérifie si un message a déjà été dispatché. + */ + public function isAlreadyDispatched(string $messageKey): bool + { + $className = $this->extractClassName($messageKey); + + return isset($this->dispatchedMessages[$className][$messageKey]); + } + + /** + * Marque un message comme dispatché. + */ + public function markAsDispatched(string $messageKey): void + { + $className = $this->extractClassName($messageKey); + if (!isset($this->dispatchedMessages[$className])) { + $this->dispatchedMessages[$className] = []; + } + + $this->dispatchedMessages[$className][$messageKey] = true; + } + + /** + * Réinitialise le cache des messages dispatchés. + * Utile pour les tests ou pour réinitialiser l'état entre différentes requêtes. + */ + public function reset(): void + { + $this->dispatchedMessages = []; + } + + /** + * Génère une clé unique pour un message basée sur sa classe et ses propriétés. + */ + private function getMessageKey(object $message): string + { + $className = get_class($message); + $reflection = new \ReflectionClass($message); + $properties = []; + + foreach ($reflection->getProperties() as $property) { + $property->setAccessible(true); + $value = $property->getValue($message); + // Convertir les valeurs en string pour la comparaison + $properties[$property->getName()] = $this->serializeValue($value); + } + + ksort($properties); + + return $className . '::' . md5(serialize($properties)); + } + + /** + * Extrait le nom de classe depuis une clé de message. + */ + private function extractClassName(string $messageKey): string + { + return explode('::', $messageKey)[0]; + } + + /** + * Sérialise une valeur pour la comparaison. + * + * @return mixed + */ + private function serializeValue(mixed $value): mixed + { + if (is_object($value)) { + return spl_object_hash($value); + } + + return $value; + } + + /** + * Retourne le nombre de messages dispatchés par type. + * + * @return array + */ + public function getDispatchStats(): array + { + $stats = []; + foreach ($this->dispatchedMessages as $className => $messages) { + $stats[$className] = count($messages); + } + + return $stats; + } +} From 9e7104804fdeffb83b0f9a828141c5c8ba02bcf9 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sun, 21 Dec 2025 13:08:35 +0100 Subject: [PATCH 11/50] =?UTF-8?q?fix:=20corriger=20le=20type=20de=20la=20p?= =?UTF-8?q?ropri=C3=A9t=C3=A9=20messageBus=20dans=20MessageDispatcherServi?= =?UTF-8?q?ce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Service/MessageDispatcherService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/Service/MessageDispatcherService.php b/apps/src/Service/MessageDispatcherService.php index 0436da858..2c00e6ce6 100644 --- a/apps/src/Service/MessageDispatcherService.php +++ b/apps/src/Service/MessageDispatcherService.php @@ -16,7 +16,7 @@ final class MessageDispatcherService private array $dispatchedMessages = []; public function __construct( - private MessageDispatcherService $messageBus, + private MessageBusInterface $messageBus, ) { } From b91740d4bd1ddc62a29cf24d7867edbac0a39f90 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sun, 21 Dec 2025 13:22:26 +0100 Subject: [PATCH 12/50] =?UTF-8?q?feat:=20commenter=20la=20configuration=20?= =?UTF-8?q?des=20bus=20et=20du=20middleware=20de=20d=C3=A9duplication=20da?= =?UTF-8?q?ns=20messenger.yaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/config/packages/messenger.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/config/packages/messenger.yaml b/apps/config/packages/messenger.yaml index 0748e71c6..9b5201235 100644 --- a/apps/config/packages/messenger.yaml +++ b/apps/config/packages/messenger.yaml @@ -20,10 +20,10 @@ framework: # Route your messages to the transports # 'Labstag\Message\YourMessage': async - buses: - messenger.bus.default: - middleware: - - Labstag\Middleware\DeduplicationMiddleware + # buses: + # messenger.bus.default: + # middleware: + # - Labstag\Middleware\DeduplicationMiddleware # when@test: # framework: From e6b2d180726363ffeb93d26454a77f55c5ecbed5 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Wed, 24 Dec 2025 12:48:42 +0100 Subject: [PATCH 13/50] =?UTF-8?q?feat:=20ajouter=20la=20classe=20MetaAllMe?= =?UTF-8?q?ssage=20et=20son=20gestionnaire,=20mettre=20=C3=A0=20jour=20les?= =?UTF-8?q?=20r=C3=A9f=C3=A9rences=20dans=20ExecuteMessageCommand=20et=20C?= =?UTF-8?q?ronSchedule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Command/ExecuteMessageCommand.php | 4 +- apps/src/Message/MetaAllMessage.php | 19 ++++++ apps/src/Message/MetaMessage.php | 22 ++++--- .../MessageHandler/MetaAllMessageHandler.php | 48 +++++++++++++++ .../src/MessageHandler/MetaMessageHandler.php | 58 +++++++------------ apps/src/Scheduler/CronSchedule.php | 4 +- 6 files changed, 105 insertions(+), 50 deletions(-) create mode 100644 apps/src/Message/MetaAllMessage.php create mode 100644 apps/src/MessageHandler/MetaAllMessageHandler.php diff --git a/apps/src/Command/ExecuteMessageCommand.php b/apps/src/Command/ExecuteMessageCommand.php index 3a8a9eb7d..bec5de7d3 100644 --- a/apps/src/Command/ExecuteMessageCommand.php +++ b/apps/src/Command/ExecuteMessageCommand.php @@ -4,7 +4,7 @@ use Labstag\Message\BanIpMessage; use Labstag\Message\FilesMessage; -use Labstag\Message\MetaMessage; +use Labstag\Message\MetaAllMessage; use Labstag\Message\NotificationMessage; use Labstag\Message\PageCinemaMessage; use Labstag\Message\UpdateSerieMessage; @@ -44,7 +44,7 @@ public function __invoke(SymfonyStyle $symfonyStyle): int 'PageCinema' => PageCinemaMessage::class, 'BanIp' => BanIpMessage::class, 'UpdateSerie' => UpdateSerieMessage::class, - 'Meta' => MetaMessage::class, + 'Meta' => MetaAllMessage::class, 'Files' => FilesMessage::class, 'Notification' => NotificationMessage::class, ]; diff --git a/apps/src/Message/MetaAllMessage.php b/apps/src/Message/MetaAllMessage.php new file mode 100644 index 000000000..12d32eef5 --- /dev/null +++ b/apps/src/Message/MetaAllMessage.php @@ -0,0 +1,19 @@ +type; + } + + public function getEntity(): string + { + return $this->entity; + } } diff --git a/apps/src/MessageHandler/MetaAllMessageHandler.php b/apps/src/MessageHandler/MetaAllMessageHandler.php new file mode 100644 index 000000000..cfd4b3c6e --- /dev/null +++ b/apps/src/MessageHandler/MetaAllMessageHandler.php @@ -0,0 +1,48 @@ +messageBus->dispatch(new MetaMessage('delete')); + $entities = [ + Game::class, + Movie::class, + Page::class, + Person::class, + Post::class, + Saga::class, + Season::class, + Serie::class, + Story::class, + ]; + foreach ($entities as $entity) { + $this->messageBus->dispatch(new MetaMessage('check', $entity)); + } + } +} diff --git a/apps/src/MessageHandler/MetaMessageHandler.php b/apps/src/MessageHandler/MetaMessageHandler.php index 0e1b66243..d04feac2a 100644 --- a/apps/src/MessageHandler/MetaMessageHandler.php +++ b/apps/src/MessageHandler/MetaMessageHandler.php @@ -23,56 +23,38 @@ final class MetaMessageHandler { public function __construct( private MetaService $metaService, - private EntityManagerInterface $entityManager, - private MetaRepository $metaRepository, + private EntityManagerInterface $entityManager ) { } public function __invoke(MetaMessage $metaMessage): void { - unset($metaMessage); - $this->deleteUselessMeta(); - $this->correctionMeta(); + $type = $metaMessage->getType(); + $entity = $metaMessage->getEntity(); + match ($type) { + 'delete' => $this->deleteUselessMeta(), + 'check' => $this->correctionMeta($entity), + default => null, + }; } - private function correctionMeta(): void + private function correctionMeta($entity): void { - $entities = [ - Game::class, - Movie::class, - Page::class, - Person::class, - Post::class, - Saga::class, - Season::class, - Serie::class, - Story::class, - ]; - - foreach ($entities as $entity) { - $repository = $this->entityManager->getRepository($entity); - $items = $repository->findAll(); - - $count = 0; - foreach ($items as $item) { - $meta = $item->getMeta(); - if (!$meta instanceof Meta) { - continue; - } - - $meta = new Meta(); - $item->setMeta($meta); - $this->entityManager->persist($item); - - ++$count; - } - - if (0 < $count) { - $this->entityManager->flush(); + $repository = $this->entityManager->getRepository($entity); + $items = $repository->findAll(); + foreach ($items as $item) { + $meta = $item->getMeta(); + if (!$meta instanceof Meta) { continue; } + + $meta = new Meta(); + $item->setMeta($meta); + $this->entityManager->persist($item); } + + $this->entityManager->flush(); } private function deleteUselessMeta(): void diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index 0f3e02627..370c7d904 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -4,7 +4,7 @@ use Labstag\Message\BanIpMessage; use Labstag\Message\FilesMessage; -use Labstag\Message\MetaMessage; +use Labstag\Message\MetaAllMessage; use Labstag\Message\NotificationMessage; use Labstag\Message\UpdateSerieMessage; use Symfony\Component\Scheduler\Attribute\AsSchedule; @@ -30,7 +30,7 @@ public function getSchedule(): Schedule RecurringMessage::cron('0 10 * * *', new UpdateSerieMessage()), RecurringMessage::cron('0 12 * * *', new NotificationMessage()), RecurringMessage::cron('0 0 * * 6', new FilesMessage()), - RecurringMessage::cron('0 20 * * *', new MetaMessage()), + RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), // RecurringMessage::every('1 minute', new PageCinemaMessage()), ); $schedule->stateful($this->cache); From 1041894cd734fb7473f3f32fe8fd95c2c14c035d Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Wed, 24 Dec 2025 12:50:15 +0100 Subject: [PATCH 14/50] fix: commenter la ligne de planification pour FilesMessage dans CronSchedule --- apps/src/Scheduler/CronSchedule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index 370c7d904..775c850f0 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -29,7 +29,7 @@ public function getSchedule(): Schedule RecurringMessage::cron('0 */1 * * *', new BanIpMessage()), RecurringMessage::cron('0 10 * * *', new UpdateSerieMessage()), RecurringMessage::cron('0 12 * * *', new NotificationMessage()), - RecurringMessage::cron('0 0 * * 6', new FilesMessage()), + // RecurringMessage::cron('0 0 * * 6', new FilesMessage()), RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), // RecurringMessage::every('1 minute', new PageCinemaMessage()), ); From 82eb50d43d702cb44f21b70a66b7b453dbceab77 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sat, 27 Dec 2025 13:33:17 +0100 Subject: [PATCH 15/50] =?UTF-8?q?feat:=20ajouter=20un=20champ=20person=5Fp?= =?UTF-8?q?laceholder=20dans=20la=20table=20configuration=20et=20mettre=20?= =?UTF-8?q?=C3=A0=20jour=20les=20fichiers=20de=20configuration=20associ?= =?UTF-8?q?=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025/12/Version20251217202932.php | 2 + .../Admin/ConfigurationCrudController.php | 139 ++++-------------- apps/src/Data/PersonData.php | 11 ++ apps/src/DataFixtures/ConfigFixtures.php | 26 ++-- apps/src/Entity/Configuration.php | 32 ++++ apps/src/Scheduler/CronSchedule.php | 2 +- apps/src/Scheduler/GenerateSchedule.php | 1 - 7 files changed, 88 insertions(+), 125 deletions(-) diff --git a/apps/migrations/2025/12/Version20251217202932.php b/apps/migrations/2025/12/Version20251217202932.php index 38dad5a9b..e626e18b9 100644 --- a/apps/migrations/2025/12/Version20251217202932.php +++ b/apps/migrations/2025/12/Version20251217202932.php @@ -28,6 +28,7 @@ public function up(Schema $schema): void $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA50984707B FOREIGN KEY (ref_movie_id) REFERENCES movie (id)'); $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA505F544E3A FOREIGN KEY (ref_serie_id) REFERENCES serie (id)'); $this->addSql('ALTER TABLE person ADD CONSTRAINT FK_34DCD17639FCA6F9 FOREIGN KEY (meta_id) REFERENCES meta (id)'); + $this->addSql('ALTER TABLE configuration ADD person_placeholder VARCHAR(255) DEFAULT NULL;'); } public function down(Schema $schema): void @@ -41,5 +42,6 @@ public function down(Schema $schema): void $this->addSql('ALTER TABLE person DROP FOREIGN KEY FK_34DCD17639FCA6F9'); $this->addSql('DROP TABLE casting'); $this->addSql('DROP TABLE person'); + $this->addSql('ALTER TABLE configuration DROP person_placeholder'); } } diff --git a/apps/src/Controller/Admin/ConfigurationCrudController.php b/apps/src/Controller/Admin/ConfigurationCrudController.php index 475947f24..a6031f620 100644 --- a/apps/src/Controller/Admin/ConfigurationCrudController.php +++ b/apps/src/Controller/Admin/ConfigurationCrudController.php @@ -120,121 +120,36 @@ public static function getEntityFqcn(): string private function addConfigureFieldsPlaceHolders(string $pageName): array { - $chapterTranslation = new TranslatableMessage('Chapter'); - $editoTranslation = new TranslatableMessage('Edito'); - $episodeTranslation = new TranslatableMessage('Episode'); - $memoTranslation = new TranslatableMessage('Memo'); - $movieTranslation = new TranslatableMessage('Movie'); - $gameTranslation = new TranslatableMessage('Game'); - $pageTranslation = new TranslatableMessage('Page'); - $postTranslation = new TranslatableMessage('Post'); - $sagaTranslation = new TranslatableMessage('Saga'); - $seasonTranslation = new TranslatableMessage('Season'); - $serieTranslation = new TranslatableMessage('Serie'); - $starTranslation = new TranslatableMessage('Star'); - $storyTranslation = new TranslatableMessage('Story'); - $userTranslation = new TranslatableMessage('User'); + $placeholders = [ + 'chapter' => new TranslatableMessage('Chapter'), + 'edito' => new TranslatableMessage('Edito'), + 'episode' => new TranslatableMessage('Episode'), + 'memo' => new TranslatableMessage('Memo'), + 'movie' => new TranslatableMessage('Movie'), + 'game' => new TranslatableMessage('Game'), + 'page' => new TranslatableMessage('Page'), + 'post' => new TranslatableMessage('Post'), + 'saga' => new TranslatableMessage('Saga'), + 'season' => new TranslatableMessage('Season'), + 'serie' => new TranslatableMessage('Serie'), + 'star' => new TranslatableMessage('Star'), + 'story' => new TranslatableMessage('Story'), + 'user' => new TranslatableMessage('User'), + 'person' => new TranslatableMessage('Person'), + ]; - return [ - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'chapterPlaceholder', - $pageName, - self::getEntityFqcn(), - $chapterTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'editoPlaceholder', - $pageName, - self::getEntityFqcn(), - $editoTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'episodePlaceholder', - $pageName, - self::getEntityFqcn(), - $episodeTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'memoPlaceholder', - $pageName, - self::getEntityFqcn(), - $memoTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'moviePlaceholder', - $pageName, - self::getEntityFqcn(), - $movieTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'gamePlaceholder', - $pageName, - self::getEntityFqcn(), - $gameTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'pagePlaceholder', - $pageName, - self::getEntityFqcn(), - $pageTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'postPlaceholder', + $fields = []; + foreach ($placeholders as $key => $label) { + $fields[] = FormField::addColumn(6); + $fields[] = $this->crudFieldFactory->imageField( + $key . 'Placeholder', $pageName, self::getEntityFqcn(), - $postTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'sagaPlaceholder', - $pageName, - self::getEntityFqcn(), - $sagaTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'seasonPlaceholder', - $pageName, - self::getEntityFqcn(), - $seasonTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'seriePlaceholder', - $pageName, - self::getEntityFqcn(), - $serieTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'starPlaceholder', - $pageName, - self::getEntityFqcn(), - $starTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'storyPlaceholder', - $pageName, - self::getEntityFqcn(), - $storyTranslation->getMessage() - ), - FormField::addColumn(6), - $this->crudFieldFactory->imageField( - 'userPlaceholder', - $pageName, - self::getEntityFqcn(), - $userTranslation->getMessage() - ), - ]; + $label->getMessage() + ); + } + + return $fields; } /** diff --git a/apps/src/Data/PersonData.php b/apps/src/Data/PersonData.php index 5d9b8e461..c574da231 100644 --- a/apps/src/Data/PersonData.php +++ b/apps/src/Data/PersonData.php @@ -13,4 +13,15 @@ public function supportsAsset(object $entity): bool { return $entity instanceof Person; } + + #[Override] + public function placeholder(): string + { + $placeholder = $this->globalPlaceholder('person'); + if ('' !== $placeholder) { + return $placeholder; + } + + return parent::placeholder(); + } } \ No newline at end of file diff --git a/apps/src/DataFixtures/ConfigFixtures.php b/apps/src/DataFixtures/ConfigFixtures.php index 37ebdca94..fe0cd4538 100644 --- a/apps/src/DataFixtures/ConfigFixtures.php +++ b/apps/src/DataFixtures/ConfigFixtures.php @@ -40,17 +40,21 @@ public function load(ObjectManager $objectManager): void $configuration->setDisableEmptyAgent(false); $this->setImage($configuration, 'logoFile'); $this->setImage($configuration, 'placeholderFile'); - $this->setImage($configuration, 'chapterPlaceholder'); - $this->setImage($configuration, 'editoPlaceholder'); - $this->setImage($configuration, 'episodePlaceholder'); - $this->setImage($configuration, 'memoPlaceholder'); - $this->setImage($configuration, 'moviePlaceholder'); - $this->setImage($configuration, 'gamePlaceholder'); - $this->setImage($configuration, 'postPlaceholder'); - $this->setImage($configuration, 'sagaPlaceholder'); - $this->setImage($configuration, 'starPlaceholder'); - $this->setImage($configuration, 'storyPlaceholder'); - $this->setImage($configuration, 'userPlaceholder'); + $this->setImage($configuration, 'chapterPlaceholderFile'); + $this->setImage($configuration, 'editoPlaceholderFile'); + $this->setImage($configuration, 'episodePlaceholderFile'); + $this->setImage($configuration, 'gamePlaceholderFile'); + $this->setImage($configuration, 'memoPlaceholderFile'); + $this->setImage($configuration, 'moviePlaceholderFile'); + $this->setImage($configuration, 'pagePlaceholderFile'); + $this->setImage($configuration, 'personPlaceholderFile'); + $this->setImage($configuration, 'postPlaceholderFile'); + $this->setImage($configuration, 'sagaPlaceholderFile'); + $this->setImage($configuration, 'seasonPlaceholderFile'); + $this->setImage($configuration, 'seriePlaceholderFile'); + $this->setImage($configuration, 'starPlaceholderFile'); + $this->setImage($configuration, 'storyPlaceholderFile'); + $this->setImage($configuration, 'userPlaceholderFile'); $objectManager->persist($configuration); diff --git a/apps/src/Entity/Configuration.php b/apps/src/Entity/Configuration.php index f5cb6bad1..8a5ecee0e 100644 --- a/apps/src/Entity/Configuration.php +++ b/apps/src/Entity/Configuration.php @@ -54,6 +54,12 @@ class Configuration #[Vich\UploadableField(mapping: 'configuration', fileNameProperty: 'gamePlaceholder')] protected ?File $gamePlaceholderFile = null; + #[ORM\Column(name: 'person_placeholder', length: 255, nullable: true)] + protected ?string $personPlaceholder = null; + + #[Vich\UploadableField(mapping: 'configuration', fileNameProperty: 'personPlaceholder')] + protected ?File $personPlaceholderFile = null; + #[ORM\Id] #[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\Column(type: Types::GUID, unique: true)] @@ -408,6 +414,16 @@ public function getGamePlaceholderFile(): ?File return $this->gamePlaceholderFile; } + public function getPersonPlaceholder(): ?string + { + return $this->personPlaceholder; + } + + public function getPersonPlaceholderFile(): ?File + { + return $this->personPlaceholderFile; + } + public function getId(): ?string { return $this->id; @@ -870,6 +886,22 @@ public function setGamePlaceholderFile(?File $gamePlaceholderFile = null): void } } + public function setPersonPlaceholder(?string $personPlaceholder): void + { + $this->personPlaceholder = $personPlaceholder; + } + + public function setPersonPlaceholderFile(?File $personPlaceholderFile = null): void + { + $this->personPlaceholderFile = $personPlaceholderFile; + + if ($personPlaceholderFile instanceof File) { + // It is required that at least one field changes if you are using doctrine + // otherwise the event listeners won't be called and the file is lost + $this->updatedAt = DateTime::createFromImmutable(new DateTimeImmutable()); + } + } + public function setLanguageTmdb(?string $languageTmdb): static { $this->languageTmdb = $languageTmdb; diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index 775c850f0..370c7d904 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -29,7 +29,7 @@ public function getSchedule(): Schedule RecurringMessage::cron('0 */1 * * *', new BanIpMessage()), RecurringMessage::cron('0 10 * * *', new UpdateSerieMessage()), RecurringMessage::cron('0 12 * * *', new NotificationMessage()), - // RecurringMessage::cron('0 0 * * 6', new FilesMessage()), + RecurringMessage::cron('0 0 * * 6', new FilesMessage()), RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), // RecurringMessage::every('1 minute', new PageCinemaMessage()), ); diff --git a/apps/src/Scheduler/GenerateSchedule.php b/apps/src/Scheduler/GenerateSchedule.php index 07f0d218a..1bf38c767 100644 --- a/apps/src/Scheduler/GenerateSchedule.php +++ b/apps/src/Scheduler/GenerateSchedule.php @@ -23,7 +23,6 @@ public function getSchedule(): Schedule $schedule = new Schedule(); $schedule->add( RecurringMessage::cron('0 0 * * 1', new PageCinemaMessage()), - // RecurringMessage::every('1 minute', new PageCinemaMessage()), ); $schedule->stateful($this->cache); From 9a023e28d6bf758e135f73e803fd8609736bb0c6 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sat, 27 Dec 2025 13:54:27 +0100 Subject: [PATCH 16/50] fix: remplacer FilesMessage par DeleteOldFileMessage dans ExecuteMessageCommand --- apps/src/Command/ExecuteMessageCommand.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/src/Command/ExecuteMessageCommand.php b/apps/src/Command/ExecuteMessageCommand.php index bec5de7d3..d2a6c3835 100644 --- a/apps/src/Command/ExecuteMessageCommand.php +++ b/apps/src/Command/ExecuteMessageCommand.php @@ -3,7 +3,7 @@ namespace Labstag\Command; use Labstag\Message\BanIpMessage; -use Labstag\Message\FilesMessage; +use Labstag\Message\DeleteOldFileMessage; use Labstag\Message\MetaAllMessage; use Labstag\Message\NotificationMessage; use Labstag\Message\PageCinemaMessage; @@ -45,7 +45,7 @@ public function __invoke(SymfonyStyle $symfonyStyle): int 'BanIp' => BanIpMessage::class, 'UpdateSerie' => UpdateSerieMessage::class, 'Meta' => MetaAllMessage::class, - 'Files' => FilesMessage::class, + 'Files' => DeleteOldFileMessage::class, 'Notification' => NotificationMessage::class, ]; From 365bd312d41fbe22bd88a30f2f895e82fd4b674b Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sat, 27 Dec 2025 14:04:32 +0100 Subject: [PATCH 17/50] fix: commenter une ligne de planification pour FilesMessage dans CronSchedule --- apps/src/Scheduler/CronSchedule.php | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index 370c7d904..27e864890 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -31,7 +31,6 @@ public function getSchedule(): Schedule RecurringMessage::cron('0 12 * * *', new NotificationMessage()), RecurringMessage::cron('0 0 * * 6', new FilesMessage()), RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), - // RecurringMessage::every('1 minute', new PageCinemaMessage()), ); $schedule->stateful($this->cache); From 726f8c65388debd1615cdd9c7f0d40a2ff562927 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sat, 27 Dec 2025 14:19:17 +0100 Subject: [PATCH 18/50] =?UTF-8?q?refactor:=20simplifier=20la=20gestion=20d?= =?UTF-8?q?es=20exceptions=20et=20am=C3=A9liorer=20la=20persistance=20des?= =?UTF-8?q?=20entit=C3=A9s=20dans=20MetaMessageHandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/MessageHandler/MetaMessageHandler.php | 53 +++++++++---------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/apps/src/MessageHandler/MetaMessageHandler.php b/apps/src/MessageHandler/MetaMessageHandler.php index d04feac2a..1239212af 100644 --- a/apps/src/MessageHandler/MetaMessageHandler.php +++ b/apps/src/MessageHandler/MetaMessageHandler.php @@ -3,18 +3,9 @@ namespace Labstag\MessageHandler; use Doctrine\ORM\EntityManagerInterface; -use Labstag\Entity\Game; +use Exception; use Labstag\Entity\Meta; -use Labstag\Entity\Movie; -use Labstag\Entity\Page; -use Labstag\Entity\Person; -use Labstag\Entity\Post; -use Labstag\Entity\Saga; -use Labstag\Entity\Season; -use Labstag\Entity\Serie; -use Labstag\Entity\Story; use Labstag\Message\MetaMessage; -use Labstag\Repository\MetaRepository; use Labstag\Service\MetaService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; @@ -41,31 +32,37 @@ public function __invoke(MetaMessage $metaMessage): void private function correctionMeta($entity): void { - $repository = $this->entityManager->getRepository($entity); - $items = $repository->findAll(); - foreach ($items as $item) { - $meta = $item->getMeta(); - if (!$meta instanceof Meta) { - continue; - } + try { + $repository = $this->entityManager->getRepository($entity); + $items = $repository->findAll(); + foreach ($items as $item) { + $meta = $item->getMeta(); + if (!$meta instanceof Meta) { + continue; + } - $meta = new Meta(); - $item->setMeta($meta); - $this->entityManager->persist($item); + $meta = new Meta(); + $item->setMeta($meta); + $repository->save($item); + } + } catch (Exception $e) { + echo $e->getMessage(); } - - $this->entityManager->flush(); } private function deleteUselessMeta(): void { - $entityRepository = $this->entityManager->getRepository(Meta::class); - $metas = $entityRepository->findAll(); - foreach ($metas as $meta) { - $object = $this->metaService->getEntityParent($meta); - if (is_null($object->value) || is_null($object->name) || is_null($object)) { - $entityRepository->delete($meta); + try { + $repository = $this->entityManager->getRepository(Meta::class); + $metas = $repository->findAll(); + foreach ($metas as $meta) { + $object = $this->metaService->getEntityParent($meta); + if (is_null($object->value) || is_null($object->name) || is_null($object)) { + $repository->delete($meta); + } } + } catch (Exception $e) { + echo $e->getMessage(); } } } From d61c0c9ecb1d22149ff0bcf252c53ec683505058 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sat, 27 Dec 2025 19:50:40 +0100 Subject: [PATCH 19/50] =?UTF-8?q?fix:=20commenter=20le=20code=20de=20suppr?= =?UTF-8?q?ession=20des=20m=C3=A9tadonn=C3=A9es=20inutiles=20dans=20MetaMe?= =?UTF-8?q?ssageHandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/MessageHandler/MetaMessageHandler.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/src/MessageHandler/MetaMessageHandler.php b/apps/src/MessageHandler/MetaMessageHandler.php index 1239212af..e0905f01f 100644 --- a/apps/src/MessageHandler/MetaMessageHandler.php +++ b/apps/src/MessageHandler/MetaMessageHandler.php @@ -53,14 +53,14 @@ private function correctionMeta($entity): void private function deleteUselessMeta(): void { try { - $repository = $this->entityManager->getRepository(Meta::class); - $metas = $repository->findAll(); - foreach ($metas as $meta) { - $object = $this->metaService->getEntityParent($meta); - if (is_null($object->value) || is_null($object->name) || is_null($object)) { - $repository->delete($meta); - } - } + // $repository = $this->entityManager->getRepository(Meta::class); + // $metas = $repository->findAll(); + // foreach ($metas as $meta) { + // $object = $this->metaService->getEntityParent($meta); + // if (is_null($object->value) || is_null($object->name) || is_null($object)) { + // $repository->delete($meta); + // } + // } } catch (Exception $e) { echo $e->getMessage(); } From 5106e8d8ce011c6b7001929cca18fdfa8f942787 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:09:34 +0100 Subject: [PATCH 20/50] fix: commenter une ligne de planification pour MetaAllMessage dans CronSchedule --- apps/src/Scheduler/CronSchedule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index 27e864890..609f07fd0 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -30,7 +30,7 @@ public function getSchedule(): Schedule RecurringMessage::cron('0 10 * * *', new UpdateSerieMessage()), RecurringMessage::cron('0 12 * * *', new NotificationMessage()), RecurringMessage::cron('0 0 * * 6', new FilesMessage()), - RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), + // RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), ); $schedule->stateful($this->cache); From 9c1161bda9684ce8ce47ea32962ae2742bdc78a7 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:08:50 +0100 Subject: [PATCH 21/50] =?UTF-8?q?feat:=20ajouter=20la=20fonction=20findWit?= =?UTF-8?q?hActiveCastings=20dans=20CastingRepository=20et=20int=C3=A9grer?= =?UTF-8?q?=20casting=5Fcast=20dans=20les=20templates=20Twig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller/Admin/DashboardController.php | 2 ++ apps/src/Repository/CastingRepository.php | 27 +++++++++++++++++++ apps/src/Twig/Extension/CastingExtension.php | 1 + .../Twig/Runtime/CastingExtensionRuntime.php | 14 +++++++++- apps/templates/admin/field/castings.html.twig | 3 ++- .../paragraphs/content/head-movie.html.twig | 3 ++- 6 files changed, 47 insertions(+), 3 deletions(-) diff --git a/apps/src/Controller/Admin/DashboardController.php b/apps/src/Controller/Admin/DashboardController.php index 904e44231..6e49c35c9 100644 --- a/apps/src/Controller/Admin/DashboardController.php +++ b/apps/src/Controller/Admin/DashboardController.php @@ -150,6 +150,8 @@ public function index(): Response $memos = $repositoryAbstract->findBy( ['enable' => true] ); + + $paragraphs = []; foreach ($memos as $memo) { $idMemo = $memo->getId(); $paragraphs = $memo->getParagraphs()->getValues(); diff --git a/apps/src/Repository/CastingRepository.php b/apps/src/Repository/CastingRepository.php index 22e8b7e36..1448fb1ea 100644 --- a/apps/src/Repository/CastingRepository.php +++ b/apps/src/Repository/CastingRepository.php @@ -4,6 +4,10 @@ use Doctrine\Persistence\ManagerRegistry; use Labstag\Entity\Casting; +use Labstag\Entity\Episode; +use Labstag\Entity\Movie; +use Labstag\Entity\Season; +use Labstag\Entity\Serie; /** * @extends RepositoryAbstract @@ -14,4 +18,27 @@ public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Casting::class); } + + public function findWithActiveCastings(mixed $data): mixed + { + $queryBuilder = $this->createQueryBuilder('c'); + $queryBuilder->innerJoin('c.refPerson', 'p'); + $queryBuilder->addSelect('p'); + $queryBuilder->andWhere('p.deletedAt IS NULL'); + $entityMap = [ + Movie::class => ['refMovie', 'movie'], + Serie::class => ['refSerie', 'serie'], + Season::class => ['refSeason', 'season'], + Episode::class => ['refEpisode', 'episode'], + ]; + foreach ($entityMap as $class => [$field, $param]) { + if ($data instanceof $class) { + $queryBuilder->andWhere("c.{$field} = :{$param}"); + $queryBuilder->setParameter($param, $data); + break; + } + } + + return $queryBuilder->getQuery()->getResult(); + } } diff --git a/apps/src/Twig/Extension/CastingExtension.php b/apps/src/Twig/Extension/CastingExtension.php index d4500e283..38967f1f5 100644 --- a/apps/src/Twig/Extension/CastingExtension.php +++ b/apps/src/Twig/Extension/CastingExtension.php @@ -13,6 +13,7 @@ class CastingExtension extends AbstractExtension public function getFunctions(): array { return [ + new TwigFunction('casting_cast', [CastingExtensionRuntime::class, 'cast']), new TwigFunction('casting_acting', [CastingExtensionRuntime::class, 'acting']), new TwigFunction('casting_directing', [CastingExtensionRuntime::class, 'directing']), new TwigFunction('casting_writing', [CastingExtensionRuntime::class, 'writing']), diff --git a/apps/src/Twig/Runtime/CastingExtensionRuntime.php b/apps/src/Twig/Runtime/CastingExtensionRuntime.php index 5e31afe3c..72fffd4d6 100644 --- a/apps/src/Twig/Runtime/CastingExtensionRuntime.php +++ b/apps/src/Twig/Runtime/CastingExtensionRuntime.php @@ -2,16 +2,28 @@ namespace Labstag\Twig\Runtime; +use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\PersistentCollection; +use Labstag\Entity\Casting; use Twig\Extension\RuntimeExtensionInterface; class CastingExtensionRuntime implements RuntimeExtensionInterface { - public function __construct() + public function __construct( + protected EntityManagerInterface $entityManager, + ) { // Inject dependencies if needed } + public function cast($data): mixed + { + $repository = $this->entityManager->getRepository(Casting::class); + $castings = $repository->findWithActiveCastings($data); + + return $castings; + } + public function acting(PersistentCollection $data): array { return $this->getByType('Acting', $data); diff --git a/apps/templates/admin/field/castings.html.twig b/apps/templates/admin/field/castings.html.twig index 868bd60bf..9b557699b 100644 --- a/apps/templates/admin/field/castings.html.twig +++ b/apps/templates/admin/field/castings.html.twig @@ -1,7 +1,8 @@ {% set instance = entity.instance %} {% if ea().crud.currentAction == 'detail' %} + {% set castings = casting_cast(instance) %} - {% for casting in instance.castings %} + {% for casting in castings %}
diff --git a/apps/templates/paragraphs/content/head-movie.html.twig b/apps/templates/paragraphs/content/head-movie.html.twig index 64f9b17ea..38bf2bb0b 100644 --- a/apps/templates/paragraphs/content/head-movie.html.twig +++ b/apps/templates/paragraphs/content/head-movie.html.twig @@ -112,7 +112,8 @@ {% endif %} {% endif %} - {% set actings = casting_acting(movie.castings) %} + {% set castings = casting_cast(movie) %} + {% set actings = casting_acting(castings) %} {% if actings|length > 0 %}

From d3545dfa2ca6940f36b9735cdc9987d8e3279b6e Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:22:13 +0100 Subject: [PATCH 22/50] =?UTF-8?q?fix:=20modifier=20les=20types=20de=20para?= =?UTF-8?q?m=C3=A8tres=20pour=20les=20m=C3=A9thodes=20d'acting,=20writing,?= =?UTF-8?q?=20directing,=20production=20et=20editing=20dans=20CastingExten?= =?UTF-8?q?sionRuntime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Twig/Runtime/CastingExtensionRuntime.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/src/Twig/Runtime/CastingExtensionRuntime.php b/apps/src/Twig/Runtime/CastingExtensionRuntime.php index 72fffd4d6..4aa454f8b 100644 --- a/apps/src/Twig/Runtime/CastingExtensionRuntime.php +++ b/apps/src/Twig/Runtime/CastingExtensionRuntime.php @@ -24,32 +24,32 @@ public function cast($data): mixed return $castings; } - public function acting(PersistentCollection $data): array + public function acting($data): array { return $this->getByType('Acting', $data); } - public function writing(PersistentCollection $data): array + public function writing($data): array { return $this->getByType('Writing', $data); } - public function directing(PersistentCollection $data): array + public function directing($data): array { return $this->getByType('Directing', $data); } - public function production(PersistentCollection $data): array + public function production($data): array { return $this->getByType('Production', $data); } - public function editing(PersistentCollection $data): array + public function editing($data): array { return $this->getByType('Editing', $data); } - private function getByType(string $type, PersistentCollection $data): array + private function getByType(string $type, $data): array { $casting = []; foreach ($data as $row) { From 56b60d183990b3fbd5c7bc22d4a230e71babf82b Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Mon, 29 Dec 2025 12:16:40 +0100 Subject: [PATCH 23/50] =?UTF-8?q?fix:=20commenter=20le=20contr=C3=B4leur?= =?UTF-8?q?=20d'erreur=20dans=20framework.yaml=20et=20corriger=20la=20trad?= =?UTF-8?q?uction=20du=20label=20d'entit=C3=A9=20dans=20AdminExtensionRunt?= =?UTF-8?q?ime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - apps/config/packages/framework.yaml | 2 +- apps/src/Twig/Runtime/AdminExtensionRuntime.php | 3 ++- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 2b98977b4..9bfaccbe5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ /apps/vendor /apps/bin/ /apps/.symfony5 -/apps/config/reference.php /apps/.composer /apps/.pdepend /apps/.bash_history diff --git a/apps/config/packages/framework.yaml b/apps/config/packages/framework.yaml index bb2e18572..05a9ed737 100644 --- a/apps/config/packages/framework.yaml +++ b/apps/config/packages/framework.yaml @@ -1,6 +1,6 @@ # see https://symfony.com/doc/current/reference/configuration/framework.html framework: - error_controller: Labstag\Controller\FrontController::error + # error_controller: Labstag\Controller\FrontController::error cache: pools: doctrine.result_cache_pool: diff --git a/apps/src/Twig/Runtime/AdminExtensionRuntime.php b/apps/src/Twig/Runtime/AdminExtensionRuntime.php index 12e6baade..713b88892 100644 --- a/apps/src/Twig/Runtime/AdminExtensionRuntime.php +++ b/apps/src/Twig/Runtime/AdminExtensionRuntime.php @@ -25,8 +25,9 @@ public function name(object $entity): string $entityClass = $controller->getEntityFqcn(); if ($entityClass == $entity::class || $entity instanceof $entityClass) { $crud = $controller->configureCrud(Crud::new()); + $singular = $crud->getAsDto()->getEntityLabelInSingular(); - return $this->translator->trans($crud->getAsDto()->getEntityLabelInSingular()); + return $this->translator->trans($singular->getMessage()); } } From 980dcfe6086c4947269ee876a2dd69dd4dd6f96f Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Mon, 29 Dec 2025 13:26:40 +0100 Subject: [PATCH 24/50] =?UTF-8?q?feat:=20ajouter=20la=20gestion=20des=20im?= =?UTF-8?q?ages=20par=20d=C3=A9faut=20dans=20plusieurs=20classes=20de=20do?= =?UTF-8?q?nn=C3=A9es=20et=20mettre=20=C3=A0=20jour=20les=20entit=C3=A9s?= =?UTF-8?q?=20Paragraph=20et=20Person?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025/12/Version20251217202932.php | 8 +++ apps/src/Data/ChapterData.php | 5 ++ apps/src/Data/EditoData.php | 5 ++ apps/src/Data/EpisodeData.php | 5 ++ apps/src/Data/GameData.php | 5 ++ apps/src/Data/MemoData.php | 5 ++ apps/src/Data/MovieData.php | 5 ++ apps/src/Data/PageData.php | 5 ++ apps/src/Data/PersonData.php | 69 ++++++++++++++++++- apps/src/Data/PostData.php | 5 ++ apps/src/Data/SagaData.php | 5 ++ apps/src/Data/SeasonData.php | 5 ++ apps/src/Data/SerieData.php | 5 ++ apps/src/Data/StarData.php | 5 ++ apps/src/Data/StoryData.php | 5 ++ apps/src/Entity/Paragraph.php | 15 ++++ apps/src/Entity/Person.php | 65 +++++++++++++++++ apps/src/Enum/PageEnum.php | 1 + apps/src/Message/MetaAllMessage.php | 2 +- apps/src/Service/ViewResolverService.php | 17 ++++- 20 files changed, 239 insertions(+), 3 deletions(-) diff --git a/apps/migrations/2025/12/Version20251217202932.php b/apps/migrations/2025/12/Version20251217202932.php index e626e18b9..929e11d76 100644 --- a/apps/migrations/2025/12/Version20251217202932.php +++ b/apps/migrations/2025/12/Version20251217202932.php @@ -29,6 +29,10 @@ public function up(Schema $schema): void $this->addSql('ALTER TABLE casting ADD CONSTRAINT FK_D11BBA505F544E3A FOREIGN KEY (ref_serie_id) REFERENCES serie (id)'); $this->addSql('ALTER TABLE person ADD CONSTRAINT FK_34DCD17639FCA6F9 FOREIGN KEY (meta_id) REFERENCES meta (id)'); $this->addSql('ALTER TABLE configuration ADD person_placeholder VARCHAR(255) DEFAULT NULL;'); + $this->addSql('ALTER TABLE paragraph ADD person_id CHAR(36) DEFAULT NULL'); + $this->addSql('ALTER TABLE paragraph ADD CONSTRAINT FK_7DD39862217BBB47 FOREIGN KEY (person_id) REFERENCES person (id)'); + $this->addSql('CREATE INDEX IDX_7DD39862217BBB47 ON paragraph (person_id)'); + $this->addSql('ALTER TABLE person ADD enable TINYINT DEFAULT 1 NOT NULL'); } public function down(Schema $schema): void @@ -43,5 +47,9 @@ public function down(Schema $schema): void $this->addSql('DROP TABLE casting'); $this->addSql('DROP TABLE person'); $this->addSql('ALTER TABLE configuration DROP person_placeholder'); + $this->addSql('ALTER TABLE paragraph DROP FOREIGN KEY FK_7DD39862217BBB47'); + $this->addSql('DROP INDEX IDX_7DD39862217BBB47 ON paragraph'); + $this->addSql('ALTER TABLE paragraph DROP person_id'); + $this->addSql('ALTER TABLE person DROP enable'); } } diff --git a/apps/src/Data/ChapterData.php b/apps/src/Data/ChapterData.php index 2eda8ef20..a7338e9ab 100644 --- a/apps/src/Data/ChapterData.php +++ b/apps/src/Data/ChapterData.php @@ -20,6 +20,11 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getStory(), $field); } + public function getDefaultImage(object $entity): string + { + return $entity->getImg(); + } + #[Override] public function generateSlug(object $entity): array { diff --git a/apps/src/Data/EditoData.php b/apps/src/Data/EditoData.php index c38c86f5c..1db9ad406 100644 --- a/apps/src/Data/EditoData.php +++ b/apps/src/Data/EditoData.php @@ -18,6 +18,11 @@ public function placeholder(): string return $this->configPlaceholder(); } + public function getDefaultImage(object $entity): string + { + return $entity->getImg(); + } + #[Override] public function supportsAsset(object $entity): bool { diff --git a/apps/src/Data/EpisodeData.php b/apps/src/Data/EpisodeData.php index 7545d728f..d01bb189a 100644 --- a/apps/src/Data/EpisodeData.php +++ b/apps/src/Data/EpisodeData.php @@ -18,6 +18,11 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getRefseason(), 'backdrop'); } + public function getDefaultImage(object $entity): string + { + return $entity->getImg(); + } + #[Override] public function placeholder(): string { diff --git a/apps/src/Data/GameData.php b/apps/src/Data/GameData.php index cbe30ffee..60dc71fca 100644 --- a/apps/src/Data/GameData.php +++ b/apps/src/Data/GameData.php @@ -25,6 +25,11 @@ public function generateSlug(object $entity): array return $slug; } + public function getDefaultImage(object $entity): string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Data/MemoData.php b/apps/src/Data/MemoData.php index 3ff380cfd..974287e7d 100644 --- a/apps/src/Data/MemoData.php +++ b/apps/src/Data/MemoData.php @@ -18,6 +18,11 @@ public function placeholder(): string return $this->configPlaceholder(); } + public function getDefaultImage(object $entity): string + { + return $entity->getImg(); + } + #[Override] public function supportsAsset(object $entity): bool { diff --git a/apps/src/Data/MovieData.php b/apps/src/Data/MovieData.php index 02a6b73db..aa1f9e8cb 100644 --- a/apps/src/Data/MovieData.php +++ b/apps/src/Data/MovieData.php @@ -70,6 +70,11 @@ public function placeholder(): string return $this->configPlaceholder(); } + public function getDefaultImage(object $entity): string + { + return $entity->getPoster(); + } + #[Override] public function supportsAsset(object $entity): bool { diff --git a/apps/src/Data/PageData.php b/apps/src/Data/PageData.php index 79c991b5d..d6c32d7c9 100644 --- a/apps/src/Data/PageData.php +++ b/apps/src/Data/PageData.php @@ -25,6 +25,11 @@ public function generateSlugPage(object $entity): array return $slug; } + public function getDefaultImage(object $entity): string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Data/PersonData.php b/apps/src/Data/PersonData.php index c574da231..b09c3cd24 100644 --- a/apps/src/Data/PersonData.php +++ b/apps/src/Data/PersonData.php @@ -2,10 +2,12 @@ namespace Labstag\Data; +use Labstag\Entity\Page; use Labstag\Entity\Person; +use Labstag\Enum\PageEnum; use Override; -class PersonData extends DataAbstract implements DataInterface +class PersonData extends PageData implements DataInterface { #[Override] @@ -14,6 +16,71 @@ public function supportsAsset(object $entity): bool return $entity instanceof Person; } + #[Override] + public function generateSlug(object $entity): array + { + $page = $this->entityManager->getRepository(Page::class)->findOneBy( + [ + 'type' => PageEnum::PERSONS->value, + ] + ); + + $slug = parent::generateSlugPage($page); + $slug['slug'] .= '/' . $entity->getSlug(); + + return $slug; + } + + #[Override] + public function match(?string $slug): bool + { + $page = $this->getEntityBySlugPerson($slug); + + return $page instanceof Person; + } + + public function getDefaultImage(object $entity): string + { + return $entity->getProfile(); + } + + protected function getEntityBySlugPerson(?string $slug): ?object + { + if (0 === substr_count((string) $slug, '/')) { + return null; + } + + $slugSecond = basename((string) $slug); + $slugFirst = dirname((string) $slug); + + $page = $this->entityManager->getRepository(Page::class)->findOneBy( + ['slug' => $slugFirst] + ); + if (!$page instanceof Page) { + return null; + } + + if ($page->getType() != PageEnum::PERSONS->value) { + return null; + } + + return $this->entityManager->getRepository(Person::class)->findOneBy( + ['slug' => $slugSecond] + ); + } + + #[Override] + public function getEntity(?string $slug): object + { + return $this->getEntityBySlugPerson($slug); + } + + #[Override] + public function supportsData(object $entity): bool + { + return $entity instanceof Person; + } + #[Override] public function placeholder(): string { diff --git a/apps/src/Data/PostData.php b/apps/src/Data/PostData.php index b0bf24083..8c52cfba5 100644 --- a/apps/src/Data/PostData.php +++ b/apps/src/Data/PostData.php @@ -28,6 +28,11 @@ public function generateSlug(object $entity): array return $slug; } + public function getDefaultImage(object $entity): string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Data/SagaData.php b/apps/src/Data/SagaData.php index d29277fe8..48c2d540c 100644 --- a/apps/src/Data/SagaData.php +++ b/apps/src/Data/SagaData.php @@ -27,6 +27,11 @@ public function asset(mixed $entity, string $field): string return $this->fileService->asset($entity, $field); } + public function getDefaultImage(object $entity): string + { + return $entity->getPoster(); + } + #[Override] public function generateSlug(object $entity): array { diff --git a/apps/src/Data/SeasonData.php b/apps/src/Data/SeasonData.php index 0a24e08c5..25bd47b48 100644 --- a/apps/src/Data/SeasonData.php +++ b/apps/src/Data/SeasonData.php @@ -22,6 +22,11 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getRefserie(), $field); } + public function getDefaultImage(object $entity): string + { + return $entity->getPoster(); + } + #[Override] public function generateSlug(object $entity): array { diff --git a/apps/src/Data/SerieData.php b/apps/src/Data/SerieData.php index d284eadd0..b520807fb 100644 --- a/apps/src/Data/SerieData.php +++ b/apps/src/Data/SerieData.php @@ -26,6 +26,11 @@ public function asset(mixed $entity, string $field): string return $this->fileService->asset($entity, $field); } + public function getDefaultImage(object $entity): string + { + return $entity->getPoster(); + } + #[Override] public function generateSlug(object $entity): array { diff --git a/apps/src/Data/StarData.php b/apps/src/Data/StarData.php index 52af85934..52a0e28f2 100644 --- a/apps/src/Data/StarData.php +++ b/apps/src/Data/StarData.php @@ -18,6 +18,11 @@ public function placeholder(): string return $this->configPlaceholder(); } + public function getDefaultImage(object $entity): string + { + return $entity->getImg(); + } + #[Override] public function supportsAsset(object $entity): bool { diff --git a/apps/src/Data/StoryData.php b/apps/src/Data/StoryData.php index 00deb7b58..aff56307b 100644 --- a/apps/src/Data/StoryData.php +++ b/apps/src/Data/StoryData.php @@ -28,6 +28,11 @@ public function generateSlug(object $entity): array return $slug; } + public function getDefaultImage(object $entity): string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Entity/Paragraph.php b/apps/src/Entity/Paragraph.php index 0c1fc9818..166bd08c9 100644 --- a/apps/src/Entity/Paragraph.php +++ b/apps/src/Entity/Paragraph.php @@ -80,6 +80,9 @@ abstract class Paragraph implements Stringable #[ORM\ManyToOne(cascade: ['persist', 'detach'], inversedBy: 'paragraphs')] protected ?Edito $edito = null; + #[ORM\ManyToOne(cascade: ['persist', 'detach'], inversedBy: 'paragraphs')] + protected ?Person $person = null; + #[ORM\Column( type: Types::BOOLEAN, options: ['default' => 1] @@ -151,6 +154,11 @@ public function getEdito(): ?Edito return $this->edito; } + public function getPerson(): ?Person + { + return $this->person; + } + public function getFond(): ?string { return $this->fond; @@ -244,6 +252,13 @@ public function setEdito(?Edito $edito): static return $this; } + public function setPerson(?Person $person): static + { + $this->person = $person; + + return $this; + } + public function setEnable(bool $enable): static { $this->enable = $enable; diff --git a/apps/src/Entity/Person.php b/apps/src/Entity/Person.php index d1256fb2c..e773a734c 100644 --- a/apps/src/Entity/Person.php +++ b/apps/src/Entity/Person.php @@ -38,6 +38,12 @@ class Person #[ORM\Column(length: 255, nullable: true)] protected ?string $profile = null; + #[ORM\Column( + type: Types::BOOLEAN, + options: ['default' => 1] + )] + protected ?bool $enable = null; + #[Vich\UploadableField(mapping: 'movie', fileNameProperty: 'profile')] protected ?File $profileFile = null; @@ -72,9 +78,68 @@ class Person #[ORM\Column(length: 255, nullable: true)] private ?string $tmdb = null; + /** + * @var Collection + */ + #[ORM\OneToMany( + targetEntity: Paragraph::class, + mappedBy: 'person', + cascade: [ + 'persist', + 'remove', + ], + orphanRemoval: true + )] + #[ORM\OrderBy( + ['position' => 'ASC'] + )] + protected Collection $paragraphs; + public function __construct() { $this->castings = new ArrayCollection(); + $this->paragraphs = new ArrayCollection(); + } + + public function isEnable(): ?bool + { + return $this->enable; + } + + public function setEnable(bool $enable): static + { + $this->enable = $enable; + + return $this; + } + + public function addParagraph(Paragraph $paragraph): static + { + if (!$this->paragraphs->contains($paragraph)) { + $this->paragraphs->add($paragraph); + $paragraph->setPerson($this); + } + + return $this; + } + + public function removeParagraph(Paragraph $paragraph): static + { + // set the owning side to null (unless already changed) + if ($this->paragraphs->removeElement($paragraph) && $paragraph->getPerson() === $this + ) { + $paragraph->setPerson(null); + } + + return $this; + } + + /** + * @return Collection + */ + public function getParagraphs(): Collection + { + return $this->paragraphs; } public function addCasting(Casting $casting): static diff --git a/apps/src/Enum/PageEnum.php b/apps/src/Enum/PageEnum.php index d7d3b2d63..e061b62a7 100644 --- a/apps/src/Enum/PageEnum.php +++ b/apps/src/Enum/PageEnum.php @@ -11,6 +11,7 @@ enum PageEnum: string case HOME = 'home'; case LOGIN = 'login'; case LOSTPASSWORD = 'lostpassword'; + case PERSONS = 'person'; case MOVIES = 'movie'; case PAGE = 'page'; case POSTS = 'post'; diff --git a/apps/src/Message/MetaAllMessage.php b/apps/src/Message/MetaAllMessage.php index 12d32eef5..d84018324 100644 --- a/apps/src/Message/MetaAllMessage.php +++ b/apps/src/Message/MetaAllMessage.php @@ -4,7 +4,7 @@ use Symfony\Component\Messenger\Attribute\AsMessage; -#[AsMessage('async')] +#[AsMessage('sync')] final class MetaAllMessage { /* diff --git a/apps/src/Service/ViewResolverService.php b/apps/src/Service/ViewResolverService.php index 00d3e3136..62b0cd15c 100644 --- a/apps/src/Service/ViewResolverService.php +++ b/apps/src/Service/ViewResolverService.php @@ -6,6 +6,7 @@ use Labstag\Entity\Meta; use Labstag\Repository\BlockRepository; use ReflectionClass; +use Symfony\Component\DependencyInjection\Attribute\AutowireIterator; use Twig\Environment; final class ViewResolverService @@ -17,6 +18,8 @@ final class ViewResolverService private array $requestCache = []; public function __construct( + #[AutowireIterator('labstag.datas')] + private iterable $datas, private EntityManagerInterface $entityManager, private ConfigurationService $configurationService, private BlockService $blockService, @@ -26,6 +29,18 @@ public function __construct( { } + private function getDefaultImageEntity($entity) + { + $image = ''; + foreach ($this->datas as $data) { + if ($data->supportsData($entity)) { + $image = $data->getDefaultImage($entity); + } + } + + return $image; + } + /** * @return mixed[] */ @@ -42,7 +57,7 @@ public function getDataByEntity(object $entity, bool $disable = false): array 'paragraphs' => $entity->getParagraphs()->getValues(), ]; - $data['img'] = $reflectionClass->hasMethod('getImg') ? $entity->getImg() : $entity->getPoster(); + $data['img'] = $this->getDefaultImageEntity($entity); if (method_exists($entity, 'getTags')) { $data['tags'] = $entity->getTags(); From 1accbebfa406ecd61536690e6b881733975317b9 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Mon, 29 Dec 2025 21:17:50 +0100 Subject: [PATCH 25/50] =?UTF-8?q?feat:=20activer=20les=20personnes=20par?= =?UTF-8?q?=20d=C3=A9faut=20lors=20de=20leur=20cr=C3=A9ation=20et=20ajoute?= =?UTF-8?q?r=20des=20liens=20vers=20les=20profils=20des=20acteurs=20dans?= =?UTF-8?q?=20le=20template=20de=20film?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Service/Imdb/PersonService.php | 1 + apps/templates/paragraphs/content/head-movie.html.twig | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/src/Service/Imdb/PersonService.php b/apps/src/Service/Imdb/PersonService.php index 0f724facc..bba2fb961 100644 --- a/apps/src/Service/Imdb/PersonService.php +++ b/apps/src/Service/Imdb/PersonService.php @@ -109,6 +109,7 @@ public function getPerson(array $data): Person ); if (!$person instanceof Person) { $person = new Person(); + $person->setEnable(true); $person->setTmdb($data['id']); $person->setTitle($data['name']); $entityRepository->save($person); diff --git a/apps/templates/paragraphs/content/head-movie.html.twig b/apps/templates/paragraphs/content/head-movie.html.twig index 38bf2bb0b..ead27258a 100644 --- a/apps/templates/paragraphs/content/head-movie.html.twig +++ b/apps/templates/paragraphs/content/head-movie.html.twig @@ -123,10 +123,12 @@ {% for acting in actings %}
{{ acting.figure }} From 1e110afcf001c0696abf0b82affe85c933c71852 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Tue, 30 Dec 2025 13:12:31 +0100 Subject: [PATCH 26/50] =?UTF-8?q?feat:=20ajouter=20le=20paragraphe=20d'en-?= =?UTF-8?q?t=C3=AAte=20pour=20les=20personnes=20et=20int=C3=A9grer=20la=20?= =?UTF-8?q?gestion=20des=20s=C3=A9ries=20et=20films=20dans=20les=20templat?= =?UTF-8?q?es=20Twig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Data/ChapterData.php | 2 +- apps/src/Data/EditoData.php | 2 +- apps/src/Data/EpisodeData.php | 2 +- apps/src/Data/GameData.php | 2 +- apps/src/Data/MemoData.php | 2 +- apps/src/Data/MovieData.php | 2 +- apps/src/Data/PageData.php | 2 +- apps/src/Data/PersonData.php | 2 +- apps/src/Data/PostData.php | 2 +- apps/src/Data/SagaData.php | 2 +- apps/src/Data/SeasonData.php | 2 +- apps/src/Data/SerieData.php | 2 +- apps/src/Data/StarData.php | 2 +- apps/src/Data/StoryData.php | 2 +- apps/src/Entity/HeadPersonParagraph.php | 10 +++ apps/src/Entity/Paragraph.php | 1 + apps/src/Paragraph/HeadPersonParagraph.php | 63 ++++++++++++++++++ apps/src/Twig/Extension/CastingExtension.php | 2 + .../Twig/Runtime/CastingExtensionRuntime.php | 37 ++++++++++- .../paragraphs/content/head-person.html.twig | 65 +++++++++++++++++++ apps/translations/messages.fr.xlf | 12 ++++ assets/front/index.scss | 1 + assets/front/paragraphs/_head-person.scss | 56 ++++++++++++++++ 23 files changed, 260 insertions(+), 15 deletions(-) create mode 100644 apps/src/Entity/HeadPersonParagraph.php create mode 100644 apps/src/Paragraph/HeadPersonParagraph.php create mode 100644 apps/templates/paragraphs/content/head-person.html.twig create mode 100644 assets/front/paragraphs/_head-person.scss diff --git a/apps/src/Data/ChapterData.php b/apps/src/Data/ChapterData.php index a7338e9ab..cd9e55a25 100644 --- a/apps/src/Data/ChapterData.php +++ b/apps/src/Data/ChapterData.php @@ -20,7 +20,7 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getStory(), $field); } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); } diff --git a/apps/src/Data/EditoData.php b/apps/src/Data/EditoData.php index 1db9ad406..9015ae8f0 100644 --- a/apps/src/Data/EditoData.php +++ b/apps/src/Data/EditoData.php @@ -18,7 +18,7 @@ public function placeholder(): string return $this->configPlaceholder(); } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); } diff --git a/apps/src/Data/EpisodeData.php b/apps/src/Data/EpisodeData.php index d01bb189a..e84c22d3f 100644 --- a/apps/src/Data/EpisodeData.php +++ b/apps/src/Data/EpisodeData.php @@ -18,7 +18,7 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getRefseason(), 'backdrop'); } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); } diff --git a/apps/src/Data/GameData.php b/apps/src/Data/GameData.php index 60dc71fca..1117fffd7 100644 --- a/apps/src/Data/GameData.php +++ b/apps/src/Data/GameData.php @@ -25,7 +25,7 @@ public function generateSlug(object $entity): array return $slug; } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); } diff --git a/apps/src/Data/MemoData.php b/apps/src/Data/MemoData.php index 974287e7d..39b5b2cb6 100644 --- a/apps/src/Data/MemoData.php +++ b/apps/src/Data/MemoData.php @@ -18,7 +18,7 @@ public function placeholder(): string return $this->configPlaceholder(); } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); } diff --git a/apps/src/Data/MovieData.php b/apps/src/Data/MovieData.php index aa1f9e8cb..08f57e04b 100644 --- a/apps/src/Data/MovieData.php +++ b/apps/src/Data/MovieData.php @@ -70,7 +70,7 @@ public function placeholder(): string return $this->configPlaceholder(); } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getPoster(); } diff --git a/apps/src/Data/PageData.php b/apps/src/Data/PageData.php index d6c32d7c9..19a004fcd 100644 --- a/apps/src/Data/PageData.php +++ b/apps/src/Data/PageData.php @@ -25,7 +25,7 @@ public function generateSlugPage(object $entity): array return $slug; } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); } diff --git a/apps/src/Data/PersonData.php b/apps/src/Data/PersonData.php index b09c3cd24..e98713474 100644 --- a/apps/src/Data/PersonData.php +++ b/apps/src/Data/PersonData.php @@ -39,7 +39,7 @@ public function match(?string $slug): bool return $page instanceof Person; } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getProfile(); } diff --git a/apps/src/Data/PostData.php b/apps/src/Data/PostData.php index 8c52cfba5..c869a6e51 100644 --- a/apps/src/Data/PostData.php +++ b/apps/src/Data/PostData.php @@ -28,7 +28,7 @@ public function generateSlug(object $entity): array return $slug; } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); } diff --git a/apps/src/Data/SagaData.php b/apps/src/Data/SagaData.php index 48c2d540c..7c80ce410 100644 --- a/apps/src/Data/SagaData.php +++ b/apps/src/Data/SagaData.php @@ -27,7 +27,7 @@ public function asset(mixed $entity, string $field): string return $this->fileService->asset($entity, $field); } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getPoster(); } diff --git a/apps/src/Data/SeasonData.php b/apps/src/Data/SeasonData.php index 25bd47b48..af99057c6 100644 --- a/apps/src/Data/SeasonData.php +++ b/apps/src/Data/SeasonData.php @@ -22,7 +22,7 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getRefserie(), $field); } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getPoster(); } diff --git a/apps/src/Data/SerieData.php b/apps/src/Data/SerieData.php index b520807fb..2d393d4ea 100644 --- a/apps/src/Data/SerieData.php +++ b/apps/src/Data/SerieData.php @@ -26,7 +26,7 @@ public function asset(mixed $entity, string $field): string return $this->fileService->asset($entity, $field); } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getPoster(); } diff --git a/apps/src/Data/StarData.php b/apps/src/Data/StarData.php index 52a0e28f2..b7b5df2c2 100644 --- a/apps/src/Data/StarData.php +++ b/apps/src/Data/StarData.php @@ -18,7 +18,7 @@ public function placeholder(): string return $this->configPlaceholder(); } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); } diff --git a/apps/src/Data/StoryData.php b/apps/src/Data/StoryData.php index aff56307b..77cf988c1 100644 --- a/apps/src/Data/StoryData.php +++ b/apps/src/Data/StoryData.php @@ -28,7 +28,7 @@ public function generateSlug(object $entity): array return $slug; } - public function getDefaultImage(object $entity): string + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); } diff --git a/apps/src/Entity/HeadPersonParagraph.php b/apps/src/Entity/HeadPersonParagraph.php new file mode 100644 index 000000000..b85b93c28 --- /dev/null +++ b/apps/src/Entity/HeadPersonParagraph.php @@ -0,0 +1,10 @@ + HeadCvParagraph::class, 'head-game' => HeadGameParagraph::class, 'head-movie' => HeadMovieParagraph::class, + 'head-person' => HeadPersonParagraph::class, 'head-post' => HeadPostParagraph::class, 'head-saga' => HeadSagaParagraph::class, 'head-season' => HeadSeasonParagraph::class, diff --git a/apps/src/Paragraph/HeadPersonParagraph.php b/apps/src/Paragraph/HeadPersonParagraph.php new file mode 100644 index 000000000..42982f4b0 --- /dev/null +++ b/apps/src/Paragraph/HeadPersonParagraph.php @@ -0,0 +1,63 @@ +setShow($paragraph, false); + + return; + } + + $this->setData( + $paragraph, + [ + 'person' => $data['entity'], + 'paragraph' => $paragraph, + 'data' => $data, + ] + ); + } + + public function getClass(): string + { + return EntityHeadPersonParagraph::class; + } + + #[Override] + public function getName(): TranslatableMessage + { + return new TranslatableMessage('Head person'); + } + + #[Override] + public function getType(): string + { + return 'head-person'; + } + + #[Override] + public function supports(?object $object): bool + { + if (is_null($object)) { + return true; + } + + return $object instanceof Block; + } +} diff --git a/apps/src/Twig/Extension/CastingExtension.php b/apps/src/Twig/Extension/CastingExtension.php index 38967f1f5..d8aa43bd5 100644 --- a/apps/src/Twig/Extension/CastingExtension.php +++ b/apps/src/Twig/Extension/CastingExtension.php @@ -15,6 +15,8 @@ public function getFunctions(): array return [ new TwigFunction('casting_cast', [CastingExtensionRuntime::class, 'cast']), new TwigFunction('casting_acting', [CastingExtensionRuntime::class, 'acting']), + new TwigFunction('casting_series', [CastingExtensionRuntime::class, 'series']), + new TwigFunction('casting_movies', [CastingExtensionRuntime::class, 'movies']), new TwigFunction('casting_directing', [CastingExtensionRuntime::class, 'directing']), new TwigFunction('casting_writing', [CastingExtensionRuntime::class, 'writing']), new TwigFunction('casting_production', [CastingExtensionRuntime::class, 'production']), diff --git a/apps/src/Twig/Runtime/CastingExtensionRuntime.php b/apps/src/Twig/Runtime/CastingExtensionRuntime.php index 4aa454f8b..62e98000b 100644 --- a/apps/src/Twig/Runtime/CastingExtensionRuntime.php +++ b/apps/src/Twig/Runtime/CastingExtensionRuntime.php @@ -3,8 +3,11 @@ namespace Labstag\Twig\Runtime; use Doctrine\ORM\EntityManagerInterface; -use Doctrine\ORM\PersistentCollection; use Labstag\Entity\Casting; +use Labstag\Entity\Episode; +use Labstag\Entity\Movie; +use Labstag\Entity\Season; +use Labstag\Entity\Serie; use Twig\Extension\RuntimeExtensionInterface; class CastingExtensionRuntime implements RuntimeExtensionInterface @@ -24,6 +27,38 @@ public function cast($data): mixed return $castings; } + public function series($data): array + { + $tab = []; + foreach ($data as $row) { + if ($row->getRefSerie() instanceof Serie) { + $id = $row->getRefSerie()->getId(); + $tab[$id] = $row; + }elseif ($row->getRefEpisode() instanceof Episode) { + $id = $row->getRefEpisode()->getRefSerie()->getId(); + $tab[$id] = $row; + }elseif ($row->getRefSeason() instanceof Season) { + $id = $row->getRefSeason()->getRefSerie()->getId(); + $tab[$id] = $row; + } + } + + return $tab; + } + + public function movies($data): array + { + $tab = []; + foreach ($data as $row) { + if ($row->getRefMovie() instanceof Movie) { + $id = $row->getRefMovie()->getId(); + $tab[$id] = $row; + } + } + + return $tab; + } + public function acting($data): array { return $this->getByType('Acting', $data); diff --git a/apps/templates/paragraphs/content/head-person.html.twig b/apps/templates/paragraphs/content/head-person.html.twig new file mode 100644 index 000000000..d0fed4cff --- /dev/null +++ b/apps/templates/paragraphs/content/head-person.html.twig @@ -0,0 +1,65 @@ +{% use "elements.html.twig" %} +{% set castings = casting_cast(person) %} +{% set series = casting_series(castings) %} +{% set movies = casting_movies(castings) %} + +
+
+
+
+

+ {{ person.title }} +

+
+ {{ 'Date of birth : %date%'|trans({ '%date%': person.birthday|format_date(locale: 'fr_FR', dateFormat: 'full') }) }} +
+ {% if person.deathday %} +
+ {{ 'Date of death : %date%'|trans({ '%date%': person.deathday|format_date(locale: 'fr_FR', dateFormat: 'full') }) }} +
+ {% endif %} +
+
+
+
+
+
+ {{ person.biography|raw }} +
+
+ {% if series|length != 0 or movies|length != 0 %} +
+
+
+ {% if series|length != 0 %} +

{{ 'Series'|trans }}

+
    + {% for row in series %} +
  • + {% if row.refSerie is defined %} + {% include "teasers/serie.html.twig" with {'serie': row.refSerie} %} + {% elseif row.refSeason is defined %} + {% include "teasers/serie.html.twig" with {'serie': row.refSeason.refSerie} %} + {% else %} + {% include "teasers/serie.html.twig" with {'serie': row.refEpisode.refSeason.refSerie} %} + {% endif %} +
  • + {% endfor %} +
+ {% endif %} + {% if movies|length != 0 %} +

{{ 'Movies'|trans }}

+
    + {% for row in movies %} +
  • + {% include "teasers/movie.html.twig" with {'movie': row.refMovie} %} +
  • + {% endfor %} +
+ {% endif %} +
+
+
+ {% endif %} +
+ diff --git a/apps/translations/messages.fr.xlf b/apps/translations/messages.fr.xlf index ebe67265c..a30ce7247 100644 --- a/apps/translations/messages.fr.xlf +++ b/apps/translations/messages.fr.xlf @@ -2365,6 +2365,18 @@ Figure Personnage + + Head person + En-tête personne + + + Date of birth : %date% + Date de naissance : %date% + + + Date of death : %date% + Date de décès : %date% + diff --git a/assets/front/index.scss b/assets/front/index.scss index e9a0ae4fd..f0f6bcc8c 100644 --- a/assets/front/index.scss +++ b/assets/front/index.scss @@ -30,6 +30,7 @@ @use 'paragraphs/experiences' as paragraphexperiences; @use 'paragraphs/form' as paragraphform; @use 'paragraphs/head-chapter' as paragraphhead-chapter; +@use 'paragraphs/head-person' as paragraphhead-person; @use 'paragraphs/head-cv' as paragraphhead-cv; @use 'paragraphs/head-game' as paragraphhead-game; @use 'paragraphs/head-movie' as paragraphhead-movie; diff --git a/assets/front/paragraphs/_head-person.scss b/assets/front/paragraphs/_head-person.scss new file mode 100644 index 000000000..e856f5e25 --- /dev/null +++ b/assets/front/paragraphs/_head-person.scss @@ -0,0 +1,56 @@ +@use "../mixins"; +@use "../placeholders" as *; +@use "../variables"; +@use "../icons"; + +@use "sass:color"; + +.paragraph_head-person { + .first { + @extend %head; + height: 300px; + + } + .casting{ + ul { + grid-area: list; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + align-items: start; + grid-template-rows: 1fr; + gap: 12px; + height: auto; + + @include mixins.respond-to(md) { + grid-template-columns: repeat(3, 1fr); + } + } + + li { + display: flex; + flex-direction: column; + height: 550px; + + &.teaser-movie { + background-color: color.scale(variables.$colorbg, $lightness: 15%); + + &:nth-child(even) { + background-color: color.scale(variables.$colorbg, $lightness: 10%); + } + + .background { + background-position: center; + background-repeat: no-repeat; + background-size: contain; + background-color: #000; + min-height: 324px; + display: flex; + } + } + + .wrapper { + padding: 1rem; + } + } + } +} \ No newline at end of file From 593c8306b9ca9436fe68251505187e3284aac269 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Wed, 31 Dec 2025 14:08:58 +0100 Subject: [PATCH 27/50] =?UTF-8?q?feat:=20ajouter=20la=20gestion=20des=20pe?= =?UTF-8?q?rsonnes=20avec=20des=20entit=C3=A9s,=20des=20templates=20et=20d?= =?UTF-8?q?es=20styles=20associ=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller/Admin/PersonCrudController.php | 1 + apps/src/Entity/Paragraph.php | 1 + apps/src/Entity/PersonParagraph.php | 25 +++++ apps/src/Paragraph/PersonParagraph.php | 106 ++++++++++++++++++ apps/src/Repository/PersonRepository.php | 29 +++++ .../paragraphs/content/chapter-list.html.twig | 2 +- .../paragraphs/content/episode-list.html.twig | 2 +- .../paragraphs/content/experiences.html.twig | 2 +- .../paragraphs/content/game.html.twig | 2 +- .../paragraphs/content/head-movie.html.twig | 18 +-- .../paragraphs/content/head-person.html.twig | 8 +- .../paragraphs/content/last-news.html.twig | 2 +- .../paragraphs/content/last-story.html.twig | 2 +- .../paragraphs/content/movie.html.twig | 2 +- .../paragraphs/content/news-list.html.twig | 2 +- .../paragraphs/content/person.html.twig | 15 +++ .../paragraphs/content/saga-list.html.twig | 2 +- .../paragraphs/content/saga.html.twig | 2 +- .../paragraphs/content/season-list.html.twig | 2 +- .../paragraphs/content/serie.html.twig | 2 +- .../paragraphs/content/sibling.html.twig | 2 +- .../paragraphs/content/sitemap.html.twig | 2 +- .../paragraphs/content/skills.html.twig | 2 +- .../paragraphs/content/star.html.twig | 2 +- .../paragraphs/content/story-list.html.twig | 2 +- .../paragraphs/header/person.html.twig | 1 + .../paragraphs/scripts/sitemap.html.twig | 2 +- apps/templates/teasers/person.html.twig | 16 +++ assets/front/index.scss | 2 + assets/front/paragraphs/_head-movie.scss | 52 ++------- assets/front/paragraphs/_person.scss | 20 ++++ assets/front/teasers/_person.scss | 20 ++++ 32 files changed, 270 insertions(+), 80 deletions(-) create mode 100644 apps/src/Entity/PersonParagraph.php create mode 100644 apps/src/Paragraph/PersonParagraph.php create mode 100644 apps/templates/paragraphs/content/person.html.twig create mode 100644 apps/templates/paragraphs/header/person.html.twig create mode 100644 apps/templates/teasers/person.html.twig create mode 100644 assets/front/paragraphs/_person.scss create mode 100644 assets/front/teasers/_person.scss diff --git a/apps/src/Controller/Admin/PersonCrudController.php b/apps/src/Controller/Admin/PersonCrudController.php index 808759533..05761bfa1 100644 --- a/apps/src/Controller/Admin/PersonCrudController.php +++ b/apps/src/Controller/Admin/PersonCrudController.php @@ -93,6 +93,7 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->addFieldsToTab( 'principal', [ + $this->crudFieldFactory->booleanField('enable', new TranslatableMessage('Enable')), $this->crudFieldFactory->slugField(), $this->crudFieldFactory->titleField(), $choiceField, diff --git a/apps/src/Entity/Paragraph.php b/apps/src/Entity/Paragraph.php index 50a362c4c..fd6b7815b 100644 --- a/apps/src/Entity/Paragraph.php +++ b/apps/src/Entity/Paragraph.php @@ -48,6 +48,7 @@ 'movie-slider' => MovieSliderParagraph::class, 'movie' => MovieParagraph::class, 'news-list' => NewsListParagraph::class, + 'person' => PersonParagraph::class, 'saga-list' => SagaListParagraph::class, 'saga' => SagaParagraph::class, 'season-list' => SeasonListParagraph::class, diff --git a/apps/src/Entity/PersonParagraph.php b/apps/src/Entity/PersonParagraph.php new file mode 100644 index 000000000..6259ec5f0 --- /dev/null +++ b/apps/src/Entity/PersonParagraph.php @@ -0,0 +1,25 @@ +nbr; + } + + public function setNbr(?int $nbr): static + { + $this->nbr = $nbr; + + return $this; + } +} diff --git a/apps/src/Paragraph/PersonParagraph.php b/apps/src/Paragraph/PersonParagraph.php new file mode 100644 index 000000000..c8277da72 --- /dev/null +++ b/apps/src/Paragraph/PersonParagraph.php @@ -0,0 +1,106 @@ +requestStack->getCurrentRequest(); + $entityRepository = $this->getRepository(Person::class); + $query = $this->setQuery($request->query->all()); + + $pagination = $this->getPaginator($entityRepository->getQueryPaginator($query), $paragraph->getNbr()); + + $templates = $this->templates($paragraph, 'header'); + $this->setHeader( + $paragraph, + $this->render( + $templates['view'], + ['pagination' => $pagination] + ) + ); + + $this->setData( + $paragraph, + [ + 'pagination' => $pagination, + 'paragraph' => $paragraph, + 'data' => $data, + ] + ); + } + + public function getClass(): string + { + return EntityPersonParagraph::class; + } + + /** + * @return Generator + */ + #[Override] + public function getFields(Paragraph $paragraph, string $pageName): mixed + { + unset($paragraph, $pageName); + yield $this->addFieldIntegerNbr(); + } + + #[Override] + public function getName(): TranslatableMessage + { + return new TranslatableMessage('Person'); + } + + #[Override] + public function getType(): string + { + return 'person'; + } + + #[Override] + public function supports(?object $object): bool + { + if (is_null($object)) { + return true; + } + + $entityRepository = $this->getRepository($this->getClass()); + $paragraph = $entityRepository->findOneBy([]); + + return !$paragraph instanceof Paragraph; + } + + /** + * @param array $query + * + * @return array + */ + private function setQuery(array $query): array + { + if (!isset($query['order'])) { + $query['order'] = 'title'; + } + + if (!isset($query['orderby'])) { + $query['orderby'] = 'ASC'; + } + + return $query; + } +} diff --git a/apps/src/Repository/PersonRepository.php b/apps/src/Repository/PersonRepository.php index 44c8660bd..98865214a 100644 --- a/apps/src/Repository/PersonRepository.php +++ b/apps/src/Repository/PersonRepository.php @@ -2,6 +2,8 @@ namespace Labstag\Repository; +use Doctrine\ORM\Query; +use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; use Labstag\Entity\Person; @@ -14,4 +16,31 @@ public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Person::class); } + + /** + * @param array $query + * + * @return Query + */ + public function getQueryPaginator(array $query): Query + { + $queryBuilder = $this->getQueryBuilder($query); + $query = $queryBuilder->getQuery(); + $dql = $query->getDQL(); + $query->enableResultCache(3600, 'sagas-query-paginator-' . md5((string) $dql)); + + return $query; + } + + /** + * @param array $query + */ + public function getQueryBuilder(array $query): QueryBuilder + { + $queryBuilder = $this->createQueryBuilder('p'); + $queryBuilder->where('p.enable = :enable'); + $queryBuilder->setParameter('enable', true); + + return $queryBuilder->orderBy('p.' . $query['order'], $query['orderby']); + } } diff --git a/apps/templates/paragraphs/content/chapter-list.html.twig b/apps/templates/paragraphs/content/chapter-list.html.twig index f6519dee2..44106bb17 100644 --- a/apps/templates/paragraphs/content/chapter-list.html.twig +++ b/apps/templates/paragraphs/content/chapter-list.html.twig @@ -9,7 +9,7 @@
    {% for row in chapters %}
  • - {% include "teasers/chapter.html.twig" with {'chapter': row} %} + {% include "teasers/chapter.html.twig" with {'chapter': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/episode-list.html.twig b/apps/templates/paragraphs/content/episode-list.html.twig index eb926d7a1..1397ff76e 100644 --- a/apps/templates/paragraphs/content/episode-list.html.twig +++ b/apps/templates/paragraphs/content/episode-list.html.twig @@ -15,7 +15,7 @@
    {% for row in pagination %}
  • - {% include "teasers/episode.html.twig" with {'episode': row} %} + {% include "teasers/episode.html.twig" with {'episode': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/experiences.html.twig b/apps/templates/paragraphs/content/experiences.html.twig index 1a20bbd5f..cc6ae5704 100644 --- a/apps/templates/paragraphs/content/experiences.html.twig +++ b/apps/templates/paragraphs/content/experiences.html.twig @@ -5,7 +5,7 @@
    {% for item in paragraph.skills %}
  • - {% include "teasers/experience.html.twig" with {'item': item} %} + {% include "teasers/experience.html.twig" with {'item': item} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/game.html.twig b/apps/templates/paragraphs/content/game.html.twig index c71d6b656..1eeb0cab4 100644 --- a/apps/templates/paragraphs/content/game.html.twig +++ b/apps/templates/paragraphs/content/game.html.twig @@ -10,7 +10,7 @@
    {% for row in pagination %}
  • - {% include "teasers/game.html.twig" with {'game': row} %} + {% include "teasers/game.html.twig" with {'game': row} %}
  • {% endfor %}
diff --git a/apps/templates/paragraphs/content/head-movie.html.twig b/apps/templates/paragraphs/content/head-movie.html.twig index ead27258a..182d825a7 100644 --- a/apps/templates/paragraphs/content/head-movie.html.twig +++ b/apps/templates/paragraphs/content/head-movie.html.twig @@ -120,21 +120,13 @@ {{ 'Cast'|trans }}

+
    {% for acting in actings %} -
    - -
    - {{ acting.figure }} -
    -
    +
  • + {% include "teasers/person.html.twig" with {'person': acting.refperson, 'figure': acting.figure} %} +
  • {% endfor %} +
{% endif %} diff --git a/apps/templates/paragraphs/content/head-person.html.twig b/apps/templates/paragraphs/content/head-person.html.twig index d0fed4cff..53b362a5d 100644 --- a/apps/templates/paragraphs/content/head-person.html.twig +++ b/apps/templates/paragraphs/content/head-person.html.twig @@ -37,11 +37,11 @@ {% for row in series %}
  • {% if row.refSerie is defined %} - {% include "teasers/serie.html.twig" with {'serie': row.refSerie} %} + {% include "teasers/serie.html.twig" with {'serie': row.refSerie} %} {% elseif row.refSeason is defined %} - {% include "teasers/serie.html.twig" with {'serie': row.refSeason.refSerie} %} + {% include "teasers/serie.html.twig" with {'serie': row.refSeason.refSerie} %} {% else %} - {% include "teasers/serie.html.twig" with {'serie': row.refEpisode.refSeason.refSerie} %} + {% include "teasers/serie.html.twig" with {'serie': row.refEpisode.refSeason.refSerie} %} {% endif %}
  • {% endfor %} @@ -52,7 +52,7 @@
      {% for row in movies %}
    • - {% include "teasers/movie.html.twig" with {'movie': row.refMovie} %} + {% include "teasers/movie.html.twig" with {'movie': row.refMovie} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/last-news.html.twig b/apps/templates/paragraphs/content/last-news.html.twig index c3621e28f..fa853a3da 100644 --- a/apps/templates/paragraphs/content/last-news.html.twig +++ b/apps/templates/paragraphs/content/last-news.html.twig @@ -13,7 +13,7 @@
      {% for row in news %}
    • - {% include "teasers/post.html.twig" with {'post': row} %} + {% include "teasers/post.html.twig" with {'post': row} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/last-story.html.twig b/apps/templates/paragraphs/content/last-story.html.twig index d07174ad7..6e039875f 100644 --- a/apps/templates/paragraphs/content/last-story.html.twig +++ b/apps/templates/paragraphs/content/last-story.html.twig @@ -13,7 +13,7 @@
      {% for story in stories %}
    • - {% include "teasers/story.html.twig" with {'story': story} %} + {% include "teasers/story.html.twig" with {'story': story} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/movie.html.twig b/apps/templates/paragraphs/content/movie.html.twig index 1d85cb381..86738c2b5 100644 --- a/apps/templates/paragraphs/content/movie.html.twig +++ b/apps/templates/paragraphs/content/movie.html.twig @@ -10,7 +10,7 @@
      {% for row in pagination %}
    • - {% include "teasers/movie.html.twig" with {'movie': row} %} + {% include "teasers/movie.html.twig" with {'movie': row} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/news-list.html.twig b/apps/templates/paragraphs/content/news-list.html.twig index 02d51efac..2c894c489 100644 --- a/apps/templates/paragraphs/content/news-list.html.twig +++ b/apps/templates/paragraphs/content/news-list.html.twig @@ -4,7 +4,7 @@
      {% for row in pagination %}
    • - {% include "teasers/post.html.twig" with {'post': row} %} + {% include "teasers/post.html.twig" with {'post': row} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/person.html.twig b/apps/templates/paragraphs/content/person.html.twig new file mode 100644 index 000000000..6de35fd01 --- /dev/null +++ b/apps/templates/paragraphs/content/person.html.twig @@ -0,0 +1,15 @@ +{% use "elements.html.twig" %} + +
    +
      + {% for person in pagination %} +
    • + {% include "teasers/person.html.twig" with {'person': person} %} +
    • + {% endfor %} +
    + +
    + \ No newline at end of file diff --git a/apps/templates/paragraphs/content/saga-list.html.twig b/apps/templates/paragraphs/content/saga-list.html.twig index 33641f667..ed14402dd 100644 --- a/apps/templates/paragraphs/content/saga-list.html.twig +++ b/apps/templates/paragraphs/content/saga-list.html.twig @@ -16,7 +16,7 @@
      {% for row in movies %}
    • - {% include "teasers/movie.html.twig" with {'movie': row} %} + {% include "teasers/movie.html.twig" with {'movie': row} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/saga.html.twig b/apps/templates/paragraphs/content/saga.html.twig index f7a708262..719f2cc3b 100644 --- a/apps/templates/paragraphs/content/saga.html.twig +++ b/apps/templates/paragraphs/content/saga.html.twig @@ -4,7 +4,7 @@
      {% for saga in pagination %}
    • - {% include "teasers/saga.html.twig" with {'saga': saga} %} + {% include "teasers/saga.html.twig" with {'saga': saga} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/season-list.html.twig b/apps/templates/paragraphs/content/season-list.html.twig index 07e5c68c0..08afd9208 100644 --- a/apps/templates/paragraphs/content/season-list.html.twig +++ b/apps/templates/paragraphs/content/season-list.html.twig @@ -9,7 +9,7 @@
      {% for row in seasons %}
    • - {% include "teasers/season.html.twig" with {'season': row} %} + {% include "teasers/season.html.twig" with {'season': row} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/serie.html.twig b/apps/templates/paragraphs/content/serie.html.twig index 99a19dd8c..f7b772c52 100644 --- a/apps/templates/paragraphs/content/serie.html.twig +++ b/apps/templates/paragraphs/content/serie.html.twig @@ -10,7 +10,7 @@
      {% for row in pagination %}
    • - {% include "teasers/serie.html.twig" with {'serie': row} %} + {% include "teasers/serie.html.twig" with {'serie': row} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/sibling.html.twig b/apps/templates/paragraphs/content/sibling.html.twig index 8d084a3f9..1f2a0a76f 100644 --- a/apps/templates/paragraphs/content/sibling.html.twig +++ b/apps/templates/paragraphs/content/sibling.html.twig @@ -7,7 +7,7 @@
      {% for page in childs %}
    • - {% include "teasers/page.html.twig" with {'page': page} %} + {% include "teasers/page.html.twig" with {'page': page} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/sitemap.html.twig b/apps/templates/paragraphs/content/sitemap.html.twig index f99ab7844..727ae9988 100644 --- a/apps/templates/paragraphs/content/sitemap.html.twig +++ b/apps/templates/paragraphs/content/sitemap.html.twig @@ -1,6 +1,6 @@ {% use "elements.html.twig" %}
    - {% include "paragraphs/scripts/sitemap.html.twig" with {'key': '/', 'sitemap': sitemap} %} + {% include "paragraphs/scripts/sitemap.html.twig" with {'key': '/', 'sitemap': sitemap} %}
    \ No newline at end of file diff --git a/apps/templates/paragraphs/content/skills.html.twig b/apps/templates/paragraphs/content/skills.html.twig index d6c88bae9..00dbb3c3d 100644 --- a/apps/templates/paragraphs/content/skills.html.twig +++ b/apps/templates/paragraphs/content/skills.html.twig @@ -5,7 +5,7 @@
      {% for item in skills %}
    • - {% include "teasers/skills.html.twig" with {'item': item} %} + {% include "teasers/skills.html.twig" with {'item': item} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/star.html.twig b/apps/templates/paragraphs/content/star.html.twig index 6d393222c..5bcbed0d4 100644 --- a/apps/templates/paragraphs/content/star.html.twig +++ b/apps/templates/paragraphs/content/star.html.twig @@ -4,7 +4,7 @@
      {% for row in pagination %}
    • - {% include "teasers/star.html.twig" with {'star': row} %} + {% include "teasers/star.html.twig" with {'star': row} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/content/story-list.html.twig b/apps/templates/paragraphs/content/story-list.html.twig index a421ed239..db31b1be4 100644 --- a/apps/templates/paragraphs/content/story-list.html.twig +++ b/apps/templates/paragraphs/content/story-list.html.twig @@ -4,7 +4,7 @@
      {% for story in pagination %}
    • - {% include "teasers/story.html.twig" with {'story': story} %} + {% include "teasers/story.html.twig" with {'story': story} %}
    • {% endfor %}
    diff --git a/apps/templates/paragraphs/header/person.html.twig b/apps/templates/paragraphs/header/person.html.twig new file mode 100644 index 000000000..cf9909807 --- /dev/null +++ b/apps/templates/paragraphs/header/person.html.twig @@ -0,0 +1 @@ +{{ knp_pagination_rel_links(pagination) }} \ No newline at end of file diff --git a/apps/templates/paragraphs/scripts/sitemap.html.twig b/apps/templates/paragraphs/scripts/sitemap.html.twig index cd152c669..30334ef38 100644 --- a/apps/templates/paragraphs/scripts/sitemap.html.twig +++ b/apps/templates/paragraphs/scripts/sitemap.html.twig @@ -3,7 +3,7 @@
  • {{ data.entity.title }} {% if data.parent|length != 0 %} - {% include "paragraphs/scripts/sitemap.html.twig" with {'key': url, 'sitemap': data.parent} %} + {% include "paragraphs/scripts/sitemap.html.twig" with {'key': url, 'sitemap': data.parent} %} {% endif %}
  • {% endfor %} diff --git a/apps/templates/teasers/person.html.twig b/apps/templates/teasers/person.html.twig new file mode 100644 index 000000000..7f69451ef --- /dev/null +++ b/apps/templates/teasers/person.html.twig @@ -0,0 +1,16 @@ + +
    +
    +
    +

    + {{ person.title }} +

    +
    + {% if figure is defined %} +
    +

    + {{ figure }} +

    +
    + {% endif %} +
    \ No newline at end of file diff --git a/assets/front/index.scss b/assets/front/index.scss index f0f6bcc8c..87f6ae570 100644 --- a/assets/front/index.scss +++ b/assets/front/index.scss @@ -41,6 +41,7 @@ @use 'paragraphs/head-story' as paragraphhead-story; @use 'paragraphs/head' as paragraphhead; @use 'paragraphs/error' as paragrapherror; +@use 'paragraphs/person' as paragraphperson; @use 'paragraphs/hero' as paragraphhero; @use 'paragraphs/html' as paragraphhtml; @use 'paragraphs/img' as paragraphimg; @@ -67,6 +68,7 @@ @use 'paragraphs/video' as paragraphvideo; @use 'teasers/chapter' as teaserchapter; +@use 'teasers/person' as teaserperson; @use 'teasers/skill' as teaserskill; @use 'teasers/experience' as teaserexperience; @use 'teasers/game' as teasergame; diff --git a/assets/front/paragraphs/_head-movie.scss b/assets/front/paragraphs/_head-movie.scss index 3b70b6123..9d4cbd75d 100644 --- a/assets/front/paragraphs/_head-movie.scss +++ b/assets/front/paragraphs/_head-movie.scss @@ -1,4 +1,6 @@ @use "../placeholders" as *; +@use "../mixins"; +@use "../variables"; @use "../icons"; .paragraph_head-movie { @@ -34,53 +36,13 @@ } .actings { - margin: 20px 0; - padding: 20px; - - .subtitle { - margin-bottom: 20px; - font-size: 1.5rem; - font-weight: bold; - } - - .wrapper { + ul { display: grid; - grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); - gap: 20px; - } - - .acting { - display: flex; - flex-direction: column; - text-align: center; - - .actor { - display: flex; - flex-direction: column; - align-items: center; - margin-bottom: 10px; - - .profile { - width: 120px; - height: 120px; - border-radius: 50%; - background-image: var(--image-url); - background-size: cover; - background-position: center; - margin-bottom: 10px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - } - - .name { - font-weight: 600; - font-size: 0.95rem; - } - } + grid-template-columns: 1fr; + gap: 12px; - .character { - font-size: 0.85rem; - color: #666; - font-style: italic; + @include mixins.respond-to(md) { + grid-template-columns: repeat(8, 1fr); } } } diff --git a/assets/front/paragraphs/_person.scss b/assets/front/paragraphs/_person.scss new file mode 100644 index 000000000..66347c86a --- /dev/null +++ b/assets/front/paragraphs/_person.scss @@ -0,0 +1,20 @@ +@use "../mixins"; +@use "../variables"; + +@use "sass:color"; + +.paragraph_person { + .wrapper {} + + .title {} + + ul { + display: grid; + grid-template-columns: 1fr; + gap: 12px; + + @include mixins.respond-to(md) { + grid-template-columns: repeat(8, 1fr); + } + } +} \ No newline at end of file diff --git a/assets/front/teasers/_person.scss b/assets/front/teasers/_person.scss new file mode 100644 index 000000000..8752d1ebe --- /dev/null +++ b/assets/front/teasers/_person.scss @@ -0,0 +1,20 @@ +@use "../placeholders" as *; + +.teaser-person { + @extend %teaser; + + .background { + width: 120px; + height: 120px; + border-radius: 50%; + align-items: flex-end; + justify-content: flex-start; + + .movies { + background-color: #363636; + color: yellow; + padding: 5px; + margin: 5px; + } + } +} \ No newline at end of file From fc0abbb0e19267ef743a154e4da03fe53d8ca70b Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 1 Jan 2026 10:14:29 +0100 Subject: [PATCH 28/50] =?UTF-8?q?fix:=20commenter=20les=20lignes=20de=20co?= =?UTF-8?q?de=20inutilis=C3=A9es=20pour=20la=20gestion=20des=20castings=20?= =?UTF-8?q?dans=20le=20template=20de=20la=20personne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/templates/paragraphs/content/head-person.html.twig | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/templates/paragraphs/content/head-person.html.twig b/apps/templates/paragraphs/content/head-person.html.twig index 53b362a5d..789d90d08 100644 --- a/apps/templates/paragraphs/content/head-person.html.twig +++ b/apps/templates/paragraphs/content/head-person.html.twig @@ -1,7 +1,9 @@ {% use "elements.html.twig" %} -{% set castings = casting_cast(person) %} -{% set series = casting_series(castings) %} -{% set movies = casting_movies(castings) %} +{# {% set castings = casting_cast(person) %} #} +{% set series = [] %} +{% set movies = [] %} +{# {% set series = casting_series(castings) %} +{% set movies = casting_movies(castings) %} #}
    From e7e999389734257f3dab7c24f3def524dc3f9b39 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 1 Jan 2026 11:00:21 +0100 Subject: [PATCH 29/50] =?UTF-8?q?feat:=20mettre=20=C3=A0=20jour=20la=20ges?= =?UTF-8?q?tion=20des=20castings=20dans=20le=20template=20de=20la=20person?= =?UTF-8?q?ne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Repository/CastingRepository.php | 2 ++ apps/templates/paragraphs/content/head-person.html.twig | 8 +++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/src/Repository/CastingRepository.php b/apps/src/Repository/CastingRepository.php index 1448fb1ea..c59ea1197 100644 --- a/apps/src/Repository/CastingRepository.php +++ b/apps/src/Repository/CastingRepository.php @@ -6,6 +6,7 @@ use Labstag\Entity\Casting; use Labstag\Entity\Episode; use Labstag\Entity\Movie; +use Labstag\Entity\Person; use Labstag\Entity\Season; use Labstag\Entity\Serie; @@ -26,6 +27,7 @@ public function findWithActiveCastings(mixed $data): mixed $queryBuilder->addSelect('p'); $queryBuilder->andWhere('p.deletedAt IS NULL'); $entityMap = [ + Person::class => ['refPerson', 'person'], Movie::class => ['refMovie', 'movie'], Serie::class => ['refSerie', 'serie'], Season::class => ['refSeason', 'season'], diff --git a/apps/templates/paragraphs/content/head-person.html.twig b/apps/templates/paragraphs/content/head-person.html.twig index 789d90d08..53b362a5d 100644 --- a/apps/templates/paragraphs/content/head-person.html.twig +++ b/apps/templates/paragraphs/content/head-person.html.twig @@ -1,9 +1,7 @@ {% use "elements.html.twig" %} -{# {% set castings = casting_cast(person) %} #} -{% set series = [] %} -{% set movies = [] %} -{# {% set series = casting_series(castings) %} -{% set movies = casting_movies(castings) %} #} +{% set castings = casting_cast(person) %} +{% set series = casting_series(castings) %} +{% set movies = casting_movies(castings) %}
    From 9e6769a3149fcd09eda5c75d129d4a2b319907e9 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 1 Jan 2026 11:06:08 +0100 Subject: [PATCH 30/50] =?UTF-8?q?fix:=20corriger=20l'acc=C3=A8s=20aux=20id?= =?UTF-8?q?entifiants=20des=20s=C3=A9ries=20dans=20la=20gestion=20des=20?= =?UTF-8?q?=C3=A9pisodes=20et=20saisons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Twig/Runtime/CastingExtensionRuntime.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/src/Twig/Runtime/CastingExtensionRuntime.php b/apps/src/Twig/Runtime/CastingExtensionRuntime.php index 62e98000b..a6c8131cd 100644 --- a/apps/src/Twig/Runtime/CastingExtensionRuntime.php +++ b/apps/src/Twig/Runtime/CastingExtensionRuntime.php @@ -35,10 +35,10 @@ public function series($data): array $id = $row->getRefSerie()->getId(); $tab[$id] = $row; }elseif ($row->getRefEpisode() instanceof Episode) { - $id = $row->getRefEpisode()->getRefSerie()->getId(); + $id = $row->getRefEpisode()->getRefseason()->getRefserie()->getId(); $tab[$id] = $row; }elseif ($row->getRefSeason() instanceof Season) { - $id = $row->getRefSeason()->getRefSerie()->getId(); + $id = $row->getRefSeason()->getRefserie()->getId(); $tab[$id] = $row; } } From 98cc56bf2b4faa152dbf81af5b3728ba1f5e554e Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 1 Jan 2026 11:19:34 +0100 Subject: [PATCH 31/50] =?UTF-8?q?fix:=20corriger=20l'affectation=20des=20o?= =?UTF-8?q?bjets=20dans=20la=20m=C3=A9thode=20series=20et=20movies=20du=20?= =?UTF-8?q?CastingExtensionRuntime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Twig/Runtime/CastingExtensionRuntime.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/src/Twig/Runtime/CastingExtensionRuntime.php b/apps/src/Twig/Runtime/CastingExtensionRuntime.php index a6c8131cd..ee641463b 100644 --- a/apps/src/Twig/Runtime/CastingExtensionRuntime.php +++ b/apps/src/Twig/Runtime/CastingExtensionRuntime.php @@ -33,13 +33,13 @@ public function series($data): array foreach ($data as $row) { if ($row->getRefSerie() instanceof Serie) { $id = $row->getRefSerie()->getId(); - $tab[$id] = $row; + $tab[$id] = $row->getRefSerie(); }elseif ($row->getRefEpisode() instanceof Episode) { $id = $row->getRefEpisode()->getRefseason()->getRefserie()->getId(); - $tab[$id] = $row; + $tab[$id] = $row->getRefEpisode()->getRefseason()->getRefserie(); }elseif ($row->getRefSeason() instanceof Season) { $id = $row->getRefSeason()->getRefserie()->getId(); - $tab[$id] = $row; + $tab[$id] = $row->getRefSeason()->getRefserie(); } } @@ -52,7 +52,7 @@ public function movies($data): array foreach ($data as $row) { if ($row->getRefMovie() instanceof Movie) { $id = $row->getRefMovie()->getId(); - $tab[$id] = $row; + $tab[$id] = $row->getRefMovie(); } } From 572bb173242515920067400f19b4e5f6a6539ba1 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 1 Jan 2026 11:23:02 +0100 Subject: [PATCH 32/50] =?UTF-8?q?fix:=20simplifier=20la=20boucle=20de=20re?= =?UTF-8?q?ndu=20des=20s=C3=A9ries=20et=20des=20films=20dans=20le=20templa?= =?UTF-8?q?te=20de=20la=20personne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../paragraphs/content/head-person.html.twig | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/apps/templates/paragraphs/content/head-person.html.twig b/apps/templates/paragraphs/content/head-person.html.twig index 53b362a5d..d6d3cbdc3 100644 --- a/apps/templates/paragraphs/content/head-person.html.twig +++ b/apps/templates/paragraphs/content/head-person.html.twig @@ -34,15 +34,9 @@ {% if series|length != 0 %}

    {{ 'Series'|trans }}

      - {% for row in series %} + {% for serie in series %}
    • - {% if row.refSerie is defined %} - {% include "teasers/serie.html.twig" with {'serie': row.refSerie} %} - {% elseif row.refSeason is defined %} - {% include "teasers/serie.html.twig" with {'serie': row.refSeason.refSerie} %} - {% else %} - {% include "teasers/serie.html.twig" with {'serie': row.refEpisode.refSeason.refSerie} %} - {% endif %} + {% include "teasers/serie.html.twig" with {'serie': serie} %}
    • {% endfor %}
    @@ -50,9 +44,9 @@ {% if movies|length != 0 %}

    {{ 'Movies'|trans }}

      - {% for row in movies %} + {% for movie in movies %}
    • - {% include "teasers/movie.html.twig" with {'movie': row.refMovie} %} + {% include "teasers/movie.html.twig" with {'movie': movie} %}
    • {% endfor %}
    From 40ce5ae2adbdc11e5ea9abcb3b9ab4a579f7ec7d Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 1 Jan 2026 11:45:21 +0100 Subject: [PATCH 33/50] =?UTF-8?q?fix:=20corriger=20le=20type=20de=20retour?= =?UTF-8?q?=20de=20la=20m=C3=A9thode=20setEntryToStringMethod=20dans=20Lin?= =?UTF-8?q?ksBlock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Block/LinksBlock.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/src/Block/LinksBlock.php b/apps/src/Block/LinksBlock.php index f558ace05..0d536525b 100644 --- a/apps/src/Block/LinksBlock.php +++ b/apps/src/Block/LinksBlock.php @@ -84,10 +84,15 @@ public function getFields(Block $block, string $pageName): mixed yield FormField::addColumn(12); $collectionField = CollectionField::new('links', new TranslatableMessage('Links')); $collectionField->setEntryToStringMethod( - function ($link): TranslatableMessage { + function ($link): string { unset($link); - return new TranslatableMessage('Link'); + $translatableMessage = new TranslatableMessage('Link'); + + return $this->translator->trans( + $translatableMessage->getMessage(), + $translatableMessage->getParameters() + ); } ); $collectionField->setFormTypeOption( From ce1d06d7f589ced752bc484b2dba29895e21aec8 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 1 Jan 2026 14:18:03 +0100 Subject: [PATCH 34/50] =?UTF-8?q?fix:=20corriger=20la=20m=C3=A9thode=20sup?= =?UTF-8?q?portsData=20pour=20v=C3=A9rifier=20le=20type=20d'entit=C3=A9=20?= =?UTF-8?q?dans=20EpisodeData?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Data/EpisodeData.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/src/Data/EpisodeData.php b/apps/src/Data/EpisodeData.php index e84c22d3f..ef5eaf834 100644 --- a/apps/src/Data/EpisodeData.php +++ b/apps/src/Data/EpisodeData.php @@ -18,6 +18,12 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getRefseason(), 'backdrop'); } + #[Override] + public function supportsData(object $entity): bool + { + return $entity instanceof Episode; + } + public function getDefaultImage(object $entity): ?string { return $entity->getImg(); From 3091177d9326baa57dd6325f993056cdefdfbee2 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sat, 3 Jan 2026 19:05:26 +0100 Subject: [PATCH 35/50] =?UTF-8?q?fix:=20ajuster=20la=20gestion=20des=20mes?= =?UTF-8?q?sages=20cron=20et=20r=C3=A9organiser=20le=20rendu=20des=20artis?= =?UTF-8?q?tes=20dans=20le=20template=20de=20la=20personne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Scheduler/CronSchedule.php | 2 +- .../paragraphs/content/person.html.twig | 22 +++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index 609f07fd0..f5e644a50 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -29,7 +29,7 @@ public function getSchedule(): Schedule RecurringMessage::cron('0 */1 * * *', new BanIpMessage()), RecurringMessage::cron('0 10 * * *', new UpdateSerieMessage()), RecurringMessage::cron('0 12 * * *', new NotificationMessage()), - RecurringMessage::cron('0 0 * * 6', new FilesMessage()), + // RecurringMessage::cron('0 0 * * 6', new FilesMessage()), // RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), ); $schedule->stateful($this->cache); diff --git a/apps/templates/paragraphs/content/person.html.twig b/apps/templates/paragraphs/content/person.html.twig index 6de35fd01..108ce0d17 100644 --- a/apps/templates/paragraphs/content/person.html.twig +++ b/apps/templates/paragraphs/content/person.html.twig @@ -1,13 +1,21 @@ {% use "elements.html.twig" %}
    -
      - {% for person in pagination %} -
    • - {% include "teasers/person.html.twig" with {'person': person} %} -
    • - {% endfor %} -
    +
    + {% if pagination|length == 0 %} +
    + {{ 'No artists match your search.'|trans }} +
    + {% else %} +
      + {% for person in pagination %} +
    • + {% include "teasers/person.html.twig" with {'person': person} %} +
    • + {% endfor %} +
    + {% endif %} +
    From 07259e4ed657fab4d54b2d3953978bb87f1cba32 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 8 Jan 2026 15:09:12 +0100 Subject: [PATCH 36/50] =?UTF-8?q?fix:=20supprimer=20les=20classes=20FilesM?= =?UTF-8?q?essage=20et=20FilesMessageHandler,=20et=20mettre=20=C3=A0=20jou?= =?UTF-8?q?r=20le=20planificateur=20cron=20pour=20utiliser=20DeleteOldFile?= =?UTF-8?q?Message?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Message/FilesMessage.php | 19 --------------- .../MessageHandler/FilesMessageHandler.php | 23 ------------------- apps/src/Scheduler/CronSchedule.php | 4 ++-- 3 files changed, 2 insertions(+), 44 deletions(-) delete mode 100644 apps/src/Message/FilesMessage.php delete mode 100644 apps/src/MessageHandler/FilesMessageHandler.php diff --git a/apps/src/Message/FilesMessage.php b/apps/src/Message/FilesMessage.php deleted file mode 100644 index 6da2094e7..000000000 --- a/apps/src/Message/FilesMessage.php +++ /dev/null @@ -1,19 +0,0 @@ -fileService->deletedFileByEntities(); - } -} diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index f5e644a50..169a3601d 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -3,7 +3,7 @@ namespace Labstag\Scheduler; use Labstag\Message\BanIpMessage; -use Labstag\Message\FilesMessage; +use Labstag\Message\DeleteOldFileMessage; use Labstag\Message\MetaAllMessage; use Labstag\Message\NotificationMessage; use Labstag\Message\UpdateSerieMessage; @@ -29,7 +29,7 @@ public function getSchedule(): Schedule RecurringMessage::cron('0 */1 * * *', new BanIpMessage()), RecurringMessage::cron('0 10 * * *', new UpdateSerieMessage()), RecurringMessage::cron('0 12 * * *', new NotificationMessage()), - // RecurringMessage::cron('0 0 * * 6', new FilesMessage()), + // RecurringMessage::cron('0 0 * * 6', new DeleteOldFileMessage()), // RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), ); $schedule->stateful($this->cache); From 05483bda9612a78a4999debbecfa1d99a0b85743 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Thu, 8 Jan 2026 22:19:49 +0100 Subject: [PATCH 37/50] =?UTF-8?q?fix:=20mettre=20=C3=A0=20jour=20les=20map?= =?UTF-8?q?pings=20des=20champs=20uploadables=20pour=20les=20entit=C3=A9s?= =?UTF-8?q?=20Person,=20Saga=20et=20Serie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Entity/Person.php | 2 +- apps/src/Entity/Saga.php | 2 +- apps/src/Entity/Serie.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/src/Entity/Person.php b/apps/src/Entity/Person.php index e773a734c..53b50a07a 100644 --- a/apps/src/Entity/Person.php +++ b/apps/src/Entity/Person.php @@ -44,7 +44,7 @@ class Person )] protected ?bool $enable = null; - #[Vich\UploadableField(mapping: 'movie', fileNameProperty: 'profile')] + #[Vich\UploadableField(mapping: 'person', fileNameProperty: 'profile')] protected ?File $profileFile = null; #[Gedmo\Slug(fields: ['title'], updatable: true, unique: false)] diff --git a/apps/src/Entity/Saga.php b/apps/src/Entity/Saga.php index 06f99ab6e..3c79c99c4 100644 --- a/apps/src/Entity/Saga.php +++ b/apps/src/Entity/Saga.php @@ -31,7 +31,7 @@ class Saga implements Stringable, EntityWithParagraphsInterface #[ORM\Column(length: 255, nullable: true)] protected ?string $backdrop = null; - #[Vich\UploadableField(mapping: 'movie', fileNameProperty: 'backdrop')] + #[Vich\UploadableField(mapping: 'saga', fileNameProperty: 'backdrop')] protected ?File $backdropFile = null; #[ORM\Column(type: Types::TEXT, nullable: true)] diff --git a/apps/src/Entity/Serie.php b/apps/src/Entity/Serie.php index 2c3fc1569..2b84aee6c 100644 --- a/apps/src/Entity/Serie.php +++ b/apps/src/Entity/Serie.php @@ -33,7 +33,7 @@ class Serie implements Stringable, EntityWithParagraphsInterface #[ORM\Column(length: 255, nullable: true)] protected ?string $backdrop = null; - #[Vich\UploadableField(mapping: 'movie', fileNameProperty: 'backdrop')] + #[Vich\UploadableField(mapping: 'serie', fileNameProperty: 'backdrop')] protected ?File $backdropFile = null; /** From 801687e7ae454e2339073edcfd3d54fa69596a00 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Tue, 13 Jan 2026 11:45:50 +0100 Subject: [PATCH 38/50] Enable the DeleteOldFileMessage cron job for weekly execution on Saturdays --- apps/composer.json | 8 +- apps/composer.lock | 774 +++++----- apps/config/reference.php | 2144 ++++++++++++++------------- apps/src/Scheduler/CronSchedule.php | 2 +- 4 files changed, 1418 insertions(+), 1510 deletions(-) diff --git a/apps/composer.json b/apps/composer.json index c8f0ba352..d92c8a661 100755 --- a/apps/composer.json +++ b/apps/composer.json @@ -10,7 +10,7 @@ "ext-ctype": "*", "ext-iconv": "*", "beberlei/doctrineextensions": "1.5.*", - "doctrine/doctrine-bundle": "3.1.*", + "doctrine/doctrine-bundle": "3.2.*", "doctrine/doctrine-migrations-bundle": "4.0.*", "doctrine/orm": "^3.5", "dragonmantank/cron-expression": "3.6.*", @@ -21,12 +21,12 @@ "knplabs/knp-menu-bundle": "3.7.*", "knplabs/knp-paginator-bundle": "6.10.*", "league/flysystem-bundle": "3.6.*", - "liip/imagine-bundle": "2.16.*", + "liip/imagine-bundle": "2.17.*", "matomo/device-detector": "6.4.*", "mpdf/mpdf": "8.2.*", "nelmio/cors-bundle": "2.6.*", "nesbot/carbon": "3.11.*", - "phpoffice/phpspreadsheet": "5.3.*", + "phpoffice/phpspreadsheet": "5.4.*", "spatie/schema-org": "3.23.*", "symfony/apache-pack": "1.0.*", "symfony/bluesky-notifier": "8.0.*", @@ -142,7 +142,7 @@ "phpstan/phpstan-phpunit": "2.0.*", "phpstan/phpstan-symfony": "2.0.*", "phpunit/phpunit": "12.5.*", - "rector/rector": "2.2.*", + "rector/rector": "2.3.*", "smknstd/fakerphp-picsum-images": "1.0.*", "squizlabs/php_codesniffer": "4.0.*", "symfony/browser-kit": "8.0.*", diff --git a/apps/composer.lock b/apps/composer.lock index 5115e7f6d..1d0206831 100755 --- a/apps/composer.lock +++ b/apps/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cd2591adfe57ef6379b8ac7d8bc305c3", + "content-hash": "f7331e18389057c4a50e5e01b5a5e436", "packages": [ { "name": "beberlei/doctrineextensions", @@ -218,16 +218,16 @@ }, { "name": "doctrine/collections", - "version": "2.4.0", + "version": "2.5.1", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "9acfeea2e8666536edff3d77c531261c63680160" + "reference": "171e68db4b9aca9dc1f5d49925762f3d53d248c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/9acfeea2e8666536edff3d77c531261c63680160", - "reference": "9acfeea2e8666536edff3d77c531261c63680160", + "url": "https://api.github.com/repos/doctrine/collections/zipball/171e68db4b9aca9dc1f5d49925762f3d53d248c5", + "reference": "171e68db4b9aca9dc1f5d49925762f3d53d248c5", "shasum": "" }, "require": { @@ -284,7 +284,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.4.0" + "source": "https://github.com/doctrine/collections/tree/2.5.1" }, "funding": [ { @@ -300,7 +300,7 @@ "type": "tidelift" } ], - "time": "2025-10-25T09:18:13+00:00" + "time": "2026-01-12T20:53:55+00:00" }, { "name": "doctrine/dbal", @@ -458,16 +458,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "3.1.0", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "24417f4d508086e1a458cc7aea893853ba9e4423" + "reference": "af84173db6978c3d2688ea3bcf3a91720b0704ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/24417f4d508086e1a458cc7aea893853ba9e4423", - "reference": "24417f4d508086e1a458cc7aea893853ba9e4423", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/af84173db6978c3d2688ea3bcf3a91720b0704ce", + "reference": "af84173db6978c3d2688ea3bcf3a91720b0704ce", "shasum": "" }, "require": { @@ -486,7 +486,6 @@ }, "conflict": { "doctrine/orm": "<3.0 || >=4.0", - "symfony/var-exporter": "< 6.4.1 || 7.0.0", "twig/twig": "<3.0.4" }, "require-dev": { @@ -495,6 +494,7 @@ "phpstan/phpstan": "2.1.1", "phpstan/phpstan-phpunit": "2.0.3", "phpstan/phpstan-strict-rules": "^2", + "phpstan/phpstan-symfony": "^2.0", "phpunit/phpunit": "^12.3.10", "psr/log": "^3.0", "symfony/doctrine-messenger": "^6.4 || ^7.0 || ^8.0", @@ -506,7 +506,6 @@ "symfony/string": "^6.4 || ^7.0 || ^8.0", "symfony/twig-bridge": "^6.4 || ^7.0 || ^8.0", "symfony/validator": "^6.4 || ^7.0 || ^8.0", - "symfony/var-exporter": "^6.4.1 || ^7.0.1 || ^8.0", "symfony/web-profiler-bundle": "^6.4 || ^7.0 || ^8.0", "symfony/yaml": "^6.4 || ^7.0 || ^8.0", "twig/twig": "^3.21.1" @@ -554,7 +553,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/3.1.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/3.2.2" }, "funding": [ { @@ -570,7 +569,7 @@ "type": "tidelift" } ], - "time": "2025-11-28T22:34:19+00:00" + "time": "2025-12-24T12:24:29+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -847,30 +846,29 @@ }, { "name": "doctrine/instantiator", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/23da848e1a2308728fe5fdddabf4be17ff9720c7", + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^8.4" }, "require-dev": { - "doctrine/coding-standard": "^11", + "doctrine/coding-standard": "^14", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^5.4" + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5.58" }, "type": "library", "autoload": { @@ -897,7 +895,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + "source": "https://github.com/doctrine/instantiator/tree/2.1.0" }, "funding": [ { @@ -913,7 +911,7 @@ "type": "tidelift" } ], - "time": "2022-12-30T00:23:10+00:00" + "time": "2026-01-05T06:47:08+00:00" }, { "name": "doctrine/lexer", @@ -1097,16 +1095,16 @@ }, { "name": "doctrine/orm", - "version": "3.5.8", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "78dd074266e8b47a83bcf60ab5fe06c91a639168" + "reference": "2148940290e4c44b9101095707e71fb590832fa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/78dd074266e8b47a83bcf60ab5fe06c91a639168", - "reference": "78dd074266e8b47a83bcf60ab5fe06c91a639168", + "url": "https://api.github.com/repos/doctrine/orm/zipball/2148940290e4c44b9101095707e71fb590832fa5", + "reference": "2148940290e4c44b9101095707e71fb590832fa5", "shasum": "" }, "require": { @@ -1179,9 +1177,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.5.8" + "source": "https://github.com/doctrine/orm/tree/3.6.1" }, - "time": "2025-11-29T23:11:02+00:00" + "time": "2026-01-09T05:28:15+00:00" }, { "name": "doctrine/persistence", @@ -1397,16 +1395,16 @@ }, { "name": "easycorp/easyadmin-bundle", - "version": "v4.27.5", + "version": "v4.27.6", "source": { "type": "git", "url": "https://github.com/EasyCorp/EasyAdminBundle.git", - "reference": "4853f50f91ac6fe9b88e770292390b18fc61a1ef" + "reference": "ece70f2111f006262cd30af16dc10b1720704e10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/4853f50f91ac6fe9b88e770292390b18fc61a1ef", - "reference": "4853f50f91ac6fe9b88e770292390b18fc61a1ef", + "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/ece70f2111f006262cd30af16dc10b1720704e10", + "reference": "ece70f2111f006262cd30af16dc10b1720704e10", "shasum": "" }, "require": { @@ -1439,6 +1437,9 @@ "twig/html-extra": "^3.17", "twig/twig": "^3.20" }, + "conflict": { + "symfony/error-handler": "<5.4.35" + }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.4|3.5.x-dev|^4.0", "phpstan/extension-installer": "^1.4", @@ -1487,7 +1488,7 @@ ], "support": { "issues": "https://github.com/EasyCorp/EasyAdminBundle/issues", - "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.27.5" + "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.27.6" }, "funding": [ { @@ -1495,7 +1496,7 @@ "type": "github" } ], - "time": "2025-12-11T18:39:30+00:00" + "time": "2026-01-04T09:25:06+00:00" }, { "name": "egulias/email-validator", @@ -2027,16 +2028,16 @@ }, { "name": "imagine/imagine", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/php-imagine/Imagine.git", - "reference": "8b130cd281efdea67e52d5f0f998572eb62d2f04" + "reference": "f9ed796eefb77c2f0f2167e1d4e36bc2b5ed6b0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-imagine/Imagine/zipball/8b130cd281efdea67e52d5f0f998572eb62d2f04", - "reference": "8b130cd281efdea67e52d5f0f998572eb62d2f04", + "url": "https://api.github.com/repos/php-imagine/Imagine/zipball/f9ed796eefb77c2f0f2167e1d4e36bc2b5ed6b0c", + "reference": "f9ed796eefb77c2f0f2167e1d4e36bc2b5ed6b0c", "shasum": "" }, "require": { @@ -2083,9 +2084,9 @@ ], "support": { "issues": "https://github.com/php-imagine/Imagine/issues", - "source": "https://github.com/php-imagine/Imagine/tree/1.5.1" + "source": "https://github.com/php-imagine/Imagine/tree/1.5.2" }, - "time": "2025-12-09T15:27:47+00:00" + "time": "2026-01-09T10:45:12+00:00" }, { "name": "jms/metadata", @@ -2716,22 +2717,22 @@ }, { "name": "liip/imagine-bundle", - "version": "2.16.0", + "version": "2.17.1", "source": { "type": "git", "url": "https://github.com/liip/LiipImagineBundle.git", - "reference": "335121ef65d9841af9b40a850aa143cd6b61f847" + "reference": "69d2df3c6606495d1878fa190d6c3dc4bc5623b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/liip/LiipImagineBundle/zipball/335121ef65d9841af9b40a850aa143cd6b61f847", - "reference": "335121ef65d9841af9b40a850aa143cd6b61f847", + "url": "https://api.github.com/repos/liip/LiipImagineBundle/zipball/69d2df3c6606495d1878fa190d6c3dc4bc5623b6", + "reference": "69d2df3c6606495d1878fa190d6c3dc4bc5623b6", "shasum": "" }, "require": { "ext-mbstring": "*", "imagine/imagine": "^1.3.2", - "php": "^7.2|^8.0", + "php": "^8.0", "symfony/dependency-injection": "^5.4|^6.4|^7.4|^8.0", "symfony/deprecation-contracts": "^2.5 || ^3", "symfony/filesystem": "^5.4|^6.4|^7.3|^8.0", @@ -2760,6 +2761,7 @@ "symfony/form": "^5.4|^6.4|^7.3|^8.0", "symfony/messenger": "^5.4|^6.4|^7.3|^8.0", "symfony/phpunit-bridge": "^7.3", + "symfony/runtime": "^5.4|^6.4|^7.3|^8.0", "symfony/templating": "^5.4|^6.4|^7.3|^8.0", "symfony/validator": "^5.4|^6.4|^7.3|^8.0", "symfony/yaml": "^5.4|^6.4|^7.3|^8.0" @@ -2817,9 +2819,9 @@ ], "support": { "issues": "https://github.com/liip/LiipImagineBundle/issues", - "source": "https://github.com/liip/LiipImagineBundle/tree/2.16.0" + "source": "https://github.com/liip/LiipImagineBundle/tree/2.17.1" }, - "time": "2025-12-01T10:49:05+00:00" + "time": "2026-01-06T09:34:48+00:00" }, { "name": "maennchen/zipstream-php", @@ -3078,16 +3080,16 @@ }, { "name": "monolog/monolog", - "version": "3.9.0", + "version": "3.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", "shasum": "" }, "require": { @@ -3105,7 +3107,7 @@ "graylog2/gelf-php": "^1.4.2 || ^2.0", "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", + "mongodb/mongodb": "^1.8 || ^2.0", "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.8", "phpstan/phpstan": "^2", @@ -3165,7 +3167,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" }, "funding": [ { @@ -3177,7 +3179,7 @@ "type": "tidelift" } ], - "time": "2025-03-24T10:02:05+00:00" + "time": "2026-01-02T08:56:05+00:00" }, { "name": "mpdf/mpdf", @@ -3688,16 +3690,16 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "5.3.0", + "version": "5.4.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "4d597c1aacdde1805a33c525b9758113ea0d90df" + "reference": "48f2fe37d64c2dece0ef71fb2ac55497566782af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/4d597c1aacdde1805a33c525b9758113ea0d90df", - "reference": "4d597c1aacdde1805a33c525b9758113ea0d90df", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/48f2fe37d64c2dece0ef71fb2ac55497566782af", + "reference": "48f2fe37d64c2dece0ef71fb2ac55497566782af", "shasum": "" }, "require": { @@ -3705,6 +3707,7 @@ "ext-ctype": "*", "ext-dom": "*", "ext-fileinfo": "*", + "ext-filter": "*", "ext-gd": "*", "ext-iconv": "*", "ext-libxml": "*", @@ -3719,13 +3722,12 @@ "markbaker/complex": "^3.0", "markbaker/matrix": "^3.0", "php": "^8.1", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "dev-main", "dompdf/dompdf": "^2.0 || ^3.0", + "ext-intl": "*", "friendsofphp/php-cs-fixer": "^3.2", "mitoteam/jpgraph": "^10.5", "mpdf/mpdf": "^8.1.1", @@ -3739,7 +3741,7 @@ }, "suggest": { "dompdf/dompdf": "Option for rendering PDF with PDF Writer", - "ext-intl": "PHP Internationalization Functions, required for NumberFormat Wizard", + "ext-intl": "PHP Internationalization Functions, required for NumberFormat Wizard and StringHelper::setLocale()", "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", "mpdf/mpdf": "Option for rendering PDF with PDF Writer", "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" @@ -3772,6 +3774,9 @@ }, { "name": "Adrien Crivelli" + }, + { + "name": "Owen Leibman" } ], "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", @@ -3788,9 +3793,9 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.3.0" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.4.0" }, - "time": "2025-11-24T15:47:10+00:00" + "time": "2026-01-11T04:52:00+00:00" }, { "name": "psr/cache", @@ -3992,113 +3997,6 @@ }, "time": "2019-01-08T18:20:26+00:00" }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, { "name": "psr/http-message", "version": "2.0", @@ -4577,16 +4475,16 @@ }, { "name": "symfony/cache", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "0e67dc8145810d4e1c0d13c0e1d29ceb930b1c8e" + "reference": "ef8c7dbfe613d2773d0b5e68b2ef2db72c8b025f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/0e67dc8145810d4e1c0d13c0e1d29ceb930b1c8e", - "reference": "0e67dc8145810d4e1c0d13c0e1d29ceb930b1c8e", + "url": "https://api.github.com/repos/symfony/cache/zipball/ef8c7dbfe613d2773d0b5e68b2ef2db72c8b025f", + "reference": "ef8c7dbfe613d2773d0b5e68b2ef2db72c8b025f", "shasum": "" }, "require": { @@ -4653,7 +4551,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v8.0.1" + "source": "https://github.com/symfony/cache/tree/v8.0.3" }, "funding": [ { @@ -4673,7 +4571,7 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:17:06+00:00" + "time": "2025-12-28T10:45:32+00:00" }, { "name": "symfony/cache-contracts", @@ -4830,16 +4728,16 @@ }, { "name": "symfony/config", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "a5a054e613da565d46183a845ae4c0c996a3fbce" + "reference": "58063686fd7b8e676f14b5a4808cb85265c5216e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/a5a054e613da565d46183a845ae4c0c996a3fbce", - "reference": "a5a054e613da565d46183a845ae4c0c996a3fbce", + "url": "https://api.github.com/repos/symfony/config/zipball/58063686fd7b8e676f14b5a4808cb85265c5216e", + "reference": "58063686fd7b8e676f14b5a4808cb85265c5216e", "shasum": "" }, "require": { @@ -4884,7 +4782,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v8.0.1" + "source": "https://github.com/symfony/config/tree/v8.0.3" }, "funding": [ { @@ -4904,20 +4802,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/console", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fcb73f69d655b48fcb894a262f074218df08bd58" + "reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fcb73f69d655b48fcb894a262f074218df08bd58", - "reference": "fcb73f69d655b48fcb894a262f074218df08bd58", + "url": "https://api.github.com/repos/symfony/console/zipball/6145b304a5c1ea0bdbd0b04d297a5864f9a7d587", + "reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587", "shasum": "" }, "require": { @@ -4974,7 +4872,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.0.1" + "source": "https://github.com/symfony/console/tree/v8.0.3" }, "funding": [ { @@ -4994,20 +4892,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T15:25:33+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/dependency-injection", - "version": "v8.0.2", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "90f6c3364b8f444f85bdb6939664c80af9e0d576" + "reference": "8db0d4c1dd4c533a29210c68074999ba45ad6d3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/90f6c3364b8f444f85bdb6939664c80af9e0d576", - "reference": "90f6c3364b8f444f85bdb6939664c80af9e0d576", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8db0d4c1dd4c533a29210c68074999ba45ad6d3e", + "reference": "8db0d4c1dd4c533a29210c68074999ba45ad6d3e", "shasum": "" }, "require": { @@ -5055,7 +4953,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v8.0.2" + "source": "https://github.com/symfony/dependency-injection/tree/v8.0.3" }, "funding": [ { @@ -5075,7 +4973,7 @@ "type": "tidelift" } ], - "time": "2025-12-08T06:57:48+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5218,16 +5116,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "f57b37e61ab378bca98ffa038a786a24d574bec6" + "reference": "54d583fc3f855e0982f00eceb528fc0fa501f4c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/f57b37e61ab378bca98ffa038a786a24d574bec6", - "reference": "f57b37e61ab378bca98ffa038a786a24d574bec6", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/54d583fc3f855e0982f00eceb528fc0fa501f4c3", + "reference": "54d583fc3f855e0982f00eceb528fc0fa501f4c3", "shasum": "" }, "require": { @@ -5296,7 +5194,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v8.0.1" + "source": "https://github.com/symfony/doctrine-bridge/tree/v8.0.3" }, "funding": [ { @@ -5316,20 +5214,20 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:17:06+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "9d833a2f48966629956577a4acccbccfe37e9be3" + "reference": "08be96096e507c0cb03c1e0a0ad95b24f182840a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/9d833a2f48966629956577a4acccbccfe37e9be3", - "reference": "9d833a2f48966629956577a4acccbccfe37e9be3", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/08be96096e507c0cb03c1e0a0ad95b24f182840a", + "reference": "08be96096e507c0cb03c1e0a0ad95b24f182840a", "shasum": "" }, "require": { @@ -5372,7 +5270,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v8.0.1" + "source": "https://github.com/symfony/doctrine-messenger/tree/v8.0.3" }, "funding": [ { @@ -5392,7 +5290,7 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2025-12-16T08:10:18+00:00" }, { "name": "symfony/dotenv", @@ -5782,16 +5680,16 @@ }, { "name": "symfony/finder", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291" + "reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7598dd5770580fa3517ec83e8da0c9b9e01f4291", - "reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291", + "url": "https://api.github.com/repos/symfony/finder/zipball/dd3a2953570a283a2ba4e17063bb98c734cf5b12", + "reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12", "shasum": "" }, "require": { @@ -5826,7 +5724,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.0.0" + "source": "https://github.com/symfony/finder/tree/v8.0.3" }, "funding": [ { @@ -5846,7 +5744,7 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:36:47+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/flex", @@ -5923,16 +5821,16 @@ }, { "name": "symfony/form", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "02bd42a77e595298dcfef4ec259f4adda332fadb" + "reference": "a39b194d576bda0ac191a15e2d72b09ccc5c8f5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/02bd42a77e595298dcfef4ec259f4adda332fadb", - "reference": "02bd42a77e595298dcfef4ec259f4adda332fadb", + "url": "https://api.github.com/repos/symfony/form/zipball/a39b194d576bda0ac191a15e2d72b09ccc5c8f5f", + "reference": "a39b194d576bda0ac191a15e2d72b09ccc5c8f5f", "shasum": "" }, "require": { @@ -5994,7 +5892,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v8.0.1" + "source": "https://github.com/symfony/form/tree/v8.0.3" }, "funding": [ { @@ -6014,20 +5912,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/framework-bundle", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "194b5edd7a00703aaf836b56bbf079cd6c4d4a87" + "reference": "738a92519fbc3ac37192b28052574bf2d1e8f63a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/194b5edd7a00703aaf836b56bbf079cd6c4d4a87", - "reference": "194b5edd7a00703aaf836b56bbf079cd6c4d4a87", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/738a92519fbc3ac37192b28052574bf2d1e8f63a", + "reference": "738a92519fbc3ac37192b28052574bf2d1e8f63a", "shasum": "" }, "require": { @@ -6035,7 +5933,7 @@ "ext-xml": "*", "php": ">=8.4", "symfony/cache": "^7.4|^8.0", - "symfony/config": "^7.4|^8.0", + "symfony/config": "^7.4.3|^8.0.3", "symfony/dependency-injection": "^7.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^7.4|^8.0", @@ -6134,7 +6032,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v8.0.1" + "source": "https://github.com/symfony/framework-bundle/tree/v8.0.3" }, "funding": [ { @@ -6154,20 +6052,20 @@ "type": "tidelift" } ], - "time": "2025-12-06T16:55:34+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/http-client", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "727fda60d0aebfdfcc4c8bc4661f0cb8f44153c0" + "reference": "ea062691009cc2b7bb87734fef20e02671cbd50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/727fda60d0aebfdfcc4c8bc4661f0cb8f44153c0", - "reference": "727fda60d0aebfdfcc4c8bc4661f0cb8f44153c0", + "url": "https://api.github.com/repos/symfony/http-client/zipball/ea062691009cc2b7bb87734fef20e02671cbd50b", + "reference": "ea062691009cc2b7bb87734fef20e02671cbd50b", "shasum": "" }, "require": { @@ -6230,7 +6128,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v8.0.1" + "source": "https://github.com/symfony/http-client/tree/v8.0.3" }, "funding": [ { @@ -6250,7 +6148,7 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/http-client-contracts", @@ -6332,16 +6230,16 @@ }, { "name": "symfony/http-foundation", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "3690740e2e8b19d877f20d4f10b7a489cddf0fe2" + "reference": "514ec3aa7982f296b0ad0825f75b6be5779ae9e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3690740e2e8b19d877f20d4f10b7a489cddf0fe2", - "reference": "3690740e2e8b19d877f20d4f10b7a489cddf0fe2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/514ec3aa7982f296b0ad0825f75b6be5779ae9e7", + "reference": "514ec3aa7982f296b0ad0825f75b6be5779ae9e7", "shasum": "" }, "require": { @@ -6388,7 +6286,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v8.0.1" + "source": "https://github.com/symfony/http-foundation/tree/v8.0.3" }, "funding": [ { @@ -6408,20 +6306,20 @@ "type": "tidelift" } ], - "time": "2025-12-07T11:23:24+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/http-kernel", - "version": "v8.0.2", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "bcef77a3c8ae8934ce7067172e2a1a6491a62a7d" + "reference": "e6dfb348eb1dd4df14c39e6dc7e283bab4199fd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/bcef77a3c8ae8934ce7067172e2a1a6491a62a7d", - "reference": "bcef77a3c8ae8934ce7067172e2a1a6491a62a7d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e6dfb348eb1dd4df14c39e6dc7e283bab4199fd9", + "reference": "e6dfb348eb1dd4df14c39e6dc7e283bab4199fd9", "shasum": "" }, "require": { @@ -6492,7 +6390,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v8.0.2" + "source": "https://github.com/symfony/http-kernel/tree/v8.0.3" }, "funding": [ { @@ -6512,7 +6410,7 @@ "type": "tidelift" } ], - "time": "2025-12-08T07:59:34+00:00" + "time": "2025-12-31T09:29:34+00:00" }, { "name": "symfony/intl", @@ -6605,16 +6503,16 @@ }, { "name": "symfony/mailer", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "f9b546f0e28cbd08fd5d03f2472aad913a9398f9" + "reference": "02e033db6e00a42c66b8b8992e4e565ea7464a28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f9b546f0e28cbd08fd5d03f2472aad913a9398f9", - "reference": "f9b546f0e28cbd08fd5d03f2472aad913a9398f9", + "url": "https://api.github.com/repos/symfony/mailer/zipball/02e033db6e00a42c66b8b8992e4e565ea7464a28", + "reference": "02e033db6e00a42c66b8b8992e4e565ea7464a28", "shasum": "" }, "require": { @@ -6661,7 +6559,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v8.0.0" + "source": "https://github.com/symfony/mailer/tree/v8.0.3" }, "funding": [ { @@ -6681,7 +6579,7 @@ "type": "tidelift" } ], - "time": "2025-11-27T08:09:45+00:00" + "time": "2025-12-16T08:10:18+00:00" }, { "name": "symfony/mastodon-notifier", @@ -6759,16 +6657,16 @@ }, { "name": "symfony/messenger", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "c37b86c313e26291c5defe9194bcf31cbe630fbc" + "reference": "b56b89aee16ceb623f76c8739ab62202ec198190" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/c37b86c313e26291c5defe9194bcf31cbe630fbc", - "reference": "c37b86c313e26291c5defe9194bcf31cbe630fbc", + "url": "https://api.github.com/repos/symfony/messenger/zipball/b56b89aee16ceb623f76c8739ab62202ec198190", + "reference": "b56b89aee16ceb623f76c8739ab62202ec198190", "shasum": "" }, "require": { @@ -6823,7 +6721,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v8.0.0" + "source": "https://github.com/symfony/messenger/tree/v8.0.3" }, "funding": [ { @@ -6843,7 +6741,7 @@ "type": "tidelift" } ], - "time": "2025-11-06T11:20:17+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/mime", @@ -7983,16 +7881,16 @@ }, { "name": "symfony/process", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "a0a750500c4ce900d69ba4e9faf16f82c10ee149" + "reference": "0cbbd88ec836f8757641c651bb995335846abb78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/a0a750500c4ce900d69ba4e9faf16f82c10ee149", - "reference": "a0a750500c4ce900d69ba4e9faf16f82c10ee149", + "url": "https://api.github.com/repos/symfony/process/zipball/0cbbd88ec836f8757641c651bb995335846abb78", + "reference": "0cbbd88ec836f8757641c651bb995335846abb78", "shasum": "" }, "require": { @@ -8024,7 +7922,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v8.0.0" + "source": "https://github.com/symfony/process/tree/v8.0.3" }, "funding": [ { @@ -8044,25 +7942,25 @@ "type": "tidelift" } ], - "time": "2025-10-16T16:25:44+00:00" + "time": "2025-12-19T10:01:18+00:00" }, { "name": "symfony/property-access", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "74df691dfb7f9b161b7d8cd1695bb918c68f16b5" + "reference": "3e9ed5d66144e02f1f430ef3be8e166920ae5271" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/74df691dfb7f9b161b7d8cd1695bb918c68f16b5", - "reference": "74df691dfb7f9b161b7d8cd1695bb918c68f16b5", + "url": "https://api.github.com/repos/symfony/property-access/zipball/3e9ed5d66144e02f1f430ef3be8e166920ae5271", + "reference": "3e9ed5d66144e02f1f430ef3be8e166920ae5271", "shasum": "" }, "require": { "php": ">=8.4", - "symfony/property-info": "^7.4|^8.0" + "symfony/property-info": "^7.4.2|^8.0.3" }, "require-dev": { "symfony/cache": "^7.4|^8.0", @@ -8105,7 +8003,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v8.0.0" + "source": "https://github.com/symfony/property-access/tree/v8.0.3" }, "funding": [ { @@ -8125,20 +8023,20 @@ "type": "tidelift" } ], - "time": "2025-08-12T11:06:01+00:00" + "time": "2025-12-18T11:23:51+00:00" }, { "name": "symfony/property-info", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "afbad53529b39e4c48a3584d87d0afef2375ee31" + "reference": "a756f192435191bd50f55967adf999212c4a7232" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/afbad53529b39e4c48a3584d87d0afef2375ee31", - "reference": "afbad53529b39e4c48a3584d87d0afef2375ee31", + "url": "https://api.github.com/repos/symfony/property-info/zipball/a756f192435191bd50f55967adf999212c4a7232", + "reference": "a756f192435191bd50f55967adf999212c4a7232", "shasum": "" }, "require": { @@ -8191,7 +8089,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v8.0.1" + "source": "https://github.com/symfony/property-info/tree/v8.0.3" }, "funding": [ { @@ -8211,7 +8109,7 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2025-12-18T11:23:51+00:00" }, { "name": "symfony/rate-limiter", @@ -8365,16 +8263,16 @@ }, { "name": "symfony/routing", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "bc8fa314a61fb7c4190e964b18a5bd000d3b45ce" + "reference": "3827ac6e03dcd86e430fb6ae6056acf5b51aece3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/bc8fa314a61fb7c4190e964b18a5bd000d3b45ce", - "reference": "bc8fa314a61fb7c4190e964b18a5bd000d3b45ce", + "url": "https://api.github.com/repos/symfony/routing/zipball/3827ac6e03dcd86e430fb6ae6056acf5b51aece3", + "reference": "3827ac6e03dcd86e430fb6ae6056acf5b51aece3", "shasum": "" }, "require": { @@ -8421,7 +8319,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v8.0.1" + "source": "https://github.com/symfony/routing/tree/v8.0.3" }, "funding": [ { @@ -8441,7 +8339,7 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2025-12-19T10:01:18+00:00" }, { "name": "symfony/runtime", @@ -8713,16 +8611,16 @@ }, { "name": "symfony/security-core", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "a8e8cd91374f02c58e48d4d60ea30875179410b5" + "reference": "6df9d8439c682dd31974e3b455109c689622de49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/a8e8cd91374f02c58e48d4d60ea30875179410b5", - "reference": "a8e8cd91374f02c58e48d4d60ea30875179410b5", + "url": "https://api.github.com/repos/symfony/security-core/zipball/6df9d8439c682dd31974e3b455109c689622de49", + "reference": "6df9d8439c682dd31974e3b455109c689622de49", "shasum": "" }, "require": { @@ -8771,7 +8669,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v8.0.0" + "source": "https://github.com/symfony/security-core/tree/v8.0.3" }, "funding": [ { @@ -8791,20 +8689,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T08:09:45+00:00" + "time": "2025-12-21T10:59:45+00:00" }, { "name": "symfony/security-csrf", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "ee98194163a0acd06a8079de32f06cc8e03884f6" + "reference": "4f561535f9b61d72c422a8a9de49301d3846b98f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/ee98194163a0acd06a8079de32f06cc8e03884f6", - "reference": "ee98194163a0acd06a8079de32f06cc8e03884f6", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/4f561535f9b61d72c422a8a9de49301d3846b98f", + "reference": "4f561535f9b61d72c422a8a9de49301d3846b98f", "shasum": "" }, "require": { @@ -8842,7 +8740,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v8.0.0" + "source": "https://github.com/symfony/security-csrf/tree/v8.0.3" }, "funding": [ { @@ -8862,20 +8760,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T08:09:45+00:00" + "time": "2025-12-23T15:24:35+00:00" }, { "name": "symfony/security-http", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "6bd07ace6a4cf7f082bf6cf30f084068bdde07c8" + "reference": "6645f791db1ea7b2948c1d20c503adad9be0045d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/6bd07ace6a4cf7f082bf6cf30f084068bdde07c8", - "reference": "6bd07ace6a4cf7f082bf6cf30f084068bdde07c8", + "url": "https://api.github.com/repos/symfony/security-http/zipball/6645f791db1ea7b2948c1d20c503adad9be0045d", + "reference": "6645f791db1ea7b2948c1d20c503adad9be0045d", "shasum": "" }, "require": { @@ -8929,7 +8827,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v8.0.1" + "source": "https://github.com/symfony/security-http/tree/v8.0.3" }, "funding": [ { @@ -8949,7 +8847,7 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2025-12-21T10:59:45+00:00" }, { "name": "symfony/service-contracts", @@ -9268,16 +9166,16 @@ }, { "name": "symfony/translation", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "770e3b8b0ba8360958abedcabacd4203467333ca" + "reference": "60a8f11f0e15c48f2cc47c4da53873bb5b62135d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/770e3b8b0ba8360958abedcabacd4203467333ca", - "reference": "770e3b8b0ba8360958abedcabacd4203467333ca", + "url": "https://api.github.com/repos/symfony/translation/zipball/60a8f11f0e15c48f2cc47c4da53873bb5b62135d", + "reference": "60a8f11f0e15c48f2cc47c4da53873bb5b62135d", "shasum": "" }, "require": { @@ -9337,7 +9235,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v8.0.1" + "source": "https://github.com/symfony/translation/tree/v8.0.3" }, "funding": [ { @@ -9357,7 +9255,7 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2025-12-21T10:59:45+00:00" }, { "name": "symfony/translation-contracts", @@ -9443,16 +9341,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "a5d2d4fdd63a0c96fe9dd28e7c3cf21512689f7b" + "reference": "2a2978a44127bae9aaee0ed5319954eb492d81c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/a5d2d4fdd63a0c96fe9dd28e7c3cf21512689f7b", - "reference": "a5d2d4fdd63a0c96fe9dd28e7c3cf21512689f7b", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/2a2978a44127bae9aaee0ed5319954eb492d81c3", + "reference": "2a2978a44127bae9aaee0ed5319954eb492d81c3", "shasum": "" }, "require": { @@ -9525,7 +9423,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v8.0.1" + "source": "https://github.com/symfony/twig-bridge/tree/v8.0.3" }, "funding": [ { @@ -9545,20 +9443,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2025-12-16T08:10:18+00:00" }, { "name": "symfony/twig-bundle", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "4505b860fb07951521ae55eec43007eef67222a5" + "reference": "58c54c97af6a3fdb7ea9a3931ea1c4b8bd282b2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/4505b860fb07951521ae55eec43007eef67222a5", - "reference": "4505b860fb07951521ae55eec43007eef67222a5", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/58c54c97af6a3fdb7ea9a3931ea1c4b8bd282b2f", + "reference": "58c54c97af6a3fdb7ea9a3931ea1c4b8bd282b2f", "shasum": "" }, "require": { @@ -9609,7 +9507,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v8.0.0" + "source": "https://github.com/symfony/twig-bundle/tree/v8.0.3" }, "funding": [ { @@ -9629,7 +9527,7 @@ "type": "tidelift" } ], - "time": "2025-10-07T12:38:08+00:00" + "time": "2025-12-19T10:01:18+00:00" }, { "name": "symfony/type-info", @@ -9793,16 +9691,16 @@ }, { "name": "symfony/ux-twig-component", - "version": "v2.31.0", + "version": "v2.32.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "6f7ecc103cdb51adb6d76d32e374fcd1d33ff2fa" + "reference": "0a300088327d1b766733fdcd81ae4a77852d6177" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/6f7ecc103cdb51adb6d76d32e374fcd1d33ff2fa", - "reference": "6f7ecc103cdb51adb6d76d32e374fcd1d33ff2fa", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/0a300088327d1b766733fdcd81ae4a77852d6177", + "reference": "0a300088327d1b766733fdcd81ae4a77852d6177", "shasum": "" }, "require": { @@ -9856,7 +9754,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-twig-component/tree/v2.31.0" + "source": "https://github.com/symfony/ux-twig-component/tree/v2.32.0" }, "funding": [ { @@ -9876,20 +9774,20 @@ "type": "tidelift" } ], - "time": "2025-10-17T06:14:35+00:00" + "time": "2025-12-25T09:25:01+00:00" }, { "name": "symfony/validator", - "version": "v8.0.2", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "9a98d365b29a4f6116a2e2b6ca62d8a7179a86e1" + "reference": "d05d70f82c33581e8c2522d3c39cfe8c92f0b06a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/9a98d365b29a4f6116a2e2b6ca62d8a7179a86e1", - "reference": "9a98d365b29a4f6116a2e2b6ca62d8a7179a86e1", + "url": "https://api.github.com/repos/symfony/validator/zipball/d05d70f82c33581e8c2522d3c39cfe8c92f0b06a", + "reference": "d05d70f82c33581e8c2522d3c39cfe8c92f0b06a", "shasum": "" }, "require": { @@ -9950,7 +9848,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v8.0.2" + "source": "https://github.com/symfony/validator/tree/v8.0.3" }, "funding": [ { @@ -9970,20 +9868,20 @@ "type": "tidelift" } ], - "time": "2025-12-08T06:57:48+00:00" + "time": "2025-12-27T17:05:29+00:00" }, { "name": "symfony/var-dumper", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d2a2476c93b58ac5292145e9fac1ff76a21d1ce2" + "reference": "3bc368228532ad538cc216768caa8968be95a8d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d2a2476c93b58ac5292145e9fac1ff76a21d1ce2", - "reference": "d2a2476c93b58ac5292145e9fac1ff76a21d1ce2", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3bc368228532ad538cc216768caa8968be95a8d6", + "reference": "3bc368228532ad538cc216768caa8968be95a8d6", "shasum": "" }, "require": { @@ -10037,7 +9935,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v8.0.0" + "source": "https://github.com/symfony/var-dumper/tree/v8.0.3" }, "funding": [ { @@ -10057,7 +9955,7 @@ "type": "tidelift" } ], - "time": "2025-10-28T09:34:19+00:00" + "time": "2025-12-18T11:23:51+00:00" }, { "name": "symfony/var-exporter", @@ -10217,16 +10115,16 @@ }, { "name": "symfony/workflow", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/workflow.git", - "reference": "7aaded92cb25a22083e26a9e3813f69da7f18418" + "reference": "9c1905e6bb6229d58d54012400c8497960db89a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/workflow/zipball/7aaded92cb25a22083e26a9e3813f69da7f18418", - "reference": "7aaded92cb25a22083e26a9e3813f69da7f18418", + "url": "https://api.github.com/repos/symfony/workflow/zipball/9c1905e6bb6229d58d54012400c8497960db89a0", + "reference": "9c1905e6bb6229d58d54012400c8497960db89a0", "shasum": "" }, "require": { @@ -10283,7 +10181,7 @@ "workflow" ], "support": { - "source": "https://github.com/symfony/workflow/tree/v8.0.0" + "source": "https://github.com/symfony/workflow/tree/v8.0.3" }, "funding": [ { @@ -10303,7 +10201,7 @@ "type": "tidelift" } ], - "time": "2025-11-21T13:19:49+00:00" + "time": "2025-12-11T07:34:22+00:00" }, { "name": "symfony/yaml", @@ -11514,16 +11412,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.92.2", + "version": "v3.92.5", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "64fab3553dce507ce247f7d1a7d65f74ef658c3f" + "reference": "260cc8c4a1d2f6d2f22cd4f9c70aa72e55ebac58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/64fab3553dce507ce247f7d1a7d65f74ef658c3f", - "reference": "64fab3553dce507ce247f7d1a7d65f74ef658c3f", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/260cc8c4a1d2f6d2f22cd4f9c70aa72e55ebac58", + "reference": "260cc8c4a1d2f6d2f22cd4f9c70aa72e55ebac58", "shasum": "" }, "require": { @@ -11555,17 +11453,17 @@ }, "require-dev": { "facile-it/paraunit": "^1.3.1 || ^2.7", - "infection/infection": "^0.31.0", - "justinrainbow/json-schema": "^6.5", - "keradus/cli-executor": "^2.2", + "infection/infection": "^0.31", + "justinrainbow/json-schema": "^6.6", + "keradus/cli-executor": "^2.3", "mikey179/vfsstream": "^1.6.12", "php-coveralls/php-coveralls": "^2.9", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", + "phpunit/phpunit": "^9.6.31 || ^10.5.60 || ^11.5.46", "symfony/polyfill-php85": "^1.33", - "symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2 || ^8.0", - "symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2 || ^8.0" + "symfony/var-dumper": "^5.4.48 || ^6.4.26 || ^7.4.0 || ^8.0", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -11606,7 +11504,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.2" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.5" }, "funding": [ { @@ -11614,7 +11512,7 @@ "type": "github" } ], - "time": "2025-12-17T00:04:16+00:00" + "time": "2026-01-08T21:57:37+00:00" }, { "name": "mmo/faker-images", @@ -11674,16 +11572,16 @@ }, { "name": "nette/utils", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0" + "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", - "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", + "url": "https://api.github.com/repos/nette/utils/zipball/c99059c0315591f1a0db7ad6002000288ab8dc72", + "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72", "shasum": "" }, "require": { @@ -11757,9 +11655,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.0" + "source": "https://github.com/nette/utils/tree/v4.1.1" }, - "time": "2025-12-01T17:49:23+00:00" + "time": "2025-12-22T12:14:32+00:00" }, { "name": "nikic/php-parser", @@ -11939,16 +11837,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.0", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/16dbf9937da8d4528ceb2145c9c7c0bd29e26374", + "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374", "shasum": "" }, "require": { @@ -11980,9 +11878,9 @@ "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.3.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.1" }, - "time": "2025-08-30T15:50:23+00:00" + "time": "2026-01-12T11:33:04+00:00" }, { "name": "phpstan/phpstan", @@ -12208,16 +12106,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.10", + "version": "2.0.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "8d61a5854e7497d95bc85188e13537e99bd7aae7" + "reference": "5e30669bef866eff70db8b58d72a5c185aa82414" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/8d61a5854e7497d95bc85188e13537e99bd7aae7", - "reference": "8d61a5854e7497d95bc85188e13537e99bd7aae7", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/5e30669bef866eff70db8b58d72a5c185aa82414", + "reference": "5e30669bef866eff70db8b58d72a5c185aa82414", "shasum": "" }, "require": { @@ -12255,9 +12153,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.10" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.11" }, - "time": "2025-12-06T11:15:39+00:00" + "time": "2025-12-19T09:05:35+00:00" }, { "name": "phpstan/phpstan-symfony", @@ -12332,16 +12230,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.5.1", + "version": "12.5.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c467c59a4f6e04b942be422844e7a6352fa01b57" + "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c467c59a4f6e04b942be422844e7a6352fa01b57", - "reference": "c467c59a4f6e04b942be422844e7a6352fa01b57", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4a9739b51cbcb355f6e95659612f92e282a7077b", + "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b", "shasum": "" }, "require": { @@ -12356,7 +12254,7 @@ "sebastian/environment": "^8.0.3", "sebastian/lines-of-code": "^4.0", "sebastian/version": "^6.0", - "theseer/tokenizer": "^2.0" + "theseer/tokenizer": "^2.0.1" }, "require-dev": { "phpunit/phpunit": "^12.5.1" @@ -12397,7 +12295,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.1" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.2" }, "funding": [ { @@ -12417,7 +12315,7 @@ "type": "tidelift" } ], - "time": "2025-12-08T07:17:58+00:00" + "time": "2025-12-24T07:03:04+00:00" }, { "name": "phpunit/php-file-iterator", @@ -12843,16 +12741,16 @@ }, { "name": "react/child-process", - "version": "v0.6.6", + "version": "v0.6.7", "source": { "type": "git", "url": "https://github.com/reactphp/child-process.git", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/970f0e71945556422ee4570ccbabaedc3cf04ad3", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3", "shasum": "" }, "require": { @@ -12906,7 +12804,7 @@ ], "support": { "issues": "https://github.com/reactphp/child-process/issues", - "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + "source": "https://github.com/reactphp/child-process/tree/v0.6.7" }, "funding": [ { @@ -12914,7 +12812,7 @@ "type": "open_collective" } ], - "time": "2025-01-01T16:37:48+00:00" + "time": "2025-12-23T15:25:20+00:00" }, { "name": "react/dns", @@ -13297,16 +13195,16 @@ }, { "name": "rector/rector", - "version": "2.2.14", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "6d56bb0e94d4df4f57a78610550ac76ab403657d" + "reference": "f7166355dcf47482f27be59169b0825995f51c7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/6d56bb0e94d4df4f57a78610550ac76ab403657d", - "reference": "6d56bb0e94d4df4f57a78610550ac76ab403657d", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/f7166355dcf47482f27be59169b0825995f51c7d", + "reference": "f7166355dcf47482f27be59169b0825995f51c7d", "shasum": "" }, "require": { @@ -13345,7 +13243,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.2.14" + "source": "https://github.com/rectorphp/rector/tree/2.3.0" }, "funding": [ { @@ -13353,7 +13251,7 @@ "type": "github" } ], - "time": "2025-12-09T10:57:55+00:00" + "time": "2025-12-25T22:00:18+00:00" }, { "name": "sebastian/cli-parser", @@ -14449,16 +14347,16 @@ }, { "name": "symfony/browser-kit", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "b9758c6dfa7e821980bc5bb50812831e80060b2a" + "reference": "efc7cc6d442b80c8cb0ad0b29bdb0c9418cee9ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b9758c6dfa7e821980bc5bb50812831e80060b2a", - "reference": "b9758c6dfa7e821980bc5bb50812831e80060b2a", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/efc7cc6d442b80c8cb0ad0b29bdb0c9418cee9ee", + "reference": "efc7cc6d442b80c8cb0ad0b29bdb0c9418cee9ee", "shasum": "" }, "require": { @@ -14497,7 +14395,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v8.0.0" + "source": "https://github.com/symfony/browser-kit/tree/v8.0.3" }, "funding": [ { @@ -14517,7 +14415,7 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:36:47+00:00" + "time": "2025-12-16T08:10:18+00:00" }, { "name": "symfony/css-selector", @@ -14833,16 +14731,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "51b2adaf2cdb00cdab11e6b593e37ef76358e161" + "reference": "3c59b07980df5d4ae4a2620287016209802261ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/51b2adaf2cdb00cdab11e6b593e37ef76358e161", - "reference": "51b2adaf2cdb00cdab11e6b593e37ef76358e161", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/3c59b07980df5d4ae4a2620287016209802261ea", + "reference": "3c59b07980df5d4ae4a2620287016209802261ea", "shasum": "" }, "require": { @@ -14894,7 +14792,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.3" }, "funding": [ { @@ -14914,20 +14812,20 @@ "type": "tidelift" } ], - "time": "2025-10-29T07:48:08+00:00" + "time": "2025-12-10T13:10:54+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "82503c06aa67202092a3bc06c6ea6aaec53a2fd2" + "reference": "88679cfe4067bafb8df5d6defcaec061fe16af2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/82503c06aa67202092a3bc06c6ea6aaec53a2fd2", - "reference": "82503c06aa67202092a3bc06c6ea6aaec53a2fd2", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/88679cfe4067bafb8df5d6defcaec061fe16af2d", + "reference": "88679cfe4067bafb8df5d6defcaec061fe16af2d", "shasum": "" }, "require": { @@ -14979,7 +14877,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v8.0.0" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v8.0.3" }, "funding": [ { @@ -14999,28 +14897,28 @@ "type": "tidelift" } ], - "time": "2025-11-20T12:42:53+00:00" + "time": "2025-12-27T17:05:29+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "13.0.0", + "version": "13.0.4", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "24708c6673871e342245c692e1bb304f119ffc58" + "reference": "5c7e7a07e5d6a98b9dd2e6fc0a9155efb7c166c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/24708c6673871e342245c692e1bb304f119ffc58", - "reference": "24708c6673871e342245c692e1bb304f119ffc58", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/5c7e7a07e5d6a98b9dd2e6fc0a9155efb7c166c8", + "reference": "5c7e7a07e5d6a98b9dd2e6fc0a9155efb7c166c8", "shasum": "" }, "require": { "php": ">=7.2" }, "conflict": { - "friendsofphp/php-cs-fixer": "<3.46", - "phpcsstandards/php_codesniffer": "<3.8", + "friendsofphp/php-cs-fixer": "<3.92.4", + "phpcsstandards/php_codesniffer": "<4.0.1", "symplify/coding-standard": "<12.1" }, "suggest": { @@ -15048,7 +14946,7 @@ ], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/13.0.0" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/13.0.4" }, "funding": [ { @@ -15060,27 +14958,27 @@ "type": "github" } ], - "time": "2025-11-06T14:47:06+00:00" + "time": "2026-01-05T09:10:04+00:00" }, { "name": "symplify/phpstan-rules", - "version": "14.9.5", + "version": "14.9.11", "source": { "type": "git", "url": "https://github.com/symplify/phpstan-rules.git", - "reference": "8557736b5e7b8c10f68e6c6f0692b5dce305d307" + "reference": "5ea4bbd9357cba253aada506dd96d37d7069ac3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/phpstan-rules/zipball/8557736b5e7b8c10f68e6c6f0692b5dce305d307", - "reference": "8557736b5e7b8c10f68e6c6f0692b5dce305d307", + "url": "https://api.github.com/repos/symplify/phpstan-rules/zipball/5ea4bbd9357cba253aada506dd96d37d7069ac3b", + "reference": "5ea4bbd9357cba253aada506dd96d37d7069ac3b", "shasum": "" }, "require": { "nette/utils": "^3.2|^4.0", "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.22", - "webmozart/assert": "^1.11" + "phpstan/phpstan": "^2.1.33", + "webmozart/assert": "^1.12 || ^2.0" }, "type": "phpstan-extension", "extra": { @@ -15105,7 +15003,7 @@ "description": "Set of Symplify rules for PHPStan", "support": { "issues": "https://github.com/symplify/phpstan-rules/issues", - "source": "https://github.com/symplify/phpstan-rules/tree/14.9.5" + "source": "https://github.com/symplify/phpstan-rules/tree/14.9.11" }, "funding": [ { @@ -15117,7 +15015,7 @@ "type": "github" } ], - "time": "2025-12-08T15:34:48+00:00" + "time": "2026-01-05T13:53:59+00:00" }, { "name": "theseer/tokenizer", @@ -15171,23 +15069,23 @@ }, { "name": "webmozart/assert", - "version": "1.12.1", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + "reference": "bdbabc199a7ba9965484e4725d66170e5711323b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/bdbabc199a7ba9965484e4725d66170e5711323b", + "reference": "bdbabc199a7ba9965484e4725d66170e5711323b", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.2" }, "suggest": { "ext-intl": "", @@ -15197,7 +15095,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -15213,6 +15111,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -15223,9 +15125,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.1" + "source": "https://github.com/webmozarts/assert/tree/2.1.1" }, - "time": "2025-10-29T15:56:20+00:00" + "time": "2026-01-08T11:28:40+00:00" } ], "aliases": [], diff --git a/apps/config/reference.php b/apps/config/reference.php index ffa2e3ddc..db2d74416 100644 --- a/apps/config/reference.php +++ b/apps/config/reference.php @@ -4,6 +4,8 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator; +use Symfony\Component\Config\Loader\ParamConfigurator as Param; + /** * This class provides array-shapes for configuring the services and bundles of an application. * @@ -124,1558 +126,1562 @@ * } * @psalm-type ExtensionType = array * @psalm-type FrameworkConfig = array{ - * secret?: scalar|null, - * http_method_override?: bool, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false - * allowed_http_method_override?: list|null, - * trust_x_sendfile_type_header?: scalar|null, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" - * ide?: scalar|null, // Default: "%env(default::SYMFONY_IDE)%" - * test?: bool, - * default_locale?: scalar|null, // Default: "en" - * set_locale_from_accept_language?: bool, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false - * set_content_language_from_locale?: bool, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false - * enabled_locales?: list, - * trusted_hosts?: list, + * secret?: scalar|null|Param, + * http_method_override?: bool|Param, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false + * allowed_http_method_override?: list|null, + * trust_x_sendfile_type_header?: scalar|null|Param, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" + * ide?: scalar|null|Param, // Default: "%env(default::SYMFONY_IDE)%" + * test?: bool|Param, + * default_locale?: scalar|null|Param, // Default: "en" + * set_locale_from_accept_language?: bool|Param, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false + * set_content_language_from_locale?: bool|Param, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false + * enabled_locales?: list, + * trusted_hosts?: list, * trusted_proxies?: mixed, // Default: ["%env(default::SYMFONY_TRUSTED_PROXIES)%"] - * trusted_headers?: list, - * error_controller?: scalar|null, // Default: "error_controller" - * handle_all_throwables?: bool, // HttpKernel will handle all kinds of \Throwable. // Default: true + * trusted_headers?: list, + * error_controller?: scalar|null|Param, // Default: "error_controller" + * handle_all_throwables?: bool|Param, // HttpKernel will handle all kinds of \Throwable. // Default: true * csrf_protection?: bool|array{ - * enabled?: scalar|null, // Default: null - * stateless_token_ids?: list, - * check_header?: scalar|null, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false - * cookie_name?: scalar|null, // The name of the cookie to use when using stateless protection. // Default: "csrf-token" + * enabled?: scalar|null|Param, // Default: null + * stateless_token_ids?: list, + * check_header?: scalar|null|Param, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false + * cookie_name?: scalar|null|Param, // The name of the cookie to use when using stateless protection. // Default: "csrf-token" * }, * form?: bool|array{ // Form configuration - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * csrf_protection?: array{ - * enabled?: scalar|null, // Default: null - * token_id?: scalar|null, // Default: null - * field_name?: scalar|null, // Default: "_token" - * field_attr?: array, + * enabled?: scalar|null|Param, // Default: null + * token_id?: scalar|null|Param, // Default: null + * field_name?: scalar|null|Param, // Default: "_token" + * field_attr?: array, * }, * }, * http_cache?: bool|array{ // HTTP cache configuration - * enabled?: bool, // Default: false - * debug?: bool, // Default: "%kernel.debug%" - * trace_level?: "none"|"short"|"full", - * trace_header?: scalar|null, - * default_ttl?: int, - * private_headers?: list, - * skip_response_headers?: list, - * allow_reload?: bool, - * allow_revalidate?: bool, - * stale_while_revalidate?: int, - * stale_if_error?: int, - * terminate_on_cache_hit?: bool, + * enabled?: bool|Param, // Default: false + * debug?: bool|Param, // Default: "%kernel.debug%" + * trace_level?: "none"|"short"|"full"|Param, + * trace_header?: scalar|null|Param, + * default_ttl?: int|Param, + * private_headers?: list, + * skip_response_headers?: list, + * allow_reload?: bool|Param, + * allow_revalidate?: bool|Param, + * stale_while_revalidate?: int|Param, + * stale_if_error?: int|Param, + * terminate_on_cache_hit?: bool|Param, * }, * esi?: bool|array{ // ESI configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * ssi?: bool|array{ // SSI configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * fragments?: bool|array{ // Fragments configuration - * enabled?: bool, // Default: false - * hinclude_default_template?: scalar|null, // Default: null - * path?: scalar|null, // Default: "/_fragment" + * enabled?: bool|Param, // Default: false + * hinclude_default_template?: scalar|null|Param, // Default: null + * path?: scalar|null|Param, // Default: "/_fragment" * }, * profiler?: bool|array{ // Profiler configuration - * enabled?: bool, // Default: false - * collect?: bool, // Default: true - * collect_parameter?: scalar|null, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null - * only_exceptions?: bool, // Default: false - * only_main_requests?: bool, // Default: false - * dsn?: scalar|null, // Default: "file:%kernel.cache_dir%/profiler" - * collect_serializer_data?: true, // Default: true + * enabled?: bool|Param, // Default: false + * collect?: bool|Param, // Default: true + * collect_parameter?: scalar|null|Param, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null + * only_exceptions?: bool|Param, // Default: false + * only_main_requests?: bool|Param, // Default: false + * dsn?: scalar|null|Param, // Default: "file:%kernel.cache_dir%/profiler" + * collect_serializer_data?: true|Param, // Default: true * }, * workflows?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * workflows?: array, - * definition_validators?: list, - * support_strategy?: scalar|null, - * initial_marking?: list, - * events_to_dispatch?: list|null, + * supports?: list, + * definition_validators?: list, + * support_strategy?: scalar|null|Param, + * initial_marking?: list, + * events_to_dispatch?: list|null, * places?: list, * }>, * transitions: list, * to?: list, - * weight?: int, // Default: 1 + * weight?: int|Param, // Default: 1 * metadata?: list, * }>, * metadata?: list, * }>, * }, * router?: bool|array{ // Router configuration - * enabled?: bool, // Default: false - * resource: scalar|null, - * type?: scalar|null, - * default_uri?: scalar|null, // The default URI used to generate URLs in a non-HTTP context. // Default: null - * http_port?: scalar|null, // Default: 80 - * https_port?: scalar|null, // Default: 443 - * strict_requirements?: scalar|null, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true - * utf8?: bool, // Default: true + * enabled?: bool|Param, // Default: false + * resource: scalar|null|Param, + * type?: scalar|null|Param, + * default_uri?: scalar|null|Param, // The default URI used to generate URLs in a non-HTTP context. // Default: null + * http_port?: scalar|null|Param, // Default: 80 + * https_port?: scalar|null|Param, // Default: 443 + * strict_requirements?: scalar|null|Param, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true + * utf8?: bool|Param, // Default: true * }, * session?: bool|array{ // Session configuration - * enabled?: bool, // Default: false - * storage_factory_id?: scalar|null, // Default: "session.storage.factory.native" - * handler_id?: scalar|null, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null. - * name?: scalar|null, - * cookie_lifetime?: scalar|null, - * cookie_path?: scalar|null, - * cookie_domain?: scalar|null, - * cookie_secure?: true|false|"auto", // Default: "auto" - * cookie_httponly?: bool, // Default: true - * cookie_samesite?: null|"lax"|"strict"|"none", // Default: "lax" - * use_cookies?: bool, - * gc_divisor?: scalar|null, - * gc_probability?: scalar|null, - * gc_maxlifetime?: scalar|null, - * save_path?: scalar|null, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null. - * metadata_update_threshold?: int, // Seconds to wait between 2 session metadata updates. // Default: 0 + * enabled?: bool|Param, // Default: false + * storage_factory_id?: scalar|null|Param, // Default: "session.storage.factory.native" + * handler_id?: scalar|null|Param, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null. + * name?: scalar|null|Param, + * cookie_lifetime?: scalar|null|Param, + * cookie_path?: scalar|null|Param, + * cookie_domain?: scalar|null|Param, + * cookie_secure?: true|false|"auto"|Param, // Default: "auto" + * cookie_httponly?: bool|Param, // Default: true + * cookie_samesite?: null|"lax"|"strict"|"none"|Param, // Default: "lax" + * use_cookies?: bool|Param, + * gc_divisor?: scalar|null|Param, + * gc_probability?: scalar|null|Param, + * gc_maxlifetime?: scalar|null|Param, + * save_path?: scalar|null|Param, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null. + * metadata_update_threshold?: int|Param, // Seconds to wait between 2 session metadata updates. // Default: 0 * }, * request?: bool|array{ // Request configuration - * enabled?: bool, // Default: false - * formats?: array>, + * enabled?: bool|Param, // Default: false + * formats?: array>, * }, * assets?: bool|array{ // Assets configuration - * enabled?: bool, // Default: true - * strict_mode?: bool, // Throw an exception if an entry is missing from the manifest.json. // Default: false - * version_strategy?: scalar|null, // Default: null - * version?: scalar|null, // Default: null - * version_format?: scalar|null, // Default: "%%s?%%s" - * json_manifest_path?: scalar|null, // Default: null - * base_path?: scalar|null, // Default: "" - * base_urls?: list, + * enabled?: bool|Param, // Default: true + * strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false + * version_strategy?: scalar|null|Param, // Default: null + * version?: scalar|null|Param, // Default: null + * version_format?: scalar|null|Param, // Default: "%%s?%%s" + * json_manifest_path?: scalar|null|Param, // Default: null + * base_path?: scalar|null|Param, // Default: "" + * base_urls?: list, * packages?: array, + * strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false + * version_strategy?: scalar|null|Param, // Default: null + * version?: scalar|null|Param, + * version_format?: scalar|null|Param, // Default: null + * json_manifest_path?: scalar|null|Param, // Default: null + * base_path?: scalar|null|Param, // Default: "" + * base_urls?: list, * }>, * }, * asset_mapper?: bool|array{ // Asset Mapper configuration - * enabled?: bool, // Default: false - * paths?: array, - * excluded_patterns?: list, - * exclude_dotfiles?: bool, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true - * server?: bool, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true - * public_prefix?: scalar|null, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/" - * missing_import_mode?: "strict"|"warn"|"ignore", // Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. // Default: "warn" - * extensions?: array, - * importmap_path?: scalar|null, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php" - * importmap_polyfill?: scalar|null, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims" - * importmap_script_attributes?: array, - * vendor_dir?: scalar|null, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor" + * enabled?: bool|Param, // Default: false + * paths?: array, + * excluded_patterns?: list, + * exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true + * server?: bool|Param, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true + * public_prefix?: scalar|null|Param, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/" + * missing_import_mode?: "strict"|"warn"|"ignore"|Param, // Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. // Default: "warn" + * extensions?: array, + * importmap_path?: scalar|null|Param, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php" + * importmap_polyfill?: scalar|null|Param, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims" + * importmap_script_attributes?: array, + * vendor_dir?: scalar|null|Param, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor" * precompress?: bool|array{ // Precompress assets with Brotli, Zstandard and gzip. - * enabled?: bool, // Default: false - * formats?: list, - * extensions?: list, + * enabled?: bool|Param, // Default: false + * formats?: list, + * extensions?: list, * }, * }, * translator?: bool|array{ // Translator configuration - * enabled?: bool, // Default: true - * fallbacks?: list, - * logging?: bool, // Default: false - * formatter?: scalar|null, // Default: "translator.formatter.default" - * cache_dir?: scalar|null, // Default: "%kernel.cache_dir%/translations" - * default_path?: scalar|null, // The default path used to load translations. // Default: "%kernel.project_dir%/translations" - * paths?: list, + * enabled?: bool|Param, // Default: true + * fallbacks?: list, + * logging?: bool|Param, // Default: false + * formatter?: scalar|null|Param, // Default: "translator.formatter.default" + * cache_dir?: scalar|null|Param, // Default: "%kernel.cache_dir%/translations" + * default_path?: scalar|null|Param, // The default path used to load translations. // Default: "%kernel.project_dir%/translations" + * paths?: list, * pseudo_localization?: bool|array{ - * enabled?: bool, // Default: false - * accents?: bool, // Default: true - * expansion_factor?: float, // Default: 1.0 - * brackets?: bool, // Default: true - * parse_html?: bool, // Default: false - * localizable_html_attributes?: list, + * enabled?: bool|Param, // Default: false + * accents?: bool|Param, // Default: true + * expansion_factor?: float|Param, // Default: 1.0 + * brackets?: bool|Param, // Default: true + * parse_html?: bool|Param, // Default: false + * localizable_html_attributes?: list, * }, * providers?: array, - * locales?: list, + * dsn?: scalar|null|Param, + * domains?: list, + * locales?: list, * }>, * globals?: array, - * domain?: string, + * message?: string|Param, + * parameters?: array, + * domain?: string|Param, * }>, * }, * validation?: bool|array{ // Validation configuration - * enabled?: bool, // Default: true - * enable_attributes?: bool, // Default: true - * static_method?: list, - * translation_domain?: scalar|null, // Default: "validators" - * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict", // Default: "html5" + * enabled?: bool|Param, // Default: true + * enable_attributes?: bool|Param, // Default: true + * static_method?: list, + * translation_domain?: scalar|null|Param, // Default: "validators" + * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict"|Param, // Default: "html5" * mapping?: array{ - * paths?: list, + * paths?: list, * }, * not_compromised_password?: bool|array{ - * enabled?: bool, // When disabled, compromised passwords will be accepted as valid. // Default: true - * endpoint?: scalar|null, // API endpoint for the NotCompromisedPassword Validator. // Default: null + * enabled?: bool|Param, // When disabled, compromised passwords will be accepted as valid. // Default: true + * endpoint?: scalar|null|Param, // API endpoint for the NotCompromisedPassword Validator. // Default: null * }, - * disable_translation?: bool, // Default: false + * disable_translation?: bool|Param, // Default: false * auto_mapping?: array, + * services?: list, * }>, * }, * serializer?: bool|array{ // Serializer configuration - * enabled?: bool, // Default: false - * enable_attributes?: bool, // Default: true - * name_converter?: scalar|null, - * circular_reference_handler?: scalar|null, - * max_depth_handler?: scalar|null, + * enabled?: bool|Param, // Default: false + * enable_attributes?: bool|Param, // Default: true + * name_converter?: scalar|null|Param, + * circular_reference_handler?: scalar|null|Param, + * max_depth_handler?: scalar|null|Param, * mapping?: array{ - * paths?: list, + * paths?: list, * }, * default_context?: list, * named_serializers?: array, - * include_built_in_normalizers?: bool, // Whether to include the built-in normalizers // Default: true - * include_built_in_encoders?: bool, // Whether to include the built-in encoders // Default: true + * include_built_in_normalizers?: bool|Param, // Whether to include the built-in normalizers // Default: true + * include_built_in_encoders?: bool|Param, // Whether to include the built-in encoders // Default: true * }>, * }, * property_access?: bool|array{ // Property access configuration - * enabled?: bool, // Default: true - * magic_call?: bool, // Default: false - * magic_get?: bool, // Default: true - * magic_set?: bool, // Default: true - * throw_exception_on_invalid_index?: bool, // Default: false - * throw_exception_on_invalid_property_path?: bool, // Default: true + * enabled?: bool|Param, // Default: true + * magic_call?: bool|Param, // Default: false + * magic_get?: bool|Param, // Default: true + * magic_set?: bool|Param, // Default: true + * throw_exception_on_invalid_index?: bool|Param, // Default: false + * throw_exception_on_invalid_property_path?: bool|Param, // Default: true * }, * type_info?: bool|array{ // Type info configuration - * enabled?: bool, // Default: true - * aliases?: array, + * enabled?: bool|Param, // Default: true + * aliases?: array, * }, * property_info?: bool|array{ // Property info configuration - * enabled?: bool, // Default: true - * with_constructor_extractor?: bool, // Registers the constructor extractor. // Default: true + * enabled?: bool|Param, // Default: true + * with_constructor_extractor?: bool|Param, // Registers the constructor extractor. // Default: true * }, * cache?: array{ // Cache configuration - * prefix_seed?: scalar|null, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%" - * app?: scalar|null, // App related cache pools configuration. // Default: "cache.adapter.filesystem" - * system?: scalar|null, // System related cache pools configuration. // Default: "cache.adapter.system" - * directory?: scalar|null, // Default: "%kernel.share_dir%/pools/app" - * default_psr6_provider?: scalar|null, - * default_redis_provider?: scalar|null, // Default: "redis://localhost" - * default_valkey_provider?: scalar|null, // Default: "valkey://localhost" - * default_memcached_provider?: scalar|null, // Default: "memcached://localhost" - * default_doctrine_dbal_provider?: scalar|null, // Default: "database_connection" - * default_pdo_provider?: scalar|null, // Default: null + * prefix_seed?: scalar|null|Param, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%" + * app?: scalar|null|Param, // App related cache pools configuration. // Default: "cache.adapter.filesystem" + * system?: scalar|null|Param, // System related cache pools configuration. // Default: "cache.adapter.system" + * directory?: scalar|null|Param, // Default: "%kernel.share_dir%/pools/app" + * default_psr6_provider?: scalar|null|Param, + * default_redis_provider?: scalar|null|Param, // Default: "redis://localhost" + * default_valkey_provider?: scalar|null|Param, // Default: "valkey://localhost" + * default_memcached_provider?: scalar|null|Param, // Default: "memcached://localhost" + * default_doctrine_dbal_provider?: scalar|null|Param, // Default: "database_connection" + * default_pdo_provider?: scalar|null|Param, // Default: null * pools?: array, - * tags?: scalar|null, // Default: null - * public?: bool, // Default: false - * default_lifetime?: scalar|null, // Default lifetime of the pool. - * provider?: scalar|null, // Overwrite the setting from the default provider for this adapter. - * early_expiration_message_bus?: scalar|null, - * clearer?: scalar|null, + * adapters?: list, + * tags?: scalar|null|Param, // Default: null + * public?: bool|Param, // Default: false + * default_lifetime?: scalar|null|Param, // Default lifetime of the pool. + * provider?: scalar|null|Param, // Overwrite the setting from the default provider for this adapter. + * early_expiration_message_bus?: scalar|null|Param, + * clearer?: scalar|null|Param, * }>, * }, * php_errors?: array{ // PHP errors handling configuration * log?: mixed, // Use the application logger instead of the PHP logger for logging PHP errors. // Default: true - * throw?: bool, // Throw PHP errors as \ErrorException instances. // Default: true + * throw?: bool|Param, // Throw PHP errors as \ErrorException instances. // Default: true * }, * exceptions?: array, * web_link?: bool|array{ // Web links configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * lock?: bool|string|array{ // Lock configuration - * enabled?: bool, // Default: false - * resources?: array>, + * enabled?: bool|Param, // Default: false + * resources?: array>, * }, * semaphore?: bool|string|array{ // Semaphore configuration - * enabled?: bool, // Default: false - * resources?: array, + * enabled?: bool|Param, // Default: false + * resources?: array, * }, * messenger?: bool|array{ // Messenger configuration - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * routing?: array, + * senders?: list, * }>, * serializer?: array{ - * default_serializer?: scalar|null, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" + * default_serializer?: scalar|null|Param, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" * symfony_serializer?: array{ - * format?: scalar|null, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json" + * format?: scalar|null|Param, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json" * context?: array, * }, * }, * transports?: array, - * failure_transport?: scalar|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * failure_transport?: scalar|null|Param, // Transport name to send failed messages to (after all retries have failed). // Default: null * retry_strategy?: string|array{ - * service?: scalar|null, // Service id to override the retry strategy entirely. // Default: null - * max_retries?: int, // Default: 3 - * delay?: int, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 - * multiplier?: float, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2 - * max_delay?: int, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 - * jitter?: float, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1 + * service?: scalar|null|Param, // Service id to override the retry strategy entirely. // Default: null + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1 * }, - * rate_limiter?: scalar|null, // Rate limiter name to use when processing messages. // Default: null + * rate_limiter?: scalar|null|Param, // Rate limiter name to use when processing messages. // Default: null * }>, - * failure_transport?: scalar|null, // Transport name to send failed messages to (after all retries have failed). // Default: null - * stop_worker_on_signals?: list, - * default_bus?: scalar|null, // Default: null + * failure_transport?: scalar|null|Param, // Transport name to send failed messages to (after all retries have failed). // Default: null + * stop_worker_on_signals?: list, + * default_bus?: scalar|null|Param, // Default: null * buses?: array, * }>, * }>, * }, * scheduler?: bool|array{ // Scheduler configuration - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * }, - * disallow_search_engine_index?: bool, // Enabled by default when debug is enabled. // Default: true + * disallow_search_engine_index?: bool|Param, // Enabled by default when debug is enabled. // Default: true * http_client?: bool|array{ // HTTP Client configuration - * enabled?: bool, // Default: true - * max_host_connections?: int, // The maximum number of connections to a single host. + * enabled?: bool|Param, // Default: true + * max_host_connections?: int|Param, // The maximum number of connections to a single host. * default_options?: array{ * headers?: array, * vars?: array, - * max_redirects?: int, // The maximum number of redirects to follow. - * http_version?: scalar|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. - * resolve?: array, - * proxy?: scalar|null, // The URL of the proxy to pass requests through or null for automatic detection. - * no_proxy?: scalar|null, // A comma separated list of hosts that do not require a proxy to be reached. - * timeout?: float, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. - * max_duration?: float, // The maximum execution time for the request+response as a whole. - * bindto?: scalar|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. - * verify_peer?: bool, // Indicates if the peer should be verified in a TLS context. - * verify_host?: bool, // Indicates if the host should exist as a certificate common name. - * cafile?: scalar|null, // A certificate authority file. - * capath?: scalar|null, // A directory that contains multiple certificate authority files. - * local_cert?: scalar|null, // A PEM formatted certificate file. - * local_pk?: scalar|null, // A private key file. - * passphrase?: scalar|null, // The passphrase used to encrypt the "local_pk" file. - * ciphers?: scalar|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|null|Param, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|null|Param, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|null|Param, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|null|Param, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|null|Param, // A certificate authority file. + * capath?: scalar|null|Param, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|null|Param, // A PEM formatted certificate file. + * local_pk?: scalar|null|Param, // A private key file. + * passphrase?: scalar|null|Param, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|null|Param, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). * sha1?: mixed, * pin-sha256?: mixed, * md5?: mixed, * }, - * crypto_method?: scalar|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * crypto_method?: scalar|null|Param, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. * extra?: array, - * rate_limiter?: scalar|null, // Rate limiter name to use for throttling requests. // Default: null + * rate_limiter?: scalar|null|Param, // Rate limiter name to use for throttling requests. // Default: null * caching?: bool|array{ // Caching configuration. - * enabled?: bool, // Default: false - * cache_pool?: string, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" - * shared?: bool, // Indicates whether the cache is shared (public) or private. // Default: true - * max_ttl?: int, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null * }, * retry_failed?: bool|array{ - * enabled?: bool, // Default: false - * retry_strategy?: scalar|null, // service id to override the retry strategy. // Default: null + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|null|Param, // service id to override the retry strategy. // Default: null * http_codes?: array, + * code?: int|Param, + * methods?: list, * }>, - * max_retries?: int, // Default: 3 - * delay?: int, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 - * multiplier?: float, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 - * max_delay?: int, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 - * jitter?: float, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 * }, * }, - * mock_response_factory?: scalar|null, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. + * mock_response_factory?: scalar|null|Param, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. * scoped_clients?: array, + * scope?: scalar|null|Param, // The regular expression that the request URL must match before adding the other options. When none is provided, the base URI is used instead. + * base_uri?: scalar|null|Param, // The URI to resolve relative URLs, following rules in RFC 3985, section 2. + * auth_basic?: scalar|null|Param, // An HTTP Basic authentication "username:password". + * auth_bearer?: scalar|null|Param, // A token enabling HTTP Bearer authorization. + * auth_ntlm?: scalar|null|Param, // A "username:password" pair to use Microsoft NTLM authentication (requires the cURL extension). + * query?: array, * headers?: array, - * max_redirects?: int, // The maximum number of redirects to follow. - * http_version?: scalar|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. - * resolve?: array, - * proxy?: scalar|null, // The URL of the proxy to pass requests through or null for automatic detection. - * no_proxy?: scalar|null, // A comma separated list of hosts that do not require a proxy to be reached. - * timeout?: float, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. - * max_duration?: float, // The maximum execution time for the request+response as a whole. - * bindto?: scalar|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. - * verify_peer?: bool, // Indicates if the peer should be verified in a TLS context. - * verify_host?: bool, // Indicates if the host should exist as a certificate common name. - * cafile?: scalar|null, // A certificate authority file. - * capath?: scalar|null, // A directory that contains multiple certificate authority files. - * local_cert?: scalar|null, // A PEM formatted certificate file. - * local_pk?: scalar|null, // A private key file. - * passphrase?: scalar|null, // The passphrase used to encrypt the "local_pk" file. - * ciphers?: scalar|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...). + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|null|Param, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|null|Param, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|null|Param, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|null|Param, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|null|Param, // A certificate authority file. + * capath?: scalar|null|Param, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|null|Param, // A PEM formatted certificate file. + * local_pk?: scalar|null|Param, // A private key file. + * passphrase?: scalar|null|Param, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|null|Param, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...). * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). * sha1?: mixed, * pin-sha256?: mixed, * md5?: mixed, * }, - * crypto_method?: scalar|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * crypto_method?: scalar|null|Param, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. * extra?: array, - * rate_limiter?: scalar|null, // Rate limiter name to use for throttling requests. // Default: null + * rate_limiter?: scalar|null|Param, // Rate limiter name to use for throttling requests. // Default: null * caching?: bool|array{ // Caching configuration. - * enabled?: bool, // Default: false - * cache_pool?: string, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" - * shared?: bool, // Indicates whether the cache is shared (public) or private. // Default: true - * max_ttl?: int, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null * }, * retry_failed?: bool|array{ - * enabled?: bool, // Default: false - * retry_strategy?: scalar|null, // service id to override the retry strategy. // Default: null + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|null|Param, // service id to override the retry strategy. // Default: null * http_codes?: array, + * code?: int|Param, + * methods?: list, * }>, - * max_retries?: int, // Default: 3 - * delay?: int, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 - * multiplier?: float, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 - * max_delay?: int, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 - * jitter?: float, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 * }, * }>, * }, * mailer?: bool|array{ // Mailer configuration - * enabled?: bool, // Default: true - * message_bus?: scalar|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null - * dsn?: scalar|null, // Default: null - * transports?: array, + * enabled?: bool|Param, // Default: true + * message_bus?: scalar|null|Param, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * dsn?: scalar|null|Param, // Default: null + * transports?: array, * envelope?: array{ // Mailer Envelope configuration - * sender?: scalar|null, - * recipients?: list, - * allowed_recipients?: list, + * sender?: scalar|null|Param, + * recipients?: list, + * allowed_recipients?: list, * }, * headers?: array, * dkim_signer?: bool|array{ // DKIM signer configuration - * enabled?: bool, // Default: false - * key?: scalar|null, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: "" - * domain?: scalar|null, // Default: "" - * select?: scalar|null, // Default: "" - * passphrase?: scalar|null, // The private key passphrase // Default: "" + * enabled?: bool|Param, // Default: false + * key?: scalar|null|Param, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: "" + * domain?: scalar|null|Param, // Default: "" + * select?: scalar|null|Param, // Default: "" + * passphrase?: scalar|null|Param, // The private key passphrase // Default: "" * options?: array, * }, * smime_signer?: bool|array{ // S/MIME signer configuration - * enabled?: bool, // Default: false - * key?: scalar|null, // Path to key (in PEM format) // Default: "" - * certificate?: scalar|null, // Path to certificate (in PEM format without the `file://` prefix) // Default: "" - * passphrase?: scalar|null, // The private key passphrase // Default: null - * extra_certificates?: scalar|null, // Default: null - * sign_options?: int, // Default: null + * enabled?: bool|Param, // Default: false + * key?: scalar|null|Param, // Path to key (in PEM format) // Default: "" + * certificate?: scalar|null|Param, // Path to certificate (in PEM format without the `file://` prefix) // Default: "" + * passphrase?: scalar|null|Param, // The private key passphrase // Default: null + * extra_certificates?: scalar|null|Param, // Default: null + * sign_options?: int|Param, // Default: null * }, * smime_encrypter?: bool|array{ // S/MIME encrypter configuration - * enabled?: bool, // Default: false - * repository?: scalar|null, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: "" - * cipher?: int, // A set of algorithms used to encrypt the message // Default: null + * enabled?: bool|Param, // Default: false + * repository?: scalar|null|Param, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: "" + * cipher?: int|Param, // A set of algorithms used to encrypt the message // Default: null * }, * }, * secrets?: bool|array{ - * enabled?: bool, // Default: true - * vault_directory?: scalar|null, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%" - * local_dotenv_file?: scalar|null, // Default: "%kernel.project_dir%/.env.%kernel.runtime_environment%.local" - * decryption_env_var?: scalar|null, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET" + * enabled?: bool|Param, // Default: true + * vault_directory?: scalar|null|Param, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%" + * local_dotenv_file?: scalar|null|Param, // Default: "%kernel.project_dir%/.env.%kernel.runtime_environment%.local" + * decryption_env_var?: scalar|null|Param, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET" * }, * notifier?: bool|array{ // Notifier configuration - * enabled?: bool, // Default: true - * message_bus?: scalar|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null - * chatter_transports?: array, - * texter_transports?: array, - * notification_on_failed_messages?: bool, // Default: false - * channel_policy?: array>, + * enabled?: bool|Param, // Default: true + * message_bus?: scalar|null|Param, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * chatter_transports?: array, + * texter_transports?: array, + * notification_on_failed_messages?: bool|Param, // Default: false + * channel_policy?: array>, * admin_recipients?: list, * }, * rate_limiter?: bool|array{ // Rate limiter configuration - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * limiters?: array, - * limit?: int, // The maximum allowed hits in a fixed interval or burst. - * interval?: scalar|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * lock_factory?: scalar|null|Param, // The service ID of the lock factory used by this limiter (or null to disable locking). // Default: "auto" + * cache_pool?: scalar|null|Param, // The cache pool to use for storing the current limiter state. // Default: "cache.rate_limiter" + * storage_service?: scalar|null|Param, // The service ID of a custom storage implementation, this precedes any configured "cache_pool". // Default: null + * policy: "fixed_window"|"token_bucket"|"sliding_window"|"compound"|"no_limit"|Param, // The algorithm to be used by this limiter. + * limiters?: list, + * limit?: int|Param, // The maximum allowed hits in a fixed interval or burst. + * interval?: scalar|null|Param, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". - * interval?: scalar|null, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). - * amount?: int, // Amount of tokens to add each interval. // Default: 1 + * interval?: scalar|null|Param, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * amount?: int|Param, // Amount of tokens to add each interval. // Default: 1 * }, * }>, * }, * uid?: bool|array{ // Uid configuration - * enabled?: bool, // Default: true - * default_uuid_version?: 7|6|4|1, // Default: 7 - * name_based_uuid_version?: 5|3, // Default: 5 - * name_based_uuid_namespace?: scalar|null, - * time_based_uuid_version?: 7|6|1, // Default: 7 - * time_based_uuid_node?: scalar|null, + * enabled?: bool|Param, // Default: true + * default_uuid_version?: 7|6|4|1|Param, // Default: 7 + * name_based_uuid_version?: 5|3|Param, // Default: 5 + * name_based_uuid_namespace?: scalar|null|Param, + * time_based_uuid_version?: 7|6|1|Param, // Default: 7 + * time_based_uuid_node?: scalar|null|Param, * }, * html_sanitizer?: bool|array{ // HtmlSanitizer configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * sanitizers?: array, - * block_elements?: list, - * drop_elements?: list, + * block_elements?: list, + * drop_elements?: list, * allow_attributes?: array, * drop_attributes?: array, - * force_attributes?: array>, - * force_https_urls?: bool, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false - * allowed_link_schemes?: list, - * allowed_link_hosts?: list|null, - * allow_relative_links?: bool, // Allows relative URLs to be used in links href attributes. // Default: false - * allowed_media_schemes?: list, - * allowed_media_hosts?: list|null, - * allow_relative_medias?: bool, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false - * with_attribute_sanitizers?: list, - * without_attribute_sanitizers?: list, - * max_input_length?: int, // The maximum length allowed for the sanitized input. // Default: 0 + * force_attributes?: array>, + * force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false + * allowed_link_schemes?: list, + * allowed_link_hosts?: list|null, + * allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false + * allowed_media_schemes?: list, + * allowed_media_hosts?: list|null, + * allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false + * with_attribute_sanitizers?: list, + * without_attribute_sanitizers?: list, + * max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0 * }>, * }, * webhook?: bool|array{ // Webhook configuration - * enabled?: bool, // Default: false - * message_bus?: scalar|null, // The message bus to use. // Default: "messenger.default_bus" + * enabled?: bool|Param, // Default: false + * message_bus?: scalar|null|Param, // The message bus to use. // Default: "messenger.default_bus" * routing?: array, * }, * remote-event?: bool|array{ // RemoteEvent configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * json_streamer?: bool|array{ // JSON streamer configuration - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * } * @psalm-type DoctrineConfig = array{ * dbal?: array{ - * default_connection?: scalar|null, + * default_connection?: scalar|null|Param, * types?: array, - * driver_schemes?: array, + * driver_schemes?: array, * connections?: array, - * mapping_types?: array, - * default_table_options?: array, - * schema_manager_factory?: scalar|null, // Default: "doctrine.dbal.default_schema_manager_factory" - * result_cache?: scalar|null, + * mapping_types?: array, + * default_table_options?: array, + * schema_manager_factory?: scalar|null|Param, // Default: "doctrine.dbal.default_schema_manager_factory" + * result_cache?: scalar|null|Param, * replicas?: array, * }>, * }, * orm?: array{ - * default_entity_manager?: scalar|null, - * enable_native_lazy_objects?: bool, // Deprecated: The "enable_native_lazy_objects" option is deprecated and will be removed in DoctrineBundle 4.0, as native lazy objects are now always enabled. // Default: true + * default_entity_manager?: scalar|null|Param, + * enable_native_lazy_objects?: bool|Param, // Deprecated: The "enable_native_lazy_objects" option is deprecated and will be removed in DoctrineBundle 4.0, as native lazy objects are now always enabled. // Default: true * controller_resolver?: bool|array{ - * enabled?: bool, // Default: true - * auto_mapping?: bool, // Deprecated: The "auto_mapping" option is deprecated and will be removed in DoctrineBundle 4.0, as it only accepts `false` since 3.0. // Set to true to enable using route placeholders as lookup criteria when the primary key doesn't match the argument name // Default: false - * evict_cache?: bool, // Set to true to fetch the entity from the database instead of using the cache, if any // Default: false + * enabled?: bool|Param, // Default: true + * auto_mapping?: bool|Param, // Deprecated: The "doctrine.orm.controller_resolver.auto_mapping.auto_mapping" option is deprecated and will be removed in DoctrineBundle 4.0, as it only accepts `false` since 3.0. // Set to true to enable using route placeholders as lookup criteria when the primary key doesn't match the argument name // Default: false + * evict_cache?: bool|Param, // Set to true to fetch the entity from the database instead of using the cache, if any // Default: false * }, * entity_managers?: array, * }>, * }>, * }, - * connection?: scalar|null, - * class_metadata_factory_name?: scalar|null, // Default: "Doctrine\\ORM\\Mapping\\ClassMetadataFactory" - * default_repository_class?: scalar|null, // Default: "Doctrine\\ORM\\EntityRepository" - * auto_mapping?: scalar|null, // Default: false - * naming_strategy?: scalar|null, // Default: "doctrine.orm.naming_strategy.default" - * quote_strategy?: scalar|null, // Default: "doctrine.orm.quote_strategy.default" - * typed_field_mapper?: scalar|null, // Default: "doctrine.orm.typed_field_mapper.default" - * entity_listener_resolver?: scalar|null, // Default: null - * fetch_mode_subselect_batch_size?: scalar|null, - * repository_factory?: scalar|null, // Default: "doctrine.orm.container_repository_factory" - * schema_ignore_classes?: list, - * validate_xml_mapping?: bool, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.14 and will be mandatory in ORM 3.0. See https://github.com/doctrine/orm/pull/6728. // Default: false + * connection?: scalar|null|Param, + * class_metadata_factory_name?: scalar|null|Param, // Default: "Doctrine\\ORM\\Mapping\\ClassMetadataFactory" + * default_repository_class?: scalar|null|Param, // Default: "Doctrine\\ORM\\EntityRepository" + * auto_mapping?: scalar|null|Param, // Default: false + * naming_strategy?: scalar|null|Param, // Default: "doctrine.orm.naming_strategy.default" + * quote_strategy?: scalar|null|Param, // Default: "doctrine.orm.quote_strategy.default" + * typed_field_mapper?: scalar|null|Param, // Default: "doctrine.orm.typed_field_mapper.default" + * entity_listener_resolver?: scalar|null|Param, // Default: null + * fetch_mode_subselect_batch_size?: scalar|null|Param, + * repository_factory?: scalar|null|Param, // Default: "doctrine.orm.container_repository_factory" + * schema_ignore_classes?: list, + * validate_xml_mapping?: bool|Param, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.14 and will be mandatory in ORM 3.0. See https://github.com/doctrine/orm/pull/6728. // Default: false * second_level_cache?: array{ * region_cache_driver?: string|array{ - * type?: scalar|null, // Default: null - * id?: scalar|null, - * pool?: scalar|null, + * type?: scalar|null|Param, // Default: null + * id?: scalar|null|Param, + * pool?: scalar|null|Param, * }, - * region_lock_lifetime?: scalar|null, // Default: 60 - * log_enabled?: bool, // Default: true - * region_lifetime?: scalar|null, // Default: 3600 - * enabled?: bool, // Default: true - * factory?: scalar|null, + * region_lock_lifetime?: scalar|null|Param, // Default: 60 + * log_enabled?: bool|Param, // Default: true + * region_lifetime?: scalar|null|Param, // Default: 3600 + * enabled?: bool|Param, // Default: true + * factory?: scalar|null|Param, * regions?: array, * loggers?: array, * }, - * hydrators?: array, + * hydrators?: array, * mappings?: array, * dql?: array{ - * string_functions?: array, - * numeric_functions?: array, - * datetime_functions?: array, + * string_functions?: array, + * numeric_functions?: array, + * datetime_functions?: array, * }, * filters?: array, * }>, - * identity_generation_preferences?: array, + * identity_generation_preferences?: array, * }>, - * resolve_target_entities?: array, + * resolve_target_entities?: array, * }, * } * @psalm-type DoctrineMigrationsConfig = array{ - * enable_service_migrations?: bool, // Whether to enable fetching migrations from the service container. // Default: false - * migrations_paths?: array, - * services?: array, - * factories?: array, + * enable_service_migrations?: bool|Param, // Whether to enable fetching migrations from the service container. // Default: false + * migrations_paths?: array, + * services?: array, + * factories?: array, * storage?: array{ // Storage to use for migration status metadata. * table_storage?: array{ // The default metadata storage, implemented as a table in the database. - * table_name?: scalar|null, // Default: null - * version_column_name?: scalar|null, // Default: null - * version_column_length?: scalar|null, // Default: null - * executed_at_column_name?: scalar|null, // Default: null - * execution_time_column_name?: scalar|null, // Default: null + * table_name?: scalar|null|Param, // Default: null + * version_column_name?: scalar|null|Param, // Default: null + * version_column_length?: scalar|null|Param, // Default: null + * executed_at_column_name?: scalar|null|Param, // Default: null + * execution_time_column_name?: scalar|null|Param, // Default: null * }, * }, - * migrations?: list, - * connection?: scalar|null, // Connection name to use for the migrations database. // Default: null - * em?: scalar|null, // Entity manager name to use for the migrations database (available when doctrine/orm is installed). // Default: null - * all_or_nothing?: scalar|null, // Run all migrations in a transaction. // Default: false - * check_database_platform?: scalar|null, // Adds an extra check in the generated migrations to allow execution only on the same platform as they were initially generated on. // Default: true - * custom_template?: scalar|null, // Custom template path for generated migration classes. // Default: null - * organize_migrations?: scalar|null, // Organize migrations mode. Possible values are: "BY_YEAR", "BY_YEAR_AND_MONTH", false // Default: false - * enable_profiler?: bool, // Whether or not to enable the profiler collector to calculate and visualize migration status. This adds some queries overhead. // Default: false - * transactional?: bool, // Whether or not to wrap migrations in a single transaction. // Default: true + * migrations?: list, + * connection?: scalar|null|Param, // Connection name to use for the migrations database. // Default: null + * em?: scalar|null|Param, // Entity manager name to use for the migrations database (available when doctrine/orm is installed). // Default: null + * all_or_nothing?: scalar|null|Param, // Run all migrations in a transaction. // Default: false + * check_database_platform?: scalar|null|Param, // Adds an extra check in the generated migrations to allow execution only on the same platform as they were initially generated on. // Default: true + * custom_template?: scalar|null|Param, // Custom template path for generated migration classes. // Default: null + * organize_migrations?: scalar|null|Param, // Organize migrations mode. Possible values are: "BY_YEAR", "BY_YEAR_AND_MONTH", false // Default: false + * enable_profiler?: bool|Param, // Whether or not to enable the profiler collector to calculate and visualize migration status. This adds some queries overhead. // Default: false + * transactional?: bool|Param, // Whether or not to wrap migrations in a single transaction. // Default: true * } * @psalm-type TwigConfig = array{ - * form_themes?: list, + * form_themes?: list, * globals?: array, - * autoescape_service?: scalar|null, // Default: null - * autoescape_service_method?: scalar|null, // Default: null - * cache?: scalar|null, // Default: true - * charset?: scalar|null, // Default: "%kernel.charset%" - * debug?: bool, // Default: "%kernel.debug%" - * strict_variables?: bool, // Default: "%kernel.debug%" - * auto_reload?: scalar|null, - * optimizations?: int, - * default_path?: scalar|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" - * file_name_pattern?: list, + * autoescape_service?: scalar|null|Param, // Default: null + * autoescape_service_method?: scalar|null|Param, // Default: null + * cache?: scalar|null|Param, // Default: true + * charset?: scalar|null|Param, // Default: "%kernel.charset%" + * debug?: bool|Param, // Default: "%kernel.debug%" + * strict_variables?: bool|Param, // Default: "%kernel.debug%" + * auto_reload?: scalar|null|Param, + * optimizations?: int|Param, + * default_path?: scalar|null|Param, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" + * file_name_pattern?: list, * paths?: array, * date?: array{ // The default format options used by the date filter. - * format?: scalar|null, // Default: "F j, Y H:i" - * interval_format?: scalar|null, // Default: "%d days" - * timezone?: scalar|null, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null + * format?: scalar|null|Param, // Default: "F j, Y H:i" + * interval_format?: scalar|null|Param, // Default: "%d days" + * timezone?: scalar|null|Param, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null * }, * number_format?: array{ // The default format options for the number_format filter. - * decimals?: int, // Default: 0 - * decimal_point?: scalar|null, // Default: "." - * thousands_separator?: scalar|null, // Default: "," + * decimals?: int|Param, // Default: 0 + * decimal_point?: scalar|null|Param, // Default: "." + * thousands_separator?: scalar|null|Param, // Default: "," * }, * mailer?: array{ - * html_to_text_converter?: scalar|null, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null + * html_to_text_converter?: scalar|null|Param, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null * }, * } * @psalm-type SecurityConfig = array{ - * access_denied_url?: scalar|null, // Default: null - * session_fixation_strategy?: "none"|"migrate"|"invalidate", // Default: "migrate" - * expose_security_errors?: \Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::None|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::AccountStatus|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::All, // Default: "none" - * erase_credentials?: bool, // Default: true + * access_denied_url?: scalar|null|Param, // Default: null + * session_fixation_strategy?: "none"|"migrate"|"invalidate"|Param, // Default: "migrate" + * expose_security_errors?: \Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::None|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::AccountStatus|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::All|Param, // Default: "none" + * erase_credentials?: bool|Param, // Default: true * access_decision_manager?: array{ - * strategy?: "affirmative"|"consensus"|"unanimous"|"priority", - * service?: scalar|null, - * strategy_service?: scalar|null, - * allow_if_all_abstain?: bool, // Default: false - * allow_if_equal_granted_denied?: bool, // Default: true + * strategy?: "affirmative"|"consensus"|"unanimous"|"priority"|Param, + * service?: scalar|null|Param, + * strategy_service?: scalar|null|Param, + * allow_if_all_abstain?: bool|Param, // Default: false + * allow_if_equal_granted_denied?: bool|Param, // Default: true * }, * password_hashers?: array, - * hash_algorithm?: scalar|null, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" - * key_length?: scalar|null, // Default: 40 - * ignore_case?: bool, // Default: false - * encode_as_base64?: bool, // Default: true - * iterations?: scalar|null, // Default: 5000 - * cost?: int, // Default: null - * memory_cost?: scalar|null, // Default: null - * time_cost?: scalar|null, // Default: null - * id?: scalar|null, + * algorithm?: scalar|null|Param, + * migrate_from?: list, + * hash_algorithm?: scalar|null|Param, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" + * key_length?: scalar|null|Param, // Default: 40 + * ignore_case?: bool|Param, // Default: false + * encode_as_base64?: bool|Param, // Default: true + * iterations?: scalar|null|Param, // Default: 5000 + * cost?: int|Param, // Default: null + * memory_cost?: scalar|null|Param, // Default: null + * time_cost?: scalar|null|Param, // Default: null + * id?: scalar|null|Param, * }>, * providers?: array, + * providers?: list, * }, * entity?: array{ - * class: scalar|null, // The full entity class name of your user class. - * property?: scalar|null, // Default: null - * manager_name?: scalar|null, // Default: null + * class: scalar|null|Param, // The full entity class name of your user class. + * property?: scalar|null|Param, // Default: null + * manager_name?: scalar|null|Param, // Default: null * }, * memory?: array{ * users?: array, + * password?: scalar|null|Param, // Default: null + * roles?: list, * }>, * }, * ldap?: array{ - * service: scalar|null, - * base_dn: scalar|null, - * search_dn?: scalar|null, // Default: null - * search_password?: scalar|null, // Default: null - * extra_fields?: list, - * default_roles?: list, - * role_fetcher?: scalar|null, // Default: null - * uid_key?: scalar|null, // Default: "sAMAccountName" - * filter?: scalar|null, // Default: "({uid_key}={user_identifier})" - * password_attribute?: scalar|null, // Default: null + * service: scalar|null|Param, + * base_dn: scalar|null|Param, + * search_dn?: scalar|null|Param, // Default: null + * search_password?: scalar|null|Param, // Default: null + * extra_fields?: list, + * default_roles?: list, + * role_fetcher?: scalar|null|Param, // Default: null + * uid_key?: scalar|null|Param, // Default: "sAMAccountName" + * filter?: scalar|null|Param, // Default: "({uid_key}={user_identifier})" + * password_attribute?: scalar|null|Param, // Default: null * }, * }>, * firewalls: array, - * security?: bool, // Default: true - * user_checker?: scalar|null, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" - * request_matcher?: scalar|null, - * access_denied_url?: scalar|null, - * access_denied_handler?: scalar|null, - * entry_point?: scalar|null, // An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface". - * provider?: scalar|null, - * stateless?: bool, // Default: false - * lazy?: bool, // Default: false - * context?: scalar|null, + * pattern?: scalar|null|Param, + * host?: scalar|null|Param, + * methods?: list, + * security?: bool|Param, // Default: true + * user_checker?: scalar|null|Param, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" + * request_matcher?: scalar|null|Param, + * access_denied_url?: scalar|null|Param, + * access_denied_handler?: scalar|null|Param, + * entry_point?: scalar|null|Param, // An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface". + * provider?: scalar|null|Param, + * stateless?: bool|Param, // Default: false + * lazy?: bool|Param, // Default: false + * context?: scalar|null|Param, * logout?: array{ - * enable_csrf?: bool|null, // Default: null - * csrf_token_id?: scalar|null, // Default: "logout" - * csrf_parameter?: scalar|null, // Default: "_csrf_token" - * csrf_token_manager?: scalar|null, - * path?: scalar|null, // Default: "/logout" - * target?: scalar|null, // Default: "/" - * invalidate_session?: bool, // Default: true - * clear_site_data?: list<"*"|"cache"|"cookies"|"storage"|"executionContexts">, + * enable_csrf?: bool|null|Param, // Default: null + * csrf_token_id?: scalar|null|Param, // Default: "logout" + * csrf_parameter?: scalar|null|Param, // Default: "_csrf_token" + * csrf_token_manager?: scalar|null|Param, + * path?: scalar|null|Param, // Default: "/logout" + * target?: scalar|null|Param, // Default: "/" + * invalidate_session?: bool|Param, // Default: true + * clear_site_data?: list<"*"|"cache"|"cookies"|"storage"|"executionContexts"|Param>, * delete_cookies?: array, * }, * switch_user?: array{ - * provider?: scalar|null, - * parameter?: scalar|null, // Default: "_switch_user" - * role?: scalar|null, // Default: "ROLE_ALLOWED_TO_SWITCH" - * target_route?: scalar|null, // Default: null + * provider?: scalar|null|Param, + * parameter?: scalar|null|Param, // Default: "_switch_user" + * role?: scalar|null|Param, // Default: "ROLE_ALLOWED_TO_SWITCH" + * target_route?: scalar|null|Param, // Default: null * }, - * required_badges?: list, - * custom_authenticators?: list, + * required_badges?: list, + * custom_authenticators?: list, * login_throttling?: array{ - * limiter?: scalar|null, // A service id implementing "Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface". - * max_attempts?: int, // Default: 5 - * interval?: scalar|null, // Default: "1 minute" - * lock_factory?: scalar|null, // The service ID of the lock factory used by the login rate limiter (or null to disable locking). // Default: null - * cache_pool?: string, // The cache pool to use for storing the limiter state // Default: "cache.rate_limiter" - * storage_service?: string, // The service ID of a custom storage implementation, this precedes any configured "cache_pool" // Default: null + * limiter?: scalar|null|Param, // A service id implementing "Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface". + * max_attempts?: int|Param, // Default: 5 + * interval?: scalar|null|Param, // Default: "1 minute" + * lock_factory?: scalar|null|Param, // The service ID of the lock factory used by the login rate limiter (or null to disable locking). // Default: null + * cache_pool?: string|Param, // The cache pool to use for storing the limiter state // Default: "cache.rate_limiter" + * storage_service?: string|Param, // The service ID of a custom storage implementation, this precedes any configured "cache_pool" // Default: null * }, * x509?: array{ - * provider?: scalar|null, - * user?: scalar|null, // Default: "SSL_CLIENT_S_DN_Email" - * credentials?: scalar|null, // Default: "SSL_CLIENT_S_DN" - * user_identifier?: scalar|null, // Default: "emailAddress" + * provider?: scalar|null|Param, + * user?: scalar|null|Param, // Default: "SSL_CLIENT_S_DN_Email" + * credentials?: scalar|null|Param, // Default: "SSL_CLIENT_S_DN" + * user_identifier?: scalar|null|Param, // Default: "emailAddress" * }, * remote_user?: array{ - * provider?: scalar|null, - * user?: scalar|null, // Default: "REMOTE_USER" + * provider?: scalar|null|Param, + * user?: scalar|null|Param, // Default: "REMOTE_USER" * }, * login_link?: array{ - * check_route: scalar|null, // Route that will validate the login link - e.g. "app_login_link_verify". - * check_post_only?: scalar|null, // If true, only HTTP POST requests to "check_route" will be handled by the authenticator. // Default: false - * signature_properties: list, - * lifetime?: int, // The lifetime of the login link in seconds. // Default: 600 - * max_uses?: int, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null - * used_link_cache?: scalar|null, // Cache service id used to expired links of max_uses is set. - * success_handler?: scalar|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. - * failure_handler?: scalar|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface. - * provider?: scalar|null, // The user provider to load users from. - * secret?: scalar|null, // Default: "%kernel.secret%" - * always_use_default_target_path?: bool, // Default: false - * default_target_path?: scalar|null, // Default: "/" - * login_path?: scalar|null, // Default: "/login" - * target_path_parameter?: scalar|null, // Default: "_target_path" - * use_referer?: bool, // Default: false - * failure_path?: scalar|null, // Default: null - * failure_forward?: bool, // Default: false - * failure_path_parameter?: scalar|null, // Default: "_failure_path" + * check_route: scalar|null|Param, // Route that will validate the login link - e.g. "app_login_link_verify". + * check_post_only?: scalar|null|Param, // If true, only HTTP POST requests to "check_route" will be handled by the authenticator. // Default: false + * signature_properties: list, + * lifetime?: int|Param, // The lifetime of the login link in seconds. // Default: 600 + * max_uses?: int|Param, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null + * used_link_cache?: scalar|null|Param, // Cache service id used to expired links of max_uses is set. + * success_handler?: scalar|null|Param, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. + * failure_handler?: scalar|null|Param, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface. + * provider?: scalar|null|Param, // The user provider to load users from. + * secret?: scalar|null|Param, // Default: "%kernel.secret%" + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|null|Param, // Default: "/" + * login_path?: scalar|null|Param, // Default: "/login" + * target_path_parameter?: scalar|null|Param, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|null|Param, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|null|Param, // Default: "_failure_path" * }, * form_login?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * check_path?: scalar|null, // Default: "/login_check" - * use_forward?: bool, // Default: false - * login_path?: scalar|null, // Default: "/login" - * username_parameter?: scalar|null, // Default: "_username" - * password_parameter?: scalar|null, // Default: "_password" - * csrf_parameter?: scalar|null, // Default: "_csrf_token" - * csrf_token_id?: scalar|null, // Default: "authenticate" - * enable_csrf?: bool, // Default: false - * post_only?: bool, // Default: true - * form_only?: bool, // Default: false - * always_use_default_target_path?: bool, // Default: false - * default_target_path?: scalar|null, // Default: "/" - * target_path_parameter?: scalar|null, // Default: "_target_path" - * use_referer?: bool, // Default: false - * failure_path?: scalar|null, // Default: null - * failure_forward?: bool, // Default: false - * failure_path_parameter?: scalar|null, // Default: "_failure_path" + * provider?: scalar|null|Param, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|null|Param, + * failure_handler?: scalar|null|Param, + * check_path?: scalar|null|Param, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|null|Param, // Default: "/login" + * username_parameter?: scalar|null|Param, // Default: "_username" + * password_parameter?: scalar|null|Param, // Default: "_password" + * csrf_parameter?: scalar|null|Param, // Default: "_csrf_token" + * csrf_token_id?: scalar|null|Param, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|null|Param, // Default: "/" + * target_path_parameter?: scalar|null|Param, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|null|Param, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|null|Param, // Default: "_failure_path" * }, * form_login_ldap?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * check_path?: scalar|null, // Default: "/login_check" - * use_forward?: bool, // Default: false - * login_path?: scalar|null, // Default: "/login" - * username_parameter?: scalar|null, // Default: "_username" - * password_parameter?: scalar|null, // Default: "_password" - * csrf_parameter?: scalar|null, // Default: "_csrf_token" - * csrf_token_id?: scalar|null, // Default: "authenticate" - * enable_csrf?: bool, // Default: false - * post_only?: bool, // Default: true - * form_only?: bool, // Default: false - * always_use_default_target_path?: bool, // Default: false - * default_target_path?: scalar|null, // Default: "/" - * target_path_parameter?: scalar|null, // Default: "_target_path" - * use_referer?: bool, // Default: false - * failure_path?: scalar|null, // Default: null - * failure_forward?: bool, // Default: false - * failure_path_parameter?: scalar|null, // Default: "_failure_path" - * service?: scalar|null, // Default: "ldap" - * dn_string?: scalar|null, // Default: "{user_identifier}" - * query_string?: scalar|null, - * search_dn?: scalar|null, // Default: "" - * search_password?: scalar|null, // Default: "" + * provider?: scalar|null|Param, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|null|Param, + * failure_handler?: scalar|null|Param, + * check_path?: scalar|null|Param, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|null|Param, // Default: "/login" + * username_parameter?: scalar|null|Param, // Default: "_username" + * password_parameter?: scalar|null|Param, // Default: "_password" + * csrf_parameter?: scalar|null|Param, // Default: "_csrf_token" + * csrf_token_id?: scalar|null|Param, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|null|Param, // Default: "/" + * target_path_parameter?: scalar|null|Param, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|null|Param, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|null|Param, // Default: "_failure_path" + * service?: scalar|null|Param, // Default: "ldap" + * dn_string?: scalar|null|Param, // Default: "{user_identifier}" + * query_string?: scalar|null|Param, + * search_dn?: scalar|null|Param, // Default: "" + * search_password?: scalar|null|Param, // Default: "" * }, * json_login?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * check_path?: scalar|null, // Default: "/login_check" - * use_forward?: bool, // Default: false - * login_path?: scalar|null, // Default: "/login" - * username_path?: scalar|null, // Default: "username" - * password_path?: scalar|null, // Default: "password" + * provider?: scalar|null|Param, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|null|Param, + * failure_handler?: scalar|null|Param, + * check_path?: scalar|null|Param, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|null|Param, // Default: "/login" + * username_path?: scalar|null|Param, // Default: "username" + * password_path?: scalar|null|Param, // Default: "password" * }, * json_login_ldap?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * check_path?: scalar|null, // Default: "/login_check" - * use_forward?: bool, // Default: false - * login_path?: scalar|null, // Default: "/login" - * username_path?: scalar|null, // Default: "username" - * password_path?: scalar|null, // Default: "password" - * service?: scalar|null, // Default: "ldap" - * dn_string?: scalar|null, // Default: "{user_identifier}" - * query_string?: scalar|null, - * search_dn?: scalar|null, // Default: "" - * search_password?: scalar|null, // Default: "" + * provider?: scalar|null|Param, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|null|Param, + * failure_handler?: scalar|null|Param, + * check_path?: scalar|null|Param, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|null|Param, // Default: "/login" + * username_path?: scalar|null|Param, // Default: "username" + * password_path?: scalar|null|Param, // Default: "password" + * service?: scalar|null|Param, // Default: "ldap" + * dn_string?: scalar|null|Param, // Default: "{user_identifier}" + * query_string?: scalar|null|Param, + * search_dn?: scalar|null|Param, // Default: "" + * search_password?: scalar|null|Param, // Default: "" * }, * access_token?: array{ - * provider?: scalar|null, - * remember_me?: bool, // Default: true - * success_handler?: scalar|null, - * failure_handler?: scalar|null, - * realm?: scalar|null, // Default: null - * token_extractors?: list, + * provider?: scalar|null|Param, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|null|Param, + * failure_handler?: scalar|null|Param, + * realm?: scalar|null|Param, // Default: null + * token_extractors?: list, * token_handler: string|array{ - * id?: scalar|null, + * id?: scalar|null|Param, * oidc_user_info?: string|array{ - * base_uri: scalar|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). + * base_uri: scalar|null|Param, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). * discovery?: array{ // Enable the OIDC discovery. * cache?: array{ - * id: scalar|null, // Cache service id to use to cache the OIDC discovery configuration. + * id: scalar|null|Param, // Cache service id to use to cache the OIDC discovery configuration. * }, * }, - * claim?: scalar|null, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub" - * client?: scalar|null, // HttpClient service id to use to call the OIDC server. + * claim?: scalar|null|Param, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub" + * client?: scalar|null|Param, // HttpClient service id to use to call the OIDC server. * }, * oidc?: array{ * discovery?: array{ // Enable the OIDC discovery. - * base_uri: list, + * base_uri: list, * cache?: array{ - * id: scalar|null, // Cache service id to use to cache the OIDC discovery configuration. + * id: scalar|null|Param, // Cache service id to use to cache the OIDC discovery configuration. * }, * }, - * claim?: scalar|null, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub" - * audience: scalar|null, // Audience set in the token, for validation purpose. - * issuers: list, - * algorithms: list, - * keyset?: scalar|null, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys). + * claim?: scalar|null|Param, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub" + * audience: scalar|null|Param, // Audience set in the token, for validation purpose. + * issuers: list, + * algorithms: list, + * keyset?: scalar|null|Param, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys). * encryption?: bool|array{ - * enabled?: bool, // Default: false - * enforce?: bool, // When enabled, the token shall be encrypted. // Default: false - * algorithms: list, - * keyset: scalar|null, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). + * enabled?: bool|Param, // Default: false + * enforce?: bool|Param, // When enabled, the token shall be encrypted. // Default: false + * algorithms: list, + * keyset: scalar|null|Param, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). * }, * }, * cas?: array{ - * validation_url: scalar|null, // CAS server validation URL - * prefix?: scalar|null, // CAS prefix // Default: "cas" - * http_client?: scalar|null, // HTTP Client service // Default: null + * validation_url: scalar|null|Param, // CAS server validation URL + * prefix?: scalar|null|Param, // CAS prefix // Default: "cas" + * http_client?: scalar|null|Param, // HTTP Client service // Default: null * }, - * oauth2?: scalar|null, + * oauth2?: scalar|null|Param, * }, * }, * http_basic?: array{ - * provider?: scalar|null, - * realm?: scalar|null, // Default: "Secured Area" + * provider?: scalar|null|Param, + * realm?: scalar|null|Param, // Default: "Secured Area" * }, * http_basic_ldap?: array{ - * provider?: scalar|null, - * realm?: scalar|null, // Default: "Secured Area" - * service?: scalar|null, // Default: "ldap" - * dn_string?: scalar|null, // Default: "{user_identifier}" - * query_string?: scalar|null, - * search_dn?: scalar|null, // Default: "" - * search_password?: scalar|null, // Default: "" + * provider?: scalar|null|Param, + * realm?: scalar|null|Param, // Default: "Secured Area" + * service?: scalar|null|Param, // Default: "ldap" + * dn_string?: scalar|null|Param, // Default: "{user_identifier}" + * query_string?: scalar|null|Param, + * search_dn?: scalar|null|Param, // Default: "" + * search_password?: scalar|null|Param, // Default: "" * }, * remember_me?: array{ - * secret?: scalar|null, // Default: "%kernel.secret%" - * service?: scalar|null, - * user_providers?: list, - * catch_exceptions?: bool, // Default: true - * signature_properties?: list, + * secret?: scalar|null|Param, // Default: "%kernel.secret%" + * service?: scalar|null|Param, + * user_providers?: list, + * catch_exceptions?: bool|Param, // Default: true + * signature_properties?: list, * token_provider?: string|array{ - * service?: scalar|null, // The service ID of a custom remember-me token provider. + * service?: scalar|null|Param, // The service ID of a custom remember-me token provider. * doctrine?: bool|array{ - * enabled?: bool, // Default: false - * connection?: scalar|null, // Default: null + * enabled?: bool|Param, // Default: false + * connection?: scalar|null|Param, // Default: null * }, * }, - * token_verifier?: scalar|null, // The service ID of a custom rememberme token verifier. - * name?: scalar|null, // Default: "REMEMBERME" - * lifetime?: int, // Default: 31536000 - * path?: scalar|null, // Default: "/" - * domain?: scalar|null, // Default: null - * secure?: true|false|"auto", // Default: null - * httponly?: bool, // Default: true - * samesite?: null|"lax"|"strict"|"none", // Default: "strict" - * always_remember_me?: bool, // Default: false - * remember_me_parameter?: scalar|null, // Default: "_remember_me" + * token_verifier?: scalar|null|Param, // The service ID of a custom rememberme token verifier. + * name?: scalar|null|Param, // Default: "REMEMBERME" + * lifetime?: int|Param, // Default: 31536000 + * path?: scalar|null|Param, // Default: "/" + * domain?: scalar|null|Param, // Default: null + * secure?: true|false|"auto"|Param, // Default: null + * httponly?: bool|Param, // Default: true + * samesite?: null|"lax"|"strict"|"none"|Param, // Default: "strict" + * always_remember_me?: bool|Param, // Default: false + * remember_me_parameter?: scalar|null|Param, // Default: "_remember_me" * }, * }>, * access_control?: list, - * attributes?: array, - * route?: scalar|null, // Default: null - * methods?: list, - * allow_if?: scalar|null, // Default: null - * roles?: list, + * request_matcher?: scalar|null|Param, // Default: null + * requires_channel?: scalar|null|Param, // Default: null + * path?: scalar|null|Param, // Use the urldecoded format. // Default: null + * host?: scalar|null|Param, // Default: null + * port?: int|Param, // Default: null + * ips?: list, + * attributes?: array, + * route?: scalar|null|Param, // Default: null + * methods?: list, + * allow_if?: scalar|null|Param, // Default: null + * roles?: list, * }>, - * role_hierarchy?: array>, + * role_hierarchy?: array>, * } * @psalm-type KnpMenuConfig = array{ * providers?: array{ - * builder_alias?: bool, // Default: true + * builder_alias?: bool|Param, // Default: true * }, * twig?: array{ - * template?: scalar|null, // Default: "@KnpMenu/menu.html.twig" + * template?: scalar|null|Param, // Default: "@KnpMenu/menu.html.twig" * }, - * templating?: bool, // Default: false - * default_renderer?: scalar|null, // Default: "twig" + * templating?: bool|Param, // Default: false + * default_renderer?: scalar|null|Param, // Default: "twig" * } * @psalm-type KnpPaginatorConfig = array{ * default_options?: array{ - * sort_field_name?: scalar|null, // Default: "sort" - * sort_direction_name?: scalar|null, // Default: "direction" - * filter_field_name?: scalar|null, // Default: "filterField" - * filter_value_name?: scalar|null, // Default: "filterValue" - * page_name?: scalar|null, // Default: "page" - * distinct?: bool, // Default: true - * page_out_of_range?: scalar|null, // Default: "ignore" - * default_limit?: scalar|null, // Default: 10 + * sort_field_name?: scalar|null|Param, // Default: "sort" + * sort_direction_name?: scalar|null|Param, // Default: "direction" + * filter_field_name?: scalar|null|Param, // Default: "filterField" + * filter_value_name?: scalar|null|Param, // Default: "filterValue" + * page_name?: scalar|null|Param, // Default: "page" + * distinct?: bool|Param, // Default: true + * page_out_of_range?: scalar|null|Param, // Default: "ignore" + * default_limit?: scalar|null|Param, // Default: 10 * }, * template?: array{ - * pagination?: scalar|null, // Default: "@KnpPaginator/Pagination/sliding.html.twig" - * rel_links?: scalar|null, // Default: "@KnpPaginator/Pagination/rel_links.html.twig" - * filtration?: scalar|null, // Default: "@KnpPaginator/Pagination/filtration.html.twig" - * sortable?: scalar|null, // Default: "@KnpPaginator/Pagination/sortable_link.html.twig" - * }, - * page_range?: scalar|null, // Default: 5 - * page_limit?: scalar|null, // Default: null - * convert_exception?: bool, // Default: false - * remove_first_page_param?: bool, // Default: false + * pagination?: scalar|null|Param, // Default: "@KnpPaginator/Pagination/sliding.html.twig" + * rel_links?: scalar|null|Param, // Default: "@KnpPaginator/Pagination/rel_links.html.twig" + * filtration?: scalar|null|Param, // Default: "@KnpPaginator/Pagination/filtration.html.twig" + * sortable?: scalar|null|Param, // Default: "@KnpPaginator/Pagination/sortable_link.html.twig" + * }, + * page_range?: scalar|null|Param, // Default: 5 + * page_limit?: scalar|null|Param, // Default: null + * convert_exception?: bool|Param, // Default: false + * remove_first_page_param?: bool|Param, // Default: false * } * @psalm-type TwigExtraConfig = array{ * cache?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * html?: bool|array{ - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * }, * markdown?: bool|array{ - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * }, * intl?: bool|array{ - * enabled?: bool, // Default: true + * enabled?: bool|Param, // Default: true * }, * cssinliner?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * inky?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * string?: bool|array{ - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, * commonmark?: array{ * renderer?: array{ // Array of options for rendering HTML. - * block_separator?: scalar|null, - * inner_separator?: scalar|null, - * soft_break?: scalar|null, + * block_separator?: scalar|null|Param, + * inner_separator?: scalar|null|Param, + * soft_break?: scalar|null|Param, * }, - * html_input?: "strip"|"allow"|"escape", // How to handle HTML input. - * allow_unsafe_links?: bool, // Remove risky link and image URLs by setting this to false. // Default: true - * max_nesting_level?: int, // The maximum nesting level for blocks. // Default: 9223372036854775807 - * max_delimiters_per_line?: int, // The maximum number of strong/emphasis delimiters per line. // Default: 9223372036854775807 + * html_input?: "strip"|"allow"|"escape"|Param, // How to handle HTML input. + * allow_unsafe_links?: bool|Param, // Remove risky link and image URLs by setting this to false. // Default: true + * max_nesting_level?: int|Param, // The maximum nesting level for blocks. // Default: 9223372036854775807 + * max_delimiters_per_line?: int|Param, // The maximum number of strong/emphasis delimiters per line. // Default: 9223372036854775807 * slug_normalizer?: array{ // Array of options for configuring how URL-safe slugs are created. * instance?: mixed, - * max_length?: int, // Default: 255 + * max_length?: int|Param, // Default: 255 * unique?: mixed, * }, * commonmark?: array{ // Array of options for configuring the CommonMark core extension. - * enable_em?: bool, // Default: true - * enable_strong?: bool, // Default: true - * use_asterisk?: bool, // Default: true - * use_underscore?: bool, // Default: true - * unordered_list_markers?: list, + * enable_em?: bool|Param, // Default: true + * enable_strong?: bool|Param, // Default: true + * use_asterisk?: bool|Param, // Default: true + * use_underscore?: bool|Param, // Default: true + * unordered_list_markers?: list, * }, * ... * }, * } * @psalm-type MakerConfig = array{ - * root_namespace?: scalar|null, // Default: "App" - * generate_final_classes?: bool, // Default: true - * generate_final_entities?: bool, // Default: false + * root_namespace?: scalar|null|Param, // Default: "App" + * generate_final_classes?: bool|Param, // Default: true + * generate_final_entities?: bool|Param, // Default: false * } * @psalm-type WebProfilerConfig = array{ * toolbar?: bool|array{ // Profiler toolbar configuration - * enabled?: bool, // Default: false - * ajax_replace?: bool, // Replace toolbar on AJAX requests // Default: false + * enabled?: bool|Param, // Default: false + * ajax_replace?: bool|Param, // Replace toolbar on AJAX requests // Default: false * }, - * intercept_redirects?: bool, // Default: false - * excluded_ajax_paths?: scalar|null, // Default: "^/((index|app(_[\\w]+)?)\\.php/)?_wdt" + * intercept_redirects?: bool|Param, // Default: false + * excluded_ajax_paths?: scalar|null|Param, // Default: "^/((index|app(_[\\w]+)?)\\.php/)?_wdt" * } * @psalm-type NelmioCorsConfig = array{ * defaults?: array{ - * allow_credentials?: bool, // Default: false - * allow_origin?: list, - * allow_headers?: list, - * allow_methods?: list, - * allow_private_network?: bool, // Default: false - * expose_headers?: list, - * max_age?: scalar|null, // Default: 0 - * hosts?: list, - * origin_regex?: bool, // Default: false - * forced_allow_origin_value?: scalar|null, // Default: null - * skip_same_as_origin?: bool, // Default: true + * allow_credentials?: bool|Param, // Default: false + * allow_origin?: list, + * allow_headers?: list, + * allow_methods?: list, + * allow_private_network?: bool|Param, // Default: false + * expose_headers?: list, + * max_age?: scalar|null|Param, // Default: 0 + * hosts?: list, + * origin_regex?: bool|Param, // Default: false + * forced_allow_origin_value?: scalar|null|Param, // Default: null + * skip_same_as_origin?: bool|Param, // Default: true * }, * paths?: array, - * allow_headers?: list, - * allow_methods?: list, - * allow_private_network?: bool, - * expose_headers?: list, - * max_age?: scalar|null, // Default: 0 - * hosts?: list, - * origin_regex?: bool, - * forced_allow_origin_value?: scalar|null, // Default: null - * skip_same_as_origin?: bool, + * allow_credentials?: bool|Param, + * allow_origin?: list, + * allow_headers?: list, + * allow_methods?: list, + * allow_private_network?: bool|Param, + * expose_headers?: list, + * max_age?: scalar|null|Param, // Default: 0 + * hosts?: list, + * origin_regex?: bool|Param, + * forced_allow_origin_value?: scalar|null|Param, // Default: null + * skip_same_as_origin?: bool|Param, * }>, * } * @psalm-type DebugConfig = array{ - * max_items?: int, // Max number of displayed items past the first level, -1 means no limit. // Default: 2500 - * min_depth?: int, // Minimum tree depth to clone all the items, 1 is default. // Default: 1 - * max_string_length?: int, // Max length of displayed strings, -1 means no limit. // Default: -1 - * dump_destination?: scalar|null, // A stream URL where dumps should be written to. // Default: null - * theme?: "dark"|"light", // Changes the color of the dump() output when rendered directly on the templating. "dark" (default) or "light". // Default: "dark" + * max_items?: int|Param, // Max number of displayed items past the first level, -1 means no limit. // Default: 2500 + * min_depth?: int|Param, // Minimum tree depth to clone all the items, 1 is default. // Default: 1 + * max_string_length?: int|Param, // Max length of displayed strings, -1 means no limit. // Default: -1 + * dump_destination?: scalar|null|Param, // A stream URL where dumps should be written to. // Default: null + * theme?: "dark"|"light"|Param, // Changes the color of the dump() output when rendered directly on the templating. "dark" (default) or "light". // Default: "dark" * } * @psalm-type VichUploaderConfig = array{ - * default_filename_attribute_suffix?: scalar|null, // Default: "_name" - * db_driver: scalar|null, - * storage?: scalar|null, // Default: "file_system" - * use_flysystem_to_resolve_uri?: bool, // Default: false - * twig?: scalar|null, // twig requires templating // Default: true - * form?: scalar|null, // Default: true + * default_filename_attribute_suffix?: scalar|null|Param, // Default: "_name" + * db_driver: scalar|null|Param, + * storage?: scalar|null|Param, // Default: "file_system" + * use_flysystem_to_resolve_uri?: bool|Param, // Default: false + * twig?: scalar|null|Param, // twig requires templating // Default: true + * form?: scalar|null|Param, // Default: true * metadata?: array{ - * cache?: scalar|null, // Default: "file" - * type?: scalar|null, // Default: "attribute" + * cache?: scalar|null|Param, // Default: "file" + * type?: scalar|null|Param, // Default: "attribute" * file_cache?: array{ - * dir?: scalar|null, // Default: "%kernel.cache_dir%/vich_uploader" + * dir?: scalar|null|Param, // Default: "%kernel.cache_dir%/vich_uploader" * }, - * auto_detection?: bool, // Default: true + * auto_detection?: bool|Param, // Default: true * directories?: list, * }, * mappings?: array, * } * @psalm-type FlysystemConfig = array{ * storages?: array, - * visibility?: scalar|null, // Default: null - * directory_visibility?: scalar|null, // Default: null - * retain_visibility?: bool|null, // Default: null - * case_sensitive?: bool, // Default: true - * disable_asserts?: bool, // Default: false - * public_url?: list, - * path_normalizer?: scalar|null, // Default: null - * public_url_generator?: scalar|null, // Default: null - * temporary_url_generator?: scalar|null, // Default: null - * read_only?: bool, // Default: false + * visibility?: scalar|null|Param, // Default: null + * directory_visibility?: scalar|null|Param, // Default: null + * retain_visibility?: bool|null|Param, // Default: null + * case_sensitive?: bool|Param, // Default: true + * disable_asserts?: bool|Param, // Default: false + * public_url?: list, + * path_normalizer?: scalar|null|Param, // Default: null + * public_url_generator?: scalar|null|Param, // Default: null + * temporary_url_generator?: scalar|null|Param, // Default: null + * read_only?: bool|Param, // Default: false * }>, * } * @psalm-type LiipImagineConfig = array{ * resolvers?: array, - * get_options?: array, - * put_options?: array, - * proxies?: array, + * get_options?: array, + * put_options?: array, + * proxies?: array, * }, * flysystem?: array{ - * filesystem_service: scalar|null, - * cache_prefix?: scalar|null, // Default: "" - * root_url: scalar|null, - * visibility?: "public"|"private"|"noPredefinedVisibility", // Default: "public" + * filesystem_service: scalar|null|Param, + * cache_prefix?: scalar|null|Param, // Default: "" + * root_url: scalar|null|Param, + * visibility?: "public"|"private"|"noPredefinedVisibility"|Param, // Default: "public" * }, * }>, * loaders?: array, - * allow_unresolvable_data_roots?: bool, // Default: false + * locator?: "filesystem"|"filesystem_insecure"|Param, // Using the "filesystem_insecure" locator is not recommended due to a less secure resolver mechanism, but is provided for those using heavily symlinked projects. // Default: "filesystem" + * data_root?: list, + * allow_unresolvable_data_roots?: bool|Param, // Default: false * bundle_resources?: array{ - * enabled?: bool, // Default: false - * access_control_type?: "blacklist"|"whitelist", // Sets the access control method applied to bundle names in "access_control_list" into a blacklist or whitelist. // Default: "blacklist" - * access_control_list?: list, + * enabled?: bool|Param, // Default: false + * access_control_type?: "blacklist"|"whitelist"|Param, // Sets the access control method applied to bundle names in "access_control_list" into a blacklist or whitelist. // Default: "blacklist" + * access_control_list?: list, * }, * }, * flysystem?: array{ - * filesystem_service: scalar|null, + * filesystem_service: scalar|null|Param, * }, + * asset_mapper?: array, * chain?: array{ - * loaders: list, + * loaders: list, * }, * }>, - * driver?: scalar|null, // Default: "gd" - * cache?: scalar|null, // Default: "default" - * cache_base_path?: scalar|null, // Default: "" - * data_loader?: scalar|null, // Default: "default" - * default_image?: scalar|null, // Default: null + * driver?: scalar|null|Param, // Default: "gd" + * cache?: scalar|null|Param, // Default: "default" + * cache_base_path?: scalar|null|Param, // Default: "" + * data_loader?: scalar|null|Param, // Default: "default" + * default_image?: scalar|null|Param, // Default: null * default_filter_set_settings?: array{ - * quality?: scalar|null, // Default: 100 - * jpeg_quality?: scalar|null, // Default: null - * png_compression_level?: scalar|null, // Default: null - * png_compression_filter?: scalar|null, // Default: null - * format?: scalar|null, // Default: null - * animated?: bool, // Default: false - * cache?: scalar|null, // Default: null - * data_loader?: scalar|null, // Default: null - * default_image?: scalar|null, // Default: null + * quality?: scalar|null|Param, // Default: 100 + * jpeg_quality?: scalar|null|Param, // Default: null + * png_compression_level?: scalar|null|Param, // Default: null + * png_compression_filter?: scalar|null|Param, // Default: null + * format?: scalar|null|Param, // Default: null + * animated?: bool|Param, // Default: false + * cache?: scalar|null|Param, // Default: null + * data_loader?: scalar|null|Param, // Default: null + * default_image?: scalar|null|Param, // Default: null * filters?: array>, * post_processors?: array>, * }, * controller?: array{ - * filter_action?: scalar|null, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterAction" - * filter_runtime_action?: scalar|null, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterRuntimeAction" - * redirect_response_code?: int, // Default: 302 + * filter_action?: scalar|null|Param, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterAction" + * filter_runtime_action?: scalar|null|Param, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterRuntimeAction" + * redirect_response_code?: int|Param, // Default: 302 * }, * filter_sets?: array>, * post_processors?: array>, * }>, * twig?: array{ - * mode?: "none"|"lazy"|"legacy", // Twig mode: none/lazy/legacy (default) // Default: "legacy" - * assets_version?: scalar|null, // Default: null + * mode?: "none"|"lazy"|"legacy"|Param, // Twig mode: none/lazy/legacy (default) // Default: "legacy" + * assets_version?: scalar|null|Param, // Default: null * }, - * enqueue?: bool, // Enables integration with enqueue if set true. Allows resolve image caches in background by sending messages to MQ. // Default: false + * enqueue?: bool|Param, // Enables integration with enqueue if set true. Allows resolve image caches in background by sending messages to MQ. // Default: false * messenger?: bool|array{ // Enables integration with symfony/messenger if set true. Warmup image caches in background by sending messages to MQ. - * enabled?: bool, // Default: false + * enabled?: bool|Param, // Default: false * }, - * templating?: bool, // Enables integration with symfony/templating component // Default: true + * templating?: bool|Param, // Enables integration with symfony/templating component // Default: true * webp?: array{ - * generate?: bool, // Default: false - * quality?: int, // Default: 100 - * cache?: scalar|null, // Default: null - * data_loader?: scalar|null, // Default: null + * generate?: bool|Param, // Default: false + * quality?: int|Param, // Default: 100 + * cache?: scalar|null|Param, // Default: null + * data_loader?: scalar|null|Param, // Default: null * post_processors?: array>, * }, * } * @psalm-type WebpackEncoreConfig = array{ - * output_path: scalar|null, // The path where Encore is building the assets - i.e. Encore.setOutputPath() - * crossorigin?: false|"anonymous"|"use-credentials", // crossorigin value when Encore.enableIntegrityHashes() is used, can be false (default), anonymous or use-credentials // Default: false - * preload?: bool, // preload all rendered script and link tags automatically via the http2 Link header. // Default: false - * cache?: bool, // Enable caching of the entry point file(s) // Default: false - * strict_mode?: bool, // Throw an exception if the entrypoints.json file is missing or an entry is missing from the data // Default: true - * builds?: array, - * script_attributes?: array, - * link_attributes?: array, + * output_path: scalar|null|Param, // The path where Encore is building the assets - i.e. Encore.setOutputPath() + * crossorigin?: false|"anonymous"|"use-credentials"|Param, // crossorigin value when Encore.enableIntegrityHashes() is used, can be false (default), anonymous or use-credentials // Default: false + * preload?: bool|Param, // preload all rendered script and link tags automatically via the http2 Link header. // Default: false + * cache?: bool|Param, // Enable caching of the entry point file(s) // Default: false + * strict_mode?: bool|Param, // Throw an exception if the entrypoints.json file is missing or an entry is missing from the data // Default: true + * builds?: array, + * script_attributes?: array, + * link_attributes?: array, * } * @psalm-type TwigComponentConfig = array{ * defaults?: array, - * anonymous_template_directory?: scalar|null, // Defaults to `components` - * profiler?: bool, // Enables the profiler for Twig Component (in debug mode) // Default: "%kernel.debug%" - * controllers_json?: scalar|null, // Deprecated: The "twig_component.controllers_json" config option is deprecated, and will be removed in 3.0. // Default: null + * anonymous_template_directory?: scalar|null|Param, // Defaults to `components` + * profiler?: bool|array{ // Enables the profiler for Twig Component + * enabled?: bool|Param, // Default: "%kernel.debug%" + * collect_components?: bool|Param, // Collect components instances // Default: true + * }, + * controllers_json?: scalar|null|Param, // Deprecated: The "twig_component.controllers_json" config option is deprecated, and will be removed in 3.0. // Default: null * } * @psalm-type MonologConfig = array{ - * use_microseconds?: scalar|null, // Default: true - * channels?: list, + * use_microseconds?: scalar|null|Param, // Default: true + * channels?: list, * handlers?: array, + * code?: scalar|null|Param, + * urls?: list, * }>, - * accepted_levels?: list, - * min_level?: scalar|null, // Default: "DEBUG" - * max_level?: scalar|null, // Default: "EMERGENCY" - * buffer_size?: scalar|null, // Default: 0 - * flush_on_overflow?: bool, // Default: false - * handler?: scalar|null, - * url?: scalar|null, - * exchange?: scalar|null, - * exchange_name?: scalar|null, // Default: "log" - * channel?: scalar|null, // Default: null - * bot_name?: scalar|null, // Default: "Monolog" - * use_attachment?: scalar|null, // Default: true - * use_short_attachment?: scalar|null, // Default: false - * include_extra?: scalar|null, // Default: false - * icon_emoji?: scalar|null, // Default: null - * webhook_url?: scalar|null, - * exclude_fields?: list, - * token?: scalar|null, - * region?: scalar|null, - * source?: scalar|null, - * use_ssl?: bool, // Default: true + * accepted_levels?: list, + * min_level?: scalar|null|Param, // Default: "DEBUG" + * max_level?: scalar|null|Param, // Default: "EMERGENCY" + * buffer_size?: scalar|null|Param, // Default: 0 + * flush_on_overflow?: bool|Param, // Default: false + * handler?: scalar|null|Param, + * url?: scalar|null|Param, + * exchange?: scalar|null|Param, + * exchange_name?: scalar|null|Param, // Default: "log" + * channel?: scalar|null|Param, // Default: null + * bot_name?: scalar|null|Param, // Default: "Monolog" + * use_attachment?: scalar|null|Param, // Default: true + * use_short_attachment?: scalar|null|Param, // Default: false + * include_extra?: scalar|null|Param, // Default: false + * icon_emoji?: scalar|null|Param, // Default: null + * webhook_url?: scalar|null|Param, + * exclude_fields?: list, + * token?: scalar|null|Param, + * region?: scalar|null|Param, + * source?: scalar|null|Param, + * use_ssl?: bool|Param, // Default: true * user?: mixed, - * title?: scalar|null, // Default: null - * host?: scalar|null, // Default: null - * port?: scalar|null, // Default: 514 - * config?: list, - * members?: list, - * connection_string?: scalar|null, - * timeout?: scalar|null, - * time?: scalar|null, // Default: 60 - * deduplication_level?: scalar|null, // Default: 400 - * store?: scalar|null, // Default: null - * connection_timeout?: scalar|null, - * persistent?: bool, - * message_type?: scalar|null, // Default: 0 - * parse_mode?: scalar|null, // Default: null - * disable_webpage_preview?: bool|null, // Default: null - * disable_notification?: bool|null, // Default: null - * split_long_messages?: bool, // Default: false - * delay_between_messages?: bool, // Default: false - * topic?: int, // Default: null - * factor?: int, // Default: 1 - * tags?: list, + * title?: scalar|null|Param, // Default: null + * host?: scalar|null|Param, // Default: null + * port?: scalar|null|Param, // Default: 514 + * config?: list, + * members?: list, + * connection_string?: scalar|null|Param, + * timeout?: scalar|null|Param, + * time?: scalar|null|Param, // Default: 60 + * deduplication_level?: scalar|null|Param, // Default: 400 + * store?: scalar|null|Param, // Default: null + * connection_timeout?: scalar|null|Param, + * persistent?: bool|Param, + * message_type?: scalar|null|Param, // Default: 0 + * parse_mode?: scalar|null|Param, // Default: null + * disable_webpage_preview?: bool|null|Param, // Default: null + * disable_notification?: bool|null|Param, // Default: null + * split_long_messages?: bool|Param, // Default: false + * delay_between_messages?: bool|Param, // Default: false + * topic?: int|Param, // Default: null + * factor?: int|Param, // Default: 1 + * tags?: list, * console_formatter_options?: mixed, // Default: [] - * formatter?: scalar|null, - * nested?: bool, // Default: false + * formatter?: scalar|null|Param, + * nested?: bool|Param, // Default: false * publisher?: string|array{ - * id?: scalar|null, - * hostname?: scalar|null, - * port?: scalar|null, // Default: 12201 - * chunk_size?: scalar|null, // Default: 1420 - * encoder?: "json"|"compressed_json", + * id?: scalar|null|Param, + * hostname?: scalar|null|Param, + * port?: scalar|null|Param, // Default: 12201 + * chunk_size?: scalar|null|Param, // Default: 1420 + * encoder?: "json"|"compressed_json"|Param, * }, * mongodb?: string|array{ - * id?: scalar|null, // ID of a MongoDB\Client service - * uri?: scalar|null, - * username?: scalar|null, - * password?: scalar|null, - * database?: scalar|null, // Default: "monolog" - * collection?: scalar|null, // Default: "logs" + * id?: scalar|null|Param, // ID of a MongoDB\Client service + * uri?: scalar|null|Param, + * username?: scalar|null|Param, + * password?: scalar|null|Param, + * database?: scalar|null|Param, // Default: "monolog" + * collection?: scalar|null|Param, // Default: "logs" * }, * elasticsearch?: string|array{ - * id?: scalar|null, - * hosts?: list, - * host?: scalar|null, - * port?: scalar|null, // Default: 9200 - * transport?: scalar|null, // Default: "Http" - * user?: scalar|null, // Default: null - * password?: scalar|null, // Default: null + * id?: scalar|null|Param, + * hosts?: list, + * host?: scalar|null|Param, + * port?: scalar|null|Param, // Default: 9200 + * transport?: scalar|null|Param, // Default: "Http" + * user?: scalar|null|Param, // Default: null + * password?: scalar|null|Param, // Default: null * }, - * index?: scalar|null, // Default: "monolog" - * document_type?: scalar|null, // Default: "logs" - * ignore_error?: scalar|null, // Default: false + * index?: scalar|null|Param, // Default: "monolog" + * document_type?: scalar|null|Param, // Default: "logs" + * ignore_error?: scalar|null|Param, // Default: false * redis?: string|array{ - * id?: scalar|null, - * host?: scalar|null, - * password?: scalar|null, // Default: null - * port?: scalar|null, // Default: 6379 - * database?: scalar|null, // Default: 0 - * key_name?: scalar|null, // Default: "monolog_redis" + * id?: scalar|null|Param, + * host?: scalar|null|Param, + * password?: scalar|null|Param, // Default: null + * port?: scalar|null|Param, // Default: 6379 + * database?: scalar|null|Param, // Default: 0 + * key_name?: scalar|null|Param, // Default: "monolog_redis" * }, * predis?: string|array{ - * id?: scalar|null, - * host?: scalar|null, + * id?: scalar|null|Param, + * host?: scalar|null|Param, * }, - * from_email?: scalar|null, - * to_email?: list, - * subject?: scalar|null, - * content_type?: scalar|null, // Default: null - * headers?: list, - * mailer?: scalar|null, // Default: null + * from_email?: scalar|null|Param, + * to_email?: list, + * subject?: scalar|null|Param, + * content_type?: scalar|null|Param, // Default: null + * headers?: list, + * mailer?: scalar|null|Param, // Default: null * email_prototype?: string|array{ - * id: scalar|null, - * method?: scalar|null, // Default: null + * id: scalar|null|Param, + * method?: scalar|null|Param, // Default: null * }, * verbosity_levels?: array{ - * VERBOSITY_QUIET?: scalar|null, // Default: "ERROR" - * VERBOSITY_NORMAL?: scalar|null, // Default: "WARNING" - * VERBOSITY_VERBOSE?: scalar|null, // Default: "NOTICE" - * VERBOSITY_VERY_VERBOSE?: scalar|null, // Default: "INFO" - * VERBOSITY_DEBUG?: scalar|null, // Default: "DEBUG" + * VERBOSITY_QUIET?: scalar|null|Param, // Default: "ERROR" + * VERBOSITY_NORMAL?: scalar|null|Param, // Default: "WARNING" + * VERBOSITY_VERBOSE?: scalar|null|Param, // Default: "NOTICE" + * VERBOSITY_VERY_VERBOSE?: scalar|null|Param, // Default: "INFO" + * VERBOSITY_DEBUG?: scalar|null|Param, // Default: "DEBUG" * }, * channels?: string|array{ - * type?: scalar|null, - * elements?: list, + * type?: scalar|null|Param, + * elements?: list, * }, * }>, * } * @psalm-type DamaDoctrineTestConfig = array{ * enable_static_connection?: mixed, // Default: true - * enable_static_meta_data_cache?: bool, // Default: true - * enable_static_query_cache?: bool, // Default: true + * enable_static_meta_data_cache?: bool|Param, // Default: true + * enable_static_query_cache?: bool|Param, // Default: true * connection_keys?: list, * } * @psalm-type ConfigType = array{ diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index 169a3601d..09de5ac87 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -29,7 +29,7 @@ public function getSchedule(): Schedule RecurringMessage::cron('0 */1 * * *', new BanIpMessage()), RecurringMessage::cron('0 10 * * *', new UpdateSerieMessage()), RecurringMessage::cron('0 12 * * *', new NotificationMessage()), - // RecurringMessage::cron('0 0 * * 6', new DeleteOldFileMessage()), + RecurringMessage::cron('0 0 * * 6', new DeleteOldFileMessage()), // RecurringMessage::cron('0 20 * * *', new MetaAllMessage()), ); $schedule->stateful($this->cache); From 49c4dc96ecbf16874eb5b85402be7cc891bcc102 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Tue, 13 Jan 2026 12:40:14 +0100 Subject: [PATCH 39/50] feat: ajouter la configuration de Messenger avec Docker et Supervisor --- Dockerfile.messenger | 9 +++++++ Taskfile.yml | 3 ++- docker-compose-lampy.yml | 31 +++++++++++++++++++++---- docker/start-messenger.sh | 13 +++++++++++ docker/supervisor/conf.d/messenger.conf | 10 ++++++++ docker/supervisor/supervisord.conf | 5 ++++ 6 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 Dockerfile.messenger create mode 100755 docker/start-messenger.sh create mode 100644 docker/supervisor/conf.d/messenger.conf create mode 100644 docker/supervisor/supervisord.conf diff --git a/Dockerfile.messenger b/Dockerfile.messenger new file mode 100644 index 000000000..f1bed10f3 --- /dev/null +++ b/Dockerfile.messenger @@ -0,0 +1,9 @@ +FROM koromerzhin/php:8.4.13-apache-symfony + +USER root + +RUN apt-get update \ + && apt-get install -y supervisor \ + && rm -rf /var/lib/apt/lists/* + +USER www-data \ No newline at end of file diff --git a/Taskfile.yml b/Taskfile.yml index 6c8b23c0f..b376dbf33 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -103,6 +103,7 @@ tasks: desc: "Deploy Docker stacks defined in docker-compose files" silent: true cmds: + - docker build -f Dockerfile.messenger -t labstag/messenger:latest . - task: docker:stack:deploy vars: COMPOSE_FILE: "{{.DOCKERCOMPOSEFILE}}" @@ -444,7 +445,7 @@ tasks: cmds: - task: symfony:console vars: - CMD: "messenger:consume --all" + CMD: "messenger:consume --all --time-limit=3600 --memory-limit=128M --sleep=1 --failure-limit=10" messenger:stats: desc: "Show Messenger statistics" diff --git a/docker-compose-lampy.yml b/docker-compose-lampy.yml index a72d84740..31213d9c7 100644 --- a/docker-compose-lampy.yml +++ b/docker-compose-lampy.yml @@ -1,13 +1,37 @@ networks: - net: - driver: overlay - attachable: true proxylampy: external: true serverlampy: external: true services: + messenger: + image: labstag/messenger:latest + command: ["/usr/local/bin/start-messenger.sh"] + user: "${UID:-1000}:${GID:-1000}" + environment: + TZ: Europe/Paris + APP_SECRET: "CHANGEME" + MAILER_DSN: "smtp://mailtest:1025" + MESSENGER_TRANSPORT_DSN: "doctrine://default" + LOCK_DNS: semaphore + DATABASE_BDD: labstag_bdd + DATABASE_USER: labstag + DATABASE_PASSWORD: password + DATABASE_URL: "mysqli://labstag:password@mariadb:3306/labstag_bdd" + HOME: "/var/www" + volumes: + - ${PWD}/apps:/var/www/:rw + - ${PWD}/docker/start-messenger.sh:/usr/local/bin/start-messenger.sh:ro + - ${PWD}/conf/php.ini-development://usr/local/etc/php/conf.d/php.ini + - ${PWD}/conf/apache2/000-default.conf:/etc/apache2/sites-available/000-default.conf:ro + - ${PWD}/docker/supervisor:/etc/supervisor:ro + deploy: + replicas: 1 + restart_policy: + condition: any + networks: + - serverlampy www: image: koromerzhin/php:8.4.13-apache-symfony user: "${UID:-1000}:${GID:-1000}" @@ -29,7 +53,6 @@ services: - ${PWD}/conf/apache2/apache2.conf:/etc/apache2/apache2.conf:ro networks: - serverlampy - - net - proxylampy deploy: labels: diff --git a/docker/start-messenger.sh b/docker/start-messenger.sh new file mode 100755 index 000000000..2ab3e3ac5 --- /dev/null +++ b/docker/start-messenger.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +echo "🚀 Démarrage Messenger" + +# Attente base de données +until symfony console about >/dev/null 2>&1; do + echo "⏳ Attente DB..." + sleep 2 +done + +echo "▶️ Lancement Supervisor" +exec /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf \ No newline at end of file diff --git a/docker/supervisor/conf.d/messenger.conf b/docker/supervisor/conf.d/messenger.conf new file mode 100644 index 000000000..f911e3f22 --- /dev/null +++ b/docker/supervisor/conf.d/messenger.conf @@ -0,0 +1,10 @@ +[program:messenger] +command=symfony console messenger:consume --all --time-limit=3600 --memory-limit=128M +directory=/var/www +autostart=true +autorestart=true +startsecs=5 +numprocs=1 + +stdout_logfile=/dev/stdout +stderr_logfile=/dev/stderr \ No newline at end of file diff --git a/docker/supervisor/supervisord.conf b/docker/supervisor/supervisord.conf new file mode 100644 index 000000000..4c2329522 --- /dev/null +++ b/docker/supervisor/supervisord.conf @@ -0,0 +1,5 @@ +[supervisord] +nodaemon=true + +[include] +files = /etc/supervisor/conf.d/*.conf \ No newline at end of file From 9d1338f3b8218f9d803533cdfdd2de77a84d0599 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Tue, 13 Jan 2026 12:59:05 +0100 Subject: [PATCH 40/50] =?UTF-8?q?fix:=20supprimer=20la=20t=C3=A2che=20de?= =?UTF-8?q?=20consommation=20des=20messages=20Messenger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Taskfile.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Taskfile.yml b/Taskfile.yml index b376dbf33..617673291 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -439,14 +439,6 @@ tasks: vars: CMD: "lint:twig templates" - messenger:consume: - desc: "Start Messenger message consumer" - silent: true - cmds: - - task: symfony:console - vars: - CMD: "messenger:consume --all --time-limit=3600 --memory-limit=128M --sleep=1 --failure-limit=10" - messenger:stats: desc: "Show Messenger statistics" silent: true From 77304412faac51a61c3ce8a1a6eaa6cc7f6f22ea Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Tue, 13 Jan 2026 15:06:43 +0100 Subject: [PATCH 41/50] =?UTF-8?q?fix:=20supprimer=20la=20variable=20STACK?= =?UTF-8?q?=5FNAME=20des=20t=C3=A2ches=20docker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Taskfile.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Taskfile.yml b/Taskfile.yml index 617673291..8f118c198 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -158,7 +158,6 @@ tasks: cmds: - task: docker:stack:shell vars: - STACK_NAME: "labstag" SERVICE_NAME: "www" labstag:cmd-exec: @@ -172,7 +171,6 @@ tasks: cmds: - task: docker:stack:exec vars: - STACK_NAME: "labstag" SERVICE_NAME: "www" COMMAND: "{{.COMMAND}}" INTERACTIVE: "{{.INTERACTIVE}}" From 442dc9229a89d5844baf205aa21181d444fb20f9 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Tue, 13 Jan 2026 15:26:00 +0100 Subject: [PATCH 42/50] Refactor: Remove unused MessageBusInterface imports and update dispatch method calls - Removed unused `MessageBusInterface` imports from various classes including `StarAddCommand`, `StoryPdfCommand`, `CrudControllerAbstract`, and others. - Updated instances of `$this->messageBus->dispatch()` to `$this->messageDispatcherService->dispatch()` in multiple message handler classes to maintain consistency and clarity. - Added `#[Override]` attribute to `getDefaultImage` methods in data classes to indicate method overriding. - Improved code readability by renaming variables and using `sprintf` for string formatting in query builders. - Cleaned up commented-out code and unnecessary variable assignments in `MetaMessageHandler` and `FileService`. --- apps/src/Command/ExecuteMessageCommand.php | 1 - apps/src/Command/GeocodeInstallCommand.php | 1 - apps/src/Command/StarAddCommand.php | 1 - apps/src/Command/StoryPdfCommand.php | 1 - .../Admin/CrudControllerAbstract.php | 1 - .../Controller/Admin/PersonCrudController.php | 8 +++--- apps/src/Controller/BackController.php | 7 ++--- apps/src/Data/ChapterData.php | 1 + apps/src/Data/EpisodeData.php | 1 + apps/src/Data/GameData.php | 1 + apps/src/Data/MovieData.php | 1 + apps/src/Data/PersonData.php | 1 + apps/src/Data/PostData.php | 1 + apps/src/Data/SagaData.php | 1 + apps/src/Data/SeasonData.php | 1 + apps/src/Data/SerieData.php | 1 + apps/src/Data/StoryData.php | 1 + apps/src/Event/Abstract/EventEntityLib.php | 1 - apps/src/Event/Workflow/WorkflowAbstract.php | 1 - .../MessageDispatcherResetListener.php | 4 +-- .../MessageHandler/AddMovieMessageHandler.php | 5 ++-- .../MessageHandler/AddSerieMessageHandler.php | 5 ++-- .../CompanyAllMessageHandler.php | 5 ++-- .../MessageHandler/GameAllMessageHandler.php | 5 ++-- .../MessageHandler/ImportMessageHandler.php | 7 ++--- .../MessageHandler/MetaAllMessageHandler.php | 11 ++++---- .../src/MessageHandler/MetaMessageHandler.php | 18 ++---------- .../MessageHandler/MovieAllMessageHandler.php | 5 ++-- .../PersonAllMessageHandler.php | 5 ++-- .../MessageHandler/SagaAllMessageHandler.php | 5 ++-- .../SearchGameMessageHandler.php | 5 ++-- .../SeasonAllMessageHandler.php | 5 ++-- .../MessageHandler/SerieAllMessageHandler.php | 5 ++-- .../MessageHandler/StoryAllMessageHandler.php | 5 ++-- .../UpdateSerieMessageHandler.php | 5 ++-- .../Middleware/DeduplicationMiddleware.php | 12 ++++---- apps/src/Paragraph/PersonParagraph.php | 1 - apps/src/Repository/CastingRepository.php | 3 +- apps/src/Scheduler/CronSchedule.php | 1 - apps/src/Service/FileService.php | 28 ++++++++----------- apps/src/Service/FrontService.php | 1 - apps/src/Service/Imdb/CompanyService.php | 5 ++-- apps/src/Service/Imdb/PersonService.php | 5 ++-- apps/src/Service/Imdb/SagaService.php | 5 ++-- apps/src/Service/Imdb/SeasonService.php | 5 ++-- apps/src/Service/Imdb/SerieService.php | 5 ++-- apps/src/Service/MessageDispatcherService.php | 14 ++++------ apps/src/Service/ViewResolverService.php | 4 +-- apps/src/Twig/Extension/CastingExtension.php | 3 +- .../Twig/Runtime/CastingExtensionRuntime.php | 6 ++-- 50 files changed, 98 insertions(+), 132 deletions(-) diff --git a/apps/src/Command/ExecuteMessageCommand.php b/apps/src/Command/ExecuteMessageCommand.php index d2a6c3835..d40f707a6 100644 --- a/apps/src/Command/ExecuteMessageCommand.php +++ b/apps/src/Command/ExecuteMessageCommand.php @@ -12,7 +12,6 @@ use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Messenger\MessageBusInterface; #[AsCommand(name: 'labstag:execute:message', description: 'Execute selected messages',)] class ExecuteMessageCommand diff --git a/apps/src/Command/GeocodeInstallCommand.php b/apps/src/Command/GeocodeInstallCommand.php index 4c602d017..ca9ed26c4 100644 --- a/apps/src/Command/GeocodeInstallCommand.php +++ b/apps/src/Command/GeocodeInstallCommand.php @@ -14,7 +14,6 @@ use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Messenger\MessageBusInterface; #[AsCommand(name: 'labstag:geocode-install', description: 'Retrieve geocodes')] class GeocodeInstallCommand diff --git a/apps/src/Command/StarAddCommand.php b/apps/src/Command/StarAddCommand.php index bb4b908ee..7d24bbfd8 100644 --- a/apps/src/Command/StarAddCommand.php +++ b/apps/src/Command/StarAddCommand.php @@ -12,7 +12,6 @@ use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Messenger\MessageBusInterface; #[AsCommand(name: 'labstag:star-add', description: 'Get all star github with npm run star:get')] class StarAddCommand diff --git a/apps/src/Command/StoryPdfCommand.php b/apps/src/Command/StoryPdfCommand.php index e08245805..60330ee9e 100644 --- a/apps/src/Command/StoryPdfCommand.php +++ b/apps/src/Command/StoryPdfCommand.php @@ -11,7 +11,6 @@ use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Translation\TranslatableMessage; #[AsCommand(name: 'labstag:story-pdf', description: 'Generate PDF for story',)] diff --git a/apps/src/Controller/Admin/CrudControllerAbstract.php b/apps/src/Controller/Admin/CrudControllerAbstract.php index 8049492b6..358f7712d 100644 --- a/apps/src/Controller/Admin/CrudControllerAbstract.php +++ b/apps/src/Controller/Admin/CrudControllerAbstract.php @@ -46,7 +46,6 @@ use Symfony\Component\DependencyInjection\Attribute\AutoconfigureTag; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Translation\TranslatableMessage; use Symfony\Contracts\Translation\TranslatorInterface; diff --git a/apps/src/Controller/Admin/PersonCrudController.php b/apps/src/Controller/Admin/PersonCrudController.php index 05761bfa1..83c9a02ce 100644 --- a/apps/src/Controller/Admin/PersonCrudController.php +++ b/apps/src/Controller/Admin/PersonCrudController.php @@ -73,9 +73,9 @@ public function configureFields(string $pageName): iterable $textField = TextField::new('placeOfBirth', new TranslatableMessage('Place of birth')); $textField->hideOnIndex(); - $serieField = AssociationField::new('castings', new TranslatableMessage('Series')); - $serieField->setTemplatePath('admin/field/casting-series.html.twig'); - $serieField->onlyOnDetail(); + $associationField = AssociationField::new('castings', new TranslatableMessage('Series')); + $associationField->setTemplatePath('admin/field/casting-series.html.twig'); + $associationField->onlyOnDetail(); $movieField = AssociationField::new('castings', new TranslatableMessage('Movies')); $movieField->setTemplatePath('admin/field/casting-movies.html.twig'); @@ -113,7 +113,7 @@ public function configureFields(string $pageName): iterable $this->crudFieldFactory->addFieldsToTab( 'casting', [ - $serieField, + $associationField, $movieField, $seasonField, $episodeField, diff --git a/apps/src/Controller/BackController.php b/apps/src/Controller/BackController.php index fedebac56..4fc48afcc 100644 --- a/apps/src/Controller/BackController.php +++ b/apps/src/Controller/BackController.php @@ -20,7 +20,6 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Translation\TranslatableMessage; @@ -33,7 +32,7 @@ public function __construct( protected WorkflowService $workflowService, protected SiteService $siteService, protected IgdbApi $igdbApi, - private readonly MessageDispatcherService $messageBus, + private readonly MessageDispatcherService $messageDispatcherService, ) { } @@ -55,8 +54,8 @@ public function blank(): Response )] public function cacheclear(Request $request): Response { - $this->messageBus->dispatch(new ClearCacheMessage()); - $this->messageBus->dispatch(new DeleteOldFileMessage()); + $this->messageDispatcherService->dispatch(new ClearCacheMessage()); + $this->messageDispatcherService->dispatch(new DeleteOldFileMessage()); $this->addFlash('success', new TranslatableMessage('Cache cleared')); if ($request->headers->has('referer')) { $url = $request->headers->get('referer'); diff --git a/apps/src/Data/ChapterData.php b/apps/src/Data/ChapterData.php index cd9e55a25..fe17f4942 100644 --- a/apps/src/Data/ChapterData.php +++ b/apps/src/Data/ChapterData.php @@ -20,6 +20,7 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getStory(), $field); } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getImg(); diff --git a/apps/src/Data/EpisodeData.php b/apps/src/Data/EpisodeData.php index ef5eaf834..74a24cdfc 100644 --- a/apps/src/Data/EpisodeData.php +++ b/apps/src/Data/EpisodeData.php @@ -24,6 +24,7 @@ public function supportsData(object $entity): bool return $entity instanceof Episode; } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getImg(); diff --git a/apps/src/Data/GameData.php b/apps/src/Data/GameData.php index 1117fffd7..d452a38cb 100644 --- a/apps/src/Data/GameData.php +++ b/apps/src/Data/GameData.php @@ -25,6 +25,7 @@ public function generateSlug(object $entity): array return $slug; } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getImg(); diff --git a/apps/src/Data/MovieData.php b/apps/src/Data/MovieData.php index 08f57e04b..1ae3e3122 100644 --- a/apps/src/Data/MovieData.php +++ b/apps/src/Data/MovieData.php @@ -70,6 +70,7 @@ public function placeholder(): string return $this->configPlaceholder(); } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getPoster(); diff --git a/apps/src/Data/PersonData.php b/apps/src/Data/PersonData.php index e98713474..c9e77957c 100644 --- a/apps/src/Data/PersonData.php +++ b/apps/src/Data/PersonData.php @@ -39,6 +39,7 @@ public function match(?string $slug): bool return $page instanceof Person; } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getProfile(); diff --git a/apps/src/Data/PostData.php b/apps/src/Data/PostData.php index c869a6e51..35bf38332 100644 --- a/apps/src/Data/PostData.php +++ b/apps/src/Data/PostData.php @@ -28,6 +28,7 @@ public function generateSlug(object $entity): array return $slug; } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getImg(); diff --git a/apps/src/Data/SagaData.php b/apps/src/Data/SagaData.php index 7c80ce410..51926f697 100644 --- a/apps/src/Data/SagaData.php +++ b/apps/src/Data/SagaData.php @@ -27,6 +27,7 @@ public function asset(mixed $entity, string $field): string return $this->fileService->asset($entity, $field); } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getPoster(); diff --git a/apps/src/Data/SeasonData.php b/apps/src/Data/SeasonData.php index af99057c6..361c7b172 100644 --- a/apps/src/Data/SeasonData.php +++ b/apps/src/Data/SeasonData.php @@ -22,6 +22,7 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getRefserie(), $field); } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getPoster(); diff --git a/apps/src/Data/SerieData.php b/apps/src/Data/SerieData.php index 2d393d4ea..4f1e335dc 100644 --- a/apps/src/Data/SerieData.php +++ b/apps/src/Data/SerieData.php @@ -26,6 +26,7 @@ public function asset(mixed $entity, string $field): string return $this->fileService->asset($entity, $field); } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getPoster(); diff --git a/apps/src/Data/StoryData.php b/apps/src/Data/StoryData.php index 77cf988c1..a38412e29 100644 --- a/apps/src/Data/StoryData.php +++ b/apps/src/Data/StoryData.php @@ -28,6 +28,7 @@ public function generateSlug(object $entity): array return $slug; } + #[Override] public function getDefaultImage(object $entity): ?string { return $entity->getImg(); diff --git a/apps/src/Event/Abstract/EventEntityLib.php b/apps/src/Event/Abstract/EventEntityLib.php index 7dc54c032..598a01005 100644 --- a/apps/src/Event/Abstract/EventEntityLib.php +++ b/apps/src/Event/Abstract/EventEntityLib.php @@ -27,7 +27,6 @@ use Labstag\Service\WorkflowService; use ReflectionClass; use Symfony\Component\DependencyInjection\Attribute\Autowire; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Workflow\Registry; abstract class EventEntityLib diff --git a/apps/src/Event/Workflow/WorkflowAbstract.php b/apps/src/Event/Workflow/WorkflowAbstract.php index 08724c775..ff04346de 100644 --- a/apps/src/Event/Workflow/WorkflowAbstract.php +++ b/apps/src/Event/Workflow/WorkflowAbstract.php @@ -3,7 +3,6 @@ namespace Labstag\Event\Workflow; use Labstag\Service\MessageDispatcherService; -use Symfony\Component\Messenger\MessageBusInterface; abstract class WorkflowAbstract { diff --git a/apps/src/EventListener/MessageDispatcherResetListener.php b/apps/src/EventListener/MessageDispatcherResetListener.php index f35435f95..8d027c935 100644 --- a/apps/src/EventListener/MessageDispatcherResetListener.php +++ b/apps/src/EventListener/MessageDispatcherResetListener.php @@ -19,9 +19,9 @@ public function __construct( { } - public function __invoke(RequestEvent $event): void + public function __invoke(RequestEvent $requestEvent): void { - if (!$event->isMainRequest()) { + if (!$requestEvent->isMainRequest()) { return; } diff --git a/apps/src/MessageHandler/AddMovieMessageHandler.php b/apps/src/MessageHandler/AddMovieMessageHandler.php index 44b2c7ced..dfea6b483 100644 --- a/apps/src/MessageHandler/AddMovieMessageHandler.php +++ b/apps/src/MessageHandler/AddMovieMessageHandler.php @@ -8,13 +8,12 @@ use Labstag\Repository\MovieRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class AddMovieMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private MovieRepository $movieRepository, ) { @@ -49,7 +48,7 @@ public function __invoke(AddMovieMessage $addMovieMessage): void $movie->setFile(true); $this->movieRepository->save($movie); - $this->messageBus->dispatch(new MovieMessage($movie->getId())); + $this->messageDispatcherService->dispatch(new MovieMessage($movie->getId())); // do something with your message } } diff --git a/apps/src/MessageHandler/AddSerieMessageHandler.php b/apps/src/MessageHandler/AddSerieMessageHandler.php index e5ab286bd..06d4d3b44 100644 --- a/apps/src/MessageHandler/AddSerieMessageHandler.php +++ b/apps/src/MessageHandler/AddSerieMessageHandler.php @@ -8,13 +8,12 @@ use Labstag\Repository\SerieRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class AddSerieMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private SerieRepository $serieRepository, ) { @@ -47,6 +46,6 @@ public function __invoke(AddSerieMessage $addSerieMessage): void $serie->setFile(true); $this->serieRepository->save($serie); - $this->messageBus->dispatch(new SerieMessage($serie->getId())); + $this->messageDispatcherService->dispatch(new SerieMessage($serie->getId())); } } diff --git a/apps/src/MessageHandler/CompanyAllMessageHandler.php b/apps/src/MessageHandler/CompanyAllMessageHandler.php index 066f15cab..8cf7e59f8 100644 --- a/apps/src/MessageHandler/CompanyAllMessageHandler.php +++ b/apps/src/MessageHandler/CompanyAllMessageHandler.php @@ -7,13 +7,12 @@ use Labstag\Repository\CompanyRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class CompanyAllMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private CompanyRepository $companyRepository, ) { @@ -24,7 +23,7 @@ public function __invoke(CompanyAllMessage $companyAllMessage): void unset($companyAllMessage); $companies = $this->companyRepository->findAll(); foreach ($companies as $company) { - $this->messageBus->dispatch(new CompanyMessage($company->getId())); + $this->messageDispatcherService->dispatch(new CompanyMessage($company->getId())); } } } diff --git a/apps/src/MessageHandler/GameAllMessageHandler.php b/apps/src/MessageHandler/GameAllMessageHandler.php index e25ba247e..633be8204 100644 --- a/apps/src/MessageHandler/GameAllMessageHandler.php +++ b/apps/src/MessageHandler/GameAllMessageHandler.php @@ -7,13 +7,12 @@ use Labstag\Repository\GameRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class GameAllMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private GameRepository $gameRepository, ) { @@ -24,7 +23,7 @@ public function __invoke(GameAllMessage $gameAllMessage): void unset($gameAllMessage); $games = $this->gameRepository->findAll(); foreach ($games as $game) { - $this->messageBus->dispatch(new GameMessage($game->getId())); + $this->messageDispatcherService->dispatch(new GameMessage($game->getId())); } } } diff --git a/apps/src/MessageHandler/ImportMessageHandler.php b/apps/src/MessageHandler/ImportMessageHandler.php index 0c30aeb91..3dd6eef74 100644 --- a/apps/src/MessageHandler/ImportMessageHandler.php +++ b/apps/src/MessageHandler/ImportMessageHandler.php @@ -9,14 +9,13 @@ use Labstag\Service\FileService; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class ImportMessageHandler { public function __construct( private FileService $fileService, - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, ) { } @@ -84,7 +83,7 @@ private function importCsvFile(string $path, array $data, string $type): void $message = $this->createMessage($type, $row, $data); if (!is_null($message)) { - $this->messageBus->dispatch($message); + $this->messageDispatcherService->dispatch($message); } } } @@ -101,7 +100,7 @@ private function importXmlFile(string $path, array $data, string $type): void $message = $this->createMessage($type, $row, $data); if (!is_null($message)) { - $this->messageBus->dispatch($message); + $this->messageDispatcherService->dispatch($message); } } } diff --git a/apps/src/MessageHandler/MetaAllMessageHandler.php b/apps/src/MessageHandler/MetaAllMessageHandler.php index cfd4b3c6e..66741fc44 100644 --- a/apps/src/MessageHandler/MetaAllMessageHandler.php +++ b/apps/src/MessageHandler/MetaAllMessageHandler.php @@ -20,16 +20,17 @@ final class MetaAllMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, ) { } - public function __invoke(MetaAllMessage $message): void + + public function __invoke(MetaAllMessage $metaAllMessage): void { - unset($message); + unset($metaAllMessage); - $this->messageBus->dispatch(new MetaMessage('delete')); + $this->messageDispatcherService->dispatch(new MetaMessage('delete')); $entities = [ Game::class, Movie::class, @@ -42,7 +43,7 @@ public function __invoke(MetaAllMessage $message): void Story::class, ]; foreach ($entities as $entity) { - $this->messageBus->dispatch(new MetaMessage('check', $entity)); + $this->messageDispatcherService->dispatch(new MetaMessage('check', $entity)); } } } diff --git a/apps/src/MessageHandler/MetaMessageHandler.php b/apps/src/MessageHandler/MetaMessageHandler.php index e0905f01f..3f52fa18b 100644 --- a/apps/src/MessageHandler/MetaMessageHandler.php +++ b/apps/src/MessageHandler/MetaMessageHandler.php @@ -30,7 +30,7 @@ public function __invoke(MetaMessage $metaMessage): void }; } - private function correctionMeta($entity): void + private function correctionMeta(string $entity): void { try { $repository = $this->entityManager->getRepository($entity); @@ -45,24 +45,12 @@ private function correctionMeta($entity): void $item->setMeta($meta); $repository->save($item); } - } catch (Exception $e) { - echo $e->getMessage(); + } catch (Exception $exception) { + echo $exception->getMessage(); } } private function deleteUselessMeta(): void { - try { - // $repository = $this->entityManager->getRepository(Meta::class); - // $metas = $repository->findAll(); - // foreach ($metas as $meta) { - // $object = $this->metaService->getEntityParent($meta); - // if (is_null($object->value) || is_null($object->name) || is_null($object)) { - // $repository->delete($meta); - // } - // } - } catch (Exception $e) { - echo $e->getMessage(); - } } } diff --git a/apps/src/MessageHandler/MovieAllMessageHandler.php b/apps/src/MessageHandler/MovieAllMessageHandler.php index 94c273b44..f15611588 100644 --- a/apps/src/MessageHandler/MovieAllMessageHandler.php +++ b/apps/src/MessageHandler/MovieAllMessageHandler.php @@ -7,13 +7,12 @@ use Labstag\Repository\MovieRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class MovieAllMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private MovieRepository $movieRepository, ) { @@ -24,7 +23,7 @@ public function __invoke(MovieAllMessage $movieAllMessage): void unset($movieAllMessage); $movies = $this->movieRepository->findAll(); foreach ($movies as $movie) { - $this->messageBus->dispatch(new MovieMessage($movie->getId())); + $this->messageDispatcherService->dispatch(new MovieMessage($movie->getId())); } } } diff --git a/apps/src/MessageHandler/PersonAllMessageHandler.php b/apps/src/MessageHandler/PersonAllMessageHandler.php index 8c4c22544..19ac8cb55 100644 --- a/apps/src/MessageHandler/PersonAllMessageHandler.php +++ b/apps/src/MessageHandler/PersonAllMessageHandler.php @@ -7,13 +7,12 @@ use Labstag\Repository\PersonRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class PersonAllMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private PersonRepository $personRepository, ) { @@ -24,7 +23,7 @@ public function __invoke(PersonAllMessage $personAllMessage): void unset($personAllMessage); $persons = $this->personRepository->findAll(); foreach ($persons as $person) { - $this->messageBus->dispatch(new PersonMessage($person->getId())); + $this->messageDispatcherService->dispatch(new PersonMessage($person->getId())); } } } diff --git a/apps/src/MessageHandler/SagaAllMessageHandler.php b/apps/src/MessageHandler/SagaAllMessageHandler.php index 58399574e..ee38f6f17 100644 --- a/apps/src/MessageHandler/SagaAllMessageHandler.php +++ b/apps/src/MessageHandler/SagaAllMessageHandler.php @@ -7,13 +7,12 @@ use Labstag\Repository\SagaRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class SagaAllMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private SagaRepository $sagaRepository, ) { @@ -24,7 +23,7 @@ public function __invoke(SagaAllMessage $sagaAllMessage): void unset($sagaAllMessage); $sagas = $this->sagaRepository->findAll(); foreach ($sagas as $saga) { - $this->messageBus->dispatch(new SagaMessage($saga->getId())); + $this->messageDispatcherService->dispatch(new SagaMessage($saga->getId())); } } } diff --git a/apps/src/MessageHandler/SearchGameMessageHandler.php b/apps/src/MessageHandler/SearchGameMessageHandler.php index 2e0928559..530fac364 100644 --- a/apps/src/MessageHandler/SearchGameMessageHandler.php +++ b/apps/src/MessageHandler/SearchGameMessageHandler.php @@ -11,13 +11,12 @@ use Labstag\Service\MessageDispatcherService; use Labstag\Service\NotificationService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class SearchGameMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private GameService $gameService, private NotificationService $notificationService, private EntityManagerInterface $entityManager, @@ -52,7 +51,7 @@ public function __invoke(SearchGameMessage $searchGameMessage): void ); } - $this->messageBus->dispatch(new AddGameMessage($result['id'], 'game', $platform)); + $this->messageDispatcherService->dispatch(new AddGameMessage($result['id'], 'game', $platform)); } private function getGameByData(string $name): ?Game diff --git a/apps/src/MessageHandler/SeasonAllMessageHandler.php b/apps/src/MessageHandler/SeasonAllMessageHandler.php index 4bd64ff7f..c404dc504 100644 --- a/apps/src/MessageHandler/SeasonAllMessageHandler.php +++ b/apps/src/MessageHandler/SeasonAllMessageHandler.php @@ -7,13 +7,12 @@ use Labstag\Repository\SeasonRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class SeasonAllMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private SeasonRepository $seasonRepository, ) { @@ -24,7 +23,7 @@ public function __invoke(SeasonAllMessage $seasonAllMessage): void unset($seasonAllMessage); $seasons = $this->seasonRepository->findAll(); foreach ($seasons as $season) { - $this->messageBus->dispatch(new SeasonMessage($season->getId())); + $this->messageDispatcherService->dispatch(new SeasonMessage($season->getId())); } } } diff --git a/apps/src/MessageHandler/SerieAllMessageHandler.php b/apps/src/MessageHandler/SerieAllMessageHandler.php index 6b72afad0..811595c48 100644 --- a/apps/src/MessageHandler/SerieAllMessageHandler.php +++ b/apps/src/MessageHandler/SerieAllMessageHandler.php @@ -7,13 +7,12 @@ use Labstag\Repository\SerieRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class SerieAllMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private SerieRepository $serieRepository, ) { @@ -24,7 +23,7 @@ public function __invoke(SerieAllMessage $serieAllMessage): void unset($serieAllMessage); $series = $this->serieRepository->findAll(); foreach ($series as $serie) { - $this->messageBus->dispatch(new SerieMessage($serie->getId())); + $this->messageDispatcherService->dispatch(new SerieMessage($serie->getId())); } } } diff --git a/apps/src/MessageHandler/StoryAllMessageHandler.php b/apps/src/MessageHandler/StoryAllMessageHandler.php index 643cc6be8..a45f1f2e6 100644 --- a/apps/src/MessageHandler/StoryAllMessageHandler.php +++ b/apps/src/MessageHandler/StoryAllMessageHandler.php @@ -7,13 +7,12 @@ use Labstag\Repository\StoryRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class StoryAllMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private StoryRepository $storyRepository, ) { @@ -24,7 +23,7 @@ public function __invoke(StoryAllMessage $storyAllMessage): void unset($storyAllMessage); $stories = $this->storyRepository->findAll(); foreach ($stories as $story) { - $this->messageBus->dispatch(new StoryMessage($story->getId())); + $this->messageDispatcherService->dispatch(new StoryMessage($story->getId())); } } } diff --git a/apps/src/MessageHandler/UpdateSerieMessageHandler.php b/apps/src/MessageHandler/UpdateSerieMessageHandler.php index d1cab6417..d788e1b8a 100644 --- a/apps/src/MessageHandler/UpdateSerieMessageHandler.php +++ b/apps/src/MessageHandler/UpdateSerieMessageHandler.php @@ -7,13 +7,12 @@ use Labstag\Repository\SerieRepository; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -use Symfony\Component\Messenger\MessageBusInterface; #[AsMessageHandler] final class UpdateSerieMessageHandler { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private SerieRepository $serieRepository, ) { @@ -26,7 +25,7 @@ public function __invoke(UpdateSerieMessage $updateSerieMessage): void ['inProduction' => true] ); foreach ($series as $serie) { - $this->messageBus->dispatch(new SerieMessage($serie->getId())); + $this->messageDispatcherService->dispatch(new SerieMessage($serie->getId())); } } } diff --git a/apps/src/Middleware/DeduplicationMiddleware.php b/apps/src/Middleware/DeduplicationMiddleware.php index 0144d49cb..ce0b5f725 100644 --- a/apps/src/Middleware/DeduplicationMiddleware.php +++ b/apps/src/Middleware/DeduplicationMiddleware.php @@ -2,6 +2,7 @@ namespace Labstag\Middleware; +use ReflectionClass; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; @@ -37,14 +38,13 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope private function getMessageKey(object $message): string { - $className = get_class($message); - $reflection = new \ReflectionClass($message); + $className = $message::class; + $reflectionClass = new ReflectionClass($message); $properties = []; - foreach ($reflection->getProperties() as $property) { - $property->setAccessible(true); - $value = $property->getValue($message); - $properties[$property->getName()] = $this->serializeValue($value); + foreach ($reflectionClass->getProperties() as $reflectionProperty) { + $value = $reflectionProperty->getValue($message); + $properties[$reflectionProperty->getName()] = $this->serializeValue($value); } ksort($properties); diff --git a/apps/src/Paragraph/PersonParagraph.php b/apps/src/Paragraph/PersonParagraph.php index c8277da72..bbb9c8de3 100644 --- a/apps/src/Paragraph/PersonParagraph.php +++ b/apps/src/Paragraph/PersonParagraph.php @@ -6,7 +6,6 @@ use Generator; use Labstag\Entity\Paragraph; use Labstag\Entity\Person; -use Labstag\Entity\Saga; use Labstag\Entity\PersonParagraph as EntityPersonParagraph; use Override; use Symfony\Component\Translation\TranslatableMessage; diff --git a/apps/src/Repository/CastingRepository.php b/apps/src/Repository/CastingRepository.php index c59ea1197..dcac0c5dc 100644 --- a/apps/src/Repository/CastingRepository.php +++ b/apps/src/Repository/CastingRepository.php @@ -26,6 +26,7 @@ public function findWithActiveCastings(mixed $data): mixed $queryBuilder->innerJoin('c.refPerson', 'p'); $queryBuilder->addSelect('p'); $queryBuilder->andWhere('p.deletedAt IS NULL'); + $entityMap = [ Person::class => ['refPerson', 'person'], Movie::class => ['refMovie', 'movie'], @@ -35,7 +36,7 @@ public function findWithActiveCastings(mixed $data): mixed ]; foreach ($entityMap as $class => [$field, $param]) { if ($data instanceof $class) { - $queryBuilder->andWhere("c.{$field} = :{$param}"); + $queryBuilder->andWhere(sprintf('c.%s = :%s', $field, $param)); $queryBuilder->setParameter($param, $data); break; } diff --git a/apps/src/Scheduler/CronSchedule.php b/apps/src/Scheduler/CronSchedule.php index 09de5ac87..3aa23dbee 100644 --- a/apps/src/Scheduler/CronSchedule.php +++ b/apps/src/Scheduler/CronSchedule.php @@ -4,7 +4,6 @@ use Labstag\Message\BanIpMessage; use Labstag\Message\DeleteOldFileMessage; -use Labstag\Message\MetaAllMessage; use Labstag\Message\NotificationMessage; use Labstag\Message\UpdateSerieMessage; use Symfony\Component\Scheduler\Attribute\AsSchedule; diff --git a/apps/src/Service/FileService.php b/apps/src/Service/FileService.php index 1ac1edaf9..221c1948a 100644 --- a/apps/src/Service/FileService.php +++ b/apps/src/Service/FileService.php @@ -8,17 +8,13 @@ use Essence\Media; use Exception; use GdImage; -use Labstag\Entity\Block; -use Labstag\Entity\Paragraph; use Labstag\Message\FileDeleteMessage; use PhpOffice\PhpSpreadsheet\Reader\Csv; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use Psr\Log\LoggerInterface; -use ReflectionClass; use Symfony\Component\DependencyInjection\Attribute\AutowireIterator; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\HttpFoundation\File\UploadedFile; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Stamp\DelayStamp; use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyPathInterface; @@ -31,7 +27,7 @@ final class FileService public function __construct( #[AutowireIterator('labstag.filestorage')] private readonly iterable $fileStorages, - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private LoggerInterface $logger, private EntityManagerInterface $entityManager, private ParameterBagInterface $parameterBag, @@ -88,10 +84,10 @@ public function deletedFileByEntities(): void } $files = $fileStorage->getFilesByDirectory($fileStorage->getFilesystem(), ''); - foreach ($files as $row) { - $find = $this->findInEntities($entities, $row['path']); + foreach ($files as $file) { + $find = $this->findInEntities($entities, $file['path']); if (!$find) { - $deletes[] = $row['path']; + $deletes[] = $file['path']; } } @@ -102,8 +98,8 @@ public function deletedFileByEntities(): void private function findInEntities(array $entities, string $file): bool { $find = false; - foreach ($entities as $entityClass) { - $find = $this->findInEntity($entityClass, $file); + foreach ($entities as $entity) { + $find = $this->findInEntity($entity, $file); if ($find) { break; } @@ -114,7 +110,7 @@ private function findInEntities(array $entities, string $file): bool private function findInEntity(string $entityClass, string $file): bool { - $repository = $this->getRepository($entityClass); + $entityRepository = $this->getRepository($entityClass); $mappings = $this->propertyMappingFactory->fromObject(new $entityClass()); $search = []; foreach ($mappings as $mapping) { @@ -122,16 +118,16 @@ private function findInEntity(string $entityClass, string $file): bool $search[$field] = $file; } - $entity = $this->findInFields($repository, $search); + $entity = $this->findInFields($entityRepository, $search); return (0 !== count($entity)); } - private function findInFields($repository, array $fields) + private function findInFields(EntityRepository $entityRepository, array $fields): mixed { - $queryBuilder = $repository->createQueryBuilder('entity'); + $queryBuilder = $entityRepository->createQueryBuilder('entity'); foreach ($fields as $field => $value) { - $queryBuilder->orWhere("entity.$field = :$field"); + $queryBuilder->orWhere(sprintf('entity.%s = :%s', $field, $field)); $queryBuilder->setParameter($field, $value); } @@ -385,7 +381,7 @@ public function setUploadedFile(string $filePath, object $entity, string|Propert $filePath = $tempPath; } - $this->messageBus->dispatch(new FileDeleteMessage($filePath), [new DelayStamp(60_000)]); + $this->messageDispatcherService->dispatch(new FileDeleteMessage($filePath), [new DelayStamp(60_000)]); $uploadedFile = new UploadedFile( path: $filePath, diff --git a/apps/src/Service/FrontService.php b/apps/src/Service/FrontService.php index c74fa6aad..21dbb28ea 100644 --- a/apps/src/Service/FrontService.php +++ b/apps/src/Service/FrontService.php @@ -11,7 +11,6 @@ use Symfony\Component\DependencyInjection\Attribute\AutowireIterator; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Stamp\DelayStamp; class FrontService extends AbstractController diff --git a/apps/src/Service/Imdb/CompanyService.php b/apps/src/Service/Imdb/CompanyService.php index aa3837f91..471f4d4a3 100644 --- a/apps/src/Service/Imdb/CompanyService.php +++ b/apps/src/Service/Imdb/CompanyService.php @@ -9,13 +9,12 @@ use Labstag\Service\FileService; use Labstag\Service\MessageDispatcherService; use Psr\Log\LoggerInterface; -use Symfony\Component\Messenger\MessageBusInterface; final class CompanyService { public function __construct( private LoggerInterface $logger, - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private CompanyRepository $companyRepository, private FileService $fileService, private TheMovieDbApi $theMovieDbApi, @@ -35,7 +34,7 @@ public function getCompany(array $data): Company $company->setTitle($data['name']); $company->setTmdb($data['id']); $this->companyRepository->save($company); - $this->messageBus->dispatch(new CompanyMessage($company->getId())); + $this->messageDispatcherService->dispatch(new CompanyMessage($company->getId())); } return $company; diff --git a/apps/src/Service/Imdb/PersonService.php b/apps/src/Service/Imdb/PersonService.php index bba2fb961..08cdebf74 100644 --- a/apps/src/Service/Imdb/PersonService.php +++ b/apps/src/Service/Imdb/PersonService.php @@ -14,12 +14,11 @@ use Labstag\Message\PersonMessage; use Labstag\Service\FileService; use Labstag\Service\MessageDispatcherService; -use Symfony\Component\Messenger\MessageBusInterface; final class PersonService { public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private EntityManagerInterface $entityManager, private FileService $fileService, private TheMovieDbApi $theMovieDbApi, @@ -113,7 +112,7 @@ public function getPerson(array $data): Person $person->setTmdb($data['id']); $person->setTitle($data['name']); $entityRepository->save($person); - $this->messageBus->dispatch(new PersonMessage($person->getId())); + $this->messageDispatcherService->dispatch(new PersonMessage($person->getId())); } return $person; diff --git a/apps/src/Service/Imdb/SagaService.php b/apps/src/Service/Imdb/SagaService.php index ed404638d..6711fbc97 100644 --- a/apps/src/Service/Imdb/SagaService.php +++ b/apps/src/Service/Imdb/SagaService.php @@ -9,13 +9,12 @@ use Labstag\Service\FileService; use Labstag\Service\MessageDispatcherService; use Psr\Log\LoggerInterface; -use Symfony\Component\Messenger\MessageBusInterface; final class SagaService { public function __construct( private LoggerInterface $logger, - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private SagaRepository $sagaRepository, private FileService $fileService, private TheMovieDbApi $theMovieDbApi, @@ -36,7 +35,7 @@ public function getSaga(array $data): Saga $saga->setTitle($this->setName($data['name'])); $saga->setTmdb($data['id']); $this->sagaRepository->save($saga); - $this->messageBus->dispatch(new SagaMessage($saga->getId())); + $this->messageDispatcherService->dispatch(new SagaMessage($saga->getId())); } return $saga; diff --git a/apps/src/Service/Imdb/SeasonService.php b/apps/src/Service/Imdb/SeasonService.php index f103b1a4e..1719b54f4 100644 --- a/apps/src/Service/Imdb/SeasonService.php +++ b/apps/src/Service/Imdb/SeasonService.php @@ -10,13 +10,12 @@ use Labstag\Repository\SeasonRepository; use Labstag\Service\FileService; use Labstag\Service\MessageDispatcherService; -use Symfony\Component\Messenger\MessageBusInterface; final class SeasonService { public function __construct( private FileService $fileService, - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private SeasonRepository $seasonRepository, private EpisodeService $episodeService, private TheMovieDbApi $theMovieDbApi, @@ -145,7 +144,7 @@ private function updateEpisodes(Season $season, array $details): bool $episodes = $this->episodeService->getEpisodes($season); foreach ($episodes as $episode) { - $this->messageBus->dispatch(new EpisodeMessage($episode->getId())); + $this->messageDispatcherService->dispatch(new EpisodeMessage($episode->getId())); } return true; diff --git a/apps/src/Service/Imdb/SerieService.php b/apps/src/Service/Imdb/SerieService.php index 1fdc598b2..99ec7f639 100644 --- a/apps/src/Service/Imdb/SerieService.php +++ b/apps/src/Service/Imdb/SerieService.php @@ -14,7 +14,6 @@ use Labstag\Service\FileService; use Labstag\Service\MessageDispatcherService; use Labstag\Service\VideoService; -use Symfony\Component\Messenger\MessageBusInterface; final class SerieService { @@ -30,7 +29,7 @@ final class SerieService private array $year = []; public function __construct( - private MessageDispatcherService $messageBus, + private MessageDispatcherService $messageDispatcherService, private ConfigurationService $configurationService, private FileService $fileService, private CompanyService $companyService, @@ -365,7 +364,7 @@ private function updateSeasons(Serie $serie, array $details): bool $seasons = $this->seasonService->getSeasons($serie); foreach ($seasons as $season) { - $this->messageBus->dispatch(new SeasonMessage($season->getId())); + $this->messageDispatcherService->dispatch(new SeasonMessage($season->getId())); } return true; diff --git a/apps/src/Service/MessageDispatcherService.php b/apps/src/Service/MessageDispatcherService.php index 2c00e6ce6..e0b7016db 100644 --- a/apps/src/Service/MessageDispatcherService.php +++ b/apps/src/Service/MessageDispatcherService.php @@ -2,6 +2,7 @@ namespace Labstag\Service; +use ReflectionClass; use Symfony\Component\Messenger\MessageBusInterface; /** @@ -77,15 +78,14 @@ public function reset(): void */ private function getMessageKey(object $message): string { - $className = get_class($message); - $reflection = new \ReflectionClass($message); + $className = $message::class; + $reflectionClass = new ReflectionClass($message); $properties = []; - foreach ($reflection->getProperties() as $property) { - $property->setAccessible(true); - $value = $property->getValue($message); + foreach ($reflectionClass->getProperties() as $reflectionProperty) { + $value = $reflectionProperty->getValue($message); // Convertir les valeurs en string pour la comparaison - $properties[$property->getName()] = $this->serializeValue($value); + $properties[$reflectionProperty->getName()] = $this->serializeValue($value); } ksort($properties); @@ -103,8 +103,6 @@ private function extractClassName(string $messageKey): string /** * Sérialise une valeur pour la comparaison. - * - * @return mixed */ private function serializeValue(mixed $value): mixed { diff --git a/apps/src/Service/ViewResolverService.php b/apps/src/Service/ViewResolverService.php index 62b0cd15c..14f91322d 100644 --- a/apps/src/Service/ViewResolverService.php +++ b/apps/src/Service/ViewResolverService.php @@ -29,7 +29,7 @@ public function __construct( { } - private function getDefaultImageEntity($entity) + private function getDefaultImageEntity(object $entity) { $image = ''; foreach ($this->datas as $data) { @@ -51,7 +51,7 @@ public function getDataByEntity(object $entity, bool $disable = false): array return $this->requestCache[$cacheKey]; } - $reflectionClass = new ReflectionClass($entity); + new ReflectionClass($entity); $data = [ 'entity' => $entity, 'paragraphs' => $entity->getParagraphs()->getValues(), diff --git a/apps/src/Twig/Extension/CastingExtension.php b/apps/src/Twig/Extension/CastingExtension.php index d8aa43bd5..4530d1166 100644 --- a/apps/src/Twig/Extension/CastingExtension.php +++ b/apps/src/Twig/Extension/CastingExtension.php @@ -2,14 +2,15 @@ namespace Labstag\Twig\Extension; +use Override; use Labstag\Twig\Runtime\CastingExtensionRuntime; use Twig\Extension\AbstractExtension; -use Twig\TwigFilter; use Twig\TwigFunction; class CastingExtension extends AbstractExtension { + #[Override] public function getFunctions(): array { return [ diff --git a/apps/src/Twig/Runtime/CastingExtensionRuntime.php b/apps/src/Twig/Runtime/CastingExtensionRuntime.php index ee641463b..66d4c9b20 100644 --- a/apps/src/Twig/Runtime/CastingExtensionRuntime.php +++ b/apps/src/Twig/Runtime/CastingExtensionRuntime.php @@ -21,10 +21,9 @@ public function __construct( public function cast($data): mixed { - $repository = $this->entityManager->getRepository(Casting::class); - $castings = $repository->findWithActiveCastings($data); + $entityRepository = $this->entityManager->getRepository(Casting::class); - return $castings; + return $entityRepository->findWithActiveCastings($data); } public function series($data): array @@ -91,6 +90,7 @@ private function getByType(string $type, $data): array if ($row->getKnownForDepartment() != $type) { continue; } + $casting[] = $row; } From 304a8bd6a3888a93278a7f1344165c6adbc3c9c3 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Tue, 13 Jan 2026 15:31:11 +0100 Subject: [PATCH 43/50] =?UTF-8?q?feat:=20ajouter=20des=20options=20pour=20?= =?UTF-8?q?mettre=20=C3=A0=20jour=20les=20personnes,=20les=20films=20et=20?= =?UTF-8?q?les=20s=C3=A9ries=20dans=20la=20commande=20d'ex=C3=A9cution=20d?= =?UTF-8?q?es=20messages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Command/ExecuteMessageCommand.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/src/Command/ExecuteMessageCommand.php b/apps/src/Command/ExecuteMessageCommand.php index d40f707a6..30082a7b8 100644 --- a/apps/src/Command/ExecuteMessageCommand.php +++ b/apps/src/Command/ExecuteMessageCommand.php @@ -5,8 +5,11 @@ use Labstag\Message\BanIpMessage; use Labstag\Message\DeleteOldFileMessage; use Labstag\Message\MetaAllMessage; +use Labstag\Message\MovieAllMessage; use Labstag\Message\NotificationMessage; use Labstag\Message\PageCinemaMessage; +use Labstag\Message\PersonAllMessage; +use Labstag\Message\SerieAllMessage; use Labstag\Message\UpdateSerieMessage; use Labstag\Service\MessageDispatcherService; use Symfony\Component\Console\Attribute\AsCommand; @@ -30,12 +33,15 @@ public function __invoke(SymfonyStyle $symfonyStyle): int 'UpdateSerie' => 'Update series', 'Notification' => 'Send notifications', 'Meta' => 'Clean meta entries', + 'Person' => 'Update persons', + 'Movie' => 'Update movies', + 'Serie' => 'Update series', 'Files' => 'Clean files', 'All' => 'Execute all tasks', 'Cancel' => 'Cancel execution', ]; - $selected = $symfonyStyle->choice('Which task do you want to execute?', array_values($choices), 6); + $selected = $symfonyStyle->choice('Which task do you want to execute?', array_values($choices), 9); $selectedKey = array_search($selected, $choices, true); @@ -44,6 +50,9 @@ public function __invoke(SymfonyStyle $symfonyStyle): int 'BanIp' => BanIpMessage::class, 'UpdateSerie' => UpdateSerieMessage::class, 'Meta' => MetaAllMessage::class, + 'Person' => PersonAllMessage::class, + 'Movie' => MovieAllMessage::class, + 'Serie' => SerieAllMessage::class, 'Files' => DeleteOldFileMessage::class, 'Notification' => NotificationMessage::class, ]; From efefc9946000377388515d98e04fc800c1c5cf42 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Wed, 14 Jan 2026 12:17:27 +0100 Subject: [PATCH 44/50] =?UTF-8?q?feat:=20corriger=20les=20options=20de=20m?= =?UTF-8?q?ise=20=C3=A0=20jour=20des=20s=C3=A9ries=20et=20am=C3=A9liorer?= =?UTF-8?q?=20le=20dispatch=20des=20messages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Command/ExecuteMessageCommand.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/src/Command/ExecuteMessageCommand.php b/apps/src/Command/ExecuteMessageCommand.php index 30082a7b8..bd87056c0 100644 --- a/apps/src/Command/ExecuteMessageCommand.php +++ b/apps/src/Command/ExecuteMessageCommand.php @@ -30,29 +30,27 @@ public function __invoke(SymfonyStyle $symfonyStyle): int $choices = [ 'PageCinema' => 'Generate cinema pages', 'BanIp' => 'Ban IP addresses', - 'UpdateSerie' => 'Update series', + 'Series' => 'Update series', 'Notification' => 'Send notifications', 'Meta' => 'Clean meta entries', 'Person' => 'Update persons', 'Movie' => 'Update movies', - 'Serie' => 'Update series', 'Files' => 'Clean files', 'All' => 'Execute all tasks', 'Cancel' => 'Cancel execution', ]; - $selected = $symfonyStyle->choice('Which task do you want to execute?', array_values($choices), 9); + $selected = $symfonyStyle->choice('Which task do you want to execute?', array_values($choices), 8); $selectedKey = array_search($selected, $choices, true); $messages = [ 'PageCinema' => PageCinemaMessage::class, 'BanIp' => BanIpMessage::class, - 'UpdateSerie' => UpdateSerieMessage::class, + 'Series' => [UpdateSerieMessage::class, SerieAllMessage::class], 'Meta' => MetaAllMessage::class, 'Person' => PersonAllMessage::class, 'Movie' => MovieAllMessage::class, - 'Serie' => SerieAllMessage::class, 'Files' => DeleteOldFileMessage::class, 'Notification' => NotificationMessage::class, ]; @@ -66,7 +64,10 @@ public function __invoke(SymfonyStyle $symfonyStyle): int foreach ($toExecute as $key) { $symfonyStyle->section(sprintf('Dispatching %sMessage', $key)); - $this->messageBus->dispatch(new $messages[$key]()); + $messageClasses = is_array($messages[$key]) ? $messages[$key] : [$messages[$key]]; + foreach ($messageClasses as $messageClass) { + $this->messageBus->dispatch(new $messageClass()); + } } return Command::SUCCESS; From 472dabb19e2abf0ff6300d516604c22b43dff868 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Sun, 18 Jan 2026 16:12:14 +0100 Subject: [PATCH 45/50] =?UTF-8?q?fix:=20ajuster=20la=20commande=20de=20con?= =?UTF-8?q?sommation=20des=20messages=20et=20modifier=20le=20d=C3=A9lai=20?= =?UTF-8?q?de=20d=C3=A9marrage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/supervisor/conf.d/messenger.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/supervisor/conf.d/messenger.conf b/docker/supervisor/conf.d/messenger.conf index f911e3f22..e073f82fe 100644 --- a/docker/supervisor/conf.d/messenger.conf +++ b/docker/supervisor/conf.d/messenger.conf @@ -1,9 +1,9 @@ [program:messenger] -command=symfony console messenger:consume --all --time-limit=3600 --memory-limit=128M +command=symfony console messenger:consume --all directory=/var/www autostart=true autorestart=true -startsecs=5 +startsecs=0 numprocs=1 stdout_logfile=/dev/stdout From fa88b3279a7b0948b80dc34e9684b286184f0c71 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:06:29 +0100 Subject: [PATCH 46/50] =?UTF-8?q?fix:=20supprimer=20l'affichage=20du=20cha?= =?UTF-8?q?mp=20'seasons'=20uniquement=20en=20d=C3=A9tail=20dans=20le=20co?= =?UTF-8?q?ntr=C3=B4leur=20SerieCrud?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Controller/Admin/SerieCrudController.php | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/src/Controller/Admin/SerieCrudController.php b/apps/src/Controller/Admin/SerieCrudController.php index 802dbc8fc..334d25c74 100644 --- a/apps/src/Controller/Admin/SerieCrudController.php +++ b/apps/src/Controller/Admin/SerieCrudController.php @@ -169,7 +169,6 @@ public function configureFields(string $pageName): iterable $associationField = AssociationField::new('seasons', new TranslatableMessage('Seasons')); $associationField->setTemplatePath('admin/field/seasons.html.twig'); - $associationField->onlyOnDetail(); $collectionField = CollectionField::new('runtime', new TranslatableMessage('Runtime')); $collectionField->setTemplatePath('admin/field/runtime-serie.html.twig'); From 9b8471e6d42a0b9319262a12eb797b8a0811f50f Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Mon, 19 Jan 2026 13:07:25 +0100 Subject: [PATCH 47/50] =?UTF-8?q?feat:=20am=C3=A9liorer=20les=20requ=C3=AA?= =?UTF-8?q?tes=20de=20r=C3=A9cup=C3=A9ration=20des=20personnes=20et=20filt?= =?UTF-8?q?rer=20les=20s=C3=A9ries=20et=20films=20d=C3=A9sactiv=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Repository/PersonRepository.php | 14 +++++++++++++- .../src/Twig/Runtime/CastingExtensionRuntime.php | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/apps/src/Repository/PersonRepository.php b/apps/src/Repository/PersonRepository.php index 98865214a..1fce369b2 100644 --- a/apps/src/Repository/PersonRepository.php +++ b/apps/src/Repository/PersonRepository.php @@ -38,7 +38,19 @@ public function getQueryPaginator(array $query): Query public function getQueryBuilder(array $query): QueryBuilder { $queryBuilder = $this->createQueryBuilder('p'); - $queryBuilder->where('p.enable = :enable'); + $queryBuilder->distinct(); + $queryBuilder->innerJoin('p.castings', 'c'); + $queryBuilder->leftJoin('c.refMovie', 'm', 'WITH', 'm.enable = :enable'); + $queryBuilder->leftJoin('c.refSerie', 's', 'WITH', 's.enable = :enable'); + $queryBuilder->leftJoin('c.refSeason', 'sea', 'WITH', 'sea.enable = :enable'); + $queryBuilder->leftJoin('sea.refserie', 's2', 'WITH', 's2.enable = :enable'); + $queryBuilder->leftJoin('c.refEpisode', 'e', 'WITH', 'e.enable = :enable'); + $queryBuilder->leftJoin('e.refseason', 'sea2', 'WITH', 'sea2.enable = :enable'); + $queryBuilder->leftJoin('sea2.refserie', 's3', 'WITH', 's3.enable = :enable'); + $queryBuilder->where('m.id IS NOT NULL'); + $queryBuilder->orWhere('s.id IS NOT NULL'); + $queryBuilder->orWhere('sea.id IS NOT NULL AND s2.id IS NOT NULL'); + $queryBuilder->orWhere('e.id IS NOT NULL AND sea2.id IS NOT NULL AND s3.id IS NOT NULL'); $queryBuilder->setParameter('enable', true); return $queryBuilder->orderBy('p.' . $query['order'], $query['orderby']); diff --git a/apps/src/Twig/Runtime/CastingExtensionRuntime.php b/apps/src/Twig/Runtime/CastingExtensionRuntime.php index 66d4c9b20..ee95da613 100644 --- a/apps/src/Twig/Runtime/CastingExtensionRuntime.php +++ b/apps/src/Twig/Runtime/CastingExtensionRuntime.php @@ -42,6 +42,14 @@ public function series($data): array } } + foreach ($tab as $key => $serie) { + if ($serie->isEnable()) { + continue; + } + + unset($tab[$key]); + } + return $tab; } @@ -55,6 +63,14 @@ public function movies($data): array } } + foreach ($tab as $key => $movie) { + if ($movie->isEnable()) { + continue; + } + + unset($tab[$key]); + } + return $tab; } From 4c817b899fa63019cb3930879c604dec2922fdd6 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Wed, 6 May 2026 09:36:40 +0200 Subject: [PATCH 48/50] Refactor string concatenation for improved readability across multiple services and templates - Updated string concatenation to use adjacent syntax for better consistency in PlatformService, CompanyService, EpisodeService, MovieService, SagaService, SeasonService, SerieService, MessageDispatcherService, SecurityService, SiteService, SitemapService, StoryService, VideoService, ViewResolverService, and various SlugHandler classes. - Added a new method `getDispatchStats` in MessageDispatcherService to return dispatch statistics. - Removed redundant methods and improved code structure in CastingExtensionRuntime. - Adjusted test fixtures and performance tests for consistent string formatting. --- apps/config/preload.php | 4 +- apps/public/index.php | 2 +- apps/src/Api/IgdbApi.php | 18 +-- apps/src/Api/LibreTranslationApi.php | 14 +- apps/src/Api/TheMovieDbApi.php | 4 +- apps/src/Api/Tmdb/AbstractTmdbApi.php | 4 +- apps/src/Api/Tmdb/TmdbImagesApi.php | 8 +- apps/src/Api/Tmdb/TmdbMoviesApi.php | 48 +++---- apps/src/Api/Tmdb/TmdbOtherApi.php | 8 +- apps/src/Api/Tmdb/TmdbPersonApi.php | 4 +- apps/src/Api/Tmdb/TmdbTvApi.php | 68 +++++----- apps/src/Block/BlockAbstract.php | 4 +- apps/src/Command/ExecuteMessageCommand.php | 7 +- apps/src/Command/RegenerateSlugCommand.php | 6 +- apps/src/Command/StarAddCommand.php | 2 +- .../Admin/ConfigurationCrudController.php | 28 ++-- .../Admin/CrudControllerAbstract.php | 2 +- .../Controller/Admin/DashboardController.php | 2 +- .../Admin/Factory/CrudFieldFactory.php | 8 +- .../Controller/Admin/GameCrudController.php | 2 +- .../Controller/Admin/MovieCrudController.php | 6 +- .../Controller/Admin/PersonCrudController.php | 2 +- .../Admin/RedirectionCrudController.php | 14 +- .../Controller/Admin/SagaCrudController.php | 2 +- .../Controller/Admin/SeasonCrudController.php | 2 +- .../Controller/Admin/SerieCrudController.php | 6 +- apps/src/Controller/BackController.php | 4 +- apps/src/Data/ChapterData.php | 16 +-- apps/src/Data/DataAbstract.php | 2 +- apps/src/Data/EditoData.php | 10 +- apps/src/Data/EpisodeData.php | 12 +- apps/src/Data/GameData.php | 2 +- apps/src/Data/MemoData.php | 10 +- apps/src/Data/MovieData.php | 14 +- apps/src/Data/PersonData.php | 67 +++++----- apps/src/Data/PostData.php | 2 +- apps/src/Data/SagaData.php | 52 +++++++- apps/src/Data/SeasonData.php | 16 +-- apps/src/Data/SerieData.php | 14 +- apps/src/Data/StarData.php | 10 +- apps/src/Data/StoryData.php | 2 +- apps/src/DataFixtures/BlockFixtures.php | 4 +- apps/src/DataFixtures/CategoryFixtures.php | 4 +- apps/src/DataFixtures/ChapterFixtures.php | 2 +- apps/src/DataFixtures/EditoFixtures.php | 2 +- apps/src/DataFixtures/MemoFixtures.php | 2 +- apps/src/DataFixtures/PageFixtures.php | 2 +- apps/src/DataFixtures/PostFixtures.php | 2 +- apps/src/DataFixtures/StoryFixtures.php | 2 +- apps/src/DataFixtures/TagFixtures.php | 2 +- apps/src/DataFixtures/TemplateFixtures.php | 2 +- apps/src/DataFixtures/UserFixtures.php | 2 +- apps/src/Email/EmailAbstract.php | 8 +- apps/src/Entity/Configuration.php | 64 +++++----- apps/src/Entity/Paragraph.php | 30 ++--- apps/src/Entity/Person.php | 120 +++++++++--------- apps/src/Enum/PageEnum.php | 2 +- apps/src/Event/Subscriber/SiteSubscriber.php | 2 +- .../Configurator/ParagraphsConfigurator.php | 2 +- .../Configurator/WysiwygConfigurator.php | 2 +- apps/src/Field/ParagraphsField.php | 2 +- apps/src/FileStorage/FileStorageAbstract.php | 6 +- apps/src/Filter/CountriesFilter.php | 2 +- apps/src/Filter/SeasonEpisodeFilter.php | 2 +- apps/src/Filter/SerieEpisodeFilter.php | 2 +- apps/src/Form/Front/MovieType.php | 5 +- apps/src/Generate/CinemaGenerate.php | 2 +- apps/src/Message/MetaMessage.php | 13 +- .../MessageHandler/MetaAllMessageHandler.php | 1 - .../src/MessageHandler/MetaMessageHandler.php | 8 +- .../Middleware/DeduplicationMiddleware.php | 10 +- apps/src/Paragraph/FormParagraph.php | 2 +- apps/src/Paragraph/ParagraphAbstract.php | 12 +- apps/src/Replace/LinkApprovalReplace.php | 2 +- .../src/Replace/LinkChangePasswordReplace.php | 2 +- apps/src/Replace/LinkLoginReplace.php | 2 +- apps/src/Repository/BlockRepository.php | 14 +- apps/src/Repository/CastingRepository.php | 27 +++- apps/src/Repository/ChapterRepository.php | 2 +- apps/src/Repository/EpisodeRepository.php | 2 +- apps/src/Repository/GameRepository.php | 4 +- apps/src/Repository/GeoCodeRepository.php | 6 +- .../Repository/HttpErrorLogsRepository.php | 2 +- apps/src/Repository/MovieRepository.php | 10 +- apps/src/Repository/PageRepository.php | 4 +- apps/src/Repository/ParagraphRepository.php | 2 +- apps/src/Repository/PersonRepository.php | 32 ++--- apps/src/Repository/PostRepository.php | 4 +- apps/src/Repository/SagaRepository.php | 4 +- apps/src/Repository/SeasonRepository.php | 4 +- apps/src/Repository/SerieRepository.php | 2 +- apps/src/Repository/StarRepository.php | 6 +- apps/src/Repository/StoryRepository.php | 2 +- apps/src/Repository/UserRepository.php | 2 +- apps/src/Scheduler/GenerateSchedule.php | 4 +- apps/src/Service/EtagCacheService.php | 10 +- apps/src/Service/FileService.php | 100 +++++++-------- apps/src/Service/GeocodeService.php | 4 +- apps/src/Service/Igdb/GameService.php | 14 +- apps/src/Service/Igdb/PlatformService.php | 6 +- apps/src/Service/Imdb/CompanyService.php | 2 +- apps/src/Service/Imdb/EpisodeService.php | 4 +- apps/src/Service/Imdb/MovieService.php | 4 +- apps/src/Service/Imdb/SagaService.php | 2 +- apps/src/Service/Imdb/SeasonService.php | 6 +- apps/src/Service/Imdb/SerieService.php | 4 +- apps/src/Service/MessageDispatcherService.php | 57 +++++---- apps/src/Service/SecurityService.php | 6 +- apps/src/Service/SiteService.php | 8 +- apps/src/Service/SitemapService.php | 4 +- apps/src/Service/StoryService.php | 16 +-- apps/src/Service/VideoService.php | 4 +- apps/src/Service/ViewResolverService.php | 30 ++--- apps/src/SlugHandler/ChapterSlugHandler.php | 2 +- apps/src/SlugHandler/MovieSlugHandler.php | 4 +- apps/src/SlugHandler/PageSlugHandler.php | 8 +- apps/src/SlugHandler/SagaSlugHandler.php | 2 +- apps/src/Template/TemplateAbstract.php | 8 +- apps/src/Twig/Extension/CastingExtension.php | 3 +- .../Twig/Runtime/AdminExtensionRuntime.php | 2 +- .../Twig/Runtime/BlockExtensionRuntime.php | 4 +- .../Twig/Runtime/CastingExtensionRuntime.php | 76 +++++------ .../Twig/Runtime/DebugExtensionRuntime.php | 8 +- .../Twig/Runtime/FrontExtensionRuntime.php | 2 +- .../Runtime/ParagraphExtensionRuntime.php | 4 +- .../src/Twig/Runtime/TimeExtensionRuntime.php | 10 +- apps/tests/Fixtures/PerformanceFixtures.php | 2 +- .../Performance/CachePerformanceTest.php | 10 +- .../Unit/Service/EtagCacheServiceTest.php | 2 +- apps/tests/bootstrap.php | 8 +- apps/tests/object-manager.php | 4 +- 131 files changed, 732 insertions(+), 678 deletions(-) diff --git a/apps/config/preload.php b/apps/config/preload.php index dc678e4ef..85df1e027 100644 --- a/apps/config/preload.php +++ b/apps/config/preload.php @@ -1,5 +1,5 @@ new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); diff --git a/apps/src/Api/IgdbApi.php b/apps/src/Api/IgdbApi.php index ecc02df84..6841ceace 100644 --- a/apps/src/Api/IgdbApi.php +++ b/apps/src/Api/IgdbApi.php @@ -50,7 +50,7 @@ public function buildImageUrl(string $imageId, string $size = 'cover_big'): stri */ public function getGameDetails(int $gameId): ?array { - $cacheKey = 'igdb_game_' . $gameId; + $cacheKey = 'igdb_game_'.$gameId; return $this->getCached( $cacheKey, @@ -106,22 +106,22 @@ public function setBody( $body[] = sprintf('search "%s"', $search); } - $body[] = ([] === $fields) ? 'fields *' : 'fields ' . implode(',', $fields); + $body[] = ([] === $fields) ? 'fields *' : 'fields '.implode(',', $fields); if ([] !== $where) { - $body[] = 'where ' . implode(' & ', $where); + $body[] = 'where '.implode(' & ', $where); } - $body[] = 'limit ' . min($limit, 500); + $body[] = 'limit '.min($limit, 500); if (0 !== $offset) { - $body[] = 'offset ' . $offset; + $body[] = 'offset '.$offset; } - return implode(';', $body) . ';'; + return implode(';', $body).';'; } public function setUrl(string $url, string $body): mixed { - $cacheKey = 'igdb_' . $url . '_' . md5($body); + $cacheKey = 'igdb_'.$url.'_'.md5($body); return $this->getCached( $cacheKey, @@ -231,11 +231,11 @@ private function makeRequest(string $endpoint, string $body): ?array try { $response = $this->httpClient->request( 'POST', - self::BASE_URL . '/' . $endpoint, + self::BASE_URL.'/'.$endpoint, [ 'headers' => [ 'Client-ID' => $this->igdbClientId, - 'Authorization' => 'Bearer ' . $token, + 'Authorization' => 'Bearer '.$token, ], 'body' => $body, ] diff --git a/apps/src/Api/LibreTranslationApi.php b/apps/src/Api/LibreTranslationApi.php index e981fa54e..0b2500e38 100644 --- a/apps/src/Api/LibreTranslationApi.php +++ b/apps/src/Api/LibreTranslationApi.php @@ -33,7 +33,7 @@ public function __construct( */ public function detectLanguage(string $text): array { - $cacheKey = 'language_detect_' . md5($text); + $cacheKey = 'language_detect_'.md5($text); return $this->cacheService->get( $cacheKey, @@ -41,7 +41,7 @@ function () use ($text): array { $headers = ['Content-Type' => 'application/json']; if (null !== $this->translationApiKey) { - $headers['Authorization'] = 'Basic ' . $this->translationApiKey; + $headers['Authorization'] = 'Basic '.$this->translationApiKey; } try { @@ -61,7 +61,7 @@ function () use ($text): array { 'language' => '', 'confidence' => 0.0, 'success' => false, - 'error' => 'HTTP Error: ' . $statusCode, + 'error' => 'HTTP Error: '.$statusCode, ]; } @@ -102,7 +102,7 @@ function (): array { $headers = []; if (null !== $this->translationApiKey) { - $headers['Authorization'] = 'Basic ' . $this->translationApiKey; + $headers['Authorization'] = 'Basic '.$this->translationApiKey; } try { @@ -118,7 +118,7 @@ function (): array { return [ 'languages' => [], 'success' => false, - 'error' => 'HTTP Error: ' . $statusCode, + 'error' => 'HTTP Error: '.$statusCode, ]; } @@ -160,7 +160,7 @@ function () use ($text, $sourceLanguage, $targetLanguage): array { $headers = ['Content-Type' => 'application/json']; if (null !== $this->translationApiKey) { - $headers['Authorization'] = 'Basic ' . $this->translationApiKey; + $headers['Authorization'] = 'Basic '.$this->translationApiKey; } try { @@ -182,7 +182,7 @@ function () use ($text, $sourceLanguage, $targetLanguage): array { return [ 'translatedText' => '', 'success' => false, - 'error' => 'HTTP Error: ' . $statusCode, + 'error' => 'HTTP Error: '.$statusCode, ]; } diff --git a/apps/src/Api/TheMovieDbApi.php b/apps/src/Api/TheMovieDbApi.php index 4e68b1c68..3c8d60ea4 100644 --- a/apps/src/Api/TheMovieDbApi.php +++ b/apps/src/Api/TheMovieDbApi.php @@ -285,7 +285,7 @@ public function tvserie(): TmdbTvApi private function getJson(object $object) { - $cacheKey = 'api_tmdb_' . $object->getId(); + $cacheKey = 'api_tmdb_'.$object->getId(); $cacheItem = $this->filesystemAdapter->getItem($cacheKey); if ($cacheItem->isHit()) { return $cacheItem->get(); @@ -307,7 +307,7 @@ private function getVideosSerie(string $tmdbId): ?array private function setJson(object $object, array $data, int $ttl = 3600): void { - $cacheKey = 'api_tmdb_' . $object->getId(); + $cacheKey = 'api_tmdb_'.$object->getId(); $cacheItem = $this->filesystemAdapter->getItem($cacheKey); $cacheItem->set($data); $cacheItem->expiresAfter($ttl); diff --git a/apps/src/Api/Tmdb/AbstractTmdbApi.php b/apps/src/Api/Tmdb/AbstractTmdbApi.php index ff7f5e744..84dd6317c 100644 --- a/apps/src/Api/Tmdb/AbstractTmdbApi.php +++ b/apps/src/Api/Tmdb/AbstractTmdbApi.php @@ -34,7 +34,7 @@ protected function buildQueryParams(array $params): string { $filtered = array_filter($params, fn ($value): bool => null !== $value && '' !== $value); - return [] === $filtered ? '' : '?' . http_build_query($filtered); + return [] === $filtered ? '' : '?'.http_build_query($filtered); } /** @@ -67,7 +67,7 @@ protected function makeRequest(string $url): ?array $url, [ 'headers' => [ - 'Authorization' => 'Bearer ' . $this->tmdbBearerToken, + 'Authorization' => 'Bearer '.$this->tmdbBearerToken, 'accept' => 'application/json', ], ] diff --git a/apps/src/Api/Tmdb/TmdbImagesApi.php b/apps/src/Api/Tmdb/TmdbImagesApi.php index a4d47a87b..65d07fb21 100644 --- a/apps/src/Api/Tmdb/TmdbImagesApi.php +++ b/apps/src/Api/Tmdb/TmdbImagesApi.php @@ -52,7 +52,7 @@ public function getOptimizedUrl(string $imagePath, string $imageType, int $targe } $sizes = $this->getAvailableSizes(); - $typeSizes = $sizes[$imageType . '_sizes'] ?? []; + $typeSizes = $sizes[$imageType.'_sizes'] ?? []; if (empty($typeSizes)) { return $this->getUrl($imagePath, 'w500'); @@ -119,10 +119,10 @@ public function getUrl(string $imagePath, string $size = 'w500'): ?string $config = $this->getConfiguration(); if (null === $config || !isset($config['images']['secure_base_url'])) { // Fallback to known TMDB base URL if config fails - return 'https://image.tmdb.org/t/p/' . $size . $imagePath; + return 'https://image.tmdb.org/t/p/'.$size.$imagePath; } - return $config['images']['secure_base_url'] . $size . $imagePath; + return $config['images']['secure_base_url'].$size.$imagePath; } /** @@ -227,7 +227,7 @@ private function getConfiguration(): ?array return $this->getCached( $cacheKey, function (ItemInterface $item): ?array { - $url = self::BASE_URL . '/configuration'; + $url = self::BASE_URL.'/configuration'; $data = $this->makeRequest($url); if (null === $data) { diff --git a/apps/src/Api/Tmdb/TmdbMoviesApi.php b/apps/src/Api/Tmdb/TmdbMoviesApi.php index 99f38f6db..87df8e47e 100644 --- a/apps/src/Api/Tmdb/TmdbMoviesApi.php +++ b/apps/src/Api/Tmdb/TmdbMoviesApi.php @@ -39,12 +39,12 @@ public function discover( ); $query = http_build_query($params); - $cacheKey = 'tmdb_movies_' . md5($query); + $cacheKey = 'tmdb_movies_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($query): ?array { - $url = self::BASE_URL . '/discover/movie?' . $query; + $url = self::BASE_URL.'/discover/movie?'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { @@ -108,12 +108,12 @@ public function getCredits(string $movieId, ?string $language = null): ?array ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_movie_credits_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_credits_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/credits' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/credits'.$query; $data = $this->makeRequest($url); if (null === $data || (empty($data['cast']) && empty($data['crew']))) { @@ -148,12 +148,12 @@ public function getDetails(string $movieId, ?string $language = null, ?string $a ]; $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_movie_details_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_details_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query) { - $url = self::BASE_URL . '/movie/' . $movieId . $query; + $url = self::BASE_URL.'/movie/'.$movieId.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['title'])) { @@ -186,12 +186,12 @@ public function getImages(string $movieId, ?string $includeImageLanguage = null) ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_movie_images_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_images_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/images' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/images'.$query; $data = $this->makeRequest($url); if (null === $data || (empty($data['backdrops']) && empty($data['posters']))) { @@ -230,12 +230,12 @@ public function getMovieCollection(string $collectionId, ?string $language = nul ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_collection_' . $collectionId . '_' . md5($query); + $cacheKey = 'tmdb_collection_'.$collectionId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($collectionId, $query) { - $url = self::BASE_URL . '/collection/' . $collectionId . $query; + $url = self::BASE_URL.'/collection/'.$collectionId.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { @@ -266,12 +266,12 @@ public function getMovieExternalIds(string $movieId): ?array return null; } - $cacheKey = 'tmdb_movie_external_ids_' . $movieId; + $cacheKey = 'tmdb_movie_external_ids_'.$movieId; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/external_ids'; + $url = self::BASE_URL.'/movie/'.$movieId.'/external_ids'; $data = $this->makeRequest($url); if (null === $data) { @@ -300,12 +300,12 @@ function (ItemInterface $item) use ($movieId): ?array { public function getMovieRecommendations(string $movieId, array $additionalFilters = []): ?array { $query = http_build_query($additionalFilters); - $cacheKey = 'tmdb_movie_recommendations_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_recommendations_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/recommendations?' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/recommendations?'.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -336,12 +336,12 @@ public function getMovieReleasesDates(string $movieId): ?array return null; } - $cacheKey = 'tmdb_movie_release_dates_' . $movieId; + $cacheKey = 'tmdb_movie_release_dates_'.$movieId; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId) { - $url = self::BASE_URL . '/movie/' . $movieId . '/release_dates'; + $url = self::BASE_URL.'/movie/'.$movieId.'/release_dates'; $data = $this->makeRequest($url); if (null === $data || empty($data['results'])) { @@ -370,12 +370,12 @@ function (ItemInterface $item) use ($movieId) { public function getMovieSimilar(string $movieId, array $additionalFilters = []): ?array { $query = http_build_query($additionalFilters); - $cacheKey = 'tmdb_movie_similar_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_similar_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/similar?' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/similar?'.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -413,12 +413,12 @@ public function getPopular(int $page = 1, ?string $language = null, ?string $reg ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_popular_movies_' . md5($query); + $cacheKey = 'tmdb_popular_movies_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($query): ?array { - $url = self::BASE_URL . '/movie/popular' . $query; + $url = self::BASE_URL.'/movie/popular'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { @@ -451,12 +451,12 @@ public function getVideos(string $movieId, ?string $language = null): ?array ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_movie_videos_' . $movieId . '_' . md5($query); + $cacheKey = 'tmdb_movie_videos_'.$movieId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($movieId, $query): ?array { - $url = self::BASE_URL . '/movie/' . $movieId . '/videos' . $query; + $url = self::BASE_URL.'/movie/'.$movieId.'/videos'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'] ?? [])) { @@ -520,12 +520,12 @@ public function search( $params['page'] = $page; } - $cacheKey = 'tmdb_search_movies_' . md5(serialize($params)); + $cacheKey = 'tmdb_search_movies_'.md5(serialize($params)); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($params): ?array { - $url = self::BASE_URL . '/search/movie?' . http_build_query($params); + $url = self::BASE_URL.'/search/movie?'.http_build_query($params); $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { diff --git a/apps/src/Api/Tmdb/TmdbOtherApi.php b/apps/src/Api/Tmdb/TmdbOtherApi.php index 985f413cd..8ddf90478 100644 --- a/apps/src/Api/Tmdb/TmdbOtherApi.php +++ b/apps/src/Api/Tmdb/TmdbOtherApi.php @@ -33,12 +33,12 @@ public function findByImdb(string $externalId, ?string $language = null, string ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_find_' . $externalId . '_' . md5($query); + $cacheKey = 'tmdb_find_'.$externalId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($externalId, $query): ?array { - $url = self::BASE_URL . '/find/' . $externalId . $query; + $url = self::BASE_URL.'/find/'.$externalId.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -69,12 +69,12 @@ public function getCompanyDetails(string $companyId): ?array return null; } - $cacheKey = 'tmdb_company_details_' . $companyId; + $cacheKey = 'tmdb_company_details_'.$companyId; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($companyId): ?array { - $url = self::BASE_URL . '/company/' . $companyId; + $url = self::BASE_URL.'/company/'.$companyId; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { diff --git a/apps/src/Api/Tmdb/TmdbPersonApi.php b/apps/src/Api/Tmdb/TmdbPersonApi.php index e78aa359a..8300ed7d7 100644 --- a/apps/src/Api/Tmdb/TmdbPersonApi.php +++ b/apps/src/Api/Tmdb/TmdbPersonApi.php @@ -31,12 +31,12 @@ public function getDetails(string $personId, ?string $language = null, ?string $ ]; $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_person_details_' . $personId . '_' . md5($query); + $cacheKey = 'tmdb_person_details_'.$personId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($personId, $query): ?array { - $url = self::BASE_URL . '/person/' . $personId . $query; + $url = self::BASE_URL.'/person/'.$personId.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { diff --git a/apps/src/Api/Tmdb/TmdbTvApi.php b/apps/src/Api/Tmdb/TmdbTvApi.php index b54ed335f..1096151ca 100644 --- a/apps/src/Api/Tmdb/TmdbTvApi.php +++ b/apps/src/Api/Tmdb/TmdbTvApi.php @@ -32,12 +32,12 @@ public function discover(array $filters = [], ?string $language = null, int $pag ); $query = http_build_query($params); - $cacheKey = 'tmdb_tv_' . md5($query); + $cacheKey = 'tmdb_tv_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($query): ?array { - $url = self::BASE_URL . '/discover/tv?' . $query; + $url = self::BASE_URL.'/discover/tv?'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { @@ -86,12 +86,12 @@ public function getCredits(string $seriesId, ?string $language = null): ?array ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_credits_' . $seriesId . '_' . md5($query); + $cacheKey = 'tmdb_tv_credits_'.$seriesId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/credits' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/credits'.$query; $data = $this->makeRequest($url); if (null === $data || (empty($data['cast']) && empty($data['crew']))) { @@ -126,12 +126,12 @@ public function getDetails(string $seriesId, ?string $language = null, ?string $ ]; $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_series_details_' . $seriesId . '_' . md5($query); + $cacheKey = 'tmdb_tv_series_details_'.$seriesId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $query) { - $url = self::BASE_URL . '/tv/' . $seriesId . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { @@ -173,14 +173,14 @@ public function getEpisodeCredits( ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_episode_credits_' . $seriesId . '_s' . $seasonNumber . 'e' . $episodeNumber . '_' . md5( + $cacheKey = 'tmdb_tv_episode_credits_'.$seriesId.'_s'.$seasonNumber.'e'.$episodeNumber.'_'.md5( $query ); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/episode/' . $episodeNumber . '/credits' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/episode/'.$episodeNumber.'/credits'.$query; $data = $this->makeRequest($url); if (null === $data || (empty($data['cast']) && empty($data['crew']) && empty($data['guest_stars']))) { @@ -220,12 +220,12 @@ public function getEpisodeDetails( ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_episode_' . $seriesId . '_s' . $seasonNumber . 'e' . $episodeNumber . '_' . md5($query); + $cacheKey = 'tmdb_tv_episode_'.$seriesId.'_s'.$seasonNumber.'e'.$episodeNumber.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber, $query) { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/episode/' . $episodeNumber . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/episode/'.$episodeNumber.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { @@ -254,12 +254,12 @@ function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber, $q */ public function getEpisodeExternalIds(string $seriesId, int $seasonNumber, int $episodeNumber): ?array { - $cacheKey = 'tmdb_tv_episode_external_ids_' . $seriesId . '_s' . $seasonNumber . 'e' . $episodeNumber; + $cacheKey = 'tmdb_tv_episode_external_ids_'.$seriesId.'_s'.$seasonNumber.'e'.$episodeNumber; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/episode/' . $episodeNumber . '/external_ids'; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/episode/'.$episodeNumber.'/external_ids'; $data = $this->makeRequest($url); if (null === $data) { @@ -299,14 +299,14 @@ public function getEpisodeImages( ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_episode_images_' . $seriesId . '_s' . $seasonNumber . 'e' . $episodeNumber . '_' . md5( + $cacheKey = 'tmdb_tv_episode_images_'.$seriesId.'_s'.$seasonNumber.'e'.$episodeNumber.'_'.md5( $query ); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $episodeNumber, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/episode/' . $episodeNumber . '/images' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/episode/'.$episodeNumber.'/images'.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['stills'])) { @@ -339,12 +339,12 @@ public function getImages(string $seriesId, ?string $includeImageLanguage = null ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_images_' . $seriesId . '_' . md5($query); + $cacheKey = 'tmdb_tv_images_'.$seriesId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/images' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/images'.$query; $data = $this->makeRequest($url); if (null === $data || (empty($data['backdrops']) && empty($data['posters']))) { @@ -380,12 +380,12 @@ public function getPopular(int $page = 1, ?string $language = null): ?array ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_popular_tv_' . md5($query); + $cacheKey = 'tmdb_popular_tv_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($query): ?array { - $url = self::BASE_URL . '/tv/popular' . $query; + $url = self::BASE_URL.'/tv/popular'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'] ?? [])) { @@ -421,12 +421,12 @@ public function getSeasonCredits(string $seriesId, int $seasonNumber, ?string $l ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_season_credits_' . $seriesId . '_s' . $seasonNumber . '_' . md5($query); + $cacheKey = 'tmdb_tv_season_credits_'.$seriesId.'_s'.$seasonNumber.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/credits' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/credits'.$query; $data = $this->makeRequest($url); if (null === $data || (empty($data['cast']) && empty($data['crew']))) { @@ -460,12 +460,12 @@ public function getSeasonDetails(string $seriesId, int $seasonNumber, ?string $l ]; $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_season_' . $seriesId . '_' . $seasonNumber . '_' . md5($query); + $cacheKey = 'tmdb_tv_season_'.$seriesId.'_'.$seasonNumber.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $query) { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.$query; $data = $this->makeRequest($url); if (null === $data || empty($data['name'])) { @@ -499,12 +499,12 @@ public function getSeasonVideos(string $seriesId, int $seasonNumber, ?string $la ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_season_videos_' . $seriesId . '_s' . $seasonNumber . '_' . md5($query); + $cacheKey = 'tmdb_tv_season_videos_'.$seriesId.'_s'.$seasonNumber.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $seasonNumber, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/season/' . $seasonNumber . '/videos' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/season/'.$seasonNumber.'/videos'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'] ?? [])) { @@ -531,12 +531,12 @@ function (ItemInterface $item) use ($seriesId, $seasonNumber, $query): ?array { */ public function getTvExternalIds(string $tvId): ?array { - $cacheKey = 'tmdb_tv_external_ids_' . $tvId; + $cacheKey = 'tmdb_tv_external_ids_'.$tvId; return $this->getCached( $cacheKey, function (ItemInterface $item) use ($tvId): ?array { - $url = self::BASE_URL . '/tv/' . $tvId . '/external_ids'; + $url = self::BASE_URL.'/tv/'.$tvId.'/external_ids'; $data = $this->makeRequest($url); if (null === $data) { @@ -565,12 +565,12 @@ function (ItemInterface $item) use ($tvId): ?array { public function getTvRecommendations(string $tvId, array $additionalFilters = []): ?array { $query = http_build_query($additionalFilters); - $cacheKey = 'tmdb_tv_recommendations_' . $tvId . '_' . md5($query); + $cacheKey = 'tmdb_tv_recommendations_'.$tvId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($tvId, $query): ?array { - $url = self::BASE_URL . '/tv/' . $tvId . '/recommendations?' . $query; + $url = self::BASE_URL.'/tv/'.$tvId.'/recommendations?'.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -599,12 +599,12 @@ function (ItemInterface $item) use ($tvId, $query): ?array { public function getTvSimilar(string $tvId, array $additionalFilters = []): ?array { $query = http_build_query($additionalFilters); - $cacheKey = 'tmdb_tv_similar_' . $tvId . '_' . md5($query); + $cacheKey = 'tmdb_tv_similar_'.$tvId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($tvId, $query): ?array { - $url = self::BASE_URL . '/tv/' . $tvId . '/similar?' . $query; + $url = self::BASE_URL.'/tv/'.$tvId.'/similar?'.$query; $data = $this->makeRequest($url); if (null === $data) { @@ -637,12 +637,12 @@ public function getVideos(string $seriesId, ?string $language = null): ?array ); $query = $this->buildQueryParams($params); - $cacheKey = 'tmdb_tv_videos_' . $seriesId . '_' . md5($query); + $cacheKey = 'tmdb_tv_videos_'.$seriesId.'_'.md5($query); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($seriesId, $query): ?array { - $url = self::BASE_URL . '/tv/' . $seriesId . '/videos' . $query; + $url = self::BASE_URL.'/tv/'.$seriesId.'/videos'.$query; $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'] ?? [])) { @@ -700,12 +700,12 @@ public function search( $params['page'] = $page; } - $cacheKey = 'tmdb_search_tv_' . md5(serialize($params)); + $cacheKey = 'tmdb_search_tv_'.md5(serialize($params)); return $this->getCached( $cacheKey, function (ItemInterface $item) use ($params): ?array { - $url = self::BASE_URL . '/search/tv?' . http_build_query($params); + $url = self::BASE_URL.'/search/tv?'.http_build_query($params); $data = $this->makeRequest($url); if (null === $data || 0 === count($data['results'])) { diff --git a/apps/src/Block/BlockAbstract.php b/apps/src/Block/BlockAbstract.php index ffcaceabc..08e767240 100644 --- a/apps/src/Block/BlockAbstract.php +++ b/apps/src/Block/BlockAbstract.php @@ -159,8 +159,8 @@ protected function getTemplateContent(string $folder, string $type): array $htmltwig = '.html.twig'; $files = [ - 'blocks/' . $folder . '/' . $type . $htmltwig, - 'blocks/' . $folder . '/default' . $htmltwig, + 'blocks/'.$folder.'/'.$type.$htmltwig, + 'blocks/'.$folder.'/default'.$htmltwig, ]; $view = end($files); diff --git a/apps/src/Command/ExecuteMessageCommand.php b/apps/src/Command/ExecuteMessageCommand.php index bd87056c0..c1a9fa3c2 100644 --- a/apps/src/Command/ExecuteMessageCommand.php +++ b/apps/src/Command/ExecuteMessageCommand.php @@ -30,7 +30,7 @@ public function __invoke(SymfonyStyle $symfonyStyle): int $choices = [ 'PageCinema' => 'Generate cinema pages', 'BanIp' => 'Ban IP addresses', - 'Series' => 'Update series', + 'Series' => 'Update series', 'Notification' => 'Send notifications', 'Meta' => 'Clean meta entries', 'Person' => 'Update persons', @@ -47,7 +47,10 @@ public function __invoke(SymfonyStyle $symfonyStyle): int $messages = [ 'PageCinema' => PageCinemaMessage::class, 'BanIp' => BanIpMessage::class, - 'Series' => [UpdateSerieMessage::class, SerieAllMessage::class], + 'Series' => [ + UpdateSerieMessage::class, + SerieAllMessage::class, + ], 'Meta' => MetaAllMessage::class, 'Person' => PersonAllMessage::class, 'Movie' => MovieAllMessage::class, diff --git a/apps/src/Command/RegenerateSlugCommand.php b/apps/src/Command/RegenerateSlugCommand.php index f42ccc1b7..b371e9aa6 100644 --- a/apps/src/Command/RegenerateSlugCommand.php +++ b/apps/src/Command/RegenerateSlugCommand.php @@ -41,7 +41,7 @@ public function __invoke(SymfonyStyle $symfonyStyle): int ]; foreach ($entities as $entity) { - $symfonyStyle->section('Regenerating slugs for ' . $entity); + $symfonyStyle->section('Regenerating slugs for '.$entity); $repository = $this->entityManager->getRepository($entity); $items = $repository->findAll(); @@ -51,7 +51,7 @@ public function __invoke(SymfonyStyle $symfonyStyle): int $count = 0; foreach ($items as $item) { $title = $item->getTitle(); - $item->setTitle($title . ' '); + $item->setTitle($title.' '); $this->entityManager->persist($item); ++$count; @@ -75,7 +75,7 @@ public function __invoke(SymfonyStyle $symfonyStyle): int continue; } - $symfonyStyle->info('ℹ️ No slugs to regenerate for ' . $entity); + $symfonyStyle->info('ℹ️ No slugs to regenerate for '.$entity); } $symfonyStyle->success('🎉 All slugs have been successfully regenerated!'); diff --git a/apps/src/Command/StarAddCommand.php b/apps/src/Command/StarAddCommand.php index 7d24bbfd8..1ca259dfc 100644 --- a/apps/src/Command/StarAddCommand.php +++ b/apps/src/Command/StarAddCommand.php @@ -34,7 +34,7 @@ public function __invoke(SymfonyStyle $symfonyStyle, OutputInterface $output): i $filename = 'stars.json'; $file = $this->fileService->getFileInAdapter('private', $filename); if (!is_file($file)) { - $symfonyStyle->error('File not found ' . $filename); + $symfonyStyle->error('File not found '.$filename); return Command::SUCCESS; } diff --git a/apps/src/Controller/Admin/ConfigurationCrudController.php b/apps/src/Controller/Admin/ConfigurationCrudController.php index a6031f620..8028b168f 100644 --- a/apps/src/Controller/Admin/ConfigurationCrudController.php +++ b/apps/src/Controller/Admin/ConfigurationCrudController.php @@ -122,27 +122,27 @@ private function addConfigureFieldsPlaceHolders(string $pageName): array { $placeholders = [ 'chapter' => new TranslatableMessage('Chapter'), - 'edito' => new TranslatableMessage('Edito'), + 'edito' => new TranslatableMessage('Edito'), 'episode' => new TranslatableMessage('Episode'), - 'memo' => new TranslatableMessage('Memo'), - 'movie' => new TranslatableMessage('Movie'), - 'game' => new TranslatableMessage('Game'), - 'page' => new TranslatableMessage('Page'), - 'post' => new TranslatableMessage('Post'), - 'saga' => new TranslatableMessage('Saga'), - 'season' => new TranslatableMessage('Season'), - 'serie' => new TranslatableMessage('Serie'), - 'star' => new TranslatableMessage('Star'), - 'story' => new TranslatableMessage('Story'), - 'user' => new TranslatableMessage('User'), - 'person' => new TranslatableMessage('Person'), + 'memo' => new TranslatableMessage('Memo'), + 'movie' => new TranslatableMessage('Movie'), + 'game' => new TranslatableMessage('Game'), + 'page' => new TranslatableMessage('Page'), + 'post' => new TranslatableMessage('Post'), + 'saga' => new TranslatableMessage('Saga'), + 'season' => new TranslatableMessage('Season'), + 'serie' => new TranslatableMessage('Serie'), + 'star' => new TranslatableMessage('Star'), + 'story' => new TranslatableMessage('Story'), + 'user' => new TranslatableMessage('User'), + 'person' => new TranslatableMessage('Person'), ]; $fields = []; foreach ($placeholders as $key => $label) { $fields[] = FormField::addColumn(6); $fields[] = $this->crudFieldFactory->imageField( - $key . 'Placeholder', + $key.'Placeholder', $pageName, self::getEntityFqcn(), $label->getMessage() diff --git a/apps/src/Controller/Admin/CrudControllerAbstract.php b/apps/src/Controller/Admin/CrudControllerAbstract.php index 358f7712d..e7dbadb0c 100644 --- a/apps/src/Controller/Admin/CrudControllerAbstract.php +++ b/apps/src/Controller/Admin/CrudControllerAbstract.php @@ -161,7 +161,7 @@ public function linkw3CValidator(AdminContext $adminContext): RedirectResponse $params = $this->slugService->forEntity($entity); return $this->redirect( - 'https://validator.w3.org/nu/?doc=' . $this->generateUrl( + 'https://validator.w3.org/nu/?doc='.$this->generateUrl( 'front', $params, UrlGeneratorInterface::ABSOLUTE_URL diff --git a/apps/src/Controller/Admin/DashboardController.php b/apps/src/Controller/Admin/DashboardController.php index 6e49c35c9..f53428995 100644 --- a/apps/src/Controller/Admin/DashboardController.php +++ b/apps/src/Controller/Admin/DashboardController.php @@ -133,7 +133,7 @@ public function configureUserMenu(UserInterface $user): UserMenu $avatar = $user->getAvatar(); if ('' != $avatar) { $basePath = $this->fileService->getBasePath($user, 'avatarFile'); - $userMenu->setAvatarUrl($basePath . '/' . $avatar); + $userMenu->setAvatarUrl($basePath.'/'.$avatar); return $userMenu; } diff --git a/apps/src/Controller/Admin/Factory/CrudFieldFactory.php b/apps/src/Controller/Admin/Factory/CrudFieldFactory.php index f5b76877f..35730b45e 100644 --- a/apps/src/Controller/Admin/Factory/CrudFieldFactory.php +++ b/apps/src/Controller/Admin/Factory/CrudFieldFactory.php @@ -285,10 +285,10 @@ public function fileField( if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { $translatableMessage = new TranslatableMessage('File'); - return UploadFileField::new($type . 'File', $label ?? $translatableMessage->getMessage()); + return UploadFileField::new($type.'File', $label ?? $translatableMessage->getMessage()); } - $this->fileService->getBasePath($entityFqcn, $type . 'File'); + $this->fileService->getBasePath($entityFqcn, $type.'File'); return TextField::new($type, $label ?? new TranslatableMessage('File')); } @@ -326,13 +326,13 @@ public function imageField( { if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { $translatableMessage = new TranslatableMessage('Image'); - $uploadImageField = UploadImageField::new($type . 'File', $label ?? $translatableMessage->getMessage()); + $uploadImageField = UploadImageField::new($type.'File', $label ?? $translatableMessage->getMessage()); $uploadImageField->setTranslator($this->translator); return $uploadImageField; } - $basePath = $this->fileService->getBasePath($entityFqcn, $type . 'File'); + $basePath = $this->fileService->getBasePath($entityFqcn, $type.'File'); $imageField = ImageField::new($type, $label ?? new TranslatableMessage('Image')); $imageField->setBasePath($basePath); diff --git a/apps/src/Controller/Admin/GameCrudController.php b/apps/src/Controller/Admin/GameCrudController.php index 9bed22941..89476f53c 100644 --- a/apps/src/Controller/Admin/GameCrudController.php +++ b/apps/src/Controller/Admin/GameCrudController.php @@ -276,7 +276,7 @@ public function importFileGame(Request $request): JsonResponse $content = file_get_contents($file->getPathname()); $extension = $file->getClientOriginalExtension(); - $filename = uniqid('import_', true) . '.' . $extension; + $filename = uniqid('import_', true).'.'.$extension; $this->fileService->saveFileInAdapter('private', $filename, $content); $this->messageBus->dispatch(new ImportMessage($filename, 'game', $data)); diff --git a/apps/src/Controller/Admin/MovieCrudController.php b/apps/src/Controller/Admin/MovieCrudController.php index 1531e7b35..b0e572675 100644 --- a/apps/src/Controller/Admin/MovieCrudController.php +++ b/apps/src/Controller/Admin/MovieCrudController.php @@ -284,7 +284,7 @@ public function imdb(Request $request): RedirectResponse $repositoryAbstract = $this->getRepository(); $movie = $repositoryAbstract->find($entityId); - return $this->redirect('https://www.imdb.com/title/' . $movie->getImdb() . '/'); + return $this->redirect('https://www.imdb.com/title/'.$movie->getImdb().'/'); } public function importFileMovie(Request $request): JsonResponse @@ -302,7 +302,7 @@ public function importFileMovie(Request $request): JsonResponse $content = file_get_contents($file->getPathname()); $extension = $file->getClientOriginalExtension(); - $filename = uniqid('import_', true) . '.' . $extension; + $filename = uniqid('import_', true).'.'.$extension; $this->fileService->saveFileInAdapter('private', $filename, $content); $this->messageBus->dispatch(new ImportMessage($filename, 'movie', [])); @@ -358,7 +358,7 @@ public function tmdb(Request $request): RedirectResponse $repositoryAbstract = $this->getRepository(); $movie = $repositoryAbstract->find($entityId); - return $this->redirect('https://www.themoviedb.org/movie/' . $movie->getTmdb()); + return $this->redirect('https://www.themoviedb.org/movie/'.$movie->getTmdb()); } public function updateAllMovie(): RedirectResponse diff --git a/apps/src/Controller/Admin/PersonCrudController.php b/apps/src/Controller/Admin/PersonCrudController.php index 83c9a02ce..9169f9052 100644 --- a/apps/src/Controller/Admin/PersonCrudController.php +++ b/apps/src/Controller/Admin/PersonCrudController.php @@ -145,7 +145,7 @@ public function tmdb(Request $request): RedirectResponse $repositoryAbstract = $this->getRepository(); $movie = $repositoryAbstract->find($entityId); - return $this->redirect('https://www.themoviedb.org/person/' . $movie->getTmdb()); + return $this->redirect('https://www.themoviedb.org/person/'.$movie->getTmdb()); } public function updateAllPerson(): RedirectResponse diff --git a/apps/src/Controller/Admin/RedirectionCrudController.php b/apps/src/Controller/Admin/RedirectionCrudController.php index 92c8c78d0..691232a97 100644 --- a/apps/src/Controller/Admin/RedirectionCrudController.php +++ b/apps/src/Controller/Admin/RedirectionCrudController.php @@ -195,7 +195,7 @@ protected function sendToExport(array $header, array $rows): Response try { foreach (['Xlsx', 'Xls', 'Ods'] as $writerType) { - $path = $this->getFilename($now->format('Ymd') . '-export.', mb_strtolower($writerType)); + $path = $this->getFilename($now->format('Ymd').'-export.', mb_strtolower($writerType)); $writer = IOFactory::createWriter($spreadsheet, $writerType); $writer->save($path); $zipArchive->addFile($path, basename($path)); @@ -211,10 +211,10 @@ protected function sendToExport(array $header, array $rows): Response Response::HTTP_OK, [ 'Content-Type' => 'application/x-zip', - 'Content-Disposition' => 'attachment; filename="' . $now->format('Ymd') . '-export.zip"', + 'Content-Disposition' => 'attachment; filename="'.$now->format('Ymd').'-export.zip"', 'Cache:Control' => 'no-cache, must-revalidate', 'Expires' => 'Mon, 26 Jul 1997 05:00:00 GMT', - 'Last-Modified' => gmdate('D, d M Y H:i:s') . ' GMT', + 'Last-Modified' => gmdate('D, d M Y H:i:s').' GMT', 'Pragma' => 'no-cache', ] ); @@ -269,9 +269,9 @@ private function getFilename(string $filename, string $extension = 'xlsx'): stri { $originalExtension = pathinfo($filename, PATHINFO_EXTENSION); - return $this->getTemporaryFolder() . '/' . str_replace( - '.' . $originalExtension, - '.' . $extension, + return $this->getTemporaryFolder().'/'.str_replace( + '.'.$originalExtension, + '.'.$extension, basename($filename) ); } @@ -310,7 +310,7 @@ private function importCsv(UploadedFile $uploadedFile): array $source = parse_url((string) $row[$head['Source']]); $destination = $row[$head['Destination']]; $source = $source['path']; - $source .= isset($source['query']) ? '?' . $source['query'] : ''; + $source .= isset($source['query']) ? '?'.$source['query'] : ''; $redirection = $this->getRepository(Redirection::class)->findOneBy( ['source' => $source] ); diff --git a/apps/src/Controller/Admin/SagaCrudController.php b/apps/src/Controller/Admin/SagaCrudController.php index ba7fadbc0..af7600999 100644 --- a/apps/src/Controller/Admin/SagaCrudController.php +++ b/apps/src/Controller/Admin/SagaCrudController.php @@ -150,7 +150,7 @@ public function tmdb(Request $request): RedirectResponse $repositoryAbstract = $this->getRepository(); $saga = $repositoryAbstract->find($entityId); - return $this->redirect('https://www.themoviedb.org/collection/' . $saga->getTmdb()); + return $this->redirect('https://www.themoviedb.org/collection/'.$saga->getTmdb()); } public function updateAllSaga(): RedirectResponse diff --git a/apps/src/Controller/Admin/SeasonCrudController.php b/apps/src/Controller/Admin/SeasonCrudController.php index d9bcc3c72..966f4f4f6 100644 --- a/apps/src/Controller/Admin/SeasonCrudController.php +++ b/apps/src/Controller/Admin/SeasonCrudController.php @@ -181,7 +181,7 @@ public function tmdb(Request $request): RedirectResponse $season = $repositoryAbstract->find($entityId); return $this->redirect( - 'https://www.themoviedb.org/tv/' . $season->getRefserie()->getTmdb() . '/season/' . $season->getNumber() + 'https://www.themoviedb.org/tv/'.$season->getRefserie()->getTmdb().'/season/'.$season->getNumber() ); } diff --git a/apps/src/Controller/Admin/SerieCrudController.php b/apps/src/Controller/Admin/SerieCrudController.php index 334d25c74..2f8e83b3c 100644 --- a/apps/src/Controller/Admin/SerieCrudController.php +++ b/apps/src/Controller/Admin/SerieCrudController.php @@ -281,7 +281,7 @@ public function imdb(Request $request): RedirectResponse return $this->redirectToRoute('admin_serie_index'); } - return $this->redirect('https://www.imdb.com/title/' . $serie->getImdb() . '/'); + return $this->redirect('https://www.imdb.com/title/'.$serie->getImdb().'/'); } public function importFileSerie(Request $request): JsonResponse @@ -299,7 +299,7 @@ public function importFileSerie(Request $request): JsonResponse $content = file_get_contents($file->getPathname()); $extension = $file->getClientOriginalExtension(); - $filename = uniqid('import_', true) . '.' . $extension; + $filename = uniqid('import_', true).'.'.$extension; $this->fileService->saveFileInAdapter('private', $filename, $content); $this->messageBus->dispatch(new ImportMessage($filename, 'serie', [])); @@ -355,7 +355,7 @@ public function tmdb(Request $request): RedirectResponse $repositoryAbstract = $this->getRepository(); $serie = $repositoryAbstract->find($entityId); - return $this->redirect('https://www.themoviedb.org/tv/' . $serie->getTmdb()); + return $this->redirect('https://www.themoviedb.org/tv/'.$serie->getTmdb()); } public function updateAllSerie(): RedirectResponse diff --git a/apps/src/Controller/BackController.php b/apps/src/Controller/BackController.php index 4fc48afcc..6df39e9d9 100644 --- a/apps/src/Controller/BackController.php +++ b/apps/src/Controller/BackController.php @@ -102,9 +102,7 @@ public function emptyOrRestore(Request $request): Response name: 'admin_permission', defaults: ['_locale' => 'fr'] )] - public function permission( - Request $request, - ): Response + public function permission(Request $request): Response { if ($request->isMethod('POST')) { $groupId = $request->query->get('groupId'); diff --git a/apps/src/Data/ChapterData.php b/apps/src/Data/ChapterData.php index fe17f4942..3bbb44e57 100644 --- a/apps/src/Data/ChapterData.php +++ b/apps/src/Data/ChapterData.php @@ -20,21 +20,21 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getStory(), $field); } - #[Override] - public function getDefaultImage(object $entity): ?string - { - return $entity->getImg(); - } - #[Override] public function generateSlug(object $entity): array { $slug = parent::generateSlug($entity->getRefstory()); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function getEntity(?string $slug): object { @@ -65,7 +65,7 @@ public function getTitle(object $entity): string #[Override] public function getTitleMeta(object $entity): string { - return parent::getTitleMeta($entity->getRefstory()) . ' - ' . $this->getTitle($entity); + return parent::getTitleMeta($entity->getRefstory()).' - '.$this->getTitle($entity); } #[Override] diff --git a/apps/src/Data/DataAbstract.php b/apps/src/Data/DataAbstract.php index 38be6bf29..935133d84 100644 --- a/apps/src/Data/DataAbstract.php +++ b/apps/src/Data/DataAbstract.php @@ -135,6 +135,6 @@ protected function getHome(): ?object protected function globalPlaceholder(string $key): string { - return $this->fileService->asset($this->configurationService->getConfiguration(), $key . 'Placeholder'); + return $this->fileService->asset($this->configurationService->getConfiguration(), $key.'Placeholder'); } } diff --git a/apps/src/Data/EditoData.php b/apps/src/Data/EditoData.php index 9015ae8f0..ea9960bbc 100644 --- a/apps/src/Data/EditoData.php +++ b/apps/src/Data/EditoData.php @@ -7,6 +7,11 @@ class EditoData extends DataAbstract implements DataInterface { + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function placeholder(): string { @@ -18,11 +23,6 @@ public function placeholder(): string return $this->configPlaceholder(); } - public function getDefaultImage(object $entity): ?string - { - return $entity->getImg(); - } - #[Override] public function supportsAsset(object $entity): bool { diff --git a/apps/src/Data/EpisodeData.php b/apps/src/Data/EpisodeData.php index 74a24cdfc..0b7531f62 100644 --- a/apps/src/Data/EpisodeData.php +++ b/apps/src/Data/EpisodeData.php @@ -18,12 +18,6 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getRefseason(), 'backdrop'); } - #[Override] - public function supportsData(object $entity): bool - { - return $entity instanceof Episode; - } - #[Override] public function getDefaultImage(object $entity): ?string { @@ -46,4 +40,10 @@ public function supportsAsset(object $entity): bool { return $entity instanceof Episode; } + + #[Override] + public function supportsData(object $entity): bool + { + return $entity instanceof Episode; + } } diff --git a/apps/src/Data/GameData.php b/apps/src/Data/GameData.php index d452a38cb..cfd5a8f60 100644 --- a/apps/src/Data/GameData.php +++ b/apps/src/Data/GameData.php @@ -20,7 +20,7 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlugPage($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } diff --git a/apps/src/Data/MemoData.php b/apps/src/Data/MemoData.php index 39b5b2cb6..6ca040d1f 100644 --- a/apps/src/Data/MemoData.php +++ b/apps/src/Data/MemoData.php @@ -7,6 +7,11 @@ class MemoData extends DataAbstract implements DataInterface { + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function placeholder(): string { @@ -18,11 +23,6 @@ public function placeholder(): string return $this->configPlaceholder(); } - public function getDefaultImage(object $entity): ?string - { - return $entity->getImg(); - } - #[Override] public function supportsAsset(object $entity): bool { diff --git a/apps/src/Data/MovieData.php b/apps/src/Data/MovieData.php index 1ae3e3122..e4206d995 100644 --- a/apps/src/Data/MovieData.php +++ b/apps/src/Data/MovieData.php @@ -34,11 +34,17 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlugPage($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getPoster(); + } + #[Override] public function getEntity(?string $slug): object { @@ -70,12 +76,6 @@ public function placeholder(): string return $this->configPlaceholder(); } - #[Override] - public function getDefaultImage(object $entity): ?string - { - return $entity->getPoster(); - } - #[Override] public function supportsAsset(object $entity): bool { diff --git a/apps/src/Data/PersonData.php b/apps/src/Data/PersonData.php index c9e77957c..9958886fb 100644 --- a/apps/src/Data/PersonData.php +++ b/apps/src/Data/PersonData.php @@ -9,13 +9,6 @@ class PersonData extends PageData implements DataInterface { - - #[Override] - public function supportsAsset(object $entity): bool - { - return $entity instanceof Person; - } - #[Override] public function generateSlug(object $entity): array { @@ -26,11 +19,23 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlugPage($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getProfile(); + } + + #[Override] + public function getEntity(?string $slug): object + { + return $this->getEntityBySlugPerson($slug); + } + #[Override] public function match(?string $slug): bool { @@ -40,9 +45,26 @@ public function match(?string $slug): bool } #[Override] - public function getDefaultImage(object $entity): ?string + public function placeholder(): string { - return $entity->getProfile(); + $placeholder = $this->globalPlaceholder('person'); + if ('' !== $placeholder) { + return $placeholder; + } + + return parent::placeholder(); + } + + #[Override] + public function supportsAsset(object $entity): bool + { + return $entity instanceof Person; + } + + #[Override] + public function supportsData(object $entity): bool + { + return $entity instanceof Person; } protected function getEntityBySlugPerson(?string $slug): ?object @@ -69,27 +91,4 @@ protected function getEntityBySlugPerson(?string $slug): ?object ['slug' => $slugSecond] ); } - - #[Override] - public function getEntity(?string $slug): object - { - return $this->getEntityBySlugPerson($slug); - } - - #[Override] - public function supportsData(object $entity): bool - { - return $entity instanceof Person; - } - - #[Override] - public function placeholder(): string - { - $placeholder = $this->globalPlaceholder('person'); - if ('' !== $placeholder) { - return $placeholder; - } - - return parent::placeholder(); - } -} \ No newline at end of file +} diff --git a/apps/src/Data/PostData.php b/apps/src/Data/PostData.php index 35bf38332..a3eb98c8a 100644 --- a/apps/src/Data/PostData.php +++ b/apps/src/Data/PostData.php @@ -23,7 +23,7 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlug($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } diff --git a/apps/src/Data/SagaData.php b/apps/src/Data/SagaData.php index 51926f697..a2cab5894 100644 --- a/apps/src/Data/SagaData.php +++ b/apps/src/Data/SagaData.php @@ -27,12 +27,6 @@ public function asset(mixed $entity, string $field): string return $this->fileService->asset($entity, $field); } - #[Override] - public function getDefaultImage(object $entity): ?string - { - return $entity->getPoster(); - } - #[Override] public function generateSlug(object $entity): array { @@ -43,11 +37,17 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlug($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getPoster(); + } + #[Override] public function getEntity(?string $slug): object { @@ -88,6 +88,9 @@ public function getJsonLdMovie(Movie $entity): object $movie->image($img); } + $actors = $this->getJsonLdActors($entity); + $movie->actor($actors); + return $movie; } @@ -175,4 +178,39 @@ protected function getEntityBySlugSaga(?string $slug): ?object ['slug' => $slugSecond] ); } + + private function getJsonLdActors(Movie $movie): array + { + $actors = []; + foreach ($movie->getCastings() as $casting) { + $person = $casting->getRefPerson(); + $knownForDepartment = $casting->getKnownForDepartment(); + if ('Acting' !== $knownForDepartment) { + continue; + } + if (false === $person->isEnable()) { + continue; + } + + $actors[] = $this->getJsonLdPerson($person); + } + + return $actors; + } + + private function getJsonLdPerson(object $entity): object + { + $person = Schema::person(); + $person->name($entity->getTitle()); + + $img = $this->siteService->asset($entity, 'profile', true, true); + $person->url( + $this->router->generate('front', $this->slugService->forEntity($entity), RouterInterface::ABSOLUTE_URL) + ); + if ('' !== $img) { + $person->image($img); + } + + return $person; + } } diff --git a/apps/src/Data/SeasonData.php b/apps/src/Data/SeasonData.php index 361c7b172..7d94e26b6 100644 --- a/apps/src/Data/SeasonData.php +++ b/apps/src/Data/SeasonData.php @@ -22,21 +22,21 @@ public function asset(mixed $entity, string $field): string return parent::asset($entity->getRefserie(), $field); } - #[Override] - public function getDefaultImage(object $entity): ?string - { - return $entity->getPoster(); - } - #[Override] public function generateSlug(object $entity): array { $slug = parent::generateSlug($entity->getRefserie()); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getPoster(); + } + #[Override] public function getEntity(?string $slug): object { @@ -82,7 +82,7 @@ public function getTitle(object $entity): string #[Override] public function getTitleMeta(object $entity): string { - return parent::getTitle($entity->getRefserie()) . ' - ' . $this->getTitle($entity); + return parent::getTitle($entity->getRefserie()).' - '.$this->getTitle($entity); } #[Override] diff --git a/apps/src/Data/SerieData.php b/apps/src/Data/SerieData.php index 4f1e335dc..ad8da466e 100644 --- a/apps/src/Data/SerieData.php +++ b/apps/src/Data/SerieData.php @@ -26,12 +26,6 @@ public function asset(mixed $entity, string $field): string return $this->fileService->asset($entity, $field); } - #[Override] - public function getDefaultImage(object $entity): ?string - { - return $entity->getPoster(); - } - #[Override] public function generateSlug(object $entity): array { @@ -42,11 +36,17 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlug($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } + #[Override] + public function getDefaultImage(object $entity): ?string + { + return $entity->getPoster(); + } + #[Override] public function getEntity(?string $slug): object { diff --git a/apps/src/Data/StarData.php b/apps/src/Data/StarData.php index b7b5df2c2..74f2ad46a 100644 --- a/apps/src/Data/StarData.php +++ b/apps/src/Data/StarData.php @@ -7,6 +7,11 @@ class StarData extends DataAbstract implements DataInterface { + public function getDefaultImage(object $entity): ?string + { + return $entity->getImg(); + } + #[Override] public function placeholder(): string { @@ -18,11 +23,6 @@ public function placeholder(): string return $this->configPlaceholder(); } - public function getDefaultImage(object $entity): ?string - { - return $entity->getImg(); - } - #[Override] public function supportsAsset(object $entity): bool { diff --git a/apps/src/Data/StoryData.php b/apps/src/Data/StoryData.php index a38412e29..788772fab 100644 --- a/apps/src/Data/StoryData.php +++ b/apps/src/Data/StoryData.php @@ -23,7 +23,7 @@ public function generateSlug(object $entity): array ); $slug = parent::generateSlug($page); - $slug['slug'] .= '/' . $entity->getSlug(); + $slug['slug'] .= '/'.$entity->getSlug(); return $slug; } diff --git a/apps/src/DataFixtures/BlockFixtures.php b/apps/src/DataFixtures/BlockFixtures.php index 873fccd68..7a47021ae 100644 --- a/apps/src/DataFixtures/BlockFixtures.php +++ b/apps/src/DataFixtures/BlockFixtures.php @@ -198,7 +198,7 @@ private function newBlock(?string $code): Block { $block = $this->blockService->getByCode($code); if (is_null($block)) { - throw new Exception('Block ' . $code . ' not found'); + throw new Exception('Block '.$code.' not found'); } $blockClass = $block->getClass(); @@ -218,7 +218,7 @@ private function setLink(?Page $page, ?array &$data): void $data[] = [ 'title' => $page->getTitle(), - 'url' => '[pageurl:' . $page->getId() . ']', + 'url' => '[pageurl:'.$page->getId().']', 'classes' => null, 'blank' => false, ]; diff --git a/apps/src/DataFixtures/CategoryFixtures.php b/apps/src/DataFixtures/CategoryFixtures.php index 0e9c9f94a..50a120692 100644 --- a/apps/src/DataFixtures/CategoryFixtures.php +++ b/apps/src/DataFixtures/CategoryFixtures.php @@ -40,14 +40,14 @@ protected function addCategory(Generator $generator, ObjectManager $objectManage $parent = random_int(0, 1); if (1 === $parent) { - $categories = $this->getParent('category' . $code); + $categories = $this->getParent('category'.$code); if ([] !== $categories) { $parentCategory = $this->getReference(array_rand($categories), $class); $category->setParent($parentCategory); } } - $id = 'category' . $code . '_' . md5(uniqid()); + $id = 'category'.$code.'_'.md5(uniqid()); $this->addReference($id, $category); $this->categories[$id] = $category; $objectManager->persist($category); diff --git a/apps/src/DataFixtures/ChapterFixtures.php b/apps/src/DataFixtures/ChapterFixtures.php index c5e12caf4..a7c8437de 100644 --- a/apps/src/DataFixtures/ChapterFixtures.php +++ b/apps/src/DataFixtures/ChapterFixtures.php @@ -70,7 +70,7 @@ protected function addChapter(Generator $generator, ObjectManager $objectManager } $this->setImage($chapter, 'imgFile'); - $this->addReference('chapter_' . md5(uniqid()), $chapter); + $this->addReference('chapter_'.md5(uniqid()), $chapter); $this->position[$storyId][] = $chapter; $objectManager->persist($chapter); } diff --git a/apps/src/DataFixtures/EditoFixtures.php b/apps/src/DataFixtures/EditoFixtures.php index 955e8000e..89ec0440f 100644 --- a/apps/src/DataFixtures/EditoFixtures.php +++ b/apps/src/DataFixtures/EditoFixtures.php @@ -47,7 +47,7 @@ protected function addEdito(Generator $generator, ObjectManager $objectManager, $edito->setTitle($generator->unique()->colorName()); $this->addParagraphText($edito); $this->setImage($edito, 'imgFile'); - $this->addReference('edito_' . md5(uniqid()), $edito); + $this->addReference('edito_'.md5(uniqid()), $edito); $objectManager->persist($edito); } } diff --git a/apps/src/DataFixtures/MemoFixtures.php b/apps/src/DataFixtures/MemoFixtures.php index f2f1c4f9b..1839eec58 100644 --- a/apps/src/DataFixtures/MemoFixtures.php +++ b/apps/src/DataFixtures/MemoFixtures.php @@ -49,7 +49,7 @@ protected function addMemo(Generator $generator, ObjectManager $objectManager, i $this->paragraphService->addParagraph($memo, 'head'); $this->addParagraphText($memo); $this->setImage($memo, 'imgFile'); - $this->addReference('memo_' . md5(uniqid()), $memo); + $this->addReference('memo_'.md5(uniqid()), $memo); $objectManager->persist($memo); } } diff --git a/apps/src/DataFixtures/PageFixtures.php b/apps/src/DataFixtures/PageFixtures.php index 3ae66e13f..41fe0e7ec 100644 --- a/apps/src/DataFixtures/PageFixtures.php +++ b/apps/src/DataFixtures/PageFixtures.php @@ -313,7 +313,7 @@ private function setPage(ObjectManager $objectManager, Generator $generator, Pag $this->addTagToEntity($page, PageTag::class); $this->addCategoryToEntity($page, PageCategory::class); - $this->addReference('page_' . md5(uniqid()), $page); + $this->addReference('page_'.md5(uniqid()), $page); $objectManager->persist($page); } diff --git a/apps/src/DataFixtures/PostFixtures.php b/apps/src/DataFixtures/PostFixtures.php index a747af668..b04b91d8e 100644 --- a/apps/src/DataFixtures/PostFixtures.php +++ b/apps/src/DataFixtures/PostFixtures.php @@ -58,7 +58,7 @@ protected function addPost(Generator $generator, ObjectManager $objectManager): $this->addParagraphText($post); $this->addTagToEntity($post, PostTag::class); $this->addCategoryToEntity($post, PostCategory::class); - $this->addReference('post_' . md5(uniqid()), $post); + $this->addReference('post_'.md5(uniqid()), $post); $objectManager->persist($post); } } diff --git a/apps/src/DataFixtures/StoryFixtures.php b/apps/src/DataFixtures/StoryFixtures.php index 8be52e6ce..983537622 100644 --- a/apps/src/DataFixtures/StoryFixtures.php +++ b/apps/src/DataFixtures/StoryFixtures.php @@ -58,7 +58,7 @@ protected function addStory(Generator $generator, ObjectManager $objectManager): $this->setImage($story, 'imgFile'); $this->addTagToEntity($story, StoryTag::class); $this->addCategoryToEntity($story, StoryCategory::class); - $this->addReference('story_' . md5(uniqid()), $story); + $this->addReference('story_'.md5(uniqid()), $story); $objectManager->persist($story); } } diff --git a/apps/src/DataFixtures/TagFixtures.php b/apps/src/DataFixtures/TagFixtures.php index f390a762d..59b5c25bb 100644 --- a/apps/src/DataFixtures/TagFixtures.php +++ b/apps/src/DataFixtures/TagFixtures.php @@ -33,7 +33,7 @@ protected function addTag(Generator $generator, ObjectManager $objectManager): v foreach ($tab as $code => $class) { $tag = new $class(); $tag->setTitle($generator->unique()->colorName()); - $this->addReference('tag' . $code . '_' . md5(uniqid()), $tag); + $this->addReference('tag'.$code.'_'.md5(uniqid()), $tag); $objectManager->persist($tag); } } diff --git a/apps/src/DataFixtures/TemplateFixtures.php b/apps/src/DataFixtures/TemplateFixtures.php index 48d6345ae..1e289ad5e 100644 --- a/apps/src/DataFixtures/TemplateFixtures.php +++ b/apps/src/DataFixtures/TemplateFixtures.php @@ -37,7 +37,7 @@ public function load(ObjectManager $objectManager): void foreach ($this->templates as $row) { $template = new Template(); $template->setCode($row->getCode()); - $template->setTitle('Template ' . $row->getCode()); + $template->setTitle('Template '.$row->getCode()); $template->setText($row->getContent('txt')); $template->setHtml($row->getContent('html')); $objectManager->persist($template); diff --git a/apps/src/DataFixtures/UserFixtures.php b/apps/src/DataFixtures/UserFixtures.php index faeff2844..72837a7da 100644 --- a/apps/src/DataFixtures/UserFixtures.php +++ b/apps/src/DataFixtures/UserFixtures.php @@ -67,7 +67,7 @@ private function setUser(ObjectManager $objectManager, User $user, array $data): $user->setPassword($hash); $this->setImage($user, 'avatarFile'); - $this->addReference('user_' . $user->getUsername(), $user); + $this->addReference('user_'.$user->getUsername(), $user); $objectManager->persist($user); } diff --git a/apps/src/Email/EmailAbstract.php b/apps/src/Email/EmailAbstract.php index b2f50bc3a..afcac4e54 100644 --- a/apps/src/Email/EmailAbstract.php +++ b/apps/src/Email/EmailAbstract.php @@ -164,10 +164,10 @@ protected function getTemplateContent(string $folder, string $type): array return $this->templates[$type]; } - $twig = '.' . $type . '.twig'; + $twig = '.'.$type.'.twig'; $files = [ - 'emails/' . $folder . $twig, - 'emails/default' . $twig, + 'emails/'.$folder.$twig, + 'emails/default'.$twig, ]; $view = end($files); @@ -210,7 +210,7 @@ private function replace(string $content): string { foreach ($this->replaces as $replace) { $replace->setData($this->data); - $content = str_replace('%' . $replace->getCode() . '%', $replace->exec(), $content); + $content = str_replace('%'.$replace->getCode().'%', $replace->exec(), $content); } return $content; diff --git a/apps/src/Entity/Configuration.php b/apps/src/Entity/Configuration.php index 8a5ecee0e..bc7ef2918 100644 --- a/apps/src/Entity/Configuration.php +++ b/apps/src/Entity/Configuration.php @@ -54,12 +54,6 @@ class Configuration #[Vich\UploadableField(mapping: 'configuration', fileNameProperty: 'gamePlaceholder')] protected ?File $gamePlaceholderFile = null; - #[ORM\Column(name: 'person_placeholder', length: 255, nullable: true)] - protected ?string $personPlaceholder = null; - - #[Vich\UploadableField(mapping: 'configuration', fileNameProperty: 'personPlaceholder')] - protected ?File $personPlaceholderFile = null; - #[ORM\Id] #[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\Column(type: Types::GUID, unique: true)] @@ -99,6 +93,12 @@ class Configuration #[Vich\UploadableField(mapping: 'configuration', fileNameProperty: 'pagePlaceholder')] protected ?File $pagePlaceholderFile = null; + #[ORM\Column(name: 'person_placeholder', length: 255, nullable: true)] + protected ?string $personPlaceholder = null; + + #[Vich\UploadableField(mapping: 'configuration', fileNameProperty: 'personPlaceholder')] + protected ?File $personPlaceholderFile = null; + #[ORM\Column(length: 255, nullable: true)] protected ?string $placeholder = null; @@ -414,16 +414,6 @@ public function getGamePlaceholderFile(): ?File return $this->gamePlaceholderFile; } - public function getPersonPlaceholder(): ?string - { - return $this->personPlaceholder; - } - - public function getPersonPlaceholderFile(): ?File - { - return $this->personPlaceholderFile; - } - public function getId(): ?string { return $this->id; @@ -484,6 +474,16 @@ public function getPagePlaceholderFile(): ?File return $this->pagePlaceholderFile; } + public function getPersonPlaceholder(): ?string + { + return $this->personPlaceholder; + } + + public function getPersonPlaceholderFile(): ?File + { + return $this->personPlaceholderFile; + } + public function getPlaceholder(): ?string { return $this->placeholder; @@ -886,22 +886,6 @@ public function setGamePlaceholderFile(?File $gamePlaceholderFile = null): void } } - public function setPersonPlaceholder(?string $personPlaceholder): void - { - $this->personPlaceholder = $personPlaceholder; - } - - public function setPersonPlaceholderFile(?File $personPlaceholderFile = null): void - { - $this->personPlaceholderFile = $personPlaceholderFile; - - if ($personPlaceholderFile instanceof File) { - // It is required that at least one field changes if you are using doctrine - // otherwise the event listeners won't be called and the file is lost - $this->updatedAt = DateTime::createFromImmutable(new DateTimeImmutable()); - } - } - public function setLanguageTmdb(?string $languageTmdb): static { $this->languageTmdb = $languageTmdb; @@ -987,6 +971,22 @@ public function setPagePlaceholderFile(?File $pagePlaceholderFile = null): void } } + public function setPersonPlaceholder(?string $personPlaceholder): void + { + $this->personPlaceholder = $personPlaceholder; + } + + public function setPersonPlaceholderFile(?File $personPlaceholderFile = null): void + { + $this->personPlaceholderFile = $personPlaceholderFile; + + if ($personPlaceholderFile instanceof File) { + // It is required that at least one field changes if you are using doctrine + // otherwise the event listeners won't be called and the file is lost + $this->updatedAt = DateTime::createFromImmutable(new DateTimeImmutable()); + } + } + public function setPlaceholder(?string $placeholder): void { $this->placeholder = $placeholder; diff --git a/apps/src/Entity/Paragraph.php b/apps/src/Entity/Paragraph.php index fd6b7815b..a073b3628 100644 --- a/apps/src/Entity/Paragraph.php +++ b/apps/src/Entity/Paragraph.php @@ -82,9 +82,6 @@ abstract class Paragraph implements Stringable #[ORM\ManyToOne(cascade: ['persist', 'detach'], inversedBy: 'paragraphs')] protected ?Edito $edito = null; - #[ORM\ManyToOne(cascade: ['persist', 'detach'], inversedBy: 'paragraphs')] - protected ?Person $person = null; - #[ORM\Column( type: Types::BOOLEAN, options: ['default' => 1] @@ -112,6 +109,9 @@ abstract class Paragraph implements Stringable #[ORM\ManyToOne(cascade: ['persist', 'detach'], inversedBy: 'paragraphs')] protected ?Page $page = null; + #[ORM\ManyToOne(cascade: ['persist', 'detach'], inversedBy: 'paragraphs')] + protected ?Person $person = null; + #[ORM\Column] protected ?int $position = null; @@ -156,11 +156,6 @@ public function getEdito(): ?Edito return $this->edito; } - public function getPerson(): ?Person - { - return $this->person; - } - public function getFond(): ?string { return $this->fond; @@ -191,6 +186,11 @@ public function getPage(): ?Page return $this->page; } + public function getPerson(): ?Person + { + return $this->person; + } + public function getPosition(): ?int { return $this->position; @@ -254,13 +254,6 @@ public function setEdito(?Edito $edito): static return $this; } - public function setPerson(?Person $person): static - { - $this->person = $person; - - return $this; - } - public function setEnable(bool $enable): static { $this->enable = $enable; @@ -303,6 +296,13 @@ public function setPage(?Page $page): static return $this; } + public function setPerson(?Person $person): static + { + $this->person = $person; + + return $this; + } + public function setPosition(int $position): static { $this->position = $position; diff --git a/apps/src/Entity/Person.php b/apps/src/Entity/Person.php index 53b50a07a..78689690d 100644 --- a/apps/src/Entity/Person.php +++ b/apps/src/Entity/Person.php @@ -25,6 +25,12 @@ class Person use SoftDeleteableEntity; use TimestampableTrait; + #[ORM\Column( + type: Types::BOOLEAN, + options: ['default' => 1] + )] + protected ?bool $enable = null; + #[ORM\Id] #[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\Column(type: Types::GUID, unique: true)] @@ -35,15 +41,26 @@ class Person #[ORM\JoinColumn(nullable: true)] protected ?Meta $meta = null; + /** + * @var Collection + */ + #[ORM\OneToMany( + targetEntity: Paragraph::class, + mappedBy: 'person', + cascade: [ + 'persist', + 'remove', + ], + orphanRemoval: true + )] + #[ORM\OrderBy( + ['position' => 'ASC'] + )] + protected Collection $paragraphs; + #[ORM\Column(length: 255, nullable: true)] protected ?string $profile = null; - #[ORM\Column( - type: Types::BOOLEAN, - options: ['default' => 1] - )] - protected ?bool $enable = null; - #[Vich\UploadableField(mapping: 'person', fileNameProperty: 'profile')] protected ?File $profileFile = null; @@ -78,37 +95,18 @@ class Person #[ORM\Column(length: 255, nullable: true)] private ?string $tmdb = null; - /** - * @var Collection - */ - #[ORM\OneToMany( - targetEntity: Paragraph::class, - mappedBy: 'person', - cascade: [ - 'persist', - 'remove', - ], - orphanRemoval: true - )] - #[ORM\OrderBy( - ['position' => 'ASC'] - )] - protected Collection $paragraphs; - public function __construct() { - $this->castings = new ArrayCollection(); + $this->castings = new ArrayCollection(); $this->paragraphs = new ArrayCollection(); } - public function isEnable(): ?bool - { - return $this->enable; - } - - public function setEnable(bool $enable): static + public function addCasting(Casting $casting): static { - $this->enable = $enable; + if (!$this->castings->contains($casting)) { + $this->castings->add($casting); + $casting->setRefPerson($this); + } return $this; } @@ -123,35 +121,6 @@ public function addParagraph(Paragraph $paragraph): static return $this; } - public function removeParagraph(Paragraph $paragraph): static - { - // set the owning side to null (unless already changed) - if ($this->paragraphs->removeElement($paragraph) && $paragraph->getPerson() === $this - ) { - $paragraph->setPerson(null); - } - - return $this; - } - - /** - * @return Collection - */ - public function getParagraphs(): Collection - { - return $this->paragraphs; - } - - public function addCasting(Casting $casting): static - { - if (!$this->castings->contains($casting)) { - $this->castings->add($casting); - $casting->setRefPerson($this); - } - - return $this; - } - public function getBiography(): ?string { return $this->biography; @@ -190,6 +159,14 @@ public function getMeta(): ?Meta return $this->meta; } + /** + * @return Collection + */ + public function getParagraphs(): Collection + { + return $this->paragraphs; + } + public function getPlaceOfBirth(): ?string { return $this->placeOfBirth; @@ -220,6 +197,11 @@ public function getTmdb(): ?string return $this->tmdb; } + public function isEnable(): ?bool + { + return $this->enable; + } + public function removeCasting(Casting $casting): static { // set the owning side to null (unless already changed) @@ -230,6 +212,17 @@ public function removeCasting(Casting $casting): static return $this; } + public function removeParagraph(Paragraph $paragraph): static + { + // set the owning side to null (unless already changed) + if ($this->paragraphs->removeElement($paragraph) && $paragraph->getPerson() === $this + ) { + $paragraph->setPerson(null); + } + + return $this; + } + public function setBiography(?string $biography): static { $this->biography = $biography; @@ -251,6 +244,13 @@ public function setDeathday(?DateTime $deathday): static return $this; } + public function setEnable(bool $enable): static + { + $this->enable = $enable; + + return $this; + } + public function setGender(?int $gender): static { $this->gender = $gender; diff --git a/apps/src/Enum/PageEnum.php b/apps/src/Enum/PageEnum.php index e061b62a7..e6c5da5eb 100644 --- a/apps/src/Enum/PageEnum.php +++ b/apps/src/Enum/PageEnum.php @@ -11,9 +11,9 @@ enum PageEnum: string case HOME = 'home'; case LOGIN = 'login'; case LOSTPASSWORD = 'lostpassword'; - case PERSONS = 'person'; case MOVIES = 'movie'; case PAGE = 'page'; + case PERSONS = 'person'; case POSTS = 'post'; case SERIES = 'series'; case STORIES = 'story'; diff --git a/apps/src/Event/Subscriber/SiteSubscriber.php b/apps/src/Event/Subscriber/SiteSubscriber.php index 65064ed41..798dd2674 100644 --- a/apps/src/Event/Subscriber/SiteSubscriber.php +++ b/apps/src/Event/Subscriber/SiteSubscriber.php @@ -83,7 +83,7 @@ public function onKernelRequest(RequestEvent $requestEvent): void sprintf( 'Your IP "%s" is banned
    ', $this->securityService->getCurrentClientIp() - ) . $banIp->getReason(), + ).$banIp->getReason(), Response::HTTP_FORBIDDEN ) ); diff --git a/apps/src/Field/Configurator/ParagraphsConfigurator.php b/apps/src/Field/Configurator/ParagraphsConfigurator.php index cf9e1b4fc..013c10e30 100644 --- a/apps/src/Field/Configurator/ParagraphsConfigurator.php +++ b/apps/src/Field/Configurator/ParagraphsConfigurator.php @@ -63,7 +63,7 @@ public function configure(FieldDto $fieldDto, EntityDto $entityDto, AdminContext $fieldDto->setFormTypeOption( 'row_attr.class', - $fieldDto->getFormTypeOption('row_attr.class') . ' ' . $cssClasses + $fieldDto->getFormTypeOption('row_attr.class').' '.$cssClasses ); } diff --git a/apps/src/Field/Configurator/WysiwygConfigurator.php b/apps/src/Field/Configurator/WysiwygConfigurator.php index 85f59dee6..a05e640b6 100644 --- a/apps/src/Field/Configurator/WysiwygConfigurator.php +++ b/apps/src/Field/Configurator/WysiwygConfigurator.php @@ -19,7 +19,7 @@ public function configure(FieldDto $fieldDto, EntityDto $entityDto, AdminContext 'attr.rows', $fieldDto->getCustomOption(WysiwygField::OPTION_NUM_OF_ROWS) ); - $fieldDto->setFormTypeOption('attr.class', $fieldDto->getFormTypeOption('attr.class') . ' wysiwyg'); + $fieldDto->setFormTypeOption('attr.class', $fieldDto->getFormTypeOption('attr.class').' wysiwyg'); } #[Override] diff --git a/apps/src/Field/ParagraphsField.php b/apps/src/Field/ParagraphsField.php index 464e64e09..c4c8860ca 100644 --- a/apps/src/Field/ParagraphsField.php +++ b/apps/src/Field/ParagraphsField.php @@ -48,7 +48,7 @@ public static function new($label = false, ?string $icon = null): self { $field = new self(); $field->setFieldFqcn(self::class); - $field->setProperty('ea_form_panel_' . (new Ulid())); + $field->setProperty('ea_form_panel_'.(new Ulid())); $field->setLabel($label); $field->setFormType(ParagraphType::class); $field->setFormTypeOptions([ diff --git a/apps/src/FileStorage/FileStorageAbstract.php b/apps/src/FileStorage/FileStorageAbstract.php index a81381e7f..eb9cdb936 100644 --- a/apps/src/FileStorage/FileStorageAbstract.php +++ b/apps/src/FileStorage/FileStorageAbstract.php @@ -97,14 +97,14 @@ protected function setType(string $type): self private function getFolder(): mixed { - $config = Yaml::parse(file_get_contents($this->kernel->getProjectDir() . '/config/packages/flysystem.yaml')); + $config = Yaml::parse(file_get_contents($this->kernel->getProjectDir().'/config/packages/flysystem.yaml')); $storages = $config['flysystem']['storages']; - if (!array_key_exists($this->type . '.storage', $storages)) { + if (!array_key_exists($this->type.'.storage', $storages)) { throw new Exception('Type not found'); } - $storage = $storages[$this->type . '.storage']; + $storage = $storages[$this->type.'.storage']; return $storage['options']['directory']; } diff --git a/apps/src/Filter/CountriesFilter.php b/apps/src/Filter/CountriesFilter.php index c902546af..9caa1401a 100644 --- a/apps/src/Filter/CountriesFilter.php +++ b/apps/src/Filter/CountriesFilter.php @@ -31,7 +31,7 @@ public function apply( $value = $filterDataDto->getValue(); $search = ('=' === $comparison) ? 'JSON_CONTAINS(%s.%s, :%s) = 1' : 'JSON_CONTAINS(%s.%s, :%s) = 0'; $queryBuilder->andWhere(sprintf($search, $alias, $property, $parameterName)); - $queryBuilder->setParameter($parameterName, '"' . $value . '"'); + $queryBuilder->setParameter($parameterName, '"'.$value.'"'); } /** diff --git a/apps/src/Filter/SeasonEpisodeFilter.php b/apps/src/Filter/SeasonEpisodeFilter.php index d1c5e7144..2fdc50935 100644 --- a/apps/src/Filter/SeasonEpisodeFilter.php +++ b/apps/src/Filter/SeasonEpisodeFilter.php @@ -29,7 +29,7 @@ public function apply( $alias = $filterDataDto->getEntityAlias(); if (!$this->hasJoin($queryBuilder, 'season')) { - $queryBuilder->join($alias . '.refseason', 'season'); + $queryBuilder->join($alias.'.refseason', 'season'); } if (!$this->hasJoin($queryBuilder, 'serie')) { diff --git a/apps/src/Filter/SerieEpisodeFilter.php b/apps/src/Filter/SerieEpisodeFilter.php index 40ae9e263..2702c9ba0 100644 --- a/apps/src/Filter/SerieEpisodeFilter.php +++ b/apps/src/Filter/SerieEpisodeFilter.php @@ -29,7 +29,7 @@ public function apply( $alias = $filterDataDto->getEntityAlias(); if (!$this->hasJoin($queryBuilder, 'season')) { - $queryBuilder->join($alias . '.refseason', 'season'); + $queryBuilder->join($alias.'.refseason', 'season'); } $queryBuilder->andWhere('season.number = :number'); diff --git a/apps/src/Form/Front/MovieType.php b/apps/src/Form/Front/MovieType.php index bd8eb6ad9..3a0b14fd8 100644 --- a/apps/src/Form/Front/MovieType.php +++ b/apps/src/Form/Front/MovieType.php @@ -76,7 +76,10 @@ public function buildForm(FormBuilderInterface $formBuilder, array $options): vo ] ); $titleTranslation = new TranslatableMessage('Title'); - $title = $this->translator->trans($titleTranslation->getMessage(), $titleTranslation->getParameters()); + $title = $this->translator->trans( + $titleTranslation->getMessage(), + $titleTranslation->getParameters() + ); $releaseDateTranslation = new TranslatableMessage('Release date'); $releaseDate = $this->translator->trans( $releaseDateTranslation->getMessage(), diff --git a/apps/src/Generate/CinemaGenerate.php b/apps/src/Generate/CinemaGenerate.php index 4a7ca562e..b5559a660 100644 --- a/apps/src/Generate/CinemaGenerate.php +++ b/apps/src/Generate/CinemaGenerate.php @@ -166,7 +166,7 @@ private function setMovie(Page $page, array $movieData, string $locale, array &$ $releaseDate->format('d/m/Y'), (string) $movieData['overview'], implode(', ', array_map(fn (array $actor) => $actor['name'], array_slice($casts, 0, 5))), - 'https://www.themoviedb.org/movie/' . $movieData['id'], + 'https://www.themoviedb.org/movie/'.$movieData['id'], ], $html ); diff --git a/apps/src/Message/MetaMessage.php b/apps/src/Message/MetaMessage.php index 763842232..24afaf884 100644 --- a/apps/src/Message/MetaMessage.php +++ b/apps/src/Message/MetaMessage.php @@ -9,17 +9,18 @@ final class MetaMessage { public function __construct( public readonly string $type, - public readonly string $entity = '' - ) { - } - - public function getType(): string + public readonly string $entity = '', + ) { - return $this->type; } public function getEntity(): string { return $this->entity; } + + public function getType(): string + { + return $this->type; + } } diff --git a/apps/src/MessageHandler/MetaAllMessageHandler.php b/apps/src/MessageHandler/MetaAllMessageHandler.php index 66741fc44..de2123108 100644 --- a/apps/src/MessageHandler/MetaAllMessageHandler.php +++ b/apps/src/MessageHandler/MetaAllMessageHandler.php @@ -23,7 +23,6 @@ public function __construct( private MessageDispatcherService $messageDispatcherService, ) { - } public function __invoke(MetaAllMessage $metaAllMessage): void diff --git a/apps/src/MessageHandler/MetaMessageHandler.php b/apps/src/MessageHandler/MetaMessageHandler.php index 3f52fa18b..9f25f14f8 100644 --- a/apps/src/MessageHandler/MetaMessageHandler.php +++ b/apps/src/MessageHandler/MetaMessageHandler.php @@ -14,19 +14,19 @@ final class MetaMessageHandler { public function __construct( private MetaService $metaService, - private EntityManagerInterface $entityManager + private EntityManagerInterface $entityManager, ) { } public function __invoke(MetaMessage $metaMessage): void { - $type = $metaMessage->getType(); + $type = $metaMessage->getType(); $entity = $metaMessage->getEntity(); match ($type) { 'delete' => $this->deleteUselessMeta(), - 'check' => $this->correctionMeta($entity), - default => null, + 'check' => $this->correctionMeta($entity), + default => null, }; } diff --git a/apps/src/Middleware/DeduplicationMiddleware.php b/apps/src/Middleware/DeduplicationMiddleware.php index ce0b5f725..ef37f5235 100644 --- a/apps/src/Middleware/DeduplicationMiddleware.php +++ b/apps/src/Middleware/DeduplicationMiddleware.php @@ -2,8 +2,8 @@ namespace Labstag\Middleware; -use ReflectionClass; use Labstag\Service\MessageDispatcherService; +use ReflectionClass; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; @@ -38,18 +38,18 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope private function getMessageKey(object $message): string { - $className = $message::class; + $className = $message::class; $reflectionClass = new ReflectionClass($message); - $properties = []; + $properties = []; foreach ($reflectionClass->getProperties() as $reflectionProperty) { - $value = $reflectionProperty->getValue($message); + $value = $reflectionProperty->getValue($message); $properties[$reflectionProperty->getName()] = $this->serializeValue($value); } ksort($properties); - return $className . '::' . md5(serialize($properties)); + return $className.'::'.md5(serialize($properties)); } private function serializeValue(mixed $value): mixed diff --git a/apps/src/Paragraph/FormParagraph.php b/apps/src/Paragraph/FormParagraph.php index 2b12fd424..e1f7b777a 100644 --- a/apps/src/Paragraph/FormParagraph.php +++ b/apps/src/Paragraph/FormParagraph.php @@ -99,7 +99,7 @@ public function templates(Paragraph $paragraph, string $type): array return []; } - $templates = $this->getTemplateContent($type, $this->getType() . '/' . $paragraph->getForm()); + $templates = $this->getTemplateContent($type, $this->getType().'/'.$paragraph->getForm()); if ($templates['view'] != end($templates['files'])) { return $templates; diff --git a/apps/src/Paragraph/ParagraphAbstract.php b/apps/src/Paragraph/ParagraphAbstract.php index 765e6c220..24033f827 100644 --- a/apps/src/Paragraph/ParagraphAbstract.php +++ b/apps/src/Paragraph/ParagraphAbstract.php @@ -93,7 +93,7 @@ public function addFieldFileUpload(string $type, string $pageName, Paragraph $pa { $label = new TranslatableMessage('File'); if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { - $textField = TextField::new($type . 'File', $label); + $textField = TextField::new($type.'File', $label); $textField->setFormType(VichFileType::class); $deleteLabel = new TranslatableMessage('Delete file'); $downloadLabel = new TranslatableMessage('Download'); @@ -129,7 +129,7 @@ public function addFieldFileUpload(string $type, string $pageName, Paragraph $pa return $textField; } - $this->fileService->getBasePath($paragraph::class, $type . 'File'); + $this->fileService->getBasePath($paragraph::class, $type.'File'); $imageField = TextField::new($type, $label); $imageField->setTemplatePath('admin/field/file-upload.html.twig'); @@ -140,7 +140,7 @@ public function addFieldImageUpload(string $type, string $pageName, Paragraph $p { $label = new TranslatableMessage('Image'); if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW === $pageName) { - $textField = TextField::new($type . 'File', $label); + $textField = TextField::new($type.'File', $label); $textField->setFormType(VichImageType::class); $deleteLabel = new TranslatableMessage('Delete image'); $downloadLabel = new TranslatableMessage('Download'); @@ -188,7 +188,7 @@ public function addFieldImageUpload(string $type, string $pageName, Paragraph $p return $textField; } - $basePath = $this->fileService->getBasePath($paragraph::class, $type . 'File'); + $basePath = $this->fileService->getBasePath($paragraph::class, $type.'File'); $imageField = ImageField::new($type, $label); $imageField->setBasePath($basePath); @@ -352,8 +352,8 @@ protected function getTemplateContent(string $folder, string $type): array $htmltwig = '.html.twig'; $files = [ - 'paragraphs/' . $folder . '/' . $type . $htmltwig, - 'paragraphs/' . $folder . '/default' . $htmltwig, + 'paragraphs/'.$folder.'/'.$type.$htmltwig, + 'paragraphs/'.$folder.'/default'.$htmltwig, ]; $view = end($files); diff --git a/apps/src/Replace/LinkApprovalReplace.php b/apps/src/Replace/LinkApprovalReplace.php index 173efbb3c..9ac46ae34 100644 --- a/apps/src/Replace/LinkApprovalReplace.php +++ b/apps/src/Replace/LinkApprovalReplace.php @@ -17,7 +17,7 @@ public function exec(): string return '#linkdisabled'; } - return $configuration->getUrl() . $this->router->generate( + return $configuration->getUrl().$this->router->generate( 'admin_workflow', [ '_locale' => 'fr', diff --git a/apps/src/Replace/LinkChangePasswordReplace.php b/apps/src/Replace/LinkChangePasswordReplace.php index 075c8a6c2..8b44517dd 100644 --- a/apps/src/Replace/LinkChangePasswordReplace.php +++ b/apps/src/Replace/LinkChangePasswordReplace.php @@ -34,7 +34,7 @@ public function exec(): string $params = $this->slugService->forEntity($page); $params['uid'] = $entity->getId(); - return $configuration->getUrl() . $this->router->generate('front', $params); + return $configuration->getUrl().$this->router->generate('front', $params); } public function getCode(): string diff --git a/apps/src/Replace/LinkLoginReplace.php b/apps/src/Replace/LinkLoginReplace.php index a27fefd8e..94559dae2 100644 --- a/apps/src/Replace/LinkLoginReplace.php +++ b/apps/src/Replace/LinkLoginReplace.php @@ -22,7 +22,7 @@ public function exec(): string $params = $this->slugService->forEntity($login); - return $configuration->getUrl() . $this->router->generate('front', $params); + return $configuration->getUrl().$this->router->generate('front', $params); } public function getCode(): string diff --git a/apps/src/Repository/BlockRepository.php b/apps/src/Repository/BlockRepository.php index f26e6fe90..0066e70a6 100644 --- a/apps/src/Repository/BlockRepository.php +++ b/apps/src/Repository/BlockRepository.php @@ -25,13 +25,13 @@ public function findAllOrderedByRegion(?QueryBuilder $queryBuilder): void $alias = $queryBuilder->getRootAliases()[0] ?? 'entity'; $queryBuilder->resetDQLPart('orderBy'); $caseExpr = 'CASE ' - . 'WHEN ' . $alias . ".region = 'header' THEN 1 " - . 'WHEN ' . $alias . ".region = 'main' THEN 2 " - . 'WHEN ' . $alias . ".region = 'footer' THEN 3 " - . 'ELSE 4 ' - . 'END'; + .'WHEN '.$alias.".region = 'header' THEN 1 " + .'WHEN '.$alias.".region = 'main' THEN 2 " + .'WHEN '.$alias.".region = 'footer' THEN 3 " + .'ELSE 4 ' + .'END'; $queryBuilder->orderBy($caseExpr, 'ASC'); - $queryBuilder->addOrderBy($alias . '.position', 'ASC'); + $queryBuilder->addOrderBy($alias.'.position', 'ASC'); } public function getMaxPositionByRegion(string $region): ?int @@ -42,7 +42,7 @@ public function getMaxPositionByRegion(string $region): ?int $queryBuilder->setParameter('region', $region); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'block-maxposition-' . md5($region)); + $query->enableResultCache(3600, 'block-maxposition-'.md5($region)); $data = $query->getOneOrNullResult(); diff --git a/apps/src/Repository/CastingRepository.php b/apps/src/Repository/CastingRepository.php index dcac0c5dc..565f64482 100644 --- a/apps/src/Repository/CastingRepository.php +++ b/apps/src/Repository/CastingRepository.php @@ -19,7 +19,7 @@ public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Casting::class); } - + public function findWithActiveCastings(mixed $data): mixed { $queryBuilder = $this->createQueryBuilder('c'); @@ -28,11 +28,26 @@ public function findWithActiveCastings(mixed $data): mixed $queryBuilder->andWhere('p.deletedAt IS NULL'); $entityMap = [ - Person::class => ['refPerson', 'person'], - Movie::class => ['refMovie', 'movie'], - Serie::class => ['refSerie', 'serie'], - Season::class => ['refSeason', 'season'], - Episode::class => ['refEpisode', 'episode'], + Person::class => [ + 'refPerson', + 'person', + ], + Movie::class => [ + 'refMovie', + 'movie', + ], + Serie::class => [ + 'refSerie', + 'serie', + ], + Season::class => [ + 'refSeason', + 'season', + ], + Episode::class => [ + 'refEpisode', + 'episode', + ], ]; foreach ($entityMap as $class => [$field, $param]) { if ($data instanceof $class) { diff --git a/apps/src/Repository/ChapterRepository.php b/apps/src/Repository/ChapterRepository.php index aec999327..58ca40ca3 100644 --- a/apps/src/Repository/ChapterRepository.php +++ b/apps/src/Repository/ChapterRepository.php @@ -31,7 +31,7 @@ public function getAllActivateByStory(Story $story): mixed $queryBuilder->orderBy('c.position', 'ASC'); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'chapter-activate-story-' . $story->getId()); + $query->enableResultCache(3600, 'chapter-activate-story-'.$story->getId()); return $query->getResult(); } diff --git a/apps/src/Repository/EpisodeRepository.php b/apps/src/Repository/EpisodeRepository.php index ec1bb1174..1f3f3c78d 100644 --- a/apps/src/Repository/EpisodeRepository.php +++ b/apps/src/Repository/EpisodeRepository.php @@ -39,7 +39,7 @@ public function getQueryPaginator(Season $season): Query $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'movies-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'movies-query-paginator-'.md5((string) $dql)); return $query; } diff --git a/apps/src/Repository/GameRepository.php b/apps/src/Repository/GameRepository.php index 120cdb54d..0c714d796 100644 --- a/apps/src/Repository/GameRepository.php +++ b/apps/src/Repository/GameRepository.php @@ -50,7 +50,7 @@ public function getQueryBuilder(array $query): QueryBuilder $queryBuilder->setParameter('enable', true); $queryBuilder->leftJoin('g.categories', 'c')->addSelect('c'); - return $queryBuilder->orderBy('g.' . $query['order'], $query['orderby']); + return $queryBuilder->orderBy('g.'.$query['order'], $query['orderby']); } /** @@ -68,7 +68,7 @@ public function getQueryPaginator(array $query, ?string $categorySlug): Query $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'movies-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'movies-query-paginator-'.md5((string) $dql)); return $query; } diff --git a/apps/src/Repository/GeoCodeRepository.php b/apps/src/Repository/GeoCodeRepository.php index bb5c073de..de895dd1a 100644 --- a/apps/src/Repository/GeoCodeRepository.php +++ b/apps/src/Repository/GeoCodeRepository.php @@ -19,11 +19,11 @@ public function findAllData(string $type): mixed { $queryBuilder = $this->createQueryBuilder('g'); - $queryBuilder->select('g.' . $type . ', count(g.id) as count'); - $queryBuilder->groupBy('g.' . $type); + $queryBuilder->select('g.'.$type.', count(g.id) as count'); + $queryBuilder->groupBy('g.'.$type); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'geocode-' . md5($type)); + $query->enableResultCache(3600, 'geocode-'.md5($type)); return $query->getResult(); } diff --git a/apps/src/Repository/HttpErrorLogsRepository.php b/apps/src/Repository/HttpErrorLogsRepository.php index f5472949a..5778c465c 100644 --- a/apps/src/Repository/HttpErrorLogsRepository.php +++ b/apps/src/Repository/HttpErrorLogsRepository.php @@ -29,7 +29,7 @@ public function getAllinternetProtocolWithNbr(int $nbr): array $queryBuilder->orderBy('nbr', 'DESC'); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'http-error-logs-ip-nbr-' . $nbr); + $query->enableResultCache(3600, 'http-error-logs-ip-nbr-'.$nbr); return $query->getResult(); } diff --git a/apps/src/Repository/MovieRepository.php b/apps/src/Repository/MovieRepository.php index 64cac070e..26927b0b1 100644 --- a/apps/src/Repository/MovieRepository.php +++ b/apps/src/Repository/MovieRepository.php @@ -89,7 +89,7 @@ public function findLastByNbr(int $nbr): mixed $queryBuilder->setMaxResults($nbr); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'movies-last-' . $nbr); + $query->enableResultCache(3600, 'movies-last-'.$nbr); return $query->getResult(); } @@ -134,7 +134,7 @@ public function getAllActivateBySaga(Saga $saga): array $queryBuilder->orderBy('m.releaseDate', 'ASC'); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'movies-activate-by-saga-' . $saga->getId()); + $query->enableResultCache(3600, 'movies-activate-by-saga-'.$saga->getId()); return $query->getResult(); } @@ -233,7 +233,7 @@ public function getQueryBuilder(array $query): QueryBuilder $this->getQueryBuilderCategories($queryBuilder, $query); $this->getQueryBuilderYear($queryBuilder, $query); - return $queryBuilder->orderBy('m.' . $query['order'], $query['orderby']); + return $queryBuilder->orderBy('m.'.$query['order'], $query['orderby']); } /** @@ -246,7 +246,7 @@ public function getQueryPaginator(array $query): Query $queryBuilder = $this->getQueryBuilder($query); $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'movies-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'movies-query-paginator-'.md5((string) $dql)); return $query; } @@ -300,7 +300,7 @@ private function getQueryBuilderTitle(QueryBuilder $queryBuilder, array $query): } $queryBuilder->andWhere('m.title LIKE :title'); - $queryBuilder->setParameter('title', '%' . $query['title'] . '%'); + $queryBuilder->setParameter('title', '%'.$query['title'].'%'); } /** diff --git a/apps/src/Repository/PageRepository.php b/apps/src/Repository/PageRepository.php index 6b868a376..96014d824 100644 --- a/apps/src/Repository/PageRepository.php +++ b/apps/src/Repository/PageRepository.php @@ -37,7 +37,7 @@ public function getOneBySlug(string $slug): ?Page $queryBuilder->setParameter('slug', $slug); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'page-slug_' . md5($slug)); + $query->enableResultCache(3600, 'page-slug_'.md5($slug)); return $query->getOneOrNullResult(); } @@ -49,7 +49,7 @@ public function getOneByType(string $type): ?Page $queryBuilder->setParameter('type', $type); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'page-type_' . md5($type)); + $query->enableResultCache(3600, 'page-type_'.md5($type)); return $query->getOneOrNullResult(); } diff --git a/apps/src/Repository/ParagraphRepository.php b/apps/src/Repository/ParagraphRepository.php index dcde8b42c..30f8cc641 100644 --- a/apps/src/Repository/ParagraphRepository.php +++ b/apps/src/Repository/ParagraphRepository.php @@ -23,7 +23,7 @@ public function findOnByType(string $class): ?Paragraph $queryBuilder->setMaxResults(1); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'paragraph-' . $class); + $query->enableResultCache(3600, 'paragraph-'.$class); return $query->getOneOrNullResult(); } diff --git a/apps/src/Repository/PersonRepository.php b/apps/src/Repository/PersonRepository.php index 1fce369b2..b9c31d491 100644 --- a/apps/src/Repository/PersonRepository.php +++ b/apps/src/Repository/PersonRepository.php @@ -17,21 +17,6 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Person::class); } - /** - * @param array $query - * - * @return Query - */ - public function getQueryPaginator(array $query): Query - { - $queryBuilder = $this->getQueryBuilder($query); - $query = $queryBuilder->getQuery(); - $dql = $query->getDQL(); - $query->enableResultCache(3600, 'sagas-query-paginator-' . md5((string) $dql)); - - return $query; - } - /** * @param array $query */ @@ -53,6 +38,21 @@ public function getQueryBuilder(array $query): QueryBuilder $queryBuilder->orWhere('e.id IS NOT NULL AND sea2.id IS NOT NULL AND s3.id IS NOT NULL'); $queryBuilder->setParameter('enable', true); - return $queryBuilder->orderBy('p.' . $query['order'], $query['orderby']); + return $queryBuilder->orderBy('p.'.$query['order'], $query['orderby']); + } + + /** + * @param array $query + * + * @return Query + */ + public function getQueryPaginator(array $query): Query + { + $queryBuilder = $this->getQueryBuilder($query); + $query = $queryBuilder->getQuery(); + $dql = $query->getDQL(); + $query->enableResultCache(3600, 'sagas-query-paginator-'.md5((string) $dql)); + + return $query; } } diff --git a/apps/src/Repository/PostRepository.php b/apps/src/Repository/PostRepository.php index 3811736e2..443fbc223 100644 --- a/apps/src/Repository/PostRepository.php +++ b/apps/src/Repository/PostRepository.php @@ -25,7 +25,7 @@ public function findLastByNbr(int $nbr): mixed $query = $queryBuilder->getQuery(); - $query->enableResultCache(600, 'post-last-' . $nbr); + $query->enableResultCache(600, 'post-last-'.$nbr); return $query->getResult(); } @@ -85,7 +85,7 @@ public function getQueryPaginator(?string $categorySlug, ?string $tagSlug): Quer } $query = $queryBuilder->getQuery(); - $query->enableResultCache(300, 'post-query-paginator-' . $categorySlug . '-' . $tagSlug); + $query->enableResultCache(300, 'post-query-paginator-'.$categorySlug.'-'.$tagSlug); return $query; } diff --git a/apps/src/Repository/SagaRepository.php b/apps/src/Repository/SagaRepository.php index 77f6e2225..2ffedd123 100644 --- a/apps/src/Repository/SagaRepository.php +++ b/apps/src/Repository/SagaRepository.php @@ -79,7 +79,7 @@ public function getQueryBuilder(array $query): QueryBuilder $queryBuilder->setParameter('enable', true); $queryBuilder->andWhere($queryBuilder->expr()->in('s.id', $subQuery->getDQL())); - return $queryBuilder->orderBy('s.' . $query['order'], $query['orderby']); + return $queryBuilder->orderBy('s.'.$query['order'], $query['orderby']); } /** @@ -92,7 +92,7 @@ public function getQueryPaginator(array $query): Query $queryBuilder = $this->getQueryBuilder($query); $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'sagas-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'sagas-query-paginator-'.md5((string) $dql)); return $query; } diff --git a/apps/src/Repository/SeasonRepository.php b/apps/src/Repository/SeasonRepository.php index 7267d6ab3..02cdd13c0 100644 --- a/apps/src/Repository/SeasonRepository.php +++ b/apps/src/Repository/SeasonRepository.php @@ -34,7 +34,7 @@ public function getAllActivateBySerie(Serie $serie): mixed $queryBuilder->orderBy('s.number', 'ASC'); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'seasons-activate-serie-' . $serie->getId()); + $query->enableResultCache(3600, 'seasons-activate-serie-'.$serie->getId()); return $query->getResult(); } @@ -55,7 +55,7 @@ public function getOneBySerieAndPosition(Serie $serie, int $position): ?Season $queryBuilder->setParameters($data); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'season-serie-' . $serie->getId() . '-position-' . $position); + $query->enableResultCache(3600, 'season-serie-'.$serie->getId().'-position-'.$position); return $query->getOneOrNullResult(); } diff --git a/apps/src/Repository/SerieRepository.php b/apps/src/Repository/SerieRepository.php index f189bcfbe..c27d1f5cc 100644 --- a/apps/src/Repository/SerieRepository.php +++ b/apps/src/Repository/SerieRepository.php @@ -184,7 +184,7 @@ public function getQueryPaginator(?string $categorySlug): Query $query = $queryBuilder->getQuery(); $dql = $query->getDQL(); - $query->enableResultCache(3600, 'series-query-paginator-' . md5((string) $dql)); + $query->enableResultCache(3600, 'series-query-paginator-'.md5((string) $dql)); return $query; } diff --git a/apps/src/Repository/StarRepository.php b/apps/src/Repository/StarRepository.php index fcd881bc9..ed12b4259 100644 --- a/apps/src/Repository/StarRepository.php +++ b/apps/src/Repository/StarRepository.php @@ -21,11 +21,11 @@ public function findAllData(string $type): mixed { $queryBuilder = $this->createQueryBuilder('s'); - $queryBuilder = $queryBuilder->select('s.' . $type . ', count(s.id) as count'); - $queryBuilder->groupBy('s.' . $type); + $queryBuilder = $queryBuilder->select('s.'.$type.', count(s.id) as count'); + $queryBuilder->groupBy('s.'.$type); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'star-' . md5($type)); + $query->enableResultCache(3600, 'star-'.md5($type)); return $query->getResult(); } diff --git a/apps/src/Repository/StoryRepository.php b/apps/src/Repository/StoryRepository.php index 990ce98cc..f2399945e 100644 --- a/apps/src/Repository/StoryRepository.php +++ b/apps/src/Repository/StoryRepository.php @@ -23,7 +23,7 @@ public function findLastByNbr(int $nbr): mixed $queryBuilder->setMaxResults($nbr); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'stories-last-' . $nbr); + $query->enableResultCache(3600, 'stories-last-'.$nbr); return $query->getResult(); } diff --git a/apps/src/Repository/UserRepository.php b/apps/src/Repository/UserRepository.php index 457eef150..37c702507 100644 --- a/apps/src/Repository/UserRepository.php +++ b/apps/src/Repository/UserRepository.php @@ -33,7 +33,7 @@ public function findUserName(string $field): ?User $queryBuilder->setParameters($data); $query = $queryBuilder->getQuery(); - $query->enableResultCache(3600, 'user-by-username-' . md5($field)); + $query->enableResultCache(3600, 'user-by-username-'.md5($field)); return $query->getOneOrNullResult(); } diff --git a/apps/src/Scheduler/GenerateSchedule.php b/apps/src/Scheduler/GenerateSchedule.php index 1bf38c767..2b7335e73 100644 --- a/apps/src/Scheduler/GenerateSchedule.php +++ b/apps/src/Scheduler/GenerateSchedule.php @@ -21,9 +21,7 @@ public function __construct( public function getSchedule(): Schedule { $schedule = new Schedule(); - $schedule->add( - RecurringMessage::cron('0 0 * * 1', new PageCinemaMessage()), - ); + $schedule->add(RecurringMessage::cron('0 0 * * 1', new PageCinemaMessage())); $schedule->stateful($this->cache); return $schedule; diff --git a/apps/src/Service/EtagCacheService.php b/apps/src/Service/EtagCacheService.php index 507e0f74a..61718291c 100644 --- a/apps/src/Service/EtagCacheService.php +++ b/apps/src/Service/EtagCacheService.php @@ -102,11 +102,11 @@ public function getCacheHeaders(object $entity): array $headers = [ 'Cache-Control' => 'public, max-age=3600, must-revalidate', - 'ETag' => '"' . $etag . '"', + 'ETag' => '"'.$etag.'"', ]; if ($lastModified instanceof DateTimeInterface) { - $headers['Last-Modified'] = $lastModified->format('D, d M Y H:i:s') . ' GMT'; + $headers['Last-Modified'] = $lastModified->format('D, d M Y H:i:s').' GMT'; } return [ @@ -215,7 +215,7 @@ public function shouldSendNotModified( return true; } } catch (Exception) { - throw new Exception('Invalid If-Modified-Since date: ' . $ifModifiedSince); + throw new Exception('Invalid If-Modified-Since date: '.$ifModifiedSince); // Date invalide, ignorer } } @@ -288,7 +288,7 @@ private function extractCriticalProperties(object $entity): array } } } catch (ReflectionException) { - throw new Exception('Reflection error on entity: ' . $entity::class); + throw new Exception('Reflection error on entity: '.$entity::class); } return $properties; @@ -338,7 +338,7 @@ private function getCacheKey(object $entity): string $className = $entity::class; $id = $this->extractEntityId($entity); - return $className . ':' . ($id ?? 'no-id') . ':' . spl_object_hash($entity); + return $className.':'.($id ?? 'no-id').':'.spl_object_hash($entity); } /** diff --git a/apps/src/Service/FileService.php b/apps/src/Service/FileService.php index 221c1948a..360088a14 100644 --- a/apps/src/Service/FileService.php +++ b/apps/src/Service/FileService.php @@ -50,7 +50,7 @@ public function asset(mixed $entity, string $field): string $basePath = $this->getBasePath($entity, $mapping->getFilePropertyName()); $content = $propertyAccessor->getValue($entity, $mapping->getFileNamePropertyName()); if ('' != $content) { - $file = $basePath . '/' . $content; + $file = $basePath.'/'.$content; } } @@ -95,47 +95,6 @@ public function deletedFileByEntities(): void } } - private function findInEntities(array $entities, string $file): bool - { - $find = false; - foreach ($entities as $entity) { - $find = $this->findInEntity($entity, $file); - if ($find) { - break; - } - } - - return $find; - } - - private function findInEntity(string $entityClass, string $file): bool - { - $entityRepository = $this->getRepository($entityClass); - $mappings = $this->propertyMappingFactory->fromObject(new $entityClass()); - $search = []; - foreach ($mappings as $mapping) { - $field = $mapping->getFileNamePropertyName(); - $search[$field] = $file; - } - - $entity = $this->findInFields($entityRepository, $search); - - return (0 !== count($entity)); - } - - private function findInFields(EntityRepository $entityRepository, array $fields): mixed - { - $queryBuilder = $entityRepository->createQueryBuilder('entity'); - foreach ($fields as $field => $value) { - $queryBuilder->orWhere(sprintf('entity.%s = :%s', $field, $field)); - $queryBuilder->setParameter($field, $value); - } - - $query = $queryBuilder->getQuery(); - - return $query->getResult(); - } - public function getBasePath(mixed $entity, string $type): string { $object = $this->propertyMappingFactory->fromField(new $entity(), $type); @@ -202,7 +161,7 @@ public function getFullBasePath(mixed $entity, string $type): string { $basePath = $this->getBasePath($entity, $type); - return $this->parameterBag->get('kernel.project_dir') . '/public' . $basePath; + return $this->parameterBag->get('kernel.project_dir').'/public'.$basePath; } public function getimportCsvFile(string $path, string $delimiter = ','): array @@ -250,7 +209,7 @@ public function getInfoImage(string $file): array $mimetype = 'image/jpeg'; } - $public = str_replace($this->parameterBag->get('kernel.project_dir') . '/public', '', $file); + $public = str_replace($this->parameterBag->get('kernel.project_dir').'/public', '', $file); return [ 'src' => $file, @@ -315,10 +274,10 @@ public function getSizeFormat(int $size): string } if (0 === $unitIndex) { - return (int) $bytes . ' ' . $units[$unitIndex]; + return (int) $bytes.' '.$units[$unitIndex]; } - return number_format($bytes, 2) . ' ' . $units[$unitIndex]; + return number_format($bytes, 2).' '.$units[$unitIndex]; } public function saveFileInAdapter(string $type, string $fileName, $content): null @@ -373,8 +332,8 @@ public function setUploadedFile(string $filePath, object $entity, string|Propert $tempPath = tempnam(sys_get_temp_dir(), 'download_'); $content = file_get_contents($filePath); if (false === $content) { - $this->logger->error('Failed to download file from URL: ' . $filePath); - throw new Exception('Failed to download file from URL: ' . $filePath); + $this->logger->error('Failed to download file from URL: '.$filePath); + throw new Exception('Failed to download file from URL: '.$filePath); } file_put_contents($tempPath, $content); @@ -393,9 +352,9 @@ public function setUploadedFile(string $filePath, object $entity, string|Propert $propertyAccessor = PropertyAccess::createPropertyAccessor(); $propertyAccessor->setValue($entity, $type, $uploadedFile); } catch (Exception $exception) { - $this->logger->error('Error setting uploaded file: ' . $exception->getMessage()); + $this->logger->error('Error setting uploaded file: '.$exception->getMessage()); throw new Exception( - 'Error setting uploaded file: ' . $exception->getMessage(), + 'Error setting uploaded file: '.$exception->getMessage(), $exception->getCode(), $exception ); @@ -440,6 +399,47 @@ private function fillGridFiles(array $files): array return $files; } + private function findInEntities(array $entities, string $file): bool + { + $find = false; + foreach ($entities as $entity) { + $find = $this->findInEntity($entity, $file); + if ($find) { + break; + } + } + + return $find; + } + + private function findInEntity(string $entityClass, string $file): bool + { + $entityRepository = $this->getRepository($entityClass); + $mappings = $this->propertyMappingFactory->fromObject(new $entityClass()); + $search = []; + foreach ($mappings as $mapping) { + $field = $mapping->getFileNamePropertyName(); + $search[$field] = $file; + } + + $entity = $this->findInFields($entityRepository, $search); + + return 0 !== count($entity); + } + + private function findInFields(EntityRepository $entityRepository, array $fields): mixed + { + $queryBuilder = $entityRepository->createQueryBuilder('entity'); + foreach ($fields as $field => $value) { + $queryBuilder->orWhere(sprintf('entity.%s = :%s', $field, $field)); + $queryBuilder->setParameter($field, $value); + } + + $query = $queryBuilder->getQuery(); + + return $query->getResult(); + } + /** * @return list */ diff --git a/apps/src/Service/GeocodeService.php b/apps/src/Service/GeocodeService.php index 36e7e1bae..553571c36 100644 --- a/apps/src/Service/GeocodeService.php +++ b/apps/src/Service/GeocodeService.php @@ -21,7 +21,7 @@ public function __construct( public function csv(string $country): array { $country = strtoupper($country); - $file = 'http://download.geonames.org/export/zip/' . $country . '.zip'; + $file = 'http://download.geonames.org/export/zip/'.$country.'.zip'; $response = $this->httpClient->request('GET', $file); $statusCode = $response->getStatusCode(); if (self::HTTP_OK !== $statusCode) { @@ -38,7 +38,7 @@ public function csv(string $country): array return []; } - $content = (string) $zipArchive->getFromName($country . '.txt'); + $content = (string) $zipArchive->getFromName($country.'.txt'); $csv = str_getcsv($content, "\n", escape: '\\'); $zipArchive->close(); diff --git a/apps/src/Service/Igdb/GameService.php b/apps/src/Service/Igdb/GameService.php index d76e8b850..5c405dec5 100644 --- a/apps/src/Service/Igdb/GameService.php +++ b/apps/src/Service/Igdb/GameService.php @@ -48,7 +48,7 @@ public function addByApi(string $id, $platformId): ?Game public function getApiGameId(string $id): ?array { - $where = ['id = ' . $id]; + $where = ['id = '.$id]; $fields = [ '*', 'cover.*', @@ -155,7 +155,7 @@ public function updateGame(Game $game, array $data): bool } } - $summary = '

    ' . implode('

    ', $new) . '

    '; + $summary = '

    '.implode('

    ', $new).'

    '; $game->setSummary($summary); return true; @@ -165,19 +165,19 @@ private function buildDateFilter(array $data, bool $withSearch): array { $where = []; if (isset($data['platform']) && !empty($data['platform'])) { - $where[] = 'platforms = (' . $data['platform']->getIgdb() . ')'; + $where[] = 'platforms = ('.$data['platform']->getIgdb().')'; } if (isset($data['franchise']) && !empty($data['franchise'])) { - $where[] = 'franchises.name ~ "' . $data['franchise'] . '"'; + $where[] = 'franchises.name ~ "'.$data['franchise'].'"'; } if (isset($data['type']) && '' != $data['type']) { - $where[] = 'game_type = ' . $data['type']; + $where[] = 'game_type = '.$data['type']; } if (isset($data['number']) && !empty($data['number'])) { - $where[] = 'id = ' . $data['number']; + $where[] = 'id = '.$data['number']; } if (!$withSearch) { @@ -334,7 +334,7 @@ private function setWhereName($name): string $where[] = sprintf('%s ~ "%s"', $code, $name); } - return '(' . implode(' | ', $where) . ')'; + return '('.implode(' | ', $where).')'; } private function updateArtworks(Game $game, array $data): bool diff --git a/apps/src/Service/Igdb/PlatformService.php b/apps/src/Service/Igdb/PlatformService.php index fe3416dd4..69c276df1 100644 --- a/apps/src/Service/Igdb/PlatformService.php +++ b/apps/src/Service/Igdb/PlatformService.php @@ -55,7 +55,7 @@ public function getPlatformApi(array $data, int $limit, int $offset): array if (isset($data['family']) && !empty($data['family'])) { $family = $data['family']; - $where[] = 'platform_family.name ~ "' . $family . '"'; + $where[] = 'platform_family.name ~ "'.$family.'"'; } $fields = [ @@ -91,7 +91,7 @@ public function update(Platform $platform): ?bool private function getApiPlatformFamilyId(string $id): ?array { - $where = ['id = ' . $id]; + $where = ['id = '.$id]; $body = $this->igdbApi->setBody(where: $where, limit: 1); $results = $this->igdbApi->setUrl('platform_families', $body); @@ -104,7 +104,7 @@ private function getApiPlatformFamilyId(string $id): ?array private function getApiPlatformId(string $id): ?array { - $where = ['id = ' . $id]; + $where = ['id = '.$id]; $fields = [ '*', 'platform_logo.*', diff --git a/apps/src/Service/Imdb/CompanyService.php b/apps/src/Service/Imdb/CompanyService.php index 471f4d4a3..30254a7a7 100644 --- a/apps/src/Service/Imdb/CompanyService.php +++ b/apps/src/Service/Imdb/CompanyService.php @@ -45,7 +45,7 @@ public function update(Company $company): bool $details = $this->theMovieDbApi->getDetailsCompany($company); if (is_null($details['tmdb'])) { $this->companyRepository->delete($company); - $this->logger->error('Company not found TMDB id ' . $company->getTmdb()); + $this->logger->error('Company not found TMDB id '.$company->getTmdb()); return false; } diff --git a/apps/src/Service/Imdb/EpisodeService.php b/apps/src/Service/Imdb/EpisodeService.php index cc4f4c0fb..8088f1c47 100644 --- a/apps/src/Service/Imdb/EpisodeService.php +++ b/apps/src/Service/Imdb/EpisodeService.php @@ -86,7 +86,7 @@ private function updateCredits(Episode $episode, array $details): bool if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { foreach ($details['credits']['cast'] as $cast) { - $person = $this->personService->getPerson($cast); + $person = $this->personService->getPerson($cast); $casting = $this->personService->addToCastingEpisode($person, $episode, $cast); $episode->addCasting($casting); } @@ -94,7 +94,7 @@ private function updateCredits(Episode $episode, array $details): bool if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { foreach ($details['credits']['crew'] as $crew) { - $person = $this->personService->getPerson($crew); + $person = $this->personService->getPerson($crew); $casting = $this->personService->addToCastingEpisode($person, $episode, $crew); $episode->addCasting($casting); } diff --git a/apps/src/Service/Imdb/MovieService.php b/apps/src/Service/Imdb/MovieService.php index 72f03a160..d6ef91117 100644 --- a/apps/src/Service/Imdb/MovieService.php +++ b/apps/src/Service/Imdb/MovieService.php @@ -141,7 +141,7 @@ public function updateCredits(Movie $movie, array $details): bool if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { foreach ($details['credits']['cast'] as $cast) { - $person = $this->personService->getPerson($cast); + $person = $this->personService->getPerson($cast); $casting = $this->personService->addToCastingMovie($person, $movie, $cast); $movie->addCasting($casting); } @@ -149,7 +149,7 @@ public function updateCredits(Movie $movie, array $details): bool if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { foreach ($details['credits']['crew'] as $crew) { - $person = $this->personService->getPerson($crew); + $person = $this->personService->getPerson($crew); $casting = $this->personService->addToCastingMovie($person, $movie, $crew); $movie->addCasting($casting); } diff --git a/apps/src/Service/Imdb/SagaService.php b/apps/src/Service/Imdb/SagaService.php index 6711fbc97..d0d4c8440 100644 --- a/apps/src/Service/Imdb/SagaService.php +++ b/apps/src/Service/Imdb/SagaService.php @@ -65,7 +65,7 @@ public function update(Saga $saga): bool $details = $this->theMovieDbApi->getDetailsSaga($saga); if (!isset($details['tmdb']) || is_null($details['tmdb'])) { $this->sagaRepository->delete($saga); - $this->logger->error('Saga not found TMDB id ' . $saga->getTmdb()); + $this->logger->error('Saga not found TMDB id '.$saga->getTmdb()); return false; } diff --git a/apps/src/Service/Imdb/SeasonService.php b/apps/src/Service/Imdb/SeasonService.php index 1719b54f4..6a0456214 100644 --- a/apps/src/Service/Imdb/SeasonService.php +++ b/apps/src/Service/Imdb/SeasonService.php @@ -116,7 +116,7 @@ private function updateCredits(Season $season, array $details): bool if (isset($details['credits']['cast']) && is_array($details['credits']['cast'])) { foreach ($details['credits']['cast'] as $cast) { - $person = $this->personService->getPerson($cast); + $person = $this->personService->getPerson($cast); $casting = $this->personService->addToCastingSeason($person, $season, $cast); $season->addCasting($casting); } @@ -124,8 +124,8 @@ private function updateCredits(Season $season, array $details): bool if (isset($details['credits']['crew']) && is_array($details['credits']['crew'])) { foreach ($details['credits']['crew'] as $crew) { - $person = $this->personService->getPerson($crew); - $casting =$this->personService->addToCastingSeason($person, $season, $crew); + $person = $this->personService->getPerson($crew); + $casting = $this->personService->addToCastingSeason($person, $season, $crew); $season->addCasting($casting); } } diff --git a/apps/src/Service/Imdb/SerieService.php b/apps/src/Service/Imdb/SerieService.php index 99ec7f639..ad5019c18 100644 --- a/apps/src/Service/Imdb/SerieService.php +++ b/apps/src/Service/Imdb/SerieService.php @@ -272,7 +272,7 @@ private function updateCredits(Serie $serie, array $details): bool if (isset($details['credits']['cast']) || is_array($details['credits']['cast'])) { foreach ($details['credits']['cast'] as $cast) { - $person = $this->personService->getPerson($cast); + $person = $this->personService->getPerson($cast); $casting = $this->personService->addToCastingSerie($person, $serie, $cast); $serie->addCasting($casting); } @@ -280,7 +280,7 @@ private function updateCredits(Serie $serie, array $details): bool if (isset($details['credits']['crew']) || is_array($details['credits']['crew'])) { foreach ($details['credits']['crew'] as $crew) { - $person = $this->personService->getPerson($crew); + $person = $this->personService->getPerson($crew); $casting = $this->personService->addToCastingSerie($person, $serie, $crew); $serie->addCasting($casting); } diff --git a/apps/src/Service/MessageDispatcherService.php b/apps/src/Service/MessageDispatcherService.php index e0b7016db..f4a47be31 100644 --- a/apps/src/Service/MessageDispatcherService.php +++ b/apps/src/Service/MessageDispatcherService.php @@ -11,6 +11,7 @@ */ final class MessageDispatcherService { + /** * @var array> */ @@ -25,8 +26,8 @@ public function __construct( /** * Dispatch un message seulement s'il n'a pas déjà été dispatché. * - * @param object $message Le message à dispatcher - * @param array $stamps Les stamps Symfony Messenger optionnels + * @param object $message Le message à dispatcher + * @param array $stamps Les stamps Symfony Messenger optionnels * @param bool $forceDispatch Force le dispatch même si déjà dispatché */ public function dispatch(object $message, array $stamps = [], bool $forceDispatch = false): void @@ -41,6 +42,21 @@ public function dispatch(object $message, array $stamps = [], bool $forceDispatc $this->messageBus->dispatch($message, $stamps); } + /** + * Retourne le nombre de messages dispatchés par type. + * + * @return array + */ + public function getDispatchStats(): array + { + $stats = []; + foreach ($this->dispatchedMessages as $className => $messages) { + $stats[$className] = count($messages); + } + + return $stats; + } + /** * Vérifie si un message a déjà été dispatché. */ @@ -73,14 +89,22 @@ public function reset(): void $this->dispatchedMessages = []; } + /** + * Extrait le nom de classe depuis une clé de message. + */ + private function extractClassName(string $messageKey): string + { + return explode('::', $messageKey)[0]; + } + /** * Génère une clé unique pour un message basée sur sa classe et ses propriétés. */ private function getMessageKey(object $message): string { - $className = $message::class; + $className = $message::class; $reflectionClass = new ReflectionClass($message); - $properties = []; + $properties = []; foreach ($reflectionClass->getProperties() as $reflectionProperty) { $value = $reflectionProperty->getValue($message); @@ -90,15 +114,7 @@ private function getMessageKey(object $message): string ksort($properties); - return $className . '::' . md5(serialize($properties)); - } - - /** - * Extrait le nom de classe depuis une clé de message. - */ - private function extractClassName(string $messageKey): string - { - return explode('::', $messageKey)[0]; + return $className.'::'.md5(serialize($properties)); } /** @@ -112,19 +128,4 @@ private function serializeValue(mixed $value): mixed return $value; } - - /** - * Retourne le nombre de messages dispatchés par type. - * - * @return array - */ - public function getDispatchStats(): array - { - $stats = []; - foreach ($this->dispatchedMessages as $className => $messages) { - $stats[$className] = count($messages); - } - - return $stats; - } } diff --git a/apps/src/Service/SecurityService.php b/apps/src/Service/SecurityService.php index 276870915..8984832ea 100644 --- a/apps/src/Service/SecurityService.php +++ b/apps/src/Service/SecurityService.php @@ -50,7 +50,7 @@ public function get(): ?RedirectResponse } $pathinfo = $request->getPathInfo(); - $slug = '/' . $request->attributes->get('slug'); + $slug = '/'.$request->attributes->get('slug'); if ($slug !== $pathinfo) { $pathinfo = $slug; } @@ -125,7 +125,7 @@ public function set(int $httpCode = 404): void $server = $request->server; $httpErrorLogs = new HttpErrorLogs(); - $domain = $server->get('REQUEST_SCHEME') . '://' . $server->get('SERVER_NAME'); + $domain = $server->get('REQUEST_SCHEME').'://'.$server->get('SERVER_NAME'); $url = $server->get('REQUEST_URI'); if ($this->isDisableUrl($url)) { return; @@ -272,7 +272,7 @@ private function testRedirectRegex(string $pathinfo, array $redirections): ?Redi if (str_starts_with((string) $newUrl, '/')) { $request = $this->requestStack->getCurrentRequest(); if (!is_null($request)) { - $newUrl = $request->getSchemeAndHttpHost() . $newUrl; + $newUrl = $request->getSchemeAndHttpHost().$newUrl; } } diff --git a/apps/src/Service/SiteService.php b/apps/src/Service/SiteService.php index 7b0b9e664..ad0a39b18 100644 --- a/apps/src/Service/SiteService.php +++ b/apps/src/Service/SiteService.php @@ -26,13 +26,13 @@ public function asset(mixed $entity, string $field, bool $placeholder = true, bo $configuration = $this->configurationService->getConfiguration(); $data = $this->getAsset($entity); if (is_null($entity) || is_null($data)) { - return ($placeholder) ? 'https://picsum.photos/1200/1200?md5=' . bin2hex(random_bytes(16)) : ''; + return ($placeholder) ? 'https://picsum.photos/1200/1200?md5='.bin2hex(random_bytes(16)) : ''; } $file = $data->asset($entity, $field); if ('' !== $file) { - return $absolute ? $configuration->getUrl() . $file : $file; + return $absolute ? $configuration->getUrl().$file : $file; } if (!$placeholder) { @@ -41,10 +41,10 @@ public function asset(mixed $entity, string $field, bool $placeholder = true, bo $dataPlaceholder = $data->placeholder(); if ('' !== $dataPlaceholder) { - return $absolute ? $configuration->getUrl() . $dataPlaceholder : $dataPlaceholder; + return $absolute ? $configuration->getUrl().$dataPlaceholder : $dataPlaceholder; } - return 'https://picsum.photos/1200/1200?md5=' . md5((string) $entity->getId()); + return 'https://picsum.photos/1200/1200?md5='.md5((string) $entity->getId()); } /** diff --git a/apps/src/Service/SitemapService.php b/apps/src/Service/SitemapService.php index a2e77c3c2..7ca2752e7 100644 --- a/apps/src/Service/SitemapService.php +++ b/apps/src/Service/SitemapService.php @@ -76,7 +76,7 @@ private function formatData(object $entity): array $url = $this->urlGenerator->generate('front', $params); return [ - '/' . $url => ['entity' => $entity], + '/'.$url => ['entity' => $entity], ]; } @@ -242,7 +242,7 @@ private function setTabsByParent(array $urls, string $parent): array ) ) { $this->parent[$url] = true; - $data['parent'] = $this->setTabsByParent($urls, $url . '/'); + $data['parent'] = $this->setTabsByParent($urls, $url.'/'); $tabs[$url] = $data; } } diff --git a/apps/src/Service/StoryService.php b/apps/src/Service/StoryService.php index 731e9a64f..1066521f8 100644 --- a/apps/src/Service/StoryService.php +++ b/apps/src/Service/StoryService.php @@ -47,11 +47,11 @@ public function getUpdates(): array public function update(Story $story): bool { - $tempPath = $this->getTemporaryFolder() . '/' . $story->getSlug() . '.pdf'; + $tempPath = $this->getTemporaryFolder().'/'.$story->getSlug().'.pdf'; $mpdf = new Mpdf( [ - 'tempDir' => $this->getTemporaryFolder() . '/tmp', + 'tempDir' => $this->getTemporaryFolder().'/tmp', ] ); $mpdf->SetAuthor($story->getRefuser()->getUsername()); @@ -65,10 +65,10 @@ public function update(Story $story): bool $translatableMessage = new TranslatableMessage('Table of Contents'); $mpdf->TOCpagebreakByArray( [ - 'toc-preHTML' => '

    ' . $this->translator->trans( + 'toc-preHTML' => '

    '.$this->translator->trans( $translatableMessage->getMessage(), $translatableMessage->getParameters() - ) . '

    ', + ).'', 'links' => true, ] ); @@ -90,8 +90,8 @@ private function addCoverPage(Mpdf $mpdf, Story $story): void $mpdf->WriteHTML( '
    -

    ' . $story->getTitle() . '

    -

    Auteur : ' . $story->getRefuser()->getUsername() . '

    +

    '.$story->getTitle().'

    +

    Auteur : '.$story->getRefuser()->getUsername().'

    ' ); @@ -105,7 +105,7 @@ private function addCoverPage(Mpdf $mpdf, Story $story): void private function getChapters(Story $story): array { return $this->cacheService->get( - 'story_chapters_' . $story->getId(), + 'story_chapters_'.$story->getId(), function () use ($story): array { $chapters = []; $data = $story->getChapters(); @@ -141,7 +141,7 @@ private function setChapter(Mpdf $mpdf, Chapter $chapter): void foreach ($paragraphs as $paragraph) { if ($paragraph instanceof TextParagraph) { if (0 === $position) { - $mpdf->WriteHTML('

    ' . $chapter->getTitle() . '

    '); + $mpdf->WriteHTML('

    '.$chapter->getTitle().'

    '); } $mpdf->WriteHTML($paragraph->getContent()); diff --git a/apps/src/Service/VideoService.php b/apps/src/Service/VideoService.php index d1b6a331d..b9293a182 100644 --- a/apps/src/Service/VideoService.php +++ b/apps/src/Service/VideoService.php @@ -39,8 +39,8 @@ private function setVideo(array $data) { $type = strtolower((string) $data['site']); $video = match ($type) { - 'youtube' => 'https://www.youtube.com/watch?v=' . $data['key'], - 'vimeo' => 'https://vimeo.com/' . $data['key'], + 'youtube' => 'https://www.youtube.com/watch?v='.$data['key'], + 'vimeo' => 'https://vimeo.com/'.$data['key'], default => null, }; diff --git a/apps/src/Service/ViewResolverService.php b/apps/src/Service/ViewResolverService.php index 14f91322d..cba7f2a87 100644 --- a/apps/src/Service/ViewResolverService.php +++ b/apps/src/Service/ViewResolverService.php @@ -29,24 +29,12 @@ public function __construct( { } - private function getDefaultImageEntity(object $entity) - { - $image = ''; - foreach ($this->datas as $data) { - if ($data->supportsData($entity)) { - $image = $data->getDefaultImage($entity); - } - } - - return $image; - } - /** * @return mixed[] */ public function getDataByEntity(object $entity, bool $disable = false): array { - $cacheKey = 'data:' . spl_object_hash($entity) . ':' . ($disable ? '1' : '0'); + $cacheKey = 'data:'.spl_object_hash($entity).':'.($disable ? '1' : '0'); if (isset($this->requestCache[$cacheKey])) { return $this->requestCache[$cacheKey]; } @@ -153,6 +141,18 @@ private function getBlocks(array $data, bool $disable): array ]; } + private function getDefaultImageEntity(object $entity) + { + $image = ''; + foreach ($this->datas as $data) { + if ($data->supportsData($entity)) { + $image = $data->getDefaultImage($entity); + } + } + + return $image; + } + private function getMetaByEntity(Meta $meta): Meta { return $meta; @@ -160,7 +160,7 @@ private function getMetaByEntity(Meta $meta): Meta private function getViewByEntity(object $entity): string { - $cacheKey = 'view:' . spl_object_hash($entity); + $cacheKey = 'view:'.spl_object_hash($entity); if (isset($this->requestCache[$cacheKey])) { return $this->requestCache[$cacheKey]; } @@ -175,7 +175,7 @@ private function getViewByEntityName(string $entityName): string { $loader = $this->twigEnvironment->getLoader(); $files = [ - 'views/' . $entityName . '.html.twig', + 'views/'.$entityName.'.html.twig', 'views/default.html.twig', ]; diff --git a/apps/src/SlugHandler/ChapterSlugHandler.php b/apps/src/SlugHandler/ChapterSlugHandler.php index a1d989de6..629be42a0 100644 --- a/apps/src/SlugHandler/ChapterSlugHandler.php +++ b/apps/src/SlugHandler/ChapterSlugHandler.php @@ -88,7 +88,7 @@ public function setSlugForObject($objectRepository, $object) break; } - $slug = $unicodeString . '-' . $number; + $slug = $unicodeString.'-'.$number; ++$number; } diff --git a/apps/src/SlugHandler/MovieSlugHandler.php b/apps/src/SlugHandler/MovieSlugHandler.php index 696db87e1..2a63ef007 100644 --- a/apps/src/SlugHandler/MovieSlugHandler.php +++ b/apps/src/SlugHandler/MovieSlugHandler.php @@ -60,13 +60,13 @@ public function onSlugCompletion(SluggableAdapter $sluggableAdapter, array &$con } $date = $object->getReleaseDate(); - $newSlug = $date ? $originalSlug . '-' . $date->format('Y') : $originalSlug . '-' . uniqid(); + $newSlug = $date ? $originalSlug.'-'.$date->format('Y') : $originalSlug.'-'.uniqid(); $existingMovie->setSlug($newSlug); $objectManager->persist($existingMovie); } $date = $object->getReleaseDate(); - $slug = $date ? $originalSlug . '-' . $date->format('Y') : $originalSlug . '-' . uniqid(); + $slug = $date ? $originalSlug.'-'.$date->format('Y') : $originalSlug.'-'.uniqid(); } public function postSlugBuild(SluggableAdapter $sluggableAdapter, array &$config, $object, &$slug): void diff --git a/apps/src/SlugHandler/PageSlugHandler.php b/apps/src/SlugHandler/PageSlugHandler.php index 30d7f0886..c99131c06 100644 --- a/apps/src/SlugHandler/PageSlugHandler.php +++ b/apps/src/SlugHandler/PageSlugHandler.php @@ -114,7 +114,7 @@ public function onSlugCompletion(SluggableAdapter $sluggableAdapter, array &$con $classMetadata = $wrapper->getMetadata(); $target = $wrapper->getPropertyValue($config['slug']); $config['pathSeparator'] = $this->usedPathSeparator; - $sluggableAdapter->replaceRelative($object, $config, $target . $config['pathSeparator'], $slug); + $sluggableAdapter->replaceRelative($object, $config, $target.$config['pathSeparator'], $slug); $uow = $this->objectManager->getUnitOfWork(); // update in memory objects foreach ($uow->getIdentityMap() as $className => $objects) { @@ -155,14 +155,14 @@ public function postSlugBuild(SluggableAdapter $sluggableAdapter, array &$config public function transliterate(string $text, $separator, $object): string { unset($separator, $object); - $slug = $text . $this->suffix; + $slug = $text.$this->suffix; if (0 !== strlen($this->parentSlug)) { - return $this->parentSlug . $this->usedPathSeparator . $slug; + return $this->parentSlug.$this->usedPathSeparator.$slug; } // if no parentSlug, apply our prefix - return $this->prefix . $slug; + return $this->prefix.$slug; } /** diff --git a/apps/src/SlugHandler/SagaSlugHandler.php b/apps/src/SlugHandler/SagaSlugHandler.php index 8dc2c0439..3006f0825 100644 --- a/apps/src/SlugHandler/SagaSlugHandler.php +++ b/apps/src/SlugHandler/SagaSlugHandler.php @@ -50,7 +50,7 @@ public function onSlugCompletion(SluggableAdapter $sluggableAdapter, array &$con ); if ($existingMovies) { - $slug = $originalSlug . '-saga'; + $slug = $originalSlug.'-saga'; } } diff --git a/apps/src/Template/TemplateAbstract.php b/apps/src/Template/TemplateAbstract.php index 5755817e4..79726fb9a 100644 --- a/apps/src/Template/TemplateAbstract.php +++ b/apps/src/Template/TemplateAbstract.php @@ -54,7 +54,7 @@ public function getTemplate() $template = new Template(); $template->setCode($code); - $template->setTitle('Template ' . $code); + $template->setTitle('Template '.$code); $template->setHtml($html); $template->setText($text); @@ -72,10 +72,10 @@ protected function getTemplateContent(string $code, string $type): string return $this->templates[$code][$type]; } - $extension = '.' . $type . '.twig'; + $extension = '.'.$type.'.twig'; $files = [ - 'template/' . $code . $extension, - 'template/default' . $extension, + 'template/'.$code.$extension, + 'template/default'.$extension, ]; $view = end($files); diff --git a/apps/src/Twig/Extension/CastingExtension.php b/apps/src/Twig/Extension/CastingExtension.php index 4530d1166..e4e5fe10e 100644 --- a/apps/src/Twig/Extension/CastingExtension.php +++ b/apps/src/Twig/Extension/CastingExtension.php @@ -2,14 +2,13 @@ namespace Labstag\Twig\Extension; -use Override; use Labstag\Twig\Runtime\CastingExtensionRuntime; +use Override; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; class CastingExtension extends AbstractExtension { - #[Override] public function getFunctions(): array { diff --git a/apps/src/Twig/Runtime/AdminExtensionRuntime.php b/apps/src/Twig/Runtime/AdminExtensionRuntime.php index 713b88892..32eed8de9 100644 --- a/apps/src/Twig/Runtime/AdminExtensionRuntime.php +++ b/apps/src/Twig/Runtime/AdminExtensionRuntime.php @@ -24,7 +24,7 @@ public function name(object $entity): string foreach ($this->controllers as $controller) { $entityClass = $controller->getEntityFqcn(); if ($entityClass == $entity::class || $entity instanceof $entityClass) { - $crud = $controller->configureCrud(Crud::new()); + $crud = $controller->configureCrud(Crud::new()); $singular = $crud->getAsDto()->getEntityLabelInSingular(); return $this->translator->trans($singular->getMessage()); diff --git a/apps/src/Twig/Runtime/BlockExtensionRuntime.php b/apps/src/Twig/Runtime/BlockExtensionRuntime.php index f6787fbce..a2a6e20ea 100644 --- a/apps/src/Twig/Runtime/BlockExtensionRuntime.php +++ b/apps/src/Twig/Runtime/BlockExtensionRuntime.php @@ -90,7 +90,7 @@ private function getClass(Block $block): string $type = $this->blockService->getType($block); $tab = [ 'block', - 'block_' . $type, + 'block_'.$type, ]; $classes = explode(' ', (string) $block->getClasses()); @@ -104,6 +104,6 @@ private function getId(Block $block): string { $type = $this->blockService->getType($block); - return 'block_' . $type . '-' . $block->getId(); + return 'block_'.$type.'-'.$block->getId(); } } diff --git a/apps/src/Twig/Runtime/CastingExtensionRuntime.php b/apps/src/Twig/Runtime/CastingExtensionRuntime.php index ee95da613..8a964bfed 100644 --- a/apps/src/Twig/Runtime/CastingExtensionRuntime.php +++ b/apps/src/Twig/Runtime/CastingExtensionRuntime.php @@ -19,6 +19,11 @@ public function __construct( // Inject dependencies if needed } + public function acting($data): array + { + return $this->getByType('Acting', $data); + } + public function cast($data): mixed { $entityRepository = $this->entityManager->getRepository(Casting::class); @@ -26,31 +31,14 @@ public function cast($data): mixed return $entityRepository->findWithActiveCastings($data); } - public function series($data): array + public function directing($data): array { - $tab = []; - foreach ($data as $row) { - if ($row->getRefSerie() instanceof Serie) { - $id = $row->getRefSerie()->getId(); - $tab[$id] = $row->getRefSerie(); - }elseif ($row->getRefEpisode() instanceof Episode) { - $id = $row->getRefEpisode()->getRefseason()->getRefserie()->getId(); - $tab[$id] = $row->getRefEpisode()->getRefseason()->getRefserie(); - }elseif ($row->getRefSeason() instanceof Season) { - $id = $row->getRefSeason()->getRefserie()->getId(); - $tab[$id] = $row->getRefSeason()->getRefserie(); - } - } - - foreach ($tab as $key => $serie) { - if ($serie->isEnable()) { - continue; - } - - unset($tab[$key]); - } + return $this->getByType('Directing', $data); + } - return $tab; + public function editing($data): array + { + return $this->getByType('Editing', $data); } public function movies($data): array @@ -67,36 +55,48 @@ public function movies($data): array if ($movie->isEnable()) { continue; } - + unset($tab[$key]); } return $tab; } - public function acting($data): array + public function production($data): array { - return $this->getByType('Acting', $data); + return $this->getByType('Production', $data); } - public function writing($data): array + public function series($data): array { - return $this->getByType('Writing', $data); - } + $tab = []; + foreach ($data as $row) { + if ($row->getRefSerie() instanceof Serie) { + $id = $row->getRefSerie()->getId(); + $tab[$id] = $row->getRefSerie(); + } elseif ($row->getRefEpisode() instanceof Episode) { + $id = $row->getRefEpisode()->getRefseason()->getRefserie()->getId(); + $tab[$id] = $row->getRefEpisode()->getRefseason()->getRefserie(); + } elseif ($row->getRefSeason() instanceof Season) { + $id = $row->getRefSeason()->getRefserie()->getId(); + $tab[$id] = $row->getRefSeason()->getRefserie(); + } + } - public function directing($data): array - { - return $this->getByType('Directing', $data); - } + foreach ($tab as $key => $serie) { + if ($serie->isEnable()) { + continue; + } - public function production($data): array - { - return $this->getByType('Production', $data); + unset($tab[$key]); + } + + return $tab; } - public function editing($data): array + public function writing($data): array { - return $this->getByType('Editing', $data); + return $this->getByType('Writing', $data); } private function getByType(string $type, $data): array diff --git a/apps/src/Twig/Runtime/DebugExtensionRuntime.php b/apps/src/Twig/Runtime/DebugExtensionRuntime.php index 39b3a19e2..97961feac 100644 --- a/apps/src/Twig/Runtime/DebugExtensionRuntime.php +++ b/apps/src/Twig/Runtime/DebugExtensionRuntime.php @@ -22,16 +22,16 @@ public function begin(array $data): string } $html = "\n"); + return $html.("BEGIN OUTPUT from '".$templates['view']."' -->\n"); } /** @@ -44,6 +44,6 @@ public function end(array $data): string return ''; } - return "\n\n"; + return "\n\n"; } } diff --git a/apps/src/Twig/Runtime/FrontExtensionRuntime.php b/apps/src/Twig/Runtime/FrontExtensionRuntime.php index de6b224da..e2b885407 100644 --- a/apps/src/Twig/Runtime/FrontExtensionRuntime.php +++ b/apps/src/Twig/Runtime/FrontExtensionRuntime.php @@ -155,7 +155,7 @@ public function title(array $data): string $contentTitle = $this->siteService->getTitleMeta($data['entity']); $page = $request->attributes->getInt('page', 1); if (1 != $page) { - $contentTitle .= ' - Page ' . $page; + $contentTitle .= ' - Page '.$page; } return str_replace(['%content_title%', '%site_name%'], [$contentTitle, $siteTitle], $format); diff --git a/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php b/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php index af1193bdf..5640f54b0 100644 --- a/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php +++ b/apps/src/Twig/Runtime/ParagraphExtensionRuntime.php @@ -95,7 +95,7 @@ private function getClass(Paragraph $paragraph): string $type = $this->paragraphService->getType($paragraph); $tab = [ 'paragraph', - 'paragraph_' . $type, + 'paragraph_'.$type, ]; $tab = array_merge($tab, $this->paragraphService->getClasses($paragraph)); @@ -107,6 +107,6 @@ private function getId(Paragraph $paragraph): string { $type = $this->paragraphService->getType($paragraph); - return 'paragraph_' . $type . '-' . $paragraph->getId(); + return 'paragraph_'.$type.'-'.$paragraph->getId(); } } diff --git a/apps/src/Twig/Runtime/TimeExtensionRuntime.php b/apps/src/Twig/Runtime/TimeExtensionRuntime.php index 2dd803647..822bc0329 100644 --- a/apps/src/Twig/Runtime/TimeExtensionRuntime.php +++ b/apps/src/Twig/Runtime/TimeExtensionRuntime.php @@ -28,23 +28,23 @@ public function runtime($minutes): string $parts = []; if (0 !== $years) { - $parts[] = $years . 'a'; + $parts[] = $years.'a'; } if (0 !== $months) { - $parts[] = $months . 'm'; + $parts[] = $months.'m'; } if (0 !== $days) { - $parts[] = $days . 'j'; + $parts[] = $days.'j'; } if (0 !== $hours) { - $parts[] = $hours . 'h'; + $parts[] = $hours.'h'; } if (0 !== $mins) { - $parts[] = $mins . 'min'; + $parts[] = $mins.'min'; } return implode(' ', $parts); diff --git a/apps/tests/Fixtures/PerformanceFixtures.php b/apps/tests/Fixtures/PerformanceFixtures.php index 459370ba2..542fac784 100644 --- a/apps/tests/Fixtures/PerformanceFixtures.php +++ b/apps/tests/Fixtures/PerformanceFixtures.php @@ -38,7 +38,7 @@ public function load(ObjectManager $manager): void for ($i = 1; self::PERFORMANCE_USERS_COUNT >= $i; ++$i) { $user = new User(); $user->setEmail(sprintf('perf.user.%d@labstag.test', $i)); - $user->setUsername('perfuser' . $i); + $user->setUsername('perfuser'.$i); $user->setEnable(true); $user->setLanguage('fr'); diff --git a/apps/tests/Performance/CachePerformanceTest.php b/apps/tests/Performance/CachePerformanceTest.php index d1ff7c557..59c9bd13d 100644 --- a/apps/tests/Performance/CachePerformanceTest.php +++ b/apps/tests/Performance/CachePerformanceTest.php @@ -45,7 +45,7 @@ public function cacheInvalidationPerformance(): void for ($i = 0; self::CACHE_INVALIDATION_TEST_ENTITIES > $i; ++$i) { $user = new User(); $user->setEmail(sprintf('invalidation%d@example.com', $i)); - $user->setUsername('invaliduser' . $i); + $user->setUsername('invaliduser'.$i); $user->setPassword('password'); $user->setEnable(true); $user->setLanguage('fr'); @@ -82,7 +82,7 @@ public function cacheValidationPerformance(): void $posts = []; for ($i = 0; self::CACHE_VALIDATION_TEST_ENTITIES > $i; ++$i) { $post = new Post(); - $post->setTitle('Cache Validation Post ' . $i); + $post->setTitle('Cache Validation Post '.$i); $post->setEnable(true); $this->persistAndFlush($post); $posts[] = $post; @@ -114,7 +114,7 @@ public function collectionEtagPerformance(): void $entities = []; for ($i = 0; self::COLLECTION_ETAG_TEST_ENTITIES > $i; ++$i) { $post = new Post(); - $post->setTitle('Performance Post ' . $i); + $post->setTitle('Performance Post '.$i); $post->setEnable(true); $this->persistAndFlush($post); $entities[] = $post; @@ -204,7 +204,7 @@ public function etagGenerationPerformance(): void for ($i = 0; self::ETAG_GENERATION_TEST_ENTITIES > $i; ++$i) { $user = new User(); $user->setEmail(sprintf('performance%d@example.com', $i)); - $user->setUsername('perfuser' . $i); + $user->setUsername('perfuser'.$i); $user->setPassword('password'); $user->setEnable(true); $user->setLanguage('fr'); @@ -242,7 +242,7 @@ public function memoryLeakPrevention(): void for ($i = 0; self::MEMORY_LEAK_TEST_ENTITIES > $i; ++$i) { $user = new User(); $user->setEmail(sprintf('leak%d@example.com', $i)); - $user->setUsername('leakuser' . $i); + $user->setUsername('leakuser'.$i); $user->setPassword('password'); $user->setEnable(true); $user->setLanguage('fr'); diff --git a/apps/tests/Unit/Service/EtagCacheServiceTest.php b/apps/tests/Unit/Service/EtagCacheServiceTest.php index d0a774137..4e2c3d083 100644 --- a/apps/tests/Unit/Service/EtagCacheServiceTest.php +++ b/apps/tests/Unit/Service/EtagCacheServiceTest.php @@ -285,7 +285,7 @@ private function createMockUser( $idProperty->setValue($user, $id); $user->setEmail($email); - $user->setUsername('test_user_' . substr($id, 0, 8)); + $user->setUsername('test_user_'.substr($id, 0, 8)); if ($createdAt instanceof DateTimeImmutable) { $createdAtProperty = new ReflectionProperty(User::class, 'createdAt'); diff --git a/apps/tests/bootstrap.php b/apps/tests/bootstrap.php index b3c92e432..70b5dc3a6 100755 --- a/apps/tests/bootstrap.php +++ b/apps/tests/bootstrap.php @@ -4,7 +4,7 @@ use Symfony\Component\Dotenv\Dotenv; -require dirname(__DIR__) . '/vendor/autoload.php'; +require dirname(__DIR__).'/vendor/autoload.php'; // Force test env before loading .env chain so that .env.test is used if (!isset($_SERVER['APP_ENV']) && !isset($_ENV['APP_ENV'])) { @@ -12,11 +12,11 @@ $_ENV['APP_ENV'] = 'test'; } -if (file_exists(dirname(__DIR__) . '/config/bootstrap.php')) { - include dirname(__DIR__) . '/config/bootstrap.php'; +if (file_exists(dirname(__DIR__).'/config/bootstrap.php')) { + include dirname(__DIR__).'/config/bootstrap.php'; } elseif (method_exists(Dotenv::class, 'bootEnv')) { $dotenv = new Dotenv(); - $dotenv->bootEnv(dirname(__DIR__) . '/.env'); + $dotenv->bootEnv(dirname(__DIR__).'/.env'); } if (!empty($_SERVER['APP_DEBUG'])) { diff --git a/apps/tests/object-manager.php b/apps/tests/object-manager.php index 2ea8e79fd..4496e4db0 100755 --- a/apps/tests/object-manager.php +++ b/apps/tests/object-manager.php @@ -6,9 +6,9 @@ use Labstag\Kernel; use Symfony\Component\Dotenv\Dotenv; -require __DIR__ . '/../vendor/autoload.php'; +require __DIR__.'/../vendor/autoload.php'; $dotenv = new Dotenv(); -$dotenv->bootEnv(__DIR__ . '/../.env'); +$dotenv->bootEnv(__DIR__.'/../.env'); $kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); $kernel->boot(); From 62a7e3ffeeb68849cd776500357a18ca2808821d Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Wed, 6 May 2026 09:47:40 +0200 Subject: [PATCH 49/50] Refactor code structure for improved readability and maintainability --- apps/composer.json | 24 +- apps/composer.lock | 1698 +++++++++++++----------- apps/config/reference.php | 2331 ++++++++++++++++---------------- package-lock.json | 2648 +++++++++++++++++++------------------ 4 files changed, 3468 insertions(+), 3233 deletions(-) diff --git a/apps/composer.json b/apps/composer.json index d92c8a661..d3bd00f96 100755 --- a/apps/composer.json +++ b/apps/composer.json @@ -20,13 +20,13 @@ "giggsey/libphonenumber-for-php": "9.0.*", "knplabs/knp-menu-bundle": "3.7.*", "knplabs/knp-paginator-bundle": "6.10.*", - "league/flysystem-bundle": "3.6.*", + "league/flysystem-bundle": "3.7.*", "liip/imagine-bundle": "2.17.*", - "matomo/device-detector": "6.4.*", - "mpdf/mpdf": "8.2.*", + "matomo/device-detector": "6.5.*", + "mpdf/mpdf": "8.3.*", "nelmio/cors-bundle": "2.6.*", "nesbot/carbon": "3.11.*", - "phpoffice/phpspreadsheet": "5.4.*", + "phpoffice/phpspreadsheet": "5.7.*", "spatie/schema-org": "3.23.*", "symfony/apache-pack": "1.0.*", "symfony/bluesky-notifier": "8.0.*", @@ -54,10 +54,10 @@ "symfony/webpack-encore-bundle": "2.4.*", "symfony/workflow": "8.0.*", "symfony/yaml": "8.0.*", - "twig/extra-bundle": "3.22.*", - "twig/intl-extra": "3.22.*", - "twig/markdown-extra": "^3.22", - "twig/twig": "3.22.*", + "twig/extra-bundle": "3.24.*", + "twig/intl-extra": "3.24.*", + "twig/markdown-extra": "^3.24", + "twig/twig": "3.24.*", "vich/uploader-bundle": "2.9.*" }, "config": { @@ -132,7 +132,7 @@ "dama/doctrine-test-bundle": "*", "doctrine/doctrine-fixtures-bundle": "4.3.*", "fakerphp/faker": "1.24.*", - "friendsofphp/php-cs-fixer": "3.92.*", + "friendsofphp/php-cs-fixer": "3.95.*", "mmo/faker-images": "0.9.*", "phpstan/phpdoc-parser": "2.3.*", "phpstan/phpstan": "2.1.*", @@ -142,17 +142,17 @@ "phpstan/phpstan-phpunit": "2.0.*", "phpstan/phpstan-symfony": "2.0.*", "phpunit/phpunit": "12.5.*", - "rector/rector": "2.3.*", + "rector/rector": "2.4.*", "smknstd/fakerphp-picsum-images": "1.0.*", "squizlabs/php_codesniffer": "4.0.*", "symfony/browser-kit": "8.0.*", "symfony/css-selector": "8.0.*", "symfony/debug-bundle": "8.0.*", - "symfony/maker-bundle": "1.65.*", + "symfony/maker-bundle": "1.67.*", "symfony/phpunit-bridge": "8.0.*", "symfony/stopwatch": "8.0.*", "symfony/web-profiler-bundle": "8.0.*", - "symplify/easy-coding-standard": "13.0.*", + "symplify/easy-coding-standard": "13.1.*", "symplify/phpstan-rules": "14.9.*" } } diff --git a/apps/composer.lock b/apps/composer.lock index 1d0206831..c96ee2601 100755 --- a/apps/composer.lock +++ b/apps/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f7331e18389057c4a50e5e01b5a5e436", + "content-hash": "e28db303d7135ae53ca52477fb48e424", "packages": [ { "name": "beberlei/doctrineextensions", @@ -218,16 +218,16 @@ }, { "name": "doctrine/collections", - "version": "2.5.1", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "171e68db4b9aca9dc1f5d49925762f3d53d248c5" + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/171e68db4b9aca9dc1f5d49925762f3d53d248c5", - "reference": "171e68db4b9aca9dc1f5d49925762f3d53d248c5", + "url": "https://api.github.com/repos/doctrine/collections/zipball/7713da39d8e237f28411d6a616a3dce5e20d5de2", + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2", "shasum": "" }, "require": { @@ -284,7 +284,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.5.1" + "source": "https://github.com/doctrine/collections/tree/2.6.0" }, "funding": [ { @@ -300,20 +300,20 @@ "type": "tidelift" } ], - "time": "2026-01-12T20:53:55+00:00" + "time": "2026-01-15T10:01:58+00:00" }, { "name": "doctrine/dbal", - "version": "4.4.1", + "version": "4.4.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c" + "reference": "61e730f1658814821a85f2402c945f3883407dec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", - "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61e730f1658814821a85f2402c945f3883407dec", + "reference": "61e730f1658814821a85f2402c945f3883407dec", "shasum": "" }, "require": { @@ -329,9 +329,9 @@ "phpstan/phpstan": "2.1.30", "phpstan/phpstan-phpunit": "2.0.7", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "11.5.23", - "slevomat/coding-standard": "8.24.0", - "squizlabs/php_codesniffer": "4.0.0", + "phpunit/phpunit": "11.5.50", + "slevomat/coding-standard": "8.27.1", + "squizlabs/php_codesniffer": "4.0.1", "symfony/cache": "^6.3.8|^7.0|^8.0", "symfony/console": "^5.4|^6.3|^7.0|^8.0" }, @@ -390,7 +390,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.4.1" + "source": "https://github.com/doctrine/dbal/tree/4.4.3" }, "funding": [ { @@ -406,33 +406,33 @@ "type": "tidelift" } ], - "time": "2025-12-04T10:11:03+00:00" + "time": "2026-03-20T08:52:12+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "phpunit/phpunit": "<=7.5 || >=14" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -452,9 +452,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { "name": "doctrine/doctrine-bundle", @@ -665,16 +665,16 @@ }, { "name": "doctrine/event-manager", - "version": "2.0.1", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/dda33921b198841ca8dbad2eaa5d4d34769d18cf", + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf", "shasum": "" }, "require": { @@ -684,10 +684,10 @@ "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" + "doctrine/coding-standard": "^14", + "phpdocumentor/guides-cli": "^1.4", + "phpstan/phpstan": "^2.1.32", + "phpunit/phpunit": "^10.5.58" }, "type": "library", "autoload": { @@ -736,7 +736,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + "source": "https://github.com/doctrine/event-manager/tree/2.1.1" }, "funding": [ { @@ -752,7 +752,7 @@ "type": "tidelift" } ], - "time": "2024-05-22T20:47:39+00:00" + "time": "2026-01-29T07:11:08+00:00" }, { "name": "doctrine/inflector", @@ -992,16 +992,16 @@ }, { "name": "doctrine/migrations", - "version": "3.9.5", + "version": "3.9.7", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "1b823afbc40f932dae8272574faee53f2755eac5" + "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/1b823afbc40f932dae8272574faee53f2755eac5", - "reference": "1b823afbc40f932dae8272574faee53f2755eac5", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/96cb2a89b56c9efb0bac38e606dc0b0f13e650ec", + "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec", "shasum": "" }, "require": { @@ -1075,7 +1075,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.5" + "source": "https://github.com/doctrine/migrations/tree/3.9.7" }, "funding": [ { @@ -1091,20 +1091,20 @@ "type": "tidelift" } ], - "time": "2025-11-20T11:15:36+00:00" + "time": "2026-04-23T19:33:20+00:00" }, { "name": "doctrine/orm", - "version": "3.6.1", + "version": "3.6.3", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "2148940290e4c44b9101095707e71fb590832fa5" + "reference": "e88cd591f0786089dee22b972c28aa2076df51c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/2148940290e4c44b9101095707e71fb590832fa5", - "reference": "2148940290e4c44b9101095707e71fb590832fa5", + "url": "https://api.github.com/repos/doctrine/orm/zipball/e88cd591f0786089dee22b972c28aa2076df51c0", + "reference": "e88cd591f0786089dee22b972c28aa2076df51c0", "shasum": "" }, "require": { @@ -1177,25 +1177,26 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.6.1" + "source": "https://github.com/doctrine/orm/tree/3.6.3" }, - "time": "2026-01-09T05:28:15+00:00" + "time": "2026-04-02T06:53:27+00:00" }, { "name": "doctrine/persistence", - "version": "4.1.1", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09" + "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", - "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b", + "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b", "shasum": "" }, "require": { + "doctrine/deprecations": "^1", "doctrine/event-manager": "^1 || ^2", "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0" @@ -1206,13 +1207,13 @@ "phpstan/phpstan-phpunit": "^2", "phpstan/phpstan-strict-rules": "^2", "phpunit/phpunit": "^10.5.58 || ^12", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Persistence\\": "src/Persistence" + "Doctrine\\Persistence\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1256,7 +1257,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/4.1.1" + "source": "https://github.com/doctrine/persistence/tree/4.2.0" }, "funding": [ { @@ -1272,20 +1273,20 @@ "type": "tidelift" } ], - "time": "2025-10-16T20:13:18+00:00" + "time": "2026-04-26T12:12:52+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.5.3", + "version": "1.5.4", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7" + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/a8af23a8e9d622505baa2997465782cbe8bb7fc7", - "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/9563949f5cd3bd12a17d12fb980528bc141c5806", + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806", "shasum": "" }, "require": { @@ -1325,9 +1326,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.3" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.4" }, - "time": "2025-10-26T09:35:14+00:00" + "time": "2026-02-08T16:21:46+00:00" }, { "name": "dragonmantank/cron-expression", @@ -1395,16 +1396,16 @@ }, { "name": "easycorp/easyadmin-bundle", - "version": "v4.27.6", + "version": "v4.27.8", "source": { "type": "git", "url": "https://github.com/EasyCorp/EasyAdminBundle.git", - "reference": "ece70f2111f006262cd30af16dc10b1720704e10" + "reference": "73f474ec89a2eb6ae7299d86e59bd0b8b64c8084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/ece70f2111f006262cd30af16dc10b1720704e10", - "reference": "ece70f2111f006262cd30af16dc10b1720704e10", + "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/73f474ec89a2eb6ae7299d86e59bd0b8b64c8084", + "reference": "73f474ec89a2eb6ae7299d86e59bd0b8b64c8084", "shasum": "" }, "require": { @@ -1488,7 +1489,7 @@ ], "support": { "issues": "https://github.com/EasyCorp/EasyAdminBundle/issues", - "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.27.6" + "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.27.8" }, "funding": [ { @@ -1496,7 +1497,7 @@ "type": "github" } ], - "time": "2026-01-04T09:25:06+00:00" + "time": "2026-01-24T16:59:22+00:00" }, { "name": "egulias/email-validator", @@ -1896,16 +1897,16 @@ }, { "name": "giggsey/libphonenumber-for-php", - "version": "9.0.20", + "version": "9.0.29", "source": { "type": "git", "url": "https://github.com/giggsey/libphonenumber-for-php.git", - "reference": "bafb1741c3bc351b39652ed570a6adeec7d8032b" + "reference": "ac6ca861830c556ed1c266de3f6fe5f983da09d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/bafb1741c3bc351b39652ed570a6adeec7d8032b", - "reference": "bafb1741c3bc351b39652ed570a6adeec7d8032b", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/ac6ca861830c556ed1c266de3f6fe5f983da09d5", + "reference": "ac6ca861830c556ed1c266de3f6fe5f983da09d5", "shasum": "" }, "require": { @@ -1968,20 +1969,20 @@ "issues": "https://github.com/giggsey/libphonenumber-for-php/issues", "source": "https://github.com/giggsey/libphonenumber-for-php" }, - "time": "2025-12-05T12:07:14+00:00" + "time": "2026-04-24T11:10:46+00:00" }, { "name": "giggsey/locale", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/giggsey/Locale.git", - "reference": "1cd8b3ad2d43e04f4c2c6a240495af44780f809b" + "reference": "fe741e99ae6ccbe8132f3d63d8ec89924e689778" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/Locale/zipball/1cd8b3ad2d43e04f4c2c6a240495af44780f809b", - "reference": "1cd8b3ad2d43e04f4c2c6a240495af44780f809b", + "url": "https://api.github.com/repos/giggsey/Locale/zipball/fe741e99ae6ccbe8132f3d63d8ec89924e689778", + "reference": "fe741e99ae6ccbe8132f3d63d8ec89924e689778", "shasum": "" }, "require": { @@ -1990,14 +1991,16 @@ "require-dev": { "ext-json": "*", "friendsofphp/php-cs-fixer": "^3.66", - "pear/pear-core-minimal": "^1.10", - "pear/pear_exception": "^1.0", - "pear/versioncontrol_git": "^0.5", - "phing/phing": "^2.17.4", + "infection/infection": "^0.29|^0.32.0", "php-coveralls/php-coveralls": "^2.7", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.7", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpstan/phpstan-phpunit": "^2.0.4", + "phpstan/phpstan-strict-rules": "^2.0.3", "phpunit/phpunit": "^10.5.45", "symfony/console": "^6.4", - "symfony/filesystem": "6.4", + "symfony/filesystem": "^6.4", "symfony/finder": "^6.4", "symfony/process": "^6.4", "symfony/var-exporter": "^6.4" @@ -2022,9 +2025,9 @@ "description": "Locale functions required by libphonenumber-for-php", "support": { "issues": "https://github.com/giggsey/Locale/issues", - "source": "https://github.com/giggsey/Locale/tree/2.8.0" + "source": "https://github.com/giggsey/Locale/tree/2.9.0" }, - "time": "2025-03-20T14:25:27+00:00" + "time": "2026-02-24T15:32:13+00:00" }, { "name": "imagine/imagine", @@ -2459,16 +2462,16 @@ }, { "name": "league/flysystem", - "version": "3.30.2", + "version": "3.33.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277" + "reference": "570b8871e0ce693764434b29154c54b434905350" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", - "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/570b8871e0ce693764434b29154c54b434905350", + "reference": "570b8871e0ce693764434b29154c54b434905350", "shasum": "" }, "require": { @@ -2536,32 +2539,32 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.30.2" + "source": "https://github.com/thephpleague/flysystem/tree/3.33.0" }, - "time": "2025-11-10T17:13:11+00:00" + "time": "2026-03-25T07:59:30+00:00" }, { "name": "league/flysystem-bundle", - "version": "3.6.1", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-bundle.git", - "reference": "61e7f989f14080abb14d5ade80629303691555cf" + "reference": "5eb41be38fc3759f74c9e458a6a5f0ef5f49284a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-bundle/zipball/61e7f989f14080abb14d5ade80629303691555cf", - "reference": "61e7f989f14080abb14d5ade80629303691555cf", + "url": "https://api.github.com/repos/thephpleague/flysystem-bundle/zipball/5eb41be38fc3759f74c9e458a6a5f0ef5f49284a", + "reference": "5eb41be38fc3759f74c9e458a6a5f0ef5f49284a", "shasum": "" }, "require": { "league/flysystem": "^3.0", - "php": ">=8.0", - "symfony/config": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "php": ">=8.2", + "symfony/config": "^6.0 || ^7.0 || ^8.0", + "symfony/dependency-injection": "^6.0 || ^7.0 || ^8.0", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0 || ^8.0" + "symfony/http-kernel": "^6.0 || ^7.0 || ^8.0", + "symfony/options-resolver": "^6.0 || ^7.0 || ^8.0" }, "require-dev": { "doctrine/mongodb-odm": "^2.0", @@ -2576,10 +2579,10 @@ "league/flysystem-sftp-v3": "^3.1", "league/flysystem-webdav": "^3.29", "platformcommunity/flysystem-bunnycdn": "^3.3", - "symfony/dotenv": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0 || ^8.0" + "symfony/dotenv": "^6.0 || ^7.0 || ^8.0", + "symfony/framework-bundle": "^6.0 || ^7.0 || ^8.0", + "symfony/phpunit-bridge": "^6.0 || ^7.0 || ^8.0", + "symfony/var-dumper": "^6.0 || ^7.0 || ^8.0" }, "type": "symfony-bundle", "autoload": { @@ -2606,22 +2609,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-bundle/issues", - "source": "https://github.com/thephpleague/flysystem-bundle/tree/3.6.1" + "source": "https://github.com/thephpleague/flysystem-bundle/tree/3.7.0" }, - "time": "2025-12-11T15:40:58+00:00" + "time": "2026-03-28T22:14:56+00:00" }, { "name": "league/flysystem-local", - "version": "3.30.2", + "version": "3.31.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d" + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ab4f9d0d672f601b102936aa728801dd1a11968d", - "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", "shasum": "" }, "require": { @@ -2655,9 +2658,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.2" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" }, - "time": "2025-11-10T11:23:37+00:00" + "time": "2026-01-23T15:30:45+00:00" }, { "name": "league/mime-type-detection", @@ -2825,16 +2828,16 @@ }, { "name": "maennchen/zipstream-php", - "version": "3.2.1", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5" + "reference": "77bebeb4c6c340bb3c11c843b2cffd8bbfde4d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/682f1098a8fddbaf43edac2306a691c7ad508ec5", - "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/77bebeb4c6c340bb3c11c843b2cffd8bbfde4d5e", + "reference": "77bebeb4c6c340bb3c11c843b2cffd8bbfde4d5e", "shasum": "" }, "require": { @@ -2891,7 +2894,7 @@ ], "support": { "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.1" + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.2" }, "funding": [ { @@ -2899,7 +2902,7 @@ "type": "github" } ], - "time": "2025-12-10T09:58:31+00:00" + "time": "2026-04-11T18:38:28+00:00" }, { "name": "markbaker/complex", @@ -3010,16 +3013,16 @@ }, { "name": "matomo/device-detector", - "version": "6.4.8", + "version": "6.5.0", "source": { "type": "git", "url": "https://github.com/matomo-org/device-detector.git", - "reference": "56baf981af4f192e15a4f369d4975af847a81ccb" + "reference": "e0fff2309dad83eb3cfb2564e524be715cfcf3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/56baf981af4f192e15a4f369d4975af847a81ccb", - "reference": "56baf981af4f192e15a4f369d4975af847a81ccb", + "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/e0fff2309dad83eb3cfb2564e524be715cfcf3cf", + "reference": "e0fff2309dad83eb3cfb2564e524be715cfcf3cf", "shasum": "" }, "require": { @@ -3033,14 +3036,13 @@ "matthiasmullie/scrapbook": "^1.4.7", "mayflower/mo4-coding-standard": "^v9.0.0", "phpstan/phpstan": "^1.10.44", - "phpunit/phpunit": "^8.5.8", - "psr/cache": "^1.0.1", - "psr/simple-cache": "^1.0.1", + "phpunit/phpunit": "^8.5.2 || ^9 || ^10 || ^11 || ^12", + "psr/cache": "^1.0.1 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0.1 || ^2.0 || ^3.0", "slevomat/coding-standard": "<8.16.0", "symfony/yaml": "^5.1.7" }, "suggest": { - "doctrine/cache": "Can directly be used for caching purpose", "ext-yaml": "Necessary for using the Pecl YAML parser" }, "type": "library", @@ -3076,7 +3078,7 @@ "source": "https://github.com/matomo-org/matomo", "wiki": "https://dev.matomo.org/" }, - "time": "2025-11-26T16:02:47+00:00" + "time": "2026-01-21T07:53:39+00:00" }, { "name": "monolog/monolog", @@ -3183,16 +3185,16 @@ }, { "name": "mpdf/mpdf", - "version": "v8.2.7", + "version": "v8.3.1", "source": { "type": "git", "url": "https://github.com/mpdf/mpdf.git", - "reference": "b59670a09498689c33ce639bac8f5ba26721dab3" + "reference": "2a454ec334109911fdb323a284c19dbf3f049810" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mpdf/mpdf/zipball/b59670a09498689c33ce639bac8f5ba26721dab3", - "reference": "b59670a09498689c33ce639bac8f5ba26721dab3", + "url": "https://api.github.com/repos/mpdf/mpdf/zipball/2a454ec334109911fdb323a284c19dbf3f049810", + "reference": "2a454ec334109911fdb323a284c19dbf3f049810", "shasum": "" }, "require": { @@ -3216,6 +3218,7 @@ }, "suggest": { "ext-bcmath": "Needed for generation of some types of barcodes", + "ext-imagick": "Needed if developing the Mpdf library", "ext-xml": "Needed mainly for SVG manipulation", "ext-zlib": "Needed for compression of embedded resources, such as fonts" }, @@ -3260,7 +3263,7 @@ "type": "custom" } ], - "time": "2025-12-01T10:18:02+00:00" + "time": "2026-03-11T10:58:44+00:00" }, { "name": "mpdf/psr-http-message-shim", @@ -3470,16 +3473,16 @@ }, { "name": "nelmio/cors-bundle", - "version": "2.6.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/nelmio/NelmioCorsBundle.git", - "reference": "530217472204881cacd3671909f634b960c7b948" + "reference": "3d80dbcd5d1eb5f8b20ed5199e1778d44c2e4d1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/530217472204881cacd3671909f634b960c7b948", - "reference": "530217472204881cacd3671909f634b960c7b948", + "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/3d80dbcd5d1eb5f8b20ed5199e1778d44c2e4d1c", + "reference": "3d80dbcd5d1eb5f8b20ed5199e1778d44c2e4d1c", "shasum": "" }, "require": { @@ -3529,22 +3532,22 @@ ], "support": { "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", - "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.6.0" + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.6.1" }, - "time": "2025-10-23T06:57:22+00:00" + "time": "2026-01-12T15:59:08+00:00" }, { "name": "nesbot/carbon", - "version": "3.11.0", + "version": "3.11.4", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1" + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", "shasum": "" }, "require": { @@ -3568,7 +3571,7 @@ "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan": "^2.1.22", "phpunit/phpunit": "^10.5.53", - "squizlabs/php_codesniffer": "^3.13.4" + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" }, "bin": [ "bin/carbon" @@ -3611,14 +3614,14 @@ } ], "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", + "homepage": "https://carbonphp.github.io/carbon/", "keywords": [ "date", "datetime", "time" ], "support": { - "docs": "https://carbon.nesbot.com/docs", + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", "issues": "https://github.com/CarbonPHP/carbon/issues", "source": "https://github.com/CarbonPHP/carbon" }, @@ -3636,7 +3639,7 @@ "type": "tidelift" } ], - "time": "2025-12-02T21:04:28+00:00" + "time": "2026-04-07T09:57:54+00:00" }, { "name": "paragonie/random_compat", @@ -3690,16 +3693,16 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "5.4.0", + "version": "5.7.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "48f2fe37d64c2dece0ef71fb2ac55497566782af" + "reference": "9f55d3b9b7bcb1084fda8340e4b7ce4ed10cd0c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/48f2fe37d64c2dece0ef71fb2ac55497566782af", - "reference": "48f2fe37d64c2dece0ef71fb2ac55497566782af", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/9f55d3b9b7bcb1084fda8340e4b7ce4ed10cd0c8", + "reference": "9f55d3b9b7bcb1084fda8340e4b7ce4ed10cd0c8", "shasum": "" }, "require": { @@ -3793,9 +3796,9 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.4.0" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.7.0" }, - "time": "2026-01-11T04:52:00+00:00" + "time": "2026-04-20T02:42:17+00:00" }, { "name": "psr/cache", @@ -4153,27 +4156,27 @@ }, { "name": "setasign/fpdi", - "version": "v2.6.4", + "version": "v2.6.6", "source": { "type": "git", "url": "https://github.com/Setasign/FPDI.git", - "reference": "4b53852fde2734ec6a07e458a085db627c60eada" + "reference": "de0cf35911be3e9ea63b48e0f307883b1c7c48ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/4b53852fde2734ec6a07e458a085db627c60eada", - "reference": "4b53852fde2734ec6a07e458a085db627c60eada", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/de0cf35911be3e9ea63b48e0f307883b1c7c48ac", + "reference": "de0cf35911be3e9ea63b48e0f307883b1c7c48ac", "shasum": "" }, "require": { "ext-zlib": "*", - "php": "^7.1 || ^8.0" + "php": ">=7.2 <=8.5.99999" }, "conflict": { "setasign/tfpdf": "<1.31" }, "require-dev": { - "phpunit/phpunit": "^7", + "phpunit/phpunit": "^8.5.52", "setasign/fpdf": "~1.8.6", "setasign/tfpdf": "~1.33", "squizlabs/php_codesniffer": "^3.5", @@ -4213,7 +4216,7 @@ ], "support": { "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.6.4" + "source": "https://github.com/Setasign/FPDI/tree/v2.6.6" }, "funding": [ { @@ -4221,7 +4224,7 @@ "type": "tidelift" } ], - "time": "2025-08-05T09:57:14+00:00" + "time": "2026-03-13T08:38:20+00:00" }, { "name": "spatie/schema-org", @@ -4324,16 +4327,16 @@ }, { "name": "symfony/asset", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "e07d70cfca384c1eabee192fdeedb6850c1c840b" + "reference": "72eca261f3af1bef741c48bb2c91a4e619dca03a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/e07d70cfca384c1eabee192fdeedb6850c1c840b", - "reference": "e07d70cfca384c1eabee192fdeedb6850c1c840b", + "url": "https://api.github.com/repos/symfony/asset/zipball/72eca261f3af1bef741c48bb2c91a4e619dca03a", + "reference": "72eca261f3af1bef741c48bb2c91a4e619dca03a", "shasum": "" }, "require": { @@ -4370,7 +4373,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v8.0.0" + "source": "https://github.com/symfony/asset/tree/v8.0.8" }, "funding": [ { @@ -4390,20 +4393,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:36:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/bluesky-notifier", - "version": "v8.0.0", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/bluesky-notifier.git", - "reference": "7c940372852150a7cfb35842a9e92164340f248f" + "reference": "dd5c342510ea5fcff25d3ec9bb9c31598986a464" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/bluesky-notifier/zipball/7c940372852150a7cfb35842a9e92164340f248f", - "reference": "7c940372852150a7cfb35842a9e92164340f248f", + "url": "https://api.github.com/repos/symfony/bluesky-notifier/zipball/dd5c342510ea5fcff25d3ec9bb9c31598986a464", + "reference": "dd5c342510ea5fcff25d3ec9bb9c31598986a464", "shasum": "" }, "require": { @@ -4451,7 +4454,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/bluesky-notifier/tree/v8.0.0" + "source": "https://github.com/symfony/bluesky-notifier/tree/v8.0.4" }, "funding": [ { @@ -4471,20 +4474,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:36:47+00:00" + "time": "2026-01-08T08:40:07+00:00" }, { "name": "symfony/cache", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "ef8c7dbfe613d2773d0b5e68b2ef2db72c8b025f" + "reference": "2866a183cd942bbaa81e9fdbd1ef1ea902c5ee2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/ef8c7dbfe613d2773d0b5e68b2ef2db72c8b025f", - "reference": "ef8c7dbfe613d2773d0b5e68b2ef2db72c8b025f", + "url": "https://api.github.com/repos/symfony/cache/zipball/2866a183cd942bbaa81e9fdbd1ef1ea902c5ee2d", + "reference": "2866a183cd942bbaa81e9fdbd1ef1ea902c5ee2d", "shasum": "" }, "require": { @@ -4551,7 +4554,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v8.0.3" + "source": "https://github.com/symfony/cache/tree/v8.0.9" }, "funding": [ { @@ -4571,7 +4574,7 @@ "type": "tidelift" } ], - "time": "2025-12-28T10:45:32+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/cache-contracts", @@ -4651,16 +4654,16 @@ }, { "name": "symfony/clock", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f" + "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/832119f9b8dbc6c8e6f65f30c5969eca1e88764f", - "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f", + "url": "https://api.github.com/repos/symfony/clock/zipball/b55a638b189a6faa875e0ccdb00908fb87af95b3", + "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3", "shasum": "" }, "require": { @@ -4704,7 +4707,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v8.0.0" + "source": "https://github.com/symfony/clock/tree/v8.0.8" }, "funding": [ { @@ -4724,20 +4727,20 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:46:48+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/config", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "58063686fd7b8e676f14b5a4808cb85265c5216e" + "reference": "7e712ee3c98ec114f674adc4fbad4c2fe7526b9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/58063686fd7b8e676f14b5a4808cb85265c5216e", - "reference": "58063686fd7b8e676f14b5a4808cb85265c5216e", + "url": "https://api.github.com/repos/symfony/config/zipball/7e712ee3c98ec114f674adc4fbad4c2fe7526b9c", + "reference": "7e712ee3c98ec114f674adc4fbad4c2fe7526b9c", "shasum": "" }, "require": { @@ -4782,7 +4785,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v8.0.3" + "source": "https://github.com/symfony/config/tree/v8.0.9" }, "funding": [ { @@ -4802,20 +4805,20 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/console", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587" + "reference": "7113778e2e91f4709cb3194a75dfa9c0d028d94d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6145b304a5c1ea0bdbd0b04d297a5864f9a7d587", - "reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587", + "url": "https://api.github.com/repos/symfony/console/zipball/7113778e2e91f4709cb3194a75dfa9c0d028d94d", + "reference": "7113778e2e91f4709cb3194a75dfa9c0d028d94d", "shasum": "" }, "require": { @@ -4872,7 +4875,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.0.3" + "source": "https://github.com/symfony/console/tree/v8.0.9" }, "funding": [ { @@ -4892,20 +4895,20 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/dependency-injection", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "8db0d4c1dd4c533a29210c68074999ba45ad6d3e" + "reference": "85d359a3f72b8e1ae1466b4330149318442e3a8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8db0d4c1dd4c533a29210c68074999ba45ad6d3e", - "reference": "8db0d4c1dd4c533a29210c68074999ba45ad6d3e", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/85d359a3f72b8e1ae1466b4330149318442e3a8c", + "reference": "85d359a3f72b8e1ae1466b4330149318442e3a8c", "shasum": "" }, "require": { @@ -4953,7 +4956,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v8.0.3" + "source": "https://github.com/symfony/dependency-injection/tree/v8.0.9" }, "funding": [ { @@ -4973,7 +4976,7 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-04-30T18:39:49+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5044,16 +5047,16 @@ }, { "name": "symfony/discord-notifier", - "version": "v8.0.0", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/discord-notifier.git", - "reference": "4e6f718de9b67d664eaf01a70ea4ad2053a1ddf3" + "reference": "d7ca3847f933edb1c3ab7cf1a1321eca5eaa9e4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/discord-notifier/zipball/4e6f718de9b67d664eaf01a70ea4ad2053a1ddf3", - "reference": "4e6f718de9b67d664eaf01a70ea4ad2053a1ddf3", + "url": "https://api.github.com/repos/symfony/discord-notifier/zipball/d7ca3847f933edb1c3ab7cf1a1321eca5eaa9e4f", + "reference": "d7ca3847f933edb1c3ab7cf1a1321eca5eaa9e4f", "shasum": "" }, "require": { @@ -5092,7 +5095,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/discord-notifier/tree/v8.0.0" + "source": "https://github.com/symfony/discord-notifier/tree/v8.0.4" }, "funding": [ { @@ -5112,20 +5115,20 @@ "type": "tidelift" } ], - "time": "2025-09-01T09:26:06+00:00" + "time": "2026-01-05T09:27:50+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "54d583fc3f855e0982f00eceb528fc0fa501f4c3" + "reference": "dfe3dddc9c22756b9b145785fb5fd4b0445cd06e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/54d583fc3f855e0982f00eceb528fc0fa501f4c3", - "reference": "54d583fc3f855e0982f00eceb528fc0fa501f4c3", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/dfe3dddc9c22756b9b145785fb5fd4b0445cd06e", + "reference": "dfe3dddc9c22756b9b145785fb5fd4b0445cd06e", "shasum": "" }, "require": { @@ -5194,7 +5197,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v8.0.3" + "source": "https://github.com/symfony/doctrine-bridge/tree/v8.0.9" }, "funding": [ { @@ -5214,20 +5217,20 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v8.0.3", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "08be96096e507c0cb03c1e0a0ad95b24f182840a" + "reference": "88329a3faba5023cfb569b3fc5b8a771336c4a88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/08be96096e507c0cb03c1e0a0ad95b24f182840a", - "reference": "08be96096e507c0cb03c1e0a0ad95b24f182840a", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/88329a3faba5023cfb569b3fc5b8a771336c4a88", + "reference": "88329a3faba5023cfb569b3fc5b8a771336c4a88", "shasum": "" }, "require": { @@ -5270,7 +5273,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v8.0.3" + "source": "https://github.com/symfony/doctrine-messenger/tree/v8.0.6" }, "funding": [ { @@ -5290,20 +5293,20 @@ "type": "tidelift" } ], - "time": "2025-12-16T08:10:18+00:00" + "time": "2026-02-20T07:51:53+00:00" }, { "name": "symfony/dotenv", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "460b4067a85288c59a59ce8c1bfb3942e71fd85c" + "reference": "f75c67be2c2648741c4b163546002e34265bcb91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/460b4067a85288c59a59ce8c1bfb3942e71fd85c", - "reference": "460b4067a85288c59a59ce8c1bfb3942e71fd85c", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/f75c67be2c2648741c4b163546002e34265bcb91", + "reference": "f75c67be2c2648741c4b163546002e34265bcb91", "shasum": "" }, "require": { @@ -5344,7 +5347,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v8.0.0" + "source": "https://github.com/symfony/dotenv/tree/v8.0.9" }, "funding": [ { @@ -5364,20 +5367,20 @@ "type": "tidelift" } ], - "time": "2025-11-16T10:17:21+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/error-handler", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "d77ec7dda0c274178745d152e82baf7ea827fd73" + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/d77ec7dda0c274178745d152e82baf7ea827fd73", - "reference": "d77ec7dda0c274178745d152e82baf7ea827fd73", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1119fe8dcfc3825ec74ec061b96ef0c8f281517", + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517", "shasum": "" }, "require": { @@ -5425,7 +5428,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/v8.0.0" + "source": "https://github.com/symfony/error-handler/tree/v8.0.8" }, "funding": [ { @@ -5445,20 +5448,20 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:36:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "573f95783a2ec6e38752979db139f09fec033f03" + "reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/573f95783a2ec6e38752979db139f09fec033f03", - "reference": "573f95783a2ec6e38752979db139f09fec033f03", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0c3c1a17604c4dbbec4b93fe162c538482096e1f", + "reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f", "shasum": "" }, "require": { @@ -5510,7 +5513,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/v8.0.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.9" }, "funding": [ { @@ -5530,7 +5533,7 @@ "type": "tidelift" } ], - "time": "2025-10-30T14:17:19+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5610,16 +5613,16 @@ }, { "name": "symfony/filesystem", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d937d400b980523dc9ee946bb69972b5e619058d" + "reference": "d1ec4543d5c6c2dac78503c2fae5ea0b3608ce40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d937d400b980523dc9ee946bb69972b5e619058d", - "reference": "d937d400b980523dc9ee946bb69972b5e619058d", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d1ec4543d5c6c2dac78503c2fae5ea0b3608ce40", + "reference": "d1ec4543d5c6c2dac78503c2fae5ea0b3608ce40", "shasum": "" }, "require": { @@ -5656,7 +5659,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v8.0.1" + "source": "https://github.com/symfony/filesystem/tree/v8.0.9" }, "funding": [ { @@ -5676,20 +5679,20 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/finder", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12" + "reference": "8da41214757b87d97f181e3d14a4179286151007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/dd3a2953570a283a2ba4e17063bb98c734cf5b12", - "reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12", + "url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007", + "reference": "8da41214757b87d97f181e3d14a4179286151007", "shasum": "" }, "require": { @@ -5724,7 +5727,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.0.3" + "source": "https://github.com/symfony/finder/tree/v8.0.8" }, "funding": [ { @@ -5744,7 +5747,7 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/flex", @@ -5821,16 +5824,16 @@ }, { "name": "symfony/form", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "a39b194d576bda0ac191a15e2d72b09ccc5c8f5f" + "reference": "dd9f73dd3b92e657c97aeeca1f47e981c635ea91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/a39b194d576bda0ac191a15e2d72b09ccc5c8f5f", - "reference": "a39b194d576bda0ac191a15e2d72b09ccc5c8f5f", + "url": "https://api.github.com/repos/symfony/form/zipball/dd9f73dd3b92e657c97aeeca1f47e981c635ea91", + "reference": "dd9f73dd3b92e657c97aeeca1f47e981c635ea91", "shasum": "" }, "require": { @@ -5892,7 +5895,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v8.0.3" + "source": "https://github.com/symfony/form/tree/v8.0.9" }, "funding": [ { @@ -5912,20 +5915,20 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/framework-bundle", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "738a92519fbc3ac37192b28052574bf2d1e8f63a" + "reference": "ec5e749f011a477d9a5d422f50ad6bdc2820c5cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/738a92519fbc3ac37192b28052574bf2d1e8f63a", - "reference": "738a92519fbc3ac37192b28052574bf2d1e8f63a", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ec5e749f011a477d9a5d422f50ad6bdc2820c5cd", + "reference": "ec5e749f011a477d9a5d422f50ad6bdc2820c5cd", "shasum": "" }, "require": { @@ -5933,8 +5936,8 @@ "ext-xml": "*", "php": ">=8.4", "symfony/cache": "^7.4|^8.0", - "symfony/config": "^7.4.3|^8.0.3", - "symfony/dependency-injection": "^7.4|^8.0", + "symfony/config": "^7.4.4|^8.0.4", + "symfony/dependency-injection": "^7.4.4|^8.0.4", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^7.4|^8.0", "symfony/event-dispatcher": "^7.4|^8.0", @@ -5948,12 +5951,13 @@ }, "conflict": { "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", "symfony/console": "<7.4", "symfony/form": "<7.4", "symfony/json-streamer": "<7.4", "symfony/messenger": "<7.4", + "symfony/mime": "<7.4.9|>=8.0,<8.0.9", "symfony/security-csrf": "<7.4", "symfony/serializer": "<7.4", "symfony/translation": "<7.4", @@ -5963,7 +5967,7 @@ "require-dev": { "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", "symfony/asset": "^7.4|^8.0", @@ -5982,9 +5986,9 @@ "symfony/lock": "^7.4|^8.0", "symfony/mailer": "^7.4|^8.0", "symfony/messenger": "^7.4|^8.0", - "symfony/mime": "^7.4|^8.0", + "symfony/mime": "^7.4.9|^8.0.9", "symfony/notifier": "^7.4|^8.0", - "symfony/object-mapper": "^7.4|^8.0", + "symfony/object-mapper": "^7.4.9|^8.0.9", "symfony/polyfill-intl-icu": "^1.0", "symfony/process": "^7.4|^8.0", "symfony/property-info": "^7.4|^8.0", @@ -6032,7 +6036,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v8.0.3" + "source": "https://github.com/symfony/framework-bundle/tree/v8.0.9" }, "funding": [ { @@ -6052,20 +6056,20 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-04-30T09:11:52+00:00" }, { "name": "symfony/http-client", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "ea062691009cc2b7bb87734fef20e02671cbd50b" + "reference": "537c7f164078975b800f3f1c56810791024e4c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/ea062691009cc2b7bb87734fef20e02671cbd50b", - "reference": "ea062691009cc2b7bb87734fef20e02671cbd50b", + "url": "https://api.github.com/repos/symfony/http-client/zipball/537c7f164078975b800f3f1c56810791024e4c77", + "reference": "537c7f164078975b800f3f1c56810791024e4c77", "shasum": "" }, "require": { @@ -6128,7 +6132,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v8.0.3" + "source": "https://github.com/symfony/http-client/tree/v8.0.9" }, "funding": [ { @@ -6148,7 +6152,7 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/http-client-contracts", @@ -6230,16 +6234,16 @@ }, { "name": "symfony/http-foundation", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "514ec3aa7982f296b0ad0825f75b6be5779ae9e7" + "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/514ec3aa7982f296b0ad0825f75b6be5779ae9e7", - "reference": "514ec3aa7982f296b0ad0825f75b6be5779ae9e7", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/02656f7ebeae5c155d659e946f6b3a33df24051b", + "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b", "shasum": "" }, "require": { @@ -6286,7 +6290,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v8.0.3" + "source": "https://github.com/symfony/http-foundation/tree/v8.0.8" }, "funding": [ { @@ -6306,20 +6310,20 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/http-kernel", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "e6dfb348eb1dd4df14c39e6dc7e283bab4199fd9" + "reference": "1770f6818d83b2fddc12185025b93f39a90cb628" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e6dfb348eb1dd4df14c39e6dc7e283bab4199fd9", - "reference": "e6dfb348eb1dd4df14c39e6dc7e283bab4199fd9", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1770f6818d83b2fddc12185025b93f39a90cb628", + "reference": "1770f6818d83b2fddc12185025b93f39a90cb628", "shasum": "" }, "require": { @@ -6390,7 +6394,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v8.0.3" + "source": "https://github.com/symfony/http-kernel/tree/v8.0.8" }, "funding": [ { @@ -6410,20 +6414,20 @@ "type": "tidelift" } ], - "time": "2025-12-31T09:29:34+00:00" + "time": "2026-03-31T21:14:05+00:00" }, { "name": "symfony/intl", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "f9eca217ae8f2be0b3ad80723d6a3b518b90cd66" + "reference": "604a1dbbd67471e885e93274379cadd80dc33535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/f9eca217ae8f2be0b3ad80723d6a3b518b90cd66", - "reference": "f9eca217ae8f2be0b3ad80723d6a3b518b90cd66", + "url": "https://api.github.com/repos/symfony/intl/zipball/604a1dbbd67471e885e93274379cadd80dc33535", + "reference": "604a1dbbd67471e885e93274379cadd80dc33535", "shasum": "" }, "require": { @@ -6479,7 +6483,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v8.0.1" + "source": "https://github.com/symfony/intl/tree/v8.0.8" }, "funding": [ { @@ -6499,20 +6503,20 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/mailer", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "02e033db6e00a42c66b8b8992e4e565ea7464a28" + "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/02e033db6e00a42c66b8b8992e4e565ea7464a28", - "reference": "02e033db6e00a42c66b8b8992e4e565ea7464a28", + "url": "https://api.github.com/repos/symfony/mailer/zipball/ca5f6edaf8780ece814404b58a4482b22b509c56", + "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56", "shasum": "" }, "require": { @@ -6559,7 +6563,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v8.0.3" + "source": "https://github.com/symfony/mailer/tree/v8.0.8" }, "funding": [ { @@ -6579,7 +6583,7 @@ "type": "tidelift" } ], - "time": "2025-12-16T08:10:18+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/mastodon-notifier", @@ -6657,16 +6661,16 @@ }, { "name": "symfony/messenger", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "b56b89aee16ceb623f76c8739ab62202ec198190" + "reference": "ef41ccc1f80dd2ded64ad9d765b28644964532dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/b56b89aee16ceb623f76c8739ab62202ec198190", - "reference": "b56b89aee16ceb623f76c8739ab62202ec198190", + "url": "https://api.github.com/repos/symfony/messenger/zipball/ef41ccc1f80dd2ded64ad9d765b28644964532dd", + "reference": "ef41ccc1f80dd2ded64ad9d765b28644964532dd", "shasum": "" }, "require": { @@ -6676,7 +6680,9 @@ }, "conflict": { "symfony/console": "<7.4", - "symfony/event-dispatcher-contracts": "<2.5" + "symfony/event-dispatcher-contracts": "<2.5", + "symfony/lock": "<7.4", + "symfony/serializer": "<7.4.4|>=8.0,<8.0.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", @@ -6689,7 +6695,7 @@ "symfony/property-access": "^7.4|^8.0", "symfony/rate-limiter": "^7.4|^8.0", "symfony/routing": "^7.4|^8.0", - "symfony/serializer": "^7.4|^8.0", + "symfony/serializer": "^7.4.4|^8.0.4", "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^7.4|^8.0", "symfony/validator": "^7.4|^8.0", @@ -6721,7 +6727,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v8.0.3" + "source": "https://github.com/symfony/messenger/tree/v8.0.9" }, "funding": [ { @@ -6741,20 +6747,20 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:52:06+00:00" + "time": "2026-04-30T13:47:26+00:00" }, { "name": "symfony/mime", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7576ce3b2b4d3a2a7fe7020a07a392065d6ffd40" + "reference": "a9fcb293650c054b62a5b406f4e92e7b711ea333" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7576ce3b2b4d3a2a7fe7020a07a392065d6ffd40", - "reference": "7576ce3b2b4d3a2a7fe7020a07a392065d6ffd40", + "url": "https://api.github.com/repos/symfony/mime/zipball/a9fcb293650c054b62a5b406f4e92e7b711ea333", + "reference": "a9fcb293650c054b62a5b406f4e92e7b711ea333", "shasum": "" }, "require": { @@ -6764,13 +6770,13 @@ }, "conflict": { "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0" + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "symfony/dependency-injection": "^7.4|^8.0", "symfony/process": "^7.4|^8.0", "symfony/property-access": "^7.4|^8.0", @@ -6807,7 +6813,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v8.0.0" + "source": "https://github.com/symfony/mime/tree/v8.0.9" }, "funding": [ { @@ -6827,20 +6833,20 @@ "type": "tidelift" } ], - "time": "2025-11-16T10:17:21+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "6dd0793eb9ebcecb0b909a5571ac6e82867d7b20" + "reference": "4b7249b1520773ad325e99231b08443017729297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/6dd0793eb9ebcecb0b909a5571ac6e82867d7b20", - "reference": "6dd0793eb9ebcecb0b909a5571ac6e82867d7b20", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/4b7249b1520773ad325e99231b08443017729297", + "reference": "4b7249b1520773ad325e99231b08443017729297", "shasum": "" }, "require": { @@ -6884,7 +6890,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v8.0.0" + "source": "https://github.com/symfony/monolog-bridge/tree/v8.0.9" }, "funding": [ { @@ -6904,20 +6910,20 @@ "type": "tidelift" } ], - "time": "2025-11-01T09:19:23+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/monolog-bundle", - "version": "v4.0.1", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "3b4ee2717ee56c5e1edb516140a175eb2a72bc66" + "reference": "c012c6aba13129eb02aa7dd61e66e720911d8598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/3b4ee2717ee56c5e1edb516140a175eb2a72bc66", - "reference": "3b4ee2717ee56c5e1edb516140a175eb2a72bc66", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/c012c6aba13129eb02aa7dd61e66e720911d8598", + "reference": "c012c6aba13129eb02aa7dd61e66e720911d8598", "shasum": "" }, "require": { @@ -6963,7 +6969,7 @@ ], "support": { "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v4.0.1" + "source": "https://github.com/symfony/monolog-bundle/tree/v4.0.2" }, "funding": [ { @@ -6983,20 +6989,20 @@ "type": "tidelift" } ], - "time": "2025-12-08T08:00:13+00:00" + "time": "2026-04-02T18:27:21+00:00" }, { "name": "symfony/notifier", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/notifier.git", - "reference": "dad36a1aacda8c0c9f2ec2e1f70111da6cb7228f" + "reference": "e65ae16a36900c92e977733fcee22d47f79c3601" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/notifier/zipball/dad36a1aacda8c0c9f2ec2e1f70111da6cb7228f", - "reference": "dad36a1aacda8c0c9f2ec2e1f70111da6cb7228f", + "url": "https://api.github.com/repos/symfony/notifier/zipball/e65ae16a36900c92e977733fcee22d47f79c3601", + "reference": "e65ae16a36900c92e977733fcee22d47f79c3601", "shasum": "" }, "require": { @@ -7008,7 +7014,9 @@ "symfony/http-client-contracts": "<2.5" }, "require-dev": { + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/http-client": "^7.4|^8.0", "symfony/http-client-contracts": "^2.5|^3", "symfony/http-foundation": "^7.4|^8.0", "symfony/messenger": "^7.4|^8.0" @@ -7043,7 +7051,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/notifier/tree/v8.0.0" + "source": "https://github.com/symfony/notifier/tree/v8.0.8" }, "funding": [ { @@ -7063,20 +7071,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T08:09:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/options-resolver", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7" + "reference": "b48bce0a70b914f6953dafbd10474df232ed4de8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d2b592535ffa6600c265a3893a7f7fd2bad82dd7", - "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b48bce0a70b914f6953dafbd10474df232ed4de8", + "reference": "b48bce0a70b914f6953dafbd10474df232ed4de8", "shasum": "" }, "require": { @@ -7114,7 +7122,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v8.0.0" + "source": "https://github.com/symfony/options-resolver/tree/v8.0.8" }, "funding": [ { @@ -7134,20 +7142,20 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:55:31+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/password-hasher", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "80e7c7e3fdb27214ba3af9fd449cb638aa98daa4" + "reference": "57ee968d3c38301ed3e5b838f850a10f2d06a7f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/80e7c7e3fdb27214ba3af9fd449cb638aa98daa4", - "reference": "80e7c7e3fdb27214ba3af9fd449cb638aa98daa4", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/57ee968d3c38301ed3e5b838f850a10f2d06a7f6", + "reference": "57ee968d3c38301ed3e5b838f850a10f2d06a7f6", "shasum": "" }, "require": { @@ -7187,7 +7195,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v8.0.0" + "source": "https://github.com/symfony/password-hasher/tree/v8.0.8" }, "funding": [ { @@ -7207,20 +7215,20 @@ "type": "tidelift" } ], - "time": "2025-08-13T16:50:52+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", "shasum": "" }, "require": { @@ -7269,7 +7277,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0" }, "funding": [ { @@ -7289,20 +7297,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-04-26T13:13:48+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" + "reference": "3510b63d07376b04e57e27e82607d468bb134f78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/3510b63d07376b04e57e27e82607d468bb134f78", + "reference": "3510b63d07376b04e57e27e82607d468bb134f78", "shasum": "" }, "require": { @@ -7357,7 +7365,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.37.0" }, "funding": [ { @@ -7377,11 +7385,11 @@ "type": "tidelift" } ], - "time": "2025-06-20T22:24:30+00:00" + "time": "2026-04-10T16:50:15+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -7444,7 +7452,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.37.0" }, "funding": [ { @@ -7468,7 +7476,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -7529,7 +7537,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0" }, "funding": [ { @@ -7553,16 +7561,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", "shasum": "" }, "require": { @@ -7614,7 +7622,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0" }, "funding": [ { @@ -7634,20 +7642,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", "shasum": "" }, "require": { @@ -7694,7 +7702,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0" }, "funding": [ { @@ -7714,20 +7722,20 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-04-10T18:47:49+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/fcfa4973a9917cef23f2e38774da74a2b7d115ee", + "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee", "shasum": "" }, "require": { @@ -7774,7 +7782,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.37.0" }, "funding": [ { @@ -7794,20 +7802,20 @@ "type": "tidelift" } ], - "time": "2025-06-23T16:12:55+00:00" + "time": "2026-04-26T13:10:57+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", "shasum": "" }, "require": { @@ -7857,7 +7865,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.0" }, "funding": [ { @@ -7877,20 +7885,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/process", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0cbbd88ec836f8757641c651bb995335846abb78" + "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0cbbd88ec836f8757641c651bb995335846abb78", - "reference": "0cbbd88ec836f8757641c651bb995335846abb78", + "url": "https://api.github.com/repos/symfony/process/zipball/cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc", + "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc", "shasum": "" }, "require": { @@ -7922,7 +7930,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v8.0.3" + "source": "https://github.com/symfony/process/tree/v8.0.8" }, "funding": [ { @@ -7942,25 +7950,25 @@ "type": "tidelift" } ], - "time": "2025-12-19T10:01:18+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/property-access", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "3e9ed5d66144e02f1f430ef3be8e166920ae5271" + "reference": "704c7808116fcdd67327db7b17de56b8ef6169e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/3e9ed5d66144e02f1f430ef3be8e166920ae5271", - "reference": "3e9ed5d66144e02f1f430ef3be8e166920ae5271", + "url": "https://api.github.com/repos/symfony/property-access/zipball/704c7808116fcdd67327db7b17de56b8ef6169e4", + "reference": "704c7808116fcdd67327db7b17de56b8ef6169e4", "shasum": "" }, "require": { "php": ">=8.4", - "symfony/property-info": "^7.4.2|^8.0.3" + "symfony/property-info": "^7.4.4|^8.0.4" }, "require-dev": { "symfony/cache": "^7.4|^8.0", @@ -8003,7 +8011,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v8.0.3" + "source": "https://github.com/symfony/property-access/tree/v8.0.8" }, "funding": [ { @@ -8023,33 +8031,33 @@ "type": "tidelift" } ], - "time": "2025-12-18T11:23:51+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/property-info", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "a756f192435191bd50f55967adf999212c4a7232" + "reference": "c21711980653360d6ef5c26d0f9ca6f58a1135c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/a756f192435191bd50f55967adf999212c4a7232", - "reference": "a756f192435191bd50f55967adf999212c4a7232", + "url": "https://api.github.com/repos/symfony/property-info/zipball/c21711980653360d6ef5c26d0f9ca6f58a1135c6", + "reference": "c21711980653360d6ef5c26d0f9ca6f58a1135c6", "shasum": "" }, "require": { "php": ">=8.4", "symfony/string": "^7.4|^8.0", - "symfony/type-info": "^7.4.1|^8.0.1" + "symfony/type-info": "^7.4.7|^8.0.7" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", "symfony/cache": "^7.4|^8.0", "symfony/dependency-injection": "^7.4|^8.0", @@ -8089,7 +8097,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v8.0.3" + "source": "https://github.com/symfony/property-info/tree/v8.0.8" }, "funding": [ { @@ -8109,20 +8117,20 @@ "type": "tidelift" } ], - "time": "2025-12-18T11:23:51+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/rate-limiter", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "1d4e173cafccecf3fdc167536c33d599f6c1c9e0" + "reference": "6720f250f1e627043439d93754a555662144f883" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/1d4e173cafccecf3fdc167536c33d599f6c1c9e0", - "reference": "1d4e173cafccecf3fdc167536c33d599f6c1c9e0", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/6720f250f1e627043439d93754a555662144f883", + "reference": "6720f250f1e627043439d93754a555662144f883", "shasum": "" }, "require": { @@ -8163,7 +8171,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v8.0.0" + "source": "https://github.com/symfony/rate-limiter/tree/v8.0.9" }, "funding": [ { @@ -8183,20 +8191,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:36:47+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/redis-messenger", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/redis-messenger.git", - "reference": "c4af44773ab26e37b566260d90e6de4927c598dd" + "reference": "d3e882f7b9ce1ca93e529de7cc79f55fad9af4a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/c4af44773ab26e37b566260d90e6de4927c598dd", - "reference": "c4af44773ab26e37b566260d90e6de4927c598dd", + "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/d3e882f7b9ce1ca93e529de7cc79f55fad9af4a7", + "reference": "d3e882f7b9ce1ca93e529de7cc79f55fad9af4a7", "shasum": "" }, "require": { @@ -8239,7 +8247,7 @@ "description": "Symfony Redis extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/redis-messenger/tree/v8.0.0" + "source": "https://github.com/symfony/redis-messenger/tree/v8.0.8" }, "funding": [ { @@ -8259,20 +8267,20 @@ "type": "tidelift" } ], - "time": "2025-11-08T16:30:39+00:00" + "time": "2026-03-17T14:00:10+00:00" }, { "name": "symfony/routing", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "3827ac6e03dcd86e430fb6ae6056acf5b51aece3" + "reference": "75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3827ac6e03dcd86e430fb6ae6056acf5b51aece3", - "reference": "3827ac6e03dcd86e430fb6ae6056acf5b51aece3", + "url": "https://api.github.com/repos/symfony/routing/zipball/75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038", + "reference": "75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038", "shasum": "" }, "require": { @@ -8319,7 +8327,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v8.0.3" + "source": "https://github.com/symfony/routing/tree/v8.0.9" }, "funding": [ { @@ -8339,20 +8347,20 @@ "type": "tidelift" } ], - "time": "2025-12-19T10:01:18+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/runtime", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "73b34037b23db051048ba2873031ddb89be9f19d" + "reference": "30884f00e017a26100fcd9aa281082ebf9a87dce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/73b34037b23db051048ba2873031ddb89be9f19d", - "reference": "73b34037b23db051048ba2873031ddb89be9f19d", + "url": "https://api.github.com/repos/symfony/runtime/zipball/30884f00e017a26100fcd9aa281082ebf9a87dce", + "reference": "30884f00e017a26100fcd9aa281082ebf9a87dce", "shasum": "" }, "require": { @@ -8402,7 +8410,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v8.0.1" + "source": "https://github.com/symfony/runtime/tree/v8.0.8" }, "funding": [ { @@ -8422,20 +8430,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/scheduler", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/scheduler.git", - "reference": "01eb236fda2f1a6472e3b64b41f70b862f2908b3" + "reference": "d198c648959769cbb45c9bf74dc603faf3221e0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/scheduler/zipball/01eb236fda2f1a6472e3b64b41f70b862f2908b3", - "reference": "01eb236fda2f1a6472e3b64b41f70b862f2908b3", + "url": "https://api.github.com/repos/symfony/scheduler/zipball/d198c648959769cbb45c9bf74dc603faf3221e0b", + "reference": "d198c648959769cbb45c9bf74dc603faf3221e0b", "shasum": "" }, "require": { @@ -8487,7 +8495,7 @@ "scheduler" ], "support": { - "source": "https://github.com/symfony/scheduler/tree/v8.0.0" + "source": "https://github.com/symfony/scheduler/tree/v8.0.9" }, "funding": [ { @@ -8507,20 +8515,20 @@ "type": "tidelift" } ], - "time": "2025-10-01T14:43:00+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/security-bundle", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "fa06c8b5b8e7c1290827a7ac6d16f3203b54e1b2" + "reference": "00a13be2abf3fe9baf54e1e16e7583ca9c708f09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/fa06c8b5b8e7c1290827a7ac6d16f3203b54e1b2", - "reference": "fa06c8b5b8e7c1290827a7ac6d16f3203b54e1b2", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/00a13be2abf3fe9baf54e1e16e7583ca9c708f09", + "reference": "00a13be2abf3fe9baf54e1e16e7583ca9c708f09", "shasum": "" }, "require": { @@ -8587,7 +8595,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v8.0.0" + "source": "https://github.com/symfony/security-bundle/tree/v8.0.8" }, "funding": [ { @@ -8607,20 +8615,20 @@ "type": "tidelift" } ], - "time": "2025-11-14T10:04:00+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/security-core", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "6df9d8439c682dd31974e3b455109c689622de49" + "reference": "8456ed58e22f59a4c50f50d7dd82b2f41d162c5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/6df9d8439c682dd31974e3b455109c689622de49", - "reference": "6df9d8439c682dd31974e3b455109c689622de49", + "url": "https://api.github.com/repos/symfony/security-core/zipball/8456ed58e22f59a4c50f50d7dd82b2f41d162c5f", + "reference": "8456ed58e22f59a4c50f50d7dd82b2f41d162c5f", "shasum": "" }, "require": { @@ -8669,7 +8677,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v8.0.3" + "source": "https://github.com/symfony/security-core/tree/v8.0.8" }, "funding": [ { @@ -8689,20 +8697,20 @@ "type": "tidelift" } ], - "time": "2025-12-21T10:59:45+00:00" + "time": "2026-03-31T07:15:36+00:00" }, { "name": "symfony/security-csrf", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "4f561535f9b61d72c422a8a9de49301d3846b98f" + "reference": "83c8f60ef8d385c05ea863093c9efabe74800883" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/4f561535f9b61d72c422a8a9de49301d3846b98f", - "reference": "4f561535f9b61d72c422a8a9de49301d3846b98f", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/83c8f60ef8d385c05ea863093c9efabe74800883", + "reference": "83c8f60ef8d385c05ea863093c9efabe74800883", "shasum": "" }, "require": { @@ -8740,7 +8748,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v8.0.3" + "source": "https://github.com/symfony/security-csrf/tree/v8.0.8" }, "funding": [ { @@ -8760,20 +8768,20 @@ "type": "tidelift" } ], - "time": "2025-12-23T15:24:35+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/security-http", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "6645f791db1ea7b2948c1d20c503adad9be0045d" + "reference": "51fff88fc8436e42b4d92cae005f86b9233e0f88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/6645f791db1ea7b2948c1d20c503adad9be0045d", - "reference": "6645f791db1ea7b2948c1d20c503adad9be0045d", + "url": "https://api.github.com/repos/symfony/security-http/zipball/51fff88fc8436e42b4d92cae005f86b9233e0f88", + "reference": "51fff88fc8436e42b4d92cae005f86b9233e0f88", "shasum": "" }, "require": { @@ -8827,7 +8835,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v8.0.3" + "source": "https://github.com/symfony/security-http/tree/v8.0.9" }, "funding": [ { @@ -8847,7 +8855,7 @@ "type": "tidelift" } ], - "time": "2025-12-21T10:59:45+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/service-contracts", @@ -8938,16 +8946,16 @@ }, { "name": "symfony/stopwatch", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942" + "reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/67df1914c6ccd2d7b52f70d40cf2aea02159d942", - "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/85954ed72d5440ea4dc9a10b7e49e01df766ffa3", + "reference": "85954ed72d5440ea4dc9a10b7e49e01df766ffa3", "shasum": "" }, "require": { @@ -8980,7 +8988,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v8.0.0" + "source": "https://github.com/symfony/stopwatch/tree/v8.0.8" }, "funding": [ { @@ -9000,20 +9008,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:36:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/string", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc" + "reference": "ae9488f874d7603f9d2dfbf120203882b645d963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ba65a969ac918ce0cc3edfac6cdde847eba231dc", - "reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc", + "url": "https://api.github.com/repos/symfony/string/zipball/ae9488f874d7603f9d2dfbf120203882b645d963", + "reference": "ae9488f874d7603f9d2dfbf120203882b645d963", "shasum": "" }, "require": { @@ -9070,7 +9078,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.0.1" + "source": "https://github.com/symfony/string/tree/v8.0.8" }, "funding": [ { @@ -9090,20 +9098,20 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/telegram-notifier", - "version": "v8.0.0", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/telegram-notifier.git", - "reference": "baedbebe9081855bcc5dc73f66abff3e903f0864" + "reference": "d167b836e1b3151da30b3c52d4d0579ccc235306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/telegram-notifier/zipball/baedbebe9081855bcc5dc73f66abff3e903f0864", - "reference": "baedbebe9081855bcc5dc73f66abff3e903f0864", + "url": "https://api.github.com/repos/symfony/telegram-notifier/zipball/d167b836e1b3151da30b3c52d4d0579ccc235306", + "reference": "d167b836e1b3151da30b3c52d4d0579ccc235306", "shasum": "" }, "require": { @@ -9142,7 +9150,7 @@ "telegram" ], "support": { - "source": "https://github.com/symfony/telegram-notifier/tree/v8.0.0" + "source": "https://github.com/symfony/telegram-notifier/tree/v8.0.4" }, "funding": [ { @@ -9162,20 +9170,20 @@ "type": "tidelift" } ], - "time": "2025-09-01T09:26:06+00:00" + "time": "2026-01-05T09:27:50+00:00" }, { "name": "symfony/translation", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "60a8f11f0e15c48f2cc47c4da53873bb5b62135d" + "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/60a8f11f0e15c48f2cc47c4da53873bb5b62135d", - "reference": "60a8f11f0e15c48f2cc47c4da53873bb5b62135d", + "url": "https://api.github.com/repos/symfony/translation/zipball/27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", + "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", "shasum": "" }, "require": { @@ -9235,7 +9243,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v8.0.3" + "source": "https://github.com/symfony/translation/tree/v8.0.8" }, "funding": [ { @@ -9255,7 +9263,7 @@ "type": "tidelift" } ], - "time": "2025-12-21T10:59:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/translation-contracts", @@ -9341,16 +9349,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "2a2978a44127bae9aaee0ed5319954eb492d81c3" + "reference": "a892d0b7f3d5d51b35895467e48aafbd1f2612a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/2a2978a44127bae9aaee0ed5319954eb492d81c3", - "reference": "2a2978a44127bae9aaee0ed5319954eb492d81c3", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/a892d0b7f3d5d51b35895467e48aafbd1f2612a0", + "reference": "a892d0b7f3d5d51b35895467e48aafbd1f2612a0", "shasum": "" }, "require": { @@ -9359,13 +9367,15 @@ "twig/twig": "^3.21" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0" + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/form": "<7.4.4|>8.0,<8.0.4", + "symfony/mime": "<7.4.8|>8.0,<8.0.8" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "symfony/asset": "^7.4|^8.0", "symfony/asset-mapper": "^7.4|^8.0", "symfony/console": "^7.4|^8.0", @@ -9373,12 +9383,12 @@ "symfony/emoji": "^7.4|^8.0", "symfony/expression-language": "^7.4|^8.0", "symfony/finder": "^7.4|^8.0", - "symfony/form": "^7.4.1|^8.0.1", + "symfony/form": "^7.4.4|^8.0.4", "symfony/html-sanitizer": "^7.4|^8.0", "symfony/http-foundation": "^7.4|^8.0", "symfony/http-kernel": "^7.4|^8.0", "symfony/intl": "^7.4|^8.0", - "symfony/mime": "^7.4|^8.0", + "symfony/mime": "^7.4.8|^8.0.8", "symfony/polyfill-intl-icu": "^1.0", "symfony/property-info": "^7.4|^8.0", "symfony/routing": "^7.4|^8.0", @@ -9423,7 +9433,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v8.0.3" + "source": "https://github.com/symfony/twig-bridge/tree/v8.0.8" }, "funding": [ { @@ -9443,20 +9453,20 @@ "type": "tidelift" } ], - "time": "2025-12-16T08:10:18+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/twig-bundle", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "58c54c97af6a3fdb7ea9a3931ea1c4b8bd282b2f" + "reference": "f83767b78e2580ca9fe9a2cf6fcff19cd5389bc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/58c54c97af6a3fdb7ea9a3931ea1c4b8bd282b2f", - "reference": "58c54c97af6a3fdb7ea9a3931ea1c4b8bd282b2f", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/f83767b78e2580ca9fe9a2cf6fcff19cd5389bc1", + "reference": "f83767b78e2580ca9fe9a2cf6fcff19cd5389bc1", "shasum": "" }, "require": { @@ -9507,7 +9517,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v8.0.3" + "source": "https://github.com/symfony/twig-bundle/tree/v8.0.8" }, "funding": [ { @@ -9527,20 +9537,20 @@ "type": "tidelift" } ], - "time": "2025-12-19T10:01:18+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/type-info", - "version": "v8.0.1", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "bb091cec1f70383538c7d000699781813f8d1a6a" + "reference": "08723aceb8c3271e8cb3db8b2565728b0c88e866" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/bb091cec1f70383538c7d000699781813f8d1a6a", - "reference": "bb091cec1f70383538c7d000699781813f8d1a6a", + "url": "https://api.github.com/repos/symfony/type-info/zipball/08723aceb8c3271e8cb3db8b2565728b0c88e866", + "reference": "08723aceb8c3271e8cb3db8b2565728b0c88e866", "shasum": "" }, "require": { @@ -9589,7 +9599,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v8.0.1" + "source": "https://github.com/symfony/type-info/tree/v8.0.9" }, "funding": [ { @@ -9609,20 +9619,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/uid", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "8395a2cc2ed49aa68f602c5c489f60ab853893df" + "reference": "4d9d6510bbe88ebb4608b7200d18606cdf80825c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/8395a2cc2ed49aa68f602c5c489f60ab853893df", - "reference": "8395a2cc2ed49aa68f602c5c489f60ab853893df", + "url": "https://api.github.com/repos/symfony/uid/zipball/4d9d6510bbe88ebb4608b7200d18606cdf80825c", + "reference": "4d9d6510bbe88ebb4608b7200d18606cdf80825c", "shasum": "" }, "require": { @@ -9667,7 +9677,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v8.0.0" + "source": "https://github.com/symfony/uid/tree/v8.0.9" }, "funding": [ { @@ -9687,20 +9697,20 @@ "type": "tidelift" } ], - "time": "2025-09-26T07:52:19+00:00" + "time": "2026-04-30T16:10:06+00:00" }, { "name": "symfony/ux-twig-component", - "version": "v2.32.0", + "version": "v2.35.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "0a300088327d1b766733fdcd81ae4a77852d6177" + "reference": "d64b068d8339e905cd48974bdd6e9ba54dc8f247" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/0a300088327d1b766733fdcd81ae4a77852d6177", - "reference": "0a300088327d1b766733fdcd81ae4a77852d6177", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/d64b068d8339e905cd48974bdd6e9ba54dc8f247", + "reference": "d64b068d8339e905cd48974bdd6e9ba54dc8f247", "shasum": "" }, "require": { @@ -9720,9 +9730,11 @@ "symfony/dom-crawler": "^5.4|^6.0|^7.0|^8.0", "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0", "symfony/phpunit-bridge": "^6.0|^7.0|^8.0", - "symfony/stimulus-bundle": "^2.9.1", + "symfony/stimulus-bundle": "^2.9.1|^3.0", "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0", - "symfony/webpack-encore-bundle": "^1.15|^2.3.0" + "symfony/webpack-encore-bundle": "^1.15|^2.3.0", + "twig/extra-bundle": "^3.10.3", + "twig/html-extra": "^3.10.3" }, "type": "symfony-bundle", "extra": { @@ -9754,7 +9766,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-twig-component/tree/v2.32.0" + "source": "https://github.com/symfony/ux-twig-component/tree/v2.35.0" }, "funding": [ { @@ -9774,20 +9786,20 @@ "type": "tidelift" } ], - "time": "2025-12-25T09:25:01+00:00" + "time": "2026-04-03T05:13:59+00:00" }, { "name": "symfony/validator", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "d05d70f82c33581e8c2522d3c39cfe8c92f0b06a" + "reference": "131dc8322c06595a6c98185787fa756deada20df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/d05d70f82c33581e8c2522d3c39cfe8c92f0b06a", - "reference": "d05d70f82c33581e8c2522d3c39cfe8c92f0b06a", + "url": "https://api.github.com/repos/symfony/validator/zipball/131dc8322c06595a6c98185787fa756deada20df", + "reference": "131dc8322c06595a6c98185787fa756deada20df", "shasum": "" }, "require": { @@ -9798,7 +9810,8 @@ }, "conflict": { "doctrine/lexer": "<1.1", - "symfony/doctrine-bridge": "<7.4" + "symfony/doctrine-bridge": "<7.4", + "symfony/expression-language": "<7.4" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", @@ -9848,7 +9861,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v8.0.3" + "source": "https://github.com/symfony/validator/tree/v8.0.9" }, "funding": [ { @@ -9868,20 +9881,20 @@ "type": "tidelift" } ], - "time": "2025-12-27T17:05:29+00:00" + "time": "2026-04-30T16:10:06+00:00" }, { "name": "symfony/var-dumper", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "3bc368228532ad538cc216768caa8968be95a8d6" + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3bc368228532ad538cc216768caa8968be95a8d6", - "reference": "3bc368228532ad538cc216768caa8968be95a8d6", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", "shasum": "" }, "require": { @@ -9935,7 +9948,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v8.0.3" + "source": "https://github.com/symfony/var-dumper/tree/v8.0.8" }, "funding": [ { @@ -9955,20 +9968,20 @@ "type": "tidelift" } ], - "time": "2025-12-18T11:23:51+00:00" + "time": "2026-03-31T07:15:36+00:00" }, { "name": "symfony/var-exporter", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04" + "reference": "24cf67be4dd0926e4413635418682f4fff831412" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", - "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/24cf67be4dd0926e4413635418682f4fff831412", + "reference": "24cf67be4dd0926e4413635418682f4fff831412", "shasum": "" }, "require": { @@ -10015,7 +10028,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v8.0.0" + "source": "https://github.com/symfony/var-exporter/tree/v8.0.9" }, "funding": [ { @@ -10035,7 +10048,7 @@ "type": "tidelift" } ], - "time": "2025-11-05T18:53:00+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/webpack-encore-bundle", @@ -10115,16 +10128,16 @@ }, { "name": "symfony/workflow", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/workflow.git", - "reference": "9c1905e6bb6229d58d54012400c8497960db89a0" + "reference": "5b299aa29f72217b4cf6a11ebb76bcc32574a4f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/workflow/zipball/9c1905e6bb6229d58d54012400c8497960db89a0", - "reference": "9c1905e6bb6229d58d54012400c8497960db89a0", + "url": "https://api.github.com/repos/symfony/workflow/zipball/5b299aa29f72217b4cf6a11ebb76bcc32574a4f9", + "reference": "5b299aa29f72217b4cf6a11ebb76bcc32574a4f9", "shasum": "" }, "require": { @@ -10181,7 +10194,7 @@ "workflow" ], "support": { - "source": "https://github.com/symfony/workflow/tree/v8.0.3" + "source": "https://github.com/symfony/workflow/tree/v8.0.9" }, "funding": [ { @@ -10201,20 +10214,20 @@ "type": "tidelift" } ], - "time": "2025-12-11T07:34:22+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/yaml", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14" + "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14", - "reference": "7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14", + "url": "https://api.github.com/repos/symfony/yaml/zipball/54174ab48c0c0f9e21512b304be17f8150ccf8f1", + "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1", "shasum": "" }, "require": { @@ -10256,7 +10269,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v8.0.1" + "source": "https://github.com/symfony/yaml/tree/v8.0.8" }, "funding": [ { @@ -10276,20 +10289,20 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:17:06+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.22.2", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "09de9be7f6c0d19ede7b5a1dbfcfb2e9d1e0ea9e" + "reference": "6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/09de9be7f6c0d19ede7b5a1dbfcfb2e9d1e0ea9e", - "reference": "09de9be7f6c0d19ede7b5a1dbfcfb2e9d1e0ea9e", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9", + "reference": "6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9", "shasum": "" }, "require": { @@ -10338,7 +10351,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.22.2" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.24.0" }, "funding": [ { @@ -10350,20 +10363,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T08:51:53+00:00" + "time": "2026-02-07T08:07:38+00:00" }, { "name": "twig/html-extra", - "version": "v3.22.1", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/html-extra.git", - "reference": "d56d33315bce2b19ed815f8feedce85448736568" + "reference": "313900fb98b371b006a55b1a29241a192634be13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/html-extra/zipball/d56d33315bce2b19ed815f8feedce85448736568", - "reference": "d56d33315bce2b19ed815f8feedce85448736568", + "url": "https://api.github.com/repos/twigphp/html-extra/zipball/313900fb98b371b006a55b1a29241a192634be13", + "reference": "313900fb98b371b006a55b1a29241a192634be13", "shasum": "" }, "require": { @@ -10406,7 +10419,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/html-extra/tree/v3.22.1" + "source": "https://github.com/twigphp/html-extra/tree/v3.24.0" }, "funding": [ { @@ -10418,20 +10431,20 @@ "type": "tidelift" } ], - "time": "2025-11-02T11:00:49+00:00" + "time": "2026-03-17T07:24:08+00:00" }, { "name": "twig/intl-extra", - "version": "v3.22.1", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1" + "reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/93ac31e53cdd3f2e541f42690cd0c54ca8138ab1", - "reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", + "reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", "shasum": "" }, "require": { @@ -10470,7 +10483,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.22.1" + "source": "https://github.com/twigphp/intl-extra/tree/v3.24.0" }, "funding": [ { @@ -10482,20 +10495,20 @@ "type": "tidelift" } ], - "time": "2025-11-02T11:00:49+00:00" + "time": "2026-01-17T13:57:47+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.22.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "fb6f952082e3a7d62a75c8be2c8c47242d3925fb" + "reference": "67a11120356e034a5bbc70c5b9b9a4d0f31ca06e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/fb6f952082e3a7d62a75c8be2c8c47242d3925fb", - "reference": "fb6f952082e3a7d62a75c8be2c8c47242d3925fb", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/67a11120356e034a5bbc70c5b9b9a4d0f31ca06e", + "reference": "67a11120356e034a5bbc70c5b9b9a4d0f31ca06e", "shasum": "" }, "require": { @@ -10542,7 +10555,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.22.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.24.0" }, "funding": [ { @@ -10554,20 +10567,20 @@ "type": "tidelift" } ], - "time": "2025-09-15T05:57:37+00:00" + "time": "2026-02-07T08:07:38+00:00" }, { "name": "twig/twig", - "version": "v3.22.2", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2" + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/946ddeafa3c9f4ce279d1f34051af041db0e16f2", - "reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6769aefb305efef849dc25c9fd1653358c148f0", + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0", "shasum": "" }, "require": { @@ -10577,7 +10590,8 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "phpstan/phpstan": "^2.0", + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, @@ -10621,7 +10635,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.22.2" + "source": "https://github.com/twigphp/Twig/tree/v3.24.0" }, "funding": [ { @@ -10633,20 +10647,20 @@ "type": "tidelift" } ], - "time": "2025-12-14T11:28:47+00:00" + "time": "2026-03-17T21:31:11+00:00" }, { "name": "vich/uploader-bundle", - "version": "v2.9.1", + "version": "v2.9.2", "source": { "type": "git", "url": "https://github.com/dustin10/VichUploaderBundle.git", - "reference": "945939a04a33c0b78c5fbb7ead31533d85112df5" + "reference": "4b88b23cb859a121413df4a831d960a46d6fe27f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dustin10/VichUploaderBundle/zipball/945939a04a33c0b78c5fbb7ead31533d85112df5", - "reference": "945939a04a33c0b78c5fbb7ead31533d85112df5", + "url": "https://api.github.com/repos/dustin10/VichUploaderBundle/zipball/4b88b23cb859a121413df4a831d960a46d6fe27f", + "reference": "4b88b23cb859a121413df4a831d960a46d6fe27f", "shasum": "" }, "require": { @@ -10739,9 +10753,9 @@ ], "support": { "issues": "https://github.com/dustin10/VichUploaderBundle/issues", - "source": "https://github.com/dustin10/VichUploaderBundle/tree/v2.9.1" + "source": "https://github.com/dustin10/VichUploaderBundle/tree/v2.9.2" }, - "time": "2025-12-10T08:23:38+00:00" + "time": "2026-03-12T08:18:50+00:00" } ], "packages-dev": [ @@ -11003,34 +11017,34 @@ }, { "name": "dama/doctrine-test-bundle", - "version": "v8.4.1", + "version": "v8.6.0", "source": { "type": "git", "url": "https://github.com/dmaicher/doctrine-test-bundle.git", - "reference": "d9f4fb01a43da2e279ca190fa25ab9e26f15a0c8" + "reference": "f7e3487643e685432f7e27c50cac64e9f8c515a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/d9f4fb01a43da2e279ca190fa25ab9e26f15a0c8", - "reference": "d9f4fb01a43da2e279ca190fa25ab9e26f15a0c8", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/f7e3487643e685432f7e27c50cac64e9f8c515a4", + "reference": "f7e3487643e685432f7e27c50cac64e9f8c515a4", "shasum": "" }, "require": { "doctrine/dbal": "^3.3 || ^4.0", "doctrine/doctrine-bundle": "^2.11.0 || ^3.0", - "php": ">= 8.1", + "php": ">= 8.2", "psr/cache": "^2.0 || ^3.0", "symfony/cache": "^6.4 || ^7.3 || ^8.0", "symfony/framework-bundle": "^6.4 || ^7.3 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<10.0" + "phpunit/phpunit": "<11.0" }, "require-dev": { "behat/behat": "^3.0", "friendsofphp/php-cs-fixer": "^3.27", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.5.57 || ^11.5.41|| ^12.3.14", + "phpunit/phpunit": "^11.5.41|| ^12.3.14", "symfony/dotenv": "^6.4 || ^7.3 || ^8.0", "symfony/process": "^6.4 || ^7.3 || ^8.0" }, @@ -11066,22 +11080,22 @@ ], "support": { "issues": "https://github.com/dmaicher/doctrine-test-bundle/issues", - "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.4.1" + "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.6.0" }, - "time": "2025-12-07T21:48:15+00:00" + "time": "2026-01-21T07:39:44+00:00" }, { "name": "doctrine/data-fixtures", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97" + "reference": "bf7ac3a050b54b261cedfb3d0a44733819062275" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7a615ba135e45d67674bb623d90f34f6c7b6bd97", - "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bf7ac3a050b54b261cedfb3d0a44733819062275", + "reference": "bf7ac3a050b54b261cedfb3d0a44733819062275", "shasum": "" }, "require": { @@ -11099,12 +11113,14 @@ "doctrine/dbal": "^3.5 || ^4", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.14 || ^3", + "doctrine/phpcr-odm": "^1.8 || ^2.0", "ext-sqlite3": "*", "fig/log-test": "^1", - "phpstan/phpstan": "2.1.31", - "phpunit/phpunit": "10.5.45 || 12.4.0", - "symfony/cache": "^6.4 || ^7", - "symfony/var-exporter": "^6.4 || ^7" + "jackalope/jackalope-fs": "*", + "phpstan/phpstan": "2.1.46", + "phpunit/phpunit": "10.5.63 || 12.5.12", + "symfony/cache": "^6.4 || ^7 || ^8", + "symfony/var-exporter": "^6.4 || ^7 || ^8" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -11135,7 +11151,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/2.2.0" + "source": "https://github.com/doctrine/data-fixtures/tree/2.2.1" }, "funding": [ { @@ -11151,7 +11167,7 @@ "type": "tidelift" } ], - "time": "2025-10-17T20:06:20+00:00" + "time": "2026-04-01T13:56:01+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -11239,6 +11255,75 @@ ], "time": "2025-12-03T16:05:42+00:00" }, + { + "name": "ergebnis/agent-detector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/agent-detector.git", + "reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64", + "reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64", + "shasum": "" + }, + "require": { + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.50.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.60.2", + "ergebnis/phpstan-rules": "^2.13.1", + "ergebnis/phpunit-slow-test-detector": "^2.24.0", + "ergebnis/rector-rules": "^1.16.0", + "fakerphp/faker": "^1.24.1", + "infection/infection": "^0.26.6", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.46", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "phpunit/phpunit": "^9.6.34", + "rector/rector": "^2.4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\AgentDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a detector for detecting the presence of an agent.", + "homepage": "https://github.com/ergebnis/agent-detector", + "support": { + "issues": "https://github.com/ergebnis/agent-detector/issues", + "security": "https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/agent-detector" + }, + "time": "2026-04-10T13:45:13+00:00" + }, { "name": "evenement/evenement", "version": "v3.0.2", @@ -11412,22 +11497,23 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.92.5", + "version": "v3.95.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "260cc8c4a1d2f6d2f22cd4f9c70aa72e55ebac58" + "reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/260cc8c4a1d2f6d2f22cd4f9c70aa72e55ebac58", - "reference": "260cc8c4a1d2f6d2f22cd4f9c70aa72e55ebac58", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a9727678fbd12997f1d9de8f4a37824ed9df1065", + "reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065", "shasum": "" }, "require": { "clue/ndjson-react": "^1.3", "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.5", + "ergebnis/agent-detector": "^1.1.1", "ext-filter": "*", "ext-hash": "*", "ext-json": "*", @@ -11438,7 +11524,7 @@ "react/event-loop": "^1.5", "react/socket": "^1.16", "react/stream": "^1.4", - "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0", "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0", "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", @@ -11452,18 +11538,18 @@ "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.7", - "infection/infection": "^0.31", - "justinrainbow/json-schema": "^6.6", + "facile-it/paraunit": "^1.3.1 || ^2.8.0", + "infection/infection": "^0.32.6", + "justinrainbow/json-schema": "^6.8.0", "keradus/cli-executor": "^2.3", "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.9", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.31 || ^10.5.60 || ^11.5.46", + "php-coveralls/php-coveralls": "^2.9.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8", + "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55", "symfony/polyfill-php85": "^1.33", - "symfony/var-dumper": "^5.4.48 || ^6.4.26 || ^7.4.0 || ^8.0", - "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0" + "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.8", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.8" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -11504,7 +11590,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.5" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.1" }, "funding": [ { @@ -11512,20 +11598,20 @@ "type": "github" } ], - "time": "2026-01-08T21:57:37+00:00" + "time": "2026-04-12T17:00:09+00:00" }, { "name": "mmo/faker-images", - "version": "v0.9.1", + "version": "v0.9.2", "source": { "type": "git", "url": "https://github.com/morawskim/faker-images.git", - "reference": "0c1a0807fe01dd060591a18cba37d5bf9c677bf2" + "reference": "3ac8ba8ead88a1038cedbf3d657cc328bd353977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/morawskim/faker-images/zipball/0c1a0807fe01dd060591a18cba37d5bf9c677bf2", - "reference": "0c1a0807fe01dd060591a18cba37d5bf9c677bf2", + "url": "https://api.github.com/repos/morawskim/faker-images/zipball/3ac8ba8ead88a1038cedbf3d657cc328bd353977", + "reference": "3ac8ba8ead88a1038cedbf3d657cc328bd353977", "shasum": "" }, "require": { @@ -11566,22 +11652,22 @@ ], "support": { "issues": "https://github.com/morawskim/faker-images/issues", - "source": "https://github.com/morawskim/faker-images/tree/v0.9.1" + "source": "https://github.com/morawskim/faker-images/tree/v0.9.2" }, - "time": "2025-08-15T07:16:51+00:00" + "time": "2026-02-02T20:16:42+00:00" }, { "name": "nette/utils", - "version": "v4.1.1", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72" + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/c99059c0315591f1a0db7ad6002000288ab8dc72", - "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { @@ -11593,8 +11679,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", "nette/tester": "^2.5", - "phpstan/phpstan-nette": "^2.0@stable", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -11655,9 +11743,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.1" + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2025-12-22T12:14:32+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { "name": "nikic/php-parser", @@ -11837,16 +11925,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.1", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/16dbf9937da8d4528ceb2145c9c7c0bd29e26374", - "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -11878,17 +11966,17 @@ "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.3.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2026-01-12T11:33:04+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpstan/phpstan", - "version": "2.1.33", + "version": "2.1.54", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9e800e6bee7d5bd02784d4c6069b48032d16224f", - "reference": "9e800e6bee7d5bd02784d4c6069b48032d16224f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8be50c3992107dc837b17da4d140fbbdf9a5c5bd", + "reference": "8be50c3992107dc837b17da4d140fbbdf9a5c5bd", "shasum": "" }, "require": { @@ -11933,25 +12021,25 @@ "type": "github" } ], - "time": "2025-12-05T10:24:31+00:00" + "time": "2026-04-29T13:31:09+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "468e02c9176891cc901143da118f09dc9505fc2f" + "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/468e02c9176891cc901143da118f09dc9505fc2f", - "reference": "468e02c9176891cc901143da118f09dc9505fc2f", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/6b5571001a7f04fa0422254c30a0017ec2f2cacc", + "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.15" + "phpstan/phpstan": "^2.1.39" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", @@ -11976,29 +12064,32 @@ "MIT" ], "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.3" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.4" }, - "time": "2025-05-14T10:56:57+00:00" + "time": "2026-02-09T13:21:14+00:00" }, { "name": "phpstan/phpstan-doctrine", - "version": "2.0.12", + "version": "2.0.21", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "d20ee0373d22735271f1eb4d631856b5f847d399" + "reference": "81dac0ee4363c2359128aec844df31efb215dddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/d20ee0373d22735271f1eb4d631856b5f847d399", - "reference": "d20ee0373d22735271f1eb4d631856b5f847d399", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/81dac0ee4363c2359128aec844df31efb215dddc", + "reference": "81dac0ee4363c2359128aec844df31efb215dddc", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.13" + "phpstan/phpstan": "^2.1.34" }, "conflict": { "doctrine/collections": "<1.0", @@ -12018,7 +12109,7 @@ "doctrine/lexer": "^2.0 || ^3.0", "doctrine/mongodb-odm": "^2.4.3", "doctrine/orm": "^2.16.0", - "doctrine/persistence": "^2.2.1 || ^3.2", + "doctrine/persistence": "^2.2.1 || ^3.4.3", "gedmo/doctrine-extensions": "^3.8", "nesbot/carbon": "^2.49", "php-parallel-lint/php-parallel-lint": "^1.2", @@ -12049,11 +12140,14 @@ "MIT" ], "description": "Doctrine extensions for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.12" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.21" }, - "time": "2025-12-01T11:34:02+00:00" + "time": "2026-04-17T13:00:39+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -12106,16 +12200,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.11", + "version": "2.0.16", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "5e30669bef866eff70db8b58d72a5c185aa82414" + "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/5e30669bef866eff70db8b58d72a5c185aa82414", - "reference": "5e30669bef866eff70db8b58d72a5c185aa82414", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6ab598e1bc106e6827fd346ae4a12b4a5d634c32", + "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32", "shasum": "" }, "require": { @@ -12151,24 +12245,27 @@ "MIT" ], "description": "PHPUnit extensions and rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.11" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.16" }, - "time": "2025-12-19T09:05:35+00:00" + "time": "2026-02-14T09:05:21+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.9", + "version": "2.0.15", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "24d8c157aa483141b0579d705ef0aac9e1b95436" + "reference": "9b85ab476969b87bbe2253b69e265a9359b2f395" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/24d8c157aa483141b0579d705ef0aac9e1b95436", - "reference": "24d8c157aa483141b0579d705ef0aac9e1b95436", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/9b85ab476969b87bbe2253b69e265a9359b2f395", + "reference": "9b85ab476969b87bbe2253b69e265a9359b2f395", "shasum": "" }, "require": { @@ -12222,24 +12319,27 @@ } ], "description": "Symfony Framework extensions and rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.9" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.15" }, - "time": "2025-11-29T11:17:28+00:00" + "time": "2026-02-26T10:15:59+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "12.5.2", + "version": "12.5.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b" + "reference": "876099a072646c7745f673d7aeab5382c4439691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4a9739b51cbcb355f6e95659612f92e282a7077b", - "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/876099a072646c7745f673d7aeab5382c4439691", + "reference": "876099a072646c7745f673d7aeab5382c4439691", "shasum": "" }, "require": { @@ -12248,7 +12348,6 @@ "ext-xmlwriter": "*", "nikic/php-parser": "^5.7.0", "php": ">=8.3", - "phpunit/php-file-iterator": "^6.0", "phpunit/php-text-template": "^5.0", "sebastian/complexity": "^5.0", "sebastian/environment": "^8.0.3", @@ -12295,7 +12394,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.6" }, "funding": [ { @@ -12315,20 +12414,20 @@ "type": "tidelift" } ], - "time": "2025-12-24T07:03:04+00:00" + "time": "2026-04-15T08:23:17+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "6.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", "shasum": "" }, "require": { @@ -12368,15 +12467,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.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/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2025-02-07T04:58:37+00:00" + "time": "2026-02-02T14:04:18+00:00" }, { "name": "phpunit/php-invoker", @@ -12564,16 +12675,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.4", + "version": "12.5.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "4ba0e923f9d3fc655de22f9547c01d15a41fc93a" + "reference": "d75dd30597caa80e72fad2ef7904601a30ef1046" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4ba0e923f9d3fc655de22f9547c01d15a41fc93a", - "reference": "4ba0e923f9d3fc655de22f9547c01d15a41fc93a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d75dd30597caa80e72fad2ef7904601a30ef1046", + "reference": "d75dd30597caa80e72fad2ef7904601a30ef1046", "shasum": "" }, "require": { @@ -12587,18 +12698,19 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.1", - "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-code-coverage": "^12.5.6", + "phpunit/php-file-iterator": "^6.0.1", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", "sebastian/cli-parser": "^4.2.0", - "sebastian/comparator": "^7.1.3", + "sebastian/comparator": "^7.1.6", "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.3", + "sebastian/environment": "^8.1.0", "sebastian/exporter": "^7.0.2", "sebastian/global-state": "^8.0.2", "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", "sebastian/type": "^6.0.3", "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" @@ -12641,31 +12753,15 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.4" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.24" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "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" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2025-12-15T06:05:34+00:00" + "time": "2026-05-01T04:21:04+00:00" }, { "name": "react/cache", @@ -13195,21 +13291,21 @@ }, { "name": "rector/rector", - "version": "2.3.0", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "f7166355dcf47482f27be59169b0825995f51c7d" + "reference": "e645b6463c6a88ea5b44b17d3387d35a912c7946" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/f7166355dcf47482f27be59169b0825995f51c7d", - "reference": "f7166355dcf47482f27be59169b0825995f51c7d", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/e645b6463c6a88ea5b44b17d3387d35a912c7946", + "reference": "e645b6463c6a88ea5b44b17d3387d35a912c7946", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.33" + "phpstan/phpstan": "^2.1.48" }, "conflict": { "rector/rector-doctrine": "*", @@ -13243,7 +13339,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.3.0" + "source": "https://github.com/rectorphp/rector/tree/2.4.2" }, "funding": [ { @@ -13251,7 +13347,7 @@ "type": "github" } ], - "time": "2025-12-25T22:00:18+00:00" + "time": "2026-04-16T13:07:34+00:00" }, { "name": "sebastian/cli-parser", @@ -13324,16 +13420,16 @@ }, { "name": "sebastian/comparator", - "version": "7.1.3", + "version": "7.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c769009dee98f494e0edc3fd4f4087501688f11e", + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e", "shasum": "" }, "require": { @@ -13392,7 +13488,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.6" }, "funding": [ { @@ -13412,7 +13508,7 @@ "type": "tidelift" } ], - "time": "2025-08-20T11:27:00+00:00" + "time": "2026-04-14T08:23:15+00:00" }, { "name": "sebastian/complexity", @@ -13541,16 +13637,16 @@ }, { "name": "sebastian/environment", - "version": "8.0.3", + "version": "8.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b121608b28a13f721e76ffbbd386d08eff58f3f6", + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6", "shasum": "" }, "require": { @@ -13565,7 +13661,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -13593,7 +13689,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.0" }, "funding": [ { @@ -13613,7 +13709,7 @@ "type": "tidelift" } ], - "time": "2025-08-12T14:11:56+00:00" + "time": "2026-04-15T12:13:01+00:00" }, { "name": "sebastian/exporter", @@ -14347,16 +14443,16 @@ }, { "name": "symfony/browser-kit", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "efc7cc6d442b80c8cb0ad0b29bdb0c9418cee9ee" + "reference": "f5a28fca785416cf489dd579011e74c831100cc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/efc7cc6d442b80c8cb0ad0b29bdb0c9418cee9ee", - "reference": "efc7cc6d442b80c8cb0ad0b29bdb0c9418cee9ee", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/f5a28fca785416cf489dd579011e74c831100cc3", + "reference": "f5a28fca785416cf489dd579011e74c831100cc3", "shasum": "" }, "require": { @@ -14395,7 +14491,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v8.0.3" + "source": "https://github.com/symfony/browser-kit/tree/v8.0.8" }, "funding": [ { @@ -14415,20 +14511,20 @@ "type": "tidelift" } ], - "time": "2025-12-16T08:10:18+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/css-selector", - "version": "v8.0.0", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b" + "reference": "3665cfade90565430909b906394c73c8739e57d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/6225bd458c53ecdee056214cb4a2ffaf58bd592b", - "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/3665cfade90565430909b906394c73c8739e57d0", + "reference": "3665cfade90565430909b906394c73c8739e57d0", "shasum": "" }, "require": { @@ -14464,7 +14560,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v8.0.0" + "source": "https://github.com/symfony/css-selector/tree/v8.0.9" }, "funding": [ { @@ -14484,20 +14580,20 @@ "type": "tidelift" } ], - "time": "2025-10-30T14:17:19+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/debug-bundle", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "02665efd40733372a4b4bdd78722426a6f95849b" + "reference": "d9d127d61fb2aa7f7f324a8b1928767e2211d1bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/02665efd40733372a4b4bdd78722426a6f95849b", - "reference": "02665efd40733372a4b4bdd78722426a6f95849b", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/d9d127d61fb2aa7f7f324a8b1928767e2211d1bc", + "reference": "d9d127d61fb2aa7f7f324a8b1928767e2211d1bc", "shasum": "" }, "require": { @@ -14539,7 +14635,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v8.0.0" + "source": "https://github.com/symfony/debug-bundle/tree/v8.0.8" }, "funding": [ { @@ -14559,20 +14655,20 @@ "type": "tidelift" } ], - "time": "2025-10-24T14:30:40+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/dom-crawler", - "version": "v8.0.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "11a3dbe6f6c0ae03ae71f879cf5c2e28db107179" + "reference": "284ace90732b445b027728b5e0eec6418a17a364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/11a3dbe6f6c0ae03ae71f879cf5c2e28db107179", - "reference": "11a3dbe6f6c0ae03ae71f879cf5c2e28db107179", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/284ace90732b445b027728b5e0eec6418a17a364", + "reference": "284ace90732b445b027728b5e0eec6418a17a364", "shasum": "" }, "require": { @@ -14609,7 +14705,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v8.0.1" + "source": "https://github.com/symfony/dom-crawler/tree/v8.0.8" }, "funding": [ { @@ -14629,23 +14725,24 @@ "type": "tidelift" } ], - "time": "2025-12-06T17:00:47+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.65.1", + "version": "v1.67.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "eba30452d212769c9a5bcf0716959fd8ba1e54e3" + "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/eba30452d212769c9a5bcf0716959fd8ba1e54e3", - "reference": "eba30452d212769c9a5bcf0716959fd8ba1e54e3", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/6ce8b313845f16bcf385ee3cb31d8b24e30d5516", + "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516", "shasum": "" }, "require": { + "composer-runtime-api": "^2.1", "doctrine/inflector": "^2.0", "nikic/php-parser": "^5.0", "php": ">=8.1", @@ -14665,7 +14762,7 @@ }, "require-dev": { "composer/semver": "^3.0", - "doctrine/doctrine-bundle": "^2.5.0|^3.0.0", + "doctrine/doctrine-bundle": "^2.10|^3.0", "doctrine/orm": "^2.15|^3", "doctrine/persistence": "^3.1|^4.0", "symfony/http-client": "^6.4|^7.0|^8.0", @@ -14707,7 +14804,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.65.1" + "source": "https://github.com/symfony/maker-bundle/tree/v1.67.0" }, "funding": [ { @@ -14727,20 +14824,20 @@ "type": "tidelift" } ], - "time": "2025-12-02T07:14:37+00:00" + "time": "2026-03-18T13:39:06+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v8.0.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "3c59b07980df5d4ae4a2620287016209802261ea" + "reference": "723ea96810135e776110bddb25aeb32b462134c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/3c59b07980df5d4ae4a2620287016209802261ea", - "reference": "3c59b07980df5d4ae4a2620287016209802261ea", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/723ea96810135e776110bddb25aeb32b462134c8", + "reference": "723ea96810135e776110bddb25aeb32b462134c8", "shasum": "" }, "require": { @@ -14792,7 +14889,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.3" + "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.8" }, "funding": [ { @@ -14812,20 +14909,20 @@ "type": "tidelift" } ], - "time": "2025-12-10T13:10:54+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v8.0.3", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "88679cfe4067bafb8df5d6defcaec061fe16af2d" + "reference": "5c3d84efc47982dcce766092ba63d4435ed9f11e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/88679cfe4067bafb8df5d6defcaec061fe16af2d", - "reference": "88679cfe4067bafb8df5d6defcaec061fe16af2d", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/5c3d84efc47982dcce766092ba63d4435ed9f11e", + "reference": "5c3d84efc47982dcce766092ba63d4435ed9f11e", "shasum": "" }, "require": { @@ -14877,7 +14974,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v8.0.3" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v8.0.9" }, "funding": [ { @@ -14897,29 +14994,29 @@ "type": "tidelift" } ], - "time": "2025-12-27T17:05:29+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "13.0.4", + "version": "13.1.3", "source": { "type": "git", - "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "5c7e7a07e5d6a98b9dd2e6fc0a9155efb7c166c8" + "url": "https://github.com/easy-coding-standard/ecs.git", + "reference": "d894d088d7ebb9326f9eed28bf251481c813b89f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/5c7e7a07e5d6a98b9dd2e6fc0a9155efb7c166c8", - "reference": "5c7e7a07e5d6a98b9dd2e6fc0a9155efb7c166c8", + "url": "https://api.github.com/repos/easy-coding-standard/ecs/zipball/d894d088d7ebb9326f9eed28bf251481c813b89f", + "reference": "d894d088d7ebb9326f9eed28bf251481c813b89f", "shasum": "" }, "require": { "php": ">=7.2" }, "conflict": { - "friendsofphp/php-cs-fixer": "<3.92.4", + "friendsofphp/php-cs-fixer": "<3.95.1", "phpcsstandards/php_codesniffer": "<4.0.1", - "symplify/coding-standard": "<12.1" + "symplify/coding-standard": "<13.0" }, "suggest": { "ext-dom": "Needed to support checkstyle output format in class CheckstyleOutputFormatter" @@ -14945,20 +15042,9 @@ "static analysis" ], "support": { - "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/13.0.4" + "source": "https://github.com/easy-coding-standard/ecs/tree/13.1.3" }, - "funding": [ - { - "url": "https://www.paypal.me/rectorphp", - "type": "custom" - }, - { - "url": "https://github.com/tomasvotruba", - "type": "github" - } - ], - "time": "2026-01-05T09:10:04+00:00" + "time": "2026-05-04T21:45:57+00:00" }, { "name": "symplify/phpstan-rules", @@ -15069,16 +15155,16 @@ }, { "name": "webmozart/assert", - "version": "2.1.1", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "bdbabc199a7ba9965484e4725d66170e5711323b" + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/bdbabc199a7ba9965484e4725d66170e5711323b", - "reference": "bdbabc199a7ba9965484e4725d66170e5711323b", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/eb0d790f735ba6cff25c683a85a1da0eadeff9e4", + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4", "shasum": "" }, "require": { @@ -15125,9 +15211,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.1.1" + "source": "https://github.com/webmozarts/assert/tree/2.3.0" }, - "time": "2026-01-08T11:28:40+00:00" + "time": "2026-04-11T10:33:05+00:00" } ], "aliases": [], diff --git a/apps/config/reference.php b/apps/config/reference.php index db2d74416..453e84ff7 100644 --- a/apps/config/reference.php +++ b/apps/config/reference.php @@ -33,11 +33,11 @@ * type?: string|null, * ignore_errors?: bool, * }> - * @psalm-type ParametersConfig = array|null>|null> + * @psalm-type ParametersConfig = array|Param|null>|Param|null> * @psalm-type ArgumentsType = list|array * @psalm-type CallType = array|array{0:string, 1?:ArgumentsType, 2?:bool}|array{method:string, arguments?:ArgumentsType, returns_clone?:bool} * @psalm-type TagsType = list>> // arrays inside the list must have only one element, with the tag name as the key - * @psalm-type CallbackType = string|array{0:string|ReferenceConfigurator,1:string}|\Closure|ReferenceConfigurator|ExpressionConfigurator + * @psalm-type CallbackType = string|array{0:string|ReferenceConfigurator,1:string}|\Closure|ReferenceConfigurator * @psalm-type DeprecationType = array{package: string, version: string, message?: string} * @psalm-type DefaultsType = array{ * public?: bool, @@ -126,44 +126,44 @@ * } * @psalm-type ExtensionType = array * @psalm-type FrameworkConfig = array{ - * secret?: scalar|null|Param, + * secret?: scalar|Param|null, * http_method_override?: bool|Param, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false - * allowed_http_method_override?: list|null, - * trust_x_sendfile_type_header?: scalar|null|Param, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" - * ide?: scalar|null|Param, // Default: "%env(default::SYMFONY_IDE)%" + * allowed_http_method_override?: null|list, + * trust_x_sendfile_type_header?: scalar|Param|null, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" + * ide?: scalar|Param|null, // Default: "%env(default::SYMFONY_IDE)%" * test?: bool|Param, - * default_locale?: scalar|null|Param, // Default: "en" + * default_locale?: scalar|Param|null, // Default: "en" * set_locale_from_accept_language?: bool|Param, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false * set_content_language_from_locale?: bool|Param, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false - * enabled_locales?: list, - * trusted_hosts?: list, + * enabled_locales?: list, + * trusted_hosts?: string|list, * trusted_proxies?: mixed, // Default: ["%env(default::SYMFONY_TRUSTED_PROXIES)%"] - * trusted_headers?: list, - * error_controller?: scalar|null|Param, // Default: "error_controller" + * trusted_headers?: string|list, + * error_controller?: scalar|Param|null, // Default: "error_controller" * handle_all_throwables?: bool|Param, // HttpKernel will handle all kinds of \Throwable. // Default: true * csrf_protection?: bool|array{ - * enabled?: scalar|null|Param, // Default: null - * stateless_token_ids?: list, - * check_header?: scalar|null|Param, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false - * cookie_name?: scalar|null|Param, // The name of the cookie to use when using stateless protection. // Default: "csrf-token" + * enabled?: scalar|Param|null, // Default: null + * stateless_token_ids?: list, + * check_header?: scalar|Param|null, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false + * cookie_name?: scalar|Param|null, // The name of the cookie to use when using stateless protection. // Default: "csrf-token" * }, * form?: bool|array{ // Form configuration * enabled?: bool|Param, // Default: true - * csrf_protection?: array{ - * enabled?: scalar|null|Param, // Default: null - * token_id?: scalar|null|Param, // Default: null - * field_name?: scalar|null|Param, // Default: "_token" - * field_attr?: array, + * csrf_protection?: bool|array{ + * enabled?: scalar|Param|null, // Default: null + * token_id?: scalar|Param|null, // Default: null + * field_name?: scalar|Param|null, // Default: "_token" + * field_attr?: array, * }, * }, * http_cache?: bool|array{ // HTTP cache configuration * enabled?: bool|Param, // Default: false * debug?: bool|Param, // Default: "%kernel.debug%" * trace_level?: "none"|"short"|"full"|Param, - * trace_header?: scalar|null|Param, + * trace_header?: scalar|Param|null, * default_ttl?: int|Param, - * private_headers?: list, - * skip_response_headers?: list, + * private_headers?: list, + * skip_response_headers?: list, * allow_reload?: bool|Param, * allow_revalidate?: bool|Param, * stale_while_revalidate?: int|Param, @@ -178,188 +178,188 @@ * }, * fragments?: bool|array{ // Fragments configuration * enabled?: bool|Param, // Default: false - * hinclude_default_template?: scalar|null|Param, // Default: null - * path?: scalar|null|Param, // Default: "/_fragment" + * hinclude_default_template?: scalar|Param|null, // Default: null + * path?: scalar|Param|null, // Default: "/_fragment" * }, * profiler?: bool|array{ // Profiler configuration * enabled?: bool|Param, // Default: false * collect?: bool|Param, // Default: true - * collect_parameter?: scalar|null|Param, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null + * collect_parameter?: scalar|Param|null, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null * only_exceptions?: bool|Param, // Default: false * only_main_requests?: bool|Param, // Default: false - * dsn?: scalar|null|Param, // Default: "file:%kernel.cache_dir%/profiler" + * dsn?: scalar|Param|null, // Default: "file:%kernel.cache_dir%/profiler" * collect_serializer_data?: true|Param, // Default: true * }, * workflows?: bool|array{ * enabled?: bool|Param, // Default: false * workflows?: array, - * definition_validators?: list, - * support_strategy?: scalar|null|Param, - * initial_marking?: list, - * events_to_dispatch?: list|null, - * places?: list, - * }>, - * transitions: list, - * to?: list, - * weight?: int|Param, // Default: 1 - * metadata?: list, + * audit_trail?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * type?: "workflow"|"state_machine"|Param, // Default: "state_machine" + * marking_store?: array{ + * type?: "method"|Param, + * property?: scalar|Param|null, + * service?: scalar|Param|null, + * }, + * supports?: string|list, + * definition_validators?: list, + * support_strategy?: scalar|Param|null, + * initial_marking?: backed-enum|string|list, + * events_to_dispatch?: null|list, + * places?: string|list, + * }>, + * transitions?: list, + * to?: backed-enum|string|list, + * weight?: int|Param, // Default: 1 + * metadata?: array, + * }>, + * metadata?: array, * }>, - * metadata?: list, - * }>, * }, * router?: bool|array{ // Router configuration * enabled?: bool|Param, // Default: false - * resource: scalar|null|Param, - * type?: scalar|null|Param, - * default_uri?: scalar|null|Param, // The default URI used to generate URLs in a non-HTTP context. // Default: null - * http_port?: scalar|null|Param, // Default: 80 - * https_port?: scalar|null|Param, // Default: 443 - * strict_requirements?: scalar|null|Param, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true + * resource?: scalar|Param|null, + * type?: scalar|Param|null, + * default_uri?: scalar|Param|null, // The default URI used to generate URLs in a non-HTTP context. // Default: null + * http_port?: scalar|Param|null, // Default: 80 + * https_port?: scalar|Param|null, // Default: 443 + * strict_requirements?: scalar|Param|null, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true * utf8?: bool|Param, // Default: true * }, * session?: bool|array{ // Session configuration * enabled?: bool|Param, // Default: false - * storage_factory_id?: scalar|null|Param, // Default: "session.storage.factory.native" - * handler_id?: scalar|null|Param, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null. - * name?: scalar|null|Param, - * cookie_lifetime?: scalar|null|Param, - * cookie_path?: scalar|null|Param, - * cookie_domain?: scalar|null|Param, + * storage_factory_id?: scalar|Param|null, // Default: "session.storage.factory.native" + * handler_id?: scalar|Param|null, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null. + * name?: scalar|Param|null, + * cookie_lifetime?: scalar|Param|null, + * cookie_path?: scalar|Param|null, + * cookie_domain?: scalar|Param|null, * cookie_secure?: true|false|"auto"|Param, // Default: "auto" * cookie_httponly?: bool|Param, // Default: true * cookie_samesite?: null|"lax"|"strict"|"none"|Param, // Default: "lax" * use_cookies?: bool|Param, - * gc_divisor?: scalar|null|Param, - * gc_probability?: scalar|null|Param, - * gc_maxlifetime?: scalar|null|Param, - * save_path?: scalar|null|Param, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null. + * gc_divisor?: scalar|Param|null, + * gc_probability?: scalar|Param|null, + * gc_maxlifetime?: scalar|Param|null, + * save_path?: scalar|Param|null, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null. * metadata_update_threshold?: int|Param, // Seconds to wait between 2 session metadata updates. // Default: 0 * }, * request?: bool|array{ // Request configuration * enabled?: bool|Param, // Default: false - * formats?: array>, + * formats?: array>, * }, * assets?: bool|array{ // Assets configuration * enabled?: bool|Param, // Default: true * strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false - * version_strategy?: scalar|null|Param, // Default: null - * version?: scalar|null|Param, // Default: null - * version_format?: scalar|null|Param, // Default: "%%s?%%s" - * json_manifest_path?: scalar|null|Param, // Default: null - * base_path?: scalar|null|Param, // Default: "" - * base_urls?: list, + * version_strategy?: scalar|Param|null, // Default: null + * version?: scalar|Param|null, // Default: null + * version_format?: scalar|Param|null, // Default: "%%s?%%s" + * json_manifest_path?: scalar|Param|null, // Default: null + * base_path?: scalar|Param|null, // Default: "" + * base_urls?: string|list, * packages?: array, - * }>, + * strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false + * version_strategy?: scalar|Param|null, // Default: null + * version?: scalar|Param|null, + * version_format?: scalar|Param|null, // Default: null + * json_manifest_path?: scalar|Param|null, // Default: null + * base_path?: scalar|Param|null, // Default: "" + * base_urls?: string|list, + * }>, * }, * asset_mapper?: bool|array{ // Asset Mapper configuration * enabled?: bool|Param, // Default: false - * paths?: array, - * excluded_patterns?: list, + * paths?: string|array, + * excluded_patterns?: list, * exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true * server?: bool|Param, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true - * public_prefix?: scalar|null|Param, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/" + * public_prefix?: scalar|Param|null, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/" * missing_import_mode?: "strict"|"warn"|"ignore"|Param, // Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. // Default: "warn" - * extensions?: array, - * importmap_path?: scalar|null|Param, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php" - * importmap_polyfill?: scalar|null|Param, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims" - * importmap_script_attributes?: array, - * vendor_dir?: scalar|null|Param, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor" + * extensions?: array, + * importmap_path?: scalar|Param|null, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php" + * importmap_polyfill?: scalar|Param|null, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims" + * importmap_script_attributes?: array, + * vendor_dir?: scalar|Param|null, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor" * precompress?: bool|array{ // Precompress assets with Brotli, Zstandard and gzip. * enabled?: bool|Param, // Default: false - * formats?: list, - * extensions?: list, + * formats?: list, + * extensions?: list, * }, * }, * translator?: bool|array{ // Translator configuration * enabled?: bool|Param, // Default: true - * fallbacks?: list, + * fallbacks?: string|list, * logging?: bool|Param, // Default: false - * formatter?: scalar|null|Param, // Default: "translator.formatter.default" - * cache_dir?: scalar|null|Param, // Default: "%kernel.cache_dir%/translations" - * default_path?: scalar|null|Param, // The default path used to load translations. // Default: "%kernel.project_dir%/translations" - * paths?: list, + * formatter?: scalar|Param|null, // Default: "translator.formatter.default" + * cache_dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/translations" + * default_path?: scalar|Param|null, // The default path used to load translations. // Default: "%kernel.project_dir%/translations" + * paths?: list, * pseudo_localization?: bool|array{ * enabled?: bool|Param, // Default: false * accents?: bool|Param, // Default: true * expansion_factor?: float|Param, // Default: 1.0 * brackets?: bool|Param, // Default: true * parse_html?: bool|Param, // Default: false - * localizable_html_attributes?: list, + * localizable_html_attributes?: list, * }, * providers?: array, - * locales?: list, - * }>, + * dsn?: scalar|Param|null, + * domains?: list, + * locales?: list, + * }>, * globals?: array, - * domain?: string|Param, - * }>, + * value?: mixed, + * message?: string|Param, + * parameters?: array, + * domain?: string|Param, + * }>, * }, * validation?: bool|array{ // Validation configuration * enabled?: bool|Param, // Default: true * enable_attributes?: bool|Param, // Default: true - * static_method?: list, - * translation_domain?: scalar|null|Param, // Default: "validators" + * static_method?: string|list, + * translation_domain?: scalar|Param|null, // Default: "validators" * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict"|Param, // Default: "html5" * mapping?: array{ - * paths?: list, + * paths?: list, * }, * not_compromised_password?: bool|array{ * enabled?: bool|Param, // When disabled, compromised passwords will be accepted as valid. // Default: true - * endpoint?: scalar|null|Param, // API endpoint for the NotCompromisedPassword Validator. // Default: null + * endpoint?: scalar|Param|null, // API endpoint for the NotCompromisedPassword Validator. // Default: null * }, * disable_translation?: bool|Param, // Default: false * auto_mapping?: array, - * }>, + * services?: list, + * }>, * }, * serializer?: bool|array{ // Serializer configuration * enabled?: bool|Param, // Default: false * enable_attributes?: bool|Param, // Default: true - * name_converter?: scalar|null|Param, - * circular_reference_handler?: scalar|null|Param, - * max_depth_handler?: scalar|null|Param, + * name_converter?: scalar|Param|null, + * circular_reference_handler?: scalar|Param|null, + * max_depth_handler?: scalar|Param|null, * mapping?: array{ - * paths?: list, + * paths?: list, * }, - * default_context?: list, + * default_context?: array, * named_serializers?: array, - * include_built_in_normalizers?: bool|Param, // Whether to include the built-in normalizers // Default: true - * include_built_in_encoders?: bool|Param, // Whether to include the built-in encoders // Default: true - * }>, + * name_converter?: scalar|Param|null, + * default_context?: array, + * include_built_in_normalizers?: bool|Param, // Whether to include the built-in normalizers // Default: true + * include_built_in_encoders?: bool|Param, // Whether to include the built-in encoders // Default: true + * }>, * }, * property_access?: bool|array{ // Property access configuration * enabled?: bool|Param, // Default: true @@ -371,94 +371,94 @@ * }, * type_info?: bool|array{ // Type info configuration * enabled?: bool|Param, // Default: true - * aliases?: array, + * aliases?: array, * }, * property_info?: bool|array{ // Property info configuration * enabled?: bool|Param, // Default: true * with_constructor_extractor?: bool|Param, // Registers the constructor extractor. // Default: true * }, * cache?: array{ // Cache configuration - * prefix_seed?: scalar|null|Param, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%" - * app?: scalar|null|Param, // App related cache pools configuration. // Default: "cache.adapter.filesystem" - * system?: scalar|null|Param, // System related cache pools configuration. // Default: "cache.adapter.system" - * directory?: scalar|null|Param, // Default: "%kernel.share_dir%/pools/app" - * default_psr6_provider?: scalar|null|Param, - * default_redis_provider?: scalar|null|Param, // Default: "redis://localhost" - * default_valkey_provider?: scalar|null|Param, // Default: "valkey://localhost" - * default_memcached_provider?: scalar|null|Param, // Default: "memcached://localhost" - * default_doctrine_dbal_provider?: scalar|null|Param, // Default: "database_connection" - * default_pdo_provider?: scalar|null|Param, // Default: null + * prefix_seed?: scalar|Param|null, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%" + * app?: scalar|Param|null, // App related cache pools configuration. // Default: "cache.adapter.filesystem" + * system?: scalar|Param|null, // System related cache pools configuration. // Default: "cache.adapter.system" + * directory?: scalar|Param|null, // Default: "%kernel.share_dir%/pools/app" + * default_psr6_provider?: scalar|Param|null, + * default_redis_provider?: scalar|Param|null, // Default: "redis://localhost" + * default_valkey_provider?: scalar|Param|null, // Default: "valkey://localhost" + * default_memcached_provider?: scalar|Param|null, // Default: "memcached://localhost" + * default_doctrine_dbal_provider?: scalar|Param|null, // Default: "database_connection" + * default_pdo_provider?: scalar|Param|null, // Default: null * pools?: array, - * tags?: scalar|null|Param, // Default: null - * public?: bool|Param, // Default: false - * default_lifetime?: scalar|null|Param, // Default lifetime of the pool. - * provider?: scalar|null|Param, // Overwrite the setting from the default provider for this adapter. - * early_expiration_message_bus?: scalar|null|Param, - * clearer?: scalar|null|Param, - * }>, + * adapters?: string|list, + * tags?: scalar|Param|null, // Default: null + * public?: bool|Param, // Default: false + * default_lifetime?: scalar|Param|null, // Default lifetime of the pool. + * provider?: scalar|Param|null, // Overwrite the setting from the default provider for this adapter. + * early_expiration_message_bus?: scalar|Param|null, + * clearer?: scalar|Param|null, + * }>, * }, * php_errors?: array{ // PHP errors handling configuration * log?: mixed, // Use the application logger instead of the PHP logger for logging PHP errors. // Default: true * throw?: bool|Param, // Throw PHP errors as \ErrorException instances. // Default: true * }, * exceptions?: array, + * log_level?: scalar|Param|null, // The level of log message. Null to let Symfony decide. // Default: null + * status_code?: scalar|Param|null, // The status code of the response. Null or 0 to let Symfony decide. // Default: null + * log_channel?: scalar|Param|null, // The channel of log message. Null to let Symfony decide. // Default: null + * }>, * web_link?: bool|array{ // Web links configuration * enabled?: bool|Param, // Default: false * }, * lock?: bool|string|array{ // Lock configuration * enabled?: bool|Param, // Default: false - * resources?: array>, + * resources?: string|array>, * }, * semaphore?: bool|string|array{ // Semaphore configuration * enabled?: bool|Param, // Default: false - * resources?: array, + * resources?: string|array, * }, * messenger?: bool|array{ // Messenger configuration * enabled?: bool|Param, // Default: true - * routing?: array, - * }>, + * routing?: array, + * }>, * serializer?: array{ - * default_serializer?: scalar|null|Param, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" + * default_serializer?: scalar|Param|null, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" * symfony_serializer?: array{ - * format?: scalar|null|Param, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json" + * format?: scalar|Param|null, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json" * context?: array, * }, * }, * transports?: array, - * failure_transport?: scalar|null|Param, // Transport name to send failed messages to (after all retries have failed). // Default: null - * retry_strategy?: string|array{ - * service?: scalar|null|Param, // Service id to override the retry strategy entirely. // Default: null - * max_retries?: int|Param, // Default: 3 - * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 - * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2 - * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 - * jitter?: float|Param, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1 - * }, - * rate_limiter?: scalar|null|Param, // Rate limiter name to use when processing messages. // Default: null - * }>, - * failure_transport?: scalar|null|Param, // Transport name to send failed messages to (after all retries have failed). // Default: null - * stop_worker_on_signals?: list, - * default_bus?: scalar|null|Param, // Default: null + * dsn?: scalar|Param|null, + * serializer?: scalar|Param|null, // Service id of a custom serializer to use. // Default: null + * options?: array, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * retry_strategy?: string|array{ + * service?: scalar|Param|null, // Service id to override the retry strategy entirely. // Default: null + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1 + * }, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use when processing messages. // Default: null + * }>, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * stop_worker_on_signals?: int|string|list, + * default_bus?: scalar|Param|null, // Default: null * buses?: array, + * default_middleware?: bool|string|array{ + * enabled?: bool|Param, // Default: true + * allow_no_handlers?: bool|Param, // Default: false + * allow_no_senders?: bool|Param, // Default: true + * }, + * middleware?: string|list, + * }>, * }>, - * }>, * }, * scheduler?: bool|array{ // Scheduler configuration * enabled?: bool|Param, // Default: true @@ -471,29 +471,29 @@ * headers?: array, * vars?: array, * max_redirects?: int|Param, // The maximum number of redirects to follow. - * http_version?: scalar|null|Param, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. - * resolve?: array, - * proxy?: scalar|null|Param, // The URL of the proxy to pass requests through or null for automatic detection. - * no_proxy?: scalar|null|Param, // A comma separated list of hosts that do not require a proxy to be reached. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. - * bindto?: scalar|null|Param, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. - * cafile?: scalar|null|Param, // A certificate authority file. - * capath?: scalar|null|Param, // A directory that contains multiple certificate authority files. - * local_cert?: scalar|null|Param, // A PEM formatted certificate file. - * local_pk?: scalar|null|Param, // A private key file. - * passphrase?: scalar|null|Param, // The passphrase used to encrypt the "local_pk" file. - * ciphers?: scalar|null|Param, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). * sha1?: mixed, * pin-sha256?: mixed, * md5?: mixed, * }, - * crypto_method?: scalar|null|Param, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. * extra?: array, - * rate_limiter?: scalar|null|Param, // Rate limiter name to use for throttling requests. // Default: null + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null * caching?: bool|array{ // Caching configuration. * enabled?: bool|Param, // Default: false * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" @@ -502,11 +502,11 @@ * }, * retry_failed?: bool|array{ * enabled?: bool|Param, // Default: false - * retry_strategy?: scalar|null|Param, // service id to override the retry strategy. // Default: null - * http_codes?: array, - * }>, + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: int|string|array, + * }>, * max_retries?: int|Param, // Default: 3 * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 @@ -514,167 +514,167 @@ * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 * }, * }, - * mock_response_factory?: scalar|null|Param, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. + * mock_response_factory?: scalar|Param|null, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. * scoped_clients?: array, - * headers?: array, - * max_redirects?: int|Param, // The maximum number of redirects to follow. - * http_version?: scalar|null|Param, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. - * resolve?: array, - * proxy?: scalar|null|Param, // The URL of the proxy to pass requests through or null for automatic detection. - * no_proxy?: scalar|null|Param, // A comma separated list of hosts that do not require a proxy to be reached. - * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. - * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. - * bindto?: scalar|null|Param, // A network interface name, IP address, a host name or a UNIX socket to bind to. - * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. - * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. - * cafile?: scalar|null|Param, // A certificate authority file. - * capath?: scalar|null|Param, // A directory that contains multiple certificate authority files. - * local_cert?: scalar|null|Param, // A PEM formatted certificate file. - * local_pk?: scalar|null|Param, // A private key file. - * passphrase?: scalar|null|Param, // The passphrase used to encrypt the "local_pk" file. - * ciphers?: scalar|null|Param, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...). - * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). - * sha1?: mixed, - * pin-sha256?: mixed, - * md5?: mixed, - * }, - * crypto_method?: scalar|null|Param, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. - * extra?: array, - * rate_limiter?: scalar|null|Param, // Rate limiter name to use for throttling requests. // Default: null - * caching?: bool|array{ // Caching configuration. - * enabled?: bool|Param, // Default: false - * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" - * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true - * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null - * }, - * retry_failed?: bool|array{ - * enabled?: bool|Param, // Default: false - * retry_strategy?: scalar|null|Param, // service id to override the retry strategy. // Default: null - * http_codes?: array, - * }>, - * max_retries?: int|Param, // Default: 3 - * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 - * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 - * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 - * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 - * }, - * }>, + * scope?: scalar|Param|null, // The regular expression that the request URL must match before adding the other options. When none is provided, the base URI is used instead. + * base_uri?: scalar|Param|null, // The URI to resolve relative URLs, following rules in RFC 3985, section 2. + * auth_basic?: scalar|Param|null, // An HTTP Basic authentication "username:password". + * auth_bearer?: scalar|Param|null, // A token enabling HTTP Bearer authorization. + * auth_ntlm?: scalar|Param|null, // A "username:password" pair to use Microsoft NTLM authentication (requires the cURL extension). + * query?: array, + * headers?: array, + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...). + * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). + * sha1?: mixed, + * pin-sha256?: mixed, + * md5?: mixed, + * }, + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * extra?: array, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null + * caching?: bool|array{ // Caching configuration. + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * }, + * retry_failed?: bool|array{ + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: int|string|array, + * }>, + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * }, + * }>, * }, * mailer?: bool|array{ // Mailer configuration * enabled?: bool|Param, // Default: true - * message_bus?: scalar|null|Param, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null - * dsn?: scalar|null|Param, // Default: null - * transports?: array, + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * dsn?: scalar|Param|null, // Default: null + * transports?: array, * envelope?: array{ // Mailer Envelope configuration - * sender?: scalar|null|Param, - * recipients?: list, - * allowed_recipients?: list, + * sender?: scalar|Param|null, + * recipients?: string|list, + * allowed_recipients?: string|list, * }, * headers?: array, + * value?: mixed, + * }>, * dkim_signer?: bool|array{ // DKIM signer configuration * enabled?: bool|Param, // Default: false - * key?: scalar|null|Param, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: "" - * domain?: scalar|null|Param, // Default: "" - * select?: scalar|null|Param, // Default: "" - * passphrase?: scalar|null|Param, // The private key passphrase // Default: "" + * key?: scalar|Param|null, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: "" + * domain?: scalar|Param|null, // Default: "" + * select?: scalar|Param|null, // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: "" * options?: array, * }, * smime_signer?: bool|array{ // S/MIME signer configuration * enabled?: bool|Param, // Default: false - * key?: scalar|null|Param, // Path to key (in PEM format) // Default: "" - * certificate?: scalar|null|Param, // Path to certificate (in PEM format without the `file://` prefix) // Default: "" - * passphrase?: scalar|null|Param, // The private key passphrase // Default: null - * extra_certificates?: scalar|null|Param, // Default: null + * key?: scalar|Param|null, // Path to key (in PEM format) // Default: "" + * certificate?: scalar|Param|null, // Path to certificate (in PEM format without the `file://` prefix) // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: null + * extra_certificates?: scalar|Param|null, // Default: null * sign_options?: int|Param, // Default: null * }, * smime_encrypter?: bool|array{ // S/MIME encrypter configuration * enabled?: bool|Param, // Default: false - * repository?: scalar|null|Param, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: "" + * repository?: scalar|Param|null, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: "" * cipher?: int|Param, // A set of algorithms used to encrypt the message // Default: null * }, * }, * secrets?: bool|array{ * enabled?: bool|Param, // Default: true - * vault_directory?: scalar|null|Param, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%" - * local_dotenv_file?: scalar|null|Param, // Default: "%kernel.project_dir%/.env.%kernel.runtime_environment%.local" - * decryption_env_var?: scalar|null|Param, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET" + * vault_directory?: scalar|Param|null, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%" + * local_dotenv_file?: scalar|Param|null, // Default: "%kernel.project_dir%/.env.%kernel.environment%.local" + * decryption_env_var?: scalar|Param|null, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET" * }, * notifier?: bool|array{ // Notifier configuration * enabled?: bool|Param, // Default: true - * message_bus?: scalar|null|Param, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null - * chatter_transports?: array, - * texter_transports?: array, + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * chatter_transports?: array, + * texter_transports?: array, * notification_on_failed_messages?: bool|Param, // Default: false - * channel_policy?: array>, + * channel_policy?: array>, * admin_recipients?: list, + * email?: scalar|Param|null, + * phone?: scalar|Param|null, // Default: "" + * }>, * }, * rate_limiter?: bool|array{ // Rate limiter configuration * enabled?: bool|Param, // Default: true * limiters?: array, - * limit?: int|Param, // The maximum allowed hits in a fixed interval or burst. - * interval?: scalar|null|Param, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). - * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". - * interval?: scalar|null|Param, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). - * amount?: int|Param, // Amount of tokens to add each interval. // Default: 1 - * }, - * }>, + * lock_factory?: scalar|Param|null, // The service ID of the lock factory used by this limiter (or null to disable locking). // Default: "auto" + * cache_pool?: scalar|Param|null, // The cache pool to use for storing the current limiter state. // Default: "cache.rate_limiter" + * storage_service?: scalar|Param|null, // The service ID of a custom storage implementation, this precedes any configured "cache_pool". // Default: null + * policy?: "fixed_window"|"token_bucket"|"sliding_window"|"compound"|"no_limit"|Param, // The algorithm to be used by this limiter. + * limiters?: string|list, + * limit?: int|Param, // The maximum allowed hits in a fixed interval or burst. + * interval?: scalar|Param|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". + * interval?: scalar|Param|null, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * amount?: int|Param, // Amount of tokens to add each interval. // Default: 1 + * }, + * }>, * }, * uid?: bool|array{ // Uid configuration * enabled?: bool|Param, // Default: true * default_uuid_version?: 7|6|4|1|Param, // Default: 7 * name_based_uuid_version?: 5|3|Param, // Default: 5 - * name_based_uuid_namespace?: scalar|null|Param, + * name_based_uuid_namespace?: scalar|Param|null, * time_based_uuid_version?: 7|6|1|Param, // Default: 7 - * time_based_uuid_node?: scalar|null|Param, + * time_based_uuid_node?: scalar|Param|null, * }, * html_sanitizer?: bool|array{ // HtmlSanitizer configuration * enabled?: bool|Param, // Default: false * sanitizers?: array, - * block_elements?: list, - * drop_elements?: list, - * allow_attributes?: array, - * drop_attributes?: array, - * force_attributes?: array>, - * force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false - * allowed_link_schemes?: list, - * allowed_link_hosts?: list|null, - * allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false - * allowed_media_schemes?: list, - * allowed_media_hosts?: list|null, - * allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false - * with_attribute_sanitizers?: list, - * without_attribute_sanitizers?: list, - * max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0 - * }>, + * allow_safe_elements?: bool|Param, // Allows "safe" elements and attributes. // Default: false + * allow_static_elements?: bool|Param, // Allows all static elements and attributes from the W3C Sanitizer API standard. // Default: false + * allow_elements?: array, + * block_elements?: string|list, + * drop_elements?: string|list, + * allow_attributes?: array, + * drop_attributes?: array, + * force_attributes?: array>, + * force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false + * allowed_link_schemes?: string|list, + * allowed_link_hosts?: null|string|list, + * allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false + * allowed_media_schemes?: string|list, + * allowed_media_hosts?: null|string|list, + * allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false + * with_attribute_sanitizers?: string|list, + * without_attribute_sanitizers?: string|list, + * max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0 + * }>, * }, * webhook?: bool|array{ // Webhook configuration * enabled?: bool|Param, // Default: false - * message_bus?: scalar|null|Param, // The message bus to use. // Default: "messenger.default_bus" + * message_bus?: scalar|Param|null, // The message bus to use. // Default: "messenger.default_bus" * routing?: array, + * service?: scalar|Param|null, + * secret?: scalar|Param|null, // Default: "" + * }>, * }, * remote-event?: bool|array{ // RemoteEvent configuration * enabled?: bool|Param, // Default: false @@ -685,91 +685,91 @@ * } * @psalm-type DoctrineConfig = array{ * dbal?: array{ - * default_connection?: scalar|null|Param, + * default_connection?: scalar|Param|null, * types?: array, - * driver_schemes?: array, + * class?: scalar|Param|null, + * }>, + * driver_schemes?: array, * connections?: array, - * mapping_types?: array, - * default_table_options?: array, - * schema_manager_factory?: scalar|null|Param, // Default: "doctrine.dbal.default_schema_manager_factory" - * result_cache?: scalar|null|Param, - * replicas?: array, + * mapping_types?: array, + * default_table_options?: array, + * schema_manager_factory?: scalar|Param|null, // Default: "doctrine.dbal.default_schema_manager_factory" + * result_cache?: scalar|Param|null, + * replicas?: array, * }>, - * }>, * }, * orm?: array{ - * default_entity_manager?: scalar|null|Param, + * default_entity_manager?: scalar|Param|null, * enable_native_lazy_objects?: bool|Param, // Deprecated: The "enable_native_lazy_objects" option is deprecated and will be removed in DoctrineBundle 4.0, as native lazy objects are now always enabled. // Default: true * controller_resolver?: bool|array{ * enabled?: bool|Param, // Default: true @@ -777,489 +777,489 @@ * evict_cache?: bool|Param, // Set to true to fetch the entity from the database instead of using the cache, if any // Default: false * }, * entity_managers?: array, + * }>, * }>, - * }>, - * }>, - * }, - * connection?: scalar|null|Param, - * class_metadata_factory_name?: scalar|null|Param, // Default: "Doctrine\\ORM\\Mapping\\ClassMetadataFactory" - * default_repository_class?: scalar|null|Param, // Default: "Doctrine\\ORM\\EntityRepository" - * auto_mapping?: scalar|null|Param, // Default: false - * naming_strategy?: scalar|null|Param, // Default: "doctrine.orm.naming_strategy.default" - * quote_strategy?: scalar|null|Param, // Default: "doctrine.orm.quote_strategy.default" - * typed_field_mapper?: scalar|null|Param, // Default: "doctrine.orm.typed_field_mapper.default" - * entity_listener_resolver?: scalar|null|Param, // Default: null - * fetch_mode_subselect_batch_size?: scalar|null|Param, - * repository_factory?: scalar|null|Param, // Default: "doctrine.orm.container_repository_factory" - * schema_ignore_classes?: list, - * validate_xml_mapping?: bool|Param, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.14 and will be mandatory in ORM 3.0. See https://github.com/doctrine/orm/pull/6728. // Default: false - * second_level_cache?: array{ - * region_cache_driver?: string|array{ - * type?: scalar|null|Param, // Default: null - * id?: scalar|null|Param, - * pool?: scalar|null|Param, * }, - * region_lock_lifetime?: scalar|null|Param, // Default: 60 - * log_enabled?: bool|Param, // Default: true - * region_lifetime?: scalar|null|Param, // Default: 3600 - * enabled?: bool|Param, // Default: true - * factory?: scalar|null|Param, - * regions?: array, + * validate_xml_mapping?: bool|Param, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.14 and will be mandatory in ORM 3.0. See https://github.com/doctrine/orm/pull/6728. // Default: false + * second_level_cache?: array{ + * region_cache_driver?: string|array{ + * type?: scalar|Param|null, // Default: null + * id?: scalar|Param|null, + * pool?: scalar|Param|null, * }, - * lock_path?: scalar|null|Param, // Default: "%kernel.cache_dir%/doctrine/orm/slc/filelock" - * lock_lifetime?: scalar|null|Param, // Default: 60 - * type?: scalar|null|Param, // Default: "default" - * lifetime?: scalar|null|Param, // Default: 0 - * service?: scalar|null|Param, - * name?: scalar|null|Param, - * }>, - * loggers?: array, - * }, - * hydrators?: array, - * mappings?: array, - * dql?: array{ - * string_functions?: array, - * numeric_functions?: array, - * datetime_functions?: array, - * }, - * filters?: array, + * region_lock_lifetime?: scalar|Param|null, // Default: 60 + * log_enabled?: bool|Param, // Default: true + * region_lifetime?: scalar|Param|null, // Default: 3600 + * enabled?: bool|Param, // Default: true + * factory?: scalar|Param|null, + * regions?: array, + * loggers?: array, + * }, + * hydrators?: array, + * mappings?: array, + * dql?: array{ + * string_functions?: array, + * numeric_functions?: array, + * datetime_functions?: array, + * }, + * filters?: array, + * }>, + * identity_generation_preferences?: array, * }>, - * identity_generation_preferences?: array, - * }>, - * resolve_target_entities?: array, + * resolve_target_entities?: array, * }, * } * @psalm-type DoctrineMigrationsConfig = array{ * enable_service_migrations?: bool|Param, // Whether to enable fetching migrations from the service container. // Default: false - * migrations_paths?: array, - * services?: array, - * factories?: array, + * migrations_paths?: array, + * services?: array, + * factories?: array, * storage?: array{ // Storage to use for migration status metadata. * table_storage?: array{ // The default metadata storage, implemented as a table in the database. - * table_name?: scalar|null|Param, // Default: null - * version_column_name?: scalar|null|Param, // Default: null - * version_column_length?: scalar|null|Param, // Default: null - * executed_at_column_name?: scalar|null|Param, // Default: null - * execution_time_column_name?: scalar|null|Param, // Default: null + * table_name?: scalar|Param|null, // Default: null + * version_column_name?: scalar|Param|null, // Default: null + * version_column_length?: scalar|Param|null, // Default: null + * executed_at_column_name?: scalar|Param|null, // Default: null + * execution_time_column_name?: scalar|Param|null, // Default: null * }, * }, - * migrations?: list, - * connection?: scalar|null|Param, // Connection name to use for the migrations database. // Default: null - * em?: scalar|null|Param, // Entity manager name to use for the migrations database (available when doctrine/orm is installed). // Default: null - * all_or_nothing?: scalar|null|Param, // Run all migrations in a transaction. // Default: false - * check_database_platform?: scalar|null|Param, // Adds an extra check in the generated migrations to allow execution only on the same platform as they were initially generated on. // Default: true - * custom_template?: scalar|null|Param, // Custom template path for generated migration classes. // Default: null - * organize_migrations?: scalar|null|Param, // Organize migrations mode. Possible values are: "BY_YEAR", "BY_YEAR_AND_MONTH", false // Default: false + * migrations?: list, + * connection?: scalar|Param|null, // Connection name to use for the migrations database. // Default: null + * em?: scalar|Param|null, // Entity manager name to use for the migrations database (available when doctrine/orm is installed). // Default: null + * all_or_nothing?: scalar|Param|null, // Run all migrations in a transaction. // Default: false + * check_database_platform?: scalar|Param|null, // Adds an extra check in the generated migrations to allow execution only on the same platform as they were initially generated on. // Default: true + * custom_template?: scalar|Param|null, // Custom template path for generated migration classes. // Default: null + * organize_migrations?: scalar|Param|null, // Organize migrations mode. Possible values are: "BY_YEAR", "BY_YEAR_AND_MONTH", false // Default: false * enable_profiler?: bool|Param, // Whether or not to enable the profiler collector to calculate and visualize migration status. This adds some queries overhead. // Default: false * transactional?: bool|Param, // Whether or not to wrap migrations in a single transaction. // Default: true * } * @psalm-type TwigConfig = array{ - * form_themes?: list, + * form_themes?: list, * globals?: array, - * autoescape_service?: scalar|null|Param, // Default: null - * autoescape_service_method?: scalar|null|Param, // Default: null - * cache?: scalar|null|Param, // Default: true - * charset?: scalar|null|Param, // Default: "%kernel.charset%" + * id?: scalar|Param|null, + * type?: scalar|Param|null, + * value?: mixed, + * }>, + * autoescape_service?: scalar|Param|null, // Default: null + * autoescape_service_method?: scalar|Param|null, // Default: null + * cache?: scalar|Param|null, // Default: true + * charset?: scalar|Param|null, // Default: "%kernel.charset%" * debug?: bool|Param, // Default: "%kernel.debug%" * strict_variables?: bool|Param, // Default: "%kernel.debug%" - * auto_reload?: scalar|null|Param, + * auto_reload?: scalar|Param|null, * optimizations?: int|Param, - * default_path?: scalar|null|Param, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" - * file_name_pattern?: list, + * default_path?: scalar|Param|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" + * file_name_pattern?: string|list, * paths?: array, * date?: array{ // The default format options used by the date filter. - * format?: scalar|null|Param, // Default: "F j, Y H:i" - * interval_format?: scalar|null|Param, // Default: "%d days" - * timezone?: scalar|null|Param, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null + * format?: scalar|Param|null, // Default: "F j, Y H:i" + * interval_format?: scalar|Param|null, // Default: "%d days" + * timezone?: scalar|Param|null, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null * }, * number_format?: array{ // The default format options for the number_format filter. * decimals?: int|Param, // Default: 0 - * decimal_point?: scalar|null|Param, // Default: "." - * thousands_separator?: scalar|null|Param, // Default: "," + * decimal_point?: scalar|Param|null, // Default: "." + * thousands_separator?: scalar|Param|null, // Default: "," * }, * mailer?: array{ - * html_to_text_converter?: scalar|null|Param, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null + * html_to_text_converter?: scalar|Param|null, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null * }, * } * @psalm-type SecurityConfig = array{ - * access_denied_url?: scalar|null|Param, // Default: null + * access_denied_url?: scalar|Param|null, // Default: null * session_fixation_strategy?: "none"|"migrate"|"invalidate"|Param, // Default: "migrate" * expose_security_errors?: \Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::None|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::AccountStatus|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::All|Param, // Default: "none" * erase_credentials?: bool|Param, // Default: true * access_decision_manager?: array{ * strategy?: "affirmative"|"consensus"|"unanimous"|"priority"|Param, - * service?: scalar|null|Param, - * strategy_service?: scalar|null|Param, + * service?: scalar|Param|null, + * strategy_service?: scalar|Param|null, * allow_if_all_abstain?: bool|Param, // Default: false * allow_if_equal_granted_denied?: bool|Param, // Default: true * }, * password_hashers?: array, - * hash_algorithm?: scalar|null|Param, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" - * key_length?: scalar|null|Param, // Default: 40 - * ignore_case?: bool|Param, // Default: false - * encode_as_base64?: bool|Param, // Default: true - * iterations?: scalar|null|Param, // Default: 5000 - * cost?: int|Param, // Default: null - * memory_cost?: scalar|null|Param, // Default: null - * time_cost?: scalar|null|Param, // Default: null - * id?: scalar|null|Param, - * }>, + * algorithm?: scalar|Param|null, + * migrate_from?: string|list, + * hash_algorithm?: scalar|Param|null, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" + * key_length?: scalar|Param|null, // Default: 40 + * ignore_case?: bool|Param, // Default: false + * encode_as_base64?: bool|Param, // Default: true + * iterations?: scalar|Param|null, // Default: 5000 + * cost?: int|Param, // Default: null + * memory_cost?: scalar|Param|null, // Default: null + * time_cost?: scalar|Param|null, // Default: null + * id?: scalar|Param|null, + * }>, * providers?: array, - * }, - * entity?: array{ - * class: scalar|null|Param, // The full entity class name of your user class. - * property?: scalar|null|Param, // Default: null - * manager_name?: scalar|null|Param, // Default: null - * }, - * memory?: array{ - * users?: array, - * }>, - * }, - * ldap?: array{ - * service: scalar|null|Param, - * base_dn: scalar|null|Param, - * search_dn?: scalar|null|Param, // Default: null - * search_password?: scalar|null|Param, // Default: null - * extra_fields?: list, - * default_roles?: list, - * role_fetcher?: scalar|null|Param, // Default: null - * uid_key?: scalar|null|Param, // Default: "sAMAccountName" - * filter?: scalar|null|Param, // Default: "({uid_key}={user_identifier})" - * password_attribute?: scalar|null|Param, // Default: null - * }, - * }>, - * firewalls: array, - * security?: bool|Param, // Default: true - * user_checker?: scalar|null|Param, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" - * request_matcher?: scalar|null|Param, - * access_denied_url?: scalar|null|Param, - * access_denied_handler?: scalar|null|Param, - * entry_point?: scalar|null|Param, // An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface". - * provider?: scalar|null|Param, - * stateless?: bool|Param, // Default: false - * lazy?: bool|Param, // Default: false - * context?: scalar|null|Param, - * logout?: array{ - * enable_csrf?: bool|null|Param, // Default: null - * csrf_token_id?: scalar|null|Param, // Default: "logout" - * csrf_parameter?: scalar|null|Param, // Default: "_csrf_token" - * csrf_token_manager?: scalar|null|Param, - * path?: scalar|null|Param, // Default: "/logout" - * target?: scalar|null|Param, // Default: "/" - * invalidate_session?: bool|Param, // Default: true - * clear_site_data?: list<"*"|"cache"|"cookies"|"storage"|"executionContexts"|Param>, - * delete_cookies?: array, - * }, - * switch_user?: array{ - * provider?: scalar|null|Param, - * parameter?: scalar|null|Param, // Default: "_switch_user" - * role?: scalar|null|Param, // Default: "ROLE_ALLOWED_TO_SWITCH" - * target_route?: scalar|null|Param, // Default: null - * }, - * required_badges?: list, - * custom_authenticators?: list, - * login_throttling?: array{ - * limiter?: scalar|null|Param, // A service id implementing "Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface". - * max_attempts?: int|Param, // Default: 5 - * interval?: scalar|null|Param, // Default: "1 minute" - * lock_factory?: scalar|null|Param, // The service ID of the lock factory used by the login rate limiter (or null to disable locking). // Default: null - * cache_pool?: string|Param, // The cache pool to use for storing the limiter state // Default: "cache.rate_limiter" - * storage_service?: string|Param, // The service ID of a custom storage implementation, this precedes any configured "cache_pool" // Default: null - * }, - * x509?: array{ - * provider?: scalar|null|Param, - * user?: scalar|null|Param, // Default: "SSL_CLIENT_S_DN_Email" - * credentials?: scalar|null|Param, // Default: "SSL_CLIENT_S_DN" - * user_identifier?: scalar|null|Param, // Default: "emailAddress" - * }, - * remote_user?: array{ - * provider?: scalar|null|Param, - * user?: scalar|null|Param, // Default: "REMOTE_USER" - * }, - * login_link?: array{ - * check_route: scalar|null|Param, // Route that will validate the login link - e.g. "app_login_link_verify". - * check_post_only?: scalar|null|Param, // If true, only HTTP POST requests to "check_route" will be handled by the authenticator. // Default: false - * signature_properties: list, - * lifetime?: int|Param, // The lifetime of the login link in seconds. // Default: 600 - * max_uses?: int|Param, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null - * used_link_cache?: scalar|null|Param, // Cache service id used to expired links of max_uses is set. - * success_handler?: scalar|null|Param, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. - * failure_handler?: scalar|null|Param, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface. - * provider?: scalar|null|Param, // The user provider to load users from. - * secret?: scalar|null|Param, // Default: "%kernel.secret%" - * always_use_default_target_path?: bool|Param, // Default: false - * default_target_path?: scalar|null|Param, // Default: "/" - * login_path?: scalar|null|Param, // Default: "/login" - * target_path_parameter?: scalar|null|Param, // Default: "_target_path" - * use_referer?: bool|Param, // Default: false - * failure_path?: scalar|null|Param, // Default: null - * failure_forward?: bool|Param, // Default: false - * failure_path_parameter?: scalar|null|Param, // Default: "_failure_path" - * }, - * form_login?: array{ - * provider?: scalar|null|Param, - * remember_me?: bool|Param, // Default: true - * success_handler?: scalar|null|Param, - * failure_handler?: scalar|null|Param, - * check_path?: scalar|null|Param, // Default: "/login_check" - * use_forward?: bool|Param, // Default: false - * login_path?: scalar|null|Param, // Default: "/login" - * username_parameter?: scalar|null|Param, // Default: "_username" - * password_parameter?: scalar|null|Param, // Default: "_password" - * csrf_parameter?: scalar|null|Param, // Default: "_csrf_token" - * csrf_token_id?: scalar|null|Param, // Default: "authenticate" - * enable_csrf?: bool|Param, // Default: false - * post_only?: bool|Param, // Default: true - * form_only?: bool|Param, // Default: false - * always_use_default_target_path?: bool|Param, // Default: false - * default_target_path?: scalar|null|Param, // Default: "/" - * target_path_parameter?: scalar|null|Param, // Default: "_target_path" - * use_referer?: bool|Param, // Default: false - * failure_path?: scalar|null|Param, // Default: null - * failure_forward?: bool|Param, // Default: false - * failure_path_parameter?: scalar|null|Param, // Default: "_failure_path" - * }, - * form_login_ldap?: array{ - * provider?: scalar|null|Param, - * remember_me?: bool|Param, // Default: true - * success_handler?: scalar|null|Param, - * failure_handler?: scalar|null|Param, - * check_path?: scalar|null|Param, // Default: "/login_check" - * use_forward?: bool|Param, // Default: false - * login_path?: scalar|null|Param, // Default: "/login" - * username_parameter?: scalar|null|Param, // Default: "_username" - * password_parameter?: scalar|null|Param, // Default: "_password" - * csrf_parameter?: scalar|null|Param, // Default: "_csrf_token" - * csrf_token_id?: scalar|null|Param, // Default: "authenticate" - * enable_csrf?: bool|Param, // Default: false - * post_only?: bool|Param, // Default: true - * form_only?: bool|Param, // Default: false - * always_use_default_target_path?: bool|Param, // Default: false - * default_target_path?: scalar|null|Param, // Default: "/" - * target_path_parameter?: scalar|null|Param, // Default: "_target_path" - * use_referer?: bool|Param, // Default: false - * failure_path?: scalar|null|Param, // Default: null - * failure_forward?: bool|Param, // Default: false - * failure_path_parameter?: scalar|null|Param, // Default: "_failure_path" - * service?: scalar|null|Param, // Default: "ldap" - * dn_string?: scalar|null|Param, // Default: "{user_identifier}" - * query_string?: scalar|null|Param, - * search_dn?: scalar|null|Param, // Default: "" - * search_password?: scalar|null|Param, // Default: "" - * }, - * json_login?: array{ - * provider?: scalar|null|Param, - * remember_me?: bool|Param, // Default: true - * success_handler?: scalar|null|Param, - * failure_handler?: scalar|null|Param, - * check_path?: scalar|null|Param, // Default: "/login_check" - * use_forward?: bool|Param, // Default: false - * login_path?: scalar|null|Param, // Default: "/login" - * username_path?: scalar|null|Param, // Default: "username" - * password_path?: scalar|null|Param, // Default: "password" - * }, - * json_login_ldap?: array{ - * provider?: scalar|null|Param, - * remember_me?: bool|Param, // Default: true - * success_handler?: scalar|null|Param, - * failure_handler?: scalar|null|Param, - * check_path?: scalar|null|Param, // Default: "/login_check" - * use_forward?: bool|Param, // Default: false - * login_path?: scalar|null|Param, // Default: "/login" - * username_path?: scalar|null|Param, // Default: "username" - * password_path?: scalar|null|Param, // Default: "password" - * service?: scalar|null|Param, // Default: "ldap" - * dn_string?: scalar|null|Param, // Default: "{user_identifier}" - * query_string?: scalar|null|Param, - * search_dn?: scalar|null|Param, // Default: "" - * search_password?: scalar|null|Param, // Default: "" - * }, - * access_token?: array{ - * provider?: scalar|null|Param, - * remember_me?: bool|Param, // Default: true - * success_handler?: scalar|null|Param, - * failure_handler?: scalar|null|Param, - * realm?: scalar|null|Param, // Default: null - * token_extractors?: list, - * token_handler: string|array{ - * id?: scalar|null|Param, - * oidc_user_info?: string|array{ - * base_uri: scalar|null|Param, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). - * discovery?: array{ // Enable the OIDC discovery. - * cache?: array{ - * id: scalar|null|Param, // Cache service id to use to cache the OIDC discovery configuration. + * id?: scalar|Param|null, + * chain?: array{ + * providers?: string|list, + * }, + * entity?: array{ + * class?: scalar|Param|null, // The full entity class name of your user class. + * property?: scalar|Param|null, // Default: null + * manager_name?: scalar|Param|null, // Default: null + * }, + * memory?: array{ + * users?: array, + * }>, + * }, + * ldap?: array{ + * service?: scalar|Param|null, + * base_dn?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: null + * search_password?: scalar|Param|null, // Default: null + * extra_fields?: list, + * default_roles?: string|list, + * role_fetcher?: scalar|Param|null, // Default: null + * uid_key?: scalar|Param|null, // Default: "sAMAccountName" + * filter?: scalar|Param|null, // Default: "({uid_key}={user_identifier})" + * password_attribute?: scalar|Param|null, // Default: null + * }, + * }>, + * firewalls?: array, + * security?: bool|Param, // Default: true + * user_checker?: scalar|Param|null, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" + * request_matcher?: scalar|Param|null, + * access_denied_url?: scalar|Param|null, + * access_denied_handler?: scalar|Param|null, + * entry_point?: scalar|Param|null, // An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface". + * provider?: scalar|Param|null, + * stateless?: bool|Param, // Default: false + * lazy?: bool|Param, // Default: false + * context?: scalar|Param|null, + * logout?: array{ + * enable_csrf?: bool|Param|null, // Default: null + * csrf_token_id?: scalar|Param|null, // Default: "logout" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_manager?: scalar|Param|null, + * path?: scalar|Param|null, // Default: "/logout" + * target?: scalar|Param|null, // Default: "/" + * invalidate_session?: bool|Param, // Default: true + * clear_site_data?: string|list<"*"|"cache"|"cookies"|"storage"|"executionContexts"|Param>, + * delete_cookies?: string|array, + * }, + * switch_user?: array{ + * provider?: scalar|Param|null, + * parameter?: scalar|Param|null, // Default: "_switch_user" + * role?: scalar|Param|null, // Default: "ROLE_ALLOWED_TO_SWITCH" + * target_route?: scalar|Param|null, // Default: null + * }, + * required_badges?: list, + * custom_authenticators?: list, + * login_throttling?: array{ + * limiter?: scalar|Param|null, // A service id implementing "Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface". + * max_attempts?: int|Param, // Default: 5 + * interval?: scalar|Param|null, // Default: "1 minute" + * lock_factory?: scalar|Param|null, // The service ID of the lock factory used by the login rate limiter (or null to disable locking). // Default: null + * cache_pool?: string|Param, // The cache pool to use for storing the limiter state // Default: "cache.rate_limiter" + * storage_service?: string|Param, // The service ID of a custom storage implementation, this precedes any configured "cache_pool" // Default: null + * }, + * x509?: array{ + * provider?: scalar|Param|null, + * user?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN_Email" + * credentials?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN" + * user_identifier?: scalar|Param|null, // Default: "emailAddress" + * }, + * remote_user?: array{ + * provider?: scalar|Param|null, + * user?: scalar|Param|null, // Default: "REMOTE_USER" + * }, + * login_link?: array{ + * check_route?: scalar|Param|null, // Route that will validate the login link - e.g. "app_login_link_verify". + * check_post_only?: scalar|Param|null, // If true, only HTTP POST requests to "check_route" will be handled by the authenticator. // Default: false + * signature_properties?: list, + * lifetime?: int|Param, // The lifetime of the login link in seconds. // Default: 600 + * max_uses?: int|Param, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null + * used_link_cache?: scalar|Param|null, // Cache service id used to expired links of max_uses is set. + * success_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. + * failure_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface. + * provider?: scalar|Param|null, // The user provider to load users from. + * secret?: scalar|Param|null, // Default: "%kernel.secret%" + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * login_path?: scalar|Param|null, // Default: "/login" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * }, + * form_login?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_parameter?: scalar|Param|null, // Default: "_username" + * password_parameter?: scalar|Param|null, // Default: "_password" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_id?: scalar|Param|null, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * }, + * form_login_ldap?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_parameter?: scalar|Param|null, // Default: "_username" + * password_parameter?: scalar|Param|null, // Default: "_password" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_id?: scalar|Param|null, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * json_login?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_path?: scalar|Param|null, // Default: "username" + * password_path?: scalar|Param|null, // Default: "password" + * }, + * json_login_ldap?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_path?: scalar|Param|null, // Default: "username" + * password_path?: scalar|Param|null, // Default: "password" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * access_token?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: null + * token_extractors?: string|list, + * token_handler?: string|array{ + * id?: scalar|Param|null, + * oidc_user_info?: string|array{ + * base_uri?: scalar|Param|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). + * discovery?: array{ // Enable the OIDC discovery. + * cache?: array{ + * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * }, * }, + * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub" + * client?: scalar|Param|null, // HttpClient service id to use to call the OIDC server. * }, - * claim?: scalar|null|Param, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub" - * client?: scalar|null|Param, // HttpClient service id to use to call the OIDC server. - * }, - * oidc?: array{ - * discovery?: array{ // Enable the OIDC discovery. - * base_uri: list, - * cache?: array{ - * id: scalar|null|Param, // Cache service id to use to cache the OIDC discovery configuration. + * oidc?: array{ + * discovery?: array{ // Enable the OIDC discovery. + * base_uri?: string|list, + * cache?: array{ + * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * }, + * }, + * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub" + * audience?: scalar|Param|null, // Audience set in the token, for validation purpose. + * issuers?: list, + * algorithms?: list, + * keyset?: scalar|Param|null, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys). + * encryption?: bool|array{ + * enabled?: bool|Param, // Default: false + * enforce?: bool|Param, // When enabled, the token shall be encrypted. // Default: false + * algorithms?: list, + * keyset?: scalar|Param|null, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). * }, * }, - * claim?: scalar|null|Param, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub" - * audience: scalar|null|Param, // Audience set in the token, for validation purpose. - * issuers: list, - * algorithms: list, - * keyset?: scalar|null|Param, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys). - * encryption?: bool|array{ - * enabled?: bool|Param, // Default: false - * enforce?: bool|Param, // When enabled, the token shall be encrypted. // Default: false - * algorithms: list, - * keyset: scalar|null|Param, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). + * cas?: array{ + * validation_url?: scalar|Param|null, // CAS server validation URL + * prefix?: scalar|Param|null, // CAS prefix // Default: "cas" + * http_client?: scalar|Param|null, // HTTP Client service // Default: null * }, + * oauth2?: scalar|Param|null, * }, - * cas?: array{ - * validation_url: scalar|null|Param, // CAS server validation URL - * prefix?: scalar|null|Param, // CAS prefix // Default: "cas" - * http_client?: scalar|null|Param, // HTTP Client service // Default: null - * }, - * oauth2?: scalar|null|Param, * }, - * }, - * http_basic?: array{ - * provider?: scalar|null|Param, - * realm?: scalar|null|Param, // Default: "Secured Area" - * }, - * http_basic_ldap?: array{ - * provider?: scalar|null|Param, - * realm?: scalar|null|Param, // Default: "Secured Area" - * service?: scalar|null|Param, // Default: "ldap" - * dn_string?: scalar|null|Param, // Default: "{user_identifier}" - * query_string?: scalar|null|Param, - * search_dn?: scalar|null|Param, // Default: "" - * search_password?: scalar|null|Param, // Default: "" - * }, - * remember_me?: array{ - * secret?: scalar|null|Param, // Default: "%kernel.secret%" - * service?: scalar|null|Param, - * user_providers?: list, - * catch_exceptions?: bool|Param, // Default: true - * signature_properties?: list, - * token_provider?: string|array{ - * service?: scalar|null|Param, // The service ID of a custom remember-me token provider. - * doctrine?: bool|array{ - * enabled?: bool|Param, // Default: false - * connection?: scalar|null|Param, // Default: null + * http_basic?: array{ + * provider?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: "Secured Area" + * }, + * http_basic_ldap?: array{ + * provider?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: "Secured Area" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * remember_me?: array{ + * secret?: scalar|Param|null, // Default: "%kernel.secret%" + * service?: scalar|Param|null, + * user_providers?: string|list, + * catch_exceptions?: bool|Param, // Default: true + * signature_properties?: list, + * token_provider?: string|array{ + * service?: scalar|Param|null, // The service ID of a custom remember-me token provider. + * doctrine?: bool|array{ + * enabled?: bool|Param, // Default: false + * connection?: scalar|Param|null, // Default: null + * }, * }, + * token_verifier?: scalar|Param|null, // The service ID of a custom rememberme token verifier. + * name?: scalar|Param|null, // Default: "REMEMBERME" + * lifetime?: int|Param, // Default: 31536000 + * path?: scalar|Param|null, // Default: "/" + * domain?: scalar|Param|null, // Default: null + * secure?: true|false|"auto"|Param, // Default: null + * httponly?: bool|Param, // Default: true + * samesite?: null|"lax"|"strict"|"none"|Param, // Default: "strict" + * always_remember_me?: bool|Param, // Default: false + * remember_me_parameter?: scalar|Param|null, // Default: "_remember_me" * }, - * token_verifier?: scalar|null|Param, // The service ID of a custom rememberme token verifier. - * name?: scalar|null|Param, // Default: "REMEMBERME" - * lifetime?: int|Param, // Default: 31536000 - * path?: scalar|null|Param, // Default: "/" - * domain?: scalar|null|Param, // Default: null - * secure?: true|false|"auto"|Param, // Default: null - * httponly?: bool|Param, // Default: true - * samesite?: null|"lax"|"strict"|"none"|Param, // Default: "strict" - * always_remember_me?: bool|Param, // Default: false - * remember_me_parameter?: scalar|null|Param, // Default: "_remember_me" - * }, - * }>, + * }>, * access_control?: list, - * attributes?: array, - * route?: scalar|null|Param, // Default: null - * methods?: list, - * allow_if?: scalar|null|Param, // Default: null - * roles?: list, - * }>, - * role_hierarchy?: array>, + * request_matcher?: scalar|Param|null, // Default: null + * requires_channel?: scalar|Param|null, // Default: null + * path?: scalar|Param|null, // Use the urldecoded format. // Default: null + * host?: scalar|Param|null, // Default: null + * port?: int|Param, // Default: null + * ips?: string|list, + * attributes?: array, + * route?: scalar|Param|null, // Default: null + * methods?: string|list, + * allow_if?: scalar|Param|null, // Default: null + * roles?: string|list, + * }>, + * role_hierarchy?: array>, * } * @psalm-type KnpMenuConfig = array{ * providers?: array{ * builder_alias?: bool|Param, // Default: true * }, * twig?: array{ - * template?: scalar|null|Param, // Default: "@KnpMenu/menu.html.twig" + * template?: scalar|Param|null, // Default: "@KnpMenu/menu.html.twig" * }, * templating?: bool|Param, // Default: false - * default_renderer?: scalar|null|Param, // Default: "twig" + * default_renderer?: scalar|Param|null, // Default: "twig" * } * @psalm-type KnpPaginatorConfig = array{ * default_options?: array{ - * sort_field_name?: scalar|null|Param, // Default: "sort" - * sort_direction_name?: scalar|null|Param, // Default: "direction" - * filter_field_name?: scalar|null|Param, // Default: "filterField" - * filter_value_name?: scalar|null|Param, // Default: "filterValue" - * page_name?: scalar|null|Param, // Default: "page" + * sort_field_name?: scalar|Param|null, // Default: "sort" + * sort_direction_name?: scalar|Param|null, // Default: "direction" + * filter_field_name?: scalar|Param|null, // Default: "filterField" + * filter_value_name?: scalar|Param|null, // Default: "filterValue" + * page_name?: scalar|Param|null, // Default: "page" * distinct?: bool|Param, // Default: true - * page_out_of_range?: scalar|null|Param, // Default: "ignore" - * default_limit?: scalar|null|Param, // Default: 10 + * page_out_of_range?: scalar|Param|null, // Default: "ignore" + * default_limit?: scalar|Param|null, // Default: 10 * }, * template?: array{ - * pagination?: scalar|null|Param, // Default: "@KnpPaginator/Pagination/sliding.html.twig" - * rel_links?: scalar|null|Param, // Default: "@KnpPaginator/Pagination/rel_links.html.twig" - * filtration?: scalar|null|Param, // Default: "@KnpPaginator/Pagination/filtration.html.twig" - * sortable?: scalar|null|Param, // Default: "@KnpPaginator/Pagination/sortable_link.html.twig" + * pagination?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/sliding.html.twig" + * rel_links?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/rel_links.html.twig" + * filtration?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/filtration.html.twig" + * sortable?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/sortable_link.html.twig" * }, - * page_range?: scalar|null|Param, // Default: 5 - * page_limit?: scalar|null|Param, // Default: null + * page_range?: scalar|Param|null, // Default: 5 + * page_limit?: scalar|Param|null, // Default: null * convert_exception?: bool|Param, // Default: false * remove_first_page_param?: bool|Param, // Default: false * } @@ -1287,9 +1287,9 @@ * }, * commonmark?: array{ * renderer?: array{ // Array of options for rendering HTML. - * block_separator?: scalar|null|Param, - * inner_separator?: scalar|null|Param, - * soft_break?: scalar|null|Param, + * block_separator?: scalar|Param|null, + * inner_separator?: scalar|Param|null, + * soft_break?: scalar|Param|null, * }, * html_input?: "strip"|"allow"|"escape"|Param, // How to handle HTML input. * allow_unsafe_links?: bool|Param, // Remove risky link and image URLs by setting this to false. // Default: true @@ -1305,13 +1305,13 @@ * enable_strong?: bool|Param, // Default: true * use_asterisk?: bool|Param, // Default: true * use_underscore?: bool|Param, // Default: true - * unordered_list_markers?: list, + * unordered_list_markers?: list, * }, - * ... + * ... * }, * } * @psalm-type MakerConfig = array{ - * root_namespace?: scalar|null|Param, // Default: "App" + * root_namespace?: scalar|Param|null, // Default: "App" * generate_final_classes?: bool|Param, // Default: true * generate_final_entities?: bool|Param, // Default: false * } @@ -1321,184 +1321,300 @@ * ajax_replace?: bool|Param, // Replace toolbar on AJAX requests // Default: false * }, * intercept_redirects?: bool|Param, // Default: false - * excluded_ajax_paths?: scalar|null|Param, // Default: "^/((index|app(_[\\w]+)?)\\.php/)?_wdt" + * excluded_ajax_paths?: scalar|Param|null, // Default: "^/((index|app(_[\\w]+)?)\\.php/)?_wdt" * } * @psalm-type NelmioCorsConfig = array{ * defaults?: array{ * allow_credentials?: bool|Param, // Default: false - * allow_origin?: list, - * allow_headers?: list, - * allow_methods?: list, + * allow_origin?: list, + * allow_headers?: list, + * allow_methods?: list, * allow_private_network?: bool|Param, // Default: false - * expose_headers?: list, - * max_age?: scalar|null|Param, // Default: 0 - * hosts?: list, + * expose_headers?: list, + * max_age?: scalar|Param|null, // Default: 0 + * hosts?: list, * origin_regex?: bool|Param, // Default: false - * forced_allow_origin_value?: scalar|null|Param, // Default: null + * forced_allow_origin_value?: scalar|Param|null, // Default: null * skip_same_as_origin?: bool|Param, // Default: true * }, * paths?: array, - * allow_headers?: list, - * allow_methods?: list, - * allow_private_network?: bool|Param, - * expose_headers?: list, - * max_age?: scalar|null|Param, // Default: 0 - * hosts?: list, - * origin_regex?: bool|Param, - * forced_allow_origin_value?: scalar|null|Param, // Default: null - * skip_same_as_origin?: bool|Param, - * }>, + * allow_credentials?: bool|Param, + * allow_origin?: list, + * allow_headers?: list, + * allow_methods?: list, + * allow_private_network?: bool|Param, + * expose_headers?: list, + * max_age?: scalar|Param|null, // Default: 0 + * hosts?: list, + * origin_regex?: bool|Param, + * forced_allow_origin_value?: scalar|Param|null, // Default: null + * skip_same_as_origin?: bool|Param, + * }>, * } * @psalm-type DebugConfig = array{ * max_items?: int|Param, // Max number of displayed items past the first level, -1 means no limit. // Default: 2500 * min_depth?: int|Param, // Minimum tree depth to clone all the items, 1 is default. // Default: 1 * max_string_length?: int|Param, // Max length of displayed strings, -1 means no limit. // Default: -1 - * dump_destination?: scalar|null|Param, // A stream URL where dumps should be written to. // Default: null + * dump_destination?: scalar|Param|null, // A stream URL where dumps should be written to. // Default: null * theme?: "dark"|"light"|Param, // Changes the color of the dump() output when rendered directly on the templating. "dark" (default) or "light". // Default: "dark" * } * @psalm-type VichUploaderConfig = array{ - * default_filename_attribute_suffix?: scalar|null|Param, // Default: "_name" - * db_driver: scalar|null|Param, - * storage?: scalar|null|Param, // Default: "file_system" + * default_filename_attribute_suffix?: scalar|Param|null, // Default: "_name" + * db_driver?: scalar|Param|null, + * storage?: scalar|Param|null, // Default: "file_system" * use_flysystem_to_resolve_uri?: bool|Param, // Default: false - * twig?: scalar|null|Param, // twig requires templating // Default: true - * form?: scalar|null|Param, // Default: true + * twig?: scalar|Param|null, // twig requires templating // Default: true + * form?: scalar|Param|null, // Default: true * metadata?: array{ - * cache?: scalar|null|Param, // Default: "file" - * type?: scalar|null|Param, // Default: "attribute" + * cache?: scalar|Param|null, // Default: "file" + * type?: scalar|Param|null, // Default: "attribute" * file_cache?: array{ - * dir?: scalar|null|Param, // Default: "%kernel.cache_dir%/vich_uploader" + * dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/vich_uploader" * }, * auto_detection?: bool|Param, // Default: true * directories?: list, + * path?: scalar|Param|null, + * namespace_prefix?: scalar|Param|null, // Default: "" + * }>, * }, * mappings?: array, + * uri_prefix?: scalar|Param|null, // Default: "/uploads" + * upload_destination?: scalar|Param|null, // Default: null + * namer?: string|array{ + * service?: scalar|Param|null, // Default: null + * options?: mixed, // Default: null + * }, + * directory_namer?: string|array{ + * service?: scalar|Param|null, // Default: null + * options?: mixed, // Default: null + * }, + * delete_on_remove?: scalar|Param|null, // Default: true + * erase_fields?: scalar|Param|null, // Default: true + * delete_on_update?: scalar|Param|null, // Default: true + * inject_on_load?: scalar|Param|null, // Default: false + * namer_keep_extension?: scalar|Param|null, // Default: false + * db_driver?: scalar|Param|null, // Default: null + * }>, * } * @psalm-type FlysystemConfig = array{ * storages?: array, - * visibility?: scalar|null|Param, // Default: null - * directory_visibility?: scalar|null|Param, // Default: null - * retain_visibility?: bool|null|Param, // Default: null - * case_sensitive?: bool|Param, // Default: true - * disable_asserts?: bool|Param, // Default: false - * public_url?: list, - * path_normalizer?: scalar|null|Param, // Default: null - * public_url_generator?: scalar|null|Param, // Default: null - * temporary_url_generator?: scalar|null|Param, // Default: null - * read_only?: bool|Param, // Default: false - * }>, + * adapter?: scalar|Param|null, // DEPRECATED: Use the new config format instead (e.g. "local:" instead of "adapter: local") + * options?: list, + * asyncaws?: array{ + * client?: scalar|Param|null, // The AsyncAws S3 client service name + * bucket?: scalar|Param|null, // The name of the AWS S3 bucket + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all object keys // Default: "" + * }, + * aws?: array{ + * client?: scalar|Param|null, // The AWS S3 client service name + * bucket?: scalar|Param|null, // The name of the AWS S3 bucket + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all object keys // Default: "" + * options?: list, + * streamReads?: bool|Param, // Whether to use streaming for file reads // Default: true + * }, + * azure?: array{ + * client?: scalar|Param|null, // The Azure Blob Storage client service name + * container?: scalar|Param|null, // The name of the Azure Blob Storage container + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all blob names // Default: "" + * }, + * ftp?: array{ + * host?: scalar|Param|null, // FTP host + * username?: scalar|Param|null, // FTP username + * password?: scalar|Param|null, // FTP password + * port?: int|Param, // FTP port number // Default: 21 + * root?: scalar|Param|null, // FTP root directory // Default: "" + * passive?: bool|Param, // Use passive mode // Default: true + * ssl?: bool|Param, // Use SSL/TLS encryption // Default: false + * timeout?: int|Param, // Connection timeout in seconds // Default: 90 + * ignore_passive_address?: scalar|Param|null, // Ignore passive address // Default: null + * utf8?: bool|Param, // Enable UTF8 mode // Default: false + * transfer_mode?: scalar|Param|null, // Transfer mode (FTP_ASCII or FTP_BINARY constante on ftp extension) // Default: null + * system_type?: null|"windows"|"unix"|Param, // FTP system type // Default: null + * timestamps_on_unix_listings_enabled?: bool|Param, // Enable timestamps on Unix listings // Default: false + * recurse_manually?: bool|Param, // Recurse directories manually // Default: true + * use_raw_list_options?: bool|Param|null, // Use raw list options // Default: null + * connectivityChecker?: scalar|Param|null, // Connectivity checker service name // Default: null + * permissions?: array{ // Unix permissions configuration for files and directories + * file?: array{ // File permissions + * public?: int|Param, // Public file permissions // Default: 420 + * private?: int|Param, // Private file permissions // Default: 384 + * }, + * dir?: array{ // Directory permissions + * public?: int|Param, // Public directory permissions // Default: 493 + * private?: int|Param, // Private directory permissions // Default: 448 + * }, + * }, + * }, + * gcloud?: array{ + * client?: scalar|Param|null, // The Google Cloud Storage client service name + * bucket?: scalar|Param|null, // The name of the Google Cloud Storage bucket + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all object keys // Default: "" + * visibility_handler?: scalar|Param|null, // Optional visibility handler service name // Default: null + * streamReads?: bool|Param, // Whether to use streaming for file reads // Default: false + * }, + * gridfs?: array{ + * bucket?: scalar|Param|null, // GridFS bucket service name (if using an existing bucket service) // Default: null + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all file names // Default: "" + * database?: scalar|Param|null, // MongoDB database name // Default: null + * doctrine_connection?: scalar|Param|null, // Doctrine MongoDB connection name (mutually exclusive with mongodb_uri) + * mongodb_uri?: scalar|Param|null, // MongoDB connection URI (mutually exclusive with doctrine_connection) + * mongodb_uri_options?: list, + * mongodb_driver_options?: list, + * }, + * lazy?: array{ // Lazy adapter for runtime storage selection + * source?: scalar|Param|null, // The service name of the storage to use at runtime + * }, + * local?: array{ + * directory?: scalar|Param|null, // Directory path for local storage + * lock?: int|Param, // Lock flags for file operations // Default: 0 + * skip_links?: bool|Param, // Whether to skip symbolic links // Default: false + * lazy_root_creation?: bool|Param, // Whether to create the root directory lazily // Default: false + * permissions?: array{ // Unix permissions configuration for files and directories + * file?: array{ // File permissions + * public?: int|Param, // Public file permissions // Default: 420 + * private?: int|Param, // Private file permissions // Default: 384 + * }, + * dir?: array{ // Directory permissions + * public?: int|Param, // Public directory permissions // Default: 493 + * private?: int|Param, // Private directory permissions // Default: 448 + * }, + * }, + * }, + * memory?: array, + * sftp?: array{ + * host?: scalar|Param|null, // SFTP host + * username?: scalar|Param|null, // SFTP username + * password?: scalar|Param|null, // SFTP password (optional if using private key) // Default: null + * privateKey?: scalar|Param|null, // Path to private key file or private key content // Default: null + * passphrase?: scalar|Param|null, // Private key passphrase // Default: null + * port?: int|Param, // SFTP port number // Default: 22 + * timeout?: int|Param, // Connection timeout in seconds // Default: 90 + * hostFingerprint?: scalar|Param|null, // Host fingerprint for verification // Default: null + * connectivityChecker?: scalar|Param|null, // Connectivity checker service name // Default: null + * preferredAlgorithms?: list, + * root?: scalar|Param|null, // SFTP root directory // Default: "" + * permissions?: array{ // Unix permissions configuration for files and directories + * file?: array{ // File permissions + * public?: int|Param, // Public file permissions // Default: 420 + * private?: int|Param, // Private file permissions // Default: 384 + * }, + * dir?: array{ // Directory permissions + * public?: int|Param, // Public directory permissions // Default: 493 + * private?: int|Param, // Private directory permissions // Default: 448 + * }, + * }, + * }, + * webdav?: array{ + * client?: scalar|Param|null, // The WebDAV client service name + * prefix?: scalar|Param|null, // Optional path prefix to prepend to all paths // Default: "" + * visibility_handling?: "throw"|"ignore"|Param, // How to handle visibility operations // Default: "throw" + * manual_copy?: bool|Param, // Whether to handle copy operations manually // Default: false + * manual_move?: bool|Param, // Whether to handle move operations manually // Default: false + * }, + * bunnycdn?: array{ + * client?: scalar|Param|null, // The BunnyCDN client service name + * pull_zone?: scalar|Param|null, // The BunnyCDN pull zone name // Default: "" + * }, + * service?: scalar|Param|null, // Reference to a custom adapter service (alternative to registered adapter types) + * visibility?: scalar|Param|null, // Default visibility for files // Default: null + * directory_visibility?: scalar|Param|null, // Default visibility for directories // Default: null + * retain_visibility?: scalar|Param|null, // Keeps the original file visibility (public/private) when copying or moving. // Default: null + * case_sensitive?: bool|Param, // Deprecated: The "case_sensitive" option is deprecated and will be removed in 4.0. // Default: true + * disable_asserts?: bool|Param, // Deprecated: The "disable_asserts" option is deprecated and will be removed in 4.0. // Default: false + * public_url?: list, + * path_normalizer?: scalar|Param|null, // Path normalizer service name (should implement League\Flysystem\PathNormalizer) // Default: null + * public_url_generator?: scalar|Param|null, // For adapter that do not provide public URLs or override adapter capabilities and public_url option, a public URL generator service name can be configured in the main Filesystem configuration (should implement League\Flysystem\PublicUrlGenerator) // Default: null + * temporary_url_generator?: scalar|Param|null, // For adapter that do not provide public URLs or override adapter capabilities, a temporary URL generator service name can be configured in the main Filesystem configuration (should implement League\Flysystem\TemporaryUrlGenerator) // Default: null + * read_only?: bool|Param, // Converts a file system to read-only // Default: false + * }>, * } * @psalm-type LiipImagineConfig = array{ * resolvers?: array, - * get_options?: array, - * put_options?: array, - * proxies?: array, - * }, - * flysystem?: array{ - * filesystem_service: scalar|null|Param, - * cache_prefix?: scalar|null|Param, // Default: "" - * root_url: scalar|null|Param, - * visibility?: "public"|"private"|"noPredefinedVisibility"|Param, // Default: "public" - * }, - * }>, + * web_path?: array{ + * web_root?: scalar|Param|null, // Default: "%kernel.project_dir%/public" + * cache_prefix?: scalar|Param|null, // Default: "media/cache" + * }, + * aws_s3?: array{ + * bucket?: scalar|Param|null, + * cache?: scalar|Param|null, // Default: false + * use_psr_cache?: bool|Param, // Default: false + * acl?: scalar|Param|null, // Default: "public-read" + * cache_prefix?: scalar|Param|null, // Default: "" + * client_id?: scalar|Param|null, // Default: null + * client_config?: list, + * get_options?: array, + * put_options?: array, + * proxies?: array, + * }, + * flysystem?: array{ + * filesystem_service?: scalar|Param|null, + * cache_prefix?: scalar|Param|null, // Default: "" + * root_url?: scalar|Param|null, + * visibility?: "public"|"private"|"noPredefinedVisibility"|Param, // Default: "public" + * }, + * }>, * loaders?: array, - * allow_unresolvable_data_roots?: bool|Param, // Default: false - * bundle_resources?: array{ - * enabled?: bool|Param, // Default: false - * access_control_type?: "blacklist"|"whitelist"|Param, // Sets the access control method applied to bundle names in "access_control_list" into a blacklist or whitelist. // Default: "blacklist" - * access_control_list?: list, + * stream?: array{ + * wrapper?: scalar|Param|null, + * context?: scalar|Param|null, // Default: null * }, - * }, - * flysystem?: array{ - * filesystem_service: scalar|null|Param, - * }, - * asset_mapper?: array, - * chain?: array{ - * loaders: list, - * }, - * }>, - * driver?: scalar|null|Param, // Default: "gd" - * cache?: scalar|null|Param, // Default: "default" - * cache_base_path?: scalar|null|Param, // Default: "" - * data_loader?: scalar|null|Param, // Default: "default" - * default_image?: scalar|null|Param, // Default: null + * filesystem?: array{ + * locator?: "filesystem"|"filesystem_insecure"|Param, // Using the "filesystem_insecure" locator is not recommended due to a less secure resolver mechanism, but is provided for those using heavily symlinked projects. // Default: "filesystem" + * data_root?: string|list, + * allow_unresolvable_data_roots?: bool|Param, // Default: false + * bundle_resources?: array{ + * enabled?: bool|Param, // Default: false + * access_control_type?: "blacklist"|"whitelist"|Param, // Sets the access control method applied to bundle names in "access_control_list" into a blacklist or whitelist. // Default: "blacklist" + * access_control_list?: list, + * }, + * }, + * flysystem?: array{ + * filesystem_service?: scalar|Param|null, + * }, + * asset_mapper?: array, + * chain?: array{ + * loaders?: list, + * }, + * }>, + * driver?: scalar|Param|null, // Default: "gd" + * cache?: scalar|Param|null, // Default: "default" + * cache_base_path?: scalar|Param|null, // Default: "" + * data_loader?: scalar|Param|null, // Default: "default" + * default_image?: scalar|Param|null, // Default: null * default_filter_set_settings?: array{ - * quality?: scalar|null|Param, // Default: 100 - * jpeg_quality?: scalar|null|Param, // Default: null - * png_compression_level?: scalar|null|Param, // Default: null - * png_compression_filter?: scalar|null|Param, // Default: null - * format?: scalar|null|Param, // Default: null + * quality?: scalar|Param|null, // Default: 100 + * jpeg_quality?: scalar|Param|null, // Default: null + * png_compression_level?: scalar|Param|null, // Default: null + * png_compression_filter?: scalar|Param|null, // Default: null + * format?: scalar|Param|null, // Default: null * animated?: bool|Param, // Default: false - * cache?: scalar|null|Param, // Default: null - * data_loader?: scalar|null|Param, // Default: null - * default_image?: scalar|null|Param, // Default: null + * cache?: scalar|Param|null, // Default: null + * data_loader?: scalar|Param|null, // Default: null + * default_image?: scalar|Param|null, // Default: null * filters?: array>, * post_processors?: array>, * }, * controller?: array{ - * filter_action?: scalar|null|Param, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterAction" - * filter_runtime_action?: scalar|null|Param, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterRuntimeAction" + * filter_action?: scalar|Param|null, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterAction" + * filter_runtime_action?: scalar|Param|null, // Default: "Liip\\ImagineBundle\\Controller\\ImagineController::filterRuntimeAction" * redirect_response_code?: int|Param, // Default: 302 * }, * filter_sets?: array>, - * post_processors?: array>, - * }>, + * quality?: scalar|Param|null, + * jpeg_quality?: scalar|Param|null, + * png_compression_level?: scalar|Param|null, + * png_compression_filter?: scalar|Param|null, + * format?: scalar|Param|null, + * animated?: bool|Param, + * cache?: scalar|Param|null, + * data_loader?: scalar|Param|null, + * default_image?: scalar|Param|null, + * filters?: array>, + * post_processors?: array>, + * }>, * twig?: array{ * mode?: "none"|"lazy"|"legacy"|Param, // Twig mode: none/lazy/legacy (default) // Default: "legacy" - * assets_version?: scalar|null|Param, // Default: null + * assets_version?: scalar|Param|null, // Default: null * }, * enqueue?: bool|Param, // Enables integration with enqueue if set true. Allows resolve image caches in background by sending messages to MQ. // Default: false * messenger?: bool|array{ // Enables integration with symfony/messenger if set true. Warmup image caches in background by sending messages to MQ. @@ -1508,175 +1624,175 @@ * webp?: array{ * generate?: bool|Param, // Default: false * quality?: int|Param, // Default: 100 - * cache?: scalar|null|Param, // Default: null - * data_loader?: scalar|null|Param, // Default: null + * cache?: scalar|Param|null, // Default: null + * data_loader?: scalar|Param|null, // Default: null * post_processors?: array>, * }, * } * @psalm-type WebpackEncoreConfig = array{ - * output_path: scalar|null|Param, // The path where Encore is building the assets - i.e. Encore.setOutputPath() + * output_path?: scalar|Param|null, // The path where Encore is building the assets - i.e. Encore.setOutputPath() * crossorigin?: false|"anonymous"|"use-credentials"|Param, // crossorigin value when Encore.enableIntegrityHashes() is used, can be false (default), anonymous or use-credentials // Default: false * preload?: bool|Param, // preload all rendered script and link tags automatically via the http2 Link header. // Default: false * cache?: bool|Param, // Enable caching of the entry point file(s) // Default: false * strict_mode?: bool|Param, // Throw an exception if the entrypoints.json file is missing or an entry is missing from the data // Default: true - * builds?: array, - * script_attributes?: array, - * link_attributes?: array, + * builds?: array, + * script_attributes?: array, + * link_attributes?: array, * } * @psalm-type TwigComponentConfig = array{ * defaults?: array, - * anonymous_template_directory?: scalar|null|Param, // Defaults to `components` + * template_directory?: scalar|Param|null, // Default: "components" + * name_prefix?: scalar|Param|null, // Default: "" + * }>, + * anonymous_template_directory?: scalar|Param|null, // Defaults to `components` * profiler?: bool|array{ // Enables the profiler for Twig Component * enabled?: bool|Param, // Default: "%kernel.debug%" * collect_components?: bool|Param, // Collect components instances // Default: true * }, - * controllers_json?: scalar|null|Param, // Deprecated: The "twig_component.controllers_json" config option is deprecated, and will be removed in 3.0. // Default: null + * controllers_json?: scalar|Param|null, // Deprecated: The "twig_component.controllers_json" config option is deprecated, and will be removed in 3.0. // Default: null * } * @psalm-type MonologConfig = array{ - * use_microseconds?: scalar|null|Param, // Default: true - * channels?: list, + * use_microseconds?: scalar|Param|null, // Default: true + * channels?: list, * handlers?: array, + * type?: scalar|Param|null, + * id?: scalar|Param|null, + * enabled?: bool|Param, // Default: true + * priority?: scalar|Param|null, // Default: 0 + * level?: scalar|Param|null, // Default: "DEBUG" + * bubble?: bool|Param, // Default: true + * interactive_only?: bool|Param, // Default: false + * app_name?: scalar|Param|null, // Default: null + * include_stacktraces?: bool|Param, // Default: false + * process_psr_3_messages?: array{ + * enabled?: bool|Param|null, // Default: null + * date_format?: scalar|Param|null, + * remove_used_context_fields?: bool|Param, + * }, + * path?: scalar|Param|null, // Default: "%kernel.logs_dir%/%kernel.environment%.log" + * file_permission?: scalar|Param|null, // Default: null + * use_locking?: bool|Param, // Default: false + * filename_format?: scalar|Param|null, // Default: "{filename}-{date}" + * date_format?: scalar|Param|null, // Default: "Y-m-d" + * ident?: scalar|Param|null, // Default: false + * logopts?: scalar|Param|null, // Default: 1 + * facility?: scalar|Param|null, // Default: "user" + * max_files?: scalar|Param|null, // Default: 0 + * action_level?: scalar|Param|null, // Default: "WARNING" + * activation_strategy?: scalar|Param|null, // Default: null + * stop_buffering?: bool|Param, // Default: true + * passthru_level?: scalar|Param|null, // Default: null + * excluded_http_codes?: list, + * }>, + * accepted_levels?: list, + * min_level?: scalar|Param|null, // Default: "DEBUG" + * max_level?: scalar|Param|null, // Default: "EMERGENCY" + * buffer_size?: scalar|Param|null, // Default: 0 + * flush_on_overflow?: bool|Param, // Default: false + * handler?: scalar|Param|null, + * url?: scalar|Param|null, + * exchange?: scalar|Param|null, + * exchange_name?: scalar|Param|null, // Default: "log" + * channel?: scalar|Param|null, // Default: null + * bot_name?: scalar|Param|null, // Default: "Monolog" + * use_attachment?: scalar|Param|null, // Default: true + * use_short_attachment?: scalar|Param|null, // Default: false + * include_extra?: scalar|Param|null, // Default: false + * icon_emoji?: scalar|Param|null, // Default: null + * webhook_url?: scalar|Param|null, + * exclude_fields?: list, + * token?: scalar|Param|null, + * region?: scalar|Param|null, + * source?: scalar|Param|null, + * use_ssl?: bool|Param, // Default: true + * user?: mixed, + * title?: scalar|Param|null, // Default: null + * host?: scalar|Param|null, // Default: null + * port?: scalar|Param|null, // Default: 514 + * config?: list, + * members?: list, + * connection_string?: scalar|Param|null, + * timeout?: scalar|Param|null, + * time?: scalar|Param|null, // Default: 60 + * deduplication_level?: scalar|Param|null, // Default: 400 + * store?: scalar|Param|null, // Default: null + * connection_timeout?: scalar|Param|null, + * persistent?: bool|Param, + * message_type?: scalar|Param|null, // Default: 0 + * parse_mode?: scalar|Param|null, // Default: null + * disable_webpage_preview?: bool|Param|null, // Default: null + * disable_notification?: bool|Param|null, // Default: null + * split_long_messages?: bool|Param, // Default: false + * delay_between_messages?: bool|Param, // Default: false + * topic?: int|Param, // Default: null + * factor?: int|Param, // Default: 1 + * tags?: string|list, + * console_formatter_options?: mixed, // Default: [] + * formatter?: scalar|Param|null, + * nested?: bool|Param, // Default: false + * publisher?: string|array{ + * id?: scalar|Param|null, + * hostname?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 12201 + * chunk_size?: scalar|Param|null, // Default: 1420 + * encoder?: "json"|"compressed_json"|Param, + * }, + * mongodb?: string|array{ + * id?: scalar|Param|null, // ID of a MongoDB\Client service + * uri?: scalar|Param|null, + * username?: scalar|Param|null, + * password?: scalar|Param|null, + * database?: scalar|Param|null, // Default: "monolog" + * collection?: scalar|Param|null, // Default: "logs" + * }, + * elasticsearch?: string|array{ + * id?: scalar|Param|null, + * hosts?: list, + * host?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 9200 + * transport?: scalar|Param|null, // Default: "Http" + * user?: scalar|Param|null, // Default: null + * password?: scalar|Param|null, // Default: null + * }, + * index?: scalar|Param|null, // Default: "monolog" + * document_type?: scalar|Param|null, // Default: "logs" + * ignore_error?: scalar|Param|null, // Default: false + * redis?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * password?: scalar|Param|null, // Default: null + * port?: scalar|Param|null, // Default: 6379 + * database?: scalar|Param|null, // Default: 0 + * key_name?: scalar|Param|null, // Default: "monolog_redis" + * }, + * predis?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * }, + * from_email?: scalar|Param|null, + * to_email?: string|list, + * subject?: scalar|Param|null, + * content_type?: scalar|Param|null, // Default: null + * headers?: list, + * mailer?: scalar|Param|null, // Default: null + * email_prototype?: string|array{ + * id?: scalar|Param|null, + * method?: scalar|Param|null, // Default: null + * }, + * verbosity_levels?: array{ + * VERBOSITY_QUIET?: scalar|Param|null, // Default: "ERROR" + * VERBOSITY_NORMAL?: scalar|Param|null, // Default: "WARNING" + * VERBOSITY_VERBOSE?: scalar|Param|null, // Default: "NOTICE" + * VERBOSITY_VERY_VERBOSE?: scalar|Param|null, // Default: "INFO" + * VERBOSITY_DEBUG?: scalar|Param|null, // Default: "DEBUG" + * }, + * channels?: string|array{ + * type?: scalar|Param|null, + * elements?: list, + * }, * }>, - * accepted_levels?: list, - * min_level?: scalar|null|Param, // Default: "DEBUG" - * max_level?: scalar|null|Param, // Default: "EMERGENCY" - * buffer_size?: scalar|null|Param, // Default: 0 - * flush_on_overflow?: bool|Param, // Default: false - * handler?: scalar|null|Param, - * url?: scalar|null|Param, - * exchange?: scalar|null|Param, - * exchange_name?: scalar|null|Param, // Default: "log" - * channel?: scalar|null|Param, // Default: null - * bot_name?: scalar|null|Param, // Default: "Monolog" - * use_attachment?: scalar|null|Param, // Default: true - * use_short_attachment?: scalar|null|Param, // Default: false - * include_extra?: scalar|null|Param, // Default: false - * icon_emoji?: scalar|null|Param, // Default: null - * webhook_url?: scalar|null|Param, - * exclude_fields?: list, - * token?: scalar|null|Param, - * region?: scalar|null|Param, - * source?: scalar|null|Param, - * use_ssl?: bool|Param, // Default: true - * user?: mixed, - * title?: scalar|null|Param, // Default: null - * host?: scalar|null|Param, // Default: null - * port?: scalar|null|Param, // Default: 514 - * config?: list, - * members?: list, - * connection_string?: scalar|null|Param, - * timeout?: scalar|null|Param, - * time?: scalar|null|Param, // Default: 60 - * deduplication_level?: scalar|null|Param, // Default: 400 - * store?: scalar|null|Param, // Default: null - * connection_timeout?: scalar|null|Param, - * persistent?: bool|Param, - * message_type?: scalar|null|Param, // Default: 0 - * parse_mode?: scalar|null|Param, // Default: null - * disable_webpage_preview?: bool|null|Param, // Default: null - * disable_notification?: bool|null|Param, // Default: null - * split_long_messages?: bool|Param, // Default: false - * delay_between_messages?: bool|Param, // Default: false - * topic?: int|Param, // Default: null - * factor?: int|Param, // Default: 1 - * tags?: list, - * console_formatter_options?: mixed, // Default: [] - * formatter?: scalar|null|Param, - * nested?: bool|Param, // Default: false - * publisher?: string|array{ - * id?: scalar|null|Param, - * hostname?: scalar|null|Param, - * port?: scalar|null|Param, // Default: 12201 - * chunk_size?: scalar|null|Param, // Default: 1420 - * encoder?: "json"|"compressed_json"|Param, - * }, - * mongodb?: string|array{ - * id?: scalar|null|Param, // ID of a MongoDB\Client service - * uri?: scalar|null|Param, - * username?: scalar|null|Param, - * password?: scalar|null|Param, - * database?: scalar|null|Param, // Default: "monolog" - * collection?: scalar|null|Param, // Default: "logs" - * }, - * elasticsearch?: string|array{ - * id?: scalar|null|Param, - * hosts?: list, - * host?: scalar|null|Param, - * port?: scalar|null|Param, // Default: 9200 - * transport?: scalar|null|Param, // Default: "Http" - * user?: scalar|null|Param, // Default: null - * password?: scalar|null|Param, // Default: null - * }, - * index?: scalar|null|Param, // Default: "monolog" - * document_type?: scalar|null|Param, // Default: "logs" - * ignore_error?: scalar|null|Param, // Default: false - * redis?: string|array{ - * id?: scalar|null|Param, - * host?: scalar|null|Param, - * password?: scalar|null|Param, // Default: null - * port?: scalar|null|Param, // Default: 6379 - * database?: scalar|null|Param, // Default: 0 - * key_name?: scalar|null|Param, // Default: "monolog_redis" - * }, - * predis?: string|array{ - * id?: scalar|null|Param, - * host?: scalar|null|Param, - * }, - * from_email?: scalar|null|Param, - * to_email?: list, - * subject?: scalar|null|Param, - * content_type?: scalar|null|Param, // Default: null - * headers?: list, - * mailer?: scalar|null|Param, // Default: null - * email_prototype?: string|array{ - * id: scalar|null|Param, - * method?: scalar|null|Param, // Default: null - * }, - * verbosity_levels?: array{ - * VERBOSITY_QUIET?: scalar|null|Param, // Default: "ERROR" - * VERBOSITY_NORMAL?: scalar|null|Param, // Default: "WARNING" - * VERBOSITY_VERBOSE?: scalar|null|Param, // Default: "NOTICE" - * VERBOSITY_VERY_VERBOSE?: scalar|null|Param, // Default: "INFO" - * VERBOSITY_DEBUG?: scalar|null|Param, // Default: "DEBUG" - * }, - * channels?: string|array{ - * type?: scalar|null|Param, - * elements?: list, - * }, - * }>, * } * @psalm-type DamaDoctrineTestConfig = array{ * enable_static_connection?: mixed, // Default: true @@ -1785,7 +1901,10 @@ final class App */ public static function config(array $config): array { - return AppReference::config($config); + /** @var ConfigType $config */ + $config = AppReference::config($config); + + return $config; } } diff --git a/package-lock.json b/package-lock.json index 375df59aa..10e9e425e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,13 +57,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -72,9 +72,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", "dev": true, "license": "MIT", "engines": { @@ -82,21 +82,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -113,14 +113,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -143,13 +143,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -160,18 +160,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", - "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", + "@babel/traverse": "^7.29.0", "semver": "^6.3.1" }, "engines": { @@ -200,17 +200,17 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" + "resolve": "^1.22.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -241,29 +241,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -286,9 +286,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", "engines": { @@ -314,15 +314,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -376,42 +376,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -488,14 +488,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -518,13 +518,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -534,13 +534,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -583,15 +583,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -601,14 +601,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { @@ -635,13 +635,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -651,14 +651,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -668,14 +668,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -685,18 +685,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -706,14 +706,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -740,14 +740,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -773,14 +773,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -806,14 +806,14 @@ } }, "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -823,13 +823,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -890,13 +890,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -922,13 +922,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -971,14 +971,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -988,16 +988,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1024,14 +1024,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1057,13 +1057,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1073,13 +1073,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1089,17 +1089,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1126,13 +1126,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1142,13 +1142,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1175,14 +1175,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1192,15 +1192,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1226,13 +1226,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1242,14 +1242,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1291,13 +1291,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1372,14 +1372,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1406,14 +1406,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1423,76 +1423,76 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.6.tgz", + "integrity": "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/compat-data": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.6", + "@babel/plugin-transform-async-to-generator": "^7.28.6", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.28.6", "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.6", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", @@ -1523,33 +1523,33 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -1557,9 +1557,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { @@ -1570,49 +1570,40 @@ "node": ">=6.9.0" } }, - "node_modules/@cacheable/memoize": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.3.tgz", - "integrity": "sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cacheable/utils": "^2.0.3" - } - }, "node_modules/@cacheable/memory": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.4.tgz", - "integrity": "sha512-cCmJKCKlT1t7hNBI1+gFCwmKFd9I4pS3zqBeNGXTSODnpa0EeDmORHY8oEMTuozfdg3cgsVh8ojLaPYb6eC7Cg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.8.tgz", + "integrity": "sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/utils": "^2.2.0", - "@keyv/bigmap": "^1.1.0", - "hookified": "^1.12.2", - "keyv": "^5.5.3" + "@cacheable/utils": "^2.4.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" } }, "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.1.0.tgz", - "integrity": "sha512-MX7XIUNwVRK+hjZcAbNJ0Z8DREo+Weu9vinBOjGU1thEi9F6vPhICzBbk4CCf3eEefKRz7n6TfZXwUFZTSgj8Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.12.2" + "hashery": "^1.4.0", + "hookified": "^1.15.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "keyv": "^5.5.3" + "keyv": "^5.6.0" } }, "node_modules/@cacheable/memory/node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { @@ -1620,19 +1611,20 @@ } }, "node_modules/@cacheable/utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.2.0.tgz", - "integrity": "sha512-7xaQayO3msdVcxXLYcLU5wDqJBNdQcPPPHr6mdTEIQI7N7TbtSVVTpWOTfjyhg0L6AQwQdq7miKdWtTDBoBldQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-eiFgzCbIneyMlLOmNG4g9xzF7Hv3Mga4LjxjcSC/ues6VYq2+gUbQI8JqNuw/ZM8tJIeIaBGpswAsqV2V7ApgA==", "dev": true, "license": "MIT", "dependencies": { - "keyv": "^5.5.3" + "hashery": "^1.5.1", + "keyv": "^5.6.0" } }, "node_modules/@cacheable/utils/node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { @@ -2507,6 +2499,13 @@ "es-toolkit": "1.39.5" } }, + "node_modules/@colordx/core": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.4.3.tgz", + "integrity": "sha512-kIxYSfA5T8HXjav55UaaH/o/cKivF6jCCGIb8eqtcsfI46wsvlSiT8jMDyrl779qLec3c2c2oHBZo4oAhvbjrQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2609,9 +2608,9 @@ } }, "node_modules/@cypress/request": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.9.tgz", - "integrity": "sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz", + "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2628,7 +2627,7 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "6.14.0", + "qs": "~6.14.1", "safe-buffer": "^5.1.2", "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", @@ -2642,6 +2641,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT", "bin": { @@ -2691,9 +2691,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", - "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", "optional": true, @@ -2703,10 +2703,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -2725,7 +2724,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2738,22 +2736,20 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2763,7 +2759,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2773,7 +2768,6 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -2783,20 +2777,19 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -2810,7 +2803,6 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2823,7 +2815,6 @@ "version": "9.36.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", - "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2836,7 +2827,6 @@ "version": "2.1.7", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2846,7 +2836,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.15.2", @@ -2875,34 +2864,44 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -2916,7 +2915,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18" @@ -3336,14 +3334,14 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.1.tgz", - "integrity": "sha512-rOcLotrptYIy59SGQhKlU0xBg1vvcVl2FdPIEclUvKHh0wo12OfGkId/01PIMJ/V+EimJ77t085YabgnQHBa5A==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" @@ -3361,13 +3359,13 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.20.tgz", - "integrity": "sha512-HDGiWh2tyRZa0M1ZnEIUCQro25gW/mN8ODByicQrbR1yHx4hT+IOpozCMi5TgBtUdklLwRI2mv14eNpftDluEw==", + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "engines": { @@ -3383,9 +3381,9 @@ } }, "node_modules/@inquirer/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.1.tgz", - "integrity": "sha512-hzGKIkfomGFPgxKmnKEKeA+uCYBqC+TKtRx5LgyHRCrF6S2MliwRIjp3sUaWwVzMp7ZXVs8elB0Tfe682Rpg4w==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "license": "MIT", "dependencies": { @@ -3393,7 +3391,7 @@ "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", - "mute-stream": "^3.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.3" @@ -3446,16 +3444,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@inquirer/core/node_modules/mute-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", - "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -3485,13 +3473,13 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.22", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.22.tgz", - "integrity": "sha512-8yYZ9TCbBKoBkzHtVNMF6PV1RJEUvMlhvmS3GxH4UvXMEHlS45jFyqFy0DU+K42jBs5slOaA78xGqqqWAx3u6A==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/external-editor": "^1.0.3", "@inquirer/type": "^3.0.10" }, @@ -3508,13 +3496,13 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.22.tgz", - "integrity": "sha512-9XOjCjvioLjwlq4S4yXzhvBmAXj5tG+jvva0uqedEsQ9VD8kZ+YT7ap23i0bIXOtow+di4+u3i6u26nDqEfY4Q==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, @@ -3563,13 +3551,13 @@ } }, "node_modules/@inquirer/input": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.0.tgz", - "integrity": "sha512-h4fgse5zeGsBSW3cRQqu9a99OXRdRsNCvHoBqVmz40cjYjYFzcfwD0KA96BHIPlT7rZw0IpiefQIqXrjbzjS4Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "engines": { @@ -3585,13 +3573,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.22.tgz", - "integrity": "sha512-oAdMJXz++fX58HsIEYmvuf5EdE8CfBHHXjoi9cTcQzgFoHGZE+8+Y3P38MlaRMeBvAVnkWtAxMUF6urL2zYsbg==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "engines": { @@ -3607,14 +3595,14 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.22.tgz", - "integrity": "sha512-CbdqK1ioIr0Y3akx03k/+Twf+KSlHjn05hBL+rmubMll7PsDTGH0R4vfFkr+XrkB0FOHrjIwVP9crt49dgt+1g==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "engines": { @@ -3630,22 +3618,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.0.tgz", - "integrity": "sha512-X2HAjY9BClfFkJ2RP3iIiFxlct5JJVdaYYXhA7RKxsbc9KL+VbId79PSoUGH/OLS011NFbHHDMDcBKUj3T89+Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.3.1", - "@inquirer/confirm": "^5.1.20", - "@inquirer/editor": "^4.2.22", - "@inquirer/expand": "^4.0.22", - "@inquirer/input": "^4.3.0", - "@inquirer/number": "^3.0.22", - "@inquirer/password": "^4.0.22", - "@inquirer/rawlist": "^4.1.10", - "@inquirer/search": "^3.2.1", - "@inquirer/select": "^4.4.1" + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" }, "engines": { "node": ">=18" @@ -3660,13 +3648,13 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.10.tgz", - "integrity": "sha512-Du4uidsgTMkoH5izgpfyauTL/ItVHOLsVdcY+wGeoGaG56BV+/JfmyoQGniyhegrDzXpfn3D+LFHaxMDRygcAw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, @@ -3683,13 +3671,13 @@ } }, "node_modules/@inquirer/search": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.1.tgz", - "integrity": "sha512-cKiuUvETublmTmaOneEermfG2tI9ABpb7fW/LqzZAnSv4ZaJnbEis05lOkiBuYX5hNdnX0Q9ryOQyrNidb55WA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" @@ -3707,14 +3695,14 @@ } }, "node_modules/@inquirer/select": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.1.tgz", - "integrity": "sha512-E9hbLU4XsNe2SAOSsFrtYtYQDVi1mfbqJrPDvXKnGlnRiApBdWMJz7r3J2Ff38AqULkPUD3XjQMD4492TymD7Q==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.1", + "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" @@ -3749,35 +3737,50 @@ } } }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/types/node_modules/ansi-styles": { @@ -3917,10 +3920,37 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jscpd/badge-reporter": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/badge-reporter/-/badge-reporter-4.0.5.tgz", + "integrity": "sha512-SLVhP00R9lkQ//Ivaanfm7k0L9sewpBven670kk1uGec2SWUOa7MVQcuad/TV59KEZ73UIC1lXvi6O9hAnbpUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "badgen": "^3.2.3", + "colors": "^1.4.0", + "fs-extra": "^11.2.0" + } + }, + "node_modules/@jscpd/badge-reporter/node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@jscpd/core": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/core/-/core-4.0.1.tgz", - "integrity": "sha512-6Migc68Z8p7q5xqW1wbF3SfIbYHPQoiLHPbJb1A1Z1H9DwImwopFkYflqRDpuamLd0Jfg2jx3ZBmHQt21NbD1g==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/core/-/core-4.0.5.tgz", + "integrity": "sha512-Udvym21nWzxjYRVXwwpYNBqZ6b50QV2zHN3fFNzOPPg4cfQVYOZerILB7xNDUsXHC1PCr/N52Tq3q7AElvjWWA==", "dev": true, "license": "MIT", "dependencies": { @@ -3928,14 +3958,14 @@ } }, "node_modules/@jscpd/finder": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/finder/-/finder-4.0.1.tgz", - "integrity": "sha512-TcCT28686GeLl87EUmrBXYmuOFELVMDwyjKkcId+qjNS1zVWRd53Xd5xKwEDzkCEgen/vCs+lorLLToolXp5oQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/finder/-/finder-4.0.5.tgz", + "integrity": "sha512-/2VkRoVrrfya+51sitZo5I9MdwsRaPKB8X3L3khAYoHFXk4L/mUuG81RmGazDHjUIGg22ItlkQtwzorNZ2+aPw==", "dev": true, "license": "MIT", "dependencies": { - "@jscpd/core": "4.0.1", - "@jscpd/tokenizer": "4.0.1", + "@jscpd/core": "4.0.5", + "@jscpd/tokenizer": "4.0.5", "blamer": "^1.0.6", "bytes": "^3.1.2", "cli-table3": "^0.6.5", @@ -3963,9 +3993,9 @@ } }, "node_modules/@jscpd/finder/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -3978,9 +4008,9 @@ } }, "node_modules/@jscpd/html-reporter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/html-reporter/-/html-reporter-4.0.1.tgz", - "integrity": "sha512-M9fFETNvXXuy4fWv0M2oMluxwrQUBtubxCHaWw21lb2G8A6SE19moe3dUkluZ/3V4BccywfeF9lSEUg84heLww==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/html-reporter/-/html-reporter-4.0.5.tgz", + "integrity": "sha512-drK2J8KyPIW9wvaElSIobZFp4dBO9GA++JW4gx3oihvLdDSp8qSo/CNqH47Dw0XkjQTxND3j/+Wz5JWvYRBgFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3990,9 +4020,9 @@ } }, "node_modules/@jscpd/html-reporter/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -4005,13 +4035,13 @@ } }, "node_modules/@jscpd/tokenizer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/tokenizer/-/tokenizer-4.0.1.tgz", - "integrity": "sha512-l/CPeEigadYcQUsUxf1wdCBfNjyAxYcQU04KciFNmSZAMY+ykJ8fZsiuyfjb+oOuDgsIPZZ9YvbvsCr6NBXueg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jscpd/tokenizer/-/tokenizer-4.0.5.tgz", + "integrity": "sha512-WzRujQtN5WedxZVDKuoanxmKAFrxcLrHpcA6kaM4z8AhGtWXZ325yseqgL5TZ8OK7Auwu7kQLlqhfk05fGYG7A==", "dev": true, "license": "MIT", "dependencies": { - "@jscpd/core": "4.0.1", + "@jscpd/core": "4.0.5", "reprism": "^0.0.11", "spark-md5": "^3.0.2" } @@ -4063,9 +4093,9 @@ "license": "ISC" }, "node_modules/@mapbox/tiny-sdf": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.7.tgz", - "integrity": "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.2.0.tgz", + "integrity": "sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==", "license": "BSD-2-Clause" }, "node_modules/@mapbox/unitbezier": { @@ -4094,10 +4124,16 @@ "node": ">=6.0.0" } }, + "node_modules/@maplibre/geojson-vt": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-5.0.4.tgz", + "integrity": "sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==", + "license": "ISC" + }, "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "23.3.0", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-23.3.0.tgz", - "integrity": "sha512-IGJtuBbaGzOUgODdBRg66p8stnwj9iDXkgbYKoYcNiiQmaez5WVRfXm4b03MCDwmZyX93csbfHFWEJJYHnn5oA==", + "version": "24.4.1", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.4.1.tgz", + "integrity": "sha512-UKhA4qv1h30XT768ccSv5NjNCX+dgfoq2qlLVmKejspPcSQTYD4SrVucgqegmYcKcmwf06wcNAa/kRd0NHWbUg==", "license": "ISC", "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", @@ -4114,25 +4150,34 @@ "gl-style-validate": "dist/gl-style-validate.mjs" } }, + "node_modules/@maplibre/mlt": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.1.9.tgz", + "integrity": "sha512-g/tD8EYJB97udq33ipuJ9a4Q7fcbZnTEnUrgnEc/tLMmEL+zaCbR+X5fkDBO2dgpaAMsLH179qE3UXg2N0Nc/g==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@mapbox/point-geometry": "^1.1.0" + } + }, "node_modules/@maplibre/vt-pbf": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.0.3.tgz", - "integrity": "sha512-YsW99BwnT+ukJRkseBcLuZHfITB4puJoxnqPVjo72rhW/TaawVYsgQHcqWLzTxqknttYoDpgyERzWSa/XrETdA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.3.0.tgz", + "integrity": "sha512-jIvp8F5hQCcreqOOpEt42TJMUlsrEcpf/kI1T2v85YrQRV6PPXUcEXUg5karKtH6oh47XJZ4kHu56pUkOuqA7w==", "license": "MIT", "dependencies": { "@mapbox/point-geometry": "^1.1.0", "@mapbox/vector-tile": "^2.0.4", - "@types/geojson-vt": "3.2.5", + "@maplibre/geojson-vt": "^5.0.4", + "@types/geojson": "^7946.0.16", "@types/supercluster": "^7.1.3", - "geojson-vt": "^4.0.2", "pbf": "^4.0.1", "supercluster": "^8.0.1" } }, "node_modules/@maptiler/client": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@maptiler/client/-/client-2.5.1.tgz", - "integrity": "sha512-2rveqohOu3xv16EX65rFUQF8fpPppefrGkvUEtZOx50EDHFxrhEVjKM0p95TuT0RLygxF/sw4vAqUFCBOnPbiw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@maptiler/client/-/client-2.7.0.tgz", + "integrity": "sha512-bA6hed48LBDxDZBw4rzoWEn4PC64u4qc4uybzEsluN5U65+OwM2ZBPkWxVGBzJAb7oAeyqjYtGLL2H1wJez2Ow==", "license": "BSD-3-Clause", "dependencies": { "quick-lru": "^7.0.0" @@ -4149,20 +4194,27 @@ } }, "node_modules/@maptiler/sdk": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@maptiler/sdk/-/sdk-3.8.0.tgz", - "integrity": "sha512-oXLlSyJhKADB1KTfxj5bhnRml3nrvBerhuuo1v+rDJKrUHqQpVPj6PS+z809D/+UB9ZwzzHOBeFZP3vYCK3U5g==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@maptiler/sdk/-/sdk-3.11.2.tgz", + "integrity": "sha512-GCjamP5xnQ7l5MduUjd/zsxWv8sw48MV+pg7WBbhZeQu2aS2ayyTr1gEnWFmvT4REZnhhg2S7wJW0M70BiwXoA==", "license": "BSD-3-Clause", "dependencies": { - "@maplibre/maplibre-gl-style-spec": "~23.3.0", - "@maptiler/client": "~2.5.1", + "@maplibre/maplibre-gl-style-spec": "~24.4.1", + "@maptiler/client": "~2.6.0 || ~2.7.0", + "eslint-plugin-compat": "^6.1.0", "events": "^3.3.0", - "gl-matrix": "^3.4.3", + "gl-matrix": "^3.4.4", "js-base64": "^3.7.7", - "maplibre-gl": "~5.6.0", + "maplibre-gl": "~5.16.0", "uuid": "^11.0.5" } }, + "node_modules/@mdn/browser-compat-data": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-6.1.5.tgz", + "integrity": "sha512-PzdZZzRhcXvKB0begee28n5lvwAcinGKYuLZOVxHAZm+n7y01ddEGfdS1ZXRuVcV+ndG6mSEAE8vgudom5UjYg==", + "license": "CC0-1.0" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4261,9 +4313,9 @@ } }, "node_modules/@octokit/endpoint": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", - "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -4376,16 +4428,17 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.6.tgz", - "integrity": "sha512-FO+UgZCUu+pPnZAR+iKdUt64kPE7QW7ciqpldaMXaNzixz5Jld8dJ31LAUewk0cfSRkNSRKyqG438ba9c/qDlQ==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", + "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/endpoint": "^11.0.2", + "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "fast-content-type-parse": "^3.0.0", + "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" }, "engines": { @@ -4393,9 +4446,9 @@ } }, "node_modules/@octokit/request-error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.2.tgz", - "integrity": "sha512-U8piOROoQQUyExw5c6dTkU3GKxts5/ERRThIauNL7yaRoeXW0q/5bgHWT7JfWBw1UyrbK8ERId2wVkcB32n0uQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", "dev": true, "license": "MIT", "dependencies": { @@ -4447,18 +4500,18 @@ "license": "Apache-2.0" }, "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, "dependencies": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.3", "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">= 10.0.0" @@ -4468,25 +4521,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", "cpu": [ "arm64" ], @@ -4505,9 +4558,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", "cpu": [ "arm64" ], @@ -4526,9 +4579,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", "cpu": [ "x64" ], @@ -4547,9 +4600,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", "cpu": [ "x64" ], @@ -4568,9 +4621,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", "cpu": [ "arm" ], @@ -4589,9 +4642,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", "cpu": [ "arm" ], @@ -4610,9 +4663,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", "cpu": [ "arm64" ], @@ -4631,9 +4684,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", "cpu": [ "arm64" ], @@ -4652,9 +4705,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", "cpu": [ "x64" ], @@ -4673,9 +4726,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", "cpu": [ "x64" ], @@ -4694,9 +4747,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", "cpu": [ "arm64" ], @@ -4715,9 +4768,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", "cpu": [ "ia32" ], @@ -4736,9 +4789,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", "cpu": [ "x64" ], @@ -4771,9 +4824,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -4927,9 +4980,9 @@ } }, "node_modules/@symfony/webpack-encore/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -4962,9 +5015,9 @@ "license": "MIT" }, "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "license": "MIT", "dependencies": { "@types/ms": "*" @@ -4996,7 +5049,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, "node_modules/@types/geojson": { @@ -5073,7 +5125,6 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, "license": "MIT" }, "node_modules/@types/leaflet": { @@ -5108,13 +5159,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", - "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.19.0" } }, "node_modules/@types/parse-path": { @@ -5168,9 +5219,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.34", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", - "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -5196,9 +5247,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", "license": "ISC" }, "node_modules/@webassemblyjs/ast": { @@ -5424,19 +5475,18 @@ "license": "Apache-2.0" }, "node_modules/a11y-dialog": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/a11y-dialog/-/a11y-dialog-8.1.4.tgz", - "integrity": "sha512-CgaQfoTg9t+O8vArlNAYN7Gzv6h1bpWRqggzCtng6TQ2im6XCpUQI+GWlPvQdovQtwzJN6MydxipXKB8qP5Zxw==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/a11y-dialog/-/a11y-dialog-8.1.5.tgz", + "integrity": "sha512-SlFk3QSqeuvmN/anaIteUkB6ipBHoG1jq5gfQZU2kqvbkDW3Iab7SNufj4io4e8StvuIshD+loJnsQgTEvq6dA==", "license": "MIT", "dependencies": { "focusable-selectors": "^0.8.0" } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5449,7 +5499,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -5494,10 +5543,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -5529,9 +5577,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -5666,7 +5714,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/array-union": { @@ -5726,6 +5773,21 @@ "node": ">=0.8" } }, + "node_modules/ast-metadata-inferer": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz", + "integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==", + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^5.6.19" + } + }, + "node_modules/ast-metadata-inferer/node_modules/@mdn/browser-compat-data": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz", + "integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==", + "license": "CC0-1.0" + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", @@ -5787,9 +5849,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", "dev": true, "funding": [ { @@ -5807,10 +5869,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -5860,14 +5921,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", "semver": "^6.3.1" }, "peerDependencies": { @@ -5889,13 +5950,13 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" + "@babel/helper-define-polyfill-provider": "^0.6.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5914,6 +5975,13 @@ "node": ">= 10.0.0" } }, + "node_modules/badgen": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/badgen/-/badgen-3.2.3.tgz", + "integrity": "sha512-svDuwkc63E/z0ky3drpUppB83s/nlgDciH9m+STwwQoWyq7yCgew1qEfJ+9axkKdNq7MskByptWUN9j1PGMwFA==", + "dev": true, + "license": "MIT" + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -5928,7 +5996,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -5953,19 +6020,21 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.26", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.26.tgz", - "integrity": "sha512-73lC1ugzwoaWCLJ1LvOgrR5xsMLTqSKIEoMHVtL9E/HNk0PXtTM76ZIm84856/SF7Nv8mPZxKoBsgpm0tR1u1Q==", - "dev": true, + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", + "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==", "dev": true, "license": "MIT", "engines": { @@ -6041,10 +6110,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -6065,10 +6133,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", - "dev": true, + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "funding": [ { "type": "opencollective", @@ -6085,11 +6152,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -6196,24 +6263,23 @@ } }, "node_modules/cacheable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.1.1.tgz", - "integrity": "sha512-LmF4AXiSNdiRbI2UjH8pAp9NIXxeQsTotpEaegPiDcnN0YPygDJDV3l/Urc0mL72JWdATEorKqIHEx55nDlONg==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.4.tgz", + "integrity": "sha512-djgxybDbw9fL/ZWMI3+CE8ZilNxcwFkVtDc1gJ+IlOSSWkSMPQabhV/XCHTQ6pwwN6aivXPZ43omTooZiX06Ew==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/memoize": "^2.0.3", - "@cacheable/memory": "^2.0.3", - "@cacheable/utils": "^2.1.0", - "hookified": "^1.12.2", - "keyv": "^5.5.3", - "qified": "^0.5.0" + "@cacheable/memory": "^2.0.8", + "@cacheable/utils": "^2.4.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.9.0" } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { @@ -6265,7 +6331,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -6297,10 +6362,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", - "dev": true, + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", "funding": [ { "type": "opencollective", @@ -6423,9 +6487,9 @@ } }, "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -6571,9 +6635,9 @@ } }, "node_modules/cli-spinners": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.3.0.tgz", - "integrity": "sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, "license": "MIT", "engines": { @@ -6682,9 +6746,9 @@ } }, "node_modules/color-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", "engines": { "node": ">=12.20" @@ -6819,13 +6883,12 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", "dev": true, "license": "MIT" }, @@ -6870,13 +6933,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", - "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.26.3" + "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", @@ -6891,9 +6954,9 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6921,7 +6984,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -6933,9 +6995,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", - "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", + "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", "dev": true, "license": "ISC", "engines": { @@ -6946,30 +7008,30 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", - "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", + "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12 || >=16" + "node": ">=12" } }, "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz", + "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.33", + "postcss": "^8.4.40", "postcss-modules-extract-imports": "^3.1.0", "postcss-modules-local-by-default": "^4.0.5", "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "semver": "^7.6.3" }, "engines": { "node": ">= 18.12.0" @@ -6979,7 +7041,7 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "webpack": "^5.27.0" }, "peerDependenciesMeta": { @@ -6992,9 +7054,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -7005,15 +7067,15 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.2.tgz", - "integrity": "sha512-nBRWZtI77PBZQgcXMNqiIXVshiQOVLGSf2qX/WZfG8IQfMbeHUMXaBWQmiiSTmPJUflQxHjZjzAmuyO7tpL2Jg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.4.tgz", + "integrity": "sha512-2iACis+P8qdLj1tHcShtztkGhCNIRUajJj7iX0IM9a5FA0wXGwjV8Nf6+HsBjBfb4LO8TTAVoetBbM54V6f3+Q==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "cssnano": "^7.0.4", - "jest-worker": "^29.7.0", + "jest-worker": "^30.0.5", "postcss": "^8.4.40", "schema-utils": "^4.2.0", "serialize-javascript": "^6.0.2" @@ -7067,14 +7129,14 @@ } }, "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" @@ -7107,13 +7169,13 @@ } }, "node_modules/cssnano": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.2.tgz", - "integrity": "sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.9.tgz", + "integrity": "sha512-uPR75+5Dk/WJ/YSPR1/YDHdwMM9c5FsaARljfKWgeCKLKOtJ0we21xy/RcCjn53fZnD/f6yYEIZ8pu18+GnbNQ==", "dev": true, "license": "MIT", "dependencies": { - "cssnano-preset-default": "^7.0.10", + "cssnano-preset-default": "^7.0.17", "lilconfig": "^3.1.3" }, "engines": { @@ -7124,65 +7186,65 @@ "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/cssnano-preset-default": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.10.tgz", - "integrity": "sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA==", + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.17.tgz", + "integrity": "sha512-11qO63A+czwguQFJCaTdICvbaxn0pJzz/XghLlv+OT7WyToDxAMR0Xb3/26/l0y0hQJywwNbj/SLSQlGBHE1OA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.1", + "cssnano-utils": "^5.0.3", "postcss-calc": "^10.1.1", - "postcss-colormin": "^7.0.5", - "postcss-convert-values": "^7.0.8", - "postcss-discard-comments": "^7.0.5", - "postcss-discard-duplicates": "^7.0.2", - "postcss-discard-empty": "^7.0.1", - "postcss-discard-overridden": "^7.0.1", - "postcss-merge-longhand": "^7.0.5", - "postcss-merge-rules": "^7.0.7", - "postcss-minify-font-values": "^7.0.1", - "postcss-minify-gradients": "^7.0.1", - "postcss-minify-params": "^7.0.5", - "postcss-minify-selectors": "^7.0.5", - "postcss-normalize-charset": "^7.0.1", - "postcss-normalize-display-values": "^7.0.1", - "postcss-normalize-positions": "^7.0.1", - "postcss-normalize-repeat-style": "^7.0.1", - "postcss-normalize-string": "^7.0.1", - "postcss-normalize-timing-functions": "^7.0.1", - "postcss-normalize-unicode": "^7.0.5", - "postcss-normalize-url": "^7.0.1", - "postcss-normalize-whitespace": "^7.0.1", - "postcss-ordered-values": "^7.0.2", - "postcss-reduce-initial": "^7.0.5", - "postcss-reduce-transforms": "^7.0.1", - "postcss-svgo": "^7.1.0", - "postcss-unique-selectors": "^7.0.4" + "postcss-colormin": "^7.0.10", + "postcss-convert-values": "^7.0.12", + "postcss-discard-comments": "^7.0.8", + "postcss-discard-duplicates": "^7.0.4", + "postcss-discard-empty": "^7.0.3", + "postcss-discard-overridden": "^7.0.3", + "postcss-merge-longhand": "^7.0.7", + "postcss-merge-rules": "^7.0.11", + "postcss-minify-font-values": "^7.0.3", + "postcss-minify-gradients": "^7.0.5", + "postcss-minify-params": "^7.0.9", + "postcss-minify-selectors": "^7.1.2", + "postcss-normalize-charset": "^7.0.3", + "postcss-normalize-display-values": "^7.0.3", + "postcss-normalize-positions": "^7.0.4", + "postcss-normalize-repeat-style": "^7.0.4", + "postcss-normalize-string": "^7.0.3", + "postcss-normalize-timing-functions": "^7.0.3", + "postcss-normalize-unicode": "^7.0.9", + "postcss-normalize-url": "^7.0.3", + "postcss-normalize-whitespace": "^7.0.3", + "postcss-ordered-values": "^7.0.4", + "postcss-reduce-initial": "^7.0.9", + "postcss-reduce-transforms": "^7.0.3", + "postcss-svgo": "^7.1.3", + "postcss-unique-selectors": "^7.0.7" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/cssnano-utils": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", - "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.3.tgz", + "integrity": "sha512-ynIREMICLxkxm7e9bCR9sh75s4Q5drICi0ua1yxo5jH2XPBqSKkl4dOh4EbFqtUmnTMhRffHgYL0EKKkMjtJTg==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/csso": { @@ -7357,9 +7419,9 @@ } }, "node_modules/cypress/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -7409,9 +7471,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", "dev": true, "license": "MIT" }, @@ -7433,9 +7495,9 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -7449,13 +7511,12 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, "license": "MIT" }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -7470,9 +7531,9 @@ } }, "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", "engines": { @@ -7496,9 +7557,9 @@ } }, "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "dev": true, "license": "MIT" }, @@ -7563,17 +7624,13 @@ "license": "MIT" }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/devlop": { @@ -7701,9 +7758,9 @@ } }, "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "version": "17.2.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.4.tgz", + "integrity": "sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -7782,10 +7839,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.250", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz", - "integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==", - "dev": true, + "version": "1.5.351", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.351.tgz", + "integrity": "sha512-9D7Iqx8RImSvCnOsj86rCH6eQjZFQoM04Jn6HnZVM0Nu/G58/gmKYQ1d12MZTbjQbQSTGI8nwEy07ErsA2slLA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -7816,14 +7872,14 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -7867,9 +7923,9 @@ } }, "node_modules/envinfo": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.20.0.tgz", - "integrity": "sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, "license": "MIT", "bin": { @@ -7969,7 +8025,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -8019,7 +8074,6 @@ "version": "9.36.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", - "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", @@ -8076,11 +8130,43 @@ } } }, + "node_modules/eslint-plugin-compat": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.2.1.tgz", + "integrity": "sha512-gLKqUH+lQcCL+HzsROUjBDvakc5Zaga51Y4ZAkPCXc41pzKBfyluqTr2j8zOx8QQQb7zyglu1LVoL5aSNWf2SQ==", + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^6.1.1", + "ast-metadata-inferer": "^0.8.1", + "browserslist": "^4.25.2", + "find-up": "^5.0.0", + "globals": "^15.7.0", + "lodash.memoize": "^4.1.2", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=18.x" + }, + "peerDependencies": { + "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-compat/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -8097,7 +8183,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8110,7 +8195,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -8126,7 +8210,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -8143,7 +8226,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -8156,14 +8238,12 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -8176,7 +8256,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8186,7 +8265,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -8199,7 +8277,6 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", @@ -8228,10 +8305,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -8244,7 +8320,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -8257,7 +8332,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -8267,7 +8341,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -8294,9 +8367,9 @@ "license": "MIT" }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "dev": true, "license": "MIT" }, @@ -8421,7 +8494,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -8458,20 +8530,18 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -8496,9 +8566,9 @@ } }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -8553,6 +8623,24 @@ "pend": "~1.2.0" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -8573,7 +8661,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" @@ -8663,7 +8750,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -8696,7 +8782,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -8707,10 +8792,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "license": "ISC" }, "node_modules/focusable-selectors": { @@ -8730,9 +8814,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { @@ -8816,9 +8900,9 @@ "license": "ISC" }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "license": "MIT", "engines": { @@ -8947,16 +9031,6 @@ "git-up": "^8.1.0" } }, - "node_modules/gitignore-to-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/gitignore-to-glob/-/gitignore-to-glob-0.3.0.tgz", - "integrity": "sha512-mk74BdnK7lIwDHnotHddx1wsjMOFIThpLY3cPNniJ/2fA/tlLzHnFxIdR+4sLOu5KGgQJdij4kjJ2RoUNnCNMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.4 <5 || >=6.9" - } - }, "node_modules/gl-matrix": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", @@ -8967,7 +9041,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -8989,7 +9063,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -9073,7 +9146,6 @@ "version": "15.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -9195,14 +9267,27 @@ "engines": { "node": ">=8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "dev": true, "license": "MIT", "dependencies": { @@ -9449,9 +9534,9 @@ } }, "node_modules/hookified": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz", - "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", "dev": true, "license": "MIT" }, @@ -9513,9 +9598,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", - "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", "dev": true, "license": "MIT", "optional": true, @@ -9630,9 +9715,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, "license": "MIT", "dependencies": { @@ -9684,16 +9769,15 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "dev": true, "license": "MIT" }, @@ -9701,7 +9785,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -9807,7 +9890,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -9890,9 +9972,9 @@ } }, "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", "dev": true, "license": "MIT", "engines": { @@ -9907,13 +9989,13 @@ "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -9966,7 +10048,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9986,7 +10067,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -10224,7 +10304,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/isobject": { @@ -10261,22 +10340,32 @@ "node": "^18.17 || >=20.6.1" } }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "30.3.0", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-util/node_modules/ansi-styles": { @@ -10312,22 +10401,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-util/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -10372,19 +10445,20 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "supports-color": "^8.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-worker/node_modules/has-flag": { @@ -10414,10 +10488,10 @@ } }, "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "devOptional": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -10444,10 +10518,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -10464,42 +10537,42 @@ "license": "MIT" }, "node_modules/jscpd": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/jscpd/-/jscpd-4.0.5.tgz", - "integrity": "sha512-AzJlSLvKtXYkQm93DKE1cRN3rf6pkpv3fm5TVuvECwoqljQlCM/56ujHn9xPcE7wyUnH5+yHr7tcTiveIoMBoQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/jscpd/-/jscpd-4.0.9.tgz", + "integrity": "sha512-fp6Sh42W3mIPoQgZmgYmKDLQzEDnnX2vaGlTN4haILkB2vsi+ewcCHEtWR/2CR/QbsBvAvsNo8U5Sa+p9aHiGw==", "dev": true, "license": "MIT", "dependencies": { - "@jscpd/core": "4.0.1", - "@jscpd/finder": "4.0.1", - "@jscpd/html-reporter": "4.0.1", - "@jscpd/tokenizer": "4.0.1", + "@jscpd/badge-reporter": "4.0.5", + "@jscpd/core": "4.0.5", + "@jscpd/finder": "4.0.5", + "@jscpd/html-reporter": "4.0.5", + "@jscpd/tokenizer": "4.0.5", "colors": "^1.4.0", "commander": "^5.0.0", "fs-extra": "^11.2.0", - "gitignore-to-glob": "^0.3.0", - "jscpd-sarif-reporter": "4.0.3" + "jscpd-sarif-reporter": "4.0.7" }, "bin": { "jscpd": "bin/jscpd" } }, "node_modules/jscpd-sarif-reporter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/jscpd-sarif-reporter/-/jscpd-sarif-reporter-4.0.3.tgz", - "integrity": "sha512-0T7KiWiDIVArvlBkvCorn2NFwQe7p7DJ37o4YFRuPLDpcr1jNHQlEfbFPw8hDdgJ4hpfby6A5YwyHqASKJ7drA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/jscpd-sarif-reporter/-/jscpd-sarif-reporter-4.0.7.tgz", + "integrity": "sha512-Q/VlfTI/Nbjc8dZ/2pDVIf1aRi2bM2CTYujcAoeYr7brRnS4o5ZeW86W8q7MM7cQu40gezlNckl+E9wKFSMFiA==", "dev": true, "license": "MIT", "dependencies": { "colors": "^1.4.0", "fs-extra": "^11.2.0", - "node-sarif-builder": "^2.0.3" + "node-sarif-builder": "^3.4.0" } }, "node_modules/jscpd-sarif-reporter/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -10522,9 +10595,9 @@ } }, "node_modules/jscpd/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -10553,7 +10626,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -10574,14 +10646,12 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, "license": "MIT" }, "node_modules/json-stringify-pretty-compact": { @@ -10597,6 +10667,13 @@ "dev": true, "license": "ISC" }, + "node_modules/json-with-bigint": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", + "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -10611,9 +10688,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10660,7 +10737,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" @@ -10702,7 +10778,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -10777,9 +10852,9 @@ } }, "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", "dev": true, "license": "MIT", "engines": { @@ -10809,7 +10884,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -10822,15 +10896,15 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "license": "MIT" }, "node_modules/lodash.capitalize": { @@ -10872,14 +10946,12 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "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" }, "node_modules/lodash.once": { @@ -11136,9 +11208,9 @@ } }, "node_modules/maplibre-gl": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.6.2.tgz", - "integrity": "sha512-SEqYThhUCFf6Lm0TckpgpKnto5u4JsdPYdFJb6g12VtuaFsm3nYdBO+fOmnUYddc8dXihgoGnuXvPPooUcRv5w==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.16.0.tgz", + "integrity": "sha512-/VDY89nr4jgLJyzmhy325cG6VUI02WkZ/UfVuDbG/piXzo6ODnM+omDFIwWY8tsEsBG26DNDmNMn3Y2ikHsBiA==", "license": "BSD-3-Clause", "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", @@ -11148,14 +11220,15 @@ "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^2.0.4", "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^23.3.0", - "@maplibre/vt-pbf": "^4.0.3", + "@maplibre/maplibre-gl-style-spec": "^24.4.1", + "@maplibre/mlt": "^1.1.2", + "@maplibre/vt-pbf": "^4.2.0", "@types/geojson": "^7946.0.16", "@types/geojson-vt": "3.2.5", "@types/supercluster": "^7.1.3", "earcut": "^3.0.2", "geojson-vt": "^4.0.2", - "gl-matrix": "^3.4.3", + "gl-matrix": "^3.4.4", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^4.0.1", @@ -11236,9 +11309,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -11399,9 +11472,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -11454,9 +11527,9 @@ } }, "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "dev": true, "license": "CC0-1.0" }, @@ -12067,6 +12140,19 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -12114,9 +12200,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", - "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", "dev": true, "license": "MIT", "dependencies": { @@ -12135,10 +12221,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -12179,9 +12264,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "dev": true, "funding": [ { @@ -12201,7 +12286,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, "license": "MIT" }, "node_modules/neo-async": { @@ -12212,9 +12296,9 @@ "license": "MIT" }, "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", "dev": true, "license": "MIT", "engines": { @@ -12293,9 +12377,9 @@ } }, "node_modules/node-notifier/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -12309,6 +12393,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT", "bin": { @@ -12316,30 +12401,29 @@ } }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", "license": "MIT" }, "node_modules/node-sarif-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-2.0.3.tgz", - "integrity": "sha512-Pzr3rol8fvhG/oJjIq2NTVB0vmdNNlz22FENhhPojYRZ4/ee08CfK4YuKmuL54V9MLhI1kpzxfOJ/63LzmZzDg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz", + "integrity": "sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==", "dev": true, "license": "MIT", "dependencies": { - "@types/sarif": "^2.1.4", - "fs-extra": "^10.0.0" + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/node-sarif-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -12348,7 +12432,7 @@ "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, "node_modules/normalize-path": { @@ -12361,16 +12445,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -12398,25 +12472,30 @@ } }, "node_modules/nypm": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", - "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.6.tgz", + "integrity": "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==", "dev": true, "license": "MIT", "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.2", + "citty": "^0.2.2", "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "tinyexec": "^1.0.1" + "tinyexec": "^1.1.1" }, "bin": { "nypm": "dist/cli.mjs" }, "engines": { - "node": "^14.16.0 || >=16.10.0" + "node": ">=18" } }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "dev": true, + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -12502,7 +12581,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", @@ -12659,14 +12737,14 @@ } }, "node_modules/ora/node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { "node": ">=20" @@ -12676,13 +12754,13 @@ } }, "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -12719,7 +12797,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -12735,7 +12812,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -12817,7 +12893,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -12911,7 +12986,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12938,7 +13012,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12988,9 +13061,9 @@ "license": "MIT" }, "node_modules/perfect-debounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", - "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", "dev": true, "license": "MIT" }, @@ -13005,17 +13078,16 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -13159,21 +13231,21 @@ } }, "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", + "confbox": "^0.2.4", + "exsolve": "^1.0.8", "pathe": "^2.0.3" } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "dev": true, "funding": [ { @@ -13217,100 +13289,100 @@ } }, "node_modules/postcss-colormin": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.5.tgz", - "integrity": "sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.10.tgz", + "integrity": "sha512-yFr6JezOolHLta/buLE71VKPh2mXursp4saVe98/ol8ZnEWhL+racShqPKlvd/DKWLre/39B6HhcMXf7RZ3hxg==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "@colordx/core": "^5.4.3", + "browserslist": "^4.28.2", "caniuse-api": "^3.0.0", - "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-convert-values": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.8.tgz", - "integrity": "sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.12.tgz", + "integrity": "sha512-xurKu5qqk4viR3Cp3p4xBR4KfnZm4w4ys6+UBwBmeuBSNkH7+DtLnYOYnOffgtE4yx8sH9S1VZ6RAAvROXzP2Q==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-comments": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.5.tgz", - "integrity": "sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.8.tgz", + "integrity": "sha512-CvvS5S9WrXblFXCEJ9nVo+4z+eA7zSC7Z88V1HEJuwlQhlFnYTIjg1xJY+BCUiG2bvICap2tXii4mP22BD108Q==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-duplicates": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", - "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.4.tgz", + "integrity": "sha512-VBNn1+EuMZkeGVVtz0gRfbNGtx9IFgAsAV+E2pHtXPrp4qfGBkhTIiAuE/wrb+Y6Pakg9NewAlfTpYIFAWODtw==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-empty": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", - "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.3.tgz", + "integrity": "sha512-M2pyjQCU+/7cMHVtL6bKTHjv0lZnPLMpicgr67Dlth7AbuV9gjVTtUqaRwn6Pp6BwSDspUzhz8SaUrRykJU5Dw==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-overridden": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", - "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.3.tgz", + "integrity": "sha512-aNovXo9UsZuRNLzHJtp13lHIvinDPfiXBPePpXkSjCbgp++iU2FqE+YxvjIsg6EdyPZsASFbfu+JcBFVsErXIQ==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-loader": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.0.tgz", - "integrity": "sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.1.tgz", + "integrity": "sha512-k98jtRzthjj3f76MYTs9JTpRqV1RaaMhEU0Lpw9OTmQZQdppg4B30VZ74BojuBHt3F4KyubHJoXCMUeM8Bqeow==", "dev": true, "license": "MIT", "dependencies": { @@ -13326,7 +13398,7 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" }, @@ -13340,9 +13412,9 @@ } }, "node_modules/postcss-loader/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -13353,45 +13425,45 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", - "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.7.tgz", + "integrity": "sha512-b3mfYUxR388u5Pt0HPcVIUtUDn/k15UfTY9M+ORW+meCR6JLNxoZffiYvXyOYQoRYQNZyX/UFkMCM/mNHxe1qA==", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.5" + "stylehacks": "^7.0.11" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-merge-rules": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.7.tgz", - "integrity": "sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.11.tgz", + "integrity": "sha512-SJUPM18g2BmPhf8BVlbwqWz4aK3pLu6u6xjfwEzra7xL6IBR10sUaiB++EzqcVfadPHrKBSMlNdP+XieykhI+Q==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.1", - "postcss-selector-parser": "^7.1.0" + "cssnano-utils": "^5.0.3", + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-font-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", - "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.3.tgz", + "integrity": "sha512-yilG/VOaNI74IylQvAQQxm3/wZVBkXyYUqNUAdxqwtbWUXPsbK1q8Ms0mL83v+f8YicgcyfYCRZtWACUdYajpA==", "dev": true, "license": "MIT", "dependencies": { @@ -13401,60 +13473,62 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-gradients": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", - "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.5.tgz", + "integrity": "sha512-YraROyQRg3BI1+Hg8E05B/JPdnTm8EDSVu4P2BxdM+CRiOyfmou809+chGIqo6fQqwjPGQ947nbGncSjmTU1WQ==", "dev": true, "license": "MIT", "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^5.0.1", + "@colordx/core": "^5.4.3", + "cssnano-utils": "^5.0.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-params": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.5.tgz", - "integrity": "sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.9.tgz", + "integrity": "sha512-R8itbB8BhlpoYyBm1ou0dD+vJnQ3F6adQipR4UnkCHUwlo+S9WXJaDRg1RHjC8YVAtIdrQzSWvJl40HnGDTKjA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "cssnano-utils": "^5.0.1", + "browserslist": "^4.28.2", + "cssnano-utils": "^5.0.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-selectors": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", - "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.1.2.tgz", + "integrity": "sha512-aQtrEWKwqafNlExcKHQvPGsXR2+vlUqqJtf5XsCQcgsSb5PL4wlujWBYDJuWsP4UnQX1YHDHU8qRlD+1PzTQ+Q==", "dev": true, "license": "MIT", "dependencies": { + "browserslist": "^4.28.1", + "caniuse-api": "^3.0.0", "cssesc": "^3.0.0", - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-modules-extract-imports": { @@ -13521,22 +13595,22 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", - "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.3.tgz", + "integrity": "sha512-NoBfZu8PR4c2NlmjvrqQTzCzLY79hwcSRgNQ3ZiNK0ABzf9kYKloE/jNj+/8GQY1wsm8pRRgANk6ydLH8cwo0Q==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-display-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", - "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.3.tgz", + "integrity": "sha512-ldsCX0QIt05pKIOobZtVQ48wXJecr+czw4+e1/YjVhLMqslShgpVxgPtI2CefURR8oyVoYaU/l829MMwExDMLw==", "dev": true, "license": "MIT", "dependencies": { @@ -13546,13 +13620,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-positions": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", - "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.4.tgz", + "integrity": "sha512-VEvlpeGd3Ju1Hqa/oN4jaP3+ms4laYwkEL9N9u+B6k54PZjXbW1n6wI+aVprf1BQXlCYpS5+1pl/7/vHiKgARg==", "dev": true, "license": "MIT", "dependencies": { @@ -13562,13 +13636,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", - "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.4.tgz", + "integrity": "sha512-6mPKlY/8cSaDHxX502wERADarJsccwlky6yIrOapHH2ZgfoKAV94SbiTKfKEs4EEpdazuc3J72WsqeYk7hp9+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13578,13 +13652,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-string": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", - "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.3.tgz", + "integrity": "sha512-HnEQPUchi1eznmDKEYrKUTqrprEq97SrpUYClgUkv7V2zRODD9DFoUsYU+m9ZOetmD5ku7fEMZB/lwy8IT6xVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13594,13 +13668,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", - "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.3.tgz", + "integrity": "sha512-zmEzHdvpZBZu0OKlbJSfgASQvaayyAoVuWtvyr34IJ/LyS+DaOKvvR3EvFJ9RWWtNIx+CMvO125OVophaxNYew==", "dev": true, "license": "MIT", "dependencies": { @@ -13610,30 +13684,30 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-unicode": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.5.tgz", - "integrity": "sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.9.tgz", + "integrity": "sha512-DRAdWfeh/TjmhLJsw91vdiWCnUod9iwvM7xyS02/nF/sLsCR3A8l3pztrSUrWG8DSBqfX7yEk9FM0USaVJ2mSg==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-url": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", - "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.3.tgz", + "integrity": "sha512-CL93wmloq5qsffmFv+bw24MIRbmhHrp53qoh1LDAb/5TtjWEXI/np4xcP/Gw9oWCb2XyWnqHYLDUwiKRoJBA1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13643,13 +13717,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-whitespace": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", - "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.3.tgz", + "integrity": "sha512-FdHjjn+Ht5Z2ZRjNOmeCbNq6lq09sUYKpmlF/Aq0XjVNSLTL6fmHlA/3swN2wP2caY9GV/tjSDcIIyS7aN7W0A==", "dev": true, "license": "MIT", "dependencies": { @@ -13659,47 +13733,47 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-ordered-values": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", - "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.4.tgz", + "integrity": "sha512-nubSi49hDHQk4E8KIj+IbLY8Bg+8OcSUEhgyolgM+atnOvXjV7EjaR6bac4YGZoFyPa9mWoAF3EaYbWdFkKqVg==", "dev": true, "license": "MIT", "dependencies": { - "cssnano-utils": "^5.0.1", + "cssnano-utils": "^5.0.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-reduce-initial": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.5.tgz", - "integrity": "sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.9.tgz", + "integrity": "sha512-ztTNPdIxXTxtBcG03E9u8v44M4ElXbMIRT7pf2onlquGula0Y83nKKxqM22FA/hMgkfCjN7ohevkVlaNwI8iOQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.2", "caniuse-api": "^3.0.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-reduce-transforms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", - "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.3.tgz", + "integrity": "sha512-FXsnN9ZwcZTT8Yf8cAHA8qIGUXcX6WfLd9JoYhrdDfmvsVhhfqkkv7m4AC3rwFOfz+GzkUa87OCKF9dUcicd+g==", "dev": true, "license": "MIT", "dependencies": { @@ -13709,7 +13783,7 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-resolve-nested-selector": { @@ -13747,9 +13821,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -13761,36 +13835,36 @@ } }, "node_modules/postcss-svgo": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz", - "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.3.tgz", + "integrity": "sha512-2QfoFOYMcj8lwcVEf9WeTlkVIAm7u2QvOEhMzkQU3KUhhGX/l8hVV9EtjMv4iq3E9iI3OeeMN0YoMLbGusuigw==", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^4.0.0" + "svgo": "^4.0.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >= 18" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-unique-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", - "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.7.tgz", + "integrity": "sha512-d+sCkaRnSefghOUdH8CMJZV9yUQhj2ojpe8Nw/lA+LV1UOfeleGkLTl6XdCFFSai9UJ+DJPb69FFuqthXYsY8w==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/postcss-value-parser": { @@ -13810,7 +13884,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -13871,9 +13944,9 @@ } }, "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz", + "integrity": "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==", "license": "MIT" }, "node_modules/protocols": { @@ -13928,13 +14001,13 @@ "license": "MIT" }, "node_modules/pug": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", - "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.4.tgz", + "integrity": "sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==", "dev": true, "license": "MIT", "dependencies": { - "pug-code-gen": "^3.0.3", + "pug-code-gen": "^3.0.4", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", @@ -13957,9 +14030,9 @@ } }, "node_modules/pug-code-gen": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", - "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.4.tgz", + "integrity": "sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==", "dev": true, "license": "MIT", "dependencies": { @@ -14064,9 +14137,9 @@ "license": "MIT" }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "license": "MIT", "dependencies": { @@ -14078,29 +14151,35 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qified": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.1.tgz", - "integrity": "sha512-+BtFN3dCP+IaFA6IYNOu/f/uK1B8xD2QWyOeCse0rjtAebBmkzgd2d1OAXi3ikAzJMIBSdzZDNZ3wZKEUDQs5w==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.9.1.tgz", + "integrity": "sha512-n7mar4T0xQ+39dE2vGTAlbxUEpndwPANH0kDef1/MYsB8Bba9wshkybIRx74qgcvKQPEWErf9AqAdYjhzY2Ilg==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.12.2" + "hookified": "^2.1.1" }, "engines": { "node": ">=20" } }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT" + }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14260,9 +14339,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -14553,12 +14632,13 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -14600,7 +14680,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -14808,9 +14887,9 @@ } }, "node_modules/sass-loader": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.6.tgz", - "integrity": "sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.7.tgz", + "integrity": "sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==", "dev": true, "license": "MIT", "dependencies": { @@ -14824,7 +14903,7 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", @@ -14849,11 +14928,14 @@ } }, "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "dev": true, - "license": "BlueOak-1.0.0" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/schema-utils": { "version": "4.3.3", @@ -14876,9 +14958,9 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -14986,21 +15068,10 @@ "@img/sharp-win32-x64": "0.33.5" } }, - "node_modules/sharp/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/sharp/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "peer": true, @@ -15015,7 +15086,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -15028,7 +15098,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -15062,14 +15131,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -15235,13 +15304,13 @@ } }, "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.8.tgz", + "integrity": "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==", "dev": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -15265,9 +15334,9 @@ } }, "node_modules/sortablejs": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", - "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.7.tgz", + "integrity": "sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==", "license": "MIT" }, "node_modules/source-map": { @@ -15420,7 +15489,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -15447,20 +15515,20 @@ } }, "node_modules/stylehacks": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.7.tgz", - "integrity": "sha512-bJkD0JkEtbRrMFtwgpJyBbFIwfDDONQ1Ov3sDLZQP8HuJ73kBOyx66H4bOcAbVWmnfLdvQ0AJwXxOMkpujcO6g==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.11.tgz", + "integrity": "sha512-iODNfhXVLqc5LADs+Y6Oh5wJuK5ZcHbVng8aiK3y9pjMQdc5hLrBW0eFU6FtnpNrE6PoEg/MmFTU4waotj5WNg==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "postcss-selector-parser": "^7.1.0" + "browserslist": "^4.28.2", + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.5.13" } }, "node_modules/stylelint": { @@ -15603,15 +15671,15 @@ } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.18", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.18.tgz", - "integrity": "sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ==", + "version": "6.1.22", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.22.tgz", + "integrity": "sha512-N2dnzVJIphnNsjHcrxGW7DePckJ6haPrSFqpsBUhHYgwtKGVq4JrBGielEGD2fCVnsGm1zlBVZ8wGhkyuetgug==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^2.1.0", - "flatted": "^3.3.3", - "hookified": "^1.12.0" + "cacheable": "^2.3.4", + "flatted": "^3.4.2", + "hookified": "^1.15.0" } }, "node_modules/stylelint/node_modules/globby": { @@ -15756,9 +15824,9 @@ } }, "node_modules/svgo": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", - "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "dev": true, "license": "MIT", "dependencies": { @@ -15768,7 +15836,7 @@ "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", - "sax": "^1.4.1" + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo.js" @@ -15931,9 +15999,9 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -16009,9 +16077,9 @@ } }, "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -16029,9 +16097,9 @@ "license": "MIT" }, "node_modules/terser": { - "version": "5.44.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", - "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", + "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -16048,16 +16116,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -16148,9 +16215,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", "dev": true, "license": "MIT", "engines": { @@ -16174,37 +16241,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", @@ -16262,9 +16298,9 @@ "license": "MIT" }, "node_modules/tom-select": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tom-select/-/tom-select-2.4.3.tgz", - "integrity": "sha512-MFFrMxP1bpnAMPbdvPCZk0KwYxLqhYZso39torcdoefeV/NThNyDu8dV96/INJ5XQVTL3O55+GqQ78Pkj5oCfw==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/tom-select/-/tom-select-2.4.6.tgz", + "integrity": "sha512-Hhqi15AiTl0+FjaHVTXvUkF3t7x4W5LXUHxLYlzp7r8bcIgGJyz9M+3ZvrHdTRvEmV4EmNyJPbHJJnZOjr5Iig==", "license": "Apache-2.0", "dependencies": { "@orchidjs/sifter": "^1.1.0", @@ -16362,7 +16398,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -16392,9 +16427,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "dev": true, "license": "MIT" }, @@ -16571,10 +16606,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", - "dev": true, + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -16605,7 +16639,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -16636,9 +16669,9 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -16708,9 +16741,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "license": "MIT", "dependencies": { @@ -16876,9 +16909,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", "dev": true, "license": "MIT", "engines": { @@ -16932,7 +16965,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -17138,7 +17170,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17249,9 +17280,9 @@ } }, "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -17322,7 +17353,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" From 2d7d54ad8ffa5724d77ad1799df6fba6372c48c1 Mon Sep 17 00:00:00 2001 From: koromerzhin <308012+koromerzhin@users.noreply.github.com> Date: Wed, 6 May 2026 09:54:30 +0200 Subject: [PATCH 50/50] =?UTF-8?q?fix:=20simplifier=20la=20logique=20de=20f?= =?UTF-8?q?iltrage=20des=20acteurs=20dans=20la=20m=C3=A9thode=20getJsonLdA?= =?UTF-8?q?ctors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/Data/SagaData.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/src/Data/SagaData.php b/apps/src/Data/SagaData.php index a2cab5894..7104fe0e9 100644 --- a/apps/src/Data/SagaData.php +++ b/apps/src/Data/SagaData.php @@ -185,10 +185,7 @@ private function getJsonLdActors(Movie $movie): array foreach ($movie->getCastings() as $casting) { $person = $casting->getRefPerson(); $knownForDepartment = $casting->getKnownForDepartment(); - if ('Acting' !== $knownForDepartment) { - continue; - } - if (false === $person->isEnable()) { + if ('Acting' !== $knownForDepartment || false === $person->isEnable()) { continue; }