From 4df8b535e1a34446c0d4edd2a27a30fa2638a97f Mon Sep 17 00:00:00 2001 From: Kirill Date: Sat, 19 Nov 2022 00:48:38 +0400 Subject: [PATCH 01/58] Add fixture: add log caught error, fix 'rand' error (#548) --- src/Command/Fixture/AddCommand.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Command/Fixture/AddCommand.php b/src/Command/Fixture/AddCommand.php index a20dcf2dd..03220036f 100644 --- a/src/Command/Fixture/AddCommand.php +++ b/src/Command/Fixture/AddCommand.php @@ -14,6 +14,7 @@ use Exception; use Faker\Factory; use Faker\Generator; +use Psr\Log\LoggerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -37,7 +38,8 @@ final class AddCommand extends Command public function __construct( private CycleDependencyProxy $promise, - private EntityManager $entityManager + private EntityManager $entityManager, + private readonly LoggerInterface $logger, ) { parent::__construct(); } @@ -70,6 +72,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->saveEntities(); } catch (\Throwable $t) { $io->error($t->getMessage()); + $this->logger->error($t->getMessage(), ['exception' => $t]); + return $t->getCode() ?: ExitCode::UNSPECIFIED_ERROR; } $io->success('Done'); @@ -127,7 +131,7 @@ private function addPosts(int $count): void $public = rand(0, 2) > 0; $post->setPublic($public); if ($public) { - $post->setPublishedAt(new DateTimeImmutable(date('r', rand(time(), strtotime('-2 years'))))); + $post->setPublishedAt(new DateTimeImmutable(date('r', rand(strtotime('-2 years'), time())))); } // link tags $postTags = (array)array_rand($this->tags, rand(1, count($this->tags))); @@ -144,7 +148,7 @@ private function addPosts(int $count): void $commentPublic = rand(0, 3) > 0; $comment->setPublic($commentPublic); if ($commentPublic) { - $comment->setPublishedAt(new DateTimeImmutable(date('r', rand(time(), strtotime('-1 years'))))); + $comment->setPublishedAt(new DateTimeImmutable(date('r', rand(strtotime('-1 years'), time())))); } $commentUser = $this->users[array_rand($this->users)]; $commentUser->addComment($comment); From b243c4693461266add2cb2674bcd20fe8ca74993 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sun, 20 Nov 2022 23:37:08 +0300 Subject: [PATCH 02/58] Merge demo and demo-api (#545) * Merge demo and demo-api * Apply fixes from StyleCI * Fix workflows * Add working directory * Fix workflow * Apply fixes from StyleCI * Clone changes * Apply fixes from StyleCI * Fix wf * Remove unused code * Fix StyleCI config * Remove specified paths * Fix syntax * Apply fixes from StyleCI * Add fixture: add log caught error, fix 'rand' error (#548) * Merge demo and demo-api * Apply fixes from StyleCI * Fix workflows * Add working directory * Fix workflow * Clone changes * Apply fixes from StyleCI * Fix wf * Apply fixes from StyleCI * Remove unused code * Fix StyleCI config * Remove specified paths * Fix syntax * Apply fixes from StyleCI Co-authored-by: StyleCI Bot Co-authored-by: Kirill --- .github/workflows/blog-api_build.yml | 112 +++++++++ .github/workflows/blog-api_dependency.yml | 86 +++++++ .github/workflows/blog-api_static.yml | 86 +++++++ .../workflows/{build.yml => blog_build.yml} | 51 ++-- .../{dependency.yml => blog_dependency.yml} | 48 ++-- .../workflows/{static.yml => blog_static.yml} | 48 ++-- .styleci.yml | 16 +- .editorconfig => blog-api/.editorconfig | 0 blog-api/.env.example | 2 + blog-api/.env.test | 2 + .gitattributes => blog-api/.gitattributes | 0 blog-api/.gitignore | 39 +++ .../.phpunit-watcher.yml | 0 blog-api/.scrutinizer.yml | 40 +++ blog-api/CHANGELOG.md | 5 + LICENSE.md => blog-api/LICENSE.md | 0 blog-api/README.md | 66 +++++ autoload.php => blog-api/autoload.php | 2 +- blog-api/codeception.yml | 24 ++ blog-api/composer.json | 203 +++++++++++++++ blog-api/config/.gitignore | 2 + .../config}/bootstrap-console.php | 0 {config => blog-api/config}/bootstrap-web.php | 0 {config => blog-api/config}/bootstrap.php | 0 blog-api/config/common/cache.php | 12 + {config => blog-api/config}/common/cycle.php | 0 {config => blog-api/config}/common/logger.php | 0 {config => blog-api/config}/common/psr17.php | 0 blog-api/config/common/router.php | 29 +++ .../config}/common/translator.php | 0 .../config}/common/validator.php | 0 .../Unit => blog-api/config/console}/.gitkeep | 0 .../config}/delegates-console.php | 0 {config => blog-api/config}/delegates-web.php | 0 {config => blog-api/config}/delegates.php | 0 {config => blog-api/config}/dev/params.php | 0 .../config/events-console.php | 0 .../config/events-web.php | 0 .../config/events.php | 0 blog-api/config/params.php | 164 ++++++++++++ .../test => blog-api/config/prod}/params.php | 0 .../config/providers-console.php | 0 blog-api/config/providers-web.php | 7 + {config => blog-api/config}/providers.php | 0 blog-api/config/routes.php | 63 +++++ blog-api/config/test/params.php | 19 ++ blog-api/config/web/application.php | 29 +++ blog-api/config/web/data-response.php | 28 +++ blog-api/config/web/error-handler.php | 14 ++ blog-api/config/web/middleware-dispatcher.php | 14 ++ blog-api/config/web/user.php | 26 ++ blog-api/data/db/database.db | Bin 0 -> 151552 bytes blog-api/data/nginx/default.conf | 30 +++ blog-api/docker-compose.yml | 21 ++ blog-api/infection.json.dist | 16 ++ phpunit.xml.dist => blog-api/phpunit.xml.dist | 0 blog-api/psalm.xml | 18 ++ {public => blog-api/public}/.htaccess | 0 {public => blog-api/public}/assets/.gitignore | 0 {public => blog-api/public}/favicon.ico | Bin blog-api/public/index.php | 43 ++++ {public => blog-api/public}/robots.txt | 0 blog-api/resources/messages/en/app.php | 7 + blog-api/resources/messages/ru/app.php | 7 + {runtime => blog-api/runtime}/.gitignore | 0 blog-api/src/Auth/AuthController.php | 114 +++++++++ blog-api/src/Auth/AuthRequest.php | 42 ++++ blog-api/src/Auth/AuthRequestErrorHandler.php | 18 ++ blog-api/src/Blog/BlogController.php | 233 ++++++++++++++++++ blog-api/src/Blog/BlogService.php | 49 ++++ blog-api/src/Blog/EditPostRequest.php | 68 +++++ blog-api/src/Blog/Post.php | 108 ++++++++ blog-api/src/Blog/PostBuilder.php | 17 ++ blog-api/src/Blog/PostFormatter.php | 27 ++ blog-api/src/Blog/PostRepository.php | 38 +++ blog-api/src/Blog/PostStatus.php | 21 ++ blog-api/src/Dto/ApiResponseData.php | 129 ++++++++++ .../src/Exception/ApplicationException.php | 11 + .../src/Exception/BadRequestException.php | 17 ++ .../Exception/MethodNotAllowedException.php | 20 ++ blog-api/src/Exception/NotFoundException.php | 17 ++ .../src/Exception/UnauthorisedException.php | 17 ++ .../src/Factory/ApiResponseDataFactory.php | 55 +++++ blog-api/src/Factory/RestGroupFactory.php | 47 ++++ .../src/Formatter/ApiResponseFormatter.php | 36 +++ blog-api/src/Formatter/PaginatorFormatter.php | 28 +++ blog-api/src/Handler/NotFoundHandler.php | 33 +++ blog-api/src/InfoController.php | 56 +++++ {src => blog-api/src}/Installer.php | 0 .../src/Middleware/ExceptionMiddleware.php | 35 +++ .../src/Queue/LoggingAuthorizationHandler.php | 24 ++ blog-api/src/Queue/UserLoggedInMessage.php | 39 +++ blog-api/src/RestControllerTrait.php | 51 ++++ blog-api/src/User/User.php | 98 ++++++++ blog-api/src/User/UserController.php | 133 ++++++++++ blog-api/src/User/UserFormatter.php | 27 ++ blog-api/src/User/UserRepository.php | 63 +++++ blog-api/src/User/UserRequest.php | 19 ++ blog-api/src/User/UserService.php | 70 ++++++ blog-api/src/VersionProvider.php | 12 + blog-api/tests/.gitkeep | 0 blog-api/tests/Acceptance.suite.yml | 20 ++ blog-api/tests/Acceptance/AuthCest.php | 100 ++++++++ blog-api/tests/Acceptance/BlogCest.php | 219 ++++++++++++++++ blog-api/tests/Acceptance/SiteCest.php | 59 +++++ blog-api/tests/Acceptance/UserCest.php | 99 ++++++++ blog-api/tests/Cli.suite.yml | 6 + blog-api/tests/Cli/ConsoleCest.php | 17 ++ .../tests}/Functional.suite.yml | 0 .../tests/Functional/UserControllerTest.php | 60 +++++ .../tests}/Support/AcceptanceTester.php | 6 +- .../tests}/Support/CliTester.php | 6 +- blog-api/tests/Support/Data/database.db | Bin 0 -> 114688 bytes blog-api/tests/Support/Data/dump.sql | 58 +++++ .../tests}/Support/FunctionalTester.php | 6 +- .../tests}/Support/Helper/Acceptance.php | 0 blog-api/tests/Support/Helper/Cli.php | 14 ++ .../tests}/Support/Helper/Functional.php | 0 .../tests}/Support/Helper/Unit.php | 0 .../tests}/Support/UnitTester.php | 6 +- .../tests}/Support/_generated/.gitignore | 0 {tests => blog-api/tests}/Unit.suite.yml | 0 blog-api/tests/Unit/.gitkeep | 0 yii => blog-api/yii | 0 yii.bat => blog-api/yii.bat | 0 blog/.editorconfig | 17 ++ .env.example => blog/.env.example | 0 .env.test => blog/.env.test | 0 blog/.gitattributes | 27 ++ .gitignore => blog/.gitignore | 0 blog/.phpunit-watcher.yml | 11 + blog/LICENSE.md | 29 +++ README.md => blog/README.md | 0 blog/autoload.php | 20 ++ codeception.yml => blog/codeception.yml | 0 composer.json => blog/composer.json | 0 {config => blog/config}/.gitignore | 0 .../config/bootstrap-console.php | 0 .../config/bootstrap-web.php | 0 blog/config/bootstrap.php | 5 + {config => blog/config}/common/cache.php | 0 blog/config/common/cycle.php | 23 ++ blog/config/common/logger.php | 21 ++ blog/config/common/psr17.php | 25 ++ {config => blog/config}/common/rbac.php | 4 +- {config => blog/config}/common/router.php | 2 +- {config => blog/config}/common/sentry.php | 0 blog/config/common/translator.php | 24 ++ blog/config/common/validator.php | 12 + .../config}/console/translator-extractor.php | 2 +- blog/config/delegates-console.php | 5 + blog/config/delegates-web.php | 5 + blog/config/delegates.php | 5 + blog/config/dev/params.php | 5 + {config => blog/config}/events-console.php | 0 {config => blog/config}/events-web.php | 0 blog/config/events.php | 5 + {config => blog/config}/params.php | 2 +- blog/config/prod/params.php | 5 + blog/config/providers-console.php | 5 + blog/config/providers-web.php | 5 + blog/config/providers.php | 6 + blog/config/rbac-rules.php | 5 + {config => blog/config}/routes-backend.php | 8 +- {config => blog/config}/routes.php | 11 +- blog/config/test/params.php | 5 + {config => blog/config}/web/application.php | 0 {config => blog/config}/web/auth.php | 2 +- .../config}/web/comment-service.php | 0 .../config}/web/contact-mailer.php | 0 {config => blog/config}/web/rate-limit.php | 9 +- blog/config/widgets.php | 5 + .../dependency-checker.json | 0 docker-compose.yml => blog/docker-compose.yml | 0 blog/phpunit.xml.dist | 29 +++ psalm.xml => blog/psalm.xml | 0 blog/public/.htaccess | 12 + blog/public/assets/.gitignore | 2 + blog/public/favicon.ico | Bin 0 -> 318 bytes {public => blog/public}/index.php | 0 blog/public/robots.txt | 2 + .../resources}/asset/css/site.css | 0 {resources => blog/resources}/asset/js/app.js | 0 .../resources}/backend/views/site/index.php | 0 .../resources}/mail/layouts/html.php | 0 .../resources}/messages/en/app.php | 2 + .../resources}/messages/id/app.php | 2 + .../resources}/messages/ru/app.php | 2 + .../resources}/messages/sk/app.php | 2 + {resources => blog/resources}/rbac/items.php | 2 + .../resources}/views/auth/login.php | 9 +- .../resources}/views/blog/_archive.php | 8 +- .../resources}/views/blog/_topTags.php | 12 +- .../resources}/views/blog/archive/index.php | 8 +- .../views/blog/archive/monthly-archive.php | 10 +- .../views/blog/archive/yearly-archive.php | 12 +- .../views/blog/comments/_comments.php | 7 +- .../resources}/views/blog/comments/index.php | 9 +- .../resources}/views/blog/index.php | 12 +- .../resources}/views/blog/post/__form.php | 24 +- .../resources}/views/blog/post/index.php | 28 +-- .../resources}/views/blog/tag/index.php | 8 +- .../resources}/views/layout/main.php | 24 +- .../resources}/views/signup/signup.php | 9 +- .../resources}/views/site/404.php | 9 +- .../resources}/views/site/index.php | 3 +- .../resources}/views/user/index.php | 11 +- .../resources}/views/user/profile.php | 2 +- blog/runtime/.gitignore | 2 + {src => blog/src}/Asset/AppAsset.php | 0 .../src}/Asset/Bootstrap5IconsAsset.php | 0 {src => blog/src}/Auth/AuthService.php | 0 .../src}/Auth/Controller/AuthController.php | 0 .../src}/Auth/Controller/SignupController.php | 0 {src => blog/src}/Auth/Form/LoginForm.php | 0 {src => blog/src}/Auth/Form/SignupForm.php | 3 + {src => blog/src}/Auth/Identity.php | 0 {src => blog/src}/Auth/IdentityRepository.php | 0 .../Backend/Controller/SiteController.php | 0 .../src}/Blog/Archive/ArchiveController.php | 10 +- .../src}/Blog/Archive/ArchiveRepository.php | 15 +- {src => blog/src}/Blog/BlogController.php | 3 +- .../src}/Blog/Comment/CommentRepository.php | 0 .../src}/Blog/Comment/CommentService.php | 0 .../src}/Blog/Comment/Scope/PublicScope.php | 4 +- {src => blog/src}/Blog/CommentController.php | 2 +- {src => blog/src}/Blog/Entity/Comment.php | 6 +- {src => blog/src}/Blog/Entity/Post.php | 6 +- {src => blog/src}/Blog/Entity/PostTag.php | 0 {src => blog/src}/Blog/Entity/Tag.php | 3 +- .../src}/Blog/Post/PostController.php | 2 + {src => blog/src}/Blog/Post/PostForm.php | 0 .../src}/Blog/Post/PostRepository.php | 5 +- {src => blog/src}/Blog/Post/PostService.php | 0 .../src}/Blog/Post/Scope/PublicScope.php | 2 +- {src => blog/src}/Blog/Tag/TagController.php | 1 + {src => blog/src}/Blog/Tag/TagRepository.php | 10 +- {src => blog/src}/Blog/Widget/PostCard.php | 2 + .../src}/Command/Fixture/AddCommand.php | 21 +- .../Command/Fixture/SchemaClearCommand.php | 6 +- .../src}/Command/Router/ListCommand.php | 1 + .../Command/Translation/TranslateCommand.php | 1 + .../src}/Contact/ContactController.php | 2 +- {src => blog/src}/Contact/ContactForm.php | 0 {src => blog/src}/Contact/ContactMailer.php | 4 +- .../src}/Contact/mail/contact-email.php | 1 - .../src}/Contact/mail/layouts/html.php | 0 .../src}/Contact/views/contact/form.php | 12 +- .../src}/Controller/Actions/ApiInfo.php | 2 +- .../src}/Controller/SiteController.php | 0 {src => blog/src}/Handler/NotFoundHandler.php | 0 blog/src/Installer.php | 40 +++ .../src}/Middleware/AccessChecker.php | 4 +- .../src}/Middleware/ApiDataWrapper.php | 2 + .../src}/Service/WebControllerService.php | 0 {src => blog/src}/Timer.php | 4 +- .../src}/User/Console/AssignRoleCommand.php | 6 +- .../src}/User/Console/CreateCommand.php | 12 +- .../User/Controller/ApiUserController.php | 0 .../src}/User/Controller/UserController.php | 0 {src => blog/src}/User/User.php | 8 +- {src => blog/src}/User/UserRepository.php | 0 {src => blog/src}/User/UserService.php | 1 + .../ViewInjection/CommonViewInjection.php | 0 .../ViewInjection/LayoutViewInjection.php | 0 .../ViewInjection/LinkTagsViewInjection.php | 0 .../ViewInjection/MetaTagsViewInjection.php | 0 {src => blog/src}/Widget/FlashMessage.php | 5 +- {src => blog/src}/Widget/OffsetPagination.php | 6 +- .../src}/Widget/PerformanceMetrics.php | 0 {tests => blog/tests}/Acceptance.suite.yml | 0 .../tests}/Acceptance/BlogPageCest.php | 0 .../tests}/Acceptance/CommentPageCest.php | 0 .../tests}/Acceptance/ContactPageCest.php | 0 .../tests}/Acceptance/IndexPageCest.php | 0 .../tests}/Acceptance/LoginAcceptanceCest.php | 0 .../Acceptance/SignupAcceptanceCest.php | 0 .../tests}/Acceptance/UserPageCest.php | 0 {tests => blog/tests}/Cli.suite.yml | 0 {tests => blog/tests}/Cli/ConsoleCest.php | 2 +- blog/tests/Functional.suite.yml | 12 + .../tests}/Functional/ContactCest.php | 0 .../EventListenerConfigurationTest.php | 3 +- .../tests}/Functional/IndexControllerTest.php | 0 blog/tests/Support/AcceptanceTester.php | 32 +++ blog/tests/Support/CliTester.php | 32 +++ blog/tests/Support/FunctionalTester.php | 32 +++ blog/tests/Support/Helper/Acceptance.php | 14 ++ blog/tests/Support/Helper/Functional.php | 14 ++ blog/tests/Support/Helper/Unit.php | 14 ++ blog/tests/Support/UnitTester.php | 32 +++ blog/tests/Support/_generated/.gitignore | 2 + blog/tests/Unit.suite.yml | 6 + blog/tests/Unit/.gitkeep | 0 blog/yii | 12 + blog/yii.bat | 6 + 296 files changed, 4564 insertions(+), 265 deletions(-) create mode 100644 .github/workflows/blog-api_build.yml create mode 100644 .github/workflows/blog-api_dependency.yml create mode 100644 .github/workflows/blog-api_static.yml rename .github/workflows/{build.yml => blog_build.yml} (66%) rename .github/workflows/{dependency.yml => blog_dependency.yml} (56%) rename .github/workflows/{static.yml => blog_static.yml} (57%) rename .editorconfig => blog-api/.editorconfig (100%) create mode 100644 blog-api/.env.example create mode 100644 blog-api/.env.test rename .gitattributes => blog-api/.gitattributes (100%) create mode 100644 blog-api/.gitignore rename .phpunit-watcher.yml => blog-api/.phpunit-watcher.yml (100%) create mode 100644 blog-api/.scrutinizer.yml create mode 100644 blog-api/CHANGELOG.md rename LICENSE.md => blog-api/LICENSE.md (100%) create mode 100644 blog-api/README.md rename autoload.php => blog-api/autoload.php (83%) create mode 100644 blog-api/codeception.yml create mode 100644 blog-api/composer.json create mode 100644 blog-api/config/.gitignore rename {config => blog-api/config}/bootstrap-console.php (100%) rename {config => blog-api/config}/bootstrap-web.php (100%) rename {config => blog-api/config}/bootstrap.php (100%) create mode 100644 blog-api/config/common/cache.php rename {config => blog-api/config}/common/cycle.php (100%) rename {config => blog-api/config}/common/logger.php (100%) rename {config => blog-api/config}/common/psr17.php (100%) create mode 100644 blog-api/config/common/router.php rename {config => blog-api/config}/common/translator.php (100%) rename {config => blog-api/config}/common/validator.php (100%) rename {tests/Unit => blog-api/config/console}/.gitkeep (100%) rename {config => blog-api/config}/delegates-console.php (100%) rename {config => blog-api/config}/delegates-web.php (100%) rename {config => blog-api/config}/delegates.php (100%) rename {config => blog-api/config}/dev/params.php (100%) rename config/events.php => blog-api/config/events-console.php (100%) rename config/prod/params.php => blog-api/config/events-web.php (100%) rename config/providers-console.php => blog-api/config/events.php (100%) create mode 100644 blog-api/config/params.php rename {config/test => blog-api/config/prod}/params.php (100%) rename config/providers-web.php => blog-api/config/providers-console.php (100%) create mode 100644 blog-api/config/providers-web.php rename {config => blog-api/config}/providers.php (100%) create mode 100644 blog-api/config/routes.php create mode 100644 blog-api/config/test/params.php create mode 100644 blog-api/config/web/application.php create mode 100644 blog-api/config/web/data-response.php create mode 100644 blog-api/config/web/error-handler.php create mode 100644 blog-api/config/web/middleware-dispatcher.php create mode 100644 blog-api/config/web/user.php create mode 100644 blog-api/data/db/database.db create mode 100644 blog-api/data/nginx/default.conf create mode 100644 blog-api/docker-compose.yml create mode 100644 blog-api/infection.json.dist rename phpunit.xml.dist => blog-api/phpunit.xml.dist (100%) create mode 100644 blog-api/psalm.xml rename {public => blog-api/public}/.htaccess (100%) rename {public => blog-api/public}/assets/.gitignore (100%) rename {public => blog-api/public}/favicon.ico (100%) create mode 100644 blog-api/public/index.php rename {public => blog-api/public}/robots.txt (100%) create mode 100644 blog-api/resources/messages/en/app.php create mode 100644 blog-api/resources/messages/ru/app.php rename {runtime => blog-api/runtime}/.gitignore (100%) create mode 100644 blog-api/src/Auth/AuthController.php create mode 100644 blog-api/src/Auth/AuthRequest.php create mode 100644 blog-api/src/Auth/AuthRequestErrorHandler.php create mode 100644 blog-api/src/Blog/BlogController.php create mode 100644 blog-api/src/Blog/BlogService.php create mode 100644 blog-api/src/Blog/EditPostRequest.php create mode 100644 blog-api/src/Blog/Post.php create mode 100644 blog-api/src/Blog/PostBuilder.php create mode 100644 blog-api/src/Blog/PostFormatter.php create mode 100644 blog-api/src/Blog/PostRepository.php create mode 100644 blog-api/src/Blog/PostStatus.php create mode 100644 blog-api/src/Dto/ApiResponseData.php create mode 100644 blog-api/src/Exception/ApplicationException.php create mode 100644 blog-api/src/Exception/BadRequestException.php create mode 100644 blog-api/src/Exception/MethodNotAllowedException.php create mode 100644 blog-api/src/Exception/NotFoundException.php create mode 100644 blog-api/src/Exception/UnauthorisedException.php create mode 100644 blog-api/src/Factory/ApiResponseDataFactory.php create mode 100644 blog-api/src/Factory/RestGroupFactory.php create mode 100644 blog-api/src/Formatter/ApiResponseFormatter.php create mode 100644 blog-api/src/Formatter/PaginatorFormatter.php create mode 100644 blog-api/src/Handler/NotFoundHandler.php create mode 100644 blog-api/src/InfoController.php rename {src => blog-api/src}/Installer.php (100%) create mode 100644 blog-api/src/Middleware/ExceptionMiddleware.php create mode 100644 blog-api/src/Queue/LoggingAuthorizationHandler.php create mode 100644 blog-api/src/Queue/UserLoggedInMessage.php create mode 100644 blog-api/src/RestControllerTrait.php create mode 100644 blog-api/src/User/User.php create mode 100644 blog-api/src/User/UserController.php create mode 100644 blog-api/src/User/UserFormatter.php create mode 100644 blog-api/src/User/UserRepository.php create mode 100644 blog-api/src/User/UserRequest.php create mode 100644 blog-api/src/User/UserService.php create mode 100644 blog-api/src/VersionProvider.php create mode 100644 blog-api/tests/.gitkeep create mode 100644 blog-api/tests/Acceptance.suite.yml create mode 100644 blog-api/tests/Acceptance/AuthCest.php create mode 100644 blog-api/tests/Acceptance/BlogCest.php create mode 100644 blog-api/tests/Acceptance/SiteCest.php create mode 100644 blog-api/tests/Acceptance/UserCest.php create mode 100644 blog-api/tests/Cli.suite.yml create mode 100644 blog-api/tests/Cli/ConsoleCest.php rename {tests => blog-api/tests}/Functional.suite.yml (100%) create mode 100644 blog-api/tests/Functional/UserControllerTest.php rename {tests => blog-api/tests}/Support/AcceptanceTester.php (90%) rename {tests => blog-api/tests}/Support/CliTester.php (90%) create mode 100644 blog-api/tests/Support/Data/database.db create mode 100644 blog-api/tests/Support/Data/dump.sql rename {tests => blog-api/tests}/Support/FunctionalTester.php (90%) rename {tests => blog-api/tests}/Support/Helper/Acceptance.php (100%) create mode 100644 blog-api/tests/Support/Helper/Cli.php rename {tests => blog-api/tests}/Support/Helper/Functional.php (100%) rename {tests => blog-api/tests}/Support/Helper/Unit.php (100%) rename {tests => blog-api/tests}/Support/UnitTester.php (90%) rename {tests => blog-api/tests}/Support/_generated/.gitignore (100%) rename {tests => blog-api/tests}/Unit.suite.yml (100%) create mode 100644 blog-api/tests/Unit/.gitkeep rename yii => blog-api/yii (100%) rename yii.bat => blog-api/yii.bat (100%) create mode 100644 blog/.editorconfig rename .env.example => blog/.env.example (100%) rename .env.test => blog/.env.test (100%) create mode 100644 blog/.gitattributes rename .gitignore => blog/.gitignore (100%) create mode 100644 blog/.phpunit-watcher.yml create mode 100644 blog/LICENSE.md rename README.md => blog/README.md (100%) create mode 100644 blog/autoload.php rename codeception.yml => blog/codeception.yml (100%) rename composer.json => blog/composer.json (100%) rename {config => blog/config}/.gitignore (100%) rename config/rbac-rules.php => blog/config/bootstrap-console.php (100%) rename config/widgets.php => blog/config/bootstrap-web.php (100%) create mode 100644 blog/config/bootstrap.php rename {config => blog/config}/common/cache.php (100%) create mode 100644 blog/config/common/cycle.php create mode 100644 blog/config/common/logger.php create mode 100644 blog/config/common/psr17.php rename {config => blog/config}/common/rbac.php (100%) rename {config => blog/config}/common/router.php (100%) rename {config => blog/config}/common/sentry.php (100%) create mode 100644 blog/config/common/translator.php create mode 100644 blog/config/common/validator.php rename {config => blog/config}/console/translator-extractor.php (100%) create mode 100644 blog/config/delegates-console.php create mode 100644 blog/config/delegates-web.php create mode 100644 blog/config/delegates.php create mode 100644 blog/config/dev/params.php rename {config => blog/config}/events-console.php (100%) rename {config => blog/config}/events-web.php (100%) create mode 100644 blog/config/events.php rename {config => blog/config}/params.php (99%) create mode 100644 blog/config/prod/params.php create mode 100644 blog/config/providers-console.php create mode 100644 blog/config/providers-web.php create mode 100644 blog/config/providers.php create mode 100644 blog/config/rbac-rules.php rename {config => blog/config}/routes-backend.php (58%) rename {config => blog/config}/routes.php (95%) create mode 100644 blog/config/test/params.php rename {config => blog/config}/web/application.php (100%) rename {config => blog/config}/web/auth.php (100%) rename {config => blog/config}/web/comment-service.php (100%) rename {config => blog/config}/web/contact-mailer.php (100%) rename {config => blog/config}/web/rate-limit.php (99%) create mode 100644 blog/config/widgets.php rename dependency-checker.json => blog/dependency-checker.json (100%) rename docker-compose.yml => blog/docker-compose.yml (100%) create mode 100644 blog/phpunit.xml.dist rename psalm.xml => blog/psalm.xml (100%) create mode 100644 blog/public/.htaccess create mode 100755 blog/public/assets/.gitignore create mode 100644 blog/public/favicon.ico rename {public => blog/public}/index.php (100%) create mode 100644 blog/public/robots.txt rename {resources => blog/resources}/asset/css/site.css (100%) rename {resources => blog/resources}/asset/js/app.js (100%) rename {resources => blog/resources}/backend/views/site/index.php (100%) rename {resources => blog/resources}/mail/layouts/html.php (100%) rename {resources => blog/resources}/messages/en/app.php (98%) rename {resources => blog/resources}/messages/id/app.php (99%) rename {resources => blog/resources}/messages/ru/app.php (99%) rename {resources => blog/resources}/messages/sk/app.php (99%) rename {resources => blog/resources}/rbac/items.php (93%) rename {resources => blog/resources}/views/auth/login.php (92%) rename {resources => blog/resources}/views/blog/_archive.php (89%) rename {resources => blog/resources}/views/blog/_topTags.php (82%) rename {resources => blog/resources}/views/blog/archive/index.php (90%) rename {resources => blog/resources}/views/blog/archive/monthly-archive.php (89%) rename {resources => blog/resources}/views/blog/archive/yearly-archive.php (88%) rename {resources => blog/resources}/views/blog/comments/_comments.php (90%) rename {resources => blog/resources}/views/blog/comments/index.php (78%) rename {resources => blog/resources}/views/blog/index.php (88%) rename {resources => blog/resources}/views/blog/post/__form.php (82%) rename {resources => blog/resources}/views/blog/post/index.php (88%) rename {resources => blog/resources}/views/blog/tag/index.php (89%) rename {resources => blog/resources}/views/layout/main.php (94%) rename {resources => blog/resources}/views/signup/signup.php (91%) rename {resources => blog/resources}/views/site/404.php (88%) rename {resources => blog/resources}/views/site/index.php (98%) rename {resources => blog/resources}/views/user/index.php (96%) rename {resources => blog/resources}/views/user/profile.php (98%) create mode 100755 blog/runtime/.gitignore rename {src => blog/src}/Asset/AppAsset.php (100%) rename {src => blog/src}/Asset/Bootstrap5IconsAsset.php (100%) rename {src => blog/src}/Auth/AuthService.php (100%) rename {src => blog/src}/Auth/Controller/AuthController.php (100%) rename {src => blog/src}/Auth/Controller/SignupController.php (100%) rename {src => blog/src}/Auth/Form/LoginForm.php (100%) rename {src => blog/src}/Auth/Form/SignupForm.php (99%) rename {src => blog/src}/Auth/Identity.php (100%) rename {src => blog/src}/Auth/IdentityRepository.php (100%) rename {src => blog/src}/Backend/Controller/SiteController.php (100%) rename {src => blog/src}/Blog/Archive/ArchiveController.php (87%) rename {src => blog/src}/Blog/Archive/ArchiveRepository.php (95%) rename {src => blog/src}/Blog/BlogController.php (95%) rename {src => blog/src}/Blog/Comment/CommentRepository.php (100%) rename {src => blog/src}/Blog/Comment/CommentService.php (100%) rename {src => blog/src}/Blog/Comment/Scope/PublicScope.php (98%) rename {src => blog/src}/Blog/CommentController.php (91%) rename {src => blog/src}/Blog/Entity/Comment.php (95%) rename {src => blog/src}/Blog/Entity/Post.php (96%) rename {src => blog/src}/Blog/Entity/PostTag.php (100%) rename {src => blog/src}/Blog/Entity/Tag.php (95%) rename {src => blog/src}/Blog/Post/PostController.php (99%) rename {src => blog/src}/Blog/Post/PostForm.php (100%) rename {src => blog/src}/Blog/Post/PostRepository.php (97%) rename {src => blog/src}/Blog/Post/PostService.php (100%) rename {src => blog/src}/Blog/Post/Scope/PublicScope.php (100%) rename {src => blog/src}/Blog/Tag/TagController.php (99%) rename {src => blog/src}/Blog/Tag/TagRepository.php (96%) rename {src => blog/src}/Blog/Widget/PostCard.php (99%) rename {src => blog/src}/Command/Fixture/AddCommand.php (91%) rename {src => blog/src}/Command/Fixture/SchemaClearCommand.php (100%) rename {src => blog/src}/Command/Router/ListCommand.php (99%) rename {src => blog/src}/Command/Translation/TranslateCommand.php (99%) rename {src => blog/src}/Contact/ContactController.php (97%) rename {src => blog/src}/Contact/ContactForm.php (100%) rename {src => blog/src}/Contact/ContactMailer.php (95%) rename {src => blog/src}/Contact/mail/contact-email.php (99%) rename {src => blog/src}/Contact/mail/layouts/html.php (100%) rename {src => blog/src}/Contact/views/contact/form.php (90%) rename {src => blog/src}/Controller/Actions/ApiInfo.php (100%) rename {src => blog/src}/Controller/SiteController.php (100%) rename {src => blog/src}/Handler/NotFoundHandler.php (100%) create mode 100644 blog/src/Installer.php rename {src => blog/src}/Middleware/AccessChecker.php (91%) rename {src => blog/src}/Middleware/ApiDataWrapper.php (99%) rename {src => blog/src}/Service/WebControllerService.php (100%) rename {src => blog/src}/Timer.php (76%) rename {src => blog/src}/User/Console/AssignRoleCommand.php (98%) rename {src => blog/src}/User/Console/CreateCommand.php (89%) rename {src => blog/src}/User/Controller/ApiUserController.php (100%) rename {src => blog/src}/User/Controller/UserController.php (100%) rename {src => blog/src}/User/User.php (92%) rename {src => blog/src}/User/UserRepository.php (100%) rename {src => blog/src}/User/UserService.php (99%) rename {src => blog/src}/ViewInjection/CommonViewInjection.php (100%) rename {src => blog/src}/ViewInjection/LayoutViewInjection.php (100%) rename {src => blog/src}/ViewInjection/LinkTagsViewInjection.php (100%) rename {src => blog/src}/ViewInjection/MetaTagsViewInjection.php (100%) rename {src => blog/src}/Widget/FlashMessage.php (91%) rename {src => blog/src}/Widget/OffsetPagination.php (95%) rename {src => blog/src}/Widget/PerformanceMetrics.php (100%) rename {tests => blog/tests}/Acceptance.suite.yml (100%) rename {tests => blog/tests}/Acceptance/BlogPageCest.php (100%) rename {tests => blog/tests}/Acceptance/CommentPageCest.php (100%) rename {tests => blog/tests}/Acceptance/ContactPageCest.php (100%) rename {tests => blog/tests}/Acceptance/IndexPageCest.php (100%) rename {tests => blog/tests}/Acceptance/LoginAcceptanceCest.php (100%) rename {tests => blog/tests}/Acceptance/SignupAcceptanceCest.php (100%) rename {tests => blog/tests}/Acceptance/UserPageCest.php (100%) rename {tests => blog/tests}/Cli.suite.yml (100%) rename {tests => blog/tests}/Cli/ConsoleCest.php (95%) create mode 100644 blog/tests/Functional.suite.yml rename {tests => blog/tests}/Functional/ContactCest.php (100%) rename {tests => blog/tests}/Functional/EventListenerConfigurationTest.php (99%) rename {tests => blog/tests}/Functional/IndexControllerTest.php (100%) create mode 100644 blog/tests/Support/AcceptanceTester.php create mode 100644 blog/tests/Support/CliTester.php create mode 100644 blog/tests/Support/FunctionalTester.php create mode 100644 blog/tests/Support/Helper/Acceptance.php create mode 100644 blog/tests/Support/Helper/Functional.php create mode 100644 blog/tests/Support/Helper/Unit.php create mode 100644 blog/tests/Support/UnitTester.php create mode 100644 blog/tests/Support/_generated/.gitignore create mode 100644 blog/tests/Unit.suite.yml create mode 100644 blog/tests/Unit/.gitkeep create mode 100755 blog/yii create mode 100644 blog/yii.bat diff --git a/.github/workflows/blog-api_build.yml b/.github/workflows/blog-api_build.yml new file mode 100644 index 000000000..297590dde --- /dev/null +++ b/.github/workflows/blog-api_build.yml @@ -0,0 +1,112 @@ +defaults: + run: + working-directory: blog-api +on: + pull_request: + paths-ignore: + - 'blog-api/docs/**' + - 'blog-api/README.md' + - 'blog-api/CHANGELOG.md' + - 'blog-api/.gitignore' + - 'blog-api/.env.example' + - 'blog-api/.gitattributes' + - 'blog-api/infection.json.dist' + - 'blog-api/psalm.xml' + + push: + paths-ignore: + - 'blog-api/docs/**' + - 'blog-api/README.md' + - 'blog-api/CHANGELOG.md' + - 'blog-api/.gitignore' + - 'blog-api/.env.example' + - 'blog-api/.gitattributes' + - 'blog-api/infection.json.dist' + - 'blog-api/psalm.xml' + + schedule: + - cron: '0 0 * * *' + +name: blog-api build + +jobs: + tests: + name: PHP ${{ matrix.php }}-${{ matrix.os }} + + env: + extensions: fileinfo, pdo, pdo_sqlite, intl + key: cache-v1 + YII_C3: true + working_directory: blog-api + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: + - ubuntu-latest + - windows-latest + + php: + - 8.1 + - 8.2 + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + working-directory: ${{ env.working_directory }} + + - name: Install PHP with extensions + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: ${{ env.extensions }} + ini-values: date.timezone='UTC' + tools: composer:v2 + coverage: pcov + working-directory: ${{ env.working_directory }} + + - name: Determine composer cache directory on Linux + if: matrix.os == 'ubuntu-latest' + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV + working-directory: ${{ env.working_directory }} + + - name: Determine composer cache directory on Windows + if: matrix.os == 'windows-latest' + run: echo "COMPOSER_CACHE_DIR=~\AppData\Local\Composer" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + working-directory: ${{ env.working_directory }} + + - name: Cache dependencies installed with composer + uses: actions/cache@v3 + with: + path: ${{ env.COMPOSER_CACHE_DIR }} + key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php }}-composer- + working-directory: ${{ env.working_directory }} + + - name: Update composer + run: composer self-update + working-directory: ${{ env.working_directory }} + + - name: Install dependencies with composer + run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + working-directory: ${{ env.working_directory }} + + - name: Run tests codeception + if: matrix.os != 'ubuntu-latest' || matrix.php != '8.0' + run: vendor/bin/codecept run + working-directory: ${{ env.working_directory }} + + - name: Run tests codeception with coverage + if: matrix.os == 'ubuntu-latest' && matrix.php == '8.0' + run: vendor/bin/codecept run --coverage-xml + working-directory: ${{ env.working_directory }} + + - name: Upload coverage to codecov + if: matrix.os == 'ubuntu-latest' && matrix.php == '8.0' + uses: codecov/codecov-action@v3 + with: + file: tests/_output/coverage.xml + working-directory: ${{ env.working_directory }} diff --git a/.github/workflows/blog-api_dependency.yml b/.github/workflows/blog-api_dependency.yml new file mode 100644 index 000000000..ed73b9d87 --- /dev/null +++ b/.github/workflows/blog-api_dependency.yml @@ -0,0 +1,86 @@ +defaults: + run: + working-directory: blog-api +on: + pull_request: + paths-ignore: + - 'blog-api/docs/**' + - 'blog-api/README.md' + - 'blog-api/CHANGELOG.md' + - 'blog-api/.gitignore' + - 'blog-api/.env.example' + - 'blog-api/.gitattributes' + - 'blog-api/phpunit.xml.dist' + - 'blog-api/psalm.xml' + + push: + paths-ignore: + - 'blog-api/docs/**' + - 'blog-api/README.md' + - 'blog-api/CHANGELOG.md' + - 'blog-api/.gitignore' + - 'blog-api/.env.example' + - 'blog-api/.gitattributes' + - 'blog-api/phpunit.xml.dist' + - 'blog-api/psalm.xml' + + schedule: + - cron: '0 0 * * *' + +name: blog-api dependency checker + +jobs: + mutation: + name: PHP ${{ matrix.php }}-${{ matrix.os }} + + env: + working_directory: blog-api + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: + - ubuntu-latest + + php: + - 8.1 + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + working-directory: ${{ env.working_directory }} + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + tools: composer:v2, cs2pr + coverage: none + working-directory: ${{ env.working_directory }} + + - name: Determine composer cache directory + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV + working-directory: ${{ env.working_directory }} + + - name: Cache dependencies installed with composer + uses: actions/cache@v3 + with: + path: ${{ env.COMPOSER_CACHE_DIR }} + key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php }}-composer- + working-directory: ${{ env.working_directory }} + + - name: Update composer + run: composer self-update + working-directory: ${{ env.working_directory }} + + - name: Install maglnet/composer-require-checker + run: composer require maglnet/composer-require-checker:^4.0 + working-directory: ${{ env.working_directory }} + + - name: Check dependency + run: vendor/bin/composer-require-checker + working-directory: ${{ env.working_directory }} diff --git a/.github/workflows/blog-api_static.yml b/.github/workflows/blog-api_static.yml new file mode 100644 index 000000000..84059dd27 --- /dev/null +++ b/.github/workflows/blog-api_static.yml @@ -0,0 +1,86 @@ +defaults: + run: + working-directory: blog-api +on: + pull_request: + paths-ignore: + - 'blog-api/docs/**' + - 'blog-api/README.md' + - 'blog-api/CHANGELOG.md' + - 'blog-api/.gitignore' + - 'blog-api/.env.example' + - 'blog-api/.gitattributes' + - 'blog-api/infection.json.dist' + - 'blog-api/phpunit.xml.dist' + + push: + paths-ignore: + - 'blog-api/docs/**' + - 'blog-api/README.md' + - 'blog-api/CHANGELOG.md' + - 'blog-api/.gitignore' + - 'blog-api/.env.example' + - 'blog-api/.gitattributes' + - 'blog-api/infection.json.dist' + - 'blog-api/phpunit.xml.dist' + + schedule: + - cron: '0 0 * * *' + +name: blog-api static analysis + +jobs: + mutation: + name: PHP ${{ matrix.php }}-${{ matrix.os }} + + env: + working_directory: blog-api + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: + - ubuntu-latest + + php: + - 8.1 + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + working-directory: ${{ env.working_directory }} + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + tools: composer:v2, cs2pr + coverage: none + working-directory: ${{ env.working_directory }} + + - name: Determine composer cache directory + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV + working-directory: ${{ env.working_directory }} + + - name: Cache dependencies installed with composer + uses: actions/cache@v3 + with: + path: ${{ env.COMPOSER_CACHE_DIR }} + key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php }}-composer- + working-directory: ${{ env.working_directory }} + + - name: Update composer + run: composer self-update + working-directory: ${{ env.working_directory }} + + - name: Install dependencies with composer + run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + working-directory: ${{ env.working_directory }} + + - name: Static analysis + run: vendor/bin/psalm --shepherd --stats --output-format=checkstyle | cs2pr --graceful-warnings --colorize + working-directory: ${{ env.working_directory }} diff --git a/.github/workflows/build.yml b/.github/workflows/blog_build.yml similarity index 66% rename from .github/workflows/build.yml rename to .github/workflows/blog_build.yml index 743df91c1..d1b87bca8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/blog_build.yml @@ -1,30 +1,33 @@ +defaults: + run: + working-directory: blog on: pull_request: paths-ignore: - - 'docs/**' - - 'README.md' - - 'CHANGELOG.md' - - '.gitignore' - - '.env.example' - - '.gitattributes' - - 'infection.json.dist' - - 'psalm.xml' + - 'blog/docs/**' + - 'blog/README.md' + - 'blog/CHANGELOG.md' + - 'blog/.gitignore' + - 'blog/.env.example' + - 'blog/.gitattributes' + - 'blog/infection.json.dist' + - 'blog/psalm.xml' push: paths-ignore: - - 'docs/**' - - 'README.md' - - 'CHANGELOG.md' - - '.gitignore' - - '.env.example' - - '.gitattributes' - - 'infection.json.dist' - - 'psalm.xml' + - 'blog/docs/**' + - 'blog/README.md' + - 'blog/CHANGELOG.md' + - 'blog/.gitignore' + - 'blog/.env.example' + - 'blog/.gitattributes' + - 'blog/infection.json.dist' + - 'blog/psalm.xml' schedule: - cron: '0 0 * * *' -name: build +name: blog build jobs: tests: @@ -34,6 +37,7 @@ jobs: extensions: fileinfo, pdo, pdo_sqlite, intl key: cache-v1 YII_C3: true + working_directory: blog-api runs-on: ${{ matrix.os }} @@ -50,6 +54,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + with: + working-directory: ${{ env.working_directory }} - name: Install PHP with extensions uses: shivammathur/setup-php@v2 @@ -59,14 +65,17 @@ jobs: ini-values: date.timezone='UTC' tools: composer:v2 coverage: pcov + working-directory: ${{ env.working_directory }} - name: Determine composer cache directory on Linux if: matrix.os == 'ubuntu-latest' run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV + working-directory: ${{ env.working_directory }} - name: Determine composer cache directory on Windows if: matrix.os == 'windows-latest' run: echo "COMPOSER_CACHE_DIR=~\AppData\Local\Composer" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + working-directory: ${{ env.working_directory }} - name: Cache dependencies installed with composer uses: actions/cache@v3 @@ -75,21 +84,29 @@ jobs: key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} restore-keys: | php${{ matrix.php }}-composer- + working-directory: ${{ env.working_directory }} + - name: Update composer run: composer self-update + working-directory: ${{ env.working_directory }} - name: Install dependencies with composer run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + working-directory: ${{ env.working_directory }} - name: Run tests codeception if: matrix.os != 'ubuntu-latest' || matrix.php != '8.0' run: vendor/bin/codecept run + working-directory: ${{ env.working_directory }} + - name: Run tests codeception with coverage if: matrix.os == 'ubuntu-latest' && matrix.php == '8.0' run: vendor/bin/codecept run --coverage-xml + working-directory: ${{ env.working_directory }} - name: Upload coverage to codecov if: matrix.os == 'ubuntu-latest' && matrix.php == '8.0' uses: codecov/codecov-action@v3 with: file: tests/_output/coverage.xml + working-directory: ${{ env.working_directory }} diff --git a/.github/workflows/dependency.yml b/.github/workflows/blog_dependency.yml similarity index 56% rename from .github/workflows/dependency.yml rename to .github/workflows/blog_dependency.yml index f8854bcfa..3a2c9afd9 100644 --- a/.github/workflows/dependency.yml +++ b/.github/workflows/blog_dependency.yml @@ -1,35 +1,41 @@ +defaults: + run: + working-directory: blog on: pull_request: paths-ignore: - - 'docs/**' - - 'README.md' - - 'CHANGELOG.md' - - '.gitignore' - - '.env.example' - - '.gitattributes' - - 'phpunit.xml.dist' - - 'psalm.xml' + - 'blog/docs/**' + - 'blog/README.md' + - 'blog/CHANGELOG.md' + - 'blog/.gitignore' + - 'blog/.env.example' + - 'blog/.gitattributes' + - 'blog/phpunit.xml.dist' + - 'blog/psalm.xml' push: paths-ignore: - - 'docs/**' - - 'README.md' - - 'CHANGELOG.md' - - '.gitignore' - - '.env.example' - - '.gitattributes' - - 'phpunit.xml.dist' - - 'psalm.xml' + - 'blog/docs/**' + - 'blog/README.md' + - 'blog/CHANGELOG.md' + - 'blog/.gitignore' + - 'blog/.env.example' + - 'blog/.gitattributes' + - 'blog/phpunit.xml.dist' + - 'blog/psalm.xml' schedule: - cron: '0 0 * * *' -name: dependency checker +name: blog dependency checker jobs: mutation: name: PHP ${{ matrix.php }}-${{ matrix.os }} + env: + working_directory: blog + runs-on: ${{ matrix.os }} strategy: @@ -43,6 +49,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + with: + working-directory: ${{ env.working_directory }} - name: Install PHP uses: shivammathur/setup-php@v2 @@ -50,9 +58,11 @@ jobs: php-version: ${{ matrix.php }} tools: composer:v2, cs2pr coverage: none + working-directory: ${{ env.working_directory }} - name: Determine composer cache directory run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV + working-directory: ${{ env.working_directory }} - name: Cache dependencies installed with composer uses: actions/cache@v3 @@ -61,12 +71,16 @@ jobs: key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} restore-keys: | php${{ matrix.php }}-composer- + working-directory: ${{ env.working_directory }} - name: Update composer run: composer self-update + working-directory: ${{ env.working_directory }} - name: Install maglnet/composer-require-checker run: composer require maglnet/composer-require-checker:^4.0 + working-directory: ${{ env.working_directory }} - name: Check dependency run: vendor/bin/composer-require-checker + working-directory: ${{ env.working_directory }} diff --git a/.github/workflows/static.yml b/.github/workflows/blog_static.yml similarity index 57% rename from .github/workflows/static.yml rename to .github/workflows/blog_static.yml index 8198ef9cc..d0ab289a6 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/blog_static.yml @@ -1,35 +1,41 @@ +defaults: + run: + working-directory: blog on: pull_request: paths-ignore: - - 'docs/**' - - 'README.md' - - 'CHANGELOG.md' - - '.gitignore' - - '.env.example' - - '.gitattributes' - - 'infection.json.dist' - - 'phpunit.xml.dist' + - 'blog/docs/**' + - 'blog/README.md' + - 'blog/CHANGELOG.md' + - 'blog/.gitignore' + - 'blog/.env.example' + - 'blog/.gitattributes' + - 'blog/infection.json.dist' + - 'blog/phpunit.xml.dist' push: paths-ignore: - - 'docs/**' - - 'README.md' - - 'CHANGELOG.md' - - '.gitignore' - - '.env.example' - - '.gitattributes' - - 'infection.json.dist' - - 'phpunit.xml.dist' + - 'blog/docs/**' + - 'blog/README.md' + - 'blog/CHANGELOG.md' + - 'blog/.gitignore' + - 'blog/.env.example' + - 'blog/.gitattributes' + - 'blog/infection.json.dist' + - 'blog/phpunit.xml.dist' schedule: - cron: '0 0 * * *' -name: static analysis +name: blog static analysis jobs: mutation: name: PHP ${{ matrix.php }}-${{ matrix.os }} + env: + working_directory: blog + runs-on: ${{ matrix.os }} strategy: @@ -43,6 +49,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + with: + working-directory: ${{ env.working_directory }} - name: Install PHP uses: shivammathur/setup-php@v2 @@ -50,9 +58,11 @@ jobs: php-version: ${{ matrix.php }} tools: composer:v2, cs2pr coverage: none + working-directory: ${{ env.working_directory }} - name: Determine composer cache directory run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV + working-directory: ${{ env.working_directory }} - name: Cache dependencies installed with composer uses: actions/cache@v3 @@ -61,12 +71,16 @@ jobs: key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} restore-keys: | php${{ matrix.php }}-composer- + working-directory: ${{ env.working_directory }} - name: Update composer run: composer self-update + working-directory: ${{ env.working_directory }} - name: Install dependencies with composer run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + working-directory: ${{ env.working_directory }} - name: Static analysis run: vendor/bin/psalm --shepherd --stats --output-format=checkstyle | cs2pr --graceful-warnings --colorize + working-directory: ${{ env.working_directory }} diff --git a/.styleci.yml b/.styleci.yml index 63e26a594..2b00d6317 100644 --- a/.styleci.yml +++ b/.styleci.yml @@ -5,16 +5,12 @@ version: 8 finder: exclude: - - docs - - vendor - - resources - - views - - public - - templates - not-name: - - UnionCar.php - - TimerUnionTypes.php - - schema1.php + - "*/docs" + - "*/vendor" + - "*/resources" + - "*/views" + - "*/public" + - "*/templates" enabled: - alpha_ordered_traits diff --git a/.editorconfig b/blog-api/.editorconfig similarity index 100% rename from .editorconfig rename to blog-api/.editorconfig diff --git a/blog-api/.env.example b/blog-api/.env.example new file mode 100644 index 000000000..988a14f89 --- /dev/null +++ b/blog-api/.env.example @@ -0,0 +1,2 @@ +YII_ENV= +YII_DEBUG=true diff --git a/blog-api/.env.test b/blog-api/.env.test new file mode 100644 index 000000000..dbdcc044e --- /dev/null +++ b/blog-api/.env.test @@ -0,0 +1,2 @@ +YII_ENV=test +YII_DEBUG=true diff --git a/.gitattributes b/blog-api/.gitattributes similarity index 100% rename from .gitattributes rename to blog-api/.gitattributes diff --git a/blog-api/.gitignore b/blog-api/.gitignore new file mode 100644 index 000000000..cb3701b11 --- /dev/null +++ b/blog-api/.gitignore @@ -0,0 +1,39 @@ +# phpstorm project files +.idea + +# netbeans project files +nbproject + +# zend studio for eclipse project files +.buildpath +.project +.settings + +# windows thumbnail cache +Thumbs.db + +# composer vendor dir +/vendor + +/composer.lock + +# composer itself is not needed +composer.phar + +# Mac DS_Store Files +.DS_Store + +# phpunit itself is not needed +phpunit.phar +# local phpunit config +/phpunit.xml +# phpunit cache +.phpunit.result.cache + +# Codeception +c3.php + +#tests +tests/Support/Data/database.db_snapshot + +.env diff --git a/.phpunit-watcher.yml b/blog-api/.phpunit-watcher.yml similarity index 100% rename from .phpunit-watcher.yml rename to blog-api/.phpunit-watcher.yml diff --git a/blog-api/.scrutinizer.yml b/blog-api/.scrutinizer.yml new file mode 100644 index 000000000..f6173517a --- /dev/null +++ b/blog-api/.scrutinizer.yml @@ -0,0 +1,40 @@ +checks: + php: true + +filter: + paths: + - "src/*" + +build: + image: default-bionic + + environment: + variables: + YII_ENV: test + + php: + version: 8.1.8 + ini: + xdebug.mode: coverage + + nodes: + analysis: + tests: + override: + - php-scrutinizer-run + + codeception: + dependencies: + override: + - composer self-update + - composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + + tests: + override: + - command: | + ./yii serve 127.0.0.1:8080 > ./runtime/yii.log 2>&1 & + vendor/bin/codecept run --coverage-xml --env github-ci + on_node: 1 + coverage: + file: runtime/tests/_output/coverage.xml + format: php-clover diff --git a/blog-api/CHANGELOG.md b/blog-api/CHANGELOG.md new file mode 100644 index 000000000..b3d52d63f --- /dev/null +++ b/blog-api/CHANGELOG.md @@ -0,0 +1,5 @@ +# Change Log + +## 1.0.0 under development + +- Initial release. diff --git a/LICENSE.md b/blog-api/LICENSE.md similarity index 100% rename from LICENSE.md rename to blog-api/LICENSE.md diff --git a/blog-api/README.md b/blog-api/README.md new file mode 100644 index 000000000..dd6a209b3 --- /dev/null +++ b/blog-api/README.md @@ -0,0 +1,66 @@ +

+ + + +

Yii Framework API Demo Project

+
+

+ +[![Latest Stable Version](https://poser.pugx.org/yiisoft/demo-api/v/stable.png)](https://packagist.org/packages/yiisoft/demo-api) +[![Total Downloads](https://poser.pugx.org/yiisoft/demo-api/downloads.png)](https://packagist.org/packages/yiisoft/demo-api) +[![Build status](https://github.com/yiisoft/demo-api/workflows/build/badge.svg)](https://github.com/yiisoft/demo-api/actions?query=workflow%3Abuild) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/yiisoft/demo-api/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/yiisoft/demo-api/?branch=master) +[![static analysis](https://github.com/yiisoft/demo-api/workflows/static%20analysis/badge.svg)](https://github.com/yiisoft/demo-api/actions?query=workflow%3A%22static+analysis%22) + +API Demo application for Yii 3. + +## Installation + +Install docker: + +```bash +docker-compose up -d +``` + +Enter into the container: + +```bash +docker exec -it yii-php bash +``` + +Install packages: + +```bash +composer install +``` + +Change ownership of the app directory to web group: + +```bash +chown -R :www-data . +``` + +Usually the application is available at http://localhost:8080. + +Authorization is performed via the `X-Api-Key` header. + +## API documentation + +API documentation is available at `/docs`. It is built from OpenAPI annotations (`@OA`). +See [Swagger-PHP documentation](https://zircote.github.io/swagger-php/Getting-started.html#write-annotations) for details +on how to annotate your code. + +## Codeception testing + +```php +./vendor/bin/codecept run +``` + + +## Static analysis + +The code is statically analyzed with [Psalm](https://psalm.dev/). To run static analysis: + +```php +./vendor/bin/psalm +``` diff --git a/autoload.php b/blog-api/autoload.php similarity index 83% rename from autoload.php rename to blog-api/autoload.php index 2e5eee2a3..ccfe29cdb 100644 --- a/autoload.php +++ b/blog-api/autoload.php @@ -9,7 +9,7 @@ $dotenv = Dotenv::createImmutable(__DIR__); $dotenv->load(); -$_ENV['YII_ENV'] = empty($_ENV['YII_ENV']) ? null : (string)$_ENV['YII_ENV']; +$_ENV['YII_ENV'] = empty($_ENV['YII_ENV']) ? null : (string) $_ENV['YII_ENV']; $_SERVER['YII_ENV'] = $_ENV['YII_ENV']; $_ENV['YII_DEBUG'] = filter_var( diff --git a/blog-api/codeception.yml b/blog-api/codeception.yml new file mode 100644 index 000000000..15aeb36eb --- /dev/null +++ b/blog-api/codeception.yml @@ -0,0 +1,24 @@ +namespace: App\Tests +support_namespace: Support +paths: + tests: tests + output: runtime/tests/_output + data: tests/Support/Data + support: tests/Support + envs: tests/Support/Envs +actor_suffix: Tester +extensions: + enabled: + - Codeception\Extension\RunFailed +settings: + suite_class: \PHPUnit_Framework_TestSuite + memory_limit: 1024M + colors: true +coverage: + enabled: true + whitelist: + include: + - src/* +params: + - .env + - .env.test diff --git a/blog-api/composer.json b/blog-api/composer.json new file mode 100644 index 000000000..d3a0043ee --- /dev/null +++ b/blog-api/composer.json @@ -0,0 +1,203 @@ +{ + "name": "yiisoft/demo-api", + "type": "project", + "description": "Yii Framework API project template", + "keywords": [ + "yii3", + "app", + "api", + "rest" + ], + "homepage": "https://github.com/yiisoft/demo-api/", + "license": "BSD-3-Clause", + "support": { + "issues": "https://github.com/yiisoft/demo-api/issues?state=open", + "forum": "https://www.yiiframework.com/forum/", + "wiki": "https://www.yiiframework.com/wiki/", + "irc": "irc://irc.freenode.net/yii", + "source": "https://github.com/yiisoft/demo-api" + }, + "minimum-stability": "dev", + "prefer-stable": true, + "require": { + "php": "^8.1", + "ext-intl": "*", + "cebe/markdown": "^1.2@dev", + "cycle/database": "^2.0", + "cycle/entity-behavior": "^1.0", + "cycle/orm": "^2.0", + "doctrine/collections": "^2.0", + "httpsoft/http-message": "^1.0.5", + "myclabs/php-enum": "^1.7", + "psr/container": "^1.0|^2.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^3.0", + "vlucas/phpdotenv": "^5.3", + "yiisoft/access": "^1.0", + "yiisoft/auth": "^3.0", + "yiisoft/cache": "^2.0", + "yiisoft/cache-file": "^2.0", + "yiisoft/config": "^1.0", + "yiisoft/data": "^3.0@dev", + "yiisoft/data-response": "^1.0", + "yiisoft/definitions": "^3.0", + "yiisoft/di": "^1.0", + "yiisoft/error-handler": "^2.0", + "yiisoft/factory": "^1.0", + "yiisoft/files": "^2.0", + "yiisoft/http": "^1.2", + "yiisoft/injector": "^1.0", + "yiisoft/log": "^2.0", + "yiisoft/log-target-file": "^2.0", + "yiisoft/request-body-parser": "^1.1", + "yiisoft/request-model": "dev-master", + "yiisoft/router": "^2.0", + "yiisoft/router-fastroute": "^2.0", + "yiisoft/security": "^1.0", + "yiisoft/translator": "^2.0", + "yiisoft/translator-message-php": "^1.1", + "yiisoft/user": "^1.0", + "yiisoft/validator": "^3.0@dev", + "yiisoft/yii-console": "^1.0", + "yiisoft/yii-cycle": "^3.0@dev", + "yiisoft/yii-debug": "^3.0@dev", + "yiisoft/yii-event": "^1.0", + "yiisoft/yii-http": "^1.0", + "yiisoft/yii-middleware": "dev-master", + "yiisoft/yii-queue": "3.0.x-dev", + "yiisoft/yii-runner-console": "^1.0", + "yiisoft/yii-runner-http": "^1.0", + "yiisoft/yii-swagger": "^1.0" + }, + "require-dev": { + "codeception/c3": "^2.6", + "codeception/codeception": "^5.0", + "codeception/lib-innerbrowser": "^3.1", + "codeception/module-asserts": "^3.0", + "codeception/module-cli": "^2.0", + "codeception/module-db": "^3.0", + "codeception/module-phpbrowser": "^3.0", + "codeception/module-rest": "^3.1", + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.18", + "yiisoft/json": "^1.0", + "yiisoft/yii-debug-api": "^3.0@dev", + "yiisoft/yii-debug-viewer": "^3.0@dev", + "yiisoft/yii-gii": "dev-master", + "yiisoft/yii-testing": "dev-master" + }, + "autoload": { + "psr-4": { + "App\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/", + "App\\Tests\\Acceptance\\": "tests/acceptance/" + } + }, + "scripts": { + "serve": "./yii serve", + "post-update-cmd": [ + "App\\Installer::postUpdate", + "App\\Installer::copyEnvFile" + ], + "post-create-project-cmd": [ + "App\\Installer::copyEnvFile" + ], + "test": "codecept run", + "test-watch": "phpunit-watcher watch" + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin-environments": { + "dev": { + "params": [ + "test/params.php" + ] + }, + "prod": { + "params": [ + "test/params.php" + ] + }, + "test": { + "params": [ + "test/params.php" + ] + } + }, + "config-plugin": { + "common": "common/*.php", + "params": [ + "params.php", + "?params-local.php" + ], + "web": [ + "$common", + "web/*.php" + ], + "console": [ + "$common", + "console/*.php" + ], + "events": "events.php", + "events-web": [ + "$events", + "events-web.php" + ], + "events-console": [ + "$events", + "events-console.php" + ], + "providers": "providers.php", + "providers-web": [ + "$providers", + "providers-web.php" + ], + "providers-console": [ + "$providers", + "providers-console.php" + ], + "delegates": "delegates.php", + "delegates-web": [ + "$delegates", + "delegates-web.php" + ], + "delegates-console": [ + "$delegates", + "delegates-console.php" + ], + "routes": "routes.php", + "bootstrap": "bootstrap.php", + "bootstrap-web": [ + "$bootstrap", + "bootstrap-web.php" + ], + "bootstrap-console": [ + "$bootstrap", + "bootstrap-console.php" + ] + } + }, + "config": { + "sort-packages": true, + "allow-plugins": { + "codeception/c3": true, + "infection/extension-installer": true, + "composer/package-versions-deprecated": true, + "yiisoft/config": true + } + } +} diff --git a/blog-api/config/.gitignore b/blog-api/config/.gitignore new file mode 100644 index 000000000..704eb157c --- /dev/null +++ b/blog-api/config/.gitignore @@ -0,0 +1,2 @@ +.merge-plan.php +*-local.php diff --git a/config/bootstrap-console.php b/blog-api/config/bootstrap-console.php similarity index 100% rename from config/bootstrap-console.php rename to blog-api/config/bootstrap-console.php diff --git a/config/bootstrap-web.php b/blog-api/config/bootstrap-web.php similarity index 100% rename from config/bootstrap-web.php rename to blog-api/config/bootstrap-web.php diff --git a/config/bootstrap.php b/blog-api/config/bootstrap.php similarity index 100% rename from config/bootstrap.php rename to blog-api/config/bootstrap.php diff --git a/blog-api/config/common/cache.php b/blog-api/config/common/cache.php new file mode 100644 index 000000000..8ef8b495e --- /dev/null +++ b/blog-api/config/common/cache.php @@ -0,0 +1,12 @@ + Cache::class, + CacheInterface::class => FileCache::class, +]; diff --git a/config/common/cycle.php b/blog-api/config/common/cycle.php similarity index 100% rename from config/common/cycle.php rename to blog-api/config/common/cycle.php diff --git a/config/common/logger.php b/blog-api/config/common/logger.php similarity index 100% rename from config/common/logger.php rename to blog-api/config/common/logger.php diff --git a/config/common/psr17.php b/blog-api/config/common/psr17.php similarity index 100% rename from config/common/psr17.php rename to blog-api/config/common/psr17.php diff --git a/blog-api/config/common/router.php b/blog-api/config/common/router.php new file mode 100644 index 000000000..23eef3818 --- /dev/null +++ b/blog-api/config/common/router.php @@ -0,0 +1,29 @@ + static function (RouteCollectorInterface $collector) use ($config) { + $collector + ->middleware(FormatDataResponse::class) + ->middleware(ExceptionMiddleware::class) + ->middleware(RequestBodyParser::class) + ->addGroup( + Group::create('/{_language}') + ->routes(...$config->get('routes')) + ); + + return new RouteCollection($collector); + }, +]; diff --git a/config/common/translator.php b/blog-api/config/common/translator.php similarity index 100% rename from config/common/translator.php rename to blog-api/config/common/translator.php diff --git a/config/common/validator.php b/blog-api/config/common/validator.php similarity index 100% rename from config/common/validator.php rename to blog-api/config/common/validator.php diff --git a/tests/Unit/.gitkeep b/blog-api/config/console/.gitkeep similarity index 100% rename from tests/Unit/.gitkeep rename to blog-api/config/console/.gitkeep diff --git a/config/delegates-console.php b/blog-api/config/delegates-console.php similarity index 100% rename from config/delegates-console.php rename to blog-api/config/delegates-console.php diff --git a/config/delegates-web.php b/blog-api/config/delegates-web.php similarity index 100% rename from config/delegates-web.php rename to blog-api/config/delegates-web.php diff --git a/config/delegates.php b/blog-api/config/delegates.php similarity index 100% rename from config/delegates.php rename to blog-api/config/delegates.php diff --git a/config/dev/params.php b/blog-api/config/dev/params.php similarity index 100% rename from config/dev/params.php rename to blog-api/config/dev/params.php diff --git a/config/events.php b/blog-api/config/events-console.php similarity index 100% rename from config/events.php rename to blog-api/config/events-console.php diff --git a/config/prod/params.php b/blog-api/config/events-web.php similarity index 100% rename from config/prod/params.php rename to blog-api/config/events-web.php diff --git a/config/providers-console.php b/blog-api/config/events.php similarity index 100% rename from config/providers-console.php rename to blog-api/config/events.php diff --git a/blog-api/config/params.php b/blog-api/config/params.php new file mode 100644 index 000000000..45742ef4c --- /dev/null +++ b/blog-api/config/params.php @@ -0,0 +1,164 @@ + [ + 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU'], + 'ignoredRequests' => [ + '/debug**', + ], + ], + 'supportEmail' => 'support@example.com', + 'middlewares' => [ + ErrorCatcher::class, + SubFolder::class, + Locale::class, + Router::class, + ], + + 'yiisoft/aliases' => [ + 'aliases' => [ + '@root' => dirname(__DIR__), + '@assets' => '@public/assets', + '@assetsUrl' => '@baseUrl/assets', + '@baseUrl' => '/', + '@data' => '@root/data', + '@messages' => '@resources/messages', + '@public' => '@root/public', + '@resources' => '@root/resources', + '@runtime' => '@root/runtime', + '@src' => '@root/src', + '@tests' => '@root/tests', + '@views' => '@root/views', + '@vendor' => '@root/vendor', + ], + ], + + 'yiisoft/router-fastroute' => [ + 'enableCache' => false, + ], + + 'yiisoft/translator' => [ + 'locale' => 'en', + 'fallbackLocale' => 'en', + 'defaultCategory' => 'app', + ], + + // Console commands + 'yiisoft/yii-console' => [ + 'commands' => [ + 'cycle/schema' => Schema\SchemaCommand::class, + 'cycle/schema/php' => Schema\SchemaPhpCommand::class, + 'cycle/schema/clear' => Schema\SchemaClearCommand::class, + 'cycle/schema/rebuild' => Schema\SchemaRebuildCommand::class, + 'migrate/create' => Migration\CreateCommand::class, + 'migrate/generate' => Migration\GenerateCommand::class, + 'migrate/up' => Migration\UpCommand::class, + 'migrate/down' => Migration\DownCommand::class, + 'migrate/list' => Migration\ListCommand::class, + ], + ], + + 'yiisoft/yii-cycle' => [ + // DBAL config + 'dbal' => [ + // SQL query logger. Definition of Psr\Log\LoggerInterface + // For example, \Yiisoft\Yii\Cycle\Logger\StdoutQueryLogger::class + 'query-logger' => null, + // Default database + 'default' => 'default', + 'aliases' => [], + 'databases' => [ + 'default' => ['connection' => 'sqlite'], + ], + 'connections' => [ + 'sqlite' => new SQLiteDriverConfig( + new FileConnectionConfig(dirname(__DIR__) . '/runtime/database.db') + ), + ], + ], + + // Cycle migration config + 'migrations' => [ + 'directory' => '@root/migrations', + 'namespace' => 'App\\Migration', + 'table' => 'migration', + 'safe' => false, + ], + + /** + * SchemaProvider list for {@see \Yiisoft\Yii\Cycle\Schema\Provider\Support\SchemaProviderPipeline} + * Array of classname and {@see SchemaProviderInterface} object. + * You can configure providers if you pass classname as key and parameters as array: + * [ + * SimpleCacheSchemaProvider::class => [ + * 'key' => 'my-custom-cache-key' + * ], + * FromFilesSchemaProvider::class => [ + * 'files' => ['@runtime/cycle-schema.php'] + * ], + * FromConveyorSchemaProvider::class => [ + * 'generators' => [ + * Generator\SyncTables::class, // sync table changes to database + * ] + * ], + * ]. + */ + 'schema-providers' => [ + // Uncomment next line to enable a Schema caching in the common cache + // \Yiisoft\Yii\Cycle\Schema\Provider\SimpleCacheSchemaProvider::class => ['key' => 'cycle-orm-cache-key'], + + // Store generated Schema in the file + PhpFileSchemaProvider::class => [ + 'mode' => PhpFileSchemaProvider::MODE_WRITE_ONLY, + 'file' => '@runtime/schema.php', + ], + + FromConveyorSchemaProvider::class => [ + 'generators' => [ + Cycle\Schema\Generator\SyncTables::class, // sync table changes to database + ], + ], + ], + + /** + * Config for {@see \Yiisoft\Yii\Cycle\Schema\Conveyor\AnnotatedSchemaConveyor} + * Annotated entity directories list. + * {@see \Yiisoft\Aliases\Aliases} are also supported. + */ + 'entity-paths' => [ + '@src', + ], + 'conveyor' => AttributedSchemaConveyor::class, + ], + 'yiisoft/yii-swagger' => [ + 'annotation-paths' => [ + '@src', + ], + ], + + 'yiisoft/yii-queue' => [ + 'handlers' => [ + LoggingAuthorizationHandler::NAME => [LoggingAuthorizationHandler::class, 'handle'], + ], + 'channel-definitions' => [ + LoggingAuthorizationHandler::CHANNEL => SynchronousAdapter::class, + ], + ], +]; diff --git a/config/test/params.php b/blog-api/config/prod/params.php similarity index 100% rename from config/test/params.php rename to blog-api/config/prod/params.php diff --git a/config/providers-web.php b/blog-api/config/providers-console.php similarity index 100% rename from config/providers-web.php rename to blog-api/config/providers-console.php diff --git a/blog-api/config/providers-web.php b/blog-api/config/providers-web.php new file mode 100644 index 000000000..b9d24b1a9 --- /dev/null +++ b/blog-api/config/providers-web.php @@ -0,0 +1,7 @@ +action([InfoController::class, 'index']) + ->name('api/info'), + + Route::get('/blog/') + ->action([BlogController::class, 'index']) + ->name('blog/index'), + + Route::get('/blog/{id:\d+}') + ->action([BlogController::class, 'view']) + ->name('blog/view'), + + Route::post('/blog/') + ->middleware(Authentication::class) + ->action([BlogController::class, 'create']) + ->name('blog/create'), + + Route::put('/blog/{id:\d+}') + ->middleware(Authentication::class) + ->action([BlogController::class, 'update']) + ->name('blog/update'), + + RestGroupFactory::create('/users/', UserController::class) + ->prependMiddleware(Authentication::class), + + Route::post('/auth/') + ->action([AuthController::class, 'login']) + ->name('auth'), + + Route::post('/logout/') + ->middleware(Authentication::class) + ->action([AuthController::class, 'logout']) + ->name('logout'), + + // Swagger routes + Group::create('/docs') + ->routes( + Route::get('') + ->middleware(FormatDataResponseAsHtml::class) + ->action(fn (SwaggerUi $swaggerUi) => $swaggerUi->withJsonUrl('/docs/openapi.json')), + Route::get('/openapi.json') + ->middleware(FormatDataResponseAsJson::class) + ->action(SwaggerJson::class), + ), +]; diff --git a/blog-api/config/test/params.php b/blog-api/config/test/params.php new file mode 100644 index 000000000..a000b813c --- /dev/null +++ b/blog-api/config/test/params.php @@ -0,0 +1,19 @@ + [ + // DBAL config + 'dbal' => [ + 'connections' => [ + 'sqlite' => new SQLiteDriverConfig( + new FileConnectionConfig(dirname(__DIR__, 2) . '/tests/Support/Data/database.db') + ), + ], + ], + ], +]; diff --git a/blog-api/config/web/application.php b/blog-api/config/web/application.php new file mode 100644 index 000000000..3fbffc59f --- /dev/null +++ b/blog-api/config/web/application.php @@ -0,0 +1,29 @@ + [ + '__construct()' => [ + 'dispatcher' => DynamicReference::to(static function (Injector $injector) use ($params) { + return ($injector->make(MiddlewareDispatcher::class)) + ->withMiddlewares($params['middlewares']); + }), + 'fallbackHandler' => Reference::to(NotFoundHandler::class), + ], + ], + \Yiisoft\Yii\Middleware\Locale::class => [ + '__construct()' => [ + 'locales' => $params['locale']['locales'], + 'ignoredRequests' => $params['locale']['ignoredRequests'], + ], + ], +]; diff --git a/blog-api/config/web/data-response.php b/blog-api/config/web/data-response.php new file mode 100644 index 000000000..336029d79 --- /dev/null +++ b/blog-api/config/web/data-response.php @@ -0,0 +1,28 @@ + ApiResponseFormatter::class, + DataResponseFactoryInterface::class => DataResponseFactory::class, + ContentNegotiator::class => [ + '__construct()' => [ + 'contentFormatters' => [ + 'text/html' => new HtmlDataResponseFormatter(), + 'application/xml' => new XmlDataResponseFormatter(), + 'application/json' => new JsonDataResponseFormatter(), + ], + ], + ], +]; diff --git a/blog-api/config/web/error-handler.php b/blog-api/config/web/error-handler.php new file mode 100644 index 000000000..d97bf3ecf --- /dev/null +++ b/blog-api/config/web/error-handler.php @@ -0,0 +1,14 @@ + JsonRenderer::class, +]; diff --git a/blog-api/config/web/middleware-dispatcher.php b/blog-api/config/web/middleware-dispatcher.php new file mode 100644 index 000000000..86685c261 --- /dev/null +++ b/blog-api/config/web/middleware-dispatcher.php @@ -0,0 +1,14 @@ + WrapperFactory::class, +]; diff --git a/blog-api/config/web/user.php b/blog-api/config/web/user.php new file mode 100644 index 000000000..f41c0ab07 --- /dev/null +++ b/blog-api/config/web/user.php @@ -0,0 +1,26 @@ + UserRepository::class, + IdentityWithTokenRepositoryInterface::class => UserRepository::class, + AuthenticationMethodInterface::class => HttpHeader::class, + Authentication::class => [ + 'class' => Authentication::class, + '__construct()' => [ + 'authenticationFailureHandler' => Reference::to(AuthRequestErrorHandler::class), + ], + ], +]; diff --git a/blog-api/data/db/database.db b/blog-api/data/db/database.db new file mode 100644 index 0000000000000000000000000000000000000000..df1dad2918e7384088622d6a723430389271e779 GIT binary patch literal 151552 zcmeFaS*#;jdM0+WGH+F7W>wyn)U8sfrq#@B$yuc-W^rG#JJrQ~-*=8jRFDxQgA7KH zu`o#5g8FJ^438nh9vJovV0$nRHjIIdd9i^pFb3QYe(=D63}YT<48wq7!}g1ff#Kyv zFaG{>A}(((m0jH|dJ2IKtaJOBC5zn%YdT2`wwx$<-)|6?pAaUz(L=sYM&5iu@E@%Yra{acxKF4fKXO7(1R=zH=r zKIDn7QNQ`p6W^y#c(YGF_wjd5%TGSL{H=?>_E874e*aChY6i#_Z_yV?#vDqn-b&w_ zzW6##{4OHm&ecbq@47^6>AEQ_9K_hW+eC!tGxwGcUZ%pm{FZNWD%=|h8vc9+#b5uZ z2P&R2DBN4zaeJ*xVKMIB^YE=?u)AJ@5np|s4(GNfpFRA8%YW%3={t9>YiB~f4)esO z0eZ%}Zy@Gte*H|;+j!>TAKd#NzOe~>{m#eleI>(MhNQpDupu$&Fzln3VR?B%z442$ zF|2dflg}1y z==$otYV~vekuynO``DMwK_(Z%j<&E^} zJ=T^!A>s4Y_b_T)L2>IzXL?0RkzRkw`EwVq*E;0(*AW0;@p-dds-@Z^UnMufGzD&- z@$cmu?Odr)cdomQeCBKC^0{`dp2>B5Pv|P~Fnx<;VK!IIL7HY#olGj5qbt2;mgK8* z2LVy^m%PEQ9lWK8rV}6)x~z5_8ia`wX`}a9FBWFSU9% zYl8dfD-!B;c{vT9CpNXiCbxq}|vphU~>IhcD6imx_eVw_v^G|dkaRK{zruQGSn1Aq@efPbON??}nvhn7m zk(NF&wY8+4Sw)J@ll1AmH;Uf3e~{Gz$N+0>!-r;2jko44>OZ`HXW@;V=H1;em4U7Rch zWBEpYc9{5&NsoD5i+J!E+2#)~|HX@|2akT~!%sf={=?sV5W4@v_p|TS-tFSD_v0bp zA>bk4A@Fk`aBV%jfARYtKEA#Thc&I+?&|wSG88?C+e*5f5X9xt(EXK8rEQEWk#b?O ztj-t9!?4l{oub{UxLK7e34NAmsgaU!)XYV!P|gR_S}Kq#O4a1Z>MH)7s;oCkCYBG^ za|>-FZwsxF9oNK?Kbzc6`l)e>-_`j_xGvao7hsG?N6(K9^DT&+kzI&tdntn!w4r9!B|U9lv~;Ks@$FCq@_NS zwQ-|0PZp~2NHCDu*N(wWZdsZ(YI)@(4sz|ow(K9)_T6DRspZ4-roKvrd+GQ-D%9tT zX3{7~1Nk(c2BMabN=Sm#+O&n)QjnBTG7)k*ep;v-^|a1+vJB!&v=T zuPOF4T^&@^>7oC{bSRjO=iGAl<-v3`owk7`#;Zbx0Ym6fZKrU=1!GVFAF zE|~q*>e;b#npt`c%>gnulWRab{?xDOrjJlL4pS!tz-px}KX-F=N}+);J|5Qv=DeqT9xPIWOmXi9@1W zNyYWu7o%t9F)_=fl*a3w48MLUer>!*{r)ZuceK;$WCBV&;15fZUar)YdgByNcT-BZ zX&sf?F4yRxamg4S~zSTkJG3XD%pccq0%2zlVUY04Ht!VvKNe0ib>_r z>YNf2+wPdQ);+~5dRA(z!VN+4uM_dQuwF%5%Z`=G_3H9ki-i+Wr`J<8yKg5O@@|u| zlLhI0t?7I@3aw7TPGFX+3)^nBr03h3 zVbEwt-F_#vK|R$>mWJulAY2(GYtJf&qcmIOYdKLfzgQ<$g}PW;Z_RcxJr6XrNJu*r zUhnrCC-?r6`pu-;qL(ZBPiDFn@du`wGzVgmX^2>dTV7PFH>zJ5-X^qW+gL7HFt~LP8_a!hh(=uvzvi(pdz<&`AkSF>!wj? zS5I=YGhT#?`Y{!fGQnC~9>~hn($!!f5pxE-KC3O;h9qZ?+1e(2T;>yBM52wgus8b$ zvm_r9X03c0m7<5@AuNto?ft0}e#3yjk0LH zL)=sXk^OkkHFkx28Fn?QL}tZOF%jCe`+BI~|vLosw~?b?38QtYyYa#g`+CP5(#%1)8*ts0^G@? zIcv|x$yFnsk2N~=XTh3OFHd93xls$1j)ta~E5#Cx=x9@W!!q_}v3B>S->FlfU0LNK zjs198?~M*ywXo}{yF*%94b?=vW;E?kyQJm{>)NnWi);@Q|8}0~sAjXZ&9pj)R6Doy zTjg1Cr0r`3W7iCfEITQ4 zDXBs{8A>?gy&f(lsXk0^qVrX#^hID<*Y_dGYOFi!=5jceS~hO~Lh4r4wJG*AwP~A` z%Il0CeEkwuv3IE7Y!y590)kPUYEg3;3+U}?q#DQ-`fVkU?=*|m_##sp_l#hvB}Yed zv0>X&!#V}WrBq;62?zA=a{m6Ib~;+ZAhE5cJBQV=8JKRS z+Tds%>sD_STo;aoT`jN=WCHVCQP@jrJQ#{Q-Tp%8D~on#)Ex9y#fH)`g3S&(y=nB* z@uJwO&SJgIu3X)BYSVhJa}38$_D+7ikFnP;L7Ly8ZZm1FNc-T}7-UX6y`~J?rI680 zEF-DyXxmw&YfA7ik7Xm%Oxu(zW_D-C%Jp#USUstNzL1sHM9-B^$rEw+VG|8EtBq`? ztL2l6f~?CVx)($l-60chuu;q_lC*s40ggF2>XJ` z=fS}9Na6wX+J{%ab8+>Lum1I`|LyAcu72n0-@E#MuC%Mad-Y#m{pUZ2((8T2L%>78 zL%>78L%>78L%>78L%>78L%>78L*UOL0*~%KzH^SfJiNO5{X4fp5)VGS`@K6ip8ETA z^Vxy@{s(uzd&l+bzDJ*(-JS2!gKl{NFX`j6bL<}ddG;CIrDkqiDepYI``!Dlhk@Du z478L%>78L%>78L%>7e zH3Y6N@BRLVcfRS2riYx2Z#u!~0Vm^|PWQRb$@r$zZ{Fu*eAC%5?{PA|>GYI$IT_z{ zw#X$X5efa-=_)q_={P)@t=3Vd*@DT72@DT72@DT72@DT72@DT72_~#md z5C5l&2O3^3RTy<2Z}9SM1us|YM_*iAuI}Bve@DK&d*{ykm-PDH1NM5KUf;b(ua|e} z_1;7F`YyfReV@I)bMNk*`|qG8%73?f^dDU`7mqR*mvefYgg;XvUVb=xG`P5&(lr5p z`hN#6pH3dFFD`$ZuKi`e`Y~-L|Mp+P%jKA^jp*Hw-VGl8TNjsode=i6n=W3K9X#N& zP1joZbJWC3xAEv7TwK=aS`FV#Rq^t}%A^1G;<8NFO8C=X#LK6JNB_&kWuC6(@aM-_ zynH)@m&-I=OVPV8>D`a69$sAj7QK6M^*1k4Kg7!qe{l7^i_7P9Er~z<3A}t7zY1Sm z#^_oUe|{Xn%eTXLxeU>@AiWFFyDzT((#7R7dgn(Q|KaC&`8$8{O1rrHO}d7fG8cd2 zQ@s4a)2qL7arrOMHL9-nyT6W?!}sYaPw3iX{3-kJB7X1cKfbv9HM;g){F(X-c=_Qc zSO4Y3<*(AUkMXDfSMc)bM_2#o;_{d28dd50_}h5-HdWHQ{6)I<3-s<=^zMq@J)(E4 zAm0b{j%xdPKOO=e0v-Y$0v-Y$0v-Y$0v-Y$0v-Y$0v-Y$0)IXbAg94Y{F2|`34XtY z-$(fURs52t;n(m>4hSE9$wNUNgb(mb+Xvpo?|uA|H{*NwC2z$i`1O7~1Uv*h1Uv*h z1Uv*h1Uv*h1Uv*h1Uv*h1Uv-(lpt^kI^MtfCq&IhSATT%|6ToGSO3S=|9`0%K!5Fc=$Hf)f3h?OibaD0NqaT0x zlMgRG`10Y8AN=IO#r-ee|M7c2dGF%gFY%%G<00T7;3424@W+V2bw+!D^JX63|6VwJ zU-0)QdarTJ4E)Cv;nMXBm3r~X{g2U$>NK-ncNcPN zDb=!xdaNBk8r9IcW{u3C99@NHJN>ZT>!Vq8(v`QfNH^P2<#4hdSsXU|WG$=bXO@;b zCA4@rw{6bC((0)8QvUI1&^!dX{zzi0YKuwG-Y1%~UE;VllcPbS6&uFK`BAc+&$15q zBJAX7=R_w?f8co_{yh4oOV=+pXZoWRQQ0PhdS;XB49vdRokT@h=uATyp;)SBN}5sD zr*=55?Z!e*sMwRRWW>^wN#5*Cg9~AoO7|0mMIg0l^cI_3FV%^5O;xR=tC>W1H?=Be zxNWsV%h0xQ@@Mu^NGR@_%BYw();L=!7hAoZe)p`!TU`o9uU{x<`qQCi*l6TdsZ>y{ z9-D0;Gn)_kLO7MJ>}Sz{(hi>L-Q2)mPDFY}Ta_zGqrEQaDb22gPDi_cQj4`%sIuO+ z0(&tuDJ84JZXzz!3h}|9CF$!#v^}qJadU2eBEtzLQ?{jukv z#BKh;kkF;;7wa?qt5U4mH`mols@wE$0{wiUaERKQ_^gvyRVNGOm{=?qi~1=kjitbG zwb}N9%|>E(tf@7nJ&2fXGj1L`lS5!>kDKxQFgKgl=cDbQtXpaIlu);wpx%r`SMjtE zlZ|{jwlDU|m1DipPR3WU)?4`}`aGO`g?_qp{bF^dKc#PnM&Al$GNIUNp6nh6LS^3? zwv&_QxFH*p#nE5iCl9%4vXE#5$7XO_w>tKw7{F;#jasjAlJrb|->!v*k-c(i2bX$O z%9m5k%_=v}#QW)a#4^Xz$}ZlEZ-$9^)vng-wa8IfbgP}2J$Wnr5ghjP3jK8H`h|R^ zKOwJA+ogXdui~Mm-5xBBb#P?Oa7<(;U5>1#lUQih%xT5kN~^@Hk$$l}S{lW0OxKl- zrXKs{V|xh!lpF}=aUHdfR{GQ&nC)e!9ck`L#pzmXOlu`!RvM=KAt}CHPgSuSNQ`PR z|8h9&*l**X$n%hMYS#__)1~VdOGf|uB!6Q5NG4bAA3~idjsT5jn|f3<_CcYO)++O5 z(-eo(ajPmOo7uxCGp)v(axW$en{X)APcGAqg)xifc8jgy->cEiRw^YD$NF*`IN*@3 zlipu!)1z>Cw`$HS<>n`>pW zpB;_%wou=V8}m>-gag~!t0)fYQ)JDa6{LDEm+Jc`r>!v#4E3m9ZOntEN~s*$&zgB_ zQCl=E{mt}8>8#gq>^A?LFI~TwpXqNV;;~Y>T&YGU^UhM9r^1Q!Aiio_p?p1liZ^Z9 z9z_nBeXg{dDR2g>a-s#_DoPF`Mna} zXSc^rppbIK?W_Xs;Wn72}~%rrSEzwaiY|s|)bqyerJMtqx&hE~&h zEEt^U7S(DrQ;B3IgJvST&D2VTQKg(w4wcQS(3xg~k&S&^1V_=rvNDs3izLn$J&vsL zU_4F7VxxmF8EcL7r0H*MQxmh+-)tMJ^1Oc#W{HEI)xxQ5rfkIwoV;i%(rfwy13Q#_ z9(7Jbb?Il9u3t>g^sn{RVwjGm*0ttI?1@c(ps}s(51l}Ix=Hxc^?{XLLaf=mW6jaB z({Jy$cDSn5V$s8Xol*kXan%2I`furPZkHnQKSqVtdz6QOhk%EGhk%EGhk%EGhk%EG zhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EG zhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EG zhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhk%EGhrm}L@FA|>x%d4G{O|pE2zUs1 z2)v5G-yGk0h!XF;_y3dcgu{0Z>!Pf*bM=z2Zw8BIY|x4Kij_ioKbh3CBSqhA_lH11 zmYT_6N^PlX8+ENK$wnbzXn{jGvB_x4comEE()m~~uh+W!QD!mdm0E{DDIV!BX4)|p zZq_q9R3ncrM2pnko6_ zn!eCXQ{vxNWRspHYMTDsH?_>qeS#twk9`uJAnB|D1#KEWThb+;scAk%&=+V-;~%c2 zqt6x$_KC3(6yd~hQCT=AvvzorqEQ6>vHFiaib)Pn$qdmnZn}%;LN$h(X z>x;dVK^A>R-^OzQh${O1+R`UVg8ulaZ>GzV=u0Uwb)9us@G08VFhMp55_~huSfc-* z`*a)uK&aqJXj4+Anr--ivy9$;`V=kAmcE&!n}Vz=yf>-_Qhfbfd*rj!ts)7Apqf75 z4E(gY4;YJp8-$sbu7V1pai-y|&bv>47xd$HiB@!Js}QAoNk94)y0Dj&<1^pW!4eor z3J_W1lJBTlKItIMEK?GnJ@s|*fQ@WOx-bO{MFHcb`$S#aZt_W^I8c`ir3j zQJRX*8u)HU+GB9%iiIwVnys??r#jHU;HvmK?#CF+30#5F7Pj*uaF@(w7YyW13K^gb6&? zwGB{YSn9y&W{!eS!GT*$AU1HUHI6oWys68A@)W!as#uG+Xa>%uryJiwp_Z4@kw$JR zEi9mCtf?hk7DYuep85SHd;pfj4J81tg194NIbcImnTrXBGcYMIrEg{jkTL}MX4;wZ zMi!Oh4}4DzLI+$(DBKcKpel1SvoNbb_4)gZV}KSo2E!%HiN_sAQ!%T7<{ab3SPl>_ zARc7(N8rpZfTZa`<241WV08WXImtslmuW6ph6VmU`V2{e{KMFT(FEcLM{3%d4kn-} zOkD;7fQT~{^x}qD`j+q0>JSmV_-qr%KX^K4O!JrooIjz90i!kO674 zmqm#r8fTCS-3t-~-xjhM0udOf_(lrzk{aG(z zjOL<^!6KPKXoLCOVRZyHZU<*M~XrB%wMS0A71%}3Vz>~xQ3r!PgF;gH9h?gZ=Nzep6dj>&?g%iXA0M_u%k}y4- z<=WH?NP#(%D0>Za<(aRpQD4!eJr)pJULdi+@K{#~8kvNDL4c^Eg`1XU4b4Eb;e#Lf z=w_P@I|01XT+M>i3VaGYi8ZjwGD%8&_H*3xgmIamuKBYJ8EYlchR5lcgv$Ey6W^1J z#`G69L*|n0I|{l;J)J*eOCneYQw%J#&}Egu(L z2}ErICmJtELIU@tiRdsFV|>Vl+bj>|2&=1v5oJ?^_1&gW-W)%ciJZXN2(Gk(@f+#ib3@g2d$ z^PqEl%I!;WIt0-B@euG3@DT72@DT72@DT72@DT72@DT72@DT72_%n_Gi~qm#7ccO? z_v0b(HU$3N_T>kN17F{H|34id5Imaowdt}H2*~nS%_c_a;3Se4M~2bS7URM?Tsdfo z$x6vU<&$piv*X_A&@0EZNT8dy<{J<$Yh$;ojC1xV<($)!OVVVZ;Bn@HhNpk^pZo z00jpbvurQ0x2;`=QYY?}=HH|QgdK19lPF)I{ zB2Gv|(gg~#z+aD!l*lFfT71>*iK!!;K>?28xJ`nm3eeo)bGaqORX_qHHFl`GDieO zfG&;iTG}$t?$$b;xZjv{g$9@f`gtcPKY-YaMni@x86P_Vc0}`?@H*nszRi)ijAaC{ z0f&PaQ36CPSuz8l%Ts`rp2>X7=nchSC>HEQw(O2#X?+1gI$%#@Pf@$RbBMi>Dts*3>%UD~QGTMvWdudcYD6;K64B zXFLzFU;$BK=EG;v3N*2@D5PoQi{#fwC=%g_jUd7$j=&du=)^%spM{g-c|4mXZ?GOw zcotzCieRy(!PYh=B85yHe7O7lXW$vr23$03j}cH*=6+8Anm|r)u5Gfjlfi*ARg4%Dm=NvTr$|%C_1sU1!DFf35hJ6 z1SXjfWM_FIO#W;UMx*QmO!JwdA$W4UiMOyBt`V0rUP0#oGqFEp8N&wL^ORC95c6T# z3M@$HCVHSj$N^BKB4qbziAy_TeaJx|%yS{Y&PYZe_TEc~fm3S4Gav31HOU~!z;Y^B zP*f&40^Z@l8k#u-6rgZ~Et`@|P_f7^m(5GW&Cq>SIv^_B#kc1&qCe;kefM@KmgPTC zd>fP?c)Wh@L;TDX7!xCooz(@KSmbkG$J8YgNfvHEJrC$v{tf0xM#ErIxNJbdR0677 zOm)GSYYLt+!NQ0I=OPpc!Kp~pcM=LLp6d!to|ZrYOH#plPR0}9r@wD*(j{<_wZ(ct z<0R-CCsByfjSyQ~U=gKNkG@ZH*b&IctC?yn?g;W|_Om<|zaJuUcJyU>?QSPGD%A@l z>>#5l(nz^9^pu~0yg{ zc#p&cJ;8wdW1YFRlHsBVhG8R%6^wwOtSh!+=TxMN@U@S{;z`&OGQK>e*+_mreGSh7 zCy_`&RA0f6AbEs>%*cIUxgiu9WxPR8dL=IWGsk=t&4TzudX>CTDgT14Ry?PQM#9Yj zU}+a1g(s!q1JlObq`)I`ez0&5AU8=1G{*=tN(1}cmv&MgFmgN&N@Q;&o&zBev+;Wc z18hSH7&N6Y#B>$wJLZs^l;nt0u{2a2nFOEaFOEVikJeT)~@8@OVfGm zNT_obA~{X+6;W1PKznFm1YLj&7 zka~+4IA%R#UiUu8a6IPrig+s#3-gwE^9N|1G6tONA6$E75jABUG%>n4A0l2%{AQp# z^bck{*Xvdm`Uif60!pJwBPGmclqh3ju&}Ic5npCKB0&R&gHj3}<|%1dOf(zHk93$p zsMAbw#M?`Q?k*FQDn(DCRfT1?08d9)yL`b!9p%KZ!69IOz?L+=@RIh1@9UDo8G;VT zZ{#9dxG`afJGPp>)sVCIx$jAZ(&^|kH(BgCt-(AI%_hEvCcsxN%XrKu3FT3;H5#JM zmD?g@>gOb5Sf6QVI}TiKj@C;Y3FIL@C>;(XMoBDS_ob!ll-q>HkqIbs84q^m=>)I^ zrV@qZCCoZ52{1?-N|&N8ZNSu)?)TFtGbG_{C?}JNDSnHyx&5@yXZHWYiwpek{dfp?2zUs12zUs12zUs12zUtmnMdHS|L!}qxvg~n-&`Q3(a~n{ zWqp$kD%QTeD^G)m*=~_b+0|_0)R7wTT|KZATLH7yNRNA~l$~1_Bgs&CaOxzcQf{76 zMR?>b!3_0#%SuD)#)MiUwhvpe^r^lYRQH?VaD1p{%t*u<&QJc$IAm->&4oXh3Rs2x zqLHO=2Kfm#nkd7Uj-UqIbBcn92J)wA=ZXLufwnn8TH3N4AZ8G992^h_^ zzl}^w_;d{JKqDiAJ7f?gfCutN@R7k}g9$pPxC9J{jRva|t|&YlW~l3(a*bi;fPoqB zZf;`k{m0DuKz_6Yiv?B_bHvdmxTyex$#vMs2F%fv<0~TftLt+60W)!!dCL4V%mHVq zKmi6V^W-tB3op#vLId1&=z1-k4Hjf`!Ij1BL$X@o3P&nGdLp_=AS44fK^;y!GSs-Y zLf4MiTflZZ>Ex{@bBpXY=Iesn9d_)E|AgEcu=&VS1`H_o+O-GKEc32E&9+PRim#S? z3Wz90o_nCTaA^=7G)_0J{1_~v>$`^IpPj-Hh^}Dw=f4Z4?J)uC+!`=ZaG2# zIsKHMPBd^IC+uao$0#~Q427X%PX-s}HN=z1_=ZD{yk2aN8vCNlh;Txa-AnZ0d)Qn+ zUS>xBRsdhYV^Lxp%bW-B2vd9mP7Y>|lPL~owYA;CqwLGds<5PB6-DP9mnLnfQsJ61 z35R<5Pm6tTKPN2&{NDS2H-oTERUO%zP;eG$hIWTZcQrF>m8{k)_s3#a z$mCL)*tnM}x9U>a6eitCE3P-qSvR~93&ZrGk!#kKWMr)M+C{B3jhLI=uozZTiGwyV zl7oesD@GQlY$%$V=bIq1j!o1Wc^|T#s*ob*lw~B zWF+Jn@bN0}IV1U(@}qqc#d6rr6epr%AQ=-rZtijB8EbQmm0sepny*=+k6gBgY zlt>0=JEca#(=Hp&k)`@H?M5Vg9nC_mCS+>s6yKn)VrvOSKL&#ACLz;i0(H&`&Y_$Q zT;ok$K1nEg==|$e0-~lU;gae&`92*`8aw6I@x0}85>}0TF|Bv9&F+X+EfjQ#UapTghc>@Q@{~nEEGZ$&q>keP>-82iQov2SaD)0 z&cxyf?f_EtNLG`JMuAE;Iy*Ud`#h|}QUDQuAiPjyizN-JZha-TC1{BRYkAY1=tmTZVuHRhOBrQ(=>{IjsN!T&{yJiF2q(C$Vst6#nI+o-2LdRM z2pISQ_3x0@>qn~Lnx{mwkOvDFfln}q6lvlm8>vQP7ZFLs5E<;W-G;`KVm+YO-B`jC za}iX-aIk_$vy9Do>}3eRxhd27v8n0AB%O zYHTjgX{!X{LiB9nne{o-pKfAE@Q9sLyo_Q`C|T73`(*?Rli05#F!oZ8J>~NfpcD;5 zBQ*Z#9Lp2MB|?oc4x+6Zm4qTjMZzxjhH<9lk+mF>I&mM{LjdGZA`*$iyf=KO5vX&k zd!iC2_R+BI4y;=M08(U0V@VOz^i9Cf$$-aK!E}_s%YvTth6R49Aejs?M9^e36_I3J zqplcwjFxE;tBJUTpfjZt7>LBIBQZY~8r(jl_Vt`K23`x4^GT?By z8$H8^*mtDJa|8ou$J6w33e&M7m9%runj-NPAzntITlo}`Hg{hU8!l{Cp%5uc z>8HRP?H!;^G7@$vklaG&oc%@APsVTO#CEnN0bz04t8r#j>4s%sA+U0dtaPd~yJ)KwM8biU#>2xQx|xU~^nJW4C3uDHT;c(0Doh8ifh^#Sx?9%V z4H;ZGqX{%XT&Bod%Hc2Z^@Hub!6(?eCC`u8VsOszeg<}CQD4jk$PG>l$=~y{AnG`K zK+r;x6N^6WV2=^@xe&)v@EC;zDFi-u>d9hbBryQna08xvNd$l@YVoVK**Lqai2t0* zx>&KeNOE>b5~CugfMf#&-Z7Mr95RwQeo6sYg7zl60r6!BHhL7bWFVxCPr3AP)&s1d zw<;bZVf>jdN0DT@-z}a;{KG5uVpAMnj0_1&0hXC_^qwH44Lc6atlB915@fsX?zqB; z5HZA0b4j@+BB=@5hJ~GtylgH~7=Se%&#Jicbp&|`kaF5=CQ$WdWMHt33L9R@7X5iz zT+PcOqT$hM|{3ebtQj#?q9zD z_dbS|n@RO5*_9q{sN!M0t;xYyM_SscX-ro8b$t`)rl}-q`(uwOfbVnR33= zw3oe1teOd1n!hcf5&(9NV&RfaZo$&~xwVk7o}thygcI#R>q5G5i@{Nr=~JxE*gbBb za5q^Xd@aO9zLALxAZKBFOKtKsZ5M-Z#TGe;V{BHV%GPWNWm^0&6W%r#K@0xer^IRkfbC?;Ue^|WXWOHbWk*IC1U~gl5m;6isY8SeRZZqwRk6rnQDnQ-VBtVP;mM1j z0A-CSW0aM>rR{)R@!%WdnW;fl8JrEGwAkGgW5>2gEIDkuzF#`fi3t3eltD)pgbFK= z6i6&kpiB^HB|9%WC~83)ylL6LQM+jeEa^B~ONTMRbU9WF8O!u}HFlIKwu<4qFBj^@ zXhXZ!b%|x3 z66m0UDbgI~hr9gVDB;eCJ4W+si!<9?|0Y^^=>(@kgvqVk%=5tpsC+MNP?;HNoOB`s z*XEHZYe4yhn(8QI%-CTpNz481&65?Cw#YM1rP9L$)R`M#5di{JC_%=jll&_{nP#RK z%|EBsJ9frPqT>glMyOgjhSo{^goVSmb;2UR^I5eJ7bNPIV~dn1OOsjNcrs(Njf73o zv!zB{K}Dia4 z_&O>`v$80}@!WtU?gLrGfly`t*=jt4ZW!IPrIbv1!k4gR)&hfvXOC`?_UhKNfD?kS zqw^`;S?6-tjZz5PiOp$b$JPYwKX>4VddV5R#4U1e1JR)iNQ@@G28NIy6F{C0$(SK4 zmzQqfUvmm-U?V%~6%b5BD^4`PISIGD9#nvyF|Fgd0;4*XIWu(tqOru@YU->`o)D5I z7J0WEA>ta&%+&&th&h;v&Qri|&wV%rSdKXoiJekBj-|=YTfruG97RAUSTI)&jX#rr z7}gH09C)s?rJ9=H4m&tuk)!RfG_#)xZ7SpareXzf4??u?8WUg@>^^3^f}QMCFbKy6 zz!`@xI`Zcw#zBi)4MK*M$KZ?(>j{P&nM(#_^{Yz~(%{+r07H@^1i-L;;W#1%yL=gQ zt4NJLTgR|m;nRYpOQXbQD#CJylcGNjI?_{%ljYiuugkv0Z6oQi5mXrH$4qnJMm z)G)~m@i%9w*)$@wkP%(PPtF+!;!A}CP~sk@oGp=+%FHJ$0wfENEe=}{9Q({ih8;eo z_n?jn^EiAXa5`#Kr)pb=1?9g>uvkFW*`;kae7n4-tok+tIo`|*7vaLNNr z{K>hM*nt_jgd8Rs7HQ@ihb-C9+~6H|N+h^Pj<`jQXuYSSR?b=-b4}cQ4A(S5Fc@`4{(tA*?_NCk+j#MQJOn%hJOuuv5cq>%d!PIpx%>aNAO4MF zt{0Ocg?4;3*;V4fNIY1t_|y4N-`=e%-AVEo85iZsV6*IXgj4mn-cR(&EYsa9O*Nb^ z&vj$iXbh6UyN4J4m8Ds(zl%k}>+G(eELyc$VOihi3XccNI|`V?%_H#C_XCfEQ_K;&zL}`$Q-S7Ja*-TC9xDRv%p5Ejq2m!V=M(W)0J_v z6Q*)&`LO62sTOQCr7t4b$E#M+ioo3_j*5*sMO@oJg%?uTNLz)^T;3oQh*brO9+96b#8f_}F+eYU`B*kGVW1?TH!$TK1D{}KehyNY z0VI#~pQA;rTXYj4Oo0`?R}fYTKei2d66{mbOB`w`5aKMoAfD>tk#CB5q+kNG@=iA~ zHI6vUS%h)P!XOfyA$CutbYf}F>3h%+prXIZ6|UpT;lY=;dXoA|lyA0J|z^I+hc!>IpM81#Rsy@e#oYN>B$< zrgIqq8J&}ce*g(T#SYae+4+9o>F3;;A*F}86ZsT5Ph}ovM>GfKKBfk;Y@pS;#wI9e%&EIj8!5}+=E1KY zu0`|Dym5}<88l_*cq(*VmmId&mHB{P%P+u;q9_(pX=slx@h~abj_Hl3fv0XO>x_On zsR~?ypduYE*=2`Ky44inh=gAW(KKFo&^!8wkcik)4lj1qy%lKrjq+~TEzF98s49=*IBK>b8SPv=d??r2 zo5i@3$qmZGRwpkUt(u)qXTtkrYaE&NcDr$|TOKUZExD5n%0_Attkp_VySq3AV%6M4 zS|?NGFqWO-VxqOO`XD8Z^W&7+$u@OCqR6pKZg7oUSICqxWn_Kv(`TXX^LoTSZ3EX6 z##uGlrhOW_lqg`NNRDt1600#su{wDBfHxJ8h0#vOdO}1zp%Q7D`h@%$`0`U;YK^{p z4z*&Uu|N1Uv{XtjxpAf#7A7up2EwG}o&)-}Yc=A#tmGRL|29=|1mED=3>jAxEC+`W zNp#pOH>L0)t_iBDK@OyyP2PAQjV>lTK81516>*=!$JS`~I#j6BJ!q1+>6P8_K!ThZ zEI|YxQ^FC0hIaik0PsXIYv`miyk*8SoIZr3>mK4Ph_lpKdB0oG5~0p=&73M&li|wd zhb%IW@lT5kKsFuM+T~}(uCxV}ex|azbT}^h+HkwbZ*c5?EG##{1!h2EuQqex zIMzHu0^}kiLCR($S^AU$=PaEp*MZQX><*gdtWGTRLpnZMlBQ3%Ljwu`!Rv@Z+T#y7 z#5a+5i@Cbr&v=G~hB2TdeIYe?6;7VQ#2rsJiFS~1w9sSXVwr@425wV`H?$yX=r3aD zBxK27g;Bu+33gV>0e8SB!Yy2y^}L9mQ*RZ5fL2`%2Mv;AmXQU~uq1nt`AkA@h)?56>-QWKt6qMSyjaAvj0DyM>9qyeXUfMu1vW4PRpEu1Aq%@#09W%EIIjO?yFKjS} z0Yr)tY7A5d#Z&1FP4=GVko*4TO@m)~{PZ&xA>uk98+3FR3KA(2h-GLLyB?%9e z@FSDau#@`sHAO75|L^=~7kB>yyhQNd*ZR5hV@Tys-bYmOejz+aqlC%wnCmFXc+e=v zitCBKnirJqJSm>GwP9*)C5P>9C_3x5%dw6Sh>5~bZ)`e#yVV;V6M8L~mUhL7-L{U^ zu_0HM!D(kEud-dUTV-nujjkzE&P&9ks8xg) zJxurmQ9AT65PlvEzTpzO_>&v@?MA6t($~X$BC<^u$FW^$*-1rP+f=qR7W>1H-W|7d z%foP%tE;JDX&n?c!Awuv_L5yC((aZ+tAQDw)DFXTeo_?L8DT!i<|g65u00nIIYm6g zw~5+1)~+QAnPs_X?<0{~Ef$~J*=n`X%C6oHdEq zQ1WwWeON^Um2IS%i|m#5Ak;nz$8M$2-IVJ_UPKyAvOALc*>tM5>UKIqc~|NxElb?T zbJ}TnOzwN>lfCGL^472;X7-b*ut+zwf?`dELU?m*l=5oa+)Ry7v3;u4l}LRb?S}SN zDZg5Ei%CDF7?HykG8SjDqZlUCW-OA>-bIq)h_=CzIs@k;2Fm?nt|sfOM$C}HWbX1b zLFoOMQqY&EdNB*j@ISXGhKajK6{Jvu{M<@e=14smN9X% zshou9JaXC`0p_e3XrRv3Lszu9qJ}LUQ1tlWv@Gg~`A#jnO8i+KK@#zE*Xd&?Ov7g^ zqm<=ak>G{e$Amtp$0CS|@+1^V+A(V+^i{&T*axQzw#c_sqObf@;wrphA`Xa^D< zF=HO^=N2=O#3Vnlq#F`J85YhFj+>bkn&mZMVUn<{G6W0|A!0S`xnc!IqFTOWRC7h{ zr<4a?%dQRi)0Y6QfI9{BSx^A(0LKANJ_u4u5Xhvyu+rwIv};X)N?x5G>oE!m7b#kC?lx0l45FQS&(0wLD?)g24?AjP zQBh%5SDEWIsK5NyV#3LBJU1-h-SuIeDKdH=dKY!!h_q- zTvsM@m=q8<9UTMW=+tahl7URggg81JZ0P!sxc!cr(a7r|M5z3d5o7`k{a~&ynm!=dSbEGtvR@7+=hL`s+s9Mt~DwkUHk*%TBZinjjCYf`h(thTQ6M z713pK$h9m%q%2(GE^3TP?w{^LqO4EKEJd?jW`_G&^akTfMYl_+^^X!_KOobObD^6L zPR1hogSD-LQKms+=PV$^1a}4!I2@Q+nlttn@IvWm3303OiC>z`q> z0IW0kWspULp?V24mcK&JAj^`bI5W1~Nac;lJJaNDGC<348Pbq|%^<${aFLUauY!EM zZX~x8qlIk<$>4ArW*0TU^crs44Q`#k;GSAet2|QjXQnWN?m(+2`bP>7Kn3%&9Tsjq zcw)Pod^NPq#_Oz8%$Z*RIRu27O03#N`+O+_0~bNO2`(XCG@+<~Iw~TE^9ATCLC5{i zWPkIuSHSX5YZbQ3u&q(NeRPNpD{`bb^OthN%guLlhK%Rjp<(XP!%9=~6;k~iP5^29 z8ui@gnAy3JbE#DGbq5XH115%v&E$uhyn~ZN1O=HsBm$O54AZunDd0msYQXrM;Rtr4 zfUx-)`r{+9M5ywovAu7|MZw_!s;?+Jfd~>ZOx5Hvnd<9txd~4mIZk0{@(nr6W5c!$ zLil3u*cyxhBxpTAe=#XmRCT`ymZl)RBhj%+!2L_(={Sce_22QryV(&p8SCIp;+L~# zhxRE)|Llz>tDkq;m4WBQi(=s}OR&e>_Sm9PxJ_schPuM?kw}2uY^7iqfV}xrvxCRugwuJL2{TO>khB7B@Z?^NnMym6!9R# z#hG1f+u^GR>sTu7X5`8jxm~~m?jYjmGAg%-c}-^>(T)nYFd_sKLme?7r>NxDH2>ct zbDu@5Sj|g32UBHBvl31o>J^Cvwg-`C(>dde^P6Cu__y+cyfUw8)y`_pF}n8O%X${uD513iN_#Zdkg ztzIlm2M@z__-9E8g;vBA@}pb*l8TbDMU#KS<`NHIfVl}@lSDQqV{f=&8FMl&!*lqN z4*YZ!BAD8yX^!dhX^Mm$m>DzCiOo=vR-_bCvK1hrHJz4)HI`0CVBZ|mK;A9pm4j;! zOEo<1riO8)?rh<(0^IJ=9F&CUe1f*v239Z=3nx%J4o%ozL_6KEiHZfJ2npPU78FN( z6qtSzT}fYixgzZk=nJG?&Lt3McL@LXj zLZFBpjYdlXoyX>+uXAG+^PNpWkj8Sx=&@uol48Ll4ClEwB~yWIp~Lit5>BcKWlBAF zRihi#8rh=TEh2i9>&*68fqDrJU_6&(pcCGuxU6uZHMfh#+_ZRTAar02?sH?`1HObCM-Fr*(xD2mkKnmEU%)fZJ{aaxC4G^f00k}9AWa1u%cuK((~OS(IiR;0(YGNY_6(9GLJri z+`#5-EXjOM->8=~MF>pctTnK-JGr=m=p7&4mpSg2~JAqW77Ye zPhH(&;ac9#`t?)q;0vX?pqLwtn=LHJ4dqb5-6=HFFfbq(D$CEgYoBY!Z`wr4+j#5b zf{Jsi1O=w`7PlkMRXcJUo}lChⓈHW@E|Fu(;Tk7nU;2hm+iBY}Cjb0#@PXEqb?M zb~iI6;d~`i^s6lWJZNAjT1@***)>lRDf>h-=VDX}n(9N#eMtsALQ&?Boeq+<4mQel8Imw;72ijxmc_G6NC{ zGi|%)rA?^c_!cA?aKbbvE8LlL?p`_OR)jR+>Ne+n^5znEkjIV*E(GPB$xTOVDhl&FsRW)w)Sc9IuqCqv z*oJqmL?F?MSpa-Xx|trWMoUeOMQbdKdj7+D6jj8c ze=O&Bv1Uvgb)?n2(VFy>U8R+cTL)v=35#NE7Kp9(iClCMokzC$k-VG)_+I)js|66g z**G8e1>?^n_#ZpzoxSwuOV=+RpXpCk8gd|v3b;zel19T`BbiFH3yFI1G>@g{OPruH zKh?9vL1Z#$N4xQSpsJ|hwO%ufemU9?$AZI{R1cR_zYq<|!G_t$sQI!~%I;6mL3X^% ziIZq2rq-0cf=XqQCKk7$L1Vr4XDVuFy|$fN0B@#0_B?v7Wx(mDOV=-aXZi>6ePVBy zHilv}vh`pjom^#N?fEg4OZ%l&HPczx5i`}>CzsQi5-80h&01_~MQ}WtQXGx4nUUR@ zZmP?Cx4SO|?c#QTCLdH+vpEIkH%l&AG&n?;@8gfw^EV*q?;D(hItwUlzK5x zNM`hQqM5D@YF0;_?8bdHG1!Z}aYj%3kN#|~6wU;5?M8Vs*{AhzX``fs$YHy)jAX7n z^-Ggw{cvaxCR00NET-FRKVF_&ljAxkcO&Iw3%mA9^@2W`h~-QnTX;MDfy8U{2NKsW zzI&!WQMV^?p>J*v?MY{oi}ms=zqrblwCJQf-ET6rnKDj^wm!)g_xnP2U2BF0l}LAD zc1$ffiB}f6_@dQFjz_`jE@lt+b7i*|4i7~HbHY+=}Zh4B9 z;!9N18TIW}@y+yyd_iyunEhPd<9zA*#a}qnzt1f4l|peks718nM#R-UfGt_;J&TudT@#JZH+XE=iTJT-M4PK^AewHKw6+~Og%Zi?Y!WKV)9qm0PZZj{AZB}`X|)1}c2`^m z{l@5R_@kCe_{=|?e!6u1;#be~F9*5qR9>ay#eAyRne_76n6fm@*(e;1&#<+2uGo=r zd~HVko#bvKjQoPWTm`d-xloH8;_>bxQLY{W3ww2JHplToC8_$yC<3!GmFlwAYpB!q z2t~S0Ih@xrrG~f~4Vp76kga4pVP%`lHs8WOfzb1C>=pd!()Ejv&-B+v!Ner8kJg9v z-eQrP4pUZpXW8+DP@5ha)4`yYH)hdHb5yNnLm_e9%SVh#`&2vmH|u8KTu50pvFJuq zh18_IjIDC9!gf%YG|FZmxzd%+-k5KW3mlhWbfV*V;8+cd?bL88xA&p6F`gd8x6vPb z9(BfI=ye99ej+TJpH?euyu zHR?mL*DBAK1N2U_I)}9NHu?k4qp$K0UAlhp(V6~TYA{ZA{ga4lw8dN`Ty7tf+-z)} zQnOv6H;`tl!`jLyVy>jm!*VMvY0Z40G;d|r$;i4E8VkkvqFU6am0>-SAK4XkBw>JB zcD9vUT3w@W7ZvPiUKBFIepRd{suWiuE>FE_c%I)4%>8IQk^0F-C_X6;Yq9N2>}kVFVr`m(Mz^fyTAQ&r8jJB^ ztQhs@PvSPHt>)sYZ>d^-k~X5DL2JKi`g6tEdR{Q|`;0L@F16t{RBqJQ$7xyL<|otm zF3@{B{lQn{XCUxA7`cA&oiqJbJY(+r_Nh214whYg&?!lgt*yuV(*f$uCkx7ClaqpG zeHN({Ofx=CMDn#_Ad;;mW`}+vlP(I${wX;h9}YsOSZXe^aUr|S3jM%#Ta2jYc2(%6 z$98d+=r>B5+|16m@kUr}&0DqAAQ`gBv&ayw$Q~Qm7u0vy5G$!+9DO&Fb_5CDO zt4D3A5p4#B<;gf*42>-;8IT+vyLy#Q%)`0QmnG&-81je15u6gNH-%(8(xSb!g|KnRz~7rK>~p zbZkbN&2CmZbyBBDsS_B@{H1|7smWSQ68eimYZ#}uI%e{bW4xDHt=3vm8iz{JUN=5CSu<%IowXWP zsNT%Z#?#6m7^v1dgK}>^Un{F}y;7AY-K_LB`lHVSXZwZIPnWJ=T%GC98sl+tkUgbR zyRl@?QlSJ|8^jL#RC1TwtHtGVm)KR~k<6kUN!UZV-%VIubzO+$10$m(1|goaemL8T6h!T5ZzxXZW$-%g<2s{`OCv__>%)S;-B%sa_QfB_Ek9 zjnez6fV9Td-9~z`Gj}OZhz_}$Xrjx{Dh&p-Mzc|{bD}aw4-potP6ZV>_4c(E^5|Mp zxkcZs$|_ef*1m7wn)Q=@2YD$1nKk zqv%(I`PYXR11|<%47?b4G4NvG#lVY!7XvQ_UJSe#crox|;BO@ZfAjT!`9A+~KMO#O zF4EFW9ioR6uXexgccMat*utIO5QBE9JluJE4USsDPg~c_MTyfUc4+iVk2>O7C63Rh z4&4+B0UPu7@v_qOeN-yR>>^#l(n(r&H#<$Th;4lai7rn^Ul z$$F#Y@o~QsIlG;s;@&@aMZLG(EyHsiOXmA#skWRoPv*k(YINQl%hvTwGs=*zh0--e zLY&~iyvk+_m1da~YjEJspFYa~z~cB<>bZV?$A2$+e_KBB7rlDS2>DoYOLU!2J4^}m zlrG|mY112W;}(+%s*$MU_@&gkEzGjIsJAEVByAO0bJM+c#<+;mTFrTD~8oFvWN zs^0N7Z-ipz1*)qei&@1HH+wBI^Y)^6vYBlp_a;`VvrbgxQk+WrV2;7V$rFxPN;JN#{rAhcx!~4tzW6r1DvM1Mkj5>^3|NH7AFkh z{J6HKc!cw(nc?hjX_Om;KEtHN%{kBYg<9w&CDGHhO7VSHcLt?L()hxYJ5|6vDcywg zylPmgzEs7>`ql5x!WiTS`-=aT|Dovpjep|bTqg5KKxfM%D+#<}2TW6WcxP(fq@J%h zwcV}jev?HLhrg-Exogu$xz{Hf!MKtg;an&7QkB+iY2-Iqyz;bJUN(Eq-%&R|V?xwM zwG*+W!YQe7d)1v%C_g7yRoz@wSa@$)@^k*bn?L^Gf0#e!p7>L1MV1%43FoPboD)mv}t;^g(_?kRh`?xfWN|8Mv2Jiww~$>;jpv*`Ve zed1?swqJ^{cO?wr2xhPJCU#kf zmR%eBrER3*MGG2ESXC$bmMznxA-SzOpH$+Ut*yu*(p$c}RX3+`X$ICbPWsNSy**kl zKga*w{+$o}!~UJc6F=?wG%~-oO6@Hdsar0)77f%cCp`xVOVbtS;hI`zPGs5=men+@ zNElqv>H2OS3T&*Q9u^+2=7d%cGP@6ny`}8tlPnH7immgFZB)o^J!=B&I@v6DyndP! zlag)a@)lpXoA4R`gS~&QU)}NFi{9VnPyDhg(3-w=&)fN}TGqs@qQ~0=wW3{Ut8Pf6 zos-+PuYZyk4XV(fYHdC~CIn)528Be24n}-r~X-24{9V7VqNpT9jW2map>z}ZOkeL63ehRaGjQWgwXCT{q|(L6iY zi|gt2yf_E)wmJ$s+{t$C)o^FqW==1gMJnBb6D7{nT;{KoW~{Q+F}M2p3YX;$@rCm- zcWu~8(@b)LE|tuzC&FdFph@v_{NLHn5B!7u{Noe%y`1QBp<0%cx)w$JaKSvx~{vkn_**!~UO<95uT9cS|^5>1IdOnlDBXxrZD(dpX4Hn}S{DVTYFus*{N>$T6b zoF4dxqW8DAC;ppx+vsP7?s#^;q$T^%2*C-wecI~aL#;fUu*z{3`e1_EZIN>Dx&3@|P?@=N z*_|lwl;qKLhR?K=&{YMUwK%$1*&2wfmEt{QpVQeOt%`g+1nlO0AM z_HLWdHW9Ja^oX@e=bt=Z3wgXDyX+iQik>(LY~InS+2ZmU|FBs8+`sUFe^`J1`ozDB zt|X^jcX$*uyNgL0CZZCQBlo=5$jcaACDO8IP@`HU#P~GrvUMRys^KlQ%Djw8e#0;W<7Su+up+R}F-uYD#zu>bD6 z{Zn`R_oDZ==@Y+Ujcg(z)9W5E3 z`PU2G(yI-BWbEkFY09DP*%dvfD%?VPMn;z`U5S-(5Zi7MU!~2Bt8Z*%ueXGct!6@= zS}KJXdrHaJPxy!RbK*IEeBd97-rwja{*q!R%SERn{${$;44<1Rp^n`YG_uPSzY*i} zs;Le{&Wc-&7t|xLxjhh^OD#y7w}ef?EN1F@y}3FmNzls0=wah9vKD=830`=bUM37% z<2PfLZWHgQW7zGuf@M7Rs4E)X4|0mD+4|;>z-HnFR;9K=D@u{hI)T-RCB~Fx$*kvzn zE01sDZf`eI7|fW=bg&dvF-JAX{Zfh|X|i)d^d$1>Ebqq-T7{i_>`rF0T8($tq?%q$ zWM>zJ-B;u3ipFT7MnpkAPtD>I;XinP<1yKR{%-yi-hUhBU&l}Uw~H`_m&c5RUav#K zb+hGVnYT37t+R~ScrmXug zzqbnn;Ss=CZM2S!>quji%qieWF5bR2rOV^x?sn6zb;AO+#&OZ%B?{Cx- zzcvct_P9=f&eVyM14m-~q1@#Q#U9Zg&i;XYi$ zO5?JiuI@xfXT>dCF4Rt(>kZLhN|*6&*+(vY@>W`s)paIqRvhi+^A_s~AKpYPadCup>ex_eTs7$RZoJcVnUha}MRl0O%&2%fD=zXRyS4iM z$Tvhwo@fEL6&~jJ_k0<*fpS7tG>fE?>0wI}4=1I9(v!wb9Iv=d7dIbw$33pH>|q@8 z<}UB?kPN!3#dEB1{lWStfSth0hu^QiJ&WGoh$sF`x7MXg?X}EJ0f| zo3vLMoS#(WCDBEb*;B;s6nG-H7Utf0hh*0uynp@ymUyl|Ka1Yq@F)Hv@u zf_~yqYk1-RqNJ&JY|r{OpHmVm;)DhpM8xTg)5Wo7&$Y7H8SM?3UoeF+>NDjaGh!9D z2l0@=L~#l)!R`Iyf(vO_A)T|c4Rp|vRknvQMOO`{bj&dfse@3QemsAF=O2IWzxcq9 z!}=BW#LxMOU~gzQfq8IJ>9#E!suJdQ0QPVSy|vrhy9>W+ZpHC1Ig<%2g`nN-xSF<6 zeE>D zAs_pX{>1v>9shUlZ-3w)-rq)__+@3APPxhQhQ--&toQkOdQ(iTnhTptr!84SrzWt7 z>nJ!Ec1J~@EcWSvJ|3y-e&Q7Pj%1qRwC_<;uJCEa(55Za(<^bPCnxIwOY91~A4n>3 zM{W)|TPJJnkX^Kkec)!qmZ;Mo&))-n`1#fP+qa_kw}1b{pYPo%ff5G^ks-%PH|w{B zOe*{149&(j>yk_lxlIa+#g3Un%NL4X6xKvJD%@62*W3NfRhcyvIF)=^EU#-dZRONn zP0>BeVf|VNYcX2}G`$dlvFD13vY*%&L^7EfKF-TFKKx+)`9b#Y^S?loNZ7yd^AmrY z81^zMVm2mO8!g(H9dk`FM)wT7AgEo0s=EXmG-VOmgme}fjp|Ie%&2$`X;CyC4VbmU z?q@23FH@bBh3R=kb;(K<%_C2O!GQy2kDe~&YXJp?t~}zzOtfkhESPK+TsGm4{nwpr z^tt~3(Igc1?;ub7@-l^20Z))oXNGRmB%NNx1fiJudQxXMR@;`V1!LwuGZn2puI(<= zb&H;>JG5Oy@4bib$QY4F>Li=Ol__Eq7zkVL?6{l zg4B_^(h$3Eq@!|SoZV(6WLdS!O?mE|Kf_P`X8jYIG!(tR{ktdrcysFK9g(@~Ryh(} z&9GN-zqp{Slg;^PE8P-`y~=B^!Dgh#qX*06AwfWQaK;sB(v{NMbJ`HDQIA&Qg~jyo zgsX7hY>F1w1sxVl8H6)UWZZR{81svUp8E@)O028YPBw4`+voVPU#&mi@naDG{M#pf zSqS)pp(FLo&LXC0YI zT!paThd`N_ft`=b)a4s>Vetpo)@c;qY-)8p?`f9p6G!Txljw{3i7kk9aw zzqda_(fixKdE(z!+uq_OgcEnOeGxI*mCY0W(3agbJ!dO~OssRD7JX$VJJ!TihS852 zvSM!WLYVurY|E{VoUXJAZM7#yT6%CqSG?XRBr71y3lW>;4h151T$4_A!51^%L?`8HkZu{h_f zA~aQddE%r48ib7)$V-Y?HT&G+<#1bSGviiDYv@2@ZdF{4qSJuwh{)HuafnLdg_rk* z?O)SI$;DYxnCq^y(=jat+zmCQ&-f>Pm%oV`ir(M8Jn>`K)(cZhx(f2tl;G|087lA0 zgOMDpa(QC*6GpEREgNs`qY_KCR9MFZ^C(`xl=0jUI`g*D3;JTi-iw?$oqa@C;ov>a zx#gJDnOFG)Su+&wcH7@}c06g2SV!3HA+*@5vWh(RQ~vSate=DY4@K{9|N4oaQj5Bz z0i|#iB8UtlSHUllkkMz2%ZQ(J4oM{bi_`sr(8Kv zASsc7&p*vSMSq_^=#HNpir(M;6>ah;cNv* zVkt%uS1rT?GRY~a+hc|>ZOlrm78a{jRlgPaqBmArka6t%#%L>lKe@OfbIC|u$RIr$ zC%7()`)4(uM0~2oy_KBmFl~O2Kjj1LZ{s(>Kg4hU;)#FZ+7o)tv9Q4?Jsw(4kr{>J z#EH3>Ej4K#2qLT06KCum@*v?Uh)=iVMZVeREGlekc}cj5Bo-a)s+egO!7pzMN8fE+ zE^F({tzQ^8f~d(7Uj$<1lNSOyGM+XuE=n7cZ(xV>C-MXN@2KC{|9jD|CIem{UJSe# zcrox|;Kjg;ffoZW23`!j7f@M7S_z>9$w11|<%47?b4 zG4NvG#lVY!7XvQ_UJSe#crox|;Kjg;ffoZW23`!j7f@M8x4=i=}D!$12U|M=}M|JR=r#GkL?r7NzY zLgH(KJ}#xHxX$y_(VE0u!NbeiW`=teE)rHk!x1sjlnG7gWR<;qCXTb|CBPv0Ige(M ztZZryC7R>P*H+_0=4>!8>n+PT>}JU=$PXlUHqb>hQ7NI)=4Dz!N^*1UD`heA%B-wL zep!zK+x07dn9ax@xos7fZ9VcT-_Cy;dA?o!G=fVSJ1(;R>&R)FQBiiIsx3xw zF>1zkyG|RjhMn4IlkSDqBtLQkzb4=e{{-xyY}lpd>PFJRo`xY9(~!B z-5*BX$FDD=F9IO>!%*KSxBF4u*ieyIcEwL$Ms5iw4i&BMjT)$ouliF|7Ep&c%6+@| z2_6H_%k9*!hYRu%ybE6;$WVc6=VcxPw&r=s$u9xVC@LGI@$(Zr)`Mr%P;=)O%?JpB zb^-d@&w`+Js96KgxZ-#oOdjv(*J&%h9)8LU1MMe*kmGn(6Q09B3X&{Oy4*`v&^ zLVuLEKvCr(c?_ru=qTWMxP9P%s13e%TeuXMto$NuqJgH^jYe@Z3hm3iC3!ze?Cz(L zVAoJ<-Fzds@@t?WxK|^W4wP4;b!&T7oMrwWzue2eb;37(${_H8qM<3pHw*)xjvqqf z@5IDKc)zbMt9#v9n`Ji80mK0yc>d7wS)BUb&marp(2>xmc9y~O9wb41a~q(X00lJ5 z^W7Mpn1RR*-2mUZaP_wqtXtm)xoFC|9v%$Lz<;(k^zHEXAoc_D;qNRC2A~0O|EOsI z9<|lITOm`(KtvsfQS)`c4`Sbp+^BU^c+?=p1InN+K(c>9`IOI{pJhKiMBqy^IzeS{ z_aITDtOVMdIEUW9l(7qs{vrl<4!qba;9_{>@T@^h1`%O0xCj80Eg%ViJ5a_igEkJB z5JVh=r_JtnIs^P7tojkOX{ci8_qzu8qg4q)XtdR!t@nDnxQPIcQ-Xv8vTxE2($qvC zO3hs=hG)Q?Z4D^9s2p|BTVNl&k1ow1t;2(*A_UO~Ru12kxG2F446>HR7wDP11@XJ9 z(!EMIuG}^s6y5dVE@P12d*uT?&}%iIhOb6;FbH51#r30u9-r+|;CCaC{CL{(XWF}s_C%I*dku|Wfej)0c^{KyqCLGbYihumwBtKeJurtga; zfA2p2|BHY6XYlj-_hR71z`(%&j{f2wL2UE>=YRQs{sMxV%?6WaWFt^*!-OL3*+g=g zT_;PKmB(!4z@bft#YKsCfuz)oSCh=af_#MHIT!TA?e>bZRzHFM;`)s>#n`Via{r4tYK>C}2LsJso)O$-rD zF$4@O7^;h3#C8rBRBa9hB8c5Mu76&X6=X)M{lQa1C2rLZ*6nT~pf)=Q>=^vL04BHs zzYE^!9{CLa8(iPr%zozqzBjYqVv506fMEt7G+0w-@USkJtcML66@!EM<4E=)i~-B+ z`(MF$Ltq6S0*qVj1L#p)BS;zDW3oShPpKntcTmybO#B8cBv`n+p@ibEVD`TNY-lXF zfp4A?z!p&Nmj;~D-SgFD?t@i@c6Q*DqrpQ~@ag9f2YzGt@;mDahB+$1X`H|_^kAOL z6s{PB)nMEQ!)h1TA#nWp-+c2_kYg*m$AQ(?yIBsw698GjE(B!o#2kot#9=>u`F2a? z=XN#t|Irr}f|Vg2fY1qS`G7I~!#%Jm;R^^_P7r+omxTu&A%Y+ax(KX&)A`xO|KmtR z5C|cLI=phY-zkCeYP4eEQQtXJJ1bicNb?}reS`@hI;D5_3qv#Gd-w!sHj)3ugXV%< z1b*{~poVA;eEt^(+CKP18(fzmup9RKa7DMB!3)`L(?X~8BSTdsi0F2VF&9Sa))=YW zNHjK3Aa0Dg${2{I&L!4(_^N?qa8>s%Yzw!{!JRj@lRqjVeG`rrzKa`3|-V&6iTdxQhmL$`f|?qOVIzoO@XVYo8zv!M^Z`PT{px?e{{ z_b>#S>6QN7^@2+tVz>e09qxxqe~b}M_8_Z+(1CLvfI)P5g6_Nf;*kfT#1IZZJKSLi zau?1aL^;{eMS}`MXWX@D2rceW0!Wotwhn|jL%1_2R}fcsJ%=d#qe(;Yw+JQ#Wf`h% zPj|tE=-3{V53B+d#?3u)zta}NnCHR5aQ8!oPMO_9i1R@XTsPeHMGb<{J(3#aYzQ>} zFoL4H7=lTvefaqZ5bym3_k&hLtwSg^w8REg8-^r+C^f<)-y`*7hD`w&Wf-*exB-aBP5h_N%U7!a_x z#Snl)@AY4xT8LTiO&kVd!5JB&33^@Bk33(y0V z{!*J)enk)%O@dkQpwsTndyG#J@~7$~qge(nG)z&eD8P#63KZeS1#h-OEO z2d1}a!9oo33f)_Su>{lh(}%>~e6#%!(bt1*9Yh0$j>B@03Af+U^9`yuT-_&f=wC36k>ExcaS*f zFYt2U#D-Q4-r_!92IUUoBCf$XL4)e1tU$(o86cYvOZd&qZeRp@HzfAm(+&LYM zaMg$Vx)UscS%AUPeQ-5QAl#kf!)*efp{`*90pwJxU@G8&0U9`bQGF%l%_84?P00)j;bovK&UBA2x4v`tYOnU^>AB z56ywGS1_n7bTRV?Pwqj@@Er(KH~fOu`Opwh9lsb9Y`E7h8c_A5h3Od&O!dRyJ`fCA z(*QaMRPIjxUK7|ZAYlmLK&rk)Z^LZDy*<#OgC)7^%VUOTxV8GGZ-b0}yYyEBWVmJn z4S2*L{uN9=RJ}TESeXMo{E|bs1+D`u!9c=LNj~_IA*utLJV-mtK9vvz#XvpO1LJz= zf}bA#+yza#kK(@x$uP47JPm}wYz=6;<3rE`vl?*@Fd*&&v+G~M#}3j0(__w{ti#nD zc+ebF?m0sSAcrq%-~RdDYWUEP1jb~CVldw@m6v_^TljdYN-#lSeql-k0!&7hp=P-M z(aAvmU5Fowbe|opV=!rVGYXnt|9WC#2=NA4fr+!9M}PGQO$Ir1U^Zs>ZUE+AeHYv& zv>2rI%OjwAh!D(PfsjC}hs*M^va<&#AZs2(hT!&x*_6Q|b?^&7e~WMK0VPb0K<7I? zm;fNssqTFdz%6jCW|IlV8`~I8jcsqoK!d~QV=Cv#c7?gxaaC0| zN@Tp!#Ozs_&q6}cI1Qt(k<1WQE#ys>O~VT%}b0mS@PyBQI3q_wvz}lKcw11 zwd9yn$7WG0yCRxq%5=7)H`^S~i^H`&Xo$KypP6NQ+gO2g+}kp12>R|aBeh8y?&6)5 z!STKlobT)9#WJ1MH+OPHUEve_*!Y(T92!CI`0qvUZ^tKoiMYnggObCMwvBV?<1A_s z<*@e13GCs} zYw=tD>OYMi|4RHuez2kF{q4U#@o(BjudEH1#w0V=SN%C%S(LauS8$m46qYm&uIWW2 z5}exY49R&%%@Ubh#`eOc+V-flse?`FJ|?D9c?r3ZA)Br(_h&<`+lZWo37O`zdPN?B zxk*5#T!mLT6Hf9r@bSV&vz_%V|LUK{kA0<{`NJRl4@K{9|K*9_JW+@^rp9|@g&_1X zxKIU$25zt?)7{RlTbVg`Fe$GP+cs=`V(TC4bBRQ1t%xpTEPO zU>lhDR;Lm@w#wVJ-mXQr)@(Rh*z&@94O!_|(Xu#UIl3qH%lNvzlG>ipvR0h;GoG;Q z1*!Og0;%46CSv1AkwtQ%<^-Rt?FN~y8s<0|(zGYP{{Y3uJ zAzAFN<^Nvv{$@S#Z)duwrR2Qw>JzW`?EI`9!}ZyajWWWsYC@=tS~!GF>Dzv4TFg$l ziam#1kkE##yiI@!MK70vq$oNft;0hg+ief&l)aPVb_ZIU8k5zIK*%nf7t2GxZsmS` zL{JS0)*5XDpV=Q2lAS-#kGRXvz3Bbz@WgNKvy#}y|U_bxA36 z5OYaFRfc1y;$^&-bU~TU?Q_S@3%$fX&{N9Wb;%&^IItX8db((5bZ*OT+2)wfP780RZGl`Sil=R5v#Kx0Rj z7;#_C^YXwt%|fS^Q&5@0Xd`S_obYf7>BJ{SdK4&%3HjIvC!gd0?);7q`~>;_wtM17 z!~LS#6RnPKZh9EeG{v7$Ht{eU*-Q@fd^TmE|1mNl{aOb z7d7791O+D3%4us6p_3~+nB{ExitE~1MsIj?5Rq=vR%pU*j!d759kKSfBZGS6r}&BA z^FI{5znM?`{kUvUt{lsXJF9mg9cL>&H(1Ujwsjja>)8zy&LMk$u{vGWO1Eo;8)D8a z3{}y&w`MO9za<)dd9zp}K;fX29x{=uE47vpFX$yXNlwA`f?38jOp=SW*n3F@sn&z) zfXMSU-hakF@paH%97WI%|BDVq?{C{DexBIPa4n2_c9TsfSiKwz>9K-y6S7k<^=_xt zo=My3UN>;cHT30pW20lw-dAeALAv$!(9_jwI`hxMvD4dLw(3}lFlXb&$zr}9FWbnC z=!=RLCz8bUrH(q+!|sHyl=PIH>V0i|jvssG4}ZuHkxr;3_brF)JhPgB7f zpT%gyQ0o)35G~K#Vt(0j zrR|-Ct8bEONccDBFcFUPf`K#X=W@D48+mf@B^(0Ux>e*wT+<7mza87WRJf%Ox+dxg zDb;A-&X4##er!6NA4JjL$1a_NZ1d*SiAJvtXLUIV^W>Q7=dKD#DV!9h zzLUl9Bo*M5(VNulyjdG)G&V^p;z#l`fSr8Be~W)8dVgC#@e=|&j>)K;T?>_*`p3e! zrPi)e$J1Fu1ddJXfwsS7;hd+Avf5IjPVy^up>4Mi9@J;nxv7k0(Iyop#hSN|(yTFY zSRk1mR4rpR#(uur2{Xh?wnwM*+uI?t? literal 0 HcmV?d00001 diff --git a/blog-api/data/nginx/default.conf b/blog-api/data/nginx/default.conf new file mode 100644 index 000000000..0ebd9e1bb --- /dev/null +++ b/blog-api/data/nginx/default.conf @@ -0,0 +1,30 @@ +server { + listen 80; + + set $index_file "public/index.php"; + set $root "/app"; + + root $root; + index $index_file; + + error_log /var/log/nginx/error.log; #set + access_log /var/log/nginx/access.log; #set + + location ~* \.(js|css|png|html)$ { + root $root/public; + access_log off; + } + + location ~ [^/]\.php(/|$) { + fastcgi_pass yii-php:9000; + fastcgi_index $root/$index_file; + include fastcgi_params; + fastcgi_split_path_info ^(.+?\.php)(/.*)$; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + } + + location / { + try_files $uri $uri/ /$index_file?$query_string; + } +} diff --git a/blog-api/docker-compose.yml b/blog-api/docker-compose.yml new file mode 100644 index 000000000..ecae76695 --- /dev/null +++ b/blog-api/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' + +services: + php: + container_name: yii-php + image: yiisoftware/yii-php:8.1-fpm + working_dir: /app + volumes: + - ./:/app + nginx: + image: nginx:alpine + container_name: yii-nginx + ports: + - 8080:80 + - 8081:81 + volumes: + - ./:/app + - ./data/nginx/:/etc/nginx/conf.d/ + depends_on: + - php + restart: always diff --git a/blog-api/infection.json.dist b/blog-api/infection.json.dist new file mode 100644 index 000000000..3776e2235 --- /dev/null +++ b/blog-api/infection.json.dist @@ -0,0 +1,16 @@ +{ + "source": { + "directories": [ + "src" + ] + }, + "logs": { + "text": "php:\/\/stderr", + "stryker": { + "report": "master" + } + }, + "mutators": { + "@default": true + } +} diff --git a/phpunit.xml.dist b/blog-api/phpunit.xml.dist similarity index 100% rename from phpunit.xml.dist rename to blog-api/phpunit.xml.dist diff --git a/blog-api/psalm.xml b/blog-api/psalm.xml new file mode 100644 index 000000000..a3df09486 --- /dev/null +++ b/blog-api/psalm.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/public/.htaccess b/blog-api/public/.htaccess similarity index 100% rename from public/.htaccess rename to blog-api/public/.htaccess diff --git a/public/assets/.gitignore b/blog-api/public/assets/.gitignore similarity index 100% rename from public/assets/.gitignore rename to blog-api/public/assets/.gitignore diff --git a/public/favicon.ico b/blog-api/public/favicon.ico similarity index 100% rename from public/favicon.ico rename to blog-api/public/favicon.ico diff --git a/blog-api/public/index.php b/blog-api/public/index.php new file mode 100644 index 000000000..bc508b5ed --- /dev/null +++ b/blog-api/public/index.php @@ -0,0 +1,43 @@ +withTemporaryErrorHandler(new ErrorHandler( + new Logger([new FileTarget(dirname(__DIR__) . '/runtime/logs/app.log')]), + new JsonRenderer(), + )); +$runner->run(); diff --git a/public/robots.txt b/blog-api/public/robots.txt similarity index 100% rename from public/robots.txt rename to blog-api/public/robots.txt diff --git a/blog-api/resources/messages/en/app.php b/blog-api/resources/messages/en/app.php new file mode 100644 index 000000000..1451dd590 --- /dev/null +++ b/blog-api/resources/messages/en/app.php @@ -0,0 +1,7 @@ + 'Page not found', +]; diff --git a/blog-api/resources/messages/ru/app.php b/blog-api/resources/messages/ru/app.php new file mode 100644 index 000000000..ea39702a9 --- /dev/null +++ b/blog-api/resources/messages/ru/app.php @@ -0,0 +1,7 @@ + 'Страница не найдена', +]; diff --git a/runtime/.gitignore b/blog-api/runtime/.gitignore similarity index 100% rename from runtime/.gitignore rename to blog-api/runtime/.gitignore diff --git a/blog-api/src/Auth/AuthController.php b/blog-api/src/Auth/AuthController.php new file mode 100644 index 000000000..5aa01a482 --- /dev/null +++ b/blog-api/src/Auth/AuthController.php @@ -0,0 +1,114 @@ +responseFactory = $responseFactory; + $this->userService = $userService; + } + + /** + * @OA\Post( + * tags={"auth"}, + * path="/auth/", + * summary="Authenticate by params", + * description="", + * @OA\Response( + * response="200", + * description="Success", + * @OA\JsonContent( + * allOf={ + * @OA\Schema(ref="#/components/schemas/Response"), + * @OA\Schema( + * @OA\Property( + * property="data", + * type="object", + * @OA\Property(property="token", format="string", example="uap4X5Bd7078lxIFvxAflcGAa5D95iSSZkNjg3XFrE2EBRBlbj"), + * ), + * ), + * }, + * ) + * ), + * @OA\Response( + * response="400", + * description="Bad request", + * @OA\JsonContent(ref="#/components/schemas/BadResponse") + * ), + * @OA\RequestBody( + * required=true, + * @OA\MediaType( + * mediaType="application/json", + * @OA\Schema(ref="#/components/schemas/AuthRequest"), + * ), + * ), + * ) + */ + public function login(AuthRequest $request): ResponseInterface + { + return $this->responseFactory->createResponse( + [ + 'token' => $this->userService + ->login( + $request->getLogin(), + $request->getPassword() + ) + ->getToken(), + ] + ); + } + + /** + * @OA\Post( + * tags={"auth"}, + * path="/logout/", + * summary="Logout", + * description="", + * security={{"ApiKey": {}}}, + * @OA\Response( + * response="200", + * description="Success", + * @OA\JsonContent(ref="#/components/schemas/Response") + * ), + * @OA\Response( + * response="400", + * description="Bad request", + * @OA\JsonContent(ref="#/components/schemas/BadResponse") + * ), + * ) + */ + public function logout(UserRequest $request): ResponseInterface + { + $this->userService->logout($request->getUser()); + + return $this->responseFactory->createResponse(); + } +} diff --git a/blog-api/src/Auth/AuthRequest.php b/blog-api/src/Auth/AuthRequest.php new file mode 100644 index 000000000..b6d3415b9 --- /dev/null +++ b/blog-api/src/Auth/AuthRequest.php @@ -0,0 +1,42 @@ +getAttributeValue('body.login'); + } + + public function getPassword(): string + { + return (string) $this->getAttributeValue('body.password'); + } + + public function getRules(): array + { + return [ + 'body.login' => [ + new Required(), + ], + 'body.password' => [ + new Required(), + ], + ]; + } +} diff --git a/blog-api/src/Auth/AuthRequestErrorHandler.php b/blog-api/src/Auth/AuthRequestErrorHandler.php new file mode 100644 index 000000000..3aa2a8033 --- /dev/null +++ b/blog-api/src/Auth/AuthRequestErrorHandler.php @@ -0,0 +1,18 @@ +postRepository = $postRepository; + $this->responseFactory = $responseFactory; + $this->postFormatter = $postFormatter; + $this->postBuilder = $postBuilder; + $this->blogService = $blogService; + } + + /** + * @OA\Get( + * tags={"blog"}, + * path="/blog/", + * summary="Returns paginated blog posts", + * description="", + * @OA\Parameter(ref="#/components/parameters/PageRequest"), + * @OA\Response( + * response="200", + * description="Success", + * @OA\JsonContent( + * allOf={ + * @OA\Schema(ref="#/components/schemas/Response"), + * @OA\Schema( + * @OA\Property( + * property="data", + * type="object", + * @OA\Property( + * property="posts", + * type="array", + * @OA\Items(ref="#/components/schemas/Post") + * ), + * @OA\Property( + * property="paginator", + * type="object", + * ref="#/components/schemas/Paginator" + * ), + * ), + * ), + * }, + * ) + * ), + * ) + */ + public function index(PaginatorFormatter $paginatorFormatter, #[Query('page')] int $page = 1): Response + { + $paginator = $this->blogService->getPosts($page); + $posts = []; + foreach ($paginator->read() as $post) { + $posts[] = $this->postFormatter->format($post); + } + + return $this->responseFactory->createResponse( + [ + 'paginator' => $paginatorFormatter->format($paginator), + 'posts' => $posts, + ] + ); + } + + /** + * @OA\Get( + * tags={"blog"}, + * path="/blog/{id}", + * summary="Returns a post with a given ID", + * description="", + * @OA\Parameter( + * @OA\Schema(type="int", example="2"), + * in="path", + * name="id", + * parameter="id" + * ), + * @OA\Response( + * response="200", + * description="Success", + * @OA\JsonContent( + * allOf={ + * @OA\Schema(ref="#/components/schemas/Response"), + * @OA\Schema( + * @OA\Property( + * property="data", + * type="object", + * @OA\Property( + * property="post", + * type="object", + * ref="#/components/schemas/Post" + * ), + * ), + * ), + * }, + * ) + * ), + * @OA\Response( + * response="404", + * description="Not found", + * @OA\JsonContent( + * allOf={ + * @OA\Schema(ref="#/components/schemas/BadResponse"), + * @OA\Schema( + * @OA\Property(property="error_message", example="Entity not found"), + * @OA\Property(property="error_code", nullable=true, example=404) + * ), + * }, + * ) + * ), + * ) + */ + public function view(#[Route('id')] int $id): Response + { + return $this->responseFactory->createResponse( + [ + 'post' => $this->postFormatter->format( + $this->blogService->getPost($id) + ), + ] + ); + } + + /** + * @OA\Post( + * tags={"blog"}, + * path="/blog", + * summary="Creates a blog post", + * description="", + * security={{"ApiKey": {}}}, + * @OA\Response( + * response="200", + * description="Success", + * @OA\JsonContent( + * ref="#/components/schemas/Response" + * ) + * ), + * @OA\RequestBody( + * required=true, + * @OA\MediaType( + * mediaType="application/json", + * @OA\Schema(ref="#/components/schemas/EditPostRequest"), + * ), + * ), + * ) + */ + public function create(EditPostRequest $postRequest, UserRequest $userRequest): Response + { + $post = $this->postBuilder->build(new Post(), $postRequest); + $post->setUser($userRequest->getUser()); + + $this->postRepository->save($post); + + return $this->responseFactory->createResponse(); + } + + /** + * @OA\Put( + * tags={"blog"}, + * path="/blog/{id}", + * summary="Updates a blog post with a given ID", + * description="", + * security={{"ApiKey": {}}}, + * @OA\Parameter( + * @OA\Schema(type="int", example="2"), + * in="path", + * name="id", + * parameter="id" + * ), + * @OA\Response( + * response="200", + * description="Success", + * @OA\JsonContent( + * ref="#/components/schemas/Response" + * ) + * ), + * @OA\RequestBody( + * required=true, + * @OA\MediaType( + * mediaType="application/json", + * @OA\Schema(ref="#/components/schemas/EditPostRequest"), + * ), + * ) + * ) + */ + public function update(EditPostRequest $postRequest, #[Route('id')] int $id): Response + { + $post = $this->postBuilder->build( + $this->blogService->getPost($id), + $postRequest + ); + + $this->postRepository->save($post); + + return $this->responseFactory->createResponse(); + } +} diff --git a/blog-api/src/Blog/BlogService.php b/blog-api/src/Blog/BlogService.php new file mode 100644 index 000000000..421187834 --- /dev/null +++ b/blog-api/src/Blog/BlogService.php @@ -0,0 +1,49 @@ +postRepository = $postRepository; + } + + public function getPosts(int $page): PaginatorInterface + { + $dataReader = $this->postRepository->findAll(); + + return (new OffsetPaginator($dataReader)) + ->withPageSize(self::POSTS_PER_PAGE) + ->withCurrentPage($page); + } + + /** + * @param int $id + * + * @throws NotFoundException + * + * @return Post + */ + public function getPost(int $id): Post + { + /** + * @var Post|null $post + */ + $post = $this->postRepository->findOne(['id' => $id]); + if ($post === null) { + throw new NotFoundException(); + } + + return $post; + } +} diff --git a/blog-api/src/Blog/EditPostRequest.php b/blog-api/src/Blog/EditPostRequest.php new file mode 100644 index 000000000..42de4c172 --- /dev/null +++ b/blog-api/src/Blog/EditPostRequest.php @@ -0,0 +1,68 @@ +getAttributeValue('router.id'); + } + + public function getTitle(): string + { + return (string) $this->getAttributeValue('body.title'); + } + + public function getText(): string + { + return (string) $this->getAttributeValue('body.text'); + } + + public function getStatus(): PostStatus + { + return PostStatus::from($this->getAttributeValue('body.status')); + } + + public function getRules(): array + { + return [ + 'body.title' => [ + new Required(), + new HasLength(min: 5, max: 255), + ], + 'body.text' => [ + new Required(), + new HasLength(min: 5, max: 1000), + ], + 'body.status' => [ + new Required(), + static function ($value): Result { + $result = new Result(); + if (!PostStatus::isValid($value)) { + $result->addError('Incorrect status'); + } + + return $result; + }, + ], + ]; + } +} diff --git a/blog-api/src/Blog/Post.php b/blog-api/src/Blog/Post.php new file mode 100644 index 000000000..99c20e2dc --- /dev/null +++ b/blog-api/src/Blog/Post.php @@ -0,0 +1,108 @@ +created_at = new DateTimeImmutable(); + $this->updated_at = new DateTimeImmutable(); + $this->resetSlug(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getSlug(): ?string + { + return $this->slug; + } + + public function resetSlug(): void + { + $this->slug = Random::string(128); + } + + public function getTitle(): string + { + return $this->title; + } + + public function setTitle(string $title): void + { + $this->title = $title; + } + + public function getContent(): string + { + return $this->content; + } + + public function setContent(string $content): void + { + $this->content = $content; + } + + public function setStatus(PostStatus $status): void + { + $this->status = $status->getValue(); + } + + public function getCreatedAt(): DateTimeImmutable + { + return $this->created_at; + } + + public function getUpdatedAt(): DateTimeImmutable + { + return $this->updated_at; + } + + public function setUser(User $user): void + { + $this->user = $user; + } + + public function getUser(): ?User + { + return $this->user; + } +} diff --git a/blog-api/src/Blog/PostBuilder.php b/blog-api/src/Blog/PostBuilder.php new file mode 100644 index 000000000..0083f564d --- /dev/null +++ b/blog-api/src/Blog/PostBuilder.php @@ -0,0 +1,17 @@ +setTitle($request->getTitle()); + $post->setContent($request->getText()); + $post->setStatus($request->getStatus()); + + return $post; + } +} diff --git a/blog-api/src/Blog/PostFormatter.php b/blog-api/src/Blog/PostFormatter.php new file mode 100644 index 000000000..5363a0309 --- /dev/null +++ b/blog-api/src/Blog/PostFormatter.php @@ -0,0 +1,27 @@ + $post->getId(), + 'title' => $post->getTitle(), + 'content' => $post->getContent(), + ]; + } +} diff --git a/blog-api/src/Blog/PostRepository.php b/blog-api/src/Blog/PostRepository.php new file mode 100644 index 000000000..8c2e5bb13 --- /dev/null +++ b/blog-api/src/Blog/PostRepository.php @@ -0,0 +1,38 @@ +orm = $orm; + parent::__construct($select); + } + + public function findAll(array $scope = [], array $orderBy = []): EntityReader + { + return new EntityReader( + $this + ->select() + ->where($scope) + ->orderBy($orderBy) + ); + } + + public function save(Post $user): void + { + $transaction = new Transaction($this->orm); + $transaction->persist($user); + $transaction->run(); + } +} diff --git a/blog-api/src/Blog/PostStatus.php b/blog-api/src/Blog/PostStatus.php new file mode 100644 index 000000000..da2e9b033 --- /dev/null +++ b/blog-api/src/Blog/PostStatus.php @@ -0,0 +1,21 @@ +status; + } + + public function setStatus(string $status): self + { + $this->status = $status; + + return $this; + } + + public function getErrorMessage(): string + { + return $this->errorMessage; + } + + public function setErrorMessage(string $errorMessage): self + { + $this->errorMessage = $errorMessage; + + return $this; + } + + public function getErrorCode(): ?int + { + return $this->errorCode; + } + + public function setErrorCode(int $errorCode): self + { + $this->errorCode = $errorCode; + + return $this; + } + + public function getData(): ?array + { + return $this->data; + } + + public function setData(?array $data): self + { + $this->data = $data; + + return $this; + } + + public function toArray(): array + { + return [ + 'status' => $this->getStatus(), + 'error_message' => $this->getErrorMessage(), + 'error_code' => $this->getErrorCode(), + 'data' => $this->getData(), + ]; + } +} diff --git a/blog-api/src/Exception/ApplicationException.php b/blog-api/src/Exception/ApplicationException.php new file mode 100644 index 000000000..8c919156b --- /dev/null +++ b/blog-api/src/Exception/ApplicationException.php @@ -0,0 +1,11 @@ +getStatusCode() !== Status::OK) { + return $this + ->createErrorResponse() + ->setErrorCode($response->getStatusCode()) + ->setErrorMessage($this->getErrorMessage($response)); + } + + return $this + ->createSuccessResponse() + ->setData($response->getData()); + } + + public function createSuccessResponse(): ApiResponseData + { + return $this + ->createResponse() + ->setStatus('success'); + } + + public function createErrorResponse(): ApiResponseData + { + return $this + ->createResponse() + ->setStatus('failed'); + } + + public function createResponse(): ApiResponseData + { + return new ApiResponseData(); + } + + private function getErrorMessage(DataResponse $response): string + { + $data = $response->getData(); + if (is_string($data) && !empty($data)) { + return $data; + } + + return 'Unknown error'; + } +} diff --git a/blog-api/src/Factory/RestGroupFactory.php b/blog-api/src/Factory/RestGroupFactory.php new file mode 100644 index 000000000..f4c74dd7d --- /dev/null +++ b/blog-api/src/Factory/RestGroupFactory.php @@ -0,0 +1,47 @@ + Method::GET, + 'list' => Method::GET, + 'post' => Method::POST, + 'put' => Method::PUT, + 'delete' => Method::DELETE, + 'patch' => Method::PATCH, + 'options' => Method::OPTIONS, + ]; + + public static function create(string $prefix, string $controller): Group + { + return Group::create($prefix)->routes(...self::createDefaultRoutes($controller)); + } + + private static function createDefaultRoutes(string $controller): array + { + $routes = []; + $reflection = new ReflectionClass($controller); + foreach (self::METHODS as $methodName => $httpMethod) { + if ($reflection->hasMethod($methodName)) { + $pattern = ($methodName === 'list' || $methodName === 'post') ? '' : self::ENTITY_PATTERN; + $routes[] = Route::methods([$httpMethod], $pattern)->action([$controller, $methodName]); + } + } + if ($reflection->hasMethod('options')) { + $routes[] = Route::methods([Method::OPTIONS], '')->action([$controller, 'options']); + } + + return $routes; + } +} diff --git a/blog-api/src/Formatter/ApiResponseFormatter.php b/blog-api/src/Formatter/ApiResponseFormatter.php new file mode 100644 index 000000000..1609c1b1d --- /dev/null +++ b/blog-api/src/Formatter/ApiResponseFormatter.php @@ -0,0 +1,36 @@ +apiResponseDataFactory = $apiResponseDataFactory; + $this->jsonDataResponseFormatter = $jsonDataResponseFormatter; + } + + public function format(DataResponse $dataResponse): ResponseInterface + { + $response = $dataResponse->withData( + $this->apiResponseDataFactory + ->createFromResponse($dataResponse) + ->toArray() + ); + + return $this->jsonDataResponseFormatter->format($response); + } +} diff --git a/blog-api/src/Formatter/PaginatorFormatter.php b/blog-api/src/Formatter/PaginatorFormatter.php new file mode 100644 index 000000000..84221d5c0 --- /dev/null +++ b/blog-api/src/Formatter/PaginatorFormatter.php @@ -0,0 +1,28 @@ + $paginator->getPageSize(), + 'currentPage' => $paginator->getCurrentPage(), + 'totalPages' => $paginator->getTotalPages(), + ]; + } +} diff --git a/blog-api/src/Handler/NotFoundHandler.php b/blog-api/src/Handler/NotFoundHandler.php new file mode 100644 index 000000000..3ab9ddfe3 --- /dev/null +++ b/blog-api/src/Handler/NotFoundHandler.php @@ -0,0 +1,33 @@ +formatter->format( + $this->dataResponseFactory->createResponse( + $this->translator->translate('404.title'), + Status::NOT_FOUND, + ) + ); + } +} diff --git a/blog-api/src/InfoController.php b/blog-api/src/InfoController.php new file mode 100644 index 000000000..c02fe1d72 --- /dev/null +++ b/blog-api/src/InfoController.php @@ -0,0 +1,56 @@ +createResponse(['version' => $this->versionProvider->version, 'author' => 'yiisoft']); + } +} diff --git a/src/Installer.php b/blog-api/src/Installer.php similarity index 100% rename from src/Installer.php rename to blog-api/src/Installer.php diff --git a/blog-api/src/Middleware/ExceptionMiddleware.php b/blog-api/src/Middleware/ExceptionMiddleware.php new file mode 100644 index 000000000..5e3a50214 --- /dev/null +++ b/blog-api/src/Middleware/ExceptionMiddleware.php @@ -0,0 +1,35 @@ +dataResponseFactory = $dataResponseFactory; + } + + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + try { + return $handler->handle($request); + } catch (ApplicationException $e) { + return $this->dataResponseFactory->createResponse($e->getMessage(), $e->getCode()); + } catch (RequestValidationException $e) { + return $this->dataResponseFactory->createResponse($e->getFirstError(), Status::BAD_REQUEST); + } + } +} diff --git a/blog-api/src/Queue/LoggingAuthorizationHandler.php b/blog-api/src/Queue/LoggingAuthorizationHandler.php new file mode 100644 index 000000000..38ff6707a --- /dev/null +++ b/blog-api/src/Queue/LoggingAuthorizationHandler.php @@ -0,0 +1,24 @@ +logger->info('User is login', [ + 'data' => $message->getData(), + ]); + } +} diff --git a/blog-api/src/Queue/UserLoggedInMessage.php b/blog-api/src/Queue/UserLoggedInMessage.php new file mode 100644 index 000000000..1d2cc3d92 --- /dev/null +++ b/blog-api/src/Queue/UserLoggedInMessage.php @@ -0,0 +1,39 @@ +id = $id; + } + + public function getId(): ?string + { + return $this->id; + } + + public function getHandlerName(): string + { + return LoggingAuthorizationHandler::NAME; + } + + public function getData(): array + { + return [ + 'user_id' => $this->userId, + 'time' => $this->time, + ]; + } +} diff --git a/blog-api/src/RestControllerTrait.php b/blog-api/src/RestControllerTrait.php new file mode 100644 index 000000000..f7315f853 --- /dev/null +++ b/blog-api/src/RestControllerTrait.php @@ -0,0 +1,51 @@ +login = $login; + $this->created_at = new DateTimeImmutable(); + $this->updated_at = new DateTimeImmutable(); + $this->setPassword($password); + $this->resetToken(); + } + + public function getId(): ?string + { + return $this->id === null ? null : (string) $this->id; + } + + public function getToken(): string + { + return $this->token; + } + + public function resetToken(): void + { + $this->token = Random::string(128); + } + + public function getLogin(): string + { + return $this->login; + } + + public function setLogin(string $login): void + { + $this->login = $login; + } + + public function validatePassword(string $password): bool + { + return (new PasswordHasher())->validate($password, $this->passwordHash); + } + + public function setPassword(string $password): void + { + $this->passwordHash = (new PasswordHasher())->hash($password); + } + + public function getCreatedAt(): DateTimeImmutable + { + return $this->created_at; + } + + public function getUpdatedAt(): DateTimeImmutable + { + return $this->updated_at; + } +} diff --git a/blog-api/src/User/UserController.php b/blog-api/src/User/UserController.php new file mode 100644 index 000000000..ee7ecf30c --- /dev/null +++ b/blog-api/src/User/UserController.php @@ -0,0 +1,133 @@ +responseFactory = $responseFactory; + $this->userRepository = $userRepository; + $this->userFormatter = $userFormatter; + } + + /** + * @OA\Get( + * tags={"user"}, + * path="/users", + * summary="Returns paginated users", + * description="", + * security={{"ApiKey": {}}}, + * @OA\Response( + * response="200", + * description="Success", + * @OA\JsonContent( + * allOf={ + * @OA\Schema(ref="#/components/schemas/Response"), + * @OA\Schema( + * @OA\Property( + * property="data", + * type="object", + * @OA\Property( + * property="users", + * type="array", + * @OA\Items(ref="#/components/schemas/User") + * ), + * ), + * ), + * }, + * ) + * ), + * ) + */ + public function list(): ResponseInterface + { + $dataReader = $this->userRepository->findAllOrderByLogin(); + $result = []; + foreach ($dataReader->read() as $user) { + $result[] = $this->userFormatter->format($user); + } + + return $this->responseFactory->createResponse( + [ + 'users' => $result, + ] + ); + } + + /** + * @OA\Get( + * tags={"user"}, + * path="/users/{id}", + * summary="Returns a user with a given ID", + * description="", + * security={{"ApiKey": {}}}, + * @OA\Parameter( + * @OA\Schema(type="int", example="2"), + * in="path", + * name="id", + * parameter="id" + * ), + * @OA\Response( + * response="200", + * description="Success", + * @OA\JsonContent( + * allOf={ + * @OA\Schema(ref="#/components/schemas/Response"), + * @OA\Schema( + * @OA\Property( + * property="data", + * type="object", + * @OA\Property( + * property="user", + * type="object", + * ref="#/components/schemas/User" + * ), + * ), + * ), + * }, + * ) + * ), + * ) + */ + public function get(#[Route('id')] int $id): ResponseInterface + { + /** + * @var User $user + */ + $user = $this->userRepository->findByPK($id); + if ($user === null) { + throw new NotFoundException(); + } + + return $this->responseFactory->createResponse( + [ + 'user' => $this->userFormatter->format($user), + ] + ); + } +} diff --git a/blog-api/src/User/UserFormatter.php b/blog-api/src/User/UserFormatter.php new file mode 100644 index 000000000..4b44e09af --- /dev/null +++ b/blog-api/src/User/UserFormatter.php @@ -0,0 +1,27 @@ + $user->getLogin(), + 'created_at' => $user + ->getCreatedAt() + ->format('d.m.Y H:i:s'), + ]; + } +} diff --git a/blog-api/src/User/UserRepository.php b/blog-api/src/User/UserRepository.php new file mode 100644 index 000000000..7dfb76b93 --- /dev/null +++ b/blog-api/src/User/UserRepository.php @@ -0,0 +1,63 @@ +orm = $orm; + parent::__construct($select); + } + + public function findAllOrderByLogin(): EntityReader + { + return (new EntityReader($this->select())) + ->withSort( + Sort::only(['login'])->withOrderString('login') + ); + } + + public function findIdentity(string $id): ?IdentityInterface + { + return $this->findIdentityBy('id', $id); + } + + public function findIdentityByToken(string $token, string $type = null): ?IdentityInterface + { + return $this->findIdentityBy('token', $token); + } + + public function findByLogin(string $login): ?IdentityInterface + { + return $this->findIdentityBy('login', $login); + } + + public function save(IdentityInterface $user): void + { + $transaction = new Transaction($this->orm); + $transaction->persist($user); + $transaction->run(); + } + + private function findIdentityBy(string $field, string $value): ?IdentityInterface + { + /** + * @var $identity IdentityInterface|null + */ + return $this->findOne([$field => $value]); + } +} diff --git a/blog-api/src/User/UserRequest.php b/blog-api/src/User/UserRequest.php new file mode 100644 index 000000000..08c715aa5 --- /dev/null +++ b/blog-api/src/User/UserRequest.php @@ -0,0 +1,19 @@ +getAttributeValue('attributes.' . Authentication::class); + } +} diff --git a/blog-api/src/User/UserService.php b/blog-api/src/User/UserService.php new file mode 100644 index 000000000..43ee5a397 --- /dev/null +++ b/blog-api/src/User/UserService.php @@ -0,0 +1,70 @@ +currentUser = $currentUser; + $this->identityRepository = $identityRepository; + $this->queueFactory = $queueFactory; + } + + /** + * @param string $login + * @param string $password + * + * @throws InvalidConfigException + * @throws BadRequestException + * + * @return IdentityInterface + */ + public function login(string $login, string $password): IdentityInterface + { + $identity = $this->identityRepository->findByLogin($login); + if ($identity === null) { + throw new BadRequestException('No such user.'); + } + + if (!$identity->validatePassword($password)) { + throw new BadRequestException('Invalid password.'); + } + + if (!$this->currentUser->login($identity)) { + throw new BadRequestException(); + } + + $identity->resetToken(); + $this->identityRepository->save($identity); + + $queueMessage = new UserLoggedInMessage($identity->getId(), time()); + $this->queueFactory->get(LoggingAuthorizationHandler::CHANNEL)->push($queueMessage); + + return $identity; + } + + public function logout(User $user): void + { + $user->resetToken(); + $this->identityRepository->save($user); + } +} diff --git a/blog-api/src/VersionProvider.php b/blog-api/src/VersionProvider.php new file mode 100644 index 000000000..9b9bcd666 --- /dev/null +++ b/blog-api/src/VersionProvider.php @@ -0,0 +1,12 @@ +haveHttpHeader('Content-Type', 'application/json'); + $I->sendPOST( + '/auth/', + [ + 'login' => 'Opal1144', + 'password' => 'Opal1144', + ] + ); + $I->seeResponseCodeIs(HttpCode::OK); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + ] + ); + + $response = Json::decode($I->grabResponse()); + $I->seeInDatabase( + 'user', + [ + 'id' => 1, + 'token' => $response['data']['token'], + ] + ); + } + + public function logout(AcceptanceTester $I): void + { + $I->haveHttpHeader( + 'X-Api-Key', + 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv' + ); + + $I->sendPOST( + '/logout/' + ); + + $I->seeResponseCodeIs(HttpCode::OK); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + ] + ); + + $I->dontSeeInDatabase( + 'user', + [ + 'id' => 1, + 'token' => 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv', + ] + ); + } + + public function logoutWithBadToken(AcceptanceTester $I): void + { + $I->haveHttpHeader( + 'X-Api-Key', + 'bad-token' + ); + + $I->haveHttpHeader( + 'Accept', + 'application/json' + ); + + $I->sendPOST( + '/logout/' + ); + + $I->seeResponseCodeIs(HttpCode::UNAUTHORIZED); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'failed', + 'error_message' => 'Unauthorised request', + 'error_code' => HttpCode::UNAUTHORIZED, + 'data' => null, + ] + ); + } +} diff --git a/blog-api/tests/Acceptance/BlogCest.php b/blog-api/tests/Acceptance/BlogCest.php new file mode 100644 index 000000000..d68315881 --- /dev/null +++ b/blog-api/tests/Acceptance/BlogCest.php @@ -0,0 +1,219 @@ +haveHttpHeader('Content-Type', 'application/json'); + $I->haveHttpHeader( + 'X-Api-Key', + 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv' + ); + + $I->sendPOST( + '/blog/', + [ + 'title' => 'test title', + 'text' => 'test text', + 'status' => 0, + ] + ); + $I->seeResponseCodeIs(HttpCode::OK); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + 'data' => null, + ] + ); + + $I->seeInDatabase( + 'post', + [ + 'title' => 'test title', + 'content' => 'test text', + 'status' => 0, + ] + ); + } + + public function createBadParams(AcceptanceTester $I): void + { + $I->haveHttpHeader('Content-Type', 'application/json'); + $I->haveHttpHeader( + 'X-Api-Key', + 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv' + ); + + $I->sendPOST( + '/blog/', + [ + 'title' => 'test title', + 'status' => 0, + ] + ); + $I->seeResponseCodeIs(HttpCode::BAD_REQUEST); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'failed', + 'error_message' => 'Value not passed.', + 'error_code' => 400, + 'data' => null, + ] + ); + + $I->dontSeeInDatabase( + 'post', + [ + 'title' => 'test title', + 'status' => 0, + ] + ); + } + + public function createBadAuth(AcceptanceTester $I): void + { + $I->haveHttpHeader('Content-Type', 'application/json'); + $I->sendPOST( + '/blog/', + [ + 'title' => 'test title', + 'text' => 'test text', + 'status' => 0, + ] + ); + $I->seeResponseCodeIs(HttpCode::UNAUTHORIZED); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'failed', + 'error_message' => 'Unauthorised request', + 'error_code' => HttpCode::UNAUTHORIZED, + 'data' => null, + ] + ); + } + + public function update(AcceptanceTester $I): void + { + $I->haveHttpHeader('Content-Type', 'application/json'); + $I->haveHttpHeader( + 'X-Api-Key', + 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv' + ); + + $I->sendPUT( + '/blog/1', + [ + 'title' => 'test title', + 'text' => 'test text', + 'status' => 0, + ] + ); + $I->seeResponseCodeIs(HttpCode::OK); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + 'data' => null, + ] + ); + + $I->seeInDatabase( + 'post', + [ + 'id' => 1, + 'title' => 'test title', + 'content' => 'test text', + 'status' => 0, + ] + ); + } + + public function updateBadAuth(AcceptanceTester $I): void + { + $I->haveHttpHeader('Content-Type', 'application/json'); + $I->sendPUT( + '/blog/1', + [ + 'title' => 'test title', + 'text' => 'test text', + 'status' => 0, + ] + ); + $I->seeResponseCodeIs(HttpCode::UNAUTHORIZED); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'failed', + 'error_message' => 'Unauthorised request', + 'error_code' => HttpCode::UNAUTHORIZED, + 'data' => null, + ] + ); + } + + public function index(AcceptanceTester $I): void + { + $I->sendGET( + '/blog/', + [ + 'page' => 2, + ] + ); + $I->seeResponseCodeIs(HttpCode::OK); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + 'data' => [ + 'paginator' => [ + 'pageSize' => 10, + 'currentPage' => 2, + 'totalPages' => 2, + ], + 'posts' => [ + [ + 'id' => 11, + 'title' => 'Eveniet est nam sapiente odit architecto et.', + ], + ], + ], + ] + ); + } + + public function view(AcceptanceTester $I): void + { + $I->sendGET('/blog/11'); + $I->seeResponseCodeIs(HttpCode::OK); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + 'data' => [ + 'post' => [ + 'id' => 11, + 'title' => 'Eveniet est nam sapiente odit architecto et.', + ], + ], + ] + ); + } +} diff --git a/blog-api/tests/Acceptance/SiteCest.php b/blog-api/tests/Acceptance/SiteCest.php new file mode 100644 index 000000000..0c704116d --- /dev/null +++ b/blog-api/tests/Acceptance/SiteCest.php @@ -0,0 +1,59 @@ +sendGET('/'); + $I->seeResponseCodeIs(HttpCode::OK); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + 'data' => [ + 'version' => '3.0', + 'author' => 'yiisoft', + ], + ] + ); + } + + public function testNotFoundPage(AcceptanceTester $I): void + { + $I->sendGET('/not_found_page'); + $I->seeResponseCodeIs(HttpCode::NOT_FOUND); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'failed', + 'error_message' => 'Page not found', + 'error_code' => 404, + 'data' => null, + ] + ); + } + + public function testNotFoundPageRu(AcceptanceTester $I): void + { + $I->sendGET('/ru/not_found_page'); + $I->seeResponseCodeIs(HttpCode::NOT_FOUND); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'failed', + 'error_message' => 'Страница не найдена', + 'error_code' => 404, + 'data' => null, + ] + ); + } +} diff --git a/blog-api/tests/Acceptance/UserCest.php b/blog-api/tests/Acceptance/UserCest.php new file mode 100644 index 000000000..182731d2e --- /dev/null +++ b/blog-api/tests/Acceptance/UserCest.php @@ -0,0 +1,99 @@ +haveHttpHeader( + 'X-Api-Key', + 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv' + ); + $I->sendGET('/users/'); + $I->seeResponseCodeIs(HttpCode::OK); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + 'data' => [ + 'users' => [ + [ + 'login' => 'Athena7928', + 'created_at' => '26.07.2020 20:18:11', + ], + ], + ], + ] + ); + } + + public function view(AcceptanceTester $I): void + { + $I->haveHttpHeader( + 'X-Api-Key', + 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv' + ); + $I->sendGET('/users/1'); + $I->seeResponseCodeIs(HttpCode::OK); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + 'data' => [ + 'user' => [ + 'login' => 'Opal1144', + 'created_at' => '26.07.2020 20:18:11', + ], + ], + ] + ); + } + + public function viewBadId(AcceptanceTester $I): void + { + $I->haveHttpHeader( + 'X-Api-Key', + 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv' + ); + $I->sendGET('/users/1000'); + $I->seeResponseCodeIs(HttpCode::NOT_FOUND); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'failed', + 'error_message' => 'Entity not found', + 'error_code' => HttpCode::NOT_FOUND, + 'data' => null, + ] + ); + } + + public function notAllowedMethod(AcceptanceTester $I): void + { + $I->haveHttpHeader( + 'X-Api-Key', + 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv' + ); + $I->sendPut('/users/1'); + $I->seeResponseCodeIs(HttpCode::METHOD_NOT_ALLOWED); + $I->seeResponseIsJson(); + $I->seeResponseContainsJson( + [ + 'status' => 'failed', + 'error_message' => 'Method is not implemented yet', + 'error_code' => HttpCode::METHOD_NOT_ALLOWED, + 'data' => null, + ] + ); + } +} diff --git a/blog-api/tests/Cli.suite.yml b/blog-api/tests/Cli.suite.yml new file mode 100644 index 000000000..999946299 --- /dev/null +++ b/blog-api/tests/Cli.suite.yml @@ -0,0 +1,6 @@ +actor: CliTester +modules: + enabled: + - Cli + - \App\Tests\Support\Helper\Cli + step_decorators: ~ diff --git a/blog-api/tests/Cli/ConsoleCest.php b/blog-api/tests/Cli/ConsoleCest.php new file mode 100644 index 000000000..f6d7a11ec --- /dev/null +++ b/blog-api/tests/Cli/ConsoleCest.php @@ -0,0 +1,17 @@ +runShellCommand($command); + $I->seeInShellOutput('Yii Console'); + } +} diff --git a/tests/Functional.suite.yml b/blog-api/tests/Functional.suite.yml similarity index 100% rename from tests/Functional.suite.yml rename to blog-api/tests/Functional.suite.yml diff --git a/blog-api/tests/Functional/UserControllerTest.php b/blog-api/tests/Functional/UserControllerTest.php new file mode 100644 index 000000000..b18509cbf --- /dev/null +++ b/blog-api/tests/Functional/UserControllerTest.php @@ -0,0 +1,60 @@ +tester = new FunctionalTester(); + } + + public function testGetIndex() + { + $method = 'GET'; + $url = '/'; + + $this->tester->bootstrapApplication('web', dirname(__DIR__, 2)); + $response = $this->tester->doRequest($method, $url); + + $this->assertEquals( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + 'data' => ['version' => '3.0', 'author' => 'yiisoft'], + ], + $response->getContentAsJson() + ); + } + + public function testGetIndexMockVersion() + { + $method = 'GET'; + $url = '/'; + + $this->tester->bootstrapApplication('web', dirname(__DIR__, 2)); + + $this->tester->mockService(VersionProvider::class, new VersionProvider('3.0.0')); + + $response = $this->tester->doRequest($method, $url); + + $this->assertEquals( + [ + 'status' => 'success', + 'error_message' => '', + 'error_code' => null, + 'data' => ['version' => '3.0.0', 'author' => 'yiisoft'], + ], + $response->getContentAsJson() + ); + } +} diff --git a/tests/Support/AcceptanceTester.php b/blog-api/tests/Support/AcceptanceTester.php similarity index 90% rename from tests/Support/AcceptanceTester.php rename to blog-api/tests/Support/AcceptanceTester.php index 012aa7e87..664821bd1 100644 --- a/tests/Support/AcceptanceTester.php +++ b/blog-api/tests/Support/AcceptanceTester.php @@ -7,7 +7,7 @@ use Codeception\Actor; /** - * Inherited Methods + * Inherited Methods. * * @method void wantToTest($text) * @method void wantTo($text) @@ -21,12 +21,12 @@ * @method void pause() * * @SuppressWarnings(PHPMD) -*/ + */ class AcceptanceTester extends Actor { use _generated\AcceptanceTesterActions; /** - * Define custom actions here + * Define custom actions here. */ } diff --git a/tests/Support/CliTester.php b/blog-api/tests/Support/CliTester.php similarity index 90% rename from tests/Support/CliTester.php rename to blog-api/tests/Support/CliTester.php index ad635d690..4b08ad4fd 100644 --- a/tests/Support/CliTester.php +++ b/blog-api/tests/Support/CliTester.php @@ -7,7 +7,7 @@ use Codeception\Actor; /** - * Inherited Methods + * Inherited Methods. * * @method void wantToTest($text) * @method void wantTo($text) @@ -21,12 +21,12 @@ * @method void pause() * * @SuppressWarnings(PHPMD) -*/ + */ class CliTester extends Actor { use _generated\CliTesterActions; /** - * Define custom actions here + * Define custom actions here. */ } diff --git a/blog-api/tests/Support/Data/database.db b/blog-api/tests/Support/Data/database.db new file mode 100644 index 0000000000000000000000000000000000000000..1ac562e360395590d4b6fe179defde15f0fb0892 GIT binary patch literal 114688 zcmeFaTdZSQnkE#Hky)9Mmx}J`sV;`;nsP*y6q!Rh()RH+3sl%XzTb{-=Nuo+=*+gg zZEs)pw!M8lQmd5>0x^sbNDR|xGz|~DfJQB(8EGUyVk9IaB%T1FegGa&OGtl7SozK#{KkWa4u;M`#YcDhVOm!;|JgWAHRR|(I0*E zC%Y;CkmV>aH7D80w)TbDDV;mKKgIodHlmd;o-me{>tc1O?PfB zjp^;moXv0Nj=Q>zo<)sVB+@mzz5cgc{Y&XaCfUmPTFF#7<9l{|)W^@?@*TZ?EOz|b zt0Umm_rLBPZ@T%J@6!)``18!_Kl54k${dT@Ro6R_1Qy`!pDe zfA;G2m9?6h-VLEhB0exf7!C>sw8z1Z4vNVmA z*}pY#S06vEteN@h*w%Ai`IdWJb9wvq^S@{mD#=F2SITsJpOQ|WsrP4VjZ7g|)t|5R zLq790GTBTcQ%z@@zGwUtB$jXaYE{g#oWb&^lg)JUJi|}g7w2RM{mF-)ef9AV-v43y z2M@pcnPvCQoq8;Px}7>h%f4MX6VtxOa^bT+?|D}*db?Vvw==#%^*nQ}UVkgk`TB1^ z<0uXTm6tsG-1ki0^X#+jUw;3G1&roLZyrr#5bT@be#|f3eS)!DpKv zzW>7tUi?FOvFtN75k-;y?couTXe`d_@99_TxqsVN)LVHM7f3(#*=PS+{I}o#;SYZB z@ZV_4X6JSO|H`J)Ups9b&Gla+I{tjO&i1#yhF8^|IWUYF86>#g?|d7tzTtZ>^Qzt? zzyH_&lJLyG9uuD7v-$rk!k!2?F+taaNeR5Hz0vT~ut?^}r0*Vq5U&pw21{piE+gD3m%|3BZKeDWus{LPR5=Z|Y2 z{dXUwKKw87@#)Wr0w)TbC~%^{FF}E?)*n57@cW-U{p!85GskH)TFXr>5sK{k^HQo2 zH~OQ!yY!curG|S`3Kw&?qw-)l+Fh6Gp}R<{+@Fn$rTDTJuiN2*v3FL(Xs(zIrkrFT znK#Rc&bl@AFYM`LHcdyfXVuKmnOXB(y|axu{eu5IF~7Y`W}D;SIMgpR%huhUWyT_* z#7{%}p9ar=}98y zueoROVK7>^;>G%TYFun}Gv;X7vz(h+eUQkNW8q*Ry{YVjv&^W_tyQwqyZ%+Cv6~nD z*Og7{I+bv;XM>C7IC<7i#WoS6Iv8Fg+?;u3-3_{d$l6H8O~b6u8b)tqnA1=q9?}!P z8`?AbZjx=qc9UVJJ`NXetgN}bj#l^8%5>XJm9I*6cX#|GPW<*F*GLw6akEqo73!mzTPe(zqi|vyKI??K`?@<0*zNp!dR7nTvu1BK znf2rLXcVqBTD{Gtv#Snvfy?eLJYMCZ{@Q#LpY9s=HZX{l{EJ#^F)UXa{Y|8`m|pI0 zYO!#?dKa$l?N&cA@3gG?xm7lusS%7N&h)eg#_DoBez9-f_14Q^Hd=B+Uu&d%F%!iUEHup2?>o?LpC4l&hnqJ4q)8q3Gl$ zeZ5Y_!m)GXVxBtBH~NuT`6kkhwHA@q&L~AAiQIIs_789F(t!&+E7VWJ(z47*FcHx6 zHbyVPk;!0X=F{74xqg%ECz4m@dL5b9Hlsl?+m7$ztx__!Tzt`avD(LbndG$g`XtX@ z|0wpA`#$IWBQAHOS#PET(^$ZNW}3@lsXDFJ?qaD{a(Z^L-cKw0NNL)?42>I&aC#By z&svdwTaG_nB z23y<3puP`|?aHz$y6d~(O(7ZRl|sfk6v|B|e*g8nnRd&& zMJ7}{zs>kBca^*S+PI3(%cTm?^@1%_|>~ul*dzZ6TES+(szqxWqRExgxpqq6i&`N^X4#BnFe=*=y|xCZmg`* z>U^<{7OQ8`efiEdmP2b=zg=dEcZs{!px55bB4-!n+IhO=WD~=jWuL_x{cv?Ms$bMD z&3xo?bF)bq^=W$;4QHZOubN(Wt>i`#W7y8*{dcQWCF~D$9rHREs5WowdAEL*zX;cY zxAkQ#Z946CEIu^)*?A`u&n-sl{?KSorZa1lY`EcQ&hA{4(pSlg#W1tzUys|nMC-D* zy$BQoC99svrbA9~xpH%j@||_jycwS5m-}SMOb06s>peA$?^*;uR>Qam-1KgO!B}w= zx(e)!q`3%oDo!JUyz8tK2ybq#TJB&xMZEv%+hmo4Kk2_{%)7YkB zX1iH%?&ryGk*V)8@2X*Z z*OK`IHH_q4u2C9i!nMuKsM_xA=5}t;wimmUIli{zv5I@K4K)gOCO4^EH!I=!?$$pa zq?`8YqCQX8o4aHqGxD#Cy?n>nRC4a(A}|?OqDITC=kGGf)UJ1%tzE7nfk}EgSXqzavCv$v!`g5Ydi2^4IoG5Ujz=;AU3Y;i#qQHp)CkmV>aH7D80&hWq zCy##e@XDHY*GoGXh)3W1{-dW4nSa0IQ;RWA3gMoF?+0e?-dMy74V z5~27b@&6zH*AJf9-~V5}U;5;~_~g@%|KQ`tA8kJTlMfsC`1I#QffEHz6gW}fM1d0p zP82v%;8%+RU;XBLKS3`3o`w0{=U#u~y{8z`(a8Po^Pg%&M?3qwPyVT8yJzZu_w@sx zy!Rs%5P06kcV0;FeGcc~@O{@%^Qk5J~?{@@?};Oy+-Zj!gA=s+qMn~Pw66}@W4+WAs0wYj~m zo_D6p*?hALcNU+eo$1Xu8g8eu(ROxOX>B^`;Z?g( z-vtV>@a3@Q?4xHF)%0R}c^4UVI#%Gkv#`&0$@O)iG_<>|`r0ylwqyHjwyye&^~$$c zTRzt?=cW(8;L?kV)0_BO>m?dt(F*57wA0tO+?8SX%+Gyp4~?ob%O3i+)@tNqdzOXo z_?ozDWc2wo1&A_qR_J+^Z%?fipVfDq<(IzhdiA-_m>TX=pNS`+Lzgd@;+?Ks81~+`L{IGJ@{n`DusG;UV*{TfpBUEC z=L`mT-_&QVT;ISn<$I3IWjnGkEMDUf@Ej1t?)&}D$k#WG<;23)jeq5^Q^Y`3xKOf;OOLIQu zNH^wk?;9==y`Ju0_?};lKqGSsij44)Z||&q=FaS`(M0^>xvzx>%q%qWu@T&tH?Uqy zUw`S$=Xlb{0=-S6x1NKVm@k$VgK}(4*2Q<5CIaNX!E}u&_noaR_jl1LIKtxE_&V;# z8VpEWk_@-GQ`4Mt49_tXTnBld*Km75|L$|wppk)jl8#*ypgJJBJj?`VfHs&Yo;k8+ zt~te;x;{+6ouh{sQ%(AMnCr~g<7Li-ykV{Ih8E}H&P|i#H^3WxykTk1jO9dT?V7f0 ztS~8`G25<}w=gl<-SpW^}=PTdJm|(g1${tt? zui9cf!ZtJW^XItYtWg~4@zZl_^&I4}`35|IbL% zdto`yhFe*Q3C$VU6xh;--2qCuhIQC>=!CcW)BVqU&s|anTu3V16H*ve`mnRGt1#;0 z_l09XEpQB$%Rnc?(ql9myBgFSVBLh}K*Ax!gJu65oY?{)xjndEU62)wzTAIKd8qa> z_tM&3gTMDa*EAvju=ZdygZ!YSCi+&v1l+=$GAIBNDW>8K017~%y26qf8$876c1c1# zKMG6ImZY;y^NyEfGjSXA$niM~#KkZmZ8lclq(oB;QsTWBg5jG(7DFI{1~$Ht#J=Q< zXAU4A)O)y1T)+QW3PYr<;H+k*VdF_h5^{IhdqpGOFtsLpmE6GRDar9AsEaq@ce&HW z;8$A{LPDf0Wd><#%PU-L1X6~(!+R~cxy$><>)Bjp+jYRBd>Ni-a8*O=Re zEQke>bTu{o!>N|?2e&0s9CMvx{4jf9Dc(7^|?Z?JqL>~9Rc54NLRR&RAg8p@o; z#*&YK0>KYhqKP$~a*$-nuG0r+xDKR`Z45Cm?!_$@i!y`M2J?B#ss%P~2WRPZ5)nn= z2nOX$eb2CY2nT@yZAr3%;!AJ}-UjBB4=wx(k_}~PpI@2N=~Fc;Ff_gco+Jkh9j8xa zHibMOFPqdPcm|7LR2DH2U`p*GhAA> zkjtZpYa8=9CL+U=g_Vu zR#di#NC$U4onXjdAP6NF`Vt($Z8>z5km^!xaAtGM>|v3OA&eK7#POu?jI7iLmHd9l z1G3Zzss|i~k%^8*(>}EgN2FDx68vj`fGjEf`m#{!%N!X@8(K$TodKo^J`_oSIrpu> z!0N51*z(Z3Lv9apnV5rkd<{mPC|WWc1S+iyE=C<34Xc6N#qn{+Q1e0Ga~6~L9zA^c z!F&As{SW2u$Nc+y@AB{W9`WyYKa#({$G;zaAb-E}?xTl~@z>*r@6(%rjmoVLQh|a{ z#&hlrY)4u)G=!E=Uf3Kq7>BX}qZqC&NG1Q=8oF=Nu-pP5&p|Yj%^?4t`LO)H2`v#m zgkqY+;SM!u4#5T^my;-Z0f*K`7@c(;4+V_;}3>pPg6ETBV z!B~KmFLDk0ed@U67p&aYkjLW=SiE31b8f)q6=EzWGDd>fU`LCY%`wwR=79M#cx?$8 z{b`a)1B(g602Vlx&%lK2zKjPXqIE@$GQkF*2IDfi6jXQj_zYGmjYDg`a`fO}^3jZ? z6(g@3Se`X0+Z&o610@sPn>WnWo~RAqgr+J6Gvi(0|} z3Kd3k7*h}x34c&Fd#BcJ!0B?qxGwfzYwLJcmUseS`40Cbc0i%2d;xv0cUu3Kj^p!%Q|S9*Ns*2QzUoe=)%d0}5Q)In*&?=D=@~OI6SA;Rkr8 z@_jkS3Y}{1V`y-4igM3E344QIy9Oq$jA97qz7HG?_T=}v2m!ze!G?!dw}jF%U_Wi? z*}?-Ag)?6d24p|aPol-Ad=}a-d@ME#cl!Q4>Rg?5%d7gw0u$*_0Y+AzeZ#@I19I^S?Rr|@}TO+aZXNlCOF z_e;ND2m^;^0*=DYLqvhIfDjWy5_7l{8Hy)ZV(An_!hyS1Ba)gP9GO6i%&(C%dKmZ? zwVVrYnlHgKu~!vEW%`s63^y@`1En>@4u0M=mmsrvdlHi(&*ObZBd7)D`CQnYO7s4h zF07#`GESLX9yxo?bP6m1G9*m|tN~>J?S-xZkNOZ*8bYUoFX^Ja@LkYR6S~9xR-z29 z0Ca(}`6+HxyhbRZ`2@pnkuR|j;=^H$;8XAKk5PLtijdTU&plI7y$y^j!W8syN8m7J zyV14=V_DW3TqGXfYMjz`np<#fXPXXR9wWs-UlWw#AUF zc6`9M-=P$xa??qftudsG(W6kafTpAqjRC`Cajh9AId=9~A;g5tSr>-8CJjDJbXKi%eniNjDRwmFH0=gq+aaD1J;-_JqIr}Xy^_kc=J8K3K|?K%)WYB^VM zXE<6h%fV3RmTiovS`pK8xueCTm@%j(PPTHslyHJqyo05awP1u}{V^1TeYk-j_F$H| zu=(_Kk8CA2Ap<0od^E9rpr7Z0|BPD&x(}gBjtS4vK~qkOnp#GB5JNI2-bGgi;uF)x zMv&Nvt$a)xS}+264=%z?;Dab8luARu!%)*IV+gBtAM{%K$_U}9U+($$;Mz}>T%>S@ zV2AJEQhPhxDb+Ps-B*JXq=lB;3wmCS_QLQj-+2x2hb?$=sambo^d+n3zGfbu!6M~) zX^G=;hFTC2pdF}Mh9u!py(SU0!-py9tt&pKNMR^bM3NBUqph#G0^1aH!Zsh#{#Gyc zTspW+M=d8`pqdtQ1e`Wdg6p`sK{yy+oLh^&fEd7H=xDAKje3YNV_lTe7j_bV3z{Dh zAZj12_CbV$wMHWmsscI;b`n{Ed=4{Ldl?7gL@kM@T7=#ZAz%T112G1JOFF#rw|+b*j4>9~<-=FgTr~LmZ z|1UX$Q~n?E5~Kybu14UL|3@_-Vkx3iPx=3E&Hp3P%2*FVRLFY33PDJ|hp4m-r{uSJ zaNiFBv z|NNZM0Y2b2@jsu&=bZkWDDW4T0{`LY(Z}d`|LWlf|M?@dyf>S{aw@#aN7k$4un_MX zXX8z37b})C&@r4` z>&i)Xu1dZ9RkUjra>?Q>y-8C=rpn{_r;-~eCV*)t+!+YCu`88 z+RhlDF#!E#c@|HiAX{n`Y001<4Ua%kA$q@``%eD<$^Sq3|0n++qTuBJx0qpJ@yn_I zAGIE*{{K_|KdcGv2?>s#`v1Qvw}0~gPyPRY*8Trq=l{QDbH_V$_TPE;cOQKChxqIC z=R|=M1x^(B^P<4t`D-5#SupeX@A?sD*=O2OGn{M0#HxY`z%`=EZyr`?J5!6Y|Ha?d7ZTv{)_JXx-+@4 z%A;6oTr_)`%SAMNHaTD9ro(!rmm5{*nVh+-Z{6S`R!gEy8dg0zpNAGwI<#)h#d>X{ zCG>?(cxrr)zO(MG*dPtmB)9_XJ_TITOpuxoH9`1fYXByL{dzOiHOQ8D-m3613}Wi( zF9NFVX95Pu20pCKagXq!d2uqQe0szRssMOTapsp|*aqV0KM4(3#cs@X(0Pw_9 z-?>yxqT`VR?xQW0GkO`8P4y&nF`E(EfOX3zhKHg!L4c9gUj)!xqCDX1{9UFcozb!; zX!=x8aK>E0wxJtdt`dDlj}~|f9vTY;}q2Guj1{v764KPPw2}naL-~#|2Ll7Fi zQbKS?R7w=@5w}RA@3D-}UcJf{9zvq#!F#RC1TF(G2ys7VbMP%6CCC{HfoVD=@={aC z40i>6%JAe5=mvtdrl0)+p+MEXs)4W2(hnS;pZoo2B_@mwQk+EH=%X!lqCH@uhM_|n zoux^E#3axG$cT~fSR>*xf@H)=!#^O2Lb0o9d`jQphk`-@VDwQ948iw&dn;Oh@A%eW&+{g3*Sjns__X_YCc2pUyzz7(# zBbYo)5CF8u6Xpbefv3!;K45(iCj$)&6h*XDfyoIh6@p9R1Z*rNfquvUfd8~Ul~ zsNb9o7v;@5Q1`pV#dRx(KzhWsIx#@a)=amNiJk3=mBws%(@bZsir4jK*4VEr+f*uj zwn@})!oBulag%8kuZF3*)l38}H#rPeDh0FA8r}t><;<-)NhFJBP&@hIty4c=UM0<& z>`ijjJik~PCg3(#7DDW%!`%&}$d!dyyh5Kv{=e@`S%&M(0G5SzAba(K;*x8Z>>F4q zQ5Av`CfFAQ4*)_8=*?I=C`njPh=^x%$3lnyGeQF3%g=u%49zbKAdjpWHk$n6;gJy+ zL9ZwVw8q9oz#m{QgrR){0*l~EiTK|VJx-91oF1?fmI_6ILn7F$f}g|7z%_<#JCFk@ zQ-DZWbj;Ni92}q$xq!`l?n~!ujdl~TScUt|^#aKPvEC?DOTJ15l;DsAI24ly8I=}Y z+rWpFHhFG!g#VbFFz(R5y^haRU^KmIeUGA+XuV5jaRs zGysQ*BAWY1b|XQ$G^~!AoQ7K=st>ohz$yq<6oH9A6-v`*1m@{u7P48jC?v`mJaE@5G+BWoqOG$BGa;{!r$P>k@WQ`%9UkmS3lR?r2b54%1cw8I zga7dw2ugr+LB$Z}i0C%5zW5YCh}dk9Gq`f?2nvHl18R|8vY>r|r-X7QgcTtJ zp*3C1f@Hu3Atj--F?OXXrkFf75C}4ZWE4eFfc)gcsmJ(C?hqgha`R&662-#?l7=zE z9tI(jRQ|3BEM|g7>7Vi4!_S8wYU=9K=bs4*ma+k5(J@^ZNHio~MJqX~v(FVuiiS+a zi#@Qp*P$HVgziB9|KYp;UWyVmJlI^9tr5U{Kp`#j!B z1#iRIe#dp2&hRETIVT5OK{4x90hJA%oM&sfb)Ik9*X?{L55M#`UjMbr)~a&?DuFG z{@w@wX&S6pwmaKdDA)^MgciHo*0{H-l+K-Y@$#nMGSZo3I(pMi7VA~BxH4{AxAoZa zV%2M%&HB0P)UKAfs7@2%8>ijKJN0gOHCtTg&+KG;=iIu9tD&9Ahlh9Pp-A#J6F4us zPAjv!UbV)tf`tN*RjVI~H-JbF?0Z&a02UYQD7-i`EbyiaC^KTRLA%oZ^O-arg)@PO zOXE-=;{;+H27xl>21-j|VWA}75~8296MIJhwn%y?8$nBBt%ra)rA&hM66BMpo#M7E z88hHl!CJ(cyFzG!%p>cGg&K&;1GphLO;}nZq*vbkQQCz_uJXvC|uIJbT z{N@BfexNz-*#0i2ssd2=OcH^-18MLL+RFq+ZeeR;)r9Q#Y&4Enj4)bn z5N!f5jO7pjE(#&ox9d5g1STv?L?=iM049@Q@D?VDnF-FV18ug|RUWPKGGRuN;Q+D5 zZ}4RU3lNeJHH2}~Mi3+hpDHHm!7JbbXz+3jtssD}2H^kJ*u?%N1d%6agmOQ_@@TJv zBh)s&GM+V(93BXhU11)}<{_4`27gqdJ%d9sz+gnxR9ov6|D02xnWr2sL^oi`(q@-6 zHwTa+Bd#S)UDJ#wbe~_pH0m)es#%H7*8@g}_v`0Y6WgQS-1ty?9 zaQT-<62#0g5}-{AC?|M=Lx6)cwFcNP;@)A%EyAIBVnR;Rz;q>qsGLiV(5qDY{FNdT zcwh7s1x8gAoAw&9ezJTEWirq8jCKMZN^PRJKzeSlHi<|N@Tum^duJ%D+Q)rJW`xx z;OPPn&=HTs8=(kXur+rsf0qd50ryot5yy)sRRF46$T7oeCv|vQd1(wvfK2z9Sft}2 zR_SxVqCh7%WIY5g?SZX*FPa2)7Pk+q1-XHBXH*lC?)WUc zN{MR?Lo@~h7ldyD@Ma$+`S|MFe<(gXtWaT5@~!7bbF>Y z6Zub{tb-*|B1v0GlsFK7!Z(mFSV~9^3)u70xc&79z>u^G(ihJr)VZ1z-^5@qu1a)I zTcOmT_f9-Qa1f=TghA*19?~NDN1fO+0<6DK0c$q2mhb*c|9O&>D}IQ(Pdnq4$CK2u?-7$>8Zrz`Hhg(7H1f zY{aTO&yRbP<&tq_z11-1$^NOYJw!nLh@AVJ@{nd!wbsI0aTbsVse7=Wl_r^)=46V9 zr8@rwLIkV96^Cllh@8r9z{*j_k(mUS^r?@LQ|c`fApbi3(gUrUt&J zt#wjQ1R)#oiA}C#Id%sqCW4X+qVpvrA(vSYe8mQ*;Xp~Ml0_m94;aMX0NwgBAnEEY zBdqU=|NqXv^Z@^z{+uZAO%yo!|6V}-ng+N5g z3i`u~8N8I#qXPiZ%&4$r@gauq=g*X06|)6)Bm($m|1(JY0dy86_Hc^y39S`I;bB?B z=7vE-gWQF{RvwqUR?KX%6%NP0K+i(9<96yv@z_U5{fS*RG3WGZ0N8$ar#xk4SJVEb z!$`fMd@;|MqFsbX5w#k#ffKEd*8?=ZBr1U2E(7K_RSw2Gd;p}&@_;p7@!Yg4O_itCACQl+B<|qJs6pZ+VukBrQlP`Ynbe+U2?endf;EVxQB?r(Q#Z$Hw_F^h9}N z)ZROqNe*KotT9gNfcbSLR-8U;Hm_#2=D{5yq2$B@4*wT%OyuwZ^>hS9I8qTu+`9~$sMs~)yC%5k z5b83P@T}!NI)zA-4G~0V8kyfeq$%NbujgH4+fYb@;c@qi8{_vwME3T+bi2`NW;%sx zj+Y^$=}z!0O+MupU@wo%N(zt?!aI3hM6k)Q#GMz{BV*&77SM}Nqy(g}7Y{EBf!9NZk6*)X1t&?Y zXl@YH9fwCkM<51a%h`|&VhC^WNw1s>_Y3!YPn|Vb7ycm1FqkG4ZG~6j9b5_T3_uCK zVki>R`ll;43%dcd0`Tf7~EsL2UoC9Q~KybtenakbJ#OR>b!8Dx>wF2-~o)> zQdnYs3U3m7$UBr&3lIp|=PiaGUOGrXpZKGARP-;8kCl+5Rx#;6>*PisUae55u8x{bWacp*;=)X5us#*(CaU%{~g7?X@!@gZDc@|(+yGycKE zRbI!d8AM8*t4i5!^m^b^8)goq>v}HXQe2{-0mC6~AvHyCkW~}~#*etwP(O!U(o2i( zsR=0t0d1&NME8T9T3CC0A)=0FVv_s@39E`yl;Wj(kMA!TVj+#?kb=Vz7NWRyNM!CT zS=@sApOtt<8LxSV#eRvIKw{I9+mf$g2`EvtcAu(EBB37e8S-X_b2|EvsmJILm$s?N zrGx{mqI(<(%40PcbH|ENrGwp3E2vsyC9Z2BSlAMFR?$G@0=p(GF8K0_Q$+?bo-LC_ z3J1GHo$rB|7S3iAQw{5=ZqeEuR-PZZA+Qx5!%_yW8zu>vsIyOhe}tyZA`&V7a&S|347_|HH(C4-=>Q|8H`BPuETq zI8orwm;$Hze{q^$t@IX4LhKY}k)G=RPxb#a%u$UEJML8ff2#jSJqg^k@3j8^-#&kr z6h8M<7y4k?l>b7EDRHB_}w;4oc^5&-1xk`=i2D45$ zyJ!W@N3mKYzr0906UVu{ysVpq$dTGVDa>az8Jq+ZSY0KXjEd^=X2t{&-N4CvNX6k6 zR;n>4NXMBD0Z&__@O2omI2mo$r23iu`N4<44S!lUL*|97vlM}2 zmI&60Pt00qFP_Q+ZnTTzou;VbIUorfBKa!MsfB;ZLIa=*iE9TB7M)@|;aNL2Ud0XP z#hfwR(sVv~(LxnWp-_0?OM2xt4Xl**a8%(R^Pq?-`Ehckind5x0p9@q`7~U|8R|Ib z)kWNj4R9nAi`d{j4e9b@q$t`L(Gb>G*Xygc2>a)$BN*8xQx0=jcm`6^K(|E=>}=rEo*zdF_o^7TgR-UO925)TLG4c08FKV(mi{OP3$zyk2pdAcmVO^T@qwH$Zi z#iX7WUOKNCuf!I6Ip6}qOL$L$_4-grki}*tjEY9^HE_a5Yo3iNfpj(%+|P*|yS0vK z7oIIH;TqQeko@Vm|E z>d#*)ph5&4<%0-FBNc!sCX@k^2aeYcOo30!7Q!CV5{K4H&6L-p{w2nP__D4o)0$Fr zGqi@3Y*O+5P$mR=tTPOWs2O;hYjf~tg@&-J49CTA<04hTuT9wDu(;iTIQxXGD z#jtU30Y=N52eC^TIwI1HPpi&KUrIAkoC zx%!$4X_X3PX6>c^eQm)Y=PgN1mMvoOU>zIWd_V=oyO7C6-@QywQu2xlWPim&$or#1 zQ`;dlx#Ur3P9LcBi)Uz}Nop_IUgHs0rGjbga3*MRWG;kj^wKJT`_kOz zAg}m1+!Sp1#7!L3y(6xX6E~O3^_(`mSeTNjL4zwyxFwpi=9bASUYMYgP-EkVGJ54f zI1=8NLSn#RU)w5osR~^N3f}eUwpTF99 z!A4$rAf(5!NfbMY9wHqG+1f%RJd7o)m@-r1xE~#0JZ{|cHMspcxCrvFJJ@?#-;ov` z)*HRj_3QT|H70A0k*kCiWDeT@Aqz1XnuvH7enRsR*#gN@G^2Y}@1z@+7saNm=4Mh^ zC?I@+p%zFx$_-@YM0hQ+I%9}=dU_;PUKpQuVfoY&!7k_F?+}`jD^^d&9n79`NN9`Y zaLF2Ij*|9U-L65_`c#{{J_p?%?6-#TF7OfTjbYJ;+6RZKkAhbZ;*Eu)h6WOQnO>yF zc^oaMPLEOYyZCuYKM@KA3jrt+q~nZEKrN^SX{(BqkZFL2pr*;+|SpO9--c@a0Oo*83mv*^DB`=NnM+&9&sc)tz=B^K^M0DVKJ zqqKFf{2%2_DvR!Pv7nM_#&##aU>KhG=R@HI?(iXoLa~Gb6u}qJJz*jnFc+){;;SSp zJxj)eJelW{x+Y3dubPQ3fbRu)Iv8Mylgd0%g-o~xX3_;0D6BzDVu^%3H`uX4ZOn#B zc9$tRtilQ0H7l0KU?FHI$de$uP$C5xK(5m0&AK4~-EyiKNcM{)l6h`k4c$M7Zc=^g zOO_k%f#%mXh`E!JFJGn8%#^bz8$cnwF@WlTBp?yUP6`zWRvk4`KqnGRRT&|T&SgUs3d4Zi2eE7Jpkv7`2#RC7bwX%61FCKUps0$y_&CWDsA*r#6yA2T>HH zE8FOiYuoKm;dqFCp#V*pS%*qHFSf8l4=7Pj*aP!i8B~ge5d2cL8f$D&J0MAST>oyxOs#Gu3ou=rgQA^=~~t&IZ|0+OTn9X?bkaTfOoTWx1hqCMIWW z&B;yIx7WtmY!B>uJGPp2-B7-9SE^3K)lH-o+N=xN@wk;w_%kpiEGR|#elVh-tYMVF zZ1XvN*mo=hLJ?jM+XUfwwRgNs*8R92^cb0F^7`wBUz zWs+yz>WXv>IhBe=2%cyldu)(M~$Ob=QOPbab0( zRbhP%dUnh2R9cB)JV%(kjX7nfJH(knKtlZ}7{GB~9F0REUTX{005ZW5Fi}IUwYX-x$NQ=+eG za#15nbC!}8f?0HnDkMGL&WwR9l`5%{PIoO=ZB|8_0!BkFhSGq-*JI|8MC_6!5do3* ztu8A-d4(n}RJIhFsTwe_g>;oEuSGjy@O;Tg^r1O!Rju|d<$)8+!;n)9MKXUK1dNI{ zs2OAb!2&-T6ILN#{IWO=#xn1vS=BR&`5? z@>!jzeh_adPb2L(ZDCbLqh$8dhX7WD@B&KO8$&PO)@Fj$$B=3swwo~C(W^X!&M*wv zqlgrUeJB)!{2D-5ViAP*U{r$EwD91S6D!eUF17f_mUCnzagEiRo)1X>TS80}G4~vr zSMoI!n#Ao;R)|Wa(M~4HBu*L;j0U#p>*9XRF89jE(SqT?7Ln>y+G_yLTB$Bhuh-E_ zaHutB?X$MhVWh!2V*msh7_^|O01B1?O&l!QT{(V`t4b|((;g?c znMppJ2o_>vTZ z)PvGwL9xOl0(rPkC>2DjN&^k08aR~8DY6n_Wv(Q)^#BV+@gl%05_W?@M>|N|3~g8O zyW$^tnPmm>AVKT`bJx&s7%(5nfC`*Ny*2P!i**u7W#5Rz#oCKVP+jOsI&k}l0C*`h zEMvf55=x+djh`srl*T-Gxrir#!$poVN|#f>2RPrQvxi3} z-C-ywP_w1ZmY|}RhaREDWP>NB0#Qd$7(PdJ*BuZJ0dVM{?Le3V?o-BrZ-NpsLOgl} zwM4-~$*m=a&JEKtkW>Zk!Y;tl>a6k0*=sLOdGKmq28G3|5L-ap!S}3y7@imoSZUf> zQYyd(G!>ardr0DqDt@ekAxFa*fp;iV)Zqz3Vd><_5C&ORjEHz3M2?3bAcNP8h)vA8 zcPYbw7obB9q}kj6Uvaw%$4c{nmcNLZsH3W|n~@Y!I5EC+%Qi-gjKY*b_*tw*F}Pv5 z2=XD=0*gyNgAAiMR`8%_cOsVp%*= z0`3?z%M(O4F}L$9(}#T_TczSG5eJa~4l522l>i+o=CWrQa=pr|)OrSA-e4(`Y#G&1 zjIfA;ZWIfuxv~&bl?_Bn!AfU+S@*$`On*vB;@UGyx%41+KPetz_(C+tF7}8VfKm&Ho zO<*8#KA3|t8M_P;V(U;Uy~P&4`(kuGKn7u!)g z9WAHN){eg+XA2_OGXs?jS|;+dhRe6mVuheOqMa>FU3IDJTrZ{w60IRInCYU%QCK+m zkWLr-^^nyC%VYLfH)a1}EuJ^gr^wx-TEZr57bAfrm!NGqP*-mu4_S@QCvGBl!A4*x z2k^5;pVJFI9Uyu|*WwFexobE>Js8hV7#^CRWtfLDI)nqTyEr6?1t{<%4`~Nim{%q8 zJZMF`nS?>l{m}1)w>`amNV`o9k?OSBNSQ-g@#_+t2uQ%7ro~9icj|9F9@Q96jU?Wk zZV+XL=a9ftF$-ze_nSK=rIm=2h&)V3?h`GsFmAQWxS%8`l8C69L?}m$7Y}yJ>!qFp z-<<8&N)bG#J{Ili=?5Jp6BWsv@9`p(n1(nPzK}=`X4EH<0WW<2Rz9BlTOx5v{$k-N z3Jn;cGv?5+i7CIiK(w#;7t9NZ<#109km=z<(^foyaA}dJMT@>F(H)6QN~`Rf#-j8k z-sB~*@7ZQjwl5QMp~7acx?p|?${%@-I>`n27387@WD>PS9+pUfmoX%pm28%{3a6r= zK-+;CiC^qgtSCwm^GalgG{?9Zw}ud(?X&qrk9 zNFt~ENu1-0X{6FltxhIgIQIpb(8bM^kf#hUtPH zTuIvr8y!GCfJ+V(HSi`>HD){mkKw5`ub={ygv9}eq)+?FlQtqmggnZ6oWtz(@GL0G zKsy}MiY%PkbsmT5coL0Q9fyScHPC;qW0iQfTEhaYV@ee%`-Ytdk61itETKyB(Wf%q z9;|W|p-^AbfEs9ImntC@;+$FiKHJ=naT`V!glR<<$!^i5%TSV#LjxGC=&j~tmqbD& zp2eD$rJjywMXJ55RH`U#DYtoP??bnXj|sR64aI{Au%?T|W**E%R0BIfDvc-xME+p` zns5loMF?8TQ1PSkA-!Zebdcoc87tt4D~yi5j)fsS71mLq{4cOW6(VIxJT zTrir}lKKz_9FNxOkC7!gcthkPY-Wy6lCC^<18;{PgRBGz2#UY(`_=AJW)7`wh)sB8 zD5m+D&kJ@R#UUO5J@K^%j2t8PN}jRYDUbKRZRAte*x}?FE&eHnP%@A3+13=#0ux~2 z9aaoVhmmyr_JY0!ukvS%4uu$0BXm@ywH(Wgnk)pgV0lt85X_l{SAx#c#2XkO2Z3cN zs8tk$sedp6svJ9j6$lF7kQc zb|6cCXpS7kdKkEfU(#MA5iJ9-ulArRo9L3GZbWtv{c}v_-jO0==qYxT_xQnns`wG0 zykJNCs<@S~cMM{|bWwHss0@HriGa;?#=W5?j>VJ6xC10f?2bbno{s1qw~&C|W>J2rS0qN)Xl4@t2X$c}k5?1<>Jq%MMgRnYfQH=J zD$|sNMB)&_oS6m+0!GfT!o0vh6&e-p0}ra&DXE(s5PpzElevw{ln1XfBA#+_bcCPz4tf%`N)U=x{dOb|33=zLp13x zZvOv!r~E$+TBP6+y`qXg<^O53D8aAX5#=o};T%#$!VjRP1*{Iuom2iFO^vV{VD{pN zQ~v+ue$7+<|CIlS`Tc8~|5p{XENq8Ai4X?;6v+axTc5>NET0g+4YoU+B!-oVV~8j- z+-P=rOVk&(JA+wXz!`Od0^_wsor3b)y>P=Z6^S6oOUH{cdaAr9x&Um|((y2QkvM<{ z<5T%hBoqu*tSKCbQ;q5=`kZXgX9=k;WrHV`mwZ3GH8`UycKN|| zL|Go-1y%^ok#q=wX-`{4f!IHdcpQR@>Sz@8eoTmm6^YZ05G?&orFFe{H`stnref}R zF%yFE!PBI|!8-veZ|PQX6$(PBsWKl3b*Jj4 z&~1q;r zs_qDKA>(Ic4R0V`+~iH26Rx$?1Cz}HgN(6Jlt#lYlVpb8T_~^FBTn-&uQq_Sr7EzAlu8cDGeuqmGKlJ0cwg70E6H=o)BbRLign0heCf*99qsv17uht(u z2H~E5_1@W;!Ly&P?uL;sveU_QRGYjo6V5zsxdSs| z)Yhd&=5l54_b;Lavt52M+8Dv~IO$H$s#mWEl_Rfz6#HuPA?N)Q&U+RGI@9KE99Tv+ z*Ry%fiKHiqn7`(p#fQOY-HI3M=c#eA)y!`)-nL#decnr#=oBZ>+4jypC4))yj0+O_i@oc6WFAMfciR)gt>{ z?7H#>Z5n#h#8;0w@gH;Iw->oave1j0rE;iHAI;oKVYVEF6Wj1vC)C~7-EqKf=hxG- zdN`kjIXs#5^L(QpnU!xM-B@c8Y3+G2PXhck$cpwu!8E z>n>JWo}0DtSHVwA6i$Q%K9NU#`HJE9p;>8!%7ftI$^Ytmdad)r3cUbL2Eg488Z&q=)lZ<6X z*6nI#m%HVyTgjC#P-)pYq6B^$In}J@YYRp^Z!ZO<+5*k)J z;>|nZTvd}7iNbZNaCKJdBq}dTyS>>PW-A%MCVVl8k8{<2VKQGe5~)F;=7dAeF8BJp z-?+Iq?{VHD)rRd%-ha1BRl@#2*D2Y2?k@uQRphLGm_>a*r_;; z2y*4KQXss!xoWwKsZ~1f?g}%1ez%&hR=2&))*eP`);{i-l}%%tikaZV*wRW2 zO^`dWU-cTjo5Z*l%SLO>>Wg5-tQNb`(ZH>Q3VRe@t;W-J-;H!;l{cudH;c7Lhj}OO za*fhB6RvG;MpYbCJ-2g*U&cenoeAltX`*Pk-<1r_#!Z>E;k`_U7Iu~7o+PNv%bacUzn}3 zJz4eJj(xFRl}fKOdhqp+VqdM^;k-qQ?b`vvEq9&BY7`AD8|830kjY&(rh#npB43UT z(}kP18!XhVNN3QmZMR)_eHXkbBm=!t$XJI$xyi)uzn(YKZh5!Jgo@|48UN+3a<^X_ zSMhl{)!dEu7lH1q>s;;E`|7$q4o-6W+@ccL1k!;)CXbYc9SeqHdfHzYm(yXR*}1rC zkMp%@(+yrUG3i*ZdwJzEsZn`Wh3Z8!I4(Yx)!dVP-3*FSTzG@qKA z;Ej8gzFRCS)9Xed1XR;eI63dko5NIP8r%({=izR;v9e05^Tjq=te!>p%wGHi^O*~o3m+gl55Ymt=z@%MYLKU2WQJ>rPeN3XSuMOx{fBD z=BRPqDl{{1*xY)t0}`u|h?|Ed1}SE>FVc*UrPr;Ca7 z0{>!_+6oa`cCn!#@ZJ>!lRYn$DF$<*1H4i@1)yk~J;e+O1Nhj`D6q=6MZb@<;J}ZS znz3Vv6&zn(KIQe^blEB_<)bL(*Ug2jlp->pq(%;vR;U)8&r#nb=vf_Aif7u)MN15H z$r>hhegL}kjxqNZUgnj>AM41Z$dEPLwu|}8kyyGx3uSWz!IR!Uq(bCU73Hgk5Ae(* z2E!{buNbAEhoQ@BgRBhzFQmtZEyqL7E-HWsL|&(~`b^>R&K%_7L=r8+PSFtL=f4OSzBC>P=IeNhv4RC;9t*_Kb=|lDn*uC^M@!S({V`nt8clkfRC2^4Cy<$@ zh$WCAb&nX!8JRSZqIk(z@)Zh|O0o+td>70y2;HCZ#60OPKoK;MthtyXZgdWlORZC! zGCHL4un^Lfj(i1RHw6Eickv}is^Bj0CO=>w9MQzo83yt;FfK>O5@ggtBC#SY%o=o* zkFwmD$1Nd~$~2|w<7BHiGb7|&=~MH{)cGkd-~ebIP>o^hLzj3?)sbabviZDVtJCyU zD=5JSSWPR#)pII8+{@7@s>03xffpfxtz-FVcNuXAf!bWpX_N0Y8QHzJ1@P*x=Ha zhkqpv?d5KNsm+BJM;gLpO`lFGyByv-YOd{3EhW# za1m{STvCb&a3oY3Dg%(`Wumr>A*|Lov=rO0j1qM9i!?VWr2($JhdPGuBIS;9M?M)l zrHWo+%%^rlI+THfo>!y2Fnr5*UduF@efFhlH6XJltLMIE9-pC#o9p#TCy9oq0FK|` zM7`ll)%Qvwq9B3NhvG@mSPnFm1Tq?C2?5E1h+}6T$|?rj=FGzDJ?Hhx39JZ9nx)-V z@jlU9xDo{25y5rb+#no!COEeiy%ysrEsH zL$@XyKcQ%#!(b>#VrY8>`7OZhS-c?KlIBQr(EEe#m9fl&Ud^ zxqECS@SLOCb-_YZ=<3u-Wkm2q3U&aib}f$NUbt0T4RcS`9#x;P|I0}jk6A>Y2pxenGhsObSYOrAYeodOiU7sw!C()NS72h1 zETW)6^9&77#VTk_0yq@<+z35NDS}3T9@oiRiz5WA*M_R{L%N4b?`h6~Tmnr8Rr#mu z4a1v7IAN{0-cqZ8jX|p6SDI(k=U`pVf*2H>Ihf4E5Bg=pB9EH4#2VL;#WzpH=BW#Lq&4|5gnM+v;rW*&z`A#5Gg#HmgO&!jS^DBF}!5N%EGSa_HdEj$3eg1M9f zn6;nY2lOwyi>V6XyyBd47$GR?gW|-X92=8mv`A1t&{&Bxh2RInSK|F$_E#(0fr=KE z18aSSWVlV>NjwuC*J({L1R=Hx@AvBZ1a!iSe$Yg~IK8e$JQHn%V&^HnEl7!&Y7#~% z0wX9prnkX0wuqe2;<#W;o3QaFWWZMrKVIevP-M5rg3^^I&pxG^&}s524t;aLI^q4qNOl7|UFdmO1%9B7S7U;3~xuem#6Qvz3ncBe#zUO`78+9O~n z=uaCPqOq!GTs=Qsx(W;{pBzL_>dIzP!V7cGF*qaqVQ%0KBUTB*@wHN8Ef)S9&I1G@ zXy6^d#_RC)?xAS&1es?k43W+>XQhvlIFgXN%ZtYG28Kz!HRAIQ{w&s&zl#e6X`t(F zK`)l7)7@k=mru~~Rze~kUP}oeJ`WK!WVRBjR54kM4Xc`h)Kkw=P z!%vVtw&9(*fEsj0`_VKGd{2N$=w;Oc8@GeA_yDYvh$z5{z(sy8wdZg>c|->1ApvmZ zi6RC%!rQ={@*#f($%eAD0yu{FBR8aiSO!mGSK=~YDiAA~LLQKprQ9F$=d+zgC4x181BS2Ig&Xu4e`kXsREHFIuDl|0_Dn9q+BuRo_shSn)1{<}1 z?z_T)I0`6_ijO#^GKfBd?6^t~4Xgnzd%z+6CGJtj+#B{pJqxAes+S#4CLYCf0u;4p zfM?K@SNVuN4jJG~2SmM5kxYrj0Hg;9E>swrBHx^q0V;sZ2(|5iVkLAU%bM;!B6=AZ;Ah}N>vzeIQ9RZ`u|V;|EK={U%&qUhmVN=|EuZioR6p?ZVW3(~oPWd8~OA5=Nv|Kog;Uo-swcYpW6hkuB_ zPJd1m_<9Qb{l^wJuq!U^Nq--(G~%wZ--#oEnEpnPjMu+!XJYtIhchU{%`1s1pvf zvTLg_ZvYu(Rcfc_c6z>W+Slvld2Q02rVEQ`ZeO-Gm*$dSnm8~QC#BdtDi?jq@;gq; zB|w}hXVgv6H;JP&(HiCJuX`3cWnbtcgb-Z-x_XJm_G&n4THqs4TWd@vl^2Q4iyIUYz4gd{rLY$Oh&M zoD7KCW>rM?Wh^fHDcr2 zMJW~x$AZ<8Ka~w#ZWrTH>o&0u-{h^*)oj#m8h7RWWOKW`?WJ3r>4klkEe@9Mb**-l z2yV9J`MSK$+6(_hcYfWO+*svNtTis0z0Bnz8a|txFLKjiz0%8#s`E_FT-LX4a1pB| zQJjh5E_6N*aqu~Z>6(l6n#c0I&sD@X^CW3q)PpAC<-7tsb1hI1%kh<(39_#LxU^N zH9!P9C{TdR6SAD`Q;k%Nt;qq)i9wjr%VpWBCjqUBD0p6KrsdX=a}L=Rfaxj(1oQ=f zApBjXrOI--m?)Z5rQojsbV~(4z9MTgg4nsYCDhrJQfocph(QK+YoM6}SOP+Ezz3kt zl;!(;rCws}SQJnLDnUsAU40Mffri&txx(v^&^&mrbs3pU$|8<@HV5DGEJ#^>)q(lV z$8$-o^#O4?Pg|H1RE4i->F=A%pZoo2CFVh#*wHM3?4vDpq6;DQu10ZlQXnz4G{Q)T z&4$AUNoCea;~$Vj+z@n4u%vfMp{sw;C;*g!Y6AK&H6Sy5#_DZ-R2_=Rt)Y$bZ5W&#E?G6(Xxekm_o%2;CxxUqFwe0~pljtkvT_R~6{@xKXbS z6$1Kn+0)|nz-p?|t%5wq(P6047G5F&)mBy=HxQ0!sR2)@#$WHSIaYmpXyGjTKRo#L z=34H*6`OygW*fVZI{>gQc;(?+(o`>{`v&v>v##9h9sS9}q)E2;oGXC`xrxBxNUp1EiyAMmrgMP^XsQt#dlKU_J|Mt%0x6LfO;_h~*Q=MM-E(?`6 zszSF6+j4oRLeQWj%AzJ(B5hgP2oxt#;vjRdBm+UOlWYNthINv+{Zrl*OQ&gm6g@ychC2Z9@k&JeS1`_ZXUE(_Bxg44?Ckm z`{B+`skvWmzkl##yLj9@e_q&J=Gxh49}o7{h6jb_(fUzgTv>ZLtTidO8Fv5}&4Erg zWdY+(O;ADXvs`z9M-~RXzN&V(JMOF8M0;0g)YvI$nMm0(_l5G-$%SXVQ3+Z}mGz(^ z?p+KzRQTUh{TN?f{LTWcFPo4j+?|q#?kpc!q%CPjdB=o*D57e^H(YEl3Z|=!@dRp0_$76sGC$ za&pDu(WjiT*5eGb5CvWS>H@)2RYT*Sb%yfK(;v$5n=co?cJ)SF9Nu)MOC_Ly1m?sI zwvrg+UrPS`OcfjT|9`&ot3Q9g;dlF&+ZDK7f!h`M8Lhy-t^ZoU@K0a-$10wK?f&6q z@6p5hf@cQwZW^+*GG+NZM9ffeRA}wu(`L}+#J`AtH*m!hcCzV>T<8~ z;?2rcx%hIo`~30I;MM-dVDIGdxcBzW#&W;#>}qg4dVbLE7dIZa->*ITrf^(*u(mxK zREt+{#?`Z@rOtM7dt7aN^K75q$s=xNkRbgCxX$g1>eV_JiE1k=PBv~=nSTpSfk%6$ zV8jtPG-X_FD-*?Kt+=JQowy`FvqWFOz<9?5Tf#V8HfBr1+8Mc#&q|Zgb?{p(R7_`t z*)kOSk-my$(&QdIz%?Oo;42dkNXrH1q(yS0y&QJla|B0G^&HEO8jCq#Et?ky@8A zff?y_J6No%V-7f3c1D3K*=D%i9`1o;@+e)_ODG<4~X7;W-(Y5OByHT4OI6CP1w62$_Cd0cd+WU60Rur=e0<3 zt(d+F_}5R5%~t$S9nz;snb>J_2T4qM$I|c(nZMV7uqs|5cFoH^htae! z24O;PKtdA?1J_KzB_|~KmIn8bfw65BWR=g4!aBuTI1gb~ac*+7^*bkF(T0`DECF!~ zP^@W*^|Dq63Q2sPVx34GFsWbFQw>q4R)IDk6)!Wik_lgH)LTzD#7n~(#k>jCdgZ>e z^=4qM5hjcu;Mo{B+(|C`&8rFG%jM?b*eTKtj?b|NV#Gq&Kd{d=1;M;9xbSYI2I86) z3xF0m)m{n$KUtpJ~(?g7_!t~tq)lIa7+N? z`SbsrNsy&vBor8jbTc!ah=J7Yv^Xy|?-+7bbZA*k1Yd$Yk+=}UxYP(U^9dG3Hd52_ zn`F)f<1#G9r?6XT(8;mNSLqDiy$Sj+snpi{Os&yJFdzw>2`aGxWlpKp{XRB(YP|0H z{!Bt?H@sfQTxOqGTEfLbMYYbqefd6SIz)Qh!A7Bq*VU+Rzg$WSO3O_7nHWlSBHWnl0FQ>I$3FQO0Z({LTv3g^;Iqm5Ya!t z4{D`t>XdZ4)ZGr1aFsc2P~CPkYW0&F8L4zLMB)>up?RWQy;MppOtbwOL=mY$-OLNy z?OccywG{VU^QrpG4Me%PCYINR()w9p$&l(9(v&Ys1qLS3V1MMQ{rELPkn z(Y$ROojybY!Hqi&jIdgG1ko#4oi|hfqtYAyki1>i#&b*_y*Nyg;>4`O7KKW(aTp^( z{aJ3%FKi{6qXYMxiQB%P07grj=p*nGnNCN_OK+01m%rM(C+XAgxIuM0pkVYboP+ll zilV&KzcP8A!(k^Bli?64`C+e60kIm5AO3rQZ5io>Zk!c_>nL-UGTw-?Sv=CinQRzDvOPub&i z)R^=6^_L5;+Bno_%(;uwhk{YN$ zEcLk|dSw*qqELa6i2Uhdl+HR9g-FPX`(x^%o)7BD0O0lV3OkCA8lI1z#l33S0*=Ii z-)wx1wr_D~Nn^LW;B284dEr6U%m6?mKt4iYhsEXB8fF_SG&;)FC#c3fi*8T$v9G36 zLVw0(=gkXQHBg(qe;<}|vKo`YsELOymcf*85syl}qcNfry`Cbh3RKW4!UNVfBL%>H519KKkn%YLPTWSup`>8=PuYME8=d$u` z`*ca6nTWN(e0tZJnhETMcO29KE@!6?Ow0^qpk;(Do?dX+C#ya1RkU0d+>f5PjvUm$ z<27Q`7{@jpg&~Q#K;qSK^G0u#OhUp*KPnLX12QuPQk-ksh@{rKttFx{woyR@kSRHq zA*NxI(tQQaH4ZZOeIl#J%MdvhM$yJ?*AbaGA-kx-rGFV`ggukZ*2RSq+Y9EYceqnY=a}G>Fa&f6P{BlCDhj$eaO4#y1Kp zhGU7HBbuxg4m6552Yo(%1EOk*R^L}QgB-Eef&`X!uLmZk^T~id;(HIYs6-{(AYtVs z+r8hs!jP=;?QlX^euA_t_4lZUX(IO$XsvnvE#1FSOBP~WfNR5=ePBRXTmWPBP9X_P zDrFt4nO$$I12%JNj%cB(7?&P?)`4FCA23W3Euo%{Q$%plVxSW*w@I=Z7za``b#>K- zSl0fWj6wos?TI)Sqrbv5Oo_2Exi}%(2JaZdlcKa4v$TYYtY0szzS^%=iif4$7y2_g zTINKKJpKsr%F7&DKr3Mhl1_?5r|`F_7c7*3Uq{Z2odudDI)rq%FgKMTrMxUT4aZ*S zl;36>jbAnp81F23LlRi=&fD}T_MwYpz4XMC;f3sh_t#N)bs~KF8mARWvag8VUEF2V zUx;K5?n84!DxhoG(33vkh5ON*Z{5KJ(ZwDl4MSm4-&PSc)=p#&K+`TV6#FzadYVXL zl)%eJf)^J@c9U3R=#1$z{DpJ6lBf^axriET*gbjbvb!%n>plb`V3ebcE!Jvhnr3?^r7l6%dlaIT5X;HU`*;Jk95$=C zPO-1WC93uxj9Z5}41ax(ygH3nDp(%^H*jbBw)Ua=nm=l`IYmwYBYh4Xu1LD1FWrct ze4HC&v%7|am-HlWLBN2IE>YSFFeZ;X@-|{R`VSM2yw036NJu>cky^cuoc4h^ zXxGVw-KES(iUxthZ-ER4C9ORrfFGOHTt6vh{=uf_Yr_^CBzE;6XXMRJ`*bwWsWb18wzk51bQOkj5GtCJNLHQ=l+T?V)0K|6lPfs9 z*2L`B?Szi!HQ|LP_3NYw;=-2C_b;0yf40;S_bA;VhSA@HfCJo&N_vwcDL#^JcTnCE zu_1e-Byiq0CW%gsqsyo?XggZ$IKd%u8TWf_;UZ;_;gm-$2c_>SKA_Q<>`;zn0lCy8 zM?$0TA-DXv!{MizJA7gL|8Jh(;s0;{?{)=lSK#Ng0=M=5xAp%4RY8wN3_<3ti{23E zw*Fs!bU|}&TV3a}zG}FTdcyKT>9V{HOacXCa0;4mad(?7?p*;rA)ILtE}6T5-SS^& z&Ur&+z3m2M1ayV#gg51Oa-VE$0P}sb*H_d$USNY}KXs611GZHCpWq9vPvYr^g2wv6o{-~4dao+c@;pA z?NoPF$9n8HuoapxTeuB=Vvi@}1gI@YsgSBkuDu(-c+frF z-mQ$*A1sfLcbYGEo*Z^hDi4WF9vxK=4_40Jw|a+<*WXqjterkBf3q=sxjHx>3|_x} zz1Q5un0M~I6Z7RwMnjTdbx^3Vt2vKIK0!{2N>ApxHH1@827$V*AqJTCvU`)|s@8@y zFJzBSu$&#Y^#RoexqMGsn6us&4^*dgng0iKd4rLB>DaX_QKbz-gJ3#D?|MmU3jIIKIzh5^mt^k&7@busj>OMK#gw z)BkB!e zEI_W4QgUB$<77XcUP`M6!q$v}X*HU%@Ewhpr0~~|(_7TnKrfa;kPcDEKtD_DHFEu| z3>*e3q!1gbfy>O*wk9{8jo;*JX0-LwN&TEm8r^1+yw*f1^>&QREzR_<%V{d=M#s0U zKJB4)yOZpbS}di4faurED>-5}Z%-E9?mau}3DC<`#tUi5m-AZ`+CizE(yNCS1%uI$t+CZ$89oEh9IDUl+TV&2G`F|IKZsJZTnDY4YZFvkEN{U9Yl(M0=F zDNr>|pcU9@^E2)LU)%ow?VUTnz4MFz`Z<|Cw`2MK6}aX9=LY)!!~g%cxBUMCwDKr# z5Fh3Oy5;}pQc2gkqnM6armlIm0~~b-r+5mWyH_;kFA4p+BE&%;3?Zz-J?JnCuyd%e zZ3Hy}+JFPpZmzL}`x@W_ovr6M~*upL6RQPXaFf#i0NrgqziKWIw&uLDt@3@_$;jMKoU~pE_2~yQZVQb=E#KuEfmhu0Fs=}oQE?7II-u7 zeI`JDF&vN#tNc&iJe|rc{yrWo^&>u$fgtFP($@pEv9xiNgGql>bZBkbcT2^iOdi>l zgifn%>-M6l95Z=&j8wanu^V$bf8cvh$lR1aG9FT>ECDq(;V)81Xlaxf!E387!(Sq- z2$EN*RoOSy4T_|{Q|Wg|VFubnyfq&zhYGu_O>&+E$e1hwid7Phbec29Q3OhP8Rn4s z6W%9lR?>5stCKBF(~M=wlTVE?vt&j^3XVz(wI4(uH41;RX$086zhhxv5$1@Vv4A`_eRMbh&GXcmlu*3m$m~f|J`$$uw|*i) zgQAYb&*cCAhrj=&+!&?b{Bs*OMrBZcdb-G$0=FQR7_UicY9-R|u1^l7dHaT{ktWxVrbendP zW8D%j5pw0iD^gKVhJ>MWb_#ka_+qrTY;d+Lqr}73IsMU_L@d#)K1gbHds0(|jYLBR zqWmNUwwITLQJFHPBMW`z5VZmj6F?8aaVC$o9sgs&O4gM0Tf}##8S> z;SfP)f})I-!2ZJ`+a-wyt2!LREXy_7=gtnpp%8jiaa$Y7;aZsHPcSk_4s33-2D73t zt=k6-2M`?OYCAOO1qwmq(B(w_l19j*)%72bz!k8zojA83K% z8u62n!gYC!tR7S%mn#Tvlt)Nldlz=YK$LRjEHlg6MGd(^!{8%e37tHU^e;&cj>jt$ zkMfT?v4yoxzji8~7m=}`kfnTBBGG+Cipanhfr2-GRFJ z$P)5eQE8!1Ff0m6Is{KpZ;)azQgn(>9XDUjio79nUc#IR#sLiJms0Yj8IQk=jwd__ zZ#-wNd7*?0gj+N$e!k*IhDFKKH19)1WQK_6S4dLmICN}{XQ6MI5FrH}V3tUCx{(;C zCCg<_)6i+MSCw;zFv7Sq9wcx_%V*V~=F}Wz9Hzf8cNefSP1=B;zhkl2ABq>|T| zPw|E>BCG}5@a+-j!ttV1sRPT~_*A9A)`VQNQcOAb6Ph8%M?ezi9g-Ho_oO2hwzt6) zR1#y0bMmaV0nA-%TU?AwOFOk|PO7hiRIq!|RGcf;OUW+s(c$Rj=twI$A(%tx<@|IH z*-Ck*c(7627llk*8KS7-K}wVfB;J|&BL{K zyPbp9*6yg#7(Ff=9`#q>dKSAKZDK6o{L_)2bYi zk?Y%T)*G5{=4PE5F=z^de+d`BOgF2Y!TPt+`yX!ne%vivJ@&>5^ zq&FkQf67t!Z4#vrwd5&BzRl(0l1&{x9f!EHxRMQkoKSdQH&vV!VhdF18%&_0&?=~h zA#7NV^^w_UL)!W$l~>*WIvcDmdE{mn`63fcNx!Tvd0!|hG%tCB1L8tc@eE_yUUl_~ z*G-u&7qBzs?9vDW{=nI~Ao>!TLqs*?r~O4ERFpML*JMhT<8&M%IW*DDNqZtX>Uqqr zYnrM-F!yA|IoG}eTgpV1mQ^%|W3i|~DLYhX4j!ROaXws;qNZq?2{7w=p;|6)5z#p) zR980^%CD*m<@JS9wZbn-mFjA_P+fXiUfn8IL+5IdIjtuK+(FQbWuY`F$Sq{ zsEzh%3SnqNqAp@;;E5ZKotQ08j6t8gS+l6pg_}{4WD;7p2@4=Jis4lGsxhezu<47q zpSg$AZKi=?)kCl7lct2+2nPVRlz!{x&4#49me5tGQH>qp5vu*33h79NHU!O6(iuw; z46vL1ISIcJ9jnQ7Mk^ozWOBp1=Ly>Kj8)LLLxwg7S3&^q# zCkBr!W(v@Ql2W+vqSI6ruMPW1=0pkUCii6rW~y~%-Za~jKAVT(8ilR+Ks-gKd-6)I zf7uEu-q8Ruu0AD9)G^1w3pQ%rc0WnA84+lLmJ0(3)=qi@$Cs5C3a564npdP(AN&NKz-Cd+ zHA>Tt0>GdMDN*U6`{lpVa3va$qnLgx0VIjmS2~;$paEiDSRyR}3plx5ZCMPI06jvm(6C;-H?c3xGgasXR?_*A~WyxChQljK%lJ<{bE*Cqqf zvy?zUK?F>R7$hD8mze$l|1$prfsAlA_omd+d>sfS7J_A2j+x@8nU19-4R|Sk=HetZ zesCfw5Y*$i>#*>)3|#e45at!XWPp+?>a)x*sF<*@w{!z@;a|z*Rb*M%SKIF3x?P_d zZmwq13y8gJLDAg>y5m5xE7tJcv&P1pzcA1!Oj6kPmtm-i~LO_AH%p1f= zRYGsc-GMz7WFS5-GK_SOESB-l`@Bg;r=F3y06Cx0WfK@A8{<2NmE!igQl6-3Z*g^? z3A6}$NU#Ef>VOEqb=JQwhFkppdb4UxWUcu=pJQvWsuZ+mowQ(4Wt3c%7`hAt+=tqg zGX@S{0FaCYBu<}Bbs=*ZGU+BYC$jV>pSoVyD7-G}C)Bq*ocX@xpBUz{Gq~9BFfT1( zs_^3(WIqBd&bu$M%|X!9km R;vRdJWaG3y)BgXf{|4oE5-$J% literal 0 HcmV?d00001 diff --git a/blog-api/tests/Support/Data/dump.sql b/blog-api/tests/Support/Data/dump.sql new file mode 100644 index 000000000..275aa60b1 --- /dev/null +++ b/blog-api/tests/Support/Data/dump.sql @@ -0,0 +1,58 @@ +create table user +( + id integer not null + primary key, + token text(128) not null, + login text(48) not null, + password_hash text(255) not null, + created_at datetime not null, + updated_at datetime not null +); + +create unique index user_index_login_5f1de4d7ae5e4 + on user (login); + +create unique index user_index_token_5f1de4d7ae5f9 + on user (token); + +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (1, 'lev1ZsWCzqrMlXRI2sT8h4ApYpSgBMl1xf6D4bCRtiKtDqw6JN36yLznargilQ_rEJz9zTfcUxm53PLODCToF9gGin38Rd4NkhQPOVeH5VvZvBaQlUg64E6icNCubiAv', 'Opal1144', '$2y$13$IkvO58xZv3lJkGUpwTGPg.6NQj1mrSMOUIi3G4sBX6AoShRXTISES', '2020-07-26 20:18:11', '2020-08-03 19:10:48'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (2, 'yU0asLbo5th60rRL4L0EGVRl0FSPHL7gCIZUs1IQi5YfdOwwbsuz1ZIA0cK2au22Gkk--XpSCsLxqE2JD_E-VxMzyuaW8pLBSxjyP0bmboWyuyNuUj1kGyGqM0v0C0fE', 'Haven7127', '$2y$13$/aVlgRSYPWUjHOlSs1PSuOkmOVB7HdQLc6UmqJLvSMbNUSy36zwqi', '2020-07-26 20:18:16', '2020-07-26 20:18:17'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (3, 'AzGRKjE4OvZhNUYxpnGqUnqxBejXn87MsPw2RInEGkMXSM4px_-pfCSntPQpCQSxAREh-uJcHYovMGsqP0kjM6aTeQHzEABxc_FOVt50kClftikYretlhJ0uOJBrQghS', 'Athena7928', '$2y$13$kXheeNXBm5fj2I/0hNrv2euOkSkPhXZeQwna7/eTLnktdUonPwtKK', '2020-07-26 20:18:11', '2020-07-26 20:18:17'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (4, 'P0ZcZ117Jh2W0xaAeq1YMoR5itemK04vZWTsqliKDbxIm-Hxtptt_cvwng5Oiy8oeMvRwB7eUSIszMTfcU6UtOZZ7WcuEqICpKdaXiY3uEOUibLO48oLZ5XXV9HREQxE', 'Shayne6889', '$2y$13$ri9geQr79ytcRcZ9jO7F6OSN.1MeNJb6hfsM2Iysoltjluds5YmMW', '2020-07-26 20:18:14', '2020-07-26 20:18:17'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (5, 'gUEH-ztBM4-0boeX10NS_QHsQWHP4O1_Qr7CeoUU78gadFpYE8GqhudgaUklmihARs46GnYPKCWAPqgEqdXjUx9TVcwP0J0KiQEFC2oJrtsGRLziPSZg3HryA2eC1MRi', 'Wilburn1086', '$2y$13$NcMhRseiDyDMm3yhF8/45OkavtVxtIix8tMJzYI5xHx3dYjRvzS3S', '2020-07-26 20:18:13', '2020-07-26 20:18:17'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (6, '9OA09AZt8sYA7Ehi_ttnLbLwsMGLPghtQu260JrRwrBJaMTabuBQdIEHbJNW0BcAHF2yDm5QoEQEY5MCVudkre4yDWB6EddYSei9mqn_3uwQbfhY2jz1S0cENapTLIrF', 'Rossie5155', '$2y$13$9oWNAP9IXBIW3KY9M.KxyecgFMEdot/k8jGNdIkptR9Bf0Oo42oxG', '2020-07-26 20:18:12', '2020-07-26 20:18:17'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (7, '5SQSC0l70-3eerJKNlNOz7BTAl3PuylMy5KldV2jRR4Cq2dmT5dM33tyyb5u2IwW_GKVWL9dL5eXgGk9U14KH9lxQSz8_wwStwoTz7KrDeOj3Oae-k87Nakj5QhSuAEU', 'Niko6385', '$2y$13$bnDvR9OiqmAulLYBYNMjuO4IUOl1TwqfQy1jnMwN1ESB8J.i/Si.S', '2020-07-26 20:18:15', '2020-07-26 20:18:17'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (8, 'FMJIgz8TvmroJ28uAat0jyeiYADlWfpNpoR9kRBFGmVsUHAw_u1kJ0-O8EHB5UfJaqLNhrskCAf26kZCXuB747DaPpBDHRd5mLZ5b7Tq5TxaK659Glfu-gZzC0Pw_u2d', 'Cordie5190', '$2y$13$ah.45kfteHCwwLQZAd9AWeuu5pOvhfJFU8x8TKA7rq/Y.ty8cEAlO', '2020-07-26 20:18:13', '2020-07-26 20:18:17'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (9, '_PGRAIc8eKL2IQhmsMImrh49w43Y2byQsj0nUHul3Q4HFectkmd8nhh4ORTcvvYxNfx0Vbx4jtG6-Oph8lxRnw0f7K-qOTqgLMRdv5TqlVyZO74dNz4NynTd9pYTiQDi', 'Leola1793', '$2y$13$fatVjj.ySzcur1F6Ks2/vOlGsQYh8dkIg6gQS8WjkBGRHwgZg69ra', '2020-07-26 20:18:14', '2020-07-26 20:18:17'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (10, 'm6hicvzj0r5vXmpGo5Ck97-Os38g16Qi8JQDBjJTbEehrcioZOQf9GL7410CvMy1mEhIbOMFlzdWERxpJ-XMvTXB9oF3fPrjA3UB7v5aNfgP9sGeWizfb05uaA8eaeQm', 'Rachael2982', '$2y$13$zgnmnzkFT7xkgYQj4JZiFerX6NyNMlwbBLWKnbxV/bXatO5yx7XM.', '2020-07-26 20:18:12', '2020-07-26 20:18:17'); +INSERT INTO user (id, token, login, password_hash, created_at, updated_at) VALUES (11, 'ooTRTrvO925xdpKBR8adhysr-KSKRsZK4JG_hLfghxXKQ2z5TLdmjJK8rc8Qn4Iayotg6GJF1BoA0AHeL9YuTl-qnlkmlC6F3NEgomipGQYw7odI-D9p_VAFSj1j2dIS', 'Lizzie7529', '$2y$13$tzg5/FlklhOk.e9opCisfe5aOuKREVtnyy.6IeUL.hva1CjAsl3NW', '2020-07-26 20:18:15', '2020-07-26 20:18:17'); + +create table post +( + id integer not null + primary key, + slug text(128) not null, + title text(255) default '' not null, + status integer default 0 not null, + content text not null, + created_at datetime not null, + updated_at datetime not null, + user_id integer not null + references user + on update cascade on delete cascade +); + +create index post_index_user_id_5f1de4d7a5678 + on post (user_id); + +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (1, 'xkHilRENIavP1Ht6WS7UHKGBv__NDYlrmpvx0GieP91AnQnnRMUKK9OG8so0x38mColZj64UBF6UFrMTvYCgWUIQx0I74Vgcoy63PNCqwVz5hYYi0DYqn3xAuXIKgnbT', 'Quia non natus aut qui saepe ut non.', 0, 'Mock Turtle in the distance, screaming with passion. She had quite forgotten the little door: but, alas! either the locks were too large, or the key was too small, but at any rate, the Dormouse into the air off all its feet at once, while all the rats and--oh dear!'' cried Alice, with a lobster as a cushion, resting their elbows on it, (''which certainly was not a VERY unpleasant state of mind, she turned the corner, but the Gryphon replied very gravely. ''What else have you executed.'' The miserable Hatter dropped his teacup instead of onions.'' Seven flung down his brush, and had to fall a long sleep you''ve had!'' ''Oh, I''ve had such a thing before, and he went on to himself as he spoke. ''A cat may look at it!'' This speech caused a remarkable sensation among the branches, and every now and then; such as, ''Sure, I don''t take this child away with me,'' thought Alice, ''it''ll never do to come yet, please your Majesty!'' the soldiers had to stoop to save her neck from being broken. She hastily put down yet, before the trial''s over!'' thought Alice. ''I''m glad they''ve begun asking riddles.--I believe I can say.'' This was quite a long tail, certainly,'' said Alice, timidly; ''some of the Mock Turtle. ''Certainly not!'' said Alice to herself, ''after such a nice soft thing to get in?'' ''There might be hungry, in which you usually see Shakespeare, in the world she was saying, and the constant heavy sobbing of the door began sneezing all at once. ''Give your evidence,'' the King in a piteous tone. And the moral of that is--"Be what you mean,'' said Alice. ''Anything you like,'' said the Hatter: ''as the things between whiles.'' ''Then you should say what you had been jumping about like that!'' But she waited patiently. ''Once,'' said the Cat. ''I''d nearly forgotten that I''ve got to see how he did not like to drop the jar for fear of killing somebody, so managed to swallow a morsel of the Gryphon, sighing in his sleep, ''that "I breathe when I get it home?'' when it had gone. ''Well! I''ve often seen a good deal frightened at the cook, to see that queer little toss of her voice. Nobody moved. ''Who cares for fish, Game, or any other dish? Who would not join the dance? Will you, won''t you join the dance? Will you, won''t you join the dance?"'' ''Thank you, sir, for your walk!" "Coming in a few yards off. The Cat only grinned a little snappishly. ''You''re enough to try the experiment?'' ''HE might bite,'' Alice cautiously replied: ''but I haven''t been invited yet.'' ''You''ll see me there,'' said the Gryphon. ''I''ve forgotten the Duchess said in a sulky tone, as it could go, and broke to pieces against one of them at dinn--'' she checked herself hastily. ''I don''t quite understand you,'' she said, by way of settling all difficulties, great or small. ''Off with her head!'' the Queen till she had put on one knee as he wore his crown.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 2); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (2, 'Soc7hNmD1luvRqJb1xcqgEAwLDOzSeO7qN0hdQ0tMOBZUjAwEkH492JWzS8beEfCndtiluat2VUhKOeT6aMO6v3u6BzNjWLvmXXZxLCt44uXfz-mZ2sm2Pg-1A0uGvgO', 'Dolor commodi cumque illum et.', 1, 'I''m a hatter.'' Here the Queen in front of them, with her arms round it as you go on? It''s by far the most interesting, and perhaps as this before, never! And I declare it''s too bad, that it is!'' As she said to Alice; and Alice was very uncomfortable, and, as there was not quite like the three were all ornamented with hearts. Next came the royal children, and make out which were the verses on his knee, and the words ''DRINK ME'' beautifully printed on it were white, but there was silence for some while in silence. At last the Gryphon repeated impatiently: ''it begins "I passed by his face only, she would get up and repeat something now. Tell her to begin.'' For, you see, because some of them attempted to explain the paper. ''If there''s no use denying it. I suppose Dinah''ll be sending me on messages next!'' And she began shrinking directly. As soon as she could, ''If you can''t take LESS,'' said the Mouse. ''--I proceed. "Edwin and Morcar, the earls of Mercia and Northumbria, declared for him: and even Stigand, the patriotic archbishop of Canterbury, found it made.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 3); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (3, 'SS1LB4tH5utAgI8da3jvBx7JLEL6EhbC8JYDvNiWfKNsAds4AYZmGXIqmHRjcwXNbQOIFwk0YaoGTWoAYWKcHW6biJ8wRedGtj6ySO3mO1kFoUt1VNhSrsA_FgMx8B8R', 'Non nobis repudiandae eius non. Est veniam rerum officiis.', 0, 'Dormouse go on crying in this affair, He trusts to you to offer it,'' said the Mock Turtle went on. ''We had the best cat in the night? Let me see: four times seven is--oh dear! I shall be a letter, after all: it''s a very decided tone: ''tell her something worth hearing. For some minutes the whole party look so grave and anxious.) Alice could bear: she got to go among mad people,'' Alice remarked. ''Oh, you can''t think! And oh, my poor hands, how is it twelve? I--'' ''Oh, don''t bother ME,'' said Alice aloud, addressing nobody in particular. ''She''d soon fetch it back!'' ''And who are THESE?'' said the Rabbit actually TOOK A WATCH OUT OF ITS WAISTCOAT-POCKET, and looked very uncomfortable. The moment Alice appeared, she was now about a foot high: then she heard a little girl,'' said Alice, and she felt that she ran out of sight: ''but it doesn''t mind.'' The table was a little pattering of footsteps in the distance, screaming with passion. She had not long to doubt, for the first verse,'' said the Mouse, getting up and straightening itself out again, and the other players, and shouting ''Off with her head! Off--'' ''Nonsense!'' said Alice, as she was not a mile high,'' said Alice. ''Call it what you mean,'' the March Hare interrupted in a hurry: a large piece out of sight before the trial''s begun.'' ''They''re putting down their names,'' the Gryphon hastily. ''Go on with the bread-and-butter getting so used to it!'' pleaded poor Alice. ''But you''re so easily offended!'' ''You''ll get used to do:-- ''How doth the little--"'' and she could remember them, all these strange Adventures of hers would, in the other. ''I beg pardon, your Majesty,'' the Hatter began, in a whisper.) ''That would be four thousand miles down, I think--'' (she was obliged to say than his first remark, ''It was the Hatter. ''It isn''t mine,'' said the youth, ''and your jaws are too weak For anything tougher than suet; Yet you turned a back-somersault in at once.'' However, she got back to finish his story. CHAPTER IV. The Rabbit Sends in a tone of great surprise. ''Of course you know what they''re about!'' ''Read them,'' said the Hatter. ''You MUST remember,'' remarked the King, with an anxious look at the door-- Pray, what is the same size for going through the glass, and she grew no larger: still it had some kind of sob, ''I''ve tried the little glass box that was linked into hers began to repeat it, but her head pressing against the roof off.'' After a time there were three gardeners instantly jumped up, and began whistling. ''Oh, there''s no use in crying like that!'' But she went on. ''Or would you like the Mock Turtle. ''She can''t explain MYSELF, I''m afraid, but you might catch a bad cold if she did so, very carefully, with one of the trees behind him. ''--or next day, maybe,'' the Footman continued in the sea. But they HAVE their tails in their proper places--ALL,'' he repeated with great curiosity, and this Alice thought to herself. (Alice had been to the executioner: ''fetch her here.'' And the moral of that dark hall, and wander about among those beds of bright flowers and the other two were using.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 5); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (4, 'MiJcIMhnKGsT8_JK9IQmmp_Z7iFnGWaiVl2dr2I3Zj8JOKh9AgVKpZoyLq3_B9vf1DvtG0lhLNSsF03t_MePM6YlbS1dlyZZTYWBjzfmY4FqT0Dh7O5HrPCokooVVVQe', 'Non dolor eos facere et.', 0, 'WAS a curious dream, dear, certainly: but now run in to your little boy, And beat him when he pleases!'' CHORUS. ''Wow! wow! wow!'' ''Here! you may stand down,'' continued the Gryphon. ''I mean, what makes them sour--and camomile that makes people hot-tempered,'' she went on to himself in an undertone to the door, and tried to fancy to herself ''Now I can go back by railway,'' she said to the shore. CHAPTER III. A Caucus-Race and a large mustard-mine near here. And the muscular strength, which it gave to my jaw, Has lasted the rest of the Lobster Quadrille?'' the Gryphon in an offended tone. And she began fancying the sort of lullaby to it as you liked.'' ''Is that all?'' said the Caterpillar decidedly, and he called the Queen, tossing her head on her face in her life before, and she hurried out of sight: then it chuckled. ''What fun!'' said the Gryphon. ''Well, I can''t put it in a low, timid voice, ''If you didn''t sign it,'' said Alice thoughtfully: ''but then--I shouldn''t be hungry for it, while the Mock Turtle said with a bound into the earth. At last the Mouse, who was reading the list of singers. ''You may not have lived much under the circumstances. There was a long silence after this, and after a few minutes that she wasn''t a bit of mushroom, and crawled away in the.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 6); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (5, 'YcVobhI00iiZnD8YB1_4FdYssSogZGk3Kxo8_haJnuqFwiuKit1NE4p_P4COqwP4Bj2KEA2RAvJzrtvDZUYxUJ6o40TFuiIpRHzEtKUCpnCpqoUXurDOkblCIq6GyLiv', 'Vero dolorem numquam dolorum non eaque laboriosam ducimus.', 0, 'Duchess, the Duchess! Oh! won''t she be savage if I''ve been changed for any of them. However, on the hearth and grinning from ear to ear. ''Please would you tell me,'' said Alice, and she grew no larger: still it was a dispute going on between the executioner, the King, ''or I''ll have you executed on the trumpet, and then the other, saying, in a low curtain she had never been so much contradicted in her face, and large eyes full of the what?'' said the Hatter, ''you wouldn''t talk about trouble!'' said the Mock Turtle sighed deeply, and began, in a voice she had hoped) a fan and gloves. ''How queer it seems,'' Alice said with some difficulty, as it was very hot, she kept on puzzling about it while the Mouse heard this, it turned a corner, ''Oh my ears and the words a little, ''From the Queen. ''Well, I should think it so VERY nearly at the thought that she ran across the garden, called out in a languid, sleepy voice. ''Who are YOU?'' Which brought them back again to the jury, who instantly made a dreadfully ugly child: but it said nothing. ''When we were little,'' the Mock Turtle sighed deeply, and began, in a twinkling! Half-past one, time for dinner!'' (''I only wish people knew that: then they both bowed low, and their slates and pencils had been looking at them with one eye; ''I seem to see it quite plainly through the little golden key, and Alice''s elbow was pressed so closely against her foot, that there was no time she''d have everybody executed, all round. (It was this last remark, ''it''s a vegetable. It doesn''t look like it?'' he said, turning to Alice, very much what would happen next. The first thing I''ve got to come once a week: HE taught us Drawling, Stretching, and Fainting in Coils.'' ''What was THAT like?'' said Alice. ''Come, let''s hear some of the tail, and ending with the end of the trees upon her arm, with its tongue hanging out of the cupboards as she spoke--fancy CURTSEYING as you''re falling through the little golden key, and Alice''s first thought was that it seemed quite natural); but when the White Rabbit, who was sitting on the other side. The further off from England the nearer is to France-- Then turn not pale, beloved snail, but come and join the dance?"'' ''Thank you, sir, for your walk!" "Coming in a loud, indignant voice, but she did not sneeze, were the two creatures, who had been all the rest, Between yourself and me.'' ''That''s the reason is--'' here the conversation a little. ''''Tis so,'' said the Footman, and began staring at the Queen, who was reading the list of singers. ''You may not have lived much under the sea--'' (''I haven''t,'' said Alice)--''and perhaps you haven''t found it so VERY remarkable in that; nor did Alice think it so VERY tired of sitting by her sister sat still just as if she had accidentally upset the week before. ''Oh, I know!'' exclaimed Alice, who had been looking over their shoulders, that all the things being alive; for instance, there''s the arch I''ve got back to the porpoise, "Keep back, please: we don''t want YOU with us!"'' ''They were learning to draw, you know--'' She had quite a conversation of it now in sight, hurrying down it. There could be beheaded, and that makes them sour--and camomile that makes people hot-tempered,'' she went out, but it had VERY long claws and a pair of boots every Christmas.'' And she squeezed.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 8); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (6, 'LnYwm21c4P2qx_TjctMKDoUJVZdTaCEAC6ZUAJQNeJta_T_Q7rPtcT3mdGXBxOEPNl94ZoURHoQb4tmqXH3nA8xo_s9WgnEH4gzD25A_E0DLsoTExXtTj7IiLELtTd58', 'Recusandae autem quam maiores delectus esse eum eaque et.', 0, 'I''m sure I can''t quite follow it as a cushion, resting their elbows on it, and very soon had to sing this:-- ''Beautiful Soup, so rich and green, Waiting in a confused way, ''Prizes! Prizes!'' Alice had not gone (We know it was sneezing and howling alternately without a cat! It''s the most curious thing I ask! It''s always six o''clock now.'' A bright idea came into her eyes; and once again the tiny hands were clasped upon her knee, and looking at Alice the moment she quite forgot how to set about it; and while she was now more than Alice could hardly hear the rattle of the bread-and-butter. Just at this moment Alice appeared, she was considering in her French lesson-book. The Mouse only growled in reply. ''That''s right!'' shouted the Queen. ''You make me smaller, I suppose.'' So she set to work very carefully, nibbling first at one end to the fifth bend, I think?'' he said to Alice, and sighing. ''It IS a Caucus-race?'' said Alice; not that she looked down at her hands, wondering if anything would EVER happen in a trembling voice to its feet, ran round the refreshments!'' But there seemed to quiver all over with William the Conqueror.'' (For, with all their simple joys, remembering her own mind (as well as she wandered about in all my life, never!'' They had not long to doubt, for the Dormouse,'' thought Alice; ''but when you throw them, and he called the Queen, who had spoken first. ''That''s none of YOUR adventures.'' ''I could tell you my adventures--beginning from this side of WHAT?'' thought Alice; ''but when you throw them, and all sorts of things--I can''t remember things as I was thinking I should think you can find them.'' As she said this she looked down into its mouth open, gazing up into the jury-box, or they would call after her: the last few minutes she heard the Rabbit came up to her lips. ''I know what to uglify is, you know. Come on!'' So they went up to her ear, and whispered ''She''s under sentence of execution.'' ''What for?'' said Alice. ''Come, let''s hear some of them with the lobsters to the other, and making faces at him as he spoke. ''A cat may look at all like the wind, and the shrill voice of the cattle in the air. Even the Duchess was VERY ugly; and secondly, because they''re making such VERY short remarks, and she felt that she was a very long silence, broken only by an occasional exclamation of ''Hjckrrh!'' from the sky! Ugh, Serpent!'' ''But I''m NOT a serpent!'' said Alice very meekly: ''I''m growing.'' ''You''ve no right to grow up again! Let me see: I''ll give them a new idea to Alice, they all crowded round her, about the reason and all must have got in as well,'' the Hatter went on, looking anxiously round to see it.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 4); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (7, '5jfQZ3gqLvu0Q-sJqXTGcHW5niY7nQnOesRE73xJMRmgZSCEWJXQSFayuMwBBC3v9QZ4cUqqZETJWgBQiS91isAg1MMIeRTgz06LE_ek9AJ3F2VHg_oQDrWAeZFZAtSD', 'Praesentium eos molestiae saepe ad dolore omnis sunt.', 1, 'I''m not Ada,'' she said, ''and see whether it''s marked "poison" or not''; for she felt that it felt quite unhappy at the sudden change, but she thought it over afterwards, it occurred to her feet, for it to annoy, Because he knows it teases.'' CHORUS. (In which the words ''DRINK ME,'' but nevertheless she uncorked it and put it right; ''not that it signifies much,'' she said to Alice, very earnestly. ''I''ve had nothing yet,'' Alice replied in a sulky tone; ''Seven jogged my elbow.'' On which Seven looked up eagerly, half hoping that they couldn''t get them out of that is, but I shall only look up and say "How doth the little passage: and THEN--she found herself falling down a very curious to know your history, she do.'' ''I''ll tell it her,'' said the Cat, ''if you don''t like it, yer honour, at all, as the question was evidently meant for her. ''Yes!'' shouted Alice. ''Come on, then!'' roared the Queen, and in a deep, hollow tone: ''sit down, both of you, and listen to me! When I used to it in her brother''s Latin Grammar, ''A mouse--of a mouse--to a mouse--a mouse--O mouse!'') The Mouse only shook its head impatiently, and said, very gravely, ''I think.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 1); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (8, 'yEU6e4GR7j_qK71471NK-BF2VwqjKT_9y4ZHiKWmhUSazLykv_r_cCTvlPn3FJfrsXOOW91vwLpuLuFnq-PbpXYkZiLh7TjJecEVq643kDqGlgQMcGhNpEGerQws1q7O', 'Aut qui fugiat consequuntur.', 1, 'Alice, rather doubtfully, as she swam nearer to watch them, and just as well wait, as she ran; but the Mouse in the sea. The master was an immense length of neck, which seemed to have no idea what to do, and perhaps after all it might injure the brain; But, now that I''m doubtful about the reason of that?'' ''In my youth,'' said his father, ''I took to the Mock Turtle, ''Drive on, old fellow! Don''t be all day to day.'' This was not a bit hurt, and she crossed her hands up to her that she was shrinking rapidly; so she went to the shore, and then keep tight hold of its mouth, and addressed her in the distance would take the hint; but the Mouse replied rather impatiently: ''any shrimp could have been ill.'' ''So they were,'' said the King replied. Here the other ladder?--Why, I hadn''t drunk quite so much!'' Alas! it was impossible to say to itself, ''Oh dear! Oh dear! I wish you could manage it?) ''And what an ignorant little girl she''ll think me for a long breath, and said nothing. ''When we were little,'' the Mock Turtle would be so kind,'' Alice replied, so eagerly that the Mouse with an air of great surprise. ''Of course not,'' Alice cautiously replied, not feeling at all fairly,'' Alice began, in a trembling voice, ''Let us get to twenty at that rate! However, the Multiplication Table doesn''t signify: let''s try the first question, you know.'' He was looking.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 3); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (9, 'CAUKDjr3OndxkpMi16SehwAb6inVNrm0SF6VGF1iCzPpCKlm-5ZhPHBSL8mIQP9zVYs6UcmWWglHg0bXjT4otl1q0jXxK9oJomGJ7YZmwVGuqk3RCJFIPwhUC6LC3uo-', 'Rerum enim itaque enim fugiat inventore.', 1, 'The Mouse looked at it uneasily, shaking it every now and then; such as, ''Sure, I don''t keep the same height as herself; and when she had nothing yet,'' Alice replied eagerly, for she was saying, and the little golden key and hurried off to the other: the Duchess to play croquet.'' The Frog-Footman repeated, in the lap of her ever getting out of sight before the officer could get to the jury, in a low voice, ''Your Majesty must cross-examine the next witness.'' And he added looking angrily at the Queen, turning purple. ''I won''t!'' said Alice. ''Come on, then,'' said Alice, feeling very glad to do that,'' said Alice. ''I''ve read that in some alarm. This time there were no arches left, and all sorts of little Alice and all must have been that,'' said Alice. ''Well, then,'' the Gryphon replied very solemnly. Alice was too slippery; and when she went back to the Knave was standing before them, in chains, with a knife, it usually bleeds; and she jumped up and beg for its dinner, and all the things I used to it in a melancholy air, and, after glaring at her side. She was moving them about as she added, to herself, as usual. ''Come, there''s no use going back to finish his story. CHAPTER IV. The Rabbit Sends in a hurry. ''No, I''ll look first,'' she said, by way of settling all difficulties, great or small. ''Off with their heads!'' and the other side, the puppy made another rush at the Gryphon went on, ''I must be Mabel after all, and I never understood what it might not escape again, and made a snatch in the middle, wondering how she would have called him a fish)--and rapped loudly at the thought that it was YOUR table,'' said Alice; ''it''s laid for a minute or two sobs choked his voice. ''Same as if she was quite surprised to find her way through the little glass table. ''Now, I''ll manage better this time,'' she said, as politely as she fell very slowly, for she was coming to, but it just grazed his nose, you know?'' ''It''s the thing yourself, some winter day, I will prosecute YOU.--Come, I''ll take no denial; We must have been ill.'' ''So they were,'' said the March Hare went on. Her listeners were perfectly quiet till she got to do,'' said the Cat: ''we''re all mad here. I''m mad. You''re mad.'' ''How do you want to stay in here any longer!'' She waited for some minutes. The Caterpillar and Alice looked all round her at the righthand bit again, and did not venture to ask them what the flame of a book,'' thought Alice to herself, ''to be going messages for a minute, trying to explain it is to give the hedgehog to, and, as the other.'' As soon as there seemed to be sure! However, everything is to-day! And yesterday things went on at last, more calmly, though still sobbing a little timidly, for she felt a little house in it about four inches deep and reaching half down the chimney, has he?'' said Alice to herself. (Alice had been to her, ''if we had the dish as its share of the earth. Let me see: four times five is twelve, and four times six is.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 7); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (10, '4AdnoiqLp20kNTlT50ZDY4rpjT6fLiEaTfRwQBg0O2SIgplhZwZGJrTdwzXJ7hUt1bhm4j4U4UsFkJRDSNskKthEi-B6zJzSGJ6YCCwsufLlh_ETNsayfcnT-oMT9g8G', 'Aut vel aut molestias ut eos.', 0, 'Majesty,'' said Two, in a melancholy air, and, after folding his arms and frowning at the March Hare. ''Exactly so,'' said Alice. ''I''m glad I''ve seen that done,'' thought Alice. ''I''ve tried every way, and then quietly marched off after the others. ''We must burn the house if it makes me grow large again, for really I''m quite tired of sitting by her sister kissed her, and said, very gravely, ''I think, you ought to be no use in waiting by the Queen merely remarking that a red-hot poker will burn you if you were never even spoke to Time!'' ''Perhaps not,'' Alice cautiously replied, not feeling at all fairly,'' Alice began, in a moment. ''Let''s go on in the sky. Twinkle, twinkle--"'' Here the Queen said severely ''Who is it twelve? I--'' ''Oh, don''t talk about trouble!'' said the Mouse. ''Of course,'' the Gryphon went on. Her listeners were perfectly quiet till she shook the house, and wondering whether she could not think of anything to put it in a long, low hall, which was immediately suppressed by the end of the jurors had a consultation about this, and Alice joined the procession, wondering very much to-night, I should say "With what porpoise?"'' ''Don''t you mean that you couldn''t cut off a little timidly: ''but it''s no use in waiting by the end of the Lobster Quadrille, that she was shrinking rapidly; so she went on again: ''Twenty-four hours, I THINK; or is it I can''t see you?'' She was close behind us, and he''s treading on my tail. See how eagerly the lobsters and the sound of a tree. ''Did you say it.'' ''That''s nothing to what I eat" is the same year for such a nice soft thing to nurse--and she''s such a rule at processions; ''and besides, what would happen next. ''It''s--it''s a very good height indeed!'' said the King: ''however, it may kiss my hand if it had fallen into it: there was nothing so VERY wide, but she was shrinking rapidly; so she turned to the part about her pet: ''Dinah''s our cat. And she''s such a hurry to get in at all?'' said the Queen, but she remembered having seen such a dear quiet thing,'' Alice went on, spreading out the verses the White Rabbit put on his spectacles. ''Where shall I begin, please your Majesty,'' said Two, in a frightened tone. ''The Queen of Hearts, he stole those tarts, And took them quite away!'' ''Consider your verdict,'' the King said, turning to the jury, of course--"I GAVE HER ONE, THEY GAVE HIM TWO--" why, that must be a walrus or hippopotamus, but then she had this fit) An obstacle that came between Him, and ourselves, and it. Don''t let me hear the words:-- ''I speak severely to my jaw, Has lasted the rest were quite silent, and looked anxiously at the March Hare meekly replied. ''Yes, but I can''t put it in time,'' said the Mock Turtle went on. ''Or would you like the Queen?'' said the Caterpillar sternly. ''Explain yourself!'' ''I can''t explain MYSELF, I''m afraid, sir'' said Alice, ''how am I to do such a tiny golden key, and unlocking the door between us. For instance, suppose it were white, but.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 7); +INSERT INTO post (id, slug, title, status, content, created_at, updated_at, user_id) VALUES (11, 'LIkxj50Kp4PE4vlRW2RyayTKGTmJNsFdckr9TYeVDBAMjTSSXiqITlQudv7Eozhy9vUBzwgU2FuXSdCv_bagBOoGlu_Xa3myOIFn7tmbs2HRzKNl4Nv5T2vuIFjjTH9-', 'Eveniet est nam sapiente odit architecto et.', 1, 'Alice replied thoughtfully. ''They have their tails in their paws. ''And how do you know the song, perhaps?'' ''I''ve heard something like this:-- ''Fury said to Alice. ''Nothing,'' said Alice. ''I''ve so often read in the distance. ''Come on!'' cried the Gryphon, and the second verse of the shelves as she went nearer to make it stop. ''Well, I''d hardly finished the guinea-pigs!'' thought Alice. ''I wonder what you''re at!" You know the meaning of half an hour or so, and giving it a violent shake at the window, and some of them even when they passed too close, and waving their forepaws to mark the time, while the rest of the court. (As that is rather a handsome pig, I think.'' And she squeezed herself up on tiptoe, and peeped over the fire, and at once to eat some of the fact. ''I keep them to sell,'' the Hatter began, in a very truthful child; ''but little girls in my kitchen AT ALL. Soup does very well without--Maybe it''s always pepper that had a bone in his sleep, ''that "I breathe when I get SOMEWHERE,'' Alice added as an explanation; ''I''ve none of YOUR business, Two!'' said Seven. ''Yes, it IS his business!'' said Five, ''and I''ll tell him--it was for bringing the cook was leaning over the wig, (look at the Queen, the royal children; there were any tears. No, there were TWO little shrieks, and more faintly came, carried on the top of her going, though she felt a violent blow underneath her chin: it had a little snappishly. ''You''re enough to drive one crazy!'' The Footman seemed to have no answers.'' ''If you didn''t like cats.'' ''Not like cats!'' cried the Mouse, who was a large canvas bag, which tied up at the bottom of a tree a few minutes it puffed away without being seen, when she got to see a little glass table. ''Now, I''ll manage better this time,'' she said to herself; ''I should like to be no chance of getting her hands on her lap as if nothing had happened. ''How am I to get out of sight, he said in a court of justice before, but she thought it must be on the twelfth?'' Alice went on, looking anxiously about her. ''Oh, do let me hear the words:-- ''I speak severely to my right size to do it?'' ''In my youth,'' said the Hatter added as an explanation. ''Oh, you''re sure to do anything but sit with its wings. ''Serpent!'' screamed the Gryphon. ''Then, you know,'' said the Pigeon; ''but I must be collected at once and put back into the garden door. Poor Alice! It was so full of tears, but said nothing. ''This here young lady,'' said the Cat. ''I said pig,'' replied Alice; ''and I wish I could not be denied, so she began nursing her child again, singing a sort of people live about here?'' ''In THAT direction,'' the Cat said, waving its tail when it''s pleased. Now I growl when I''m pleased, and wag my tail when I''m pleased, and wag my tail when it''s angry, and wags its tail about in all their simple joys, remembering her own mind (as well as she went on, looking anxiously about her. ''Oh, do let me hear the rattle of the shepherd boy--and the sneeze of the ground, Alice soon began talking again. ''Dinah''ll miss me very much what would happen next. First, she tried to curtsey as she could not even get her head impatiently; and, turning to Alice, and looking anxiously round to see if there are, nobody attends to them--and you''ve no idea what Latitude or Longitude I''ve got to?'' (Alice had no reason to be Number One,'' said Alice. ''Why?'' ''IT DOES THE BOOTS AND SHOES.'' the Gryphon went on again:-- ''You may go,'' said the Hatter: ''but you could only hear whispers now and then, if I chose,'' the Duchess by this time, and was going off into a sort of a well?'' ''Take some more of the table, but there was a very small cake, on which the cook was busily stirring the soup, and seemed to Alice severely. ''What are they made of?'' Alice asked in a great thistle, to keep herself from being run over; and the March Hare will be much the same thing as "I get what I like"!'' ''You might.', '2020-07-26 20:18:16', '2020-07-26 20:18:17', 4); \ No newline at end of file diff --git a/tests/Support/FunctionalTester.php b/blog-api/tests/Support/FunctionalTester.php similarity index 90% rename from tests/Support/FunctionalTester.php rename to blog-api/tests/Support/FunctionalTester.php index 49434042a..d494710d2 100644 --- a/tests/Support/FunctionalTester.php +++ b/blog-api/tests/Support/FunctionalTester.php @@ -7,7 +7,7 @@ use Codeception\Actor; /** - * Inherited Methods + * Inherited Methods. * * @method void wantToTest($text) * @method void wantTo($text) @@ -21,12 +21,12 @@ * @method void pause() * * @SuppressWarnings(PHPMD) -*/ + */ class FunctionalTester extends Actor { use _generated\FunctionalTesterActions; /** - * Define custom actions here + * Define custom actions here. */ } diff --git a/tests/Support/Helper/Acceptance.php b/blog-api/tests/Support/Helper/Acceptance.php similarity index 100% rename from tests/Support/Helper/Acceptance.php rename to blog-api/tests/Support/Helper/Acceptance.php diff --git a/blog-api/tests/Support/Helper/Cli.php b/blog-api/tests/Support/Helper/Cli.php new file mode 100644 index 000000000..d459f5cc5 --- /dev/null +++ b/blog-api/tests/Support/Helper/Cli.php @@ -0,0 +1,14 @@ +load(); + +$_ENV['YII_ENV'] = empty($_ENV['YII_ENV']) ? null : (string) $_ENV['YII_ENV']; +$_SERVER['YII_ENV'] = $_ENV['YII_ENV']; + +$_ENV['YII_DEBUG'] = filter_var( + !empty($_ENV['YII_DEBUG']) ? $_ENV['YII_DEBUG'] : true, + FILTER_VALIDATE_BOOLEAN, + FILTER_NULL_ON_FAILURE +) ?? true; +$_SERVER['YII_DEBUG'] = $_ENV['YII_DEBUG']; diff --git a/codeception.yml b/blog/codeception.yml similarity index 100% rename from codeception.yml rename to blog/codeception.yml diff --git a/composer.json b/blog/composer.json similarity index 100% rename from composer.json rename to blog/composer.json diff --git a/config/.gitignore b/blog/config/.gitignore similarity index 100% rename from config/.gitignore rename to blog/config/.gitignore diff --git a/config/rbac-rules.php b/blog/config/bootstrap-console.php similarity index 100% rename from config/rbac-rules.php rename to blog/config/bootstrap-console.php diff --git a/config/widgets.php b/blog/config/bootstrap-web.php similarity index 100% rename from config/widgets.php rename to blog/config/bootstrap-web.php diff --git a/blog/config/bootstrap.php b/blog/config/bootstrap.php new file mode 100644 index 000000000..0dae23dee --- /dev/null +++ b/blog/config/bootstrap.php @@ -0,0 +1,5 @@ + static function (DatabaseManager $dbManager, Spiral\Core\FactoryInterface $factory) { + return new Factory( + $dbManager, + null, + $factory, + new DoctrineCollectionFactory() + ); + }, +]; diff --git a/blog/config/common/logger.php b/blog/config/common/logger.php new file mode 100644 index 000000000..b49b94ba0 --- /dev/null +++ b/blog/config/common/logger.php @@ -0,0 +1,21 @@ + [ + 'class' => Logger::class, + '__construct()' => [ + 'targets' => ReferencesArray::from([ + FileTarget::class, + ]), + ], + ], +]; diff --git a/blog/config/common/psr17.php b/blog/config/common/psr17.php new file mode 100644 index 000000000..9787bb293 --- /dev/null +++ b/blog/config/common/psr17.php @@ -0,0 +1,25 @@ + RequestFactory::class, + ServerRequestFactoryInterface::class => ServerRequestFactory::class, + ResponseFactoryInterface::class => ResponseFactory::class, + StreamFactoryInterface::class => StreamFactory::class, + UriFactoryInterface::class => UriFactory::class, + UploadedFileFactoryInterface::class => UploadedFileFactory::class, +]; diff --git a/config/common/rbac.php b/blog/config/common/rbac.php similarity index 100% rename from config/common/rbac.php rename to blog/config/common/rbac.php index f5a3dafb0..9d663e583 100644 --- a/config/common/rbac.php +++ b/blog/config/common/rbac.php @@ -3,11 +3,11 @@ declare(strict_types=1); use Yiisoft\Access\AccessCheckerInterface; +use Yiisoft\Rbac\AssignmentsStorageInterface; +use Yiisoft\Rbac\ItemsStorageInterface; use Yiisoft\Rbac\Manager; use Yiisoft\Rbac\Php\AssignmentsStorage; use Yiisoft\Rbac\Php\ItemsStorage; -use Yiisoft\Rbac\AssignmentsStorageInterface; -use Yiisoft\Rbac\ItemsStorageInterface; /** @var array $params */ diff --git a/config/common/router.php b/blog/config/common/router.php similarity index 100% rename from config/common/router.php rename to blog/config/common/router.php index b5a30a6c9..d192a6d17 100644 --- a/config/common/router.php +++ b/blog/config/common/router.php @@ -3,8 +3,8 @@ declare(strict_types=1); use Yiisoft\Config\Config; -use Yiisoft\DataResponse\Middleware\FormatDataResponse; use Yiisoft\Csrf\CsrfMiddleware; +use Yiisoft\DataResponse\Middleware\FormatDataResponse; use Yiisoft\Router\Group; use Yiisoft\Router\RouteCollection; use Yiisoft\Router\RouteCollectionInterface; diff --git a/config/common/sentry.php b/blog/config/common/sentry.php similarity index 100% rename from config/common/sentry.php rename to blog/config/common/sentry.php diff --git a/blog/config/common/translator.php b/blog/config/common/translator.php new file mode 100644 index 000000000..0d140e94b --- /dev/null +++ b/blog/config/common/translator.php @@ -0,0 +1,24 @@ + [ + 'definition' => static function (Aliases $aliases) use ($params) { + return new CategorySource( + $params['yiisoft/translator']['defaultCategory'], + new MessageSource($aliases->get('@messages')), + new IntlMessageFormatter(), + ); + }, + 'tags' => ['translation.categorySource'], + ], +]; diff --git a/blog/config/common/validator.php b/blog/config/common/validator.php new file mode 100644 index 000000000..a38539e44 --- /dev/null +++ b/blog/config/common/validator.php @@ -0,0 +1,12 @@ + RuleHandlerContainer::class, +]; diff --git a/config/console/translator-extractor.php b/blog/config/console/translator-extractor.php similarity index 100% rename from config/console/translator-extractor.php rename to blog/config/console/translator-extractor.php index c4685bbcc..39d9b7181 100644 --- a/config/console/translator-extractor.php +++ b/blog/config/console/translator-extractor.php @@ -5,8 +5,8 @@ use Yiisoft\Aliases\Aliases; use Yiisoft\Definitions\DynamicReference; use Yiisoft\Translator\Message\Php\MessageSource; -use Yiisoft\TranslatorExtractor\Extractor; use Yiisoft\TranslatorExtractor\CategorySource as ExtractorCategorySource; +use Yiisoft\TranslatorExtractor\Extractor; /** @var array $params */ diff --git a/blog/config/delegates-console.php b/blog/config/delegates-console.php new file mode 100644 index 000000000..0dae23dee --- /dev/null +++ b/blog/config/delegates-console.php @@ -0,0 +1,5 @@ + [ // Uncomment next line to enable a Schema caching in the common cache diff --git a/blog/config/prod/params.php b/blog/config/prod/params.php new file mode 100644 index 000000000..0dae23dee --- /dev/null +++ b/blog/config/prod/params.php @@ -0,0 +1,5 @@ +routes( Route::get('/') - ->action([\App\Backend\Controller\SiteController::class, 'index']) + ->action([SiteController::class, 'index']) ->name('index'), ) ->host('backend.{_host}') ->namePrefix('backend/'), Route::get('/backend') - ->action([\App\Backend\Controller\SiteController::class, 'index']) + ->action([SiteController::class, 'index']) ->name('index'), ]; diff --git a/config/routes.php b/blog/config/routes.php similarity index 95% rename from config/routes.php rename to blog/config/routes.php index c892ba3ed..118f399b4 100644 --- a/config/routes.php +++ b/blog/config/routes.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use App\Auth\Controller\AuthController; +use App\Auth\Controller\SignupController; use App\Blog\Archive\ArchiveController; use App\Blog\BlogController; use App\Blog\CommentController; @@ -10,8 +12,6 @@ use App\Blog\Tag\TagController; use App\Contact\ContactController; use App\Controller\Actions\ApiInfo; -use App\Auth\Controller\AuthController; -use App\Auth\Controller\SignupController; use App\Controller\SiteController; use App\Middleware\AccessChecker; use App\Middleware\ApiDataWrapper; @@ -103,8 +103,7 @@ // Index Route::get('[/page{page:\d+}]') ->middleware( - fn (HttpCache $httpCache, PostRepository $postRepository) => - $httpCache->withLastModified(function (ServerRequestInterface $request, $params) use ($postRepository) { + fn (HttpCache $httpCache, PostRepository $postRepository) => $httpCache->withLastModified(function (ServerRequestInterface $request, $params) use ($postRepository) { return $postRepository ->getMaxUpdatedAt() ->getTimestamp(); @@ -127,9 +126,9 @@ // Post page Route::get('/page/{slug}') ->middleware( - fn (HttpCache $httpCache, PostRepository $postRepository, CurrentRoute $currentRoute) => - $httpCache->withEtagSeed(function (ServerRequestInterface $request, $params) use ($postRepository, $currentRoute) { + fn (HttpCache $httpCache, PostRepository $postRepository, CurrentRoute $currentRoute) => $httpCache->withEtagSeed(function (ServerRequestInterface $request, $params) use ($postRepository, $currentRoute) { $post = $postRepository->findBySlug($currentRoute->getArgument('slug')); + return $post->getSlug() . '-' . $post ->getUpdatedAt() ->getTimestamp(); diff --git a/blog/config/test/params.php b/blog/config/test/params.php new file mode 100644 index 000000000..0dae23dee --- /dev/null +++ b/blog/config/test/params.php @@ -0,0 +1,5 @@ + function (Aliases $aliases) { $cache = new FileCache($aliases->get('@runtime/rate-limiter')); + return new SimpleCacheStorage($cache); }, CounterInterface::class => [ diff --git a/blog/config/widgets.php b/blog/config/widgets.php new file mode 100644 index 000000000..0dae23dee --- /dev/null +++ b/blog/config/widgets.php @@ -0,0 +1,5 @@ + + + + + + + + + + ./tests + + + + + + ./src + + + diff --git a/psalm.xml b/blog/psalm.xml similarity index 100% rename from psalm.xml rename to blog/psalm.xml diff --git a/blog/public/.htaccess b/blog/public/.htaccess new file mode 100644 index 000000000..a82a91fb5 --- /dev/null +++ b/blog/public/.htaccess @@ -0,0 +1,12 @@ +# use mod_rewrite for pretty URL support +RewriteEngine on + +# if $showScriptName is false in UrlManager, do not allow accessing URLs with script name +RewriteRule ^index.php/ - [L,R=404] + +# If a directory or a file exists, use the request directly +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d + +# Otherwise forward the request to index.php +RewriteRule . index.php diff --git a/blog/public/assets/.gitignore b/blog/public/assets/.gitignore new file mode 100755 index 000000000..d6b7ef32c --- /dev/null +++ b/blog/public/assets/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/blog/public/favicon.ico b/blog/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..580ed732e86556ec57f3f3395a210246d679c076 GIT binary patch literal 318 zcmZQzU<5(|0RbS%!l1#(z#zuJz@P!d0zj+)#2|4HXaJKC0wf0lAEr2iX{M9K3=BR0 y!E90pK{x=K$Oz&POT#sS8N$ZKhC)h8ip0_|-T#43{vnSYgXBQCu@O54$pHYIza?e> literal 0 HcmV?d00001 diff --git a/public/index.php b/blog/public/index.php similarity index 100% rename from public/index.php rename to blog/public/index.php diff --git a/blog/public/robots.txt b/blog/public/robots.txt new file mode 100644 index 000000000..6f27bb66a --- /dev/null +++ b/blog/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: \ No newline at end of file diff --git a/resources/asset/css/site.css b/blog/resources/asset/css/site.css similarity index 100% rename from resources/asset/css/site.css rename to blog/resources/asset/css/site.css diff --git a/resources/asset/js/app.js b/blog/resources/asset/js/app.js similarity index 100% rename from resources/asset/js/app.js rename to blog/resources/asset/js/app.js diff --git a/resources/backend/views/site/index.php b/blog/resources/backend/views/site/index.php similarity index 100% rename from resources/backend/views/site/index.php rename to blog/resources/backend/views/site/index.php diff --git a/resources/mail/layouts/html.php b/blog/resources/mail/layouts/html.php similarity index 100% rename from resources/mail/layouts/html.php rename to blog/resources/mail/layouts/html.php diff --git a/resources/messages/en/app.php b/blog/resources/messages/en/app.php similarity index 98% rename from resources/messages/en/app.php rename to blog/resources/messages/en/app.php index 00503b12f..d26e3d3c5 100644 --- a/resources/messages/en/app.php +++ b/blog/resources/messages/en/app.php @@ -1,5 +1,7 @@ 'API', 'gridview.create.at' => 'Create at', diff --git a/resources/messages/id/app.php b/blog/resources/messages/id/app.php similarity index 99% rename from resources/messages/id/app.php rename to blog/resources/messages/id/app.php index 6c9565a6f..2d19202d1 100644 --- a/resources/messages/id/app.php +++ b/blog/resources/messages/id/app.php @@ -1,5 +1,7 @@ 'Lampirkan file', 'email' => 'surel', diff --git a/resources/messages/ru/app.php b/blog/resources/messages/ru/app.php similarity index 99% rename from resources/messages/ru/app.php rename to blog/resources/messages/ru/app.php index c67b7731c..e81ed1584 100644 --- a/resources/messages/ru/app.php +++ b/blog/resources/messages/ru/app.php @@ -1,5 +1,7 @@ 'Авторизоваться', 'gridview.create.at' => 'Дата создания', diff --git a/resources/messages/sk/app.php b/blog/resources/messages/sk/app.php similarity index 99% rename from resources/messages/sk/app.php rename to blog/resources/messages/sk/app.php index a8c3b19a0..6d07f9497 100644 --- a/resources/messages/sk/app.php +++ b/blog/resources/messages/sk/app.php @@ -1,5 +1,7 @@ 'Prihlásiť sa', 'gridview.create.at' => 'Vytvorené', diff --git a/resources/rbac/items.php b/blog/resources/rbac/items.php similarity index 93% rename from resources/rbac/items.php rename to blog/resources/rbac/items.php index 85e03a563..5f887936c 100644 --- a/resources/rbac/items.php +++ b/blog/resources/rbac/items.php @@ -1,5 +1,7 @@ [ 'name' => 'admin', diff --git a/resources/views/auth/login.php b/blog/resources/views/auth/login.php similarity index 92% rename from resources/views/auth/login.php rename to blog/resources/views/auth/login.php index e1abf88fe..7ec710c50 100644 --- a/resources/views/auth/login.php +++ b/blog/resources/views/auth/login.php @@ -11,13 +11,12 @@ use Yiisoft\View\WebView; /** - * @var WebView $this - * @var TranslatorInterface $translator + * @var WebView $this + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var string $csrf - * @var LoginForm $formModel + * @var string $csrf + * @var LoginForm $formModel */ - $this->setTitle($translator->translate('layout.login')); $error = $error ?? null; diff --git a/resources/views/blog/_archive.php b/blog/resources/views/blog/_archive.php similarity index 89% rename from resources/views/blog/_archive.php rename to blog/resources/views/blog/_archive.php index 2644fdb25..521dfa129 100644 --- a/resources/views/blog/_archive.php +++ b/blog/resources/views/blog/_archive.php @@ -4,9 +4,9 @@ /** * @var DataReaderInterface|string[][] $archive - * @var TranslatorInterface $translator - * @var UrlGeneratorInterface $urlGenerator - * @var WebView $this + * @var TranslatorInterface $translator + * @var UrlGeneratorInterface $urlGenerator + * @var WebView $this */ use Yiisoft\Data\Reader\DataReaderInterface; @@ -42,7 +42,7 @@ echo Html::openTag('div', ['class' => 'd-flex justify-content-between align-items-center']); // Print month name echo Html::a( - Date('F', mktime(0, 0, 0, (int)$month, 1, (int)$year)), + date('F', mktime(0, 0, 0, (int) $month, 1, (int) $year)), $urlGenerator->generate('blog/archive/month', [ 'year' => $year, 'month' => $month, diff --git a/resources/views/blog/_topTags.php b/blog/resources/views/blog/_topTags.php similarity index 82% rename from resources/views/blog/_topTags.php rename to blog/resources/views/blog/_topTags.php index 2b002a0db..f0a3dcc0f 100644 --- a/resources/views/blog/_topTags.php +++ b/blog/resources/views/blog/_topTags.php @@ -4,9 +4,9 @@ /** * @var DataReaderInterface|string[][] $tags - * @var TranslatorInterface $translator - * @var UrlGeneratorInterface $urlGenerator - * @var WebView $this + * @var TranslatorInterface $translator + * @var UrlGeneratorInterface $urlGenerator + * @var WebView $this */ use Yiisoft\Data\Reader\DataReaderInterface; @@ -22,9 +22,9 @@
    'list-group-item d-flex flex-column justify-content-between lh-condensed'] - ); + 'li', + ['class' => 'list-group-item d-flex flex-column justify-content-between lh-condensed'] +); $blockEnd = Html::closeTag('li'); echo $blockBegin; if (count($tags)) { diff --git a/resources/views/blog/archive/index.php b/blog/resources/views/blog/archive/index.php similarity index 90% rename from resources/views/blog/archive/index.php rename to blog/resources/views/blog/archive/index.php index d0a17ef26..a57d97528 100644 --- a/resources/views/blog/archive/index.php +++ b/blog/resources/views/blog/archive/index.php @@ -4,9 +4,9 @@ /** * @var DataReaderInterface|string[][] $archive - * @var TranslatorInterface $translator - * @var UrlGeneratorInterface $urlGenerator - * @var WebView $this + * @var TranslatorInterface $translator + * @var UrlGeneratorInterface $urlGenerator + * @var WebView $this */ use Yiisoft\Data\Reader\DataReaderInterface; @@ -52,7 +52,7 @@ echo Html::openTag('div', ['class' => 'mx-2 my-1']); // Print month name echo Html::a( - Date('F', mktime(0, 0, 0, (int)$month, 1, (int)$year)), + date('F', mktime(0, 0, 0, (int) $month, 1, (int) $year)), $urlGenerator->generate('blog/archive/month', [ 'year' => $year, 'month' => $month, diff --git a/resources/views/blog/archive/monthly-archive.php b/blog/resources/views/blog/archive/monthly-archive.php similarity index 89% rename from resources/views/blog/archive/monthly-archive.php rename to blog/resources/views/blog/archive/monthly-archive.php index 46ee60f2b..24b867a17 100644 --- a/resources/views/blog/archive/monthly-archive.php +++ b/blog/resources/views/blog/archive/monthly-archive.php @@ -3,12 +3,12 @@ declare(strict_types=1); /** - * @var int $year - * @var int $month - * @var OffsetPaginator $paginator - * @var TranslatorInterface $translator + * @var int $year + * @var int $month + * @var OffsetPaginator $paginator + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var WebView $this + * @var WebView $this */ use App\Blog\Entity\Post; diff --git a/resources/views/blog/archive/yearly-archive.php b/blog/resources/views/blog/archive/yearly-archive.php similarity index 88% rename from resources/views/blog/archive/yearly-archive.php rename to blog/resources/views/blog/archive/yearly-archive.php index dd018af91..d9c195014 100644 --- a/resources/views/blog/archive/yearly-archive.php +++ b/blog/resources/views/blog/archive/yearly-archive.php @@ -3,11 +3,11 @@ declare(strict_types=1); /** - * @var int $year - * @var Post[]|DataReaderInterface $items - * @var TranslatorInterface $translator - * @var UrlGeneratorInterface $urlGenerator - * @var WebView $this + * @var int $year + * @var DataReaderInterface|Post[] $items + * @var TranslatorInterface $translator + * @var UrlGeneratorInterface $urlGenerator + * @var WebView $this */ use App\Blog\Entity\Post; @@ -36,7 +36,7 @@ $monthName = ''; /** @var Post $item */ foreach ($items as $item) { - $month = (int)$item + $month = (int) $item ->getPublishedAt() ->format('m'); diff --git a/resources/views/blog/comments/_comments.php b/blog/resources/views/blog/comments/_comments.php similarity index 90% rename from resources/views/blog/comments/_comments.php rename to blog/resources/views/blog/comments/_comments.php index dc8c170ec..c9db5fcf1 100644 --- a/resources/views/blog/comments/_comments.php +++ b/blog/resources/views/blog/comments/_comments.php @@ -9,12 +9,11 @@ use Yiisoft\Translator\TranslatorInterface; /** - * @var KeysetPaginator $data - * @var TranslatorInterface $translator + * @var KeysetPaginator $data + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var AssetManager $assetManager + * @var AssetManager $assetManager */ - ?> read() as $comment) { ?> diff --git a/resources/views/blog/comments/index.php b/blog/resources/views/blog/comments/index.php similarity index 78% rename from resources/views/blog/comments/index.php rename to blog/resources/views/blog/comments/index.php index c86b8d5ce..a65eaaf4a 100644 --- a/resources/views/blog/comments/index.php +++ b/blog/resources/views/blog/comments/index.php @@ -10,13 +10,12 @@ use Yiisoft\View\WebView; /** - * @var KeysetPaginator $data - * @var TranslatorInterface $translator + * @var KeysetPaginator $data + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var AssetManager $assetManager - * @var WebView $this + * @var AssetManager $assetManager + * @var WebView $this */ - $this->setTitle($translator->translate('menu.comments-feed')); ?> diff --git a/resources/views/blog/index.php b/blog/resources/views/blog/index.php similarity index 88% rename from resources/views/blog/index.php rename to blog/resources/views/blog/index.php index cade9eedf..02a88a8ab 100644 --- a/resources/views/blog/index.php +++ b/blog/resources/views/blog/index.php @@ -3,13 +3,13 @@ declare(strict_types=1); /** - * @var OffsetPaginator $paginator; + * @var OffsetPaginator $paginator; * @var DataReaderInterface|string[][] $archive * @var DataReaderInterface|string[][] $tags - * @var TranslatorInterface $translator - * @var UrlGeneratorInterface $urlGenerator - * @var WebView $this - * @var bool $isGuest + * @var TranslatorInterface $translator + * @var UrlGeneratorInterface $urlGenerator + * @var WebView $this + * @var bool $isGuest */ use App\Blog\Entity\Post; @@ -43,7 +43,7 @@ } else { echo Html::p( $translator->translate('layout.no-records') - ); + ); } /** @var Post $item */ foreach ($paginator->read() as $item) { diff --git a/resources/views/blog/post/__form.php b/blog/resources/views/blog/post/__form.php similarity index 82% rename from resources/views/blog/post/__form.php rename to blog/resources/views/blog/post/__form.php index 65db9a427..afed55daa 100644 --- a/resources/views/blog/post/__form.php +++ b/blog/resources/views/blog/post/__form.php @@ -3,14 +3,14 @@ declare(strict_types=1); /** - * @var View $this - * @var TranslatorInterface $translator + * @var View $this + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var array $body - * @var string $csrf - * @var string $action - * @var array $tags - * @var string $title + * @var array $body + * @var string $csrf + * @var string $action + * @var array $tags + * @var string $title */ use Yiisoft\Html\Html; @@ -46,16 +46,16 @@ translate('layout.add'), - ['class' => 'btn btn-primary mt-2', 'id' => 'addTagButton'] - ) ?> + $translator->translate('layout.add'), + ['class' => 'btn btn-primary mt-2', 'id' => 'addTagButton'] +) ?>
    - + - +
    diff --git a/resources/views/blog/post/index.php b/blog/resources/views/blog/post/index.php similarity index 88% rename from resources/views/blog/post/index.php rename to blog/resources/views/blog/post/index.php index 965bee6e7..c42cc3df3 100644 --- a/resources/views/blog/post/index.php +++ b/blog/resources/views/blog/post/index.php @@ -3,12 +3,12 @@ declare(strict_types=1); /** - * @var Post $item - * @var TranslatorInterface $translator + * @var Post $item + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var WebView $this - * @var bool $canEdit - * @var string $slug + * @var WebView $this + * @var bool $canEdit + * @var string $slug */ use App\Blog\Entity\Post; @@ -29,14 +29,14 @@ ->format('H:i:s d.m.Y') ?> by getUser() ->getLogin(), - $urlGenerator->generate('user/profile', ['login' => $item + $urlGenerator->generate('user/profile', ['login' => $item ->getUser() - ->getLogin()]), - ['class' => 'mr-3'] - ); + ->getLogin(), ]), + ['class' => 'mr-3'] + ); if ($canEdit) { echo Html::a( 'Edit', @@ -71,13 +71,13 @@
    getUser() ->getLogin(), - $urlGenerator->generate('user/profile', ['login' => $comment + $urlGenerator->generate('user/profile', ['login' => $comment ->getUser() - ->getLogin()]) - ) ?> + ->getLogin(), ]) + ) ?> created at getCreatedAt() diff --git a/resources/views/blog/tag/index.php b/blog/resources/views/blog/tag/index.php similarity index 89% rename from resources/views/blog/tag/index.php rename to blog/resources/views/blog/tag/index.php index dcb018085..4e6733b4d 100644 --- a/resources/views/blog/tag/index.php +++ b/blog/resources/views/blog/tag/index.php @@ -3,11 +3,11 @@ declare(strict_types=1); /** - * @var OffsetPaginator $paginator; - * @var Tag $item - * @var TranslatorInterface $translator + * @var OffsetPaginator $paginator; + * @var Tag $item + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var WebView $this + * @var WebView $this */ use App\Blog\Entity\Post; diff --git a/resources/views/layout/main.php b/blog/resources/views/layout/main.php similarity index 94% rename from resources/views/layout/main.php rename to blog/resources/views/layout/main.php index 2726ffce4..3751e71f7 100644 --- a/resources/views/layout/main.php +++ b/blog/resources/views/layout/main.php @@ -19,18 +19,18 @@ /** * @var UrlGeneratorInterface $urlGenerator - * @var CurrentRoute $currentRoute - * @var WebView $this - * @var AssetManager $assetManager - * @var TranslatorInterface $translator - * @var string $content + * @var CurrentRoute $currentRoute + * @var WebView $this + * @var AssetManager $assetManager + * @var TranslatorInterface $translator + * @var string $content * * @see \App\ApplicationViewInjection + * * @var User|null $user - * @var string $csrf - * @var string $brandLabel + * @var string $csrf + * @var string $brandLabel */ - $assetManager->register(AppAsset::class); $this->addCssFiles($assetManager->getCssFiles()); @@ -74,9 +74,9 @@ 'label' => $translator->translate('menu.blog'), 'url' => $urlGenerator->generate('blog/index'), 'active' => StringHelper::startsWith( - $currentRouteName, - 'blog/' - ) && $currentRouteName !== 'blog/comment/index', + $currentRouteName, + 'blog/' + ) && $currentRouteName !== 'blog/comment/index', ], [ 'label' => $translator->translate('menu.comments-feed'), @@ -147,7 +147,7 @@ ) ->class('btn btn-primary') . '
    ' - . Form::tag()->close() + . Form::tag()->close(), ], ) ?> diff --git a/resources/views/signup/signup.php b/blog/resources/views/signup/signup.php similarity index 91% rename from resources/views/signup/signup.php rename to blog/resources/views/signup/signup.php index b7be38bd6..491e48f29 100644 --- a/resources/views/signup/signup.php +++ b/blog/resources/views/signup/signup.php @@ -11,13 +11,12 @@ use Yiisoft\View\WebView; /** - * @var WebView $this - * @var TranslatorInterface $translator + * @var WebView $this + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var string $csrf - * @var SignupForm $formModel + * @var string $csrf + * @var SignupForm $formModel */ - $this->setTitle($translator->translate('signup')); ?> diff --git a/resources/views/site/404.php b/blog/resources/views/site/404.php similarity index 88% rename from resources/views/site/404.php rename to blog/resources/views/site/404.php index 5e9e678de..925a7518b 100644 --- a/resources/views/site/404.php +++ b/blog/resources/views/site/404.php @@ -9,12 +9,11 @@ use Yiisoft\View\WebView; /** - * @var TranslatorInterface $translator + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var CurrentRoute $currentRoute - * @var WebView $this + * @var CurrentRoute $currentRoute + * @var WebView $this */ - $this->setTitle($translator->translate('layout.not-found')); ?> @@ -28,7 +27,7 @@ ->getUri() ->getPath()), ['class' => 'text-muted'] - ) + ), ]) ?>

    diff --git a/resources/views/site/index.php b/blog/resources/views/site/index.php similarity index 98% rename from resources/views/site/index.php rename to blog/resources/views/site/index.php index a86090d0a..8e1796bbf 100644 --- a/resources/views/site/index.php +++ b/blog/resources/views/site/index.php @@ -8,9 +8,8 @@ /** * @var TranslatorInterface $translator - * @var WebView $this + * @var WebView $this */ - $this->setTitle('Home'); echo Carousel::widget() diff --git a/resources/views/user/index.php b/blog/resources/views/user/index.php similarity index 96% rename from resources/views/user/index.php rename to blog/resources/views/user/index.php index d5e4cec82..04c0b253e 100644 --- a/resources/views/user/index.php +++ b/blog/resources/views/user/index.php @@ -20,14 +20,13 @@ use Yiisoft\Yii\DataView\OffsetPagination; /** - * @var string $csrf - * @var CurrentRoute $currentRoute - * @var OffsetPaginator $paginator - * @var TranslatorInterface $translator + * @var string $csrf + * @var CurrentRoute $currentRoute + * @var OffsetPaginator $paginator + * @var TranslatorInterface $translator * @var UrlGeneratorInterface $urlGenerator - * @var WebView $this + * @var WebView $this */ - $this->setTitle($translator->translate('menu.users')); // Define header gridview diff --git a/resources/views/user/profile.php b/blog/resources/views/user/profile.php similarity index 98% rename from resources/views/user/profile.php rename to blog/resources/views/user/profile.php index 64403daad..2acc58b6c 100644 --- a/resources/views/user/profile.php +++ b/blog/resources/views/user/profile.php @@ -3,7 +3,7 @@ declare(strict_types=1); /** - * @var User $item + * @var User $item * @var WebView $this */ diff --git a/blog/runtime/.gitignore b/blog/runtime/.gitignore new file mode 100755 index 000000000..d6b7ef32c --- /dev/null +++ b/blog/runtime/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/src/Asset/AppAsset.php b/blog/src/Asset/AppAsset.php similarity index 100% rename from src/Asset/AppAsset.php rename to blog/src/Asset/AppAsset.php diff --git a/src/Asset/Bootstrap5IconsAsset.php b/blog/src/Asset/Bootstrap5IconsAsset.php similarity index 100% rename from src/Asset/Bootstrap5IconsAsset.php rename to blog/src/Asset/Bootstrap5IconsAsset.php diff --git a/src/Auth/AuthService.php b/blog/src/Auth/AuthService.php similarity index 100% rename from src/Auth/AuthService.php rename to blog/src/Auth/AuthService.php diff --git a/src/Auth/Controller/AuthController.php b/blog/src/Auth/Controller/AuthController.php similarity index 100% rename from src/Auth/Controller/AuthController.php rename to blog/src/Auth/Controller/AuthController.php diff --git a/src/Auth/Controller/SignupController.php b/blog/src/Auth/Controller/SignupController.php similarity index 100% rename from src/Auth/Controller/SignupController.php rename to blog/src/Auth/Controller/SignupController.php diff --git a/src/Auth/Form/LoginForm.php b/blog/src/Auth/Form/LoginForm.php similarity index 100% rename from src/Auth/Form/LoginForm.php rename to blog/src/Auth/Form/LoginForm.php diff --git a/src/Auth/Form/SignupForm.php b/blog/src/Auth/Form/SignupForm.php similarity index 99% rename from src/Auth/Form/SignupForm.php rename to blog/src/Auth/Form/SignupForm.php index 2efc852e7..9763f726c 100644 --- a/src/Auth/Form/SignupForm.php +++ b/blog/src/Auth/Form/SignupForm.php @@ -57,8 +57,10 @@ public function signup(): false|User if ($this->validator->validate($this)->isValid()) { $user = new User($this->getLogin(), $this->getPassword()); $this->userRepository->save($user); + return $user; } + return false; } @@ -73,6 +75,7 @@ function ($value): Result { if ($this->userRepository->findByLogin($value) !== null) { $result->addError('User with this login already exists.'); } + return $result; }, ], diff --git a/src/Auth/Identity.php b/blog/src/Auth/Identity.php similarity index 100% rename from src/Auth/Identity.php rename to blog/src/Auth/Identity.php diff --git a/src/Auth/IdentityRepository.php b/blog/src/Auth/IdentityRepository.php similarity index 100% rename from src/Auth/IdentityRepository.php rename to blog/src/Auth/IdentityRepository.php diff --git a/src/Backend/Controller/SiteController.php b/blog/src/Backend/Controller/SiteController.php similarity index 100% rename from src/Backend/Controller/SiteController.php rename to blog/src/Backend/Controller/SiteController.php diff --git a/src/Blog/Archive/ArchiveController.php b/blog/src/Blog/Archive/ArchiveController.php similarity index 87% rename from src/Blog/Archive/ArchiveController.php rename to blog/src/Blog/Archive/ArchiveController.php index 17cb1898c..5e7cf40fb 100644 --- a/src/Blog/Archive/ArchiveController.php +++ b/blog/src/Blog/Archive/ArchiveController.php @@ -28,9 +28,9 @@ public function index(ArchiveRepository $archiveRepo): Response public function monthlyArchive(CurrentRoute $currentRoute, TagRepository $tagRepository, ArchiveRepository $archiveRepo): Response { - $pageNum = (int)$currentRoute->getArgument('page', '1'); - $year = (int)$currentRoute->getArgument('year', '0'); - $month = (int)$currentRoute->getArgument('month', '0'); + $pageNum = (int) $currentRoute->getArgument('page', '1'); + $year = (int) $currentRoute->getArgument('year', '0'); + $month = (int) $currentRoute->getArgument('month', '0'); $dataReader = $archiveRepo->getMonthlyArchive($year, $month); $paginator = (new OffsetPaginator($dataReader)) @@ -46,17 +46,19 @@ public function monthlyArchive(CurrentRoute $currentRoute, TagRepository $tagRep ->withLimit(12), 'tags' => $tagRepository->getTagMentions(self::POPULAR_TAGS_COUNT), ]; + return $this->viewRenderer->render('monthly-archive', $data); } public function yearlyArchive(CurrentRoute $currentRoute, ArchiveRepository $archiveRepo): Response { - $year = (int)$currentRoute->getArgument('year', '0'); + $year = (int) $currentRoute->getArgument('year', '0'); $data = [ 'year' => $year, 'items' => $archiveRepo->getYearlyArchive($year), ]; + return $this->viewRenderer->render('yearly-archive', $data); } } diff --git a/src/Blog/Archive/ArchiveRepository.php b/blog/src/Blog/Archive/ArchiveRepository.php similarity index 95% rename from src/Blog/Archive/ArchiveRepository.php rename to blog/src/Blog/Archive/ArchiveRepository.php index 5988b83e3..562693166 100644 --- a/src/Blog/Archive/ArchiveRepository.php +++ b/blog/src/Blog/Archive/ArchiveRepository.php @@ -6,20 +6,21 @@ use App\Blog\Entity\Post; use App\Blog\Post\PostRepository; -use Cycle\ORM\ORMInterface; -use Cycle\ORM\Select; use Cycle\Database\DatabaseInterface; use Cycle\Database\Driver\DriverInterface; use Cycle\Database\Driver\SQLite\SQLiteDriver; use Cycle\Database\Injection\Fragment; use Cycle\Database\Injection\FragmentInterface; use Cycle\Database\Query\SelectQuery; +use Cycle\ORM\ORMInterface; +use Cycle\ORM\Select; +use DateTimeImmutable; use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Reader\Sort; use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; /** - * This repository is not associated with Post entity + * This repository is not associated with Post entity. */ final class ArchiveRepository { @@ -39,7 +40,7 @@ public function select(): Select public function getMonthlyArchive(int $year, int $month): DataReaderInterface { - $begin = (new \DateTimeImmutable()) + $begin = (new DateTimeImmutable()) ->setDate($year, $month, 1) ->setTime(0, 0, 0); $end = $begin @@ -50,12 +51,13 @@ public function getMonthlyArchive(int $year, int $month): DataReaderInterface ->select() ->andWhere('published_at', 'between', $begin, $end) ->load(['user', 'tags']); + return $this->prepareDataReader($query); } public function getYearlyArchive(int $year): DataReaderInterface { - $begin = (new \DateTimeImmutable()) + $begin = (new DateTimeImmutable()) ->setDate($year, 1, 1) ->setTime(0, 0, 0); $end = $begin @@ -67,6 +69,7 @@ public function getYearlyArchive(int $year): DataReaderInterface ->andWhere('published_at', 'between', $begin, $end) ->load('user', ['method' => Select::SINGLE_QUERY]) ->orderBy(['published_at' => 'asc']); + return $this->prepareDataReader($query); } @@ -103,8 +106,10 @@ private function extractFromDateColumn(string $attr): FragmentInterface ->quoteIdentifier($attr); if ($driver instanceof SQLiteDriver) { $str = ['year' => '%Y', 'month' => '%m', 'day' => '%d'][$attr]; + return new Fragment("strftime('{$str}', post.published_at) {$wrappedField}"); } + return new Fragment("extract({$attr} from post.published_at) {$wrappedField}"); } diff --git a/src/Blog/BlogController.php b/blog/src/Blog/BlogController.php similarity index 95% rename from src/Blog/BlogController.php rename to blog/src/Blog/BlogController.php index cc045736e..e318057b7 100644 --- a/src/Blog/BlogController.php +++ b/blog/src/Blog/BlogController.php @@ -33,7 +33,7 @@ public function index( CurrentUser $currentUser, CurrentRoute $currentRoute ): Response { - $pageNum = (int)$currentRoute->getArgument('page', '1'); + $pageNum = (int) $currentRoute->getArgument('page', '1'); $dataReader = $postRepository->findAllPreloaded(); $paginator = (new OffsetPaginator($dataReader)) ->withPageSize(self::POSTS_PER_PAGE) @@ -47,6 +47,7 @@ public function index( 'tags' => $tagRepository->getTagMentions(self::POPULAR_TAGS_COUNT), 'isGuest' => $currentUser->isGuest(), ]; + return $this->viewRenderer->render('index', $data); } } diff --git a/src/Blog/Comment/CommentRepository.php b/blog/src/Blog/Comment/CommentRepository.php similarity index 100% rename from src/Blog/Comment/CommentRepository.php rename to blog/src/Blog/Comment/CommentRepository.php diff --git a/src/Blog/Comment/CommentService.php b/blog/src/Blog/Comment/CommentService.php similarity index 100% rename from src/Blog/Comment/CommentService.php rename to blog/src/Blog/Comment/CommentService.php diff --git a/src/Blog/Comment/Scope/PublicScope.php b/blog/src/Blog/Comment/Scope/PublicScope.php similarity index 98% rename from src/Blog/Comment/Scope/PublicScope.php rename to blog/src/Blog/Comment/Scope/PublicScope.php index 1b3d3d30c..8efb3c58a 100644 --- a/src/Blog/Comment/Scope/PublicScope.php +++ b/blog/src/Blog/Comment/Scope/PublicScope.php @@ -4,13 +4,13 @@ namespace App\Blog\Comment\Scope; -use Cycle\ORM\Select\ScopeInterface as ConstrainInterface; use Cycle\ORM\Select\QueryBuilder; +use Cycle\ORM\Select\ScopeInterface as ConstrainInterface; /** * Not deleted * Public with condition - * Sorted + * Sorted. */ final class PublicScope implements ConstrainInterface { diff --git a/src/Blog/CommentController.php b/blog/src/Blog/CommentController.php similarity index 91% rename from src/Blog/CommentController.php rename to blog/src/Blog/CommentController.php index ebe2ee8ac..c6c5a6281 100644 --- a/src/Blog/CommentController.php +++ b/blog/src/Blog/CommentController.php @@ -23,7 +23,7 @@ public function index(Request $request, CommentService $service, CurrentRoute $c { $paginator = $service->getFeedPaginator(); if ($currentRoute->getArgument('next') !== null) { - $paginator = $paginator->withNextPageToken((string)$currentRoute->getArgument('next')); + $paginator = $paginator->withNextPageToken((string) $currentRoute->getArgument('next')); } if ($this->isAjaxRequest($request)) { diff --git a/src/Blog/Entity/Comment.php b/blog/src/Blog/Entity/Comment.php similarity index 95% rename from src/Blog/Entity/Comment.php rename to blog/src/Blog/Entity/Comment.php index d49badd97..db9fc2eb9 100644 --- a/src/Blog/Entity/Comment.php +++ b/blog/src/Blog/Entity/Comment.php @@ -4,6 +4,8 @@ namespace App\Blog\Entity; +use App\Blog\Comment\CommentRepository; +use App\Blog\Comment\Scope\PublicScope; use App\User\User; use Cycle\Annotated\Annotation\Column; use Cycle\Annotated\Annotation\Entity; @@ -13,8 +15,8 @@ use DateTimeImmutable; #[Entity( - repository: \App\Blog\Comment\CommentRepository::class, - scope: \App\Blog\Comment\Scope\PublicScope::class + repository: CommentRepository::class, + scope: PublicScope::class )] #[Index(columns: ['public', 'published_at'])] #[Behavior\CreatedAt(field: 'created_at', column: 'created_at')] diff --git a/src/Blog/Entity/Post.php b/blog/src/Blog/Entity/Post.php similarity index 96% rename from src/Blog/Entity/Post.php rename to blog/src/Blog/Entity/Post.php index ec400787c..112d8b7db 100644 --- a/src/Blog/Entity/Post.php +++ b/blog/src/Blog/Entity/Post.php @@ -4,6 +4,8 @@ namespace App\Blog\Entity; +use App\Blog\Post\PostRepository; +use App\Blog\Post\Scope\PublicScope; use App\User\User; use Cycle\Annotated\Annotation\Column; use Cycle\Annotated\Annotation\Entity; @@ -18,8 +20,8 @@ use Yiisoft\Security\Random; #[Entity( - repository: \App\Blog\Post\PostRepository::class, - scope: \App\Blog\Post\Scope\PublicScope::class + repository: PostRepository::class, + scope: PublicScope::class )] #[Index(columns: ['public', 'published_at'])] #[Behavior\CreatedAt(field: 'created_at', column: 'created_at')] diff --git a/src/Blog/Entity/PostTag.php b/blog/src/Blog/Entity/PostTag.php similarity index 100% rename from src/Blog/Entity/PostTag.php rename to blog/src/Blog/Entity/PostTag.php diff --git a/src/Blog/Entity/Tag.php b/blog/src/Blog/Entity/Tag.php similarity index 95% rename from src/Blog/Entity/Tag.php rename to blog/src/Blog/Entity/Tag.php index ee8d1782d..f449280b5 100644 --- a/src/Blog/Entity/Tag.php +++ b/blog/src/Blog/Entity/Tag.php @@ -4,6 +4,7 @@ namespace App\Blog\Entity; +use App\Blog\Tag\TagRepository; use Cycle\Annotated\Annotation\Column; use Cycle\Annotated\Annotation\Entity; use Cycle\Annotated\Annotation\Relation\ManyToMany; @@ -12,7 +13,7 @@ use Cycle\ORM\Entity\Behavior; use DateTimeImmutable; -#[Entity(repository: \App\Blog\Tag\TagRepository::class)] +#[Entity(repository: TagRepository::class)] #[Index(columns: ['label'], unique: true)] #[Behavior\CreatedAt(field: 'created_at', column: 'created_at')] class Tag diff --git a/src/Blog/Post/PostController.php b/blog/src/Blog/Post/PostController.php similarity index 99% rename from src/Blog/Post/PostController.php rename to blog/src/Blog/Post/PostController.php index 592a62aa3..e5e43130d 100644 --- a/src/Blog/Post/PostController.php +++ b/blog/src/Blog/Post/PostController.php @@ -52,6 +52,7 @@ public function add(Request $request, ValidatorInterface $validator): Response ->validate($form) ->isValid()) { $this->postService->savePost($this->userService->getUser(), new Post(), $form); + return $this->webService->getRedirectResponse('blog/index'); } @@ -91,6 +92,7 @@ public function edit( ->validate($form) ->isValid()) { $this->postService->savePost($this->userService->getUser(), $post, $form); + return $this->webService->getRedirectResponse('blog/index'); } diff --git a/src/Blog/Post/PostForm.php b/blog/src/Blog/Post/PostForm.php similarity index 100% rename from src/Blog/Post/PostForm.php rename to blog/src/Blog/Post/PostForm.php diff --git a/src/Blog/Post/PostRepository.php b/blog/src/Blog/Post/PostRepository.php similarity index 97% rename from src/Blog/Post/PostRepository.php rename to blog/src/Blog/Post/PostRepository.php index ba3a9052d..f0d002144 100644 --- a/src/Blog/Post/PostRepository.php +++ b/blog/src/Blog/Post/PostRepository.php @@ -22,7 +22,7 @@ public function __construct(private EntityWriter $entityWriter, Select $select) } /** - * Get posts without filter with preloaded Users and Tags + * Get posts without filter with preloaded Users and Tags. * * @psalm-return DataReaderInterface */ @@ -31,6 +31,7 @@ public function findAllPreloaded(): DataReaderInterface $query = $this ->select() ->load(['user', 'tags']); + return $this->prepareDataReader($query); } @@ -43,6 +44,7 @@ public function findByTag($tagId): DataReaderInterface ->select() ->where(['tags.id' => $tagId]) ->load('user', ['method' => Select::SINGLE_QUERY]); + return $this->prepareDataReader($query); } @@ -56,6 +58,7 @@ public function fullPostPage(string $slug): ?Post // force loading in single query with comments ->load('comments.user', ['method' => Select::SINGLE_QUERY]) ->load('comments', ['method' => Select::OUTER_QUERY]); + return $query->fetchOne(); } diff --git a/src/Blog/Post/PostService.php b/blog/src/Blog/Post/PostService.php similarity index 100% rename from src/Blog/Post/PostService.php rename to blog/src/Blog/Post/PostService.php diff --git a/src/Blog/Post/Scope/PublicScope.php b/blog/src/Blog/Post/Scope/PublicScope.php similarity index 100% rename from src/Blog/Post/Scope/PublicScope.php rename to blog/src/Blog/Post/Scope/PublicScope.php index 5c6e37f7b..0456d684d 100644 --- a/src/Blog/Post/Scope/PublicScope.php +++ b/blog/src/Blog/Post/Scope/PublicScope.php @@ -4,8 +4,8 @@ namespace App\Blog\Post\Scope; -use Cycle\ORM\Select\ScopeInterface as ConstrainInterface; use Cycle\ORM\Select\QueryBuilder; +use Cycle\ORM\Select\ScopeInterface as ConstrainInterface; final class PublicScope implements ConstrainInterface { diff --git a/src/Blog/Tag/TagController.php b/blog/src/Blog/Tag/TagController.php similarity index 99% rename from src/Blog/Tag/TagController.php rename to blog/src/Blog/Tag/TagController.php index 43ea522c9..d640cf654 100644 --- a/src/Blog/Tag/TagController.php +++ b/blog/src/Blog/Tag/TagController.php @@ -39,6 +39,7 @@ public function index(CurrentRoute $currentRoute, TagRepository $tagRepository, 'item' => $item, 'paginator' => $paginator, ]; + return $this->viewRenderer->render('index', $data); } } diff --git a/src/Blog/Tag/TagRepository.php b/blog/src/Blog/Tag/TagRepository.php similarity index 96% rename from src/Blog/Tag/TagRepository.php rename to blog/src/Blog/Tag/TagRepository.php index 6b149a2c7..10b5227eb 100644 --- a/src/Blog/Tag/TagRepository.php +++ b/blog/src/Blog/Tag/TagRepository.php @@ -25,6 +25,7 @@ public function __construct(private ORMInterface $orm, Select $select) public function getOrCreate(string $label): Tag { $tag = $this->findByLabel($label); + return $tag ?? new Tag($label); } @@ -53,7 +54,7 @@ public function getTagMentions(int $limit = 0): DataReaderInterface // All SQL-queries received on mysql database. SQL-queries may vary by driver /** - * Case 1 would look like: + * Case 1 would look like:. * * SELECT `t`.`label`, count(*) `count` * FROM `post_tag` AS `postTag` @@ -76,7 +77,7 @@ public function getTagMentions(int $limit = 0): DataReaderInterface ->groupBy('t.label, tag_id'); /** - * Case 2 would look like: + * Case 2 would look like:. * * SELECT `label`, count(*) `count` * FROM `tag` AS `tag` @@ -95,7 +96,7 @@ public function getTagMentions(int $limit = 0): DataReaderInterface ->groupBy('tag.label, tag_id'); /** - * Case 3 would look like: + * Case 3 would look like:. * * SELECT `label`, count(*) `count` * FROM `tag` AS `tag` @@ -114,7 +115,7 @@ public function getTagMentions(int $limit = 0): DataReaderInterface ->columns(['label', 'count(*) count']); /** - * Case 4 would look like: + * Case 4 would look like:. * * SELECT `label`, count(*) `count` * FROM `post` AS `post` @@ -133,6 +134,7 @@ public function getTagMentions(int $limit = 0): DataReaderInterface ->columns(['label', 'count(*) count']); $sort = Sort::only(['count', 'label'])->withOrder(['count' => 'desc']); + return (new EntityReader($case3)) ->withSort($sort) ->withLimit($limit); diff --git a/src/Blog/Widget/PostCard.php b/blog/src/Blog/Widget/PostCard.php similarity index 99% rename from src/Blog/Widget/PostCard.php rename to blog/src/Blog/Widget/PostCard.php index e83991ab9..8dfa08590 100644 --- a/src/Blog/Widget/PostCard.php +++ b/blog/src/Blog/Widget/PostCard.php @@ -70,6 +70,7 @@ protected function renderBody(): string mb_substr($this->post->getContent(), 0, 400) . (mb_strlen($this->post->getContent()) > 400 ? '…' : '') ); + return $return . Html::closeTag('div'); } @@ -83,6 +84,7 @@ protected function renderTags(): string ['class' => 'btn btn-outline-secondary btn-sm me-2 mt-1'] ); } + return $return . Html::closeTag('div'); } diff --git a/src/Command/Fixture/AddCommand.php b/blog/src/Command/Fixture/AddCommand.php similarity index 91% rename from src/Command/Fixture/AddCommand.php rename to blog/src/Command/Fixture/AddCommand.php index 03220036f..cad64e14f 100644 --- a/src/Command/Fixture/AddCommand.php +++ b/blog/src/Command/Fixture/AddCommand.php @@ -20,6 +20,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +use Throwable; use Yiisoft\Yii\Console\ExitCode; use Yiisoft\Yii\Cycle\Command\CycleDependencyProxy; use Yiisoft\Yii\Cycle\Data\Writer\EntityWriter; @@ -56,10 +57,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); - $count = (int)$input->getArgument('count'); + $count = (int) $input->getArgument('count'); // get faker if (!class_exists(Factory::class)) { $io->error('Faker should be installed. Run `composer install --dev`'); + return ExitCode::UNSPECIFIED_ERROR; } $this->faker = Factory::create(); @@ -70,13 +72,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->addPosts($count); $this->saveEntities(); - } catch (\Throwable $t) { + } catch (Throwable $t) { $io->error($t->getMessage()); $this->logger->error($t->getMessage(), ['exception' => $t]); return $t->getCode() ?: ExitCode::UNSPECIFIED_ERROR; } $io->success('Done'); + return ExitCode::OK; } @@ -87,7 +90,7 @@ private function saveEntities(): void private function addUsers(int $count): void { - for ($i = 0; $i < $count; ++$i) { + for ($i = 0; $i < $count; $i++) { $login = $this->faker->unique()->firstName; $user = new User($login, $login); $this->users[] = $user; @@ -102,11 +105,11 @@ private function addTags(int $count): void ->getRepository(Tag::class); $this->tags = []; $tagWords = []; - for ($i = 0, $fails = 0; $i < $count; ++$i) { + for ($i = 0, $fails = 0; $i < $count; $i++) { $word = $this->faker->word(); if (in_array($word, $tagWords, true)) { - --$i; - ++$fails; + $i--; + $fails++; if ($fails >= $count) { break; } @@ -123,7 +126,7 @@ private function addPosts(int $count): void if (empty($this->users)) { throw new Exception('No users'); } - for ($i = 0; $i < $count; ++$i) { + for ($i = 0; $i < $count; $i++) { /** @var User $postUser */ $postUser = $this->users[array_rand($this->users)]; $post = new Post($this->faker->text(64), $this->faker->realText(rand(1000, 4000))); @@ -134,7 +137,7 @@ private function addPosts(int $count): void $post->setPublishedAt(new DateTimeImmutable(date('r', rand(strtotime('-2 years'), time())))); } // link tags - $postTags = (array)array_rand($this->tags, rand(1, count($this->tags))); + $postTags = (array) array_rand($this->tags, rand(1, count($this->tags))); foreach ($postTags as $tagId) { $tag = $this->tags[$tagId]; $post->addTag($tag); @@ -143,7 +146,7 @@ private function addPosts(int $count): void } // add comments $commentsCount = rand(0, $count); - for ($j = 0; $j <= $commentsCount; ++$j) { + for ($j = 0; $j <= $commentsCount; $j++) { $comment = new Comment($this->faker->realText(rand(100, 500))); $commentPublic = rand(0, 3) > 0; $comment->setPublic($commentPublic); diff --git a/src/Command/Fixture/SchemaClearCommand.php b/blog/src/Command/Fixture/SchemaClearCommand.php similarity index 100% rename from src/Command/Fixture/SchemaClearCommand.php rename to blog/src/Command/Fixture/SchemaClearCommand.php index 37ed4a108..b0a18ea05 100644 --- a/src/Command/Fixture/SchemaClearCommand.php +++ b/blog/src/Command/Fixture/SchemaClearCommand.php @@ -4,16 +4,16 @@ namespace App\Command\Fixture; +use App\Blog\Entity\Comment; +use App\Blog\Entity\Post; use App\Blog\Entity\PostTag; use App\Blog\Entity\Tag; +use App\User\User; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Yiisoft\Yii\Console\ExitCode; use Yiisoft\Yii\Cycle\Command\CycleDependencyProxy; -use App\Blog\Entity\Comment; -use App\Blog\Entity\Post; -use App\User\User; final class SchemaClearCommand extends Command { diff --git a/src/Command/Router/ListCommand.php b/blog/src/Command/Router/ListCommand.php similarity index 99% rename from src/Command/Router/ListCommand.php rename to blog/src/Command/Router/ListCommand.php index 27c163499..4f1d3baf3 100644 --- a/src/Command/Router/ListCommand.php +++ b/blog/src/Command/Router/ListCommand.php @@ -58,6 +58,7 @@ static function (Route $a, Route $b) { $table->setColumnMaxWidth(2, 15); $table->setColumnMaxWidth(3, 15); $table->render(); + return ExitCode::OK; } } diff --git a/src/Command/Translation/TranslateCommand.php b/blog/src/Command/Translation/TranslateCommand.php similarity index 99% rename from src/Command/Translation/TranslateCommand.php rename to blog/src/Command/Translation/TranslateCommand.php index db4760f5d..a2fb9d55c 100644 --- a/src/Command/Translation/TranslateCommand.php +++ b/blog/src/Command/Translation/TranslateCommand.php @@ -32,6 +32,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $locale = $input->getArgument('locale'); $output->writeln($this->translator->translate($message, [], null, $locale)); + return 0; } } diff --git a/src/Contact/ContactController.php b/blog/src/Contact/ContactController.php similarity index 97% rename from src/Contact/ContactController.php rename to blog/src/Contact/ContactController.php index aaeb807ba..180ac097d 100644 --- a/src/Contact/ContactController.php +++ b/blog/src/Contact/ContactController.php @@ -33,7 +33,7 @@ public function contact( ): ResponseInterface { $body = $request->getParsedBody(); $form = new ContactForm(); - if (($request->getMethod() === Method::POST) && $form->load((array)$body) && $validator + if (($request->getMethod() === Method::POST) && $form->load((array) $body) && $validator ->validate($form) ->isValid()) { $this->mailer->send($form, $request); diff --git a/src/Contact/ContactForm.php b/blog/src/Contact/ContactForm.php similarity index 100% rename from src/Contact/ContactForm.php rename to blog/src/Contact/ContactForm.php diff --git a/src/Contact/ContactMailer.php b/blog/src/Contact/ContactMailer.php similarity index 95% rename from src/Contact/ContactMailer.php rename to blog/src/Contact/ContactMailer.php index da90fe7f5..6212bf70d 100644 --- a/src/Contact/ContactMailer.php +++ b/blog/src/Contact/ContactMailer.php @@ -14,7 +14,7 @@ use Yiisoft\Session\Flash\FlashInterface; /** - * ContactMailer sends an email from the contact form + * ContactMailer sends an email from the contact form. */ final class ContactMailer { @@ -48,7 +48,7 @@ public function send(FormModelInterface $form, ServerRequestInterface $request): if ($file[0]?->getError() === UPLOAD_ERR_OK) { $message = $message->withAttached( File::fromContent( - (string)$file->getStream(), + (string) $file->getStream(), $file->getClientFilename(), $file->getClientMediaType() ), diff --git a/src/Contact/mail/contact-email.php b/blog/src/Contact/mail/contact-email.php similarity index 99% rename from src/Contact/mail/contact-email.php rename to blog/src/Contact/mail/contact-email.php index 584eedff7..9cfe7a4d8 100644 --- a/src/Contact/mail/contact-email.php +++ b/blog/src/Contact/mail/contact-email.php @@ -5,5 +5,4 @@ use Yiisoft\Html\Html; /** @var string $content */ - echo Html::p(Html::encode($content)); diff --git a/src/Contact/mail/layouts/html.php b/blog/src/Contact/mail/layouts/html.php similarity index 100% rename from src/Contact/mail/layouts/html.php rename to blog/src/Contact/mail/layouts/html.php diff --git a/src/Contact/views/contact/form.php b/blog/src/Contact/views/contact/form.php similarity index 90% rename from src/Contact/views/contact/form.php rename to blog/src/Contact/views/contact/form.php index 11338dbf4..45d72a3b9 100644 --- a/src/Contact/views/contact/form.php +++ b/blog/src/Contact/views/contact/form.php @@ -2,20 +2,22 @@ declare(strict_types=1); +use App\Contact\ContactForm; use App\Widget\FlashMessage; use Yiisoft\Form\Field; use Yiisoft\Html\Html; use Yiisoft\Html\Tag\Form; +use Yiisoft\Router\UrlGeneratorInterface; +use Yiisoft\Translator\TranslatorInterface; use Yiisoft\View\WebView; /** * @var Yiisoft\Yii\View\Csrf $csrf - * @var \App\Contact\ContactForm $form - * @var \Yiisoft\Router\UrlGeneratorInterface $url - * @var WebView $this - * @var \Yiisoft\Translator\TranslatorInterface $translator + * @var ContactForm $form + * @var UrlGeneratorInterface $url + * @var WebView $this + * @var TranslatorInterface $translator */ - $this->setTitle($translator->translate('menu.contact')); ?> diff --git a/src/Controller/Actions/ApiInfo.php b/blog/src/Controller/Actions/ApiInfo.php similarity index 100% rename from src/Controller/Actions/ApiInfo.php rename to blog/src/Controller/Actions/ApiInfo.php index 1f196079d..b2aad8e2e 100644 --- a/src/Controller/Actions/ApiInfo.php +++ b/blog/src/Controller/Actions/ApiInfo.php @@ -4,12 +4,12 @@ namespace App\Controller\Actions; +use OpenApi\Annotations as OA; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use Yiisoft\DataResponse\DataResponseFactoryInterface; -use OpenApi\Annotations as OA; /** * @OA\Info(title="Yii demo API", version="2.0") diff --git a/src/Controller/SiteController.php b/blog/src/Controller/SiteController.php similarity index 100% rename from src/Controller/SiteController.php rename to blog/src/Controller/SiteController.php diff --git a/src/Handler/NotFoundHandler.php b/blog/src/Handler/NotFoundHandler.php similarity index 100% rename from src/Handler/NotFoundHandler.php rename to blog/src/Handler/NotFoundHandler.php diff --git a/blog/src/Installer.php b/blog/src/Installer.php new file mode 100644 index 000000000..015753369 --- /dev/null +++ b/blog/src/Installer.php @@ -0,0 +1,40 @@ +permission === null) { - throw new \InvalidArgumentException('Permission not set.'); + throw new InvalidArgumentException('Permission not set.'); } if (!$this->userService->hasPermission($this->permission)) { @@ -39,6 +40,7 @@ public function withPermission(string $permission): self { $new = clone $this; $new->permission = $permission; + return $new; } } diff --git a/src/Middleware/ApiDataWrapper.php b/blog/src/Middleware/ApiDataWrapper.php similarity index 99% rename from src/Middleware/ApiDataWrapper.php rename to blog/src/Middleware/ApiDataWrapper.php index b2d3cbfeb..70803cb63 100644 --- a/src/Middleware/ApiDataWrapper.php +++ b/blog/src/Middleware/ApiDataWrapper.php @@ -23,11 +23,13 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface } else { $message = 'Unknown error'; } + return $response->withData([ 'status' => 'failed', 'error' => ['message' => $message, 'status' => $response->getStatusCode()], ]); } + return $response->withData(['status' => 'success', 'data' => $data]); } diff --git a/src/Service/WebControllerService.php b/blog/src/Service/WebControllerService.php similarity index 100% rename from src/Service/WebControllerService.php rename to blog/src/Service/WebControllerService.php diff --git a/src/Timer.php b/blog/src/Timer.php similarity index 76% rename from src/Timer.php rename to blog/src/Timer.php index cecd778e8..c86555b88 100644 --- a/src/Timer.php +++ b/blog/src/Timer.php @@ -4,6 +4,8 @@ namespace App; +use InvalidArgumentException; + final class Timer { private array $timers = []; @@ -16,7 +18,7 @@ public function start(string $name): void public function get(string $name): float { if (!array_key_exists($name, $this->timers)) { - throw new \InvalidArgumentException("There is no \"$name\" timer started"); + throw new InvalidArgumentException("There is no \"$name\" timer started"); } return microtime(true) - $this->timers[$name]; diff --git a/src/User/Console/AssignRoleCommand.php b/blog/src/User/Console/AssignRoleCommand.php similarity index 98% rename from src/User/Console/AssignRoleCommand.php rename to blog/src/User/Console/AssignRoleCommand.php index eaf5b51de..bd47c2d8e 100644 --- a/src/User/Console/AssignRoleCommand.php +++ b/blog/src/User/Console/AssignRoleCommand.php @@ -12,9 +12,10 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; use Symfony\Component\Console\Style\SymfonyStyle; +use Throwable; +use Yiisoft\Rbac\ItemsStorageInterface; use Yiisoft\Rbac\Manager; use Yiisoft\Rbac\Role; -use Yiisoft\Rbac\ItemsStorageInterface; use Yiisoft\Yii\Console\ExitCode; use Yiisoft\Yii\Cycle\Command\CycleDependencyProxy; @@ -75,8 +76,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->manager->assign($roleName, $userId); $io->success('Role was assigned to given user'); - } catch (\Throwable $t) { + } catch (Throwable $t) { $io->error($t->getMessage()); + return $t->getCode() ?: ExitCode::UNSPECIFIED_ERROR; } diff --git a/src/User/Console/CreateCommand.php b/blog/src/User/Console/CreateCommand.php similarity index 89% rename from src/User/Console/CreateCommand.php rename to blog/src/User/Console/CreateCommand.php index 53f16a42f..f712327dd 100644 --- a/src/User/Console/CreateCommand.php +++ b/blog/src/User/Console/CreateCommand.php @@ -5,6 +5,7 @@ namespace App\User\Console; use App\Auth\Form\SignupForm; +use LogicException; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -37,9 +38,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); - $login = (string)$input->getArgument('login'); - $password = (string)$input->getArgument('password'); - $isAdmin = (bool)$input->getArgument('isAdmin'); + $login = (string) $input->getArgument('login'); + $password = (string) $input->getArgument('password'); + $isAdmin = (bool) $input->getArgument('isAdmin'); $this->signupForm->load([ 'login' => $login, @@ -51,23 +52,26 @@ protected function execute(InputInterface $input, OutputInterface $output): int $user = $this->signupForm->signup(); } catch (Throwable $t) { $io->error($t->getMessage() . ' ' . $t->getFile() . ' ' . $t->getLine()); + return $t->getCode() ?: ExitCode::UNSPECIFIED_ERROR; } if ($user === false) { $errors = $this->signupForm->getFormErrors()->getFirstErrors(); array_walk($errors, fn ($error, $attribute) => $io->error("$attribute: $error")); + return ExitCode::DATAERR; } if ($isAdmin) { $userId = $user->getId(); if ($userId === null) { - throw new \LogicException('User Id is NULL'); + throw new LogicException('User Id is NULL'); } $this->manager->assign('admin', $userId); } $io->success('User created'); + return ExitCode::OK; } } diff --git a/src/User/Controller/ApiUserController.php b/blog/src/User/Controller/ApiUserController.php similarity index 100% rename from src/User/Controller/ApiUserController.php rename to blog/src/User/Controller/ApiUserController.php diff --git a/src/User/Controller/UserController.php b/blog/src/User/Controller/UserController.php similarity index 100% rename from src/User/Controller/UserController.php rename to blog/src/User/Controller/UserController.php diff --git a/src/User/User.php b/blog/src/User/User.php similarity index 92% rename from src/User/User.php rename to blog/src/User/User.php index e18bff9e4..52539ad73 100644 --- a/src/User/User.php +++ b/blog/src/User/User.php @@ -17,7 +17,7 @@ use Doctrine\Common\Collections\ArrayCollection; use Yiisoft\Security\PasswordHasher; -#[Entity(repository: \App\User\UserRepository::class)] +#[Entity(repository: UserRepository::class)] #[Index(columns: ['login'], unique: true)] #[Behavior\CreatedAt(field: 'created_at', column: 'created_at')] #[Behavior\UpdatedAt(field: 'updated_at', column: 'updated_at')] @@ -44,13 +44,13 @@ class User /** * @var ArrayCollection */ - #[HasMany(target: \App\Blog\Entity\Post::class)] + #[HasMany(target: Post::class)] private ArrayCollection $posts; /** * @var ArrayCollection */ - #[HasMany(target: \App\Blog\Entity\Comment::class)] + #[HasMany(target: Comment::class)] private ArrayCollection $comments; public function __construct(string $login, string $password) @@ -66,7 +66,7 @@ public function __construct(string $login, string $password) public function getId(): ?string { - return $this->id === null ? null : (string)$this->id; + return $this->id === null ? null : (string) $this->id; } public function getLogin(): string diff --git a/src/User/UserRepository.php b/blog/src/User/UserRepository.php similarity index 100% rename from src/User/UserRepository.php rename to blog/src/User/UserRepository.php diff --git a/src/User/UserService.php b/blog/src/User/UserService.php similarity index 99% rename from src/User/UserService.php rename to blog/src/User/UserService.php index 2374ff293..243f69a61 100644 --- a/src/User/UserService.php +++ b/blog/src/User/UserService.php @@ -30,6 +30,7 @@ public function getUser(): ?User public function hasPermission(string $permission): bool { $userId = $this->currentUser->getId(); + return null !== $userId && $this->accessChecker->userHasPermission($userId, $permission); } } diff --git a/src/ViewInjection/CommonViewInjection.php b/blog/src/ViewInjection/CommonViewInjection.php similarity index 100% rename from src/ViewInjection/CommonViewInjection.php rename to blog/src/ViewInjection/CommonViewInjection.php diff --git a/src/ViewInjection/LayoutViewInjection.php b/blog/src/ViewInjection/LayoutViewInjection.php similarity index 100% rename from src/ViewInjection/LayoutViewInjection.php rename to blog/src/ViewInjection/LayoutViewInjection.php diff --git a/src/ViewInjection/LinkTagsViewInjection.php b/blog/src/ViewInjection/LinkTagsViewInjection.php similarity index 100% rename from src/ViewInjection/LinkTagsViewInjection.php rename to blog/src/ViewInjection/LinkTagsViewInjection.php diff --git a/src/ViewInjection/MetaTagsViewInjection.php b/blog/src/ViewInjection/MetaTagsViewInjection.php similarity index 100% rename from src/ViewInjection/MetaTagsViewInjection.php rename to blog/src/ViewInjection/MetaTagsViewInjection.php diff --git a/src/Widget/FlashMessage.php b/blog/src/Widget/FlashMessage.php similarity index 91% rename from src/Widget/FlashMessage.php rename to blog/src/Widget/FlashMessage.php index a2910b3a3..cb36c1f78 100644 --- a/src/Widget/FlashMessage.php +++ b/blog/src/Widget/FlashMessage.php @@ -5,8 +5,8 @@ namespace App\Widget; use Yiisoft\Session\Flash\FlashInterface; -use Yiisoft\Yii\Bootstrap5\Alert; use Yiisoft\Widget\Widget; +use Yiisoft\Yii\Bootstrap5\Alert; final class FlashMessage extends Widget { @@ -23,8 +23,7 @@ public function run(): string foreach ($data as $message) { $html[] = Alert::widget() ->options(['class' => "alert-{$type} shadow"]) - ->body($message['body']) - ; + ->body($message['body']); } } diff --git a/src/Widget/OffsetPagination.php b/blog/src/Widget/OffsetPagination.php similarity index 95% rename from src/Widget/OffsetPagination.php rename to blog/src/Widget/OffsetPagination.php index 9f5f01116..39b54ad1e 100644 --- a/src/Widget/OffsetPagination.php +++ b/blog/src/Widget/OffsetPagination.php @@ -24,12 +24,14 @@ public function paginator(?Paginator $paginator): self { $this->paginator = $paginator; $this->prepared = false; + return $this; } public function urlGenerator(Closure $generator): self { $this->urlGenerator = $generator; + return $this; } @@ -119,7 +121,7 @@ protected function renderButtons(): string if ($page === null) { $result .= Html::span('…', ['class' => 'page-link']); } else { - $result .= Html::a((string)$page, $this->getPageLink($page), ['class' => 'page-link']); + $result .= Html::a((string) $page, $this->getPageLink($page), ['class' => 'page-link']); } $result .= Html::closeTag('li'); } @@ -135,7 +137,7 @@ protected function renderButtons(): string protected function getPageLink(int $page): ?string { - return $this->urlGenerator === null ? null : (string)($this->urlGenerator)($page); + return $this->urlGenerator === null ? null : (string) ($this->urlGenerator)($page); } protected function initOptions(): void diff --git a/src/Widget/PerformanceMetrics.php b/blog/src/Widget/PerformanceMetrics.php similarity index 100% rename from src/Widget/PerformanceMetrics.php rename to blog/src/Widget/PerformanceMetrics.php diff --git a/tests/Acceptance.suite.yml b/blog/tests/Acceptance.suite.yml similarity index 100% rename from tests/Acceptance.suite.yml rename to blog/tests/Acceptance.suite.yml diff --git a/tests/Acceptance/BlogPageCest.php b/blog/tests/Acceptance/BlogPageCest.php similarity index 100% rename from tests/Acceptance/BlogPageCest.php rename to blog/tests/Acceptance/BlogPageCest.php diff --git a/tests/Acceptance/CommentPageCest.php b/blog/tests/Acceptance/CommentPageCest.php similarity index 100% rename from tests/Acceptance/CommentPageCest.php rename to blog/tests/Acceptance/CommentPageCest.php diff --git a/tests/Acceptance/ContactPageCest.php b/blog/tests/Acceptance/ContactPageCest.php similarity index 100% rename from tests/Acceptance/ContactPageCest.php rename to blog/tests/Acceptance/ContactPageCest.php diff --git a/tests/Acceptance/IndexPageCest.php b/blog/tests/Acceptance/IndexPageCest.php similarity index 100% rename from tests/Acceptance/IndexPageCest.php rename to blog/tests/Acceptance/IndexPageCest.php diff --git a/tests/Acceptance/LoginAcceptanceCest.php b/blog/tests/Acceptance/LoginAcceptanceCest.php similarity index 100% rename from tests/Acceptance/LoginAcceptanceCest.php rename to blog/tests/Acceptance/LoginAcceptanceCest.php diff --git a/tests/Acceptance/SignupAcceptanceCest.php b/blog/tests/Acceptance/SignupAcceptanceCest.php similarity index 100% rename from tests/Acceptance/SignupAcceptanceCest.php rename to blog/tests/Acceptance/SignupAcceptanceCest.php diff --git a/tests/Acceptance/UserPageCest.php b/blog/tests/Acceptance/UserPageCest.php similarity index 100% rename from tests/Acceptance/UserPageCest.php rename to blog/tests/Acceptance/UserPageCest.php diff --git a/tests/Cli.suite.yml b/blog/tests/Cli.suite.yml similarity index 100% rename from tests/Cli.suite.yml rename to blog/tests/Cli.suite.yml diff --git a/tests/Cli/ConsoleCest.php b/blog/tests/Cli/ConsoleCest.php similarity index 95% rename from tests/Cli/ConsoleCest.php rename to blog/tests/Cli/ConsoleCest.php index 73df9b8ca..2949fea78 100644 --- a/tests/Cli/ConsoleCest.php +++ b/blog/tests/Cli/ConsoleCest.php @@ -33,7 +33,7 @@ public function testCommandListCommand(CliTester $I): void /** * Clear all data created with testCommandFixtureAdd(). * Clearing database prevents from getting errors during multiple continuous testing with other test, - * what are based on empty database (eg, BlogPageCest) + * what are based on empty database (eg, BlogPageCest). */ public function testCommandCycleSchemaClear(CliTester $I): void { diff --git a/blog/tests/Functional.suite.yml b/blog/tests/Functional.suite.yml new file mode 100644 index 000000000..7b228bb50 --- /dev/null +++ b/blog/tests/Functional.suite.yml @@ -0,0 +1,12 @@ +actor: FunctionalTester +extensions: + enabled: + - Codeception\Extension\RunProcess: + 0: php -d variables_order=EGPCS -S 127.0.0.1:8080 -t public + sleep: 1 +modules: + enabled: + - PhpBrowser: + url: http://127.0.0.1:8080 + - \App\Tests\Support\Helper\Functional + step_decorators: ~ diff --git a/tests/Functional/ContactCest.php b/blog/tests/Functional/ContactCest.php similarity index 100% rename from tests/Functional/ContactCest.php rename to blog/tests/Functional/ContactCest.php diff --git a/tests/Functional/EventListenerConfigurationTest.php b/blog/tests/Functional/EventListenerConfigurationTest.php similarity index 99% rename from tests/Functional/EventListenerConfigurationTest.php rename to blog/tests/Functional/EventListenerConfigurationTest.php index 7c99b766a..0e5f3fc62 100644 --- a/tests/Functional/EventListenerConfigurationTest.php +++ b/blog/tests/Functional/EventListenerConfigurationTest.php @@ -4,6 +4,7 @@ namespace App\Tests\Functional; +use function dirname; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use Yiisoft\Config\ConfigPaths; @@ -12,8 +13,6 @@ use Yiisoft\Yii\Event\ListenerConfigurationChecker; use Yiisoft\Yii\Runner\ConfigFactory; -use function dirname; - class EventListenerConfigurationTest extends TestCase { public function testConsoleListenerConfiguration(): void diff --git a/tests/Functional/IndexControllerTest.php b/blog/tests/Functional/IndexControllerTest.php similarity index 100% rename from tests/Functional/IndexControllerTest.php rename to blog/tests/Functional/IndexControllerTest.php diff --git a/blog/tests/Support/AcceptanceTester.php b/blog/tests/Support/AcceptanceTester.php new file mode 100644 index 000000000..664821bd1 --- /dev/null +++ b/blog/tests/Support/AcceptanceTester.php @@ -0,0 +1,32 @@ +run(); diff --git a/blog/yii.bat b/blog/yii.bat new file mode 100644 index 000000000..cdb29a68f --- /dev/null +++ b/blog/yii.bat @@ -0,0 +1,6 @@ +@echo off +@setlocal +set YII_PATH=%~dp0 +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php +"%PHP_COMMAND%" "%YII_PATH%yii" %* +@endlocal From 1a8d0ae59d080d2db9bb7e54c0f187ed0939f991 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Thu, 24 Nov 2022 20:53:13 +0300 Subject: [PATCH 03/58] Change test server port (#549) --- blog-api/tests/Acceptance.suite.yml | 4 ++-- blog-api/tests/Functional.suite.yml | 4 ++-- blog/tests/Acceptance.suite.yml | 4 ++-- blog/tests/Functional.suite.yml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/blog-api/tests/Acceptance.suite.yml b/blog-api/tests/Acceptance.suite.yml index 492b6dd63..42dc406ff 100644 --- a/blog-api/tests/Acceptance.suite.yml +++ b/blog-api/tests/Acceptance.suite.yml @@ -2,12 +2,12 @@ actor: AcceptanceTester extensions: enabled: - Codeception\Extension\RunProcess: - 0: php -d variables_order=EGPCS -S 127.0.0.1:8080 -t public + 0: php -d variables_order=EGPCS -S 127.0.0.1:8881 -t public sleep: 1 modules: enabled: - REST: - url: http://127.0.0.1:8080 + url: http://127.0.0.1:8881 depends: PhpBrowser - Db: dsn: 'sqlite:tests/Support/Data/database.db' diff --git a/blog-api/tests/Functional.suite.yml b/blog-api/tests/Functional.suite.yml index 7b228bb50..289db8882 100644 --- a/blog-api/tests/Functional.suite.yml +++ b/blog-api/tests/Functional.suite.yml @@ -2,11 +2,11 @@ actor: FunctionalTester extensions: enabled: - Codeception\Extension\RunProcess: - 0: php -d variables_order=EGPCS -S 127.0.0.1:8080 -t public + 0: php -d variables_order=EGPCS -S 127.0.0.1:8881 -t public sleep: 1 modules: enabled: - PhpBrowser: - url: http://127.0.0.1:8080 + url: http://127.0.0.1:8881 - \App\Tests\Support\Helper\Functional step_decorators: ~ diff --git a/blog/tests/Acceptance.suite.yml b/blog/tests/Acceptance.suite.yml index 032811f98..94370b4a5 100644 --- a/blog/tests/Acceptance.suite.yml +++ b/blog/tests/Acceptance.suite.yml @@ -2,11 +2,11 @@ actor: AcceptanceTester extensions: enabled: - Codeception\Extension\RunProcess: - 0: php -d variables_order=EGPCS -S 127.0.0.1:8080 -t public + 0: php -d variables_order=EGPCS -S 127.0.0.1:8881 -t public sleep: 1 modules: enabled: - PhpBrowser: - url: http://127.0.0.1:8080 + url: http://127.0.0.1:8881 - \App\Tests\Support\Helper\Acceptance step_decorators: ~ diff --git a/blog/tests/Functional.suite.yml b/blog/tests/Functional.suite.yml index 7b228bb50..289db8882 100644 --- a/blog/tests/Functional.suite.yml +++ b/blog/tests/Functional.suite.yml @@ -2,11 +2,11 @@ actor: FunctionalTester extensions: enabled: - Codeception\Extension\RunProcess: - 0: php -d variables_order=EGPCS -S 127.0.0.1:8080 -t public + 0: php -d variables_order=EGPCS -S 127.0.0.1:8881 -t public sleep: 1 modules: enabled: - PhpBrowser: - url: http://127.0.0.1:8080 + url: http://127.0.0.1:8881 - \App\Tests\Support\Helper\Functional step_decorators: ~ From 6c3ebd58a74a7eefa512f001067611c6bb9d9b5d Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sun, 27 Nov 2022 12:54:33 +0300 Subject: [PATCH 04/58] Disable yii-debug on specific environments (#550) --- blog-api/config/prod/params.php | 6 +++++- blog-api/config/test/params.php | 3 +++ blog/config/prod/params.php | 6 +++++- blog/config/test/params.php | 6 +++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/blog-api/config/prod/params.php b/blog-api/config/prod/params.php index 0dae23dee..3e62e040b 100644 --- a/blog-api/config/prod/params.php +++ b/blog-api/config/prod/params.php @@ -2,4 +2,8 @@ declare(strict_types=1); -return []; +return [ + 'yiisoft/yii-debug' => [ + 'enabled' => false, + ], +]; diff --git a/blog-api/config/test/params.php b/blog-api/config/test/params.php index a000b813c..1c20af8ea 100644 --- a/blog-api/config/test/params.php +++ b/blog-api/config/test/params.php @@ -6,6 +6,9 @@ use Cycle\Database\Config\SQLiteDriverConfig; return [ + 'yiisoft/yii-debug' => [ + 'enabled' => false, + ], 'yiisoft/yii-cycle' => [ // DBAL config 'dbal' => [ diff --git a/blog/config/prod/params.php b/blog/config/prod/params.php index 0dae23dee..3e62e040b 100644 --- a/blog/config/prod/params.php +++ b/blog/config/prod/params.php @@ -2,4 +2,8 @@ declare(strict_types=1); -return []; +return [ + 'yiisoft/yii-debug' => [ + 'enabled' => false, + ], +]; diff --git a/blog/config/test/params.php b/blog/config/test/params.php index 0dae23dee..3e62e040b 100644 --- a/blog/config/test/params.php +++ b/blog/config/test/params.php @@ -2,4 +2,8 @@ declare(strict_types=1); -return []; +return [ + 'yiisoft/yii-debug' => [ + 'enabled' => false, + ], +]; From ea399e45aee4d6b207c298ec3cd35041989fd60c Mon Sep 17 00:00:00 2001 From: Rustam Mamadaminov Date: Wed, 30 Nov 2022 22:14:16 +0500 Subject: [PATCH 05/58] Ignore inspector requests (#551) --- blog-api/config/params.php | 1 + blog/config/params.php | 1 + 2 files changed, 2 insertions(+) diff --git a/blog-api/config/params.php b/blog-api/config/params.php index 45742ef4c..715f4b351 100644 --- a/blog-api/config/params.php +++ b/blog-api/config/params.php @@ -22,6 +22,7 @@ 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU'], 'ignoredRequests' => [ '/debug**', + '/inspect**', ], ], 'supportEmail' => 'support@example.com', diff --git a/blog/config/params.php b/blog/config/params.php index d55bcab90..234d5ce76 100644 --- a/blog/config/params.php +++ b/blog/config/params.php @@ -33,6 +33,7 @@ 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU', 'id' => 'id-ID', 'sk' => 'sk-SK'], 'ignoredRequests' => [ '/debug**', + '/inspect**', ], ], 'mailer' => [ From e4d2eaf5b32a81d5118c9ee119ca1953d9961939 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Mon, 5 Dec 2022 20:24:10 +0300 Subject: [PATCH 06/58] Add root .gitignore (#552) --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..3d8f4408d --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# IDE & OS files +.*.swp +.DS_Store +.buildpath +.idea +.project +.settings +Thumbs.db +nbproject From f57bfa559e63e83910b8846775a290eace988e49 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Mon, 12 Dec 2022 09:49:16 +0300 Subject: [PATCH 07/58] Adapt to last changes in validator (#553) --- blog-api/config/common/validator.php | 2 +- blog/config/common/validator.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blog-api/config/common/validator.php b/blog-api/config/common/validator.php index a38539e44..a77e34f7a 100644 --- a/blog-api/config/common/validator.php +++ b/blog-api/config/common/validator.php @@ -2,7 +2,7 @@ declare(strict_types=1); -use Yiisoft\Validator\RuleHandlerContainer; +use Yiisoft\Validator\RuleHandlerResolver\RuleHandlerContainer; use Yiisoft\Validator\RuleHandlerResolverInterface; /** @var array $params */ diff --git a/blog/config/common/validator.php b/blog/config/common/validator.php index a38539e44..a77e34f7a 100644 --- a/blog/config/common/validator.php +++ b/blog/config/common/validator.php @@ -2,7 +2,7 @@ declare(strict_types=1); -use Yiisoft\Validator\RuleHandlerContainer; +use Yiisoft\Validator\RuleHandlerResolver\RuleHandlerContainer; use Yiisoft\Validator\RuleHandlerResolverInterface; /** @var array $params */ From f075d00bc1ee7ddad2d3509a466f6494bef52108 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Fri, 23 Dec 2022 19:14:29 +0300 Subject: [PATCH 08/58] Fix missing method (#556) --- blog-api/src/Queue/UserLoggedInMessage.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blog-api/src/Queue/UserLoggedInMessage.php b/blog-api/src/Queue/UserLoggedInMessage.php index 1d2cc3d92..99f879e34 100644 --- a/blog-api/src/Queue/UserLoggedInMessage.php +++ b/blog-api/src/Queue/UserLoggedInMessage.php @@ -36,4 +36,9 @@ public function getData(): array 'time' => $this->time, ]; } + + public function getMetadata(): array + { + return []; + } } From d05487c9a130b8d35c8bd773d0399b63427c2a8c Mon Sep 17 00:00:00 2001 From: Rustam Mamadaminov Date: Tue, 3 Jan 2023 10:43:23 +0500 Subject: [PATCH 09/58] Update blog deps (#560) --- blog/composer.json | 12 ++++++------ blog/psalm.xml | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/blog/composer.json b/blog/composer.json index 311b587f9..deb03e8a5 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -51,13 +51,13 @@ "yiisoft/error-handler": "^2.0", "yiisoft/factory": "^1.0", "yiisoft/form": "^1.0@dev", - "yiisoft/html": "^2.4", + "yiisoft/html": "^3.0", "yiisoft/http": "^1.2", "yiisoft/injector": "^1.0", "yiisoft/log": "^2.0", "yiisoft/log-target-file": "^2.0", - "yiisoft/mailer": "^4.0", - "yiisoft/mailer-symfony": "^2.0", + "yiisoft/mailer": "^5.0", + "yiisoft/mailer-symfony": "^2.1", "yiisoft/rate-limiter": "dev-master", "yiisoft/rbac": "^1.0", "yiisoft/rbac-php": "^1.0", @@ -71,8 +71,8 @@ "yiisoft/user": "^1.0", "yiisoft/validator": "3.0.x-dev", "yiisoft/var-dumper": "^1.0", - "yiisoft/view": "^6.0", - "yiisoft/widget": "^1.0", + "yiisoft/view": "^7.0", + "yiisoft/widget": "^1.1", "yiisoft/yii-bootstrap5": "^3.0@dev", "yiisoft/yii-console": "^1.0", "yiisoft/yii-cycle": "dev-master", @@ -99,7 +99,7 @@ "roave/security-advisories": "dev-master", "spatie/phpunit-watcher": "^1.23", "vimeo/psalm": "^4.18", - "yiisoft/translator-extractor": "^1.0", + "yiisoft/translator-extractor": "^1.1", "yiisoft/yii-debug-viewer": "^3.0@dev", "yiisoft/yii-gii": "^3.0@dev", "yiisoft/yii-testing": "dev-master" diff --git a/blog/psalm.xml b/blog/psalm.xml index a789ba20d..2a591ffa1 100755 --- a/blog/psalm.xml +++ b/blog/psalm.xml @@ -1,7 +1,6 @@ Date: Wed, 11 Jan 2023 01:08:38 +0300 Subject: [PATCH 10/58] Server (#557) --- .env.dist | 7 ++ .gitignore | 1 + ansible/.gitignore | 1 + ansible/Makefile | 11 ++ ansible/authorize.yml | 14 +++ ansible/certbot.yml | 6 ++ ansible/deploy.yml | 6 ++ ansible/hosts.yml.dist | 7 ++ .../roles/certbot/tasks/generate_dhparam.yml | 12 +++ ansible/roles/certbot/tasks/main.yml | 2 + .../certbot/tasks/update_certificates.yml | 18 ++++ ansible/roles/deploy/tasks/deploy.yml | 17 +++ ansible/roles/deploy/tasks/main.yml | 1 + ansible/roles/server/handlers/main.yml | 6 ++ ansible/roles/server/tasks/create_user.yml | 14 +++ .../server/tasks/install_dependencies.yml | 12 +++ ansible/roles/server/tasks/install_docker.yml | 56 ++++++++++ .../roles/server/tasks/install_docker_sdk.yml | 16 +++ ansible/roles/server/tasks/main.yml | 5 + ansible/roles/server/tasks/swap.yml | 39 +++++++ ansible/server.yml | 6 ++ blog-api/.dockerignore | 3 + blog-api/.env.example | 1 + blog-api/config/bootstrap.php | 7 +- blog-api/config/params.php | 6 +- blog-api/config/routes.php | 5 +- blog-api/docker/dev/nginx/Dockerfile | 9 ++ blog-api/docker/dev/nginx/nginx.conf | 49 +++++++++ blog-api/docker/dev/php/Dockerfile | 70 ++++++++++++ blog-api/docker/dev/php/conf.d/php.ini | 28 +++++ blog-api/docker/dev/php/php-fpm.d/www.conf | 20 ++++ blog-api/docker/docker-entrypoint.sh | 16 +++ blog-api/docker/prod/nginx/Dockerfile | 9 ++ blog-api/docker/prod/nginx/nginx.conf | 48 +++++++++ blog-api/docker/prod/php/Dockerfile | 72 +++++++++++++ blog-api/docker/prod/php/conf.d/php.ini | 18 ++++ blog-api/docker/prod/php/php-fpm.d/www.conf | 21 ++++ blog/.dockerignore | 3 + blog/.env.example | 1 + blog/config/bootstrap.php | 7 +- blog/config/params.php | 6 +- blog/config/routes.php | 9 +- blog/docker/dev/nginx/Dockerfile | 9 ++ blog/docker/dev/nginx/nginx.conf | 49 +++++++++ blog/docker/dev/php/Dockerfile | 70 ++++++++++++ blog/docker/dev/php/conf.d/php.ini | 28 +++++ blog/docker/dev/php/php-fpm.d/www.conf | 20 ++++ blog/docker/docker-entrypoint.sh | 16 +++ blog/docker/prod/nginx/Dockerfile | 9 ++ blog/docker/prod/nginx/nginx.conf | 48 +++++++++ blog/docker/prod/php/Dockerfile | 72 +++++++++++++ blog/docker/prod/php/conf.d/php.ini | 18 ++++ blog/docker/prod/php/php-fpm.d/www.conf | 21 ++++ demo/Dockerfile | 7 ++ demo/html/index.html | 67 ++++++++++++ docker-compose.override.yml | 46 ++++++++ docker-compose.yml | 102 ++++++++++++++++++ gateway/nginx/dev/Dockerfile | 8 ++ .../nginx/dev/templates/http.conf.template | 64 +++++++++++ gateway/nginx/prod/Dockerfile | 12 +++ gateway/nginx/prod/backup/http.conf.template | 72 +++++++++++++ gateway/nginx/prod/backup/https.conf.template | 94 ++++++++++++++++ .../nginx/prod/templates/https.conf.template | 94 ++++++++++++++++ var/.gitignore | 3 + var/ssl/www/.gitignore | 2 + 65 files changed, 1588 insertions(+), 8 deletions(-) create mode 100644 .env.dist create mode 100644 ansible/.gitignore create mode 100644 ansible/Makefile create mode 100644 ansible/authorize.yml create mode 100644 ansible/certbot.yml create mode 100644 ansible/deploy.yml create mode 100644 ansible/hosts.yml.dist create mode 100644 ansible/roles/certbot/tasks/generate_dhparam.yml create mode 100644 ansible/roles/certbot/tasks/main.yml create mode 100644 ansible/roles/certbot/tasks/update_certificates.yml create mode 100644 ansible/roles/deploy/tasks/deploy.yml create mode 100644 ansible/roles/deploy/tasks/main.yml create mode 100644 ansible/roles/server/handlers/main.yml create mode 100644 ansible/roles/server/tasks/create_user.yml create mode 100644 ansible/roles/server/tasks/install_dependencies.yml create mode 100644 ansible/roles/server/tasks/install_docker.yml create mode 100644 ansible/roles/server/tasks/install_docker_sdk.yml create mode 100644 ansible/roles/server/tasks/main.yml create mode 100644 ansible/roles/server/tasks/swap.yml create mode 100644 ansible/server.yml create mode 100644 blog-api/.dockerignore create mode 100644 blog-api/docker/dev/nginx/Dockerfile create mode 100644 blog-api/docker/dev/nginx/nginx.conf create mode 100644 blog-api/docker/dev/php/Dockerfile create mode 100644 blog-api/docker/dev/php/conf.d/php.ini create mode 100644 blog-api/docker/dev/php/php-fpm.d/www.conf create mode 100644 blog-api/docker/docker-entrypoint.sh create mode 100644 blog-api/docker/prod/nginx/Dockerfile create mode 100644 blog-api/docker/prod/nginx/nginx.conf create mode 100644 blog-api/docker/prod/php/Dockerfile create mode 100644 blog-api/docker/prod/php/conf.d/php.ini create mode 100644 blog-api/docker/prod/php/php-fpm.d/www.conf create mode 100644 blog/.dockerignore create mode 100644 blog/docker/dev/nginx/Dockerfile create mode 100644 blog/docker/dev/nginx/nginx.conf create mode 100644 blog/docker/dev/php/Dockerfile create mode 100644 blog/docker/dev/php/conf.d/php.ini create mode 100644 blog/docker/dev/php/php-fpm.d/www.conf create mode 100644 blog/docker/docker-entrypoint.sh create mode 100644 blog/docker/prod/nginx/Dockerfile create mode 100644 blog/docker/prod/nginx/nginx.conf create mode 100644 blog/docker/prod/php/Dockerfile create mode 100644 blog/docker/prod/php/conf.d/php.ini create mode 100644 blog/docker/prod/php/php-fpm.d/www.conf create mode 100644 demo/Dockerfile create mode 100644 demo/html/index.html create mode 100644 docker-compose.override.yml create mode 100644 docker-compose.yml create mode 100644 gateway/nginx/dev/Dockerfile create mode 100644 gateway/nginx/dev/templates/http.conf.template create mode 100644 gateway/nginx/prod/Dockerfile create mode 100644 gateway/nginx/prod/backup/http.conf.template create mode 100644 gateway/nginx/prod/backup/https.conf.template create mode 100644 gateway/nginx/prod/templates/https.conf.template create mode 100644 var/.gitignore create mode 100644 var/ssl/www/.gitignore diff --git a/.env.dist b/.env.dist new file mode 100644 index 000000000..291308b17 --- /dev/null +++ b/.env.dist @@ -0,0 +1,7 @@ +COMPOSE_PROJECT_NAME=yii-demo + +REGISTRY=localhost +DOMAIN=yii-demo.localhost +SUPPORT_EMAIL=team@yiiframework.com +# Get short image tag git rev-parse --short HEAD +IMAGE_TAG=00001 diff --git a/.gitignore b/.gitignore index 3d8f4408d..d4be79aef 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ .settings Thumbs.db nbproject +.env diff --git a/ansible/.gitignore b/ansible/.gitignore new file mode 100644 index 000000000..1ba9c4b7b --- /dev/null +++ b/ansible/.gitignore @@ -0,0 +1 @@ +hosts.yml diff --git a/ansible/Makefile b/ansible/Makefile new file mode 100644 index 000000000..bc2067bb2 --- /dev/null +++ b/ansible/Makefile @@ -0,0 +1,11 @@ +server: + python3 -m ansible playbook -i hosts.yml server.yml -vv + +deploy: + python3 -m ansible playbook -i hosts.yml deploy.yml -vv + +authorize: + python3 -m ansible playbook -i hosts.yml authorize.yml + +certbot: + python3 -m ansible playbook -i hosts.yml certbot.yml diff --git a/ansible/authorize.yml b/ansible/authorize.yml new file mode 100644 index 000000000..eaf41823d --- /dev/null +++ b/ansible/authorize.yml @@ -0,0 +1,14 @@ +--- +- name: Add authorized key + hosts: all + remote_user: root + tasks: + - name: Add user authorized key + authorized_key: + user: deploy + key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" + +- name: Add deploy user to the sudoers + copy: + dest: "/etc/sudoers.d/deploy" + content: "deploy ALL=(ALL) NOPASSWD: ALL" diff --git a/ansible/certbot.yml b/ansible/certbot.yml new file mode 100644 index 000000000..3f8894e00 --- /dev/null +++ b/ansible/certbot.yml @@ -0,0 +1,6 @@ +--- +- name: Renew certificates + hosts: all + remote_user: root + roles: + - certbot diff --git a/ansible/deploy.yml b/ansible/deploy.yml new file mode 100644 index 000000000..870ca3e5c --- /dev/null +++ b/ansible/deploy.yml @@ -0,0 +1,6 @@ +--- +- name: Deploy services + hosts: all + remote_user: root + roles: + - deploy diff --git a/ansible/hosts.yml.dist b/ansible/hosts.yml.dist new file mode 100644 index 000000000..9a86cca33 --- /dev/null +++ b/ansible/hosts.yml.dist @@ -0,0 +1,7 @@ +all: + hosts: + demo.yiiframework.com: + ansible_connection: ssh + ansible_user: root + ansible_host: 0.0.0.0 + ansible_port: 22 diff --git a/ansible/roles/certbot/tasks/generate_dhparam.yml b/ansible/roles/certbot/tasks/generate_dhparam.yml new file mode 100644 index 000000000..c2f2f22d7 --- /dev/null +++ b/ansible/roles/certbot/tasks/generate_dhparam.yml @@ -0,0 +1,12 @@ +--- +- name: Create folder + file: + path: /home/deploy/demo.yiiframework.com/var/ssl/dhparam + state: directory + recurse: true + +- name: Generate dhparam + command: openssl dhparam -out ./var/ssl/dhparam/dhparam-2048.pem 2048 + args: + chdir: /home/deploy/demo.yiiframework.com + creates: ./var/ssl/dhparam/dhparam-2048.pem \ No newline at end of file diff --git a/ansible/roles/certbot/tasks/main.yml b/ansible/roles/certbot/tasks/main.yml new file mode 100644 index 000000000..1d3a88704 --- /dev/null +++ b/ansible/roles/certbot/tasks/main.yml @@ -0,0 +1,2 @@ +- import_tasks: generate_dhparam.yml +- import_tasks: update_certificates.yml diff --git a/ansible/roles/certbot/tasks/update_certificates.yml b/ansible/roles/certbot/tasks/update_certificates.yml new file mode 100644 index 000000000..02f79c583 --- /dev/null +++ b/ansible/roles/certbot/tasks/update_certificates.yml @@ -0,0 +1,18 @@ +--- +- name: Up docker services + become: true + become_user: deploy + args: + chdir: /home/deploy/demo.yiiframework.com + shell: docker-compose -f docker-compose.yml up certbot + register: output + +- debug: + var: output.stdout_lines + +- name: Reload nginx service + become: true + become_user: deploy + args: + chdir: /home/deploy/demo.yiiframework.com + shell: docker-compose -f docker-compose.yml exec gateway nginx -t && docker-compose -f docker-compose.yml exec gateway nginx -s reload diff --git a/ansible/roles/deploy/tasks/deploy.yml b/ansible/roles/deploy/tasks/deploy.yml new file mode 100644 index 000000000..7dbdcea21 --- /dev/null +++ b/ansible/roles/deploy/tasks/deploy.yml @@ -0,0 +1,17 @@ +--- +- name: Chown + file: + path: "{{ item }}" + recurse: true + owner: deploy + group: deploy + loop: + - /home/deploy/demo.yiiframework.com/blog + - /home/deploy/demo.yiiframework.com/blog-api + +- name: Run `docker-compose up` + become: true + become_user: deploy + args: + chdir: ~/demo.yiiframework.com + shell: docker-compose -f docker-compose.yml up -d --build diff --git a/ansible/roles/deploy/tasks/main.yml b/ansible/roles/deploy/tasks/main.yml new file mode 100644 index 000000000..b647b2e4c --- /dev/null +++ b/ansible/roles/deploy/tasks/main.yml @@ -0,0 +1 @@ +- import_tasks: deploy.yml diff --git a/ansible/roles/server/handlers/main.yml b/ansible/roles/server/handlers/main.yml new file mode 100644 index 000000000..96f76bca7 --- /dev/null +++ b/ansible/roles/server/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: Start docker on system boot + systemd: + name: docker + state: started + enabled: yes diff --git a/ansible/roles/server/tasks/create_user.yml b/ansible/roles/server/tasks/create_user.yml new file mode 100644 index 000000000..e4458e1d4 --- /dev/null +++ b/ansible/roles/server/tasks/create_user.yml @@ -0,0 +1,14 @@ +--- +- name: Create deploy user + vars: + newpassword: "SomEP@$$w0rd" + user: + name: deploy + password: "{{ newpassword }}" + update_password: always + groups: + - docker + - www-data + state: present + shell: /bin/bash + diff --git a/ansible/roles/server/tasks/install_dependencies.yml b/ansible/roles/server/tasks/install_dependencies.yml new file mode 100644 index 000000000..3628608e3 --- /dev/null +++ b/ansible/roles/server/tasks/install_dependencies.yml @@ -0,0 +1,12 @@ +--- +- name: Install `passlib` for Python + pip: + name: + - passlib + state: present + +- name: Install `composer` into system + apt: + name: + - composer + state: present \ No newline at end of file diff --git a/ansible/roles/server/tasks/install_docker.yml b/ansible/roles/server/tasks/install_docker.yml new file mode 100644 index 000000000..72a904348 --- /dev/null +++ b/ansible/roles/server/tasks/install_docker.yml @@ -0,0 +1,56 @@ +--- +- name: Install `docker` dependencies + apt: + name: + - apt-transport-https + - ca-certificates + - curl + - software-properties-common + state: present + update_cache: yes + +- name: Add GPG key + apt_key: + url: https://download.docker.com/linux/debian/gpg + state: present + +- name: Verify fingerprint + apt_key: + id: 0EBFCD88 + state: present + +- name: Set up the repository + apt_repository: + repo: deb [arch=amd64] https://download.docker.com/linux/debian stretch stable + state: present + filename: docker + update_cache: yes + +- name: Install `docker` + apt: + name: docker-ce + state: present + update_cache: yes + notify: Start docker on boot + +- name: Install `docker-compose` + get_url: + url: https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-{{ ansible_system }}-{{ ansible_userspace_architecture }} + dest: /usr/local/bin/docker-compose + group: docker + mode: 'u+x,g+x' + +- name: Set periodic Docker prune + cron: + name: docker-prune + job: 'docker system prune -af --filter "until=$((30*24))h"' + minute: '0' + hour: '1' + +- name: Remove useless packages + apt: + autoclean: yes + +- name: Remove useless dependencies + apt: + autoremove: yes diff --git a/ansible/roles/server/tasks/install_docker_sdk.yml b/ansible/roles/server/tasks/install_docker_sdk.yml new file mode 100644 index 000000000..9f4446707 --- /dev/null +++ b/ansible/roles/server/tasks/install_docker_sdk.yml @@ -0,0 +1,16 @@ +--- +- name: Install Docker SDK dependencies + apt: + name: + - python3-pip + - python-setuptools + - virtualenv + state: present + update_cache: yes + +- name: Install Docker SDK for Python + pip: + name: + - docker + state: present + diff --git a/ansible/roles/server/tasks/main.yml b/ansible/roles/server/tasks/main.yml new file mode 100644 index 000000000..aca866440 --- /dev/null +++ b/ansible/roles/server/tasks/main.yml @@ -0,0 +1,5 @@ +- import_tasks: swap.yml +- import_tasks: install_dependencies.yml +- import_tasks: install_docker.yml +- import_tasks: install_docker_sdk.yml +- import_tasks: create_user.yml diff --git a/ansible/roles/server/tasks/swap.yml b/ansible/roles/server/tasks/swap.yml new file mode 100644 index 000000000..f407a3f2a --- /dev/null +++ b/ansible/roles/server/tasks/swap.yml @@ -0,0 +1,39 @@ +--- +- name: Check whether swap is already enabled or not + shell: cat /etc/sysctl.conf + register: swap_enabled + +- block: + - name: create swap file + command: dd if=/dev/zero of=/swapfile bs=1G count=8 + + - name: change permission type + file: path=/swapfile mode=600 state=file + + - name: setup swap + command: mkswap /swapfile + + - name: create swap + command: swapon /swapfile + + - name: Add to fstab + lineinfile: + path: /etc/fstab + regexp: "swapfile" + line: "/swapfile none swap sw 0 0" + state: present + + - name: start swap + command: swapon -a + + - name: set swapiness + sysctl: + name: vm.swappiness + value: "10" + + - name: set swapiness + sysctl: + name: vm.vfs_cache_pressure + value: "50" + + when: swap_enabled.stdout.find('swappiness') == -1 \ No newline at end of file diff --git a/ansible/server.yml b/ansible/server.yml new file mode 100644 index 000000000..cdd26f9b8 --- /dev/null +++ b/ansible/server.yml @@ -0,0 +1,6 @@ +--- +- name: Setup server + hosts: all + remote_user: root + roles: + - server diff --git a/blog-api/.dockerignore b/blog-api/.dockerignore new file mode 100644 index 000000000..24e04c973 --- /dev/null +++ b/blog-api/.dockerignore @@ -0,0 +1,3 @@ +runtime/ +!runtime/.gitignore +vendor/ diff --git a/blog-api/.env.example b/blog-api/.env.example index 988a14f89..430164434 100644 --- a/blog-api/.env.example +++ b/blog-api/.env.example @@ -1,2 +1,3 @@ YII_ENV= YII_DEBUG=true +BASE_URL=/blog-api diff --git a/blog-api/config/bootstrap.php b/blog-api/config/bootstrap.php index 0dae23dee..49544496a 100644 --- a/blog-api/config/bootstrap.php +++ b/blog-api/config/bootstrap.php @@ -2,4 +2,9 @@ declare(strict_types=1); -return []; +return [ + function (Psr\Container\ContainerInterface $container) { + $urlGenerator = $container->get(\Yiisoft\Router\UrlGeneratorInterface::class); + $urlGenerator->setUriPrefix($_ENV['BASE_URL']); + }, +]; diff --git a/blog-api/config/params.php b/blog-api/config/params.php index 715f4b351..bfd9f32aa 100644 --- a/blog-api/config/params.php +++ b/blog-api/config/params.php @@ -38,7 +38,7 @@ '@root' => dirname(__DIR__), '@assets' => '@public/assets', '@assetsUrl' => '@baseUrl/assets', - '@baseUrl' => '/', + '@baseUrl' => $_ENV['BASE_URL'], '@data' => '@root/data', '@messages' => '@resources/messages', '@public' => '@root/public', @@ -162,4 +162,8 @@ LoggingAuthorizationHandler::CHANNEL => SynchronousAdapter::class, ], ], + + 'yiisoft/yii-debug-api' => [ + 'allowedIPs' => ['172.0.0.1/10'], + ], ]; diff --git a/blog-api/config/routes.php b/blog-api/config/routes.php index a2c6838f7..6e01dbe76 100644 --- a/blog-api/config/routes.php +++ b/blog-api/config/routes.php @@ -12,6 +12,7 @@ use Yiisoft\DataResponse\Middleware\FormatDataResponseAsJson; use Yiisoft\Router\Group; use Yiisoft\Router\Route; +use Yiisoft\Router\UrlGeneratorInterface; use Yiisoft\Swagger\Middleware\SwaggerJson; use Yiisoft\Swagger\Middleware\SwaggerUi; @@ -55,7 +56,9 @@ ->routes( Route::get('') ->middleware(FormatDataResponseAsHtml::class) - ->action(fn (SwaggerUi $swaggerUi) => $swaggerUi->withJsonUrl('/docs/openapi.json')), + ->action(function (SwaggerUi $swaggerUi, UrlGeneratorInterface $urlGenerator) { + return $swaggerUi->withJsonUrl($urlGenerator->getUriPrefix() . '/docs/openapi.json'); + }), Route::get('/openapi.json') ->middleware(FormatDataResponseAsJson::class) ->action(SwaggerJson::class), diff --git a/blog-api/docker/dev/nginx/Dockerfile b/blog-api/docker/dev/nginx/Dockerfile new file mode 100644 index 000000000..b98399633 --- /dev/null +++ b/blog-api/docker/dev/nginx/Dockerfile @@ -0,0 +1,9 @@ +FROM nginx:1.21.1-alpine + +RUN apk add --no-cache curl + +WORKDIR /app/public + +COPY docker/dev/nginx/nginx.conf /etc/nginx/conf.d/default.conf +COPY public ./ + diff --git a/blog-api/docker/dev/nginx/nginx.conf b/blog-api/docker/dev/nginx/nginx.conf new file mode 100644 index 000000000..12b6d1b40 --- /dev/null +++ b/blog-api/docker/dev/nginx/nginx.conf @@ -0,0 +1,49 @@ +server { + listen 80 default_server; + server_name default; + client_max_body_size 15m; + root /app/public; + resolver 127.0.0.11 ipv6=off; + server_tokens off; + + location /health { + add_header Content-Type text/plain; + access_log off; + return 200 'alive'; + } + + location /assets { + root /app/public; + } + + location / { + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization' always; + add_header 'Access-Control-Max-Age' 1728000; + if ($request_method = 'OPTIONS') { + add_header 'Content-Type' 'text/plain; charset=utf-8'; + add_header 'Content-Length' 0; + return 204; + } + try_files $uri /index.php?$args; + } + + location ~ ^/index\.php(/|$) { + set $upstream blog-api-backend:9000; + fastcgi_read_timeout 60; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass $upstream; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param SERVER_NAME $server_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/blog-api/docker/dev/php/Dockerfile b/blog-api/docker/dev/php/Dockerfile new file mode 100644 index 000000000..6e867bce3 --- /dev/null +++ b/blog-api/docker/dev/php/Dockerfile @@ -0,0 +1,70 @@ +# the different stages of this Dockerfile are meant to be built into separate images +# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage +# https://docs.docker.com/compose/compose-file/#target + + +# https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +FROM php:8.1-fpm-alpine as stage + +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +ENV COMPOSER_ALLOW_SUPERUSER=1 +ENV PATH="${PATH}:/root/.composer/vendor/bin" + +RUN set -eux \ + && apk add --no-cache \ + acl fcgi file gettext git nano curl \ + && apk add --no-cache --virtual .build-deps \ + $PHPIZE_DEPS icu-dev libzip-dev zlib-dev \ + \ + && docker-php-ext-configure zip \ + && docker-php-ext-install -j$(nproc) intl zip \ + && docker-php-ext-enable opcache \ + \ + && runDeps="$( \ + scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \ + | tr ',' '\n' \ + | sort -u \ + | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ + )" \ + && apk add --no-cache --virtual .pgsql-deps \ + $runDeps postgresql-dev so:libpq.so.5 \ + && docker-php-ext-install -j$(nproc) pdo_pgsql + +RUN apk add oniguruma-dev \ + && docker-php-ext-install mbstring \ + \ + && apk add --repository http://dl-3.alpinelinux.org/alpine/edge/community \ + rabbitmq-c-dev \ + && pecl install xdebug-3.1.4 amqp-1.11.0 \ + && docker-php-ext-enable xdebug amqp \ + \ + && apk del .build-deps \ + && pecl clear-cache \ + && rm -rf /tmp/pear \ + && docker-php-source delete \ + && rm -rf /var/cache/apk/* + +RUN ln -s $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini + +WORKDIR /app + +COPY docker/dev/php/conf.d/ $PHP_INI_DIR/conf.d/ +COPY docker/dev/php/php-fpm.d/ /usr/local/etc/php-fpm.d/ + +COPY composer.json composer.lock* ./ + +RUN composer install --no-plugins --no-scripts --prefer-dist \ + && composer clear-cache + +COPY ./ ./ + +RUN composer run-script --no-dev post-install-cmd + +HEALTHCHECK --interval=30s --timeout=5s --start-period=1s \ + CMD REQUEST_METHOD=GET SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping cgi-fcgi -bind -connect 127.0.0.1:9000 + +RUN chmod 0555 ./docker/docker-entrypoint.sh +ENTRYPOINT ["docker/docker-entrypoint.sh"] + +CMD ["php-fpm"] diff --git a/blog-api/docker/dev/php/conf.d/php.ini b/blog-api/docker/dev/php/conf.d/php.ini new file mode 100644 index 000000000..c80827193 --- /dev/null +++ b/blog-api/docker/dev/php/conf.d/php.ini @@ -0,0 +1,28 @@ +;apc.enable_cli = 1 +date.timezone = UTC +session.auto_start = Off +short_open_tag = Off +expose_php = Off +upload_max_filesize = 15M +post_max_size = 150M +memory_limit = 256M + +# https://symfony.com/doc/current/performance.html +opcache.interned_strings_buffer = 16 +opcache.max_accelerated_files = 20000 +opcache.memory_consumption = 256 +realpath_cache_size = 4096K +realpath_cache_ttl = 600 +max_execution_time = 300 +max_input_time = 300 + +[xdebug] +xdebug.mode = develop,debug +xdebug.client_host = host.docker.internal +;xdebug.discover_client_host=true +xdebug.show_error_trace = 0 +xdebug.start_with_request = trigger +;xdebug.client_host=host-gateway +;xdebug.start_with_request= +xdebug.client_port = 9001 +xdebug.log_level = 10 diff --git a/blog-api/docker/dev/php/php-fpm.d/www.conf b/blog-api/docker/dev/php/php-fpm.d/www.conf new file mode 100644 index 000000000..55df850b8 --- /dev/null +++ b/blog-api/docker/dev/php/php-fpm.d/www.conf @@ -0,0 +1,20 @@ +[global] +daemonize = no +process_control_timeout = 20 +error_log = /proc/self/fd/2 + +[www] +user = www-data +group = www-data +listen = 9000 +listen.mode = 0666 +ping.path = /ping +ping.response = pong +clear_env = off +pm = dynamic +pm.status_path = /status +pm.max_children = 25 +pm.start_servers = 10 +pm.min_spare_servers = 5 +pm.max_spare_servers = 20 +pm.max_requests = 500 diff --git a/blog-api/docker/docker-entrypoint.sh b/blog-api/docker/docker-entrypoint.sh new file mode 100644 index 000000000..fd0a4a126 --- /dev/null +++ b/blog-api/docker/docker-entrypoint.sh @@ -0,0 +1,16 @@ +#!/bin/sh +set -e + +ls -la +# first arg is `-f` or `--some-option` +if [ "${1#-}" != "$1" ]; then + set -- php-fpm "$@" +fi +set -e + +if [ "$1" = 'php-fpm' ] || [ "$1" = 'php' ] || [ "$1" = 'yii' ]; then + setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX runtime public + setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX runtime public +fi + +exec "$@" diff --git a/blog-api/docker/prod/nginx/Dockerfile b/blog-api/docker/prod/nginx/Dockerfile new file mode 100644 index 000000000..94cf7d82f --- /dev/null +++ b/blog-api/docker/prod/nginx/Dockerfile @@ -0,0 +1,9 @@ +FROM nginx:1.21.1-alpine + +RUN apk add --no-cache curl + +COPY docker/prod/nginx/nginx.conf /etc/nginx/conf.d/default.conf + +WORKDIR /app/public + +HEALTHCHECK --interval=30s --timeout=5s --start-period=1s CMD curl --fail http://127.0.0.1/health || exit 1 diff --git a/blog-api/docker/prod/nginx/nginx.conf b/blog-api/docker/prod/nginx/nginx.conf new file mode 100644 index 000000000..55c61adbb --- /dev/null +++ b/blog-api/docker/prod/nginx/nginx.conf @@ -0,0 +1,48 @@ +server { + listen 80 default_server; + root /app/public; + client_max_body_size 15m; + resolver 127.0.0.11 ipv6=off; + server_tokens off; + + location /health { + add_header Content-Type text/plain; + access_log off; + return 200 'alive'; + } + + location /assets { + root /app/public; + } + + location / { + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization' always; + add_header 'Access-Control-Max-Age' 1728000; + if ($request_method = 'OPTIONS') { + add_header 'Content-Type' 'text/plain; charset=utf-8'; + add_header 'Content-Length' 0; + return 204; + } + try_files $uri /index.php?$args; + } + + location ~ ^/index\.php(/|$) { + set $upstream blog-api-backend:9000; + fastcgi_read_timeout 60; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass $upstream; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param SERVER_NAME $server_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/blog-api/docker/prod/php/Dockerfile b/blog-api/docker/prod/php/Dockerfile new file mode 100644 index 000000000..8c221b3ce --- /dev/null +++ b/blog-api/docker/prod/php/Dockerfile @@ -0,0 +1,72 @@ +# the different stages of this Dockerfile are meant to be built into separate images +# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage +# https://docs.docker.com/compose/compose-file/#target + + +# https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +FROM php:8.1-fpm-alpine as stage + +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +ENV COMPOSER_ALLOW_SUPERUSER=1 +ENV PATH="${PATH}:/root/.composer/vendor/bin" + +RUN set -eux \ + && apk add --no-cache \ + acl fcgi file gettext git nano curl \ + && apk add --no-cache --virtual .build-deps \ + $PHPIZE_DEPS icu-dev libzip-dev zlib-dev \ + \ + && docker-php-ext-configure zip \ + && docker-php-ext-install -j$(nproc) intl zip \ + && docker-php-ext-enable opcache \ + \ + && runDeps="$( \ + scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \ + | tr ',' '\n' \ + | sort -u \ + | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ + )" \ + && apk add --no-cache --virtual .pgsql-deps \ + $runDeps postgresql-dev so:libpq.so.5 \ + && docker-php-ext-install -j$(nproc) pdo_pgsql \ + \ + && apk add oniguruma-dev \ + && docker-php-ext-install mbstring \ + \ + && apk add --repository http://dl-3.alpinelinux.org/alpine/edge/community \ + rabbitmq-c-dev \ + && pecl install amqp-1.11.0 \ + && docker-php-ext-enable amqp \ + && apk del .build-deps \ + && pecl clear-cache \ + && rm -rf /tmp/pear \ + && docker-php-source delete \ + && rm -rf /var/cache/apk/* + +RUN ln -s $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini + +WORKDIR /app + +COPY docker/prod/php/conf.d/ $PHP_INI_DIR/conf.d/ +COPY docker/prod/php/php-fpm.d/ /usr/local/etc/php-fpm.d/ + +COPY composer.json composer.lock* ./ + +RUN set -eux \ + && composer install --no-plugins --no-scripts --prefer-dist \ + && composer clear-cache + +COPY ./ ./ + +RUN set -eux \ + && composer dump-autoload --classmap-authoritative \ + && composer run-script --no-dev post-install-cmd + +HEALTHCHECK --interval=30s --timeout=5s --start-period=1s \ + CMD REQUEST_METHOD=GET SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping cgi-fcgi -bind -connect 127.0.0.1:9000 + +RUN chmod 0555 ./docker/docker-entrypoint.sh +ENTRYPOINT ["docker/docker-entrypoint.sh"] + +CMD ["php-fpm"] diff --git a/blog-api/docker/prod/php/conf.d/php.ini b/blog-api/docker/prod/php/conf.d/php.ini new file mode 100644 index 000000000..b723da7a0 --- /dev/null +++ b/blog-api/docker/prod/php/conf.d/php.ini @@ -0,0 +1,18 @@ +;apc.enable_cli = 1 +date.timezone = UTC +session.auto_start = Off +short_open_tag = Off +expose_php = Off +upload_max_filesize = 15M +post_max_size = 150M +memory_limit = 512M +display_errors = Off + +# https://symfony.com/doc/current/performance.html +opcache.interned_strings_buffer = 16 +opcache.max_accelerated_files = 20000 +opcache.memory_consumption = 256 +opcache.validate_timestamps = 0 +realpath_cache_size = 4096K +realpath_cache_ttl = 600 +opcache.preload_user = www-data diff --git a/blog-api/docker/prod/php/php-fpm.d/www.conf b/blog-api/docker/prod/php/php-fpm.d/www.conf new file mode 100644 index 000000000..81ab6ab2a --- /dev/null +++ b/blog-api/docker/prod/php/php-fpm.d/www.conf @@ -0,0 +1,21 @@ +[global] +daemonize = no +process_control_timeout = 20 +error_log = /proc/self/fd/2 + +[www] +user = www-data +group = www-data +listen = 9000 +listen.mode = 0666 +clear_env = off +; access.suppress_path[] = /ping +ping.path = /ping +ping.response = pong +pm = dynamic +pm.status_path = /status +pm.max_children = 25 +pm.start_servers = 10 +pm.min_spare_servers = 5 +pm.max_spare_servers = 20 +pm.max_requests = 500 diff --git a/blog/.dockerignore b/blog/.dockerignore new file mode 100644 index 000000000..24e04c973 --- /dev/null +++ b/blog/.dockerignore @@ -0,0 +1,3 @@ +runtime/ +!runtime/.gitignore +vendor/ diff --git a/blog/.env.example b/blog/.env.example index 190a319f9..1c0ba5ff0 100644 --- a/blog/.env.example +++ b/blog/.env.example @@ -1,3 +1,4 @@ YII_ENV= YII_DEBUG=true SENTRY_DSN= +BASE_URL=/blog diff --git a/blog/config/bootstrap.php b/blog/config/bootstrap.php index 0dae23dee..49544496a 100644 --- a/blog/config/bootstrap.php +++ b/blog/config/bootstrap.php @@ -2,4 +2,9 @@ declare(strict_types=1); -return []; +return [ + function (Psr\Container\ContainerInterface $container) { + $urlGenerator = $container->get(\Yiisoft\Router\UrlGeneratorInterface::class); + $urlGenerator->setUriPrefix($_ENV['BASE_URL']); + }, +]; diff --git a/blog/config/params.php b/blog/config/params.php index 234d5ce76..af5fa3082 100644 --- a/blog/config/params.php +++ b/blog/config/params.php @@ -55,7 +55,7 @@ '@root' => dirname(__DIR__), '@assets' => '@root/public/assets', '@assetsUrl' => '@baseUrl/assets', - '@baseUrl' => '/', + '@baseUrl' => $_ENV['BASE_URL'], '@messages' => '@resources/messages', '@npm' => '@root/node_modules', '@public' => '@root/public', @@ -234,4 +234,8 @@ 'environment' => $_ENV['YII_ENV'] ?? null, // Add to separate "production" / "staging" environment errors. ], ], + + 'yiisoft/yii-debug-api' => [ + 'allowedIPs' => ['172.0.0.1/10'], + ], ]; diff --git a/blog/config/routes.php b/blog/config/routes.php index 118f399b4..d06a4a7a8 100644 --- a/blog/config/routes.php +++ b/blog/config/routes.php @@ -28,6 +28,7 @@ use Yiisoft\Router\CurrentRoute; use Yiisoft\Router\Group; use Yiisoft\Router\Route; +use Yiisoft\Router\UrlGeneratorInterface; use Yiisoft\Swagger\Middleware\SwaggerJson; use Yiisoft\Swagger\Middleware\SwaggerUi; use Yiisoft\Yii\Middleware\HttpCache; @@ -163,13 +164,15 @@ ), // Swagger routes - Group::create('/swagger') + Group::create('/docs') ->routes( Route::get('') ->middleware(FormatDataResponseAsHtml::class) - ->action(fn (SwaggerUi $swaggerUi) => $swaggerUi->withJsonUrl('/swagger/json-url')) + ->action(function (SwaggerUi $swaggerUi, UrlGeneratorInterface $urlGenerator) { + return $swaggerUi->withJsonUrl($urlGenerator->getUriPrefix() . '/docs/openapi.json'); + }) ->name('swagger/index'), - Route::get('/json-url') + Route::get('/openapi.json') ->middleware(FormatDataResponseAsJson::class) ->action(SwaggerJson::class), ), diff --git a/blog/docker/dev/nginx/Dockerfile b/blog/docker/dev/nginx/Dockerfile new file mode 100644 index 000000000..b98399633 --- /dev/null +++ b/blog/docker/dev/nginx/Dockerfile @@ -0,0 +1,9 @@ +FROM nginx:1.21.1-alpine + +RUN apk add --no-cache curl + +WORKDIR /app/public + +COPY docker/dev/nginx/nginx.conf /etc/nginx/conf.d/default.conf +COPY public ./ + diff --git a/blog/docker/dev/nginx/nginx.conf b/blog/docker/dev/nginx/nginx.conf new file mode 100644 index 000000000..08a529efd --- /dev/null +++ b/blog/docker/dev/nginx/nginx.conf @@ -0,0 +1,49 @@ +server { + listen 80 default_server; + server_name default; + client_max_body_size 15m; + root /app/public; + resolver 127.0.0.11 ipv6=off; + server_tokens off; + + location /health { + add_header Content-Type text/plain; + access_log off; + return 200 'alive'; + } + + location /assets { + root /app/public; + } + + location / { + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization' always; + add_header 'Access-Control-Max-Age' 1728000; + if ($request_method = 'OPTIONS') { + add_header 'Content-Type' 'text/plain; charset=utf-8'; + add_header 'Content-Length' 0; + return 204; + } + try_files $uri /index.php?$args; + } + + location ~ ^/index\.php(/|$) { + set $upstream blog-backend:9000; + fastcgi_read_timeout 60; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass $upstream; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param SERVER_NAME $server_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/blog/docker/dev/php/Dockerfile b/blog/docker/dev/php/Dockerfile new file mode 100644 index 000000000..a179d8c36 --- /dev/null +++ b/blog/docker/dev/php/Dockerfile @@ -0,0 +1,70 @@ +# the different stages of this Dockerfile are meant to be built into separate images +# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage +# https://docs.docker.com/compose/compose-file/#target + + +# https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +FROM php:8.1-fpm-alpine as stage + +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +ENV COMPOSER_ALLOW_SUPERUSER=1 +ENV PATH="${PATH}:/root/.composer/vendor/bin" + +RUN set -eux \ + && apk add --no-cache \ + acl fcgi file gettext git nano curl \ + && apk add --no-cache --virtual .build-deps \ + $PHPIZE_DEPS icu-dev libzip-dev zlib-dev \ + \ + && docker-php-ext-configure zip \ + && docker-php-ext-install -j$(nproc) intl zip \ + && docker-php-ext-enable opcache \ + \ + && runDeps="$( \ + scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \ + | tr ',' '\n' \ + | sort -u \ + | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ + )" \ + && apk add --no-cache --virtual .pgsql-deps \ + $runDeps postgresql-dev so:libpq.so.5 \ + && docker-php-ext-install -j$(nproc) pdo_pgsql + +RUN apk add oniguruma-dev \ + && docker-php-ext-install mbstring \ + \ + && apk add --repository http://dl-3.alpinelinux.org/alpine/edge/community \ + rabbitmq-c-dev \ + && pecl install xdebug-3.1.4 amqp-1.11.0 \ + && docker-php-ext-enable xdebug amqp \ + \ + && apk del .build-deps \ + && pecl clear-cache \ + && rm -rf /tmp/pear \ + && docker-php-source delete \ + && rm -rf /var/cache/apk/* + +RUN ln -s $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini + +WORKDIR /app + +COPY docker/dev/php/conf.d/ $PHP_INI_DIR/conf.d/ +COPY docker/dev/php/php-fpm.d/ /usr/local/etc/php-fpm.d/ + +COPY composer.json composer.lock* ./ + +RUN composer install --no-plugins --no-scripts --prefer-dist \ + && composer clear-cache + +COPY ./ ./ + +RUN composer run-script post-install-cmd + +HEALTHCHECK --interval=30s --timeout=5s --start-period=1s \ + CMD REQUEST_METHOD=GET SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping cgi-fcgi -bind -connect 127.0.0.1:9000 + +RUN chmod 0555 ./docker/docker-entrypoint.sh +ENTRYPOINT ["docker/docker-entrypoint.sh"] + +CMD ["php-fpm"] diff --git a/blog/docker/dev/php/conf.d/php.ini b/blog/docker/dev/php/conf.d/php.ini new file mode 100644 index 000000000..c80827193 --- /dev/null +++ b/blog/docker/dev/php/conf.d/php.ini @@ -0,0 +1,28 @@ +;apc.enable_cli = 1 +date.timezone = UTC +session.auto_start = Off +short_open_tag = Off +expose_php = Off +upload_max_filesize = 15M +post_max_size = 150M +memory_limit = 256M + +# https://symfony.com/doc/current/performance.html +opcache.interned_strings_buffer = 16 +opcache.max_accelerated_files = 20000 +opcache.memory_consumption = 256 +realpath_cache_size = 4096K +realpath_cache_ttl = 600 +max_execution_time = 300 +max_input_time = 300 + +[xdebug] +xdebug.mode = develop,debug +xdebug.client_host = host.docker.internal +;xdebug.discover_client_host=true +xdebug.show_error_trace = 0 +xdebug.start_with_request = trigger +;xdebug.client_host=host-gateway +;xdebug.start_with_request= +xdebug.client_port = 9001 +xdebug.log_level = 10 diff --git a/blog/docker/dev/php/php-fpm.d/www.conf b/blog/docker/dev/php/php-fpm.d/www.conf new file mode 100644 index 000000000..55df850b8 --- /dev/null +++ b/blog/docker/dev/php/php-fpm.d/www.conf @@ -0,0 +1,20 @@ +[global] +daemonize = no +process_control_timeout = 20 +error_log = /proc/self/fd/2 + +[www] +user = www-data +group = www-data +listen = 9000 +listen.mode = 0666 +ping.path = /ping +ping.response = pong +clear_env = off +pm = dynamic +pm.status_path = /status +pm.max_children = 25 +pm.start_servers = 10 +pm.min_spare_servers = 5 +pm.max_spare_servers = 20 +pm.max_requests = 500 diff --git a/blog/docker/docker-entrypoint.sh b/blog/docker/docker-entrypoint.sh new file mode 100644 index 000000000..fd0a4a126 --- /dev/null +++ b/blog/docker/docker-entrypoint.sh @@ -0,0 +1,16 @@ +#!/bin/sh +set -e + +ls -la +# first arg is `-f` or `--some-option` +if [ "${1#-}" != "$1" ]; then + set -- php-fpm "$@" +fi +set -e + +if [ "$1" = 'php-fpm' ] || [ "$1" = 'php' ] || [ "$1" = 'yii' ]; then + setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX runtime public + setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX runtime public +fi + +exec "$@" diff --git a/blog/docker/prod/nginx/Dockerfile b/blog/docker/prod/nginx/Dockerfile new file mode 100644 index 000000000..94cf7d82f --- /dev/null +++ b/blog/docker/prod/nginx/Dockerfile @@ -0,0 +1,9 @@ +FROM nginx:1.21.1-alpine + +RUN apk add --no-cache curl + +COPY docker/prod/nginx/nginx.conf /etc/nginx/conf.d/default.conf + +WORKDIR /app/public + +HEALTHCHECK --interval=30s --timeout=5s --start-period=1s CMD curl --fail http://127.0.0.1/health || exit 1 diff --git a/blog/docker/prod/nginx/nginx.conf b/blog/docker/prod/nginx/nginx.conf new file mode 100644 index 000000000..b61f22f0c --- /dev/null +++ b/blog/docker/prod/nginx/nginx.conf @@ -0,0 +1,48 @@ +server { + listen 80 default_server; + root /app/public; + client_max_body_size 15m; + resolver 127.0.0.11 ipv6=off; + server_tokens off; + + location /health { + add_header Content-Type text/plain; + access_log off; + return 200 'alive'; + } + + location /assets { + root /app/public; + } + + location / { + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization' always; + add_header 'Access-Control-Max-Age' 1728000; + if ($request_method = 'OPTIONS') { + add_header 'Content-Type' 'text/plain; charset=utf-8'; + add_header 'Content-Length' 0; + return 204; + } + try_files $uri /index.php?$args; + } + + location ~ ^/index\.php(/|$) { + set $upstream blog-backend:9000; + fastcgi_read_timeout 60; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass $upstream; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param SERVER_NAME $server_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/blog/docker/prod/php/Dockerfile b/blog/docker/prod/php/Dockerfile new file mode 100644 index 000000000..8c221b3ce --- /dev/null +++ b/blog/docker/prod/php/Dockerfile @@ -0,0 +1,72 @@ +# the different stages of this Dockerfile are meant to be built into separate images +# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage +# https://docs.docker.com/compose/compose-file/#target + + +# https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +FROM php:8.1-fpm-alpine as stage + +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +ENV COMPOSER_ALLOW_SUPERUSER=1 +ENV PATH="${PATH}:/root/.composer/vendor/bin" + +RUN set -eux \ + && apk add --no-cache \ + acl fcgi file gettext git nano curl \ + && apk add --no-cache --virtual .build-deps \ + $PHPIZE_DEPS icu-dev libzip-dev zlib-dev \ + \ + && docker-php-ext-configure zip \ + && docker-php-ext-install -j$(nproc) intl zip \ + && docker-php-ext-enable opcache \ + \ + && runDeps="$( \ + scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \ + | tr ',' '\n' \ + | sort -u \ + | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ + )" \ + && apk add --no-cache --virtual .pgsql-deps \ + $runDeps postgresql-dev so:libpq.so.5 \ + && docker-php-ext-install -j$(nproc) pdo_pgsql \ + \ + && apk add oniguruma-dev \ + && docker-php-ext-install mbstring \ + \ + && apk add --repository http://dl-3.alpinelinux.org/alpine/edge/community \ + rabbitmq-c-dev \ + && pecl install amqp-1.11.0 \ + && docker-php-ext-enable amqp \ + && apk del .build-deps \ + && pecl clear-cache \ + && rm -rf /tmp/pear \ + && docker-php-source delete \ + && rm -rf /var/cache/apk/* + +RUN ln -s $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini + +WORKDIR /app + +COPY docker/prod/php/conf.d/ $PHP_INI_DIR/conf.d/ +COPY docker/prod/php/php-fpm.d/ /usr/local/etc/php-fpm.d/ + +COPY composer.json composer.lock* ./ + +RUN set -eux \ + && composer install --no-plugins --no-scripts --prefer-dist \ + && composer clear-cache + +COPY ./ ./ + +RUN set -eux \ + && composer dump-autoload --classmap-authoritative \ + && composer run-script --no-dev post-install-cmd + +HEALTHCHECK --interval=30s --timeout=5s --start-period=1s \ + CMD REQUEST_METHOD=GET SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping cgi-fcgi -bind -connect 127.0.0.1:9000 + +RUN chmod 0555 ./docker/docker-entrypoint.sh +ENTRYPOINT ["docker/docker-entrypoint.sh"] + +CMD ["php-fpm"] diff --git a/blog/docker/prod/php/conf.d/php.ini b/blog/docker/prod/php/conf.d/php.ini new file mode 100644 index 000000000..b723da7a0 --- /dev/null +++ b/blog/docker/prod/php/conf.d/php.ini @@ -0,0 +1,18 @@ +;apc.enable_cli = 1 +date.timezone = UTC +session.auto_start = Off +short_open_tag = Off +expose_php = Off +upload_max_filesize = 15M +post_max_size = 150M +memory_limit = 512M +display_errors = Off + +# https://symfony.com/doc/current/performance.html +opcache.interned_strings_buffer = 16 +opcache.max_accelerated_files = 20000 +opcache.memory_consumption = 256 +opcache.validate_timestamps = 0 +realpath_cache_size = 4096K +realpath_cache_ttl = 600 +opcache.preload_user = www-data diff --git a/blog/docker/prod/php/php-fpm.d/www.conf b/blog/docker/prod/php/php-fpm.d/www.conf new file mode 100644 index 000000000..81ab6ab2a --- /dev/null +++ b/blog/docker/prod/php/php-fpm.d/www.conf @@ -0,0 +1,21 @@ +[global] +daemonize = no +process_control_timeout = 20 +error_log = /proc/self/fd/2 + +[www] +user = www-data +group = www-data +listen = 9000 +listen.mode = 0666 +clear_env = off +; access.suppress_path[] = /ping +ping.path = /ping +ping.response = pong +pm = dynamic +pm.status_path = /status +pm.max_children = 25 +pm.start_servers = 10 +pm.min_spare_servers = 5 +pm.max_spare_servers = 20 +pm.max_requests = 500 diff --git a/demo/Dockerfile b/demo/Dockerfile new file mode 100644 index 000000000..bc0c40df8 --- /dev/null +++ b/demo/Dockerfile @@ -0,0 +1,7 @@ +FROM nginx:1.21.1-alpine + +RUN apk add --no-cache curl nano + +COPY ./html /usr/share/nginx/html + + diff --git a/demo/html/index.html b/demo/html/index.html new file mode 100644 index 000000000..22471deec --- /dev/null +++ b/demo/html/index.html @@ -0,0 +1,67 @@ + + + + + + + Yii Demos + + + + + + + + + + + + + + + + +
    +

    Demo examples

    + +
    + +

    Try out our demos

    +
    +

    + We have two worked demos at the moment +

    +

    + blog is a demo site with server side rendering. It's use PHP template engine.
    + If you need OpenAPI schema you may see it under the link. +

    +

    + blog-api is a demo site providing only API access.
    + You may open openapi documentation by click on the link. +

    +
    + blog + blog-api +
    +
    +
    + +
    +
    + + + diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 000000000..57f1fcf5c --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,46 @@ +version: "3.4" + +services: + blog-backend: + build: + context: blog + dockerfile: docker/dev/php/Dockerfile + target: stage + environment: + YII_ENV: dev + YII_DEBUG: "true" + volumes: + - ./blog:/app:delegated + + blog-nginx: + build: + context: blog + dockerfile: docker/dev/nginx/Dockerfile + + blog-api-backend: + build: + context: blog-api + dockerfile: docker/dev/php/Dockerfile + target: stage + environment: + YII_ENV: dev + YII_DEBUG: "true" + volumes: + - ./blog-api:/app:delegated + + blog-api-nginx: + build: + context: blog-api + dockerfile: docker/dev/nginx/Dockerfile + + demo: + restart: unless-stopped + volumes: + - ./demo/html:/usr/share/nginx + + gateway: + build: + context: gateway/nginx + dockerfile: dev/Dockerfile + volumes: + - ./gateway/nginx/dev/templates:/etc/nginx/templates:ro diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..1db39001b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,102 @@ +version: "3.4" + +services: + blog-backend: + restart: unless-stopped + image: ${REGISTRY}/blog-backend:${IMAGE_TAG} + build: + context: blog + dockerfile: docker/prod/php/Dockerfile + target: stage + environment: + YII_ENV: prod + YII_DEBUG: "false" + healthcheck: + disable: true + volumes: + - /etc/group:/etc/group:r + - /etc/passwd:/etc/passwd:r + - blog-assets:/app/public/assets:delegated + + blog-nginx: + restart: unless-stopped + image: ${REGISTRY}/blog-nginx:${IMAGE_TAG} + build: + context: blog + dockerfile: docker/prod/nginx/Dockerfile + depends_on: + - blog-backend + volumes: + - blog-assets:/app/public/assets:ro + + blog-api-backend: + restart: unless-stopped + image: ${REGISTRY}/blog-api-backend:${IMAGE_TAG} + build: + context: blog-api + dockerfile: docker/prod/php/Dockerfile + target: stage + environment: + YII_ENV: prod + YII_DEBUG: "false" + healthcheck: + disable: true + volumes: + - /etc/group:/etc/group:r + - /etc/passwd:/etc/passwd:r + - blog-api-assets:/app/public/assets:delegated + + blog-api-nginx: + restart: unless-stopped + image: ${REGISTRY}/blog-api-nginx:${IMAGE_TAG} + build: + context: blog-api + dockerfile: docker/prod/nginx/Dockerfile + depends_on: + - blog-api-backend + volumes: + - blog-api-assets:/app/public/assets:ro + + demo: + restart: unless-stopped + image: ${REGISTRY}/demo-nginx:${IMAGE_TAG} + build: + context: demo + dockerfile: Dockerfile + + gateway: + restart: unless-stopped + image: ${REGISTRY}/gateway-nginx:${IMAGE_TAG} + build: + context: gateway/nginx + dockerfile: prod/Dockerfile + environment: + DOMAIN: ${DOMAIN} + volumes: + - ./var/ssl:/etc/letsencrypt:r + depends_on: + - demo + - blog-nginx + - blog-api-nginx + ports: + - 80:80 + - 443:443 + + certbot: + restart: "no" + image: certbot/certbot + volumes: + - ./var/ssl:/etc/letsencrypt:rw + command: > + certonly --webroot --webroot-path=/etc/letsencrypt/www + --email ${SUPPORT_EMAIL} --agree-tos --no-eff-email + --force-renewal -d ${DOMAIN} -v + # --dry-run + # --preferred-challenges dns + # --force-renewal -d *.${DOMAIN} -v + +volumes: + blog-assets: + driver: local + blog-api-assets: + driver: local diff --git a/gateway/nginx/dev/Dockerfile b/gateway/nginx/dev/Dockerfile new file mode 100644 index 000000000..dd6408a94 --- /dev/null +++ b/gateway/nginx/dev/Dockerfile @@ -0,0 +1,8 @@ +FROM nginx:1.21.1-alpine AS nginx + +RUN apk add --no-cache curl nano + +WORKDIR /app + +RUN rm /etc/nginx/conf.d/default.conf +COPY ./dev/templates/*.conf.template /etc/nginx/templates/ diff --git a/gateway/nginx/dev/templates/http.conf.template b/gateway/nginx/dev/templates/http.conf.template new file mode 100644 index 000000000..55751e816 --- /dev/null +++ b/gateway/nginx/dev/templates/http.conf.template @@ -0,0 +1,64 @@ +# server { +# listen 80 default_server; +# server_name ${DOMAIN}; +# server_tokens off; +# +# return 404; +# } + +server { + server_name ${DOMAIN}; + listen 80 default_server; + + client_max_body_size 15m; + server_tokens off; + root /app/public; + resolver 127.0.0.11 ipv6=off; + + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied expired no-cache no-store private auth; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml; + gzip_disable "MSIE [1-6]\."; + add_header Strict-Transport-Security "max-age=0;"; + + # To allow special characters in headers + ignore_invalid_headers off; + + location ~ ^/blog(/.*) { + set $upstream http://blog-nginx; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } + + location ~ ^/blog-api(/.*) { + set $upstream http://blog-api-nginx; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } + + location / { + set $upstream http://demo; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } +} diff --git a/gateway/nginx/prod/Dockerfile b/gateway/nginx/prod/Dockerfile new file mode 100644 index 000000000..de0b151a8 --- /dev/null +++ b/gateway/nginx/prod/Dockerfile @@ -0,0 +1,12 @@ +FROM nginx:1.21.1-alpine AS nginx + +RUN apk add --no-cache curl nano + +WORKDIR /app + +RUN rm /etc/nginx/conf.d/default.conf +#COPY ./prod/templates/https.conf.template /etc/nginx/templates/ +COPY ./prod/templates/*.conf.template /etc/nginx/templates/ + +#CMD ["nginx-debug", "-g", "daemon off;"] + diff --git a/gateway/nginx/prod/backup/http.conf.template b/gateway/nginx/prod/backup/http.conf.template new file mode 100644 index 000000000..c13c84e38 --- /dev/null +++ b/gateway/nginx/prod/backup/http.conf.template @@ -0,0 +1,72 @@ +server { + listen 80; + server_tokens off; + + return 404; +} + +server { + listen 80; + server_name ${DOMAIN}; + + client_max_body_size 15m; + server_tokens off; + root /app/public; + resolver 127.0.0.11 ipv6=off; + + # To allow special characters in headers + ignore_invalid_headers off; + + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied expired no-cache no-store private auth; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml; + gzip_disable "MSIE [1-6]\."; + + location /.well-known/acme-challenge/ { + alias /etc/letsencrypt/www/.well-known/acme-challenge/; + } + + location /health { + add_header Content-Type text/plain; + access_log off; + return 200 'alive'; + } + + location ~ ^/blog(/.*) { + set $upstream http://blog-nginx; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } + + location ~ ^/blog-api(/.*) { + set $upstream http://blog-api-nginx; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } + + location / { + set $upstream http://demo; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } +} diff --git a/gateway/nginx/prod/backup/https.conf.template b/gateway/nginx/prod/backup/https.conf.template new file mode 100644 index 000000000..e2c3bec8a --- /dev/null +++ b/gateway/nginx/prod/backup/https.conf.template @@ -0,0 +1,94 @@ +server { + server_name ${DOMAIN}; + listen 80; + server_tokens off; + error_log /var/log/nginx/error.log debug; + + location /.well-known/acme-challenge/ { + alias /etc/letsencrypt/www/.well-known/acme-challenge/; + } + + location /health { + add_header Content-Type text/plain; + access_log off; + return 200 'alive'; + } + + location / { + rewrite ^ https://$host$request_uri?; #permanent; + } +} + +server { + server_name ${DOMAIN}; + listen 443 ssl; + client_max_body_size 15m; + server_tokens off; + root /app/public; + resolver 127.0.0.11 ipv6=off; + error_log /var/log/nginx/error.log debug; + + # add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; + + ssl_certificate /etc/letsencrypt/live/${DOMAIN}/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/${DOMAIN}/privkey.pem; + ssl_buffer_size 8k; + ssl_dhparam /etc/letsencrypt/dhparam/dhparam-2048.pem; + ssl_protocols TLSv1.2 TLSv1.1 TLSv1; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; + ssl_ecdh_curve secp384r1; + ssl_session_tickets off; + ssl_stapling on; + ssl_stapling_verify on; + + # To allow special characters in headers + ignore_invalid_headers off; + + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied expired no-cache no-store private auth; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml; + gzip_disable "MSIE [1-6]\."; + + location /.well-known/acme-challenge/ { + alias /etc/letsencrypt/www/.well-known/acme-challenge/; + } + + location ~ ^/blog(/.*) { + set $upstream http://blog-nginx; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } + + location ~ ^/blog-api(/.*) { + set $upstream http://blog-api-nginx; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } + + location / { + set $upstream http://demo; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } +} diff --git a/gateway/nginx/prod/templates/https.conf.template b/gateway/nginx/prod/templates/https.conf.template new file mode 100644 index 000000000..e2c3bec8a --- /dev/null +++ b/gateway/nginx/prod/templates/https.conf.template @@ -0,0 +1,94 @@ +server { + server_name ${DOMAIN}; + listen 80; + server_tokens off; + error_log /var/log/nginx/error.log debug; + + location /.well-known/acme-challenge/ { + alias /etc/letsencrypt/www/.well-known/acme-challenge/; + } + + location /health { + add_header Content-Type text/plain; + access_log off; + return 200 'alive'; + } + + location / { + rewrite ^ https://$host$request_uri?; #permanent; + } +} + +server { + server_name ${DOMAIN}; + listen 443 ssl; + client_max_body_size 15m; + server_tokens off; + root /app/public; + resolver 127.0.0.11 ipv6=off; + error_log /var/log/nginx/error.log debug; + + # add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; + + ssl_certificate /etc/letsencrypt/live/${DOMAIN}/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/${DOMAIN}/privkey.pem; + ssl_buffer_size 8k; + ssl_dhparam /etc/letsencrypt/dhparam/dhparam-2048.pem; + ssl_protocols TLSv1.2 TLSv1.1 TLSv1; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; + ssl_ecdh_curve secp384r1; + ssl_session_tickets off; + ssl_stapling on; + ssl_stapling_verify on; + + # To allow special characters in headers + ignore_invalid_headers off; + + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied expired no-cache no-store private auth; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml; + gzip_disable "MSIE [1-6]\."; + + location /.well-known/acme-challenge/ { + alias /etc/letsencrypt/www/.well-known/acme-challenge/; + } + + location ~ ^/blog(/.*) { + set $upstream http://blog-nginx; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } + + location ~ ^/blog-api(/.*) { + set $upstream http://blog-api-nginx; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } + + location / { + set $upstream http://demo; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 60s; + proxy_send_timeout 300s; + proxy_pass $upstream$1$is_args$args; + } +} diff --git a/var/.gitignore b/var/.gitignore new file mode 100644 index 000000000..8a340cb37 --- /dev/null +++ b/var/.gitignore @@ -0,0 +1,3 @@ +* +!ssl/www/.gitignore +!.gitignore \ No newline at end of file diff --git a/var/ssl/www/.gitignore b/var/ssl/www/.gitignore new file mode 100644 index 000000000..c96a04f00 --- /dev/null +++ b/var/ssl/www/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file From 0d0c9f6d06896638a9a9ad0e39013fd8de23c74e Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 15 Jan 2023 00:19:38 +0400 Subject: [PATCH 11/58] Use stable yiisoft/data --- blog-api/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog-api/composer.json b/blog-api/composer.json index d3a0043ee..161ff069b 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -41,7 +41,7 @@ "yiisoft/cache": "^2.0", "yiisoft/cache-file": "^2.0", "yiisoft/config": "^1.0", - "yiisoft/data": "^3.0@dev", + "yiisoft/data": "^1.0", "yiisoft/data-response": "^1.0", "yiisoft/definitions": "^3.0", "yiisoft/di": "^1.0", From cd96daffe02ac33457c4aa50ec7c5926ecc89bd5 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 15 Jan 2023 00:19:45 +0400 Subject: [PATCH 12/58] Use stable yiisoft/data --- blog/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/composer.json b/blog/composer.json index deb03e8a5..8c666cd8d 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -44,7 +44,7 @@ "yiisoft/config": "^1.0", "yiisoft/cookies": "^1.2", "yiisoft/csrf": "^1.2", - "yiisoft/data": "^3.0@dev", + "yiisoft/data": "^1.0", "yiisoft/data-response": "^1.0", "yiisoft/definitions": "^3.0", "yiisoft/di": "^1.2", From d23f0d8c15f53f34aa7f3ab30d12830d8c8204eb Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Thu, 26 Jan 2023 10:14:12 +0200 Subject: [PATCH 13/58] Update links (#565) --- .github/CODE_OF_CONDUCT.md | 6 +++--- blog/README.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 803e0007b..eb64a8811 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -61,7 +61,7 @@ the project's leadership. This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4.0, available at -[http://contributor-covenant.org/version/1/4/][version] +[https://contributor-covenant.org/version/1/4/][version] -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ +[homepage]: https://contributor-covenant.org +[version]: https://contributor-covenant.org/version/1/4/ diff --git a/blog/README.md b/blog/README.md index 37c278ed9..e126bbf8b 100644 --- a/blog/README.md +++ b/blog/README.md @@ -1,5 +1,5 @@

    - + Yii Framework

    Yii Framework Demo Project

    From 00da52c7bd7d9be75f83fc1eee340009bb209ab4 Mon Sep 17 00:00:00 2001 From: Rustam Mamadaminov Date: Sat, 28 Jan 2023 13:59:08 +0500 Subject: [PATCH 14/58] Update blog (#566) * Add `yiisoft/request-model` * Update blog-api * Update widget to 2.0 * Other fixes --- blog-api/composer.json | 4 +-- blog-api/config/web/middleware-dispatcher.php | 8 ++--- blog/composer.json | 7 +++-- blog/config/web/middleware-dispatcher.php | 15 +++++++++ blog/public/index.php | 2 +- blog/src/Blog/Archive/ArchiveController.php | 19 ++++++------ blog/src/Blog/BlogController.php | 5 ++- blog/src/Blog/CommentController.php | 8 ++--- blog/src/Blog/Widget/PostCard.php | 2 +- blog/src/User/Controller/UserController.php | 31 ++++++++----------- blog/src/Widget/FlashMessage.php | 2 +- blog/src/Widget/OffsetPagination.php | 4 +-- blog/src/Widget/PerformanceMetrics.php | 2 +- blog/yii | 2 +- 14 files changed, 60 insertions(+), 51 deletions(-) create mode 100644 blog/config/web/middleware-dispatcher.php diff --git a/blog-api/composer.json b/blog-api/composer.json index 161ff069b..85557faa3 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -54,8 +54,8 @@ "yiisoft/log-target-file": "^2.0", "yiisoft/request-body-parser": "^1.1", "yiisoft/request-model": "dev-master", - "yiisoft/router": "^2.0", - "yiisoft/router-fastroute": "^2.0", + "yiisoft/router": "^2.1", + "yiisoft/router-fastroute": "^2.1", "yiisoft/security": "^1.0", "yiisoft/translator": "^2.0", "yiisoft/translator-message-php": "^1.1", diff --git a/blog-api/config/web/middleware-dispatcher.php b/blog-api/config/web/middleware-dispatcher.php index 86685c261..f2b303927 100644 --- a/blog-api/config/web/middleware-dispatcher.php +++ b/blog-api/config/web/middleware-dispatcher.php @@ -2,13 +2,13 @@ declare(strict_types=1); -use Yiisoft\Middleware\Dispatcher\WrapperFactoryInterface; -use Yiisoft\RequestModel\WrapperFactory; - /** * @var array $params */ +use Yiisoft\Middleware\Dispatcher\ParametersResolverInterface; +use Yiisoft\RequestModel\HandlerParametersResolver; + return [ - WrapperFactoryInterface::class => WrapperFactory::class, + ParametersResolverInterface::class => HandlerParametersResolver::class, ]; diff --git a/blog/composer.json b/blog/composer.json index 8c666cd8d..90f0b4222 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -59,11 +59,12 @@ "yiisoft/mailer": "^5.0", "yiisoft/mailer-symfony": "^2.1", "yiisoft/rate-limiter": "dev-master", + "yiisoft/request-model": "dev-master", "yiisoft/rbac": "^1.0", "yiisoft/rbac-php": "^1.0", "yiisoft/rbac-rules-container": "^1.1", - "yiisoft/router": "^2.0", - "yiisoft/router-fastroute": "^2.0", + "yiisoft/router": "^2.1", + "yiisoft/router-fastroute": "^2.1", "yiisoft/security": "^1.0", "yiisoft/session": "^1.0", "yiisoft/translator": "^2.0", @@ -72,7 +73,7 @@ "yiisoft/validator": "3.0.x-dev", "yiisoft/var-dumper": "^1.0", "yiisoft/view": "^7.0", - "yiisoft/widget": "^1.1", + "yiisoft/widget": "^2.0", "yiisoft/yii-bootstrap5": "^3.0@dev", "yiisoft/yii-console": "^1.0", "yiisoft/yii-cycle": "dev-master", diff --git a/blog/config/web/middleware-dispatcher.php b/blog/config/web/middleware-dispatcher.php new file mode 100644 index 000000000..fd505727d --- /dev/null +++ b/blog/config/web/middleware-dispatcher.php @@ -0,0 +1,15 @@ + HandlerParametersResolver::class, +]; diff --git a/blog/public/index.php b/blog/public/index.php index 70f0ea248..1df961e32 100644 --- a/blog/public/index.php +++ b/blog/public/index.php @@ -31,5 +31,5 @@ require_once dirname(__DIR__) . '/autoload.php'; // Run HTTP application runner -$runner = new HttpApplicationRunner(dirname(__DIR__), $_ENV['YII_DEBUG'], $_ENV['YII_ENV']); +$runner = new HttpApplicationRunner(dirname(__DIR__), $_ENV['YII_DEBUG'], environment: $_ENV['YII_ENV']); $runner->run(); diff --git a/blog/src/Blog/Archive/ArchiveController.php b/blog/src/Blog/Archive/ArchiveController.php index 5e7cf40fb..004c20606 100644 --- a/blog/src/Blog/Archive/ArchiveController.php +++ b/blog/src/Blog/Archive/ArchiveController.php @@ -7,7 +7,7 @@ use App\Blog\Tag\TagRepository; use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; -use Yiisoft\Router\CurrentRoute; +use Yiisoft\RequestModel\Attribute\Route; use Yiisoft\Yii\View\ViewRenderer; final class ArchiveController @@ -26,12 +26,13 @@ public function index(ArchiveRepository $archiveRepo): Response return $this->viewRenderer->render('index', ['archive' => $archiveRepo->getFullArchive()]); } - public function monthlyArchive(CurrentRoute $currentRoute, TagRepository $tagRepository, ArchiveRepository $archiveRepo): Response - { - $pageNum = (int) $currentRoute->getArgument('page', '1'); - $year = (int) $currentRoute->getArgument('year', '0'); - $month = (int) $currentRoute->getArgument('month', '0'); - + public function monthlyArchive( + TagRepository $tagRepository, + ArchiveRepository $archiveRepo, + #[Route('page')] int $pageNum = 1, + #[Route('year')] int $year = 0, + #[Route('month')] int $month = 0, + ): Response { $dataReader = $archiveRepo->getMonthlyArchive($year, $month); $paginator = (new OffsetPaginator($dataReader)) ->withPageSize(self::POSTS_PER_PAGE) @@ -50,10 +51,8 @@ public function monthlyArchive(CurrentRoute $currentRoute, TagRepository $tagRep return $this->viewRenderer->render('monthly-archive', $data); } - public function yearlyArchive(CurrentRoute $currentRoute, ArchiveRepository $archiveRepo): Response + public function yearlyArchive(ArchiveRepository $archiveRepo, #[Route('year')] int $year = 0): Response { - $year = (int) $currentRoute->getArgument('year', '0'); - $data = [ 'year' => $year, 'items' => $archiveRepo->getYearlyArchive($year), diff --git a/blog/src/Blog/BlogController.php b/blog/src/Blog/BlogController.php index e318057b7..011795095 100644 --- a/blog/src/Blog/BlogController.php +++ b/blog/src/Blog/BlogController.php @@ -9,7 +9,7 @@ use App\Blog\Tag\TagRepository; use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; -use Yiisoft\Router\CurrentRoute; +use Yiisoft\RequestModel\Attribute\Route; use Yiisoft\User\CurrentUser; use Yiisoft\Yii\View\ViewRenderer; @@ -31,9 +31,8 @@ public function index( TagRepository $tagRepository, ArchiveRepository $archiveRepo, CurrentUser $currentUser, - CurrentRoute $currentRoute + #[Route('page')] $pageNum = 1, ): Response { - $pageNum = (int) $currentRoute->getArgument('page', '1'); $dataReader = $postRepository->findAllPreloaded(); $paginator = (new OffsetPaginator($dataReader)) ->withPageSize(self::POSTS_PER_PAGE) diff --git a/blog/src/Blog/CommentController.php b/blog/src/Blog/CommentController.php index c6c5a6281..303cc420c 100644 --- a/blog/src/Blog/CommentController.php +++ b/blog/src/Blog/CommentController.php @@ -7,7 +7,7 @@ use App\Blog\Comment\CommentService; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; -use Yiisoft\Router\CurrentRoute; +use Yiisoft\RequestModel\Attribute\Route; use Yiisoft\Yii\View\ViewRenderer; final class CommentController @@ -19,11 +19,11 @@ public function __construct(ViewRenderer $viewRenderer) $this->viewRenderer = $viewRenderer->withControllerName('blog/comments'); } - public function index(Request $request, CommentService $service, CurrentRoute $currentRoute): Response + public function index(Request $request, CommentService $service, #[Route('next')] ?string $next): Response { $paginator = $service->getFeedPaginator(); - if ($currentRoute->getArgument('next') !== null) { - $paginator = $paginator->withNextPageToken((string) $currentRoute->getArgument('next')); + if ($next !== null) { + $paginator = $paginator->withNextPageToken($next); } if ($this->isAjaxRequest($request)) { diff --git a/blog/src/Blog/Widget/PostCard.php b/blog/src/Blog/Widget/PostCard.php index 8dfa08590..94d87be22 100644 --- a/blog/src/Blog/Widget/PostCard.php +++ b/blog/src/Blog/Widget/PostCard.php @@ -19,7 +19,7 @@ public function __construct(private UrlGeneratorInterface $urlGenerator) { } - protected function run(): string + public function render(): string { if (!isset($this->options['id'])) { $this->options['id'] = "{$this->getId()}-post-card"; diff --git a/blog/src/User/Controller/UserController.php b/blog/src/User/Controller/UserController.php index 3cf7717aa..3174bb79c 100644 --- a/blog/src/User/Controller/UserController.php +++ b/blog/src/User/Controller/UserController.php @@ -7,10 +7,11 @@ use App\User\UserRepository; use Psr\Http\Message\ResponseFactoryInterface; use Psr\Http\Message\ResponseInterface as Response; -use Psr\Http\Message\ServerRequestInterface; use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Data\Reader\Sort; -use Yiisoft\Router\CurrentRoute; +use Yiisoft\RequestModel\Attribute\Body; +use Yiisoft\RequestModel\Attribute\Query; +use Yiisoft\RequestModel\Attribute\Route; use Yiisoft\Yii\View\ViewRenderer; final class UserController @@ -23,25 +24,20 @@ public function __construct(private ViewRenderer $viewRenderer) } public function index( - CurrentRoute $currentRoute, - ServerRequestInterface $request, - UserRepository $userRepository + UserRepository $userRepository, + #[Body] array $body, + #[Query] array $sortOrder, + #[Route('page')] int $page = 1, + #[Route('pagesize')] int $pageSize = null, ): Response { - /** @var array */ - $body = $request->getParsedBody(); - $sortOrderString = $request->getQueryParams(); - $dataReader = $userRepository ->findAll() ->withSort(Sort::only(['id', 'login']) - ->withOrderString($sortOrderString['sort'] ?? 'id')); + ->withOrderString($sortOrder['sort'] ?? 'id')); - $page = (int) $currentRoute->getArgument('page', '1'); - - $pageSize = (int) $currentRoute->getArgument( - 'pagesize', - $body['pageSize'] ?? (string) OffSetPaginator::DEFAULT_PAGE_SIZE, - ); + if ($pageSize === null) { + $pageSize = (int) ($body['pageSize'] ?? OffSetPaginator::DEFAULT_PAGE_SIZE); + } $paginator = (new OffsetPaginator($dataReader)); $paginator = $paginator->withNextPageToken((string) $page)->withPageSize($pageSize); @@ -50,11 +46,10 @@ public function index( } public function profile( - CurrentRoute $currentRoute, + #[Route('login')] string $login, ResponseFactoryInterface $responseFactory, UserRepository $userRepository ): Response { - $login = $currentRoute->getArgument('login'); $item = $userRepository->findByLogin($login); if ($item === null) { diff --git a/blog/src/Widget/FlashMessage.php b/blog/src/Widget/FlashMessage.php index cb36c1f78..3f4b549eb 100644 --- a/blog/src/Widget/FlashMessage.php +++ b/blog/src/Widget/FlashMessage.php @@ -14,7 +14,7 @@ public function __construct(private FlashInterface $flash) { } - public function run(): string + public function render(): string { $flashes = $this->flash->getAll(); diff --git a/blog/src/Widget/OffsetPagination.php b/blog/src/Widget/OffsetPagination.php index 39b54ad1e..c820b6d5b 100644 --- a/blog/src/Widget/OffsetPagination.php +++ b/blog/src/Widget/OffsetPagination.php @@ -37,7 +37,7 @@ public function urlGenerator(Closure $generator): self public function isRequired(): bool { - return $this->paginator === null ? false : $this->paginator->isRequired(); + return $this->paginator !== null && $this->paginator->isRequired(); } /** @@ -52,7 +52,7 @@ public function options(array $value): self return $this; } - protected function run(): string + public function render(): string { if ($this->paginator === null) { return ''; diff --git a/blog/src/Widget/PerformanceMetrics.php b/blog/src/Widget/PerformanceMetrics.php index 953c7adef..d98443373 100644 --- a/blog/src/Widget/PerformanceMetrics.php +++ b/blog/src/Widget/PerformanceMetrics.php @@ -13,7 +13,7 @@ public function __construct(private Timer $timer) { } - protected function run(): string + public function render(): string { $time = round($this->timer->get('overall'), 4); $memory = round(memory_get_peak_usage() / (1024 * 1024), 4); diff --git a/blog/yii b/blog/yii index 8d2bd2fa6..0289ec8b7 100755 --- a/blog/yii +++ b/blog/yii @@ -8,5 +8,5 @@ use Yiisoft\Yii\Runner\Console\ConsoleApplicationRunner; require_once __DIR__ . '/autoload.php'; // Run console application runner -$runner = new ConsoleApplicationRunner(__DIR__, $_ENV['YII_DEBUG'], $_ENV['YII_ENV']); +$runner = new ConsoleApplicationRunner(__DIR__, $_ENV['YII_DEBUG'], environment: $_ENV['YII_ENV']); $runner->run(); From 25e7cc61b3abb5e7ae67d4a10536246f300f0a81 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sun, 5 Feb 2023 14:30:14 +0300 Subject: [PATCH 15/58] Add autoload-dev (#563) --- blog/composer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blog/composer.json b/blog/composer.json index 90f0b4222..9f4ceacfd 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -110,6 +110,11 @@ "App\\": "src" } }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests" + } + }, "scripts": { "serve": [ "Composer\\Config::disableProcessTimeout", From 231226fb8c9795f2d815955c1b6d9b40012fd6af Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 19 Feb 2023 18:24:35 +0300 Subject: [PATCH 16/58] New structure of configs (#570) --- blog-api/composer.json | 101 +++----------- blog-api/config/.gitignore | 1 - blog-api/config/bootstrap-web.php | 5 - blog-api/config/{ => common}/bootstrap.php | 0 blog-api/config/common/{ => di}/cache.php | 0 blog-api/config/common/{ => di}/cycle.php | 0 blog-api/config/common/{ => di}/logger.php | 0 blog-api/config/common/{ => di}/psr17.php | 0 blog-api/config/common/{ => di}/router.php | 0 .../config/common/{ => di}/translator.php | 0 blog-api/config/common/{ => di}/validator.php | 0 blog-api/config/{ => common}/params.php | 21 +-- blog-api/config/{ => common}/routes.php | 0 blog-api/config/console/.gitkeep | 0 blog-api/config/console/commands.php | 18 +++ blog-api/config/console/params.php | 9 ++ blog-api/config/delegates-console.php | 5 - blog-api/config/delegates-web.php | 5 - blog-api/config/delegates.php | 5 - .../config/{ => environments}/dev/params.php | 0 .../config/{ => environments}/prod/params.php | 0 .../config/{ => environments}/test/params.php | 2 +- blog-api/config/events-console.php | 5 - blog-api/config/events-web.php | 5 - blog-api/config/events.php | 5 - blog-api/config/providers-console.php | 5 - blog-api/config/providers-web.php | 7 - blog-api/config/providers.php | 6 - blog-api/config/web/{ => di}/application.php | 0 .../config/web/{ => di}/data-response.php | 0 .../config/web/{ => di}/error-handler.php | 0 .../web/{ => di}/middleware-dispatcher.php | 0 blog-api/config/web/{ => di}/user.php | 0 .../dev => blog-api/config/web}/params.php | 0 blog-api/configuration.php | 66 +++++++++ blog-api/public/index.php | 17 ++- blog-api/src/Blog/EditPostRequest.php | 6 +- .../tests/Functional/UserControllerTest.php | 4 +- blog-api/tests/Support/Data/database.db | Bin 114688 -> 114688 bytes blog-api/yii | 7 +- blog/composer.json | 125 ++++-------------- blog/config/bootstrap-console.php | 5 - blog/config/bootstrap-web.php | 5 - blog/config/{ => common}/bootstrap.php | 0 blog/config/common/{ => di}/cache.php | 0 blog/config/common/{ => di}/cycle.php | 0 blog/config/common/{ => di}/logger.php | 0 blog/config/common/{ => di}/psr17.php | 0 blog/config/common/{ => di}/rbac.php | 0 blog/config/common/{ => di}/router.php | 0 blog/config/common/{ => di}/sentry.php | 0 blog/config/common/{ => di}/translator.php | 0 blog/config/common/{ => di}/validator.php | 0 blog/config/{ => common}/params.php | 42 +----- blog/config/{ => common}/rbac-rules.php | 0 .../{ => common/routes}/routes-backend.php | 0 blog/config/{ => common/routes}/routes.php | 0 blog/config/console/commands.php | 15 +++ .../console/{ => di}/translator-extractor.php | 0 .../events.php} | 0 blog/config/console/params.php | 14 ++ blog/config/delegates-console.php | 5 - blog/config/delegates-web.php | 5 - blog/config/delegates.php | 5 - .../config/environments/dev/params.php | 0 .../config/{ => environments}/prod/params.php | 0 .../config/{ => environments}/test/params.php | 0 blog/config/events.php | 5 - blog/config/providers-console.php | 5 - blog/config/providers-web.php | 5 - blog/config/providers.php | 6 - blog/config/web/{ => di}/application.php | 0 blog/config/web/{ => di}/auth.php | 0 blog/config/web/{ => di}/comment-service.php | 0 blog/config/web/{ => di}/contact-mailer.php | 0 .../web/{ => di}/middleware-dispatcher.php | 0 blog/config/web/{ => di}/rate-limit.php | 0 .../config/{events-web.php => web/events.php} | 0 blog/config/web/params.php | 31 +++++ blog/config/widgets.php | 5 - blog/configuration.php | 80 +++++++++++ blog/public/index.php | 7 +- blog/src/Auth/Form/SignupForm.php | 6 +- .../EventListenerConfigurationTest.php | 27 +++- blog/tests/Functional/IndexControllerTest.php | 2 +- blog/yii | 7 +- 86 files changed, 336 insertions(+), 376 deletions(-) delete mode 100644 blog-api/config/bootstrap-web.php rename blog-api/config/{ => common}/bootstrap.php (100%) rename blog-api/config/common/{ => di}/cache.php (100%) rename blog-api/config/common/{ => di}/cycle.php (100%) rename blog-api/config/common/{ => di}/logger.php (100%) rename blog-api/config/common/{ => di}/psr17.php (100%) rename blog-api/config/common/{ => di}/router.php (100%) rename blog-api/config/common/{ => di}/translator.php (100%) rename blog-api/config/common/{ => di}/validator.php (100%) rename blog-api/config/{ => common}/params.php (84%) rename blog-api/config/{ => common}/routes.php (100%) delete mode 100644 blog-api/config/console/.gitkeep create mode 100644 blog-api/config/console/commands.php create mode 100644 blog-api/config/console/params.php delete mode 100644 blog-api/config/delegates-console.php delete mode 100644 blog-api/config/delegates-web.php delete mode 100644 blog-api/config/delegates.php rename blog-api/config/{ => environments}/dev/params.php (100%) rename blog-api/config/{ => environments}/prod/params.php (100%) rename blog-api/config/{ => environments}/test/params.php (87%) delete mode 100644 blog-api/config/events-console.php delete mode 100644 blog-api/config/events-web.php delete mode 100644 blog-api/config/events.php delete mode 100644 blog-api/config/providers-console.php delete mode 100644 blog-api/config/providers-web.php delete mode 100644 blog-api/config/providers.php rename blog-api/config/web/{ => di}/application.php (100%) rename blog-api/config/web/{ => di}/data-response.php (100%) rename blog-api/config/web/{ => di}/error-handler.php (100%) rename blog-api/config/web/{ => di}/middleware-dispatcher.php (100%) rename blog-api/config/web/{ => di}/user.php (100%) rename {blog/config/dev => blog-api/config/web}/params.php (100%) create mode 100644 blog-api/configuration.php delete mode 100644 blog/config/bootstrap-console.php delete mode 100644 blog/config/bootstrap-web.php rename blog/config/{ => common}/bootstrap.php (100%) rename blog/config/common/{ => di}/cache.php (100%) rename blog/config/common/{ => di}/cycle.php (100%) rename blog/config/common/{ => di}/logger.php (100%) rename blog/config/common/{ => di}/psr17.php (100%) rename blog/config/common/{ => di}/rbac.php (100%) rename blog/config/common/{ => di}/router.php (100%) rename blog/config/common/{ => di}/sentry.php (100%) rename blog/config/common/{ => di}/translator.php (100%) rename blog/config/common/{ => di}/validator.php (100%) rename blog/config/{ => common}/params.php (82%) rename blog/config/{ => common}/rbac-rules.php (100%) rename blog/config/{ => common/routes}/routes-backend.php (100%) rename blog/config/{ => common/routes}/routes.php (100%) create mode 100644 blog/config/console/commands.php rename blog/config/console/{ => di}/translator-extractor.php (100%) rename blog/config/{events-console.php => console/events.php} (100%) create mode 100644 blog/config/console/params.php delete mode 100644 blog/config/delegates-console.php delete mode 100644 blog/config/delegates-web.php delete mode 100644 blog/config/delegates.php rename blog-api/config/bootstrap-console.php => blog/config/environments/dev/params.php (100%) rename blog/config/{ => environments}/prod/params.php (100%) rename blog/config/{ => environments}/test/params.php (100%) delete mode 100644 blog/config/events.php delete mode 100644 blog/config/providers-console.php delete mode 100644 blog/config/providers-web.php delete mode 100644 blog/config/providers.php rename blog/config/web/{ => di}/application.php (100%) rename blog/config/web/{ => di}/auth.php (100%) rename blog/config/web/{ => di}/comment-service.php (100%) rename blog/config/web/{ => di}/contact-mailer.php (100%) rename blog/config/web/{ => di}/middleware-dispatcher.php (100%) rename blog/config/web/{ => di}/rate-limit.php (100%) rename blog/config/{events-web.php => web/events.php} (100%) create mode 100644 blog/config/web/params.php delete mode 100644 blog/config/widgets.php create mode 100644 blog/configuration.php diff --git a/blog-api/composer.json b/blog-api/composer.json index 85557faa3..82f099378 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -38,39 +38,39 @@ "vlucas/phpdotenv": "^5.3", "yiisoft/access": "^1.0", "yiisoft/auth": "^3.0", - "yiisoft/cache": "^2.0", - "yiisoft/cache-file": "^2.0", + "yiisoft/cache": "^3.0", + "yiisoft/cache-file": "^3.0", "yiisoft/config": "^1.0", "yiisoft/data": "^1.0", - "yiisoft/data-response": "^1.0", + "yiisoft/data-response": "^2.0", "yiisoft/definitions": "^3.0", "yiisoft/di": "^1.0", - "yiisoft/error-handler": "^2.0", + "yiisoft/error-handler": "^3.0", "yiisoft/factory": "^1.0", "yiisoft/files": "^2.0", "yiisoft/http": "^1.2", "yiisoft/injector": "^1.0", "yiisoft/log": "^2.0", - "yiisoft/log-target-file": "^2.0", + "yiisoft/log-target-file": "^3.0", "yiisoft/request-body-parser": "^1.1", "yiisoft/request-model": "dev-master", - "yiisoft/router": "^2.1", - "yiisoft/router-fastroute": "^2.1", + "yiisoft/router": "^3.0", + "yiisoft/router-fastroute": "^3.0", "yiisoft/security": "^1.0", - "yiisoft/translator": "^2.0", + "yiisoft/translator": "^3.0", "yiisoft/translator-message-php": "^1.1", - "yiisoft/user": "^1.0", + "yiisoft/user": "^2.0", "yiisoft/validator": "^3.0@dev", - "yiisoft/yii-console": "^1.0", + "yiisoft/yii-console": "^2.0", "yiisoft/yii-cycle": "^3.0@dev", "yiisoft/yii-debug": "^3.0@dev", - "yiisoft/yii-event": "^1.0", + "yiisoft/yii-event": "^2.0", "yiisoft/yii-http": "^1.0", "yiisoft/yii-middleware": "dev-master", "yiisoft/yii-queue": "3.0.x-dev", - "yiisoft/yii-runner-console": "^1.0", - "yiisoft/yii-runner-http": "^1.0", - "yiisoft/yii-swagger": "^1.0" + "yiisoft/yii-runner-console": "^2.0", + "yiisoft/yii-runner-http": "^2.0", + "yiisoft/yii-swagger": "^2.0" }, "require-dev": { "codeception/c3": "^2.6", @@ -118,78 +118,7 @@ "branch-alias": { "dev-master": "1.0.x-dev" }, - "config-plugin-options": { - "source-directory": "config" - }, - "config-plugin-environments": { - "dev": { - "params": [ - "test/params.php" - ] - }, - "prod": { - "params": [ - "test/params.php" - ] - }, - "test": { - "params": [ - "test/params.php" - ] - } - }, - "config-plugin": { - "common": "common/*.php", - "params": [ - "params.php", - "?params-local.php" - ], - "web": [ - "$common", - "web/*.php" - ], - "console": [ - "$common", - "console/*.php" - ], - "events": "events.php", - "events-web": [ - "$events", - "events-web.php" - ], - "events-console": [ - "$events", - "events-console.php" - ], - "providers": "providers.php", - "providers-web": [ - "$providers", - "providers-web.php" - ], - "providers-console": [ - "$providers", - "providers-console.php" - ], - "delegates": "delegates.php", - "delegates-web": [ - "$delegates", - "delegates-web.php" - ], - "delegates-console": [ - "$delegates", - "delegates-console.php" - ], - "routes": "routes.php", - "bootstrap": "bootstrap.php", - "bootstrap-web": [ - "$bootstrap", - "bootstrap-web.php" - ], - "bootstrap-console": [ - "$bootstrap", - "bootstrap-console.php" - ] - } + "config-plugin-file": "configuration.php" }, "config": { "sort-packages": true, diff --git a/blog-api/config/.gitignore b/blog-api/config/.gitignore index 704eb157c..8b60a947d 100644 --- a/blog-api/config/.gitignore +++ b/blog-api/config/.gitignore @@ -1,2 +1 @@ .merge-plan.php -*-local.php diff --git a/blog-api/config/bootstrap-web.php b/blog-api/config/bootstrap-web.php deleted file mode 100644 index 0dae23dee..000000000 --- a/blog-api/config/bootstrap-web.php +++ /dev/null @@ -1,5 +0,0 @@ - [ 'aliases' => [ - '@root' => dirname(__DIR__), + '@root' => dirname(__DIR__, 2), '@assets' => '@public/assets', '@assetsUrl' => '@baseUrl/assets', '@baseUrl' => $_ENV['BASE_URL'], @@ -61,21 +59,6 @@ 'defaultCategory' => 'app', ], - // Console commands - 'yiisoft/yii-console' => [ - 'commands' => [ - 'cycle/schema' => Schema\SchemaCommand::class, - 'cycle/schema/php' => Schema\SchemaPhpCommand::class, - 'cycle/schema/clear' => Schema\SchemaClearCommand::class, - 'cycle/schema/rebuild' => Schema\SchemaRebuildCommand::class, - 'migrate/create' => Migration\CreateCommand::class, - 'migrate/generate' => Migration\GenerateCommand::class, - 'migrate/up' => Migration\UpCommand::class, - 'migrate/down' => Migration\DownCommand::class, - 'migrate/list' => Migration\ListCommand::class, - ], - ], - 'yiisoft/yii-cycle' => [ // DBAL config 'dbal' => [ @@ -90,7 +73,7 @@ ], 'connections' => [ 'sqlite' => new SQLiteDriverConfig( - new FileConnectionConfig(dirname(__DIR__) . '/runtime/database.db') + new FileConnectionConfig(dirname(__DIR__, 2) . '/runtime/database.db') ), ], ], diff --git a/blog-api/config/routes.php b/blog-api/config/common/routes.php similarity index 100% rename from blog-api/config/routes.php rename to blog-api/config/common/routes.php diff --git a/blog-api/config/console/.gitkeep b/blog-api/config/console/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/blog-api/config/console/commands.php b/blog-api/config/console/commands.php new file mode 100644 index 000000000..84f641b6e --- /dev/null +++ b/blog-api/config/console/commands.php @@ -0,0 +1,18 @@ + Schema\SchemaCommand::class, + 'cycle/schema/php' => Schema\SchemaPhpCommand::class, + 'cycle/schema/clear' => Schema\SchemaClearCommand::class, + 'cycle/schema/rebuild' => Schema\SchemaRebuildCommand::class, + 'migrate/create' => Migration\CreateCommand::class, + 'migrate/generate' => Migration\GenerateCommand::class, + 'migrate/up' => Migration\UpCommand::class, + 'migrate/down' => Migration\DownCommand::class, + 'migrate/list' => Migration\ListCommand::class, +]; diff --git a/blog-api/config/console/params.php b/blog-api/config/console/params.php new file mode 100644 index 000000000..051a18593 --- /dev/null +++ b/blog-api/config/console/params.php @@ -0,0 +1,9 @@ + [ + 'commands' => require __DIR__ . '/commands.php', + ], +]; diff --git a/blog-api/config/delegates-console.php b/blog-api/config/delegates-console.php deleted file mode 100644 index 0dae23dee..000000000 --- a/blog-api/config/delegates-console.php +++ /dev/null @@ -1,5 +0,0 @@ - [ 'connections' => [ 'sqlite' => new SQLiteDriverConfig( - new FileConnectionConfig(dirname(__DIR__, 2) . '/tests/Support/Data/database.db') + new FileConnectionConfig(dirname(__DIR__, 3) . '/tests/Support/Data/database.db') ), ], ], diff --git a/blog-api/config/events-console.php b/blog-api/config/events-console.php deleted file mode 100644 index 0dae23dee..000000000 --- a/blog-api/config/events-console.php +++ /dev/null @@ -1,5 +0,0 @@ - [ + 'params' => [ + 'common/params.php', + ], + 'params-web' => [ + '$params', + 'web/params.php', + ], + 'params-console' => [ + '$params', + 'console/params.php', + ], + 'di' => 'common/di/*.php', + 'di-web' => [ + '$di', + 'web/di/*.php', + ], + 'di-console' => '$di', + 'di-providers' => [], + 'di-providers-web' => [ + '$di-providers', + ], + 'di-providers-console' => [ + '$di-providers', + ], + 'di-delegates' => [], + 'di-delegates-web' => [ + '$di-delegates', + ], + 'di-delegates-console' => [ + '$di-delegates', + ], + 'events' => [], + 'events-web' => '$events', + 'events-console' => '$events', + 'routes' => 'common/routes.php', + 'bootstrap' => 'common/bootstrap.php', + 'bootstrap-web' => '$bootstrap', + 'bootstrap-console' => '$bootstrap', + ], + 'config-plugin-environments' => [ + 'dev' => [ + 'params' => [ + 'environments/dev/params.php', + ], + ], + 'prod' => [ + 'params' => [ + 'environments/prod/params.php', + ], + ], + 'test' => [ + 'params' => [ + 'environments/test/params.php', + ], + ], + ], + 'config-plugin-options' => [ + 'source-directory' => 'config', + ], +]; diff --git a/blog-api/public/index.php b/blog-api/public/index.php index bc508b5ed..fd3ded372 100644 --- a/blog-api/public/index.php +++ b/blog-api/public/index.php @@ -35,9 +35,16 @@ } // Run HTTP application runner -$runner = (new HttpApplicationRunner(dirname(__DIR__), $_ENV['YII_DEBUG'], $_ENV['YII_ENV'])) - ->withTemporaryErrorHandler(new ErrorHandler( - new Logger([new FileTarget(dirname(__DIR__) . '/runtime/logs/app.log')]), - new JsonRenderer(), - )); +$runner = (new HttpApplicationRunner( + rootPath: dirname(__DIR__), + debug: $_ENV['YII_DEBUG'], + checkEvents: $_ENV['YII_DEBUG'], + environment: $_ENV['YII_ENV'] +)) + ->withTemporaryErrorHandler( + new ErrorHandler( + new Logger([new FileTarget(dirname(__DIR__) . '/runtime/logs/app.log')]), + new JsonRenderer(), + ) + ); $runner->run(); diff --git a/blog-api/src/Blog/EditPostRequest.php b/blog-api/src/Blog/EditPostRequest.php index 42de4c172..d5c8464d8 100644 --- a/blog-api/src/Blog/EditPostRequest.php +++ b/blog-api/src/Blog/EditPostRequest.php @@ -7,7 +7,7 @@ use OpenApi\Annotations as OA; use Yiisoft\RequestModel\RequestModel; use Yiisoft\Validator\Result; -use Yiisoft\Validator\Rule\HasLength; +use Yiisoft\Validator\Rule\Length; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\RulesProviderInterface; @@ -46,11 +46,11 @@ public function getRules(): array return [ 'body.title' => [ new Required(), - new HasLength(min: 5, max: 255), + new Length(min: 5, max: 255), ], 'body.text' => [ new Required(), - new HasLength(min: 5, max: 1000), + new Length(min: 5, max: 1000), ], 'body.status' => [ new Required(), diff --git a/blog-api/tests/Functional/UserControllerTest.php b/blog-api/tests/Functional/UserControllerTest.php index b18509cbf..f9f056e9c 100644 --- a/blog-api/tests/Functional/UserControllerTest.php +++ b/blog-api/tests/Functional/UserControllerTest.php @@ -22,7 +22,7 @@ public function testGetIndex() $method = 'GET'; $url = '/'; - $this->tester->bootstrapApplication('web', dirname(__DIR__, 2)); + $this->tester->bootstrapApplication(dirname(__DIR__, 2)); $response = $this->tester->doRequest($method, $url); $this->assertEquals( @@ -41,7 +41,7 @@ public function testGetIndexMockVersion() $method = 'GET'; $url = '/'; - $this->tester->bootstrapApplication('web', dirname(__DIR__, 2)); + $this->tester->bootstrapApplication(dirname(__DIR__, 2)); $this->tester->mockService(VersionProvider::class, new VersionProvider('3.0.0')); diff --git a/blog-api/tests/Support/Data/database.db b/blog-api/tests/Support/Data/database.db index 1ac562e360395590d4b6fe179defde15f0fb0892..e0fa3d1db9c7b25a931a6f212423a6ef320fe3d4 100644 GIT binary patch delta 281 zcmZo@U~gz(pOD1lJ#k}75XZ#E1Qs53CeDqGtW1;TxitjRjEv1qQ<5zcjg3o-Q;S$8 z-{)4FY|qWXjU=&o0{0otjT3ILur;!>H1RS{mzQH~*t|KAMtnC ztg2wmKXJmrNeMEWWeV6?fRa17C*RIj-K?l!50p5unZ1FJ87OMNPb{%ck$zL&OP7vof`yJ5LkP4R!R5$ zl6`w(c^U3lomzdf(Qa5eaziiOo;cC~Qj zS}}WOB;`&s=N}$7MkZ^1K0liKJpy&DznT2$arh;1Hu~spL6}iF@5dr@v;M7iqb0(( zYAU>}Z1qzk+Ea%PmQ!#f%&ru>ad?n94MFtsHdpW8) z8Zlc#nHsLthzpGb*GMuA2c88fj;RO|K%(yz$|_8aIe5Lv>?K? diff --git a/blog-api/yii b/blog-api/yii index 8d2bd2fa6..ae28a32ea 100755 --- a/blog-api/yii +++ b/blog-api/yii @@ -8,5 +8,10 @@ use Yiisoft\Yii\Runner\Console\ConsoleApplicationRunner; require_once __DIR__ . '/autoload.php'; // Run console application runner -$runner = new ConsoleApplicationRunner(__DIR__, $_ENV['YII_DEBUG'], $_ENV['YII_ENV']); +$runner = new ConsoleApplicationRunner( + rootPath: __DIR__, + debug: $_ENV['YII_DEBUG'], + checkEvents: $_ENV['YII_DEBUG'], + environment: $_ENV['YII_ENV'] +); $runner->run(); diff --git a/blog/composer.json b/blog/composer.json index 9f4ceacfd..fc92d5f61 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -36,58 +36,58 @@ "symfony/console": "^6.0", "vlucas/phpdotenv": "^5.3", "yiisoft/access": "^1.0", - "yiisoft/aliases": "^2.0", - "yiisoft/assets": "^2.1", + "yiisoft/aliases": "^3.0", + "yiisoft/assets": "^4.0", "yiisoft/auth": "^3.0", - "yiisoft/cache": "^2.0", - "yiisoft/cache-file": "^2.0", + "yiisoft/cache": "^3.0", + "yiisoft/cache-file": "^3.0", "yiisoft/config": "^1.0", "yiisoft/cookies": "^1.2", - "yiisoft/csrf": "^1.2", + "yiisoft/csrf": "^2.0", "yiisoft/data": "^1.0", - "yiisoft/data-response": "^1.0", + "yiisoft/data-response": "^2.0", "yiisoft/definitions": "^3.0", "yiisoft/di": "^1.2", - "yiisoft/error-handler": "^2.0", + "yiisoft/error-handler": "^3.0", "yiisoft/factory": "^1.0", "yiisoft/form": "^1.0@dev", "yiisoft/html": "^3.0", "yiisoft/http": "^1.2", "yiisoft/injector": "^1.0", "yiisoft/log": "^2.0", - "yiisoft/log-target-file": "^2.0", + "yiisoft/log-target-file": "^3.0", "yiisoft/mailer": "^5.0", - "yiisoft/mailer-symfony": "^2.1", + "yiisoft/mailer-symfony": "^3.0", "yiisoft/rate-limiter": "dev-master", "yiisoft/request-model": "dev-master", "yiisoft/rbac": "^1.0", "yiisoft/rbac-php": "^1.0", - "yiisoft/rbac-rules-container": "^1.1", - "yiisoft/router": "^2.1", - "yiisoft/router-fastroute": "^2.1", + "yiisoft/rbac-rules-container": "^2.0", + "yiisoft/router": "^3.0", + "yiisoft/router-fastroute": "^3.0", "yiisoft/security": "^1.0", - "yiisoft/session": "^1.0", - "yiisoft/translator": "^2.0", - "yiisoft/translator-message-php": "^1.1", - "yiisoft/user": "^1.0", + "yiisoft/session": "^2.0", + "yiisoft/translator": "^3.0", + "yiisoft/translator-message-php": "^1.1.1", + "yiisoft/user": "^2.0", "yiisoft/validator": "3.0.x-dev", "yiisoft/var-dumper": "^1.0", - "yiisoft/view": "^7.0", + "yiisoft/view": "^8.0", "yiisoft/widget": "^2.0", "yiisoft/yii-bootstrap5": "^3.0@dev", - "yiisoft/yii-console": "^1.0", + "yiisoft/yii-console": "^2.0", "yiisoft/yii-cycle": "dev-master", "yiisoft/yii-dataview": "^3.0@dev", "yiisoft/yii-debug": "^3.0@dev", "yiisoft/yii-debug-api": "^3.0@dev", - "yiisoft/yii-event": "^1.0", + "yiisoft/yii-event": "^2.0", "yiisoft/yii-http": "^1.0", "yiisoft/yii-middleware": "dev-master", - "yiisoft/yii-runner-console": "^1.0", - "yiisoft/yii-runner-http": "^1.1", + "yiisoft/yii-runner-console": "^2.0", + "yiisoft/yii-runner-http": "^2.0", "yiisoft/yii-sentry": "dev-master", - "yiisoft/yii-swagger": "^1.0", - "yiisoft/yii-view": "^5.0" + "yiisoft/yii-swagger": "^2.0", + "yiisoft/yii-view": "^6.0" }, "require-dev": { "codeception/c3": "^2.6", @@ -100,7 +100,7 @@ "roave/security-advisories": "dev-master", "spatie/phpunit-watcher": "^1.23", "vimeo/psalm": "^4.18", - "yiisoft/translator-extractor": "^1.1", + "yiisoft/translator-extractor": "^2.0", "yiisoft/yii-debug-viewer": "^3.0@dev", "yiisoft/yii-gii": "^3.0@dev", "yiisoft/yii-testing": "dev-master" @@ -134,82 +134,7 @@ "branch-alias": { "dev-master": "3.0.x-dev" }, - "config-plugin-options": { - "source-directory": "config" - }, - "config-plugin-environments": { - "dev": { - "params": [ - "test/params.php" - ] - }, - "prod": { - "params": [ - "test/params.php" - ] - }, - "test": { - "params": [ - "test/params.php" - ] - } - }, - "config-plugin": { - "common": "common/*.php", - "params": [ - "params.php", - "?params-local.php" - ], - "web": [ - "$common", - "web/*.php" - ], - "console": [ - "$common", - "console/*.php" - ], - "events": "events.php", - "events-web": [ - "$events", - "events-web.php" - ], - "events-console": [ - "$events", - "events-console.php" - ], - "providers": "providers.php", - "providers-web": [ - "$providers", - "providers-web.php" - ], - "providers-console": [ - "$providers", - "providers-console.php" - ], - "delegates": "delegates.php", - "delegates-web": [ - "$delegates", - "delegates-web.php" - ], - "delegates-console": [ - "$delegates", - "delegates-console.php" - ], - "routes": [ - "routes-backend.php", - "routes.php" - ], - "bootstrap": "bootstrap.php", - "bootstrap-web": [ - "$bootstrap", - "bootstrap-web.php" - ], - "bootstrap-console": [ - "$bootstrap", - "bootstrap-console.php" - ], - "widgets": "widgets.php" - }, + "config-plugin-file": "configuration.php", "installer-types": [ "npm-asset" ], diff --git a/blog/config/bootstrap-console.php b/blog/config/bootstrap-console.php deleted file mode 100644 index 0dae23dee..000000000 --- a/blog/config/bootstrap-console.php +++ /dev/null @@ -1,5 +0,0 @@ - [ - 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU', 'id' => 'id-ID', 'sk' => 'sk-SK'], - 'ignoredRequests' => [ - '/debug**', - '/inspect**', - ], - ], 'mailer' => [ 'adminEmail' => 'admin@example.com', 'senderEmail' => 'sender@example.com', ], - 'middlewares' => [ - ErrorCatcher::class, - SentryMiddleware::class, - SessionMiddleware::class, - CookieMiddleware::class, - CookieLoginMiddleware::class, - Locale::class, - Router::class, - ], 'yiisoft/aliases' => [ 'aliases' => [ - '@root' => dirname(__DIR__), + '@root' => dirname(__DIR__, 2), '@assets' => '@root/public/assets', '@assetsUrl' => '@baseUrl/assets', '@baseUrl' => $_ENV['BASE_URL'], @@ -129,21 +104,6 @@ ], ], - 'yiisoft/yii-console' => [ - 'name' => Application::NAME, - 'version' => Application::VERSION, - 'autoExit' => false, - 'commands' => [ - 'serve' => Serve::class, - 'user/create' => App\User\Console\CreateCommand::class, - 'user/assignRole' => App\User\Console\AssignRoleCommand::class, - 'fixture/add' => App\Command\Fixture\AddCommand::class, - 'fixture/schema/clear' => App\Command\Fixture\SchemaClearCommand::class, - 'router/list' => App\Command\Router\ListCommand::class, - 'translator/translate' => App\Command\Translation\TranslateCommand::class, - ], - ], - 'yiisoft/yii-cycle' => [ // DBAL config 'dbal' => [ diff --git a/blog/config/rbac-rules.php b/blog/config/common/rbac-rules.php similarity index 100% rename from blog/config/rbac-rules.php rename to blog/config/common/rbac-rules.php diff --git a/blog/config/routes-backend.php b/blog/config/common/routes/routes-backend.php similarity index 100% rename from blog/config/routes-backend.php rename to blog/config/common/routes/routes-backend.php diff --git a/blog/config/routes.php b/blog/config/common/routes/routes.php similarity index 100% rename from blog/config/routes.php rename to blog/config/common/routes/routes.php diff --git a/blog/config/console/commands.php b/blog/config/console/commands.php new file mode 100644 index 000000000..61f564648 --- /dev/null +++ b/blog/config/console/commands.php @@ -0,0 +1,15 @@ + Serve::class, + 'user/create' => App\User\Console\CreateCommand::class, + 'user/assignRole' => App\User\Console\AssignRoleCommand::class, + 'fixture/add' => App\Command\Fixture\AddCommand::class, + 'fixture/schema/clear' => App\Command\Fixture\SchemaClearCommand::class, + 'router/list' => App\Command\Router\ListCommand::class, + 'translator/translate' => App\Command\Translation\TranslateCommand::class, +]; diff --git a/blog/config/console/translator-extractor.php b/blog/config/console/di/translator-extractor.php similarity index 100% rename from blog/config/console/translator-extractor.php rename to blog/config/console/di/translator-extractor.php diff --git a/blog/config/events-console.php b/blog/config/console/events.php similarity index 100% rename from blog/config/events-console.php rename to blog/config/console/events.php diff --git a/blog/config/console/params.php b/blog/config/console/params.php new file mode 100644 index 000000000..e21790626 --- /dev/null +++ b/blog/config/console/params.php @@ -0,0 +1,14 @@ + [ + 'name' => Application::NAME, + 'version' => Application::VERSION, + 'autoExit' => false, + 'commands' => require __DIR__ . '/commands.php', + ], +]; diff --git a/blog/config/delegates-console.php b/blog/config/delegates-console.php deleted file mode 100644 index 0dae23dee..000000000 --- a/blog/config/delegates-console.php +++ /dev/null @@ -1,5 +0,0 @@ - [ + ErrorCatcher::class, + SentryMiddleware::class, + SessionMiddleware::class, + CookieMiddleware::class, + CookieLoginMiddleware::class, + Locale::class, + Router::class, + ], + + 'locale' => [ + 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU', 'id' => 'id-ID', 'sk' => 'sk-SK'], + 'ignoredRequests' => [ + '/debug**', + '/inspect**', + ], + ], +]; diff --git a/blog/config/widgets.php b/blog/config/widgets.php deleted file mode 100644 index 0dae23dee..000000000 --- a/blog/config/widgets.php +++ /dev/null @@ -1,5 +0,0 @@ - [ + 'params' => [ + 'common/params.php', + ], + 'params-web' => [ + '$params', + 'web/params.php', + ], + 'params-console' => [ + '$params', + 'console/params.php', + ], + 'di' => 'common/di/*.php', + 'di-web' => [ + '$di', + 'web/di/*.php', + ], + 'di-console' => '$di', + 'di-providers' => [], + 'di-providers-web' => [ + '$di-providers', + ], + 'di-providers-console' => [ + '$di-providers', + ], + 'di-delegates' => [], + 'di-delegates-web' => [ + '$di-delegates', + ], + 'di-delegates-console' => [ + '$di-delegates', + ], + 'events' => [], + 'events-web' => [ + '$events', + 'web/events.php', + ], + 'events-console' => [ + '$events', + 'console/events.php', + ], + 'routes' => [ + 'common/routes/*.php', + ], + 'bootstrap' => [ + 'common/bootstrap.php', + ], + 'bootstrap-web' => [ + '$bootstrap', + ], + 'bootstrap-console' => [ + '$bootstrap', + ], + ], + 'config-plugin-environments' => [ + 'dev' => [ + 'params' => [ + 'environments/dev/params.php', + ], + ], + 'prod' => [ + 'params' => [ + 'environments/prod/params.php', + ], + ], + 'test' => [ + 'params' => [ + 'environments/test/params.php', + ], + ], + ], + 'config-plugin-options' => [ + 'source-directory' => 'config', + ], +]; diff --git a/blog/public/index.php b/blog/public/index.php index 1df961e32..beb3659fc 100644 --- a/blog/public/index.php +++ b/blog/public/index.php @@ -31,5 +31,10 @@ require_once dirname(__DIR__) . '/autoload.php'; // Run HTTP application runner -$runner = new HttpApplicationRunner(dirname(__DIR__), $_ENV['YII_DEBUG'], environment: $_ENV['YII_ENV']); +$runner = new HttpApplicationRunner( + rootPath: dirname(__DIR__), + debug: $_ENV['YII_DEBUG'], + checkEvents: $_ENV['YII_DEBUG'], + environment: $_ENV['YII_ENV'] +); $runner->run(); diff --git a/blog/src/Auth/Form/SignupForm.php b/blog/src/Auth/Form/SignupForm.php index 9763f726c..c8c905d36 100644 --- a/blog/src/Auth/Form/SignupForm.php +++ b/blog/src/Auth/Form/SignupForm.php @@ -10,7 +10,7 @@ use Yiisoft\Translator\TranslatorInterface; use Yiisoft\Validator\Result; use Yiisoft\Validator\Rule\Equal; -use Yiisoft\Validator\Rule\HasLength; +use Yiisoft\Validator\Rule\Length; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\ValidatorInterface; @@ -69,7 +69,7 @@ public function getRules(): array return [ 'login' => [ new Required(), - new HasLength(min: 1, max: 48, skipOnError: true), + new Length(min: 1, max: 48, skipOnError: true), function ($value): Result { $result = new Result(); if ($this->userRepository->findByLogin($value) !== null) { @@ -81,7 +81,7 @@ function ($value): Result { ], 'password' => [ new Required(), - new HasLength(min: 8), + new Length(min: 8), ], 'passwordVerify' => [ new Required(), diff --git a/blog/tests/Functional/EventListenerConfigurationTest.php b/blog/tests/Functional/EventListenerConfigurationTest.php index 0e5f3fc62..f752ca32a 100644 --- a/blog/tests/Functional/EventListenerConfigurationTest.php +++ b/blog/tests/Functional/EventListenerConfigurationTest.php @@ -4,26 +4,39 @@ namespace App\Tests\Functional; -use function dirname; +use Yiisoft\Config\Config; use PHPUnit\Framework\TestCase; -use Psr\Container\ContainerInterface; use Yiisoft\Config\ConfigPaths; +use Yiisoft\Config\Modifier\RecursiveMerge; +use Yiisoft\Config\Modifier\ReverseMerge; use Yiisoft\Di\Container; use Yiisoft\Di\ContainerConfig; use Yiisoft\Yii\Event\ListenerConfigurationChecker; -use Yiisoft\Yii\Runner\ConfigFactory; class EventListenerConfigurationTest extends TestCase { public function testConsoleListenerConfiguration(): void { - $config = ConfigFactory::create(new ConfigPaths(dirname(__DIR__, 2), 'config'), $_ENV['YII_ENV']); + $config = new Config( + new ConfigPaths(dirname(__DIR__, 2), 'config'), + $_ENV['YII_ENV'], + [ + ReverseMerge::groups('events', 'events-web', 'events-console'), + RecursiveMerge::groups('params', 'params-web', 'params-console', 'events', 'events-web', 'events-console'), + ], + 'params', + ); + + $container = new Container( + ContainerConfig::create() + ->withDefinitions($config->get('di-console')) + ->withProviders($config->get('di-providers-console')) + ); - $containerConfig = ContainerConfig::create() - ->withDefinitions($config->get('console')); - $container = (new Container($containerConfig))->get(ContainerInterface::class); $checker = $container->get(ListenerConfigurationChecker::class); + $checker->check($config->get('events-console')); + $checker->check($config->get('events-web')); self::assertInstanceOf(ListenerConfigurationChecker::class, $checker); } diff --git a/blog/tests/Functional/IndexControllerTest.php b/blog/tests/Functional/IndexControllerTest.php index a66431881..4da8e7d68 100644 --- a/blog/tests/Functional/IndexControllerTest.php +++ b/blog/tests/Functional/IndexControllerTest.php @@ -21,7 +21,7 @@ public function testGetIndex() $method = 'GET'; $url = '/'; - $this->tester->bootstrapApplication('web', dirname(__DIR__, 2)); + $this->tester->bootstrapApplication(dirname(__DIR__, 2)); $response = $this->tester->doRequest($method, $url); $this->assertStringContainsString('Hello, everyone', $response->getContent()); diff --git a/blog/yii b/blog/yii index 0289ec8b7..ae28a32ea 100755 --- a/blog/yii +++ b/blog/yii @@ -8,5 +8,10 @@ use Yiisoft\Yii\Runner\Console\ConsoleApplicationRunner; require_once __DIR__ . '/autoload.php'; // Run console application runner -$runner = new ConsoleApplicationRunner(__DIR__, $_ENV['YII_DEBUG'], environment: $_ENV['YII_ENV']); +$runner = new ConsoleApplicationRunner( + rootPath: __DIR__, + debug: $_ENV['YII_DEBUG'], + checkEvents: $_ENV['YII_DEBUG'], + environment: $_ENV['YII_ENV'] +); $runner->run(); From 20e27abd37d3d31838bd7dab80be1ab65812d9c6 Mon Sep 17 00:00:00 2001 From: Rustam Mamadaminov Date: Thu, 2 Mar 2023 01:40:00 +0500 Subject: [PATCH 17/58] Adapt `SubFolder` middleware changes (#571) --- blog-api/composer.json | 4 ++-- blog-api/config/common/bootstrap.php | 7 +------ blog-api/config/common/params.php | 2 +- blog-api/config/web/di/application.php | 5 +++++ blog/composer.json | 2 +- blog/config/common/bootstrap.php | 7 +------ blog/config/common/params.php | 2 +- blog/config/web/di/application.php | 6 ++++++ blog/config/web/params.php | 2 ++ 9 files changed, 20 insertions(+), 17 deletions(-) diff --git a/blog-api/composer.json b/blog-api/composer.json index 82f099378..f18c873c6 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -60,9 +60,9 @@ "yiisoft/translator": "^3.0", "yiisoft/translator-message-php": "^1.1", "yiisoft/user": "^2.0", - "yiisoft/validator": "^3.0@dev", + "yiisoft/validator": "^1.0", "yiisoft/yii-console": "^2.0", - "yiisoft/yii-cycle": "^3.0@dev", + "yiisoft/yii-cycle": "dev-master", "yiisoft/yii-debug": "^3.0@dev", "yiisoft/yii-event": "^2.0", "yiisoft/yii-http": "^1.0", diff --git a/blog-api/config/common/bootstrap.php b/blog-api/config/common/bootstrap.php index 49544496a..0dae23dee 100644 --- a/blog-api/config/common/bootstrap.php +++ b/blog-api/config/common/bootstrap.php @@ -2,9 +2,4 @@ declare(strict_types=1); -return [ - function (Psr\Container\ContainerInterface $container) { - $urlGenerator = $container->get(\Yiisoft\Router\UrlGeneratorInterface::class); - $urlGenerator->setUriPrefix($_ENV['BASE_URL']); - }, -]; +return []; diff --git a/blog-api/config/common/params.php b/blog-api/config/common/params.php index 5860aa9e5..cf7f266bb 100644 --- a/blog-api/config/common/params.php +++ b/blog-api/config/common/params.php @@ -36,7 +36,7 @@ '@root' => dirname(__DIR__, 2), '@assets' => '@public/assets', '@assetsUrl' => '@baseUrl/assets', - '@baseUrl' => $_ENV['BASE_URL'], + '@baseUrl' => '', '@data' => '@root/data', '@messages' => '@resources/messages', '@public' => '@root/public', diff --git a/blog-api/config/web/di/application.php b/blog-api/config/web/di/application.php index 3fbffc59f..bc898db24 100644 --- a/blog-api/config/web/di/application.php +++ b/blog-api/config/web/di/application.php @@ -26,4 +26,9 @@ 'ignoredRequests' => $params['locale']['ignoredRequests'], ], ], + \Yiisoft\Yii\Middleware\SubFolder::class => [ + '__construct()' => [ + 'prefix' => !empty(trim($_ENV['BASE_URL'] ?? '', '/')) ? $_ENV['BASE_URL'] : null, + ], + ], ]; diff --git a/blog/composer.json b/blog/composer.json index fc92d5f61..4fa637ebf 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -70,7 +70,7 @@ "yiisoft/translator": "^3.0", "yiisoft/translator-message-php": "^1.1.1", "yiisoft/user": "^2.0", - "yiisoft/validator": "3.0.x-dev", + "yiisoft/validator": "^1.0", "yiisoft/var-dumper": "^1.0", "yiisoft/view": "^8.0", "yiisoft/widget": "^2.0", diff --git a/blog/config/common/bootstrap.php b/blog/config/common/bootstrap.php index 49544496a..0dae23dee 100644 --- a/blog/config/common/bootstrap.php +++ b/blog/config/common/bootstrap.php @@ -2,9 +2,4 @@ declare(strict_types=1); -return [ - function (Psr\Container\ContainerInterface $container) { - $urlGenerator = $container->get(\Yiisoft\Router\UrlGeneratorInterface::class); - $urlGenerator->setUriPrefix($_ENV['BASE_URL']); - }, -]; +return []; diff --git a/blog/config/common/params.php b/blog/config/common/params.php index e67641d27..fe4e56c8a 100644 --- a/blog/config/common/params.php +++ b/blog/config/common/params.php @@ -30,7 +30,7 @@ '@root' => dirname(__DIR__, 2), '@assets' => '@root/public/assets', '@assetsUrl' => '@baseUrl/assets', - '@baseUrl' => $_ENV['BASE_URL'], + '@baseUrl' => '', '@messages' => '@resources/messages', '@npm' => '@root/node_modules', '@public' => '@root/public', diff --git a/blog/config/web/di/application.php b/blog/config/web/di/application.php index d273ce84e..edb21888e 100644 --- a/blog/config/web/di/application.php +++ b/blog/config/web/di/application.php @@ -7,6 +7,7 @@ use Yiisoft\Definitions\Reference; use Yiisoft\Middleware\Dispatcher\MiddlewareDispatcher; use Yiisoft\Yii\Middleware\Locale; +use Yiisoft\Yii\Middleware\SubFolder; /** @var array $params */ @@ -26,4 +27,9 @@ 'ignoredRequests' => $params['locale']['ignoredRequests'], ], ], + SubFolder::class => [ + '__construct()' => [ + 'prefix' => !empty(trim($_ENV['BASE_URL'] ?? '', '/')) ? $_ENV['BASE_URL'] : null, + ], + ], ]; diff --git a/blog/config/web/params.php b/blog/config/web/params.php index 4cec13b69..8a1c14138 100644 --- a/blog/config/web/params.php +++ b/blog/config/web/params.php @@ -8,6 +8,7 @@ use Yiisoft\Session\SessionMiddleware; use Yiisoft\User\Login\Cookie\CookieLoginMiddleware; use Yiisoft\Yii\Middleware\Locale; +use Yiisoft\Yii\Middleware\SubFolder; use Yiisoft\Yii\Sentry\SentryMiddleware; return [ @@ -17,6 +18,7 @@ SessionMiddleware::class, CookieMiddleware::class, CookieLoginMiddleware::class, + SubFolder::class, Locale::class, Router::class, ], From 3ba9cfff45eaf1683784f8d54a18f31878b0b464 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Tue, 21 Mar 2023 09:22:03 +0300 Subject: [PATCH 18/58] Set up crontab for certbot renew (#578) * Set up crontab for certbot renew * Apply fixes from StyleCI --------- Co-authored-by: StyleCI Bot --- .../certbot/tasks/update_certificates.yml | 20 ++++++++++++ blog-api/config/web/di/application.php | 2 +- blog-api/src/Auth/AuthController.php | 13 ++++++++ blog-api/src/Auth/AuthRequest.php | 1 + blog-api/src/Blog/BlogController.php | 31 +++++++++++++++++++ blog-api/src/Blog/EditPostRequest.php | 1 + blog-api/src/Blog/PostFormatter.php | 1 + blog-api/src/Dto/ApiResponseData.php | 1 + blog-api/src/Formatter/PaginatorFormatter.php | 1 + blog-api/src/InfoController.php | 4 +++ blog-api/src/User/UserController.php | 11 +++++++ blog-api/src/User/UserFormatter.php | 1 + blog/config/common/routes/routes.php | 4 +-- blog/src/Controller/Actions/ApiInfo.php | 1 + .../src/User/Controller/ApiUserController.php | 4 +++ 15 files changed, 93 insertions(+), 3 deletions(-) diff --git a/ansible/roles/certbot/tasks/update_certificates.yml b/ansible/roles/certbot/tasks/update_certificates.yml index 02f79c583..7dc919a9f 100644 --- a/ansible/roles/certbot/tasks/update_certificates.yml +++ b/ansible/roles/certbot/tasks/update_certificates.yml @@ -16,3 +16,23 @@ args: chdir: /home/deploy/demo.yiiframework.com shell: docker-compose -f docker-compose.yml exec gateway nginx -t && docker-compose -f docker-compose.yml exec gateway nginx -s reload + +# Crontab file location is /var/spool/cron/crontabs/deploy +# Every 2nd month on 15th day of month +# See https://crontab.guru/#0_0_15_*/2_* +- name: Set periodic certificates update + cron: + name: certbot-renew + user: deploy + minute: '0' + hour: '0' + day: '15' + month: '*/2' + job: > + /bin/bash -c " + cd /home/deploy/demo.yiiframework.com && + docker-compose -f docker-compose.yml up certbot && + sleep 180 && + docker-compose -f docker-compose.yml exec -T gateway nginx -t && + docker-compose -f docker-compose.yml exec -T gateway nginx -s reload + " diff --git a/blog-api/config/web/di/application.php b/blog-api/config/web/di/application.php index bc898db24..8128fae30 100644 --- a/blog-api/config/web/di/application.php +++ b/blog-api/config/web/di/application.php @@ -14,7 +14,7 @@ Yiisoft\Yii\Http\Application::class => [ '__construct()' => [ 'dispatcher' => DynamicReference::to(static function (Injector $injector) use ($params) { - return ($injector->make(MiddlewareDispatcher::class)) + return $injector->make(MiddlewareDispatcher::class) ->withMiddlewares($params['middlewares']); }), 'fallbackHandler' => Reference::to(NotFoundHandler::class), diff --git a/blog-api/src/Auth/AuthController.php b/blog-api/src/Auth/AuthController.php index 5aa01a482..d28d20d52 100644 --- a/blog-api/src/Auth/AuthController.php +++ b/blog-api/src/Auth/AuthController.php @@ -42,13 +42,17 @@ public function __construct( * path="/auth/", * summary="Authenticate by params", * description="", + * * @OA\Response( * response="200", * description="Success", + * * @OA\JsonContent( * allOf={ + * * @OA\Schema(ref="#/components/schemas/Response"), * @OA\Schema( + * * @OA\Property( * property="data", * type="object", @@ -58,15 +62,20 @@ public function __construct( * }, * ) * ), + * * @OA\Response( * response="400", * description="Bad request", + * * @OA\JsonContent(ref="#/components/schemas/BadResponse") * ), + * * @OA\RequestBody( * required=true, + * * @OA\MediaType( * mediaType="application/json", + * * @OA\Schema(ref="#/components/schemas/AuthRequest"), * ), * ), @@ -93,14 +102,18 @@ public function login(AuthRequest $request): ResponseInterface * summary="Logout", * description="", * security={{"ApiKey": {}}}, + * * @OA\Response( * response="200", * description="Success", + * * @OA\JsonContent(ref="#/components/schemas/Response") * ), + * * @OA\Response( * response="400", * description="Bad request", + * * @OA\JsonContent(ref="#/components/schemas/BadResponse") * ), * ) diff --git a/blog-api/src/Auth/AuthRequest.php b/blog-api/src/Auth/AuthRequest.php index b6d3415b9..004967063 100644 --- a/blog-api/src/Auth/AuthRequest.php +++ b/blog-api/src/Auth/AuthRequest.php @@ -12,6 +12,7 @@ /** * @OA\Schema( * schema="AuthRequest", + * * @OA\Property(example="Opal1144", property="login", format="string"), * @OA\Property(example="Opal1144", property="password", format="string"), * ) diff --git a/blog-api/src/Blog/BlogController.php b/blog-api/src/Blog/BlogController.php index 13e272559..92c46baf0 100644 --- a/blog-api/src/Blog/BlogController.php +++ b/blog-api/src/Blog/BlogController.php @@ -17,7 +17,9 @@ * name="blog", * description="Blog" * ) + * * @OA\Parameter( + * * @OA\Schema( * type="int", * example="2" @@ -55,22 +57,29 @@ public function __construct( * path="/blog/", * summary="Returns paginated blog posts", * description="", + * * @OA\Parameter(ref="#/components/parameters/PageRequest"), + * * @OA\Response( * response="200", * description="Success", + * * @OA\JsonContent( * allOf={ + * * @OA\Schema(ref="#/components/schemas/Response"), * @OA\Schema( + * * @OA\Property( * property="data", * type="object", * @OA\Property( * property="posts", * type="array", + * * @OA\Items(ref="#/components/schemas/Post") * ), + * * @OA\Property( * property="paginator", * type="object", @@ -105,19 +114,25 @@ public function index(PaginatorFormatter $paginatorFormatter, #[Query('page')] i * path="/blog/{id}", * summary="Returns a post with a given ID", * description="", + * * @OA\Parameter( + * * @OA\Schema(type="int", example="2"), * in="path", * name="id", * parameter="id" * ), + * * @OA\Response( * response="200", * description="Success", + * * @OA\JsonContent( * allOf={ + * * @OA\Schema(ref="#/components/schemas/Response"), * @OA\Schema( + * * @OA\Property( * property="data", * type="object", @@ -131,13 +146,17 @@ public function index(PaginatorFormatter $paginatorFormatter, #[Query('page')] i * }, * ) * ), + * * @OA\Response( * response="404", * description="Not found", + * * @OA\JsonContent( * allOf={ + * * @OA\Schema(ref="#/components/schemas/BadResponse"), * @OA\Schema( + * * @OA\Property(property="error_message", example="Entity not found"), * @OA\Property(property="error_code", nullable=true, example=404) * ), @@ -164,17 +183,22 @@ public function view(#[Route('id')] int $id): Response * summary="Creates a blog post", * description="", * security={{"ApiKey": {}}}, + * * @OA\Response( * response="200", * description="Success", + * * @OA\JsonContent( * ref="#/components/schemas/Response" * ) * ), + * * @OA\RequestBody( * required=true, + * * @OA\MediaType( * mediaType="application/json", + * * @OA\Schema(ref="#/components/schemas/EditPostRequest"), * ), * ), @@ -197,23 +221,30 @@ public function create(EditPostRequest $postRequest, UserRequest $userRequest): * summary="Updates a blog post with a given ID", * description="", * security={{"ApiKey": {}}}, + * * @OA\Parameter( + * * @OA\Schema(type="int", example="2"), * in="path", * name="id", * parameter="id" * ), + * * @OA\Response( * response="200", * description="Success", + * * @OA\JsonContent( * ref="#/components/schemas/Response" * ) * ), + * * @OA\RequestBody( * required=true, + * * @OA\MediaType( * mediaType="application/json", + * * @OA\Schema(ref="#/components/schemas/EditPostRequest"), * ), * ) diff --git a/blog-api/src/Blog/EditPostRequest.php b/blog-api/src/Blog/EditPostRequest.php index d5c8464d8..375e02ded 100644 --- a/blog-api/src/Blog/EditPostRequest.php +++ b/blog-api/src/Blog/EditPostRequest.php @@ -14,6 +14,7 @@ /** * @OA\Schema( * schema="EditPostRequest", + * * @OA\Property(example="Title post", property="title", format="string"), * @OA\Property(example="Text post", property="text", format="string"), * @OA\Property(example=1, property="status", format="int"), diff --git a/blog-api/src/Blog/PostFormatter.php b/blog-api/src/Blog/PostFormatter.php index 5363a0309..3193d4bc9 100644 --- a/blog-api/src/Blog/PostFormatter.php +++ b/blog-api/src/Blog/PostFormatter.php @@ -9,6 +9,7 @@ /** * @OA\Schema( * schema="Post", + * * @OA\Property(example="100", property="id", format="int"), * @OA\Property(example="Title", property="title", format="string"), * @OA\Property(example="Text", property="content", format="string"), diff --git a/blog-api/src/Dto/ApiResponseData.php b/blog-api/src/Dto/ApiResponseData.php index ba7492f48..65e85c9eb 100644 --- a/blog-api/src/Dto/ApiResponseData.php +++ b/blog-api/src/Dto/ApiResponseData.php @@ -15,6 +15,7 @@ * allOf={ * @OA\Schema(ref="#/components/schemas/Response"), * @OA\Schema( + * * @OA\Property( * property="status", * example="failed", diff --git a/blog-api/src/Formatter/PaginatorFormatter.php b/blog-api/src/Formatter/PaginatorFormatter.php index 84221d5c0..983c6eefe 100644 --- a/blog-api/src/Formatter/PaginatorFormatter.php +++ b/blog-api/src/Formatter/PaginatorFormatter.php @@ -10,6 +10,7 @@ /** * @OA\Schema( * schema="Paginator", + * * @OA\Property(example="10", property="pageSize", format="int"), * @OA\Property(example="1", property="currentPage", format="int"), * @OA\Property(example="3", property="totalPages", format="int"), diff --git a/blog-api/src/InfoController.php b/blog-api/src/InfoController.php index c02fe1d72..3ce6fafb5 100644 --- a/blog-api/src/InfoController.php +++ b/blog-api/src/InfoController.php @@ -22,13 +22,17 @@ public function __construct(private VersionProvider $versionProvider) * path="/", * summary="Returns info about the API", * description="", + * * @OA\Response( * response="200", * description="Success", + * * @OA\JsonContent( * allOf={ + * * @OA\Schema(ref="#/components/schemas/Response"), * @OA\Schema( + * * @OA\Property( * property="data", * type="object", diff --git a/blog-api/src/User/UserController.php b/blog-api/src/User/UserController.php index ee7ecf30c..4baea2f64 100644 --- a/blog-api/src/User/UserController.php +++ b/blog-api/src/User/UserController.php @@ -42,19 +42,24 @@ public function __construct( * summary="Returns paginated users", * description="", * security={{"ApiKey": {}}}, + * * @OA\Response( * response="200", * description="Success", + * * @OA\JsonContent( * allOf={ + * * @OA\Schema(ref="#/components/schemas/Response"), * @OA\Schema( + * * @OA\Property( * property="data", * type="object", * @OA\Property( * property="users", * type="array", + * * @OA\Items(ref="#/components/schemas/User") * ), * ), @@ -86,19 +91,25 @@ public function list(): ResponseInterface * summary="Returns a user with a given ID", * description="", * security={{"ApiKey": {}}}, + * * @OA\Parameter( + * * @OA\Schema(type="int", example="2"), * in="path", * name="id", * parameter="id" * ), + * * @OA\Response( * response="200", * description="Success", + * * @OA\JsonContent( * allOf={ + * * @OA\Schema(ref="#/components/schemas/Response"), * @OA\Schema( + * * @OA\Property( * property="data", * type="object", diff --git a/blog-api/src/User/UserFormatter.php b/blog-api/src/User/UserFormatter.php index 4b44e09af..115280f45 100644 --- a/blog-api/src/User/UserFormatter.php +++ b/blog-api/src/User/UserFormatter.php @@ -9,6 +9,7 @@ /** * @OA\Schema( * schema="User", + * * @OA\Property(example="UserName", property="login", format="string"), * @OA\Property(example="13.12.2020 00:04:20", property="created_at", format="string"), * ) diff --git a/blog/config/common/routes/routes.php b/blog/config/common/routes/routes.php index d06a4a7a8..0b0275b19 100644 --- a/blog/config/common/routes/routes.php +++ b/blog/config/common/routes/routes.php @@ -101,7 +101,7 @@ // Blog routes Group::create('/blog') ->routes( - // Index + // Index Route::get('[/page{page:\d+}]') ->middleware( fn (HttpCache $httpCache, PostRepository $postRepository) => $httpCache->withLastModified(function (ServerRequestInterface $request, $params) use ($postRepository) { @@ -144,7 +144,7 @@ // Archive Group::create('/archive') ->routes( - // Index page + // Index page Route::get('') ->action([ArchiveController::class, 'index']) ->name('blog/archive/index'), diff --git a/blog/src/Controller/Actions/ApiInfo.php b/blog/src/Controller/Actions/ApiInfo.php index b2aad8e2e..dc83f1c06 100644 --- a/blog/src/Controller/Actions/ApiInfo.php +++ b/blog/src/Controller/Actions/ApiInfo.php @@ -26,6 +26,7 @@ public function __construct(DataResponseFactoryInterface $responseFactory) /** * @OA\Get( * path="/api/info/v2", + * * @OA\Response(response="200", description="Get api version") * ) */ diff --git a/blog/src/User/Controller/ApiUserController.php b/blog/src/User/Controller/ApiUserController.php index 1f3bb769a..9f0c4e55f 100644 --- a/blog/src/User/Controller/ApiUserController.php +++ b/blog/src/User/Controller/ApiUserController.php @@ -28,6 +28,7 @@ public function __construct(private DataResponseFactoryInterface $responseFactor * @OA\Get( * path="/api/user", * tags={"user"}, + * * @OA\Response(response="200", description="Get users list") * ) */ @@ -52,12 +53,15 @@ public function index(UserRepository $userRepository): ResponseInterface * @OA\Get( * path="/api/user/{login}", * tags={"user"}, + * * @OA\Parameter( + * * @OA\Schema(type="string"), * in="path", * name="login", * parameter="login" * ), + * * @OA\Response(response="200", description="Get user info") * ) */ From da8c4b474ab1f183d4f9960cd03c6a07b875eb8c Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 31 Mar 2023 17:40:53 +0300 Subject: [PATCH 19/58] Update .styleci.yml (#580) * Update .styleci.yml * Update .styleci.yml --- .styleci.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.styleci.yml b/.styleci.yml index 2b00d6317..76e29ece8 100644 --- a/.styleci.yml +++ b/.styleci.yml @@ -1,7 +1,7 @@ preset: psr12 risky: true -version: 8 +version: 8.1 finder: exclude: @@ -60,7 +60,6 @@ enabled: - phpdoc_order - phpdoc_property - phpdoc_scalar - - phpdoc_separation - phpdoc_singular_inheritdoc - phpdoc_trim - phpdoc_trim_consecutive_blank_line_separation @@ -82,3 +81,9 @@ enabled: - trailing_comma_in_multiline_array - unalign_double_arrow - unalign_equals + - empty_loop_body_braces + - integer_literal_case + - union_type_without_spaces + +disabled: + - function_declaration From a83c1702051aa5e02927bfc8b283ebc83c3adffc Mon Sep 17 00:00:00 2001 From: Rustam Mamadaminov Date: Thu, 13 Apr 2023 11:47:07 +0500 Subject: [PATCH 20/58] Fix CI build & adapt form-model changes (#574) --- .github/workflows/blog-api_build.yml | 2 +- .github/workflows/blog_build.yml | 2 +- blog-api/.env.test | 1 + blog-api/tests/Acceptance.suite.yml | 2 +- blog-api/tests/Functional.suite.yml | 2 +- .../{UserControllerTest.php => IndexControllerTest.php} | 6 +++--- blog/.env.test | 3 ++- blog/src/Auth/Form/LoginForm.php | 3 ++- blog/src/Auth/Form/SignupForm.php | 3 ++- blog/src/Contact/ContactForm.php | 3 ++- blog/tests/Acceptance.suite.yml | 2 +- blog/tests/Functional.suite.yml | 2 +- 12 files changed, 18 insertions(+), 13 deletions(-) rename blog-api/tests/Functional/{UserControllerTest.php => IndexControllerTest.php} (90%) diff --git a/.github/workflows/blog-api_build.yml b/.github/workflows/blog-api_build.yml index 297590dde..9ad9ca26c 100644 --- a/.github/workflows/blog-api_build.yml +++ b/.github/workflows/blog-api_build.yml @@ -34,7 +34,7 @@ jobs: name: PHP ${{ matrix.php }}-${{ matrix.os }} env: - extensions: fileinfo, pdo, pdo_sqlite, intl + extensions: fileinfo, pdo, pdo_sqlite, intl, pcntl key: cache-v1 YII_C3: true working_directory: blog-api diff --git a/.github/workflows/blog_build.yml b/.github/workflows/blog_build.yml index d1b87bca8..4a010ae65 100644 --- a/.github/workflows/blog_build.yml +++ b/.github/workflows/blog_build.yml @@ -37,7 +37,7 @@ jobs: extensions: fileinfo, pdo, pdo_sqlite, intl key: cache-v1 YII_C3: true - working_directory: blog-api + working_directory: blog runs-on: ${{ matrix.os }} diff --git a/blog-api/.env.test b/blog-api/.env.test index dbdcc044e..881657317 100644 --- a/blog-api/.env.test +++ b/blog-api/.env.test @@ -1,2 +1,3 @@ YII_ENV=test YII_DEBUG=true +BASE_URL=/ diff --git a/blog-api/tests/Acceptance.suite.yml b/blog-api/tests/Acceptance.suite.yml index 42dc406ff..d88211108 100644 --- a/blog-api/tests/Acceptance.suite.yml +++ b/blog-api/tests/Acceptance.suite.yml @@ -7,7 +7,7 @@ extensions: modules: enabled: - REST: - url: http://127.0.0.1:8881 + url: http://127.0.0.1:8881%BASE_URL% depends: PhpBrowser - Db: dsn: 'sqlite:tests/Support/Data/database.db' diff --git a/blog-api/tests/Functional.suite.yml b/blog-api/tests/Functional.suite.yml index 289db8882..125f6c5bb 100644 --- a/blog-api/tests/Functional.suite.yml +++ b/blog-api/tests/Functional.suite.yml @@ -7,6 +7,6 @@ extensions: modules: enabled: - PhpBrowser: - url: http://127.0.0.1:8881 + url: http://127.0.0.1:8881%BASE_URL% - \App\Tests\Support\Helper\Functional step_decorators: ~ diff --git a/blog-api/tests/Functional/UserControllerTest.php b/blog-api/tests/Functional/IndexControllerTest.php similarity index 90% rename from blog-api/tests/Functional/UserControllerTest.php rename to blog-api/tests/Functional/IndexControllerTest.php index f9f056e9c..781f79ecd 100644 --- a/blog-api/tests/Functional/UserControllerTest.php +++ b/blog-api/tests/Functional/IndexControllerTest.php @@ -8,7 +8,7 @@ use PHPUnit\Framework\TestCase; use Yiisoft\Yii\Testing\FunctionalTester; -final class UserControllerTest extends TestCase +final class IndexControllerTest extends TestCase { private ?FunctionalTester $tester; @@ -17,7 +17,7 @@ protected function setUp(): void $this->tester = new FunctionalTester(); } - public function testGetIndex() + public function testGetIndex(): void { $method = 'GET'; $url = '/'; @@ -36,7 +36,7 @@ public function testGetIndex() ); } - public function testGetIndexMockVersion() + public function testGetIndexMockVersion(): void { $method = 'GET'; $url = '/'; diff --git a/blog/.env.test b/blog/.env.test index 454ab1431..76b1f81af 100644 --- a/blog/.env.test +++ b/blog/.env.test @@ -1,3 +1,4 @@ YII_ENV=test -YII_DEBUG=false +YII_DEBUG=true SENTRY_DSN= +BASE_URL=/ diff --git a/blog/src/Auth/Form/LoginForm.php b/blog/src/Auth/Form/LoginForm.php index 98e49308d..985c9d529 100644 --- a/blog/src/Auth/Form/LoginForm.php +++ b/blog/src/Auth/Form/LoginForm.php @@ -10,8 +10,9 @@ use Yiisoft\Validator\Result; use Yiisoft\Validator\Rule\Callback; use Yiisoft\Validator\Rule\Required; +use Yiisoft\Validator\RulesProviderInterface; -final class LoginForm extends FormModel +final class LoginForm extends FormModel implements RulesProviderInterface { private string $login = ''; private string $password = ''; diff --git a/blog/src/Auth/Form/SignupForm.php b/blog/src/Auth/Form/SignupForm.php index c8c905d36..30984ef2a 100644 --- a/blog/src/Auth/Form/SignupForm.php +++ b/blog/src/Auth/Form/SignupForm.php @@ -12,9 +12,10 @@ use Yiisoft\Validator\Rule\Equal; use Yiisoft\Validator\Rule\Length; use Yiisoft\Validator\Rule\Required; +use Yiisoft\Validator\RulesProviderInterface; use Yiisoft\Validator\ValidatorInterface; -final class SignupForm extends FormModel +final class SignupForm extends FormModel implements RulesProviderInterface { private string $login = ''; private string $password = ''; diff --git a/blog/src/Contact/ContactForm.php b/blog/src/Contact/ContactForm.php index 182570215..ec76a96d0 100644 --- a/blog/src/Contact/ContactForm.php +++ b/blog/src/Contact/ContactForm.php @@ -7,8 +7,9 @@ use Yiisoft\Form\FormModel; use Yiisoft\Validator\Rule\Email; use Yiisoft\Validator\Rule\Required; +use Yiisoft\Validator\RulesProviderInterface; -final class ContactForm extends FormModel +final class ContactForm extends FormModel implements RulesProviderInterface { private string $name = ''; private string $email = ''; diff --git a/blog/tests/Acceptance.suite.yml b/blog/tests/Acceptance.suite.yml index 94370b4a5..d4c578c4c 100644 --- a/blog/tests/Acceptance.suite.yml +++ b/blog/tests/Acceptance.suite.yml @@ -7,6 +7,6 @@ extensions: modules: enabled: - PhpBrowser: - url: http://127.0.0.1:8881 + url: http://127.0.0.1:8881%BASE_URL% - \App\Tests\Support\Helper\Acceptance step_decorators: ~ diff --git a/blog/tests/Functional.suite.yml b/blog/tests/Functional.suite.yml index 289db8882..125f6c5bb 100644 --- a/blog/tests/Functional.suite.yml +++ b/blog/tests/Functional.suite.yml @@ -7,6 +7,6 @@ extensions: modules: enabled: - PhpBrowser: - url: http://127.0.0.1:8881 + url: http://127.0.0.1:8881%BASE_URL% - \App\Tests\Support\Helper\Functional step_decorators: ~ From 5bc01f16d41410139bfe0dc755c897657869be4a Mon Sep 17 00:00:00 2001 From: Evgeniy Zyubin Date: Sun, 7 May 2023 01:55:56 +0300 Subject: [PATCH 21/58] Allow psr/http-message v2 (#582) --- blog-api/composer.json | 4 ++-- blog/composer.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blog-api/composer.json b/blog-api/composer.json index f18c873c6..a4180e969 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -27,11 +27,11 @@ "cycle/entity-behavior": "^1.0", "cycle/orm": "^2.0", "doctrine/collections": "^2.0", - "httpsoft/http-message": "^1.0.5", + "httpsoft/http-message": "^1.1", "myclabs/php-enum": "^1.7", "psr/container": "^1.0|^2.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1|^2.0", "psr/http-server-handler": "^1.0", "psr/http-server-middleware": "^1.0", "psr/log": "^3.0", diff --git a/blog/composer.json b/blog/composer.json index 4fa637ebf..b22d57e33 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -25,11 +25,11 @@ "cycle/orm": "^2.0", "doctrine/collections": "^1.6", "fakerphp/faker": "^1.14", - "httpsoft/http-message": "^1.0.5", + "httpsoft/http-message": "^1.1", "php-http/guzzle7-adapter": "^1.0", "psr/container": "^2.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1|^2.0", "psr/http-server-handler": "^1.0", "psr/http-server-middleware": "^1.0", "psr/log": "^3.0", From 3846c2e89b1a4c887a5cc5c07d3aa453eb62e4d8 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Mon, 15 May 2023 14:46:47 +0300 Subject: [PATCH 22/58] Adapt to last changes in `Locale` middleware (#583) --- blog-api/config/web/di/application.php | 4 ++-- blog/config/web/di/application.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blog-api/config/web/di/application.php b/blog-api/config/web/di/application.php index 8128fae30..995f4b9a5 100644 --- a/blog-api/config/web/di/application.php +++ b/blog-api/config/web/di/application.php @@ -22,8 +22,8 @@ ], \Yiisoft\Yii\Middleware\Locale::class => [ '__construct()' => [ - 'locales' => $params['locale']['locales'], - 'ignoredRequests' => $params['locale']['ignoredRequests'], + 'supportedLocales' => $params['locale']['locales'], + 'ignoredRequestUrlPatterns' => $params['locale']['ignoredRequests'], ], ], \Yiisoft\Yii\Middleware\SubFolder::class => [ diff --git a/blog/config/web/di/application.php b/blog/config/web/di/application.php index edb21888e..68957bf3b 100644 --- a/blog/config/web/di/application.php +++ b/blog/config/web/di/application.php @@ -23,8 +23,8 @@ ], Locale::class => [ '__construct()' => [ - 'locales' => $params['locale']['locales'], - 'ignoredRequests' => $params['locale']['ignoredRequests'], + 'supportedLocales' => $params['locale']['locales'], + 'ignoredRequestUrlPatterns' => $params['locale']['ignoredRequests'], ], ], SubFolder::class => [ From d1ec6332a6743cc624558b5bde6652a5f4b97737 Mon Sep 17 00:00:00 2001 From: Ihor Sychevskyi Date: Sat, 20 May 2023 19:46:01 +0300 Subject: [PATCH 23/58] update irc link (#584) --- blog-api/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog-api/composer.json b/blog-api/composer.json index a4180e969..5845337c4 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -14,7 +14,7 @@ "issues": "https://github.com/yiisoft/demo-api/issues?state=open", "forum": "https://www.yiiframework.com/forum/", "wiki": "https://www.yiiframework.com/wiki/", - "irc": "irc://irc.freenode.net/yii", + "irc": "ircs://irc.libera.chat:6697/yii", "source": "https://github.com/yiisoft/demo-api" }, "minimum-stability": "dev", From a5d1bd2e8f110e0cd84b49aaff3a8c210b1bf63d Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Thu, 25 May 2023 11:27:37 +0600 Subject: [PATCH 24/58] Sync with middleware (#586) * Sync with middleware * Disallow http discovery --- blog-api/composer.json | 2 +- blog-api/config/common/params.php | 4 ++-- blog-api/config/web/di/application.php | 2 +- blog/composer.json | 7 ++++--- blog/config/web/di/application.php | 4 ++-- blog/config/web/params.php | 4 ++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/blog-api/composer.json b/blog-api/composer.json index 5845337c4..3eacedb2c 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -66,7 +66,7 @@ "yiisoft/yii-debug": "^3.0@dev", "yiisoft/yii-event": "^2.0", "yiisoft/yii-http": "^1.0", - "yiisoft/yii-middleware": "dev-master", + "yiisoft/yii-middleware": "^1.0", "yiisoft/yii-queue": "3.0.x-dev", "yiisoft/yii-runner-console": "^2.0", "yiisoft/yii-runner-http": "^2.0", diff --git a/blog-api/config/common/params.php b/blog-api/config/common/params.php index cf7f266bb..cd550e125 100644 --- a/blog-api/config/common/params.php +++ b/blog-api/config/common/params.php @@ -12,7 +12,7 @@ use Yiisoft\Yii\Cycle\Schema\Provider\PhpFileSchemaProvider; use Yiisoft\Yii\Cycle\Schema\SchemaProviderInterface; use Yiisoft\Yii\Middleware\Locale; -use Yiisoft\Yii\Middleware\SubFolder; +use Yiisoft\Yii\Middleware\Subfolder; use Yiisoft\Yii\Queue\Adapter\SynchronousAdapter; return [ @@ -26,7 +26,7 @@ 'supportEmail' => 'support@example.com', 'middlewares' => [ ErrorCatcher::class, - SubFolder::class, + Subfolder::class, Locale::class, Router::class, ], diff --git a/blog-api/config/web/di/application.php b/blog-api/config/web/di/application.php index 995f4b9a5..709f69e3b 100644 --- a/blog-api/config/web/di/application.php +++ b/blog-api/config/web/di/application.php @@ -26,7 +26,7 @@ 'ignoredRequestUrlPatterns' => $params['locale']['ignoredRequests'], ], ], - \Yiisoft\Yii\Middleware\SubFolder::class => [ + \Yiisoft\Yii\Middleware\Subfolder::class => [ '__construct()' => [ 'prefix' => !empty(trim($_ENV['BASE_URL'] ?? '', '/')) ? $_ENV['BASE_URL'] : null, ], diff --git a/blog/composer.json b/blog/composer.json index b22d57e33..7fd7fec3e 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -59,10 +59,10 @@ "yiisoft/mailer": "^5.0", "yiisoft/mailer-symfony": "^3.0", "yiisoft/rate-limiter": "dev-master", - "yiisoft/request-model": "dev-master", "yiisoft/rbac": "^1.0", "yiisoft/rbac-php": "^1.0", "yiisoft/rbac-rules-container": "^2.0", + "yiisoft/request-model": "dev-master", "yiisoft/router": "^3.0", "yiisoft/router-fastroute": "^3.0", "yiisoft/security": "^1.0", @@ -82,7 +82,7 @@ "yiisoft/yii-debug-api": "^3.0@dev", "yiisoft/yii-event": "^2.0", "yiisoft/yii-http": "^1.0", - "yiisoft/yii-middleware": "dev-master", + "yiisoft/yii-middleware": "^1.0", "yiisoft/yii-runner-console": "^2.0", "yiisoft/yii-runner-http": "^2.0", "yiisoft/yii-sentry": "dev-master", @@ -152,7 +152,8 @@ "composer/installers": true, "composer/package-versions-deprecated": true, "infection/extension-installer": true, - "yiisoft/config": true + "yiisoft/config": true, + "php-http/discovery": false } }, "repositories": [ diff --git a/blog/config/web/di/application.php b/blog/config/web/di/application.php index 68957bf3b..76fc28aec 100644 --- a/blog/config/web/di/application.php +++ b/blog/config/web/di/application.php @@ -7,7 +7,7 @@ use Yiisoft\Definitions\Reference; use Yiisoft\Middleware\Dispatcher\MiddlewareDispatcher; use Yiisoft\Yii\Middleware\Locale; -use Yiisoft\Yii\Middleware\SubFolder; +use Yiisoft\Yii\Middleware\Subfolder; /** @var array $params */ @@ -27,7 +27,7 @@ 'ignoredRequestUrlPatterns' => $params['locale']['ignoredRequests'], ], ], - SubFolder::class => [ + Subfolder::class => [ '__construct()' => [ 'prefix' => !empty(trim($_ENV['BASE_URL'] ?? '', '/')) ? $_ENV['BASE_URL'] : null, ], diff --git a/blog/config/web/params.php b/blog/config/web/params.php index 8a1c14138..90d18da23 100644 --- a/blog/config/web/params.php +++ b/blog/config/web/params.php @@ -8,7 +8,7 @@ use Yiisoft\Session\SessionMiddleware; use Yiisoft\User\Login\Cookie\CookieLoginMiddleware; use Yiisoft\Yii\Middleware\Locale; -use Yiisoft\Yii\Middleware\SubFolder; +use Yiisoft\Yii\Middleware\Subfolder; use Yiisoft\Yii\Sentry\SentryMiddleware; return [ @@ -18,7 +18,7 @@ SessionMiddleware::class, CookieMiddleware::class, CookieLoginMiddleware::class, - SubFolder::class, + Subfolder::class, Locale::class, Router::class, ], From 45e8379e44dcf2ca33c37a36d313550ca51f6031 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Wed, 21 Jun 2023 18:32:46 +0300 Subject: [PATCH 25/58] Add cors for swagger (#590) --- blog-api/config/common/routes.php | 4 +++- blog/config/common/routes/routes.php | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/blog-api/config/common/routes.php b/blog-api/config/common/routes.php index 6e01dbe76..2d39e0ab8 100644 --- a/blog-api/config/common/routes.php +++ b/blog-api/config/common/routes.php @@ -15,6 +15,7 @@ use Yiisoft\Router\UrlGeneratorInterface; use Yiisoft\Swagger\Middleware\SwaggerJson; use Yiisoft\Swagger\Middleware\SwaggerUi; +use Yiisoft\Yii\Middleware\CorsAllowAll; return [ Route::get('/') @@ -61,6 +62,7 @@ }), Route::get('/openapi.json') ->middleware(FormatDataResponseAsJson::class) - ->action(SwaggerJson::class), + ->middleware(CorsAllowAll::class) + ->action([SwaggerJson::class, 'handle']), ), ]; diff --git a/blog/config/common/routes/routes.php b/blog/config/common/routes/routes.php index 0b0275b19..0d5156aec 100644 --- a/blog/config/common/routes/routes.php +++ b/blog/config/common/routes/routes.php @@ -31,6 +31,7 @@ use Yiisoft\Router\UrlGeneratorInterface; use Yiisoft\Swagger\Middleware\SwaggerJson; use Yiisoft\Swagger\Middleware\SwaggerUi; +use Yiisoft\Yii\Middleware\CorsAllowAll; use Yiisoft\Yii\Middleware\HttpCache; use Yiisoft\Yii\RateLimiter\Counter; use Yiisoft\Yii\RateLimiter\LimitRequestsMiddleware; @@ -174,6 +175,7 @@ ->name('swagger/index'), Route::get('/openapi.json') ->middleware(FormatDataResponseAsJson::class) - ->action(SwaggerJson::class), + ->middleware(CorsAllowAll::class) + ->action([SwaggerJson::class, 'handle']), ), ]; From fc86f808800536e953fbfd198c03c81a00b4940b Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 6 Oct 2023 11:42:26 +0300 Subject: [PATCH 26/58] Blog: Fix locale, routes and npm dependencies (#597) --- .github/workflows/blog-api_build.yml | 1 + .github/workflows/blog-api_dependency.yml | 1 + .github/workflows/blog-api_static.yml | 1 + .github/workflows/blog_build.yml | 5 +++++ .github/workflows/blog_dependency.yml | 1 + .github/workflows/blog_static.yml | 1 + blog/.editorconfig | 4 ++++ blog/.gitignore | 1 + blog/Makefile | 20 +++++++++++++++++++ blog/config/common/di/router.php | 22 +++++++++++++++++++-- blog/config/web/events.php | 7 ++++++- blog/configuration.php | 2 +- blog/package.json | 10 ++++++++++ blog/src/User/Controller/UserController.php | 2 +- 14 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 blog/Makefile create mode 100644 blog/package.json diff --git a/.github/workflows/blog-api_build.yml b/.github/workflows/blog-api_build.yml index 9ad9ca26c..2e9e3a62a 100644 --- a/.github/workflows/blog-api_build.yml +++ b/.github/workflows/blog-api_build.yml @@ -14,6 +14,7 @@ on: - 'blog-api/psalm.xml' push: + branches: ['master'] paths-ignore: - 'blog-api/docs/**' - 'blog-api/README.md' diff --git a/.github/workflows/blog-api_dependency.yml b/.github/workflows/blog-api_dependency.yml index ed73b9d87..47f523773 100644 --- a/.github/workflows/blog-api_dependency.yml +++ b/.github/workflows/blog-api_dependency.yml @@ -14,6 +14,7 @@ on: - 'blog-api/psalm.xml' push: + branches: ['master'] paths-ignore: - 'blog-api/docs/**' - 'blog-api/README.md' diff --git a/.github/workflows/blog-api_static.yml b/.github/workflows/blog-api_static.yml index 84059dd27..047577c97 100644 --- a/.github/workflows/blog-api_static.yml +++ b/.github/workflows/blog-api_static.yml @@ -14,6 +14,7 @@ on: - 'blog-api/phpunit.xml.dist' push: + branches: ['master'] paths-ignore: - 'blog-api/docs/**' - 'blog-api/README.md' diff --git a/.github/workflows/blog_build.yml b/.github/workflows/blog_build.yml index 4a010ae65..5bbfbdc06 100644 --- a/.github/workflows/blog_build.yml +++ b/.github/workflows/blog_build.yml @@ -14,6 +14,7 @@ on: - 'blog/psalm.xml' push: + branches: ['master'] paths-ignore: - 'blog/docs/**' - 'blog/README.md' @@ -94,6 +95,10 @@ jobs: run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi working-directory: ${{ env.working_directory }} + - name: Install dependencies with npm + run: npm update + working-directory: ${{ env.working_directory }} + - name: Run tests codeception if: matrix.os != 'ubuntu-latest' || matrix.php != '8.0' run: vendor/bin/codecept run diff --git a/.github/workflows/blog_dependency.yml b/.github/workflows/blog_dependency.yml index 3a2c9afd9..08c7d5742 100644 --- a/.github/workflows/blog_dependency.yml +++ b/.github/workflows/blog_dependency.yml @@ -14,6 +14,7 @@ on: - 'blog/psalm.xml' push: + branches: ['master'] paths-ignore: - 'blog/docs/**' - 'blog/README.md' diff --git a/.github/workflows/blog_static.yml b/.github/workflows/blog_static.yml index d0ab289a6..6e5c3a323 100644 --- a/.github/workflows/blog_static.yml +++ b/.github/workflows/blog_static.yml @@ -14,6 +14,7 @@ on: - 'blog/phpunit.xml.dist' push: + branches: ['master'] paths-ignore: - 'blog/docs/**' - 'blog/README.md' diff --git a/blog/.editorconfig b/blog/.editorconfig index 5e9a93ea5..8802775ba 100644 --- a/blog/.editorconfig +++ b/blog/.editorconfig @@ -10,6 +10,10 @@ indent_style = space indent_size = 4 trim_trailing_whitespace = true +[*.php] +ij_php_space_before_short_closure_left_parenthesis = false +ij_php_space_after_type_cast = true + [*.md] trim_trailing_whitespace = false diff --git a/blog/.gitignore b/blog/.gitignore index 94819d1f3..e1bda997b 100644 --- a/blog/.gitignore +++ b/blog/.gitignore @@ -25,6 +25,7 @@ phpunit.phar /vendor /composer.lock /node_modules +/package-lock.json # Codeception c3.php diff --git a/blog/Makefile b/blog/Makefile new file mode 100644 index 000000000..5cc895d70 --- /dev/null +++ b/blog/Makefile @@ -0,0 +1,20 @@ +init: composer-update npm-update up + +up: + docker-compose up -d +down: + docker-compose down + +composer: + docker-compose run php composer $(filter-out $@, $(MAKECMDGOALS)) +composer-update: + docker-compose run php composer update + npm i bootstrap@5.3.1 + +npm: + docker-compose run php npm $(filter-out $@, $(MAKECMDGOALS)) +npm-update: + docker-compose run php npm update + +yii3: + docker-compose run php ./yii $(filter-out $@, $(MAKECMDGOALS)) diff --git a/blog/config/common/di/router.php b/blog/config/common/di/router.php index d192a6d17..3cbc11477 100644 --- a/blog/config/common/di/router.php +++ b/blog/config/common/di/router.php @@ -5,22 +5,40 @@ use Yiisoft\Config\Config; use Yiisoft\Csrf\CsrfMiddleware; use Yiisoft\DataResponse\Middleware\FormatDataResponse; +use Yiisoft\Router\FastRoute\UrlGenerator; use Yiisoft\Router\Group; use Yiisoft\Router\RouteCollection; use Yiisoft\Router\RouteCollectionInterface; use Yiisoft\Router\RouteCollectorInterface; +use Yiisoft\Router\UrlGeneratorInterface; use Yiisoft\Yii\Debug\Viewer\Middleware\ToolbarMiddleware; -/** @var Config $config */ +/** + * @var Config $config + * @var array $params + */ return [ + UrlGeneratorInterface::class => [ + 'class' => UrlGenerator::class, + 'setEncodeRaw()' => [$params['yiisoft/router-fastroute']['encodeRaw']], + 'setDefaultArgument()' => ['_language', 'en'], + 'reset' => function () { + $this->defaultArguments = ['_language', 'en']; + }, + ], + RouteCollectionInterface::class => static function (RouteCollectorInterface $collector) use ($config) { $collector ->middleware(CsrfMiddleware::class) ->middleware(FormatDataResponse::class) ->addGroup( - Group::create('/{_language}') + Group::create() ->routes(...$config->get('routes')) + ) + ->addGroup( + Group::create('/{_language}') + ->routes(...$config->get('app-routes')) ); if (!str_starts_with(getenv('YII_ENV') ?: '', 'prod')) { diff --git a/blog/config/web/events.php b/blog/config/web/events.php index fffb00e90..c8373efd0 100644 --- a/blog/config/web/events.php +++ b/blog/config/web/events.php @@ -3,10 +3,15 @@ declare(strict_types=1); use App\Timer; +use Yiisoft\Translator\TranslatorInterface; use Yiisoft\Yii\Http\Event\ApplicationStartup; +use Yiisoft\Yii\Middleware\Event\SetLocaleEvent; return [ ApplicationStartup::class => [ - static fn (Timer $timer) => $timer->start('overall'), + static fn(Timer $timer) => $timer->start('overall'), + ], + SetLocaleEvent::class => [ + static fn(TranslatorInterface $translator, SetLocaleEvent $event) => $translator->setLocale($event->getLocale()), ], ]; diff --git a/blog/configuration.php b/blog/configuration.php index 20520fe03..918ce8a47 100644 --- a/blog/configuration.php +++ b/blog/configuration.php @@ -44,7 +44,7 @@ '$events', 'console/events.php', ], - 'routes' => [ + 'app-routes' => [ 'common/routes/*.php', ], 'bootstrap' => [ diff --git a/blog/package.json b/blog/package.json new file mode 100644 index 000000000..ec1ad179b --- /dev/null +++ b/blog/package.json @@ -0,0 +1,10 @@ +{ + "name": "yii3-demo-blog", + "version": "1.0.0", + "description": "Yii3 Demo Blog", + "dependencies": { + "bootstrap": "^5.3.1" + }, + "devDependencies": {}, + "license": "BSD-3-Clause" +} diff --git a/blog/src/User/Controller/UserController.php b/blog/src/User/Controller/UserController.php index 3174bb79c..60d9a2927 100644 --- a/blog/src/User/Controller/UserController.php +++ b/blog/src/User/Controller/UserController.php @@ -25,7 +25,7 @@ public function __construct(private ViewRenderer $viewRenderer) public function index( UserRepository $userRepository, - #[Body] array $body, + #[Body] ?array $body, #[Query] array $sortOrder, #[Route('page')] int $page = 1, #[Route('pagesize')] int $pageSize = null, From 561265ef3b57885f1b8975528bb1479b8c945d8d Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 6 Oct 2023 14:46:48 +0300 Subject: [PATCH 27/58] Blog API: Fix locale, routes and psalm errors (#598) --- blog-api/.editorconfig | 4 ++++ blog-api/Makefile | 19 +++++++++++++++++++ blog-api/config/common/di/router.php | 22 ++++++++++++++++++++-- blog-api/config/web/events.php | 12 ++++++++++++ blog-api/configuration.php | 7 +++++-- blog-api/src/Blog/BlogService.php | 4 ++++ blog-api/src/Blog/PostRepository.php | 4 ++++ blog-api/src/User/UserRepository.php | 4 ++++ blog/Makefile | 1 - 9 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 blog-api/Makefile create mode 100644 blog-api/config/web/events.php diff --git a/blog-api/.editorconfig b/blog-api/.editorconfig index 5e9a93ea5..8802775ba 100644 --- a/blog-api/.editorconfig +++ b/blog-api/.editorconfig @@ -10,6 +10,10 @@ indent_style = space indent_size = 4 trim_trailing_whitespace = true +[*.php] +ij_php_space_before_short_closure_left_parenthesis = false +ij_php_space_after_type_cast = true + [*.md] trim_trailing_whitespace = false diff --git a/blog-api/Makefile b/blog-api/Makefile new file mode 100644 index 000000000..ea6f8e855 --- /dev/null +++ b/blog-api/Makefile @@ -0,0 +1,19 @@ +init: composer-update up + +up: + docker-compose up -d +down: + docker-compose down + +composer: + docker-compose run php composer $(filter-out $@, $(MAKECMDGOALS)) +composer-update: + docker-compose run php composer update + +yii3: + docker-compose run php ./yii $(filter-out $@, $(MAKECMDGOALS)) + +test: + docker-compose run php ./vendor/bin/codecept run +psalm: + docker-compose run php ./vendor/bin/psalm diff --git a/blog-api/config/common/di/router.php b/blog-api/config/common/di/router.php index 23eef3818..864373441 100644 --- a/blog-api/config/common/di/router.php +++ b/blog-api/config/common/di/router.php @@ -6,22 +6,40 @@ use Yiisoft\Config\Config; use Yiisoft\DataResponse\Middleware\FormatDataResponse; use Yiisoft\Request\Body\RequestBodyParser; +use Yiisoft\Router\FastRoute\UrlGenerator; use Yiisoft\Router\Group; use Yiisoft\Router\RouteCollection; use Yiisoft\Router\RouteCollectionInterface; use Yiisoft\Router\RouteCollectorInterface; +use Yiisoft\Router\UrlGeneratorInterface; -/** @var Config $config */ +/** + * @var Config $config + * @var array $params + */ return [ + UrlGeneratorInterface::class => [ + 'class' => UrlGenerator::class, + 'setEncodeRaw()' => [$params['yiisoft/router-fastroute']['encodeRaw']], + 'setDefaultArgument()' => ['_language', 'en'], + 'reset' => function () { + $this->defaultArguments = ['_language', 'en']; + }, + ], + RouteCollectionInterface::class => static function (RouteCollectorInterface $collector) use ($config) { $collector ->middleware(FormatDataResponse::class) ->middleware(ExceptionMiddleware::class) ->middleware(RequestBodyParser::class) ->addGroup( - Group::create('/{_language}') + Group::create() ->routes(...$config->get('routes')) + ) + ->addGroup( + Group::create('/{_language}') + ->routes(...$config->get('app-routes')) ); return new RouteCollection($collector); diff --git a/blog-api/config/web/events.php b/blog-api/config/web/events.php new file mode 100644 index 000000000..b62cc3ca5 --- /dev/null +++ b/blog-api/config/web/events.php @@ -0,0 +1,12 @@ + [ + static fn(TranslatorInterface $translator, SetLocaleEvent $event) => $translator->setLocale($event->getLocale()), + ], +]; diff --git a/blog-api/configuration.php b/blog-api/configuration.php index 5360ad4fe..0066a1322 100644 --- a/blog-api/configuration.php +++ b/blog-api/configuration.php @@ -36,9 +36,12 @@ '$di-delegates', ], 'events' => [], - 'events-web' => '$events', + 'events-web' => [ + '$events', + 'web/events.php', + ], 'events-console' => '$events', - 'routes' => 'common/routes.php', + 'app-routes' => 'common/routes.php', 'bootstrap' => 'common/bootstrap.php', 'bootstrap-web' => '$bootstrap', 'bootstrap-console' => '$bootstrap', diff --git a/blog-api/src/Blog/BlogService.php b/blog-api/src/Blog/BlogService.php index 421187834..b511dad5c 100644 --- a/blog-api/src/Blog/BlogService.php +++ b/blog-api/src/Blog/BlogService.php @@ -18,10 +18,14 @@ public function __construct(PostRepository $postRepository) $this->postRepository = $postRepository; } + /** + * @psalm-return PaginatorInterface + */ public function getPosts(int $page): PaginatorInterface { $dataReader = $this->postRepository->findAll(); + /** @psalm-var PaginatorInterface */ return (new OffsetPaginator($dataReader)) ->withPageSize(self::POSTS_PER_PAGE) ->withCurrentPage($page); diff --git a/blog-api/src/Blog/PostRepository.php b/blog-api/src/Blog/PostRepository.php index 8c2e5bb13..fec64bbf7 100644 --- a/blog-api/src/Blog/PostRepository.php +++ b/blog-api/src/Blog/PostRepository.php @@ -19,8 +19,12 @@ public function __construct(Select $select, ORMInterface $orm) parent::__construct($select); } + /** + * @psalm-return EntityReader + */ public function findAll(array $scope = [], array $orderBy = []): EntityReader { + /** @psalm-var EntityReader */ return new EntityReader( $this ->select() diff --git a/blog-api/src/User/UserRepository.php b/blog-api/src/User/UserRepository.php index 7dfb76b93..590b8665c 100644 --- a/blog-api/src/User/UserRepository.php +++ b/blog-api/src/User/UserRepository.php @@ -23,8 +23,12 @@ public function __construct(Select $select, ORMInterface $orm) parent::__construct($select); } + /** + * @psalm-return EntityReader + */ public function findAllOrderByLogin(): EntityReader { + /** @psalm-var EntityReader */ return (new EntityReader($this->select())) ->withSort( Sort::only(['login'])->withOrderString('login') diff --git a/blog/Makefile b/blog/Makefile index 5cc895d70..33a99f1ff 100644 --- a/blog/Makefile +++ b/blog/Makefile @@ -9,7 +9,6 @@ composer: docker-compose run php composer $(filter-out $@, $(MAKECMDGOALS)) composer-update: docker-compose run php composer update - npm i bootstrap@5.3.1 npm: docker-compose run php npm $(filter-out $@, $(MAKECMDGOALS)) From 9e34dc7a54861f84ae9aee6b162c3067d6fd3d17 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 8 Oct 2023 15:18:14 +0300 Subject: [PATCH 28/58] Replace request model to Yii Input HTTP (#599) --- blog-api/composer.json | 4 +- blog-api/config/common/di/hydrator.php | 13 +++++++ blog-api/config/common/di/router.php | 6 +-- .../config/web/di/middleware-dispatcher.php | 15 ++++++- blog-api/config/web/params.php | 8 +++- blog-api/src/Auth/AuthRequest.php | 19 ++++++--- blog-api/src/Blog/BlogController.php | 8 ++-- blog-api/src/Blog/EditPostRequest.php | 39 +++++++++++++------ .../src/Middleware/ExceptionMiddleware.php | 6 +-- blog-api/src/User/UserController.php | 4 +- blog-api/src/User/UserRequest.php | 13 ++++--- blog/Makefile | 5 +++ blog/composer.json | 5 ++- blog/config/common/di/hydrator.php | 13 +++++++ blog/config/common/di/router.php | 6 +-- blog/config/common/routes/routes.php | 2 +- blog/config/web/di/middleware-dispatcher.php | 18 +++++++-- blog/src/Auth/Controller/AuthController.php | 10 ++--- blog/src/Auth/Controller/SignupController.php | 4 +- blog/src/Auth/Form/LoginForm.php | 10 ++--- blog/src/Auth/Form/SignupForm.php | 5 +-- blog/src/Blog/Archive/ArchiveController.php | 10 ++--- blog/src/Blog/BlogController.php | 4 +- blog/src/Blog/CommentController.php | 4 +- blog/src/Blog/Post/PostController.php | 9 ++--- blog/src/Contact/ContactController.php | 11 +++--- blog/src/Contact/ContactForm.php | 5 ++- blog/src/Contact/ContactMailer.php | 7 +--- blog/src/User/Controller/UserController.php | 16 ++++---- 29 files changed, 177 insertions(+), 102 deletions(-) create mode 100644 blog-api/config/common/di/hydrator.php create mode 100644 blog/config/common/di/hydrator.php diff --git a/blog-api/composer.json b/blog-api/composer.json index 3eacedb2c..2338ba771 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -49,11 +49,13 @@ "yiisoft/factory": "^1.0", "yiisoft/files": "^2.0", "yiisoft/http": "^1.2", + "yiisoft/hydrator-validator": "dev-master", "yiisoft/injector": "^1.0", + "yiisoft/input-http": "dev-master", "yiisoft/log": "^2.0", "yiisoft/log-target-file": "^3.0", + "yiisoft/middleware-dispatcher": "^5.1", "yiisoft/request-body-parser": "^1.1", - "yiisoft/request-model": "dev-master", "yiisoft/router": "^3.0", "yiisoft/router-fastroute": "^3.0", "yiisoft/security": "^1.0", diff --git a/blog-api/config/common/di/hydrator.php b/blog-api/config/common/di/hydrator.php new file mode 100644 index 000000000..1561583dc --- /dev/null +++ b/blog-api/config/common/di/hydrator.php @@ -0,0 +1,13 @@ + ContainerAttributeResolverFactory::class, + ObjectFactoryInterface::class => ContainerObjectFactory::class, +]; diff --git a/blog-api/config/common/di/router.php b/blog-api/config/common/di/router.php index 864373441..0df551e05 100644 --- a/blog-api/config/common/di/router.php +++ b/blog-api/config/common/di/router.php @@ -34,12 +34,10 @@ ->middleware(ExceptionMiddleware::class) ->middleware(RequestBodyParser::class) ->addGroup( - Group::create() - ->routes(...$config->get('routes')) + Group::create('/{_language}')->routes(...$config->get('app-routes')), ) ->addGroup( - Group::create('/{_language}') - ->routes(...$config->get('app-routes')) + Group::create()->routes(...$config->get('routes')), ); return new RouteCollection($collector); diff --git a/blog-api/config/web/di/middleware-dispatcher.php b/blog-api/config/web/di/middleware-dispatcher.php index f2b303927..c9e2a1599 100644 --- a/blog-api/config/web/di/middleware-dispatcher.php +++ b/blog-api/config/web/di/middleware-dispatcher.php @@ -6,9 +6,20 @@ * @var array $params */ +use Yiisoft\Definitions\Reference; +use Yiisoft\Input\Http\HydratorAttributeParametersResolver; +use Yiisoft\Input\Http\Request\Catcher\RequestCatcherParametersResolver; +use Yiisoft\Input\Http\RequestInputParametersResolver; +use Yiisoft\Middleware\Dispatcher\CompositeParametersResolver; use Yiisoft\Middleware\Dispatcher\ParametersResolverInterface; -use Yiisoft\RequestModel\HandlerParametersResolver; return [ - ParametersResolverInterface::class => HandlerParametersResolver::class, + ParametersResolverInterface::class => [ + 'class' => CompositeParametersResolver::class, + '__construct()' => [ + Reference::to(RequestCatcherParametersResolver::class), + Reference::to(HydratorAttributeParametersResolver::class), + Reference::to(RequestInputParametersResolver::class), + ], + ], ]; diff --git a/blog-api/config/web/params.php b/blog-api/config/web/params.php index 0dae23dee..2b3b65847 100644 --- a/blog-api/config/web/params.php +++ b/blog-api/config/web/params.php @@ -2,4 +2,10 @@ declare(strict_types=1); -return []; +return [ + 'yiisoft/input-http' => [ + 'requestInputParametersResolver' => [ + 'throwInputValidationException' => true, + ], + ], +]; diff --git a/blog-api/src/Auth/AuthRequest.php b/blog-api/src/Auth/AuthRequest.php index 004967063..49e764266 100644 --- a/blog-api/src/Auth/AuthRequest.php +++ b/blog-api/src/Auth/AuthRequest.php @@ -5,7 +5,8 @@ namespace App\Auth; use OpenApi\Annotations as OA; -use Yiisoft\RequestModel\RequestModel; +use Yiisoft\Input\Http\Attribute\Parameter\Body; +use Yiisoft\Input\Http\RequestInputInterface; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\RulesProviderInterface; @@ -17,25 +18,31 @@ * @OA\Property(example="Opal1144", property="password", format="string"), * ) */ -final class AuthRequest extends RequestModel implements RulesProviderInterface +final class AuthRequest implements RequestInputInterface, RulesProviderInterface { + #[Body('login')] + private string $login = ''; + + #[Body('password')] + private string $password = ''; + public function getLogin(): string { - return (string) $this->getAttributeValue('body.login'); + return $this->login; } public function getPassword(): string { - return (string) $this->getAttributeValue('body.password'); + return $this->password; } public function getRules(): array { return [ - 'body.login' => [ + 'login' => [ new Required(), ], - 'body.password' => [ + 'password' => [ new Required(), ], ]; diff --git a/blog-api/src/Blog/BlogController.php b/blog-api/src/Blog/BlogController.php index 92c46baf0..7ca829180 100644 --- a/blog-api/src/Blog/BlogController.php +++ b/blog-api/src/Blog/BlogController.php @@ -9,8 +9,8 @@ use OpenApi\Annotations as OA; use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\DataResponse\DataResponseFactoryInterface; -use Yiisoft\RequestModel\Attribute\Query; -use Yiisoft\RequestModel\Attribute\Route; +use Yiisoft\Input\Http\Attribute\Parameter\Query; +use Yiisoft\Hydrator\Temp\RouteArgument; /** * @OA\Tag( @@ -165,7 +165,7 @@ public function index(PaginatorFormatter $paginatorFormatter, #[Query('page')] i * ), * ) */ - public function view(#[Route('id')] int $id): Response + public function view(#[RouteArgument('id')] int $id): Response { return $this->responseFactory->createResponse( [ @@ -250,7 +250,7 @@ public function create(EditPostRequest $postRequest, UserRequest $userRequest): * ) * ) */ - public function update(EditPostRequest $postRequest, #[Route('id')] int $id): Response + public function update(EditPostRequest $postRequest, #[RouteArgument('id')] int $id): Response { $post = $this->postBuilder->build( $this->blogService->getPost($id), diff --git a/blog-api/src/Blog/EditPostRequest.php b/blog-api/src/Blog/EditPostRequest.php index 375e02ded..61d1f9770 100644 --- a/blog-api/src/Blog/EditPostRequest.php +++ b/blog-api/src/Blog/EditPostRequest.php @@ -5,7 +5,10 @@ namespace App\Blog; use OpenApi\Annotations as OA; -use Yiisoft\RequestModel\RequestModel; +use Yiisoft\Hydrator\Validator\Attribute\Validate; +use Yiisoft\Input\Http\AbstractInput; +use Yiisoft\Input\Http\Attribute\Parameter\Body; +use Yiisoft\Hydrator\Temp\RouteArgument; use Yiisoft\Validator\Result; use Yiisoft\Validator\Rule\Length; use Yiisoft\Validator\Rule\Required; @@ -20,41 +23,53 @@ * @OA\Property(example=1, property="status", format="int"), * ) */ -final class EditPostRequest extends RequestModel implements RulesProviderInterface +final class EditPostRequest extends AbstractInput implements RulesProviderInterface { + #[RouteArgument('id')] + private int $id; + + #[Body('title')] + #[Validate(new Required())] + private string $title = ''; + + #[Body('text')] + #[Validate(new Required())] + private string $text = ''; + + #[Body('status')] + #[Validate(new Required())] + private int $status; + public function getId(): int { - return (int) $this->getAttributeValue('router.id'); + return $this->id; } public function getTitle(): string { - return (string) $this->getAttributeValue('body.title'); + return $this->title; } public function getText(): string { - return (string) $this->getAttributeValue('body.text'); + return $this->text; } public function getStatus(): PostStatus { - return PostStatus::from($this->getAttributeValue('body.status')); + return PostStatus::from($this->status); } public function getRules(): array { return [ - 'body.title' => [ - new Required(), + 'title' => [ new Length(min: 5, max: 255), ], - 'body.text' => [ - new Required(), + 'text' => [ new Length(min: 5, max: 1000), ], - 'body.status' => [ - new Required(), + 'status' => [ static function ($value): Result { $result = new Result(); if (!PostStatus::isValid($value)) { diff --git a/blog-api/src/Middleware/ExceptionMiddleware.php b/blog-api/src/Middleware/ExceptionMiddleware.php index 5e3a50214..c64128112 100644 --- a/blog-api/src/Middleware/ExceptionMiddleware.php +++ b/blog-api/src/Middleware/ExceptionMiddleware.php @@ -11,7 +11,7 @@ use Psr\Http\Server\RequestHandlerInterface; use Yiisoft\DataResponse\DataResponseFactoryInterface; use Yiisoft\Http\Status; -use Yiisoft\RequestModel\RequestValidationException; +use Yiisoft\Input\Http\InputValidationException; final class ExceptionMiddleware implements MiddlewareInterface { @@ -28,8 +28,8 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $handler->handle($request); } catch (ApplicationException $e) { return $this->dataResponseFactory->createResponse($e->getMessage(), $e->getCode()); - } catch (RequestValidationException $e) { - return $this->dataResponseFactory->createResponse($e->getFirstError(), Status::BAD_REQUEST); + } catch (InputValidationException $e) { + return $this->dataResponseFactory->createResponse($e->getResult()->getErrorMessages()[0], Status::BAD_REQUEST); } } } diff --git a/blog-api/src/User/UserController.php b/blog-api/src/User/UserController.php index 4baea2f64..c02bbf4e3 100644 --- a/blog-api/src/User/UserController.php +++ b/blog-api/src/User/UserController.php @@ -9,7 +9,7 @@ use OpenApi\Annotations as OA; use Psr\Http\Message\ResponseInterface; use Yiisoft\DataResponse\DataResponseFactoryInterface; -use Yiisoft\RequestModel\Attribute\Route; +use Yiisoft\Hydrator\Temp\RouteArgument; /** * @OA\Tag( @@ -125,7 +125,7 @@ public function list(): ResponseInterface * ), * ) */ - public function get(#[Route('id')] int $id): ResponseInterface + public function get(#[RouteArgument('id')] int $id): ResponseInterface { /** * @var User $user diff --git a/blog-api/src/User/UserRequest.php b/blog-api/src/User/UserRequest.php index 08c715aa5..3f3825461 100644 --- a/blog-api/src/User/UserRequest.php +++ b/blog-api/src/User/UserRequest.php @@ -5,15 +5,16 @@ namespace App\User; use Yiisoft\Auth\Middleware\Authentication; -use Yiisoft\RequestModel\RequestModel; +use Yiisoft\Input\Http\Attribute\Parameter\Request; +use Yiisoft\Input\Http\RequestInputInterface; -final class UserRequest extends RequestModel +final class UserRequest implements RequestInputInterface { + #[Request(Authentication::class)] + private User $user; + public function getUser(): User { - /** - * @var User $identity - */ - return $this->getAttributeValue('attributes.' . Authentication::class); + return $this->user; } } diff --git a/blog/Makefile b/blog/Makefile index 33a99f1ff..148afab89 100644 --- a/blog/Makefile +++ b/blog/Makefile @@ -17,3 +17,8 @@ npm-update: yii3: docker-compose run php ./yii $(filter-out $@, $(MAKECMDGOALS)) + +test: + docker-compose run php ./vendor/bin/codecept run +psalm: + docker-compose run php ./vendor/bin/psalm diff --git a/blog/composer.json b/blog/composer.json index 7fd7fec3e..7912305a8 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -50,19 +50,20 @@ "yiisoft/di": "^1.2", "yiisoft/error-handler": "^3.0", "yiisoft/factory": "^1.0", - "yiisoft/form": "^1.0@dev", + "yiisoft/form": "dev-input", "yiisoft/html": "^3.0", "yiisoft/http": "^1.2", "yiisoft/injector": "^1.0", + "yiisoft/input-http": "dev-master", "yiisoft/log": "^2.0", "yiisoft/log-target-file": "^3.0", "yiisoft/mailer": "^5.0", "yiisoft/mailer-symfony": "^3.0", + "yiisoft/middleware-dispatcher": "^5.2", "yiisoft/rate-limiter": "dev-master", "yiisoft/rbac": "^1.0", "yiisoft/rbac-php": "^1.0", "yiisoft/rbac-rules-container": "^2.0", - "yiisoft/request-model": "dev-master", "yiisoft/router": "^3.0", "yiisoft/router-fastroute": "^3.0", "yiisoft/security": "^1.0", diff --git a/blog/config/common/di/hydrator.php b/blog/config/common/di/hydrator.php new file mode 100644 index 000000000..1561583dc --- /dev/null +++ b/blog/config/common/di/hydrator.php @@ -0,0 +1,13 @@ + ContainerAttributeResolverFactory::class, + ObjectFactoryInterface::class => ContainerObjectFactory::class, +]; diff --git a/blog/config/common/di/router.php b/blog/config/common/di/router.php index 3cbc11477..0f7be58c0 100644 --- a/blog/config/common/di/router.php +++ b/blog/config/common/di/router.php @@ -33,12 +33,10 @@ ->middleware(CsrfMiddleware::class) ->middleware(FormatDataResponse::class) ->addGroup( - Group::create() - ->routes(...$config->get('routes')) + Group::create('/{_language}')->routes(...$config->get('app-routes')), ) ->addGroup( - Group::create('/{_language}') - ->routes(...$config->get('app-routes')) + Group::create()->routes(...$config->get('routes')), ); if (!str_starts_with(getenv('YII_ENV') ?: '', 'prod')) { diff --git a/blog/config/common/routes/routes.php b/blog/config/common/routes/routes.php index 0d5156aec..342b7861c 100644 --- a/blog/config/common/routes/routes.php +++ b/blog/config/common/routes/routes.php @@ -58,7 +58,7 @@ ->middleware(fn ( ResponseFactoryInterface $responseFactory, StorageInterface $storage - ) => new LimitRequestsMiddleware(new Counter($storage, 5, 5), $responseFactory)) + ) => new LimitRequestsMiddleware(new Counter($storage, 10, 10), $responseFactory)) ->action([SignupController::class, 'signup']) ->name('auth/signup'), diff --git a/blog/config/web/di/middleware-dispatcher.php b/blog/config/web/di/middleware-dispatcher.php index fd505727d..7c06f71f2 100644 --- a/blog/config/web/di/middleware-dispatcher.php +++ b/blog/config/web/di/middleware-dispatcher.php @@ -2,14 +2,24 @@ declare(strict_types=1); +use Yiisoft\Definitions\Reference; +use Yiisoft\Input\Http\HydratorAttributeParametersResolver; +use Yiisoft\Input\Http\Request\Catcher\RequestCatcherParametersResolver; +use Yiisoft\Input\Http\RequestInputParametersResolver; +use Yiisoft\Middleware\Dispatcher\CompositeParametersResolver; +use Yiisoft\Middleware\Dispatcher\ParametersResolverInterface; /** * @var array $params */ -use Yiisoft\Middleware\Dispatcher\ParametersResolverInterface; -use Yiisoft\RequestModel\HandlerParametersResolver; - return [ - ParametersResolverInterface::class => HandlerParametersResolver::class, + ParametersResolverInterface::class => [ + 'class' => CompositeParametersResolver::class, + '__construct()' => [ + Reference::to(RequestCatcherParametersResolver::class), + Reference::to(HydratorAttributeParametersResolver::class), + Reference::to(RequestInputParametersResolver::class), + ], + ], ]; diff --git a/blog/src/Auth/Controller/AuthController.php b/blog/src/Auth/Controller/AuthController.php index da26e7823..3dfb3ca57 100644 --- a/blog/src/Auth/Controller/AuthController.php +++ b/blog/src/Auth/Controller/AuthController.php @@ -9,11 +9,11 @@ use App\Service\WebControllerService; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use Yiisoft\Form\FormHydrator; use Yiisoft\Http\Method; use Yiisoft\Translator\TranslatorInterface; use Yiisoft\User\Login\Cookie\CookieLogin; use Yiisoft\User\Login\Cookie\CookieLoginIdentityInterface; -use Yiisoft\Validator\ValidatorInterface; use Yiisoft\Yii\View\ViewRenderer; final class AuthController @@ -29,7 +29,7 @@ public function __construct( public function login( ServerRequestInterface $request, TranslatorInterface $translator, - ValidatorInterface $validator, + FormHydrator $formHydrator, CookieLogin $cookieLogin ): ResponseInterface { if (!$this->authService->isGuest()) { @@ -41,10 +41,8 @@ public function login( if ( $request->getMethod() === Method::POST - && $loginForm->load(is_array($body) ? $body : []) - && $validator - ->validate($loginForm) - ->isValid() + && $formHydrator->populate($loginForm, $body) + && $loginForm->isValid() ) { $identity = $this->authService->getIdentity(); diff --git a/blog/src/Auth/Controller/SignupController.php b/blog/src/Auth/Controller/SignupController.php index 97cf232bb..2e0f5a8af 100644 --- a/blog/src/Auth/Controller/SignupController.php +++ b/blog/src/Auth/Controller/SignupController.php @@ -9,6 +9,7 @@ use App\Service\WebControllerService; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use Yiisoft\Form\FormHydrator; use Yiisoft\Http\Method; use Yiisoft\Yii\View\ViewRenderer; @@ -22,6 +23,7 @@ public function __construct(private WebControllerService $webService, private Vi public function signup( AuthService $authService, ServerRequestInterface $request, + FormHydrator $formHydrator, SignupForm $signupForm ): ResponseInterface { if (!$authService->isGuest()) { @@ -29,7 +31,7 @@ public function signup( } if ($request->getMethod() === Method::POST - && $signupForm->load($request->getParsedBody()) + && $formHydrator->populate($signupForm, $request->getParsedBody()) && $signupForm->signup() ) { return $this->redirectToMain(); diff --git a/blog/src/Auth/Form/LoginForm.php b/blog/src/Auth/Form/LoginForm.php index 985c9d529..71f9a31c3 100644 --- a/blog/src/Auth/Form/LoginForm.php +++ b/blog/src/Auth/Form/LoginForm.php @@ -18,9 +18,10 @@ final class LoginForm extends FormModel implements RulesProviderInterface private string $password = ''; private bool $rememberMe = false; - public function __construct(private AuthService $authService, private TranslatorInterface $translator) - { - parent::__construct(); + public function __construct( + private AuthService $authService, + private TranslatorInterface $translator, + ) { } public function getAttributeLabels(): array @@ -54,9 +55,6 @@ private function passwordRules(): array $result = new Result(); if (!$this->authService->login($this->login, $this->password)) { - $this - ->getFormErrors() - ->addError('login', ''); $result->addError($this->translator->translate('validator.invalid.login.password')); } diff --git a/blog/src/Auth/Form/SignupForm.php b/blog/src/Auth/Form/SignupForm.php index 30984ef2a..9c7dad67f 100644 --- a/blog/src/Auth/Form/SignupForm.php +++ b/blog/src/Auth/Form/SignupForm.php @@ -13,7 +13,6 @@ use Yiisoft\Validator\Rule\Length; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\RulesProviderInterface; -use Yiisoft\Validator\ValidatorInterface; final class SignupForm extends FormModel implements RulesProviderInterface { @@ -22,11 +21,9 @@ final class SignupForm extends FormModel implements RulesProviderInterface private string $passwordVerify = ''; public function __construct( - private ValidatorInterface $validator, private TranslatorInterface $translator, private UserRepository $userRepository, ) { - parent::__construct(); } public function getAttributeLabels(): array @@ -55,7 +52,7 @@ public function getPassword(): string public function signup(): false|User { - if ($this->validator->validate($this)->isValid()) { + if ($this->isValid()) { $user = new User($this->getLogin(), $this->getPassword()); $this->userRepository->save($user); diff --git a/blog/src/Blog/Archive/ArchiveController.php b/blog/src/Blog/Archive/ArchiveController.php index 004c20606..080c9ecb5 100644 --- a/blog/src/Blog/Archive/ArchiveController.php +++ b/blog/src/Blog/Archive/ArchiveController.php @@ -7,7 +7,7 @@ use App\Blog\Tag\TagRepository; use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; -use Yiisoft\RequestModel\Attribute\Route; +use Yiisoft\Hydrator\Temp\RouteArgument; use Yiisoft\Yii\View\ViewRenderer; final class ArchiveController @@ -29,9 +29,9 @@ public function index(ArchiveRepository $archiveRepo): Response public function monthlyArchive( TagRepository $tagRepository, ArchiveRepository $archiveRepo, - #[Route('page')] int $pageNum = 1, - #[Route('year')] int $year = 0, - #[Route('month')] int $month = 0, + #[RouteArgument('page')] int $pageNum = 1, + #[RouteArgument('year')] int $year = 0, + #[RouteArgument('month')] int $month = 0, ): Response { $dataReader = $archiveRepo->getMonthlyArchive($year, $month); $paginator = (new OffsetPaginator($dataReader)) @@ -51,7 +51,7 @@ public function monthlyArchive( return $this->viewRenderer->render('monthly-archive', $data); } - public function yearlyArchive(ArchiveRepository $archiveRepo, #[Route('year')] int $year = 0): Response + public function yearlyArchive(ArchiveRepository $archiveRepo, #[RouteArgument('year')] int $year = 0): Response { $data = [ 'year' => $year, diff --git a/blog/src/Blog/BlogController.php b/blog/src/Blog/BlogController.php index 011795095..18552ddb8 100644 --- a/blog/src/Blog/BlogController.php +++ b/blog/src/Blog/BlogController.php @@ -9,7 +9,7 @@ use App\Blog\Tag\TagRepository; use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; -use Yiisoft\RequestModel\Attribute\Route; +use Yiisoft\Hydrator\Temp\RouteArgument; use Yiisoft\User\CurrentUser; use Yiisoft\Yii\View\ViewRenderer; @@ -31,7 +31,7 @@ public function index( TagRepository $tagRepository, ArchiveRepository $archiveRepo, CurrentUser $currentUser, - #[Route('page')] $pageNum = 1, + #[RouteArgument('page')] $pageNum = 1, ): Response { $dataReader = $postRepository->findAllPreloaded(); $paginator = (new OffsetPaginator($dataReader)) diff --git a/blog/src/Blog/CommentController.php b/blog/src/Blog/CommentController.php index 303cc420c..5b218791e 100644 --- a/blog/src/Blog/CommentController.php +++ b/blog/src/Blog/CommentController.php @@ -7,7 +7,7 @@ use App\Blog\Comment\CommentService; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; -use Yiisoft\RequestModel\Attribute\Route; +use Yiisoft\Hydrator\Temp\RouteArgument; use Yiisoft\Yii\View\ViewRenderer; final class CommentController @@ -19,7 +19,7 @@ public function __construct(ViewRenderer $viewRenderer) $this->viewRenderer = $viewRenderer->withControllerName('blog/comments'); } - public function index(Request $request, CommentService $service, #[Route('next')] ?string $next): Response + public function index(Request $request, CommentService $service, #[RouteArgument('next')] ?string $next): Response { $paginator = $service->getFeedPaginator(); if ($next !== null) { diff --git a/blog/src/Blog/Post/PostController.php b/blog/src/Blog/Post/PostController.php index e5e43130d..a4f3e15fc 100644 --- a/blog/src/Blog/Post/PostController.php +++ b/blog/src/Blog/Post/PostController.php @@ -9,6 +9,7 @@ use App\User\UserService; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Yiisoft\Form\FormHydrator; use Yiisoft\Http\Method; use Yiisoft\Router\CurrentRoute; use Yiisoft\Validator\ValidatorInterface; @@ -37,7 +38,7 @@ public function index(CurrentRoute $currentRoute, PostRepository $postRepository return $this->viewRenderer->render('index', ['item' => $item, 'canEdit' => $canEdit, 'slug' => $slug]); } - public function add(Request $request, ValidatorInterface $validator): Response + public function add(Request $request, FormHydrator $formHydrator): Response { $parameters = [ 'title' => 'Add post', @@ -48,15 +49,13 @@ public function add(Request $request, ValidatorInterface $validator): Response if ($request->getMethod() === Method::POST) { $form = new PostForm(); - if ($form->load($parameters['body']) && $validator - ->validate($form) - ->isValid()) { + if ($formHydrator->populate($form, $parameters['body']) && $form->isValid()) { $this->postService->savePost($this->userService->getUser(), new Post(), $form); return $this->webService->getRedirectResponse('blog/index'); } - $parameters['errors'] = $form->getFormErrors(); + $parameters['errors'] = $form->getValidationResult()->getErrorMessagesIndexedByAttribute(); } return $this->viewRenderer->render('__form', $parameters); diff --git a/blog/src/Contact/ContactController.php b/blog/src/Contact/ContactController.php index 180ac097d..60761c7f6 100644 --- a/blog/src/Contact/ContactController.php +++ b/blog/src/Contact/ContactController.php @@ -7,11 +7,11 @@ use Psr\Http\Message\ResponseFactoryInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use Yiisoft\Form\FormHydrator; use Yiisoft\Http\Header; use Yiisoft\Http\Method; use Yiisoft\Http\Status; use Yiisoft\Router\UrlGeneratorInterface; -use Yiisoft\Validator\ValidatorInterface; use Yiisoft\Yii\View\ViewRenderer; final class ContactController @@ -28,14 +28,15 @@ public function __construct( } public function contact( - ValidatorInterface $validator, + FormHydrator $formHydrator, ServerRequestInterface $request ): ResponseInterface { $body = $request->getParsedBody(); $form = new ContactForm(); - if (($request->getMethod() === Method::POST) && $form->load((array) $body) && $validator - ->validate($form) - ->isValid()) { + if (($request->getMethod() === Method::POST) + && $formHydrator->populate($form, $body) + && $form->isValid() + ) { $this->mailer->send($form, $request); return $this->responseFactory diff --git a/blog/src/Contact/ContactForm.php b/blog/src/Contact/ContactForm.php index ec76a96d0..9703c8e07 100644 --- a/blog/src/Contact/ContactForm.php +++ b/blog/src/Contact/ContactForm.php @@ -5,6 +5,7 @@ namespace App\Contact; use Yiisoft\Form\FormModel; +use Yiisoft\Input\Http\Attribute\Parameter\UploadedFiles; use Yiisoft\Validator\Rule\Email; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\RulesProviderInterface; @@ -15,7 +16,9 @@ final class ContactForm extends FormModel implements RulesProviderInterface private string $email = ''; private string $subject = ''; private string $body = ''; - private ?array $attachFiles = null; + + #[UploadedFiles('ContactForm.attachFiles')] + private array $attachFiles = []; public function getAttributeLabels(): array { diff --git a/blog/src/Contact/ContactMailer.php b/blog/src/Contact/ContactMailer.php index 6212bf70d..1ae3b5d9f 100644 --- a/blog/src/Contact/ContactMailer.php +++ b/blog/src/Contact/ContactMailer.php @@ -5,9 +5,7 @@ namespace App\Contact; use Exception; -use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; -use Yiisoft\Form\FormModelInterface; use Yiisoft\Mailer\File; use Yiisoft\Mailer\MailerInterface; use Yiisoft\Mailer\MessageBodyTemplate; @@ -28,7 +26,7 @@ public function __construct( $this->mailer = $this->mailer->withTemplate(new MessageBodyTemplate(__DIR__ . '/mail/')); } - public function send(FormModelInterface $form, ServerRequestInterface $request): void + public function send(ContactForm $form): void { $message = $this->mailer ->compose( @@ -42,8 +40,7 @@ public function send(FormModelInterface $form, ServerRequestInterface $request): ->withSender($this->sender) ->withTo($this->to); - $attachFiles = $request->getUploadedFiles(); - foreach ($attachFiles as $attachFile) { + foreach ($form->getAttributeValue('attachFiles') as $attachFile) { foreach ($attachFile as $file) { if ($file[0]?->getError() === UPLOAD_ERR_OK) { $message = $message->withAttached( diff --git a/blog/src/User/Controller/UserController.php b/blog/src/User/Controller/UserController.php index 60d9a2927..99ec5edc3 100644 --- a/blog/src/User/Controller/UserController.php +++ b/blog/src/User/Controller/UserController.php @@ -9,9 +9,9 @@ use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Data\Reader\Sort; -use Yiisoft\RequestModel\Attribute\Body; -use Yiisoft\RequestModel\Attribute\Query; -use Yiisoft\RequestModel\Attribute\Route; +use Yiisoft\Input\Http\Attribute\Parameter\Body; +use Yiisoft\Input\Http\Attribute\Parameter\Query; +use Yiisoft\Hydrator\Temp\RouteArgument; use Yiisoft\Yii\View\ViewRenderer; final class UserController @@ -26,14 +26,14 @@ public function __construct(private ViewRenderer $viewRenderer) public function index( UserRepository $userRepository, #[Body] ?array $body, - #[Query] array $sortOrder, - #[Route('page')] int $page = 1, - #[Route('pagesize')] int $pageSize = null, + #[Query('sort')] ?string $sortOrder = null, + #[RouteArgument('page')] int $page = 1, + #[RouteArgument('pagesize')] int $pageSize = null, ): Response { $dataReader = $userRepository ->findAll() ->withSort(Sort::only(['id', 'login']) - ->withOrderString($sortOrder['sort'] ?? 'id')); + ->withOrderString($sortOrder ?? 'id')); if ($pageSize === null) { $pageSize = (int) ($body['pageSize'] ?? OffSetPaginator::DEFAULT_PAGE_SIZE); @@ -46,7 +46,7 @@ public function index( } public function profile( - #[Route('login')] string $login, + #[RouteArgument('login')] string $login, ResponseFactoryInterface $responseFactory, UserRepository $userRepository ): Response { From 533489cd686eb0178d935a1c315bd005813ba908 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 8 Oct 2023 15:28:38 +0300 Subject: [PATCH 29/58] Fix `yiisoft/form` version (#601) --- blog/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/composer.json b/blog/composer.json index 7912305a8..57a0c3c9a 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -50,7 +50,7 @@ "yiisoft/di": "^1.2", "yiisoft/error-handler": "^3.0", "yiisoft/factory": "^1.0", - "yiisoft/form": "dev-input", + "yiisoft/form": "dev-master", "yiisoft/html": "^3.0", "yiisoft/http": "^1.2", "yiisoft/injector": "^1.0", From 6b906148703a3fd39ec7f8fa2c0830e14ce749c3 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 17 Nov 2023 11:08:31 +0300 Subject: [PATCH 30/58] Blog: Update dependencies + Fix tests (#603) --- blog/composer.json | 4 ++-- blog/tests/Functional/EventListenerConfigurationTest.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blog/composer.json b/blog/composer.json index 57a0c3c9a..65744d795 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -41,7 +41,7 @@ "yiisoft/auth": "^3.0", "yiisoft/cache": "^3.0", "yiisoft/cache-file": "^3.0", - "yiisoft/config": "^1.0", + "yiisoft/config": "^1.3.1", "yiisoft/cookies": "^1.2", "yiisoft/csrf": "^2.0", "yiisoft/data": "^1.0", @@ -74,7 +74,7 @@ "yiisoft/validator": "^1.0", "yiisoft/var-dumper": "^1.0", "yiisoft/view": "^8.0", - "yiisoft/widget": "^2.0", + "yiisoft/widget": "^2.1", "yiisoft/yii-bootstrap5": "^3.0@dev", "yiisoft/yii-console": "^2.0", "yiisoft/yii-cycle": "dev-master", diff --git a/blog/tests/Functional/EventListenerConfigurationTest.php b/blog/tests/Functional/EventListenerConfigurationTest.php index f752ca32a..721dfd400 100644 --- a/blog/tests/Functional/EventListenerConfigurationTest.php +++ b/blog/tests/Functional/EventListenerConfigurationTest.php @@ -24,7 +24,7 @@ public function testConsoleListenerConfiguration(): void ReverseMerge::groups('events', 'events-web', 'events-console'), RecursiveMerge::groups('params', 'params-web', 'params-console', 'events', 'events-web', 'events-console'), ], - 'params', + 'params-console', ); $container = new Container( From b93c07854f2f6a004266af44796ebaa2e4f8da55 Mon Sep 17 00:00:00 2001 From: took Date: Sun, 26 Nov 2023 09:15:46 +0100 Subject: [PATCH 31/58] Add german translations (#604) --- blog-api/config/common/params.php | 2 +- blog-api/resources/messages/de/app.php | 7 ++++ blog/config/web/params.php | 2 +- blog/resources/messages/de/app.php | 55 ++++++++++++++++++++++++++ blog/resources/views/layout/main.php | 4 ++ 5 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 blog-api/resources/messages/de/app.php create mode 100644 blog/resources/messages/de/app.php diff --git a/blog-api/config/common/params.php b/blog-api/config/common/params.php index cd550e125..e1530e393 100644 --- a/blog-api/config/common/params.php +++ b/blog-api/config/common/params.php @@ -17,7 +17,7 @@ return [ 'locale' => [ - 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU'], + 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU', 'de' => 'de-DE'], 'ignoredRequests' => [ '/debug**', '/inspect**', diff --git a/blog-api/resources/messages/de/app.php b/blog-api/resources/messages/de/app.php new file mode 100644 index 000000000..545f2b601 --- /dev/null +++ b/blog-api/resources/messages/de/app.php @@ -0,0 +1,7 @@ + 'Seite nicht gefunden', +]; diff --git a/blog/config/web/params.php b/blog/config/web/params.php index 90d18da23..1cf1bf194 100644 --- a/blog/config/web/params.php +++ b/blog/config/web/params.php @@ -24,7 +24,7 @@ ], 'locale' => [ - 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU', 'id' => 'id-ID', 'sk' => 'sk-SK'], + 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU', 'id' => 'id-ID', 'sk' => 'sk-SK', 'de' => 'de-DE'], 'ignoredRequests' => [ '/debug**', '/inspect**', diff --git a/blog/resources/messages/de/app.php b/blog/resources/messages/de/app.php new file mode 100644 index 000000000..d79a610d0 --- /dev/null +++ b/blog/resources/messages/de/app.php @@ -0,0 +1,55 @@ + 'API', + 'gridview.create.at' => 'Erzeugt am', + 'gridview.login' => 'Anmelden', + 'gridview.profile' => 'Profil', + 'gridview.title' => 'Liste der Benutzer', + 'home.caption.slide1' => '
    Hello, everyone!

    Ein toller Tag, um Yii 3 auszuprobieren, richtig?

    ', + 'home.caption.slide2' => '
    Der Code wartet!

    Schau dir den Projektcode an. Er ist nicht ideal, da es sich auch um eine Entwicklungs-Sandbox handelt, bietet aber einen mittelmäßigen Überblick über die Funktionen von Yii 3.

    ', + 'home.caption.slide3' => '
    Wir brauchen Rückmeldungen!

    Bitte gib uns deine Rückmeldungen über die im README genannten Telegram- und Slack-Kanäle.

    ', + 'layout.add.post' => 'Neuer Beitrag', + 'layout.add.random-content' => 'Füge zufälligen Inhalt ein', + 'layout.add.tag' => 'Neues Stichwort', + 'layout.add' => 'Hinzufügen', + 'layout.archive.for-year' => 'Archiv für {year}', + 'layout.archive' => 'Archiv', + 'layout.blog' => 'Blog', + 'layout.change-language' => 'Kanal Sprache', + 'layout.console' => 'Konsole', + 'layout.content' => 'Inhalt', + 'layout.create.new-user' => 'Erstelle neuen Benutzer', + 'layout.db.schema' => 'DB Schema', + 'layout.go.home' => 'Zurück zur Startseite', + 'layout.login' => 'Anmelden', + 'layout.migrations' => 'Migrationen', + 'layout.no-records' => 'Keine Einträge', + 'layout.not-found' => 'Nicht gefunden', + 'layout.page.not-found' => 'Die Seite {url} konnte nicht gefunden werden.', + 'layout.pagination-summary' => 'Zeige {pageSize} von {total} Beiträgen', + 'layout.password-verify' => 'Wiederhole Passwort', + 'layout.password' => 'Passwort', + 'layout.rbac.assign-role' => 'Rolle zuweisen', + 'layout.remember' => 'Erinnere dich an mich', + 'layout.reset' => 'Zurücksetzen', + 'layout.show-more' => 'Zeige mehr', + 'layout.submit' => 'Absenden', + 'layout.title' => 'Titel', + 'layout.total.posts' => 'Insgesamt {count} Beiträge', + 'menu.blog' => 'Blog', + 'menu.comments-feed' => 'Kommentar-Feed', + 'menu.contact' => 'Kontakt', + 'menu.language' => 'Sprache', + 'menu.login' => 'Anmelden', + 'menu.logout' => 'Abmelden ({login})', + 'menu.signup' => 'Registrieren', + 'menu.swagger' => 'Swagger', + 'menu.users' => 'Benutzer', + 'signup' => 'Registrieren', + 'validator.invalid.login.password' => 'Ungültiger Benutzername oder Passwort', + 'validator.password.not.match' => 'Passwörter stimmen nicht überein', + 'validator.user.exist' => 'Ein Benutzer mit diesem Namen ist bereits vorhanden', +]; diff --git a/blog/resources/views/layout/main.php b/blog/resources/views/layout/main.php index 3751e71f7..9f1bd16d5 100644 --- a/blog/resources/views/layout/main.php +++ b/blog/resources/views/layout/main.php @@ -125,6 +125,10 @@ 'label' => 'Indonesia', 'url' => $urlGenerator->generateFromCurrent(['_language' => 'id'], fallbackRouteName: 'site/index'), ], + [ + 'label' => 'German', + 'url' => $urlGenerator->generateFromCurrent(['_language' => 'de'], fallbackRouteName: 'site/index'), + ], ], ], [ From 03314704c4f8892da87f22263bd5b820fb83e6b8 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 2 Dec 2023 15:04:12 +0300 Subject: [PATCH 32/58] Adapt to last changes in Yii DataView and Yii Form (#605) --- blog/composer.json | 3 +- blog/resources/views/auth/login.php | 2 +- blog/resources/views/signup/signup.php | 2 +- blog/resources/views/user/index.php | 80 ++++++++++--------- blog/src/Auth/Controller/AuthController.php | 2 +- blog/src/Auth/Controller/SignupController.php | 2 +- blog/src/Auth/Form/LoginForm.php | 2 +- blog/src/Auth/Form/SignupForm.php | 2 +- blog/src/Blog/Post/PostController.php | 2 +- blog/src/Blog/Post/PostForm.php | 2 +- blog/src/Contact/ContactController.php | 2 +- blog/src/Contact/ContactForm.php | 2 +- blog/src/Contact/ContactMailer.php | 8 +- blog/src/Contact/views/contact/form.php | 2 +- 14 files changed, 58 insertions(+), 55 deletions(-) diff --git a/blog/composer.json b/blog/composer.json index 65744d795..d2b093c28 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -44,13 +44,14 @@ "yiisoft/config": "^1.3.1", "yiisoft/cookies": "^1.2", "yiisoft/csrf": "^2.0", - "yiisoft/data": "^1.0", + "yiisoft/data": "dev-master as 1.0", "yiisoft/data-response": "^2.0", "yiisoft/definitions": "^3.0", "yiisoft/di": "^1.2", "yiisoft/error-handler": "^3.0", "yiisoft/factory": "^1.0", "yiisoft/form": "dev-master", + "yiisoft/form-model": "dev-master", "yiisoft/html": "^3.0", "yiisoft/http": "^1.2", "yiisoft/injector": "^1.0", diff --git a/blog/resources/views/auth/login.php b/blog/resources/views/auth/login.php index 7ec710c50..a396e5482 100644 --- a/blog/resources/views/auth/login.php +++ b/blog/resources/views/auth/login.php @@ -3,7 +3,7 @@ declare(strict_types=1); use App\Auth\Form\LoginForm; -use Yiisoft\Form\Field; +use Yiisoft\FormModel\Field; use Yiisoft\Html\Html; use Yiisoft\Html\Tag\Form; use Yiisoft\Router\UrlGeneratorInterface; diff --git a/blog/resources/views/signup/signup.php b/blog/resources/views/signup/signup.php index 491e48f29..833e57edb 100644 --- a/blog/resources/views/signup/signup.php +++ b/blog/resources/views/signup/signup.php @@ -3,7 +3,7 @@ declare(strict_types=1); use App\Auth\Form\SignupForm; -use Yiisoft\Form\Field; +use Yiisoft\FormModel\Field; use Yiisoft\Html\Html; use Yiisoft\Html\Tag\Form; use Yiisoft\Router\UrlGeneratorInterface; diff --git a/blog/resources/views/user/index.php b/blog/resources/views/user/index.php index 04c0b253e..133d1e2f9 100644 --- a/blog/resources/views/user/index.php +++ b/blog/resources/views/user/index.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use App\User\User; use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Html\Html; use Yiisoft\Html\Tag\A; @@ -86,48 +87,49 @@ columns( - DataColumn::create() - ->attribute('id') - ->value(static fn (object $data) => $data->getId()), - DataColumn::create() - ->attribute('login') - ->label($translator->translate('gridview.login')) - ->value(static fn (object $data) => $data->getLogin()), - DataColumn::create() - ->attribute('create_at') - ->label($translator->translate('gridview.create.at')) - ->value(static fn (object $data) => $data->getCreatedAt()->format('r')), - DataColumn::create() - ->attribute('api') - ->label($translator->translate('gridview.api')) - ->value( - static function (object $data) use ($urlGenerator): string { - return Html::a( - 'API User Data', - $urlGenerator->generate('api/user/profile', ['login' => $data->getLogin()]), - ['target' => '_blank'], - )->render(); - }, - ), - DataColumn::create() - ->attribute('profile') - ->label($translator->translate('gridview.profile')) - ->value( - static function (object $data) use ($urlGenerator): string { - return Html::a( - Html::tag('i', '', [ - 'class' => 'bi bi-person-fill ms-1', - 'style' => 'font-size: 1.5em;', - ]), - $urlGenerator->generate('user/profile', ['login' => $data->getLogin()]), - ['class' => 'btn btn-link'], - )->render(); - }, - ), + new DataColumn( + 'id', + content: static fn (User $user) => $user->getId(), + ), + new DataColumn( + 'login', + content: static fn (User $user) => $user->getLogin(), + header: $translator->translate('gridview.login'), + ), + new DataColumn( + 'login', + content: static fn (User $user) => $user->getCreatedAt()->format('r'), + header: $translator->translate('gridview.create.at'), + ), + new DataColumn( + 'api', + content: static function (User $user) use ($urlGenerator): string { + return Html::a( + 'API User Data', + $urlGenerator->generate('api/user/profile', ['login' => $user->getLogin()]), + ['target' => '_blank'], + )->render(); + }, + header: $translator->translate('gridview.api'), + ), + new DataColumn( + 'profile', + content: static function (User $user) use ($urlGenerator): string { + return Html::a( + Html::tag('i', '', [ + 'class' => 'bi bi-person-fill ms-1', + 'style' => 'font-size: 1.5em;', + ]), + $urlGenerator->generate('user/profile', ['login' => $user->getLogin()]), + ['class' => 'btn btn-link'], + )->render(); + }, + header: $translator->translate('gridview.profile'), + ), ) ->header($header) ->id('w1-grid') - ->paginator($paginator) + ->dataReader($paginator) ->pagination( OffsetPagination::widget() ->menuClass('pagination justify-content-center') diff --git a/blog/src/Auth/Controller/AuthController.php b/blog/src/Auth/Controller/AuthController.php index 3dfb3ca57..c50787c60 100644 --- a/blog/src/Auth/Controller/AuthController.php +++ b/blog/src/Auth/Controller/AuthController.php @@ -9,7 +9,7 @@ use App\Service\WebControllerService; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use Yiisoft\Form\FormHydrator; +use Yiisoft\FormModel\FormHydrator; use Yiisoft\Http\Method; use Yiisoft\Translator\TranslatorInterface; use Yiisoft\User\Login\Cookie\CookieLogin; diff --git a/blog/src/Auth/Controller/SignupController.php b/blog/src/Auth/Controller/SignupController.php index 2e0f5a8af..e490def90 100644 --- a/blog/src/Auth/Controller/SignupController.php +++ b/blog/src/Auth/Controller/SignupController.php @@ -9,7 +9,7 @@ use App\Service\WebControllerService; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use Yiisoft\Form\FormHydrator; +use Yiisoft\FormModel\FormHydrator; use Yiisoft\Http\Method; use Yiisoft\Yii\View\ViewRenderer; diff --git a/blog/src/Auth/Form/LoginForm.php b/blog/src/Auth/Form/LoginForm.php index 71f9a31c3..139fd0ec7 100644 --- a/blog/src/Auth/Form/LoginForm.php +++ b/blog/src/Auth/Form/LoginForm.php @@ -5,7 +5,7 @@ namespace App\Auth\Form; use App\Auth\AuthService; -use Yiisoft\Form\FormModel; +use Yiisoft\FormModel\FormModel; use Yiisoft\Translator\TranslatorInterface; use Yiisoft\Validator\Result; use Yiisoft\Validator\Rule\Callback; diff --git a/blog/src/Auth/Form/SignupForm.php b/blog/src/Auth/Form/SignupForm.php index 9c7dad67f..d8e53c5f3 100644 --- a/blog/src/Auth/Form/SignupForm.php +++ b/blog/src/Auth/Form/SignupForm.php @@ -6,7 +6,7 @@ use App\User\User; use App\User\UserRepository; -use Yiisoft\Form\FormModel; +use Yiisoft\FormModel\FormModel; use Yiisoft\Translator\TranslatorInterface; use Yiisoft\Validator\Result; use Yiisoft\Validator\Rule\Equal; diff --git a/blog/src/Blog/Post/PostController.php b/blog/src/Blog/Post/PostController.php index a4f3e15fc..c711b44fa 100644 --- a/blog/src/Blog/Post/PostController.php +++ b/blog/src/Blog/Post/PostController.php @@ -9,7 +9,7 @@ use App\User\UserService; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; -use Yiisoft\Form\FormHydrator; +use Yiisoft\FormModel\FormHydrator; use Yiisoft\Http\Method; use Yiisoft\Router\CurrentRoute; use Yiisoft\Validator\ValidatorInterface; diff --git a/blog/src/Blog/Post/PostForm.php b/blog/src/Blog/Post/PostForm.php index 05890ce7f..55febf56b 100644 --- a/blog/src/Blog/Post/PostForm.php +++ b/blog/src/Blog/Post/PostForm.php @@ -4,7 +4,7 @@ namespace App\Blog\Post; -use Yiisoft\Form\FormModel; +use Yiisoft\FormModel\FormModel; use Yiisoft\Validator\Rule\Required; final class PostForm extends FormModel diff --git a/blog/src/Contact/ContactController.php b/blog/src/Contact/ContactController.php index 60761c7f6..a250fe54c 100644 --- a/blog/src/Contact/ContactController.php +++ b/blog/src/Contact/ContactController.php @@ -7,7 +7,7 @@ use Psr\Http\Message\ResponseFactoryInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use Yiisoft\Form\FormHydrator; +use Yiisoft\FormModel\FormHydrator; use Yiisoft\Http\Header; use Yiisoft\Http\Method; use Yiisoft\Http\Status; diff --git a/blog/src/Contact/ContactForm.php b/blog/src/Contact/ContactForm.php index 9703c8e07..5c3c22616 100644 --- a/blog/src/Contact/ContactForm.php +++ b/blog/src/Contact/ContactForm.php @@ -4,7 +4,7 @@ namespace App\Contact; -use Yiisoft\Form\FormModel; +use Yiisoft\FormModel\FormModel; use Yiisoft\Input\Http\Attribute\Parameter\UploadedFiles; use Yiisoft\Validator\Rule\Email; use Yiisoft\Validator\Rule\Required; diff --git a/blog/src/Contact/ContactMailer.php b/blog/src/Contact/ContactMailer.php index 1ae3b5d9f..82fea5807 100644 --- a/blog/src/Contact/ContactMailer.php +++ b/blog/src/Contact/ContactMailer.php @@ -32,15 +32,15 @@ public function send(ContactForm $form): void ->compose( 'contact-email', [ - 'content' => $form->getAttributeValue('body'), + 'content' => $form->getPropertyValue('body'), ] ) - ->withSubject($form->getAttributeValue('subject')) - ->withFrom([$form->getAttributeValue('email') => $form->getAttributeValue('name')]) + ->withSubject($form->getPropertyValue('subject')) + ->withFrom([$form->getPropertyValue('email') => $form->getPropertyValue('name')]) ->withSender($this->sender) ->withTo($this->to); - foreach ($form->getAttributeValue('attachFiles') as $attachFile) { + foreach ($form->getPropertyValue('attachFiles') as $attachFile) { foreach ($attachFile as $file) { if ($file[0]?->getError() === UPLOAD_ERR_OK) { $message = $message->withAttached( diff --git a/blog/src/Contact/views/contact/form.php b/blog/src/Contact/views/contact/form.php index 45d72a3b9..e757965d2 100644 --- a/blog/src/Contact/views/contact/form.php +++ b/blog/src/Contact/views/contact/form.php @@ -4,7 +4,7 @@ use App\Contact\ContactForm; use App\Widget\FlashMessage; -use Yiisoft\Form\Field; +use Yiisoft\FormModel\Field; use Yiisoft\Html\Html; use Yiisoft\Html\Tag\Form; use Yiisoft\Router\UrlGeneratorInterface; From b122c71ea6f7dbae3e358dbdb08803e54d70895c Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 6 Dec 2023 10:30:15 +0300 Subject: [PATCH 33/58] Adapt to last changes in `yiisoft/form` (#606) --- blog/config/common/params.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/config/common/params.php b/blog/config/common/params.php index fe4e56c8a..f4aec7748 100644 --- a/blog/config/common/params.php +++ b/blog/config/common/params.php @@ -44,7 +44,7 @@ ], 'yiisoft/form' => [ - 'configs' => [ + 'themes' => [ 'default' => [ 'containerClass' => 'form-floating mb-3', 'inputClass' => 'form-control', From d8dc9a35223f27b5e97b5aa032bfd09d3f9b444e Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Wed, 13 Dec 2023 13:59:48 +0100 Subject: [PATCH 34/58] Create README.md --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..9332a3e38 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +Yii 3 Demo Code +=============== + +This repository contains the code for the Yii 3 demo projects: + +Deployment +---------- + +### Manually Renew SSL Cert + + docker-compose run certbot + docker-compose restart gateway From b8ef73cf13ddc985b900426e9ab5881ed4cc78ed Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 9 Jan 2024 08:49:53 +0300 Subject: [PATCH 35/58] Update composer.json --- blog-api/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog-api/composer.json b/blog-api/composer.json index 2338ba771..85c68f869 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -69,7 +69,7 @@ "yiisoft/yii-event": "^2.0", "yiisoft/yii-http": "^1.0", "yiisoft/yii-middleware": "^1.0", - "yiisoft/yii-queue": "3.0.x-dev", + "yiisoft/queue": "3.0.x-dev", "yiisoft/yii-runner-console": "^2.0", "yiisoft/yii-runner-http": "^2.0", "yiisoft/yii-swagger": "^2.0" From f80b773c6afe074158cb549bf570af683222a659 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 9 Jan 2024 08:50:51 +0300 Subject: [PATCH 36/58] Update params.php --- blog-api/config/common/params.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog-api/config/common/params.php b/blog-api/config/common/params.php index e1530e393..89578af34 100644 --- a/blog-api/config/common/params.php +++ b/blog-api/config/common/params.php @@ -137,7 +137,7 @@ ], ], - 'yiisoft/yii-queue' => [ + 'yiisoft/queue' => [ 'handlers' => [ LoggingAuthorizationHandler::NAME => [LoggingAuthorizationHandler::class, 'handle'], ], From 9122601322f5eb86c277b921ef9c64d981229b99 Mon Sep 17 00:00:00 2001 From: pamparam83 Date: Tue, 20 Feb 2024 16:34:27 +0300 Subject: [PATCH 37/58] Route attribute (#609) * fix-gridview * fix PageToken * fix routeArgument --- blog/README.md | 2 +- blog/config/common/params.php | 2 +- blog/resources/views/user/index.php | 2 -- blog/src/Auth/Controller/AuthController.php | 2 +- blog/src/Blog/Archive/ArchiveController.php | 2 +- blog/src/Blog/BlogController.php | 2 +- blog/src/Blog/CommentController.php | 2 +- blog/src/User/Controller/UserController.php | 6 +++--- blog/src/Widget/OffsetPagination.php | 2 +- blog/tests/Acceptance/LoginAcceptanceCest.php | 2 +- 10 files changed, 11 insertions(+), 13 deletions(-) diff --git a/blog/README.md b/blog/README.md index e126bbf8b..3475e92a2 100644 --- a/blog/README.md +++ b/blog/README.md @@ -54,7 +54,7 @@ More routes could be added by editing `src/Factory/AppRouterFactory`. The template comes with a ready to use [Codeception](https://codeception.com/) configuration. In order to execute tests run the following command: -``` +```bash composer run serve 127.0.0.1:8080 > ./runtime/yii.log 2>&1 & vendor/bin/codecept run ``` diff --git a/blog/config/common/params.php b/blog/config/common/params.php index f4aec7748..ad7e01df3 100644 --- a/blog/config/common/params.php +++ b/blog/config/common/params.php @@ -16,7 +16,7 @@ use Yiisoft\Translator\TranslatorInterface; use Yiisoft\Yii\Cycle\Schema\Conveyor\AttributedSchemaConveyor; use Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider; -use Yiisoft\Yii\Cycle\Schema\Provider\PhpFileSchemaProvider; +use \Cycle\Schema\Provider\PhpFileSchemaProvider; use Yiisoft\Yii\View\CsrfViewInjection; return [ diff --git a/blog/resources/views/user/index.php b/blog/resources/views/user/index.php index 133d1e2f9..7720e2075 100644 --- a/blog/resources/views/user/index.php +++ b/blog/resources/views/user/index.php @@ -132,9 +132,7 @@ ->dataReader($paginator) ->pagination( OffsetPagination::widget() - ->menuClass('pagination justify-content-center') ->paginator($paginator) - ->urlArguments([]) ->render(), ) ->rowAttributes(['class' => 'align-middle']) diff --git a/blog/src/Auth/Controller/AuthController.php b/blog/src/Auth/Controller/AuthController.php index c50787c60..446f81b5e 100644 --- a/blog/src/Auth/Controller/AuthController.php +++ b/blog/src/Auth/Controller/AuthController.php @@ -46,7 +46,7 @@ public function login( ) { $identity = $this->authService->getIdentity(); - if ($identity instanceof CookieLoginIdentityInterface && $loginForm->getAttributeValue('rememberMe')) { + if ($identity instanceof CookieLoginIdentityInterface && $loginForm->getPropertyValue('rememberMe')) { return $cookieLogin->addCookie($identity, $this->redirectToMain()); } diff --git a/blog/src/Blog/Archive/ArchiveController.php b/blog/src/Blog/Archive/ArchiveController.php index 080c9ecb5..21cbd468c 100644 --- a/blog/src/Blog/Archive/ArchiveController.php +++ b/blog/src/Blog/Archive/ArchiveController.php @@ -7,7 +7,7 @@ use App\Blog\Tag\TagRepository; use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; -use Yiisoft\Hydrator\Temp\RouteArgument; +use Yiisoft\Router\HydratorAttribute\RouteArgument; use Yiisoft\Yii\View\ViewRenderer; final class ArchiveController diff --git a/blog/src/Blog/BlogController.php b/blog/src/Blog/BlogController.php index 18552ddb8..3030aae8d 100644 --- a/blog/src/Blog/BlogController.php +++ b/blog/src/Blog/BlogController.php @@ -9,7 +9,7 @@ use App\Blog\Tag\TagRepository; use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; -use Yiisoft\Hydrator\Temp\RouteArgument; +use Yiisoft\Router\HydratorAttribute\RouteArgument; use Yiisoft\User\CurrentUser; use Yiisoft\Yii\View\ViewRenderer; diff --git a/blog/src/Blog/CommentController.php b/blog/src/Blog/CommentController.php index 5b218791e..c4de61c73 100644 --- a/blog/src/Blog/CommentController.php +++ b/blog/src/Blog/CommentController.php @@ -7,7 +7,7 @@ use App\Blog\Comment\CommentService; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; -use Yiisoft\Hydrator\Temp\RouteArgument; +use Yiisoft\Router\HydratorAttribute\RouteArgument; use Yiisoft\Yii\View\ViewRenderer; final class CommentController diff --git a/blog/src/User/Controller/UserController.php b/blog/src/User/Controller/UserController.php index 99ec5edc3..60b42244e 100644 --- a/blog/src/User/Controller/UserController.php +++ b/blog/src/User/Controller/UserController.php @@ -5,18 +5,18 @@ namespace App\User\Controller; use App\User\UserRepository; +use Yiisoft\Data\Paginator\PageToken; use Psr\Http\Message\ResponseFactoryInterface; use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Data\Reader\Sort; use Yiisoft\Input\Http\Attribute\Parameter\Body; use Yiisoft\Input\Http\Attribute\Parameter\Query; -use Yiisoft\Hydrator\Temp\RouteArgument; +use Yiisoft\Router\HydratorAttribute\RouteArgument; use Yiisoft\Yii\View\ViewRenderer; final class UserController { - private const PAGINATION_INDEX = 5; public function __construct(private ViewRenderer $viewRenderer) { @@ -40,7 +40,7 @@ public function index( } $paginator = (new OffsetPaginator($dataReader)); - $paginator = $paginator->withNextPageToken((string) $page)->withPageSize($pageSize); + $paginator = $paginator->withToken(PageToken::next((string) $page))->withPageSize($pageSize); return $this->viewRenderer->render('index', ['paginator' => $paginator]); } diff --git a/blog/src/Widget/OffsetPagination.php b/blog/src/Widget/OffsetPagination.php index c820b6d5b..cca652972 100644 --- a/blog/src/Widget/OffsetPagination.php +++ b/blog/src/Widget/OffsetPagination.php @@ -37,7 +37,7 @@ public function urlGenerator(Closure $generator): self public function isRequired(): bool { - return $this->paginator !== null && $this->paginator->isRequired(); + return $this->paginator !== null && $this->paginator->isPaginationRequired(); } /** diff --git a/blog/tests/Acceptance/LoginAcceptanceCest.php b/blog/tests/Acceptance/LoginAcceptanceCest.php index 2d2b66423..25436c6bc 100644 --- a/blog/tests/Acceptance/LoginAcceptanceCest.php +++ b/blog/tests/Acceptance/LoginAcceptanceCest.php @@ -66,7 +66,7 @@ public function testLoginSubmitFormWrongDataPassword(AcceptanceTester $I): void } /** - * @depends \App\Tests\Acceptance\SignupAcceptanceCest:testRegisterSuccess + * @depends App\Tests\Acceptance\SignupAcceptanceCest:testRegisterSuccess */ public function testLoginUsernameSubmitFormSuccessData(AcceptanceTester $I): void { From 19d2a2e273d3a1df69c0de2e221dc293ed4c9c9b Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Tue, 20 Feb 2024 13:34:48 +0000 Subject: [PATCH 38/58] Apply fixes from StyleCI --- blog/config/common/params.php | 2 +- blog/src/User/Controller/UserController.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/blog/config/common/params.php b/blog/config/common/params.php index ad7e01df3..c967bc948 100644 --- a/blog/config/common/params.php +++ b/blog/config/common/params.php @@ -16,7 +16,7 @@ use Yiisoft\Translator\TranslatorInterface; use Yiisoft\Yii\Cycle\Schema\Conveyor\AttributedSchemaConveyor; use Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider; -use \Cycle\Schema\Provider\PhpFileSchemaProvider; +use Cycle\Schema\Provider\PhpFileSchemaProvider; use Yiisoft\Yii\View\CsrfViewInjection; return [ diff --git a/blog/src/User/Controller/UserController.php b/blog/src/User/Controller/UserController.php index 60b42244e..03ac4120c 100644 --- a/blog/src/User/Controller/UserController.php +++ b/blog/src/User/Controller/UserController.php @@ -17,7 +17,6 @@ final class UserController { - public function __construct(private ViewRenderer $viewRenderer) { $this->viewRenderer = $viewRenderer->withControllerName('user'); From bdcf49130f5ce9a4abb5ee52671cce9d19ff842c Mon Sep 17 00:00:00 2001 From: nkondrashov Date: Wed, 21 Feb 2024 12:56:43 +0300 Subject: [PATCH 39/58] OA annotation to php8 + some namespace fixes (#610) --- blog-api/README.md | 2 +- blog-api/composer.json | 2 +- blog-api/config/common/params.php | 4 +- blog-api/config/common/routes.php | 2 +- blog-api/src/Auth/AuthController.php | 138 ++++---- blog-api/src/Auth/AuthRequest.php | 18 +- blog-api/src/Blog/BlogController.php | 302 +++++++----------- blog-api/src/Blog/EditPostRequest.php | 20 +- blog-api/src/Blog/PostFormatter.php | 18 +- blog-api/src/Dto/ApiResponseData.php | 95 +++--- blog-api/src/Formatter/PaginatorFormatter.php | 18 +- blog-api/src/InfoController.php | 64 ++-- blog-api/src/Queue/UserLoggedInMessage.php | 2 +- blog-api/src/User/UserController.php | 143 ++++----- blog-api/src/User/UserFormatter.php | 16 +- blog-api/src/User/UserService.php | 2 +- blog/config/common/params.php | 1 + blog/config/common/routes/routes.php | 2 +- blog/src/Controller/Actions/ApiInfo.php | 35 +- blog/src/Middleware/ApiDataWrapper.php | 9 + .../src/User/Controller/ApiUserController.php | 86 +++-- 21 files changed, 437 insertions(+), 542 deletions(-) diff --git a/blog-api/README.md b/blog-api/README.md index dd6a209b3..ca15f6d67 100644 --- a/blog-api/README.md +++ b/blog-api/README.md @@ -46,7 +46,7 @@ Authorization is performed via the `X-Api-Key` header. ## API documentation -API documentation is available at `/docs`. It is built from OpenAPI annotations (`@OA`). +API documentation is available at `/docs`. It is built from OpenAPI attributes (`#[OA\ ... ]`). See [Swagger-PHP documentation](https://zircote.github.io/swagger-php/Getting-started.html#write-annotations) for details on how to annotate your code. diff --git a/blog-api/composer.json b/blog-api/composer.json index 85c68f869..fdfebab57 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -49,7 +49,7 @@ "yiisoft/factory": "^1.0", "yiisoft/files": "^2.0", "yiisoft/http": "^1.2", - "yiisoft/hydrator-validator": "dev-master", + "yiisoft/hydrator-validator": "^1.0", "yiisoft/injector": "^1.0", "yiisoft/input-http": "dev-master", "yiisoft/log": "^2.0", diff --git a/blog-api/config/common/params.php b/blog-api/config/common/params.php index 89578af34..9b9da652a 100644 --- a/blog-api/config/common/params.php +++ b/blog-api/config/common/params.php @@ -5,15 +5,15 @@ use App\Queue\LoggingAuthorizationHandler; use Cycle\Database\Config\SQLite\FileConnectionConfig; use Cycle\Database\Config\SQLiteDriverConfig; +use Cycle\Schema\Provider\PhpFileSchemaProvider; use Yiisoft\ErrorHandler\Middleware\ErrorCatcher; use Yiisoft\Router\Middleware\Router; use Yiisoft\Yii\Cycle\Schema\Conveyor\AttributedSchemaConveyor; use Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider; -use Yiisoft\Yii\Cycle\Schema\Provider\PhpFileSchemaProvider; use Yiisoft\Yii\Cycle\Schema\SchemaProviderInterface; use Yiisoft\Yii\Middleware\Locale; use Yiisoft\Yii\Middleware\Subfolder; -use Yiisoft\Yii\Queue\Adapter\SynchronousAdapter; +use Yiisoft\Queue\Adapter\SynchronousAdapter; return [ 'locale' => [ diff --git a/blog-api/config/common/routes.php b/blog-api/config/common/routes.php index 2d39e0ab8..82bf07697 100644 --- a/blog-api/config/common/routes.php +++ b/blog-api/config/common/routes.php @@ -63,6 +63,6 @@ Route::get('/openapi.json') ->middleware(FormatDataResponseAsJson::class) ->middleware(CorsAllowAll::class) - ->action([SwaggerJson::class, 'handle']), + ->action([SwaggerJson::class, 'process']), ), ]; diff --git a/blog-api/src/Auth/AuthController.php b/blog-api/src/Auth/AuthController.php index d28d20d52..49855de45 100644 --- a/blog-api/src/Auth/AuthController.php +++ b/blog-api/src/Auth/AuthController.php @@ -6,23 +6,12 @@ use App\User\UserRequest; use App\User\UserService; -use OpenApi\Annotations as OA; +use OpenApi\Attributes as OA; use Psr\Http\Message\ResponseInterface; use Yiisoft\DataResponse\DataResponseFactoryInterface as ResponseFactory; -/** - * @OA\Tag( - * name="auth", - * description="Authentication" - * ) - * - * @OA\SecurityScheme( - * securityScheme="ApiKey", - * type="apiKey", - * in="header", - * name="X-Api-Key" - * ) - */ +#[OA\Tag(name: "auth", description: "Authentication")] +#[OA\SecurityScheme(securityScheme: "ApiKey", type: "apiKey", name: "X-Api-Key", in: "header")] final class AuthController { private ResponseFactory $responseFactory; @@ -36,51 +25,40 @@ public function __construct( $this->userService = $userService; } - /** - * @OA\Post( - * tags={"auth"}, - * path="/auth/", - * summary="Authenticate by params", - * description="", - * - * @OA\Response( - * response="200", - * description="Success", - * - * @OA\JsonContent( - * allOf={ - * - * @OA\Schema(ref="#/components/schemas/Response"), - * @OA\Schema( - * - * @OA\Property( - * property="data", - * type="object", - * @OA\Property(property="token", format="string", example="uap4X5Bd7078lxIFvxAflcGAa5D95iSSZkNjg3XFrE2EBRBlbj"), - * ), - * ), - * }, - * ) - * ), - * - * @OA\Response( - * response="400", - * description="Bad request", - * - * @OA\JsonContent(ref="#/components/schemas/BadResponse") - * ), - * - * @OA\RequestBody( - * required=true, - * - * @OA\MediaType( - * mediaType="application/json", - * - * @OA\Schema(ref="#/components/schemas/AuthRequest"), - * ), - * ), - * ) - */ + #[OA\Post( + path: "/auth/", + description: "", + summary: "Authenticate by params", + requestBody: new OA\RequestBody(required: true, content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/AuthRequest"), + ] + )), + tags: ["auth"], + responses: [ + new OA\Response( + response: "200", + description: "Success", + content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property( + property: "data", + properties: [ + new OA\Property(property: "token", type: "string", example: "uap4X5Bd7078lxIFvxAflcGAa5D95iSSZkNjg3XFrE2EBRBlbj") + ], + type: "object"), + ]), + ]) + ), + new OA\Response( + response: "400", + description: "Bad request", + content: new OA\JsonContent(ref: "#/components/schemas/BadResponse") + ), + ] + )] public function login(AuthRequest $request): ResponseInterface { return $this->responseFactory->createResponse( @@ -95,29 +73,25 @@ public function login(AuthRequest $request): ResponseInterface ); } - /** - * @OA\Post( - * tags={"auth"}, - * path="/logout/", - * summary="Logout", - * description="", - * security={{"ApiKey": {}}}, - * - * @OA\Response( - * response="200", - * description="Success", - * - * @OA\JsonContent(ref="#/components/schemas/Response") - * ), - * - * @OA\Response( - * response="400", - * description="Bad request", - * - * @OA\JsonContent(ref="#/components/schemas/BadResponse") - * ), - * ) - */ + #[OA\Post( + path: "/logout/", + description: "", + summary: "Logout", + security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], + tags: ["auth"], + responses: [ + new OA\Response( + response: "200", + description: "Success", + content: new OA\JsonContent(ref: "#/components/schemas/Response") + ), + new OA\Response( + response: "400", + description: "Bad request", + content: new OA\JsonContent(ref: "#/components/schemas/BadResponse") + ), + ] + )] public function logout(UserRequest $request): ResponseInterface { $this->userService->logout($request->getUser()); diff --git a/blog-api/src/Auth/AuthRequest.php b/blog-api/src/Auth/AuthRequest.php index 49e764266..a616cee20 100644 --- a/blog-api/src/Auth/AuthRequest.php +++ b/blog-api/src/Auth/AuthRequest.php @@ -4,20 +4,18 @@ namespace App\Auth; -use OpenApi\Annotations as OA; use Yiisoft\Input\Http\Attribute\Parameter\Body; use Yiisoft\Input\Http\RequestInputInterface; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\RulesProviderInterface; - -/** - * @OA\Schema( - * schema="AuthRequest", - * - * @OA\Property(example="Opal1144", property="login", format="string"), - * @OA\Property(example="Opal1144", property="password", format="string"), - * ) - */ +use OpenApi\Attributes as OA; + +#[OA\Schema( + schema: "AuthRequest", + properties: [ + new OA\Property(property: 'login', type: "string", example: 'Opal1144'), + new OA\Property(property: 'password', type: "string", example: 'Opal1144'), + ])] final class AuthRequest implements RequestInputInterface, RulesProviderInterface { #[Body('login')] diff --git a/blog-api/src/Blog/BlogController.php b/blog-api/src/Blog/BlogController.php index 7ca829180..e9f7cbc62 100644 --- a/blog-api/src/Blog/BlogController.php +++ b/blog-api/src/Blog/BlogController.php @@ -6,29 +6,14 @@ use App\Formatter\PaginatorFormatter; use App\User\UserRequest; -use OpenApi\Annotations as OA; +use OpenApi\Attributes as OA; use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\DataResponse\DataResponseFactoryInterface; use Yiisoft\Input\Http\Attribute\Parameter\Query; -use Yiisoft\Hydrator\Temp\RouteArgument; +use Yiisoft\Router\HydratorAttribute\RouteArgument; -/** - * @OA\Tag( - * name="blog", - * description="Blog" - * ) - * - * @OA\Parameter( - * - * @OA\Schema( - * type="int", - * example="2" - * ), - * in="query", - * name="page", - * parameter="PageRequest" - * ) - */ +#[OA\Tag(name: "blog", description: "Blog")] +#[OA\Parameter(parameter: "PageRequest", name: "page", in: "query", schema: new OA\Schema(type: "int", example: "2"))] final class BlogController { private DataResponseFactoryInterface $responseFactory; @@ -51,47 +36,34 @@ public function __construct( $this->blogService = $blogService; } - /** - * @OA\Get( - * tags={"blog"}, - * path="/blog/", - * summary="Returns paginated blog posts", - * description="", - * - * @OA\Parameter(ref="#/components/parameters/PageRequest"), - * - * @OA\Response( - * response="200", - * description="Success", - * - * @OA\JsonContent( - * allOf={ - * - * @OA\Schema(ref="#/components/schemas/Response"), - * @OA\Schema( - * - * @OA\Property( - * property="data", - * type="object", - * @OA\Property( - * property="posts", - * type="array", - * - * @OA\Items(ref="#/components/schemas/Post") - * ), - * - * @OA\Property( - * property="paginator", - * type="object", - * ref="#/components/schemas/Paginator" - * ), - * ), - * ), - * }, - * ) - * ), - * ) - */ + #[OA\Get( + path: "/blog/", + description: "", + summary: "Returns paginated blog posts", + tags: ["blog"], + parameters: [ + new OA\Parameter(ref: '#/components/parameters/PageRequest') + ], + responses: [ + new OA\Response( + response:"200", + description:"Success", + content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property( + property: "data", + properties: [ + new OA\Property(property: "posts", type: "array", items: new OA\Items(ref:"#/components/schemas/Post")), + new OA\Property(property: "paginator", ref: "#/components/schemas/Paginator", type: "object"), + ], type: "object"), + ]), + ] + ), + ), + ] + )] public function index(PaginatorFormatter $paginatorFormatter, #[Query('page')] int $page = 1): Response { $paginator = $this->blogService->getPosts($page); @@ -108,63 +80,44 @@ public function index(PaginatorFormatter $paginatorFormatter, #[Query('page')] i ); } - /** - * @OA\Get( - * tags={"blog"}, - * path="/blog/{id}", - * summary="Returns a post with a given ID", - * description="", - * - * @OA\Parameter( - * - * @OA\Schema(type="int", example="2"), - * in="path", - * name="id", - * parameter="id" - * ), - * - * @OA\Response( - * response="200", - * description="Success", - * - * @OA\JsonContent( - * allOf={ - * - * @OA\Schema(ref="#/components/schemas/Response"), - * @OA\Schema( - * - * @OA\Property( - * property="data", - * type="object", - * @OA\Property( - * property="post", - * type="object", - * ref="#/components/schemas/Post" - * ), - * ), - * ), - * }, - * ) - * ), - * - * @OA\Response( - * response="404", - * description="Not found", - * - * @OA\JsonContent( - * allOf={ - * - * @OA\Schema(ref="#/components/schemas/BadResponse"), - * @OA\Schema( - * - * @OA\Property(property="error_message", example="Entity not found"), - * @OA\Property(property="error_code", nullable=true, example=404) - * ), - * }, - * ) - * ), - * ) - */ + #[OA\Get( + path: "/blog/{id}", + description: "", + summary: "Returns a post with a given ID", + tags: ["blog"], + parameters: [ + new OA\Parameter(parameter: "id", name: "id", in: "path", schema: new OA\Schema(type: "int", example: "2")) + ], + responses: [ + new OA\Response( + response:"200", + description:"Success", + content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property( + property: "data", + properties: [ + new OA\Property(property: "post", ref: "#/components/schemas/Post", type: "object") + ], type: "object"), + ]), + ] + ), + ), + new OA\Response( + response: "404", + description: "Not found", + content: new OA\JsonContent(allOf: [ + new OA\Schema(ref: "#/components/schemas/BadResponse"), + new OA\Schema(properties: [ + new OA\Property(property:"error_message", example:"Entity not found"), + new OA\Property(property: "error_code", example: 404, nullable: true) + ]) + ]) + ), + ] + )] public function view(#[RouteArgument('id')] int $id): Response { return $this->responseFactory->createResponse( @@ -176,34 +129,30 @@ public function view(#[RouteArgument('id')] int $id): Response ); } - /** - * @OA\Post( - * tags={"blog"}, - * path="/blog", - * summary="Creates a blog post", - * description="", - * security={{"ApiKey": {}}}, - * - * @OA\Response( - * response="200", - * description="Success", - * - * @OA\JsonContent( - * ref="#/components/schemas/Response" - * ) - * ), - * - * @OA\RequestBody( - * required=true, - * - * @OA\MediaType( - * mediaType="application/json", - * - * @OA\Schema(ref="#/components/schemas/EditPostRequest"), - * ), - * ), - * ) - */ + #[OA\Post( + path: "/blog/", + description: "", + summary: "Creates a blog post", + security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], + requestBody: new OA\RequestBody(required: true, content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/EditPostRequest"), + ] + )), + tags: ["blog"], + responses: [ + new OA\Response( + response: "200", + description: "Success", + content: new OA\JsonContent(ref: "#/components/schemas/Response") + ), + new OA\Response( + response: "400", + description: "Bad request", + content: new OA\JsonContent(ref: "#/components/schemas/BadResponse") + ), + ] + )] public function create(EditPostRequest $postRequest, UserRequest $userRequest): Response { $post = $this->postBuilder->build(new Post(), $postRequest); @@ -214,42 +163,33 @@ public function create(EditPostRequest $postRequest, UserRequest $userRequest): return $this->responseFactory->createResponse(); } - /** - * @OA\Put( - * tags={"blog"}, - * path="/blog/{id}", - * summary="Updates a blog post with a given ID", - * description="", - * security={{"ApiKey": {}}}, - * - * @OA\Parameter( - * - * @OA\Schema(type="int", example="2"), - * in="path", - * name="id", - * parameter="id" - * ), - * - * @OA\Response( - * response="200", - * description="Success", - * - * @OA\JsonContent( - * ref="#/components/schemas/Response" - * ) - * ), - * - * @OA\RequestBody( - * required=true, - * - * @OA\MediaType( - * mediaType="application/json", - * - * @OA\Schema(ref="#/components/schemas/EditPostRequest"), - * ), - * ) - * ) - */ + #[OA\Put( + path: "/blog/{id}", + description: "", + summary: "Updates a blog post with a given ID", + security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], + requestBody: new OA\RequestBody(required: true, content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/EditPostRequest"), + ] + )), + tags: ["blog"], + parameters: [ + new OA\Parameter(parameter: "id", name: "id", in: "path", schema: new OA\Schema(type: "int", example: "2")) + ], + responses: [ + new OA\Response( + response: "200", + description: "Success", + content: new OA\JsonContent(ref: "#/components/schemas/Response") + ), + new OA\Response( + response: "400", + description: "Bad request", + content: new OA\JsonContent(ref: "#/components/schemas/BadResponse") + ), + ] + )] public function update(EditPostRequest $postRequest, #[RouteArgument('id')] int $id): Response { $post = $this->postBuilder->build( diff --git a/blog-api/src/Blog/EditPostRequest.php b/blog-api/src/Blog/EditPostRequest.php index 61d1f9770..b94875369 100644 --- a/blog-api/src/Blog/EditPostRequest.php +++ b/blog-api/src/Blog/EditPostRequest.php @@ -4,25 +4,23 @@ namespace App\Blog; -use OpenApi\Annotations as OA; use Yiisoft\Hydrator\Validator\Attribute\Validate; use Yiisoft\Input\Http\AbstractInput; use Yiisoft\Input\Http\Attribute\Parameter\Body; -use Yiisoft\Hydrator\Temp\RouteArgument; +use Yiisoft\Router\HydratorAttribute\RouteArgument; use Yiisoft\Validator\Result; use Yiisoft\Validator\Rule\Length; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\RulesProviderInterface; +use OpenApi\Attributes as OA; -/** - * @OA\Schema( - * schema="EditPostRequest", - * - * @OA\Property(example="Title post", property="title", format="string"), - * @OA\Property(example="Text post", property="text", format="string"), - * @OA\Property(example=1, property="status", format="int"), - * ) - */ +#[OA\Schema( + schema: "EditPostRequest", + properties: [ + new OA\Property(property: 'title', type: "string", example: 'Title post'), + new OA\Property(property: 'text', type: "string", example: 'Text post'), + new OA\Property(property: 'status', type: "int", example: '1'), + ])] final class EditPostRequest extends AbstractInput implements RulesProviderInterface { #[RouteArgument('id')] diff --git a/blog-api/src/Blog/PostFormatter.php b/blog-api/src/Blog/PostFormatter.php index 3193d4bc9..b5538208a 100644 --- a/blog-api/src/Blog/PostFormatter.php +++ b/blog-api/src/Blog/PostFormatter.php @@ -4,17 +4,15 @@ namespace App\Blog; -use OpenApi\Annotations as OA; +use OpenApi\Attributes as OA; -/** - * @OA\Schema( - * schema="Post", - * - * @OA\Property(example="100", property="id", format="int"), - * @OA\Property(example="Title", property="title", format="string"), - * @OA\Property(example="Text", property="content", format="string"), - * ) - */ +#[OA\Schema( + schema: "Post", + properties: [ + new OA\Property(property: 'id', type: "int", example: '100'), + new OA\Property(property: 'title', type: "string", example: 'Title'), + new OA\Property(property: 'content', type: "string", example: 'Text'), + ])] final class PostFormatter { public function format(Post $post): array diff --git a/blog-api/src/Dto/ApiResponseData.php b/blog-api/src/Dto/ApiResponseData.php index 65e85c9eb..92b777e3d 100644 --- a/blog-api/src/Dto/ApiResponseData.php +++ b/blog-api/src/Dto/ApiResponseData.php @@ -4,70 +4,53 @@ namespace App\Dto; -use OpenApi\Annotations as OA; - -/** - * @OA\Schema( - * schema="Response", - * ) - * @OA\Schema( - * schema="BadResponse", - * allOf={ - * @OA\Schema(ref="#/components/schemas/Response"), - * @OA\Schema( - * - * @OA\Property( - * property="status", - * example="failed", - * ), - * @OA\Property(property="error_message", example="Error description message"), - * @OA\Property(property="error_code", nullable=true, example=400), - * @OA\Property( - * property="data", - * example=null - * ), - * ) - * } - * ) - */ +use OpenApi\Attributes as OA; + +#[OA\Schema( + schema: "Response" +)] +#[OA\Schema( + schema: "BadResponse", + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property(property: "status", example: "failed"), + new OA\Property(property: "error_message", example: "Error description message"), + new OA\Property(property: "error_code", example: "400", nullable: true), + new OA\Property(property: "data", example: null), + ]) + ] +)] final class ApiResponseData { - /** - * @OA\Property( - * property="status", - * format="string", - * example="success", - * enum={"success", "failed"} - * ) - */ + #[OA\Property( + property: "status", + format: "string", + enum: ['success', 'failed'], + example: "success" + )] private string $status = ''; - /** - * @OA\Property( - * property="error_message", - * format="string", - * example="" - * ) - */ + #[OA\Property( + property: "error_message", + format: "string", + example: "" + )] private string $errorMessage = ''; - /** - * @OA\Property( - * property="error_code", - * format="integer", - * nullable=true, - * example=null - * ) - */ + #[OA\Property( + property: "error_code", + format: "integer", + example: null, + nullable: true + )] private ?int $errorCode = null; - /** - * @OA\Property( - * property="data", - * type="object", - * nullable=true, - * ) - */ + #[OA\Property( + property: "data", + type: "object", + nullable: true + )] private ?array $data = null; public function getStatus(): string diff --git a/blog-api/src/Formatter/PaginatorFormatter.php b/blog-api/src/Formatter/PaginatorFormatter.php index 983c6eefe..ca9ffa31c 100644 --- a/blog-api/src/Formatter/PaginatorFormatter.php +++ b/blog-api/src/Formatter/PaginatorFormatter.php @@ -4,18 +4,16 @@ namespace App\Formatter; -use OpenApi\Annotations as OA; +use OpenApi\Attributes as OA; use Yiisoft\Data\Paginator\OffsetPaginator; -/** - * @OA\Schema( - * schema="Paginator", - * - * @OA\Property(example="10", property="pageSize", format="int"), - * @OA\Property(example="1", property="currentPage", format="int"), - * @OA\Property(example="3", property="totalPages", format="int"), - * ) - */ +#[OA\Schema( + schema: "Paginator", + properties: [ + new OA\Property(property: 'pageSize', type: "int", example: '10'), + new OA\Property(property: 'currentPage', type: "int", example: '1'), + new OA\Property(property: 'totalPages', type: "int", example: '3'), + ])] final class PaginatorFormatter { public function format(OffsetPaginator $paginator): array diff --git a/blog-api/src/InfoController.php b/blog-api/src/InfoController.php index 3ce6fafb5..c8c4ee275 100644 --- a/blog-api/src/InfoController.php +++ b/blog-api/src/InfoController.php @@ -4,55 +4,39 @@ namespace App; -use OpenApi\Annotations as OA; +use OpenApi\Attributes as OA; use Psr\Http\Message\ResponseInterface; use Yiisoft\DataResponse\DataResponseFactoryInterface; -/** - * @OA\Info(title="Yii API application", version="1.0") - */ +#[OA\Info(version: "1.0", title: "Yii API application")] class InfoController { public function __construct(private VersionProvider $versionProvider) { } - /** - * @OA\Get( - * path="/", - * summary="Returns info about the API", - * description="", - * - * @OA\Response( - * response="200", - * description="Success", - * - * @OA\JsonContent( - * allOf={ - * - * @OA\Schema(ref="#/components/schemas/Response"), - * @OA\Schema( - * - * @OA\Property( - * property="data", - * type="object", - * @OA\Property( - * property="version", - * type="string", - * example="3.0" - * ), - * @OA\Property( - * property="author", - * type="string", - * example="yiisoft" - * ), - * ), - * ), - * }, - * ) - * ), - * ) - */ + #[OA\Get( + path: "/", + description: "", + summary: "Returns info about the API", + responses: [ + new OA\Response( + response:"200", + description:"Success", + content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property(property: "data", properties: [ + new OA\Property(property: "version", type: "string", example: "3.0"), + new OA\Property(property: "author", type: "string", example: "yiisoft"), + ], type: "object"), + ]), + ] + ), + ), + ] + )] public function index(DataResponseFactoryInterface $responseFactory): ResponseInterface { return $responseFactory->createResponse(['version' => $this->versionProvider->version, 'author' => 'yiisoft']); diff --git a/blog-api/src/Queue/UserLoggedInMessage.php b/blog-api/src/Queue/UserLoggedInMessage.php index 99f879e34..141e7d3b5 100644 --- a/blog-api/src/Queue/UserLoggedInMessage.php +++ b/blog-api/src/Queue/UserLoggedInMessage.php @@ -4,7 +4,7 @@ namespace App\Queue; -use Yiisoft\Yii\Queue\Message\MessageInterface; +use Yiisoft\Queue\Message\MessageInterface; final class UserLoggedInMessage implements MessageInterface { diff --git a/blog-api/src/User/UserController.php b/blog-api/src/User/UserController.php index c02bbf4e3..a2ed08b2c 100644 --- a/blog-api/src/User/UserController.php +++ b/blog-api/src/User/UserController.php @@ -6,17 +6,12 @@ use App\Exception\NotFoundException; use App\RestControllerTrait; -use OpenApi\Annotations as OA; +use OpenApi\Attributes as OA; use Psr\Http\Message\ResponseInterface; use Yiisoft\DataResponse\DataResponseFactoryInterface; -use Yiisoft\Hydrator\Temp\RouteArgument; +use Yiisoft\Router\HydratorAttribute\RouteArgument; -/** - * @OA\Tag( - * name="user", - * description="Users" - * ) - */ +#[OA\Tag(name: "user", description: "User")] final class UserController { use RestControllerTrait; @@ -35,40 +30,35 @@ public function __construct( $this->userFormatter = $userFormatter; } - /** - * @OA\Get( - * tags={"user"}, - * path="/users", - * summary="Returns paginated users", - * description="", - * security={{"ApiKey": {}}}, - * - * @OA\Response( - * response="200", - * description="Success", - * - * @OA\JsonContent( - * allOf={ - * - * @OA\Schema(ref="#/components/schemas/Response"), - * @OA\Schema( - * - * @OA\Property( - * property="data", - * type="object", - * @OA\Property( - * property="users", - * type="array", - * - * @OA\Items(ref="#/components/schemas/User") - * ), - * ), - * ), - * }, - * ) - * ), - * ) - */ + #[OA\Get( + path: "/users/", + description: "", + summary: "Returns paginated users", + security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], + tags: ["user"], + responses: [ + new OA\Response( + response: "200", + description: "Success", + content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property( + property: "data", + properties: [ + new OA\Property( + property: "user", + type: "array", + items: new OA\Items(ref: "#/components/schemas/User") + ) + ], + type: "object"), + ]), + ]) + ), + ] + )] public function list(): ResponseInterface { $dataReader = $this->userRepository->findAllOrderByLogin(); @@ -84,47 +74,34 @@ public function list(): ResponseInterface ); } - /** - * @OA\Get( - * tags={"user"}, - * path="/users/{id}", - * summary="Returns a user with a given ID", - * description="", - * security={{"ApiKey": {}}}, - * - * @OA\Parameter( - * - * @OA\Schema(type="int", example="2"), - * in="path", - * name="id", - * parameter="id" - * ), - * - * @OA\Response( - * response="200", - * description="Success", - * - * @OA\JsonContent( - * allOf={ - * - * @OA\Schema(ref="#/components/schemas/Response"), - * @OA\Schema( - * - * @OA\Property( - * property="data", - * type="object", - * @OA\Property( - * property="user", - * type="object", - * ref="#/components/schemas/User" - * ), - * ), - * ), - * }, - * ) - * ), - * ) - */ + #[OA\Get( + path: "/users/{id}", + description: "", + summary: "Returns a user with a given ID", + security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], + tags: ["user"], + parameters: [ + new OA\Parameter(parameter: "id", name: "id", in: "path", example: 2) + ], + responses: [ + new OA\Response( + response: "200", + description: "Success", + content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property( + property: "data", + properties: [ + new OA\Property(property: "user", ref: "#/components/schemas/User", type: "object") + ], + type: "object"), + ]), + ]) + ), + ] + )] public function get(#[RouteArgument('id')] int $id): ResponseInterface { /** diff --git a/blog-api/src/User/UserFormatter.php b/blog-api/src/User/UserFormatter.php index 115280f45..316e08e00 100644 --- a/blog-api/src/User/UserFormatter.php +++ b/blog-api/src/User/UserFormatter.php @@ -4,16 +4,14 @@ namespace App\User; -use OpenApi\Annotations as OA; +use OpenApi\Attributes as OA; -/** - * @OA\Schema( - * schema="User", - * - * @OA\Property(example="UserName", property="login", format="string"), - * @OA\Property(example="13.12.2020 00:04:20", property="created_at", format="string"), - * ) - */ +#[OA\Schema( + schema: "User", + properties: [ + new OA\Property(property: 'login', type: "string", example: 'UserName'), + new OA\Property(property: 'created_at', type: "string", example: '13.12.2020 00:04:20'), + ])] final class UserFormatter { public function format(User $user): array diff --git a/blog-api/src/User/UserService.php b/blog-api/src/User/UserService.php index 43ee5a397..f5df91d55 100644 --- a/blog-api/src/User/UserService.php +++ b/blog-api/src/User/UserService.php @@ -11,7 +11,7 @@ use Yiisoft\Auth\IdentityRepositoryInterface; use Yiisoft\Definitions\Exception\InvalidConfigException; use Yiisoft\User\CurrentUser; -use Yiisoft\Yii\Queue\QueueFactoryInterface; +use Yiisoft\Queue\QueueFactoryInterface; final class UserService { diff --git a/blog/config/common/params.php b/blog/config/common/params.php index c967bc948..21fca2a40 100644 --- a/blog/config/common/params.php +++ b/blog/config/common/params.php @@ -181,6 +181,7 @@ 'yiisoft/yii-swagger' => [ 'annotation-paths' => [ '@src/Controller', + '@src/Middleware', '@src/User/Controller', ], ], diff --git a/blog/config/common/routes/routes.php b/blog/config/common/routes/routes.php index 342b7861c..a2a7cb58c 100644 --- a/blog/config/common/routes/routes.php +++ b/blog/config/common/routes/routes.php @@ -176,6 +176,6 @@ Route::get('/openapi.json') ->middleware(FormatDataResponseAsJson::class) ->middleware(CorsAllowAll::class) - ->action([SwaggerJson::class, 'handle']), + ->action([SwaggerJson::class, 'process']), ), ]; diff --git a/blog/src/Controller/Actions/ApiInfo.php b/blog/src/Controller/Actions/ApiInfo.php index dc83f1c06..152c92fec 100644 --- a/blog/src/Controller/Actions/ApiInfo.php +++ b/blog/src/Controller/Actions/ApiInfo.php @@ -4,16 +4,14 @@ namespace App\Controller\Actions; -use OpenApi\Annotations as OA; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use Yiisoft\DataResponse\DataResponseFactoryInterface; +use OpenApi\Attributes as OA; -/** - * @OA\Info(title="Yii demo API", version="2.0") - */ +#[OA\Info(version: "2.0", title: "Yii demo API")] final class ApiInfo implements MiddlewareInterface { private DataResponseFactoryInterface $responseFactory; @@ -23,13 +21,28 @@ public function __construct(DataResponseFactoryInterface $responseFactory) $this->responseFactory = $responseFactory; } - /** - * @OA\Get( - * path="/api/info/v2", - * - * @OA\Response(response="200", description="Get api version") - * ) - */ + #[OA\Get( + path: "/api/info/v2", + description: "", + summary: "Returns info about the API", + responses: [ + new OA\Response( + response:"200", + description:"Success", + content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property(property: "data", properties: [ + new OA\Property(property: "version", type: "string", example: "2.0"), + new OA\Property(property: "author", type: "string", example: "yiisoft"), + ], type: "object"), + ]), + ] + ), + ), + ] + )] public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { return $this->responseFactory->createResponse(['version' => '2.0', 'author' => 'yiisoft']); diff --git a/blog/src/Middleware/ApiDataWrapper.php b/blog/src/Middleware/ApiDataWrapper.php index 70803cb63..aca7686b5 100644 --- a/blog/src/Middleware/ApiDataWrapper.php +++ b/blog/src/Middleware/ApiDataWrapper.php @@ -9,7 +9,16 @@ use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use Yiisoft\DataResponse\DataResponse; +use OpenApi\Attributes as OA; +#[OA\Schema( + schema: "Response", + properties: [ + new OA\Property(property: "status", type: "string", enum: ["success", "failed"]), + new OA\Property(property: "error", type:"object", nullable: true), + new OA\Property(property: "data", type: "object", nullable: true), + ] +)] final class ApiDataWrapper implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface diff --git a/blog/src/User/Controller/ApiUserController.php b/blog/src/User/Controller/ApiUserController.php index 9f0c4e55f..173d5dd75 100644 --- a/blog/src/User/Controller/ApiUserController.php +++ b/blog/src/User/Controller/ApiUserController.php @@ -6,32 +6,46 @@ use App\User\User; use App\User\UserRepository; -use OpenApi\Annotations as OA; use Psr\Http\Message\ResponseInterface; use Yiisoft\Data\Reader\Sort; use Yiisoft\DataResponse\DataResponseFactoryInterface; use Yiisoft\Router\CurrentRoute; +use OpenApi\Attributes as OA; -/** - * @OA\Tag( - * name="user", - * description="User" - * ) - */ +#[OA\Tag(name: "user", description: "User")] final class ApiUserController { public function __construct(private DataResponseFactoryInterface $responseFactory) { } - /** - * @OA\Get( - * path="/api/user", - * tags={"user"}, - * - * @OA\Response(response="200", description="Get users list") - * ) - */ + #[OA\Get( + path: "/api/user", + description: "", + summary: "Get users list", + tags: ["user"], + responses: [ + new OA\Response( + response: "200", + description: "Success", + content: new OA\XmlContent( + xml: new OA\Xml(name: "response"), + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property( + property: "data", + type: "array", + items: new OA\Items(properties: [ + new OA\Property(property: "login", type: "string", example: "exampleLogin"), + new OA\Property(property: "created_at", type: "string", example: "13.12.2020 00:04:20"), + ]) + ), + ]), + ]) + ), + ] + )] public function index(UserRepository $userRepository): ResponseInterface { $dataReader = $userRepository @@ -49,22 +63,32 @@ public function index(UserRepository $userRepository): ResponseInterface return $this->responseFactory->createResponse($items); } - /** - * @OA\Get( - * path="/api/user/{login}", - * tags={"user"}, - * - * @OA\Parameter( - * - * @OA\Schema(type="string"), - * in="path", - * name="login", - * parameter="login" - * ), - * - * @OA\Response(response="200", description="Get user info") - * ) - */ + #[OA\Get( + path: "/api/user/{login}", + description: "", + summary: "Get user info", + tags: ["user"], + parameters: [ + new OA\Parameter(parameter: "login", name: "Login", in: "path") + ], + responses: [ + new OA\Response( + response: "200", + description: "Success", + content: new OA\JsonContent( + allOf: [ + new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(properties: [ + new OA\Property(property: "data", properties: [ + new OA\Property(property: "login", type: "string", example: "exampleLogin"), + new OA\Property(property: "created_at", type: "string", example: "13.12.2020 00:04:20"), + ], type: "object"), + ]), + ] + ), + ), + ] + )] public function profile(UserRepository $userRepository, CurrentRoute $currentRoute): ResponseInterface { $login = $currentRoute->getArgument('login'); From 4c95d5facef9a32a3c757d93c371f57783dd6b4e Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Wed, 21 Feb 2024 09:57:05 +0000 Subject: [PATCH 40/58] Apply fixes from StyleCI --- blog-api/src/Auth/AuthController.php | 56 ++++----- blog-api/src/Auth/AuthRequest.php | 9 +- blog-api/src/Blog/BlogController.php | 112 +++++++++--------- blog-api/src/Blog/EditPostRequest.php | 11 +- blog-api/src/Blog/PostFormatter.php | 11 +- blog-api/src/Dto/ApiResponseData.php | 36 +++--- blog-api/src/Formatter/PaginatorFormatter.php | 11 +- blog-api/src/InfoController.php | 22 ++-- blog-api/src/User/UserController.php | 58 ++++----- blog-api/src/User/UserFormatter.php | 9 +- blog/src/Controller/Actions/ApiInfo.php | 22 ++-- blog/src/Middleware/ApiDataWrapper.php | 8 +- .../src/User/Controller/ApiUserController.php | 53 +++++---- 13 files changed, 217 insertions(+), 201 deletions(-) diff --git a/blog-api/src/Auth/AuthController.php b/blog-api/src/Auth/AuthController.php index 49855de45..de3a7924b 100644 --- a/blog-api/src/Auth/AuthController.php +++ b/blog-api/src/Auth/AuthController.php @@ -10,8 +10,8 @@ use Psr\Http\Message\ResponseInterface; use Yiisoft\DataResponse\DataResponseFactoryInterface as ResponseFactory; -#[OA\Tag(name: "auth", description: "Authentication")] -#[OA\SecurityScheme(securityScheme: "ApiKey", type: "apiKey", name: "X-Api-Key", in: "header")] +#[OA\Tag(name: 'auth', description: 'Authentication')] +#[OA\SecurityScheme(securityScheme: 'ApiKey', type: 'apiKey', name: 'X-Api-Key', in: 'header')] final class AuthController { private ResponseFactory $responseFactory; @@ -26,36 +26,38 @@ public function __construct( } #[OA\Post( - path: "/auth/", - description: "", - summary: "Authenticate by params", + path: '/auth/', + description: '', + summary: 'Authenticate by params', requestBody: new OA\RequestBody(required: true, content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/AuthRequest"), + new OA\Schema(ref: '#/components/schemas/AuthRequest'), ] )), - tags: ["auth"], + tags: ['auth'], responses: [ new OA\Response( - response: "200", - description: "Success", + response: '200', + description: 'Success', content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ new OA\Property( - property: "data", + property: 'data', properties: [ - new OA\Property(property: "token", type: "string", example: "uap4X5Bd7078lxIFvxAflcGAa5D95iSSZkNjg3XFrE2EBRBlbj") + new OA\Property(property: 'token', type: 'string', example: 'uap4X5Bd7078lxIFvxAflcGAa5D95iSSZkNjg3XFrE2EBRBlbj'), ], - type: "object"), + type: 'object' + ), ]), - ]) + ] + ) ), new OA\Response( - response: "400", - description: "Bad request", - content: new OA\JsonContent(ref: "#/components/schemas/BadResponse") + response: '400', + description: 'Bad request', + content: new OA\JsonContent(ref: '#/components/schemas/BadResponse') ), ] )] @@ -74,21 +76,21 @@ public function login(AuthRequest $request): ResponseInterface } #[OA\Post( - path: "/logout/", - description: "", - summary: "Logout", + path: '/logout/', + description: '', + summary: 'Logout', security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], - tags: ["auth"], + tags: ['auth'], responses: [ new OA\Response( - response: "200", - description: "Success", - content: new OA\JsonContent(ref: "#/components/schemas/Response") + response: '200', + description: 'Success', + content: new OA\JsonContent(ref: '#/components/schemas/Response') ), new OA\Response( - response: "400", - description: "Bad request", - content: new OA\JsonContent(ref: "#/components/schemas/BadResponse") + response: '400', + description: 'Bad request', + content: new OA\JsonContent(ref: '#/components/schemas/BadResponse') ), ] )] diff --git a/blog-api/src/Auth/AuthRequest.php b/blog-api/src/Auth/AuthRequest.php index a616cee20..d72bdfbb9 100644 --- a/blog-api/src/Auth/AuthRequest.php +++ b/blog-api/src/Auth/AuthRequest.php @@ -11,11 +11,12 @@ use OpenApi\Attributes as OA; #[OA\Schema( - schema: "AuthRequest", + schema: 'AuthRequest', properties: [ - new OA\Property(property: 'login', type: "string", example: 'Opal1144'), - new OA\Property(property: 'password', type: "string", example: 'Opal1144'), - ])] + new OA\Property(property: 'login', type: 'string', example: 'Opal1144'), + new OA\Property(property: 'password', type: 'string', example: 'Opal1144'), + ] +)] final class AuthRequest implements RequestInputInterface, RulesProviderInterface { #[Body('login')] diff --git a/blog-api/src/Blog/BlogController.php b/blog-api/src/Blog/BlogController.php index e9f7cbc62..88e051b78 100644 --- a/blog-api/src/Blog/BlogController.php +++ b/blog-api/src/Blog/BlogController.php @@ -12,8 +12,8 @@ use Yiisoft\Input\Http\Attribute\Parameter\Query; use Yiisoft\Router\HydratorAttribute\RouteArgument; -#[OA\Tag(name: "blog", description: "Blog")] -#[OA\Parameter(parameter: "PageRequest", name: "page", in: "query", schema: new OA\Schema(type: "int", example: "2"))] +#[OA\Tag(name: 'blog', description: 'Blog')] +#[OA\Parameter(parameter: 'PageRequest', name: 'page', in: 'query', schema: new OA\Schema(type: 'int', example: '2'))] final class BlogController { private DataResponseFactoryInterface $responseFactory; @@ -37,27 +37,29 @@ public function __construct( } #[OA\Get( - path: "/blog/", - description: "", - summary: "Returns paginated blog posts", - tags: ["blog"], + path: '/blog/', + description: '', + summary: 'Returns paginated blog posts', + tags: ['blog'], parameters: [ - new OA\Parameter(ref: '#/components/parameters/PageRequest') + new OA\Parameter(ref: '#/components/parameters/PageRequest'), ], responses: [ new OA\Response( - response:"200", - description:"Success", + response:'200', + description:'Success', content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ new OA\Property( - property: "data", + property: 'data', properties: [ - new OA\Property(property: "posts", type: "array", items: new OA\Items(ref:"#/components/schemas/Post")), - new OA\Property(property: "paginator", ref: "#/components/schemas/Paginator", type: "object"), - ], type: "object"), + new OA\Property(property: 'posts', type: 'array', items: new OA\Items(ref:'#/components/schemas/Post')), + new OA\Property(property: 'paginator', ref: '#/components/schemas/Paginator', type: 'object'), + ], + type: 'object' + ), ]), ] ), @@ -81,39 +83,41 @@ public function index(PaginatorFormatter $paginatorFormatter, #[Query('page')] i } #[OA\Get( - path: "/blog/{id}", - description: "", - summary: "Returns a post with a given ID", - tags: ["blog"], + path: '/blog/{id}', + description: '', + summary: 'Returns a post with a given ID', + tags: ['blog'], parameters: [ - new OA\Parameter(parameter: "id", name: "id", in: "path", schema: new OA\Schema(type: "int", example: "2")) + new OA\Parameter(parameter: 'id', name: 'id', in: 'path', schema: new OA\Schema(type: 'int', example: '2')), ], responses: [ new OA\Response( - response:"200", - description:"Success", + response:'200', + description:'Success', content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ new OA\Property( - property: "data", + property: 'data', properties: [ - new OA\Property(property: "post", ref: "#/components/schemas/Post", type: "object") - ], type: "object"), + new OA\Property(property: 'post', ref: '#/components/schemas/Post', type: 'object'), + ], + type: 'object' + ), ]), ] ), ), new OA\Response( - response: "404", - description: "Not found", + response: '404', + description: 'Not found', content: new OA\JsonContent(allOf: [ - new OA\Schema(ref: "#/components/schemas/BadResponse"), + new OA\Schema(ref: '#/components/schemas/BadResponse'), new OA\Schema(properties: [ - new OA\Property(property:"error_message", example:"Entity not found"), - new OA\Property(property: "error_code", example: 404, nullable: true) - ]) + new OA\Property(property:'error_message', example:'Entity not found'), + new OA\Property(property: 'error_code', example: 404, nullable: true), + ]), ]) ), ] @@ -130,26 +134,26 @@ public function view(#[RouteArgument('id')] int $id): Response } #[OA\Post( - path: "/blog/", - description: "", - summary: "Creates a blog post", + path: '/blog/', + description: '', + summary: 'Creates a blog post', security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], requestBody: new OA\RequestBody(required: true, content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/EditPostRequest"), + new OA\Schema(ref: '#/components/schemas/EditPostRequest'), ] )), - tags: ["blog"], + tags: ['blog'], responses: [ new OA\Response( - response: "200", - description: "Success", - content: new OA\JsonContent(ref: "#/components/schemas/Response") + response: '200', + description: 'Success', + content: new OA\JsonContent(ref: '#/components/schemas/Response') ), new OA\Response( - response: "400", - description: "Bad request", - content: new OA\JsonContent(ref: "#/components/schemas/BadResponse") + response: '400', + description: 'Bad request', + content: new OA\JsonContent(ref: '#/components/schemas/BadResponse') ), ] )] @@ -164,29 +168,29 @@ public function create(EditPostRequest $postRequest, UserRequest $userRequest): } #[OA\Put( - path: "/blog/{id}", - description: "", - summary: "Updates a blog post with a given ID", + path: '/blog/{id}', + description: '', + summary: 'Updates a blog post with a given ID', security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], requestBody: new OA\RequestBody(required: true, content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/EditPostRequest"), + new OA\Schema(ref: '#/components/schemas/EditPostRequest'), ] )), - tags: ["blog"], + tags: ['blog'], parameters: [ - new OA\Parameter(parameter: "id", name: "id", in: "path", schema: new OA\Schema(type: "int", example: "2")) + new OA\Parameter(parameter: 'id', name: 'id', in: 'path', schema: new OA\Schema(type: 'int', example: '2')), ], responses: [ new OA\Response( - response: "200", - description: "Success", - content: new OA\JsonContent(ref: "#/components/schemas/Response") + response: '200', + description: 'Success', + content: new OA\JsonContent(ref: '#/components/schemas/Response') ), new OA\Response( - response: "400", - description: "Bad request", - content: new OA\JsonContent(ref: "#/components/schemas/BadResponse") + response: '400', + description: 'Bad request', + content: new OA\JsonContent(ref: '#/components/schemas/BadResponse') ), ] )] diff --git a/blog-api/src/Blog/EditPostRequest.php b/blog-api/src/Blog/EditPostRequest.php index b94875369..f7f24838a 100644 --- a/blog-api/src/Blog/EditPostRequest.php +++ b/blog-api/src/Blog/EditPostRequest.php @@ -15,12 +15,13 @@ use OpenApi\Attributes as OA; #[OA\Schema( - schema: "EditPostRequest", + schema: 'EditPostRequest', properties: [ - new OA\Property(property: 'title', type: "string", example: 'Title post'), - new OA\Property(property: 'text', type: "string", example: 'Text post'), - new OA\Property(property: 'status', type: "int", example: '1'), - ])] + new OA\Property(property: 'title', type: 'string', example: 'Title post'), + new OA\Property(property: 'text', type: 'string', example: 'Text post'), + new OA\Property(property: 'status', type: 'int', example: '1'), + ] +)] final class EditPostRequest extends AbstractInput implements RulesProviderInterface { #[RouteArgument('id')] diff --git a/blog-api/src/Blog/PostFormatter.php b/blog-api/src/Blog/PostFormatter.php index b5538208a..db8d1bfec 100644 --- a/blog-api/src/Blog/PostFormatter.php +++ b/blog-api/src/Blog/PostFormatter.php @@ -7,12 +7,13 @@ use OpenApi\Attributes as OA; #[OA\Schema( - schema: "Post", + schema: 'Post', properties: [ - new OA\Property(property: 'id', type: "int", example: '100'), - new OA\Property(property: 'title', type: "string", example: 'Title'), - new OA\Property(property: 'content', type: "string", example: 'Text'), - ])] + new OA\Property(property: 'id', type: 'int', example: '100'), + new OA\Property(property: 'title', type: 'string', example: 'Title'), + new OA\Property(property: 'content', type: 'string', example: 'Text'), + ] +)] final class PostFormatter { public function format(Post $post): array diff --git a/blog-api/src/Dto/ApiResponseData.php b/blog-api/src/Dto/ApiResponseData.php index 92b777e3d..114e934e6 100644 --- a/blog-api/src/Dto/ApiResponseData.php +++ b/blog-api/src/Dto/ApiResponseData.php @@ -7,48 +7,48 @@ use OpenApi\Attributes as OA; #[OA\Schema( - schema: "Response" + schema: 'Response' )] #[OA\Schema( - schema: "BadResponse", + schema: 'BadResponse', allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ - new OA\Property(property: "status", example: "failed"), - new OA\Property(property: "error_message", example: "Error description message"), - new OA\Property(property: "error_code", example: "400", nullable: true), - new OA\Property(property: "data", example: null), - ]) + new OA\Property(property: 'status', example: 'failed'), + new OA\Property(property: 'error_message', example: 'Error description message'), + new OA\Property(property: 'error_code', example: '400', nullable: true), + new OA\Property(property: 'data', example: null), + ]), ] )] final class ApiResponseData { #[OA\Property( - property: "status", - format: "string", + property: 'status', + format: 'string', enum: ['success', 'failed'], - example: "success" + example: 'success' )] private string $status = ''; #[OA\Property( - property: "error_message", - format: "string", - example: "" + property: 'error_message', + format: 'string', + example: '' )] private string $errorMessage = ''; #[OA\Property( - property: "error_code", - format: "integer", + property: 'error_code', + format: 'integer', example: null, nullable: true )] private ?int $errorCode = null; #[OA\Property( - property: "data", - type: "object", + property: 'data', + type: 'object', nullable: true )] private ?array $data = null; diff --git a/blog-api/src/Formatter/PaginatorFormatter.php b/blog-api/src/Formatter/PaginatorFormatter.php index ca9ffa31c..88266c183 100644 --- a/blog-api/src/Formatter/PaginatorFormatter.php +++ b/blog-api/src/Formatter/PaginatorFormatter.php @@ -8,12 +8,13 @@ use Yiisoft\Data\Paginator\OffsetPaginator; #[OA\Schema( - schema: "Paginator", + schema: 'Paginator', properties: [ - new OA\Property(property: 'pageSize', type: "int", example: '10'), - new OA\Property(property: 'currentPage', type: "int", example: '1'), - new OA\Property(property: 'totalPages', type: "int", example: '3'), - ])] + new OA\Property(property: 'pageSize', type: 'int', example: '10'), + new OA\Property(property: 'currentPage', type: 'int', example: '1'), + new OA\Property(property: 'totalPages', type: 'int', example: '3'), + ] +)] final class PaginatorFormatter { public function format(OffsetPaginator $paginator): array diff --git a/blog-api/src/InfoController.php b/blog-api/src/InfoController.php index c8c4ee275..5dbe11ff4 100644 --- a/blog-api/src/InfoController.php +++ b/blog-api/src/InfoController.php @@ -8,7 +8,7 @@ use Psr\Http\Message\ResponseInterface; use Yiisoft\DataResponse\DataResponseFactoryInterface; -#[OA\Info(version: "1.0", title: "Yii API application")] +#[OA\Info(version: '1.0', title: 'Yii API application')] class InfoController { public function __construct(private VersionProvider $versionProvider) @@ -16,21 +16,21 @@ public function __construct(private VersionProvider $versionProvider) } #[OA\Get( - path: "/", - description: "", - summary: "Returns info about the API", + path: '/', + description: '', + summary: 'Returns info about the API', responses: [ new OA\Response( - response:"200", - description:"Success", + response:'200', + description:'Success', content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ - new OA\Property(property: "data", properties: [ - new OA\Property(property: "version", type: "string", example: "3.0"), - new OA\Property(property: "author", type: "string", example: "yiisoft"), - ], type: "object"), + new OA\Property(property: 'data', properties: [ + new OA\Property(property: 'version', type: 'string', example: '3.0'), + new OA\Property(property: 'author', type: 'string', example: 'yiisoft'), + ], type: 'object'), ]), ] ), diff --git a/blog-api/src/User/UserController.php b/blog-api/src/User/UserController.php index a2ed08b2c..cbb63502c 100644 --- a/blog-api/src/User/UserController.php +++ b/blog-api/src/User/UserController.php @@ -11,7 +11,7 @@ use Yiisoft\DataResponse\DataResponseFactoryInterface; use Yiisoft\Router\HydratorAttribute\RouteArgument; -#[OA\Tag(name: "user", description: "User")] +#[OA\Tag(name: 'user', description: 'User')] final class UserController { use RestControllerTrait; @@ -31,31 +31,33 @@ public function __construct( } #[OA\Get( - path: "/users/", - description: "", - summary: "Returns paginated users", + path: '/users/', + description: '', + summary: 'Returns paginated users', security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], - tags: ["user"], + tags: ['user'], responses: [ new OA\Response( - response: "200", - description: "Success", + response: '200', + description: 'Success', content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ new OA\Property( - property: "data", + property: 'data', properties: [ new OA\Property( - property: "user", - type: "array", - items: new OA\Items(ref: "#/components/schemas/User") - ) + property: 'user', + type: 'array', + items: new OA\Items(ref: '#/components/schemas/User') + ), ], - type: "object"), + type: 'object' + ), ]), - ]) + ] + ) ), ] )] @@ -75,30 +77,32 @@ public function list(): ResponseInterface } #[OA\Get( - path: "/users/{id}", - description: "", - summary: "Returns a user with a given ID", + path: '/users/{id}', + description: '', + summary: 'Returns a user with a given ID', security: [new OA\SecurityScheme(ref: '#/components/securitySchemes/ApiKey')], - tags: ["user"], + tags: ['user'], parameters: [ - new OA\Parameter(parameter: "id", name: "id", in: "path", example: 2) + new OA\Parameter(parameter: 'id', name: 'id', in: 'path', example: 2), ], responses: [ new OA\Response( - response: "200", - description: "Success", + response: '200', + description: 'Success', content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ new OA\Property( - property: "data", + property: 'data', properties: [ - new OA\Property(property: "user", ref: "#/components/schemas/User", type: "object") + new OA\Property(property: 'user', ref: '#/components/schemas/User', type: 'object'), ], - type: "object"), + type: 'object' + ), ]), - ]) + ] + ) ), ] )] diff --git a/blog-api/src/User/UserFormatter.php b/blog-api/src/User/UserFormatter.php index 316e08e00..8a04fe594 100644 --- a/blog-api/src/User/UserFormatter.php +++ b/blog-api/src/User/UserFormatter.php @@ -7,11 +7,12 @@ use OpenApi\Attributes as OA; #[OA\Schema( - schema: "User", + schema: 'User', properties: [ - new OA\Property(property: 'login', type: "string", example: 'UserName'), - new OA\Property(property: 'created_at', type: "string", example: '13.12.2020 00:04:20'), - ])] + new OA\Property(property: 'login', type: 'string', example: 'UserName'), + new OA\Property(property: 'created_at', type: 'string', example: '13.12.2020 00:04:20'), + ] +)] final class UserFormatter { public function format(User $user): array diff --git a/blog/src/Controller/Actions/ApiInfo.php b/blog/src/Controller/Actions/ApiInfo.php index 152c92fec..f4e65c51c 100644 --- a/blog/src/Controller/Actions/ApiInfo.php +++ b/blog/src/Controller/Actions/ApiInfo.php @@ -11,7 +11,7 @@ use Yiisoft\DataResponse\DataResponseFactoryInterface; use OpenApi\Attributes as OA; -#[OA\Info(version: "2.0", title: "Yii demo API")] +#[OA\Info(version: '2.0', title: 'Yii demo API')] final class ApiInfo implements MiddlewareInterface { private DataResponseFactoryInterface $responseFactory; @@ -22,21 +22,21 @@ public function __construct(DataResponseFactoryInterface $responseFactory) } #[OA\Get( - path: "/api/info/v2", - description: "", - summary: "Returns info about the API", + path: '/api/info/v2', + description: '', + summary: 'Returns info about the API', responses: [ new OA\Response( - response:"200", - description:"Success", + response:'200', + description:'Success', content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ - new OA\Property(property: "data", properties: [ - new OA\Property(property: "version", type: "string", example: "2.0"), - new OA\Property(property: "author", type: "string", example: "yiisoft"), - ], type: "object"), + new OA\Property(property: 'data', properties: [ + new OA\Property(property: 'version', type: 'string', example: '2.0'), + new OA\Property(property: 'author', type: 'string', example: 'yiisoft'), + ], type: 'object'), ]), ] ), diff --git a/blog/src/Middleware/ApiDataWrapper.php b/blog/src/Middleware/ApiDataWrapper.php index aca7686b5..89793e308 100644 --- a/blog/src/Middleware/ApiDataWrapper.php +++ b/blog/src/Middleware/ApiDataWrapper.php @@ -12,11 +12,11 @@ use OpenApi\Attributes as OA; #[OA\Schema( - schema: "Response", + schema: 'Response', properties: [ - new OA\Property(property: "status", type: "string", enum: ["success", "failed"]), - new OA\Property(property: "error", type:"object", nullable: true), - new OA\Property(property: "data", type: "object", nullable: true), + new OA\Property(property: 'status', type: 'string', enum: ['success', 'failed']), + new OA\Property(property: 'error', type:'object', nullable: true), + new OA\Property(property: 'data', type: 'object', nullable: true), ] )] final class ApiDataWrapper implements MiddlewareInterface diff --git a/blog/src/User/Controller/ApiUserController.php b/blog/src/User/Controller/ApiUserController.php index 173d5dd75..ce43136da 100644 --- a/blog/src/User/Controller/ApiUserController.php +++ b/blog/src/User/Controller/ApiUserController.php @@ -12,7 +12,7 @@ use Yiisoft\Router\CurrentRoute; use OpenApi\Attributes as OA; -#[OA\Tag(name: "user", description: "User")] +#[OA\Tag(name: 'user', description: 'User')] final class ApiUserController { public function __construct(private DataResponseFactoryInterface $responseFactory) @@ -20,29 +20,30 @@ public function __construct(private DataResponseFactoryInterface $responseFactor } #[OA\Get( - path: "/api/user", - description: "", - summary: "Get users list", - tags: ["user"], + path: '/api/user', + description: '', + summary: 'Get users list', + tags: ['user'], responses: [ new OA\Response( - response: "200", - description: "Success", + response: '200', + description: 'Success', content: new OA\XmlContent( - xml: new OA\Xml(name: "response"), + xml: new OA\Xml(name: 'response'), allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ new OA\Property( - property: "data", - type: "array", + property: 'data', + type: 'array', items: new OA\Items(properties: [ - new OA\Property(property: "login", type: "string", example: "exampleLogin"), - new OA\Property(property: "created_at", type: "string", example: "13.12.2020 00:04:20"), + new OA\Property(property: 'login', type: 'string', example: 'exampleLogin'), + new OA\Property(property: 'created_at', type: 'string', example: '13.12.2020 00:04:20'), ]) ), ]), - ]) + ] + ) ), ] )] @@ -64,25 +65,25 @@ public function index(UserRepository $userRepository): ResponseInterface } #[OA\Get( - path: "/api/user/{login}", - description: "", - summary: "Get user info", - tags: ["user"], + path: '/api/user/{login}', + description: '', + summary: 'Get user info', + tags: ['user'], parameters: [ - new OA\Parameter(parameter: "login", name: "Login", in: "path") + new OA\Parameter(parameter: 'login', name: 'Login', in: 'path'), ], responses: [ new OA\Response( - response: "200", - description: "Success", + response: '200', + description: 'Success', content: new OA\JsonContent( allOf: [ - new OA\Schema(ref: "#/components/schemas/Response"), + new OA\Schema(ref: '#/components/schemas/Response'), new OA\Schema(properties: [ - new OA\Property(property: "data", properties: [ - new OA\Property(property: "login", type: "string", example: "exampleLogin"), - new OA\Property(property: "created_at", type: "string", example: "13.12.2020 00:04:20"), - ], type: "object"), + new OA\Property(property: 'data', properties: [ + new OA\Property(property: 'login', type: 'string', example: 'exampleLogin'), + new OA\Property(property: 'created_at', type: 'string', example: '13.12.2020 00:04:20'), + ], type: 'object'), ]), ] ), From ad70ef52c92e2653bbe14143c69a378d3e8cf4c7 Mon Sep 17 00:00:00 2001 From: pamparam83 Date: Fri, 23 Feb 2024 21:15:59 +0300 Subject: [PATCH 41/58] Blog (#611) * fix console * fix comment, auth * fix signup * fix blog --- blog/README.md | 25 +++++++++++++------ .../views/blog/comments/_comments.php | 2 +- blog/src/Auth/Controller/AuthController.php | 14 ++++------- blog/src/Auth/Controller/SignupController.php | 6 ++--- blog/src/Auth/Form/SignupForm.php | 16 +++++------- blog/src/Blog/BlogController.php | 2 +- blog/src/Blog/Comment/CommentRepository.php | 15 ++++++++++- blog/src/Blog/CommentController.php | 24 +++++++++++++++--- blog/src/Blog/Post/PostController.php | 12 ++++----- blog/src/User/Console/CreateCommand.php | 25 ++++++++++--------- blog/tests/Cli/ConsoleCest.php | 6 +++++ 11 files changed, 91 insertions(+), 56 deletions(-) diff --git a/blog/README.md b/blog/README.md index 3475e92a2..e646d9973 100644 --- a/blog/README.md +++ b/blog/README.md @@ -22,13 +22,21 @@ It's intended to show and test all Yii features. You'll need at least PHP 8.1. 1. Clone this repository. -2. Run `composer install` in your project root directory. +2. Run command in your project root directory. +```bash +composer install +``` 3. Run `./yii serve` (on Windows `yii serve`). The application will be started on http://localhost:8080/. +```bash +./yii serve +``` 4. Go to the index page. Cycle ORM will create tables, indexes and relations automatically in the configured DB for you. If you want to disable this behavior then comment out the line with the `Generator\SyncTables::class` in the `config/packges/yiisoft/yii-cycle/params.php`. In this case you should create migrations to sync changes that you have made to entities with the DB. -5. Run `./yii fixture/add 20` to create some random data. - +5. Run command to create some random data. +```bash +./yii fixture/add 20 +``` ## Console Console works out of the box and could be executed with `./yii`. @@ -36,16 +44,19 @@ Console works out of the box and could be executed with `./yii`. Some commands: ```bash -user/create -fixture/add [count] +./yii user/create login password +./yii fixture/add 10 ``` In order to register your own commands, add them to `console/params.php`, `console` → `commands` section. ## Web application -In order to run the web application, you can either use the built-in web server by running `./yii serve` or you could use a -real web server by pointing it to `/public/index.php`. +In order to run the web application, you can either use the built-in web server by running +```bash +./yii serve +``` + or you could use a real web server by pointing it to `/public/index.php`. More routes could be added by editing `src/Factory/AppRouterFactory`. diff --git a/blog/resources/views/blog/comments/_comments.php b/blog/resources/views/blog/comments/_comments.php index c9db5fcf1..336e2e472 100644 --- a/blog/resources/views/blog/comments/_comments.php +++ b/blog/resources/views/blog/comments/_comments.php @@ -33,7 +33,7 @@
    diff --git a/blog/src/Auth/Controller/AuthController.php b/blog/src/Auth/Controller/AuthController.php index 446f81b5e..c23af3543 100644 --- a/blog/src/Auth/Controller/AuthController.php +++ b/blog/src/Auth/Controller/AuthController.php @@ -19,9 +19,9 @@ final class AuthController { public function __construct( - private AuthService $authService, - private WebControllerService $webService, - private ViewRenderer $viewRenderer, + private readonly AuthService $authService, + private readonly WebControllerService $webService, + private ViewRenderer $viewRenderer, ) { $this->viewRenderer = $viewRenderer->withControllerName('auth'); } @@ -36,14 +36,9 @@ public function login( return $this->redirectToMain(); } - $body = $request->getParsedBody(); $loginForm = new LoginForm($this->authService, $translator); - if ( - $request->getMethod() === Method::POST - && $formHydrator->populate($loginForm, $body) - && $loginForm->isValid() - ) { + if ($formHydrator->populateFromPostAndValidate($loginForm, $request)) { $identity = $this->authService->getIdentity(); if ($identity instanceof CookieLoginIdentityInterface && $loginForm->getPropertyValue('rememberMe')) { @@ -56,6 +51,7 @@ public function login( return $this->viewRenderer->render('login', ['formModel' => $loginForm]); } + public function logout(): ResponseInterface { $this->authService->logout(); diff --git a/blog/src/Auth/Controller/SignupController.php b/blog/src/Auth/Controller/SignupController.php index e490def90..2b9754880 100644 --- a/blog/src/Auth/Controller/SignupController.php +++ b/blog/src/Auth/Controller/SignupController.php @@ -30,10 +30,8 @@ public function signup( return $this->redirectToMain(); } - if ($request->getMethod() === Method::POST - && $formHydrator->populate($signupForm, $request->getParsedBody()) - && $signupForm->signup() - ) { + if ($formHydrator->populateFromPostAndValidate($signupForm, $request)) { + $signupForm->signup(); return $this->redirectToMain(); } diff --git a/blog/src/Auth/Form/SignupForm.php b/blog/src/Auth/Form/SignupForm.php index d8e53c5f3..1d4b9aed5 100644 --- a/blog/src/Auth/Form/SignupForm.php +++ b/blog/src/Auth/Form/SignupForm.php @@ -21,8 +21,8 @@ final class SignupForm extends FormModel implements RulesProviderInterface private string $passwordVerify = ''; public function __construct( - private TranslatorInterface $translator, - private UserRepository $userRepository, + private readonly TranslatorInterface $translator, + private readonly UserRepository $userRepository, ) { } @@ -50,16 +50,12 @@ public function getPassword(): string return $this->password; } - public function signup(): false|User + public function signup(): User { - if ($this->isValid()) { - $user = new User($this->getLogin(), $this->getPassword()); - $this->userRepository->save($user); + $user = new User($this->getLogin(), $this->getPassword()); + $this->userRepository->save($user); + return $user; - return $user; - } - - return false; } public function getRules(): array diff --git a/blog/src/Blog/BlogController.php b/blog/src/Blog/BlogController.php index 3030aae8d..cdd5b0923 100644 --- a/blog/src/Blog/BlogController.php +++ b/blog/src/Blog/BlogController.php @@ -36,7 +36,7 @@ public function index( $dataReader = $postRepository->findAllPreloaded(); $paginator = (new OffsetPaginator($dataReader)) ->withPageSize(self::POSTS_PER_PAGE) - ->withCurrentPage($pageNum); + ->withCurrentPage((int)$pageNum); $data = [ 'paginator' => $paginator, diff --git a/blog/src/Blog/Comment/CommentRepository.php b/blog/src/Blog/Comment/CommentRepository.php index 6318fdd2d..f7a817ca9 100644 --- a/blog/src/Blog/Comment/CommentRepository.php +++ b/blog/src/Blog/Comment/CommentRepository.php @@ -9,9 +9,14 @@ use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Reader\Sort; use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; +use Yiisoft\Yii\Cycle\Data\Writer\EntityWriter; final class CommentRepository extends Select\Repository { + public function __construct( Select $select) + { + parent::__construct($select); + } /** * @psalm-return DataReaderInterface */ @@ -21,8 +26,16 @@ public function getReader(): DataReaderInterface ->withSort($this->getSort()); } - private function getSort(): Sort + public function getSort(): Sort { return Sort::only(['id', 'public', 'created_at', 'post_id', 'user_id'])->withOrder(['id' => 'asc']); } + + public function findAll(array $scope = [], array $orderBy = []): DataReaderInterface + { + return new EntityReader($this + ->select() + ->where($scope) + ->orderBy($orderBy)); + } } diff --git a/blog/src/Blog/CommentController.php b/blog/src/Blog/CommentController.php index c4de61c73..431027e3c 100644 --- a/blog/src/Blog/CommentController.php +++ b/blog/src/Blog/CommentController.php @@ -4,14 +4,19 @@ namespace App\Blog; +use App\Blog\Comment\CommentRepository; use App\Blog\Comment\CommentService; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Yiisoft\Data\Paginator\OffsetPaginator; +use Yiisoft\Data\Paginator\PageToken; +use Yiisoft\Input\Http\Attribute\Parameter\Query; use Yiisoft\Router\HydratorAttribute\RouteArgument; use Yiisoft\Yii\View\ViewRenderer; final class CommentController { + private const COMMENTS_FEED_PER_PAGE = 10; private ViewRenderer $viewRenderer; public function __construct(ViewRenderer $viewRenderer) @@ -19,12 +24,23 @@ public function __construct(ViewRenderer $viewRenderer) $this->viewRenderer = $viewRenderer->withControllerName('blog/comments'); } - public function index(Request $request, CommentService $service, #[RouteArgument('next')] ?string $next): Response + public function index(Request $request, CommentRepository $repository, + #[Query('sort')] ?string $sortOrder = null, + #[RouteArgument('page')] int $page = 1, + #[RouteArgument('pagesize')] int $pageSize = null, + ): Response { - $paginator = $service->getFeedPaginator(); - if ($next !== null) { - $paginator = $paginator->withNextPageToken($next); + $dataReader = $repository + ->findAll() + ->withSort($repository->getSort() + ->withOrderString($sortOrder ?? 'id')); + + if ($pageSize === null) { + $pageSize = (int) ($body['pageSize'] ?? self::COMMENTS_FEED_PER_PAGE); } + $paginator = (new OffsetPaginator($dataReader)); + $paginator = $paginator->withToken(PageToken::next((string) $page))->withPageSize($pageSize); + if ($this->isAjaxRequest($request)) { return $this->viewRenderer->renderPartial('_comments', ['data' => $paginator]); diff --git a/blog/src/Blog/Post/PostController.php b/blog/src/Blog/Post/PostController.php index c711b44fa..adeed9bf0 100644 --- a/blog/src/Blog/Post/PostController.php +++ b/blog/src/Blog/Post/PostController.php @@ -49,7 +49,7 @@ public function add(Request $request, FormHydrator $formHydrator): Response if ($request->getMethod() === Method::POST) { $form = new PostForm(); - if ($formHydrator->populate($form, $parameters['body']) && $form->isValid()) { + if ($formHydrator->populateAndValidate($form, $parameters['body'])) { $this->postService->savePost($this->userService->getUser(), new Post(), $form); return $this->webService->getRedirectResponse('blog/index'); @@ -65,7 +65,8 @@ public function edit( Request $request, PostRepository $postRepository, ValidatorInterface $validator, - CurrentRoute $currentRoute + CurrentRoute $currentRoute, + FormHydrator $formHydrator ): Response { $slug = $currentRoute->getArgument('slug'); $post = $postRepository->fullPostPage($slug); @@ -87,16 +88,13 @@ public function edit( if ($request->getMethod() === Method::POST) { $form = new PostForm(); $body = $request->getParsedBody(); - if ($form->load($body) && $validator - ->validate($form) - ->isValid()) { + if ($formHydrator->populateAndValidate($form,$body)) { $this->postService->savePost($this->userService->getUser(), $post, $form); - return $this->webService->getRedirectResponse('blog/index'); } $parameters['body'] = $body; - $parameters['errors'] = $form->getFormErrors(); + $parameters['errors'] = $form->getValidationResult()->getErrorMessagesIndexedByAttribute(); } return $this->viewRenderer->render('__form', $parameters); diff --git a/blog/src/User/Console/CreateCommand.php b/blog/src/User/Console/CreateCommand.php index f712327dd..8e2bfd652 100644 --- a/blog/src/User/Console/CreateCommand.php +++ b/blog/src/User/Console/CreateCommand.php @@ -12,6 +12,7 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; use Throwable; +use Yiisoft\FormModel\FormHydrator; use Yiisoft\Rbac\Manager; use Yiisoft\Yii\Console\ExitCode; @@ -19,7 +20,11 @@ final class CreateCommand extends Command { protected static $defaultName = 'user/create'; - public function __construct(private SignupForm $signupForm, private Manager $manager) + public function __construct( + private readonly SignupForm $signupForm, + private readonly Manager $manager, + private readonly FormHydrator $formHydrator + ) { parent::__construct(); } @@ -41,25 +46,21 @@ protected function execute(InputInterface $input, OutputInterface $output): int $login = (string) $input->getArgument('login'); $password = (string) $input->getArgument('password'); $isAdmin = (bool) $input->getArgument('isAdmin'); - - $this->signupForm->load([ - 'login' => $login, - 'password' => $password, - 'passwordVerify' => $password, - ], ''); - try { + $this->formHydrator->populate(model: $this->signupForm, data: [ + 'login' => $login, + 'password' => $password, + 'passwordVerify' => $password, + ], scope: ''); $user = $this->signupForm->signup(); } catch (Throwable $t) { $io->error($t->getMessage() . ' ' . $t->getFile() . ' ' . $t->getLine()); - return $t->getCode() ?: ExitCode::UNSPECIFIED_ERROR; } if ($user === false) { - $errors = $this->signupForm->getFormErrors()->getFirstErrors(); - array_walk($errors, fn ($error, $attribute) => $io->error("$attribute: $error")); - + $errors = $this->signupForm->getValidationResult()?->getErrorMessagesIndexedByAttribute(); + array_walk($errors, fn($error, $attribute) => $io->error("$attribute: " . implode("\n", (array) $error))); return ExitCode::DATAERR; } diff --git a/blog/tests/Cli/ConsoleCest.php b/blog/tests/Cli/ConsoleCest.php index 2949fea78..1bd431209 100644 --- a/blog/tests/Cli/ConsoleCest.php +++ b/blog/tests/Cli/ConsoleCest.php @@ -30,6 +30,12 @@ public function testCommandListCommand(CliTester $I): void $I->seeResultCodeIs(ExitCode::OK); } + public function testCommandUserCreateSuccessCommand(CliTester $I): void + { + $command = dirname(__DIR__, 2) . '/yii'; + $I->runShellCommand($command . ' user/create user create123456'); + $I->seeResultCodeIs(ExitCode::OK); + } /** * Clear all data created with testCommandFixtureAdd(). * Clearing database prevents from getting errors during multiple continuous testing with other test, From 2197e819eb5a2663023537ebd44988855183dd62 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Fri, 23 Feb 2024 18:16:22 +0000 Subject: [PATCH 42/58] Apply fixes from StyleCI --- blog/src/Auth/Controller/AuthController.php | 6 ++---- blog/src/Auth/Controller/SignupController.php | 1 - blog/src/Auth/Form/SignupForm.php | 1 - blog/src/Blog/Comment/CommentRepository.php | 4 ++-- blog/src/Blog/CommentController.php | 14 +++++++------- blog/src/Blog/Post/PostController.php | 2 +- blog/src/User/Console/CreateCommand.php | 7 +++---- blog/tests/Cli/ConsoleCest.php | 1 + 8 files changed, 16 insertions(+), 20 deletions(-) diff --git a/blog/src/Auth/Controller/AuthController.php b/blog/src/Auth/Controller/AuthController.php index c23af3543..325674a14 100644 --- a/blog/src/Auth/Controller/AuthController.php +++ b/blog/src/Auth/Controller/AuthController.php @@ -10,7 +10,6 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Yiisoft\FormModel\FormHydrator; -use Yiisoft\Http\Method; use Yiisoft\Translator\TranslatorInterface; use Yiisoft\User\Login\Cookie\CookieLogin; use Yiisoft\User\Login\Cookie\CookieLoginIdentityInterface; @@ -19,9 +18,9 @@ final class AuthController { public function __construct( - private readonly AuthService $authService, + private readonly AuthService $authService, private readonly WebControllerService $webService, - private ViewRenderer $viewRenderer, + private ViewRenderer $viewRenderer, ) { $this->viewRenderer = $viewRenderer->withControllerName('auth'); } @@ -51,7 +50,6 @@ public function login( return $this->viewRenderer->render('login', ['formModel' => $loginForm]); } - public function logout(): ResponseInterface { $this->authService->logout(); diff --git a/blog/src/Auth/Controller/SignupController.php b/blog/src/Auth/Controller/SignupController.php index 2b9754880..7f3845f5f 100644 --- a/blog/src/Auth/Controller/SignupController.php +++ b/blog/src/Auth/Controller/SignupController.php @@ -10,7 +10,6 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Yiisoft\FormModel\FormHydrator; -use Yiisoft\Http\Method; use Yiisoft\Yii\View\ViewRenderer; final class SignupController diff --git a/blog/src/Auth/Form/SignupForm.php b/blog/src/Auth/Form/SignupForm.php index 1d4b9aed5..dfabcc69e 100644 --- a/blog/src/Auth/Form/SignupForm.php +++ b/blog/src/Auth/Form/SignupForm.php @@ -55,7 +55,6 @@ public function signup(): User $user = new User($this->getLogin(), $this->getPassword()); $this->userRepository->save($user); return $user; - } public function getRules(): array diff --git a/blog/src/Blog/Comment/CommentRepository.php b/blog/src/Blog/Comment/CommentRepository.php index f7a817ca9..a0c9bb795 100644 --- a/blog/src/Blog/Comment/CommentRepository.php +++ b/blog/src/Blog/Comment/CommentRepository.php @@ -9,14 +9,14 @@ use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Reader\Sort; use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; -use Yiisoft\Yii\Cycle\Data\Writer\EntityWriter; final class CommentRepository extends Select\Repository { - public function __construct( Select $select) + public function __construct(Select $select) { parent::__construct($select); } + /** * @psalm-return DataReaderInterface */ diff --git a/blog/src/Blog/CommentController.php b/blog/src/Blog/CommentController.php index 431027e3c..d9cb360de 100644 --- a/blog/src/Blog/CommentController.php +++ b/blog/src/Blog/CommentController.php @@ -5,7 +5,6 @@ namespace App\Blog; use App\Blog\Comment\CommentRepository; -use App\Blog\Comment\CommentService; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Yiisoft\Data\Paginator\OffsetPaginator; @@ -24,12 +23,13 @@ public function __construct(ViewRenderer $viewRenderer) $this->viewRenderer = $viewRenderer->withControllerName('blog/comments'); } - public function index(Request $request, CommentRepository $repository, - #[Query('sort')] ?string $sortOrder = null, - #[RouteArgument('page')] int $page = 1, - #[RouteArgument('pagesize')] int $pageSize = null, - ): Response - { + public function index( + Request $request, + CommentRepository $repository, + #[Query('sort')] ?string $sortOrder = null, + #[RouteArgument('page')] int $page = 1, + #[RouteArgument('pagesize')] int $pageSize = null, + ): Response { $dataReader = $repository ->findAll() ->withSort($repository->getSort() diff --git a/blog/src/Blog/Post/PostController.php b/blog/src/Blog/Post/PostController.php index adeed9bf0..ef42e3e29 100644 --- a/blog/src/Blog/Post/PostController.php +++ b/blog/src/Blog/Post/PostController.php @@ -88,7 +88,7 @@ public function edit( if ($request->getMethod() === Method::POST) { $form = new PostForm(); $body = $request->getParsedBody(); - if ($formHydrator->populateAndValidate($form,$body)) { + if ($formHydrator->populateAndValidate($form, $body)) { $this->postService->savePost($this->userService->getUser(), $post, $form); return $this->webService->getRedirectResponse('blog/index'); } diff --git a/blog/src/User/Console/CreateCommand.php b/blog/src/User/Console/CreateCommand.php index 8e2bfd652..cd03073a4 100644 --- a/blog/src/User/Console/CreateCommand.php +++ b/blog/src/User/Console/CreateCommand.php @@ -21,11 +21,10 @@ final class CreateCommand extends Command protected static $defaultName = 'user/create'; public function __construct( - private readonly SignupForm $signupForm, - private readonly Manager $manager, + private readonly SignupForm $signupForm, + private readonly Manager $manager, private readonly FormHydrator $formHydrator - ) - { + ) { parent::__construct(); } diff --git a/blog/tests/Cli/ConsoleCest.php b/blog/tests/Cli/ConsoleCest.php index 1bd431209..7cf9f997f 100644 --- a/blog/tests/Cli/ConsoleCest.php +++ b/blog/tests/Cli/ConsoleCest.php @@ -36,6 +36,7 @@ public function testCommandUserCreateSuccessCommand(CliTester $I): void $I->runShellCommand($command . ' user/create user create123456'); $I->seeResultCodeIs(ExitCode::OK); } + /** * Clear all data created with testCommandFixtureAdd(). * Clearing database prevents from getting errors during multiple continuous testing with other test, From e97cf4e9463f327e1e14525347f4ced3b20b8139 Mon Sep 17 00:00:00 2001 From: pamparam83 Date: Fri, 23 Feb 2024 21:43:33 +0300 Subject: [PATCH 43/58] fix blogcest (#612) --- blog/src/Blog/CommentController.php | 2 ++ blog/tests/Acceptance/BlogPageCest.php | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/blog/src/Blog/CommentController.php b/blog/src/Blog/CommentController.php index d9cb360de..f2b057381 100644 --- a/blog/src/Blog/CommentController.php +++ b/blog/src/Blog/CommentController.php @@ -9,6 +9,7 @@ use Psr\Http\Message\ServerRequestInterface as Request; use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Data\Paginator\PageToken; +use Yiisoft\Input\Http\Attribute\Parameter\Body; use Yiisoft\Input\Http\Attribute\Parameter\Query; use Yiisoft\Router\HydratorAttribute\RouteArgument; use Yiisoft\Yii\View\ViewRenderer; @@ -26,6 +27,7 @@ public function __construct(ViewRenderer $viewRenderer) public function index( Request $request, CommentRepository $repository, + #[Body] ?array $body, #[Query('sort')] ?string $sortOrder = null, #[RouteArgument('page')] int $page = 1, #[RouteArgument('pagesize')] int $pageSize = null, diff --git a/blog/tests/Acceptance/BlogPageCest.php b/blog/tests/Acceptance/BlogPageCest.php index a70be885e..499354706 100644 --- a/blog/tests/Acceptance/BlogPageCest.php +++ b/blog/tests/Acceptance/BlogPageCest.php @@ -18,6 +18,7 @@ public function testBlogPage(AcceptanceTester $I): void { $I->expectTo('see blog page.'); $I->see('Blog'); - $I->see('No records'); + $I->see('Popular tags'); + $I->see('Archive'); } } From 4443ba54699c98267f524bf5cbfd3ae76df2d93c Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Tue, 26 Mar 2024 23:10:18 +0500 Subject: [PATCH 44/58] Actualize (#613) --- blog-api/composer.json | 9 +++++---- blog-api/config/common/params.php | 2 ++ blog-api/config/web/di/middleware-dispatcher.php | 2 -- blog-api/src/Blog/PostRepository.php | 2 +- blog-api/src/User/UserRepository.php | 2 +- blog/composer.json | 8 +++++--- blog/config/web/di/middleware-dispatcher.php | 2 -- blog/config/web/params.php | 2 ++ blog/src/Auth/IdentityRepository.php | 2 +- blog/src/Blog/Archive/ArchiveRepository.php | 2 +- blog/src/Blog/Comment/CommentRepository.php | 2 +- blog/src/Blog/Post/PostRepository.php | 4 ++-- blog/src/Blog/Tag/TagRepository.php | 2 +- blog/src/Command/Fixture/AddCommand.php | 2 +- blog/src/User/UserRepository.php | 4 ++-- 15 files changed, 25 insertions(+), 22 deletions(-) diff --git a/blog-api/composer.json b/blog-api/composer.json index fdfebab57..9f9335388 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -41,7 +41,8 @@ "yiisoft/cache": "^3.0", "yiisoft/cache-file": "^3.0", "yiisoft/config": "^1.0", - "yiisoft/data": "^1.0", + "yiisoft/data": "dev-master", + "yiisoft/data-cycle": "dev-master", "yiisoft/data-response": "^2.0", "yiisoft/definitions": "^3.0", "yiisoft/di": "^1.0", @@ -49,9 +50,9 @@ "yiisoft/factory": "^1.0", "yiisoft/files": "^2.0", "yiisoft/http": "^1.2", - "yiisoft/hydrator-validator": "^1.0", + "yiisoft/hydrator-validator": "^2.0", "yiisoft/injector": "^1.0", - "yiisoft/input-http": "dev-master", + "yiisoft/input-http": "^1.0", "yiisoft/log": "^2.0", "yiisoft/log-target-file": "^3.0", "yiisoft/middleware-dispatcher": "^5.1", @@ -64,7 +65,7 @@ "yiisoft/user": "^2.0", "yiisoft/validator": "^1.0", "yiisoft/yii-console": "^2.0", - "yiisoft/yii-cycle": "dev-master", + "yiisoft/yii-cycle": "^1.0", "yiisoft/yii-debug": "^3.0@dev", "yiisoft/yii-event": "^2.0", "yiisoft/yii-http": "^1.0", diff --git a/blog-api/config/common/params.php b/blog-api/config/common/params.php index 9b9da652a..98e8d8888 100644 --- a/blog-api/config/common/params.php +++ b/blog-api/config/common/params.php @@ -7,6 +7,7 @@ use Cycle\Database\Config\SQLiteDriverConfig; use Cycle\Schema\Provider\PhpFileSchemaProvider; use Yiisoft\ErrorHandler\Middleware\ErrorCatcher; +use Yiisoft\RequestProvider\RequestCatcherMiddleware; use Yiisoft\Router\Middleware\Router; use Yiisoft\Yii\Cycle\Schema\Conveyor\AttributedSchemaConveyor; use Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider; @@ -25,6 +26,7 @@ ], 'supportEmail' => 'support@example.com', 'middlewares' => [ + RequestCatcherMiddleware::class, ErrorCatcher::class, Subfolder::class, Locale::class, diff --git a/blog-api/config/web/di/middleware-dispatcher.php b/blog-api/config/web/di/middleware-dispatcher.php index c9e2a1599..d60af7bc3 100644 --- a/blog-api/config/web/di/middleware-dispatcher.php +++ b/blog-api/config/web/di/middleware-dispatcher.php @@ -8,7 +8,6 @@ use Yiisoft\Definitions\Reference; use Yiisoft\Input\Http\HydratorAttributeParametersResolver; -use Yiisoft\Input\Http\Request\Catcher\RequestCatcherParametersResolver; use Yiisoft\Input\Http\RequestInputParametersResolver; use Yiisoft\Middleware\Dispatcher\CompositeParametersResolver; use Yiisoft\Middleware\Dispatcher\ParametersResolverInterface; @@ -17,7 +16,6 @@ ParametersResolverInterface::class => [ 'class' => CompositeParametersResolver::class, '__construct()' => [ - Reference::to(RequestCatcherParametersResolver::class), Reference::to(HydratorAttributeParametersResolver::class), Reference::to(RequestInputParametersResolver::class), ], diff --git a/blog-api/src/Blog/PostRepository.php b/blog-api/src/Blog/PostRepository.php index fec64bbf7..c27838be1 100644 --- a/blog-api/src/Blog/PostRepository.php +++ b/blog-api/src/Blog/PostRepository.php @@ -7,7 +7,7 @@ use Cycle\ORM\ORMInterface; use Cycle\ORM\Select; use Cycle\ORM\Transaction; -use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; +use Yiisoft\Data\Cycle\Reader\EntityReader; final class PostRepository extends Select\Repository { diff --git a/blog-api/src/User/UserRepository.php b/blog-api/src/User/UserRepository.php index 590b8665c..acd5d7500 100644 --- a/blog-api/src/User/UserRepository.php +++ b/blog-api/src/User/UserRepository.php @@ -10,8 +10,8 @@ use Yiisoft\Auth\IdentityInterface; use Yiisoft\Auth\IdentityRepositoryInterface; use Yiisoft\Auth\IdentityWithTokenRepositoryInterface; +use Yiisoft\Data\Cycle\Reader\EntityReader; use Yiisoft\Data\Reader\Sort; -use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; final class UserRepository extends Select\Repository implements IdentityWithTokenRepositoryInterface, IdentityRepositoryInterface { diff --git a/blog/composer.json b/blog/composer.json index d2b093c28..b8de8306f 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -44,7 +44,8 @@ "yiisoft/config": "^1.3.1", "yiisoft/cookies": "^1.2", "yiisoft/csrf": "^2.0", - "yiisoft/data": "dev-master as 1.0", + "yiisoft/data": "dev-master", + "yiisoft/data-cycle": "dev-master", "yiisoft/data-response": "^2.0", "yiisoft/definitions": "^3.0", "yiisoft/di": "^1.2", @@ -55,13 +56,14 @@ "yiisoft/html": "^3.0", "yiisoft/http": "^1.2", "yiisoft/injector": "^1.0", - "yiisoft/input-http": "dev-master", + "yiisoft/input-http": "^1.0", "yiisoft/log": "^2.0", "yiisoft/log-target-file": "^3.0", "yiisoft/mailer": "^5.0", "yiisoft/mailer-symfony": "^3.0", "yiisoft/middleware-dispatcher": "^5.2", "yiisoft/rate-limiter": "dev-master", + "yiisoft/request-provider": "^1.0", "yiisoft/rbac": "^1.0", "yiisoft/rbac-php": "^1.0", "yiisoft/rbac-rules-container": "^2.0", @@ -78,7 +80,7 @@ "yiisoft/widget": "^2.1", "yiisoft/yii-bootstrap5": "^3.0@dev", "yiisoft/yii-console": "^2.0", - "yiisoft/yii-cycle": "dev-master", + "yiisoft/yii-cycle": "^1.0", "yiisoft/yii-dataview": "^3.0@dev", "yiisoft/yii-debug": "^3.0@dev", "yiisoft/yii-debug-api": "^3.0@dev", diff --git a/blog/config/web/di/middleware-dispatcher.php b/blog/config/web/di/middleware-dispatcher.php index 7c06f71f2..65962fbe0 100644 --- a/blog/config/web/di/middleware-dispatcher.php +++ b/blog/config/web/di/middleware-dispatcher.php @@ -4,7 +4,6 @@ use Yiisoft\Definitions\Reference; use Yiisoft\Input\Http\HydratorAttributeParametersResolver; -use Yiisoft\Input\Http\Request\Catcher\RequestCatcherParametersResolver; use Yiisoft\Input\Http\RequestInputParametersResolver; use Yiisoft\Middleware\Dispatcher\CompositeParametersResolver; use Yiisoft\Middleware\Dispatcher\ParametersResolverInterface; @@ -17,7 +16,6 @@ ParametersResolverInterface::class => [ 'class' => CompositeParametersResolver::class, '__construct()' => [ - Reference::to(RequestCatcherParametersResolver::class), Reference::to(HydratorAttributeParametersResolver::class), Reference::to(RequestInputParametersResolver::class), ], diff --git a/blog/config/web/params.php b/blog/config/web/params.php index 1cf1bf194..1d07ac92a 100644 --- a/blog/config/web/params.php +++ b/blog/config/web/params.php @@ -4,6 +4,7 @@ use Yiisoft\Cookies\CookieMiddleware; use Yiisoft\ErrorHandler\Middleware\ErrorCatcher; +use Yiisoft\RequestProvider\RequestCatcherMiddleware; use Yiisoft\Router\Middleware\Router; use Yiisoft\Session\SessionMiddleware; use Yiisoft\User\Login\Cookie\CookieLoginMiddleware; @@ -13,6 +14,7 @@ return [ 'middlewares' => [ + RequestCatcherMiddleware::class, ErrorCatcher::class, SentryMiddleware::class, SessionMiddleware::class, diff --git a/blog/src/Auth/IdentityRepository.php b/blog/src/Auth/IdentityRepository.php index 559280c3a..69c9cbcb3 100644 --- a/blog/src/Auth/IdentityRepository.php +++ b/blog/src/Auth/IdentityRepository.php @@ -7,7 +7,7 @@ use Cycle\ORM\Select; use Throwable; use Yiisoft\Auth\IdentityRepositoryInterface; -use Yiisoft\Yii\Cycle\Data\Writer\EntityWriter; +use Yiisoft\Data\Cycle\Writer\EntityWriter; final class IdentityRepository extends Select\Repository implements IdentityRepositoryInterface { diff --git a/blog/src/Blog/Archive/ArchiveRepository.php b/blog/src/Blog/Archive/ArchiveRepository.php index 562693166..9d34829ca 100644 --- a/blog/src/Blog/Archive/ArchiveRepository.php +++ b/blog/src/Blog/Archive/ArchiveRepository.php @@ -15,9 +15,9 @@ use Cycle\ORM\ORMInterface; use Cycle\ORM\Select; use DateTimeImmutable; +use Yiisoft\Data\Cycle\Reader\EntityReader; use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Reader\Sort; -use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; /** * This repository is not associated with Post entity. diff --git a/blog/src/Blog/Comment/CommentRepository.php b/blog/src/Blog/Comment/CommentRepository.php index a0c9bb795..0a3ccdeca 100644 --- a/blog/src/Blog/Comment/CommentRepository.php +++ b/blog/src/Blog/Comment/CommentRepository.php @@ -8,7 +8,7 @@ use Cycle\ORM\Select; use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Reader\Sort; -use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; +use Yiisoft\Data\Cycle\Reader\EntityReader; final class CommentRepository extends Select\Repository { diff --git a/blog/src/Blog/Post/PostRepository.php b/blog/src/Blog/Post/PostRepository.php index f0d002144..0207d7a32 100644 --- a/blog/src/Blog/Post/PostRepository.php +++ b/blog/src/Blog/Post/PostRepository.php @@ -9,10 +9,10 @@ use DateTimeImmutable; use DateTimeInterface; use Throwable; +use Yiisoft\Data\Cycle\Reader\EntityReader; +use Yiisoft\Data\Cycle\Writer\EntityWriter; use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Reader\Sort; -use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; -use Yiisoft\Yii\Cycle\Data\Writer\EntityWriter; final class PostRepository extends Select\Repository { diff --git a/blog/src/Blog/Tag/TagRepository.php b/blog/src/Blog/Tag/TagRepository.php index 10b5227eb..6963efbd9 100644 --- a/blog/src/Blog/Tag/TagRepository.php +++ b/blog/src/Blog/Tag/TagRepository.php @@ -11,9 +11,9 @@ use Cycle\ORM\ORMInterface; use Cycle\ORM\Select; use Cycle\ORM\Select\Repository; +use Yiisoft\Data\Cycle\Reader\EntityReader; use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Reader\Sort; -use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; final class TagRepository extends Repository { diff --git a/blog/src/Command/Fixture/AddCommand.php b/blog/src/Command/Fixture/AddCommand.php index cad64e14f..940f380f6 100644 --- a/blog/src/Command/Fixture/AddCommand.php +++ b/blog/src/Command/Fixture/AddCommand.php @@ -21,9 +21,9 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; use Throwable; +use Yiisoft\Data\Cycle\Writer\EntityWriter; use Yiisoft\Yii\Console\ExitCode; use Yiisoft\Yii\Cycle\Command\CycleDependencyProxy; -use Yiisoft\Yii\Cycle\Data\Writer\EntityWriter; final class AddCommand extends Command { diff --git a/blog/src/User/UserRepository.php b/blog/src/User/UserRepository.php index 9237fb044..00d7a7b2e 100644 --- a/blog/src/User/UserRepository.php +++ b/blog/src/User/UserRepository.php @@ -6,10 +6,10 @@ use Cycle\ORM\Select; use Throwable; +use Yiisoft\Data\Cycle\Reader\EntityReader; +use Yiisoft\Data\Cycle\Writer\EntityWriter; use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Reader\Sort; -use Yiisoft\Yii\Cycle\Data\Reader\EntityReader; -use Yiisoft\Yii\Cycle\Data\Writer\EntityWriter; final class UserRepository extends Select\Repository { From 958ab23dcece52769a2e21c1ebd8583f0846a25c Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Thu, 11 Apr 2024 15:03:45 +0700 Subject: [PATCH 45/58] Fix layout param (#615) --- blog/resources/views/layout/main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/resources/views/layout/main.php b/blog/resources/views/layout/main.php index 9f1bd16d5..34634bc28 100644 --- a/blog/resources/views/layout/main.php +++ b/blog/resources/views/layout/main.php @@ -197,4 +197,4 @@ endPage(true); +$this->endPage(); From 04b93795a8f056e0db76def6cdbfbf642865f984 Mon Sep 17 00:00:00 2001 From: Luiz Marin <67489841+luizcmarin@users.noreply.github.com> Date: Tue, 14 May 2024 12:12:09 -0300 Subject: [PATCH 46/58] Update README.md (#616) --- blog-api/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/blog-api/README.md b/blog-api/README.md index ca15f6d67..7c1ade349 100644 --- a/blog-api/README.md +++ b/blog-api/README.md @@ -1,6 +1,6 @@

    - + Yii

    Yii Framework API Demo Project


    @@ -40,7 +40,7 @@ Change ownership of the app directory to web group: chown -R :www-data . ``` -Usually the application is available at http://localhost:8080. +Usually the application is available at . Authorization is performed via the `X-Api-Key` header. @@ -56,7 +56,6 @@ on how to annotate your code. ./vendor/bin/codecept run ``` - ## Static analysis The code is statically analyzed with [Psalm](https://psalm.dev/). To run static analysis: From 229763e0e4e0dede7af357c9995787d26ed26393 Mon Sep 17 00:00:00 2001 From: Luiz Marin <67489841+luizcmarin@users.noreply.github.com> Date: Thu, 23 May 2024 11:52:20 -0300 Subject: [PATCH 47/58] Update README.md (#617) --- blog/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/README.md b/blog/README.md index e646d9973..126a39c39 100644 --- a/blog/README.md +++ b/blog/README.md @@ -6,7 +6,7 @@

    -[Yii Framework] is a modern framework designed to be a solid foundation for your PHP application. +[Yii Framework](https://www.yiiframework.com/) is a modern framework designed to be a solid foundation for your PHP application. It's intended to show and test all Yii features. From 6dbcb105bb495b764413c19ea17bfd6e6136acdb Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Wed, 29 May 2024 02:29:46 +0300 Subject: [PATCH 48/58] Ignore locale middleware for gii controllers (#618) --- blog-api/config/common/params.php | 1 + blog/config/web/params.php | 1 + 2 files changed, 2 insertions(+) diff --git a/blog-api/config/common/params.php b/blog-api/config/common/params.php index 98e8d8888..ac8b96528 100644 --- a/blog-api/config/common/params.php +++ b/blog-api/config/common/params.php @@ -20,6 +20,7 @@ 'locale' => [ 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU', 'de' => 'de-DE'], 'ignoredRequests' => [ + '/gii**', '/debug**', '/inspect**', ], diff --git a/blog/config/web/params.php b/blog/config/web/params.php index 1d07ac92a..a2e8992cb 100644 --- a/blog/config/web/params.php +++ b/blog/config/web/params.php @@ -28,6 +28,7 @@ 'locale' => [ 'locales' => ['en' => 'en-US', 'ru' => 'ru-RU', 'id' => 'id-ID', 'sk' => 'sk-SK', 'de' => 'de-DE'], 'ignoredRequests' => [ + '/gii**', '/debug**', '/inspect**', ], From 96b972675435dcd1068f2c16d55b32b86f176d0a Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Mon, 9 Sep 2024 14:32:13 +0500 Subject: [PATCH 49/58] Sync, blog, part 1 (#622) * Sync * Apply fixes from StyleCI * WIP * WIP 2 * WIP 3 --------- Co-authored-by: StyleCI Bot --- blog/composer.json | 24 +++++++++---------- blog/config/common/params.php | 6 ++--- blog/resources/views/user/profile.php | 4 +++- blog/src/Auth/Controller/AuthController.php | 2 +- blog/src/Auth/Controller/SignupController.php | 2 +- blog/src/Auth/Form/LoginForm.php | 2 +- blog/src/Auth/Form/SignupForm.php | 2 +- .../src/Backend/Controller/SiteController.php | 2 +- blog/src/Blog/Archive/ArchiveController.php | 2 +- blog/src/Blog/Archive/ArchiveRepository.php | 4 ++-- blog/src/Blog/BlogController.php | 2 +- blog/src/Blog/CommentController.php | 2 +- blog/src/Blog/Post/PostController.php | 8 +++---- blog/src/Blog/Tag/TagController.php | 2 +- blog/src/Command/Fixture/AddCommand.php | 16 ++++++------- blog/src/Contact/ContactController.php | 2 +- blog/src/Contact/ContactForm.php | 2 +- blog/src/Contact/views/contact/form.php | 2 +- blog/src/Controller/SiteController.php | 2 +- blog/src/Handler/NotFoundHandler.php | 2 +- blog/src/User/Console/CreateCommand.php | 2 +- blog/src/User/Controller/UserController.php | 2 +- .../src/ViewInjection/CommonViewInjection.php | 2 +- .../src/ViewInjection/LayoutViewInjection.php | 2 +- .../ViewInjection/LinkTagsViewInjection.php | 2 +- .../ViewInjection/MetaTagsViewInjection.php | 2 +- 26 files changed, 51 insertions(+), 51 deletions(-) diff --git a/blog/composer.json b/blog/composer.json index b8de8306f..f0dfa1e9c 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -51,8 +51,8 @@ "yiisoft/di": "^1.2", "yiisoft/error-handler": "^3.0", "yiisoft/factory": "^1.0", - "yiisoft/form": "dev-master", - "yiisoft/form-model": "dev-master", + "yiisoft/form": "^1.0", + "yiisoft/form-model": "^1.0", "yiisoft/html": "^3.0", "yiisoft/http": "^1.2", "yiisoft/injector": "^1.0", @@ -74,24 +74,24 @@ "yiisoft/translator": "^3.0", "yiisoft/translator-message-php": "^1.1.1", "yiisoft/user": "^2.0", - "yiisoft/validator": "^1.0", + "yiisoft/validator": "^2.0", "yiisoft/var-dumper": "^1.0", - "yiisoft/view": "^8.0", + "yiisoft/view": "^10.0", "yiisoft/widget": "^2.1", "yiisoft/yii-bootstrap5": "^3.0@dev", "yiisoft/yii-console": "^2.0", "yiisoft/yii-cycle": "^1.0", "yiisoft/yii-dataview": "^3.0@dev", - "yiisoft/yii-debug": "^3.0@dev", + "yiisoft/yii-debug": "dev-master", "yiisoft/yii-debug-api": "^3.0@dev", "yiisoft/yii-event": "^2.0", "yiisoft/yii-http": "^1.0", - "yiisoft/yii-middleware": "^1.0", + "yiisoft/yii-middleware": "^1.0.4", "yiisoft/yii-runner-console": "^2.0", "yiisoft/yii-runner-http": "^2.0", - "yiisoft/yii-sentry": "dev-master", - "yiisoft/yii-swagger": "^2.0", - "yiisoft/yii-view": "^6.0" + "yiisoft/yii-sentry": "^2.0.1", + "yiisoft/yii-swagger": "^2.1.1", + "yiisoft/yii-view-renderer": "^7.1" }, "require-dev": { "codeception/c3": "^2.6", @@ -101,12 +101,12 @@ "codeception/module-phpbrowser": "^3.0", "phpunit/phpunit": "^9.5", "roave/infection-static-analysis-plugin": "^1.16", - "roave/security-advisories": "dev-master", + "roave/security-advisories": "dev-latest", "spatie/phpunit-watcher": "^1.23", "vimeo/psalm": "^4.18", "yiisoft/translator-extractor": "^2.0", - "yiisoft/yii-debug-viewer": "^3.0@dev", - "yiisoft/yii-gii": "^3.0@dev", + "yiisoft/yii-debug-viewer": "dev-master", + "yiisoft/yii-gii": "dev-master", "yiisoft/yii-testing": "dev-master" }, "autoload": { diff --git a/blog/config/common/params.php b/blog/config/common/params.php index 21fca2a40..bc5fa805f 100644 --- a/blog/config/common/params.php +++ b/blog/config/common/params.php @@ -8,6 +8,7 @@ use App\ViewInjection\MetaTagsViewInjection; use Cycle\Database\Config\SQLite\FileConnectionConfig; use Cycle\Database\Config\SQLiteDriverConfig; +use Cycle\Schema\Provider\PhpFileSchemaProvider; use Yiisoft\Assets\AssetManager; use Yiisoft\Definitions\Reference; use Yiisoft\Form\Field\SubmitButton; @@ -16,8 +17,7 @@ use Yiisoft\Translator\TranslatorInterface; use Yiisoft\Yii\Cycle\Schema\Conveyor\AttributedSchemaConveyor; use Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider; -use Cycle\Schema\Provider\PhpFileSchemaProvider; -use Yiisoft\Yii\View\CsrfViewInjection; +use Yiisoft\Yii\View\Renderer\CsrfViewInjection; return [ 'mailer' => [ @@ -92,7 +92,7 @@ 'secretKey' => '53136271c432a1af377c3806c3112ddf', ], - 'yiisoft/yii-view' => [ + 'yiisoft/yii-view-renderer' => [ 'viewPath' => '@views', 'layout' => '@views/layout/main', 'injections' => [ diff --git a/blog/resources/views/user/profile.php b/blog/resources/views/user/profile.php index 2acc58b6c..78e83360b 100644 --- a/blog/resources/views/user/profile.php +++ b/blog/resources/views/user/profile.php @@ -3,13 +3,15 @@ declare(strict_types=1); /** - * @var User $item + * @var User $item * @var WebView $this + * @var $translator TranslatorInterface */ use App\User\User; use Yiisoft\Html\Html; use Yiisoft\Html\Tag\H2; +use Yiisoft\Translator\TranslatorInterface; use Yiisoft\View\WebView; use Yiisoft\Yii\DataView\DetailView; use Yiisoft\Yii\DataView\Field\DataField; diff --git a/blog/src/Auth/Controller/AuthController.php b/blog/src/Auth/Controller/AuthController.php index 325674a14..036b77f20 100644 --- a/blog/src/Auth/Controller/AuthController.php +++ b/blog/src/Auth/Controller/AuthController.php @@ -13,7 +13,7 @@ use Yiisoft\Translator\TranslatorInterface; use Yiisoft\User\Login\Cookie\CookieLogin; use Yiisoft\User\Login\Cookie\CookieLoginIdentityInterface; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class AuthController { diff --git a/blog/src/Auth/Controller/SignupController.php b/blog/src/Auth/Controller/SignupController.php index 7f3845f5f..3e15ee77b 100644 --- a/blog/src/Auth/Controller/SignupController.php +++ b/blog/src/Auth/Controller/SignupController.php @@ -10,7 +10,7 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Yiisoft\FormModel\FormHydrator; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class SignupController { diff --git a/blog/src/Auth/Form/LoginForm.php b/blog/src/Auth/Form/LoginForm.php index 139fd0ec7..36eeb2ca8 100644 --- a/blog/src/Auth/Form/LoginForm.php +++ b/blog/src/Auth/Form/LoginForm.php @@ -24,7 +24,7 @@ public function __construct( ) { } - public function getAttributeLabels(): array + public function getPropertyLabels(): array { return [ 'login' => $this->translator->translate('layout.login'), diff --git a/blog/src/Auth/Form/SignupForm.php b/blog/src/Auth/Form/SignupForm.php index dfabcc69e..d28875e45 100644 --- a/blog/src/Auth/Form/SignupForm.php +++ b/blog/src/Auth/Form/SignupForm.php @@ -26,7 +26,7 @@ public function __construct( ) { } - public function getAttributeLabels(): array + public function getPropertyLabels(): array { return [ 'login' => $this->translator->translate('layout.login'), diff --git a/blog/src/Backend/Controller/SiteController.php b/blog/src/Backend/Controller/SiteController.php index 7014ef750..cc6045e09 100644 --- a/blog/src/Backend/Controller/SiteController.php +++ b/blog/src/Backend/Controller/SiteController.php @@ -5,7 +5,7 @@ namespace App\Backend\Controller; use Psr\Http\Message\ResponseInterface; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class SiteController { diff --git a/blog/src/Blog/Archive/ArchiveController.php b/blog/src/Blog/Archive/ArchiveController.php index 21cbd468c..25f0a4d0d 100644 --- a/blog/src/Blog/Archive/ArchiveController.php +++ b/blog/src/Blog/Archive/ArchiveController.php @@ -8,7 +8,7 @@ use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Router\HydratorAttribute\RouteArgument; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class ArchiveController { diff --git a/blog/src/Blog/Archive/ArchiveRepository.php b/blog/src/Blog/Archive/ArchiveRepository.php index 9d34829ca..b9ce92bac 100644 --- a/blog/src/Blog/Archive/ArchiveRepository.php +++ b/blog/src/Blog/Archive/ArchiveRepository.php @@ -107,10 +107,10 @@ private function extractFromDateColumn(string $attr): FragmentInterface if ($driver instanceof SQLiteDriver) { $str = ['year' => '%Y', 'month' => '%m', 'day' => '%d'][$attr]; - return new Fragment("strftime('{$str}', post.published_at) {$wrappedField}"); + return new Fragment("strftime('$str', post.published_at) $wrappedField"); } - return new Fragment("extract({$attr} from post.published_at) {$wrappedField}"); + return new Fragment("extract($attr from post.published_at) $wrappedField"); } private function getDriver(): DriverInterface diff --git a/blog/src/Blog/BlogController.php b/blog/src/Blog/BlogController.php index cdd5b0923..7da0ad6fb 100644 --- a/blog/src/Blog/BlogController.php +++ b/blog/src/Blog/BlogController.php @@ -11,7 +11,7 @@ use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Router\HydratorAttribute\RouteArgument; use Yiisoft\User\CurrentUser; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class BlogController { diff --git a/blog/src/Blog/CommentController.php b/blog/src/Blog/CommentController.php index f2b057381..e0d3fbe55 100644 --- a/blog/src/Blog/CommentController.php +++ b/blog/src/Blog/CommentController.php @@ -12,7 +12,7 @@ use Yiisoft\Input\Http\Attribute\Parameter\Body; use Yiisoft\Input\Http\Attribute\Parameter\Query; use Yiisoft\Router\HydratorAttribute\RouteArgument; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class CommentController { diff --git a/blog/src/Blog/Post/PostController.php b/blog/src/Blog/Post/PostController.php index ef42e3e29..0530d8d0e 100644 --- a/blog/src/Blog/Post/PostController.php +++ b/blog/src/Blog/Post/PostController.php @@ -12,8 +12,7 @@ use Yiisoft\FormModel\FormHydrator; use Yiisoft\Http\Method; use Yiisoft\Router\CurrentRoute; -use Yiisoft\Validator\ValidatorInterface; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class PostController { @@ -55,7 +54,7 @@ public function add(Request $request, FormHydrator $formHydrator): Response return $this->webService->getRedirectResponse('blog/index'); } - $parameters['errors'] = $form->getValidationResult()->getErrorMessagesIndexedByAttribute(); + $parameters['errors'] = $form->getValidationResult()->getErrorMessagesIndexedByProperty(); } return $this->viewRenderer->render('__form', $parameters); @@ -64,7 +63,6 @@ public function add(Request $request, FormHydrator $formHydrator): Response public function edit( Request $request, PostRepository $postRepository, - ValidatorInterface $validator, CurrentRoute $currentRoute, FormHydrator $formHydrator ): Response { @@ -94,7 +92,7 @@ public function edit( } $parameters['body'] = $body; - $parameters['errors'] = $form->getValidationResult()->getErrorMessagesIndexedByAttribute(); + $parameters['errors'] = $form->getValidationResult()->getErrorMessagesIndexedByProperty(); } return $this->viewRenderer->render('__form', $parameters); diff --git a/blog/src/Blog/Tag/TagController.php b/blog/src/Blog/Tag/TagController.php index d640cf654..277aeeae9 100644 --- a/blog/src/Blog/Tag/TagController.php +++ b/blog/src/Blog/Tag/TagController.php @@ -9,7 +9,7 @@ use Psr\Http\Message\ResponseInterface as Response; use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Router\CurrentRoute; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class TagController { diff --git a/blog/src/Command/Fixture/AddCommand.php b/blog/src/Command/Fixture/AddCommand.php index 940f380f6..f9e7cfd2e 100644 --- a/blog/src/Command/Fixture/AddCommand.php +++ b/blog/src/Command/Fixture/AddCommand.php @@ -129,15 +129,15 @@ private function addPosts(int $count): void for ($i = 0; $i < $count; $i++) { /** @var User $postUser */ $postUser = $this->users[array_rand($this->users)]; - $post = new Post($this->faker->text(64), $this->faker->realText(rand(1000, 4000))); + $post = new Post($this->faker->text(64), $this->faker->realText(random_int(1000, 4000))); $postUser->addPost($post); - $public = rand(0, 2) > 0; + $public = random_int(0, 2) > 0; $post->setPublic($public); if ($public) { - $post->setPublishedAt(new DateTimeImmutable(date('r', rand(strtotime('-2 years'), time())))); + $post->setPublishedAt(new DateTimeImmutable(date('r', random_int(strtotime('-2 years'), time())))); } // link tags - $postTags = (array) array_rand($this->tags, rand(1, count($this->tags))); + $postTags = (array) array_rand($this->tags, random_int(1, count($this->tags))); foreach ($postTags as $tagId) { $tag = $this->tags[$tagId]; $post->addTag($tag); @@ -145,13 +145,13 @@ private function addPosts(int $count): void // $tag->addPost($post); } // add comments - $commentsCount = rand(0, $count); + $commentsCount = random_int(0, $count); for ($j = 0; $j <= $commentsCount; $j++) { - $comment = new Comment($this->faker->realText(rand(100, 500))); - $commentPublic = rand(0, 3) > 0; + $comment = new Comment($this->faker->realText(random_int(100, 500))); + $commentPublic = random_int(0, 3) > 0; $comment->setPublic($commentPublic); if ($commentPublic) { - $comment->setPublishedAt(new DateTimeImmutable(date('r', rand(strtotime('-1 years'), time())))); + $comment->setPublishedAt(new DateTimeImmutable(date('r', random_int(strtotime('-1 years'), time())))); } $commentUser = $this->users[array_rand($this->users)]; $commentUser->addComment($comment); diff --git a/blog/src/Contact/ContactController.php b/blog/src/Contact/ContactController.php index a250fe54c..40669f7ce 100644 --- a/blog/src/Contact/ContactController.php +++ b/blog/src/Contact/ContactController.php @@ -12,7 +12,7 @@ use Yiisoft\Http\Method; use Yiisoft\Http\Status; use Yiisoft\Router\UrlGeneratorInterface; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class ContactController { diff --git a/blog/src/Contact/ContactForm.php b/blog/src/Contact/ContactForm.php index 5c3c22616..fc5d9d5f3 100644 --- a/blog/src/Contact/ContactForm.php +++ b/blog/src/Contact/ContactForm.php @@ -20,7 +20,7 @@ final class ContactForm extends FormModel implements RulesProviderInterface #[UploadedFiles('ContactForm.attachFiles')] private array $attachFiles = []; - public function getAttributeLabels(): array + public function getPropertyLabels(): array { return [ 'name' => 'Name', diff --git a/blog/src/Contact/views/contact/form.php b/blog/src/Contact/views/contact/form.php index e757965d2..60ab70392 100644 --- a/blog/src/Contact/views/contact/form.php +++ b/blog/src/Contact/views/contact/form.php @@ -12,7 +12,7 @@ use Yiisoft\View\WebView; /** - * @var Yiisoft\Yii\View\Csrf $csrf + * @var Yiisoft\Yii\View\Renderer\Csrf $csrf * @var ContactForm $form * @var UrlGeneratorInterface $url * @var WebView $this diff --git a/blog/src/Controller/SiteController.php b/blog/src/Controller/SiteController.php index 086730be2..cbceaa931 100644 --- a/blog/src/Controller/SiteController.php +++ b/blog/src/Controller/SiteController.php @@ -5,7 +5,7 @@ namespace App\Controller; use Psr\Http\Message\ResponseInterface; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class SiteController { diff --git a/blog/src/Handler/NotFoundHandler.php b/blog/src/Handler/NotFoundHandler.php index 3b689b0e8..84a9187c5 100644 --- a/blog/src/Handler/NotFoundHandler.php +++ b/blog/src/Handler/NotFoundHandler.php @@ -8,7 +8,7 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use Yiisoft\Http\Status; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class NotFoundHandler implements RequestHandlerInterface { diff --git a/blog/src/User/Console/CreateCommand.php b/blog/src/User/Console/CreateCommand.php index cd03073a4..a8c8e23de 100644 --- a/blog/src/User/Console/CreateCommand.php +++ b/blog/src/User/Console/CreateCommand.php @@ -58,7 +58,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } if ($user === false) { - $errors = $this->signupForm->getValidationResult()?->getErrorMessagesIndexedByAttribute(); + $errors = $this->signupForm->getValidationResult()?->getErrorMessagesIndexedByProperty(); array_walk($errors, fn($error, $attribute) => $io->error("$attribute: " . implode("\n", (array) $error))); return ExitCode::DATAERR; } diff --git a/blog/src/User/Controller/UserController.php b/blog/src/User/Controller/UserController.php index 03ac4120c..d6387b354 100644 --- a/blog/src/User/Controller/UserController.php +++ b/blog/src/User/Controller/UserController.php @@ -13,7 +13,7 @@ use Yiisoft\Input\Http\Attribute\Parameter\Body; use Yiisoft\Input\Http\Attribute\Parameter\Query; use Yiisoft\Router\HydratorAttribute\RouteArgument; -use Yiisoft\Yii\View\ViewRenderer; +use Yiisoft\Yii\View\Renderer\ViewRenderer; final class UserController { diff --git a/blog/src/ViewInjection/CommonViewInjection.php b/blog/src/ViewInjection/CommonViewInjection.php index 530849468..ec5fa0b81 100644 --- a/blog/src/ViewInjection/CommonViewInjection.php +++ b/blog/src/ViewInjection/CommonViewInjection.php @@ -5,7 +5,7 @@ namespace App\ViewInjection; use Yiisoft\Router\UrlGeneratorInterface; -use Yiisoft\Yii\View\CommonParametersInjectionInterface; +use Yiisoft\Yii\View\Renderer\CommonParametersInjectionInterface; final class CommonViewInjection implements CommonParametersInjectionInterface { diff --git a/blog/src/ViewInjection/LayoutViewInjection.php b/blog/src/ViewInjection/LayoutViewInjection.php index 9a6d41447..86b98c7ef 100644 --- a/blog/src/ViewInjection/LayoutViewInjection.php +++ b/blog/src/ViewInjection/LayoutViewInjection.php @@ -6,7 +6,7 @@ use App\Auth\Identity; use Yiisoft\User\CurrentUser; -use Yiisoft\Yii\View\LayoutParametersInjectionInterface; +use Yiisoft\Yii\View\Renderer\LayoutParametersInjectionInterface; final class LayoutViewInjection implements LayoutParametersInjectionInterface { diff --git a/blog/src/ViewInjection/LinkTagsViewInjection.php b/blog/src/ViewInjection/LinkTagsViewInjection.php index 13286282d..d2ac7dc8a 100644 --- a/blog/src/ViewInjection/LinkTagsViewInjection.php +++ b/blog/src/ViewInjection/LinkTagsViewInjection.php @@ -4,7 +4,7 @@ namespace App\ViewInjection; -use Yiisoft\Yii\View\LinkTagsInjectionInterface; +use Yiisoft\Yii\View\Renderer\LinkTagsInjectionInterface; final class LinkTagsViewInjection implements LinkTagsInjectionInterface { diff --git a/blog/src/ViewInjection/MetaTagsViewInjection.php b/blog/src/ViewInjection/MetaTagsViewInjection.php index bbdd0dc41..ba4884e86 100644 --- a/blog/src/ViewInjection/MetaTagsViewInjection.php +++ b/blog/src/ViewInjection/MetaTagsViewInjection.php @@ -4,7 +4,7 @@ namespace App\ViewInjection; -use Yiisoft\Yii\View\MetaTagsInjectionInterface; +use Yiisoft\Yii\View\Renderer\MetaTagsInjectionInterface; final class MetaTagsViewInjection implements MetaTagsInjectionInterface { From fec9dba72747dec801b3a0084108bbf5799cc0b8 Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Tue, 10 Sep 2024 17:17:56 +0500 Subject: [PATCH 50/58] Sync, blog-api, part 1 (#623) * Sync, blog-api, part 1 * WIP * WIP 2 --- blog-api/composer.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/blog-api/composer.json b/blog-api/composer.json index 9f9335388..95d416c5c 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -63,17 +63,18 @@ "yiisoft/translator": "^3.0", "yiisoft/translator-message-php": "^1.1", "yiisoft/user": "^2.0", - "yiisoft/validator": "^1.0", + "yiisoft/validator": "^2.0", "yiisoft/yii-console": "^2.0", "yiisoft/yii-cycle": "^1.0", - "yiisoft/yii-debug": "^3.0@dev", + "yiisoft/yii-debug": "dev-master", "yiisoft/yii-event": "^2.0", "yiisoft/yii-http": "^1.0", "yiisoft/yii-middleware": "^1.0", "yiisoft/queue": "3.0.x-dev", "yiisoft/yii-runner-console": "^2.0", "yiisoft/yii-runner-http": "^2.0", - "yiisoft/yii-swagger": "^2.0" + "yiisoft/yii-swagger": "^2.0", + "zircote/swagger-php": "^4.0" }, "require-dev": { "codeception/c3": "^2.6", @@ -86,6 +87,7 @@ "codeception/module-rest": "^3.1", "phpunit/phpunit": "^9.5", "roave/infection-static-analysis-plugin": "^1.16", + "roave/security-advisories": "dev-latest", "spatie/phpunit-watcher": "^1.23", "vimeo/psalm": "^4.18", "yiisoft/json": "^1.0", From 7daaf5b8e2f7908f481d16acd64382c06fd6faa8 Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Tue, 10 Sep 2024 17:18:11 +0500 Subject: [PATCH 51/58] Sync, blog, part 2 (#624) * Sync, blog, part 2 * Apply fixes from StyleCI * WIP --------- Co-authored-by: StyleCI Bot --- blog-api/tests/Support/Data/database.db | Bin 114688 -> 114688 bytes blog/composer.json | 3 ++- blog/src/Auth/Form/LoginForm.php | 10 ++++++++- blog/src/Auth/Form/SignupForm.php | 10 ++++++++- blog/src/Contact/ContactController.php | 21 +++++++----------- blog/src/Contact/ContactForm.php | 10 ++++++++- blog/tests/Acceptance/LoginAcceptanceCest.php | 4 ++-- .../tests/Acceptance/SignupAcceptanceCest.php | 7 +++--- blog/tests/Functional/ContactCest.php | 8 +++++-- 9 files changed, 49 insertions(+), 24 deletions(-) diff --git a/blog-api/tests/Support/Data/database.db b/blog-api/tests/Support/Data/database.db index e0fa3d1db9c7b25a931a6f212423a6ef320fe3d4..6b81fc20180f049082153ab05a685d239a61b33f 100644 GIT binary patch delta 63 zcmZo@U~gz(pOD04e{*BXBQ8O+l+@%j%QOR1v!vwG;?yFR$@jU{Cfjqf^B~JKPvG7@ Jft#^l3jo8r6{Y|H delta 63 zcmZo@U~gz(pOD1lJ#k~oBQ8PXG$Uhk)0AY(L}TO9;?yFR$@jU{Cfjqf^B~JKPvG7@ Jft#^l3jmbg6g~g| diff --git a/blog/composer.json b/blog/composer.json index f0dfa1e9c..08c53970c 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -91,7 +91,8 @@ "yiisoft/yii-runner-http": "^2.0", "yiisoft/yii-sentry": "^2.0.1", "yiisoft/yii-swagger": "^2.1.1", - "yiisoft/yii-view-renderer": "^7.1" + "yiisoft/yii-view-renderer": "^7.1", + "zircote/swagger-php": "^4.0" }, "require-dev": { "codeception/c3": "^2.6", diff --git a/blog/src/Auth/Form/LoginForm.php b/blog/src/Auth/Form/LoginForm.php index 36eeb2ca8..3a422278e 100644 --- a/blog/src/Auth/Form/LoginForm.php +++ b/blog/src/Auth/Form/LoginForm.php @@ -7,12 +7,15 @@ use App\Auth\AuthService; use Yiisoft\FormModel\FormModel; use Yiisoft\Translator\TranslatorInterface; +use Yiisoft\Validator\PropertyTranslator\ArrayPropertyTranslator; +use Yiisoft\Validator\PropertyTranslatorInterface; +use Yiisoft\Validator\PropertyTranslatorProviderInterface; use Yiisoft\Validator\Result; use Yiisoft\Validator\Rule\Callback; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\RulesProviderInterface; -final class LoginForm extends FormModel implements RulesProviderInterface +final class LoginForm extends FormModel implements RulesProviderInterface, PropertyTranslatorProviderInterface { private string $login = ''; private string $password = ''; @@ -64,4 +67,9 @@ private function passwordRules(): array ), ]; } + + public function getPropertyTranslator(): ?PropertyTranslatorInterface + { + return new ArrayPropertyTranslator($this->getPropertyLabels()); + } } diff --git a/blog/src/Auth/Form/SignupForm.php b/blog/src/Auth/Form/SignupForm.php index d28875e45..909e5e795 100644 --- a/blog/src/Auth/Form/SignupForm.php +++ b/blog/src/Auth/Form/SignupForm.php @@ -8,13 +8,16 @@ use App\User\UserRepository; use Yiisoft\FormModel\FormModel; use Yiisoft\Translator\TranslatorInterface; +use Yiisoft\Validator\PropertyTranslator\ArrayPropertyTranslator; +use Yiisoft\Validator\PropertyTranslatorInterface; +use Yiisoft\Validator\PropertyTranslatorProviderInterface; use Yiisoft\Validator\Result; use Yiisoft\Validator\Rule\Equal; use Yiisoft\Validator\Rule\Length; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\RulesProviderInterface; -final class SignupForm extends FormModel implements RulesProviderInterface +final class SignupForm extends FormModel implements RulesProviderInterface, PropertyTranslatorProviderInterface { private string $login = ''; private string $password = ''; @@ -85,4 +88,9 @@ function ($value): Result { ], ]; } + + public function getPropertyTranslator(): ?PropertyTranslatorInterface + { + return new ArrayPropertyTranslator($this->getPropertyLabels()); + } } diff --git a/blog/src/Contact/ContactController.php b/blog/src/Contact/ContactController.php index 40669f7ce..ee855b4fe 100644 --- a/blog/src/Contact/ContactController.php +++ b/blog/src/Contact/ContactController.php @@ -9,7 +9,6 @@ use Psr\Http\Message\ServerRequestInterface; use Yiisoft\FormModel\FormHydrator; use Yiisoft\Http\Header; -use Yiisoft\Http\Method; use Yiisoft\Http\Status; use Yiisoft\Router\UrlGeneratorInterface; use Yiisoft\Yii\View\Renderer\ViewRenderer; @@ -29,21 +28,17 @@ public function __construct( public function contact( FormHydrator $formHydrator, - ServerRequestInterface $request + ServerRequestInterface $request, ): ResponseInterface { - $body = $request->getParsedBody(); $form = new ContactForm(); - if (($request->getMethod() === Method::POST) - && $formHydrator->populate($form, $body) - && $form->isValid() - ) { - $this->mailer->send($form, $request); - - return $this->responseFactory - ->createResponse(Status::FOUND) - ->withHeader(Header::LOCATION, $this->url->generate('site/contact')); + if (!$formHydrator->populateFromPostAndValidate($form, $request)) { + return $this->viewRenderer->render('form', ['form' => $form]); } - return $this->viewRenderer->render('form', ['form' => $form]); + $this->mailer->send($form); + + return $this->responseFactory + ->createResponse(Status::FOUND) + ->withHeader(Header::LOCATION, $this->url->generate('site/contact')); } } diff --git a/blog/src/Contact/ContactForm.php b/blog/src/Contact/ContactForm.php index fc5d9d5f3..b5ad5304d 100644 --- a/blog/src/Contact/ContactForm.php +++ b/blog/src/Contact/ContactForm.php @@ -6,11 +6,14 @@ use Yiisoft\FormModel\FormModel; use Yiisoft\Input\Http\Attribute\Parameter\UploadedFiles; +use Yiisoft\Validator\PropertyTranslator\ArrayPropertyTranslator; +use Yiisoft\Validator\PropertyTranslatorInterface; +use Yiisoft\Validator\PropertyTranslatorProviderInterface; use Yiisoft\Validator\Rule\Email; use Yiisoft\Validator\Rule\Required; use Yiisoft\Validator\RulesProviderInterface; -final class ContactForm extends FormModel implements RulesProviderInterface +final class ContactForm extends FormModel implements RulesProviderInterface, PropertyTranslatorProviderInterface { private string $name = ''; private string $email = ''; @@ -44,4 +47,9 @@ public function getRules(): array 'body' => [new Required()], ]; } + + public function getPropertyTranslator(): ?PropertyTranslatorInterface + { + return new ArrayPropertyTranslator($this->getPropertyLabels()); + } } diff --git a/blog/tests/Acceptance/LoginAcceptanceCest.php b/blog/tests/Acceptance/LoginAcceptanceCest.php index 25436c6bc..022beff39 100644 --- a/blog/tests/Acceptance/LoginAcceptanceCest.php +++ b/blog/tests/Acceptance/LoginAcceptanceCest.php @@ -28,8 +28,8 @@ public function testLoginEmptyDataTest(AcceptanceTester $I): void $I->click('Submit', '#loginForm'); $I->expectTo('see validations errors.'); - $I->see('Value cannot be blank'); - $I->see('Value cannot be blank'); + $I->see('Login cannot be blank.'); + $I->see('Password cannot be blank.'); $I->seeElement('button', ['name' => 'login-button']); } diff --git a/blog/tests/Acceptance/SignupAcceptanceCest.php b/blog/tests/Acceptance/SignupAcceptanceCest.php index 6bf61c19b..ccd7e3b28 100644 --- a/blog/tests/Acceptance/SignupAcceptanceCest.php +++ b/blog/tests/Acceptance/SignupAcceptanceCest.php @@ -44,9 +44,10 @@ public function testRegisterEmptyData(AcceptanceTester $I): void $I->click('Submit', '#signupForm'); $I->expectTo('see registration register validation.'); - $I->see('Value cannot be blank'); - $I->see('Value cannot be blank'); - $I->see('Value cannot be blank'); + $I->see('Login cannot be blank.'); + $I->see('Password cannot be blank.'); + $I->see('Password must contain at least 8 characters.'); + $I->see('Confirm password cannot be blank.'); $I->seeElement('button', ['name' => 'register-button']); } diff --git a/blog/tests/Functional/ContactCest.php b/blog/tests/Functional/ContactCest.php index 9a30936d4..a15d119ec 100644 --- a/blog/tests/Functional/ContactCest.php +++ b/blog/tests/Functional/ContactCest.php @@ -24,7 +24,11 @@ public function submitEmptyForm(FunctionalTester $I) { $I->submitForm('#form-contact', []); $I->expectTo('see validations errors'); - $I->see('Value cannot be blank.'); + $I->see('Name cannot be blank.'); + $I->see('Email cannot be blank.'); + $I->see('Email is not a valid email address.'); + $I->see('Subject cannot be blank.'); + $I->see('Body cannot be blank.'); } public function submitFormWithIncorrectEmail(FunctionalTester $I) @@ -37,7 +41,7 @@ public function submitFormWithIncorrectEmail(FunctionalTester $I) 'ContactForm[verifyCode]' => 'testme', ]); $I->expectTo('see that email address is wrong'); - $I->see('This value is not a valid email address.'); + $I->see('Email is not a valid email address.'); } public function submitFormSuccessfully(FunctionalTester $I) From 13f336a69e0a71b6bef1d856f65f3481380b604b Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Thu, 19 Sep 2024 18:09:05 +0500 Subject: [PATCH 52/58] Remove Scrutinizer (#626) --- blog-api/.scrutinizer.yml | 40 --------------------------------------- blog-api/README.md | 1 - 2 files changed, 41 deletions(-) delete mode 100644 blog-api/.scrutinizer.yml diff --git a/blog-api/.scrutinizer.yml b/blog-api/.scrutinizer.yml deleted file mode 100644 index f6173517a..000000000 --- a/blog-api/.scrutinizer.yml +++ /dev/null @@ -1,40 +0,0 @@ -checks: - php: true - -filter: - paths: - - "src/*" - -build: - image: default-bionic - - environment: - variables: - YII_ENV: test - - php: - version: 8.1.8 - ini: - xdebug.mode: coverage - - nodes: - analysis: - tests: - override: - - php-scrutinizer-run - - codeception: - dependencies: - override: - - composer self-update - - composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi - - tests: - override: - - command: | - ./yii serve 127.0.0.1:8080 > ./runtime/yii.log 2>&1 & - vendor/bin/codecept run --coverage-xml --env github-ci - on_node: 1 - coverage: - file: runtime/tests/_output/coverage.xml - format: php-clover diff --git a/blog-api/README.md b/blog-api/README.md index 7c1ade349..ddb3136d6 100644 --- a/blog-api/README.md +++ b/blog-api/README.md @@ -9,7 +9,6 @@ [![Latest Stable Version](https://poser.pugx.org/yiisoft/demo-api/v/stable.png)](https://packagist.org/packages/yiisoft/demo-api) [![Total Downloads](https://poser.pugx.org/yiisoft/demo-api/downloads.png)](https://packagist.org/packages/yiisoft/demo-api) [![Build status](https://github.com/yiisoft/demo-api/workflows/build/badge.svg)](https://github.com/yiisoft/demo-api/actions?query=workflow%3Abuild) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/yiisoft/demo-api/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/yiisoft/demo-api/?branch=master) [![static analysis](https://github.com/yiisoft/demo-api/workflows/static%20analysis/badge.svg)](https://github.com/yiisoft/demo-api/actions?query=workflow%3A%22static+analysis%22) API Demo application for Yii 3. From 9a313d3c8e38b1ba2b59636dd1e94ef9eccb06e2 Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Fri, 20 Sep 2024 17:13:20 +0500 Subject: [PATCH 53/58] Sync, blog-api, part 2 (#625) * Sync, blog-api, part 2 * Apply fixes from StyleCI * Fix * Apply fixes from StyleCI --------- Co-authored-by: StyleCI Bot Co-authored-by: Sergei Predvoditelev --- blog-api/config/common/params.php | 2 -- blog-api/config/common/routes.php | 6 ++++++ blog-api/config/environments/test/params.php | 1 - blog-api/src/Auth/AuthController.php | 9 ++------- blog-api/src/User/UserRepository.php | 16 +++++++--------- blog-api/src/User/UserService.php | 17 ++++++----------- blog-api/tests/Acceptance/AuthCest.php | 1 - blog-api/tests/Acceptance/BlogCest.php | 2 +- 8 files changed, 22 insertions(+), 32 deletions(-) diff --git a/blog-api/config/common/params.php b/blog-api/config/common/params.php index ac8b96528..bb94bb4b0 100644 --- a/blog-api/config/common/params.php +++ b/blog-api/config/common/params.php @@ -7,7 +7,6 @@ use Cycle\Database\Config\SQLiteDriverConfig; use Cycle\Schema\Provider\PhpFileSchemaProvider; use Yiisoft\ErrorHandler\Middleware\ErrorCatcher; -use Yiisoft\RequestProvider\RequestCatcherMiddleware; use Yiisoft\Router\Middleware\Router; use Yiisoft\Yii\Cycle\Schema\Conveyor\AttributedSchemaConveyor; use Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider; @@ -27,7 +26,6 @@ ], 'supportEmail' => 'support@example.com', 'middlewares' => [ - RequestCatcherMiddleware::class, ErrorCatcher::class, Subfolder::class, Locale::class, diff --git a/blog-api/config/common/routes.php b/blog-api/config/common/routes.php index 82bf07697..2f0809af2 100644 --- a/blog-api/config/common/routes.php +++ b/blog-api/config/common/routes.php @@ -10,6 +10,7 @@ use Yiisoft\Auth\Middleware\Authentication; use Yiisoft\DataResponse\Middleware\FormatDataResponseAsHtml; use Yiisoft\DataResponse\Middleware\FormatDataResponseAsJson; +use Yiisoft\RequestProvider\RequestCatcherMiddleware; use Yiisoft\Router\Group; use Yiisoft\Router\Route; use Yiisoft\Router\UrlGeneratorInterface; @@ -23,6 +24,7 @@ ->name('api/info'), Route::get('/blog/') + ->middleware(RequestCatcherMiddleware::class) ->action([BlogController::class, 'index']) ->name('blog/index'), @@ -32,11 +34,13 @@ Route::post('/blog/') ->middleware(Authentication::class) + ->middleware(RequestCatcherMiddleware::class) ->action([BlogController::class, 'create']) ->name('blog/create'), Route::put('/blog/{id:\d+}') ->middleware(Authentication::class) + ->middleware(RequestCatcherMiddleware::class) ->action([BlogController::class, 'update']) ->name('blog/update'), @@ -44,11 +48,13 @@ ->prependMiddleware(Authentication::class), Route::post('/auth/') + ->middleware(RequestCatcherMiddleware::class) ->action([AuthController::class, 'login']) ->name('auth'), Route::post('/logout/') ->middleware(Authentication::class) + ->middleware(RequestCatcherMiddleware::class) ->action([AuthController::class, 'logout']) ->name('logout'), diff --git a/blog-api/config/environments/test/params.php b/blog-api/config/environments/test/params.php index a8757bdd2..abcc17960 100644 --- a/blog-api/config/environments/test/params.php +++ b/blog-api/config/environments/test/params.php @@ -10,7 +10,6 @@ 'enabled' => false, ], 'yiisoft/yii-cycle' => [ - // DBAL config 'dbal' => [ 'connections' => [ 'sqlite' => new SQLiteDriverConfig( diff --git a/blog-api/src/Auth/AuthController.php b/blog-api/src/Auth/AuthController.php index de3a7924b..9416937ca 100644 --- a/blog-api/src/Auth/AuthController.php +++ b/blog-api/src/Auth/AuthController.php @@ -14,15 +14,10 @@ #[OA\SecurityScheme(securityScheme: 'ApiKey', type: 'apiKey', name: 'X-Api-Key', in: 'header')] final class AuthController { - private ResponseFactory $responseFactory; - private UserService $userService; - public function __construct( - ResponseFactory $responseFactory, - UserService $userService + private ResponseFactory $responseFactory, + private UserService $userService, ) { - $this->responseFactory = $responseFactory; - $this->userService = $userService; } #[OA\Post( diff --git a/blog-api/src/User/UserRepository.php b/blog-api/src/User/UserRepository.php index acd5d7500..08c8446ee 100644 --- a/blog-api/src/User/UserRepository.php +++ b/blog-api/src/User/UserRepository.php @@ -6,20 +6,20 @@ use Cycle\ORM\ORMInterface; use Cycle\ORM\Select; -use Cycle\ORM\Transaction; use Yiisoft\Auth\IdentityInterface; use Yiisoft\Auth\IdentityRepositoryInterface; use Yiisoft\Auth\IdentityWithTokenRepositoryInterface; use Yiisoft\Data\Cycle\Reader\EntityReader; +use Yiisoft\Data\Cycle\Writer\EntityWriter; use Yiisoft\Data\Reader\Sort; final class UserRepository extends Select\Repository implements IdentityWithTokenRepositoryInterface, IdentityRepositoryInterface { - private ORMInterface $orm; - - public function __construct(Select $select, ORMInterface $orm) - { - $this->orm = $orm; + public function __construct( + Select $select, + private ORMInterface $orm, + private EntityWriter $entityWriter, + ) { parent::__construct($select); } @@ -52,9 +52,7 @@ public function findByLogin(string $login): ?IdentityInterface public function save(IdentityInterface $user): void { - $transaction = new Transaction($this->orm); - $transaction->persist($user); - $transaction->run(); + $this->entityWriter->write([$user]); } private function findIdentityBy(string $field, string $value): ?IdentityInterface diff --git a/blog-api/src/User/UserService.php b/blog-api/src/User/UserService.php index f5df91d55..b125d9e3f 100644 --- a/blog-api/src/User/UserService.php +++ b/blog-api/src/User/UserService.php @@ -15,18 +15,11 @@ final class UserService { - private IdentityRepositoryInterface $identityRepository; - private CurrentUser $currentUser; - private QueueFactoryInterface $queueFactory; - public function __construct( - CurrentUser $currentUser, - IdentityRepositoryInterface $identityRepository, - QueueFactoryInterface $queueFactory + private CurrentUser $currentUser, + private IdentityRepositoryInterface $identityRepository, + private QueueFactoryInterface $queueFactory, ) { - $this->currentUser = $currentUser; - $this->identityRepository = $identityRepository; - $this->queueFactory = $queueFactory; } /** @@ -40,7 +33,9 @@ public function __construct( */ public function login(string $login, string $password): IdentityInterface { - $identity = $this->identityRepository->findByLogin($login); + /** @var UserRepository $identityRepository */ + $identityRepository = $this->identityRepository; + $identity = $identityRepository->findByLogin($login); if ($identity === null) { throw new BadRequestException('No such user.'); } diff --git a/blog-api/tests/Acceptance/AuthCest.php b/blog-api/tests/Acceptance/AuthCest.php index 9b674f59c..2fe54ba8f 100644 --- a/blog-api/tests/Acceptance/AuthCest.php +++ b/blog-api/tests/Acceptance/AuthCest.php @@ -12,7 +12,6 @@ final class AuthCest { public function testAuth(AcceptanceTester $I): void { - $I->haveHttpHeader('Content-Type', 'application/json'); $I->sendPOST( '/auth/', [ diff --git a/blog-api/tests/Acceptance/BlogCest.php b/blog-api/tests/Acceptance/BlogCest.php index d68315881..044974db0 100644 --- a/blog-api/tests/Acceptance/BlogCest.php +++ b/blog-api/tests/Acceptance/BlogCest.php @@ -66,7 +66,7 @@ public function createBadParams(AcceptanceTester $I): void $I->seeResponseContainsJson( [ 'status' => 'failed', - 'error_message' => 'Value not passed.', + 'error_message' => 'Text not passed.', 'error_code' => 400, 'data' => null, ] From e85393de6c2806d353a402e80d0414fc04c1ca8e Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Sat, 21 Sep 2024 14:07:04 +0500 Subject: [PATCH 54/58] Store .lock files in VCS (#627) * Store .lock files in VCS * Fix symfony/console problem * Fix * Fix * Fix 2 * Fix 3 * Fix 4 * Fix 5 * Fix 6 * Fix 7 * Fix 8 * Fix 9 * Fix 10 * Fix 11 --- blog-api/.gitignore | 2 - blog-api/composer.json | 6 + blog-api/composer.lock | 16823 +++++++++++++++++++++++++++++++++++ blog/.gitignore | 2 - blog/composer.json | 9 + blog/composer.lock | 18750 +++++++++++++++++++++++++++++++++++++++ blog/package-lock.json | 13 + 7 files changed, 35601 insertions(+), 4 deletions(-) create mode 100644 blog-api/composer.lock create mode 100644 blog/composer.lock create mode 100644 blog/package-lock.json diff --git a/blog-api/.gitignore b/blog-api/.gitignore index cb3701b11..c1cab5794 100644 --- a/blog-api/.gitignore +++ b/blog-api/.gitignore @@ -15,8 +15,6 @@ Thumbs.db # composer vendor dir /vendor -/composer.lock - # composer itself is not needed composer.phar diff --git a/blog-api/composer.json b/blog-api/composer.json index 95d416c5c..7cf0e3f8e 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -96,6 +96,12 @@ "yiisoft/yii-gii": "dev-master", "yiisoft/yii-testing": "dev-master" }, + "conflict": { + "symfony/css-selector": ">6", + "symfony/event-dispatcher": ">6", + "symfony/filesystem": ">6", + "symfony/string": ">6" + }, "autoload": { "psr-4": { "App\\": "src" diff --git a/blog-api/composer.lock b/blog-api/composer.lock new file mode 100644 index 000000000..5bb65d02c --- /dev/null +++ b/blog-api/composer.lock @@ -0,0 +1,16823 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "d86c96605f9d1d39dd9180e463d6a632", + "packages": [ + { + "name": "alexkart/curl-builder", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/alexkart/curl-builder.git", + "reference": "626cf95a84a37b6e1643675f7fc4acfc2f90dbfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alexkart/curl-builder/zipball/626cf95a84a37b6e1643675f7fc4acfc2f90dbfb", + "reference": "626cf95a84a37b6e1643675f7fc4acfc2f90dbfb", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "psr/http-message": "^1.0" + }, + "require-dev": { + "nyholm/psr7": "^1.3", + "phan/phan": "^5.4", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Alexkart\\CurlBuilder\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alexander Kartavenko", + "email": "askemailbox@gmail.com" + } + ], + "description": "PSR-7 compatible curl builder.", + "support": { + "issues": "https://github.com/alexkart/curl-builder/issues", + "source": "https://github.com/alexkart/curl-builder/tree/1.0.8" + }, + "time": "2023-05-29T13:44:51+00:00" + }, + { + "name": "cebe/markdown", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/cebe/markdown.git", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/markdown/zipball/9bac5e971dd391e2802dca5400bbeacbaea9eb86", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86", + "shasum": "" + }, + "require": { + "lib-pcre": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "cebe/indent": "*", + "facebook/xhprof": "*@dev", + "phpunit/phpunit": "4.1.*" + }, + "bin": [ + "bin/markdown" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "cebe\\markdown\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Creator" + } + ], + "description": "A super fast, highly extensible markdown parser for PHP", + "homepage": "https://github.com/cebe/markdown#readme", + "keywords": [ + "extensible", + "fast", + "gfm", + "markdown", + "markdown-extra" + ], + "support": { + "issues": "https://github.com/cebe/markdown/issues", + "source": "https://github.com/cebe/markdown" + }, + "time": "2018-03-26T11:24:36+00:00" + }, + { + "name": "cycle/annotated", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/annotated.git", + "reference": "4024d2ea9b5656cdd0bf4e79acc485dc063b8273" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/annotated/zipball/4024d2ea9b5656cdd0bf4e79acc485dc063b8273", + "reference": "4024d2ea9b5656cdd0bf4e79acc485dc063b8273", + "shasum": "" + }, + "require": { + "cycle/orm": "^2.7", + "cycle/schema-builder": "^2.8", + "doctrine/annotations": "^1.14.3 || ^2.0.1", + "doctrine/inflector": "^2.0", + "php": ">=8.0", + "spiral/attributes": "^2.8|^3.0", + "spiral/tokenizer": "^2.8|^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6", + "vimeo/psalm": "^4.30" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Annotated\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Cycle ORM Annotated Entities generator", + "support": { + "issues": "https://github.com/cycle/annotated/issues", + "source": "https://github.com/cycle/annotated/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://github.com/cycle", + "type": "github" + } + ], + "time": "2024-02-08T21:32:45+00:00" + }, + { + "name": "cycle/database", + "version": "2.11.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/database.git", + "reference": "5f3fe4fc198d607fc40110e2fdb36b3c1c4e10f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/database/zipball/5f3fe4fc198d607fc40110e2fdb36b3c1c4e10f7", + "reference": "5f3fe4fc198d607fc40110e2fdb36b3c1c4e10f7", + "shasum": "" + }, + "require": { + "ext-pdo": "*", + "php": ">=8.0", + "psr/log": "1 - 3", + "spiral/core": "^2.8 || ^3.0", + "spiral/pagination": "^2.8 || ^3.0", + "symfony/polyfill-php83": "^1.28" + }, + "conflict": { + "spiral/database": "*" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.42", + "infection/infection": "^0.26.10", + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^9.5", + "spiral/tokenizer": "^2.14 || ^3.0", + "vimeo/psalm": "^5.18" + }, + "type": "library", + "autoload": { + "files": [ + "src/polyfill.php", + "src/functions_polyfill.php" + ], + "psr-4": { + "Cycle\\Database\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + } + ], + "description": "DBAL, schema introspection, migration and pagination", + "homepage": "https://cycle-orm.dev", + "keywords": [ + "database", + "dbal", + "mssql", + "mysql", + "orm", + "postgresql", + "query-builder", + "sql", + "sqlite" + ], + "support": { + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/database/issues", + "source": "https://github.com/cycle/database" + }, + "funding": [ + { + "url": "https://github.com/sponsors/cycle", + "type": "github" + } + ], + "time": "2024-06-11T11:30:02+00:00" + }, + { + "name": "cycle/entity-behavior", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/cycle/entity-behavior.git", + "reference": "9b7ad13a68a0ea0dca0399b7f44f20b691a18120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/entity-behavior/zipball/9b7ad13a68a0ea0dca0399b7f44f20b691a18120", + "reference": "9b7ad13a68a0ea0dca0399b7f44f20b691a18120", + "shasum": "" + }, + "require": { + "cycle/orm": "^2.7", + "cycle/schema-builder": "^2.8", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1", + "yiisoft/injector": "^1.0" + }, + "require-dev": { + "cycle/annotated": "^3.0", + "phpunit/phpunit": "^9.5", + "ramsey/uuid": "^4.5", + "spiral/tokenizer": "^2.8 || ^3.0", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\ORM\\Entity\\Behavior\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Provides a collection of attributes that add behaviors to Cycle ORM entities", + "homepage": "https://cycle-orm.dev", + "support": { + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/entity-behavior/issues", + "source": "https://github.com/cycle/entity-behavior" + }, + "funding": [ + { + "url": "https://github.com/sponsors/cycle", + "type": "github" + } + ], + "time": "2024-08-09T11:47:14+00:00" + }, + { + "name": "cycle/migrations", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/cycle/migrations.git", + "reference": "434b08be175bf87f920651b9f6d91fc1cb7ed3ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/migrations/zipball/434b08be175bf87f920651b9f6d91fc1cb7ed3ba", + "reference": "434b08be175bf87f920651b9f6d91fc1cb7ed3ba", + "shasum": "" + }, + "require": { + "cycle/database": "^2.7.0", + "php": ">=8.1", + "spiral/core": "^3.0", + "spiral/files": "^3.0", + "spiral/reactor": "^3.0", + "spiral/tokenizer": "^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "dev-master" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Migrations\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Database migrations, migration scaffolding", + "support": { + "issues": "https://github.com/cycle/migrations/issues", + "source": "https://github.com/cycle/migrations/tree/v4.2.3" + }, + "time": "2024-01-25T10:49:43+00:00" + }, + { + "name": "cycle/orm", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/orm.git", + "reference": "23023be5e8452c1e5b05417f9c4539db71d60927" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/orm/zipball/23023be5e8452c1e5b05417f9c4539db71d60927", + "reference": "23023be5e8452c1e5b05417f9c4539db71d60927", + "shasum": "" + }, + "require": { + "cycle/database": "^2.8.1", + "doctrine/instantiator": "^1.3.1 || ^2.0", + "ext-pdo": "*", + "php": ">=8.0", + "spiral/core": "^2.8 || ^3.0" + }, + "require-dev": { + "doctrine/collections": "^1.6 || ^2.0", + "illuminate/collections": "^8.0", + "loophp/collection": "^6.0 || ^7.0", + "mockery/mockery": "^1.1", + "phpunit/phpunit": "^9.5", + "ramsey/uuid": "^4.0", + "spiral/tokenizer": "^2.8 || ^3.0", + "symfony/var-dumper": "^5.2 || ^6.0 || ^7.0", + "vimeo/psalm": "5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\ORM\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "PHP DataMapper ORM and Data Modelling Engine", + "homepage": "https://cycle-orm.dev", + "support": { + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/orm/issues", + "source": "https://github.com/cycle/orm" + }, + "funding": [ + { + "url": "https://github.com/sponsors/cycle", + "type": "github" + } + ], + "time": "2024-06-05T13:14:36+00:00" + }, + { + "name": "cycle/schema-builder", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/schema-builder.git", + "reference": "413af8fc8f93c6e48cebc76ab6c37c65fe2cab63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/schema-builder/zipball/413af8fc8f93c6e48cebc76ab6c37c65fe2cab63", + "reference": "413af8fc8f93c6e48cebc76ab6c37c65fe2cab63", + "shasum": "" + }, + "require": { + "cycle/database": "^2.7.1", + "cycle/orm": "^2.7", + "php": ">=8.0", + "yiisoft/friendly-exception": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "spiral/tokenizer": "^2.8", + "symfony/console": "^6.0 || ^7.0", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cycle\\Schema\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Cycle ORM Schema Builder", + "support": { + "issues": "https://github.com/cycle/schema-builder/issues", + "source": "https://github.com/cycle/schema-builder/tree/v2.9.0" + }, + "time": "2024-07-10T16:20:17+00:00" + }, + { + "name": "cycle/schema-migrations-generator", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/schema-migrations-generator.git", + "reference": "94cb613ec77376cf880c9488daa3668b1f856e80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/schema-migrations-generator/zipball/94cb613ec77376cf880c9488daa3668b1f856e80", + "reference": "94cb613ec77376cf880c9488daa3668b1f856e80", + "shasum": "" + }, + "require": { + "cycle/database": "^2.4.1", + "cycle/migrations": "^4.2", + "cycle/schema-builder": "^2.0", + "php": ">=8.1" + }, + "require-dev": { + "cycle/annotated": "^3.0", + "cycle/orm": "^2.0", + "phpunit/phpunit": "^9.5", + "spiral/debug": "^3.0", + "spiral/framework": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Schema\\Generator\\Migrations\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Cycle ORM Migration generation", + "support": { + "issues": "https://github.com/cycle/schema-migrations-generator/issues", + "source": "https://github.com/cycle/schema-migrations-generator/tree/2.2.0" + }, + "time": "2023-11-02T09:24:12+00:00" + }, + { + "name": "cycle/schema-provider", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/schema-provider.git", + "reference": "d6e800d6cd498cf1053522b6c2348f6eea587aae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/schema-provider/zipball/d6e800d6cd498cf1053522b6c2348f6eea587aae", + "reference": "d6e800d6cd498cf1053522b6c2348f6eea587aae", + "shasum": "" + }, + "require": { + "cycle/orm": "^2.0", + "cycle/schema-renderer": "^1.2", + "php": ">=8.0", + "psr/container": "^1.0 || ^2.0", + "psr/simple-cache": "^2.0 || ^3.0", + "spiral/files": "^2.14 || ^3.11", + "webmozart/glob": "^4.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.48", + "phpunit/phpunit": "^9.6", + "roave/security-advisories": "dev-latest", + "vimeo/psalm": "^4.30.0 || ^5.21", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Schema\\Provider\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Cycle ORM Schema providers", + "homepage": "https://cycle-orm.dev", + "support": { + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/schema-provider/issues", + "source": "https://github.com/cycle/schema-provider" + }, + "funding": [ + { + "url": "https://github.com/sponsors/cycle", + "type": "github" + } + ], + "time": "2024-02-05T13:58:34+00:00" + }, + { + "name": "cycle/schema-renderer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/schema-renderer.git", + "reference": "5c2b7977c2803c6c9bacc56064abda5ea2b273a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/schema-renderer/zipball/5c2b7977c2803c6c9bacc56064abda5ea2b273a3", + "reference": "5c2b7977c2803c6c9bacc56064abda5ea2b273a3", + "shasum": "" + }, + "require": { + "cycle/orm": "1.2 - 2", + "php": ">=7.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "spiral/code-style": "^1.0", + "vimeo/psalm": "^4.10|^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Schema\\Renderer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Utils for Cycle ORM Schema rendering", + "support": { + "issues": "https://github.com/cycle/schema-renderer/issues", + "source": "https://github.com/cycle/schema-renderer/tree/1.2.0" + }, + "time": "2022-12-15T16:14:14+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.10.28", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.2" + }, + "time": "2024-09-05T10:17:24+00:00" + }, + { + "name": "doctrine/collections", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ext-json": "*", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.2.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", + "type": "tidelift" + } + ], + "time": "2024-04-18T06:56:21+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "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" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "httpsoft/http-message", + "version": "1.1.6", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-message.git", + "reference": "f6c88e2189b9f75f10dfaeb0a85c56ea04a53c19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-message/zipball/f6c88e2189b9f75f10dfaeb0a85c56ea04a53c19", + "reference": "f6c88e2189b9f75f10dfaeb0a85c56ea04a53c19", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1|^2.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "php-http/psr7-integration-tests": "^1.3", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Strict and fast implementation of PSR-7 and PSR-17", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-message", + "php", + "psr-17", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/message", + "issues": "https://github.com/httpsoft/http-message/issues", + "source": "https://github.com/httpsoft/http-message" + }, + "time": "2024-08-09T07:13:21+00:00" + }, + { + "name": "jetbrains/phpstorm-attributes", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/JetBrains/phpstorm-attributes.git", + "reference": "22fb28d679deceedba8366dbae65cc8ebfc17e26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JetBrains/phpstorm-attributes/zipball/22fb28d679deceedba8366dbae65cc8ebfc17e26", + "reference": "22fb28d679deceedba8366dbae65cc8ebfc17e26", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "JetBrains\\PhpStorm\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "JetBrains", + "homepage": "https://www.jetbrains.com" + } + ], + "description": "PhpStorm specific attributes", + "keywords": [ + "attributes", + "jetbrains", + "phpstorm" + ], + "support": { + "issues": "https://youtrack.jetbrains.com/newIssue?project=WI", + "source": "https://github.com/JetBrains/phpstorm-attributes/tree/1.1" + }, + "time": "2023-09-01T08:50:25+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.4" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2022-08-04T09:53:51+00:00" + }, + { + "name": "nette/php-generator", + "version": "v4.1.6", + "source": { + "type": "git", + "url": "https://github.com/nette/php-generator.git", + "reference": "c90961e782ae86e517fe5ed732eb2b512945565b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/php-generator/zipball/c90961e782ae86e517fe5ed732eb2b512945565b", + "reference": "c90961e782ae86e517fe5ed732eb2b512945565b", + "shasum": "" + }, + "require": { + "nette/utils": "^3.2.9 || ^4.0", + "php": "8.0 - 8.4" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.4", + "nikic/php-parser": "^4.18 || ^5.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.8" + }, + "suggest": { + "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.3 features.", + "homepage": "https://nette.org", + "keywords": [ + "code", + "nette", + "php", + "scaffolding" + ], + "support": { + "issues": "https://github.com/nette/php-generator/issues", + "source": "https://github.com/nette/php-generator/tree/v4.1.6" + }, + "time": "2024-09-10T09:31:55+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.5" + }, + "time": "2024-08-07T15:39:19+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "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": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "spiral/attributes", + "version": "v3.1.7", + "source": { + "type": "git", + "url": "https://github.com/spiral/attributes.git", + "reference": "fc6657de4ed83913c7f02241e5fe4e8e799af8fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/attributes/zipball/fc6657de4ed83913c7f02241e5fe4e8e799af8fa", + "reference": "fc6657de4ed83913c7f02241e5fe4e8e799af8fa", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "1 - 3", + "psr/simple-cache": "1 - 3" + }, + "require-dev": { + "doctrine/annotations": "^1.14 || ^2.0", + "jetbrains/phpstorm-attributes": "^1.0", + "phpunit/phpunit": "^9.5.20", + "vimeo/psalm": "^5.17" + }, + "type": "library", + "autoload": { + "files": [ + "src/polyfill.php" + ], + "psr-4": { + "Spiral\\Attributes\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Kirill Nesmeyanov (SerafimArts)", + "email": "kirill.nesmeyanov@spiralscout.com" + } + ], + "description": "PHP attributes reader", + "homepage": "https://spiral.dev", + "keywords": [ + "annotations", + "attributes", + "metadata" + ], + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://spiral.dev/docs", + "forum": "https://forum.spiral.dev", + "issues": "https://github.com/spiral/attributes/issues", + "source": "https://github.com/spiral/attributes" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-08-22T10:18:52+00:00" + }, + { + "name": "spiral/core", + "version": "3.14.2", + "source": { + "type": "git", + "url": "https://github.com/spiral/core.git", + "reference": "53bec6e433d709f59ef6c0ce966f4a640c4d1bad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/core/zipball/53bec6e433d709f59ef6c0ce966f4a640c4d1bad", + "reference": "53bec6e433d709f59ef6c0ce966f4a640c4d1bad", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0" + }, + "provide": { + "psr/container-implementation": "^1.1|^2.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Core\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "IoC container, IoC scopes, factory, memory, configuration interfaces", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/core" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-10T16:54:43+00:00" + }, + { + "name": "spiral/files", + "version": "3.14.3", + "source": { + "type": "git", + "url": "https://github.com/spiral/files.git", + "reference": "0c394e058ee994b6d18a229dcbe310e4de3a2b7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/files/zipball/0c394e058ee994b6d18a229dcbe310e4de3a2b7a", + "reference": "0c394e058ee994b6d18a229dcbe310e4de3a2b7a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Files\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "File Toolkit: atomic file manager", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/files" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-03T16:58:09+00:00" + }, + { + "name": "spiral/logger", + "version": "3.14.1", + "source": { + "type": "git", + "url": "https://github.com/spiral/logger.git", + "reference": "c832f1038aed009f6cd1f5194ca7a14bb533723a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/logger/zipball/c832f1038aed009f6cd1f5194ca7a14bb533723a", + "reference": "c832f1038aed009f6cd1f5194ca7a14bb533723a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "1 - 3", + "spiral/core": "^3.14.1" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Logger\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "LogFactory and global log listeners", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/logger" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-04T10:56:14+00:00" + }, + { + "name": "spiral/pagination", + "version": "3.14.3", + "source": { + "type": "git", + "url": "https://github.com/spiral/pagination.git", + "reference": "93c9d93c811b4ec6037491e516c3e194fdc94848" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/pagination/zipball/93c9d93c811b4ec6037491e516c3e194fdc94848", + "reference": "93c9d93c811b4ec6037491e516c3e194fdc94848", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Pagination\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Common pagination interfaces", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/pagination" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-03T16:59:10+00:00" + }, + { + "name": "spiral/reactor", + "version": "3.14.3", + "source": { + "type": "git", + "url": "https://github.com/spiral/reactor.git", + "reference": "74639a44ced7eb289820fdcca96ff9322f79f882" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/reactor/zipball/74639a44ced7eb289820fdcca96ff9322f79f882", + "reference": "74639a44ced7eb289820fdcca96ff9322f79f882", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "nette/php-generator": "^4.1.2", + "php": ">=8.1", + "spiral/files": "^3.14.3" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "psr/container": "^1.1|^2.0", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Reactor\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Reactor: Code Scaffolding", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/reactor" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-11T17:40:25+00:00" + }, + { + "name": "spiral/tokenizer", + "version": "3.14.1", + "source": { + "type": "git", + "url": "https://github.com/spiral/tokenizer.git", + "reference": "0526f2b73725d002278b786ad7b16f27968aef63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/tokenizer/zipball/0526f2b73725d002278b786ad7b16f27968aef63", + "reference": "0526f2b73725d002278b786ad7b16f27968aef63", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=8.1", + "spiral/core": "^3.14.1", + "spiral/logger": "^3.14.1", + "symfony/finder": "^5.3.7 || ^6.0 || ^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "phpunit/phpunit": "^10.1", + "spiral/attributes": "^2.8|^3.0", + "spiral/boot": "^3.14.1", + "spiral/files": "^3.14.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Tokenizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Static Analysis: Class and Invocation locators", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/tokenizer" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-04T10:56:34+00:00" + }, + { + "name": "swagger-api/swagger-ui", + "version": "v5.17.14", + "source": { + "type": "git", + "url": "https://github.com/swagger-api/swagger-ui.git", + "reference": "74ed0adebfc9c8dd0de2bf8e81495b022a66c083" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/74ed0adebfc9c8dd0de2bf8e81495b022a66c083", + "reference": "74ed0adebfc9c8dd0de2bf8e81495b022a66c083", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Anna Bodnia", + "email": "anna.bodnia@gmail.com" + }, + { + "name": "Buu Nguyen", + "email": "buunguyen@gmail.com" + }, + { + "name": "Josh Ponelat", + "email": "jponelat@gmail.com" + }, + { + "name": "Kyle Shockey", + "email": "kyleshockey1@gmail.com" + }, + { + "name": "Robert Barnwell", + "email": "robert@robertismy.name" + }, + { + "name": "Sahar Jafari", + "email": "shr.jafari@gmail.com" + } + ], + "description": " Swagger UI is a collection of HTML, Javascript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API.", + "homepage": "http://swagger.io", + "keywords": [ + "api", + "documentation", + "openapi", + "specification", + "swagger", + "ui" + ], + "support": { + "issues": "https://github.com/swagger-api/swagger-ui/issues", + "source": "https://github.com/swagger-api/swagger-ui/tree/v5.17.14" + }, + "time": "2024-05-28T05:24:40+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T08:15:52+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ae25a9145a900764158d439653d5630191155ca0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ae25a9145a900764158d439653d5630191155ca0", + "reference": "ae25a9145a900764158d439653d5630191155ca0", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-13T14:03:51+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ba727797426af0f587f4800566300bdc0cda0777" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ba727797426af0f587f4800566300bdc0cda0777", + "reference": "ba727797426af0f587f4800566300bdc0cda0777", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-29T07:35:21+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-30T16:03:21+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/762ee56b2649659380e0ef4d592d807bc17b7971", + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-17T12:47:12+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + }, + { + "name": "webmozart/glob", + "version": "4.7.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/glob.git", + "reference": "8a2842112d6916e61e0e15e316465b611f3abc17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/glob/zipball/8a2842112d6916e61e0e15e316465b611f3abc17", + "reference": "8a2842112d6916e61e0e15e316465b611f3abc17", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "symfony/filesystem": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Glob\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A PHP implementation of Ant's glob.", + "support": { + "issues": "https://github.com/webmozarts/glob/issues", + "source": "https://github.com/webmozarts/glob/tree/4.7.0" + }, + "time": "2024-03-07T20:33:40+00:00" + }, + { + "name": "yiisoft/access", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/access.git", + "reference": "7a8ac9c4802d31cf47789c742575232c7fb1ae8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/access/zipball/7a8ac9c4802d31cf47789c742575232c7fb1ae8b", + "reference": "7a8ac9c4802d31cf47789c742575232c7fb1ae8b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.18" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Access\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "An interface for checking access", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "access", + "interface", + "rbac", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/access/issues?state=open", + "source": "https://github.com/yiisoft/access", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2022-04-05T17:21:55+00:00" + }, + { + "name": "yiisoft/aliases", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/aliases.git", + "reference": "2ed5e38d6ac503ec4c1af39115361097b6449135" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/aliases/zipball/2ed5e38d6ac503ec4c1af39115361097b6449135", + "reference": "2ed5e38d6ac503ec4c1af39115361097b6449135", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Aliases\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Named paths and URLs storage", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "alias" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/aliases/issues?state=open", + "source": "https://github.com/yiisoft/aliases", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-02-13T10:14:03+00:00" + }, + { + "name": "yiisoft/arrays", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/arrays.git", + "reference": "e07c7268bd53903108ed556df93ef75b4bac6760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/arrays/zipball/e07c7268bd53903108ed556df93ef75b4bac6760", + "reference": "e07c7268bd53903108ed556df93ef75b4bac6760", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/strings": "^2.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.20" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Arrays\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Array Helper", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "array", + "helper", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://forum.yiiframework.com/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/arrays/issues", + "source": "https://github.com/yiisoft/arrays", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-04-04T11:07:18+00:00" + }, + { + "name": "yiisoft/assets", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/assets.git", + "reference": "14984b2c8a87236da8c8ef5a4f1273d4ff8a36bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/assets/zipball/14984b2c8a87236da8c8ef5a4f1273d4ff8a36bc", + "reference": "14984b2c8a87236da8c8ef5a4f1273d4ff8a36bc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "psr/log": "^1.1|^2.0|^3.0", + "yiisoft/aliases": "^1.1|^2.0|^3.0", + "yiisoft/files": "^2.0", + "yiisoft/json": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Assets\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Asset bundles and asset manager", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "assets", + "library", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/assets/issues?state=open", + "source": "https://github.com/yiisoft/assets", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-13T11:15:18+00:00" + }, + { + "name": "yiisoft/auth", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/auth.git", + "reference": "497197fc2bbc2c4b2b8b35b177e0f4476fbe17ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/auth/zipball/497197fc2bbc2c4b2b8b35b177e0f4476fbe17ee", + "reference": "497197fc2bbc2c4b2b8b35b177e0f4476fbe17ee", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.3", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.8", + "yiisoft/yii-debug": "dev-master|dev-php80" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Auth\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii auth", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "auth", + "middleware" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/auth/issues?state=open", + "source": "https://github.com/yiisoft/auth", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-05-06T12:26:49+00:00" + }, + { + "name": "yiisoft/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/cache.git", + "reference": "67ae4b40d3aefd193dfd9a3f458f3e145adb0d84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/cache/zipball/67ae4b40d3aefd193dfd9a3f458f3e145adb0d84", + "reference": "67ae4b40d3aefd193dfd9a3f458f3e145adb0d84", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "psr/simple-cache": "^2.0|^3.0" + }, + "provide": { + "psr/simple-cache-implementation": "2.0|3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.2", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.2" + }, + "suggest": { + "yiisoft/cache-apcu": "Allows to store cache using APCu PECL extension", + "yiisoft/cache-db": "Allows storing cache to the database", + "yiisoft/cache-file": "Allows storing cache to the files", + "yiisoft/cache-memcached": "Allows to store cache using Memcached PECL extension", + "yiisoft/cache-redis": "Allows storing cache to the Redis", + "yiisoft/cache-wincache": "Allows to store cache using WinCache PECL extension" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Cache\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Caching Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "cache", + "psr-16", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/cache/issues?state=open", + "source": "https://github.com/yiisoft/cache", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-02-15T14:30:56+00:00" + }, + { + "name": "yiisoft/cache-file", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/cache-file.git", + "reference": "226ff0731adabc884c149f711190a7ac8b14800d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/cache-file/zipball/226ff0731adabc884c149f711190a7ac8b14800d", + "reference": "226ff0731adabc884c149f711190a7ac8b14800d", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/simple-cache": "^2.0|^3.0" + }, + "provide": { + "psr/simple-cache-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "php-mock/php-mock-phpunit": "^2.6", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.2" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Cache\\File\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Caching Library - File Handler", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "cache", + "file", + "framework", + "psr-16", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/cache-file/issues?state=open", + "source": "https://github.com/yiisoft/cache-file", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-10-09T14:49:20+00:00" + }, + { + "name": "yiisoft/config", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/config.git", + "reference": "8cd32f003af59303f3ba8dd520eb85f830689575" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/config/zipball/8cd32f003af59303f3ba8dd520eb85f830689575", + "reference": "8cd32f003af59303f3ba8dd520eb85f830689575", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^8.0", + "yiisoft/arrays": "^3.0", + "yiisoft/strings": "^2.0", + "yiisoft/var-dumper": "^1.1" + }, + "require-dev": { + "composer/composer": "^2.0", + "ext-json": "*", + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6" + }, + "suggest": { + "symfony/console": "To use composer commands `yii-config-copy` and `yii-config-rebuild`." + }, + "type": "composer-plugin", + "extra": { + "class": "Yiisoft\\Config\\Composer\\EventHandler" + }, + "autoload": { + "psr-4": { + "Yiisoft\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Composer plugin and a library for config assembling", + "homepage": "https://github.com/yiisoft/config", + "keywords": [ + "composer", + "config", + "plugin" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/config/issues?state=open", + "source": "https://github.com/yiisoft/config", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-12-25T17:12:50+00:00" + }, + { + "name": "yiisoft/cookies", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/cookies.git", + "reference": "ceba1d0647f1210331d90372ca83a8ecc952ebef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/cookies/zipball/ceba1d0647f1210331d90372ca83a8ecc952ebef", + "reference": "ceba1d0647f1210331d90372ca83a8ecc952ebef", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-message-implementation": "1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1|^2.0|^3.0", + "yiisoft/http": "^1.2", + "yiisoft/security": "^1.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^3.8|^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.21", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Cookies\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Convenient way to use cookies with PSR-7", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "cookie", + "cookies", + "psr-7" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/cookies/issues?state=open", + "source": "https://github.com/yiisoft/cookies", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-04-05T07:20:16+00:00" + }, + { + "name": "yiisoft/csrf", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/csrf.git", + "reference": "2168b5f83ec9ce65e9d0ca08fa88613e6778d377" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/csrf/zipball/2168b5f83ec9ce65e9d0ca08fa88613e6778d377", + "reference": "2168b5f83ec9ce65e9d0ca08fa88613e6778d377", + "shasum": "" + }, + "require": { + "ext-hash": "*", + "php": "^7.4|^8.0", + "psr/http-factory": "^1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-message-implementation": "1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/security": "^1.0", + "yiisoft/session": "^1.0|^2.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.2", + "nyholm/psr7": "^1.3", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.24", + "yiisoft/di": "^1.1" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Csrf\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii CSRF Protection Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "breach", + "csrf", + "hmac", + "middleware", + "psr-15", + "stateless", + "synchronizer" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/csrf/issues?state=open", + "source": "https://github.com/yiisoft/csrf", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-05-08T09:48:50+00:00" + }, + { + "name": "yiisoft/data", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/data.git", + "reference": "714ca834858bea280ce8781fc5915fa8775f780b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/data/zipball/714ca834858bea280ce8781fc5915fa8775f780b", + "reference": "714ca834858bea280ce8781fc5915fa8775f780b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1", + "yiisoft/arrays": "^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.20" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Data\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Data providers, pagination and related abstractions", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "data processor", + "data provider", + "data reader", + "data writer", + "filter", + "pagination" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/data/issues?state=open", + "source": "https://github.com/yiisoft/data", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-10T17:50:47+00:00" + }, + { + "name": "yiisoft/data-cycle", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/data-cycle.git", + "reference": "708074a77942ab1d7f424bc21a6912b7d62641da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/data-cycle/zipball/708074a77942ab1d7f424bc21a6912b7d62641da", + "reference": "708074a77942ab1d7f424bc21a6912b7d62641da", + "shasum": "" + }, + "require": { + "cycle/database": "^2.10", + "cycle/orm": "^2.7.1", + "php": "^8.1", + "yiisoft/data": "dev-master" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.21", + "vlucas/phpdotenv": "^5.6" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Data\\Cycle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Cycle ORM query adapter for yiisoft/data", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "cycle", + "data provider", + "database", + "db", + "orm" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/data-cycle/issues?state=open", + "source": "https://github.com/yiisoft/data-cycle", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-11T18:58:59+00:00" + }, + { + "name": "yiisoft/data-response", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/data-response.git", + "reference": "7de8c880d0d6629867a51c5c2529c984e50dfbc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/data-response/zipball/7de8c880d0d6629867a51c5c2529c984e50dfbc3", + "reference": "7de8c880d0d6629867a51c5c2529c984e50dfbc3", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^8.1", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/json": "^1.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.22", + "yiisoft/di": "^1.1" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\DataResponse\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Allows responding with data that is automatically converted into PSR-7 response", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "data", + "psr-7", + "response" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/data-response/issues?state=open", + "source": "https://github.com/yiisoft/data-response", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-03-03T06:01:50+00:00" + }, + { + "name": "yiisoft/definitions", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/definitions.git", + "reference": "5cb53d07afab3336705a52ddc90c37237cc4b316" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/definitions/zipball/5cb53d07afab3336705a52ddc90c37237cc4b316", + "reference": "5cb53d07afab3336705a52ddc90c37237cc4b316", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.21", + "yiisoft/test-support": "^1.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Definitions\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "The package provides definition syntax", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "definitions" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/definitions/issues?state=open", + "source": "https://github.com/yiisoft/definitions", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-16T13:31:21+00:00" + }, + { + "name": "yiisoft/di", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/di.git", + "reference": "a6d889f74030a381dad337f1bd1ea9de7341bc9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/di/zipball/a6d889f74030a381dad337f1bd1ea9de7341bc9b", + "reference": "a6d889f74030a381dad337f1bd1ea9de7341bc9b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "psr/container": "^1.1|^2.0", + "yiisoft/definitions": "^3.0" + }, + "provide": { + "psr/container-implementation": "1.0.0" + }, + "require-dev": { + "league/container": "^4.2", + "maglnet/composer-require-checker": "^4.2", + "phpbench/phpbench": "^1.2.0", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.14.3", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.29", + "yiisoft/injector": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "phpbench/phpbench": "To run benchmarks.", + "yiisoft/injector": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Di\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii DI container", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "Autowiring", + "PSR-11", + "container", + "dependency", + "di", + "injection", + "injector" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/di/issues?state=open", + "source": "https://github.com/yiisoft/di", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2022-12-23T16:12:56+00:00" + }, + { + "name": "yiisoft/error-handler", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/error-handler.git", + "reference": "a263c9dea48d5a42022dd7df76706cff39e3e960" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/error-handler/zipball/a263c9dea48d5a42022dd7df76706cff39e3e960", + "reference": "a263c9dea48d5a42022dd7df76706cff39e3e960", + "shasum": "" + }, + "require": { + "alexkart/curl-builder": "^1.0", + "cebe/markdown": "^1.2", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1|^2.0|^3.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/injector": "^1.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0.9", + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25", + "yiisoft/di": "^1.1", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\ErrorHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Error Handling Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "PSR-11", + "error-handler", + "psr-15", + "psr-3", + "psr-7", + "yiisoft" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/error-handler/issues?state=open", + "source": "https://github.com/yiisoft/error-handler", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-07-11T12:16:20+00:00" + }, + { + "name": "yiisoft/event-dispatcher", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/event-dispatcher.git", + "reference": "2b1262a56260030aaac386bf8ef75ec072abc7e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/event-dispatcher/zipball/2b1262a56260030aaac386bf8ef75ec072abc7e3", + "reference": "2b1262a56260030aaac386bf8ef75ec072abc7e3", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "1.0.0" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.14.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.18" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\EventDispatcher\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Event Dispatcher", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "event", + "event dispatcher", + "psr-14" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/event-dispatcher/issues?state=open", + "source": "https://github.com/yiisoft/event-dispatcher", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2022-10-27T12:02:21+00:00" + }, + { + "name": "yiisoft/factory", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/factory.git", + "reference": "4537a78ae1a3b49bd86e83d09f0772034e45f193" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/factory/zipball/4537a78ae1a3b49bd86e83d09f0772034e45f193", + "reference": "4537a78ae1a3b49bd86e83d09f0772034e45f193", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/definitions": "^1.0|^2.0|^3.0.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Factory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Factory", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "factory" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/factory/issues", + "source": "https://github.com/yiisoft/factory", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-12-03T05:59:14+00:00" + }, + { + "name": "yiisoft/files", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/files.git", + "reference": "129a8f8220e1cd2530f424951b8c24f426bd219c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/files/zipball/129a8f8220e1cd2530f424951b8c24f426bd219c", + "reference": "129a8f8220e1cd2530f424951b8c24f426bd219c", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Files\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Helper to manage files and directories", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "files" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/files/issues?state=open", + "source": "https://github.com/yiisoft/files", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2022-07-05T06:43:38+00:00" + }, + { + "name": "yiisoft/friendly-exception", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/friendly-exception.git", + "reference": "4b4a19edff251791e3c92d4d83435d2716351ff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/friendly-exception/zipball/4b4a19edff251791e3c92d4d83435d2716351ff4", + "reference": "4b4a19edff251791e3c92d4d83435d2716351ff4", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.4", + "roave/infection-static-analysis-plugin": "^1.5", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\FriendlyException\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "An interface for friendlier exception", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "error handling", + "exception", + "exceptions", + "friendly" + ], + "support": { + "forum": "http://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/friendly-exception/issues?state=open", + "source": "https://github.com/yiisoft/friendly-exception", + "wiki": "http://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2021-10-26T21:43:25+00:00" + }, + { + "name": "yiisoft/html", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/html.git", + "reference": "968aa8b336135242bdaef9646fa3d53c3c0731f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/html/zipball/968aa8b336135242bdaef9646fa3d53c3c0731f7", + "reference": "968aa8b336135242bdaef9646fa3d53c3c0731f7", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/arrays": "^2.0|^3.0", + "yiisoft/json": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.26.19", + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Html\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Handy library to generate HTML", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "html" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://forum.yiiframework.com/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/html/issues?state=open", + "source": "https://github.com/yiisoft/html", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-18T11:48:50+00:00" + }, + { + "name": "yiisoft/http", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/http.git", + "reference": "7967b2c45dbf6af785dea4ea481af23da6d49c5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/http/zipball/7967b2c45dbf6af785dea4ea481af23da6d49c5d", + "reference": "7967b2c45dbf6af785dea4ea481af23da6d49c5d", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.10", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Constants and PSR-7 PhpStorm meta for HTTP protocol headers, methods and statuses", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "header", + "http", + "method", + "psr-17", + "psr-7", + "status" + ], + "support": { + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/http/issues?state=open", + "source": "https://github.com/yiisoft/http", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2021-11-09T09:42:11+00:00" + }, + { + "name": "yiisoft/hydrator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/hydrator.git", + "reference": "9bfde0c99fc35b182d1b74433e9316c9b67c5fc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/hydrator/zipball/9bfde0c99fc35b182d1b74433e9316c9b67c5fc1", + "reference": "9bfde0c99fc35b182d1b74433e9316c9b67c5fc1", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/container": "^2.0", + "yiisoft/injector": "^1.1", + "yiisoft/strings": "^2.3" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.23", + "yiisoft/di": "^1.2", + "yiisoft/dummy-provider": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "ext-intl": "Allows using `ToDateTime` parameter attribute" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Hydrator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create and populate objects with type casting, mapping and dependencies resolving support.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "hydrator" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/hydrator/issues?state=open", + "source": "https://github.com/yiisoft/hydrator", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-17T16:10:24+00:00" + }, + { + "name": "yiisoft/hydrator-validator", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/hydrator-validator.git", + "reference": "5f7acfebce127755af7df3cbc126dd502a1c4140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/hydrator-validator/zipball/5f7acfebce127755af7df3cbc126dd502a1c4140", + "reference": "5f7acfebce127755af7df3cbc126dd502a1c4140", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/hydrator": "^1.0", + "yiisoft/validator": "^1.0|^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.11", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Hydrator\\Validator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Validating hydrator with raw data validation support", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "input", + "validation" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/hydrator-validator/issues?state=open", + "source": "https://github.com/yiisoft/hydrator-validator", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-08-06T12:18:25+00:00" + }, + { + "name": "yiisoft/i18n", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/i18n.git", + "reference": "c05e9e031fb36fc193152e18fa791bbf6d0582b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/i18n/zipball/c05e9e031fb36fc193152e18fa791bbf6d0582b8", + "reference": "c05e9e031fb36fc193152e18fa791bbf6d0582b8", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.17.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\I18n\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Internationalization Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "i18n", + "locale" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/i18n/issues?state=open", + "source": "https://github.com/yiisoft/i18n", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-06-10T14:18:35+00:00" + }, + { + "name": "yiisoft/injector", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/injector.git", + "reference": "0dc0127a7542341bdaabda7b85204e992938b83e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/injector/zipball/0dc0127a7542341bdaabda7b85204e992938b83e", + "reference": "0dc0127a7542341bdaabda7b85204e992938b83e", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.2", + "phpbench/phpbench": "^1.1", + "phpunit/phpunit": "^9.5", + "psr/container": "^1.0|^2.0", + "rector/rector": "^0.18.12", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.7", + "yiisoft/test-support": "^1.2" + }, + "suggest": { + "psr/container": "For automatic resolving of dependencies" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Injector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR-11 compatible injector. Executes a callable and makes an instances by injecting dependencies from a given DI container.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "PSR-11", + "dependency injection", + "di", + "injector", + "reflection" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/injector/issues?state=open", + "source": "https://github.com/yiisoft/injector", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-12-20T09:39:03+00:00" + }, + { + "name": "yiisoft/input-http", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/input-http.git", + "reference": "877fea3374033f5a6af4207036eb7733a635b5b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/input-http/zipball/877fea3374033f5a6af4207036eb7733a635b5b7", + "reference": "877fea3374033f5a6af4207036eb7733a635b5b7", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/arrays": "^3.0", + "yiisoft/hydrator": "^1.0", + "yiisoft/hydrator-validator": "^2.0", + "yiisoft/middleware-dispatcher": "^5.1", + "yiisoft/request-provider": "^1.0", + "yiisoft/validator": "^1.1|^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.22", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params-web": "params-web.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Input\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Maps data from PSR-7 HTTP request to PHP DTO representing user input.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "dto", + "input", + "mapper", + "mapping", + "psr-7", + "request", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/input-http/issues?state=open", + "source": "https://github.com/yiisoft/input-http", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-08-06T12:42:23+00:00" + }, + { + "name": "yiisoft/json", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/json.git", + "reference": "51b483aef1cd5d06ea02db3c40707bb6b41ed088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/json/zipball/51b483aef1cd5d06ea02db3c40707bb6b41ed088", + "reference": "51b483aef1cd5d06ea02db3c40707bb6b41ed088", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "infection/infection": "^0.16.3", + "phan/phan": "^3.0", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Json\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "json", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "json" + ], + "support": { + "forum": "http://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/json/issues?state=open", + "source": "https://github.com/yiisoft/json", + "wiki": "http://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2020-08-26T12:21:14+00:00" + }, + { + "name": "yiisoft/log", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/log.git", + "reference": "9d549952f5099a3e3081e11cccb3841c77587dac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/log/zipball/9d549952f5099a3e3081e11cccb3841c77587dac", + "reference": "9d549952f5099a3e3081e11cccb3841c77587dac", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/log": "^2.0|^3.0", + "yiisoft/var-dumper": "^1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25" + }, + "suggest": { + "yiisoft/log-target-db": "Allows writing log messages to the database", + "yiisoft/log-target-email": "Allows sending log messages by email", + "yiisoft/log-target-file": "Allows writing log messages to the files", + "yiisoft/log-target-syslog": "Allows writing log messages to the Syslog" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "events-console": "events-console.php", + "events-web": "events-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Logging Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "log", + "logger", + "psr-3", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/log/issues?state=open", + "source": "https://github.com/yiisoft/log", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-07-03T10:13:44+00:00" + }, + { + "name": "yiisoft/log-target-file", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/log-target-file.git", + "reference": "758a792d11f5b6d554450abc828e2db5d7613f22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/log-target-file/zipball/758a792d11f5b6d554450abc828e2db5d7613f22", + "reference": "758a792d11f5b6d554450abc828e2db5d7613f22", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^8.0", + "yiisoft/files": "^1.0|^2.0", + "yiisoft/log": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.1", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.2", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.0" + }, + "suggest": { + "ext-zlib": "Enabling gzip compression of rotated files." + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Log\\Target\\File\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Logging Library - File Target", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "log", + "logger", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/log-target-file/issues", + "source": "https://github.com/yiisoft/log-target-file", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-17T05:52:09+00:00" + }, + { + "name": "yiisoft/middleware-dispatcher", + "version": "5.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/middleware-dispatcher.git", + "reference": "97d290e4ddab59e5a735ebafc69c46b6953022b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/middleware-dispatcher/zipball/97d290e4ddab59e5a735ebafc69c46b6953022b3", + "reference": "97d290e4ddab59e5a735ebafc69c46b6953022b3", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/definitions": "^2.0|^3.0", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/injector": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.0", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.3", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Middleware\\Dispatcher\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR-15 middleware dispatcher", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "dispatcher", + "middleware" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/middleware-dispatcher/issues?state=open", + "source": "https://github.com/yiisoft/middleware-dispatcher", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-09-25T07:01:31+00:00" + }, + { + "name": "yiisoft/network-utilities", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/network-utilities.git", + "reference": "9b51434f17035ce70ba220518a9d52656b6c1cb4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/network-utilities/zipball/9b51434f17035ce70ba220518a9d52656b6c1cb4", + "reference": "9b51434f17035ce70ba220518a9d52656b6c1cb4", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\NetworkUtilities\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Network related utilities", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "IP", + "dns", + "mask", + "network" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/network-utilities/issues?state=open", + "source": "https://github.com/yiisoft/network-utilities", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-02T14:07:06+00:00" + }, + { + "name": "yiisoft/profiler", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/profiler.git", + "reference": "9f1bd1649f079ddfd45217f8da50533b12ca78a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/profiler/zipball/9f1bd1649f079ddfd45217f8da50533b12ca78a3", + "reference": "9f1bd1649f079ddfd45217f8da50533b12ca78a3", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/log": "^2.0|^3.0", + "yiisoft/files": "^2.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.0", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.1", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.2" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php", + "events-web": "events-web.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Profiler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Profiler", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "performance", + "profiler" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/profiler/issues?state=open", + "source": "https://github.com/yiisoft/profiler", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-15T09:15:24+00:00" + }, + { + "name": "yiisoft/proxy", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/proxy.git", + "reference": "2820941a7ea0f66bab32d50a78c9f8b4b3fb22f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/proxy/zipball/2820941a7ea0f66bab32d50a78c9f8b4b3fb22f6", + "reference": "2820941a7ea0f66bab32d50a78c9f8b4b3fb22f6", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/files": "^1.0.2|^2.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Proxy\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proxy", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "proxy" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/proxy/issues?state=open", + "source": "https://github.com/yiisoft/proxy", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-01-17T13:21:34+00:00" + }, + { + "name": "yiisoft/queue", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/queue.git", + "reference": "9fc8dee90766329e6db2448b28299d7ba259e646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/queue/zipball/9fc8dee90766329e6db2448b28299d7ba259e646", + "reference": "9fc8dee90766329e6db2448b28299d7ba259e646", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/container": "^1.0|^2.0", + "psr/log": "^2.0|^3.0", + "symfony/console": "^5.4|^6.0", + "yiisoft/definitions": "^1.0|^2.0|^3.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/injector": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.20", + "yiisoft/test-support": "^3.0", + "yiisoft/yii-debug": "dev-master" + }, + "suggest": { + "ext-pcntl": "Need for process signals" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Queue\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Queue Extension which supported DB, Redis, RabbitMQ, Beanstalk, SQS and Gearman", + "keywords": [ + "async", + "beanstalk", + "db", + "gearman", + "gii", + "queue", + "rabbitmq", + "redis", + "sqs", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/queue/issues?state=open", + "source": "https://github.com/yiisoft/queue", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-15T17:34:15+00:00" + }, + { + "name": "yiisoft/request-body-parser", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/request-body-parser.git", + "reference": "f164340fc1d199105d88bf9e79601458f7de4fe2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/request-body-parser/zipball/f164340fc1d199105d88bf9e79601458f7de4fe2", + "reference": "f164340fc1d199105d88bf9e79601458f7de4fe2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.4|^8.0", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-message-implementation": "1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2" + }, + "require-dev": { + "nyholm/psr7": "^1.0", + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.18", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Request\\Body\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Middleware for parsing various data formats", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "body", + "middleware", + "parser", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/request-body-parser/issues?state=open", + "source": "https://github.com/yiisoft/request-body-parser", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-06-03T17:47:14+00:00" + }, + { + "name": "yiisoft/request-provider", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/request-provider.git", + "reference": "667e339f307eaf3d4e4f09f05334e41761d20a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/request-provider/zipball/667e339f307eaf3d4e4f09f05334e41761d20a81", + "reference": "667e339f307eaf3d4e4f09f05334e41761d20a81", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0.1", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.20", + "yiisoft/di": "^1.2" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\RequestProvider\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR-7 request provider", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "http", + "provider", + "psr", + "request", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/request-provider/issues?state=open", + "source": "https://github.com/yiisoft/request-provider", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-02T15:18:14+00:00" + }, + { + "name": "yiisoft/router", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/router.git", + "reference": "86ee95984109bd96548cad3f93df8ad9ca4de0b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/router/zipball/86ee95984109bd96548cad3f93df8ad9ca4de0b8", + "reference": "86ee95984109bd96548cad3f93df8ad9ca4de0b8", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/middleware-dispatcher": "^5.0", + "yiisoft/router-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "nyholm/psr7": "^1.5", + "phpunit/phpunit": "^9.5", + "psr/container": "^1.1|^2.0", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.22", + "yiisoft/di": "^1.0", + "yiisoft/dummy-provider": "^1.0.0", + "yiisoft/hydrator": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "yiisoft/hydrator": "Needed to use `RouteArgument` attribute", + "yiisoft/router-fastroute": "Router implementation based on nikic/FastRoute" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Router\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii router", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "middleware", + "router", + "web" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/router/issues?state=open", + "source": "https://github.com/yiisoft/router", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-02-20T11:39:48+00:00" + }, + { + "name": "yiisoft/router-fastroute", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/router-fastroute.git", + "reference": "4f2214eed24e140687e714ccb08a6420da316059" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/router-fastroute/zipball/4f2214eed24e140687e714ccb08a6420da316059", + "reference": "4f2214eed24e140687e714ccb08a6420da316059", + "shasum": "" + }, + "require": { + "nikic/fast-route": "^1.3", + "php": "^8.0", + "psr/http-message": "^1.0|^2.0", + "psr/simple-cache": "^2.0|^3.0", + "yiisoft/http": "^1.2", + "yiisoft/router": "^2.1|^3.0" + }, + "provide": { + "yiisoft/router-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.4", + "phpunit/phpunit": "^9.5", + "psr/container": "^2.0", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.21", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Router\\FastRoute\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii router FastRoute adapter", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "FastRoute", + "router" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/router-fastroute/issues?state=open", + "source": "https://github.com/yiisoft/router-fastroute", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-03-19T12:26:45+00:00" + }, + { + "name": "yiisoft/security", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/security.git", + "reference": "f1ad5d279722f162cfb0f720a3723ad762892de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/security/zipball/f1ad5d279722f162cfb0f720a3723ad762892de3", + "reference": "f1ad5d279722f162cfb0f720a3723ad762892de3", + "shasum": "" + }, + "require": { + "ext-hash": "*", + "ext-openssl": "*", + "php": "^7.4|^8.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.23" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Security\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Security utilities", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "MAC", + "decryption", + "encryption", + "hash", + "password", + "random", + "security", + "signature", + "token masking" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/security/issues?state=open", + "source": "https://github.com/yiisoft/security", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-03-18T12:20:01+00:00" + }, + { + "name": "yiisoft/session", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/session.git", + "reference": "193c666a8d1fcce5985c48afe9c3df96b6d3b6d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/session/zipball/193c666a8d1fcce5985c48afe9c3df96b6d3b6d1", + "reference": "193c666a8d1fcce5985c48afe9c3df96b6d3b6d1", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-message-implementation": "1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/cookies": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.1" + }, + "suggest": { + "ext-session": "Allows using native PHP sessions" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di-web": "di-web.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Session\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "A session service, PSR-15 session middleware, and a flash message service which helps use one-time messages.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "flash", + "middleware", + "psr-15", + "session" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/session/issues?state=open", + "source": "https://github.com/yiisoft/session", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-05-02T18:50:11+00:00" + }, + { + "name": "yiisoft/strings", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/strings.git", + "reference": "ff519d31e1c2518f42554fb5410e31bbb74b8108" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/strings/zipball/ff519d31e1c2518f42554fb5410e31bbb74b8108", + "reference": "ff519d31e1c2518f42554fb5410e31bbb74b8108", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Strings\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Strings Helper", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "helper", + "string", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/strings/issues", + "source": "https://github.com/yiisoft/strings", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-12-22T07:29:39+00:00" + }, + { + "name": "yiisoft/translator", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/translator.git", + "reference": "869a224bf59dda36a8725985f5dd2e31cb357e21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/translator/zipball/869a224bf59dda36a8725985f5dd2e31cb357e21", + "reference": "869a224bf59dda36a8725985f5dd2e31cb357e21", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "1.0.0", + "yiisoft/files": "^1.0|^2.0", + "yiisoft/i18n": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.2", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4", + "yiisoft/di": "^1.2" + }, + "suggest": { + "ext-intl": "Allows using intl message formatter", + "ext-tokenizer": "Allows using message extraction", + "yiisoft/event-dispatcher": "To listen for events about missing categories and messages" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Translator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Message Translator", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "i18n", + "internationalization", + "translation" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/translator/issues?state=open", + "source": "https://github.com/yiisoft/translator", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-17T13:16:40+00:00" + }, + { + "name": "yiisoft/translator-message-php", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/translator-message-php.git", + "reference": "67a0c64c132e5098f6824017ca4bccd45cc79030" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/translator-message-php/zipball/67a0c64c132e5098f6824017ca4bccd45cc79030", + "reference": "67a0c64c132e5098f6824017ca4bccd45cc79030", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/translator": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.4", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Translator\\Message\\Php\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Translator PHP Message Storage", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "formatting", + "i18n", + "internationalization", + "message storage" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/translator-message-php/issues?state=open", + "source": "https://github.com/yiisoft/translator-message-php", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-19T11:29:34+00:00" + }, + { + "name": "yiisoft/user", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/user.git", + "reference": "7bd541166949ac56a722a9555d43dac29976f424" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/user/zipball/7bd541166949ac56a722a9555d43dac29976f424", + "reference": "7bd541166949ac56a722a9555d43dac29976f424", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.4|^8.0", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1|^2.0|^3.0", + "yiisoft/access": "^1.0", + "yiisoft/auth": "^2.0|^3.0", + "yiisoft/cookies": "^1.2", + "yiisoft/http": "^1.2", + "yiisoft/session": "^1.0|^2.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.0", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\User\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Convenient user identity management and access checking", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "user", + "yiisoft" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/user/issues?state=open", + "source": "https://github.com/yiisoft/user", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-02-15T10:47:39+00:00" + }, + { + "name": "yiisoft/validator", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/validator.git", + "reference": "9e8ad99e66c750aceda96fd96033ff4b5d4a7e62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/validator/zipball/9e8ad99e66c750aceda96fd96033ff4b5d4a7e62", + "reference": "9e8ad99e66c750aceda96fd96033ff4b5d4a7e62", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0", + "yiisoft/arrays": "^2.1|^3.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/network-utilities": "^1.2", + "yiisoft/strings": "^2.1", + "yiisoft/translator": "^2.1|^3.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.3", + "phpbench/phpbench": "^1.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.24", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0", + "yiisoft/translator-message-php": "^1.1", + "yiisoft/yii-debug": "dev-master|dev-php80" + }, + "suggest": { + "ext-fileinfo": "To use image rule", + "ext-intl": "Allows using date rules and IDN validation for emails", + "yiisoft/di": "To create rule handlers via Yii DI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Validator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Validator", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "validation", + "validator" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/validator/issues?state=open", + "source": "https://github.com/yiisoft/validator", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-12T12:10:04+00:00" + }, + { + "name": "yiisoft/var-dumper", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/var-dumper.git", + "reference": "c7f6a40d117b905abe26ac093593eaf7c57b9bd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/var-dumper/zipball/c7f6a40d117b905abe26ac093593eaf7c57b9bd5", + "reference": "c7f6a40d117b905abe26ac093593eaf7c57b9bd5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "php": "^8.0", + "yiisoft/arrays": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.3" + }, + "suggest": { + "ext-sockets": "Send dumps to a server through UDP/TCP protocols" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Yiisoft\\VarDumper\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Enhances functionality of var_dump() and var_export(). It is dealing with recursive references, may highlight syntax and export closures.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "helper", + "var-dumper", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/var-dumper/issues", + "source": "https://github.com/yiisoft/var-dumper", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-10-08T11:21:24+00:00" + }, + { + "name": "yiisoft/view", + "version": "10.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/view.git", + "reference": "4416d30e4e286e23887d9f525701f37e3a15f9ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/view/zipball/4416d30e4e286e23887d9f525701f37e3a15f9ca", + "reference": "4416d30e4e286e23887d9f525701f37e3a15f9ca", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "1.0.0", + "psr/event-dispatcher-implementation": "1.0.0", + "yiisoft/arrays": "^2.0|^3.0", + "yiisoft/cache": "^1.0|^2.0|^3.0", + "yiisoft/files": "^1.0|^2.0", + "yiisoft/html": "^2.5|^3.0", + "yiisoft/json": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "1.0.*", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.20", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.2", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/test-support": "^1.4|^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\View\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii View Rendering Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "view", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/view/issues?state=open", + "source": "https://github.com/yiisoft/view", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-06-28T10:02:35+00:00" + }, + { + "name": "yiisoft/yii-console", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-console.git", + "reference": "7942fc70df59965bb1b33ac4671c915a145d2dcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-console/zipball/7942fc70df59965bb1b33ac4671c915a145d2dcf", + "reference": "7942fc70df59965bb1b33ac4671c915a145d2dcf", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher-contracts": "^2.2|^3.0", + "yiisoft/friendly-exception": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "vimeo/psalm": "^4.30|^5.20", + "yiisoft/config": "^1.3", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config", + "merge-plan-file": "../tests/environment/.merge-plan.php" + }, + "config-plugin": { + "params-console": "params-console.php", + "di-console": "di-console.php", + "events-console": "events-console.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Console\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Symfony console wrapper with additional features", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "console", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-console/issues?state=open", + "source": "https://github.com/yiisoft/yii-console", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-02-17T13:10:12+00:00" + }, + { + "name": "yiisoft/yii-cycle", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-cycle.git", + "reference": "071361f0a97ed314add6c2e285953ee02b3973a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-cycle/zipball/071361f0a97ed314add6c2e285953ee02b3973a6", + "reference": "071361f0a97ed314add6c2e285953ee02b3973a6", + "shasum": "" + }, + "require": { + "cycle/annotated": "^3.5", + "cycle/database": "^2.8", + "cycle/migrations": "^3.1.1|^4.0", + "cycle/orm": "^2.7", + "cycle/schema-builder": "^2.8", + "cycle/schema-migrations-generator": "^2.0", + "cycle/schema-provider": "^1.0", + "cycle/schema-renderer": "^1.2", + "php": "^8.1", + "psr/container": "^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^3.0", + "psr/simple-cache": "^2.0|^3.0", + "spiral/attributes": "^2.7|^3.0", + "spiral/core": "^3.12", + "spiral/tokenizer": "^3.12", + "symfony/console": "^6.4", + "symfony/finder": "^5.4", + "webmozart/glob": "^4.7", + "yiisoft/aliases": "^1.1|^2.0|^3.0", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/injector": "^1.1" + }, + "require-dev": { + "cycle/entity-behavior": "^1.0", + "ext-uopz": "*", + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.3", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.7", + "yiisoft/definitions": "^3.2", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "cycle/entity-behavior": "To use PHP attributes that add behaviors to Cycle ORM entities." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php", + "di-console": "di-console.php", + "events-console": "events-console.php", + "di-delegates": "di-delegates.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Cycle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Cycle ORM v2 support", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "cycle", + "migrations", + "orm", + "yii" + ], + "support": { + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-cycle/issues?state=open", + "source": "https://github.com/yiisoft/yii-cycle", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-03-21T08:34:37+00:00" + }, + { + "name": "yiisoft/yii-debug", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-debug.git", + "reference": "90bb1960841cf3b054433d7c54210fd203d3fe8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-debug/zipball/90bb1960841cf3b054433d7c54210fd203d3fe8f", + "reference": "90bb1960841cf3b054433d7c54210fd203d3fe8f", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "guzzlehttp/psr7": "^2.4", + "jetbrains/phpstorm-attributes": "^1.0", + "php": "^8.1", + "psr/container": "^2.0", + "psr/event-dispatcher": "^1.0", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/console": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.4", + "yiisoft/aliases": "^3.0", + "yiisoft/arrays": "^2.0|^3.0", + "yiisoft/config": "^1.3", + "yiisoft/di": "^1.0", + "yiisoft/files": "^2.0", + "yiisoft/json": "^1.0", + "yiisoft/profiler": "^3.0", + "yiisoft/proxy": "^1.0.1", + "yiisoft/strings": "^2.2", + "yiisoft/var-dumper": "^1.7" + }, + "require-dev": { + "ext-curl": "*", + "ext-sockets": "*", + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.3", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25", + "yiisoft/error-handler": "^3.0", + "yiisoft/event-dispatcher": "^1.0", + "yiisoft/log": "^2.0", + "yiisoft/yii-console": "^2.0", + "yiisoft/yii-http": "^1.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "bootstrap": "bootstrap.php", + "di": "di.php", + "di-console": "di-console.php", + "di-web": "di-web.php", + "di-providers": "di-providers.php", + "events-web": "events-web.php", + "events-console": "events-console.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Debug\\": "src", + "Yiisoft\\Yii\\Debug\\Tests\\Shared\\": "tests/Shared" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Framework Debug Panel Extension", + "keywords": [ + "debug", + "debugger", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-debug/issues?state=open", + "source": "https://github.com/yiisoft/yii-debug", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-17T07:39:11+00:00" + }, + { + "name": "yiisoft/yii-event", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-event.git", + "reference": "2e02986a09235d20b3c02382f8cc5d7ad2e452fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-event/zipball/2e02986a09235d20b3c02382f8cc5d7ad2e452fb", + "reference": "2e02986a09235d20b3c02382f8cc5d7ad2e452fb", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/event-dispatcher": "^1.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/injector": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/config": "^1.3", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config", + "merge-plan-file": "../tests/environment/.merge-plan.php" + }, + "config-plugin": { + "params-web": "params-web.php", + "params-console": "params-console.php", + "di": "di.php", + "di-web": "di-web.php", + "di-console": "di-console.php", + "events-web": [], + "events-console": [] + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Event\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Event", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "event", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-event/issues?state=open", + "source": "https://github.com/yiisoft/yii-event", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-11-04T15:57:42+00:00" + }, + { + "name": "yiisoft/yii-http", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-http.git", + "reference": "2555514a091ec9339259f10abc7e8970ef9e5db6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-http/zipball/2555514a091ec9339259f10abc7e8970ef9e5db6", + "reference": "2555514a091ec9339259f10abc7e8970ef9e5db6", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/middleware-dispatcher": "^3.0|^4.0|^5.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii HTTP Application", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "application", + "http", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-http/issues?state=open", + "source": "https://github.com/yiisoft/yii-http", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-07T07:54:13+00:00" + }, + { + "name": "yiisoft/yii-middleware", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-middleware.git", + "reference": "b2a8157ae2c94847a2b2f2e3b63dc23366b5e42a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-middleware/zipball/b2a8157ae2c94847a2b2f2e3b63dc23366b5e42a", + "reference": "b2a8157ae2c94847a2b2f2e3b63dc23366b5e42a", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^3.0", + "yiisoft/aliases": "^3.0", + "yiisoft/cookies": "^1.2", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/network-utilities": "^1.2", + "yiisoft/router": "^3.0", + "yiisoft/session": "^2.0", + "yiisoft/strings": "^2.1", + "yiisoft/validator": "^1.0|^2.0" + }, + "require-dev": { + "ext-uopz": "*", + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.16", + "slope-it/clock-mock": "^0.3.6", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25", + "yiisoft/router-fastroute": "^3.0", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "yiisoft/event-dispatcher": "For using events", + "yiisoft/translator": "For updating translator's locale" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Middleware\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Middleware", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "middleware", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-middleware/issues?state=open", + "source": "https://github.com/yiisoft/yii-middleware", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-03T19:34:10+00:00" + }, + { + "name": "yiisoft/yii-runner", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-runner.git", + "reference": "69d8392ecc0c9e47ac7d5a56c1a8596d5c1ac896" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-runner/zipball/69d8392ecc0c9e47ac7d5a56c1a8596d5c1ac896", + "reference": "69d8392ecc0c9e47ac7d5a56c1a8596d5c1ac896", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/config": "^1.1", + "yiisoft/definitions": "^1.0|^2.0|^3.0", + "yiisoft/di": "^1.0", + "yiisoft/yii-event": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.20", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.21", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "yiisoft/yii-runner-console": "Allows to run console application", + "yiisoft/yii-runner-http": "Allows to run HTTP application", + "yiisoft/yii-runner-roadrunner": "Allows to run HTTP application for RoadRunner" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "build-merge-plan": false + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Runner\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii application runner", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "runner", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-runner/issues?state=open", + "source": "https://github.com/yiisoft/yii-runner", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-09T14:10:08+00:00" + }, + { + "name": "yiisoft/yii-runner-console", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-runner-console.git", + "reference": "e92f4e72778508e7c2918f8fc8c3e75b758eb61a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-runner-console/zipball/e92f4e72778508e7c2918f8fc8c3e75b758eb61a", + "reference": "e92f4e72778508e7c2918f8fc8c3e75b758eb61a", + "shasum": "" + }, + "require": { + "php": "^8.0", + "symfony/console": "^5.4|^6.0|^7.0", + "yiisoft/config": "^1.1", + "yiisoft/definitions": "^1.0|^2.0|^3.0", + "yiisoft/di": "^1.0", + "yiisoft/yii-console": "^2.0", + "yiisoft/yii-runner": "^2.2" + }, + "require-dev": { + "codeception/codeception": "^5.0", + "codeception/module-cli": "^2.0", + "maglnet/composer-require-checker": "^4.2", + "rector/rector": "^1.0.0", + "vimeo/psalm": "^4.30|^5.2" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "build-merge-plan": false + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Runner\\Console\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Console application runner", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "console", + "runner", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-runner-console/issues?state=open", + "source": "https://github.com/yiisoft/yii-runner-console", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-10T10:06:34+00:00" + }, + { + "name": "yiisoft/yii-runner-http", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-runner-http.git", + "reference": "798c37abbcceb6b0053744b4bde0c476cd53e15e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-runner-http/zipball/798c37abbcceb6b0053744b4bde0c476cd53e15e", + "reference": "798c37abbcceb6b0053744b4bde0c476cd53e15e", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0 ", + "yiisoft/config": "^1.1", + "yiisoft/definitions": "^1.0|^2.0|^3.0", + "yiisoft/di": "^1.0", + "yiisoft/error-handler": "^3.0", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/http": "^1.2", + "yiisoft/log": "^2.0", + "yiisoft/log-target-file": "^3.0", + "yiisoft/yii-http": "^1.0", + "yiisoft/yii-runner": "^2.2" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.2", + "xepozz/internal-mocker": "^1.4", + "yiisoft/middleware-dispatcher": "^5.0", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "build-merge-plan": false + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Runner\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "HTTP application runner", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "http", + "runner", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-runner-http/issues?state=open", + "source": "https://github.com/yiisoft/yii-runner-http", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-10T10:08:37+00:00" + }, + { + "name": "yiisoft/yii-swagger", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-swagger.git", + "reference": "c0fe0483b04719a6724fb13650f679614e1b0cef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-swagger/zipball/c0fe0483b04719a6724fb13650f679614e1b0cef", + "reference": "c0fe0483b04719a6724fb13650f679614e1b0cef", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "swagger-api/swagger-ui": "^4.1|^5.0", + "yiisoft/aliases": "^1.1|^2.0|^3.0", + "yiisoft/arrays": "^3.0", + "yiisoft/assets": "^2.0|^3.0|^4.0", + "yiisoft/cache": "^1.0|^2.0|^3.0", + "yiisoft/data-response": "^1.0|^2.0", + "yiisoft/html": "^3.0", + "yiisoft/yii-view-renderer": "^7.1.0", + "zircote/swagger-php": "^4.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/csrf": "^2.0", + "yiisoft/di": "^1.2", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di-web": "di-web.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Swagger\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "OpenAPI Swagger for Yii Framework", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "api", + "swagger", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-swagger/issues?state=open", + "source": "https://github.com/yiisoft/yii-swagger", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-04T21:55:48+00:00" + }, + { + "name": "yiisoft/yii-view-renderer", + "version": "7.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-view-renderer.git", + "reference": "cb11468f554d251c2deb87bf228a302c794134a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-view-renderer/zipball/cb11468f554d251c2deb87bf228a302c794134a3", + "reference": "cb11468f554d251c2deb87bf228a302c794134a3", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/aliases": "^2.0|^3.0", + "yiisoft/csrf": "^1.2|^2.0", + "yiisoft/data-response": "^1.0|^2.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/html": "^2.5|^3.0", + "yiisoft/strings": "^2.0", + "yiisoft/view": "^10.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.3", + "nyholm/psr7": "^1.5", + "phpunit/phpunit": "^9.5", + "rector/rector": "1.0.*", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25", + "yiisoft/di": "^1.2", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/test-support": "^3.0", + "yiisoft/yii-debug": "dev-master|dev-php80" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php", + "events-web": "events-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\View\\Renderer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR-7 compatible view renderer", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "renderer", + "view", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-view-renderer/issues?state=open", + "source": "https://github.com/yiisoft/yii-view-renderer", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-07-01T11:56:55+00:00" + }, + { + "name": "zircote/swagger-php", + "version": "4.10.6", + "source": { + "type": "git", + "url": "https://github.com/zircote/swagger-php.git", + "reference": "e462ff5269ea0ec91070edd5d51dc7215bdea3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/e462ff5269ea0ec91070edd5d51dc7215bdea3b6", + "reference": "e462ff5269ea0ec91070edd5d51dc7215bdea3b6", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/deprecation-contracts": "^2 || ^3", + "symfony/finder": ">=2.2", + "symfony/yaml": ">=3.3" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/annotations": "^1.7 || ^2.0", + "friendsofphp/php-cs-fixer": "^2.17 || ^3.47.1", + "phpstan/phpstan": "^1.6", + "phpunit/phpunit": ">=8", + "vimeo/psalm": "^4.23" + }, + "suggest": { + "doctrine/annotations": "^1.7 || ^2.0" + }, + "bin": [ + "bin/openapi" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "OpenApi\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Robert Allen", + "email": "zircote@gmail.com" + }, + { + "name": "Bob Fanger", + "email": "bfanger@gmail.com", + "homepage": "https://bfanger.nl" + }, + { + "name": "Martin Rademacher", + "email": "mano@radebatz.net", + "homepage": "https://radebatz.net" + } + ], + "description": "swagger-php - Generate interactive documentation for your RESTful API using phpdoc annotations", + "homepage": "https://github.com/zircote/swagger-php/", + "keywords": [ + "api", + "json", + "rest", + "service discovery" + ], + "support": { + "issues": "https://github.com/zircote/swagger-php/issues", + "source": "https://github.com/zircote/swagger-php/tree/4.10.6" + }, + "time": "2024-07-26T03:04:43+00:00" + } + ], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.4", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "react/promise": "^2", + "vimeo/psalm": "^3.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.4" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T18:52:26+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/4f0e968ba3798a423730f567b1b50d3441c16ddc", + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "https://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-13T18:00:56+00:00" + }, + { + "name": "behat/gherkin", + "version": "v4.9.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", + "shasum": "" + }, + "require": { + "php": "~7.2|~8.0" + }, + "require-dev": { + "cucumber/cucumber": "dev-gherkin-22.0.0", + "phpunit/phpunit": "~8|~9", + "symfony/yaml": "~3|~4|~5" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" + }, + "time": "2021-10-12T13:05:09+00:00" + }, + { + "name": "clue/stdio-react", + "version": "v2.6.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-stdio.git", + "reference": "dfa6c378aabdff718202d4e2453f752c38ea3399" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-stdio/zipball/dfa6c378aabdff718202d4e2453f752c38ea3399", + "reference": "dfa6c378aabdff718202d4e2453f752c38ea3399", + "shasum": "" + }, + "require": { + "clue/term-react": "^1.0 || ^0.1.1", + "clue/utf8-react": "^1.0 || ^0.1", + "php": ">=5.3", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "require-dev": { + "clue/arguments": "^2.0", + "clue/commander": "^1.2", + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + }, + "suggest": { + "ext-mbstring": "Using ext-mbstring should provide slightly better performance for handling I/O" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Stdio\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Async, event-driven console input & output (STDIN, STDOUT) for truly interactive CLI applications, built on top of ReactPHP", + "homepage": "https://github.com/clue/reactphp-stdio", + "keywords": [ + "async", + "autocomplete", + "autocompletion", + "cli", + "history", + "interactive", + "reactphp", + "readline", + "stdin", + "stdio", + "stdout" + ], + "support": { + "issues": "https://github.com/clue/reactphp-stdio/issues", + "source": "https://github.com/clue/reactphp-stdio/tree/v2.6.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-03-18T15:09:30+00:00" + }, + { + "name": "clue/term-react", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-term.git", + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-term/zipball/00f297dc597eaee2ebf98af8f27cca5d21d60fa3", + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Term\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming terminal emulator, built on top of ReactPHP.", + "homepage": "https://github.com/clue/reactphp-term", + "keywords": [ + "C0", + "CSI", + "ansi", + "apc", + "ascii", + "c1", + "control codes", + "dps", + "osc", + "pm", + "reactphp", + "streaming", + "terminal", + "vt100", + "xterm" + ], + "support": { + "issues": "https://github.com/clue/reactphp-term/issues", + "source": "https://github.com/clue/reactphp-term/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2024-01-30T10:22:09+00:00" + }, + { + "name": "clue/utf8-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-utf8.git", + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-utf8/zipball/d5cd04d39cb5457aa5df830b7c4b301d2694217e", + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4 || ^0.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/stream": "^1.0 || ^0.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Utf8\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming UTF-8 parser, built on top of ReactPHP.", + "homepage": "https://github.com/clue/reactphp-utf8", + "keywords": [ + "reactphp", + "streaming", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "issues": "https://github.com/clue/reactphp-utf8/issues", + "source": "https://github.com/clue/reactphp-utf8/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-12-06T14:52:17+00:00" + }, + { + "name": "codeception/c3", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/c3.git", + "reference": "e23298a1cd5e7745973ea26a53572a3d9b013439" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/c3/zipball/e23298a1cd5e7745973ea26a53572a3d9b013439", + "reference": "e23298a1cd5e7745973ea26a53572a3d9b013439", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.5.0" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Codeception\\c3\\Installer" + }, + "autoload": { + "psr-4": { + "Codeception\\c3\\": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tiger Seo", + "email": "tiger.seo@gmail.com" + }, + { + "name": "Michael Bodnarchuk", + "email": "davert.php@codegyre.com", + "homepage": "http://codegyre.com" + } + ], + "description": "CodeCoverage collector for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "code coverage", + "codecoverage" + ], + "support": { + "issues": "https://github.com/Codeception/c3/issues", + "source": "https://github.com/Codeception/c3/tree/2.9.0" + }, + "time": "2023-10-15T17:57:07+00:00" + }, + { + "name": "codeception/codeception", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", + "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.6.2", + "codeception/lib-asserts": "^2.0", + "codeception/stub": "^4.1", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "phpunit/php-code-coverage": "^9.2 || ^10.0 || ^11.0", + "phpunit/php-text-template": "^2.0 || ^3.0 || ^4.0", + "phpunit/php-timer": "^5.0.3 || ^6.0 || ^7.0", + "phpunit/phpunit": "^9.5.20 || ^10.0 || ^11.0", + "psy/psysh": "^0.11.2 || ^0.12", + "sebastian/comparator": "^4.0.5 || ^5.0 || ^6.0", + "sebastian/diff": "^4.0.3 || ^5.0 || ^6.0", + "symfony/console": ">=4.4.24 <8.0", + "symfony/css-selector": ">=4.4.24 <8.0", + "symfony/event-dispatcher": ">=4.4.24 <8.0", + "symfony/finder": ">=4.4.24 <8.0", + "symfony/var-dumper": ">=4.4.24 <8.0", + "symfony/yaml": ">=4.4.24 <8.0" + }, + "conflict": { + "codeception/lib-innerbrowser": "<3.1.3", + "codeception/module-filesystem": "<3.0", + "codeception/module-phpbrowser": "<2.5" + }, + "replace": { + "codeception/phpunit-wrapper": "*" + }, + "require-dev": { + "codeception/lib-innerbrowser": "*@dev", + "codeception/lib-web": "^1.0", + "codeception/module-asserts": "*@dev", + "codeception/module-cli": "*@dev", + "codeception/module-db": "*@dev", + "codeception/module-filesystem": "*@dev", + "codeception/module-phpbrowser": "*@dev", + "codeception/util-universalframework": "*@dev", + "ext-simplexml": "*", + "jetbrains/phpstorm-attributes": "^1.0", + "symfony/dotenv": ">=4.4.24 <8.0", + "symfony/process": ">=4.4.24 <8.0", + "vlucas/phpdotenv": "^5.1" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "ext-simplexml": "For loading params from XML files", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/dotenv": "For loading params from .env files", + "symfony/phpunit-bridge": "For phpunit-bridge support", + "vlucas/phpdotenv": "For loading params from .env files" + }, + "bin": [ + "codecept" + ], + "type": "library", + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + }, + "classmap": [ + "src/PHPUnit/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert.ua@gmail.com", + "homepage": "https://codeception.com" + } + ], + "description": "BDD-style testing framework", + "homepage": "https://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/5.1.2" + }, + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], + "time": "2024-03-07T07:19:42+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "b8c7dff552249e560879c682ba44a4b963af91bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/b8c7dff552249e560879c682ba44a4b963af91bc", + "reference": "b8c7dff552249e560879c682ba44a4b963af91bc", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": "^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": "^7.4 | ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/2.1.0" + }, + "time": "2023-02-10T18:36:23+00:00" + }, + { + "name": "codeception/lib-innerbrowser", + "version": "3.1.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-innerbrowser.git", + "reference": "10482f7e34c0537bf5b87bc82a3d65a1842a8b4f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/10482f7e34c0537bf5b87bc82a3d65a1842a8b4f", + "reference": "10482f7e34c0537bf5b87bc82a3d65a1842a8b4f", + "shasum": "" + }, + "require": { + "codeception/codeception": "^5.0", + "codeception/lib-web": "^1.0.1", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "phpunit/phpunit": "^9.5", + "symfony/browser-kit": "^4.4.24 || ^5.4 || ^6.0", + "symfony/dom-crawler": "^4.4.30 || ^5.4 || ^6.0" + }, + "require-dev": { + "codeception/util-universalframework": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "https://codegyre.com" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Parent library for all Codeception framework modules and PhpBrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-innerbrowser/issues", + "source": "https://github.com/Codeception/lib-innerbrowser/tree/3.1.3" + }, + "time": "2022-10-03T15:33:34+00:00" + }, + { + "name": "codeception/lib-web", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-web.git", + "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-web/zipball/01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", + "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "guzzlehttp/psr7": "^2.0", + "php": "^8.0", + "phpunit/phpunit": "^9.5 | ^10.0 | ^11.0", + "symfony/css-selector": ">=4.4.24 <8.0" + }, + "conflict": { + "codeception/codeception": "<5.0.0-alpha3" + }, + "require-dev": { + "php-webdriver/webdriver": "^1.12" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "Library containing files used by module-webdriver and lib-innerbrowser or module-phpbrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-web/issues", + "source": "https://github.com/Codeception/lib-web/tree/1.0.6" + }, + "time": "2024-02-06T20:50:08+00:00" + }, + { + "name": "codeception/lib-xml", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-xml.git", + "reference": "ba49213e60807e3612513f404a5c93aec63f4c72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-xml/zipball/ba49213e60807e3612513f404a5c93aec63f4c72", + "reference": "ba49213e60807e3612513f404a5c93aec63f4c72", + "shasum": "" + }, + "require": { + "codeception/lib-web": "^1.0.6", + "ext-dom": "*", + "php": "^8.0", + "symfony/css-selector": ">=4.4.24 <8.0" + }, + "conflict": { + "codeception/codeception": "<5.0.0-alpha3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "Files used by module-rest and module-soap", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-xml/issues", + "source": "https://github.com/Codeception/lib-xml/tree/1.0.3" + }, + "time": "2024-02-06T21:00:41+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "1b6b150b30586c3614e7e5761b31834ed7968603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/1b6b150b30586c3614e7e5761b31834ed7968603", + "reference": "1b6b150b30586c3614e7e5761b31834ed7968603", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-asserts": "^2.0", + "php": "^8.0" + }, + "conflict": { + "codeception/codeception": "<5.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "https://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-asserts/issues", + "source": "https://github.com/Codeception/module-asserts/tree/3.0.0" + }, + "time": "2022-02-16T19:48:08+00:00" + }, + { + "name": "codeception/module-cli", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-cli.git", + "reference": "a3a101fae4049fa2f810107f7bd5db3b3266ce63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-cli/zipball/a3a101fae4049fa2f810107f7bd5db3b3266ce63", + "reference": "a3a101fae4049fa2f810107f7bd5db3b3266ce63", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/module-asserts": "*", + "php": "^7.4 || ^8.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + } + ], + "description": "Codeception module for testing basic shell commands and shell output", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-cli/issues", + "source": "https://github.com/Codeception/module-cli/tree/2.0.1" + }, + "time": "2023-01-13T18:41:03+00:00" + }, + { + "name": "codeception/module-db", + "version": "3.1.4", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-db.git", + "reference": "06be16dcf4dda46eaef9454f1361d62bcb971c36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-db/zipball/06be16dcf4dda46eaef9454f1361d62bcb971c36", + "reference": "06be16dcf4dda46eaef9454f1361d62bcb971c36", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "ext-json": "*", + "ext-mbstring": "*", + "ext-pdo": "*", + "php": "^8.0" + }, + "conflict": { + "codeception/codeception": "<5.0" + }, + "require-dev": { + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "DB module for Codeception", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception", + "database-testing", + "db-testing" + ], + "support": { + "issues": "https://github.com/Codeception/module-db/issues", + "source": "https://github.com/Codeception/module-db/tree/3.1.4" + }, + "time": "2024-05-16T20:12:18+00:00" + }, + { + "name": "codeception/module-phpbrowser", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-phpbrowser.git", + "reference": "a972411f60cd00d00d5e5e3b35496ba4a23bcffc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-phpbrowser/zipball/a972411f60cd00d00d5e5e3b35496ba4a23bcffc", + "reference": "a972411f60cd00d00d5e5e3b35496ba4a23bcffc", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-innerbrowser": "*@dev", + "ext-json": "*", + "guzzlehttp/guzzle": "^7.4", + "php": "^8.0", + "symfony/browser-kit": "^5.4 || ^6.0 || ^7.0" + }, + "conflict": { + "codeception/codeception": "<5.0", + "codeception/lib-innerbrowser": "<3.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.199", + "codeception/module-rest": "^2.0 || *@dev", + "ext-curl": "*" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing web application over HTTP", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception", + "functional-testing", + "http" + ], + "support": { + "issues": "https://github.com/Codeception/module-phpbrowser/issues", + "source": "https://github.com/Codeception/module-phpbrowser/tree/3.0.1" + }, + "time": "2023-12-08T19:41:28+00:00" + }, + { + "name": "codeception/module-rest", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-rest.git", + "reference": "086762ee8a1686e954678b015a7dca4b922c6520" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-rest/zipball/086762ee8a1686e954678b015a7dca4b922c6520", + "reference": "086762ee8a1686e954678b015a7dca4b922c6520", + "shasum": "" + }, + "require": { + "codeception/codeception": "^5.0.8", + "codeception/lib-xml": "^1.0", + "ext-dom": "*", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2.9", + "php": "^8.1", + "softcreatr/jsonpath": "^0.8 || ^0.9" + }, + "require-dev": { + "codeception/lib-innerbrowser": "^3.0 | ^4.0", + "codeception/stub": "^4.0", + "codeception/util-universalframework": "^1.0", + "ext-libxml": "*", + "ext-simplexml": "*" + }, + "suggest": { + "aws/aws-sdk-php": "For using AWS Auth" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "REST module for Codeception", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception", + "rest" + ], + "support": { + "issues": "https://github.com/Codeception/module-rest/issues", + "source": "https://github.com/Codeception/module-rest/tree/3.4.0" + }, + "time": "2024-07-12T06:28:28+00:00" + }, + { + "name": "codeception/stub", + "version": "4.1.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/4fcad2c165f365377486dc3fd8703b07f1f2fcae", + "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae", + "shasum": "" + }, + "require": { + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | ^11" + }, + "conflict": { + "codeception/codeception": "<5.0.6" + }, + "require-dev": { + "consolidation/robo": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/4.1.3" + }, + "time": "2024-02-02T19:21:00+00:00" + }, + { + "name": "colinodell/json5", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/colinodell/json5.git", + "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/colinodell/json5/zipball/15b063f8cb5e6deb15f0cd39123264ec0d19c710", + "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^7.1.3|^8.0" + }, + "conflict": { + "scrutinizer/ocular": "1.7.*" + }, + "require-dev": { + "mikehaertl/php-shellcommand": "^1.2.5", + "phpstan/phpstan": "^1.4", + "scrutinizer/ocular": "^1.6", + "squizlabs/php_codesniffer": "^2.3 || ^3.0", + "symfony/finder": "^4.4|^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0" + }, + "bin": [ + "bin/json5" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/global.php" + ], + "psr-4": { + "ColinODell\\Json5\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Developer" + } + ], + "description": "UTF-8 compatible JSON5 parser for PHP", + "homepage": "https://github.com/colinodell/json5", + "keywords": [ + "JSON5", + "json", + "json5_decode", + "json_decode" + ], + "support": { + "issues": "https://github.com/colinodell/json5/issues", + "source": "https://github.com/colinodell/json5/tree/v2.3.0" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://www.patreon.com/colinodell", + "type": "patreon" + } + ], + "time": "2022-12-27T16:44:40+00:00" + }, + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.5", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-01-17T14:14:24+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.11.10", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-08-27T18:44:43+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "time": "2022-03-02T22:36:06+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "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": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "gitonomy/gitlib", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/gitonomy/gitlib.git", + "reference": "2c7fbbd9814178474d0bb1b6292701cb4ab508f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/2c7fbbd9814178474d0bb1b6292701cb4ab508f9", + "reference": "2c7fbbd9814178474d0bb1b6292701cb4ab508f9", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "php": "^8.0", + "symfony/polyfill-mbstring": "^1.7", + "symfony/process": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "ext-fileinfo": "*", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.20 || ^9.5.9", + "psr/log": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gitonomy\\Git\\": "src/Gitonomy/Git/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Julien Didier", + "email": "genzo.wm@gmail.com", + "homepage": "https://github.com/juliendidier" + }, + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info", + "homepage": "https://github.com/lyrixx" + }, + { + "name": "Alexandre Salomé", + "email": "alexandre.salome@gmail.com", + "homepage": "https://github.com/alexandresalome" + } + ], + "description": "Library for accessing git", + "support": { + "issues": "https://github.com/gitonomy/gitlib/issues", + "source": "https://github.com/gitonomy/gitlib/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", + "type": "tidelift" + } + ], + "time": "2023-12-20T13:02:08+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-07-18T10:29:17+00:00" + }, + { + "name": "httpsoft/http-basis", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-basis.git", + "reference": "63c4306c516375e3fa08358a58194e159bfbb984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-basis/zipball/63c4306c516375e3fa08358a58194e159bfbb984", + "reference": "63c4306c516375e3fa08358a58194e159bfbb984", + "shasum": "" + }, + "require": { + "ext-json": "*", + "httpsoft/http-cookie": "^1.1", + "httpsoft/http-emitter": "^1.1", + "httpsoft/http-error-handler": "^1.1", + "httpsoft/http-message": "^1.1", + "httpsoft/http-response": "^1.1", + "httpsoft/http-router": "^1.1", + "httpsoft/http-runner": "^1.1", + "httpsoft/http-server-request": "^1.1", + "php": "^7.4|^8.0", + "psr/container": "^1.0|^2.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1|^2.0|^3.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-handler-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "devanych/di-container": "^2.1", + "devanych/view-renderer": "^1.0", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Basis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Simple and fast HTTP microframework implementing PSR standards", + "homepage": "https://httpsoft.org/", + "keywords": [ + "PSR-11", + "http", + "http-framework", + "microframework", + "php", + "psr-15", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/basis", + "issues": "https://github.com/httpsoft/http-basis/issues", + "source": "https://github.com/httpsoft/http-basis" + }, + "time": "2023-05-05T22:15:06+00:00" + }, + { + "name": "httpsoft/http-cookie", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-cookie.git", + "reference": "c304b7d9888ed27bf2bcdb95762d87263a457644" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-cookie/zipball/c304b7d9888ed27bf2bcdb95762d87263a457644", + "reference": "c304b7d9888ed27bf2bcdb95762d87263a457644", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "psr/http-message": "^1.1|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Cookie\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Managing cookies with PSR-7 support", + "homepage": "https://httpsoft.org/", + "keywords": [ + "cookie", + "cookies", + "http", + "http-cookie", + "php", + "psr-15", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/cookie", + "issues": "https://github.com/httpsoft/http-cookie/issues", + "source": "https://github.com/httpsoft/http-cookie" + }, + "time": "2023-05-05T20:37:18+00:00" + }, + { + "name": "httpsoft/http-emitter", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-emitter.git", + "reference": "b09e2834b6d40e022f0c0eb7417f97f496e376b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-emitter/zipball/b09e2834b6d40e022f0c0eb7417f97f496e376b6", + "reference": "b09e2834b6d40e022f0c0eb7417f97f496e376b6", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "psr/http-message": "^1.1|^2.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Emitter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Emitting of PSR-7 Response implementation", + "homepage": "https://httpsoft.org/", + "keywords": [ + "emitter", + "http", + "http-emitter", + "http-message", + "php", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/emitter", + "issues": "https://github.com/httpsoft/http-emitter/issues", + "source": "https://github.com/httpsoft/http-emitter" + }, + "time": "2023-05-05T20:18:44+00:00" + }, + { + "name": "httpsoft/http-error-handler", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-error-handler.git", + "reference": "f5bfb10cdf6de7420e59d8342ba12f19749e7bc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-error-handler/zipball/f5bfb10cdf6de7420e59d8342ba12f19749e7bc1", + "reference": "f5bfb10cdf6de7420e59d8342ba12f19749e7bc1", + "shasum": "" + }, + "require": { + "httpsoft/http-response": "^1.1", + "php": "^7.4|^8.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-handler-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "httpsoft/http-server-request": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\ErrorHandler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Error handling PSR-7 and PSR-15 components", + "homepage": "https://httpsoft.org/", + "keywords": [ + "error-handler", + "error-middleware", + "http", + "http-error", + "php", + "psr-15", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/error-handler", + "issues": "https://github.com/httpsoft/http-error-handler/issues", + "source": "https://github.com/httpsoft/http-error-handler" + }, + "time": "2023-05-05T21:14:04+00:00" + }, + { + "name": "httpsoft/http-response", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-response.git", + "reference": "6e9d25a540506ba8a5165817fdd856a856e32c02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-response/zipball/6e9d25a540506ba8a5165817fdd856a856e32c02", + "reference": "6e9d25a540506ba8a5165817fdd856a856e32c02", + "shasum": "" + }, + "require": { + "httpsoft/http-message": "^1.1", + "php": "^7.4|^8.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Response\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "PSR-7 Response implementations", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-message", + "http-response", + "php", + "psr-7", + "responses" + ], + "support": { + "docs": "https://httpsoft.org/docs/response", + "issues": "https://github.com/httpsoft/http-response/issues", + "source": "https://github.com/httpsoft/http-response" + }, + "time": "2023-05-05T20:55:06+00:00" + }, + { + "name": "httpsoft/http-router", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-router.git", + "reference": "460ee40b15ceb61d86a7c511d321c4580960601e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-router/zipball/460ee40b15ceb61d86a7c511d321c4580960601e", + "reference": "460ee40b15ceb61d86a7c511d321c4580960601e", + "shasum": "" + }, + "require": { + "httpsoft/http-runner": "^1.1", + "php": "^7.4|^8.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Router\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Simple and fast HTTP request router providing PSR-7 and PSR-15", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-router", + "php", + "psr-15", + "psr-7", + "route", + "router" + ], + "support": { + "docs": "https://httpsoft.org/docs/router", + "issues": "https://github.com/httpsoft/http-router/issues", + "source": "https://github.com/httpsoft/http-router" + }, + "time": "2023-05-05T22:02:47+00:00" + }, + { + "name": "httpsoft/http-runner", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-runner.git", + "reference": "00ddc625dbf8f0acb786e899575537c7e8327847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-runner/zipball/00ddc625dbf8f0acb786e899575537c7e8327847", + "reference": "00ddc625dbf8f0acb786e899575537c7e8327847", + "shasum": "" + }, + "require": { + "httpsoft/http-emitter": "^1.1", + "php": "^7.4|^8.0", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.1|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-handler-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "devanych/di-container": "^2.1", + "httpsoft/http-message": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Runner\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Running PSR-7 components and building PSR-15 middleware pipelines", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-middleware", + "middleware-pipeline", + "php", + "psr-15", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/runner", + "issues": "https://github.com/httpsoft/http-runner/issues", + "source": "https://github.com/httpsoft/http-runner" + }, + "time": "2023-05-05T21:47:55+00:00" + }, + { + "name": "httpsoft/http-server-request", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-server-request.git", + "reference": "3d773c8bcaa1c44793d35842fcd82a9d5fd5f193" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-server-request/zipball/3d773c8bcaa1c44793d35842fcd82a9d5fd5f193", + "reference": "3d773c8bcaa1c44793d35842fcd82a9d5fd5f193", + "shasum": "" + }, + "require": { + "httpsoft/http-message": "^1.1", + "php": "^7.4|^8.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\ServerRequest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Infrastructure for creating PSR-7 ServerRequest and UploadedFile", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-message", + "http-server-request", + "php", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/server-request", + "issues": "https://github.com/httpsoft/http-server-request/issues", + "source": "https://github.com/httpsoft/http-server-request" + }, + "time": "2023-05-05T19:55:05+00:00" + }, + { + "name": "infection/abstract-testframework-adapter", + "version": "0.5.0", + "source": { + "type": "git", + "url": "https://github.com/infection/abstract-testframework-adapter.git", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^2.17", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Infection\\AbstractTestFramework\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } + ], + "description": "Abstract Test Framework Adapter for Infection", + "support": { + "issues": "https://github.com/infection/abstract-testframework-adapter/issues", + "source": "https://github.com/infection/abstract-testframework-adapter/tree/0.5.0" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-08-17T18:49:12+00:00" + }, + { + "name": "infection/extension-installer", + "version": "0.1.2", + "source": { + "type": "git", + "url": "https://github.com/infection/extension-installer.git", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1 || ^2.0" + }, + "require-dev": { + "composer/composer": "^1.9 || ^2.0", + "friendsofphp/php-cs-fixer": "^2.18, <2.19", + "infection/infection": "^0.15.2", + "php-coveralls/php-coveralls": "^2.4", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.10", + "phpstan/phpstan-phpunit": "^0.12.6", + "phpstan/phpstan-strict-rules": "^0.12.2", + "phpstan/phpstan-webmozart-assert": "^0.12.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.8" + }, + "type": "composer-plugin", + "extra": { + "class": "Infection\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "Infection\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } + ], + "description": "Infection Extension Installer", + "support": { + "issues": "https://github.com/infection/extension-installer/issues", + "source": "https://github.com/infection/extension-installer/tree/0.1.2" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-10-20T22:08:34+00:00" + }, + { + "name": "infection/include-interceptor", + "version": "0.2.5", + "source": { + "type": "git", + "url": "https://github.com/infection/include-interceptor.git", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7", + "shasum": "" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "infection/infection": "^0.15.0", + "phan/phan": "^2.4 || ^3", + "php-coveralls/php-coveralls": "^2.2", + "phpstan/phpstan": "^0.12.8", + "phpunit/phpunit": "^8.5", + "vimeo/psalm": "^3.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Infection\\StreamWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } + ], + "description": "Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.", + "support": { + "issues": "https://github.com/infection/include-interceptor/issues", + "source": "https://github.com/infection/include-interceptor/tree/0.2.5" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-08-09T10:03:57+00:00" + }, + { + "name": "infection/infection", + "version": "0.27.10", + "source": { + "type": "git", + "url": "https://github.com/infection/infection.git", + "reference": "873cd3335774a114bef9ca93388e623bf362d820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/infection/zipball/873cd3335774a114bef9ca93388e623bf362d820", + "reference": "873cd3335774a114bef9ca93388e623bf362d820", + "shasum": "" + }, + "require": { + "colinodell/json5": "^2.2", + "composer-runtime-api": "^2.0", + "composer/xdebug-handler": "^2.0 || ^3.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "fidry/cpu-core-counter": "^0.4.0 || ^0.5.0 || ^1.0", + "infection/abstract-testframework-adapter": "^0.5.0", + "infection/extension-installer": "^0.1.0", + "infection/include-interceptor": "^0.2.5", + "justinrainbow/json-schema": "^5.2.10", + "nikic/php-parser": "^4.15.1", + "ondram/ci-detector": "^4.1.0", + "php": "^8.1", + "sanmai/later": "^0.1.1", + "sanmai/pipeline": "^5.1 || ^6", + "sebastian/diff": "^3.0.2 || ^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "thecodingmachine/safe": "^2.1.2", + "webmozart/assert": "^1.11" + }, + "conflict": { + "antecedent/patchwork": "<2.1.25", + "dg/bypass-finals": "<1.4.1", + "phpunit/php-code-coverage": ">9,<9.1.4 || >9.2.17,<9.2.21" + }, + "require-dev": { + "brianium/paratest": "^6.11", + "ext-simplexml": "*", + "fidry/makefile": "^0.2.0", + "helmich/phpunit-json-assert": "^3.0", + "phpspec/prophecy": "^1.15", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.10.15", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpstan/phpstan-strict-rules": "^1.1.0", + "phpstan/phpstan-webmozart-assert": "^1.0.2", + "phpunit/phpunit": "^9.6", + "rector/rector": "^0.16.0", + "sidz/phpstan-rules": "^0.4.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "thecodingmachine/phpstan-safe-rule": "^1.2.0" + }, + "bin": [ + "bin/infection" + ], + "type": "library", + "autoload": { + "psr-4": { + "Infection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com", + "homepage": "https://twitter.com/maks_rafalko" + }, + { + "name": "Oleg Zhulnev", + "homepage": "https://github.com/sidz" + }, + { + "name": "Gert de Pagter", + "homepage": "https://github.com/BackEndTea" + }, + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com", + "homepage": "https://twitter.com/tfidry" + }, + { + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com", + "homepage": "https://www.alexeykopytko.com" + }, + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.", + "keywords": [ + "coverage", + "mutant", + "mutation framework", + "mutation testing", + "testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/infection/infection/issues", + "source": "https://github.com/infection/infection/tree/0.27.10" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2024-02-20T00:08:52+00:00" + }, + { + "name": "jolicode/jolinotif", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/jolicode/JoliNotif.git", + "reference": "b34dac1826c8d33e9fd5c300546261e94f1ebdb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/b34dac1826c8d33e9fd5c300546261e94f1ebdb8", + "reference": "b34dac1826c8d33e9fd5c300546261e94f1ebdb8", + "shasum": "" + }, + "require": { + "jolicode/php-os-helper": "^0.1.0", + "php": ">=8.1", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/deprecation-contracts": "^3", + "symfony/process": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-ffi": "Needed to send notifications via libnotify on Linux" + }, + "bin": [ + "jolinotif" + ], + "type": "library", + "autoload": { + "psr-4": { + "Joli\\JoliNotif\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Loïck Piera", + "email": "pyrech@gmail.com" + } + ], + "description": "Send desktop notifications on Windows, Linux, MacOS.", + "keywords": [ + "MAC", + "growl", + "linux", + "notification", + "windows" + ], + "support": { + "issues": "https://github.com/jolicode/JoliNotif/issues", + "source": "https://github.com/jolicode/JoliNotif/tree/v2.7.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/jolicode/jolinotif", + "type": "tidelift" + } + ], + "time": "2024-06-01T06:05:49+00:00" + }, + { + "name": "jolicode/php-os-helper", + "version": "v0.1.0", + "source": { + "type": "git", + "url": "https://github.com/jolicode/php-os-helper.git", + "reference": "1622ad8bbcab98e62b5c041397e8519f10d90e29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jolicode/php-os-helper/zipball/1622ad8bbcab98e62b5c041397e8519f10d90e29", + "reference": "1622ad8bbcab98e62b5c041397e8519f10d90e29", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "JoliCode\\PhpOsHelper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Loïck Piera", + "email": "pyrech@gmail.com" + } + ], + "description": "Helpers to detect the OS of the machine where PHP is running.", + "keywords": [ + "linux", + "os", + "osx", + "php", + "windows" + ], + "support": { + "issues": "https://github.com/jolicode/php-os-helper/issues", + "source": "https://github.com/jolicode/php-os-helper/tree/v0.1.0" + }, + "time": "2023-12-03T12:46:03+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" + }, + "time": "2024-07-06T21:00:26+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v4.5.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" + }, + "time": "2024-09-08T10:13:13+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.19.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ed4c8949a32986043e977dbe14776c14d644c45", + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.2" + }, + "time": "2024-09-17T19:36:00+00:00" + }, + { + "name": "nyholm/psr7", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2024-09-09T07:06:30+00:00" + }, + { + "name": "ondram/ci-detector", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/OndraM/ci-detector.git", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.13.2", + "lmc/coding-standard": "^3.0.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpunit/phpunit": "^9.6.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "OndraM\\CiDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ondřej Machulda", + "email": "ondrej.machulda@gmail.com" + } + ], + "description": "Detect continuous integration environment and provide unified access to properties of current build", + "keywords": [ + "CircleCI", + "Codeship", + "Wercker", + "adapter", + "appveyor", + "aws", + "aws codebuild", + "azure", + "azure devops", + "azure pipelines", + "bamboo", + "bitbucket", + "buddy", + "ci-info", + "codebuild", + "continuous integration", + "continuousphp", + "devops", + "drone", + "github", + "gitlab", + "interface", + "jenkins", + "pipelines", + "sourcehut", + "teamcity", + "travis" + ], + "support": { + "issues": "https://github.com/OndraM/ci-detector/issues", + "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" + }, + "time": "2024-03-12T13:22:30+00:00" + }, + { + "name": "openlss/lib-array2xml", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nullivex/lib-array2xml.git", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "LSS": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Bryan Tong", + "email": "bryan@nullivex.com", + "homepage": "https://www.nullivex.com" + }, + { + "name": "Tony Butler", + "email": "spudz76@gmail.com", + "homepage": "https://www.nullivex.com" + } + ], + "description": "Array2XML conversion library credit to lalit.org", + "homepage": "https://www.nullivex.com", + "keywords": [ + "array", + "array conversion", + "xml", + "xml conversion" + ], + "support": { + "issues": "https://github.com/nullivex/lib-array2xml/issues", + "source": "https://github.com/nullivex/lib-array2xml/tree/master" + }, + "time": "2019-03-29T20:06:56+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" + }, + "time": "2024-05-21T05:55:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + }, + "time": "2024-02-23T11:10:43+00:00" + }, + { + "name": "phpspec/php-diff", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/phpspec/php-diff.git", + "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/fc1156187f9f6c8395886fe85ed88a0a245d72e9", + "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9", + "shasum": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Diff": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Chris Boulton", + "homepage": "http://github.com/chrisboulton" + } + ], + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", + "support": { + "source": "https://github.com/phpspec/php-diff/tree/v1.1.3" + }, + "time": "2020-09-18T13:47:07+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.30.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "51b95ec8670af41009e2b2b56873bad96682413e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/51b95ec8670af41009e2b2b56873bad96682413e", + "reference": "51b95ec8670af41009e2b2b56873bad96682413e", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "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.30.1" + }, + "time": "2024-09-07T20:13:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.32", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "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/9.2.32" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.21", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-09-19T10:50:18+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.4", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" + }, + "time": "2024-06-10T01:18:23+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "roave/infection-static-analysis-plugin", + "version": "1.35.0", + "source": { + "type": "git", + "url": "https://github.com/Roave/infection-static-analysis-plugin.git", + "reference": "3cb32845c5f758913a4b9eafd91ae18eafc26d82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/infection-static-analysis-plugin/zipball/3cb32845c5f758913a4b9eafd91ae18eafc26d82", + "reference": "3cb32845c5f758913a4b9eafd91ae18eafc26d82", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "infection/infection": "0.27.10", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "sanmai/later": "^0.1.4", + "vimeo/psalm": "^4.30.0 || ^5.15" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0.0", + "phpunit/phpunit": "^10.5.12" + }, + "bin": [ + "bin/roave-infection-static-analysis-plugin" + ], + "type": "library", + "autoload": { + "psr-4": { + "Roave\\InfectionStaticAnalysis\\": "src/Roave/InfectionStaticAnalysis" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Static analysis on top of mutation testing - prevents escaped mutants from being invalid according to static analysis", + "support": { + "issues": "https://github.com/Roave/infection-static-analysis-plugin/issues", + "source": "https://github.com/Roave/infection-static-analysis-plugin/tree/1.35.0" + }, + "time": "2024-03-10T11:55:48+00:00" + }, + { + "name": "roave/security-advisories", + "version": "dev-latest", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "4b6b927472278272e2411f4341dba95d96c8c7d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/4b6b927472278272e2411f4341dba95d96c8c7d7", + "reference": "4b6b927472278272e2411f4341dba95d96c8c7d7", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "admidio/admidio": "<4.3.10", + "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", + "aheinze/cockpit": "<2.2", + "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.04.6", + "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", + "aimeos/ai-client-html": ">=2020.04.1,<2020.10.27|>=2021.04.1,<2021.10.22|>=2022.04.1,<2022.10.13|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.04.7", + "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9", + "aimeos/aimeos-core": ">=2022.04.1,<2022.10.17|>=2023.04.1,<2023.10.17|>=2024.04.1,<2024.04.7", + "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", + "airesvsg/acf-to-rest-api": "<=3.1", + "akaunting/akaunting": "<2.1.13", + "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", + "alextselegidis/easyappointments": "<1.5", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<=1.7.2|>=2,<=2.1", + "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "andreapollastri/cipi": "<=3.1.15", + "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", + "apache-solr-for-typo3/solr": "<2.8.3", + "apereo/phpcas": "<1.6", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3", + "appwrite/server-ce": "<=1.2.1", + "arc/web": "<3", + "area17/twill": "<1.2.5|>=2,<2.5.3", + "artesaos/seotools": "<0.17.2", + "asymmetricrypt/asymmetricrypt": "<9.9.99", + "athlon1600/php-proxy": "<=5.1", + "athlon1600/php-proxy-app": "<=3", + "austintoddj/canvas": "<=3.4.2", + "auth0/wordpress": "<=4.6", + "automad/automad": "<2.0.0.0-alpha5", + "automattic/jetpack": "<9.8", + "awesome-support/awesome-support": "<=6.0.7", + "aws/aws-sdk-php": "<3.288.1", + "azuracast/azuracast": "<0.18.3", + "backdrop/backdrop": "<1.27.3|>=1.28,<1.28.2", + "backpack/crud": "<3.4.9", + "bacula-web/bacula-web": "<8.0.0.0-RC2-dev", + "badaso/core": "<2.7", + "bagisto/bagisto": "<2.1", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "barryvdh/laravel-translation-manager": "<0.6.2", + "barzahlen/barzahlen-php": "<2.0.1", + "baserproject/basercms": "<5.0.9", + "bassjobsen/bootstrap-3-typeahead": ">4.0.2", + "bbpress/bbpress": "<2.6.5", + "bcosca/fatfree": "<3.7.2", + "bedita/bedita": "<4", + "bigfork/silverstripe-form-capture": ">=3,<3.1.1", + "billz/raspap-webgui": "<=3.1.4", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "blueimp/jquery-file-upload": "==6.4.4", + "bmarshall511/wordpress_zero_spam": "<5.2.13", + "bolt/bolt": "<3.7.2", + "bolt/core": "<=4.2", + "born05/craft-twofactorauthentication": "<3.3.4", + "bottelet/flarepoint": "<2.2.1", + "bref/bref": "<2.1.17", + "brightlocal/phpwhois": "<=4.2.5", + "brotkrueml/codehighlight": "<2.7", + "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", + "brotkrueml/typo3-matomo-integration": "<1.3.2", + "buddypress/buddypress": "<7.2.1", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "bytefury/crater": "<6.0.2", + "cachethq/cachet": "<2.5.1", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cardgate/magento2": "<2.0.33", + "cardgate/woocommerce": "<=3.1.15", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cart2quote/module-quotation-encoded": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "catfan/medoo": "<1.7.5", + "causal/oidc": "<2.1", + "cecil/cecil": "<7.47.1", + "centreon/centreon": "<22.10.15", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "chriskacerguis/codeigniter-restserver": "<=2.7.1", + "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", + "ckeditor/ckeditor": "<4.24", + "cockpit-hq/cockpit": "<2.7|==2.7", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", + "codeigniter/framework": "<3.1.9", + "codeigniter4/framework": "<4.4.7", + "codeigniter4/shield": "<1.0.0.0-beta8", + "codiad/codiad": "<=2.8.4", + "composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7", + "concrete5/concrete5": "<9.3.4", + "concrete5/core": "<8.5.8|>=9,<9.1", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", + "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/core": "<3.5.39", + "contao/core-bundle": "<4.13.49|>=5,<5.3.15|>=5.4,<5.4.3", + "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", + "contao/managed-edition": "<=1.5", + "corveda/phpsandbox": "<1.3.5", + "cosenary/instagram": "<=2.3", + "craftcms/cms": "<4.6.2|>=5,<=5.2.2", + "croogo/croogo": "<4", + "cuyz/valinor": "<0.12", + "czim/file-handling": "<1.5|>=2,<2.3", + "czproject/git-php": "<4.0.3", + "damienharper/auditor-bundle": "<5.2.6", + "dapphp/securimage": "<3.6.6", + "darylldoyle/safe-svg": "<1.9.10", + "datadog/dd-trace": ">=0.30,<0.30.2", + "datatables/datatables": "<1.10.10", + "david-garcia/phpwhois": "<=4.3.1", + "dbrisinajumi/d2files": "<1", + "dcat/laravel-admin": "<=2.1.3", + "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", + "desperado/xml-bundle": "<=0.1.7", + "devgroup/dotplant": "<2020.09.14-dev", + "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", + "doctrine/annotations": "<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": "<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<0.7.2", + "doctrine/mongodb-odm": "<1.0.2", + "doctrine/mongodb-odm-bundle": "<3.0.1", + "doctrine/orm": ">=1,<1.2.4|>=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<19.0.2", + "dompdf/dompdf": "<2.0.4", + "doublethreedigital/guest-entries": "<3.1.2", + "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<10.1.8|>=10.2,<10.2.2|==11.9999999.9999999.9999999-dev", + "drupal/core-recommended": "==11.9999999.9999999.9999999-dev", + "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4|==11.9999999.9999999.9999999-dev", + "duncanmcclean/guest-entries": "<3.1.2", + "dweeves/magmi": "<=0.7.24", + "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.1.2", + "ecodev/newsletter": "<=4", + "ectouch/ectouch": "<=2.7.2", + "egroupware/egroupware": "<23.1.20240624", + "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", + "enhavo/enhavo-app": "<=0.13.1", + "enshrined/svg-sanitize": "<0.15", + "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", + "evolutioncms/evolution": "<=3.2.3", + "exceedone/exment": "<4.4.3|>=5,<5.0.3", + "exceedone/laravel-admin": "<2.2.3|==3", + "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26|>=3.3,<3.3.39", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", + "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.35", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev|>=3.3,<3.3.40", + "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/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", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "facturascripts/facturascripts": "<=2022.08", + "fastly/magento2": "<1.2.26", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=2.1.1", + "fenom/fenom": "<=2.12.1", + "filegator/filegator": "<7.8", + "filp/whoops": "<2.1.13", + "fineuploader/php-traditional-server": "<=1.2.2", + "firebase/php-jwt": "<6", + "fisharebest/webtrees": "<=2.1.18", + "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", + "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", + "flarum/core": "<1.8.5", + "flarum/flarum": "<0.1.0.0-beta8", + "flarum/framework": "<1.8.5", + "flarum/mentions": "<1.6.3", + "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", + "flarum/tags": "<=0.1.0.0-beta13", + "floriangaerber/magnesium": "<0.3.1", + "fluidtypo3/vhs": "<5.1.1", + "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", + "fof/upload": "<1.2.3", + "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.11.1", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<=11.5.1", + "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1,<1.3.5", + "friendsofsymfony1/swiftmailer": ">=4,<5.4.13|>=6,<6.2.5", + "friendsofsymfony1/symfony1": ">=1.1,<1.5.19", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", + "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.3", + "froxlor/froxlor": "<=2.2.0.0-RC3", + "frozennode/administrator": "<=5.0.12", + "fuel/core": "<1.8.1", + "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "genix/cms": "<=1.1.11", + "getformwork/formwork": "<1.13.1|==2.0.0.0-beta1", + "getgrav/grav": "<1.7.46", + "getkirby/cms": "<=3.6.6.5|>=3.7,<=3.7.5.4|>=3.8,<=3.8.4.3|>=3.9,<=3.9.8.1|>=3.10,<=3.10.1|>=4,<=4.3", + "getkirby/kirby": "<=2.5.12", + "getkirby/panel": "<2.5.14", + "getkirby/starterkit": "<=3.7.0.2", + "gilacms/gila": "<=1.15.4", + "gleez/cms": "<=1.3|==2", + "globalpayments/php-sdk": "<2", + "gogentooss/samlbase": "<1.2.7", + "google/protobuf": "<3.15", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<2.2.1", + "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<6.1.17", + "gugoan/economizzer": "<=0.9.0.0-beta1", + "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", + "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", + "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", + "harvesthq/chosen": "<1.8.7", + "helloxz/imgurl": "<=2.31", + "hhxsv5/laravel-s": "<3.7.36", + "hillelcoren/invoice-ninja": "<5.3.35", + "himiklab/yii2-jqgrid-widget": "<1.0.8", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "httpsoft/http-message": "<1.0.12", + "hyn/multi-tenant": ">=5.6,<5.7.2", + "ibexa/admin-ui": ">=4.2,<4.2.3|>=4.6.0.0-beta1,<4.6.9", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.6|>=4.6,<4.6.2", + "ibexa/fieldtype-richtext": ">=4.6,<4.6.10", + "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", + "ibexa/post-install": "<=1.0.4", + "ibexa/solr": ">=4.5,<4.5.4", + "ibexa/user": ">=4,<4.4.3", + "icecoder/icecoder": "<=8.1", + "idno/known": "<=1.3.1", + "ilicmiljan/secure-props": ">=1.2,<1.2.2", + "illuminate/auth": "<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", + "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", + "imdbphp/imdbphp": "<=5.1.1", + "impresscms/impresscms": "<=1.4.5", + "impresspages/impresspages": "<=1.0.12", + "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", + "in2code/powermail": "<7.5.1|>=8,<8.5.1|>=9,<10.9.1|>=11,<12.4.1", + "innologi/typo3-appointments": "<2.0.6", + "intelliants/subrion": "<4.2.2", + "inter-mediator/inter-mediator": "==5.5", + "ipl/web": "<0.10.1", + "islandora/islandora": ">=2,<2.4.1", + "ivankristianto/phpwhois": "<=4.3", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "james-heinrich/getid3": "<1.9.21", + "james-heinrich/phpthumb": "<1.7.12", + "jasig/phpcas": "<1.3.3", + "jcbrand/converse.js": "<3.3.3", + "johnbillion/wp-crontrol": "<1.16.2", + "joomla/application": "<1.0.13", + "joomla/archive": "<1.1.12|>=2,<2.0.1", + "joomla/filesystem": "<1.6.2|>=2,<2.0.1", + "joomla/filter": "<1.4.4|>=2,<2.0.1", + "joomla/framework": "<1.5.7|>=2.5.4,<=3.8.12", + "joomla/input": ">=2,<2.0.2", + "joomla/joomla-cms": ">=2.5,<3.9.12", + "joomla/session": "<1.3.1", + "joyqi/hyper-down": "<=2.4.27", + "jsdecena/laracom": "<2.0.9", + "jsmitty12/phpwhois": "<5.1", + "juzaweb/cms": "<=3.4", + "jweiland/events2": "<8.3.8|>=9,<9.0.6", + "kazist/phpwhois": "<=4.2.6", + "kelvinmo/simplexrd": "<3.1.1", + "kevinpapst/kimai2": "<1.16.7", + "khodakhah/nodcms": "<=3", + "kimai/kimai": "<=2.20.1", + "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", + "klaviyo/magento2-extension": ">=1,<3", + "knplabs/knp-snappy": "<=1.4.2", + "kohana/core": "<3.3.3", + "krayin/laravel-crm": "<1.2.2", + "kreait/firebase-php": ">=3.2,<3.8.1", + "kumbiaphp/kumbiapp": "<=1.1.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", + "laminas/laminas-http": "<2.14.2", + "laravel/fortify": "<1.11.1", + "laravel/framework": "<6.20.44|>=7,<7.30.6|>=8,<8.75", + "laravel/laravel": ">=5.4,<5.4.22", + "laravel/socialite": ">=1,<2.0.10", + "latte/latte": "<2.10.8", + "lavalite/cms": "<=9|==10.1", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", + "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "libreform/libreform": ">=2,<=2.0.8", + "librenms/librenms": "<2017.08.18", + "liftkit/database": "<2.13.2", + "lightsaml/lightsaml": "<1.3.5", + "limesurvey/limesurvey": "<3.27.19", + "livehelperchat/livehelperchat": "<=3.91", + "livewire/livewire": ">2.2.4,<2.2.6|>=3.3.5,<3.4.9", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "luyadev/yii-helpers": "<1.2.1", + "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch9|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch7|==2.4.7|>=2.4.7.0-patch1,<2.4.7.0-patch2", + "magento/core": "<=1.9.4.5", + "magento/magento1ce": "<1.9.4.3-dev", + "magento/magento1ee": ">=1,<1.14.4.3-dev", + "magento/product-community-edition": "<2.4.4.0-patch9|>=2.4.5,<2.4.5.0-patch8|>=2.4.6,<2.4.6.0-patch6|>=2.4.7,<2.4.7.0-patch1", + "magneto/core": "<1.9.4.4-dev", + "maikuolan/phpmussel": ">=1,<1.6", + "mainwp/mainwp": "<=4.4.3.3", + "mantisbt/mantisbt": "<2.26.2", + "marcwillmann/turn": "<0.3.3", + "matyhtf/framework": "<3.0.6", + "mautic/core": "<4.4.13|>=5,<5.1.1", + "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", + "mdanter/ecc": "<2", + "mediawiki/core": "<1.36.2", + "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,<2.0.1", + "microsoft/microsoft-graph-beta": "<2.0.1", + "microsoft/microsoft-graph-core": "<2.0.2", + "microweber/microweber": "<=2.0.16", + "mikehaertl/php-shellcommand": "<1.6.1", + "miniorange/miniorange-saml": "<1.4.3", + "mittwald/typo3_forum": "<1.2.1", + "mobiledetect/mobiledetectlib": "<2.8.32", + "modx/revolution": "<=2.8.3.0-patch", + "mojo42/jirafeau": "<4.4", + "mongodb/mongodb": ">=1,<1.9.2", + "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<4.3.5|>=4.4.0.0-beta,<4.4.1", + "mos/cimage": "<0.7.19", + "movim/moxl": ">=0.8,<=0.10", + "movingbytes/social-network": "<=1.2.1", + "mpdf/mpdf": "<=7.1.7", + "munkireport/comment": "<4.1", + "munkireport/managedinstalls": "<2.6", + "munkireport/munki_facts": "<1.5", + "munkireport/munkireport": ">=2.5.3,<5.6.3", + "munkireport/reportdata": "<3.5", + "munkireport/softwareupdate": "<1.6", + "mustache/mustache": ">=2,<2.14.1", + "namshi/jose": "<2.2", + "nategood/httpful": "<1", + "neoan3-apps/template": "<1.1.1", + "neorazorx/facturascripts": "<2022.04", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/media-browser": "<7.3.19|>=8,<8.0.16|>=8.1,<8.1.11|>=8.2,<8.2.11|>=8.3,<8.3.9", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", + "neos/swiftmailer": "<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<3.0.10", + "nonfiction/nterchange": "<4.1.1", + "notrinos/notrinos-erp": "<=0.7", + "noumo/easyii": "<=0.9", + "novaksolutions/infusionsoft-php-sdk": "<1", + "nukeviet/nukeviet": "<4.5.02", + "nyholm/psr7": "<1.6.1", + "nystudio107/craft-seomatic": "<3.4.12", + "nzedb/nzedb": "<0.8", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", + "october/october": "<=3.4.4", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.15", + "omeka/omeka-s": "<4.0.3", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": ">=1,<1.9.3|>=2,<2.1.5", + "open-web-analytics/open-web-analytics": "<1.7.4", + "opencart/opencart": ">=0", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<20.10.1", + "opensolutions/vimbadmin": "<=3.0.15", + "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", + "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/crm-call-bundle": ">=4.2,<=4.2.5|>=5,<5.0.4|>=5.1,<5.1.1", + "oro/customer-portal": ">=4.1,<=4.1.13|>=4.2,<=4.2.10|>=5,<=5.0.11|>=5.1,<=5.1.3", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<=4.2.10|>=5,<=5.0.12|>=5.1,<=5.1.3", + "oveleon/contao-cookiebar": "<1.16.3|>=2,<2.1.3", + "oxid-esales/oxideshop-ce": "<4.5", + "oxid-esales/paymorrow-module": ">=1,<1.0.2|>=2,<2.0.1", + "packbackbooks/lti-1-3-php-library": "<5", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": "<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/ecc": "<2.0.1", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<4.6.2", + "paypal/adaptivepayments-sdk-php": "<=3.9.2", + "paypal/invoice-sdk-php": "<=3.9", + "paypal/merchant-sdk-php": "<3.12", + "paypal/permissions-sdk-php": "<=3.9.1", + "pear/archive_tar": "<1.4.14", + "pear/auth": "<1.2.4", + "pear/crypt_gpg": "<1.6.7", + "pear/pear": "<=1.10.1", + "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.2", + "php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5", + "php-mod/curl": "<2.3.2", + "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1", + "phpems/phpems": ">=6,<=6.1.3", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<5.2.1", + "phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5", + "phpoffice/common": "<0.2.9", + "phpoffice/phpexcel": "<1.8", + "phpoffice/phpspreadsheet": "<1.29.1|>=2,<2.1.1|>=2.2,<2.2.1", + "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", + "phpservermon/phpservermon": "<3.6", + "phpsysinfo/phpsysinfo": "<3.4.3", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "phpxmlrpc/phpxmlrpc": "<4.9.2", + "pi/pi": "<=2.5", + "pimcore/admin-ui-classic-bundle": "<1.5.4", + "pimcore/customer-management-framework-bundle": "<4.0.6", + "pimcore/data-hub": "<1.2.4", + "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", + "pimcore/demo": "<10.3", + "pimcore/ecommerce-framework-bundle": "<1.0.10", + "pimcore/perspective-editor": "<1.5.1", + "pimcore/pimcore": "<11.2.4", + "pixelfed/pixelfed": "<0.11.11", + "plotly/plotly.js": "<2.25.2", + "pocketmine/bedrock-protocol": "<8.0.2", + "pocketmine/pocketmine-mp": "<5.11.2", + "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/blockreassurance": "<=5.1.3", + "prestashop/blockwishlist": ">=2,<2.1.1", + "prestashop/contactform": ">=1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": "<8.1.6", + "prestashop/productcomments": "<5.0.2", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.4|>=1.5,<1.7.4", + "processwire/processwire": "<=3.0.229", + "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<1.11.6", + "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", + "pxlrbt/filament-excel": "<1.1.14|>=2.0.0.0-alpha,<2.3.3", + "pyrocms/pyrocms": "<=3.9.1", + "qcubed/qcubed": "<=3.1.1", + "quickapps/cms": "<=2.0.0.0-beta2", + "rainlab/blog-plugin": "<1.4.1", + "rainlab/debugbar-plugin": "<3.1", + "rainlab/user-plugin": "<=1.4.5", + "rankmath/seo-by-rank-math": "<=1.0.95", + "rap2hpoutre/laravel-log-viewer": "<0.13", + "react/http": ">=0.7,<1.9", + "really-simple-plugins/complianz-gdpr": "<6.4.2", + "redaxo/source": "<=5.15.1", + "remdex/livehelperchat": "<4.29", + "reportico-web/reportico": "<=8.1", + "rhukster/dom-sanitizer": "<1.0.7", + "rmccue/requests": ">=1.6,<1.8", + "robrichards/xmlseclibs": ">=1,<3.0.4", + "roots/soil": "<4.1", + "rudloff/alltube": "<3.0.3", + "s-cart/core": "<6.9", + "s-cart/s-cart": "<6.9", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": "<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "sfroemken/url_redirect": "<=1.2.1", + "sheng/yiicms": "<=1.2", + "shopware/core": "<=6.5.8.12|>=6.6,<=6.6.5", + "shopware/platform": "<=6.5.8.12|>=6.6,<=6.6.5", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=5.7.17", + "shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev", + "shopxo/shopxo": "<=6.1", + "showdoc/showdoc": "<2.10.4", + "silverstripe-australia/advancedreports": ">=1,<=2", + "silverstripe/admin": "<1.13.19|>=2,<2.1.8", + "silverstripe/assets": ">=1,<1.11.1", + "silverstripe/cms": "<4.11.3", + "silverstripe/comments": ">=1.3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<5.2.16", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3", + "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", + "silverstripe/recipe-cms": ">=4.5,<4.5.3", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/reports": "<5.2.3", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4|>=2.1,<2.1.2", + "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", + "silverstripe/subsites": ">=2,<2.6.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3|>=5,<5.4.2", + "silverstripe/versioned-admin": ">=1,<1.11.1", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4|==5.0.0.0-alpha12", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplesamlphp/simplesamlphp-module-openid": "<1", + "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", + "simplesamlphp/xml-security": "==1.6.11", + "simplito/elliptic-php": "<1.0.6", + "sitegeist/fluid-components": "<3.5", + "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", + "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", + "slim/slim": "<2.6", + "slub/slub-events": "<3.0.3", + "smarty/smarty": "<4.5.3|>=5,<5.1.1", + "snipe/snipe-it": "<6.4.2", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spatie/browsershot": "<3.57.4", + "spatie/image-optimizer": "<1.7.3", + "spipu/html2pdf": "<5.2.8", + "spoon/library": "<1.4.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<24.05.1", + "statamic/cms": "<4.46|>=5.3,<5.6.2", + "stormpath/sdk": "<9.9.99", + "studio-42/elfinder": "<=2.1.64", + "studiomitte/friendlycaptcha": "<0.1.4", + "subhh/libconnect": "<7.0.8|>=8,<8.1", + "sukohi/surpass": "<1", + "sulu/form-bundle": ">=2,<2.5.3", + "sulu/sulu": "<1.6.44|>=2,<2.4.17|>=2.5,<2.5.13", + "sumocoders/framework-user-bundle": "<1.4", + "superbig/craft-audit": "<3.0.2", + "swag/paypal": "<5.4.4", + "swiftmailer/swiftmailer": "<6.2.5", + "swiftyedit/swiftyedit": "<1.2", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": "<1.10.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", + "sylius/resource-bundle": ">=1,<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.12.19|>=1.13.0.0-alpha1,<1.13.4", + "symbiote/silverstripe-multivaluefield": ">=3,<3.1", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-seed": "<6.0.3", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<5.3.15|>=5.4.3,<5.4.4|>=6.0.3,<6.0.4", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2|>=5.4,<5.4.31|>=6,<6.3.8", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/translation": ">=2,<2.0.17", + "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/ux-autocomplete": "<2.11.2", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "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|>=2.2.0.0-beta1,<2.2.0.0-beta2", + "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.7.4", + "terminal42/contao-tablelookupwizard": "<3.3.5", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "thinkcmf/thinkcmf": "<6.0.8", + "thorsten/phpmyfaq": "<3.2.2", + "tikiwiki/tiki-manager": "<=17.1", + "timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1", + "tinymce/tinymce": "<7.2", + "tinymighty/wiki-seo": "<1.2.2", + "titon/framework": "<9.9.99", + "tobiasbg/tablepress": "<=2.0.0.0-RC1", + "topthink/framework": "<6.0.17|>=6.1,<=8.0.4", + "topthink/think": "<=6.1.1", + "topthink/thinkphp": "<=3.2.3", + "torrentpier/torrentpier": "<=2.4.3", + "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", + "tribalsystems/zenario": "<9.5.60602", + "truckersmp/phpwhois": "<=4.3.1", + "ttskch/pagination-service-provider": "<1", + "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2", + "twig/twig": "<1.44.8|>=2,<2.16.1|>=3,<3.11.1|>=3.12,<3.14", + "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", + "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": "<=8.7.56|>=9,<=9.5.47|>=10,<=10.4.44|>=11,<=11.5.36|>=12,<=12.4.14|>=13,<=13.1", + "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", + "typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-frontend": "<4.3.9|>=4.4,<4.4.5", + "typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8", + "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "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.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", + "uvdesk/core-framework": "<=1.1.1", + "vanilla/safecurl": "<0.9.2", + "verbb/comments": "<1.5.5", + "verbb/formie": "<2.1.6", + "verbb/image-resizer": "<2.0.9", + "verbb/knock-knock": "<1.2.8", + "verot/class.upload.php": "<=2.1.6", + "villagedefrance/opencart-overclocked": "<=1.11.1", + "vova07/yii2-fileapi-widget": "<0.1.9", + "vrana/adminer": "<4.8.1", + "vufind/vufind": ">=2,<9.1.1", + "waldhacker/hcaptcha": "<2.1.2", + "wallabag/tcpdf": "<6.2.22", + "wallabag/wallabag": "<2.6.7", + "wanglelecc/laracms": "<=1.0.3", + "web-auth/webauthn-framework": ">=3.3,<3.3.4|>=4.5,<4.9", + "web-auth/webauthn-lib": ">=4.5,<4.9", + "web-feet/coastercms": "==5.5", + "webbuilders-group/silverstripe-kapost-bridge": "<0.4", + "webcoast/deferred-image-processing": "<1.0.2", + "webklex/laravel-imap": "<5.3", + "webklex/php-imap": "<5.3", + "webpa/webpa": "<3.1.2", + "wikibase/wikibase": "<=1.39.3", + "wikimedia/parsoid": "<0.12.2", + "willdurand/js-translation-bundle": "<2.1.1", + "winter/wn-backend-module": "<1.2.4", + "winter/wn-dusk-plugin": "<2.1", + "winter/wn-system-module": "<1.2.4", + "wintercms/winter": "<=1.2.3", + "wireui/wireui": "<1.19.3|>=2,<2.1.3", + "woocommerce/woocommerce": "<6.6|>=8.8,<8.8.5|>=8.9,<8.9.3", + "wp-cli/wp-cli": ">=0.12,<2.5", + "wp-graphql/wp-graphql": "<=1.14.5", + "wp-premium/gravityforms": "<2.4.21", + "wpanel/wpanel4-cms": "<=4.3.1", + "wpcloud/wp-stateless": "<3.2", + "wpglobus/wpglobus": "<=1.9.6", + "wwbn/avideo": "<14.3", + "xataface/xataface": "<3", + "xpressengine/xpressengine": "<3.0.15", + "yab/quarx": "<2.4.5", + "yeswiki/yeswiki": "<4.1", + "yetiforce/yetiforce-crm": "<=6.4", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": "<1.1.29", + "yiisoft/yii2": "<2.0.49.4-dev", + "yiisoft/yii2-authclient": "<2.2.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.43", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<=2.2.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", + "yuan1994/tpadmin": "<=1.3.12", + "zencart/zencart": "<=1.5.7.0-beta", + "zendesk/zendesk_api_client_php": "<2.2.11", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": "<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": "<1.8.4", + "zendframework/zend-feed": "<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": "<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": "<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": "<2.0.2", + "zendframework/zendrest": "<2.0.2", + "zendframework/zendservice-amazon": "<2.0.3", + "zendframework/zendservice-api": "<1", + "zendframework/zendservice-audioscrobbler": "<2.0.2", + "zendframework/zendservice-nirvanix": "<2.0.2", + "zendframework/zendservice-slideshare": "<2.0.2", + "zendframework/zendservice-technorati": "<2.0.2", + "zendframework/zendservice-windowsazure": "<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zenstruck/collection": "<0.2.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<=6.1.53" + }, + "default-branch": true, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "keywords": [ + "dev" + ], + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2024-09-19T17:04:43+00:00" + }, + { + "name": "sanmai/later", + "version": "0.1.4", + "source": { + "type": "git", + "url": "https://github.com/sanmai/later.git", + "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sanmai/later/zipball/e24c4304a4b1349c2a83151a692cec0c10579f60", + "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.35.1", + "infection/infection": ">=0.27.6", + "phan/phan": ">=2", + "php-coveralls/php-coveralls": "^2.0", + "phpstan/phpstan": ">=1.4.5", + "phpunit/phpunit": ">=9.5 <10", + "vimeo/psalm": ">=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Later\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" + } + ], + "description": "Later: deferred wrapper object", + "support": { + "issues": "https://github.com/sanmai/later/issues", + "source": "https://github.com/sanmai/later/tree/0.1.4" + }, + "funding": [ + { + "url": "https://github.com/sanmai", + "type": "github" + } + ], + "time": "2023-10-24T00:25:28+00:00" + }, + { + "name": "sanmai/pipeline", + "version": "v6.11", + "source": { + "type": "git", + "url": "https://github.com/sanmai/pipeline.git", + "reference": "a5fa2a6c6ca93efa37e7c24aab72f47448a6b110" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sanmai/pipeline/zipball/a5fa2a6c6ca93efa37e7c24aab72f47448a6b110", + "reference": "a5fa2a6c6ca93efa37e7c24aab72f47448a6b110", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.17", + "infection/infection": ">=0.10.5", + "league/pipeline": "^0.3 || ^1.0", + "phan/phan": ">=1.1", + "php-coveralls/php-coveralls": "^2.4.1", + "phpstan/phpstan": ">=0.10", + "phpunit/phpunit": ">=9.4", + "vimeo/psalm": ">=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v6.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Pipeline\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" + } + ], + "description": "General-purpose collections pipeline", + "support": { + "issues": "https://github.com/sanmai/pipeline/issues", + "source": "https://github.com/sanmai/pipeline/tree/v6.11" + }, + "funding": [ + { + "url": "https://github.com/sanmai", + "type": "github" + } + ], + "time": "2024-06-15T03:11:19+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:33:00+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "softcreatr/jsonpath", + "version": "0.9.1", + "source": { + "type": "git", + "url": "https://github.com/SoftCreatR/JSONPath.git", + "reference": "272173a65fd16b25010dbd54d04dd34c0c5a8500" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SoftCreatR/JSONPath/zipball/272173a65fd16b25010dbd54d04dd34c0c5a8500", + "reference": "272173a65fd16b25010dbd54d04dd34c0c5a8500", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "8.1 - 8.4" + }, + "replace": { + "flow/jsonpath": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.58", + "phpunit/phpunit": "10 - 12", + "squizlabs/php_codesniffer": "^3.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Flow\\JSONPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stephen Frank", + "email": "stephen@flowsa.com", + "homepage": "https://prismaticbytes.com", + "role": "Developer" + }, + { + "name": "Sascha Greuel", + "email": "hello@1-2.dev", + "homepage": "https://1-2.dev", + "role": "Developer" + } + ], + "description": "JSONPath implementation for parsing, searching and flattening arrays", + "support": { + "email": "hello@1-2.dev", + "forum": "https://github.com/SoftCreatR/JSONPath/discussions", + "issues": "https://github.com/SoftCreatR/JSONPath/issues", + "source": "https://github.com/SoftCreatR/JSONPath" + }, + "funding": [ + { + "url": "https://ecologi.com/softcreatr?r=61212ab3fc69b8eb8a2014f4", + "type": "custom" + }, + { + "url": "https://github.com/softcreatr", + "type": "github" + } + ], + "time": "2024-06-01T09:15:21+00:00" + }, + { + "name": "spatie/phpunit-watcher", + "version": "1.23.6", + "source": { + "type": "git", + "url": "https://github.com/spatie/phpunit-watcher.git", + "reference": "c192fff763810c8378511bcf0069df4b91478866" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/phpunit-watcher/zipball/c192fff763810c8378511bcf0069df4b91478866", + "reference": "c192fff763810c8378511bcf0069df4b91478866", + "shasum": "" + }, + "require": { + "clue/stdio-react": "^2.4", + "jolicode/jolinotif": "^2.2", + "php": "^7.2 | ^8.0 | ^8.1", + "symfony/console": "^5 | ^6", + "symfony/finder": "^5.4 | ^6", + "symfony/process": "^5.4 | ^6", + "symfony/yaml": "^5.2 | ^6", + "yosymfony/resource-watcher": "^2.0 | ^3.0" + }, + "conflict": { + "symfony/console": "<5.2", + "yosymfony/resource-watcher": "<2.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.6 | ^9.0" + }, + "bin": [ + "phpunit-watcher" + ], + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\PhpUnitWatcher\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Automatically rerun PHPUnit tests when source code changes", + "homepage": "https://github.com/spatie/phpunit-watcher", + "keywords": [ + "phpunit-watcher", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/phpunit-watcher/issues", + "source": "https://github.com/spatie/phpunit-watcher/tree/1.23.6" + }, + "time": "2022-01-31T11:57:13+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v6.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/62ab90b92066ef6cce5e79365625b4b1432464c8", + "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/dom-crawler": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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/v6.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:49:08+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "3a61e2e4fbda3fb7fb5d83620c30fef726139e1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/3a61e2e4fbda3fb7fb5d83620c30fef726139e1c", + "reference": "3a61e2e4fbda3fb7fb5d83620c30fef726139e1c", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-09T12:56:10+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v6.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/9d307ecbcb917001692be333cdc58f474fdb37f0", + "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0", + "shasum": "" + }, + "require": { + "masterminds/html5": "^2.6", + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "symfony/css-selector": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-15T06:35:36+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2774908d5ae32fd94e363e7cbbd87462712c4576", + "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T19:05:29+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "52b3c9cce673b014915445a432339f282e002ce6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b3c9cce673b014915445a432339f282e002ce6", + "reference": "52b3c9cce673b014915445a432339f282e002ce6", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-29T07:35:21+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-17T12:47:12+00:00" + }, + { + "name": "thecodingmachine/safe", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "files": [ + "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", + "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "deprecated/strings.php", + "lib/special_cases.php", + "deprecated/mysqli.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + }, + "time": "2023-04-05T11:54:14+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "vimeo/psalm", + "version": "4.30.0", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0bc6e25d89f649e4f36a534f330f8bb4643dd69", + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer/package-versions-deprecated": "^1.8.0", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.13", + "openlss/lib-array2xml": "^1.0", + "php": "^7.1|^8", + "sebastian/diff": "^3.0 || ^4.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.25", + "webmozart/path-util": "^2.3" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", + "ext-curl": "*", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpdocumentor/reflection-docblock": "^5", + "phpmyadmin/sql-parser": "5.1.0||dev-master", + "phpspec/prophecy": ">=1.9.0", + "phpstan/phpdoc-parser": "1.2.* || 1.6.4", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.3 || ^5.0 || ^6.0", + "weirdan/prophecy-shim": "^1.0 || ^2.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php", + "src/spl_object_id.php" + ], + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php" + ], + "support": { + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm/tree/4.30.0" + }, + "time": "2022-11-06T20:37:08+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webmozart/path-util", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/path-util.git", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "webmozart/assert": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\PathUtil\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", + "support": { + "issues": "https://github.com/webmozart/path-util/issues", + "source": "https://github.com/webmozart/path-util/tree/2.3.0" + }, + "abandoned": "symfony/filesystem", + "time": "2015-12-17T08:42:14+00:00" + }, + { + "name": "yiisoft/active-record", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/active-record.git", + "reference": "5c4151d74fc8025261b0d3921f649513261a0144" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/active-record/zipball/5c4151d74fc8025261b0d3921f649513261a0144", + "reference": "5c4151d74fc8025261b0d3921f649513261a0144", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.1", + "yiisoft/db": "dev-master" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25", + "yiisoft/aliases": "^2.0", + "yiisoft/arrays": "^3.1", + "yiisoft/cache": "^3.0", + "yiisoft/db-sqlite": "dev-master", + "yiisoft/di": "^1.0", + "yiisoft/factory": "^1.2", + "yiisoft/json": "^1.0", + "yiisoft/middleware-dispatcher": "^5.2" + }, + "suggest": { + "yiisoft/arrays": "For \\Yiisoft\\Arrays\\ArrayableInterface support", + "yiisoft/db-mssql": "For MSSQL database support", + "yiisoft/db-mysql": "For MySQL database support", + "yiisoft/db-oracle": "For Oracle database support", + "yiisoft/db-pgsql": "For PostgreSQL database support", + "yiisoft/db-sqlite": "For SQLite database support", + "yiisoft/factory": "For factory support", + "yiisoft/middleware-dispatcher": "For middleware support" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\ActiveRecord\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii ActiveRecord Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "Active Record", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/active-record/issues?state=open", + "source": "https://github.com/yiisoft/active-record", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-16T09:27:14+00:00" + }, + { + "name": "yiisoft/db", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/db.git", + "reference": "c765ca43af502dda2ec2aed01f368d0f15e8b290" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/db/zipball/c765ca43af502dda2ec2aed01f368d0f15e8b290", + "reference": "c765ca43af502dda2ec2aed01f368d0f15e8b290", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-pdo": "*", + "php": "^8.1", + "psr/log": "^2.0|^3.0", + "psr/simple-cache": "^2.0|^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^10.0", + "rector/rector": "^1.1.1", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25", + "yiisoft/aliases": "^3.0", + "yiisoft/cache-file": "^3.1", + "yiisoft/di": "^1.0", + "yiisoft/event-dispatcher": "^1.0", + "yiisoft/json": "^1.0", + "yiisoft/log": "^2.0", + "yiisoft/var-dumper": "^1.5", + "yiisoft/yii-debug": "dev-master" + }, + "default-branch": true, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Db\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Database", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "database", + "dbal", + "query-builder", + "sql", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/db/issues/issues?state=open", + "source": "https://github.com/yiisoft/db", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-16T10:51:44+00:00" + }, + { + "name": "yiisoft/yii-debug-api", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-debug-api.git", + "reference": "8349f8d6f250e0f17bec8ab187390124e491c8c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-debug-api/zipball/8349f8d6f250e0f17bec8ab187390124e491c8c0", + "reference": "8349f8d6f250e0f17bec8ab187390124e491c8c0", + "shasum": "" + }, + "require": { + "alexkart/curl-builder": "^1.0", + "gitonomy/gitlib": "^1.3", + "guzzlehttp/guzzle": "^7.5", + "guzzlehttp/psr7": "^2.4", + "httpsoft/http-message": "^1.1", + "php": "^8.1", + "psr/container": "^2.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/simple-cache": "^2.0|^3.0", + "symfony/process": "^5.4|^6.0", + "yiisoft/aliases": "^3.0", + "yiisoft/config": "^1.1", + "yiisoft/data-response": "^2.0", + "yiisoft/di": "^1.0", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/http": "^1.2", + "yiisoft/middleware-dispatcher": "^5.2", + "yiisoft/router": "^3.0", + "yiisoft/translator": "^3.0", + "yiisoft/var-dumper": "^1.4", + "yiisoft/yii-debug": "dev-master", + "yiisoft/yii-middleware": "^1.0", + "zircote/swagger-php": "^4.0" + }, + "require-dev": { + "codeception/codeception": "^5.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.6", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.22", + "yiisoft/active-record": "dev-master", + "yiisoft/assets": "^4.0", + "yiisoft/csrf": "^2.0", + "yiisoft/db": "1.2 as dev-master", + "yiisoft/db-sqlite": "^1.0", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/router-fastroute": "^3.0", + "yiisoft/test-support": "^3.0", + "yiisoft/yii-cycle": "dev-master", + "yiisoft/yii-view": "^6.0" + }, + "suggest": { + "yiisoft/assets": "Support custom debug panels", + "yiisoft/yii-view": "Support custom debug panels" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "bootstrap-web": "bootstrap-web.php", + "params": "params.php", + "di-web": "di-web.php", + "routes": "routes.php", + "di-providers-web": "di-providers-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Debug\\Api\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Debug API", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "api", + "debug", + "yii", + "yii-debug-api", + "yiisoft" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-debug-api/issues?state=open", + "source": "https://github.com/yiisoft/yii-debug-api", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-15T14:39:54+00:00" + }, + { + "name": "yiisoft/yii-debug-viewer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-debug-viewer.git", + "reference": "89f2704b5ae8aa8e188732c3dd4a8947a2cad774" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-debug-viewer/zipball/89f2704b5ae8aa8e188732c3dd4a8947a2cad774", + "reference": "89f2704b5ae8aa8e188732c3dd4a8947a2cad774", + "shasum": "" + }, + "require": { + "nyholm/psr7": "^1.3", + "php": "^8.0", + "psr/http-message": "^1.1", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/assets": "^4.0", + "yiisoft/data-response": "^2.0", + "yiisoft/http": "^1.1", + "yiisoft/router": "^3.1", + "yiisoft/view": "^10.0", + "yiisoft/yii-view-renderer": "^7.1" + }, + "require-dev": { + "httpsoft/http-message": "^1.0.5", + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "psr/container": "^2.0", + "psr/http-factory": "^1.0", + "psr/log": "^2.0|^3.0", + "rector/rector": "^0.15.1", + "roave/infection-static-analysis-plugin": "^1.21", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.18", + "yiisoft/aliases": "^3.0", + "yiisoft/config": "^1.0", + "yiisoft/di": "^1.1", + "yiisoft/error-handler": "^3.0", + "yiisoft/factory": "^1.0", + "yiisoft/files": "^2.0", + "yiisoft/injector": "^1.0", + "yiisoft/log": "^2.0", + "yiisoft/log-target-file": "^3.0", + "yiisoft/router-fastroute": "^3.0", + "yiisoft/yii-console": "^2.0", + "yiisoft/yii-event": "^2.0", + "yiisoft/yii-http": "^1.0", + "yiisoft/yii-runner-console": "^2.0", + "yiisoft/yii-runner-http": "^2.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin-environments": { + "yii-debug-viewer-app": { + "params": [ + "app/params.php" + ], + "di": "app/di.php", + "di-console": "$di", + "di-web": [ + "$di", + "app/web.php" + ], + "events": [], + "events-web": "$events", + "events-console": "$events", + "di-providers": [], + "di-providers-web": "$di-providers", + "di-providers-console": "$di-providers", + "routes": [], + "bootstrap": [], + "bootstrap-web": "$bootstrap", + "bootstrap-console": "$bootstrap" + } + }, + "config-plugin": { + "di-web": "di-web.php", + "params": "params.php", + "routes": "routes.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Debug\\Viewer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Debug Viewer", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "debug", + "dev", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-debug-viewer/issues?state=open", + "source": "https://github.com/yiisoft/yii-debug-viewer", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-06T13:05:25+00:00" + }, + { + "name": "yiisoft/yii-gii", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-gii.git", + "reference": "cf2f56d5d3a0a8fb00636da24ba13df3a1082350" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-gii/zipball/cf2f56d5d3a0a8fb00636da24ba13df3a1082350", + "reference": "cf2f56d5d3a0a8fb00636da24ba13df3a1082350", + "shasum": "" + }, + "require": { + "httpsoft/http-basis": "^1.1", + "php": "^8.1", + "phpspec/php-diff": "^1.1.3", + "psr/http-message": "^1.0|^2.0", + "symfony/console": "^6.0|^7.0", + "yiisoft/active-record": "dev-master", + "yiisoft/aliases": "^3.0", + "yiisoft/arrays": "^2.1|^3.0", + "yiisoft/csrf": "^2.1.1", + "yiisoft/data-response": "^2.0", + "yiisoft/db": "*", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/http": "^1.2", + "yiisoft/hydrator": "^1.0", + "yiisoft/injector": "^1.1", + "yiisoft/input-http": "^1.0", + "yiisoft/json": "^1.0", + "yiisoft/router": "^3.0", + "yiisoft/strings": "^2.1", + "yiisoft/validator": "^2.0", + "yiisoft/yii-console": "^2.0", + "yiisoft/yii-middleware": "^1.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.5", + "phpunit/phpunit": "^10.2", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.23", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.13", + "yiisoft/cache": "^3.0", + "yiisoft/db-sqlite": "dev-master", + "yiisoft/di": "^1.1", + "yiisoft/dummy-provider": "^1.0", + "yiisoft/event-dispatcher": "^1.0", + "yiisoft/files": "^2.0", + "yiisoft/log": "^2.0", + "yiisoft/translator": "^3.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php", + "routes": "routes.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Gii\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Framework Code Generator Extension", + "keywords": [ + "code generator", + "dev", + "gii", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-gii/issues?state=open", + "source": "https://github.com/yiisoft/yii-gii", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-19T05:22:18+00:00" + }, + { + "name": "yiisoft/yii-testing", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-testing.git", + "reference": "d90cce1c6f33990ad2a0f9e7781da88202a57229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-testing/zipball/d90cce1c6f33990ad2a0f9e7781da88202a57229", + "reference": "d90cce1c6f33990ad2a0f9e7781da88202a57229", + "shasum": "" + }, + "require": { + "php": "^8.0", + "phpunit/phpunit": "^9.5", + "psr/container": "^2.0", + "psr/http-message": "^1.0|^2.0", + "yiisoft/config": "^1.1", + "yiisoft/di": "^1.1", + "yiisoft/error-handler": "^3.0", + "yiisoft/yii-http": "^1.0", + "yiisoft/yii-runner": "^2.0", + "yiisoft/yii-runner-console": "^2.0", + "yiisoft/yii-runner-http": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.5", + "rector/rector": "^0.15.2", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6" + }, + "default-branch": true, + "type": "library", + "extra": { + "config-plugin-options": { + "build-merge-plan": false + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Testing\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "yii-testing", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "testing", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-testing/issues?state=open", + "source": "https://github.com/yiisoft/yii-testing", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-06-04T07:04:12+00:00" + }, + { + "name": "yosymfony/resource-watcher", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yosymfony/resource-watcher.git", + "reference": "2f197cee0231c06db865d4ad2d8d7cd3faead2f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yosymfony/resource-watcher/zipball/2f197cee0231c06db865d4ad2d8d7cd3faead2f8", + "reference": "2f197cee0231c06db865d4ad2d8d7cd3faead2f8", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/finder": "^2.7|^3.0|^4.0|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7", + "symfony/filesystem": "^2.7|^3.0|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Yosymfony\\ResourceWatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Victor Puertas", + "email": "vpgugr@gmail.com" + } + ], + "description": "A simple resource watcher using Symfony Finder", + "homepage": "http://yosymfony.com", + "keywords": [ + "finder", + "resources", + "symfony", + "watcher" + ], + "support": { + "issues": "https://github.com/yosymfony/resource-watcher/issues", + "source": "https://github.com/yosymfony/resource-watcher/tree/master" + }, + "time": "2020-06-10T14:58:36+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "cebe/markdown": 20, + "yiisoft/data": 20, + "yiisoft/data-cycle": 20, + "yiisoft/yii-debug": 20, + "yiisoft/queue": 20, + "roave/security-advisories": 20, + "yiisoft/yii-debug-api": 20, + "yiisoft/yii-debug-viewer": 20, + "yiisoft/yii-gii": 20, + "yiisoft/yii-testing": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.1", + "ext-intl": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/blog/.gitignore b/blog/.gitignore index e1bda997b..6c3b40aad 100644 --- a/blog/.gitignore +++ b/blog/.gitignore @@ -23,9 +23,7 @@ phpunit.phar # evolving files /vendor -/composer.lock /node_modules -/package-lock.json # Codeception c3.php diff --git a/blog/composer.json b/blog/composer.json index 08c53970c..8f22a7fc9 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -110,6 +110,15 @@ "yiisoft/yii-gii": "dev-master", "yiisoft/yii-testing": "dev-master" }, + "conflict": { + "symfony/css-selector": ">6", + "symfony/event-dispatcher": ">6", + "symfony/filesystem": ">6", + "symfony/http-client": ">6", + "symfony/mime": ">6", + "symfony/options-resolver": ">6", + "symfony/string": ">6" + }, "autoload": { "psr-4": { "App\\": "src" diff --git a/blog/composer.lock b/blog/composer.lock new file mode 100644 index 000000000..495911af0 --- /dev/null +++ b/blog/composer.lock @@ -0,0 +1,18750 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "68e0227778f36c08acce8314597a744c", + "packages": [ + { + "name": "alexkart/curl-builder", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/alexkart/curl-builder.git", + "reference": "626cf95a84a37b6e1643675f7fc4acfc2f90dbfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alexkart/curl-builder/zipball/626cf95a84a37b6e1643675f7fc4acfc2f90dbfb", + "reference": "626cf95a84a37b6e1643675f7fc4acfc2f90dbfb", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "psr/http-message": "^1.0" + }, + "require-dev": { + "nyholm/psr7": "^1.3", + "phan/phan": "^5.4", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Alexkart\\CurlBuilder\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alexander Kartavenko", + "email": "askemailbox@gmail.com" + } + ], + "description": "PSR-7 compatible curl builder.", + "support": { + "issues": "https://github.com/alexkart/curl-builder/issues", + "source": "https://github.com/alexkart/curl-builder/tree/1.0.8" + }, + "time": "2023-05-29T13:44:51+00:00" + }, + { + "name": "cebe/markdown", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/cebe/markdown.git", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/markdown/zipball/9bac5e971dd391e2802dca5400bbeacbaea9eb86", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86", + "shasum": "" + }, + "require": { + "lib-pcre": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "cebe/indent": "*", + "facebook/xhprof": "*@dev", + "phpunit/phpunit": "4.1.*" + }, + "bin": [ + "bin/markdown" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "cebe\\markdown\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Creator" + } + ], + "description": "A super fast, highly extensible markdown parser for PHP", + "homepage": "https://github.com/cebe/markdown#readme", + "keywords": [ + "extensible", + "fast", + "gfm", + "markdown", + "markdown-extra" + ], + "support": { + "issues": "https://github.com/cebe/markdown/issues", + "source": "https://github.com/cebe/markdown" + }, + "time": "2018-03-26T11:24:36+00:00" + }, + { + "name": "clue/stream-filter", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-12-20T15:40:13+00:00" + }, + { + "name": "cycle/annotated", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/annotated.git", + "reference": "4024d2ea9b5656cdd0bf4e79acc485dc063b8273" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/annotated/zipball/4024d2ea9b5656cdd0bf4e79acc485dc063b8273", + "reference": "4024d2ea9b5656cdd0bf4e79acc485dc063b8273", + "shasum": "" + }, + "require": { + "cycle/orm": "^2.7", + "cycle/schema-builder": "^2.8", + "doctrine/annotations": "^1.14.3 || ^2.0.1", + "doctrine/inflector": "^2.0", + "php": ">=8.0", + "spiral/attributes": "^2.8|^3.0", + "spiral/tokenizer": "^2.8|^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6", + "vimeo/psalm": "^4.30" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Annotated\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Cycle ORM Annotated Entities generator", + "support": { + "issues": "https://github.com/cycle/annotated/issues", + "source": "https://github.com/cycle/annotated/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://github.com/cycle", + "type": "github" + } + ], + "time": "2024-02-08T21:32:45+00:00" + }, + { + "name": "cycle/database", + "version": "2.11.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/database.git", + "reference": "5f3fe4fc198d607fc40110e2fdb36b3c1c4e10f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/database/zipball/5f3fe4fc198d607fc40110e2fdb36b3c1c4e10f7", + "reference": "5f3fe4fc198d607fc40110e2fdb36b3c1c4e10f7", + "shasum": "" + }, + "require": { + "ext-pdo": "*", + "php": ">=8.0", + "psr/log": "1 - 3", + "spiral/core": "^2.8 || ^3.0", + "spiral/pagination": "^2.8 || ^3.0", + "symfony/polyfill-php83": "^1.28" + }, + "conflict": { + "spiral/database": "*" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.42", + "infection/infection": "^0.26.10", + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^9.5", + "spiral/tokenizer": "^2.14 || ^3.0", + "vimeo/psalm": "^5.18" + }, + "type": "library", + "autoload": { + "files": [ + "src/polyfill.php", + "src/functions_polyfill.php" + ], + "psr-4": { + "Cycle\\Database\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + } + ], + "description": "DBAL, schema introspection, migration and pagination", + "homepage": "https://cycle-orm.dev", + "keywords": [ + "database", + "dbal", + "mssql", + "mysql", + "orm", + "postgresql", + "query-builder", + "sql", + "sqlite" + ], + "support": { + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/database/issues", + "source": "https://github.com/cycle/database" + }, + "funding": [ + { + "url": "https://github.com/sponsors/cycle", + "type": "github" + } + ], + "time": "2024-06-11T11:30:02+00:00" + }, + { + "name": "cycle/entity-behavior", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/cycle/entity-behavior.git", + "reference": "9b7ad13a68a0ea0dca0399b7f44f20b691a18120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/entity-behavior/zipball/9b7ad13a68a0ea0dca0399b7f44f20b691a18120", + "reference": "9b7ad13a68a0ea0dca0399b7f44f20b691a18120", + "shasum": "" + }, + "require": { + "cycle/orm": "^2.7", + "cycle/schema-builder": "^2.8", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1", + "yiisoft/injector": "^1.0" + }, + "require-dev": { + "cycle/annotated": "^3.0", + "phpunit/phpunit": "^9.5", + "ramsey/uuid": "^4.5", + "spiral/tokenizer": "^2.8 || ^3.0", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\ORM\\Entity\\Behavior\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Provides a collection of attributes that add behaviors to Cycle ORM entities", + "homepage": "https://cycle-orm.dev", + "support": { + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/entity-behavior/issues", + "source": "https://github.com/cycle/entity-behavior" + }, + "funding": [ + { + "url": "https://github.com/sponsors/cycle", + "type": "github" + } + ], + "time": "2024-08-09T11:47:14+00:00" + }, + { + "name": "cycle/migrations", + "version": "v4.2.3", + "source": { + "type": "git", + "url": "https://github.com/cycle/migrations.git", + "reference": "434b08be175bf87f920651b9f6d91fc1cb7ed3ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/migrations/zipball/434b08be175bf87f920651b9f6d91fc1cb7ed3ba", + "reference": "434b08be175bf87f920651b9f6d91fc1cb7ed3ba", + "shasum": "" + }, + "require": { + "cycle/database": "^2.7.0", + "php": ">=8.1", + "spiral/core": "^3.0", + "spiral/files": "^3.0", + "spiral/reactor": "^3.0", + "spiral/tokenizer": "^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "dev-master" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Migrations\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Database migrations, migration scaffolding", + "support": { + "issues": "https://github.com/cycle/migrations/issues", + "source": "https://github.com/cycle/migrations/tree/v4.2.3" + }, + "time": "2024-01-25T10:49:43+00:00" + }, + { + "name": "cycle/orm", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/orm.git", + "reference": "23023be5e8452c1e5b05417f9c4539db71d60927" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/orm/zipball/23023be5e8452c1e5b05417f9c4539db71d60927", + "reference": "23023be5e8452c1e5b05417f9c4539db71d60927", + "shasum": "" + }, + "require": { + "cycle/database": "^2.8.1", + "doctrine/instantiator": "^1.3.1 || ^2.0", + "ext-pdo": "*", + "php": ">=8.0", + "spiral/core": "^2.8 || ^3.0" + }, + "require-dev": { + "doctrine/collections": "^1.6 || ^2.0", + "illuminate/collections": "^8.0", + "loophp/collection": "^6.0 || ^7.0", + "mockery/mockery": "^1.1", + "phpunit/phpunit": "^9.5", + "ramsey/uuid": "^4.0", + "spiral/tokenizer": "^2.8 || ^3.0", + "symfony/var-dumper": "^5.2 || ^6.0 || ^7.0", + "vimeo/psalm": "5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\ORM\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "PHP DataMapper ORM and Data Modelling Engine", + "homepage": "https://cycle-orm.dev", + "support": { + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/orm/issues", + "source": "https://github.com/cycle/orm" + }, + "funding": [ + { + "url": "https://github.com/sponsors/cycle", + "type": "github" + } + ], + "time": "2024-06-05T13:14:36+00:00" + }, + { + "name": "cycle/schema-builder", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/schema-builder.git", + "reference": "413af8fc8f93c6e48cebc76ab6c37c65fe2cab63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/schema-builder/zipball/413af8fc8f93c6e48cebc76ab6c37c65fe2cab63", + "reference": "413af8fc8f93c6e48cebc76ab6c37c65fe2cab63", + "shasum": "" + }, + "require": { + "cycle/database": "^2.7.1", + "cycle/orm": "^2.7", + "php": ">=8.0", + "yiisoft/friendly-exception": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "spiral/tokenizer": "^2.8", + "symfony/console": "^6.0 || ^7.0", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cycle\\Schema\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Cycle ORM Schema Builder", + "support": { + "issues": "https://github.com/cycle/schema-builder/issues", + "source": "https://github.com/cycle/schema-builder/tree/v2.9.0" + }, + "time": "2024-07-10T16:20:17+00:00" + }, + { + "name": "cycle/schema-migrations-generator", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/schema-migrations-generator.git", + "reference": "94cb613ec77376cf880c9488daa3668b1f856e80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/schema-migrations-generator/zipball/94cb613ec77376cf880c9488daa3668b1f856e80", + "reference": "94cb613ec77376cf880c9488daa3668b1f856e80", + "shasum": "" + }, + "require": { + "cycle/database": "^2.4.1", + "cycle/migrations": "^4.2", + "cycle/schema-builder": "^2.0", + "php": ">=8.1" + }, + "require-dev": { + "cycle/annotated": "^3.0", + "cycle/orm": "^2.0", + "phpunit/phpunit": "^9.5", + "spiral/debug": "^3.0", + "spiral/framework": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Schema\\Generator\\Migrations\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Cycle ORM Migration generation", + "support": { + "issues": "https://github.com/cycle/schema-migrations-generator/issues", + "source": "https://github.com/cycle/schema-migrations-generator/tree/2.2.0" + }, + "time": "2023-11-02T09:24:12+00:00" + }, + { + "name": "cycle/schema-provider", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/schema-provider.git", + "reference": "d6e800d6cd498cf1053522b6c2348f6eea587aae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/schema-provider/zipball/d6e800d6cd498cf1053522b6c2348f6eea587aae", + "reference": "d6e800d6cd498cf1053522b6c2348f6eea587aae", + "shasum": "" + }, + "require": { + "cycle/orm": "^2.0", + "cycle/schema-renderer": "^1.2", + "php": ">=8.0", + "psr/container": "^1.0 || ^2.0", + "psr/simple-cache": "^2.0 || ^3.0", + "spiral/files": "^2.14 || ^3.11", + "webmozart/glob": "^4.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.48", + "phpunit/phpunit": "^9.6", + "roave/security-advisories": "dev-latest", + "vimeo/psalm": "^4.30.0 || ^5.21", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Schema\\Provider\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Cycle ORM Schema providers", + "homepage": "https://cycle-orm.dev", + "support": { + "chat": "https://discord.gg/spiralphp", + "docs": "https://cycle-orm.dev/docs", + "issues": "https://github.com/cycle/schema-provider/issues", + "source": "https://github.com/cycle/schema-provider" + }, + "funding": [ + { + "url": "https://github.com/sponsors/cycle", + "type": "github" + } + ], + "time": "2024-02-05T13:58:34+00:00" + }, + { + "name": "cycle/schema-renderer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/cycle/schema-renderer.git", + "reference": "5c2b7977c2803c6c9bacc56064abda5ea2b273a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cycle/schema-renderer/zipball/5c2b7977c2803c6c9bacc56064abda5ea2b273a3", + "reference": "5c2b7977c2803c6c9bacc56064abda5ea2b273a3", + "shasum": "" + }, + "require": { + "cycle/orm": "1.2 - 2", + "php": ">=7.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "spiral/code-style": "^1.0", + "vimeo/psalm": "^4.10|^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cycle\\Schema\\Renderer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Utils for Cycle ORM Schema rendering", + "support": { + "issues": "https://github.com/cycle/schema-renderer/issues", + "source": "https://github.com/cycle/schema-renderer/tree/1.2.0" + }, + "time": "2022-12-15T16:14:14+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.10.28", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.2" + }, + "time": "2024-09-05T10:17:24+00:00" + }, + { + "name": "doctrine/collections", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e", + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3 || ^1", + "php": "^7.1.3 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0 || ^10.0", + "phpstan/phpstan": "^1.4.8", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/1.8.0" + }, + "time": "2022-09-01T20:12:10+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "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" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + }, + "time": "2024-01-02T13:46:09+00:00" + }, + { + "name": "gitonomy/gitlib", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/gitonomy/gitlib.git", + "reference": "2c7fbbd9814178474d0bb1b6292701cb4ab508f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/2c7fbbd9814178474d0bb1b6292701cb4ab508f9", + "reference": "2c7fbbd9814178474d0bb1b6292701cb4ab508f9", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "php": "^8.0", + "symfony/polyfill-mbstring": "^1.7", + "symfony/process": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "ext-fileinfo": "*", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.20 || ^9.5.9", + "psr/log": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gitonomy\\Git\\": "src/Gitonomy/Git/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Julien Didier", + "email": "genzo.wm@gmail.com", + "homepage": "https://github.com/juliendidier" + }, + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info", + "homepage": "https://github.com/lyrixx" + }, + { + "name": "Alexandre Salomé", + "email": "alexandre.salome@gmail.com", + "homepage": "https://github.com/alexandresalome" + } + ], + "description": "Library for accessing git", + "support": { + "issues": "https://github.com/gitonomy/gitlib/issues", + "source": "https://github.com/gitonomy/gitlib/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", + "type": "tidelift" + } + ], + "time": "2023-12-20T13:02:08+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-07-18T10:29:17+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7||^2.0", + "php": ">=7.3", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/http-interop/http-factory-guzzle/issues", + "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" + }, + "time": "2021-07-21T13:50:14+00:00" + }, + { + "name": "httpsoft/http-message", + "version": "1.1.6", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-message.git", + "reference": "f6c88e2189b9f75f10dfaeb0a85c56ea04a53c19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-message/zipball/f6c88e2189b9f75f10dfaeb0a85c56ea04a53c19", + "reference": "f6c88e2189b9f75f10dfaeb0a85c56ea04a53c19", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1|^2.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "php-http/psr7-integration-tests": "^1.3", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Strict and fast implementation of PSR-7 and PSR-17", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-message", + "php", + "psr-17", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/message", + "issues": "https://github.com/httpsoft/http-message/issues", + "source": "https://github.com/httpsoft/http-message" + }, + "time": "2024-08-09T07:13:21+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" + }, + "time": "2024-03-08T09:58:59+00:00" + }, + { + "name": "jetbrains/phpstorm-attributes", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/JetBrains/phpstorm-attributes.git", + "reference": "22fb28d679deceedba8366dbae65cc8ebfc17e26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JetBrains/phpstorm-attributes/zipball/22fb28d679deceedba8366dbae65cc8ebfc17e26", + "reference": "22fb28d679deceedba8366dbae65cc8ebfc17e26", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "JetBrains\\PhpStorm\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "JetBrains", + "homepage": "https://www.jetbrains.com" + } + ], + "description": "PhpStorm specific attributes", + "keywords": [ + "attributes", + "jetbrains", + "phpstorm" + ], + "support": { + "issues": "https://youtrack.jetbrains.com/newIssue?project=WI", + "source": "https://github.com/JetBrains/phpstorm-attributes/tree/1.1" + }, + "time": "2023-09-01T08:50:25+00:00" + }, + { + "name": "nette/php-generator", + "version": "v4.1.6", + "source": { + "type": "git", + "url": "https://github.com/nette/php-generator.git", + "reference": "c90961e782ae86e517fe5ed732eb2b512945565b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/php-generator/zipball/c90961e782ae86e517fe5ed732eb2b512945565b", + "reference": "c90961e782ae86e517fe5ed732eb2b512945565b", + "shasum": "" + }, + "require": { + "nette/utils": "^3.2.9 || ^4.0", + "php": "8.0 - 8.4" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.4", + "nikic/php-parser": "^4.18 || ^5.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.8" + }, + "suggest": { + "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.3 features.", + "homepage": "https://nette.org", + "keywords": [ + "code", + "nette", + "php", + "scaffolding" + ], + "support": { + "issues": "https://github.com/nette/php-generator/issues", + "source": "https://github.com/nette/php-generator/tree/v4.1.6" + }, + "time": "2024-09-10T09:31:55+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.5" + }, + "time": "2024-08-07T15:39:19+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "php-http/client-common", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/1e19c059b0e4d5f717bf5d524d616165aeab0612", + "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "support": { + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.7.1" + }, + "time": "2023-11-30T10:31:25+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.19.4", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "0700efda8d7526335132360167315fdab3aeb599" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599", + "reference": "0700efda8d7526335132360167315fdab3aeb599", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.19.4" + }, + "time": "2024-03-29T13:00:05+00:00" + }, + { + "name": "php-http/guzzle7-adapter", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle7-adapter.git", + "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01", + "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.0", + "php": "^7.2 | ^8.0", + "php-http/httplug": "^2.0", + "psr/http-client": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "Guzzle 7 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "support": { + "issues": "https://github.com/php-http/guzzle7-adapter/issues", + "source": "https://github.com/php-http/guzzle7-adapter/tree/1.0.0" + }, + "time": "2021-03-09T07:35:15+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.0" + }, + "time": "2023-04-14T15:10:03+00:00" + }, + { + "name": "php-http/message", + "version": "1.16.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "5997f3289332c699fa2545c427826272498a2088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088", + "reference": "5997f3289332c699fa2545c427826272498a2088", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "type": "library", + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.1" + }, + "time": "2024-03-07T13:22:09+00:00" + }, + { + "name": "php-http/message-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/1.1.0" + }, + "abandoned": "psr/http-factory", + "time": "2023-04-14T14:16:17+00:00" + }, + { + "name": "php-http/promise", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.3.1" + }, + "time": "2024-03-15T13:55:21+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "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": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "sentry/sdk", + "version": "3.6.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php-sdk.git", + "reference": "24c235ff2027401cbea099bf88689e1a1f197c7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/24c235ff2027401cbea099bf88689e1a1f197c7a", + "reference": "24c235ff2027401cbea099bf88689e1a1f197c7a", + "shasum": "" + }, + "require": { + "http-interop/http-factory-guzzle": "^1.0", + "sentry/sentry": "^3.22", + "symfony/http-client": "^4.3|^5.0|^6.0|^7.0" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php-sdk/issues", + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.6.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2023-12-04T10:49:33+00:00" + }, + { + "name": "sentry/sentry", + "version": "3.22.1", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php.git", + "reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/8859631ba5ab15bc1af420b0eeed19ecc6c9d81d", + "reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/promises": "^1.5.3|^2.0", + "jean85/pretty-package-versions": "^1.5|^2.0.4", + "php": "^7.2|^8.0", + "php-http/async-client-implementation": "^1.0", + "php-http/client-common": "^1.5|^2.0", + "php-http/discovery": "^1.15", + "php-http/httplug": "^1.1|^2.0", + "php-http/message": "^1.5", + "php-http/message-factory": "^1.1", + "psr/http-factory": "^1.0", + "psr/http-factory-implementation": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0|^7.0", + "symfony/polyfill-php80": "^1.17" + }, + "conflict": { + "php-http/client-common": "1.8.0", + "raven/raven": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.19|3.4.*", + "guzzlehttp/psr7": "^1.8.4|^2.1.1", + "http-interop/http-factory-guzzle": "^1.0", + "monolog/monolog": "^1.6|^2.0|^3.0", + "nikic/php-parser": "^4.10.3", + "php-http/mock-client": "^1.3", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5.14|^9.4", + "symfony/phpunit-bridge": "^5.2|^6.0", + "vimeo/psalm": "^4.17" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Sentry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "A PHP SDK for Sentry (http://sentry.io)", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php/issues", + "source": "https://github.com/getsentry/sentry-php/tree/3.22.1" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2023-11-13T11:47:28+00:00" + }, + { + "name": "spiral/attributes", + "version": "v3.1.7", + "source": { + "type": "git", + "url": "https://github.com/spiral/attributes.git", + "reference": "fc6657de4ed83913c7f02241e5fe4e8e799af8fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/attributes/zipball/fc6657de4ed83913c7f02241e5fe4e8e799af8fa", + "reference": "fc6657de4ed83913c7f02241e5fe4e8e799af8fa", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "1 - 3", + "psr/simple-cache": "1 - 3" + }, + "require-dev": { + "doctrine/annotations": "^1.14 || ^2.0", + "jetbrains/phpstorm-attributes": "^1.0", + "phpunit/phpunit": "^9.5.20", + "vimeo/psalm": "^5.17" + }, + "type": "library", + "autoload": { + "files": [ + "src/polyfill.php" + ], + "psr-4": { + "Spiral\\Attributes\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Kirill Nesmeyanov (SerafimArts)", + "email": "kirill.nesmeyanov@spiralscout.com" + } + ], + "description": "PHP attributes reader", + "homepage": "https://spiral.dev", + "keywords": [ + "annotations", + "attributes", + "metadata" + ], + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://spiral.dev/docs", + "forum": "https://forum.spiral.dev", + "issues": "https://github.com/spiral/attributes/issues", + "source": "https://github.com/spiral/attributes" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-08-22T10:18:52+00:00" + }, + { + "name": "spiral/core", + "version": "3.14.2", + "source": { + "type": "git", + "url": "https://github.com/spiral/core.git", + "reference": "53bec6e433d709f59ef6c0ce966f4a640c4d1bad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/core/zipball/53bec6e433d709f59ef6c0ce966f4a640c4d1bad", + "reference": "53bec6e433d709f59ef6c0ce966f4a640c4d1bad", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0" + }, + "provide": { + "psr/container-implementation": "^1.1|^2.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Core\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "IoC container, IoC scopes, factory, memory, configuration interfaces", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/core" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-10T16:54:43+00:00" + }, + { + "name": "spiral/files", + "version": "3.14.3", + "source": { + "type": "git", + "url": "https://github.com/spiral/files.git", + "reference": "0c394e058ee994b6d18a229dcbe310e4de3a2b7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/files/zipball/0c394e058ee994b6d18a229dcbe310e4de3a2b7a", + "reference": "0c394e058ee994b6d18a229dcbe310e4de3a2b7a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Files\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "File Toolkit: atomic file manager", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/files" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-03T16:58:09+00:00" + }, + { + "name": "spiral/logger", + "version": "3.14.1", + "source": { + "type": "git", + "url": "https://github.com/spiral/logger.git", + "reference": "c832f1038aed009f6cd1f5194ca7a14bb533723a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/logger/zipball/c832f1038aed009f6cd1f5194ca7a14bb533723a", + "reference": "c832f1038aed009f6cd1f5194ca7a14bb533723a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "1 - 3", + "spiral/core": "^3.14.1" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Logger\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "LogFactory and global log listeners", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/logger" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-04T10:56:14+00:00" + }, + { + "name": "spiral/pagination", + "version": "3.14.3", + "source": { + "type": "git", + "url": "https://github.com/spiral/pagination.git", + "reference": "93c9d93c811b4ec6037491e516c3e194fdc94848" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/pagination/zipball/93c9d93c811b4ec6037491e516c3e194fdc94848", + "reference": "93c9d93c811b4ec6037491e516c3e194fdc94848", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Pagination\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Common pagination interfaces", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/pagination" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-03T16:59:10+00:00" + }, + { + "name": "spiral/reactor", + "version": "3.14.3", + "source": { + "type": "git", + "url": "https://github.com/spiral/reactor.git", + "reference": "74639a44ced7eb289820fdcca96ff9322f79f882" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/reactor/zipball/74639a44ced7eb289820fdcca96ff9322f79f882", + "reference": "74639a44ced7eb289820fdcca96ff9322f79f882", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "nette/php-generator": "^4.1.2", + "php": ">=8.1", + "spiral/files": "^3.14.3" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "psr/container": "^1.1|^2.0", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Reactor\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Reactor: Code Scaffolding", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/reactor" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-11T17:40:25+00:00" + }, + { + "name": "spiral/tokenizer", + "version": "3.14.1", + "source": { + "type": "git", + "url": "https://github.com/spiral/tokenizer.git", + "reference": "0526f2b73725d002278b786ad7b16f27968aef63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/tokenizer/zipball/0526f2b73725d002278b786ad7b16f27968aef63", + "reference": "0526f2b73725d002278b786ad7b16f27968aef63", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=8.1", + "spiral/core": "^3.14.1", + "spiral/logger": "^3.14.1", + "symfony/finder": "^5.3.7 || ^6.0 || ^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "phpunit/phpunit": "^10.1", + "spiral/attributes": "^2.8|^3.0", + "spiral/boot": "^3.14.1", + "spiral/files": "^3.14.1", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Tokenizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Static Analysis: Class and Invocation locators", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/tokenizer" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spiral", + "type": "github" + } + ], + "time": "2024-09-04T10:56:34+00:00" + }, + { + "name": "swagger-api/swagger-ui", + "version": "v5.17.14", + "source": { + "type": "git", + "url": "https://github.com/swagger-api/swagger-ui.git", + "reference": "74ed0adebfc9c8dd0de2bf8e81495b022a66c083" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/74ed0adebfc9c8dd0de2bf8e81495b022a66c083", + "reference": "74ed0adebfc9c8dd0de2bf8e81495b022a66c083", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Anna Bodnia", + "email": "anna.bodnia@gmail.com" + }, + { + "name": "Buu Nguyen", + "email": "buunguyen@gmail.com" + }, + { + "name": "Josh Ponelat", + "email": "jponelat@gmail.com" + }, + { + "name": "Kyle Shockey", + "email": "kyleshockey1@gmail.com" + }, + { + "name": "Robert Barnwell", + "email": "robert@robertismy.name" + }, + { + "name": "Sahar Jafari", + "email": "shr.jafari@gmail.com" + } + ], + "description": " Swagger UI is a collection of HTML, Javascript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API.", + "homepage": "http://swagger.io", + "keywords": [ + "api", + "documentation", + "openapi", + "specification", + "swagger", + "ui" + ], + "support": { + "issues": "https://github.com/swagger-api/swagger-ui/issues", + "source": "https://github.com/swagger-api/swagger-ui/tree/v5.17.14" + }, + "time": "2024-05-28T05:24:40+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998", + "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-15T22:48:29+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2774908d5ae32fd94e363e7cbbd87462712c4576", + "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T19:05:29+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ae25a9145a900764158d439653d5630191155ca0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ae25a9145a900764158d439653d5630191155ca0", + "reference": "ae25a9145a900764158d439653d5630191155ca0", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-13T14:03:51+00:00" + }, + { + "name": "symfony/http-client", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "39f34cd5d28cd263b95a58ebad18421b6fefc4ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/39f34cd5d28cd263b95a58ebad18421b6fefc4ba", + "reference": "39f34cd5d28cd263b95a58ebad18421b6fefc4ba", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/log": "^1|^2|^3", + "symfony/http-client-contracts": "^3", + "symfony/service-contracts": "^1.0|^2|^3" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-client/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T19:05:29+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "20414d96f391677bf80078aa55baece78b82647d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d", + "reference": "20414d96f391677bf80078aa55baece78b82647d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.1.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "bf9b967cfefe5a2139aa6b2d11803e5a5855aefe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/bf9b967cfefe5a2139aa6b2d11803e5a5855aefe", + "reference": "bf9b967cfefe5a2139aa6b2d11803e5a5855aefe", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<5.4" + }, + "require-dev": { + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/messenger": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.1.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-10T18:53:01+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "a02711d6ce461edada8c0f8641aa536709b99b47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/a02711d6ce461edada8c0f8641aa536709b99b47", + "reference": "a02711d6ce461edada8c0f8641aa536709b99b47", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-13T10:38:38+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "be0facf48a42a232d6c0daadd76e4eb5657a4798" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/be0facf48a42a232d6c0daadd76e4eb5657a4798", + "reference": "be0facf48a42a232d6c0daadd76e4eb5657a4798", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T19:05:29+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:49:08+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ba727797426af0f587f4800566300bdc0cda0777" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ba727797426af0f587f4800566300bdc0cda0777", + "reference": "ba727797426af0f587f4800566300bdc0cda0777", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-29T07:35:21+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-30T16:03:21+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "be37e7f13195e05ab84ca5269365591edd240335" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/be37e7f13195e05ab84ca5269365591edd240335", + "reference": "be37e7f13195e05ab84ca5269365591edd240335", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-12T09:55:28+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + }, + { + "name": "webmozart/glob", + "version": "4.7.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/glob.git", + "reference": "8a2842112d6916e61e0e15e316465b611f3abc17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/glob/zipball/8a2842112d6916e61e0e15e316465b611f3abc17", + "reference": "8a2842112d6916e61e0e15e316465b611f3abc17", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "symfony/filesystem": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Glob\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A PHP implementation of Ant's glob.", + "support": { + "issues": "https://github.com/webmozarts/glob/issues", + "source": "https://github.com/webmozarts/glob/tree/4.7.0" + }, + "time": "2024-03-07T20:33:40+00:00" + }, + { + "name": "yiisoft/access", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/access.git", + "reference": "7a8ac9c4802d31cf47789c742575232c7fb1ae8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/access/zipball/7a8ac9c4802d31cf47789c742575232c7fb1ae8b", + "reference": "7a8ac9c4802d31cf47789c742575232c7fb1ae8b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.18" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Access\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "An interface for checking access", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "access", + "interface", + "rbac", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/access/issues?state=open", + "source": "https://github.com/yiisoft/access", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2022-04-05T17:21:55+00:00" + }, + { + "name": "yiisoft/aliases", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/aliases.git", + "reference": "2ed5e38d6ac503ec4c1af39115361097b6449135" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/aliases/zipball/2ed5e38d6ac503ec4c1af39115361097b6449135", + "reference": "2ed5e38d6ac503ec4c1af39115361097b6449135", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Aliases\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Named paths and URLs storage", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "alias" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/aliases/issues?state=open", + "source": "https://github.com/yiisoft/aliases", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-02-13T10:14:03+00:00" + }, + { + "name": "yiisoft/arrays", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/arrays.git", + "reference": "e07c7268bd53903108ed556df93ef75b4bac6760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/arrays/zipball/e07c7268bd53903108ed556df93ef75b4bac6760", + "reference": "e07c7268bd53903108ed556df93ef75b4bac6760", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/strings": "^2.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.20" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Arrays\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Array Helper", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "array", + "helper", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://forum.yiiframework.com/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/arrays/issues", + "source": "https://github.com/yiisoft/arrays", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-04-04T11:07:18+00:00" + }, + { + "name": "yiisoft/assets", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/assets.git", + "reference": "14984b2c8a87236da8c8ef5a4f1273d4ff8a36bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/assets/zipball/14984b2c8a87236da8c8ef5a4f1273d4ff8a36bc", + "reference": "14984b2c8a87236da8c8ef5a4f1273d4ff8a36bc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "psr/log": "^1.1|^2.0|^3.0", + "yiisoft/aliases": "^1.1|^2.0|^3.0", + "yiisoft/files": "^2.0", + "yiisoft/json": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Assets\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Asset bundles and asset manager", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "assets", + "library", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/assets/issues?state=open", + "source": "https://github.com/yiisoft/assets", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-13T11:15:18+00:00" + }, + { + "name": "yiisoft/auth", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/auth.git", + "reference": "497197fc2bbc2c4b2b8b35b177e0f4476fbe17ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/auth/zipball/497197fc2bbc2c4b2b8b35b177e0f4476fbe17ee", + "reference": "497197fc2bbc2c4b2b8b35b177e0f4476fbe17ee", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.3", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.8", + "yiisoft/yii-debug": "dev-master|dev-php80" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Auth\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii auth", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "auth", + "middleware" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/auth/issues?state=open", + "source": "https://github.com/yiisoft/auth", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-05-06T12:26:49+00:00" + }, + { + "name": "yiisoft/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/cache.git", + "reference": "67ae4b40d3aefd193dfd9a3f458f3e145adb0d84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/cache/zipball/67ae4b40d3aefd193dfd9a3f458f3e145adb0d84", + "reference": "67ae4b40d3aefd193dfd9a3f458f3e145adb0d84", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "psr/simple-cache": "^2.0|^3.0" + }, + "provide": { + "psr/simple-cache-implementation": "2.0|3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.2", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.2" + }, + "suggest": { + "yiisoft/cache-apcu": "Allows to store cache using APCu PECL extension", + "yiisoft/cache-db": "Allows storing cache to the database", + "yiisoft/cache-file": "Allows storing cache to the files", + "yiisoft/cache-memcached": "Allows to store cache using Memcached PECL extension", + "yiisoft/cache-redis": "Allows storing cache to the Redis", + "yiisoft/cache-wincache": "Allows to store cache using WinCache PECL extension" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Cache\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Caching Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "cache", + "psr-16", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/cache/issues?state=open", + "source": "https://github.com/yiisoft/cache", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-02-15T14:30:56+00:00" + }, + { + "name": "yiisoft/cache-file", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/cache-file.git", + "reference": "226ff0731adabc884c149f711190a7ac8b14800d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/cache-file/zipball/226ff0731adabc884c149f711190a7ac8b14800d", + "reference": "226ff0731adabc884c149f711190a7ac8b14800d", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/simple-cache": "^2.0|^3.0" + }, + "provide": { + "psr/simple-cache-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "php-mock/php-mock-phpunit": "^2.6", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.2" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Cache\\File\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Caching Library - File Handler", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "cache", + "file", + "framework", + "psr-16", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/cache-file/issues?state=open", + "source": "https://github.com/yiisoft/cache-file", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-10-09T14:49:20+00:00" + }, + { + "name": "yiisoft/config", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/config.git", + "reference": "8cd32f003af59303f3ba8dd520eb85f830689575" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/config/zipball/8cd32f003af59303f3ba8dd520eb85f830689575", + "reference": "8cd32f003af59303f3ba8dd520eb85f830689575", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^8.0", + "yiisoft/arrays": "^3.0", + "yiisoft/strings": "^2.0", + "yiisoft/var-dumper": "^1.1" + }, + "require-dev": { + "composer/composer": "^2.0", + "ext-json": "*", + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6" + }, + "suggest": { + "symfony/console": "To use composer commands `yii-config-copy` and `yii-config-rebuild`." + }, + "type": "composer-plugin", + "extra": { + "class": "Yiisoft\\Config\\Composer\\EventHandler" + }, + "autoload": { + "psr-4": { + "Yiisoft\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Composer plugin and a library for config assembling", + "homepage": "https://github.com/yiisoft/config", + "keywords": [ + "composer", + "config", + "plugin" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/config/issues?state=open", + "source": "https://github.com/yiisoft/config", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-12-25T17:12:50+00:00" + }, + { + "name": "yiisoft/cookies", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/cookies.git", + "reference": "ceba1d0647f1210331d90372ca83a8ecc952ebef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/cookies/zipball/ceba1d0647f1210331d90372ca83a8ecc952ebef", + "reference": "ceba1d0647f1210331d90372ca83a8ecc952ebef", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-message-implementation": "1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1|^2.0|^3.0", + "yiisoft/http": "^1.2", + "yiisoft/security": "^1.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^3.8|^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.21", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Cookies\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Convenient way to use cookies with PSR-7", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "cookie", + "cookies", + "psr-7" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/cookies/issues?state=open", + "source": "https://github.com/yiisoft/cookies", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-04-05T07:20:16+00:00" + }, + { + "name": "yiisoft/csrf", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/csrf.git", + "reference": "2168b5f83ec9ce65e9d0ca08fa88613e6778d377" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/csrf/zipball/2168b5f83ec9ce65e9d0ca08fa88613e6778d377", + "reference": "2168b5f83ec9ce65e9d0ca08fa88613e6778d377", + "shasum": "" + }, + "require": { + "ext-hash": "*", + "php": "^7.4|^8.0", + "psr/http-factory": "^1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-message-implementation": "1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/security": "^1.0", + "yiisoft/session": "^1.0|^2.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.2", + "nyholm/psr7": "^1.3", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.24", + "yiisoft/di": "^1.1" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Csrf\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii CSRF Protection Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "breach", + "csrf", + "hmac", + "middleware", + "psr-15", + "stateless", + "synchronizer" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/csrf/issues?state=open", + "source": "https://github.com/yiisoft/csrf", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-05-08T09:48:50+00:00" + }, + { + "name": "yiisoft/data", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/data.git", + "reference": "714ca834858bea280ce8781fc5915fa8775f780b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/data/zipball/714ca834858bea280ce8781fc5915fa8775f780b", + "reference": "714ca834858bea280ce8781fc5915fa8775f780b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1", + "yiisoft/arrays": "^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.20" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Data\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Data providers, pagination and related abstractions", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "data processor", + "data provider", + "data reader", + "data writer", + "filter", + "pagination" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/data/issues?state=open", + "source": "https://github.com/yiisoft/data", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-10T17:50:47+00:00" + }, + { + "name": "yiisoft/data-cycle", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/data-cycle.git", + "reference": "708074a77942ab1d7f424bc21a6912b7d62641da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/data-cycle/zipball/708074a77942ab1d7f424bc21a6912b7d62641da", + "reference": "708074a77942ab1d7f424bc21a6912b7d62641da", + "shasum": "" + }, + "require": { + "cycle/database": "^2.10", + "cycle/orm": "^2.7.1", + "php": "^8.1", + "yiisoft/data": "dev-master" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.21", + "vlucas/phpdotenv": "^5.6" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Data\\Cycle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Cycle ORM query adapter for yiisoft/data", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "cycle", + "data provider", + "database", + "db", + "orm" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/data-cycle/issues?state=open", + "source": "https://github.com/yiisoft/data-cycle", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-11T18:58:59+00:00" + }, + { + "name": "yiisoft/data-response", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/data-response.git", + "reference": "7de8c880d0d6629867a51c5c2529c984e50dfbc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/data-response/zipball/7de8c880d0d6629867a51c5c2529c984e50dfbc3", + "reference": "7de8c880d0d6629867a51c5c2529c984e50dfbc3", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^8.1", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/json": "^1.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.22", + "yiisoft/di": "^1.1" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\DataResponse\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Allows responding with data that is automatically converted into PSR-7 response", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "data", + "psr-7", + "response" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/data-response/issues?state=open", + "source": "https://github.com/yiisoft/data-response", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-03-03T06:01:50+00:00" + }, + { + "name": "yiisoft/definitions", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/definitions.git", + "reference": "5cb53d07afab3336705a52ddc90c37237cc4b316" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/definitions/zipball/5cb53d07afab3336705a52ddc90c37237cc4b316", + "reference": "5cb53d07afab3336705a52ddc90c37237cc4b316", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.21", + "yiisoft/test-support": "^1.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Definitions\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "The package provides definition syntax", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "definitions" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/definitions/issues?state=open", + "source": "https://github.com/yiisoft/definitions", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-16T13:31:21+00:00" + }, + { + "name": "yiisoft/di", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/di.git", + "reference": "a6d889f74030a381dad337f1bd1ea9de7341bc9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/di/zipball/a6d889f74030a381dad337f1bd1ea9de7341bc9b", + "reference": "a6d889f74030a381dad337f1bd1ea9de7341bc9b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "psr/container": "^1.1|^2.0", + "yiisoft/definitions": "^3.0" + }, + "provide": { + "psr/container-implementation": "1.0.0" + }, + "require-dev": { + "league/container": "^4.2", + "maglnet/composer-require-checker": "^4.2", + "phpbench/phpbench": "^1.2.0", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.14.3", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.29", + "yiisoft/injector": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "phpbench/phpbench": "To run benchmarks.", + "yiisoft/injector": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Di\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii DI container", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "Autowiring", + "PSR-11", + "container", + "dependency", + "di", + "injection", + "injector" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/di/issues?state=open", + "source": "https://github.com/yiisoft/di", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2022-12-23T16:12:56+00:00" + }, + { + "name": "yiisoft/error-handler", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/error-handler.git", + "reference": "a263c9dea48d5a42022dd7df76706cff39e3e960" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/error-handler/zipball/a263c9dea48d5a42022dd7df76706cff39e3e960", + "reference": "a263c9dea48d5a42022dd7df76706cff39e3e960", + "shasum": "" + }, + "require": { + "alexkart/curl-builder": "^1.0", + "cebe/markdown": "^1.2", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1|^2.0|^3.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/injector": "^1.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0.9", + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25", + "yiisoft/di": "^1.1", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\ErrorHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Error Handling Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "PSR-11", + "error-handler", + "psr-15", + "psr-3", + "psr-7", + "yiisoft" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/error-handler/issues?state=open", + "source": "https://github.com/yiisoft/error-handler", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-07-11T12:16:20+00:00" + }, + { + "name": "yiisoft/event-dispatcher", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/event-dispatcher.git", + "reference": "2b1262a56260030aaac386bf8ef75ec072abc7e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/event-dispatcher/zipball/2b1262a56260030aaac386bf8ef75ec072abc7e3", + "reference": "2b1262a56260030aaac386bf8ef75ec072abc7e3", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "1.0.0" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.14.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.18" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\EventDispatcher\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Event Dispatcher", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "event", + "event dispatcher", + "psr-14" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/event-dispatcher/issues?state=open", + "source": "https://github.com/yiisoft/event-dispatcher", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2022-10-27T12:02:21+00:00" + }, + { + "name": "yiisoft/factory", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/factory.git", + "reference": "4537a78ae1a3b49bd86e83d09f0772034e45f193" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/factory/zipball/4537a78ae1a3b49bd86e83d09f0772034e45f193", + "reference": "4537a78ae1a3b49bd86e83d09f0772034e45f193", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/definitions": "^1.0|^2.0|^3.0.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Factory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Factory", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "factory" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/factory/issues", + "source": "https://github.com/yiisoft/factory", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-12-03T05:59:14+00:00" + }, + { + "name": "yiisoft/files", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/files.git", + "reference": "129a8f8220e1cd2530f424951b8c24f426bd219c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/files/zipball/129a8f8220e1cd2530f424951b8c24f426bd219c", + "reference": "129a8f8220e1cd2530f424951b8c24f426bd219c", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Files\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Helper to manage files and directories", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "files" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/files/issues?state=open", + "source": "https://github.com/yiisoft/files", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2022-07-05T06:43:38+00:00" + }, + { + "name": "yiisoft/form", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/form.git", + "reference": "9679b95b239598d2391de291ab2ce14b5e074271" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/form/zipball/9679b95b239598d2391de291ab2ce14b5e074271", + "reference": "9679b95b239598d2391de291ab2ce14b5e074271", + "shasum": "" + }, + "require": { + "php": "^8.1", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/html": "^3.6", + "yiisoft/widget": "^2.2" + }, + "require-dev": { + "infection/infection": "^0.26.19", + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.2", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "bootstrap": "bootstrap.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Form\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "The package helps with implementing data entry forms.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "form", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/form/issues?state=open", + "source": "https://github.com/yiisoft/form", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-08-26T18:54:52+00:00" + }, + { + "name": "yiisoft/form-model", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/form-model.git", + "reference": "f0b6eb17d1a9d04fefbab4013b5177207ed0574a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/form-model/zipball/f0b6eb17d1a9d04fefbab4013b5177207ed0574a", + "reference": "f0b6eb17d1a9d04fefbab4013b5177207ed0574a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1", + "psr/http-message": "^1.0|^2.0", + "yiisoft/form": "^1.0", + "yiisoft/html": "^3.3", + "yiisoft/hydrator": "^1.3", + "yiisoft/strings": "^2.3", + "yiisoft/validator": "^2.1" + }, + "require-dev": { + "httpsoft/http-message": "^1.1", + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25", + "yiisoft/di": "^1.2" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\FormModel\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Provides a base for form models and helps to fill, validate and display them.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "form", + "model" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/form-model/issues?state=open", + "source": "https://github.com/yiisoft/form-model", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-13T07:16:51+00:00" + }, + { + "name": "yiisoft/friendly-exception", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/friendly-exception.git", + "reference": "4b4a19edff251791e3c92d4d83435d2716351ff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/friendly-exception/zipball/4b4a19edff251791e3c92d4d83435d2716351ff4", + "reference": "4b4a19edff251791e3c92d4d83435d2716351ff4", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.4", + "roave/infection-static-analysis-plugin": "^1.5", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\FriendlyException\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "An interface for friendlier exception", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "error handling", + "exception", + "exceptions", + "friendly" + ], + "support": { + "forum": "http://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/friendly-exception/issues?state=open", + "source": "https://github.com/yiisoft/friendly-exception", + "wiki": "http://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2021-10-26T21:43:25+00:00" + }, + { + "name": "yiisoft/html", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/html.git", + "reference": "968aa8b336135242bdaef9646fa3d53c3c0731f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/html/zipball/968aa8b336135242bdaef9646fa3d53c3c0731f7", + "reference": "968aa8b336135242bdaef9646fa3d53c3c0731f7", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/arrays": "^2.0|^3.0", + "yiisoft/json": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.26.19", + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Html\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Handy library to generate HTML", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "html" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://forum.yiiframework.com/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/html/issues?state=open", + "source": "https://github.com/yiisoft/html", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-18T11:48:50+00:00" + }, + { + "name": "yiisoft/http", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/http.git", + "reference": "7967b2c45dbf6af785dea4ea481af23da6d49c5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/http/zipball/7967b2c45dbf6af785dea4ea481af23da6d49c5d", + "reference": "7967b2c45dbf6af785dea4ea481af23da6d49c5d", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.10", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Constants and PSR-7 PhpStorm meta for HTTP protocol headers, methods and statuses", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "header", + "http", + "method", + "psr-17", + "psr-7", + "status" + ], + "support": { + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/http/issues?state=open", + "source": "https://github.com/yiisoft/http", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2021-11-09T09:42:11+00:00" + }, + { + "name": "yiisoft/hydrator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/hydrator.git", + "reference": "9bfde0c99fc35b182d1b74433e9316c9b67c5fc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/hydrator/zipball/9bfde0c99fc35b182d1b74433e9316c9b67c5fc1", + "reference": "9bfde0c99fc35b182d1b74433e9316c9b67c5fc1", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/container": "^2.0", + "yiisoft/injector": "^1.1", + "yiisoft/strings": "^2.3" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.23", + "yiisoft/di": "^1.2", + "yiisoft/dummy-provider": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "ext-intl": "Allows using `ToDateTime` parameter attribute" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Hydrator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create and populate objects with type casting, mapping and dependencies resolving support.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "hydrator" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/hydrator/issues?state=open", + "source": "https://github.com/yiisoft/hydrator", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-17T16:10:24+00:00" + }, + { + "name": "yiisoft/hydrator-validator", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/hydrator-validator.git", + "reference": "5f7acfebce127755af7df3cbc126dd502a1c4140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/hydrator-validator/zipball/5f7acfebce127755af7df3cbc126dd502a1c4140", + "reference": "5f7acfebce127755af7df3cbc126dd502a1c4140", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/hydrator": "^1.0", + "yiisoft/validator": "^1.0|^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.11", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Hydrator\\Validator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Validating hydrator with raw data validation support", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "input", + "validation" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/hydrator-validator/issues?state=open", + "source": "https://github.com/yiisoft/hydrator-validator", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-08-06T12:18:25+00:00" + }, + { + "name": "yiisoft/i18n", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/i18n.git", + "reference": "c05e9e031fb36fc193152e18fa791bbf6d0582b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/i18n/zipball/c05e9e031fb36fc193152e18fa791bbf6d0582b8", + "reference": "c05e9e031fb36fc193152e18fa791bbf6d0582b8", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.17.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\I18n\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Internationalization Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "i18n", + "locale" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/i18n/issues?state=open", + "source": "https://github.com/yiisoft/i18n", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-06-10T14:18:35+00:00" + }, + { + "name": "yiisoft/injector", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/injector.git", + "reference": "0dc0127a7542341bdaabda7b85204e992938b83e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/injector/zipball/0dc0127a7542341bdaabda7b85204e992938b83e", + "reference": "0dc0127a7542341bdaabda7b85204e992938b83e", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.2", + "phpbench/phpbench": "^1.1", + "phpunit/phpunit": "^9.5", + "psr/container": "^1.0|^2.0", + "rector/rector": "^0.18.12", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.7", + "yiisoft/test-support": "^1.2" + }, + "suggest": { + "psr/container": "For automatic resolving of dependencies" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Injector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR-11 compatible injector. Executes a callable and makes an instances by injecting dependencies from a given DI container.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "PSR-11", + "dependency injection", + "di", + "injector", + "reflection" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/injector/issues?state=open", + "source": "https://github.com/yiisoft/injector", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-12-20T09:39:03+00:00" + }, + { + "name": "yiisoft/input-http", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/input-http.git", + "reference": "877fea3374033f5a6af4207036eb7733a635b5b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/input-http/zipball/877fea3374033f5a6af4207036eb7733a635b5b7", + "reference": "877fea3374033f5a6af4207036eb7733a635b5b7", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/arrays": "^3.0", + "yiisoft/hydrator": "^1.0", + "yiisoft/hydrator-validator": "^2.0", + "yiisoft/middleware-dispatcher": "^5.1", + "yiisoft/request-provider": "^1.0", + "yiisoft/validator": "^1.1|^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.22", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params-web": "params-web.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Input\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Maps data from PSR-7 HTTP request to PHP DTO representing user input.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "dto", + "input", + "mapper", + "mapping", + "psr-7", + "request", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/input-http/issues?state=open", + "source": "https://github.com/yiisoft/input-http", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-08-06T12:42:23+00:00" + }, + { + "name": "yiisoft/json", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/json.git", + "reference": "51b483aef1cd5d06ea02db3c40707bb6b41ed088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/json/zipball/51b483aef1cd5d06ea02db3c40707bb6b41ed088", + "reference": "51b483aef1cd5d06ea02db3c40707bb6b41ed088", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "infection/infection": "^0.16.3", + "phan/phan": "^3.0", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Json\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "json", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "json" + ], + "support": { + "forum": "http://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/json/issues?state=open", + "source": "https://github.com/yiisoft/json", + "wiki": "http://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2020-08-26T12:21:14+00:00" + }, + { + "name": "yiisoft/log", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/log.git", + "reference": "9d549952f5099a3e3081e11cccb3841c77587dac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/log/zipball/9d549952f5099a3e3081e11cccb3841c77587dac", + "reference": "9d549952f5099a3e3081e11cccb3841c77587dac", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/log": "^2.0|^3.0", + "yiisoft/var-dumper": "^1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25" + }, + "suggest": { + "yiisoft/log-target-db": "Allows writing log messages to the database", + "yiisoft/log-target-email": "Allows sending log messages by email", + "yiisoft/log-target-file": "Allows writing log messages to the files", + "yiisoft/log-target-syslog": "Allows writing log messages to the Syslog" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "events-console": "events-console.php", + "events-web": "events-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Logging Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "log", + "logger", + "psr-3", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/log/issues?state=open", + "source": "https://github.com/yiisoft/log", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-07-03T10:13:44+00:00" + }, + { + "name": "yiisoft/log-target-file", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/log-target-file.git", + "reference": "758a792d11f5b6d554450abc828e2db5d7613f22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/log-target-file/zipball/758a792d11f5b6d554450abc828e2db5d7613f22", + "reference": "758a792d11f5b6d554450abc828e2db5d7613f22", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^8.0", + "yiisoft/files": "^1.0|^2.0", + "yiisoft/log": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.1", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.2", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.0" + }, + "suggest": { + "ext-zlib": "Enabling gzip compression of rotated files." + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Log\\Target\\File\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Logging Library - File Target", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "log", + "logger", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/log-target-file/issues", + "source": "https://github.com/yiisoft/log-target-file", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-17T05:52:09+00:00" + }, + { + "name": "yiisoft/mailer", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/mailer.git", + "reference": "dcb71779d946c75c9163a28d0a2c3c6f9d7f319a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/mailer/zipball/dcb71779d946c75c9163a28d0a2c3c6f9d7f319a", + "reference": "dcb71779d946c75c9163a28d0a2c3c6f9d7f319a", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/event-dispatcher": "^1.0", + "yiisoft/view": "^10.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^10", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.24", + "yiisoft/files": "^2.0", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "yiisoft/event-dispatcher": "Yii Event Dispatcher", + "yiisoft/mailer-swiftmailer": "Yii Mailer Library - Swift Mailer Extension", + "yiisoft/mailer-symfony": "Yii Mailer Library - Symfony Mailer Extension" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Mailer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Mailer Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "mailer", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/mailer/issues?state=open", + "source": "https://github.com/yiisoft/mailer", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-07-02T14:35:38+00:00" + }, + { + "name": "yiisoft/mailer-symfony", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/mailer-symfony.git", + "reference": "6dba87a57e2b08cf56afd260cebb33b4ee607eb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/mailer-symfony/zipball/6dba87a57e2b08cf56afd260cebb33b4ee607eb7", + "reference": "6dba87a57e2b08cf56afd260cebb33b4ee607eb7", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/mailer": "^5.3|^6.0|^7.0", + "symfony/mime": "^5.4|^6.2|^7.0", + "yiisoft/mailer": "^5.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.2", + "yiisoft/files": "^2.0", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/test-support": "^3.0", + "yiisoft/view": "^8.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Mailer\\Symfony\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Mailer Library - Symfony Mailer Extension", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "email", + "mail", + "mailer", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/mailer-symfony/issues?state=open", + "source": "https://github.com/yiisoft/mailer-symfony", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-05-24T11:18:35+00:00" + }, + { + "name": "yiisoft/middleware-dispatcher", + "version": "5.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/middleware-dispatcher.git", + "reference": "97d290e4ddab59e5a735ebafc69c46b6953022b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/middleware-dispatcher/zipball/97d290e4ddab59e5a735ebafc69c46b6953022b3", + "reference": "97d290e4ddab59e5a735ebafc69c46b6953022b3", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/definitions": "^2.0|^3.0", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/injector": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.0", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.3", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Middleware\\Dispatcher\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR-15 middleware dispatcher", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "dispatcher", + "middleware" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/middleware-dispatcher/issues?state=open", + "source": "https://github.com/yiisoft/middleware-dispatcher", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-09-25T07:01:31+00:00" + }, + { + "name": "yiisoft/network-utilities", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/network-utilities.git", + "reference": "9b51434f17035ce70ba220518a9d52656b6c1cb4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/network-utilities/zipball/9b51434f17035ce70ba220518a9d52656b6c1cb4", + "reference": "9b51434f17035ce70ba220518a9d52656b6c1cb4", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\NetworkUtilities\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Network related utilities", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "IP", + "dns", + "mask", + "network" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/network-utilities/issues?state=open", + "source": "https://github.com/yiisoft/network-utilities", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-02T14:07:06+00:00" + }, + { + "name": "yiisoft/profiler", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/profiler.git", + "reference": "9f1bd1649f079ddfd45217f8da50533b12ca78a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/profiler/zipball/9f1bd1649f079ddfd45217f8da50533b12ca78a3", + "reference": "9f1bd1649f079ddfd45217f8da50533b12ca78a3", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/log": "^2.0|^3.0", + "yiisoft/files": "^2.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.0", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.1", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.2" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php", + "events-web": "events-web.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Profiler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Profiler", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "performance", + "profiler" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/profiler/issues?state=open", + "source": "https://github.com/yiisoft/profiler", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-15T09:15:24+00:00" + }, + { + "name": "yiisoft/proxy", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/proxy.git", + "reference": "2820941a7ea0f66bab32d50a78c9f8b4b3fb22f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/proxy/zipball/2820941a7ea0f66bab32d50a78c9f8b4b3fb22f6", + "reference": "2820941a7ea0f66bab32d50a78c9f8b4b3fb22f6", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/files": "^1.0.2|^2.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Proxy\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proxy", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "proxy" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/proxy/issues?state=open", + "source": "https://github.com/yiisoft/proxy", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-01-17T13:21:34+00:00" + }, + { + "name": "yiisoft/rate-limiter", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/rate-limiter.git", + "reference": "8cbd10ba7e5d5e5edb5be5e52e6b42e1cc841942" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/rate-limiter/zipball/8cbd10ba7e5d5e5edb5be5e52e6b42e1cc841942", + "reference": "8cbd10ba7e5d5e5edb5be5e52e6b42e1cc841942", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1|^2.0", + "psr/http-message-implementation": "1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/simple-cache": "^2.0|^3.0", + "yiisoft/http": "^1.2" + }, + "require-dev": { + "ext-apcu": "*", + "maglnet/composer-require-checker": "^4.4", + "nyholm/psr7": "^1.0", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.13", + "yiisoft/cache": "^3.0" + }, + "suggest": { + "ext-apcu": "To use APCu storage" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\RateLimiter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Rate Limiter Middleware", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "GCRA", + "framework", + "middleware", + "psr-15", + "rate limiter", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/rate-limiter/issues?state=open", + "source": "https://github.com/yiisoft/rate-limiter", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-05-25T06:55:30+00:00" + }, + { + "name": "yiisoft/rbac", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/rbac.git", + "reference": "1744ddebd141f3fb1aaa3441ef7c4f2a36ca1cf3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/rbac/zipball/1744ddebd141f3fb1aaa3441ef7c4f2a36ca1cf3", + "reference": "1744ddebd141f3fb1aaa3441ef7c4f2a36ca1cf3", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "yiisoft/access": "^1.0", + "yiisoft/friendly-exception": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.3" + }, + "suggest": { + "yiisoft/rbac-cycle-db": "For using Cycle as a storage", + "yiisoft/rbac-db": "For using Yii Database as a storage", + "yiisoft/rbac-php": "For using PHP files as a storage", + "yiisoft/rbac-rules-container": "To create rules via Yii Factory" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Rbac\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Role-Based Access Control", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "rbac", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/rbac/issues", + "source": "https://github.com/yiisoft/rbac", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-04-20T09:08:24+00:00" + }, + { + "name": "yiisoft/rbac-php", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/rbac-php.git", + "reference": "de60e218822ff75b1ac319862e7459351d57cc75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/rbac-php/zipball/de60e218822ff75b1ac319862e7459351d57cc75", + "reference": "de60e218822ff75b1ac319862e7459351d57cc75", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "yiisoft/rbac": "^1.0", + "yiisoft/var-dumper": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "psr/log": "^1.1.3", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.22", + "yiisoft/files": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Rbac\\Php\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii RBAC PHP File Storage", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "rbac", + "storage", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/rbac/issues", + "source": "https://github.com/yiisoft/rbac", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2022-04-08T11:33:34+00:00" + }, + { + "name": "yiisoft/rbac-rules-container", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/rbac-rules-container.git", + "reference": "19c42b56751596ce139386d97f5164b77f655565" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/rbac-rules-container/zipball/19c42b56751596ce139386d97f5164b77f655565", + "reference": "19c42b56751596ce139386d97f5164b77f655565", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/definitions": "^1.0|^2.0|^3.0", + "yiisoft/factory": "^1.0", + "yiisoft/rbac": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.2", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Rbac\\Rules\\Container\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "RBAC rules container based on \"yiisoft/factory\"", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "container", + "factory", + "rbac", + "rules", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/rbac-rules-container/issues?state=open", + "source": "https://github.com/yiisoft/rbac-rules-container", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-02-16T10:44:01+00:00" + }, + { + "name": "yiisoft/request-provider", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/request-provider.git", + "reference": "667e339f307eaf3d4e4f09f05334e41761d20a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/request-provider/zipball/667e339f307eaf3d4e4f09f05334e41761d20a81", + "reference": "667e339f307eaf3d4e4f09f05334e41761d20a81", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0.1", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.20", + "yiisoft/di": "^1.2" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\RequestProvider\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR-7 request provider", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "http", + "provider", + "psr", + "request", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/request-provider/issues?state=open", + "source": "https://github.com/yiisoft/request-provider", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-02T15:18:14+00:00" + }, + { + "name": "yiisoft/router", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/router.git", + "reference": "86ee95984109bd96548cad3f93df8ad9ca4de0b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/router/zipball/86ee95984109bd96548cad3f93df8ad9ca4de0b8", + "reference": "86ee95984109bd96548cad3f93df8ad9ca4de0b8", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/middleware-dispatcher": "^5.0", + "yiisoft/router-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "nyholm/psr7": "^1.5", + "phpunit/phpunit": "^9.5", + "psr/container": "^1.1|^2.0", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.18", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.22", + "yiisoft/di": "^1.0", + "yiisoft/dummy-provider": "^1.0.0", + "yiisoft/hydrator": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "yiisoft/hydrator": "Needed to use `RouteArgument` attribute", + "yiisoft/router-fastroute": "Router implementation based on nikic/FastRoute" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Router\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii router", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "middleware", + "router", + "web" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/router/issues?state=open", + "source": "https://github.com/yiisoft/router", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-02-20T11:39:48+00:00" + }, + { + "name": "yiisoft/router-fastroute", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/router-fastroute.git", + "reference": "4f2214eed24e140687e714ccb08a6420da316059" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/router-fastroute/zipball/4f2214eed24e140687e714ccb08a6420da316059", + "reference": "4f2214eed24e140687e714ccb08a6420da316059", + "shasum": "" + }, + "require": { + "nikic/fast-route": "^1.3", + "php": "^8.0", + "psr/http-message": "^1.0|^2.0", + "psr/simple-cache": "^2.0|^3.0", + "yiisoft/http": "^1.2", + "yiisoft/router": "^2.1|^3.0" + }, + "provide": { + "yiisoft/router-implementation": "1.0.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.4", + "phpunit/phpunit": "^9.5", + "psr/container": "^2.0", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.21", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Router\\FastRoute\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii router FastRoute adapter", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "FastRoute", + "router" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/router-fastroute/issues?state=open", + "source": "https://github.com/yiisoft/router-fastroute", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-03-19T12:26:45+00:00" + }, + { + "name": "yiisoft/security", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/security.git", + "reference": "f1ad5d279722f162cfb0f720a3723ad762892de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/security/zipball/f1ad5d279722f162cfb0f720a3723ad762892de3", + "reference": "f1ad5d279722f162cfb0f720a3723ad762892de3", + "shasum": "" + }, + "require": { + "ext-hash": "*", + "ext-openssl": "*", + "php": "^7.4|^8.0", + "yiisoft/strings": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.23" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Security\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Security utilities", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "MAC", + "decryption", + "encryption", + "hash", + "password", + "random", + "security", + "signature", + "token masking" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/security/issues?state=open", + "source": "https://github.com/yiisoft/security", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-03-18T12:20:01+00:00" + }, + { + "name": "yiisoft/session", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/session.git", + "reference": "193c666a8d1fcce5985c48afe9c3df96b6d3b6d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/session/zipball/193c666a8d1fcce5985c48afe9c3df96b6d3b6d1", + "reference": "193c666a8d1fcce5985c48afe9c3df96b6d3b6d1", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-message-implementation": "1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/cookies": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.1" + }, + "suggest": { + "ext-session": "Allows using native PHP sessions" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di-web": "di-web.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Session\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "A session service, PSR-15 session middleware, and a flash message service which helps use one-time messages.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "flash", + "middleware", + "psr-15", + "session" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/session/issues?state=open", + "source": "https://github.com/yiisoft/session", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-05-02T18:50:11+00:00" + }, + { + "name": "yiisoft/strings", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/strings.git", + "reference": "ff519d31e1c2518f42554fb5410e31bbb74b8108" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/strings/zipball/ff519d31e1c2518f42554fb5410e31bbb74b8108", + "reference": "ff519d31e1c2518f42554fb5410e31bbb74b8108", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Strings\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Strings Helper", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "helper", + "string", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/strings/issues", + "source": "https://github.com/yiisoft/strings", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-12-22T07:29:39+00:00" + }, + { + "name": "yiisoft/translator", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/translator.git", + "reference": "869a224bf59dda36a8725985f5dd2e31cb357e21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/translator/zipball/869a224bf59dda36a8725985f5dd2e31cb357e21", + "reference": "869a224bf59dda36a8725985f5dd2e31cb357e21", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "1.0.0", + "yiisoft/files": "^1.0|^2.0", + "yiisoft/i18n": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.2", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4", + "yiisoft/di": "^1.2" + }, + "suggest": { + "ext-intl": "Allows using intl message formatter", + "ext-tokenizer": "Allows using message extraction", + "yiisoft/event-dispatcher": "To listen for events about missing categories and messages" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Translator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Message Translator", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "i18n", + "internationalization", + "translation" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/translator/issues?state=open", + "source": "https://github.com/yiisoft/translator", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-17T13:16:40+00:00" + }, + { + "name": "yiisoft/translator-message-php", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/translator-message-php.git", + "reference": "67a0c64c132e5098f6824017ca4bccd45cc79030" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/translator-message-php/zipball/67a0c64c132e5098f6824017ca4bccd45cc79030", + "reference": "67a0c64c132e5098f6824017ca4bccd45cc79030", + "shasum": "" + }, + "require": { + "php": "^8.0", + "yiisoft/translator": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.4", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Translator\\Message\\Php\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Translator PHP Message Storage", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "formatting", + "i18n", + "internationalization", + "message storage" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/translator-message-php/issues?state=open", + "source": "https://github.com/yiisoft/translator-message-php", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-02-19T11:29:34+00:00" + }, + { + "name": "yiisoft/user", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/user.git", + "reference": "7bd541166949ac56a722a9555d43dac29976f424" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/user/zipball/7bd541166949ac56a722a9555d43dac29976f424", + "reference": "7bd541166949ac56a722a9555d43dac29976f424", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.4|^8.0", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1|^2.0|^3.0", + "yiisoft/access": "^1.0", + "yiisoft/auth": "^2.0|^3.0", + "yiisoft/cookies": "^1.2", + "yiisoft/http": "^1.2", + "yiisoft/session": "^1.0|^2.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "phpunit/phpunit": "^9.5", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.0", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\User\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Convenient user identity management and access checking", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "user", + "yiisoft" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/user/issues?state=open", + "source": "https://github.com/yiisoft/user", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-02-15T10:47:39+00:00" + }, + { + "name": "yiisoft/validator", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/validator.git", + "reference": "9e8ad99e66c750aceda96fd96033ff4b5d4a7e62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/validator/zipball/9e8ad99e66c750aceda96fd96033ff4b5d4a7e62", + "reference": "9e8ad99e66c750aceda96fd96033ff4b5d4a7e62", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0", + "yiisoft/arrays": "^2.1|^3.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/network-utilities": "^1.2", + "yiisoft/strings": "^2.1", + "yiisoft/translator": "^2.1|^3.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.3", + "phpbench/phpbench": "^1.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.24", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0", + "yiisoft/translator-message-php": "^1.1", + "yiisoft/yii-debug": "dev-master|dev-php80" + }, + "suggest": { + "ext-fileinfo": "To use image rule", + "ext-intl": "Allows using date rules and IDN validation for emails", + "yiisoft/di": "To create rule handlers via Yii DI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di": "di.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Validator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Validator", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "validation", + "validator" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/validator/issues?state=open", + "source": "https://github.com/yiisoft/validator", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-12T12:10:04+00:00" + }, + { + "name": "yiisoft/var-dumper", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/var-dumper.git", + "reference": "c7f6a40d117b905abe26ac093593eaf7c57b9bd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/var-dumper/zipball/c7f6a40d117b905abe26ac093593eaf7c57b9bd5", + "reference": "c7f6a40d117b905abe26ac093593eaf7c57b9bd5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "php": "^8.0", + "yiisoft/arrays": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.3" + }, + "suggest": { + "ext-sockets": "Send dumps to a server through UDP/TCP protocols" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Yiisoft\\VarDumper\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Enhances functionality of var_dump() and var_export(). It is dealing with recursive references, may highlight syntax and export closures.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "helper", + "var-dumper", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/var-dumper/issues", + "source": "https://github.com/yiisoft/var-dumper", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-10-08T11:21:24+00:00" + }, + { + "name": "yiisoft/view", + "version": "10.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/view.git", + "reference": "4416d30e4e286e23887d9f525701f37e3a15f9ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/view/zipball/4416d30e4e286e23887d9f525701f37e3a15f9ca", + "reference": "4416d30e4e286e23887d9f525701f37e3a15f9ca", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "1.0.0", + "psr/event-dispatcher-implementation": "1.0.0", + "yiisoft/arrays": "^2.0|^3.0", + "yiisoft/cache": "^1.0|^2.0|^3.0", + "yiisoft/files": "^1.0|^2.0", + "yiisoft/html": "^2.5|^3.0", + "yiisoft/json": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "1.0.*", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.20", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.2", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/test-support": "^1.4|^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php", + "di-web": "di-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\View\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii View Rendering Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "view", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/view/issues?state=open", + "source": "https://github.com/yiisoft/view", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-06-28T10:02:35+00:00" + }, + { + "name": "yiisoft/widget", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/widget.git", + "reference": "d469c67698b4ee8bc4824c2adb0adbef645c1cff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/widget/zipball/d469c67698b4ee8bc4824c2adb0adbef645c1cff", + "reference": "d469c67698b4ee8bc4824c2adb0adbef645c1cff", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/definitions": "^3.1", + "yiisoft/factory": "^1.2", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/html": "^2.0|^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "bootstrap": "bootstrap.php", + "widgets": [], + "widgets-themes": [] + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Widget\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Widget", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "widgets", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/widget/issues?state=open", + "source": "https://github.com/yiisoft/widget", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2023-12-25T18:47:09+00:00" + }, + { + "name": "yiisoft/yii-bootstrap5", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-bootstrap5.git", + "reference": "76d3a7a8f9c8bada906929c517c01c1bd4678ed6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-bootstrap5/zipball/76d3a7a8f9c8bada906929c517c01c1bd4678ed6", + "reference": "76d3a7a8f9c8bada906929c517c01c1bd4678ed6", + "shasum": "" + }, + "require": { + "php": "^8.1", + "yiisoft/arrays": "^1.0|^2.0|^3.0", + "yiisoft/assets": "^4.0", + "yiisoft/files": "^2.0", + "yiisoft/html": "^3.0", + "yiisoft/json": "^1.0", + "yiisoft/widget": "^2.0" + }, + "provide": { + "yiisoft/yii-bootstrap": "1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.3", + "phpunit/phpunit": "^9.6", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25", + "yiisoft/aliases": "^3.0", + "yiisoft/di": "^1.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Bootstrap5\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Framework Twitter Bootstrap 5 Extension", + "keywords": [ + "bootstrap5", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-bootstrap5/issues?state=open", + "source": "https://github.com/yiisoft/yii-bootstrap5", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-07-12T17:56:26+00:00" + }, + { + "name": "yiisoft/yii-console", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-console.git", + "reference": "7942fc70df59965bb1b33ac4671c915a145d2dcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-console/zipball/7942fc70df59965bb1b33ac4671c915a145d2dcf", + "reference": "7942fc70df59965bb1b33ac4671c915a145d2dcf", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher-contracts": "^2.2|^3.0", + "yiisoft/friendly-exception": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^3.8|^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "vimeo/psalm": "^4.30|^5.20", + "yiisoft/config": "^1.3", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config", + "merge-plan-file": "../tests/environment/.merge-plan.php" + }, + "config-plugin": { + "params-console": "params-console.php", + "di-console": "di-console.php", + "events-console": "events-console.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Console\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Symfony console wrapper with additional features", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "console", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-console/issues?state=open", + "source": "https://github.com/yiisoft/yii-console", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-02-17T13:10:12+00:00" + }, + { + "name": "yiisoft/yii-cycle", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-cycle.git", + "reference": "071361f0a97ed314add6c2e285953ee02b3973a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-cycle/zipball/071361f0a97ed314add6c2e285953ee02b3973a6", + "reference": "071361f0a97ed314add6c2e285953ee02b3973a6", + "shasum": "" + }, + "require": { + "cycle/annotated": "^3.5", + "cycle/database": "^2.8", + "cycle/migrations": "^3.1.1|^4.0", + "cycle/orm": "^2.7", + "cycle/schema-builder": "^2.8", + "cycle/schema-migrations-generator": "^2.0", + "cycle/schema-provider": "^1.0", + "cycle/schema-renderer": "^1.2", + "php": "^8.1", + "psr/container": "^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^3.0", + "psr/simple-cache": "^2.0|^3.0", + "spiral/attributes": "^2.7|^3.0", + "spiral/core": "^3.12", + "spiral/tokenizer": "^3.12", + "symfony/console": "^6.4", + "symfony/finder": "^5.4", + "webmozart/glob": "^4.7", + "yiisoft/aliases": "^1.1|^2.0|^3.0", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/injector": "^1.1" + }, + "require-dev": { + "cycle/entity-behavior": "^1.0", + "ext-uopz": "*", + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.3", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.7", + "yiisoft/definitions": "^3.2", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "cycle/entity-behavior": "To use PHP attributes that add behaviors to Cycle ORM entities." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php", + "di-console": "di-console.php", + "events-console": "events-console.php", + "di-delegates": "di-delegates.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Cycle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Cycle ORM v2 support", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "cycle", + "migrations", + "orm", + "yii" + ], + "support": { + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-cycle/issues?state=open", + "source": "https://github.com/yiisoft/yii-cycle", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-03-21T08:34:37+00:00" + }, + { + "name": "yiisoft/yii-dataview", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-dataview.git", + "reference": "c26babddba3a6b12cb679d92e13fe324eda9142a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-dataview/zipball/c26babddba3a6b12cb679d92e13fe324eda9142a", + "reference": "c26babddba3a6b12cb679d92e13fe324eda9142a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.1", + "psr/container": "^1.0|^2.0", + "yiisoft/arrays": "^3.1", + "yiisoft/data": "dev-master", + "yiisoft/factory": "^1.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/html": "^3.0", + "yiisoft/injector": "^1.2", + "yiisoft/json": "^1.0", + "yiisoft/router": "^3.0", + "yiisoft/strings": "^2.0", + "yiisoft/translator": "^3.0", + "yiisoft/validator": "^2.0", + "yiisoft/view": "^10.0", + "yiisoft/widget": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "nyholm/psr7": "^1.3", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.1.1", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25", + "yiisoft/di": "^1.2", + "yiisoft/event-dispatcher": "^1.0", + "yiisoft/log": "^2.0", + "yiisoft/router-fastroute": "^3.0.1", + "yiisoft/test-support": "^3.0", + "yiisoft/translator-message-php": "^1.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php", + "widgets-themes": "widgets-themes.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\DataView\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Framework Data Widgets Package", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "data", + "grid", + "list", + "view", + "widget", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-dataview/issues?state=open", + "source": "https://github.com/yiisoft/yii-dataview", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-11T07:56:12+00:00" + }, + { + "name": "yiisoft/yii-debug", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-debug.git", + "reference": "90bb1960841cf3b054433d7c54210fd203d3fe8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-debug/zipball/90bb1960841cf3b054433d7c54210fd203d3fe8f", + "reference": "90bb1960841cf3b054433d7c54210fd203d3fe8f", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "guzzlehttp/psr7": "^2.4", + "jetbrains/phpstorm-attributes": "^1.0", + "php": "^8.1", + "psr/container": "^2.0", + "psr/event-dispatcher": "^1.0", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/console": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.4", + "yiisoft/aliases": "^3.0", + "yiisoft/arrays": "^2.0|^3.0", + "yiisoft/config": "^1.3", + "yiisoft/di": "^1.0", + "yiisoft/files": "^2.0", + "yiisoft/json": "^1.0", + "yiisoft/profiler": "^3.0", + "yiisoft/proxy": "^1.0.1", + "yiisoft/strings": "^2.2", + "yiisoft/var-dumper": "^1.7" + }, + "require-dev": { + "ext-curl": "*", + "ext-sockets": "*", + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.3", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25", + "yiisoft/error-handler": "^3.0", + "yiisoft/event-dispatcher": "^1.0", + "yiisoft/log": "^2.0", + "yiisoft/yii-console": "^2.0", + "yiisoft/yii-http": "^1.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "bootstrap": "bootstrap.php", + "di": "di.php", + "di-console": "di-console.php", + "di-web": "di-web.php", + "di-providers": "di-providers.php", + "events-web": "events-web.php", + "events-console": "events-console.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Debug\\": "src", + "Yiisoft\\Yii\\Debug\\Tests\\Shared\\": "tests/Shared" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Framework Debug Panel Extension", + "keywords": [ + "debug", + "debugger", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-debug/issues?state=open", + "source": "https://github.com/yiisoft/yii-debug", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-17T07:39:11+00:00" + }, + { + "name": "yiisoft/yii-debug-api", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-debug-api.git", + "reference": "8349f8d6f250e0f17bec8ab187390124e491c8c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-debug-api/zipball/8349f8d6f250e0f17bec8ab187390124e491c8c0", + "reference": "8349f8d6f250e0f17bec8ab187390124e491c8c0", + "shasum": "" + }, + "require": { + "alexkart/curl-builder": "^1.0", + "gitonomy/gitlib": "^1.3", + "guzzlehttp/guzzle": "^7.5", + "guzzlehttp/psr7": "^2.4", + "httpsoft/http-message": "^1.1", + "php": "^8.1", + "psr/container": "^2.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/simple-cache": "^2.0|^3.0", + "symfony/process": "^5.4|^6.0", + "yiisoft/aliases": "^3.0", + "yiisoft/config": "^1.1", + "yiisoft/data-response": "^2.0", + "yiisoft/di": "^1.0", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/http": "^1.2", + "yiisoft/middleware-dispatcher": "^5.2", + "yiisoft/router": "^3.0", + "yiisoft/translator": "^3.0", + "yiisoft/var-dumper": "^1.4", + "yiisoft/yii-debug": "dev-master", + "yiisoft/yii-middleware": "^1.0", + "zircote/swagger-php": "^4.0" + }, + "require-dev": { + "codeception/codeception": "^5.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.6", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.22", + "yiisoft/active-record": "dev-master", + "yiisoft/assets": "^4.0", + "yiisoft/csrf": "^2.0", + "yiisoft/db": "1.2 as dev-master", + "yiisoft/db-sqlite": "^1.0", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/router-fastroute": "^3.0", + "yiisoft/test-support": "^3.0", + "yiisoft/yii-cycle": "dev-master", + "yiisoft/yii-view": "^6.0" + }, + "suggest": { + "yiisoft/assets": "Support custom debug panels", + "yiisoft/yii-view": "Support custom debug panels" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "bootstrap-web": "bootstrap-web.php", + "params": "params.php", + "di-web": "di-web.php", + "routes": "routes.php", + "di-providers-web": "di-providers-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Debug\\Api\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Debug API", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "api", + "debug", + "yii", + "yii-debug-api", + "yiisoft" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-debug-api/issues?state=open", + "source": "https://github.com/yiisoft/yii-debug-api", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-15T14:39:54+00:00" + }, + { + "name": "yiisoft/yii-event", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-event.git", + "reference": "2e02986a09235d20b3c02382f8cc5d7ad2e452fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-event/zipball/2e02986a09235d20b3c02382f8cc5d7ad2e452fb", + "reference": "2e02986a09235d20b3c02382f8cc5d7ad2e452fb", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/event-dispatcher": "^1.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/injector": "^1.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.18.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/config": "^1.3", + "yiisoft/di": "^1.2", + "yiisoft/test-support": "^1.3" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config", + "merge-plan-file": "../tests/environment/.merge-plan.php" + }, + "config-plugin": { + "params-web": "params-web.php", + "params-console": "params-console.php", + "di": "di.php", + "di-web": "di-web.php", + "di-console": "di-console.php", + "events-web": [], + "events-console": [] + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Event\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Event", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "event", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-event/issues?state=open", + "source": "https://github.com/yiisoft/yii-event", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2023-11-04T15:57:42+00:00" + }, + { + "name": "yiisoft/yii-http", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-http.git", + "reference": "2555514a091ec9339259f10abc7e8970ef9e5db6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-http/zipball/2555514a091ec9339259f10abc7e8970ef9e5db6", + "reference": "2555514a091ec9339259f10abc7e8970ef9e5db6", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/middleware-dispatcher": "^3.0|^4.0|^5.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.4", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii HTTP Application", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "application", + "http", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-http/issues?state=open", + "source": "https://github.com/yiisoft/yii-http", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-07T07:54:13+00:00" + }, + { + "name": "yiisoft/yii-middleware", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-middleware.git", + "reference": "b2a8157ae2c94847a2b2f2e3b63dc23366b5e42a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-middleware/zipball/b2a8157ae2c94847a2b2f2e3b63dc23366b5e42a", + "reference": "b2a8157ae2c94847a2b2f2e3b63dc23366b5e42a", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^3.0", + "yiisoft/aliases": "^3.0", + "yiisoft/cookies": "^1.2", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/http": "^1.2", + "yiisoft/network-utilities": "^1.2", + "yiisoft/router": "^3.0", + "yiisoft/session": "^2.0", + "yiisoft/strings": "^2.1", + "yiisoft/validator": "^1.0|^2.0" + }, + "require-dev": { + "ext-uopz": "*", + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.16", + "slope-it/clock-mock": "^0.3.6", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25", + "yiisoft/router-fastroute": "^3.0", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "yiisoft/event-dispatcher": "For using events", + "yiisoft/translator": "For updating translator's locale" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Middleware\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Middleware", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "middleware", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-middleware/issues?state=open", + "source": "https://github.com/yiisoft/yii-middleware", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-03T19:34:10+00:00" + }, + { + "name": "yiisoft/yii-runner", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-runner.git", + "reference": "69d8392ecc0c9e47ac7d5a56c1a8596d5c1ac896" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-runner/zipball/69d8392ecc0c9e47ac7d5a56c1a8596d5c1ac896", + "reference": "69d8392ecc0c9e47ac7d5a56c1a8596d5c1ac896", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/config": "^1.1", + "yiisoft/definitions": "^1.0|^2.0|^3.0", + "yiisoft/di": "^1.0", + "yiisoft/yii-event": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.20", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.21", + "yiisoft/test-support": "^3.0" + }, + "suggest": { + "yiisoft/yii-runner-console": "Allows to run console application", + "yiisoft/yii-runner-http": "Allows to run HTTP application", + "yiisoft/yii-runner-roadrunner": "Allows to run HTTP application for RoadRunner" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "build-merge-plan": false + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Runner\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii application runner", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "runner", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-runner/issues?state=open", + "source": "https://github.com/yiisoft/yii-runner", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-09T14:10:08+00:00" + }, + { + "name": "yiisoft/yii-runner-console", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-runner-console.git", + "reference": "e92f4e72778508e7c2918f8fc8c3e75b758eb61a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-runner-console/zipball/e92f4e72778508e7c2918f8fc8c3e75b758eb61a", + "reference": "e92f4e72778508e7c2918f8fc8c3e75b758eb61a", + "shasum": "" + }, + "require": { + "php": "^8.0", + "symfony/console": "^5.4|^6.0|^7.0", + "yiisoft/config": "^1.1", + "yiisoft/definitions": "^1.0|^2.0|^3.0", + "yiisoft/di": "^1.0", + "yiisoft/yii-console": "^2.0", + "yiisoft/yii-runner": "^2.2" + }, + "require-dev": { + "codeception/codeception": "^5.0", + "codeception/module-cli": "^2.0", + "maglnet/composer-require-checker": "^4.2", + "rector/rector": "^1.0.0", + "vimeo/psalm": "^4.30|^5.2" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "build-merge-plan": false + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Runner\\Console\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Console application runner", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "console", + "runner", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-runner-console/issues?state=open", + "source": "https://github.com/yiisoft/yii-runner-console", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-10T10:06:34+00:00" + }, + { + "name": "yiisoft/yii-runner-http", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-runner-http.git", + "reference": "798c37abbcceb6b0053744b4bde0c476cd53e15e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-runner-http/zipball/798c37abbcceb6b0053744b4bde0c476cd53e15e", + "reference": "798c37abbcceb6b0053744b4bde0c476cd53e15e", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0 ", + "yiisoft/config": "^1.1", + "yiisoft/definitions": "^1.0|^2.0|^3.0", + "yiisoft/di": "^1.0", + "yiisoft/error-handler": "^3.0", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/http": "^1.2", + "yiisoft/log": "^2.0", + "yiisoft/log-target-file": "^3.0", + "yiisoft/yii-http": "^1.0", + "yiisoft/yii-runner": "^2.2" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0.0", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.2", + "xepozz/internal-mocker": "^1.4", + "yiisoft/middleware-dispatcher": "^5.0", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "build-merge-plan": false + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Runner\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "HTTP application runner", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "http", + "runner", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii-runner-http/issues?state=open", + "source": "https://github.com/yiisoft/yii-runner-http", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-03-10T10:08:37+00:00" + }, + { + "name": "yiisoft/yii-sentry", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-sentry.git", + "reference": "d030e6c3017fe9b73b0f07b0429d4ac8b114b070" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-sentry/zipball/d030e6c3017fe9b73b0f07b0429d4ac8b114b070", + "reference": "d030e6c3017fe9b73b0f07b0429d4ac8b114b070", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "sentry/sdk": "^3.2", + "sentry/sentry": "^3.11", + "symfony/console": "^5.4|^6.0", + "yiisoft/di": "^1.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.3", + "httpsoft/http-message": "^1.0.9", + "maglnet/composer-require-checker": "^4.2", + "php-http/guzzle7-adapter": "^1.0", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.14.3", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/error-handler": "^2.1", + "yiisoft/yii-console": "^1.0", + "yiisoft/yii-event": "^1.0" + }, + "suggest": { + "yiisoft/yii-console": "Add error catching to console application", + "yiisoft/yii-event": "Add error catching to console application" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "bootstrap": "bootstrap.php", + "di": "di.php", + "events-console": "events-console.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Sentry\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "A Sentry integration for Yii Framework", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "sentry", + "sentry-sdk", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-sentry/issues?state=open", + "source": "https://github.com/yiisoft/yii-sentry", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-07-15T17:44:28+00:00" + }, + { + "name": "yiisoft/yii-swagger", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-swagger.git", + "reference": "c0fe0483b04719a6724fb13650f679614e1b0cef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-swagger/zipball/c0fe0483b04719a6724fb13650f679614e1b0cef", + "reference": "c0fe0483b04719a6724fb13650f679614e1b0cef", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "swagger-api/swagger-ui": "^4.1|^5.0", + "yiisoft/aliases": "^1.1|^2.0|^3.0", + "yiisoft/arrays": "^3.0", + "yiisoft/assets": "^2.0|^3.0|^4.0", + "yiisoft/cache": "^1.0|^2.0|^3.0", + "yiisoft/data-response": "^1.0|^2.0", + "yiisoft/html": "^3.0", + "yiisoft/yii-view-renderer": "^7.1.0", + "zircote/swagger-php": "^4.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.4", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/csrf": "^2.0", + "yiisoft/di": "^1.2", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/test-support": "^3.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "di-web": "di-web.php", + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Swagger\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "OpenAPI Swagger for Yii Framework", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "api", + "swagger", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-swagger/issues?state=open", + "source": "https://github.com/yiisoft/yii-swagger", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-04T21:55:48+00:00" + }, + { + "name": "yiisoft/yii-view-renderer", + "version": "7.1.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-view-renderer.git", + "reference": "cb11468f554d251c2deb87bf228a302c794134a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-view-renderer/zipball/cb11468f554d251c2deb87bf228a302c794134a3", + "reference": "cb11468f554d251c2deb87bf228a302c794134a3", + "shasum": "" + }, + "require": { + "php": "^8.0", + "psr/container": "^1.0|^2.0", + "yiisoft/aliases": "^2.0|^3.0", + "yiisoft/csrf": "^1.2|^2.0", + "yiisoft/data-response": "^1.0|^2.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/html": "^2.5|^3.0", + "yiisoft/strings": "^2.0", + "yiisoft/view": "^10.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.0", + "maglnet/composer-require-checker": "^4.3", + "nyholm/psr7": "^1.5", + "phpunit/phpunit": "^9.5", + "rector/rector": "1.0.*", + "roave/infection-static-analysis-plugin": "^1.25", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.25", + "yiisoft/di": "^1.2", + "yiisoft/psr-dummy-provider": "^1.0", + "yiisoft/test-support": "^3.0", + "yiisoft/yii-debug": "dev-master|dev-php80" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-web": "di-web.php", + "events-web": "events-web.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\View\\Renderer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR-7 compatible view renderer", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "renderer", + "view", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-view-renderer/issues?state=open", + "source": "https://github.com/yiisoft/yii-view-renderer", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-07-01T11:56:55+00:00" + }, + { + "name": "zircote/swagger-php", + "version": "4.10.6", + "source": { + "type": "git", + "url": "https://github.com/zircote/swagger-php.git", + "reference": "e462ff5269ea0ec91070edd5d51dc7215bdea3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/e462ff5269ea0ec91070edd5d51dc7215bdea3b6", + "reference": "e462ff5269ea0ec91070edd5d51dc7215bdea3b6", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/deprecation-contracts": "^2 || ^3", + "symfony/finder": ">=2.2", + "symfony/yaml": ">=3.3" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/annotations": "^1.7 || ^2.0", + "friendsofphp/php-cs-fixer": "^2.17 || ^3.47.1", + "phpstan/phpstan": "^1.6", + "phpunit/phpunit": ">=8", + "vimeo/psalm": "^4.23" + }, + "suggest": { + "doctrine/annotations": "^1.7 || ^2.0" + }, + "bin": [ + "bin/openapi" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "OpenApi\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Robert Allen", + "email": "zircote@gmail.com" + }, + { + "name": "Bob Fanger", + "email": "bfanger@gmail.com", + "homepage": "https://bfanger.nl" + }, + { + "name": "Martin Rademacher", + "email": "mano@radebatz.net", + "homepage": "https://radebatz.net" + } + ], + "description": "swagger-php - Generate interactive documentation for your RESTful API using phpdoc annotations", + "homepage": "https://github.com/zircote/swagger-php/", + "keywords": [ + "api", + "json", + "rest", + "service discovery" + ], + "support": { + "issues": "https://github.com/zircote/swagger-php/issues", + "source": "https://github.com/zircote/swagger-php/tree/4.10.6" + }, + "time": "2024-07-26T03:04:43+00:00" + } + ], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.4", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "react/promise": "^2", + "vimeo/psalm": "^3.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.4" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T18:52:26+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/4f0e968ba3798a423730f567b1b50d3441c16ddc", + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "https://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-13T18:00:56+00:00" + }, + { + "name": "behat/gherkin", + "version": "v4.9.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", + "shasum": "" + }, + "require": { + "php": "~7.2|~8.0" + }, + "require-dev": { + "cucumber/cucumber": "dev-gherkin-22.0.0", + "phpunit/phpunit": "~8|~9", + "symfony/yaml": "~3|~4|~5" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" + }, + "time": "2021-10-12T13:05:09+00:00" + }, + { + "name": "clue/stdio-react", + "version": "v2.6.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-stdio.git", + "reference": "dfa6c378aabdff718202d4e2453f752c38ea3399" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-stdio/zipball/dfa6c378aabdff718202d4e2453f752c38ea3399", + "reference": "dfa6c378aabdff718202d4e2453f752c38ea3399", + "shasum": "" + }, + "require": { + "clue/term-react": "^1.0 || ^0.1.1", + "clue/utf8-react": "^1.0 || ^0.1", + "php": ">=5.3", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "require-dev": { + "clue/arguments": "^2.0", + "clue/commander": "^1.2", + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + }, + "suggest": { + "ext-mbstring": "Using ext-mbstring should provide slightly better performance for handling I/O" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Stdio\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Async, event-driven console input & output (STDIN, STDOUT) for truly interactive CLI applications, built on top of ReactPHP", + "homepage": "https://github.com/clue/reactphp-stdio", + "keywords": [ + "async", + "autocomplete", + "autocompletion", + "cli", + "history", + "interactive", + "reactphp", + "readline", + "stdin", + "stdio", + "stdout" + ], + "support": { + "issues": "https://github.com/clue/reactphp-stdio/issues", + "source": "https://github.com/clue/reactphp-stdio/tree/v2.6.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-03-18T15:09:30+00:00" + }, + { + "name": "clue/term-react", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-term.git", + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-term/zipball/00f297dc597eaee2ebf98af8f27cca5d21d60fa3", + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Term\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming terminal emulator, built on top of ReactPHP.", + "homepage": "https://github.com/clue/reactphp-term", + "keywords": [ + "C0", + "CSI", + "ansi", + "apc", + "ascii", + "c1", + "control codes", + "dps", + "osc", + "pm", + "reactphp", + "streaming", + "terminal", + "vt100", + "xterm" + ], + "support": { + "issues": "https://github.com/clue/reactphp-term/issues", + "source": "https://github.com/clue/reactphp-term/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2024-01-30T10:22:09+00:00" + }, + { + "name": "clue/utf8-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-utf8.git", + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-utf8/zipball/d5cd04d39cb5457aa5df830b7c4b301d2694217e", + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4 || ^0.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/stream": "^1.0 || ^0.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Utf8\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming UTF-8 parser, built on top of ReactPHP.", + "homepage": "https://github.com/clue/reactphp-utf8", + "keywords": [ + "reactphp", + "streaming", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "issues": "https://github.com/clue/reactphp-utf8/issues", + "source": "https://github.com/clue/reactphp-utf8/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-12-06T14:52:17+00:00" + }, + { + "name": "codeception/c3", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/c3.git", + "reference": "e23298a1cd5e7745973ea26a53572a3d9b013439" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/c3/zipball/e23298a1cd5e7745973ea26a53572a3d9b013439", + "reference": "e23298a1cd5e7745973ea26a53572a3d9b013439", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.5.0" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Codeception\\c3\\Installer" + }, + "autoload": { + "psr-4": { + "Codeception\\c3\\": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tiger Seo", + "email": "tiger.seo@gmail.com" + }, + { + "name": "Michael Bodnarchuk", + "email": "davert.php@codegyre.com", + "homepage": "http://codegyre.com" + } + ], + "description": "CodeCoverage collector for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "code coverage", + "codecoverage" + ], + "support": { + "issues": "https://github.com/Codeception/c3/issues", + "source": "https://github.com/Codeception/c3/tree/2.9.0" + }, + "time": "2023-10-15T17:57:07+00:00" + }, + { + "name": "codeception/codeception", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", + "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.6.2", + "codeception/lib-asserts": "^2.0", + "codeception/stub": "^4.1", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "phpunit/php-code-coverage": "^9.2 || ^10.0 || ^11.0", + "phpunit/php-text-template": "^2.0 || ^3.0 || ^4.0", + "phpunit/php-timer": "^5.0.3 || ^6.0 || ^7.0", + "phpunit/phpunit": "^9.5.20 || ^10.0 || ^11.0", + "psy/psysh": "^0.11.2 || ^0.12", + "sebastian/comparator": "^4.0.5 || ^5.0 || ^6.0", + "sebastian/diff": "^4.0.3 || ^5.0 || ^6.0", + "symfony/console": ">=4.4.24 <8.0", + "symfony/css-selector": ">=4.4.24 <8.0", + "symfony/event-dispatcher": ">=4.4.24 <8.0", + "symfony/finder": ">=4.4.24 <8.0", + "symfony/var-dumper": ">=4.4.24 <8.0", + "symfony/yaml": ">=4.4.24 <8.0" + }, + "conflict": { + "codeception/lib-innerbrowser": "<3.1.3", + "codeception/module-filesystem": "<3.0", + "codeception/module-phpbrowser": "<2.5" + }, + "replace": { + "codeception/phpunit-wrapper": "*" + }, + "require-dev": { + "codeception/lib-innerbrowser": "*@dev", + "codeception/lib-web": "^1.0", + "codeception/module-asserts": "*@dev", + "codeception/module-cli": "*@dev", + "codeception/module-db": "*@dev", + "codeception/module-filesystem": "*@dev", + "codeception/module-phpbrowser": "*@dev", + "codeception/util-universalframework": "*@dev", + "ext-simplexml": "*", + "jetbrains/phpstorm-attributes": "^1.0", + "symfony/dotenv": ">=4.4.24 <8.0", + "symfony/process": ">=4.4.24 <8.0", + "vlucas/phpdotenv": "^5.1" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "ext-simplexml": "For loading params from XML files", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/dotenv": "For loading params from .env files", + "symfony/phpunit-bridge": "For phpunit-bridge support", + "vlucas/phpdotenv": "For loading params from .env files" + }, + "bin": [ + "codecept" + ], + "type": "library", + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + }, + "classmap": [ + "src/PHPUnit/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert.ua@gmail.com", + "homepage": "https://codeception.com" + } + ], + "description": "BDD-style testing framework", + "homepage": "https://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/5.1.2" + }, + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], + "time": "2024-03-07T07:19:42+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "b8c7dff552249e560879c682ba44a4b963af91bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/b8c7dff552249e560879c682ba44a4b963af91bc", + "reference": "b8c7dff552249e560879c682ba44a4b963af91bc", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": "^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": "^7.4 | ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/2.1.0" + }, + "time": "2023-02-10T18:36:23+00:00" + }, + { + "name": "codeception/lib-innerbrowser", + "version": "3.1.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-innerbrowser.git", + "reference": "10482f7e34c0537bf5b87bc82a3d65a1842a8b4f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/10482f7e34c0537bf5b87bc82a3d65a1842a8b4f", + "reference": "10482f7e34c0537bf5b87bc82a3d65a1842a8b4f", + "shasum": "" + }, + "require": { + "codeception/codeception": "^5.0", + "codeception/lib-web": "^1.0.1", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "phpunit/phpunit": "^9.5", + "symfony/browser-kit": "^4.4.24 || ^5.4 || ^6.0", + "symfony/dom-crawler": "^4.4.30 || ^5.4 || ^6.0" + }, + "require-dev": { + "codeception/util-universalframework": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "https://codegyre.com" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Parent library for all Codeception framework modules and PhpBrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-innerbrowser/issues", + "source": "https://github.com/Codeception/lib-innerbrowser/tree/3.1.3" + }, + "time": "2022-10-03T15:33:34+00:00" + }, + { + "name": "codeception/lib-web", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-web.git", + "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-web/zipball/01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", + "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "guzzlehttp/psr7": "^2.0", + "php": "^8.0", + "phpunit/phpunit": "^9.5 | ^10.0 | ^11.0", + "symfony/css-selector": ">=4.4.24 <8.0" + }, + "conflict": { + "codeception/codeception": "<5.0.0-alpha3" + }, + "require-dev": { + "php-webdriver/webdriver": "^1.12" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "Library containing files used by module-webdriver and lib-innerbrowser or module-phpbrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-web/issues", + "source": "https://github.com/Codeception/lib-web/tree/1.0.6" + }, + "time": "2024-02-06T20:50:08+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "1b6b150b30586c3614e7e5761b31834ed7968603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/1b6b150b30586c3614e7e5761b31834ed7968603", + "reference": "1b6b150b30586c3614e7e5761b31834ed7968603", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-asserts": "^2.0", + "php": "^8.0" + }, + "conflict": { + "codeception/codeception": "<5.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "https://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-asserts/issues", + "source": "https://github.com/Codeception/module-asserts/tree/3.0.0" + }, + "time": "2022-02-16T19:48:08+00:00" + }, + { + "name": "codeception/module-cli", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-cli.git", + "reference": "a3a101fae4049fa2f810107f7bd5db3b3266ce63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-cli/zipball/a3a101fae4049fa2f810107f7bd5db3b3266ce63", + "reference": "a3a101fae4049fa2f810107f7bd5db3b3266ce63", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/module-asserts": "*", + "php": "^7.4 || ^8.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + } + ], + "description": "Codeception module for testing basic shell commands and shell output", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-cli/issues", + "source": "https://github.com/Codeception/module-cli/tree/2.0.1" + }, + "time": "2023-01-13T18:41:03+00:00" + }, + { + "name": "codeception/module-phpbrowser", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-phpbrowser.git", + "reference": "a972411f60cd00d00d5e5e3b35496ba4a23bcffc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-phpbrowser/zipball/a972411f60cd00d00d5e5e3b35496ba4a23bcffc", + "reference": "a972411f60cd00d00d5e5e3b35496ba4a23bcffc", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-innerbrowser": "*@dev", + "ext-json": "*", + "guzzlehttp/guzzle": "^7.4", + "php": "^8.0", + "symfony/browser-kit": "^5.4 || ^6.0 || ^7.0" + }, + "conflict": { + "codeception/codeception": "<5.0", + "codeception/lib-innerbrowser": "<3.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.199", + "codeception/module-rest": "^2.0 || *@dev", + "ext-curl": "*" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing web application over HTTP", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception", + "functional-testing", + "http" + ], + "support": { + "issues": "https://github.com/Codeception/module-phpbrowser/issues", + "source": "https://github.com/Codeception/module-phpbrowser/tree/3.0.1" + }, + "time": "2023-12-08T19:41:28+00:00" + }, + { + "name": "codeception/stub", + "version": "4.1.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/4fcad2c165f365377486dc3fd8703b07f1f2fcae", + "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae", + "shasum": "" + }, + "require": { + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | ^11" + }, + "conflict": { + "codeception/codeception": "<5.0.6" + }, + "require-dev": { + "consolidation/robo": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/4.1.3" + }, + "time": "2024-02-02T19:21:00+00:00" + }, + { + "name": "colinodell/json5", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/colinodell/json5.git", + "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/colinodell/json5/zipball/15b063f8cb5e6deb15f0cd39123264ec0d19c710", + "reference": "15b063f8cb5e6deb15f0cd39123264ec0d19c710", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^7.1.3|^8.0" + }, + "conflict": { + "scrutinizer/ocular": "1.7.*" + }, + "require-dev": { + "mikehaertl/php-shellcommand": "^1.2.5", + "phpstan/phpstan": "^1.4", + "scrutinizer/ocular": "^1.6", + "squizlabs/php_codesniffer": "^2.3 || ^3.0", + "symfony/finder": "^4.4|^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0" + }, + "bin": [ + "bin/json5" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/global.php" + ], + "psr-4": { + "ColinODell\\Json5\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Developer" + } + ], + "description": "UTF-8 compatible JSON5 parser for PHP", + "homepage": "https://github.com/colinodell/json5", + "keywords": [ + "JSON5", + "json", + "json5_decode", + "json_decode" + ], + "support": { + "issues": "https://github.com/colinodell/json5/issues", + "source": "https://github.com/colinodell/json5/tree/v2.3.0" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://www.patreon.com/colinodell", + "type": "patreon" + } + ], + "time": "2022-12-27T16:44:40+00:00" + }, + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.5", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-01-17T14:14:24+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.11.10", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-08-27T18:44:43+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "time": "2022-03-02T22:36:06+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "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": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "httpsoft/http-basis", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-basis.git", + "reference": "63c4306c516375e3fa08358a58194e159bfbb984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-basis/zipball/63c4306c516375e3fa08358a58194e159bfbb984", + "reference": "63c4306c516375e3fa08358a58194e159bfbb984", + "shasum": "" + }, + "require": { + "ext-json": "*", + "httpsoft/http-cookie": "^1.1", + "httpsoft/http-emitter": "^1.1", + "httpsoft/http-error-handler": "^1.1", + "httpsoft/http-message": "^1.1", + "httpsoft/http-response": "^1.1", + "httpsoft/http-router": "^1.1", + "httpsoft/http-runner": "^1.1", + "httpsoft/http-server-request": "^1.1", + "php": "^7.4|^8.0", + "psr/container": "^1.0|^2.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1|^2.0|^3.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-handler-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "devanych/di-container": "^2.1", + "devanych/view-renderer": "^1.0", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Basis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Simple and fast HTTP microframework implementing PSR standards", + "homepage": "https://httpsoft.org/", + "keywords": [ + "PSR-11", + "http", + "http-framework", + "microframework", + "php", + "psr-15", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/basis", + "issues": "https://github.com/httpsoft/http-basis/issues", + "source": "https://github.com/httpsoft/http-basis" + }, + "time": "2023-05-05T22:15:06+00:00" + }, + { + "name": "httpsoft/http-cookie", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-cookie.git", + "reference": "c304b7d9888ed27bf2bcdb95762d87263a457644" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-cookie/zipball/c304b7d9888ed27bf2bcdb95762d87263a457644", + "reference": "c304b7d9888ed27bf2bcdb95762d87263a457644", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "psr/http-message": "^1.1|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Cookie\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Managing cookies with PSR-7 support", + "homepage": "https://httpsoft.org/", + "keywords": [ + "cookie", + "cookies", + "http", + "http-cookie", + "php", + "psr-15", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/cookie", + "issues": "https://github.com/httpsoft/http-cookie/issues", + "source": "https://github.com/httpsoft/http-cookie" + }, + "time": "2023-05-05T20:37:18+00:00" + }, + { + "name": "httpsoft/http-emitter", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-emitter.git", + "reference": "b09e2834b6d40e022f0c0eb7417f97f496e376b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-emitter/zipball/b09e2834b6d40e022f0c0eb7417f97f496e376b6", + "reference": "b09e2834b6d40e022f0c0eb7417f97f496e376b6", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "psr/http-message": "^1.1|^2.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Emitter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Emitting of PSR-7 Response implementation", + "homepage": "https://httpsoft.org/", + "keywords": [ + "emitter", + "http", + "http-emitter", + "http-message", + "php", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/emitter", + "issues": "https://github.com/httpsoft/http-emitter/issues", + "source": "https://github.com/httpsoft/http-emitter" + }, + "time": "2023-05-05T20:18:44+00:00" + }, + { + "name": "httpsoft/http-error-handler", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-error-handler.git", + "reference": "f5bfb10cdf6de7420e59d8342ba12f19749e7bc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-error-handler/zipball/f5bfb10cdf6de7420e59d8342ba12f19749e7bc1", + "reference": "f5bfb10cdf6de7420e59d8342ba12f19749e7bc1", + "shasum": "" + }, + "require": { + "httpsoft/http-response": "^1.1", + "php": "^7.4|^8.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-handler-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "httpsoft/http-server-request": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\ErrorHandler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Error handling PSR-7 and PSR-15 components", + "homepage": "https://httpsoft.org/", + "keywords": [ + "error-handler", + "error-middleware", + "http", + "http-error", + "php", + "psr-15", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/error-handler", + "issues": "https://github.com/httpsoft/http-error-handler/issues", + "source": "https://github.com/httpsoft/http-error-handler" + }, + "time": "2023-05-05T21:14:04+00:00" + }, + { + "name": "httpsoft/http-response", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-response.git", + "reference": "6e9d25a540506ba8a5165817fdd856a856e32c02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-response/zipball/6e9d25a540506ba8a5165817fdd856a856e32c02", + "reference": "6e9d25a540506ba8a5165817fdd856a856e32c02", + "shasum": "" + }, + "require": { + "httpsoft/http-message": "^1.1", + "php": "^7.4|^8.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Response\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "PSR-7 Response implementations", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-message", + "http-response", + "php", + "psr-7", + "responses" + ], + "support": { + "docs": "https://httpsoft.org/docs/response", + "issues": "https://github.com/httpsoft/http-response/issues", + "source": "https://github.com/httpsoft/http-response" + }, + "time": "2023-05-05T20:55:06+00:00" + }, + { + "name": "httpsoft/http-router", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-router.git", + "reference": "460ee40b15ceb61d86a7c511d321c4580960601e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-router/zipball/460ee40b15ceb61d86a7c511d321c4580960601e", + "reference": "460ee40b15ceb61d86a7c511d321c4580960601e", + "shasum": "" + }, + "require": { + "httpsoft/http-runner": "^1.1", + "php": "^7.4|^8.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "httpsoft/http-message": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Router\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Simple and fast HTTP request router providing PSR-7 and PSR-15", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-router", + "php", + "psr-15", + "psr-7", + "route", + "router" + ], + "support": { + "docs": "https://httpsoft.org/docs/router", + "issues": "https://github.com/httpsoft/http-router/issues", + "source": "https://github.com/httpsoft/http-router" + }, + "time": "2023-05-05T22:02:47+00:00" + }, + { + "name": "httpsoft/http-runner", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-runner.git", + "reference": "00ddc625dbf8f0acb786e899575537c7e8327847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-runner/zipball/00ddc625dbf8f0acb786e899575537c7e8327847", + "reference": "00ddc625dbf8f0acb786e899575537c7e8327847", + "shasum": "" + }, + "require": { + "httpsoft/http-emitter": "^1.1", + "php": "^7.4|^8.0", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.1|^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0", + "psr/http-server-handler-implementation": "1.0", + "psr/http-server-middleware-implementation": "1.0" + }, + "require-dev": { + "devanych/di-container": "^2.1", + "httpsoft/http-message": "^1.1", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\Runner\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Running PSR-7 components and building PSR-15 middleware pipelines", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-middleware", + "middleware-pipeline", + "php", + "psr-15", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/runner", + "issues": "https://github.com/httpsoft/http-runner/issues", + "source": "https://github.com/httpsoft/http-runner" + }, + "time": "2023-05-05T21:47:55+00:00" + }, + { + "name": "httpsoft/http-server-request", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/httpsoft/http-server-request.git", + "reference": "3d773c8bcaa1c44793d35842fcd82a9d5fd5f193" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/httpsoft/http-server-request/zipball/3d773c8bcaa1c44793d35842fcd82a9d5fd5f193", + "reference": "3d773c8bcaa1c44793d35842fcd82a9d5fd5f193", + "shasum": "" + }, + "require": { + "httpsoft/http-message": "^1.1", + "php": "^7.4|^8.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^4.9|^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "HttpSoft\\ServerRequest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Evgeniy Zyubin", + "email": "mail@devanych.ru", + "homepage": "https://devanych.ru/", + "role": "Founder and lead developer" + } + ], + "description": "Infrastructure for creating PSR-7 ServerRequest and UploadedFile", + "homepage": "https://httpsoft.org/", + "keywords": [ + "http", + "http-message", + "http-server-request", + "php", + "psr-7" + ], + "support": { + "docs": "https://httpsoft.org/docs/server-request", + "issues": "https://github.com/httpsoft/http-server-request/issues", + "source": "https://github.com/httpsoft/http-server-request" + }, + "time": "2023-05-05T19:55:05+00:00" + }, + { + "name": "infection/abstract-testframework-adapter", + "version": "0.5.0", + "source": { + "type": "git", + "url": "https://github.com/infection/abstract-testframework-adapter.git", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "reference": "18925e20d15d1a5995bb85c9dc09e8751e1e069b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^2.17", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Infection\\AbstractTestFramework\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } + ], + "description": "Abstract Test Framework Adapter for Infection", + "support": { + "issues": "https://github.com/infection/abstract-testframework-adapter/issues", + "source": "https://github.com/infection/abstract-testframework-adapter/tree/0.5.0" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-08-17T18:49:12+00:00" + }, + { + "name": "infection/extension-installer", + "version": "0.1.2", + "source": { + "type": "git", + "url": "https://github.com/infection/extension-installer.git", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "reference": "9b351d2910b9a23ab4815542e93d541e0ca0cdcf", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1 || ^2.0" + }, + "require-dev": { + "composer/composer": "^1.9 || ^2.0", + "friendsofphp/php-cs-fixer": "^2.18, <2.19", + "infection/infection": "^0.15.2", + "php-coveralls/php-coveralls": "^2.4", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.10", + "phpstan/phpstan-phpunit": "^0.12.6", + "phpstan/phpstan-strict-rules": "^0.12.2", + "phpstan/phpstan-webmozart-assert": "^0.12.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.8" + }, + "type": "composer-plugin", + "extra": { + "class": "Infection\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "Infection\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } + ], + "description": "Infection Extension Installer", + "support": { + "issues": "https://github.com/infection/extension-installer/issues", + "source": "https://github.com/infection/extension-installer/tree/0.1.2" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-10-20T22:08:34+00:00" + }, + { + "name": "infection/include-interceptor", + "version": "0.2.5", + "source": { + "type": "git", + "url": "https://github.com/infection/include-interceptor.git", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7", + "reference": "0cc76d95a79d9832d74e74492b0a30139904bdf7", + "shasum": "" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "infection/infection": "^0.15.0", + "phan/phan": "^2.4 || ^3", + "php-coveralls/php-coveralls": "^2.2", + "phpstan/phpstan": "^0.12.8", + "phpunit/phpunit": "^8.5", + "vimeo/psalm": "^3.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Infection\\StreamWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com" + } + ], + "description": "Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.", + "support": { + "issues": "https://github.com/infection/include-interceptor/issues", + "source": "https://github.com/infection/include-interceptor/tree/0.2.5" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2021-08-09T10:03:57+00:00" + }, + { + "name": "infection/infection", + "version": "0.27.10", + "source": { + "type": "git", + "url": "https://github.com/infection/infection.git", + "reference": "873cd3335774a114bef9ca93388e623bf362d820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/infection/infection/zipball/873cd3335774a114bef9ca93388e623bf362d820", + "reference": "873cd3335774a114bef9ca93388e623bf362d820", + "shasum": "" + }, + "require": { + "colinodell/json5": "^2.2", + "composer-runtime-api": "^2.0", + "composer/xdebug-handler": "^2.0 || ^3.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "fidry/cpu-core-counter": "^0.4.0 || ^0.5.0 || ^1.0", + "infection/abstract-testframework-adapter": "^0.5.0", + "infection/extension-installer": "^0.1.0", + "infection/include-interceptor": "^0.2.5", + "justinrainbow/json-schema": "^5.2.10", + "nikic/php-parser": "^4.15.1", + "ondram/ci-detector": "^4.1.0", + "php": "^8.1", + "sanmai/later": "^0.1.1", + "sanmai/pipeline": "^5.1 || ^6", + "sebastian/diff": "^3.0.2 || ^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "thecodingmachine/safe": "^2.1.2", + "webmozart/assert": "^1.11" + }, + "conflict": { + "antecedent/patchwork": "<2.1.25", + "dg/bypass-finals": "<1.4.1", + "phpunit/php-code-coverage": ">9,<9.1.4 || >9.2.17,<9.2.21" + }, + "require-dev": { + "brianium/paratest": "^6.11", + "ext-simplexml": "*", + "fidry/makefile": "^0.2.0", + "helmich/phpunit-json-assert": "^3.0", + "phpspec/prophecy": "^1.15", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.10.15", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpstan/phpstan-strict-rules": "^1.1.0", + "phpstan/phpstan-webmozart-assert": "^1.0.2", + "phpunit/phpunit": "^9.6", + "rector/rector": "^0.16.0", + "sidz/phpstan-rules": "^0.4.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "thecodingmachine/phpstan-safe-rule": "^1.2.0" + }, + "bin": [ + "bin/infection" + ], + "type": "library", + "autoload": { + "psr-4": { + "Infection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Maks Rafalko", + "email": "maks.rafalko@gmail.com", + "homepage": "https://twitter.com/maks_rafalko" + }, + { + "name": "Oleg Zhulnev", + "homepage": "https://github.com/sidz" + }, + { + "name": "Gert de Pagter", + "homepage": "https://github.com/BackEndTea" + }, + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com", + "homepage": "https://twitter.com/tfidry" + }, + { + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com", + "homepage": "https://www.alexeykopytko.com" + }, + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.", + "keywords": [ + "coverage", + "mutant", + "mutation framework", + "mutation testing", + "testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/infection/infection/issues", + "source": "https://github.com/infection/infection/tree/0.27.10" + }, + "funding": [ + { + "url": "https://github.com/infection", + "type": "github" + }, + { + "url": "https://opencollective.com/infection", + "type": "open_collective" + } + ], + "time": "2024-02-20T00:08:52+00:00" + }, + { + "name": "jolicode/jolinotif", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/jolicode/JoliNotif.git", + "reference": "b34dac1826c8d33e9fd5c300546261e94f1ebdb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/b34dac1826c8d33e9fd5c300546261e94f1ebdb8", + "reference": "b34dac1826c8d33e9fd5c300546261e94f1ebdb8", + "shasum": "" + }, + "require": { + "jolicode/php-os-helper": "^0.1.0", + "php": ">=8.1", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/deprecation-contracts": "^3", + "symfony/process": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-ffi": "Needed to send notifications via libnotify on Linux" + }, + "bin": [ + "jolinotif" + ], + "type": "library", + "autoload": { + "psr-4": { + "Joli\\JoliNotif\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Loïck Piera", + "email": "pyrech@gmail.com" + } + ], + "description": "Send desktop notifications on Windows, Linux, MacOS.", + "keywords": [ + "MAC", + "growl", + "linux", + "notification", + "windows" + ], + "support": { + "issues": "https://github.com/jolicode/JoliNotif/issues", + "source": "https://github.com/jolicode/JoliNotif/tree/v2.7.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/jolicode/jolinotif", + "type": "tidelift" + } + ], + "time": "2024-06-01T06:05:49+00:00" + }, + { + "name": "jolicode/php-os-helper", + "version": "v0.1.0", + "source": { + "type": "git", + "url": "https://github.com/jolicode/php-os-helper.git", + "reference": "1622ad8bbcab98e62b5c041397e8519f10d90e29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jolicode/php-os-helper/zipball/1622ad8bbcab98e62b5c041397e8519f10d90e29", + "reference": "1622ad8bbcab98e62b5c041397e8519f10d90e29", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "JoliCode\\PhpOsHelper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Loïck Piera", + "email": "pyrech@gmail.com" + } + ], + "description": "Helpers to detect the OS of the machine where PHP is running.", + "keywords": [ + "linux", + "os", + "osx", + "php", + "windows" + ], + "support": { + "issues": "https://github.com/jolicode/php-os-helper/issues", + "source": "https://github.com/jolicode/php-os-helper/tree/v0.1.0" + }, + "time": "2023-12-03T12:46:03+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" + }, + "time": "2024-07-06T21:00:26+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v4.5.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" + }, + "time": "2024-09-08T10:13:13+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.19.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ed4c8949a32986043e977dbe14776c14d644c45", + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.2" + }, + "time": "2024-09-17T19:36:00+00:00" + }, + { + "name": "nyholm/psr7", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2024-09-09T07:06:30+00:00" + }, + { + "name": "ondram/ci-detector", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/OndraM/ci-detector.git", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.13.2", + "lmc/coding-standard": "^3.0.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpunit/phpunit": "^9.6.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "OndraM\\CiDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ondřej Machulda", + "email": "ondrej.machulda@gmail.com" + } + ], + "description": "Detect continuous integration environment and provide unified access to properties of current build", + "keywords": [ + "CircleCI", + "Codeship", + "Wercker", + "adapter", + "appveyor", + "aws", + "aws codebuild", + "azure", + "azure devops", + "azure pipelines", + "bamboo", + "bitbucket", + "buddy", + "ci-info", + "codebuild", + "continuous integration", + "continuousphp", + "devops", + "drone", + "github", + "gitlab", + "interface", + "jenkins", + "pipelines", + "sourcehut", + "teamcity", + "travis" + ], + "support": { + "issues": "https://github.com/OndraM/ci-detector/issues", + "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" + }, + "time": "2024-03-12T13:22:30+00:00" + }, + { + "name": "openlss/lib-array2xml", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nullivex/lib-array2xml.git", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "LSS": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Bryan Tong", + "email": "bryan@nullivex.com", + "homepage": "https://www.nullivex.com" + }, + { + "name": "Tony Butler", + "email": "spudz76@gmail.com", + "homepage": "https://www.nullivex.com" + } + ], + "description": "Array2XML conversion library credit to lalit.org", + "homepage": "https://www.nullivex.com", + "keywords": [ + "array", + "array conversion", + "xml", + "xml conversion" + ], + "support": { + "issues": "https://github.com/nullivex/lib-array2xml/issues", + "source": "https://github.com/nullivex/lib-array2xml/tree/master" + }, + "time": "2019-03-29T20:06:56+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" + }, + "time": "2024-05-21T05:55:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + }, + "time": "2024-02-23T11:10:43+00:00" + }, + { + "name": "phpspec/php-diff", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/phpspec/php-diff.git", + "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/fc1156187f9f6c8395886fe85ed88a0a245d72e9", + "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9", + "shasum": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Diff": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Chris Boulton", + "homepage": "http://github.com/chrisboulton" + } + ], + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", + "support": { + "source": "https://github.com/phpspec/php-diff/tree/v1.1.3" + }, + "time": "2020-09-18T13:47:07+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.30.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "51b95ec8670af41009e2b2b56873bad96682413e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/51b95ec8670af41009e2b2b56873bad96682413e", + "reference": "51b95ec8670af41009e2b2b56873bad96682413e", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "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.30.1" + }, + "time": "2024-09-07T20:13:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.32", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "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/9.2.32" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.21", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-09-19T10:50:18+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.4", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" + }, + "time": "2024-06-10T01:18:23+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "roave/infection-static-analysis-plugin", + "version": "1.35.0", + "source": { + "type": "git", + "url": "https://github.com/Roave/infection-static-analysis-plugin.git", + "reference": "3cb32845c5f758913a4b9eafd91ae18eafc26d82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/infection-static-analysis-plugin/zipball/3cb32845c5f758913a4b9eafd91ae18eafc26d82", + "reference": "3cb32845c5f758913a4b9eafd91ae18eafc26d82", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "infection/infection": "0.27.10", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "sanmai/later": "^0.1.4", + "vimeo/psalm": "^4.30.0 || ^5.15" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0.0", + "phpunit/phpunit": "^10.5.12" + }, + "bin": [ + "bin/roave-infection-static-analysis-plugin" + ], + "type": "library", + "autoload": { + "psr-4": { + "Roave\\InfectionStaticAnalysis\\": "src/Roave/InfectionStaticAnalysis" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Static analysis on top of mutation testing - prevents escaped mutants from being invalid according to static analysis", + "support": { + "issues": "https://github.com/Roave/infection-static-analysis-plugin/issues", + "source": "https://github.com/Roave/infection-static-analysis-plugin/tree/1.35.0" + }, + "time": "2024-03-10T11:55:48+00:00" + }, + { + "name": "roave/security-advisories", + "version": "dev-latest", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "4b6b927472278272e2411f4341dba95d96c8c7d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/4b6b927472278272e2411f4341dba95d96c8c7d7", + "reference": "4b6b927472278272e2411f4341dba95d96c8c7d7", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "admidio/admidio": "<4.3.10", + "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", + "aheinze/cockpit": "<2.2", + "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.04.6", + "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", + "aimeos/ai-client-html": ">=2020.04.1,<2020.10.27|>=2021.04.1,<2021.10.22|>=2022.04.1,<2022.10.13|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.04.7", + "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9", + "aimeos/aimeos-core": ">=2022.04.1,<2022.10.17|>=2023.04.1,<2023.10.17|>=2024.04.1,<2024.04.7", + "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", + "airesvsg/acf-to-rest-api": "<=3.1", + "akaunting/akaunting": "<2.1.13", + "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", + "alextselegidis/easyappointments": "<1.5", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<=1.7.2|>=2,<=2.1", + "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "andreapollastri/cipi": "<=3.1.15", + "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", + "apache-solr-for-typo3/solr": "<2.8.3", + "apereo/phpcas": "<1.6", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3", + "appwrite/server-ce": "<=1.2.1", + "arc/web": "<3", + "area17/twill": "<1.2.5|>=2,<2.5.3", + "artesaos/seotools": "<0.17.2", + "asymmetricrypt/asymmetricrypt": "<9.9.99", + "athlon1600/php-proxy": "<=5.1", + "athlon1600/php-proxy-app": "<=3", + "austintoddj/canvas": "<=3.4.2", + "auth0/wordpress": "<=4.6", + "automad/automad": "<2.0.0.0-alpha5", + "automattic/jetpack": "<9.8", + "awesome-support/awesome-support": "<=6.0.7", + "aws/aws-sdk-php": "<3.288.1", + "azuracast/azuracast": "<0.18.3", + "backdrop/backdrop": "<1.27.3|>=1.28,<1.28.2", + "backpack/crud": "<3.4.9", + "bacula-web/bacula-web": "<8.0.0.0-RC2-dev", + "badaso/core": "<2.7", + "bagisto/bagisto": "<2.1", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "barryvdh/laravel-translation-manager": "<0.6.2", + "barzahlen/barzahlen-php": "<2.0.1", + "baserproject/basercms": "<5.0.9", + "bassjobsen/bootstrap-3-typeahead": ">4.0.2", + "bbpress/bbpress": "<2.6.5", + "bcosca/fatfree": "<3.7.2", + "bedita/bedita": "<4", + "bigfork/silverstripe-form-capture": ">=3,<3.1.1", + "billz/raspap-webgui": "<=3.1.4", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "blueimp/jquery-file-upload": "==6.4.4", + "bmarshall511/wordpress_zero_spam": "<5.2.13", + "bolt/bolt": "<3.7.2", + "bolt/core": "<=4.2", + "born05/craft-twofactorauthentication": "<3.3.4", + "bottelet/flarepoint": "<2.2.1", + "bref/bref": "<2.1.17", + "brightlocal/phpwhois": "<=4.2.5", + "brotkrueml/codehighlight": "<2.7", + "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", + "brotkrueml/typo3-matomo-integration": "<1.3.2", + "buddypress/buddypress": "<7.2.1", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "bytefury/crater": "<6.0.2", + "cachethq/cachet": "<2.5.1", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cardgate/magento2": "<2.0.33", + "cardgate/woocommerce": "<=3.1.15", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cart2quote/module-quotation-encoded": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "catfan/medoo": "<1.7.5", + "causal/oidc": "<2.1", + "cecil/cecil": "<7.47.1", + "centreon/centreon": "<22.10.15", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "chriskacerguis/codeigniter-restserver": "<=2.7.1", + "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", + "ckeditor/ckeditor": "<4.24", + "cockpit-hq/cockpit": "<2.7|==2.7", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", + "codeigniter/framework": "<3.1.9", + "codeigniter4/framework": "<4.4.7", + "codeigniter4/shield": "<1.0.0.0-beta8", + "codiad/codiad": "<=2.8.4", + "composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7", + "concrete5/concrete5": "<9.3.4", + "concrete5/core": "<8.5.8|>=9,<9.1", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", + "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/core": "<3.5.39", + "contao/core-bundle": "<4.13.49|>=5,<5.3.15|>=5.4,<5.4.3", + "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", + "contao/managed-edition": "<=1.5", + "corveda/phpsandbox": "<1.3.5", + "cosenary/instagram": "<=2.3", + "craftcms/cms": "<4.6.2|>=5,<=5.2.2", + "croogo/croogo": "<4", + "cuyz/valinor": "<0.12", + "czim/file-handling": "<1.5|>=2,<2.3", + "czproject/git-php": "<4.0.3", + "damienharper/auditor-bundle": "<5.2.6", + "dapphp/securimage": "<3.6.6", + "darylldoyle/safe-svg": "<1.9.10", + "datadog/dd-trace": ">=0.30,<0.30.2", + "datatables/datatables": "<1.10.10", + "david-garcia/phpwhois": "<=4.3.1", + "dbrisinajumi/d2files": "<1", + "dcat/laravel-admin": "<=2.1.3", + "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", + "desperado/xml-bundle": "<=0.1.7", + "devgroup/dotplant": "<2020.09.14-dev", + "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", + "doctrine/annotations": "<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": "<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<0.7.2", + "doctrine/mongodb-odm": "<1.0.2", + "doctrine/mongodb-odm-bundle": "<3.0.1", + "doctrine/orm": ">=1,<1.2.4|>=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<19.0.2", + "dompdf/dompdf": "<2.0.4", + "doublethreedigital/guest-entries": "<3.1.2", + "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<10.1.8|>=10.2,<10.2.2|==11.9999999.9999999.9999999-dev", + "drupal/core-recommended": "==11.9999999.9999999.9999999-dev", + "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4|==11.9999999.9999999.9999999-dev", + "duncanmcclean/guest-entries": "<3.1.2", + "dweeves/magmi": "<=0.7.24", + "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.1.2", + "ecodev/newsletter": "<=4", + "ectouch/ectouch": "<=2.7.2", + "egroupware/egroupware": "<23.1.20240624", + "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", + "enhavo/enhavo-app": "<=0.13.1", + "enshrined/svg-sanitize": "<0.15", + "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", + "evolutioncms/evolution": "<=3.2.3", + "exceedone/exment": "<4.4.3|>=5,<5.0.3", + "exceedone/laravel-admin": "<2.2.3|==3", + "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26|>=3.3,<3.3.39", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", + "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.35", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev|>=3.3,<3.3.40", + "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/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", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "facturascripts/facturascripts": "<=2022.08", + "fastly/magento2": "<1.2.26", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=2.1.1", + "fenom/fenom": "<=2.12.1", + "filegator/filegator": "<7.8", + "filp/whoops": "<2.1.13", + "fineuploader/php-traditional-server": "<=1.2.2", + "firebase/php-jwt": "<6", + "fisharebest/webtrees": "<=2.1.18", + "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", + "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", + "flarum/core": "<1.8.5", + "flarum/flarum": "<0.1.0.0-beta8", + "flarum/framework": "<1.8.5", + "flarum/mentions": "<1.6.3", + "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", + "flarum/tags": "<=0.1.0.0-beta13", + "floriangaerber/magnesium": "<0.3.1", + "fluidtypo3/vhs": "<5.1.1", + "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", + "fof/upload": "<1.2.3", + "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.11.1", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<=11.5.1", + "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1,<1.3.5", + "friendsofsymfony1/swiftmailer": ">=4,<5.4.13|>=6,<6.2.5", + "friendsofsymfony1/symfony1": ">=1.1,<1.5.19", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", + "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.3", + "froxlor/froxlor": "<=2.2.0.0-RC3", + "frozennode/administrator": "<=5.0.12", + "fuel/core": "<1.8.1", + "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "genix/cms": "<=1.1.11", + "getformwork/formwork": "<1.13.1|==2.0.0.0-beta1", + "getgrav/grav": "<1.7.46", + "getkirby/cms": "<=3.6.6.5|>=3.7,<=3.7.5.4|>=3.8,<=3.8.4.3|>=3.9,<=3.9.8.1|>=3.10,<=3.10.1|>=4,<=4.3", + "getkirby/kirby": "<=2.5.12", + "getkirby/panel": "<2.5.14", + "getkirby/starterkit": "<=3.7.0.2", + "gilacms/gila": "<=1.15.4", + "gleez/cms": "<=1.3|==2", + "globalpayments/php-sdk": "<2", + "gogentooss/samlbase": "<1.2.7", + "google/protobuf": "<3.15", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<2.2.1", + "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<6.1.17", + "gugoan/economizzer": "<=0.9.0.0-beta1", + "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", + "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", + "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", + "harvesthq/chosen": "<1.8.7", + "helloxz/imgurl": "<=2.31", + "hhxsv5/laravel-s": "<3.7.36", + "hillelcoren/invoice-ninja": "<5.3.35", + "himiklab/yii2-jqgrid-widget": "<1.0.8", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "httpsoft/http-message": "<1.0.12", + "hyn/multi-tenant": ">=5.6,<5.7.2", + "ibexa/admin-ui": ">=4.2,<4.2.3|>=4.6.0.0-beta1,<4.6.9", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.6|>=4.6,<4.6.2", + "ibexa/fieldtype-richtext": ">=4.6,<4.6.10", + "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", + "ibexa/post-install": "<=1.0.4", + "ibexa/solr": ">=4.5,<4.5.4", + "ibexa/user": ">=4,<4.4.3", + "icecoder/icecoder": "<=8.1", + "idno/known": "<=1.3.1", + "ilicmiljan/secure-props": ">=1.2,<1.2.2", + "illuminate/auth": "<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", + "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", + "imdbphp/imdbphp": "<=5.1.1", + "impresscms/impresscms": "<=1.4.5", + "impresspages/impresspages": "<=1.0.12", + "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", + "in2code/powermail": "<7.5.1|>=8,<8.5.1|>=9,<10.9.1|>=11,<12.4.1", + "innologi/typo3-appointments": "<2.0.6", + "intelliants/subrion": "<4.2.2", + "inter-mediator/inter-mediator": "==5.5", + "ipl/web": "<0.10.1", + "islandora/islandora": ">=2,<2.4.1", + "ivankristianto/phpwhois": "<=4.3", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "james-heinrich/getid3": "<1.9.21", + "james-heinrich/phpthumb": "<1.7.12", + "jasig/phpcas": "<1.3.3", + "jcbrand/converse.js": "<3.3.3", + "johnbillion/wp-crontrol": "<1.16.2", + "joomla/application": "<1.0.13", + "joomla/archive": "<1.1.12|>=2,<2.0.1", + "joomla/filesystem": "<1.6.2|>=2,<2.0.1", + "joomla/filter": "<1.4.4|>=2,<2.0.1", + "joomla/framework": "<1.5.7|>=2.5.4,<=3.8.12", + "joomla/input": ">=2,<2.0.2", + "joomla/joomla-cms": ">=2.5,<3.9.12", + "joomla/session": "<1.3.1", + "joyqi/hyper-down": "<=2.4.27", + "jsdecena/laracom": "<2.0.9", + "jsmitty12/phpwhois": "<5.1", + "juzaweb/cms": "<=3.4", + "jweiland/events2": "<8.3.8|>=9,<9.0.6", + "kazist/phpwhois": "<=4.2.6", + "kelvinmo/simplexrd": "<3.1.1", + "kevinpapst/kimai2": "<1.16.7", + "khodakhah/nodcms": "<=3", + "kimai/kimai": "<=2.20.1", + "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", + "klaviyo/magento2-extension": ">=1,<3", + "knplabs/knp-snappy": "<=1.4.2", + "kohana/core": "<3.3.3", + "krayin/laravel-crm": "<1.2.2", + "kreait/firebase-php": ">=3.2,<3.8.1", + "kumbiaphp/kumbiapp": "<=1.1.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", + "laminas/laminas-http": "<2.14.2", + "laravel/fortify": "<1.11.1", + "laravel/framework": "<6.20.44|>=7,<7.30.6|>=8,<8.75", + "laravel/laravel": ">=5.4,<5.4.22", + "laravel/socialite": ">=1,<2.0.10", + "latte/latte": "<2.10.8", + "lavalite/cms": "<=9|==10.1", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", + "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "libreform/libreform": ">=2,<=2.0.8", + "librenms/librenms": "<2017.08.18", + "liftkit/database": "<2.13.2", + "lightsaml/lightsaml": "<1.3.5", + "limesurvey/limesurvey": "<3.27.19", + "livehelperchat/livehelperchat": "<=3.91", + "livewire/livewire": ">2.2.4,<2.2.6|>=3.3.5,<3.4.9", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "luyadev/yii-helpers": "<1.2.1", + "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch9|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch7|==2.4.7|>=2.4.7.0-patch1,<2.4.7.0-patch2", + "magento/core": "<=1.9.4.5", + "magento/magento1ce": "<1.9.4.3-dev", + "magento/magento1ee": ">=1,<1.14.4.3-dev", + "magento/product-community-edition": "<2.4.4.0-patch9|>=2.4.5,<2.4.5.0-patch8|>=2.4.6,<2.4.6.0-patch6|>=2.4.7,<2.4.7.0-patch1", + "magneto/core": "<1.9.4.4-dev", + "maikuolan/phpmussel": ">=1,<1.6", + "mainwp/mainwp": "<=4.4.3.3", + "mantisbt/mantisbt": "<2.26.2", + "marcwillmann/turn": "<0.3.3", + "matyhtf/framework": "<3.0.6", + "mautic/core": "<4.4.13|>=5,<5.1.1", + "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", + "mdanter/ecc": "<2", + "mediawiki/core": "<1.36.2", + "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,<2.0.1", + "microsoft/microsoft-graph-beta": "<2.0.1", + "microsoft/microsoft-graph-core": "<2.0.2", + "microweber/microweber": "<=2.0.16", + "mikehaertl/php-shellcommand": "<1.6.1", + "miniorange/miniorange-saml": "<1.4.3", + "mittwald/typo3_forum": "<1.2.1", + "mobiledetect/mobiledetectlib": "<2.8.32", + "modx/revolution": "<=2.8.3.0-patch", + "mojo42/jirafeau": "<4.4", + "mongodb/mongodb": ">=1,<1.9.2", + "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<4.3.5|>=4.4.0.0-beta,<4.4.1", + "mos/cimage": "<0.7.19", + "movim/moxl": ">=0.8,<=0.10", + "movingbytes/social-network": "<=1.2.1", + "mpdf/mpdf": "<=7.1.7", + "munkireport/comment": "<4.1", + "munkireport/managedinstalls": "<2.6", + "munkireport/munki_facts": "<1.5", + "munkireport/munkireport": ">=2.5.3,<5.6.3", + "munkireport/reportdata": "<3.5", + "munkireport/softwareupdate": "<1.6", + "mustache/mustache": ">=2,<2.14.1", + "namshi/jose": "<2.2", + "nategood/httpful": "<1", + "neoan3-apps/template": "<1.1.1", + "neorazorx/facturascripts": "<2022.04", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/media-browser": "<7.3.19|>=8,<8.0.16|>=8.1,<8.1.11|>=8.2,<8.2.11|>=8.3,<8.3.9", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", + "neos/swiftmailer": "<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<3.0.10", + "nonfiction/nterchange": "<4.1.1", + "notrinos/notrinos-erp": "<=0.7", + "noumo/easyii": "<=0.9", + "novaksolutions/infusionsoft-php-sdk": "<1", + "nukeviet/nukeviet": "<4.5.02", + "nyholm/psr7": "<1.6.1", + "nystudio107/craft-seomatic": "<3.4.12", + "nzedb/nzedb": "<0.8", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", + "october/october": "<=3.4.4", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.15", + "omeka/omeka-s": "<4.0.3", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": ">=1,<1.9.3|>=2,<2.1.5", + "open-web-analytics/open-web-analytics": "<1.7.4", + "opencart/opencart": ">=0", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<20.10.1", + "opensolutions/vimbadmin": "<=3.0.15", + "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", + "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/crm-call-bundle": ">=4.2,<=4.2.5|>=5,<5.0.4|>=5.1,<5.1.1", + "oro/customer-portal": ">=4.1,<=4.1.13|>=4.2,<=4.2.10|>=5,<=5.0.11|>=5.1,<=5.1.3", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<=4.2.10|>=5,<=5.0.12|>=5.1,<=5.1.3", + "oveleon/contao-cookiebar": "<1.16.3|>=2,<2.1.3", + "oxid-esales/oxideshop-ce": "<4.5", + "oxid-esales/paymorrow-module": ">=1,<1.0.2|>=2,<2.0.1", + "packbackbooks/lti-1-3-php-library": "<5", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": "<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/ecc": "<2.0.1", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<4.6.2", + "paypal/adaptivepayments-sdk-php": "<=3.9.2", + "paypal/invoice-sdk-php": "<=3.9", + "paypal/merchant-sdk-php": "<3.12", + "paypal/permissions-sdk-php": "<=3.9.1", + "pear/archive_tar": "<1.4.14", + "pear/auth": "<1.2.4", + "pear/crypt_gpg": "<1.6.7", + "pear/pear": "<=1.10.1", + "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.2", + "php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5", + "php-mod/curl": "<2.3.2", + "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1", + "phpems/phpems": ">=6,<=6.1.3", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<5.2.1", + "phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5", + "phpoffice/common": "<0.2.9", + "phpoffice/phpexcel": "<1.8", + "phpoffice/phpspreadsheet": "<1.29.1|>=2,<2.1.1|>=2.2,<2.2.1", + "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", + "phpservermon/phpservermon": "<3.6", + "phpsysinfo/phpsysinfo": "<3.4.3", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "phpxmlrpc/phpxmlrpc": "<4.9.2", + "pi/pi": "<=2.5", + "pimcore/admin-ui-classic-bundle": "<1.5.4", + "pimcore/customer-management-framework-bundle": "<4.0.6", + "pimcore/data-hub": "<1.2.4", + "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", + "pimcore/demo": "<10.3", + "pimcore/ecommerce-framework-bundle": "<1.0.10", + "pimcore/perspective-editor": "<1.5.1", + "pimcore/pimcore": "<11.2.4", + "pixelfed/pixelfed": "<0.11.11", + "plotly/plotly.js": "<2.25.2", + "pocketmine/bedrock-protocol": "<8.0.2", + "pocketmine/pocketmine-mp": "<5.11.2", + "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/blockreassurance": "<=5.1.3", + "prestashop/blockwishlist": ">=2,<2.1.1", + "prestashop/contactform": ">=1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": "<8.1.6", + "prestashop/productcomments": "<5.0.2", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.4|>=1.5,<1.7.4", + "processwire/processwire": "<=3.0.229", + "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<1.11.6", + "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", + "pxlrbt/filament-excel": "<1.1.14|>=2.0.0.0-alpha,<2.3.3", + "pyrocms/pyrocms": "<=3.9.1", + "qcubed/qcubed": "<=3.1.1", + "quickapps/cms": "<=2.0.0.0-beta2", + "rainlab/blog-plugin": "<1.4.1", + "rainlab/debugbar-plugin": "<3.1", + "rainlab/user-plugin": "<=1.4.5", + "rankmath/seo-by-rank-math": "<=1.0.95", + "rap2hpoutre/laravel-log-viewer": "<0.13", + "react/http": ">=0.7,<1.9", + "really-simple-plugins/complianz-gdpr": "<6.4.2", + "redaxo/source": "<=5.15.1", + "remdex/livehelperchat": "<4.29", + "reportico-web/reportico": "<=8.1", + "rhukster/dom-sanitizer": "<1.0.7", + "rmccue/requests": ">=1.6,<1.8", + "robrichards/xmlseclibs": ">=1,<3.0.4", + "roots/soil": "<4.1", + "rudloff/alltube": "<3.0.3", + "s-cart/core": "<6.9", + "s-cart/s-cart": "<6.9", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": "<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "sfroemken/url_redirect": "<=1.2.1", + "sheng/yiicms": "<=1.2", + "shopware/core": "<=6.5.8.12|>=6.6,<=6.6.5", + "shopware/platform": "<=6.5.8.12|>=6.6,<=6.6.5", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=5.7.17", + "shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev", + "shopxo/shopxo": "<=6.1", + "showdoc/showdoc": "<2.10.4", + "silverstripe-australia/advancedreports": ">=1,<=2", + "silverstripe/admin": "<1.13.19|>=2,<2.1.8", + "silverstripe/assets": ">=1,<1.11.1", + "silverstripe/cms": "<4.11.3", + "silverstripe/comments": ">=1.3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<5.2.16", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3", + "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", + "silverstripe/recipe-cms": ">=4.5,<4.5.3", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/reports": "<5.2.3", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4|>=2.1,<2.1.2", + "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", + "silverstripe/subsites": ">=2,<2.6.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3|>=5,<5.4.2", + "silverstripe/versioned-admin": ">=1,<1.11.1", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4|==5.0.0.0-alpha12", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplesamlphp/simplesamlphp-module-openid": "<1", + "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", + "simplesamlphp/xml-security": "==1.6.11", + "simplito/elliptic-php": "<1.0.6", + "sitegeist/fluid-components": "<3.5", + "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", + "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", + "slim/slim": "<2.6", + "slub/slub-events": "<3.0.3", + "smarty/smarty": "<4.5.3|>=5,<5.1.1", + "snipe/snipe-it": "<6.4.2", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spatie/browsershot": "<3.57.4", + "spatie/image-optimizer": "<1.7.3", + "spipu/html2pdf": "<5.2.8", + "spoon/library": "<1.4.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<24.05.1", + "statamic/cms": "<4.46|>=5.3,<5.6.2", + "stormpath/sdk": "<9.9.99", + "studio-42/elfinder": "<=2.1.64", + "studiomitte/friendlycaptcha": "<0.1.4", + "subhh/libconnect": "<7.0.8|>=8,<8.1", + "sukohi/surpass": "<1", + "sulu/form-bundle": ">=2,<2.5.3", + "sulu/sulu": "<1.6.44|>=2,<2.4.17|>=2.5,<2.5.13", + "sumocoders/framework-user-bundle": "<1.4", + "superbig/craft-audit": "<3.0.2", + "swag/paypal": "<5.4.4", + "swiftmailer/swiftmailer": "<6.2.5", + "swiftyedit/swiftyedit": "<1.2", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": "<1.10.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", + "sylius/resource-bundle": ">=1,<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.12.19|>=1.13.0.0-alpha1,<1.13.4", + "symbiote/silverstripe-multivaluefield": ">=3,<3.1", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-seed": "<6.0.3", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<5.3.15|>=5.4.3,<5.4.4|>=6.0.3,<6.0.4", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2|>=5.4,<5.4.31|>=6,<6.3.8", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/translation": ">=2,<2.0.17", + "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/ux-autocomplete": "<2.11.2", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "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|>=2.2.0.0-beta1,<2.2.0.0-beta2", + "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.7.4", + "terminal42/contao-tablelookupwizard": "<3.3.5", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "thinkcmf/thinkcmf": "<6.0.8", + "thorsten/phpmyfaq": "<3.2.2", + "tikiwiki/tiki-manager": "<=17.1", + "timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1", + "tinymce/tinymce": "<7.2", + "tinymighty/wiki-seo": "<1.2.2", + "titon/framework": "<9.9.99", + "tobiasbg/tablepress": "<=2.0.0.0-RC1", + "topthink/framework": "<6.0.17|>=6.1,<=8.0.4", + "topthink/think": "<=6.1.1", + "topthink/thinkphp": "<=3.2.3", + "torrentpier/torrentpier": "<=2.4.3", + "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", + "tribalsystems/zenario": "<9.5.60602", + "truckersmp/phpwhois": "<=4.3.1", + "ttskch/pagination-service-provider": "<1", + "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2", + "twig/twig": "<1.44.8|>=2,<2.16.1|>=3,<3.11.1|>=3.12,<3.14", + "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", + "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": "<=8.7.56|>=9,<=9.5.47|>=10,<=10.4.44|>=11,<=11.5.36|>=12,<=12.4.14|>=13,<=13.1", + "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", + "typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-frontend": "<4.3.9|>=4.4,<4.4.5", + "typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8", + "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "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.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", + "uvdesk/core-framework": "<=1.1.1", + "vanilla/safecurl": "<0.9.2", + "verbb/comments": "<1.5.5", + "verbb/formie": "<2.1.6", + "verbb/image-resizer": "<2.0.9", + "verbb/knock-knock": "<1.2.8", + "verot/class.upload.php": "<=2.1.6", + "villagedefrance/opencart-overclocked": "<=1.11.1", + "vova07/yii2-fileapi-widget": "<0.1.9", + "vrana/adminer": "<4.8.1", + "vufind/vufind": ">=2,<9.1.1", + "waldhacker/hcaptcha": "<2.1.2", + "wallabag/tcpdf": "<6.2.22", + "wallabag/wallabag": "<2.6.7", + "wanglelecc/laracms": "<=1.0.3", + "web-auth/webauthn-framework": ">=3.3,<3.3.4|>=4.5,<4.9", + "web-auth/webauthn-lib": ">=4.5,<4.9", + "web-feet/coastercms": "==5.5", + "webbuilders-group/silverstripe-kapost-bridge": "<0.4", + "webcoast/deferred-image-processing": "<1.0.2", + "webklex/laravel-imap": "<5.3", + "webklex/php-imap": "<5.3", + "webpa/webpa": "<3.1.2", + "wikibase/wikibase": "<=1.39.3", + "wikimedia/parsoid": "<0.12.2", + "willdurand/js-translation-bundle": "<2.1.1", + "winter/wn-backend-module": "<1.2.4", + "winter/wn-dusk-plugin": "<2.1", + "winter/wn-system-module": "<1.2.4", + "wintercms/winter": "<=1.2.3", + "wireui/wireui": "<1.19.3|>=2,<2.1.3", + "woocommerce/woocommerce": "<6.6|>=8.8,<8.8.5|>=8.9,<8.9.3", + "wp-cli/wp-cli": ">=0.12,<2.5", + "wp-graphql/wp-graphql": "<=1.14.5", + "wp-premium/gravityforms": "<2.4.21", + "wpanel/wpanel4-cms": "<=4.3.1", + "wpcloud/wp-stateless": "<3.2", + "wpglobus/wpglobus": "<=1.9.6", + "wwbn/avideo": "<14.3", + "xataface/xataface": "<3", + "xpressengine/xpressengine": "<3.0.15", + "yab/quarx": "<2.4.5", + "yeswiki/yeswiki": "<4.1", + "yetiforce/yetiforce-crm": "<=6.4", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": "<1.1.29", + "yiisoft/yii2": "<2.0.49.4-dev", + "yiisoft/yii2-authclient": "<2.2.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.43", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<=2.2.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", + "yuan1994/tpadmin": "<=1.3.12", + "zencart/zencart": "<=1.5.7.0-beta", + "zendesk/zendesk_api_client_php": "<2.2.11", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": "<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": "<1.8.4", + "zendframework/zend-feed": "<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": "<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": "<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": "<2.0.2", + "zendframework/zendrest": "<2.0.2", + "zendframework/zendservice-amazon": "<2.0.3", + "zendframework/zendservice-api": "<1", + "zendframework/zendservice-audioscrobbler": "<2.0.2", + "zendframework/zendservice-nirvanix": "<2.0.2", + "zendframework/zendservice-slideshare": "<2.0.2", + "zendframework/zendservice-technorati": "<2.0.2", + "zendframework/zendservice-windowsazure": "<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zenstruck/collection": "<0.2.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<=6.1.53" + }, + "default-branch": true, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "keywords": [ + "dev" + ], + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2024-09-19T17:04:43+00:00" + }, + { + "name": "sanmai/later", + "version": "0.1.4", + "source": { + "type": "git", + "url": "https://github.com/sanmai/later.git", + "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sanmai/later/zipball/e24c4304a4b1349c2a83151a692cec0c10579f60", + "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.35.1", + "infection/infection": ">=0.27.6", + "phan/phan": ">=2", + "php-coveralls/php-coveralls": "^2.0", + "phpstan/phpstan": ">=1.4.5", + "phpunit/phpunit": ">=9.5 <10", + "vimeo/psalm": ">=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Later\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" + } + ], + "description": "Later: deferred wrapper object", + "support": { + "issues": "https://github.com/sanmai/later/issues", + "source": "https://github.com/sanmai/later/tree/0.1.4" + }, + "funding": [ + { + "url": "https://github.com/sanmai", + "type": "github" + } + ], + "time": "2023-10-24T00:25:28+00:00" + }, + { + "name": "sanmai/pipeline", + "version": "v6.11", + "source": { + "type": "git", + "url": "https://github.com/sanmai/pipeline.git", + "reference": "a5fa2a6c6ca93efa37e7c24aab72f47448a6b110" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sanmai/pipeline/zipball/a5fa2a6c6ca93efa37e7c24aab72f47448a6b110", + "reference": "a5fa2a6c6ca93efa37e7c24aab72f47448a6b110", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.8", + "friendsofphp/php-cs-fixer": "^3.17", + "infection/infection": ">=0.10.5", + "league/pipeline": "^0.3 || ^1.0", + "phan/phan": ">=1.1", + "php-coveralls/php-coveralls": "^2.4.1", + "phpstan/phpstan": ">=0.10", + "phpunit/phpunit": ">=9.4", + "vimeo/psalm": ">=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v6.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Pipeline\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Alexey Kopytko", + "email": "alexey@kopytko.com" + } + ], + "description": "General-purpose collections pipeline", + "support": { + "issues": "https://github.com/sanmai/pipeline/issues", + "source": "https://github.com/sanmai/pipeline/tree/v6.11" + }, + "funding": [ + { + "url": "https://github.com/sanmai", + "type": "github" + } + ], + "time": "2024-06-15T03:11:19+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:33:00+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "spatie/phpunit-watcher", + "version": "1.23.6", + "source": { + "type": "git", + "url": "https://github.com/spatie/phpunit-watcher.git", + "reference": "c192fff763810c8378511bcf0069df4b91478866" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/phpunit-watcher/zipball/c192fff763810c8378511bcf0069df4b91478866", + "reference": "c192fff763810c8378511bcf0069df4b91478866", + "shasum": "" + }, + "require": { + "clue/stdio-react": "^2.4", + "jolicode/jolinotif": "^2.2", + "php": "^7.2 | ^8.0 | ^8.1", + "symfony/console": "^5 | ^6", + "symfony/finder": "^5.4 | ^6", + "symfony/process": "^5.4 | ^6", + "symfony/yaml": "^5.2 | ^6", + "yosymfony/resource-watcher": "^2.0 | ^3.0" + }, + "conflict": { + "symfony/console": "<5.2", + "yosymfony/resource-watcher": "<2.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.6 | ^9.0" + }, + "bin": [ + "phpunit-watcher" + ], + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\PhpUnitWatcher\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Automatically rerun PHPUnit tests when source code changes", + "homepage": "https://github.com/spatie/phpunit-watcher", + "keywords": [ + "phpunit-watcher", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/phpunit-watcher/issues", + "source": "https://github.com/spatie/phpunit-watcher/tree/1.23.6" + }, + "time": "2022-01-31T11:57:13+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v6.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/62ab90b92066ef6cce5e79365625b4b1432464c8", + "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/dom-crawler": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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/v6.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:49:08+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "3a61e2e4fbda3fb7fb5d83620c30fef726139e1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/3a61e2e4fbda3fb7fb5d83620c30fef726139e1c", + "reference": "3a61e2e4fbda3fb7fb5d83620c30fef726139e1c", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-09T12:56:10+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v6.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "105b56a0305d219349edeb60a800082eca864e4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/105b56a0305d219349edeb60a800082eca864e4b", + "reference": "105b56a0305d219349edeb60a800082eca864e4b", + "shasum": "" + }, + "require": { + "masterminds/html5": "^2.6", + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "symfony/css-selector": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:49:08+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "52b3c9cce673b014915445a432339f282e002ce6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b3c9cce673b014915445a432339f282e002ce6", + "reference": "52b3c9cce673b014915445a432339f282e002ce6", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-29T07:35:21+00:00" + }, + { + "name": "thecodingmachine/safe", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "files": [ + "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", + "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "deprecated/strings.php", + "lib/special_cases.php", + "deprecated/mysqli.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + }, + "time": "2023-04-05T11:54:14+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "vimeo/psalm", + "version": "4.30.0", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0bc6e25d89f649e4f36a534f330f8bb4643dd69", + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer/package-versions-deprecated": "^1.8.0", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.13", + "openlss/lib-array2xml": "^1.0", + "php": "^7.1|^8", + "sebastian/diff": "^3.0 || ^4.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.25", + "webmozart/path-util": "^2.3" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", + "ext-curl": "*", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpdocumentor/reflection-docblock": "^5", + "phpmyadmin/sql-parser": "5.1.0||dev-master", + "phpspec/prophecy": ">=1.9.0", + "phpstan/phpdoc-parser": "1.2.* || 1.6.4", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.3 || ^5.0 || ^6.0", + "weirdan/prophecy-shim": "^1.0 || ^2.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php", + "src/spl_object_id.php" + ], + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php" + ], + "support": { + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm/tree/4.30.0" + }, + "time": "2022-11-06T20:37:08+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webmozart/path-util", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/path-util.git", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "webmozart/assert": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\PathUtil\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", + "support": { + "issues": "https://github.com/webmozart/path-util/issues", + "source": "https://github.com/webmozart/path-util/tree/2.3.0" + }, + "abandoned": "symfony/filesystem", + "time": "2015-12-17T08:42:14+00:00" + }, + { + "name": "yiisoft/active-record", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/active-record.git", + "reference": "5c4151d74fc8025261b0d3921f649513261a0144" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/active-record/zipball/5c4151d74fc8025261b0d3921f649513261a0144", + "reference": "5c4151d74fc8025261b0d3921f649513261a0144", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.1", + "yiisoft/db": "dev-master" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.34", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25", + "yiisoft/aliases": "^2.0", + "yiisoft/arrays": "^3.1", + "yiisoft/cache": "^3.0", + "yiisoft/db-sqlite": "dev-master", + "yiisoft/di": "^1.0", + "yiisoft/factory": "^1.2", + "yiisoft/json": "^1.0", + "yiisoft/middleware-dispatcher": "^5.2" + }, + "suggest": { + "yiisoft/arrays": "For \\Yiisoft\\Arrays\\ArrayableInterface support", + "yiisoft/db-mssql": "For MSSQL database support", + "yiisoft/db-mysql": "For MySQL database support", + "yiisoft/db-oracle": "For Oracle database support", + "yiisoft/db-pgsql": "For PostgreSQL database support", + "yiisoft/db-sqlite": "For SQLite database support", + "yiisoft/factory": "For factory support", + "yiisoft/middleware-dispatcher": "For middleware support" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\ActiveRecord\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii ActiveRecord Library", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "Active Record", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/active-record/issues?state=open", + "source": "https://github.com/yiisoft/active-record", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-16T09:27:14+00:00" + }, + { + "name": "yiisoft/db", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/db.git", + "reference": "c765ca43af502dda2ec2aed01f368d0f15e8b290" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/db/zipball/c765ca43af502dda2ec2aed01f368d0f15e8b290", + "reference": "c765ca43af502dda2ec2aed01f368d0f15e8b290", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-pdo": "*", + "php": "^8.1", + "psr/log": "^2.0|^3.0", + "psr/simple-cache": "^2.0|^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^10.0", + "rector/rector": "^1.1.1", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.25", + "yiisoft/aliases": "^3.0", + "yiisoft/cache-file": "^3.1", + "yiisoft/di": "^1.0", + "yiisoft/event-dispatcher": "^1.0", + "yiisoft/json": "^1.0", + "yiisoft/log": "^2.0", + "yiisoft/var-dumper": "^1.5", + "yiisoft/yii-debug": "dev-master" + }, + "default-branch": true, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Db\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Database", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "database", + "dbal", + "query-builder", + "sql", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/db/issues/issues?state=open", + "source": "https://github.com/yiisoft/db", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-16T10:51:44+00:00" + }, + { + "name": "yiisoft/translator-extractor", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/translator-extractor.git", + "reference": "673bb3d79dc866f3d85d97cc49e1a9a24b2bc727" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/translator-extractor/zipball/673bb3d79dc866f3d85d97cc49e1a9a24b2bc727", + "reference": "673bb3d79dc866f3d85d97cc49e1a9a24b2bc727", + "shasum": "" + }, + "require": { + "php": "^8.0", + "symfony/console": "^5.4|^6.0|^7.0", + "yiisoft/friendly-exception": "^1.0", + "yiisoft/translator": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "rector/rector": "^1.0", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6", + "yiisoft/di": "^1.0", + "yiisoft/yii-console": "^2.0" + }, + "type": "library", + "extra": { + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di-console": "di-console.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\TranslatorExtractor\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii message extractor", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "dev", + "extractor", + "i18n", + "internationalization" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/translator-extractor/issues?state=open", + "source": "https://github.com/yiisoft/translator-extractor", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + } + ], + "time": "2024-02-13T13:39:33+00:00" + }, + { + "name": "yiisoft/yii-debug-viewer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-debug-viewer.git", + "reference": "89f2704b5ae8aa8e188732c3dd4a8947a2cad774" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-debug-viewer/zipball/89f2704b5ae8aa8e188732c3dd4a8947a2cad774", + "reference": "89f2704b5ae8aa8e188732c3dd4a8947a2cad774", + "shasum": "" + }, + "require": { + "nyholm/psr7": "^1.3", + "php": "^8.0", + "psr/http-message": "^1.1", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "yiisoft/assets": "^4.0", + "yiisoft/data-response": "^2.0", + "yiisoft/http": "^1.1", + "yiisoft/router": "^3.1", + "yiisoft/view": "^10.0", + "yiisoft/yii-view-renderer": "^7.1" + }, + "require-dev": { + "httpsoft/http-message": "^1.0.5", + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "phpunit/phpunit": "^9.5", + "psr/container": "^2.0", + "psr/http-factory": "^1.0", + "psr/log": "^2.0|^3.0", + "rector/rector": "^0.15.1", + "roave/infection-static-analysis-plugin": "^1.21", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.18", + "yiisoft/aliases": "^3.0", + "yiisoft/config": "^1.0", + "yiisoft/di": "^1.1", + "yiisoft/error-handler": "^3.0", + "yiisoft/factory": "^1.0", + "yiisoft/files": "^2.0", + "yiisoft/injector": "^1.0", + "yiisoft/log": "^2.0", + "yiisoft/log-target-file": "^3.0", + "yiisoft/router-fastroute": "^3.0", + "yiisoft/yii-console": "^2.0", + "yiisoft/yii-event": "^2.0", + "yiisoft/yii-http": "^1.0", + "yiisoft/yii-runner-console": "^2.0", + "yiisoft/yii-runner-http": "^2.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin-environments": { + "yii-debug-viewer-app": { + "params": [ + "app/params.php" + ], + "di": "app/di.php", + "di-console": "$di", + "di-web": [ + "$di", + "app/web.php" + ], + "events": [], + "events-web": "$events", + "events-console": "$events", + "di-providers": [], + "di-providers-web": "$di-providers", + "di-providers-console": "$di-providers", + "routes": [], + "bootstrap": [], + "bootstrap-web": "$bootstrap", + "bootstrap-console": "$bootstrap" + } + }, + "config-plugin": { + "di-web": "di-web.php", + "params": "params.php", + "routes": "routes.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Debug\\Viewer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Debug Viewer", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "debug", + "dev", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-debug-viewer/issues?state=open", + "source": "https://github.com/yiisoft/yii-debug-viewer", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-06T13:05:25+00:00" + }, + { + "name": "yiisoft/yii-gii", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-gii.git", + "reference": "cf2f56d5d3a0a8fb00636da24ba13df3a1082350" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-gii/zipball/cf2f56d5d3a0a8fb00636da24ba13df3a1082350", + "reference": "cf2f56d5d3a0a8fb00636da24ba13df3a1082350", + "shasum": "" + }, + "require": { + "httpsoft/http-basis": "^1.1", + "php": "^8.1", + "phpspec/php-diff": "^1.1.3", + "psr/http-message": "^1.0|^2.0", + "symfony/console": "^6.0|^7.0", + "yiisoft/active-record": "dev-master", + "yiisoft/aliases": "^3.0", + "yiisoft/arrays": "^2.1|^3.0", + "yiisoft/csrf": "^2.1.1", + "yiisoft/data-response": "^2.0", + "yiisoft/db": "*", + "yiisoft/friendly-exception": "^1.1", + "yiisoft/http": "^1.2", + "yiisoft/hydrator": "^1.0", + "yiisoft/injector": "^1.1", + "yiisoft/input-http": "^1.0", + "yiisoft/json": "^1.0", + "yiisoft/router": "^3.0", + "yiisoft/strings": "^2.1", + "yiisoft/validator": "^2.0", + "yiisoft/yii-console": "^2.0", + "yiisoft/yii-middleware": "^1.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.5", + "phpunit/phpunit": "^10.2", + "rector/rector": "^1.2", + "roave/infection-static-analysis-plugin": "^1.23", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^5.13", + "yiisoft/cache": "^3.0", + "yiisoft/db-sqlite": "dev-master", + "yiisoft/di": "^1.1", + "yiisoft/dummy-provider": "^1.0", + "yiisoft/event-dispatcher": "^1.0", + "yiisoft/files": "^2.0", + "yiisoft/log": "^2.0", + "yiisoft/translator": "^3.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "config-plugin": { + "params": "params.php", + "di": "di.php", + "routes": "routes.php" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Gii\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Yii Framework Code Generator Extension", + "keywords": [ + "code generator", + "dev", + "gii", + "yii" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-gii/issues?state=open", + "source": "https://github.com/yiisoft/yii-gii", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-09-19T05:22:18+00:00" + }, + { + "name": "yiisoft/yii-testing", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii-testing.git", + "reference": "d90cce1c6f33990ad2a0f9e7781da88202a57229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii-testing/zipball/d90cce1c6f33990ad2a0f9e7781da88202a57229", + "reference": "d90cce1c6f33990ad2a0f9e7781da88202a57229", + "shasum": "" + }, + "require": { + "php": "^8.0", + "phpunit/phpunit": "^9.5", + "psr/container": "^2.0", + "psr/http-message": "^1.0|^2.0", + "yiisoft/config": "^1.1", + "yiisoft/di": "^1.1", + "yiisoft/error-handler": "^3.0", + "yiisoft/yii-http": "^1.0", + "yiisoft/yii-runner": "^2.0", + "yiisoft/yii-runner-console": "^2.0", + "yiisoft/yii-runner-http": "^2.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.2", + "nyholm/psr7": "^1.5", + "rector/rector": "^0.15.2", + "roave/infection-static-analysis-plugin": "^1.16", + "spatie/phpunit-watcher": "^1.23", + "vimeo/psalm": "^4.30|^5.6" + }, + "default-branch": true, + "type": "library", + "extra": { + "config-plugin-options": { + "build-merge-plan": false + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Yii\\Testing\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "yii-testing", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "testing", + "yii3" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii-testing/issues?state=open", + "source": "https://github.com/yiisoft/yii-testing", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2024-06-04T07:04:12+00:00" + }, + { + "name": "yosymfony/resource-watcher", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yosymfony/resource-watcher.git", + "reference": "2f197cee0231c06db865d4ad2d8d7cd3faead2f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yosymfony/resource-watcher/zipball/2f197cee0231c06db865d4ad2d8d7cd3faead2f8", + "reference": "2f197cee0231c06db865d4ad2d8d7cd3faead2f8", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/finder": "^2.7|^3.0|^4.0|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7", + "symfony/filesystem": "^2.7|^3.0|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Yosymfony\\ResourceWatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Victor Puertas", + "email": "vpgugr@gmail.com" + } + ], + "description": "A simple resource watcher using Symfony Finder", + "homepage": "http://yosymfony.com", + "keywords": [ + "finder", + "resources", + "symfony", + "watcher" + ], + "support": { + "issues": "https://github.com/yosymfony/resource-watcher/issues", + "source": "https://github.com/yosymfony/resource-watcher/tree/master" + }, + "time": "2020-06-10T14:58:36+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "cebe/markdown": 20, + "yiisoft/data": 20, + "yiisoft/data-cycle": 20, + "yiisoft/rate-limiter": 20, + "yiisoft/yii-bootstrap5": 20, + "yiisoft/yii-dataview": 20, + "yiisoft/yii-debug": 20, + "yiisoft/yii-debug-api": 20, + "roave/security-advisories": 20, + "yiisoft/yii-debug-viewer": 20, + "yiisoft/yii-gii": 20, + "yiisoft/yii-testing": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.1", + "ext-mbstring": "*", + "ext-pdo_sqlite": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/blog/package-lock.json b/blog/package-lock.json new file mode 100644 index 000000000..aaad2a1c1 --- /dev/null +++ b/blog/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "yii3-demo-blog", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==" + } + } +} From e16af99fdf647ca95b469778246c50e4a6955c20 Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Mon, 23 Sep 2024 14:46:01 +0500 Subject: [PATCH 55/58] Use PHP 8.3 (#628) Co-authored-by: Sergei Predvoditelev --- .github/workflows/blog-api_build.yml | 16 +- .github/workflows/blog-api_dependency.yml | 2 +- .github/workflows/blog-api_static.yml | 2 +- .github/workflows/blog_build.yml | 16 +- .github/workflows/blog_dependency.yml | 2 +- .github/workflows/blog_static.yml | 2 +- blog-api/composer.json | 9 +- blog-api/composer.lock | 131 +++++----- blog/composer.json | 12 +- blog/composer.lock | 298 ++++++++++++---------- 10 files changed, 235 insertions(+), 255 deletions(-) diff --git a/.github/workflows/blog-api_build.yml b/.github/workflows/blog-api_build.yml index 2e9e3a62a..efe9c8cc2 100644 --- a/.github/workflows/blog-api_build.yml +++ b/.github/workflows/blog-api_build.yml @@ -49,8 +49,7 @@ jobs: - windows-latest php: - - 8.1 - - 8.2 + - 8.3 steps: - name: Checkout @@ -96,18 +95,5 @@ jobs: working-directory: ${{ env.working_directory }} - name: Run tests codeception - if: matrix.os != 'ubuntu-latest' || matrix.php != '8.0' run: vendor/bin/codecept run working-directory: ${{ env.working_directory }} - - - name: Run tests codeception with coverage - if: matrix.os == 'ubuntu-latest' && matrix.php == '8.0' - run: vendor/bin/codecept run --coverage-xml - working-directory: ${{ env.working_directory }} - - - name: Upload coverage to codecov - if: matrix.os == 'ubuntu-latest' && matrix.php == '8.0' - uses: codecov/codecov-action@v3 - with: - file: tests/_output/coverage.xml - working-directory: ${{ env.working_directory }} diff --git a/.github/workflows/blog-api_dependency.yml b/.github/workflows/blog-api_dependency.yml index 47f523773..d526f88f4 100644 --- a/.github/workflows/blog-api_dependency.yml +++ b/.github/workflows/blog-api_dependency.yml @@ -45,7 +45,7 @@ jobs: - ubuntu-latest php: - - 8.1 + - 8.3 steps: - name: Checkout diff --git a/.github/workflows/blog-api_static.yml b/.github/workflows/blog-api_static.yml index 047577c97..a03440643 100644 --- a/.github/workflows/blog-api_static.yml +++ b/.github/workflows/blog-api_static.yml @@ -45,7 +45,7 @@ jobs: - ubuntu-latest php: - - 8.1 + - 8.3 steps: - name: Checkout diff --git a/.github/workflows/blog_build.yml b/.github/workflows/blog_build.yml index 5bbfbdc06..2a5d99df1 100644 --- a/.github/workflows/blog_build.yml +++ b/.github/workflows/blog_build.yml @@ -49,8 +49,7 @@ jobs: - windows-latest php: - - 8.1 - - 8.2 + - 8.3 steps: - name: Checkout @@ -100,18 +99,5 @@ jobs: working-directory: ${{ env.working_directory }} - name: Run tests codeception - if: matrix.os != 'ubuntu-latest' || matrix.php != '8.0' run: vendor/bin/codecept run working-directory: ${{ env.working_directory }} - - - name: Run tests codeception with coverage - if: matrix.os == 'ubuntu-latest' && matrix.php == '8.0' - run: vendor/bin/codecept run --coverage-xml - working-directory: ${{ env.working_directory }} - - - name: Upload coverage to codecov - if: matrix.os == 'ubuntu-latest' && matrix.php == '8.0' - uses: codecov/codecov-action@v3 - with: - file: tests/_output/coverage.xml - working-directory: ${{ env.working_directory }} diff --git a/.github/workflows/blog_dependency.yml b/.github/workflows/blog_dependency.yml index 08c7d5742..ba23cc45e 100644 --- a/.github/workflows/blog_dependency.yml +++ b/.github/workflows/blog_dependency.yml @@ -45,7 +45,7 @@ jobs: - ubuntu-latest php: - - 8.1 + - 8.3 steps: - name: Checkout diff --git a/.github/workflows/blog_static.yml b/.github/workflows/blog_static.yml index 6e5c3a323..7307f85d2 100644 --- a/.github/workflows/blog_static.yml +++ b/.github/workflows/blog_static.yml @@ -45,7 +45,7 @@ jobs: - ubuntu-latest php: - - 8.1 + - 8.3 steps: - name: Checkout diff --git a/blog-api/composer.json b/blog-api/composer.json index 7cf0e3f8e..b0d568068 100644 --- a/blog-api/composer.json +++ b/blog-api/composer.json @@ -20,9 +20,10 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "php": "^8.1", + "php": "8.3.*", "ext-intl": "*", "cebe/markdown": "^1.2@dev", + "cycle/annotated": "^3.5", "cycle/database": "^2.0", "cycle/entity-behavior": "^1.0", "cycle/orm": "^2.0", @@ -96,12 +97,6 @@ "yiisoft/yii-gii": "dev-master", "yiisoft/yii-testing": "dev-master" }, - "conflict": { - "symfony/css-selector": ">6", - "symfony/event-dispatcher": ">6", - "symfony/filesystem": ">6", - "symfony/string": ">6" - }, "autoload": { "psr-4": { "App\\": "src" diff --git a/blog-api/composer.lock b/blog-api/composer.lock index 5bb65d02c..455cc220c 100644 --- a/blog-api/composer.lock +++ b/blog-api/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": "d86c96605f9d1d39dd9180e463d6a632", + "content-hash": "dc4fd69b5a2310f8fdc45cd66be2b5ee", "packages": [ { "name": "alexkart/curl-builder", @@ -2384,7 +2384,7 @@ }, { "name": "spiral/core", - "version": "3.14.2", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/spiral/core.git", @@ -2408,6 +2408,7 @@ "phpunit/phpunit": "^10.1", "vimeo/psalm": "^5.9" }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -2526,22 +2527,22 @@ }, { "name": "spiral/logger", - "version": "3.14.1", + "version": "3.14.3", "source": { "type": "git", "url": "https://github.com/spiral/logger.git", - "reference": "c832f1038aed009f6cd1f5194ca7a14bb533723a" + "reference": "146fbf7fb320ea4708f5158e21f8fd4d48aa5b0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/logger/zipball/c832f1038aed009f6cd1f5194ca7a14bb533723a", - "reference": "c832f1038aed009f6cd1f5194ca7a14bb533723a", + "url": "https://api.github.com/repos/spiral/logger/zipball/146fbf7fb320ea4708f5158e21f8fd4d48aa5b0e", + "reference": "146fbf7fb320ea4708f5158e21f8fd4d48aa5b0e", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "1 - 3", - "spiral/core": "^3.14.1" + "spiral/core": "^3.14.3" }, "require-dev": { "mockery/mockery": "^1.5", @@ -2593,7 +2594,7 @@ "type": "github" } ], - "time": "2024-09-04T10:56:14+00:00" + "time": "2024-09-11T17:40:26+00:00" }, { "name": "spiral/pagination", @@ -2739,31 +2740,31 @@ }, { "name": "spiral/tokenizer", - "version": "3.14.1", + "version": "3.14.3", "source": { "type": "git", "url": "https://github.com/spiral/tokenizer.git", - "reference": "0526f2b73725d002278b786ad7b16f27968aef63" + "reference": "b5bf2ed89880d91c228bf1e3ebfda2b508c008ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/tokenizer/zipball/0526f2b73725d002278b786ad7b16f27968aef63", - "reference": "0526f2b73725d002278b786ad7b16f27968aef63", + "url": "https://api.github.com/repos/spiral/tokenizer/zipball/b5bf2ed89880d91c228bf1e3ebfda2b508c008ff", + "reference": "b5bf2ed89880d91c228bf1e3ebfda2b508c008ff", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=8.1", - "spiral/core": "^3.14.1", - "spiral/logger": "^3.14.1", + "spiral/core": "^3.14.3", + "spiral/logger": "^3.14.3", "symfony/finder": "^5.3.7 || ^6.0 || ^7.0" }, "require-dev": { "mockery/mockery": "^1.6", "phpunit/phpunit": "^10.1", "spiral/attributes": "^2.8|^3.0", - "spiral/boot": "^3.14.1", - "spiral/files": "^3.14.1", + "spiral/boot": "^3.14.3", + "spiral/files": "^3.14.3", "vimeo/psalm": "^5.9" }, "type": "library", @@ -2811,7 +2812,7 @@ "type": "github" } ], - "time": "2024-09-04T10:56:34+00:00" + "time": "2024-09-11T17:40:38+00:00" }, { "name": "swagger-api/swagger-ui", @@ -3733,33 +3734,35 @@ }, { "name": "symfony/string", - "version": "v6.0.0", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ba727797426af0f587f4800566300bdc0cda0777" + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ba727797426af0f587f4800566300bdc0cda0777", - "reference": "ba727797426af0f587f4800566300bdc0cda0777", + "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -3798,7 +3801,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.0.0" + "source": "https://github.com/symfony/string/tree/v7.1.5" }, "funding": [ { @@ -3814,7 +3817,7 @@ "type": "tidelift" } ], - "time": "2021-10-29T07:35:21+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/var-dumper", @@ -15390,20 +15393,20 @@ }, { "name": "symfony/css-selector", - "version": "v6.0.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "3a61e2e4fbda3fb7fb5d83620c30fef726139e1c" + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/3a61e2e4fbda3fb7fb5d83620c30fef726139e1c", - "reference": "3a61e2e4fbda3fb7fb5d83620c30fef726139e1c", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -15435,7 +15438,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.0.0" + "source": "https://github.com/symfony/css-selector/tree/v7.1.1" }, "funding": [ { @@ -15451,7 +15454,7 @@ "type": "tidelift" } ], - "time": "2021-09-09T12:56:10+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/dom-crawler", @@ -15522,24 +15525,25 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.0.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576" + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2774908d5ae32fd94e363e7cbbd87462712c4576", - "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/event-dispatcher-contracts": "^2|^3" + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -15547,17 +15551,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -15585,7 +15585,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/v6.0.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" }, "funding": [ { @@ -15601,27 +15601,30 @@ "type": "tidelift" } ], - "time": "2021-11-23T19:05:29+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/filesystem", - "version": "v6.0.0", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "52b3c9cce673b014915445a432339f282e002ce6" + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b3c9cce673b014915445a432339f282e002ce6", - "reference": "52b3c9cce673b014915445a432339f282e002ce6", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a", + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, "type": "library", "autoload": { "psr-4": { @@ -15648,7 +15651,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.0.0" + "source": "https://github.com/symfony/filesystem/tree/v7.1.5" }, "funding": [ { @@ -15664,7 +15667,7 @@ "type": "tidelift" } ], - "time": "2021-10-29T07:35:21+00:00" + "time": "2024-09-17T09:16:35+00:00" }, { "name": "symfony/process", @@ -16815,7 +16818,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.1", + "php": ">=8.3 <8.4", "ext-intl": "*" }, "platform-dev": [], diff --git a/blog/composer.json b/blog/composer.json index 8f22a7fc9..6070af108 100644 --- a/blog/composer.json +++ b/blog/composer.json @@ -16,10 +16,11 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "php": "^8.1", + "php": "8.3.*", "ext-mbstring": "*", "ext-pdo_sqlite": "*", "cebe/markdown": "^1.2@dev", + "cycle/annotated": "^3.5", "cycle/database": "^2.0", "cycle/entity-behavior": "^1.0", "cycle/orm": "^2.0", @@ -110,15 +111,6 @@ "yiisoft/yii-gii": "dev-master", "yiisoft/yii-testing": "dev-master" }, - "conflict": { - "symfony/css-selector": ">6", - "symfony/event-dispatcher": ">6", - "symfony/filesystem": ">6", - "symfony/http-client": ">6", - "symfony/mime": ">6", - "symfony/options-resolver": ">6", - "symfony/string": ">6" - }, "autoload": { "psr-4": { "App\\": "src" diff --git a/blog/composer.lock b/blog/composer.lock index 495911af0..0098933d5 100644 --- a/blog/composer.lock +++ b/blog/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": "68e0227778f36c08acce8314597a744c", + "content-hash": "628abcc3114cb9c57125ac8e1459634b", "packages": [ { "name": "alexkart/curl-builder", @@ -3498,7 +3498,7 @@ }, { "name": "spiral/core", - "version": "3.14.2", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/spiral/core.git", @@ -3522,6 +3522,7 @@ "phpunit/phpunit": "^10.1", "vimeo/psalm": "^5.9" }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -3640,22 +3641,22 @@ }, { "name": "spiral/logger", - "version": "3.14.1", + "version": "3.14.3", "source": { "type": "git", "url": "https://github.com/spiral/logger.git", - "reference": "c832f1038aed009f6cd1f5194ca7a14bb533723a" + "reference": "146fbf7fb320ea4708f5158e21f8fd4d48aa5b0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/logger/zipball/c832f1038aed009f6cd1f5194ca7a14bb533723a", - "reference": "c832f1038aed009f6cd1f5194ca7a14bb533723a", + "url": "https://api.github.com/repos/spiral/logger/zipball/146fbf7fb320ea4708f5158e21f8fd4d48aa5b0e", + "reference": "146fbf7fb320ea4708f5158e21f8fd4d48aa5b0e", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "1 - 3", - "spiral/core": "^3.14.1" + "spiral/core": "^3.14.3" }, "require-dev": { "mockery/mockery": "^1.5", @@ -3707,7 +3708,7 @@ "type": "github" } ], - "time": "2024-09-04T10:56:14+00:00" + "time": "2024-09-11T17:40:26+00:00" }, { "name": "spiral/pagination", @@ -3853,31 +3854,31 @@ }, { "name": "spiral/tokenizer", - "version": "3.14.1", + "version": "3.14.3", "source": { "type": "git", "url": "https://github.com/spiral/tokenizer.git", - "reference": "0526f2b73725d002278b786ad7b16f27968aef63" + "reference": "b5bf2ed89880d91c228bf1e3ebfda2b508c008ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spiral/tokenizer/zipball/0526f2b73725d002278b786ad7b16f27968aef63", - "reference": "0526f2b73725d002278b786ad7b16f27968aef63", + "url": "https://api.github.com/repos/spiral/tokenizer/zipball/b5bf2ed89880d91c228bf1e3ebfda2b508c008ff", + "reference": "b5bf2ed89880d91c228bf1e3ebfda2b508c008ff", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=8.1", - "spiral/core": "^3.14.1", - "spiral/logger": "^3.14.1", + "spiral/core": "^3.14.3", + "spiral/logger": "^3.14.3", "symfony/finder": "^5.3.7 || ^6.0 || ^7.0" }, "require-dev": { "mockery/mockery": "^1.6", "phpunit/phpunit": "^10.1", "spiral/attributes": "^2.8|^3.0", - "spiral/boot": "^3.14.1", - "spiral/files": "^3.14.1", + "spiral/boot": "^3.14.3", + "spiral/files": "^3.14.3", "vimeo/psalm": "^5.9" }, "type": "library", @@ -3925,7 +3926,7 @@ "type": "github" } ], - "time": "2024-09-04T10:56:34+00:00" + "time": "2024-09-11T17:40:38+00:00" }, { "name": "swagger-api/swagger-ui", @@ -3990,16 +3991,16 @@ }, { "name": "symfony/console", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { @@ -4064,7 +4065,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.11" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -4080,7 +4081,7 @@ "type": "tidelift" } ], - "time": "2024-08-15T22:48:29+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4151,24 +4152,25 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.0.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576" + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2774908d5ae32fd94e363e7cbbd87462712c4576", - "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/event-dispatcher-contracts": "^2|^3" + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -4176,17 +4178,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -4214,7 +4212,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/v6.0.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" }, "funding": [ { @@ -4230,7 +4228,7 @@ "type": "tidelift" } ], - "time": "2021-11-23T19:05:29+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4373,23 +4371,28 @@ }, { "name": "symfony/http-client", - "version": "v6.0.0", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "39f34cd5d28cd263b95a58ebad18421b6fefc4ba" + "reference": "abca35865118edf35a23f2f24978a1784c831cb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/39f34cd5d28cd263b95a58ebad18421b6fefc4ba", - "reference": "39f34cd5d28cd263b95a58ebad18421b6fefc4ba", + "url": "https://api.github.com/repos/symfony/http-client/zipball/abca35865118edf35a23f2f24978a1784c831cb4", + "reference": "abca35865118edf35a23f2f24978a1784c831cb4", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/http-client-contracts": "^3", - "symfony/service-contracts": "^1.0|^2|^3" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "^3.4.1", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" }, "provide": { "php-http/async-client-implementation": "*", @@ -4402,14 +4405,16 @@ "amphp/http-client": "^4.2.1", "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", + "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -4436,8 +4441,11 @@ ], "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", + "keywords": [ + "http" + ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.0.0" + "source": "https://github.com/symfony/http-client/tree/v7.1.5" }, "funding": [ { @@ -4453,7 +4461,7 @@ "type": "tidelift" } ], - "time": "2021-11-23T19:05:29+00:00" + "time": "2024-09-20T13:35:23+00:00" }, { "name": "symfony/http-client-contracts", @@ -4535,33 +4543,39 @@ }, { "name": "symfony/mailer", - "version": "v6.1.11", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "bf9b967cfefe5a2139aa6b2d11803e5a5855aefe" + "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/bf9b967cfefe5a2139aa6b2d11803e5a5855aefe", - "reference": "bf9b967cfefe5a2139aa6b2d11803e5a5855aefe", + "url": "https://api.github.com/repos/symfony/mailer/zipball/bbf21460c56f29810da3df3e206e38dfbb01e80b", + "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.1", + "php": ">=8.2", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/http-kernel": "<5.4" + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" }, "require-dev": { - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/messenger": "^5.4|^6.0" + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -4589,7 +4603,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.1.11" + "source": "https://github.com/symfony/mailer/tree/v7.1.5" }, "funding": [ { @@ -4605,44 +4619,43 @@ "type": "tidelift" } ], - "time": "2023-01-10T18:53:01+00:00" + "time": "2024-09-08T12:32:26+00:00" }, { "name": "symfony/mime", - "version": "v5.4.43", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "a02711d6ce461edada8c0f8641aa536709b99b47" + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/a02711d6ce461edada8c0f8641aa536709b99b47", - "reference": "a02711d6ce461edada8c0f8641aa536709b99b47", + "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.2", "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4", - "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "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", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/process": "^5.4|^6.4", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -4674,7 +4687,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.43" + "source": "https://github.com/symfony/mime/tree/v7.1.5" }, "funding": [ { @@ -4690,25 +4703,25 @@ "type": "tidelift" } ], - "time": "2024-08-13T10:38:38+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.0.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "be0facf48a42a232d6c0daadd76e4eb5657a4798" + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/be0facf48a42a232d6c0daadd76e4eb5657a4798", - "reference": "be0facf48a42a232d6c0daadd76e4eb5657a4798", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -4741,7 +4754,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.0.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.1.1" }, "funding": [ { @@ -4757,7 +4770,7 @@ "type": "tidelift" } ], - "time": "2021-11-23T19:05:29+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5318,16 +5331,16 @@ }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", "shasum": "" }, "require": { @@ -5359,7 +5372,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.12" }, "funding": [ { @@ -5375,7 +5388,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "symfony/service-contracts", @@ -5462,33 +5475,35 @@ }, { "name": "symfony/string", - "version": "v6.0.0", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ba727797426af0f587f4800566300bdc0cda0777" + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ba727797426af0f587f4800566300bdc0cda0777", - "reference": "ba727797426af0f587f4800566300bdc0cda0777", + "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -5527,7 +5542,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.0.0" + "source": "https://github.com/symfony/string/tree/v7.1.5" }, "funding": [ { @@ -5543,7 +5558,7 @@ "type": "tidelift" } ], - "time": "2021-10-29T07:35:21+00:00" + "time": "2024-09-20T08:28:38+00:00" }, { "name": "symfony/var-dumper", @@ -5632,16 +5647,16 @@ }, { "name": "symfony/yaml", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "be37e7f13195e05ab84ca5269365591edd240335" + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/be37e7f13195e05ab84ca5269365591edd240335", - "reference": "be37e7f13195e05ab84ca5269365591edd240335", + "url": "https://api.github.com/repos/symfony/yaml/zipball/762ee56b2649659380e0ef4d592d807bc17b7971", + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971", "shasum": "" }, "require": { @@ -5684,7 +5699,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.11" + "source": "https://github.com/symfony/yaml/tree/v6.4.12" }, "funding": [ { @@ -5700,7 +5715,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:55:28+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "vlucas/phpdotenv", @@ -17501,20 +17516,20 @@ }, { "name": "symfony/css-selector", - "version": "v6.0.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "3a61e2e4fbda3fb7fb5d83620c30fef726139e1c" + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/3a61e2e4fbda3fb7fb5d83620c30fef726139e1c", - "reference": "3a61e2e4fbda3fb7fb5d83620c30fef726139e1c", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -17546,7 +17561,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.0.0" + "source": "https://github.com/symfony/css-selector/tree/v7.1.1" }, "funding": [ { @@ -17562,20 +17577,20 @@ "type": "tidelift" } ], - "time": "2021-09-09T12:56:10+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "105b56a0305d219349edeb60a800082eca864e4b" + "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/105b56a0305d219349edeb60a800082eca864e4b", - "reference": "105b56a0305d219349edeb60a800082eca864e4b", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/9d307ecbcb917001692be333cdc58f474fdb37f0", + "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0", "shasum": "" }, "require": { @@ -17613,7 +17628,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.8" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.12" }, "funding": [ { @@ -17629,27 +17644,30 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-15T06:35:36+00:00" }, { "name": "symfony/filesystem", - "version": "v6.0.0", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "52b3c9cce673b014915445a432339f282e002ce6" + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b3c9cce673b014915445a432339f282e002ce6", - "reference": "52b3c9cce673b014915445a432339f282e002ce6", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a", + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, "type": "library", "autoload": { "psr-4": { @@ -17676,7 +17694,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.0.0" + "source": "https://github.com/symfony/filesystem/tree/v7.1.5" }, "funding": [ { @@ -17692,7 +17710,7 @@ "type": "tidelift" } ], - "time": "2021-10-29T07:35:21+00:00" + "time": "2024-09-17T09:16:35+00:00" }, { "name": "thecodingmachine/safe", @@ -18741,7 +18759,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.1", + "php": ">=8.3 <8.4", "ext-mbstring": "*", "ext-pdo_sqlite": "*" }, From 51e99677025c37928fda4433760d32177f3ca674 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 18 Oct 2024 09:50:12 +0300 Subject: [PATCH 56/58] Fix PHP docker image version (#630) --- blog-api/docker-compose.yml | 8 +++----- blog/docker-compose.yml | 20 +++++++++----------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/blog-api/docker-compose.yml b/blog-api/docker-compose.yml index ecae76695..1a424c625 100644 --- a/blog-api/docker-compose.yml +++ b/blog-api/docker-compose.yml @@ -1,9 +1,7 @@ -version: '3' - services: php: container_name: yii-php - image: yiisoftware/yii-php:8.1-fpm + image: yiisoftware/yii-php:8.3-fpm working_dir: /app volumes: - ./:/app @@ -11,8 +9,8 @@ services: image: nginx:alpine container_name: yii-nginx ports: - - 8080:80 - - 8081:81 + - "8080:80" + - "8081:81" volumes: - ./:/app - ./data/nginx/:/etc/nginx/conf.d/ diff --git a/blog/docker-compose.yml b/blog/docker-compose.yml index b8295a7c4..bdbd304ac 100644 --- a/blog/docker-compose.yml +++ b/blog/docker-compose.yml @@ -1,12 +1,10 @@ -version: '3' - services: - php: - image: yiisoftware/yii-php:8.1-apache - working_dir: /app - volumes: - - ./:/app - # host-volume for composer cache - - ~/.composer-docker/cache:/root/.composer/cache:delegated - ports: - - '30080:80' + php: + image: yiisoftware/yii-php:8.3-apache + working_dir: /app + volumes: + - ./:/app + # host-volume for composer cache + - ~/.composer-docker/cache:/root/.composer/cache:delegated + ports: + - "30080:80" From fc9a219cb8d24094036239900c72370afff20ed2 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 18 Oct 2024 09:50:27 +0300 Subject: [PATCH 57/58] Fix post form (#631) --- blog/src/Blog/Post/PostForm.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/blog/src/Blog/Post/PostForm.php b/blog/src/Blog/Post/PostForm.php index 55febf56b..6c9b0c083 100644 --- a/blog/src/Blog/Post/PostForm.php +++ b/blog/src/Blog/Post/PostForm.php @@ -9,8 +9,12 @@ final class PostForm extends FormModel { + #[Required] private ?string $title = null; + + #[Required] private ?string $content = null; + private array $tags = []; public function getTitle(): string @@ -32,12 +36,4 @@ public function getTags(): array { return $this->tags; } - - public function getRules(): array - { - return [ - 'title' => [new Required()], - 'content' => [new Required()], - ]; - } } From 697842d220b691244c1e0e55ff954fd05a711c0e Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sat, 2 Nov 2024 16:40:07 +0200 Subject: [PATCH 58/58] Adopt debug (#619) * Ignore locale middleware for gii controllers * Adopt debug --- blog/config/common/di/router.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/blog/config/common/di/router.php b/blog/config/common/di/router.php index 0f7be58c0..fcab40c46 100644 --- a/blog/config/common/di/router.php +++ b/blog/config/common/di/router.php @@ -11,7 +11,6 @@ use Yiisoft\Router\RouteCollectionInterface; use Yiisoft\Router\RouteCollectorInterface; use Yiisoft\Router\UrlGeneratorInterface; -use Yiisoft\Yii\Debug\Viewer\Middleware\ToolbarMiddleware; /** * @var Config $config @@ -39,10 +38,6 @@ Group::create()->routes(...$config->get('routes')), ); - if (!str_starts_with(getenv('YII_ENV') ?: '', 'prod')) { - $collector->middleware(ToolbarMiddleware::class); - } - return new RouteCollection($collector); }, ];