From 4e8e81c86b1fb09bb831bb0092accbc0c2b8344e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Ferrer=20Gonza=CC=81lez?= Date: Mon, 4 Dec 2023 16:57:21 +0100 Subject: [PATCH 1/3] refactor: add PHP 8.3 override attribute and typed class constants --- apps/backoffice/backend/public/index.php | 2 +- .../backoffice/backend/src/BackofficeBackendKernel.php | 7 +++++-- apps/backoffice/frontend/public/index.php | 2 +- .../frontend/src/BackofficeFrontendKernel.php | 7 +++++-- .../Command/ImportCoursesToElasticsearchCommand.php | 2 ++ .../src/Controller/Courses/CoursesGetWebController.php | 2 ++ .../Controller/Courses/CoursesPostWebController.php | 2 ++ .../src/Controller/Home/HomeGetWebController.php | 2 ++ apps/mooc/backend/public/index.php | 2 +- .../MySql/ConsumeMySqlDomainEventsCommand.php | 5 ++++- .../PublishDomainEventsFromMutationsCommand.php | 5 ++++- .../DomainEvents/RabbitMq/ConfigureRabbitMqCommand.php | 2 ++ .../RabbitMq/ConsumeRabbitMqDomainEventsCommand.php | 5 ++++- .../GenerateSupervisorRabbitMqConsumerFilesCommand.php | 9 ++++++--- .../src/Controller/Courses/CoursesPutController.php | 2 ++ .../CoursesCounter/CoursesCounterGetController.php | 2 ++ apps/mooc/backend/src/MoocBackendKernel.php | 7 +++++-- rector.php | 2 +- .../Persistence/InMemoryAuthRepository.php | 2 +- .../ElasticsearchBackofficeCourseRepository.php | 2 ++ src/Mooc/Courses/Domain/CourseCreatedDomainEvent.php | 4 ++++ src/Mooc/Courses/Domain/CourseNotExist.php | 3 +++ .../Persistence/Doctrine/CourseIdType.php | 2 ++ .../Domain/CoursesCounterIncrementedDomainEvent.php | 4 ++++ .../Persistence/Doctrine/CourseCounterIdType.php | 2 ++ .../Persistence/Doctrine/CourseIdsType.php | 4 ++++ .../Infrastructure/Doctrine/DbalTypesSearcher.php | 2 +- .../Doctrine/DoctrinePrefixesSearcher.php | 2 +- src/Mooc/Videos/Domain/VideoCreatedDomainEvent.php | 4 ++++ src/Mooc/Videos/Domain/VideoNotFound.php | 3 +++ src/Mooc/Videos/Domain/Videos.php | 2 ++ .../Persistence/Doctrine/VideoIdType.php | 2 ++ src/Shared/Domain/Criteria/Filters.php | 2 ++ .../Bus/Event/MySql/MySqlDoctrineEventBus.php | 2 +- .../Infrastructure/Persistence/Doctrine/UuidType.php | 4 ++++ .../Elasticsearch/ElasticQueryGenerator.php | 10 +++++----- .../AuthenticateUserCommandHandlerTest.php | 2 ++ .../BackofficeContextInfrastructureTestCase.php | 3 +++ .../Create/CreateCourseCommandHandlerTest.php | 2 ++ .../Courses/Application/Update/CourseRenamerTest.php | 2 ++ .../Find/FindCoursesCounterQueryHandlerTest.php | 2 ++ .../IncrementCoursesCounterOnCourseCreatedTest.php | 2 ++ .../PhpUnit/MoocContextInfrastructureTestCase.php | 4 ++++ .../Bus/Command/InMemorySymfonyCommandBusTest.php | 2 ++ .../Bus/Event/MySql/MySqlDoctrineEventBusTest.php | 3 +++ .../Bus/Event/RabbitMq/RabbitMqEventBusTest.php | 3 +++ .../Bus/Query/InMemorySymfonyQueryBusTest.php | 2 ++ .../Infrastructure/Mink/MinkSessionRequestHelper.php | 4 ++-- .../Mockery/CodelyTvMatcherIsSimilar.php | 3 +++ .../Comparator/AggregateRootArraySimilarComparator.php | 5 ++++- .../Comparator/AggregateRootSimilarComparator.php | 3 +++ .../PhpUnit/Comparator/DateTimeSimilarComparator.php | 3 +++ .../Comparator/DateTimeStringSimilarComparator.php | 3 +++ .../Comparator/DomainEventArraySimilarComparator.php | 5 ++++- .../Comparator/DomainEventSimilarComparator.php | 3 +++ .../PhpUnit/Constraint/CodelyTvConstraintIsSimilar.php | 5 ++++- .../Infrastructure/PhpUnit/InfrastructureTestCase.php | 2 ++ 57 files changed, 156 insertions(+), 30 deletions(-) diff --git a/apps/backoffice/backend/public/index.php b/apps/backoffice/backend/public/index.php index 45fd7eab5..5ef5102d3 100644 --- a/apps/backoffice/backend/public/index.php +++ b/apps/backoffice/backend/public/index.php @@ -16,7 +16,7 @@ if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) { Request::setTrustedProxies( - explode(',', $trustedProxies), + explode(',', (string) $trustedProxies), Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO ); } diff --git a/apps/backoffice/backend/src/BackofficeBackendKernel.php b/apps/backoffice/backend/src/BackofficeBackendKernel.php index 6ed60b1be..302ec75fd 100644 --- a/apps/backoffice/backend/src/BackofficeBackendKernel.php +++ b/apps/backoffice/backend/src/BackofficeBackendKernel.php @@ -4,20 +4,22 @@ namespace CodelyTv\Apps\Backoffice\Backend; +use Override; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\HttpKernel\Kernel; +use Symfony\Component\HttpKernel\Kernel; use function dirname; class BackofficeBackendKernel extends Kernel { use MicroKernelTrait; - private const CONFIG_EXTS = '.{xml,yaml}'; + private const string CONFIG_EXTS = '.{xml,yaml}'; + #[Override] public function registerBundles(): iterable { $contents = require $this->getProjectDir() . '/config/bundles.php'; @@ -28,6 +30,7 @@ public function registerBundles(): iterable } } + #[Override] public function getProjectDir(): string { return dirname(__DIR__); diff --git a/apps/backoffice/frontend/public/index.php b/apps/backoffice/frontend/public/index.php index 6dd7c188e..c22196495 100644 --- a/apps/backoffice/frontend/public/index.php +++ b/apps/backoffice/frontend/public/index.php @@ -16,7 +16,7 @@ if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) { Request::setTrustedProxies( - explode(',', $trustedProxies), + explode(',', (string) $trustedProxies), Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO ); } diff --git a/apps/backoffice/frontend/src/BackofficeFrontendKernel.php b/apps/backoffice/frontend/src/BackofficeFrontendKernel.php index dd793f7ab..f5b47ff90 100644 --- a/apps/backoffice/frontend/src/BackofficeFrontendKernel.php +++ b/apps/backoffice/frontend/src/BackofficeFrontendKernel.php @@ -4,20 +4,22 @@ namespace CodelyTv\Apps\Backoffice\Frontend; +use Override; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\HttpKernel\Kernel; +use Symfony\Component\HttpKernel\Kernel; use function dirname; class BackofficeFrontendKernel extends Kernel { use MicroKernelTrait; - private const CONFIG_EXTS = '.{xml,yaml}'; + private const string CONFIG_EXTS = '.{xml,yaml}'; + #[Override] public function registerBundles(): iterable { $contents = require $this->getProjectDir() . '/config/bundles.php'; @@ -28,6 +30,7 @@ public function registerBundles(): iterable } } + #[Override] public function getProjectDir(): string { return dirname(__DIR__); diff --git a/apps/backoffice/frontend/src/Command/ImportCoursesToElasticsearchCommand.php b/apps/backoffice/frontend/src/Command/ImportCoursesToElasticsearchCommand.php index c27dd2396..573b2c8b1 100644 --- a/apps/backoffice/frontend/src/Command/ImportCoursesToElasticsearchCommand.php +++ b/apps/backoffice/frontend/src/Command/ImportCoursesToElasticsearchCommand.php @@ -6,6 +6,7 @@ use CodelyTv\Backoffice\Courses\Infrastructure\Persistence\ElasticsearchBackofficeCourseRepository; use CodelyTv\Backoffice\Courses\Infrastructure\Persistence\MySqlBackofficeCourseRepository; +use Override; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -19,6 +20,7 @@ public function __construct( parent::__construct(); } + #[Override] public function execute(InputInterface $input, OutputInterface $output): int { $courses = $this->mySqlRepository->searchAll(); diff --git a/apps/backoffice/frontend/src/Controller/Courses/CoursesGetWebController.php b/apps/backoffice/frontend/src/Controller/Courses/CoursesGetWebController.php index a9604d1b2..a3a4858c7 100644 --- a/apps/backoffice/frontend/src/Controller/Courses/CoursesGetWebController.php +++ b/apps/backoffice/frontend/src/Controller/Courses/CoursesGetWebController.php @@ -8,6 +8,7 @@ use CodelyTv\Mooc\CoursesCounter\Application\Find\FindCoursesCounterQuery; use CodelyTv\Shared\Domain\ValueObject\SimpleUuid; use CodelyTv\Shared\Infrastructure\Symfony\WebController; +use Override; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -29,6 +30,7 @@ public function __invoke(Request $request): Response ); } + #[Override] protected function exceptions(): array { return []; diff --git a/apps/backoffice/frontend/src/Controller/Courses/CoursesPostWebController.php b/apps/backoffice/frontend/src/Controller/Courses/CoursesPostWebController.php index 625d2a1d0..57659954f 100644 --- a/apps/backoffice/frontend/src/Controller/Courses/CoursesPostWebController.php +++ b/apps/backoffice/frontend/src/Controller/Courses/CoursesPostWebController.php @@ -6,6 +6,7 @@ use CodelyTv\Mooc\Courses\Application\Create\CreateCourseCommand; use CodelyTv\Shared\Infrastructure\Symfony\WebController; +use Override; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Validator\Constraints as Assert; @@ -23,6 +24,7 @@ public function __invoke(Request $request): RedirectResponse : $this->createCourse($request); } + #[Override] protected function exceptions(): array { return []; diff --git a/apps/backoffice/frontend/src/Controller/Home/HomeGetWebController.php b/apps/backoffice/frontend/src/Controller/Home/HomeGetWebController.php index 30e011847..d0584cfb8 100644 --- a/apps/backoffice/frontend/src/Controller/Home/HomeGetWebController.php +++ b/apps/backoffice/frontend/src/Controller/Home/HomeGetWebController.php @@ -5,6 +5,7 @@ namespace CodelyTv\Apps\Backoffice\Frontend\Controller\Home; use CodelyTv\Shared\Infrastructure\Symfony\WebController; +use Override; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -18,6 +19,7 @@ public function __invoke(Request $request): Response ]); } + #[Override] protected function exceptions(): array { return []; diff --git a/apps/mooc/backend/public/index.php b/apps/mooc/backend/public/index.php index b8655fe09..96f9856ab 100644 --- a/apps/mooc/backend/public/index.php +++ b/apps/mooc/backend/public/index.php @@ -16,7 +16,7 @@ if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) { Request::setTrustedProxies( - explode(',', $trustedProxies), + explode(',', (string) $trustedProxies), Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO ); } diff --git a/apps/mooc/backend/src/Command/DomainEvents/MySql/ConsumeMySqlDomainEventsCommand.php b/apps/mooc/backend/src/Command/DomainEvents/MySql/ConsumeMySqlDomainEventsCommand.php index 16d96c2a6..8147eb9b9 100644 --- a/apps/mooc/backend/src/Command/DomainEvents/MySql/ConsumeMySqlDomainEventsCommand.php +++ b/apps/mooc/backend/src/Command/DomainEvents/MySql/ConsumeMySqlDomainEventsCommand.php @@ -8,12 +8,13 @@ use CodelyTv\Shared\Infrastructure\Bus\Event\DomainEventSubscriberLocator; use CodelyTv\Shared\Infrastructure\Bus\Event\MySql\MySqlDoctrineDomainEventsConsumer; use CodelyTv\Shared\Infrastructure\Doctrine\DatabaseConnections; +use Override; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Output\OutputInterface; use function Lambdish\Phunctional\pipe; #[AsCommand(name: 'codely:domain-events:mysql:consume', description: 'Consume domain events from MySql',)] @@ -27,11 +28,13 @@ public function __construct( parent::__construct(); } + #[Override] protected function configure(): void { $this->addArgument('quantity', InputArgument::REQUIRED, 'Quantity of events to process'); } + #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { $quantityEventsToProcess = (int) $input->getArgument('quantity'); diff --git a/apps/mooc/backend/src/Command/DomainEvents/PublishDomainEventsFromMutationsCommand.php b/apps/mooc/backend/src/Command/DomainEvents/PublishDomainEventsFromMutationsCommand.php index 945784311..d38ce1584 100644 --- a/apps/mooc/backend/src/Command/DomainEvents/PublishDomainEventsFromMutationsCommand.php +++ b/apps/mooc/backend/src/Command/DomainEvents/PublishDomainEventsFromMutationsCommand.php @@ -9,6 +9,7 @@ use CodelyTv\Shared\Infrastructure\Cdc\DatabaseMutationAction; use CodelyTv\Shared\Infrastructure\Cdc\DatabaseMutationToDomainEvent; use Doctrine\ORM\EntityManager; +use Override; use RuntimeException; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; @@ -39,16 +40,18 @@ public function __construct( ]; } + #[Override] protected function configure(): void { $this->addArgument('quantity', InputArgument::REQUIRED, 'Quantity of mutations to process'); } + #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { $totalMutations = (int) $input->getArgument('quantity'); - $this->entityManager->wrapInTransaction(function (EntityManager $entityManager) use ($totalMutations) { + $this->entityManager->wrapInTransaction(function (EntityManager $entityManager) use ($totalMutations): void { $mutations = $entityManager->getConnection() ->executeQuery("SELECT * FROM mutations ORDER BY id ASC LIMIT $totalMutations FOR UPDATE") ->fetchAllAssociative(); diff --git a/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/ConfigureRabbitMqCommand.php b/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/ConfigureRabbitMqCommand.php index 72801af71..8fa3bd1d9 100644 --- a/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/ConfigureRabbitMqCommand.php +++ b/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/ConfigureRabbitMqCommand.php @@ -5,6 +5,7 @@ namespace CodelyTv\Apps\Mooc\Backend\Command\DomainEvents\RabbitMq; use CodelyTv\Shared\Infrastructure\Bus\Event\RabbitMq\RabbitMqConfigurer; +use Override; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; @@ -25,6 +26,7 @@ public function __construct( parent::__construct(); } + #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { $this->configurer->configure($this->exchangeName, ...iterator_to_array($this->subscribers)); diff --git a/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/ConsumeRabbitMqDomainEventsCommand.php b/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/ConsumeRabbitMqDomainEventsCommand.php index c29c056d8..c42bde928 100644 --- a/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/ConsumeRabbitMqDomainEventsCommand.php +++ b/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/ConsumeRabbitMqDomainEventsCommand.php @@ -7,12 +7,13 @@ use CodelyTv\Shared\Infrastructure\Bus\Event\DomainEventSubscriberLocator; use CodelyTv\Shared\Infrastructure\Bus\Event\RabbitMq\RabbitMqDomainEventsConsumer; use CodelyTv\Shared\Infrastructure\Doctrine\DatabaseConnections; +use Override; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Output\OutputInterface; use function Lambdish\Phunctional\repeat; #[AsCommand( @@ -29,6 +30,7 @@ public function __construct( parent::__construct(); } + #[Override] protected function configure(): void { $this @@ -36,6 +38,7 @@ protected function configure(): void ->addArgument('quantity', InputArgument::REQUIRED, 'Quantity of events to process'); } + #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { $queueName = $input->getArgument('queue'); diff --git a/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/GenerateSupervisorRabbitMqConsumerFilesCommand.php b/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/GenerateSupervisorRabbitMqConsumerFilesCommand.php index 646392bf3..ff44bc8cd 100644 --- a/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/GenerateSupervisorRabbitMqConsumerFilesCommand.php +++ b/apps/mooc/backend/src/Command/DomainEvents/RabbitMq/GenerateSupervisorRabbitMqConsumerFilesCommand.php @@ -7,12 +7,13 @@ use CodelyTv\Shared\Domain\Bus\Event\DomainEventSubscriber; use CodelyTv\Shared\Infrastructure\Bus\Event\DomainEventSubscriberLocator; use CodelyTv\Shared\Infrastructure\Bus\Event\RabbitMq\RabbitMqQueueNameFormatter; +use Override; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Output\OutputInterface; use function Lambdish\Phunctional\each; #[AsCommand( @@ -21,8 +22,8 @@ )] final class GenerateSupervisorRabbitMqConsumerFilesCommand extends Command { - private const EVENTS_TO_PROCESS_AT_TIME = 200; - private const NUMBERS_OF_PROCESSES_PER_SUBSCRIBER = 1; + private const int EVENTS_TO_PROCESS_AT_TIME = 200; + private const int NUMBERS_OF_PROCESSES_PER_SUBSCRIBER = 1; private const SUPERVISOR_PATH = __DIR__ . '/../../../../build/supervisor'; public function __construct(private readonly DomainEventSubscriberLocator $locator) @@ -30,11 +31,13 @@ public function __construct(private readonly DomainEventSubscriberLocator $locat parent::__construct(); } + #[Override] protected function configure(): void { $this->addArgument('command-path', InputArgument::OPTIONAL, 'Path on this is gonna be deployed', '/var/www'); } + #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { $path = $input->getArgument('command-path'); diff --git a/apps/mooc/backend/src/Controller/Courses/CoursesPutController.php b/apps/mooc/backend/src/Controller/Courses/CoursesPutController.php index 2a240f3a5..b6a90ee84 100644 --- a/apps/mooc/backend/src/Controller/Courses/CoursesPutController.php +++ b/apps/mooc/backend/src/Controller/Courses/CoursesPutController.php @@ -6,6 +6,7 @@ use CodelyTv\Mooc\Courses\Application\Create\CreateCourseCommand; use CodelyTv\Shared\Infrastructure\Symfony\ApiController; +use Override; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -24,6 +25,7 @@ public function __invoke(string $id, Request $request): Response return new Response('', Response::HTTP_CREATED); } + #[Override] protected function exceptions(): array { return []; diff --git a/apps/mooc/backend/src/Controller/CoursesCounter/CoursesCounterGetController.php b/apps/mooc/backend/src/Controller/CoursesCounter/CoursesCounterGetController.php index 0fb94b6ff..b307e0bae 100644 --- a/apps/mooc/backend/src/Controller/CoursesCounter/CoursesCounterGetController.php +++ b/apps/mooc/backend/src/Controller/CoursesCounter/CoursesCounterGetController.php @@ -8,6 +8,7 @@ use CodelyTv\Mooc\CoursesCounter\Application\Find\FindCoursesCounterQuery; use CodelyTv\Mooc\CoursesCounter\Domain\CoursesCounterNotExist; use CodelyTv\Shared\Infrastructure\Symfony\ApiController; +use Override; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; @@ -25,6 +26,7 @@ public function __invoke(): JsonResponse ); } + #[Override] protected function exceptions(): array { return [ diff --git a/apps/mooc/backend/src/MoocBackendKernel.php b/apps/mooc/backend/src/MoocBackendKernel.php index cc8f8ed58..c60d7e02e 100644 --- a/apps/mooc/backend/src/MoocBackendKernel.php +++ b/apps/mooc/backend/src/MoocBackendKernel.php @@ -4,20 +4,22 @@ namespace CodelyTv\Apps\Mooc\Backend; +use Override; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\HttpKernel\Kernel; +use Symfony\Component\HttpKernel\Kernel; use function dirname; class MoocBackendKernel extends Kernel { use MicroKernelTrait; - private const CONFIG_EXTS = '.{xml,yaml}'; + private const string CONFIG_EXTS = '.{xml,yaml}'; + #[Override] public function registerBundles(): iterable { $contents = require $this->getProjectDir() . '/config/bundles.php'; @@ -28,6 +30,7 @@ public function registerBundles(): iterable } } + #[Override] public function getProjectDir(): string { return dirname(__DIR__); diff --git a/rector.php b/rector.php index 7ec25f27b..c287c8bef 100644 --- a/rector.php +++ b/rector.php @@ -14,7 +14,7 @@ ]); $rectorConfig->sets([ - LevelSetList::UP_TO_PHP_82, + LevelSetList::UP_TO_PHP_83, SetList::TYPE_DECLARATION ]); diff --git a/src/Backoffice/Auth/Infrastructure/Persistence/InMemoryAuthRepository.php b/src/Backoffice/Auth/Infrastructure/Persistence/InMemoryAuthRepository.php index dea981f8a..883afa7cf 100644 --- a/src/Backoffice/Auth/Infrastructure/Persistence/InMemoryAuthRepository.php +++ b/src/Backoffice/Auth/Infrastructure/Persistence/InMemoryAuthRepository.php @@ -13,7 +13,7 @@ final class InMemoryAuthRepository implements AuthRepository { - private const USERS = [ + private const array USERS = [ 'javi' => 'barbitas', 'rafa' => 'pelazo', ]; diff --git a/src/Backoffice/Courses/Infrastructure/Persistence/ElasticsearchBackofficeCourseRepository.php b/src/Backoffice/Courses/Infrastructure/Persistence/ElasticsearchBackofficeCourseRepository.php index 3a359ce41..02a762288 100644 --- a/src/Backoffice/Courses/Infrastructure/Persistence/ElasticsearchBackofficeCourseRepository.php +++ b/src/Backoffice/Courses/Infrastructure/Persistence/ElasticsearchBackofficeCourseRepository.php @@ -9,6 +9,7 @@ use CodelyTv\Shared\Domain\Criteria\Criteria; use CodelyTv\Shared\Infrastructure\Persistence\Elasticsearch\ElasticsearchRepository; +use Override; use function Lambdish\Phunctional\map; final class ElasticsearchBackofficeCourseRepository extends ElasticsearchRepository implements BackofficeCourseRepository @@ -28,6 +29,7 @@ public function matching(Criteria $criteria): array return map($this->toCourse(), $this->searchByCriteria($criteria)); } + #[Override] protected function aggregateName(): string { return 'courses'; diff --git a/src/Mooc/Courses/Domain/CourseCreatedDomainEvent.php b/src/Mooc/Courses/Domain/CourseCreatedDomainEvent.php index 69e89f799..97c34381b 100644 --- a/src/Mooc/Courses/Domain/CourseCreatedDomainEvent.php +++ b/src/Mooc/Courses/Domain/CourseCreatedDomainEvent.php @@ -5,6 +5,7 @@ namespace CodelyTv\Mooc\Courses\Domain; use CodelyTv\Shared\Domain\Bus\Event\DomainEvent; +use Override; final class CourseCreatedDomainEvent extends DomainEvent { @@ -18,11 +19,13 @@ public function __construct( parent::__construct($id, $eventId, $occurredOn); } + #[Override] public static function eventName(): string { return 'course.created'; } + #[Override] public static function fromPrimitives( string $aggregateId, array $body, @@ -32,6 +35,7 @@ public static function fromPrimitives( return new self($aggregateId, $body['name'], $body['duration'], $eventId, $occurredOn); } + #[Override] public function toPrimitives(): array { return [ diff --git a/src/Mooc/Courses/Domain/CourseNotExist.php b/src/Mooc/Courses/Domain/CourseNotExist.php index c91f35340..c9ded4ba4 100644 --- a/src/Mooc/Courses/Domain/CourseNotExist.php +++ b/src/Mooc/Courses/Domain/CourseNotExist.php @@ -6,6 +6,7 @@ use CodelyTv\Mooc\Shared\Domain\Courses\CourseId; use CodelyTv\Shared\Domain\DomainError; +use Override; final class CourseNotExist extends DomainError { @@ -14,11 +15,13 @@ public function __construct(private readonly CourseId $id) parent::__construct(); } + #[Override] public function errorCode(): string { return 'course_not_exist'; } + #[Override] protected function errorMessage(): string { return sprintf('The course <%s> does not exist', $this->id->value()); diff --git a/src/Mooc/Courses/Infrastructure/Persistence/Doctrine/CourseIdType.php b/src/Mooc/Courses/Infrastructure/Persistence/Doctrine/CourseIdType.php index 389f9fb53..084ac87a7 100644 --- a/src/Mooc/Courses/Infrastructure/Persistence/Doctrine/CourseIdType.php +++ b/src/Mooc/Courses/Infrastructure/Persistence/Doctrine/CourseIdType.php @@ -6,9 +6,11 @@ use CodelyTv\Mooc\Shared\Domain\Courses\CourseId; use CodelyTv\Shared\Infrastructure\Persistence\Doctrine\UuidType; +use Override; final class CourseIdType extends UuidType { + #[Override] protected function typeClassName(): string { return CourseId::class; diff --git a/src/Mooc/CoursesCounter/Domain/CoursesCounterIncrementedDomainEvent.php b/src/Mooc/CoursesCounter/Domain/CoursesCounterIncrementedDomainEvent.php index a64681dc7..e39cbf1e8 100644 --- a/src/Mooc/CoursesCounter/Domain/CoursesCounterIncrementedDomainEvent.php +++ b/src/Mooc/CoursesCounter/Domain/CoursesCounterIncrementedDomainEvent.php @@ -5,6 +5,7 @@ namespace CodelyTv\Mooc\CoursesCounter\Domain; use CodelyTv\Shared\Domain\Bus\Event\DomainEvent; +use Override; final class CoursesCounterIncrementedDomainEvent extends DomainEvent { @@ -17,11 +18,13 @@ public function __construct( parent::__construct($aggregateId, $eventId, $occurredOn); } + #[Override] public static function eventName(): string { return 'courses_counter.incremented'; } + #[Override] public static function fromPrimitives( string $aggregateId, array $body, @@ -31,6 +34,7 @@ public static function fromPrimitives( return new self($aggregateId, $body['total'], $eventId, $occurredOn); } + #[Override] public function toPrimitives(): array { return [ diff --git a/src/Mooc/CoursesCounter/Infrastructure/Persistence/Doctrine/CourseCounterIdType.php b/src/Mooc/CoursesCounter/Infrastructure/Persistence/Doctrine/CourseCounterIdType.php index 6a2c5d95a..0f04ac929 100644 --- a/src/Mooc/CoursesCounter/Infrastructure/Persistence/Doctrine/CourseCounterIdType.php +++ b/src/Mooc/CoursesCounter/Infrastructure/Persistence/Doctrine/CourseCounterIdType.php @@ -6,9 +6,11 @@ use CodelyTv\Mooc\CoursesCounter\Domain\CoursesCounterId; use CodelyTv\Shared\Infrastructure\Persistence\Doctrine\UuidType; +use Override; final class CourseCounterIdType extends UuidType { + #[Override] protected function typeClassName(): string { return CoursesCounterId::class; diff --git a/src/Mooc/CoursesCounter/Infrastructure/Persistence/Doctrine/CourseIdsType.php b/src/Mooc/CoursesCounter/Infrastructure/Persistence/Doctrine/CourseIdsType.php index 71c98ac5c..6a33f266e 100644 --- a/src/Mooc/CoursesCounter/Infrastructure/Persistence/Doctrine/CourseIdsType.php +++ b/src/Mooc/CoursesCounter/Infrastructure/Persistence/Doctrine/CourseIdsType.php @@ -9,6 +9,7 @@ use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\JsonType; +use Override; use function Lambdish\Phunctional\map; final class CourseIdsType extends JsonType implements DoctrineCustomType @@ -18,16 +19,19 @@ public static function customTypeName(): string return 'course_ids'; } + #[Override] public function getName(): string { return self::customTypeName(); } + #[Override] public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string { return parent::convertToDatabaseValue(map(fn (CourseId $id): string => $id->value(), $value), $platform); } + #[Override] public function convertToPHPValue($value, AbstractPlatform $platform): array { $scalars = parent::convertToPHPValue($value, $platform); diff --git a/src/Mooc/Shared/Infrastructure/Doctrine/DbalTypesSearcher.php b/src/Mooc/Shared/Infrastructure/Doctrine/DbalTypesSearcher.php index 7b203d1fa..42c562543 100644 --- a/src/Mooc/Shared/Infrastructure/Doctrine/DbalTypesSearcher.php +++ b/src/Mooc/Shared/Infrastructure/Doctrine/DbalTypesSearcher.php @@ -12,7 +12,7 @@ final class DbalTypesSearcher { - private const MAPPINGS_PATH = 'Infrastructure/Persistence/Doctrine'; + private const string MAPPINGS_PATH = 'Infrastructure/Persistence/Doctrine'; public static function inPath(string $path, string $contextName): array { diff --git a/src/Mooc/Shared/Infrastructure/Doctrine/DoctrinePrefixesSearcher.php b/src/Mooc/Shared/Infrastructure/Doctrine/DoctrinePrefixesSearcher.php index 85f65ed63..e7efaf8e2 100644 --- a/src/Mooc/Shared/Infrastructure/Doctrine/DoctrinePrefixesSearcher.php +++ b/src/Mooc/Shared/Infrastructure/Doctrine/DoctrinePrefixesSearcher.php @@ -10,7 +10,7 @@ final class DoctrinePrefixesSearcher { - private const MAPPINGS_PATH = 'Infrastructure/Persistence/Doctrine'; + private const string MAPPINGS_PATH = 'Infrastructure/Persistence/Doctrine'; public static function inPath(string $path, string $baseNamespace): array { diff --git a/src/Mooc/Videos/Domain/VideoCreatedDomainEvent.php b/src/Mooc/Videos/Domain/VideoCreatedDomainEvent.php index 61cd7f8e8..5300d14c6 100644 --- a/src/Mooc/Videos/Domain/VideoCreatedDomainEvent.php +++ b/src/Mooc/Videos/Domain/VideoCreatedDomainEvent.php @@ -5,6 +5,7 @@ namespace CodelyTv\Mooc\Videos\Domain; use CodelyTv\Shared\Domain\Bus\Event\DomainEvent; +use Override; final class VideoCreatedDomainEvent extends DomainEvent { @@ -20,11 +21,13 @@ public function __construct( parent::__construct($id, $eventId, $occurredOn); } + #[Override] public static function eventName(): string { return 'video.created'; } + #[Override] public static function fromPrimitives( string $aggregateId, array $body, @@ -42,6 +45,7 @@ public static function fromPrimitives( ); } + #[Override] public function toPrimitives(): array { return [ diff --git a/src/Mooc/Videos/Domain/VideoNotFound.php b/src/Mooc/Videos/Domain/VideoNotFound.php index fdbdf69de..d249e3652 100644 --- a/src/Mooc/Videos/Domain/VideoNotFound.php +++ b/src/Mooc/Videos/Domain/VideoNotFound.php @@ -5,6 +5,7 @@ namespace CodelyTv\Mooc\Videos\Domain; use CodelyTv\Shared\Domain\DomainError; +use Override; final class VideoNotFound extends DomainError { @@ -13,11 +14,13 @@ public function __construct(private readonly VideoId $id) parent::__construct(); } + #[Override] public function errorCode(): string { return 'video_not_found'; } + #[Override] protected function errorMessage(): string { return sprintf('The video <%s> has not been found', $this->id->value()); diff --git a/src/Mooc/Videos/Domain/Videos.php b/src/Mooc/Videos/Domain/Videos.php index 9a21231d5..52641207a 100644 --- a/src/Mooc/Videos/Domain/Videos.php +++ b/src/Mooc/Videos/Domain/Videos.php @@ -5,9 +5,11 @@ namespace CodelyTv\Mooc\Videos\Domain; use CodelyTv\Shared\Domain\Collection; +use Override; final class Videos extends Collection { + #[Override] protected function type(): string { return Video::class; diff --git a/src/Mooc/Videos/Infrastructure/Persistence/Doctrine/VideoIdType.php b/src/Mooc/Videos/Infrastructure/Persistence/Doctrine/VideoIdType.php index 2db8f8d8c..2cea3f04a 100644 --- a/src/Mooc/Videos/Infrastructure/Persistence/Doctrine/VideoIdType.php +++ b/src/Mooc/Videos/Infrastructure/Persistence/Doctrine/VideoIdType.php @@ -6,9 +6,11 @@ use CodelyTv\Mooc\Videos\Domain\VideoId; use CodelyTv\Shared\Infrastructure\Persistence\Doctrine\UuidType; +use Override; final class VideoIdType extends UuidType { + #[Override] protected function typeClassName(): string { return VideoId::class; diff --git a/src/Shared/Domain/Criteria/Filters.php b/src/Shared/Domain/Criteria/Filters.php index bea6863e3..311ce358b 100644 --- a/src/Shared/Domain/Criteria/Filters.php +++ b/src/Shared/Domain/Criteria/Filters.php @@ -6,6 +6,7 @@ use CodelyTv\Shared\Domain\Collection; +use Override; use function Lambdish\Phunctional\reduce; final class Filters extends Collection @@ -39,6 +40,7 @@ public function serialize(): string ); } + #[Override] protected function type(): string { return Filter::class; diff --git a/src/Shared/Infrastructure/Bus/Event/MySql/MySqlDoctrineEventBus.php b/src/Shared/Infrastructure/Bus/Event/MySql/MySqlDoctrineEventBus.php index 2b21c3897..f0652883a 100644 --- a/src/Shared/Infrastructure/Bus/Event/MySql/MySqlDoctrineEventBus.php +++ b/src/Shared/Infrastructure/Bus/Event/MySql/MySqlDoctrineEventBus.php @@ -14,7 +14,7 @@ final class MySqlDoctrineEventBus implements EventBus { - private const DATABASE_TIMESTAMP_FORMAT = 'Y-m-d H:i:s'; + private const string DATABASE_TIMESTAMP_FORMAT = 'Y-m-d H:i:s'; private readonly Connection $connection; public function __construct(EntityManager $entityManager) diff --git a/src/Shared/Infrastructure/Persistence/Doctrine/UuidType.php b/src/Shared/Infrastructure/Persistence/Doctrine/UuidType.php index 1ef8213bc..e2c381bd4 100644 --- a/src/Shared/Infrastructure/Persistence/Doctrine/UuidType.php +++ b/src/Shared/Infrastructure/Persistence/Doctrine/UuidType.php @@ -10,6 +10,7 @@ use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\StringType; +use Override; use function Lambdish\Phunctional\last; abstract class UuidType extends StringType implements DoctrineCustomType @@ -21,11 +22,13 @@ final public static function customTypeName(): string return Utils::toSnakeCase(str_replace('Type', '', (string) last(explode('\\', static::class)))); } + #[Override] final public function getName(): string { return self::customTypeName(); } + #[Override] final public function convertToPHPValue($value, AbstractPlatform $platform): mixed { $className = $this->typeClassName(); @@ -33,6 +36,7 @@ final public function convertToPHPValue($value, AbstractPlatform $platform): mix return new $className($value); } + #[Override] final public function convertToDatabaseValue($value, AbstractPlatform $platform): string { /** @var Uuid $value */ diff --git a/src/Shared/Infrastructure/Persistence/Elasticsearch/ElasticQueryGenerator.php b/src/Shared/Infrastructure/Persistence/Elasticsearch/ElasticQueryGenerator.php index 885066f5e..45df9faf3 100644 --- a/src/Shared/Infrastructure/Persistence/Elasticsearch/ElasticQueryGenerator.php +++ b/src/Shared/Infrastructure/Persistence/Elasticsearch/ElasticQueryGenerator.php @@ -9,11 +9,11 @@ final class ElasticQueryGenerator { - private const MUST_TYPE = 'must'; - private const MUST_NOT_TYPE = 'must_not'; - private const TERM_TERM = 'term'; - private const TERM_RANGE = 'range'; - private const TERM_WILDCARD = 'wildcard'; + private const string MUST_TYPE = 'must'; + private const string MUST_NOT_TYPE = 'must_not'; + private const string TERM_TERM = 'term'; + private const string TERM_RANGE = 'range'; + private const string TERM_WILDCARD = 'wildcard'; private static array $mustNotFields = [FilterOperator::NOT_EQUAL, FilterOperator::NOT_CONTAINS]; diff --git a/tests/Backoffice/Auth/Application/Authenticate/AuthenticateUserCommandHandlerTest.php b/tests/Backoffice/Auth/Application/Authenticate/AuthenticateUserCommandHandlerTest.php index 320be5d69..059d38f3a 100644 --- a/tests/Backoffice/Auth/Application/Authenticate/AuthenticateUserCommandHandlerTest.php +++ b/tests/Backoffice/Auth/Application/Authenticate/AuthenticateUserCommandHandlerTest.php @@ -11,11 +11,13 @@ use CodelyTv\Tests\Backoffice\Auth\AuthModuleUnitTestCase; use CodelyTv\Tests\Backoffice\Auth\Domain\AuthUserMother; use CodelyTv\Tests\Backoffice\Auth\Domain\AuthUsernameMother; +use Override; final class AuthenticateUserCommandHandlerTest extends AuthModuleUnitTestCase { private AuthenticateUserCommandHandler|null $handler; + #[Override] protected function setUp(): void { parent::setUp(); diff --git a/tests/Backoffice/Shared/Infraestructure/PhpUnit/BackofficeContextInfrastructureTestCase.php b/tests/Backoffice/Shared/Infraestructure/PhpUnit/BackofficeContextInfrastructureTestCase.php index 0292a6623..93589bf02 100644 --- a/tests/Backoffice/Shared/Infraestructure/PhpUnit/BackofficeContextInfrastructureTestCase.php +++ b/tests/Backoffice/Shared/Infraestructure/PhpUnit/BackofficeContextInfrastructureTestCase.php @@ -8,9 +8,11 @@ use CodelyTv\Shared\Infrastructure\Elasticsearch\ElasticsearchClient; use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\InfrastructureTestCase; use Doctrine\ORM\EntityManager; +use Override; abstract class BackofficeContextInfrastructureTestCase extends InfrastructureTestCase { + #[Override] protected function setUp(): void { parent::setUp(); @@ -23,6 +25,7 @@ protected function setUp(): void $arranger->arrange(); } + #[Override] protected function kernelClass(): string { return BackofficeBackendKernel::class; diff --git a/tests/Mooc/Courses/Application/Create/CreateCourseCommandHandlerTest.php b/tests/Mooc/Courses/Application/Create/CreateCourseCommandHandlerTest.php index e2c723de9..f7909a5b7 100644 --- a/tests/Mooc/Courses/Application/Create/CreateCourseCommandHandlerTest.php +++ b/tests/Mooc/Courses/Application/Create/CreateCourseCommandHandlerTest.php @@ -9,11 +9,13 @@ use CodelyTv\Tests\Mooc\Courses\CoursesModuleUnitTestCase; use CodelyTv\Tests\Mooc\Courses\Domain\CourseCreatedDomainEventMother; use CodelyTv\Tests\Mooc\Courses\Domain\CourseMother; +use Override; final class CreateCourseCommandHandlerTest extends CoursesModuleUnitTestCase { private CreateCourseCommandHandler|null $handler; + #[Override] protected function setUp(): void { parent::setUp(); diff --git a/tests/Mooc/Courses/Application/Update/CourseRenamerTest.php b/tests/Mooc/Courses/Application/Update/CourseRenamerTest.php index ff1f1b8b5..79f0621bd 100644 --- a/tests/Mooc/Courses/Application/Update/CourseRenamerTest.php +++ b/tests/Mooc/Courses/Application/Update/CourseRenamerTest.php @@ -11,11 +11,13 @@ use CodelyTv\Tests\Mooc\Courses\Domain\CourseMother; use CodelyTv\Tests\Mooc\Courses\Domain\CourseNameMother; use CodelyTv\Tests\Shared\Domain\DuplicatorMother; +use Override; final class CourseRenamerTest extends CoursesModuleUnitTestCase { private CourseRenamer|null $renamer; + #[Override] protected function setUp(): void { parent::setUp(); diff --git a/tests/Mooc/CoursesCounter/Application/Find/FindCoursesCounterQueryHandlerTest.php b/tests/Mooc/CoursesCounter/Application/Find/FindCoursesCounterQueryHandlerTest.php index db8887486..87863009f 100644 --- a/tests/Mooc/CoursesCounter/Application/Find/FindCoursesCounterQueryHandlerTest.php +++ b/tests/Mooc/CoursesCounter/Application/Find/FindCoursesCounterQueryHandlerTest.php @@ -10,11 +10,13 @@ use CodelyTv\Mooc\CoursesCounter\Domain\CoursesCounterNotExist; use CodelyTv\Tests\Mooc\CoursesCounter\CoursesCounterModuleUnitTestCase; use CodelyTv\Tests\Mooc\CoursesCounter\Domain\CoursesCounterMother; +use Override; final class FindCoursesCounterQueryHandlerTest extends CoursesCounterModuleUnitTestCase { private FindCoursesCounterQueryHandler|null $handler; + #[Override] protected function setUp(): void { parent::setUp(); diff --git a/tests/Mooc/CoursesCounter/Application/Increment/IncrementCoursesCounterOnCourseCreatedTest.php b/tests/Mooc/CoursesCounter/Application/Increment/IncrementCoursesCounterOnCourseCreatedTest.php index 6e9c9039b..0fe53e9c3 100644 --- a/tests/Mooc/CoursesCounter/Application/Increment/IncrementCoursesCounterOnCourseCreatedTest.php +++ b/tests/Mooc/CoursesCounter/Application/Increment/IncrementCoursesCounterOnCourseCreatedTest.php @@ -11,11 +11,13 @@ use CodelyTv\Tests\Mooc\CoursesCounter\CoursesCounterModuleUnitTestCase; use CodelyTv\Tests\Mooc\CoursesCounter\Domain\CoursesCounterIncrementedDomainEventMother; use CodelyTv\Tests\Mooc\CoursesCounter\Domain\CoursesCounterMother; +use Override; final class IncrementCoursesCounterOnCourseCreatedTest extends CoursesCounterModuleUnitTestCase { private IncrementCoursesCounterOnCourseCreated|null $subscriber; + #[Override] protected function setUp(): void { parent::setUp(); diff --git a/tests/Mooc/Shared/Infrastructure/PhpUnit/MoocContextInfrastructureTestCase.php b/tests/Mooc/Shared/Infrastructure/PhpUnit/MoocContextInfrastructureTestCase.php index fb4bef7bf..0118acf97 100644 --- a/tests/Mooc/Shared/Infrastructure/PhpUnit/MoocContextInfrastructureTestCase.php +++ b/tests/Mooc/Shared/Infrastructure/PhpUnit/MoocContextInfrastructureTestCase.php @@ -7,9 +7,11 @@ use CodelyTv\Apps\Mooc\Backend\MoocBackendKernel; use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\InfrastructureTestCase; use Doctrine\ORM\EntityManager; +use Override; abstract class MoocContextInfrastructureTestCase extends InfrastructureTestCase { + #[Override] protected function setUp(): void { parent::setUp(); @@ -19,6 +21,7 @@ protected function setUp(): void $arranger->arrange(); } + #[Override] protected function tearDown(): void { $arranger = new MoocEnvironmentArranger($this->service(EntityManager::class)); @@ -28,6 +31,7 @@ protected function tearDown(): void parent::tearDown(); } + #[Override] protected function kernelClass(): string { return MoocBackendKernel::class; diff --git a/tests/Shared/Infrastructure/Bus/Command/InMemorySymfonyCommandBusTest.php b/tests/Shared/Infrastructure/Bus/Command/InMemorySymfonyCommandBusTest.php index 27133c192..7d7b54f85 100644 --- a/tests/Shared/Infrastructure/Bus/Command/InMemorySymfonyCommandBusTest.php +++ b/tests/Shared/Infrastructure/Bus/Command/InMemorySymfonyCommandBusTest.php @@ -9,12 +9,14 @@ use CodelyTv\Shared\Infrastructure\Bus\Command\InMemorySymfonyCommandBus; use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\UnitTestCase; use Mockery\MockInterface; +use Override; use RuntimeException; final class InMemorySymfonyCommandBusTest extends UnitTestCase { private InMemorySymfonyCommandBus|null $commandBus; + #[Override] protected function setUp(): void { parent::setUp(); diff --git a/tests/Shared/Infrastructure/Bus/Event/MySql/MySqlDoctrineEventBusTest.php b/tests/Shared/Infrastructure/Bus/Event/MySql/MySqlDoctrineEventBusTest.php index 4ad562ae1..7f9461616 100644 --- a/tests/Shared/Infrastructure/Bus/Event/MySql/MySqlDoctrineEventBusTest.php +++ b/tests/Shared/Infrastructure/Bus/Event/MySql/MySqlDoctrineEventBusTest.php @@ -13,12 +13,14 @@ use CodelyTv\Tests\Mooc\CoursesCounter\Domain\CoursesCounterIncrementedDomainEventMother; use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\InfrastructureTestCase; use Doctrine\ORM\EntityManager; +use Override; final class MySqlDoctrineEventBusTest extends InfrastructureTestCase { private MySqlDoctrineEventBus|null $bus; private MySqlDoctrineDomainEventsConsumer|null $consumer; + #[Override] protected function setUp(): void { parent::setUp(); @@ -44,6 +46,7 @@ public function it_should_publish_and_consume_domain_events_from_msql(): void ); } + #[Override] protected function kernelClass(): string { return MoocBackendKernel::class; diff --git a/tests/Shared/Infrastructure/Bus/Event/RabbitMq/RabbitMqEventBusTest.php b/tests/Shared/Infrastructure/Bus/Event/RabbitMq/RabbitMqEventBusTest.php index b3d5b09e8..c756fdaa6 100644 --- a/tests/Shared/Infrastructure/Bus/Event/RabbitMq/RabbitMqEventBusTest.php +++ b/tests/Shared/Infrastructure/Bus/Event/RabbitMq/RabbitMqEventBusTest.php @@ -16,6 +16,7 @@ use CodelyTv\Tests\Mooc\Courses\Domain\CourseCreatedDomainEventMother; use CodelyTv\Tests\Mooc\CoursesCounter\Domain\CoursesCounterIncrementedDomainEventMother; use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\InfrastructureTestCase; +use Override; use RuntimeException; use Throwable; @@ -29,6 +30,7 @@ final class RabbitMqEventBusTest extends InfrastructureTestCase private TestAllWorksOnRabbitMqEventsPublished $fakeSubscriber; private bool $consumerHasBeenExecuted; + #[Override] protected function setUp(): void { parent::setUp(); @@ -129,6 +131,7 @@ public function it_should_send_events_to_dead_letter_after_retry_failed_domain_e $this->assertDeadLetterContainsEvent(1); } + #[Override] protected function kernelClass(): string { return MoocBackendKernel::class; diff --git a/tests/Shared/Infrastructure/Bus/Query/InMemorySymfonyQueryBusTest.php b/tests/Shared/Infrastructure/Bus/Query/InMemorySymfonyQueryBusTest.php index 5037795cb..1a07ada1c 100644 --- a/tests/Shared/Infrastructure/Bus/Query/InMemorySymfonyQueryBusTest.php +++ b/tests/Shared/Infrastructure/Bus/Query/InMemorySymfonyQueryBusTest.php @@ -9,12 +9,14 @@ use CodelyTv\Shared\Infrastructure\Bus\Query\QueryNotRegisteredError; use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\UnitTestCase; use Mockery\MockInterface; +use Override; use RuntimeException; final class InMemorySymfonyQueryBusTest extends UnitTestCase { private InMemorySymfonyQueryBus|null $queryBus; + #[Override] protected function setUp(): void { parent::setUp(); diff --git a/tests/Shared/Infrastructure/Mink/MinkSessionRequestHelper.php b/tests/Shared/Infrastructure/Mink/MinkSessionRequestHelper.php index df914dd98..46bb5cdb9 100644 --- a/tests/Shared/Infrastructure/Mink/MinkSessionRequestHelper.php +++ b/tests/Shared/Infrastructure/Mink/MinkSessionRequestHelper.php @@ -11,12 +11,12 @@ { public function __construct(private MinkHelper $sessionHelper) {} - public function sendRequest($method, $url, array $optionalParams = []): void + public function sendRequest(string $method, string $url, array $optionalParams = []): void { $this->request($method, $url, $optionalParams); } - public function sendRequestWithPyStringNode($method, $url, PyStringNode $body): void + public function sendRequestWithPyStringNode(string $method, string $url, PyStringNode $body): void { $this->request($method, $url, ['content' => $body->getRaw()]); } diff --git a/tests/Shared/Infrastructure/Mockery/CodelyTvMatcherIsSimilar.php b/tests/Shared/Infrastructure/Mockery/CodelyTvMatcherIsSimilar.php index 430373dc4..18d652cd5 100644 --- a/tests/Shared/Infrastructure/Mockery/CodelyTvMatcherIsSimilar.php +++ b/tests/Shared/Infrastructure/Mockery/CodelyTvMatcherIsSimilar.php @@ -6,6 +6,7 @@ use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\Constraint\CodelyTvConstraintIsSimilar; use Mockery\Matcher\MatcherAbstract; +use Override; use Stringable; final class CodelyTvMatcherIsSimilar extends MatcherAbstract implements Stringable @@ -19,11 +20,13 @@ public function __construct(mixed $value, float $delta = 0.0) $this->constraint = new CodelyTvConstraintIsSimilar($value, $delta); } + #[Override] public function match(&$actual): bool { return $this->constraint->evaluate($actual, '', true); } + #[Override] public function __toString(): string { return 'Is similar'; diff --git a/tests/Shared/Infrastructure/PhpUnit/Comparator/AggregateRootArraySimilarComparator.php b/tests/Shared/Infrastructure/PhpUnit/Comparator/AggregateRootArraySimilarComparator.php index 22ee1fccf..115382cc7 100644 --- a/tests/Shared/Infrastructure/PhpUnit/Comparator/AggregateRootArraySimilarComparator.php +++ b/tests/Shared/Infrastructure/PhpUnit/Comparator/AggregateRootArraySimilarComparator.php @@ -6,15 +6,17 @@ use CodelyTv\Shared\Domain\Aggregate\AggregateRoot; use CodelyTv\Tests\Shared\Domain\TestUtils; +use Override; use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Comparator\ComparisonFailure; +use SebastianBergmann\Comparator\ComparisonFailure; use function Lambdish\Phunctional\all; use function Lambdish\Phunctional\any; use function Lambdish\Phunctional\instance_of; final class AggregateRootArraySimilarComparator extends Comparator { + #[Override] public function accepts($expected, $actual): bool { return is_array($expected) @@ -23,6 +25,7 @@ public function accepts($expected, $actual): bool && all(instance_of(AggregateRoot::class), $actual)); } + #[Override] public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false): void { if (!$this->contains($expected, $actual) || count($expected) !== count($actual)) { diff --git a/tests/Shared/Infrastructure/PhpUnit/Comparator/AggregateRootSimilarComparator.php b/tests/Shared/Infrastructure/PhpUnit/Comparator/AggregateRootSimilarComparator.php index aefd86a36..3eb15351d 100644 --- a/tests/Shared/Infrastructure/PhpUnit/Comparator/AggregateRootSimilarComparator.php +++ b/tests/Shared/Infrastructure/PhpUnit/Comparator/AggregateRootSimilarComparator.php @@ -6,12 +6,14 @@ use CodelyTv\Shared\Domain\Aggregate\AggregateRoot; use CodelyTv\Tests\Shared\Domain\TestUtils; +use Override; use ReflectionObject; use SebastianBergmann\Comparator\Comparator; use SebastianBergmann\Comparator\ComparisonFailure; final class AggregateRootSimilarComparator extends Comparator { + #[Override] public function accepts($expected, $actual): bool { $aggregateRootClass = AggregateRoot::class; @@ -19,6 +21,7 @@ public function accepts($expected, $actual): bool return $expected instanceof $aggregateRootClass && $actual instanceof $aggregateRootClass; } + #[Override] public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false): void { $actualEntity = clone $actual; diff --git a/tests/Shared/Infrastructure/PhpUnit/Comparator/DateTimeSimilarComparator.php b/tests/Shared/Infrastructure/PhpUnit/Comparator/DateTimeSimilarComparator.php index 67d3b5605..a8f0b67c1 100644 --- a/tests/Shared/Infrastructure/PhpUnit/Comparator/DateTimeSimilarComparator.php +++ b/tests/Shared/Infrastructure/PhpUnit/Comparator/DateTimeSimilarComparator.php @@ -7,16 +7,19 @@ use DateInterval; use DateTime; use DateTimeInterface; +use Override; use SebastianBergmann\Comparator\ComparisonFailure; use SebastianBergmann\Comparator\ObjectComparator; final class DateTimeSimilarComparator extends ObjectComparator { + #[Override] public function accepts($expected, $actual): bool { return $expected instanceof DateTimeInterface && $actual instanceof DateTimeInterface; } + #[Override] public function assertEquals( $expected, $actual, diff --git a/tests/Shared/Infrastructure/PhpUnit/Comparator/DateTimeStringSimilarComparator.php b/tests/Shared/Infrastructure/PhpUnit/Comparator/DateTimeStringSimilarComparator.php index 546c75cb9..f111fa3b4 100644 --- a/tests/Shared/Infrastructure/PhpUnit/Comparator/DateTimeStringSimilarComparator.php +++ b/tests/Shared/Infrastructure/PhpUnit/Comparator/DateTimeStringSimilarComparator.php @@ -8,12 +8,14 @@ use DateTime; use DateTimeImmutable; use DateTimeInterface; +use Override; use SebastianBergmann\Comparator\ComparisonFailure; use SebastianBergmann\Comparator\ObjectComparator; use Throwable; final class DateTimeStringSimilarComparator extends ObjectComparator { + #[Override] public function accepts($expected, $actual): bool { return is_string($expected) @@ -22,6 +24,7 @@ public function accepts($expected, $actual): bool && $this->isValidDateTimeString($actual); } + #[Override] public function assertEquals( $expected, $actual, diff --git a/tests/Shared/Infrastructure/PhpUnit/Comparator/DomainEventArraySimilarComparator.php b/tests/Shared/Infrastructure/PhpUnit/Comparator/DomainEventArraySimilarComparator.php index c191f7fb0..681d28622 100644 --- a/tests/Shared/Infrastructure/PhpUnit/Comparator/DomainEventArraySimilarComparator.php +++ b/tests/Shared/Infrastructure/PhpUnit/Comparator/DomainEventArraySimilarComparator.php @@ -6,15 +6,17 @@ use CodelyTv\Shared\Domain\Bus\Event\DomainEvent; use CodelyTv\Tests\Shared\Domain\TestUtils; +use Override; use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Comparator\ComparisonFailure; +use SebastianBergmann\Comparator\ComparisonFailure; use function Lambdish\Phunctional\all; use function Lambdish\Phunctional\any; use function Lambdish\Phunctional\instance_of; final class DomainEventArraySimilarComparator extends Comparator { + #[Override] public function accepts($expected, $actual): bool { return is_array($expected) @@ -23,6 +25,7 @@ public function accepts($expected, $actual): bool && all(instance_of(DomainEvent::class), $actual)); } + #[Override] public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false): void { if (!$this->contains($expected, $actual) || count($expected) !== count($actual)) { diff --git a/tests/Shared/Infrastructure/PhpUnit/Comparator/DomainEventSimilarComparator.php b/tests/Shared/Infrastructure/PhpUnit/Comparator/DomainEventSimilarComparator.php index f14cb6a77..2a5c63447 100644 --- a/tests/Shared/Infrastructure/PhpUnit/Comparator/DomainEventSimilarComparator.php +++ b/tests/Shared/Infrastructure/PhpUnit/Comparator/DomainEventSimilarComparator.php @@ -6,6 +6,7 @@ use CodelyTv\Shared\Domain\Bus\Event\DomainEvent; use CodelyTv\Tests\Shared\Domain\TestUtils; +use Override; use ReflectionObject; use SebastianBergmann\Comparator\Comparator; use SebastianBergmann\Comparator\ComparisonFailure; @@ -14,6 +15,7 @@ final class DomainEventSimilarComparator extends Comparator { private static array $ignoredAttributes = ['eventId', 'occurredOn']; + #[Override] public function accepts($expected, $actual): bool { $domainEventRootClass = DomainEvent::class; @@ -21,6 +23,7 @@ public function accepts($expected, $actual): bool return $expected instanceof $domainEventRootClass && $actual instanceof $domainEventRootClass; } + #[Override] public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false): void { if (!$this->areSimilar($expected, $actual)) { diff --git a/tests/Shared/Infrastructure/PhpUnit/Constraint/CodelyTvConstraintIsSimilar.php b/tests/Shared/Infrastructure/PhpUnit/Constraint/CodelyTvConstraintIsSimilar.php index e5b4ca53a..bd666dba1 100644 --- a/tests/Shared/Infrastructure/PhpUnit/Constraint/CodelyTvConstraintIsSimilar.php +++ b/tests/Shared/Infrastructure/PhpUnit/Constraint/CodelyTvConstraintIsSimilar.php @@ -10,11 +10,12 @@ use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\Comparator\DateTimeStringSimilarComparator; use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\Comparator\DomainEventArraySimilarComparator; use CodelyTv\Tests\Shared\Infrastructure\PhpUnit\Comparator\DomainEventSimilarComparator; +use Override; use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\ExpectationFailedException; use SebastianBergmann\Comparator\ComparisonFailure; -use SebastianBergmann\Comparator\Factory; +use SebastianBergmann\Comparator\Factory; use function is_string; use function sprintf; @@ -23,6 +24,7 @@ final class CodelyTvConstraintIsSimilar extends Constraint { public function __construct(private $value, private readonly float $delta = 0.0) {} + #[Override] public function evaluate($other, $description = '', $returnResult = false): bool { if ($this->value === $other) { @@ -54,6 +56,7 @@ public function evaluate($other, $description = '', $returnResult = false): bool return $isValid; } + #[Override] public function toString(): string { $delta = ''; diff --git a/tests/Shared/Infrastructure/PhpUnit/InfrastructureTestCase.php b/tests/Shared/Infrastructure/PhpUnit/InfrastructureTestCase.php index 52438a8f0..78b8fcc30 100644 --- a/tests/Shared/Infrastructure/PhpUnit/InfrastructureTestCase.php +++ b/tests/Shared/Infrastructure/PhpUnit/InfrastructureTestCase.php @@ -6,6 +6,7 @@ use CodelyTv\Tests\Shared\Domain\TestUtils; use Doctrine\ORM\EntityManager; +use Override; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Throwable; @@ -13,6 +14,7 @@ abstract class InfrastructureTestCase extends KernelTestCase { abstract protected function kernelClass(): string; + #[Override] protected function setUp(): void { $_SERVER['KERNEL_CLASS'] = $this->kernelClass(); From 9d3830c4a411efa864475df9d7523414d8c377d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Ferrer=20Gonza=CC=81lez?= Date: Mon, 4 Dec 2023 17:19:07 +0100 Subject: [PATCH 2/3] chore: update psalm --- composer.json | 4 ++-- composer.lock | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 4a6249ffe..0d41f2848 100644 --- a/composer.json +++ b/composer.json @@ -53,10 +53,10 @@ "symfony/error-handler": "^6", "symplify/easy-coding-standard": "^12.0", - "vimeo/psalm": "^5.15", + "vimeo/psalm": "^5.17", "rector/rector": "^0.18.12", "psalm/plugin-mockery": "^1.1", - "psalm/plugin-symfony": "^5.0", + "psalm/plugin-symfony": "^5.1", "psalm/plugin-phpunit": "^0.18.4", "phpstan/phpstan": "^1.10", "phpat/phpat": "^0.10.10", diff --git a/composer.lock b/composer.lock index 794251bd2..7e92593ef 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "49058a852a48e51de5183cc45f049da6", + "content-hash": "4b064f9f54b55dc0f6b0d2a65708337f", "packages": [ { "name": "brick/math", @@ -10100,16 +10100,16 @@ }, { "name": "vimeo/psalm", - "version": "5.16.0", + "version": "5.17.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "2897ba636551a8cb61601cc26f6ccfbba6c36591" + "reference": "c620f6e80d0abfca532b00bda366062aaedf6e5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/2897ba636551a8cb61601cc26f6ccfbba6c36591", - "reference": "2897ba636551a8cb61601cc26f6ccfbba6c36591", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/c620f6e80d0abfca532b00bda366062aaedf6e5d", + "reference": "c620f6e80d0abfca532b00bda366062aaedf6e5d", "shasum": "" }, "require": { @@ -10206,7 +10206,7 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2023-11-22T20:38:47+00:00" + "time": "2023-12-03T20:21:41+00:00" }, { "name": "webmozart/assert", From f3941d025b5619d858b4a3f1023b8b3c2dd07814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Ferrer=20Gonza=CC=81lez?= Date: Tue, 19 Dec 2023 15:50:55 +0100 Subject: [PATCH 3/3] deps: update dependencies including Psalm to add support for Override --- composer.json | 2 +- composer.lock | 200 ++++++++++++++++++++++++++------------------------ 2 files changed, 105 insertions(+), 97 deletions(-) diff --git a/composer.json b/composer.json index 0d41f2848..fc51bc108 100644 --- a/composer.json +++ b/composer.json @@ -53,7 +53,7 @@ "symfony/error-handler": "^6", "symplify/easy-coding-standard": "^12.0", - "vimeo/psalm": "^5.17", + "vimeo/psalm": "^5.18", "rector/rector": "^0.18.12", "psalm/plugin-mockery": "^1.1", "psalm/plugin-symfony": "^5.1", diff --git a/composer.lock b/composer.lock index 7e92593ef..4d09e2f2e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4b064f9f54b55dc0f6b0d2a65708337f", + "content-hash": "01b9bad6923e3458f4cbfa1e3c037e87", "packages": [ { "name": "brick/math", @@ -1560,16 +1560,16 @@ }, { "name": "promphp/prometheus_client_php", - "version": "v2.7.2", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/PromPHP/prometheus_client_php.git", - "reference": "735ace7ec6f5ff66d73b91baf8f6d36cbe3f8b76" + "reference": "c7c174b4e0b691d75aa1cce939c6b1369b91fd22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PromPHP/prometheus_client_php/zipball/735ace7ec6f5ff66d73b91baf8f6d36cbe3f8b76", - "reference": "735ace7ec6f5ff66d73b91baf8f6d36cbe3f8b76", + "url": "https://api.github.com/repos/PromPHP/prometheus_client_php/zipball/c7c174b4e0b691d75aa1cce939c6b1369b91fd22", + "reference": "c7c174b4e0b691d75aa1cce939c6b1369b91fd22", "shasum": "" }, "require": { @@ -1621,9 +1621,9 @@ "description": "Prometheus instrumentation library for PHP applications.", "support": { "issues": "https://github.com/PromPHP/prometheus_client_php/issues", - "source": "https://github.com/PromPHP/prometheus_client_php/tree/v2.7.2" + "source": "https://github.com/PromPHP/prometheus_client_php/tree/v2.8.0" }, - "time": "2023-11-06T12:38:23+00:00" + "time": "2023-11-24T05:30:07+00:00" }, { "name": "psr/cache", @@ -5354,26 +5354,28 @@ }, { "name": "behat/mink", - "version": "v1.10.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/minkphp/Mink.git", - "reference": "19e58905632e7cfdc5b2bafb9b950a3521af32c5" + "reference": "d8527fdf8785aad38455fb426af457ab9937aece" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/Mink/zipball/19e58905632e7cfdc5b2bafb9b950a3521af32c5", - "reference": "19e58905632e7cfdc5b2bafb9b950a3521af32c5", + "url": "https://api.github.com/repos/minkphp/Mink/zipball/d8527fdf8785aad38455fb426af457ab9937aece", + "reference": "d8527fdf8785aad38455fb426af457ab9937aece", "shasum": "" }, "require": { "php": ">=7.2", - "symfony/css-selector": "^4.4 || ^5.0 || ^6.0" + "symfony/css-selector": "^4.4 || ^5.0 || ^6.0 || ^7.0" }, "require-dev": { + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", "phpunit/phpunit": "^8.5.22 || ^9.5.11", - "symfony/error-handler": "^4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.4 || ^6.0" + "symfony/error-handler": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "behat/mink-browserkit-driver": "fast headless driver for any app without JS emulation", @@ -5412,9 +5414,9 @@ ], "support": { "issues": "https://github.com/minkphp/Mink/issues", - "source": "https://github.com/minkphp/Mink/tree/v1.10.0" + "source": "https://github.com/minkphp/Mink/tree/v1.11.0" }, - "time": "2022-03-28T14:22:43+00:00" + "time": "2023-12-09T11:23:23+00:00" }, { "name": "behat/mink-browserkit-driver", @@ -6079,16 +6081,16 @@ }, { "name": "fidry/cpu-core-counter", - "version": "0.5.1", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623" + "reference": "85193c0b0cb5c47894b5eaec906e946f054e7077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/b58e5a3933e541dc286cc91fc4f3898bbc6f1623", - "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/85193c0b0cb5c47894b5eaec906e946f054e7077", + "reference": "85193c0b0cb5c47894b5eaec906e946f054e7077", "shasum": "" }, "require": { @@ -6096,13 +6098,13 @@ }, "require-dev": { "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", "phpstan/extension-installer": "^1.2.0", "phpstan/phpstan": "^1.9.2", "phpstan/phpstan-deprecation-rules": "^1.0.0", "phpstan/phpstan-phpunit": "^1.2.2", "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^9.5.26 || ^8.5.31", - "theofidry/php-cs-fixer-config": "^1.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", "webmozarts/strict-phpunit": "^7.5" }, "type": "library", @@ -6128,7 +6130,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/0.5.1" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.0.0" }, "funding": [ { @@ -6136,7 +6138,7 @@ "type": "github" } ], - "time": "2022-12-24T12:35:10+00:00" + "time": "2023-09-17T21:38:23+00:00" }, { "name": "friends-of-behat/mink-extension", @@ -6392,16 +6394,16 @@ }, { "name": "mockery/mockery", - "version": "1.6.6", + "version": "1.6.7", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e" + "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/b8e0bb7d8c604046539c1115994632c74dcb361e", - "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e", + "url": "https://api.github.com/repos/mockery/mockery/zipball/0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", + "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", "shasum": "" }, "require": { @@ -6414,9 +6416,7 @@ }, "require-dev": { "phpunit/phpunit": "^8.5 || ^9.6.10", - "psalm/plugin-phpunit": "^0.18.4", - "symplify/easy-coding-standard": "^11.5.0", - "vimeo/psalm": "^4.30" + "symplify/easy-coding-standard": "^12.0.8" }, "type": "library", "autoload": { @@ -6473,7 +6473,7 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2023-08-09T00:03:52+00:00" + "time": "2023-12-10T02:24:34+00:00" }, { "name": "myclabs/deep-copy", @@ -6587,16 +6587,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -6637,22 +6637,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "pdepend/pdepend", - "version": "2.16.0", + "version": "2.16.2", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "8dfc0c46529e2073fa97986552f80646eedac562" + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/8dfc0c46529e2073fa97986552f80646eedac562", - "reference": "8dfc0c46529e2073fa97986552f80646eedac562", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58", + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58", "shasum": "" }, "require": { @@ -6665,7 +6665,6 @@ "require-dev": { "easy-doc/easy-doc": "0.0.0|^1.2.3", "gregwar/rst": "^1.0", - "phpunit/phpunit": "^4.8.36|^5.7.27", "squizlabs/php_codesniffer": "^2.0.0" }, "bin": [ @@ -6695,7 +6694,7 @@ ], "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.16.0" + "source": "https://github.com/pdepend/pdepend/tree/2.16.2" }, "funding": [ { @@ -6703,7 +6702,7 @@ "type": "tidelift" } ], - "time": "2023-11-29T08:52:35+00:00" + "time": "2023-12-17T18:09:59+00:00" }, { "name": "phar-io/manifest", @@ -7043,22 +7042,22 @@ }, { "name": "phpmd/phpmd", - "version": "2.14.1", + "version": "2.15.0", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "442fc2c34edcd5198b442d8647c7f0aec3afabe8" + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/442fc2c34edcd5198b442d8647c7f0aec3afabe8", - "reference": "442fc2c34edcd5198b442d8647c7f0aec3afabe8", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0", "shasum": "" }, "require": { "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.15.1", + "pdepend/pdepend": "^2.16.1", "php": ">=5.3.9" }, "require-dev": { @@ -7067,7 +7066,6 @@ "ext-simplexml": "*", "gregwar/rst": "^1.0", "mikey179/vfsstream": "^1.6.8", - "phpunit/phpunit": "^4.8.36 || ^5.7.27", "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" }, "bin": [ @@ -7115,7 +7113,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.14.1" + "source": "https://github.com/phpmd/phpmd/tree/2.15.0" }, "funding": [ { @@ -7123,20 +7121,20 @@ "type": "tidelift" } ], - "time": "2023-09-28T13:07:44+00:00" + "time": "2023-12-11T08:22:20+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.4", + "version": "1.24.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496" + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6bd0c26f3786cd9b7c359675cb789e35a8e07496", - "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", "shasum": "" }, "require": { @@ -7168,22 +7166,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.4" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5" }, - "time": "2023-11-26T18:29:22+00:00" + "time": "2023-12-16T09:33:33+00:00" }, { "name": "phpstan/phpstan", - "version": "1.10.47", + "version": "1.10.50", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39" + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", - "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/06a98513ac72c03e8366b5a0cb00750b487032e4", + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4", "shasum": "" }, "require": { @@ -7232,7 +7230,7 @@ "type": "tidelift" } ], - "time": "2023-12-01T15:19:17+00:00" + "time": "2023-12-13T10:59:42+00:00" }, { "name": "phpunit/php-code-coverage", @@ -7900,12 +7898,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "b4728d9c4af8c60b059c1d7872759eedacccdb12" + "reference": "98ceed764ff7fcf20081fdc2e0914441f46b0906" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/b4728d9c4af8c60b059c1d7872759eedacccdb12", - "reference": "b4728d9c4af8c60b059c1d7872759eedacccdb12", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/98ceed764ff7fcf20081fdc2e0914441f46b0906", + "reference": "98ceed764ff7fcf20081fdc2e0914441f46b0906", "shasum": "" }, "conflict": { @@ -8008,7 +8006,7 @@ "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", "desperado/xml-bundle": "<=0.1.7", - "directmailteam/direct-mail": "<5.2.4", + "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", "doctrine/annotations": "<1.2.7", "doctrine/cache": "<1.3.2|>=1.4,<1.4.2", "doctrine/common": "<2.4.3|>=2.5,<2.5.1", @@ -8019,7 +8017,7 @@ "doctrine/mongodb-odm-bundle": "<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", "dolibarr/dolibarr": "<18.0.2", - "dompdf/dompdf": "<2.0.2|==2.0.2", + "dompdf/dompdf": "<2.0.4", "doublethreedigital/guest-entries": "<3.1.2", "drupal/core": "<9.4.14|>=9.5,<9.5.8|>=10,<10.0.8", "drupal/drupal": ">=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", @@ -8029,6 +8027,7 @@ "ectouch/ectouch": "<=2.7.2", "elefant/cms": "<2.0.7", "elgg/elgg": "<3.3.24|>=4,<4.0.5", + "elijaa/phpmemcacheadmin": "<=1.3", "encore/laravel-admin": "<=1.8.19", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.15", @@ -8051,7 +8050,7 @@ "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", "ezsystems/ezplatform-user": ">=1,<1.0.1", "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.31", - "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.06,<=2019.03.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", "ezyang/htmlpurifier": "<4.1.1", @@ -8131,7 +8130,7 @@ "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "impresscms/impresscms": "<=1.4.5", - "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.2", + "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.3", "in2code/ipandlanguageredirect": "<5.1.2", "in2code/lux": "<17.6.1|>=18,<24.0.2", "innologi/typo3-appointments": "<2.0.6", @@ -8198,11 +8197,15 @@ "mautic/core": "<4.3", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", "mediawiki/matomo": "<2.4.3", + "mediawiki/semantic-media-wiki": "<4.0.2", "melisplatform/melis-asset-manager": "<5.0.1", "melisplatform/melis-cms": "<5.0.1", "melisplatform/melis-front": "<5.0.1", "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", "mgallegos/laravel-jqgrid": "<=1.3", + "microsoft/microsoft-graph": ">=1.16,<1.109.1|>=2.0.0.0-RC1-dev,<2.0.1", + "microsoft/microsoft-graph-beta": "<2.0.1", + "microsoft/microsoft-graph-core": "<2.0.2", "microweber/microweber": "<=2.0.4", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", @@ -8249,7 +8252,7 @@ "open-web-analytics/open-web-analytics": "<1.7.4", "opencart/opencart": "<=3.0.3.7|>=4,<4.0.2.3-dev", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<=19.5|>=20,<=20.1", + "openmage/magento-lts": "<20.2", "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2", "orchid/platform": ">=9,<9.4.4|>=14.0.0.0-alpha4,<14.5", "oro/calendar-bundle": ">=4.2,<=4.2.6|>=5,<=5.0.6|>=5.1,<5.1.1", @@ -8272,6 +8275,7 @@ "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", "personnummer/personnummer": "<3.0.2", "phanan/koel": "<5.1.4", + "phenx/php-svg-lib": "<0.5.1", "php-mod/curl": "<2.3.2", "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1", "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", @@ -8281,7 +8285,7 @@ "phpmyfaq/phpmyfaq": "<=3.1.7", "phpoffice/phpexcel": "<1.8", "phpoffice/phpspreadsheet": "<1.16", - "phpseclib/phpseclib": "<3.0.34", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.34", "phpservermon/phpservermon": "<3.6", "phpsysinfo/phpsysinfo": "<3.2.5", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3", @@ -8317,6 +8321,7 @@ "pterodactyl/panel": "<1.7", "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", "ptrofimov/beanstalk_console": "<1.7.14", + "pubnub/pubnub": "<6.1", "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6.0-beta", "pyrocms/pyrocms": "<=3.9.1", @@ -8442,8 +8447,10 @@ "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", "symfony/webhook": ">=6.3,<6.3.8", "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "symphonycms/symphony-2": "<2.6.4", "t3/dce": "<0.11.5|>=2.2,<2.6.2", "t3g/svg-sanitizer": "<1.0.3", + "t3s/content-consent": "<1.0.3|>=2,<2.0.2", "tastyigniter/tastyigniter": "<3.3", "tcg/voyager": "<=1.4", "tecnickcom/tcpdf": "<6.2.22", @@ -8468,7 +8475,7 @@ "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": "<=8.7.54|>=9,<=9.5.43|>=10,<=10.4.40|>=11,<=11.5.32|>=12,<=12.4.7", + "typo3/cms-core": "<8.7.55|>=9,<9.5.44|>=10,<10.4.41|>=11,<11.5.33|>=12,<12.4.8", "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/cms-install": ">=12.2,<12.4.8", @@ -8481,7 +8488,7 @@ "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "uasoft-indonesia/badaso": "<=2.9.7", - "unisharp/laravel-filemanager": "<=2.5.1", + "unisharp/laravel-filemanager": "<2.6.4", "userfrosting/userfrosting": ">=0.3.1,<4.6.3", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "uvdesk/community-skeleton": "<=1.1.1", @@ -8517,6 +8524,7 @@ "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": "<1.1.29", "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-authclient": "<2.2.15", "yiisoft/yii2-bootstrap": "<2.0.4", "yiisoft/yii2-dev": "<2.0.43", "yiisoft/yii2-elasticsearch": "<2.0.5", @@ -8562,7 +8570,7 @@ "zf-commons/zfc-user": "<1.2.2", "zfcampus/zf-apigility-doctrine": "<1.0.3", "zfr/zfr-oauth2-server-module": "<0.1.2", - "zoujingli/thinkadmin": "<6.0.22" + "zoujingli/thinkadmin": "<=6.1.53" }, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", @@ -8599,7 +8607,7 @@ "type": "tidelift" } ], - "time": "2023-11-30T20:04:21+00:00" + "time": "2023-12-18T20:04:29+00:00" }, { "name": "sebastian/cli-parser", @@ -9698,20 +9706,20 @@ }, { "name": "symfony/css-selector", - "version": "v6.4.0", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4" + "reference": "bb51d46e53ef8d50d523f0c5faedba056a27943e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4", - "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/bb51d46e53ef8d50d523f0c5faedba056a27943e", + "reference": "bb51d46e53ef8d50d523f0c5faedba056a27943e", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -9743,7 +9751,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.0" + "source": "https://github.com/symfony/css-selector/tree/v7.0.0" }, "funding": [ { @@ -9759,7 +9767,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:40:20+00:00" + "time": "2023-10-31T17:59:56+00:00" }, { "name": "symfony/dom-crawler", @@ -9992,16 +10000,16 @@ }, { "name": "symplify/easy-coding-standard", - "version": "12.0.11", + "version": "12.0.13", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "5f34a99d035b4eef048857ec47d2035140871f50" + "reference": "d15707b14d50b7cb6d656f7a7a5e5b9a17099b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/5f34a99d035b4eef048857ec47d2035140871f50", - "reference": "5f34a99d035b4eef048857ec47d2035140871f50", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/d15707b14d50b7cb6d656f7a7a5e5b9a17099b3c", + "reference": "d15707b14d50b7cb6d656f7a7a5e5b9a17099b3c", "shasum": "" }, "require": { @@ -10034,7 +10042,7 @@ ], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.0.11" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.0.13" }, "funding": [ { @@ -10046,7 +10054,7 @@ "type": "github" } ], - "time": "2023-12-02T09:38:08+00:00" + "time": "2023-12-07T09:18:07+00:00" }, { "name": "theseer/tokenizer", @@ -10100,16 +10108,16 @@ }, { "name": "vimeo/psalm", - "version": "5.17.0", + "version": "5.18.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "c620f6e80d0abfca532b00bda366062aaedf6e5d" + "reference": "b113f3ed0259fd6e212d87c3df80eec95a6abf19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/c620f6e80d0abfca532b00bda366062aaedf6e5d", - "reference": "c620f6e80d0abfca532b00bda366062aaedf6e5d", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/b113f3ed0259fd6e212d87c3df80eec95a6abf19", + "reference": "b113f3ed0259fd6e212d87c3df80eec95a6abf19", "shasum": "" }, "require": { @@ -10128,7 +10136,7 @@ "ext-tokenizer": "*", "felixfbecker/advanced-json-rpc": "^3.1", "felixfbecker/language-server-protocol": "^1.5.2", - "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", "nikic/php-parser": "^4.16", "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", @@ -10206,7 +10214,7 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2023-12-03T20:21:41+00:00" + "time": "2023-12-16T09:37:35+00:00" }, { "name": "webmozart/assert",